From 66261e56d179323ffeba49910546a71d67ea5eed Mon Sep 17 00:00:00 2001 From: yml Date: Mon, 4 May 2026 09:43:38 +0800 Subject: [PATCH] =?UTF-8?q?ts=E7=B1=BB=E5=9E=8B=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/backend/data/khhao-sync-state.json | 6 +- apps/backend/src/repositories/order-repo.js | 7 +- apps/backend/src/routes/admin/users.js | 77 +++++++++++++------ .../services/claim/claim-session-service.js | 37 ++++++++- .../claim/kuaishou-cloud-claim-service.js | 1 + .../kuaishou-cloud-task-service.js | 2 +- .../services/order/delivery-task-service.js | 2 +- .../services/order/product-match-service.js | 42 +++++++++- .../platforms/agiso/shop-config-service.js | 2 + .../agiso/xianyu/auto-delivery-service.js | 2 + .../platforms/agiso/xianyu/message-service.js | 2 + .../agiso/xianyu/order-detail-service.js | 2 + apps/backend/src/services/session/ocr.js | 2 + .../services/session/session-login-shared.js | 2 + .../src/services/session/session-proof.js | 2 + .../src/services/session/session-qq.js | 2 + .../src/services/session/session-redeem.js | 2 + .../src/services/session/session-wx.js | 2 + apps/backend/src/services/session/session.js | 2 + apps/backend/src/types/repository-inputs.js | 16 +++- apps/backend/src/utils/http.js | 45 ++++++++++- apps/backend/src/utils/logger.js | 7 +- apps/backend/tsconfig.json | 35 ++------- 23 files changed, 223 insertions(+), 76 deletions(-) diff --git a/apps/backend/data/khhao-sync-state.json b/apps/backend/data/khhao-sync-state.json index 4faeb6d1..cdcf4ee9 100644 --- a/apps/backend/data/khhao-sync-state.json +++ b/apps/backend/data/khhao-sync-state.json @@ -1,13 +1,13 @@ { "syncFromCreatedAt": "2026-05-02T10:53:28.550Z", - "lastRunStartedAt": "2026-05-03T17:50:39.717Z", - "lastRunFinishedAt": "2026-05-03T17:50:40.412Z", + "lastRunStartedAt": "2026-05-04T01:42:53.462Z", + "lastRunFinishedAt": "2026-05-04T01:42:54.077Z", "lastRunStatus": "success", "lastErrorMessage": "", "fetchedCount": 40, "syncedCount": 0, "ignoredCount": 40, - "lastOrderCreatedAt": "2026-05-03T17:47:36.000Z", + "lastOrderCreatedAt": "2026-05-04T01:42:50.000Z", "watchMode": "normal", "watchOrders": [] } diff --git a/apps/backend/src/repositories/order-repo.js b/apps/backend/src/repositories/order-repo.js index 9a6e2685..de8b2d31 100644 --- a/apps/backend/src/repositories/order-repo.js +++ b/apps/backend/src/repositories/order-repo.js @@ -2,8 +2,9 @@ import { query } from '../db/client.js' -/** @typedef {import('../types/repository-inputs.js').OrderUpsertInput} OrderUpsertInput */ +/** @typedef {import('../types/repository-inputs.js').OrderCreateInput} OrderCreateInput */ /** @typedef {import('../types/repository-inputs.js').OrderListQueryInput} OrderListQueryInput */ +/** @typedef {import('../types/repository-inputs.js').OrderUpdateInput} OrderUpdateInput */ /** @typedef {import('../types/repository-rows.js').OrderListQueryResult} OrderListQueryResult */ /** @typedef {import('../types/repository-rows.js').OrderListRow} OrderListRow */ /** @typedef {import('../types/repository-rows.js').OrderRow} OrderRow */ @@ -53,7 +54,7 @@ export async function findOrderByPlatformOrderIdCandidates({ } /** @returns {Promise} */ -/** @param {OrderUpsertInput} input */ +/** @param {OrderCreateInput} input */ export async function createOrder(input) { const result = await query( ` @@ -101,7 +102,7 @@ export async function createOrder(input) { } /** @returns {Promise} */ -/** @param {OrderUpsertInput} input */ +/** @param {OrderUpdateInput} input */ export async function updateOrder(orderId, input) { const result = await query( ` diff --git a/apps/backend/src/routes/admin/users.js b/apps/backend/src/routes/admin/users.js index f4967d35..564aca5f 100644 --- a/apps/backend/src/routes/admin/users.js +++ b/apps/backend/src/routes/admin/users.js @@ -10,6 +10,18 @@ import { } from '../../services/admin/admin-auth-service.js' import { createJsonHandler, requireAdminRoles } from './shared.js' +/** + * @typedef {{ + * user: { + * userId: number + * username: string + * role: string + * status?: string + * inventoryGroupCodes?: string[] + * } + * }} AdminUserMutationResult + */ + const router = Router() router.use('/users', requireAdminRoles(['admin'])) @@ -29,16 +41,19 @@ router.post('/users', createJsonHandler( successMessage: '后台用户已创建', errorMessage: '创建后台用户失败', scope: '[admin/users:create]', - audit: (_req, data) => ({ + audit: (_req, data) => { + const result = /** @type {AdminUserMutationResult} */ (data) + return { action: 'admin_user_created', targetType: 'admin_user', - targetId: String(data.user.userId), + targetId: String(result.user.userId), data: { - username: data.user.username, - role: data.user.role, - status: data.user.status, + username: result.user.username, + role: result.user.role, + status: result.user.status, }, - }), + } + }, }, )) @@ -48,15 +63,18 @@ router.post('/users/:userId/role', createJsonHandler( successMessage: '用户角色已更新', errorMessage: '更新用户角色失败', scope: '[admin/users/:userId/role]', - audit: (_req, data) => ({ + audit: (_req, data) => { + const result = /** @type {AdminUserMutationResult} */ (data) + return { action: 'admin_user_role_updated', targetType: 'admin_user', - targetId: String(data.user.userId), + targetId: String(result.user.userId), data: { - username: data.user.username, - role: data.user.role, + username: result.user.username, + role: result.user.role, }, - }), + } + }, }, )) @@ -66,15 +84,18 @@ router.post('/users/:userId/status', createJsonHandler( successMessage: '用户状态已更新', errorMessage: '更新用户状态失败', scope: '[admin/users/:userId/status]', - audit: (_req, data) => ({ + audit: (_req, data) => { + const result = /** @type {AdminUserMutationResult} */ (data) + return { action: 'admin_user_status_updated', targetType: 'admin_user', - targetId: String(data.user.userId), + targetId: String(result.user.userId), data: { - username: data.user.username, - status: data.user.status, + username: result.user.username, + status: result.user.status, }, - }), + } + }, }, )) @@ -84,15 +105,18 @@ router.post('/users/:userId/inventory-groups', createJsonHandler( successMessage: '用户库存组已更新', errorMessage: '更新用户库存组失败', scope: '[admin/users/:userId/inventory-groups]', - audit: (_req, data) => ({ + audit: (_req, data) => { + const result = /** @type {AdminUserMutationResult} */ (data) + return { action: 'admin_user_inventory_groups_updated', targetType: 'admin_user', - targetId: String(data.user.userId), + targetId: String(result.user.userId), data: { - username: data.user.username, - inventoryGroupCodes: data.user.inventoryGroupCodes, + username: result.user.username, + inventoryGroupCodes: result.user.inventoryGroupCodes, }, - }), + } + }, }, )) @@ -102,14 +126,17 @@ router.post('/users/:userId/reset-password', createJsonHandler( successMessage: '用户密码已重置', errorMessage: '重置用户密码失败', scope: '[admin/users/:userId/reset-password]', - audit: (_req, data) => ({ + audit: (_req, data) => { + const result = /** @type {AdminUserMutationResult} */ (data) + return { action: 'admin_user_password_reset', targetType: 'admin_user', - targetId: String(data.user.userId), + targetId: String(result.user.userId), data: { - username: data.user.username, + username: result.user.username, }, - }), + } + }, }, )) diff --git a/apps/backend/src/services/claim/claim-session-service.js b/apps/backend/src/services/claim/claim-session-service.js index ee72d806..1db64294 100644 --- a/apps/backend/src/services/claim/claim-session-service.js +++ b/apps/backend/src/services/claim/claim-session-service.js @@ -32,6 +32,29 @@ const CLAIM_TERMINAL_STATUSES = new Set(['expired', 'closed']) const REDEEM_REPLACEMENT_LIMIT = 10 const KUAISHOU_CLOUD_CLAIM_GUIDE_BASE_PATH = '/kuaishou-cloud-guide' +/** + * @typedef {{ + * taskStatus: string + * inventoryStatus: string + * deliveryStatus: string + * lastError: string + * attempts: unknown[] + * classification: { retCode?: unknown } | null + * }} RedeemTaskState + */ + +/** + * @typedef {{ + * statusCode?: number + * errorCode?: string + * taskStatus?: string + * inventoryStatus?: string + * deliveryStatus?: string + * attempts?: unknown[] + * classification?: { retCode?: unknown } | null + * }} RedeemTaskStatePayload + */ + export async function getClaimDetail(token, { includeQrImage = true } = {}) { const context = await getClaimContext(token) let { task, session } = await loadTaskSession(context.task, { includeQrImage }) @@ -531,7 +554,11 @@ async function finalizeClaimTaskRedeem(context) { } catch (error) { const now = nowIso() const nextRetryCount = Number(context.task.attempt_count || 0) + 1 - const failureState = error?.redeemTaskState || { + const failureState = ( + error && typeof error === 'object' + ? /** @type {{ redeemTaskState?: RedeemTaskState }} */ (error).redeemTaskState + : null + ) || { taskStatus: 'retry_pending', inventoryStatus: inventoryItem ? 'reserved' : 'pending', deliveryStatus: 'pending', @@ -1102,11 +1129,15 @@ export async function redeemClaimTaskWithInventoryFallbackWithDeps( }) } +/** + * @param {string} message + * @param {RedeemTaskStatePayload} [payload] + */ function createRedeemTaskStateError(message, payload = {}) { - const error = createHttpError(message, { + const error = /** @type {Error & import('../../utils/http.js').HttpErrorLike & { redeemTaskState: RedeemTaskState }} */ (createHttpError(message, { statusCode: payload.statusCode || 409, errorCode: payload.errorCode || 'claim_redeem_failed', - }) + })) error.redeemTaskState = { taskStatus: payload.taskStatus || 'retry_pending', diff --git a/apps/backend/src/services/claim/kuaishou-cloud-claim-service.js b/apps/backend/src/services/claim/kuaishou-cloud-claim-service.js index 613a2102..60e39afa 100644 --- a/apps/backend/src/services/claim/kuaishou-cloud-claim-service.js +++ b/apps/backend/src/services/claim/kuaishou-cloud-claim-service.js @@ -13,6 +13,7 @@ import { import { queryKuaishouEticketConsumeDetail } from '../platforms/kuaishou-eticket/consume-service.js' import { dispatchKuaishouCloudFulfillmentTask, + maskCode, normalizeKuaishouCloudFlow, prepareKuaishouCloudFulfillmentTask, refreshKuaishouCloudTaskRoleInfo, diff --git a/apps/backend/src/services/fulfillment/kuaishou-cloud-task-service.js b/apps/backend/src/services/fulfillment/kuaishou-cloud-task-service.js index fbaf7776..946f8063 100644 --- a/apps/backend/src/services/fulfillment/kuaishou-cloud-task-service.js +++ b/apps/backend/src/services/fulfillment/kuaishou-cloud-task-service.js @@ -745,7 +745,7 @@ function resolveKuaishouCloudBindingResources(flow, { skuItems = [], knapsackIte } } -function resolveKuaishouCloudVnKeyCandidates() { +function resolveKuaishouCloudVnKeyCandidates(_input = {}) { return [KUAISHOU_CLOUD_FIXED_VN_KEY] } diff --git a/apps/backend/src/services/order/delivery-task-service.js b/apps/backend/src/services/order/delivery-task-service.js index 1183ba52..31e85b47 100644 --- a/apps/backend/src/services/order/delivery-task-service.js +++ b/apps/backend/src/services/order/delivery-task-service.js @@ -66,7 +66,7 @@ export async function syncDeliveryTasksForOrder(order, orderItems) { executorKey: String(profile.executor_key || 'manual_dispatch'), taskStatus: initialStatus, inventoryStatus: profile.requires_claim ? 'pending' : 'not_required', - deliveryStatus: initialStatus === 'redeemed' ? 'delivered' : 'pending', + deliveryStatus: 'pending', resultCode: '', resultMessage: '', claimToken: '', diff --git a/apps/backend/src/services/order/product-match-service.js b/apps/backend/src/services/order/product-match-service.js index 26538c52..c2579569 100644 --- a/apps/backend/src/services/order/product-match-service.js +++ b/apps/backend/src/services/order/product-match-service.js @@ -1,11 +1,34 @@ import { resolveFulfillmentBinding } from '../../repositories/fulfillment-profile-repo.js' import { resolveProductMatchRule } from '../../repositories/product-match-rule-repo.js' +/** + * @typedef {{ + * itemId?: string + * externalItemId?: string + * skuCode?: string + * skuName?: string + * externalSkuCode?: string + * externalSkuName?: string + * quantity?: number + * spec?: Record + * snapshot?: Record + * [key: string]: unknown + * }} FulfillmentItem + */ + +/** + * @param {{ + * provider?: string + * platform?: string + * shopId?: string + * item?: FulfillmentItem + * }} params + */ export async function resolveOrderItemForFulfillment({ provider = '', platform = '', shopId = '', - item = {}, + item = /** @type {FulfillmentItem} */ ({}), }) { const candidate = await resolveConfiguredItemCandidate({ provider, @@ -61,6 +84,14 @@ export async function resolveOrderItemForFulfillment({ } } +/** + * @param {{ + * provider?: string + * platform?: string + * shopId?: string + * items?: FulfillmentItem[] + * }} params + */ export async function hasConfiguredOrderItems({ provider = '', platform = '', @@ -104,7 +135,7 @@ async function resolveConfiguredItemCandidate({ provider = '', platform = '', shopId = '', - item = {}, + item = /** @type {FulfillmentItem} */ ({}), }) { const externalItemId = pickFirstNonEmpty([ item.externalItemId, @@ -166,7 +197,8 @@ function readConfigValue(rawValue, key) { return '' } - return String(parsed[key] || '').trim() + const config = /** @type {Record} */ (parsed) + return String(config[key] || '').trim() } function safeParseJson(rawValue) { @@ -177,6 +209,10 @@ function safeParseJson(rawValue) { } } +/** + * @param {unknown} value + * @returns {value is Record} + */ function isPlainObject(value) { return Object.prototype.toString.call(value) === '[object Object]' } diff --git a/apps/backend/src/services/platforms/agiso/shop-config-service.js b/apps/backend/src/services/platforms/agiso/shop-config-service.js index b43c7267..75d4342e 100644 --- a/apps/backend/src/services/platforms/agiso/shop-config-service.js +++ b/apps/backend/src/services/platforms/agiso/shop-config-service.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import fs from 'node:fs' import path from 'node:path' diff --git a/apps/backend/src/services/platforms/agiso/xianyu/auto-delivery-service.js b/apps/backend/src/services/platforms/agiso/xianyu/auto-delivery-service.js index a62cd8a6..e72169e6 100644 --- a/apps/backend/src/services/platforms/agiso/xianyu/auto-delivery-service.js +++ b/apps/backend/src/services/platforms/agiso/xianyu/auto-delivery-service.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import crypto from 'node:crypto' import { runtimeConfig } from '../../../../config/runtime.js' diff --git a/apps/backend/src/services/platforms/agiso/xianyu/message-service.js b/apps/backend/src/services/platforms/agiso/xianyu/message-service.js index a2f1560a..dee6b7bd 100644 --- a/apps/backend/src/services/platforms/agiso/xianyu/message-service.js +++ b/apps/backend/src/services/platforms/agiso/xianyu/message-service.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import crypto from 'node:crypto' import { runtimeConfig } from '../../../../config/runtime.js' diff --git a/apps/backend/src/services/platforms/agiso/xianyu/order-detail-service.js b/apps/backend/src/services/platforms/agiso/xianyu/order-detail-service.js index 2a3f7354..1418972f 100644 --- a/apps/backend/src/services/platforms/agiso/xianyu/order-detail-service.js +++ b/apps/backend/src/services/platforms/agiso/xianyu/order-detail-service.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import crypto from 'node:crypto' import { runtimeConfig } from '../../../../config/runtime.js' diff --git a/apps/backend/src/services/session/ocr.js b/apps/backend/src/services/session/ocr.js index 97623ae6..52463bda 100644 --- a/apps/backend/src/services/session/ocr.js +++ b/apps/backend/src/services/session/ocr.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import { spawn } from 'node:child_process' import fs from 'node:fs' import path from 'node:path' diff --git a/apps/backend/src/services/session/session-login-shared.js b/apps/backend/src/services/session/session-login-shared.js index 65973e5d..2c36bf0a 100644 --- a/apps/backend/src/services/session/session-login-shared.js +++ b/apps/backend/src/services/session/session-login-shared.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import { runtimeConfig } from '../../config/runtime.js' import { logDebug } from '../../utils/logger.js' diff --git a/apps/backend/src/services/session/session-proof.js b/apps/backend/src/services/session/session-proof.js index 34476419..ee75f679 100644 --- a/apps/backend/src/services/session/session-proof.js +++ b/apps/backend/src/services/session/session-proof.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import fs from 'node:fs/promises' import path from 'node:path' diff --git a/apps/backend/src/services/session/session-qq.js b/apps/backend/src/services/session/session-qq.js index 6079656e..79b4607b 100644 --- a/apps/backend/src/services/session/session-qq.js +++ b/apps/backend/src/services/session/session-qq.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import fs from 'node:fs/promises' import { downloadRemoteQrImage, logBrowserSessionDebug, waitForFrame } from './session-login-shared.js' diff --git a/apps/backend/src/services/session/session-redeem.js b/apps/backend/src/services/session/session-redeem.js index 2e8fbe06..cbc764ba 100644 --- a/apps/backend/src/services/session/session-redeem.js +++ b/apps/backend/src/services/session/session-redeem.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import fs from 'node:fs/promises' export async function runTencentBrowserRedeem({ diff --git a/apps/backend/src/services/session/session-wx.js b/apps/backend/src/services/session/session-wx.js index d4e7437e..09a38583 100644 --- a/apps/backend/src/services/session/session-wx.js +++ b/apps/backend/src/services/session/session-wx.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import fs from 'node:fs/promises' import { downloadRemoteQrImage, logBrowserSessionDebug, waitForFrame } from './session-login-shared.js' diff --git a/apps/backend/src/services/session/session.js b/apps/backend/src/services/session/session.js index 6a621d8d..55ec9bb8 100644 --- a/apps/backend/src/services/session/session.js +++ b/apps/backend/src/services/session/session.js @@ -1,3 +1,5 @@ +// @ts-nocheck + import crypto from 'node:crypto' import fs from 'node:fs/promises' import path from 'node:path' diff --git a/apps/backend/src/types/repository-inputs.js b/apps/backend/src/types/repository-inputs.js index f1c13513..8713499f 100644 --- a/apps/backend/src/types/repository-inputs.js +++ b/apps/backend/src/types/repository-inputs.js @@ -30,9 +30,21 @@ export {} * currency: string * rawPayloadJson?: string | Record * paidAt?: string | null + * }} OrderWriteInputBase + */ + +/** + * @typedef {OrderWriteInputBase & { * createdAt: string * updatedAt: string - * }} OrderUpsertInput + * }} OrderCreateInput + */ + +/** + * @typedef {OrderWriteInputBase & { + * updatedAt: string + * createdAt?: string + * }} OrderUpdateInput */ /** @@ -87,7 +99,7 @@ export {} * shopId?: string * shopName?: string * platformOrderId: string - * profileId: string + * profileId: number | string * executorKey: string * taskStatus?: string * inventoryStatus?: string diff --git a/apps/backend/src/utils/http.js b/apps/backend/src/utils/http.js index b520c23c..72692394 100644 --- a/apps/backend/src/utils/http.js +++ b/apps/backend/src/utils/http.js @@ -1,7 +1,28 @@ +// @ts-check + import { logError, logWarn } from './logger.js' const RESPONSE_TIME_ZONE = 'Asia/Shanghai' +/** + * @typedef {{ + * statusCode?: number + * errorCode?: string + * cause?: unknown + * context?: unknown + * [key: string]: unknown + * }} HttpErrorLike + */ + +/** + * @typedef {{ + * statusCode?: number + * errorCode?: string + * cause?: unknown + * context?: unknown + * }} CreateHttpErrorOptions + */ + export function buildSuccessPayload(data, msg = 'ok') { return { code: 0, @@ -43,17 +64,33 @@ export function buildNotFoundPayload(req) { } } -export function createHttpError(message, { statusCode = 500, errorCode = '' } = {}) { - const error = new Error(message) +/** + * @param {string} message + * @param {CreateHttpErrorOptions} [options] + * @returns {Error & HttpErrorLike} + */ +export function createHttpError(message, options = {}) { + const { statusCode = 500, errorCode = '', cause, context } = options + const error = /** @type {Error & HttpErrorLike} */ (new Error(message)) error.statusCode = statusCode error.errorCode = errorCode || defaultErrorCodeForStatus(statusCode) + + if (typeof cause !== 'undefined') { + error.cause = cause + } + + if (typeof context !== 'undefined') { + error.context = context + } + return error } function classifyRouteError(error) { if (error && typeof error === 'object') { - const statusCode = Number(error.statusCode) - const errorCode = String(error.errorCode || '').trim() + const currentError = /** @type {HttpErrorLike} */ (error) + const statusCode = Number(currentError.statusCode) + const errorCode = String(currentError.errorCode || '').trim() if (Number.isInteger(statusCode) && statusCode >= 400 && statusCode < 600) { return { diff --git a/apps/backend/src/utils/logger.js b/apps/backend/src/utils/logger.js index dadace09..117dd89e 100644 --- a/apps/backend/src/utils/logger.js +++ b/apps/backend/src/utils/logger.js @@ -206,12 +206,15 @@ function normalizeLogValue(value) { return JSON.parse( JSON.stringify(value, (_key, current) => { if (current instanceof Error) { + const currentError = /** @type {import('./http.js').HttpErrorLike} */ ( + /** @type {unknown} */ (current) + ) return { name: current.name, message: current.message, stack: current.stack, - statusCode: current.statusCode, - errorCode: current.errorCode, + statusCode: currentError.statusCode, + errorCode: currentError.errorCode, } } diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json index 4039b1cc..f6d8f8cb 100644 --- a/apps/backend/tsconfig.json +++ b/apps/backend/tsconfig.json @@ -4,7 +4,7 @@ "module": "NodeNext", "moduleResolution": "NodeNext", "allowJs": true, - "checkJs": false, + "checkJs": true, "noEmit": true, "strict": false, "skipLibCheck": true, @@ -12,36 +12,13 @@ "lib": ["ES2022"] }, "include": [ - "src/config/runtime.js", - "src/repositories/inventory-repo.js", - "src/repositories/order-item-repo.js", - "src/repositories/order-repo.js", - "src/repositories/task-inventory-binding-repo.js", - "src/repositories/task-repo.js", - "src/repositories/webhook-event-repo.js", - "src/services/admin/admin-inventory-read-helpers.js", - "src/services/admin/admin-order-read-helpers.js", - "src/services/admin/admin-read-shared-helpers.js", - "src/services/admin/admin-task-read-helpers.js", - "src/services/admin/admin-webhook-read-helpers.js", - "src/services/admin/admin-dashboard-service.js", - "src/services/admin/admin-message-delivery-service.js", - "src/services/admin/admin-platform-config-service.js", - "src/services/admin/admin-read-service.js", - "src/services/admin/admin-service.js", - "src/services/admin/admin-write-service.js", - "src/routes/admin/dashboard.js", - "src/routes/admin/inventory.js", - "src/routes/admin/message-deliveries.js", - "src/routes/admin/orders.js", - "src/routes/admin/platform-config.js", - "src/routes/admin/shared.js", - "src/routes/admin/tasks.js", - "src/routes/admin/webhook-events.js", - "src/types/**/*.js" + "src/**/*.js" ], "exclude": [ "node_modules", - "data" + "data", + "src/**/*.test.js", + "src/services/session/**", + "src/services/platforms/agiso/**" ] }