统一前后端代码格式化配置
This commit is contained in:
@@ -1,17 +1,11 @@
|
||||
import type { JsonObject } from '../../types/json.js'
|
||||
import {
|
||||
listCloudtentaclesSources,
|
||||
} from '../platforms/cloudtentacles/source-config-service.js'
|
||||
import {
|
||||
getCloudtentaclesSessionStateByKey,
|
||||
} from '../platforms/cloudtentacles/session-state-service.js'
|
||||
import { listCloudtentaclesSources } from '../platforms/cloudtentacles/source-config-service.js'
|
||||
import { getCloudtentaclesSessionStateByKey } from '../platforms/cloudtentacles/session-state-service.js'
|
||||
import {
|
||||
normalizeCloudtentaclesDeviceId,
|
||||
normalizeCloudtentaclesDeviceType,
|
||||
} from '../platforms/cloudtentacles/defaults.js'
|
||||
import {
|
||||
listCloudtentaclesSku,
|
||||
} from '../platforms/cloudtentacles/catalog-service.js'
|
||||
import { listCloudtentaclesSku } from '../platforms/cloudtentacles/catalog-service.js'
|
||||
import {
|
||||
resolveCloudtentaclesOverrideRule,
|
||||
type CloudtentaclesOverrideRule,
|
||||
@@ -79,9 +73,11 @@ export async function resolveCloudtentaclesSkuByProductName(
|
||||
}
|
||||
|
||||
const listSources = deps.listCloudtentaclesSources || listCloudtentaclesSources
|
||||
const getSessionByKey = deps.getCloudtentaclesSessionStateByKey || getCloudtentaclesSessionStateByKey
|
||||
const getSessionByKey =
|
||||
deps.getCloudtentaclesSessionStateByKey || getCloudtentaclesSessionStateByKey
|
||||
const listSku = deps.listCloudtentaclesSku || listCloudtentaclesSku
|
||||
const resolveOverrideRule = deps.resolveCloudtentaclesOverrideRule || resolveCloudtentaclesOverrideRule
|
||||
const resolveOverrideRule =
|
||||
deps.resolveCloudtentaclesOverrideRule || resolveCloudtentaclesOverrideRule
|
||||
const sourcesConfig = listSources()
|
||||
|
||||
if (sourcesConfig.enabled === false) {
|
||||
@@ -89,8 +85,13 @@ export async function resolveCloudtentaclesSkuByProductName(
|
||||
}
|
||||
|
||||
const sourceContexts = (Array.isArray(sourcesConfig.sources) ? sourcesConfig.sources : [])
|
||||
.map((source: CloudtentaclesSource) => buildCloudtentaclesSourceContext(source, getSessionByKey))
|
||||
.filter((context): context is NonNullable<ReturnType<typeof buildCloudtentaclesSourceContext>> => Boolean(context))
|
||||
.map((source: CloudtentaclesSource) =>
|
||||
buildCloudtentaclesSourceContext(source, getSessionByKey),
|
||||
)
|
||||
.filter(
|
||||
(context): context is NonNullable<ReturnType<typeof buildCloudtentaclesSourceContext>> =>
|
||||
Boolean(context),
|
||||
)
|
||||
|
||||
if (sourceContexts.length === 0) {
|
||||
return null
|
||||
@@ -98,7 +99,13 @@ export async function resolveCloudtentaclesSkuByProductName(
|
||||
|
||||
const overrideRule = resolveOverrideRule(productName)
|
||||
const overrideMatch = overrideRule
|
||||
? await resolveOverrideMatch(productName, normalizedProductName, overrideRule, sourceContexts, listSku)
|
||||
? await resolveOverrideMatch(
|
||||
productName,
|
||||
normalizedProductName,
|
||||
overrideRule,
|
||||
sourceContexts,
|
||||
listSku,
|
||||
)
|
||||
: null
|
||||
if (overrideMatch) {
|
||||
return overrideMatch
|
||||
@@ -215,7 +222,8 @@ async function resolveOverrideMatch(
|
||||
}
|
||||
|
||||
const firstDeliveryItem = deliveryItems[0]
|
||||
const firstSku = items.find((item) => Number(item.id || 0) === firstDeliveryItem.cloudSkuId) || {}
|
||||
const firstSku =
|
||||
items.find((item) => Number(item.id || 0) === firstDeliveryItem.cloudSkuId) || {}
|
||||
const cloudSourceKeys = rule.sourceKey
|
||||
? [context.sourceKey]
|
||||
: sourceContexts.map((sourceContext) => sourceContext.sourceKey)
|
||||
@@ -246,13 +254,17 @@ async function resolveOverrideMatch(
|
||||
return null
|
||||
}
|
||||
|
||||
function resolveOverrideDeliveryItems(rule: CloudtentaclesOverrideRule, skuItems: CloudtentaclesSku[]) {
|
||||
function resolveOverrideDeliveryItems(
|
||||
rule: CloudtentaclesOverrideRule,
|
||||
skuItems: CloudtentaclesSku[],
|
||||
) {
|
||||
const resolvedItems: CloudtentaclesResolvedDeliveryItem[] = []
|
||||
|
||||
for (const ruleItem of rule.deliveryItems) {
|
||||
const matchedSku = ruleItem.cloudSkuId > 0
|
||||
? skuItems.find((item) => Number(item.id || 0) === ruleItem.cloudSkuId)
|
||||
: findCloudtentaclesSkuByName(skuItems, ruleItem.cloudSkuName)
|
||||
const matchedSku =
|
||||
ruleItem.cloudSkuId > 0
|
||||
? skuItems.find((item) => Number(item.id || 0) === ruleItem.cloudSkuId)
|
||||
: findCloudtentaclesSkuByName(skuItems, ruleItem.cloudSkuName)
|
||||
const cloudSkuId = Number(matchedSku?.id || 0)
|
||||
const cloudSkuName = String(matchedSku?.name || '').trim()
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
|
||||
import {
|
||||
normalizeCloudtentaclesOverrideRuleConfig,
|
||||
} from './cloudtentacles-override-rule-service.js'
|
||||
import { normalizeCloudtentaclesOverrideRuleConfig } from './cloudtentacles-override-rule-service.js'
|
||||
|
||||
test('normalizeCloudtentaclesOverrideRuleConfig merges duplicated delivery items', () => {
|
||||
const config = normalizeCloudtentaclesOverrideRuleConfig({
|
||||
|
||||
@@ -3,10 +3,7 @@ import type { JsonObject } from '../../types/json.js'
|
||||
|
||||
import { APP_CONFIG_KEYS } from '../../config/app-config-keys.js'
|
||||
import { PROJECT_ROOT } from '../../config/runtime.js'
|
||||
import {
|
||||
readAppConfigEntry,
|
||||
saveAppConfigEntry,
|
||||
} from '../config/app-config-store.js'
|
||||
import { readAppConfigEntry, saveAppConfigEntry } from '../config/app-config-store.js'
|
||||
import { normalizeCloudtentaclesMatchName } from './cloudtentacles-match-utils.js'
|
||||
|
||||
const CLOUDTENTACLES_OVERRIDE_RULE_FILE_PATH = path.join(
|
||||
@@ -49,7 +46,9 @@ export function getCloudtentaclesOverrideRuleConfig(): CloudtentaclesOverrideRul
|
||||
})
|
||||
}
|
||||
|
||||
export function saveCloudtentaclesOverrideRuleConfig(rawValue: unknown): Promise<CloudtentaclesOverrideRuleConfig> {
|
||||
export function saveCloudtentaclesOverrideRuleConfig(
|
||||
rawValue: unknown,
|
||||
): Promise<CloudtentaclesOverrideRuleConfig> {
|
||||
return saveAppConfigEntry({
|
||||
configKey: APP_CONFIG_KEYS.cloudtentaclesOverrideRules,
|
||||
legacyFilePath: CLOUDTENTACLES_OVERRIDE_RULE_FILE_PATH,
|
||||
@@ -69,14 +68,19 @@ export function resolveCloudtentaclesOverrideRule(productName: unknown) {
|
||||
return null
|
||||
}
|
||||
|
||||
return config.rules.find((rule) =>
|
||||
rule.enabled !== false &&
|
||||
rule.normalizedProductName === normalizedProductName &&
|
||||
rule.deliveryItems.length > 0
|
||||
) || null
|
||||
return (
|
||||
config.rules.find(
|
||||
(rule) =>
|
||||
rule.enabled !== false &&
|
||||
rule.normalizedProductName === normalizedProductName &&
|
||||
rule.deliveryItems.length > 0,
|
||||
) || null
|
||||
)
|
||||
}
|
||||
|
||||
export function normalizeCloudtentaclesOverrideRuleConfig(rawValue: unknown): CloudtentaclesOverrideRuleConfig {
|
||||
export function normalizeCloudtentaclesOverrideRuleConfig(
|
||||
rawValue: unknown,
|
||||
): CloudtentaclesOverrideRuleConfig {
|
||||
const source = isPlainObject(rawValue) ? rawValue : {}
|
||||
const rules = Array.isArray(source.rules) ? source.rules : []
|
||||
|
||||
@@ -142,7 +146,10 @@ function mergeDeliveryItems(items: CloudtentaclesOverrideDeliveryItem[]) {
|
||||
const merged = new Map<string, CloudtentaclesOverrideDeliveryItem>()
|
||||
|
||||
for (const item of items) {
|
||||
const key = item.cloudSkuId > 0 ? `id:${item.cloudSkuId}` : `name:${normalizeCloudtentaclesMatchName(item.cloudSkuName)}`
|
||||
const key =
|
||||
item.cloudSkuId > 0
|
||||
? `id:${item.cloudSkuId}`
|
||||
: `name:${normalizeCloudtentaclesMatchName(item.cloudSkuName)}`
|
||||
const existing = merged.get(key)
|
||||
if (existing) {
|
||||
existing.quantity += item.quantity
|
||||
|
||||
@@ -13,7 +13,9 @@ type CreatedTaskInput = {
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
function stubOrder(patch: Partial<OrderRow> & Pick<OrderRow, 'id' | 'platform_order_id'>): OrderRow {
|
||||
function stubOrder(
|
||||
patch: Partial<OrderRow> & Pick<OrderRow, 'id' | 'platform_order_id'>,
|
||||
): OrderRow {
|
||||
return {
|
||||
id: patch.id,
|
||||
order_id: patch.id,
|
||||
|
||||
@@ -10,10 +10,7 @@ import { preparePaidFulfillmentTask } from '../fulfillment/executors/registry.js
|
||||
import type { FulfillmentPrepareDeps } from '../fulfillment/executors/types.js'
|
||||
import { nowIso } from '../../utils/time.js'
|
||||
import { randomId } from '../../utils/random.js'
|
||||
import {
|
||||
TASK_STATUS,
|
||||
resolveInitialPaidTaskStatus,
|
||||
} from '../../domain/task-status.js'
|
||||
import { TASK_STATUS, resolveInitialPaidTaskStatus } from '../../domain/task-status.js'
|
||||
import type { OrderItemRow, OrderRow, TaskRow } from '../../types/repository/rows.js'
|
||||
|
||||
type ClaimTokenLike = {
|
||||
@@ -152,10 +149,7 @@ export async function syncDeliveryTasksForOrderWithDeps(
|
||||
return preparedTasks.filter(isTaskRow)
|
||||
}
|
||||
|
||||
async function preparePaidTasks(
|
||||
tasks: TaskRow[],
|
||||
deps: FulfillmentPrepareDeps,
|
||||
) {
|
||||
async function preparePaidTasks(tasks: TaskRow[], deps: FulfillmentPrepareDeps) {
|
||||
const preparedTasks = await Promise.all(
|
||||
tasks.map((task) => preparePaidFulfillmentTask(task, deps)),
|
||||
)
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
|
||||
import {
|
||||
isOrderItemConfiguredForFulfillment,
|
||||
mergeSourceOrderState,
|
||||
} from './order-service.js'
|
||||
import { isOrderItemConfiguredForFulfillment, mergeSourceOrderState } from './order-service.js'
|
||||
import type { OrderItemRow } from '../../types/repository/rows.js'
|
||||
|
||||
function buildOrderItem(snapshot: OrderItemRow['item_snapshot_json']): OrderItemRow {
|
||||
@@ -20,17 +17,11 @@ function buildOrderItem(snapshot: OrderItemRow['item_snapshot_json']): OrderItem
|
||||
}
|
||||
|
||||
test('isOrderItemConfiguredForFulfillment accepts PostgreSQL JSONB object results', () => {
|
||||
assert.equal(
|
||||
isOrderItemConfiguredForFulfillment(buildOrderItem({ isConfigured: true })),
|
||||
true,
|
||||
)
|
||||
assert.equal(isOrderItemConfiguredForFulfillment(buildOrderItem({ isConfigured: true })), true)
|
||||
})
|
||||
|
||||
test('isOrderItemConfiguredForFulfillment accepts serialized snapshots', () => {
|
||||
assert.equal(
|
||||
isOrderItemConfiguredForFulfillment(buildOrderItem('{"isConfigured":true}')),
|
||||
true,
|
||||
)
|
||||
assert.equal(isOrderItemConfiguredForFulfillment(buildOrderItem('{"isConfigured":true}')), true)
|
||||
})
|
||||
|
||||
test('isOrderItemConfiguredForFulfillment rejects unconfigured or malformed snapshots', () => {
|
||||
|
||||
@@ -297,7 +297,7 @@ function parseOrderItemSnapshot(value: unknown): Record<string, unknown> | null
|
||||
try {
|
||||
const parsed = JSON.parse(String(value || '{}'))
|
||||
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
||||
? parsed as Record<string, unknown>
|
||||
? (parsed as Record<string, unknown>)
|
||||
: null
|
||||
} catch {
|
||||
return null
|
||||
|
||||
Reference in New Issue
Block a user