nfkit 1.0.32 → 1.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +38 -1
- package/dist/index.cjs.map +2 -2
- package/dist/index.mjs +38 -1
- package/dist/index.mjs.map +2 -2
- package/dist/src/configurer/configurer.d.ts +2 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1541,6 +1541,18 @@ var ConfigurerInstance = class {
|
|
|
1541
1541
|
const defaultBoolean = parseConfigBoolean(this.defaultConfig[key], false);
|
|
1542
1542
|
return convertBooleanArray(this.getString(key), defaultBoolean);
|
|
1543
1543
|
}
|
|
1544
|
+
getJSON(key) {
|
|
1545
|
+
const value = this.getString(key);
|
|
1546
|
+
const jsonString = typeof value === "string" && !value.trim() ? this.defaultConfig[key] : value;
|
|
1547
|
+
try {
|
|
1548
|
+
return JSON.parse(jsonString);
|
|
1549
|
+
} catch (error) {
|
|
1550
|
+
const message = error instanceof Error ? `: ${error.message}` : "";
|
|
1551
|
+
throw new Error(
|
|
1552
|
+
`Failed to parse JSON config "${String(key)}"${message}`
|
|
1553
|
+
);
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1544
1556
|
};
|
|
1545
1557
|
var Configurer = class {
|
|
1546
1558
|
constructor(defaultConfig) {
|
|
@@ -1564,13 +1576,17 @@ var Configurer = class {
|
|
|
1564
1576
|
generateExampleObject() {
|
|
1565
1577
|
return Object.fromEntries(
|
|
1566
1578
|
Object.entries(this.defaultConfig).map(([key, value]) => {
|
|
1579
|
+
const typedValue = toTypedValue(value);
|
|
1580
|
+
if (typedValue && typeof typedValue === "object" && !Array.isArray(typedValue)) {
|
|
1581
|
+
return [toCamelCaseKey(key), typedValue];
|
|
1582
|
+
}
|
|
1567
1583
|
if (value.includes(",")) {
|
|
1568
1584
|
return [
|
|
1569
1585
|
toCamelCaseKey(key),
|
|
1570
1586
|
value.split(",").map((v) => toTypedValue(v))
|
|
1571
1587
|
];
|
|
1572
1588
|
}
|
|
1573
|
-
return [toCamelCaseKey(key),
|
|
1589
|
+
return [toCamelCaseKey(key), typedValue];
|
|
1574
1590
|
})
|
|
1575
1591
|
);
|
|
1576
1592
|
}
|
|
@@ -1595,6 +1611,9 @@ function normalizeConfigValue(value) {
|
|
|
1595
1611
|
if (Array.isArray(value)) {
|
|
1596
1612
|
return value.map((item) => normalizeArrayItem(item)).join(",");
|
|
1597
1613
|
}
|
|
1614
|
+
if (typeof value === "object") {
|
|
1615
|
+
return JSON.stringify(value);
|
|
1616
|
+
}
|
|
1598
1617
|
return String(value);
|
|
1599
1618
|
}
|
|
1600
1619
|
function normalizeArrayItem(value) {
|
|
@@ -1658,8 +1677,26 @@ function toTypedValue(value) {
|
|
|
1658
1677
|
if (/^\d+$/.test(trimmed)) {
|
|
1659
1678
|
return Number.parseInt(trimmed, 10);
|
|
1660
1679
|
}
|
|
1680
|
+
const jsonObject = parseJsonObjectString(trimmed);
|
|
1681
|
+
if (jsonObject !== void 0) {
|
|
1682
|
+
return jsonObject;
|
|
1683
|
+
}
|
|
1661
1684
|
return trimmed;
|
|
1662
1685
|
}
|
|
1686
|
+
function parseJsonObjectString(value) {
|
|
1687
|
+
if (!value.startsWith("{") || !value.endsWith("}")) {
|
|
1688
|
+
return void 0;
|
|
1689
|
+
}
|
|
1690
|
+
try {
|
|
1691
|
+
const parsed = JSON.parse(value);
|
|
1692
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
1693
|
+
return parsed;
|
|
1694
|
+
}
|
|
1695
|
+
} catch {
|
|
1696
|
+
return void 0;
|
|
1697
|
+
}
|
|
1698
|
+
return void 0;
|
|
1699
|
+
}
|
|
1663
1700
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1664
1701
|
0 && (module.exports = {
|
|
1665
1702
|
AbortedError,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../index.ts", "../src/workflow.ts", "../src/dual-object.ts", "../src/workflow-dispatcher.ts", "../src/round-robin.ts", "../src/abortable.ts", "../src/middleware-dispatcher/dynamic-middleware-dispatcher.ts", "../src/middleware-dispatcher/middleware-dispatcher.ts", "../src/middleware-dispatcher/proto-middleware-dispatcher.ts", "../src/utility/parse-i18n.ts", "../src/patch-string-in-object.ts", "../src/i18n/i18n.ts", "../src/i18n/middlewares/lookup.ts", "../src/observe-diff.ts", "../src/memorize.ts", "../src/may-be-array.ts", "../src/app-context/app-context.ts", "../src/app-context/app-service-base.ts", "../src/configurer/configurer.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './src/workflow';\nexport * from './src/dual-object';\nexport * from './src/workflow-dispatcher';\nexport * from './src/round-robin';\nexport * from './src/abortable';\nexport * from './src/types';\nexport * from './src/middleware-dispatcher';\nexport * from './src/i18n';\nexport * from './src/patch-string-in-object';\nexport * from './src/observe-diff';\nexport * from './src/memorize';\nexport * from './src/may-be-array';\nexport * from './src/app-context';\n\nexport * from './src/configurer';\n", "// ========== \u7C7B\u578B\u5DE5\u5177 ==========\ntype AwaitedLike<T> = T extends Promise<infer R> ? R : T;\ntype AnyFn = (...args: any[]) => any;\n\ntype Chain<T> = Promise<AwaitedLike<T>> &\n (T extends AnyFn\n ? (...a: Parameters<T>) => Chain<AwaitedLike<ReturnType<T>>>\n : {}) & {\n [K in keyof T]: T[K] extends (...a: infer A) => infer R\n ? (...a: A) => Chain<AwaitedLike<R>>\n : Chain<AwaitedLike<T[K]>>;\n };\n\n// ========== \u6838\u5FC3\uFF1A\u4E0D\u53EF\u53D8\u8282\u70B9 ==========\nclass Node {\n private memo?: Promise<any>;\n constructor(\n private readonly source: any, // \u53EA\u6709\u6839\u8282\u70B9\u6709\u610F\u4E49\uFF1B\u5B50\u8282\u70B9\u53EF\u590D\u7528\u6839\u7684 source\n private readonly parent: Node | null, // \u524D\u7F00\n private readonly op: ((x: any) => any) | null, // \u4ECE parent \u7ED3\u679C\u5230\u672C\u8282\u70B9\u7ED3\u679C\u7684\u53D8\u6362\n ) {}\n\n run(): Promise<any> {\n if (!this.memo) {\n this.memo = (async () => {\n if (!this.parent) {\n // \u6839\uFF1A\u628A source \u89E3\u4E00\u6B21\u5373\u53EF\n return await this.source;\n }\n // \u5148\u62FF\u5230\u7236\u8282\u70B9\u7ED3\u679C\uFF08\u4F1A\u8BB0\u5FC6\u5316\uFF09\n const base = await this.parent.run();\n // \u5E94\u7528\u672C\u8282\u70B9\u7684\u53D8\u6362\uFF08\u5141\u8BB8\u8FD4\u56DE\u540C\u6B65\u6216\u5F02\u6B65\uFF09\n return this.op ? this.op(base) : base;\n })();\n }\n return this.memo;\n }\n\n // \u5DE5\u5382\uFF1A\u884D\u751F\u5B50\u8282\u70B9\uFF08\u5206\u53C9 = \u590D\u7528\u540C\u4E00\u4E2A parent\uFF09\n child(op: (x: any) => any): Node {\n return new Node(this.source, this, op);\n }\n\n // \u62FF\u5230\u201C\u76F8\u540C\u8282\u70B9\u201D\u7684\u53E5\u67C4\uFF08\u663E\u5F0F fork\uFF09\n fork(): Node {\n return new Node(this.source, this.parent, this.op);\n }\n}\n\nexport const WF_NODE = Symbol('@@workflow/node');\n\nfunction isWorkflowChain(x: any): x is Chain<any> {\n return !!x && typeof x === 'function' && x[WF_NODE] instanceof Node;\n}\n\n// ========== \u5BF9\u5916 API\uFF1Aworkflow ==========\nexport function workflow<T>(source: T | Promise<T>): Chain<T> {\n if (isWorkflowChain(source)) {\n return source as unknown as Chain<T>;\n }\n const root = new Node(source, null, null);\n return makeProxy<T>(root) as any;\n}\n\n// ========== \u4EE3\u7406\u5C42\uFF1A\u628A Node \u66B4\u9732\u6210\u94FE\u5F0F API ==========\nfunction makeProxy<T>(node: Node): Chain<T> {\n const runOnce = () => node.run(); // \u8BB0\u5FC6\u5316\u5728 Node \u5185\u90E8\n\n const rootHandler: ProxyHandler<any> = {\n get(_t, prop) {\n if (prop === WF_NODE) return node;\n // \u7ED3\u675F\u4FE1\u53F7\uFF1A\u6240\u6709 then/catch/finally \u590D\u7528\u540C\u4E00\u4E2A Promise\n if (prop === 'then')\n return (res: any, rej?: any) => runOnce().then(res, rej);\n if (prop === 'catch') return (rej: any) => runOnce().catch(rej);\n if (prop === 'finally') return (fin: any) => runOnce().finally(fin);\n\n // \u8BBF\u95EE\u4E00\u4E2A\u5C5E\u6027\uFF1A\u751F\u6210\u4E00\u4E2A\u201CGet\u201D\u5B50\u8282\u70B9\uFF0C\u4F46\u4E0D\u6267\u884C\n return linkProxy(prop);\n },\n // \u652F\u6301\u5BF9\u201C\u5F53\u524D\u503C\u201D\u76F4\u63A5\u4E8C\u6B21\u8C03\u7528\uFF1A foo()()\n apply(_t, _this, argArray) {\n const child = node.child((cur: any) => {\n if (typeof cur !== 'function')\n throw new TypeError('Current value is not callable');\n return cur(...argArray);\n });\n return makeProxy<any>(child);\n },\n };\n\n const linkProxy = (prop: PropertyKey) =>\n new Proxy(function () {}, {\n // \u628A \u201C.foo(\u2026args)\u201D \u8BB0\u5F55\u4E3A Call\n apply(_t, _this, argArray) {\n const child = node.child((cur: any) => {\n const fn = (cur as any)[prop];\n if (typeof fn !== 'function') {\n throw new TypeError(`${String(prop)} is not a function`);\n }\n return fn.apply(cur, argArray);\n });\n return makeProxy<any>(child);\n },\n // \u628A \u201C.bar\u201D \u8BB0\u5F55\u4E3A Get\uFF1B\u7EE7\u7EED\u6DF1\u5165\u65F6\u5728\u8FD9\u4E2A Get \u7684\u7ED3\u679C\u4E0A\u518D\u5904\u7406\n get(_t, next) {\n if (next === WF_NODE) return node;\n if (next === 'then')\n return (r: any, j?: any) =>\n node\n .child((cur: any) => (cur as any)[prop])\n .run()\n .then(r, j);\n if (next === 'catch')\n return (rej: any) =>\n node\n .child((cur: any) => (cur as any)[prop])\n .run()\n .catch(rej);\n if (next === 'finally')\n return (fin: any) =>\n node\n .child((cur: any) => (cur as any)[prop])\n .run()\n .finally(fin);\n\n const child = node.child((cur: any) => (cur as any)[prop]);\n return (makeProxy as any)(child)[next];\n },\n });\n\n return new Proxy(function () {}, rootHandler) as any;\n}\n", "// dual-unified.ts\nexport type Dual<T> = T & PromiseLike<T>;\nexport const DUAL_PENDING = Symbol('dual.pending');\nexport const throwDualPending = (): never => {\n throw DUAL_PENDING;\n};\n\ntype ThenKey = 'then' | 'catch' | 'finally';\nconst isThenKey = (k: PropertyKey): k is ThenKey =>\n k === 'then' || k === 'catch' || k === 'finally';\n\ntype State = 'undecided' | 'pending' | 'fulfilled' | 'rejected';\n\nexport type AsyncMethodKeys<T> = {\n [K in keyof T]-?: T[K] extends (...args: any[]) => Promise<any> ? K : never;\n}[keyof T];\n\nexport interface DualizeOptions<T> {\n /** \u8FD9\u4E9B\u65B9\u6CD5\u5728 undecided/pending \u65F6\u4F1A\u8FD4\u56DE\u5EF6\u8FDF\u6267\u884C\u51FD\u6570\uFF0C\u7B49\u5F85\u5BF9\u8C61 Promise \u5B8C\u6210\u540E\u518D\u8C03\u7528 */\n asyncMethods?: readonly (keyof T)[];\n}\n\nexport function dualizeAny<T>(\n sync: () => T, // \u540C\u6B65\u6784\u9020\uFF1B\u82E5\u629B\u9519\u5219\u89C6\u4E3A rejected\n asyncFn: () => Promise<T>, // \u5F02\u6B65\u6784\u9020\n options?: DualizeOptions<T>,\n): Dual<T> {\n let state: State = 'undecided';\n\n let value!: T; // fulfilled \u65F6\u7684\u503C\uFF08\u542B\u6765\u81EA sync \u6216 async\uFF09\n let reason: any; // rejected \u7684\u9519\u8BEF\n let p!: Promise<T>; // \u7F13\u5B58 Promise\uFF08resolved/rejected/\u8FDB\u884C\u4E2D\uFF09\n\n const asyncMethodSet = new Set<PropertyKey>(\n (options?.asyncMethods ?? []) as readonly PropertyKey[],\n );\n\n const startAsync = () => {\n if (!p || state === 'undecided') {\n state = 'pending';\n p = Promise.resolve()\n .then(asyncFn)\n .then(\n (v) => {\n value = v;\n state = 'fulfilled';\n return v;\n },\n (e) => {\n reason = e;\n state = 'rejected';\n throw e;\n },\n );\n }\n return p;\n };\n\n const ensureSync = () => {\n if (state === 'undecided') {\n try {\n value = sync();\n state = 'fulfilled';\n } catch (e) {\n if (e === DUAL_PENDING) {\n startAsync();\n return;\n }\n reason = e;\n state = 'rejected';\n }\n }\n };\n\n /** \u5728\u201C\u5BF9\u8C61\u53EF\u7528\u201D\u540E\u8C03\u7528\u67D0\u4E2A\u5F02\u6B65\u65B9\u6CD5\uFF08\u7531 asyncMethods \u58F0\u660E\uFF09 */\n const makeDeferredAsyncMethod =\n (prop: PropertyKey) =>\n (...args: any[]) =>\n startAsync().then((obj) => {\n const fn = (obj as any)[prop];\n return fn.apply(obj, args);\n });\n\n // \u4ECE\u67D0\u4E2A\u503C\u4E0A\u53D6\u5C5E\u6027\uFF08\u539F\u59CB\u503C\u4F1A\u88C5\u7BB1\uFF09\uFF0C\u5E76\u7ED1\u5B9A this\n const getFrom = (v: unknown, prop: PropertyKey) => {\n if (prop === Symbol.toPrimitive) {\n return (hint: 'default' | 'number' | 'string') => {\n const x: any = v;\n if (hint === 'number') return Number(x);\n if (hint === 'string') return String(x);\n if (typeof x === 'string') return x;\n const n = Number(x);\n return Number.isNaN(n) ? String(x) : n;\n };\n }\n if (prop === 'valueOf') return () => v as any;\n if (prop === 'toString') return () => String(v);\n\n const boxed: any =\n v !== null && (typeof v === 'object' || typeof v === 'function')\n ? v\n : Object(v as any);\n const out = boxed[prop];\n return typeof out === 'function' ? out.bind(boxed) : out;\n };\n\n const proxy = new Proxy(Object.create(null) as any, {\n get(_t, prop) {\n // then/catch/finally\uFF1A\u8D70 Promise \u901A\u9053\n if (isThenKey(prop)) {\n if (state === 'undecided') {\n startAsync();\n } else if (state === 'fulfilled') {\n // \u82E5\u5DF2 fulfilled\uFF08\u6765\u81EA sync \u6216 async\uFF09\uFF0C\u8865\u4E00\u4E2A\u5DF2\u5B8C\u6210\u7684 Promise\n p ||= Promise.resolve(value);\n } else if (state === 'rejected') {\n p ||= Promise.reject(reason);\n } else {\n // pending\uFF1A\u5DF2\u6709 p\n startAsync();\n }\n const anyP: any = p;\n const m = anyP[prop];\n return typeof m === 'function' ? m.bind(anyP) : m;\n }\n\n // \u58F0\u660E\u4E3A\u5F02\u6B65\u65B9\u6CD5\u7684\u952E\uFF1A\u5728 undecided/pending \u65F6\u8FD4\u56DE\u201C\u5EF6\u8FDF\u51FD\u6570\u201D\n if (asyncMethodSet.has(prop)) {\n if (state === 'undecided' || state === 'pending') {\n startAsync();\n return makeDeferredAsyncMethod(prop);\n }\n if (state === 'fulfilled') {\n return getFrom(value, prop); // \u540C\u6B65\u53EF\u76F4\u63A5\u53D6\u5230\u65B9\u6CD5\uFF08\u5176\u672C\u8EAB\u8FD4\u56DE Promise\uFF09\n }\n if (state === 'rejected') {\n // \u8BBF\u95EE\u5373\u629B\uFF1B\u4E5F\u53EF\u4EE5\u9009\u62E9\u8FD4\u56DE () => Promise.reject(reason)\n throw reason;\n }\n }\n\n // \u5176\u5B83\u5C5E\u6027\u8BBF\u95EE\uFF1A\u9075\u5FAA\u72B6\u6001\u673A\n switch (state) {\n case 'undecided': {\n ensureSync();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (state === 'fulfilled') return getFrom(value, prop);\n if ((state as State) === 'pending') {\n throw new TypeError('Value is not ready yet. Please await it first.');\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (state === 'rejected') throw reason;\n // \u7406\u8BBA\u4E0A\u4E0D\u4F1A\u5230\u8FD9\u91CC\n throw new TypeError('Invalid state transition');\n }\n case 'pending': {\n // \u975E asyncMethods \u7684\u5C5E\u6027\u5728 pending \u65F6\u4E0D\u53EF\u540C\u6B65\u8BFB\u53D6\n throw new TypeError('Value is not ready yet. Please await it first.');\n }\n case 'fulfilled': {\n return getFrom(value, prop);\n }\n case 'rejected': {\n throw reason;\n }\n }\n },\n\n has(_t, key) {\n if (state === 'undecided') {\n ensureSync();\n }\n if (state === 'fulfilled') return key in Object(value as any);\n return false; // pending/rejected\uFF1A\u4FDD\u5B88\u5904\u7406\n },\n\n ownKeys() {\n if (state === 'undecided') ensureSync();\n if (state === 'fulfilled') return Reflect.ownKeys(Object(value as any));\n return [];\n },\n\n getOwnPropertyDescriptor(_t, key) {\n if (state === 'undecided') ensureSync();\n if (state === 'fulfilled')\n return Object.getOwnPropertyDescriptor(Object(value as any), key);\n return undefined;\n },\n });\n\n return proxy as Dual<T>;\n}\n", "export interface DispatcherOptions {\n /** Max attempts per task. Default 3. */\n maxAttempts?: number;\n /** Backoff base in ms. backoff = base * 2^failCount. Default 1000. */\n backoffBaseMs?: number;\n}\n\n// Internal task record\ntype Task<F extends (...args: any[]) => Promise<any>> = {\n args: Parameters<F>;\n resolve: (v: Awaited<ReturnType<F>>) => void;\n reject: (e: any) => void;\n attempts: number;\n lastError?: any;\n triedWorkers: Set<number>; // for global dispatch\n specificWorkerIndex?: number; // for dispatchSpecific only\n};\n\ntype WorkerState = {\n running: boolean;\n failCount: number;\n nextAvailableAt: number;\n totalRuns: number;\n};\n\ntype RemovalWaiter = () => void;\n\ntype ActiveSlot<F extends (...args: any[]) => Promise<any>> = {\n kind: 'active';\n fn: F;\n state: WorkerState;\n queue: Task<F>[];\n removalWaiters: RemovalWaiter[];\n removed?: boolean; // marker when removed while running; retained for completion callback\n};\n\ntype PendingSlot<F extends (...args: any[]) => Promise<any>> = {\n kind: 'pending';\n promise: Promise<F>;\n queue: Task<F>[];\n removalWaiters: RemovalWaiter[];\n error?: any;\n removed?: boolean; // if removed before resolved\n};\n\ntype RejectedSlot<F extends (...args: any[]) => Promise<any>> = {\n kind: 'rejected';\n error: any;\n queue: Task<F>[];\n removalWaiters: RemovalWaiter[];\n removed?: boolean;\n};\n\ntype Slot<F extends (...args: any[]) => Promise<any>> =\n | ActiveSlot<F>\n | PendingSlot<F>\n | RejectedSlot<F>;\n\nexport type WorkerSnapshot<F extends (...args: any[]) => Promise<any>> =\n | {\n index: number;\n status: 'active';\n fn: F;\n running: boolean;\n failCount: number;\n totalRuns: number;\n blockedMs: number;\n specificQueue: number;\n }\n | {\n index: number;\n status: 'pending';\n promise: Promise<F>;\n specificQueue: number;\n }\n | {\n index: number;\n status: 'rejected';\n error: string;\n specificQueue: number;\n };\n\nexport class WorkflowDispatcher<F extends (...args: any[]) => Promise<any>> {\n private readonly maxAttempts: number;\n private readonly backoffBaseMs: number;\n\n private readonly slots: Slot<F>[] = [];\n private readonly globalQueue: Task<F>[] = [];\n\n private pendingInits = 0;\n private everActivated = false;\n private drainScheduled = false;\n\n constructor(\n workersOrPromises: Array<F | Promise<F>>,\n options: DispatcherOptions = {},\n ) {\n // if (!workersOrPromises?.length) throw new Error('workers cannot be empty');\n\n this.maxAttempts = options.maxAttempts ?? 3;\n this.backoffBaseMs = options.backoffBaseMs ?? 1000;\n\n for (let i = 0; i < workersOrPromises.length; i++) {\n const w = workersOrPromises[i];\n if (typeof w === 'function') {\n const slot: ActiveSlot<F> = {\n kind: 'active',\n fn: w,\n state: {\n running: false,\n failCount: 0,\n nextAvailableAt: 0,\n totalRuns: 0,\n },\n queue: [],\n removalWaiters: [],\n };\n this.slots.push(slot);\n this.everActivated = true;\n } else {\n // Create a stable slot object and mutate it in-place on resolve/reject.\n this.pendingInits++;\n const slot: PendingSlot<F> = {\n kind: 'pending',\n promise: Promise.resolve(w),\n queue: [],\n removalWaiters: [],\n };\n this.slots.push(slot);\n\n slot.promise\n .then((fn) => {\n if (slot.removed) return; // was removed; ignore resolution\n // mutate in-place to active\n (slot as any).kind = 'active';\n (slot as any).fn = fn;\n (slot as any).state = {\n running: false,\n failCount: 0,\n nextAvailableAt: 0,\n totalRuns: 0,\n };\n this.everActivated = true;\n // keep queue & removalWaiters arrays as-is\n })\n .catch((err) => {\n if (slot.removed) return; // was removed; ignore\n // mutate in-place to rejected (keep queue/waiters)\n (slot as any).kind = 'rejected';\n (slot as any).error = err;\n })\n .finally(() => {\n this.pendingInits--;\n this.drain();\n if (this.pendingInits === 0 && !this.hasAnyActive()) {\n const err = new Error(\n 'No workers available (all failed to initialize).',\n );\n setTimeout(() => this.rejectAllQueued(err), 0);\n }\n });\n }\n }\n\n if (this.everActivated) this.drain();\n }\n\n /** Dispatch: choose eligible active with least totalRuns; retry across workers on failure. */\n dispatch(...args: Parameters<F>): Promise<Awaited<ReturnType<F>>> {\n return new Promise((resolve, reject) => {\n const task: Task<F> = {\n args,\n resolve,\n reject,\n attempts: 0,\n triedWorkers: new Set(),\n };\n this.globalQueue.push(task);\n this.drain();\n });\n }\n\n /** Dispatch to a specific worker (ignore backoff), wait until it is free; retry on the same worker. */\n dispatchSpecific(\n index: number,\n ...args: Parameters<F>\n ): Promise<Awaited<ReturnType<F>>> {\n if (index < 0 || index >= this.slots.length) {\n return Promise.reject(new Error(`worker index out of range: ${index}`));\n }\n return new Promise((resolve, reject) => {\n const task: Task<F> = {\n args,\n resolve,\n reject,\n attempts: 0,\n triedWorkers: new Set(),\n specificWorkerIndex: index,\n };\n const slot = this.slots[index];\n slot.queue.push(task);\n this.drain();\n });\n }\n\n /** Replace a worker at index with a new active worker function. */\n public replaceWorker(index: number, fn: F): void {\n if (index < 0 || index >= this.slots.length) {\n throw new Error(`worker index out of range: ${index}`);\n }\n const prevHadActive = this.hasAnyActive();\n const slot = this.slots[index];\n\n // Preserve queue & removal waiters; reset failure/backoff; keep totalRuns to avoid skew.\n const preservedQueue = slot.queue;\n const preservedWaiters = slot.removalWaiters ?? [];\n\n const next: ActiveSlot<F> = {\n kind: 'active',\n fn,\n state: {\n running: false,\n failCount: 0,\n nextAvailableAt: 0,\n totalRuns: (slot as any).state?.totalRuns ?? 0,\n },\n queue: preservedQueue,\n removalWaiters: preservedWaiters,\n };\n\n // Mutate in-place if possible (keeps references stable), else replace array entry.\n Object.assign(slot as any, next);\n (slot as any).kind = 'active';\n (slot as any).fn = fn;\n (slot as any).state.failCount = 0;\n (slot as any).state.nextAvailableAt = 0;\n\n this.everActivated = true;\n if (!prevHadActive && this.hasAnyActive()) {\n this.drain();\n } else {\n this.drain();\n }\n }\n\n /** Add a new active worker at the tail; return its index. */\n public addWorker(fn: F): number {\n const slot: ActiveSlot<F> = {\n kind: 'active',\n fn,\n state: { running: false, failCount: 0, nextAvailableAt: 0, totalRuns: 0 },\n queue: [],\n removalWaiters: [],\n };\n const index = this.slots.length;\n this.slots.push(slot);\n this.everActivated = true;\n this.drain();\n return index;\n }\n\n /**\n * Remove a worker completely (splice). It becomes unavailable immediately.\n * Returns a Promise that resolves when its last running task (if any) finishes.\n */\n public removeWorker(index: number): Promise<void> {\n if (index < 0 || index >= this.slots.length) {\n return Promise.reject(new Error(`worker index out of range: ${index}`));\n }\n\n const slot = this.slots[index];\n\n // Reject all queued specific tasks on this worker (macro-task to avoid unhandled)\n const queued = slot.queue.splice(0);\n const removalErr = new Error(`Worker[${index}] removed`);\n setTimeout(() => {\n for (const t of queued) t.reject(removalErr);\n }, 0);\n\n // Decide completion promise:\n let completion: Promise<void>;\n const isRunning = slot.kind === 'active' && slot.state.running;\n if (!isRunning) {\n completion = Promise.resolve();\n } else {\n completion = new Promise<void>((resolve) => {\n slot.removalWaiters.push(resolve);\n });\n }\n\n // Mark as removed (so any pending init resolution is ignored)\n (slot as any).removed = true;\n\n // Physically remove the slot\n this.slots.splice(index, 1);\n\n // Re-map indices in all remaining tasks:\n // 1) Fix specificWorkerIndex in every remaining slot.queue\n for (let i = 0; i < this.slots.length; i++) {\n const s = this.slots[i];\n for (const t of s.queue) {\n if (typeof t.specificWorkerIndex === 'number') {\n if (t.specificWorkerIndex === index) {\n // This should not happen because we just removed and flushed its queue,\n // but guard anyway.\n t.reject(new Error(`Worker[${index}] no longer exists`));\n } else if (t.specificWorkerIndex > index) {\n t.specificWorkerIndex -= 1;\n }\n }\n }\n }\n // 2) Fix triedWorkers sets in globalQueue\n for (const t of this.globalQueue) {\n if (t.triedWorkers.has(index)) t.triedWorkers.delete(index);\n const next = new Set<number>();\n for (const w of t.triedWorkers) {\n next.add(w > index ? w - 1 : w);\n }\n t.triedWorkers = next;\n }\n\n // Trigger scheduling for the remaining system\n this.drain();\n\n return completion;\n }\n\n snapshot(): WorkerSnapshot<F>[] {\n const now = Date.now();\n\n return this.slots.map((slot, i) => {\n switch (slot.kind) {\n case 'active': {\n const s = slot.state;\n return {\n index: i,\n status: 'active' as const,\n fn: slot.fn,\n running: s.running,\n failCount: s.failCount,\n totalRuns: s.totalRuns,\n blockedMs: Math.max(0, s.nextAvailableAt - now),\n specificQueue: slot.queue.length,\n };\n }\n\n case 'pending':\n return {\n index: i,\n status: 'pending' as const,\n promise: slot.promise,\n specificQueue: slot.queue.length,\n };\n\n case 'rejected':\n return {\n index: i,\n status: 'rejected' as const,\n error: String(slot.error ?? 'unknown error'),\n specificQueue: slot.queue.length,\n };\n }\n });\n }\n\n get pending(): number {\n return this.globalQueue.length;\n }\n\n // ---------------- scheduling ----------------\n\n private drain() {\n if (this.drainScheduled) return;\n this.drainScheduled = true;\n queueMicrotask(() => {\n this.drainScheduled = false;\n this._drainLoop();\n });\n }\n\n private _drainLoop() {\n // If no active workers and still initializing, wait; if all inited and none active, constructor already rejects all.\n if (!this.hasAnyActive()) {\n if (this.pendingInits > 0) return;\n return;\n }\n\n // First: flush rejected workers' specific queues (macro-task rejection)\n for (let i = 0; i < this.slots.length; i++) {\n const slot = this.slots[i];\n if (slot.kind === 'rejected' && slot.queue.length > 0) {\n const q = slot.queue.splice(0);\n const err = new Error(\n `Worker[${i}] failed to initialize: ${String(slot.error ?? 'unknown error')}`,\n );\n setTimeout(() => {\n for (const t of q) t.reject(err);\n }, 0);\n }\n }\n\n let progressed = true;\n while (progressed) {\n progressed = false;\n\n // 1) Run specific queues for active workers (ignore backoff)\n for (let i = 0; i < this.slots.length; i++) {\n const slot = this.slots[i];\n if (slot.kind !== 'active') continue;\n const st = slot.state;\n if (!st.running && slot.queue.length > 0) {\n const task = slot.queue.shift()!;\n this.startTaskOnActiveSlot(i, slot, task, /*fromSpecific*/ true);\n progressed = true;\n }\n }\n\n // 2) Run global queue (choose eligible active with least totalRuns)\n if (this.globalQueue.length > 0) {\n const idx = this.pickBestActiveForGlobal();\n if (idx !== -1) {\n const slot = this.slots[idx] as ActiveSlot<F>;\n const task = this.globalQueue.shift()!;\n this.startTaskOnActiveSlot(idx, slot, task, /*fromSpecific*/ false);\n progressed = true;\n }\n }\n }\n }\n\n private hasAnyActive() {\n return this.slots.some((s) => s.kind === 'active');\n }\n\n private rejectAllQueued(err: any) {\n while (this.globalQueue.length) this.globalQueue.shift()!.reject(err);\n for (const slot of this.slots) {\n while (slot.queue.length) slot.queue.shift()!.reject(err);\n }\n }\n\n private isEligibleActive(i: number, now: number) {\n const slot = this.slots[i] as ActiveSlot<F>;\n const slotGood = (s: ActiveSlot<F>) =>\n s.kind === 'active' && !s.state?.running;\n if (!slotGood(slot)) return false;\n if (now >= slot.state.nextAvailableAt) return true;\n return !this.slots.some((other: ActiveSlot<F>, j) => {\n if (j === i) return false;\n if (!slotGood(other)) return false;\n return now >= other.state.nextAvailableAt;\n });\n }\n\n private pickBestActiveForGlobal(): number {\n const now = Date.now();\n const task = this.globalQueue[0];\n\n // Prefer actives not tried yet\n let best = -1,\n bestRuns = Infinity;\n for (let i = 0; i < this.slots.length; i++) {\n if (!this.isEligibleActive(i, now)) continue;\n if (task?.triedWorkers.has(i)) continue;\n const slot = this.slots[i] as ActiveSlot<F>;\n if (slot.state.totalRuns < bestRuns) {\n bestRuns = slot.state.totalRuns;\n best = i;\n }\n }\n if (best !== -1) return best;\n\n // Allow already-tried actives\n best = -1;\n bestRuns = Infinity;\n for (let i = 0; i < this.slots.length; i++) {\n if (!this.isEligibleActive(i, now)) continue;\n const slot = this.slots[i] as ActiveSlot<F>;\n if (slot.state.totalRuns < bestRuns) {\n bestRuns = slot.state.totalRuns;\n best = i;\n }\n }\n return best;\n }\n\n private startTaskOnActiveSlot(\n index: number,\n slot: ActiveSlot<F>,\n task: Task<F>,\n fromSpecific: boolean,\n ) {\n const st = slot.state;\n st.running = true;\n st.totalRuns += 1;\n\n const finalize = () => {\n st.running = false;\n // If someone is waiting for this worker to finish (removeWorker), resolve them when idle.\n if (\n slot.removalWaiters.length > 0 &&\n !st.running &&\n slot.queue.length === 0\n ) {\n const list = slot.removalWaiters.splice(0);\n for (const w of list) w();\n }\n this.drain();\n };\n\n (async () => {\n try {\n const result = await slot.fn(...task.args);\n st.failCount = Math.max(0, st.failCount - 1);\n task.resolve(result as Awaited<ReturnType<F>>);\n } catch (err) {\n task.lastError = err;\n st.failCount += 1;\n st.nextAvailableAt =\n Date.now() + this.backoffBaseMs * Math.pow(2, st.failCount);\n\n if (fromSpecific) {\n task.attempts += 1;\n if (task.attempts >= this.maxAttempts) {\n task.reject(task.lastError);\n } else {\n // retry on the same worker (ignore backoff)\n slot.queue.push(task);\n }\n } else {\n task.attempts += 1;\n task.triedWorkers.add(index);\n const activeCount = this.slots.filter(\n (s) => s.kind === 'active',\n ).length;\n const allActiveTriedOnce = task.triedWorkers.size >= activeCount;\n const attemptsLimitReached = task.attempts >= this.maxAttempts;\n\n if (allActiveTriedOnce || attemptsLimitReached) {\n task.reject(task.lastError);\n } else {\n this.globalQueue.push(task);\n }\n }\n } finally {\n finalize();\n }\n })();\n }\n}\n", "export class RoundRobin<T> {\n private index = 0;\n\n constructor(public items: T[]) {\n if (items.length === 0) {\n throw new Error('RoundRobin requires at least one item');\n }\n }\n\n next(): T {\n const nextIndex = this.index % this.items.length;\n this.index = (this.index + 1) % this.items.length;\n return this.items[nextIndex];\n }\n}\n", "export class AbortedError extends Error {\n name = 'AbortError';\n constructor(\n msg = 'Operation aborted',\n public cause?: unknown,\n ) {\n super(msg);\n }\n}\n\ntype AnyFunc = (...args: any[]) => any;\nconst isObjectLike = (v: unknown): v is object | AnyFunc =>\n (typeof v === 'object' && v !== null) || typeof v === 'function';\n\nfunction boxPrimitive(v: unknown): object {\n return Object(v as any);\n}\n\nexport interface AbortableOpts {\n /** \u662F\u5426\u628A\u539F\u59CB\u503C\u88C5\u7BB1\u540E\u518D\u4EE3\u7406\uFF08\u4F1A\u6539\u53D8 typeof/=== \u8BED\u4E49\uFF0C\u9ED8\u8BA4 false\uFF09 */\n boxPrimitives?: boolean;\n /** \u4E0D\u9012\u5F52\u4EE3\u7406\u5B50\u5BF9\u8C61\uFF08\u4EC5\u4EE3\u7406\u9876\u5C42\u5BF9\u8C61/\u51FD\u6570\uFF0C\u9ED8\u8BA4 false\uFF09 */\n noRecursive?: boolean;\n}\n\nexport function abortable<T>(\n obj: T,\n signal: AbortSignal,\n opts?: AbortableOpts,\n): T {\n const { boxPrimitives = false, noRecursive = false } = opts ?? {};\n\n const throwIfAborted = () => {\n if (signal.aborted) {\n const r = (signal as any).reason;\n if (r instanceof Error) throw r;\n throw new AbortedError('Operation aborted', r);\n }\n };\n\n throwIfAborted();\n\n const targetToProxy = new WeakMap<object, any>();\n const proxyToTarget = new WeakMap<object, any>();\n\n const wrapNativePromise = <V>(pLike: PromiseLike<V>): Promise<V> => {\n const base = pLike instanceof Promise ? pLike : Promise.resolve(pLike);\n return base.then(\n async (v) => {\n throwIfAborted();\n return proxify(v);\n },\n async (e) => {\n throwIfAborted();\n throw e;\n },\n );\n };\n\n let shortCircuit = false;\n\n const proxify = <V>(value: V): V => {\n if (noRecursive) {\n if (shortCircuit) {\n return value;\n } else {\n shortCircuit = true;\n }\n }\n\n // Promise\uFF1A\u6309\u201C\u771F Promise + \u4EE3\u7406\u201D\u7684\u65B9\u6848\u5904\u7406\n if (typeof (value as any)?.then === 'function') {\n return wrapNativePromise(value as any) as unknown as V;\n }\n\n // \u539F\u59CB\u503C\n if (!isObjectLike(value)) {\n if (!boxPrimitives) return value;\n return proxify(boxPrimitive(value) as unknown as V);\n }\n\n // \u590D\u7528\n const cached = targetToProxy.get(value as object);\n if (cached) return cached;\n\n const handler: ProxyHandler<any> = {\n get(target, p, receiver) {\n throwIfAborted();\n const out = Reflect.get(target, p, receiver);\n return proxify(out);\n },\n set(target, p, val, receiver) {\n throwIfAborted();\n return Reflect.set(target, p, val, receiver);\n },\n apply(target, thisArg, argArray) {\n throwIfAborted();\n const unwrappedThis =\n (isObjectLike(thisArg) && proxyToTarget.get(thisArg as any)) ||\n thisArg;\n const ret = Reflect.apply(target as AnyFunc, unwrappedThis, argArray);\n return proxify(ret);\n },\n construct(target, argArray, newTarget) {\n throwIfAborted();\n const instance = Reflect.construct(\n target as AnyFunc,\n argArray,\n newTarget,\n );\n return proxify(instance);\n },\n defineProperty(t, p, attrs) {\n throwIfAborted();\n return Reflect.defineProperty(t, p, attrs);\n },\n deleteProperty(t, p) {\n throwIfAborted();\n return Reflect.deleteProperty(t, p);\n },\n getOwnPropertyDescriptor(t, p) {\n throwIfAborted();\n return Reflect.getOwnPropertyDescriptor(t, p);\n },\n getPrototypeOf(t) {\n throwIfAborted();\n return Reflect.getPrototypeOf(t);\n },\n setPrototypeOf(t, proto) {\n throwIfAborted();\n return Reflect.setPrototypeOf(t, proto);\n },\n has(t, p) {\n throwIfAborted();\n return Reflect.has(t, p);\n },\n isExtensible(t) {\n throwIfAborted();\n return Reflect.isExtensible(t);\n },\n ownKeys(t) {\n throwIfAborted();\n return Reflect.ownKeys(t);\n },\n preventExtensions(t) {\n throwIfAborted();\n return Reflect.preventExtensions(t);\n },\n };\n\n const proxy = new Proxy(value as any, handler);\n targetToProxy.set(value as object, proxy);\n proxyToTarget.set(proxy, value);\n return proxy;\n };\n\n return proxify(obj);\n}\n", "import {\n AnyFunc,\n MiddlewareDispatcherOptions,\n Middleware,\n MiddlewareResult,\n MiddlewareAcceptResult,\n MiddlewareErrorHandler,\n MiddlewareReturn,\n MiddlewareNextArgs,\n} from './types';\n\nexport class DynamicMiddlewareDispatcher<F extends AnyFunc> {\n constructor(protected options: MiddlewareDispatcherOptions<F> = {}) {}\n\n async buildMiddlewares(...args: Parameters<F>): Promise<Middleware<F>[]> {\n return [];\n }\n\n async dispatch(...args: Parameters<F>): MiddlewareResult<F> {\n const mws = await this.buildMiddlewares(...args);\n const acceptResult: MiddlewareAcceptResult<F> =\n this.options.acceptResult || ((res) => res != null);\n const errorHandler: MiddlewareErrorHandler<F> =\n this.options.errorHandler || ((e, args, next) => next());\n const dispatch = async (\n i: number,\n useArgs: Parameters<F>,\n ): MiddlewareResult<F> => {\n if (i >= mws.length) return undefined;\n\n const mw = mws[i];\n let nextCalled = false;\n\n const next = async (\n ...passedArgs: MiddlewareNextArgs<F>\n ): MiddlewareResult<F> => {\n if (nextCalled) {\n return undefined;\n }\n nextCalled = true;\n return dispatch(i + 1, [\n ...passedArgs,\n ...useArgs.slice(passedArgs.length),\n ] as Parameters<F>);\n };\n\n const runMw = async (cb: () => MiddlewareReturn<F>) => {\n const res = await cb();\n if (!nextCalled && !(await acceptResult(res))) {\n return dispatch(i + 1, useArgs);\n }\n return res;\n };\n\n try {\n return await runMw(() => mw(...useArgs, next));\n } catch (e) {\n return await runMw(() => errorHandler(e, useArgs, next));\n }\n };\n return dispatch(0, args);\n }\n}\n", "import { AnyFunc, Middleware } from './types';\nimport { DynamicMiddlewareDispatcher } from './dynamic-middleware-dispatcher';\n\nexport class MiddlewareDispatcher<\n F extends AnyFunc,\n> extends DynamicMiddlewareDispatcher<F> {\n middlewares: Middleware<F>[] = [];\n\n middleware(mw: Middleware<F>, prior = false) {\n if (prior) {\n this.middlewares.unshift(mw);\n } else {\n this.middlewares.push(mw);\n }\n return this;\n }\n\n removeMiddleware(mw: Middleware<F>) {\n const index = this.middlewares.indexOf(mw);\n if (index >= 0) {\n this.middlewares.splice(index, 1);\n }\n return this;\n }\n\n async buildMiddlewares(...args: Parameters<F>): Promise<Middleware<F>[]> {\n return this.middlewares;\n }\n}\n", "import { Middleware, MiddlewareResult } from './types';\nimport { AnyClass, ClassType } from '../types';\nimport { DynamicMiddlewareDispatcher } from './dynamic-middleware-dispatcher';\n\nexport type ProtoMiddlewareArgs<A extends any[] = [], T = any> = [\n inst: T,\n ...args: A,\n];\nexport type ProtoMiddlewareFunc<A extends any[] = [], T = any> = (\n ...args: ProtoMiddlewareArgs<A, T>\n) => T | undefined;\n\nexport class ProtoMiddlewareDispatcher<\n A extends any[] = [],\n> extends DynamicMiddlewareDispatcher<ProtoMiddlewareFunc<A>> {\n private middlewareProtoMap = new Map<\n AnyClass,\n Middleware<ProtoMiddlewareFunc<A>>[]\n >();\n private middlewareProtoMapPrior = new Map<\n AnyClass,\n Middleware<ProtoMiddlewareFunc<A>>[]\n >();\n\n middleware<T>(\n cls: ClassType<T>,\n mw: Middleware<ProtoMiddlewareFunc<A, T>>,\n prior = false,\n ) {\n const map = prior ? this.middlewareProtoMapPrior : this.middlewareProtoMap;\n const mws = map.get(cls) || [];\n mws.push(mw);\n map.set(cls, mws);\n return this;\n }\n\n removeMiddleware<T>(\n cls: ClassType<T>,\n mw: Middleware<ProtoMiddlewareFunc<A, T>>,\n ) {\n for (const map of [this.middlewareProtoMap, this.middlewareProtoMapPrior]) {\n const mws = map.get(cls);\n if (mws) {\n const index = mws.indexOf(mw);\n if (index >= 0) {\n mws.splice(index, 1);\n }\n }\n }\n return this;\n }\n\n async dispatch<T>(\n ...args: ProtoMiddlewareArgs<A, T>\n ): MiddlewareResult<ProtoMiddlewareFunc<A, T>> {\n return super.dispatch(...args);\n }\n\n async buildMiddlewares(...args: ProtoMiddlewareArgs<A>) {\n // buildMiddlewares \u53EA\u9700\u8981\u77E5\u9053 inst\n if (args.length === 0) return [];\n\n const inst = args[0];\n if (!inst || typeof inst !== 'object') return [];\n\n // 1. \u6536\u96C6\u539F\u578B\u94FE\uFF08Base \u2192 Sub\uFF09\n const chain: AnyClass[] = [];\n let cur: any = inst.constructor;\n\n while (cur && cur !== Object) {\n chain.push(cur);\n cur = Object.getPrototypeOf(cur.prototype)?.constructor;\n }\n\n chain.reverse();\n\n const result: Middleware<ProtoMiddlewareFunc<A>>[] = [];\n\n // 2. prior\uFF1ABase \u2192 Sub\n for (const cls of chain) {\n const mws = this.middlewareProtoMapPrior.get(cls);\n if (mws) {\n result.push(...[...mws].reverse());\n }\n }\n\n // 3. normal\uFF1ASub \u2192 Base\n for (let i = chain.length - 1; i >= 0; i--) {\n const cls = chain[i];\n const mws = this.middlewareProtoMap.get(cls);\n if (mws) {\n result.push(...mws);\n }\n }\n\n result.push((inst, ...args) => {\n return inst;\n });\n\n return result;\n }\n}\n", "// \u2014\u2014 \u89E3\u6790\u7ED3\u679C\u7ED3\u6784 \u2014\u2014 //\nexport type I18nPiece =\n | { type: 'raw'; value: string }\n | { type: 'ph'; rawInner: string; key: string };\n\n/**\n * \u6808\u5F0F\u89E3\u6790 #{ ... } \u5360\u4F4D\u3002\u652F\u6301\u5185\u90E8\u6210\u5BF9\u82B1\u62EC\u53F7\uFF0C\u5982 #{ foo {{ bar }} }\u3002\n * - \u672A\u95ED\u5408\u65F6\uFF1A\u628A\u4ECE\u4E0A\u6B21\u4F4D\u7F6E i \u5230\u7ED3\u5C3E\u6574\u4F53\u4F5C\u4E3A raw \u653E\u56DE\uFF08\u907F\u514D\u88AB\u62C6\u6210\u4E24\u6BB5\uFF09\n * - key = trim(rawInner)\n */\nexport const parseI18n = (text: string): I18nPiece[] => {\n const pieces: I18nPiece[] = [];\n if (!text) return pieces;\n\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n const start = text.indexOf('#{', i);\n if (start === -1) {\n // \u6CA1\u6709\u66F4\u591A\u5360\u4F4D\u7B26\n if (i < n) pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5148\u5C1D\u8BD5\u5339\u914D\u8FD9\u4E2A\u5360\u4F4D\u7B26\u662F\u5426\u95ED\u5408\uFF08\u6B64\u65F6\u4E0D\u7ACB\u5373\u63A8\u5165\u524D\u5BFC raw\uFF09\n let j = start + 2; // \u6307\u5411 '#{' \u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\n let depth = 1;\n while (j < n && depth > 0) {\n const ch = text.charCodeAt(j);\n if (ch === 123 /* '{' */) depth++;\n else if (ch === 125 /* '}' */) depth--;\n j++;\n }\n\n if (depth !== 0) {\n // \u672A\u95ED\u5408\uFF1A\u628A\u4ECE i \u5230\u672B\u5C3E\u6574\u4F53\u5F53\u4F5C raw\uFF08\u5305\u542B\u524D\u5BFC + '#{' \u5C3E\u5DF4\uFF09\n pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5230\u8FD9\u91CC\u8BF4\u660E\u5360\u4F4D\u95ED\u5408\uFF1A\u5148\u63A8\u5165\u524D\u5BFC raw\uFF0C\u518D\u63A8\u5360\u4F4D\u7247\u6BB5\n if (start > i) {\n pieces.push({ type: 'raw', value: text.slice(i, start) });\n }\n\n const rawInner = text.slice(start + 2, j - 1);\n const key = rawInner.trim();\n pieces.push({ type: 'ph', rawInner, key });\n\n i = j; // \u7EE7\u7EED\u5411\u540E\u626B\u63CF\n }\n\n return pieces;\n};\n", "import { Awaitable } from './types';\n\nexport const patchStringInObject = async <T>(\n obj: T,\n cb: (s: string) => Awaitable<string>,\n): Promise<T> => {\n const visited = new WeakSet<object>();\n\n const isSpecialObject = (v: any): boolean => {\n if (v == null || typeof v !== 'object') return false;\n if (\n v instanceof Date ||\n v instanceof RegExp ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n ArrayBuffer.isView(v)\n ) {\n return true;\n }\n\n const tag = Object.prototype.toString.call(v);\n switch (tag) {\n case '[object URL]':\n case '[object URLSearchParams]':\n case '[object Error]':\n case '[object Blob]':\n case '[object File]':\n case '[object FormData]':\n return true;\n default:\n return false;\n }\n };\n\n const checkValue = (\n v: any,\n ): { ok: false } | { ok: true; kind: 'string' | 'object' } => {\n if (!v) return { ok: false };\n\n const t = typeof v;\n if (\n t === 'number' ||\n t === 'bigint' ||\n t === 'symbol' ||\n t === 'function'\n ) {\n return { ok: false };\n }\n if (t === 'string') return { ok: true, kind: 'string' };\n if (t === 'object') return { ok: true, kind: 'object' };\n\n return { ok: false };\n };\n\n const rebuildObject = async (value: any): Promise<any> => {\n const proto = Object.getPrototypeOf(value);\n const out = Object.create(proto);\n\n const keys = Reflect.ownKeys(value);\n\n await Promise.all(\n keys.map(async (key) => {\n const desc = Object.getOwnPropertyDescriptor(value, key as any);\n if (!desc) return;\n\n if ('value' in desc) {\n const newVal = await walk(desc.value);\n Object.defineProperty(out, key, { ...desc, value: newVal });\n return;\n }\n\n Object.defineProperty(out, key, desc);\n\n let current: any = undefined;\n if (typeof desc.get === 'function') {\n try {\n current = desc.get.call(value);\n } catch {}\n }\n if (current === undefined) return;\n\n try {\n const newVal = await walk(current);\n if (typeof desc.set === 'function') {\n try {\n desc.set.call(out, newVal);\n } catch {}\n }\n } catch {}\n }),\n );\n\n return out;\n };\n\n const walk = async (value: any): Promise<any> => {\n const check = checkValue(value);\n\n if (!check.ok) return value;\n\n if (check.kind === 'string') {\n return cb(value);\n }\n\n if (value instanceof Promise) {\n return value.then((resolved) => walk(resolved));\n }\n\n if (typeof value === 'object') {\n if (!Array.isArray(value) && isSpecialObject(value)) return value;\n\n if (visited.has(value)) return value;\n visited.add(value);\n\n if (Array.isArray(value)) {\n const out = await Promise.all(value.map((v) => walk(v)));\n return out as any;\n }\n\n return rebuildObject(value);\n }\n\n return value;\n };\n\n return walk(obj);\n};\n", "import { parseI18n } from '../utility/parse-i18n';\nimport {\n I18nMiddleware,\n I18nMiddlewareFunc,\n I18nMiddlewareNext,\n I18nOptions,\n} from './types';\nimport { patchStringInObject } from '../patch-string-in-object';\nimport { DynamicMiddlewareDispatcher } from '../middleware-dispatcher';\n\nclass I18nMiddlewareDispatcher<\n Ex extends any[],\n> extends DynamicMiddlewareDispatcher<I18nMiddlewareFunc<Ex>> {\n constructor() {\n super({\n acceptResult: (res) => res != null,\n errorHandler: (e) => {\n throw e;\n },\n });\n }\n\n middlewares: I18nMiddleware<Ex>[] = [];\n\n async buildMiddlewares() {\n return this.middlewares.map(\n (mw) =>\n (locale: string, text: string, ...args: any[]) => {\n const ex = args.slice(0, -1) as Ex;\n const next = args[args.length - 1] as I18nMiddlewareNext<Ex>;\n return mw(locale, text, next, ...ex);\n },\n );\n }\n}\n\nexport class I18n<Ex extends any[] = []> {\n constructor(private options: I18nOptions) {}\n\n locales = new Set(this.options.locales);\n defaultLocale = this.options.defaultLocale ?? this.options.locales[0];\n\n private mw = new I18nMiddlewareDispatcher();\n\n middleware(mw: I18nMiddleware<Ex>, prior = false) {\n if (prior) {\n this.mw.middlewares.unshift(mw);\n } else {\n this.mw.middlewares.push(mw);\n }\n return this;\n }\n\n removeMiddleware(mw: I18nMiddleware<Ex>) {\n const idx = this.mw.middlewares.indexOf(mw);\n if (idx >= 0) {\n this.mw.middlewares.splice(idx, 1);\n }\n return this;\n }\n\n getExactLocale(locale: string) {\n const input = (locale ?? '').trim();\n if (!input) return this.defaultLocale;\n\n if (this.locales.has(input)) return input;\n\n // \u5C0F\u5199\u5316\u6BD4\u8F83\uFF0C\u4FDD\u7559\u539F\u5927\u5C0F\u5199\n const entries = Array.from(this.locales).map((l) => ({\n orig: l,\n lower: l.toLowerCase(),\n }));\n const lower = input.toLowerCase();\n\n // 1) \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // 2) \u6309 '-' \u62C6\u5206\uFF0C\u4F9D\u6B21\u5C1D\u8BD5\u53BB\u6389\u6700\u53F3\u8FB9\u7684\u6BB5\n // zh-Hans-CN \u2192 zh-Hans \u2192 zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n\n // 3) \u515C\u5E95\n return this.defaultLocale;\n }\n\n private buildFallbackChain(locale: string): string[] {\n const best = this.getExactLocale(locale); // \u4F60\u7684\u201C\u6700\u957F\u5339\u914D\u201D\u51FD\u6570\n // \u62C6\u5206 zh-Hans-CN -> ['zh-Hans-CN','zh-Hans','zh']\n const parts: string[] = [];\n const segs = best.split('-');\n for (let i = segs.length; i > 1; i--)\n parts.push(segs.slice(0, i).join('-'));\n parts.push(segs[0]); // 'zh'\n // \u9644\u52A0\u9ED8\u8BA4\u8BED\u8A00\n if (!parts.includes(this.defaultLocale)) parts.push(this.defaultLocale);\n // \u53BB\u91CD\n return Array.from(new Set(parts)).filter((p) => this.locales.has(p));\n }\n\n private async applyMiddlewares(\n locale: string,\n text: string,\n ...ex: Ex\n ): Promise<string | undefined> {\n const tryLocale = (locale: string) => this.mw.dispatch(locale, text, ...ex);\n\n for (const loc of this.buildFallbackChain(locale)) {\n const result = await tryLocale(loc);\n if (result != null) {\n return result;\n }\n }\n return undefined;\n }\n\n async translateString(\n locale: string,\n text: string,\n ...ex: Ex\n ): Promise<string> {\n if (!text) return text;\n\n locale = this.getExactLocale(locale);\n\n const pieces = parseI18n(text);\n if (!pieces.some((p) => p.type === 'ph')) {\n return pieces\n .map((p) => (p.type === 'raw' ? p.value : `#{${p.rawInner}}`))\n .join('');\n }\n\n const promises: Array<Promise<string | undefined | null>> = [];\n\n for (const p of pieces) {\n if (p.type === 'ph') {\n promises.push(this.applyMiddlewares(locale, p.key, ...ex));\n }\n }\n\n const results = await Promise.all(promises);\n\n let out = '';\n let k = 0;\n for (const p of pieces) {\n if (p.type === 'raw') {\n out += p.value;\n } else {\n const r = results[k++];\n out += r == null ? `#{${p.rawInner}}` : r;\n }\n }\n return out;\n }\n\n async translate<T>(locale: string, obj: T, ...ex: Ex): Promise<T> {\n return patchStringInObject(obj, (s) =>\n this.translateString(locale, s, ...ex),\n );\n }\n}\n", "import { I18nMiddleware } from '../types';\nimport { Awaitable } from '../../types';\n\nexport type I18nDictionary = Record<string, Record<string, string>>;\n\ntype MatchType = 'exact' | 'hierarchy' | 'startsWith';\n\nexport const I18nLookupMiddleware = <Ex extends any[] = []>(\n dict:\n | I18nDictionary\n | ((locale: string, key: string, ...ex: Ex) => Awaitable<I18nDictionary>),\n options?: { matchType?: MatchType },\n): I18nMiddleware<Ex> => {\n const matchType: MatchType = options?.matchType ?? 'exact';\n const dictFactory = typeof dict === 'function' ? dict : () => dict;\n\n // \u57FA\u4E8E locales \u5217\u8868\u505A\u201C\u7CBE\u786E\u2192\u5C42\u7EA7\u56DE\u9000(zh-Hans-CN\u2192zh-Hans\u2192zh)\u201D\u7684\u6700\u957F\u5339\u914D\n const pickBestByHierarchy = (\n input: string,\n locales: string[],\n ): string | undefined => {\n if (!input) return undefined;\n const entries = locales.map((l) => ({ orig: l, lower: l.toLowerCase() }));\n const lower = input.toLowerCase();\n\n // \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // \u9010\u7EA7\u56DE\u9000\uFF1Azh-Hans-CN -> zh-Hans -> zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n return undefined;\n };\n\n return async (locale, key, next, ...ex) => {\n const dictResolved = await dictFactory(locale, key, ...ex);\n\n let dictionary = dictResolved[locale];\n\n if (!dictionary) {\n if (matchType === 'hierarchy') {\n const best = pickBestByHierarchy(locale, Object.keys(dictResolved));\n if (best) dictionary = dictResolved[best];\n } else if (matchType === 'startsWith') {\n const keys = Object.keys(dictResolved).filter((k) =>\n locale.startsWith(k),\n );\n if (keys.length) {\n const best = keys.reduce((a, b) => (b.length > a.length ? b : a));\n dictionary = dictResolved[best];\n }\n }\n }\n\n // \u547D\u4E2D\u5224\u65AD\uFF1A\u5141\u8BB8\u7A7A\u5B57\u7B26\u4E32 ''\uFF1B\u4EC5 null/undefined \u89C6\u4E3A\u672A\u547D\u4E2D\n if (dictionary && Object.prototype.hasOwnProperty.call(dictionary, key)) {\n const val = dictionary[key];\n if (val != null) {\n return val;\n }\n }\n\n return next();\n };\n};\n\nexport const createI18nLookupMiddleware = <Ex extends any[]>() =>\n I18nLookupMiddleware as typeof I18nLookupMiddleware<Ex>;\n", "export const observeDiff = <T>(\n obj: T,\n cb: <K extends keyof T>(change: {\n type: 'add' | 'update' | 'delete';\n key: K;\n oldValue: T[K] | undefined;\n newValue: T[K] | undefined;\n }) => any,\n): T => {\n return new Proxy(obj as any, {\n set(target, key: string | symbol, value) {\n const oldValue = target[key];\n const type = Object.prototype.hasOwnProperty.call(target, key)\n ? 'update'\n : 'add';\n target[key] = value;\n cb({ type, key: key as any, oldValue, newValue: value });\n return true;\n },\n deleteProperty(target, key: string | symbol) {\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n const oldValue = target[key];\n delete target[key];\n cb({ type: 'delete', key: key as any, oldValue, newValue: undefined });\n return true;\n }\n return false;\n },\n });\n};\n", "export const Memorize = () => {\n const cache = new WeakMap<object, any>();\n\n const isPromiseLike = (v: any): v is Promise<unknown> =>\n v != null && typeof v.then === 'function' && typeof v.catch === 'function';\n\n const getOrSet = (instance: object, compute: () => any) => {\n if (cache.has(instance)) return cache.get(instance);\n\n const result = compute();\n\n if (isPromiseLike(result)) {\n const wrapped = result.catch((err) => {\n cache.delete(instance); // \u4E0B\u6B21\u8FD8\u80FD\u91CD\u65B0\u7B97\n throw err;\n });\n cache.set(instance, wrapped);\n return wrapped;\n }\n\n cache.set(instance, result);\n return result;\n };\n\n return function (\n _target: any,\n _propertyKey: string,\n descriptor: PropertyDescriptor,\n ) {\n // getter\n if (typeof descriptor.get === 'function') {\n const originalGetter = descriptor.get;\n descriptor.get = function () {\n return getOrSet(this, () => originalGetter.call(this));\n };\n return;\n }\n\n // method\n if (typeof descriptor.value === 'function') {\n const originalMethod = descriptor.value;\n descriptor.value = function (...args: any[]) {\n return getOrSet(this, () => originalMethod.apply(this, args));\n };\n return;\n }\n };\n};\n", "export type MayBeArray<T> = T | T[];\n\nexport const makeArray = <T>(value: MayBeArray<T>): T[] => {\n return Array.isArray(value) ? value : [value];\n};\n", "import { AnyClass, Empty } from '../types';\nimport {\n AppContext,\n AppServiceClass,\n AppProvideArgs,\n AppProvidedMerged,\n AppProvideOptions,\n AppContextUsed,\n AppContextState,\n} from './types';\n\nconst ProvidePrefix = 'provide:';\n\nconst getMethodDescriptor = (cls: AnyClass, key: PropertyKey) => {\n let proto = cls.prototype;\n while (proto && proto !== Object.prototype) {\n const desc = Object.getOwnPropertyDescriptor(proto, key as any);\n if (desc) return desc;\n proto = Object.getPrototypeOf(proto);\n }\n return undefined;\n};\n\ntype ProvideRecord = {\n classRef: AnyClass;\n factory: (ctx: AppContextCore<any, any>) => any;\n};\n\ntype LoadEntry = {\n classRef: AnyClass;\n inst: any;\n};\n\ntype ObjectStep = (ctx: AppContextCore<any, any>) => void;\n\nexport class AppContextCore<Cur = Empty, Req = Empty> {\n private __current: Cur;\n private __required: Req;\n\n private provideRecords: ProvideRecord[] = [];\n private registry = new Map<string | AnyClass, LoadEntry>();\n private objectSteps: ObjectStep[] = [];\n started = false;\n private starting = false;\n private startingEntries: LoadEntry[] | null = null;\n private createdRecords: Set<ProvideRecord> | null = null;\n private createdEntries: Map<ProvideRecord, LoadEntry> | null = null;\n private loadingRecords = new Set<ProvideRecord>();\n\n private findProvideRecord(key: AnyClass): ProvideRecord | undefined {\n for (let i = 0; i < this.provideRecords.length; i += 1) {\n const record = this.provideRecords[i];\n if (\n record.classRef === key &&\n (!this.createdRecords || !this.createdRecords.has(record))\n ) {\n return record;\n }\n }\n return undefined;\n }\n\n private createEntryFromRecord(record: ProvideRecord): LoadEntry {\n const existing = this.createdEntries?.get(record);\n if (existing) {\n return existing;\n }\n\n if (this.loadingRecords.has(record)) {\n throw new Error(\n `Circular dependency detected while providing: ${record.classRef?.name ?? 'UnknownService'}`,\n );\n }\n\n this.loadingRecords.add(record);\n try {\n const entry: LoadEntry = {\n classRef: record.classRef,\n inst: record.factory(this),\n };\n this.createdRecords?.add(record);\n this.createdEntries?.set(record, entry);\n this.registry.set(record.classRef, entry);\n this.startingEntries?.push(entry);\n return entry;\n } finally {\n this.loadingRecords.delete(record);\n }\n }\n\n provide<\n C extends AppServiceClass<Cur, Req>,\n const P extends string = '',\n const M extends (keyof InstanceType<C>)[] = [],\n >(\n cls: C,\n ...args: AppProvideArgs<Cur, Req, C, P, M>\n ): AppProvidedMerged<Cur, Req, C, P, M> {\n const last = args[args.length - 1] as any;\n const hasOptions =\n !!last &&\n typeof last === 'object' &&\n ('provide' in last ||\n 'merge' in last ||\n 'useValue' in last ||\n 'useFactory' in last ||\n 'useClass' in last);\n\n const options = (hasOptions ? last : undefined) as\n | AppProvideOptions<Cur, Req, C, P, M>\n | undefined;\n\n const _args = (\n hasOptions ? args.slice(0, -1) : args\n ) as ConstructorParameters<C>;\n\n const classRef = cls as unknown as AnyClass;\n\n // Create factory function that will be called during start() with the target ctx.\n const factory = (ctx: AppContextCore<any, any>) =>\n options?.useValue ??\n (options?.useFactory\n ? options.useFactory(ctx as any, ..._args)\n : new (options?.useClass ?? cls)(ctx as any, ..._args));\n\n // Record the provide configuration\n this.provideRecords.push({\n classRef,\n factory,\n });\n\n // Set up property accessors if needed\n if (options?.provide) {\n const prop = options.provide;\n const step: ObjectStep = (ctx) => {\n Object.defineProperty(ctx, prop, {\n enumerable: true,\n configurable: true,\n get: () => {\n const currentEntry = ctx.registry.get(classRef);\n return currentEntry?.inst;\n },\n });\n };\n step(this);\n this.objectSteps.push(step);\n }\n\n if (options?.merge?.length) {\n for (const key of options.merge) {\n const desc = getMethodDescriptor(cls, key);\n const isMethod = !!desc && typeof desc.value === 'function';\n\n const step: ObjectStep = (ctx) => {\n if (isMethod) {\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n get: () => {\n const currentEntry = ctx.registry.get(classRef);\n const currentInst = currentEntry?.inst;\n const fn = (currentInst as any)?.[key];\n return typeof fn === 'function' ? fn.bind(currentInst) : fn;\n },\n });\n return;\n }\n\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n get: () => {\n const currentEntry = ctx.registry.get(classRef);\n return (currentEntry?.inst as any)?.[key];\n },\n set: (value: any) => {\n const currentEntry = ctx.registry.get(classRef);\n if (!currentEntry) return;\n (currentEntry.inst as any)[key] = value;\n },\n });\n };\n step(this);\n this.objectSteps.push(step);\n }\n }\n\n return this as any;\n }\n\n get<R>(\n cls:\n | AppServiceClass<Cur, Req, any, R>\n | (() => AppServiceClass<Cur, Req, any, R>),\n ): R {\n let key = cls as unknown as AnyClass;\n if (\n !this.registry.has(key) &&\n typeof cls === 'function' &&\n !(cls as any).prototype\n ) {\n key = (cls as () => AppServiceClass<Cur, Req, any, R>)() as AnyClass;\n }\n\n if (!this.registry.has(key) && this.starting) {\n const record = this.findProvideRecord(key);\n if (record) {\n this.createEntryFromRecord(record);\n }\n }\n\n if (!this.registry.has(key)) {\n throw new Error(`Service not provided: ${key?.name ?? cls.name}`);\n }\n\n const entry = this.registry.get(key)!;\n return entry.inst as any;\n }\n\n /**\n * @deprecated Use get() instead. getAsync() is no longer needed as all services are loaded synchronously during start().\n */\n async getAsync<R>(\n cls:\n | AppServiceClass<Cur, Req, any, R>\n | (() => AppServiceClass<Cur, Req, any, R>),\n ): Promise<R> {\n return this.get(cls);\n }\n\n use<const Ctxes extends AppContext<any, any>[]>(\n ...ctxes: Ctxes\n ): AppContextUsed<Cur, Req, Ctxes> {\n for (const ctx of ctxes) {\n const other = ctx as any as AppContextCore<any, any>;\n\n if (this.started && !other?.started) {\n throw new Error(\n 'Cannot use an unstarted context into a started context.',\n );\n }\n\n // Copy provide records\n if (Array.isArray(other?.provideRecords)) {\n this.provideRecords.push(...other.provideRecords);\n }\n\n // Copy and apply object steps\n if (Array.isArray(other?.objectSteps)) {\n this.objectSteps.push(...other.objectSteps);\n for (const step of other.objectSteps) {\n step(this);\n }\n }\n\n // If the other context has already started, copy loaded entries only.\n // They should remain initialized by the source context and must not be re-initialized.\n if (other?.started) {\n if (other?.registry instanceof Map) {\n for (const [key, value] of other.registry.entries()) {\n this.registry.set(key, value);\n }\n }\n }\n }\n\n return this as any;\n }\n\n define(): AppContext<Cur, Req> {\n return this as any;\n }\n\n async start(): Promise<Empty extends Req ? AppContext<Cur, Req> : never> {\n if (this.started) {\n return this as any;\n }\n\n const startedEntries: LoadEntry[] = [];\n const preloadedKeys = new Set(this.registry.keys());\n this.starting = true;\n this.startingEntries = startedEntries;\n this.createdRecords = new Set();\n this.createdEntries = new Map();\n try {\n // Create all instances. Dependencies requested via get() during construction\n // can be created on-demand from remaining provide records.\n for (const record of this.provideRecords) {\n if (preloadedKeys.has(record.classRef)) {\n continue;\n }\n this.createEntryFromRecord(record);\n }\n\n // Resolve all promises created in this start().\n for (const entry of startedEntries) {\n if (entry.inst && typeof entry.inst.then === 'function') {\n entry.inst = await entry.inst;\n }\n }\n\n // Init only instances created in this start().\n for (const entry of startedEntries) {\n const inst = entry.inst;\n if (inst && typeof inst.init === 'function') {\n await inst.init();\n }\n }\n this.started = true;\n return this as any;\n } finally {\n this.createdEntries = null;\n this.createdRecords = null;\n this.startingEntries = null;\n this.starting = false;\n }\n }\n}\n\nexport const createAppContext = <Req = Empty>() =>\n new AppContextCore<Empty, Req>() as AppContext<Empty, Req>;\n", "import { Empty } from '../types';\nimport { AppContext } from './types';\n\nexport class AppServiceBase<Cur = Empty, Config extends any[] = []> {\n constructor(\n public ctx: AppContext<Cur>,\n ...args: Config\n ) {}\n\n async init() {}\n}\n", "export class ConfigurerInstance<T extends Record<string, string>> {\n constructor(\n public config: T,\n private readonly defaultConfig: T,\n ) {}\n\n getString<K extends keyof T>(key: K): string {\n return (this.config[key] || this.defaultConfig[key]) as string;\n }\n\n getInt<K extends keyof T>(key: K): number {\n return parseInt(this.getString(key));\n }\n\n getFloat<K extends keyof T>(key: K): number {\n return parseFloat(this.getString(key));\n }\n\n getBoolean<K extends keyof T>(key: K): boolean {\n const defaultBoolean = parseConfigBoolean(this.defaultConfig[key], false);\n return parseConfigBoolean(this.getString(key), defaultBoolean);\n }\n\n getStringArray<K extends keyof T>(key: K): string[] {\n return convertStringArray(this.getString(key));\n }\n\n getIntArray<K extends keyof T>(key: K): number[] {\n return convertIntArray(this.getString(key));\n }\n\n getFloatArray<K extends keyof T>(key: K): number[] {\n return convertFloatArray(this.getString(key));\n }\n\n getBooleanArray<K extends keyof T>(key: K): boolean[] {\n const defaultBoolean = parseConfigBoolean(this.defaultConfig[key], false);\n return convertBooleanArray(this.getString(key), defaultBoolean);\n }\n}\n\nexport class Configurer<T extends Record<string, string>> {\n constructor(public defaultConfig: T) {}\n\n loadConfig(\n options: { env?: Record<string, string | undefined>; obj?: any } = {},\n ): ConfigurerInstance<T> {\n const readConfig =\n options?.obj && typeof options.obj === 'object' ? options.obj : {};\n const normalizedConfig = normalizeConfigByDefaultKeys(\n readConfig,\n this.defaultConfig,\n );\n\n return new ConfigurerInstance<T>(\n {\n ...this.defaultConfig,\n ...normalizedConfig,\n ...(options?.env || {}),\n } as T,\n this.defaultConfig,\n );\n }\n\n generateExampleObject(): Record<\n string,\n string | number | string[] | number[]\n > {\n return Object.fromEntries(\n Object.entries(this.defaultConfig).map(([key, value]) => {\n if (value.includes(',')) {\n return [\n toCamelCaseKey(key),\n value.split(',').map((v) => toTypedValue(v)),\n ];\n }\n return [toCamelCaseKey(key), toTypedValue(value)];\n }),\n );\n }\n}\n\nexport type TypeFromConfigurer<C extends ConfigurerInstance<any>> =\n C extends ConfigurerInstance<infer T> ? T : never;\n\nfunction toCamelCaseKey(key: string): string {\n const lower = key.toLowerCase();\n return lower.replace(/_([a-z0-9])/g, (_, ch: string) => ch.toUpperCase());\n}\n\nfunction normalizeConfigValue(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number') {\n return value.toString();\n }\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n if (Array.isArray(value)) {\n return value.map((item) => normalizeArrayItem(item)).join(',');\n }\n return String(value);\n}\n\nfunction normalizeArrayItem(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number') {\n return value.toString();\n }\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n return String(value);\n}\n\nfunction normalizeConfigByDefaultKeys<T extends Record<string, string>>(\n readConfig: Record<string, unknown>,\n defaultConfig: T,\n): Partial<T> {\n const normalizedConfig: Partial<T> = {};\n for (const key of Object.keys(defaultConfig) as Array<keyof T>) {\n const rawKey = key as string;\n const camelKey = toCamelCaseKey(rawKey);\n const value =\n readConfig[camelKey] !== undefined\n ? readConfig[camelKey]\n : readConfig[rawKey];\n const normalized = normalizeConfigValue(value);\n if (normalized !== undefined) {\n normalizedConfig[key] = normalized as T[typeof key];\n }\n }\n return normalizedConfig;\n}\n\nfunction parseConfigBoolean(value: unknown, defaultValue = false): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number') {\n return value !== 0;\n }\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (defaultValue) {\n return !(\n normalized === '0' ||\n normalized === 'false' ||\n normalized === 'null'\n );\n }\n return !(\n normalized === '' ||\n normalized === '0' ||\n normalized === 'false' ||\n normalized === 'null'\n );\n }\n if (value == null) {\n return defaultValue;\n }\n return Boolean(value);\n}\n\nfunction convertStringArray(str: string): string[] {\n return (\n str\n ?.split(',')\n .map((s) => s.trim())\n .filter((s) => s) || []\n );\n}\n\nfunction convertIntArray(str: string): number[] {\n return (\n str\n ?.split(',')\n .map((s) => parseInt(s.trim()))\n .filter((n) => !isNaN(n)) || []\n );\n}\n\nfunction convertFloatArray(str: string): number[] {\n return (\n str\n ?.split(',')\n .map((s) => parseFloat(s.trim()))\n .filter((n) => !isNaN(n)) || []\n );\n}\n\nfunction convertBooleanArray(str: string, defaultValue = false): boolean[] {\n return (\n str\n ?.split(',')\n .map((s) => parseConfigBoolean(s.trim(), defaultValue))\n .filter((item) => typeof item === 'boolean') || []\n );\n}\n\nfunction toTypedValue(value: string): string | number {\n const trimmed = value.trim();\n if (/^\\d+$/.test(trimmed)) {\n return Number.parseInt(trimmed, 10);\n }\n return trimmed;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export * from './src/workflow';\nexport * from './src/dual-object';\nexport * from './src/workflow-dispatcher';\nexport * from './src/round-robin';\nexport * from './src/abortable';\nexport * from './src/types';\nexport * from './src/middleware-dispatcher';\nexport * from './src/i18n';\nexport * from './src/patch-string-in-object';\nexport * from './src/observe-diff';\nexport * from './src/memorize';\nexport * from './src/may-be-array';\nexport * from './src/app-context';\n\nexport * from './src/configurer';\n", "// ========== \u7C7B\u578B\u5DE5\u5177 ==========\ntype AwaitedLike<T> = T extends Promise<infer R> ? R : T;\ntype AnyFn = (...args: any[]) => any;\n\ntype Chain<T> = Promise<AwaitedLike<T>> &\n (T extends AnyFn\n ? (...a: Parameters<T>) => Chain<AwaitedLike<ReturnType<T>>>\n : {}) & {\n [K in keyof T]: T[K] extends (...a: infer A) => infer R\n ? (...a: A) => Chain<AwaitedLike<R>>\n : Chain<AwaitedLike<T[K]>>;\n };\n\n// ========== \u6838\u5FC3\uFF1A\u4E0D\u53EF\u53D8\u8282\u70B9 ==========\nclass Node {\n private memo?: Promise<any>;\n constructor(\n private readonly source: any, // \u53EA\u6709\u6839\u8282\u70B9\u6709\u610F\u4E49\uFF1B\u5B50\u8282\u70B9\u53EF\u590D\u7528\u6839\u7684 source\n private readonly parent: Node | null, // \u524D\u7F00\n private readonly op: ((x: any) => any) | null, // \u4ECE parent \u7ED3\u679C\u5230\u672C\u8282\u70B9\u7ED3\u679C\u7684\u53D8\u6362\n ) {}\n\n run(): Promise<any> {\n if (!this.memo) {\n this.memo = (async () => {\n if (!this.parent) {\n // \u6839\uFF1A\u628A source \u89E3\u4E00\u6B21\u5373\u53EF\n return await this.source;\n }\n // \u5148\u62FF\u5230\u7236\u8282\u70B9\u7ED3\u679C\uFF08\u4F1A\u8BB0\u5FC6\u5316\uFF09\n const base = await this.parent.run();\n // \u5E94\u7528\u672C\u8282\u70B9\u7684\u53D8\u6362\uFF08\u5141\u8BB8\u8FD4\u56DE\u540C\u6B65\u6216\u5F02\u6B65\uFF09\n return this.op ? this.op(base) : base;\n })();\n }\n return this.memo;\n }\n\n // \u5DE5\u5382\uFF1A\u884D\u751F\u5B50\u8282\u70B9\uFF08\u5206\u53C9 = \u590D\u7528\u540C\u4E00\u4E2A parent\uFF09\n child(op: (x: any) => any): Node {\n return new Node(this.source, this, op);\n }\n\n // \u62FF\u5230\u201C\u76F8\u540C\u8282\u70B9\u201D\u7684\u53E5\u67C4\uFF08\u663E\u5F0F fork\uFF09\n fork(): Node {\n return new Node(this.source, this.parent, this.op);\n }\n}\n\nexport const WF_NODE = Symbol('@@workflow/node');\n\nfunction isWorkflowChain(x: any): x is Chain<any> {\n return !!x && typeof x === 'function' && x[WF_NODE] instanceof Node;\n}\n\n// ========== \u5BF9\u5916 API\uFF1Aworkflow ==========\nexport function workflow<T>(source: T | Promise<T>): Chain<T> {\n if (isWorkflowChain(source)) {\n return source as unknown as Chain<T>;\n }\n const root = new Node(source, null, null);\n return makeProxy<T>(root) as any;\n}\n\n// ========== \u4EE3\u7406\u5C42\uFF1A\u628A Node \u66B4\u9732\u6210\u94FE\u5F0F API ==========\nfunction makeProxy<T>(node: Node): Chain<T> {\n const runOnce = () => node.run(); // \u8BB0\u5FC6\u5316\u5728 Node \u5185\u90E8\n\n const rootHandler: ProxyHandler<any> = {\n get(_t, prop) {\n if (prop === WF_NODE) return node;\n // \u7ED3\u675F\u4FE1\u53F7\uFF1A\u6240\u6709 then/catch/finally \u590D\u7528\u540C\u4E00\u4E2A Promise\n if (prop === 'then')\n return (res: any, rej?: any) => runOnce().then(res, rej);\n if (prop === 'catch') return (rej: any) => runOnce().catch(rej);\n if (prop === 'finally') return (fin: any) => runOnce().finally(fin);\n\n // \u8BBF\u95EE\u4E00\u4E2A\u5C5E\u6027\uFF1A\u751F\u6210\u4E00\u4E2A\u201CGet\u201D\u5B50\u8282\u70B9\uFF0C\u4F46\u4E0D\u6267\u884C\n return linkProxy(prop);\n },\n // \u652F\u6301\u5BF9\u201C\u5F53\u524D\u503C\u201D\u76F4\u63A5\u4E8C\u6B21\u8C03\u7528\uFF1A foo()()\n apply(_t, _this, argArray) {\n const child = node.child((cur: any) => {\n if (typeof cur !== 'function')\n throw new TypeError('Current value is not callable');\n return cur(...argArray);\n });\n return makeProxy<any>(child);\n },\n };\n\n const linkProxy = (prop: PropertyKey) =>\n new Proxy(function () {}, {\n // \u628A \u201C.foo(\u2026args)\u201D \u8BB0\u5F55\u4E3A Call\n apply(_t, _this, argArray) {\n const child = node.child((cur: any) => {\n const fn = (cur as any)[prop];\n if (typeof fn !== 'function') {\n throw new TypeError(`${String(prop)} is not a function`);\n }\n return fn.apply(cur, argArray);\n });\n return makeProxy<any>(child);\n },\n // \u628A \u201C.bar\u201D \u8BB0\u5F55\u4E3A Get\uFF1B\u7EE7\u7EED\u6DF1\u5165\u65F6\u5728\u8FD9\u4E2A Get \u7684\u7ED3\u679C\u4E0A\u518D\u5904\u7406\n get(_t, next) {\n if (next === WF_NODE) return node;\n if (next === 'then')\n return (r: any, j?: any) =>\n node\n .child((cur: any) => (cur as any)[prop])\n .run()\n .then(r, j);\n if (next === 'catch')\n return (rej: any) =>\n node\n .child((cur: any) => (cur as any)[prop])\n .run()\n .catch(rej);\n if (next === 'finally')\n return (fin: any) =>\n node\n .child((cur: any) => (cur as any)[prop])\n .run()\n .finally(fin);\n\n const child = node.child((cur: any) => (cur as any)[prop]);\n return (makeProxy as any)(child)[next];\n },\n });\n\n return new Proxy(function () {}, rootHandler) as any;\n}\n", "// dual-unified.ts\nexport type Dual<T> = T & PromiseLike<T>;\nexport const DUAL_PENDING = Symbol('dual.pending');\nexport const throwDualPending = (): never => {\n throw DUAL_PENDING;\n};\n\ntype ThenKey = 'then' | 'catch' | 'finally';\nconst isThenKey = (k: PropertyKey): k is ThenKey =>\n k === 'then' || k === 'catch' || k === 'finally';\n\ntype State = 'undecided' | 'pending' | 'fulfilled' | 'rejected';\n\nexport type AsyncMethodKeys<T> = {\n [K in keyof T]-?: T[K] extends (...args: any[]) => Promise<any> ? K : never;\n}[keyof T];\n\nexport interface DualizeOptions<T> {\n /** \u8FD9\u4E9B\u65B9\u6CD5\u5728 undecided/pending \u65F6\u4F1A\u8FD4\u56DE\u5EF6\u8FDF\u6267\u884C\u51FD\u6570\uFF0C\u7B49\u5F85\u5BF9\u8C61 Promise \u5B8C\u6210\u540E\u518D\u8C03\u7528 */\n asyncMethods?: readonly (keyof T)[];\n}\n\nexport function dualizeAny<T>(\n sync: () => T, // \u540C\u6B65\u6784\u9020\uFF1B\u82E5\u629B\u9519\u5219\u89C6\u4E3A rejected\n asyncFn: () => Promise<T>, // \u5F02\u6B65\u6784\u9020\n options?: DualizeOptions<T>,\n): Dual<T> {\n let state: State = 'undecided';\n\n let value!: T; // fulfilled \u65F6\u7684\u503C\uFF08\u542B\u6765\u81EA sync \u6216 async\uFF09\n let reason: any; // rejected \u7684\u9519\u8BEF\n let p!: Promise<T>; // \u7F13\u5B58 Promise\uFF08resolved/rejected/\u8FDB\u884C\u4E2D\uFF09\n\n const asyncMethodSet = new Set<PropertyKey>(\n (options?.asyncMethods ?? []) as readonly PropertyKey[],\n );\n\n const startAsync = () => {\n if (!p || state === 'undecided') {\n state = 'pending';\n p = Promise.resolve()\n .then(asyncFn)\n .then(\n (v) => {\n value = v;\n state = 'fulfilled';\n return v;\n },\n (e) => {\n reason = e;\n state = 'rejected';\n throw e;\n },\n );\n }\n return p;\n };\n\n const ensureSync = () => {\n if (state === 'undecided') {\n try {\n value = sync();\n state = 'fulfilled';\n } catch (e) {\n if (e === DUAL_PENDING) {\n startAsync();\n return;\n }\n reason = e;\n state = 'rejected';\n }\n }\n };\n\n /** \u5728\u201C\u5BF9\u8C61\u53EF\u7528\u201D\u540E\u8C03\u7528\u67D0\u4E2A\u5F02\u6B65\u65B9\u6CD5\uFF08\u7531 asyncMethods \u58F0\u660E\uFF09 */\n const makeDeferredAsyncMethod =\n (prop: PropertyKey) =>\n (...args: any[]) =>\n startAsync().then((obj) => {\n const fn = (obj as any)[prop];\n return fn.apply(obj, args);\n });\n\n // \u4ECE\u67D0\u4E2A\u503C\u4E0A\u53D6\u5C5E\u6027\uFF08\u539F\u59CB\u503C\u4F1A\u88C5\u7BB1\uFF09\uFF0C\u5E76\u7ED1\u5B9A this\n const getFrom = (v: unknown, prop: PropertyKey) => {\n if (prop === Symbol.toPrimitive) {\n return (hint: 'default' | 'number' | 'string') => {\n const x: any = v;\n if (hint === 'number') return Number(x);\n if (hint === 'string') return String(x);\n if (typeof x === 'string') return x;\n const n = Number(x);\n return Number.isNaN(n) ? String(x) : n;\n };\n }\n if (prop === 'valueOf') return () => v as any;\n if (prop === 'toString') return () => String(v);\n\n const boxed: any =\n v !== null && (typeof v === 'object' || typeof v === 'function')\n ? v\n : Object(v as any);\n const out = boxed[prop];\n return typeof out === 'function' ? out.bind(boxed) : out;\n };\n\n const proxy = new Proxy(Object.create(null) as any, {\n get(_t, prop) {\n // then/catch/finally\uFF1A\u8D70 Promise \u901A\u9053\n if (isThenKey(prop)) {\n if (state === 'undecided') {\n startAsync();\n } else if (state === 'fulfilled') {\n // \u82E5\u5DF2 fulfilled\uFF08\u6765\u81EA sync \u6216 async\uFF09\uFF0C\u8865\u4E00\u4E2A\u5DF2\u5B8C\u6210\u7684 Promise\n p ||= Promise.resolve(value);\n } else if (state === 'rejected') {\n p ||= Promise.reject(reason);\n } else {\n // pending\uFF1A\u5DF2\u6709 p\n startAsync();\n }\n const anyP: any = p;\n const m = anyP[prop];\n return typeof m === 'function' ? m.bind(anyP) : m;\n }\n\n // \u58F0\u660E\u4E3A\u5F02\u6B65\u65B9\u6CD5\u7684\u952E\uFF1A\u5728 undecided/pending \u65F6\u8FD4\u56DE\u201C\u5EF6\u8FDF\u51FD\u6570\u201D\n if (asyncMethodSet.has(prop)) {\n if (state === 'undecided' || state === 'pending') {\n startAsync();\n return makeDeferredAsyncMethod(prop);\n }\n if (state === 'fulfilled') {\n return getFrom(value, prop); // \u540C\u6B65\u53EF\u76F4\u63A5\u53D6\u5230\u65B9\u6CD5\uFF08\u5176\u672C\u8EAB\u8FD4\u56DE Promise\uFF09\n }\n if (state === 'rejected') {\n // \u8BBF\u95EE\u5373\u629B\uFF1B\u4E5F\u53EF\u4EE5\u9009\u62E9\u8FD4\u56DE () => Promise.reject(reason)\n throw reason;\n }\n }\n\n // \u5176\u5B83\u5C5E\u6027\u8BBF\u95EE\uFF1A\u9075\u5FAA\u72B6\u6001\u673A\n switch (state) {\n case 'undecided': {\n ensureSync();\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (state === 'fulfilled') return getFrom(value, prop);\n if ((state as State) === 'pending') {\n throw new TypeError('Value is not ready yet. Please await it first.');\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (state === 'rejected') throw reason;\n // \u7406\u8BBA\u4E0A\u4E0D\u4F1A\u5230\u8FD9\u91CC\n throw new TypeError('Invalid state transition');\n }\n case 'pending': {\n // \u975E asyncMethods \u7684\u5C5E\u6027\u5728 pending \u65F6\u4E0D\u53EF\u540C\u6B65\u8BFB\u53D6\n throw new TypeError('Value is not ready yet. Please await it first.');\n }\n case 'fulfilled': {\n return getFrom(value, prop);\n }\n case 'rejected': {\n throw reason;\n }\n }\n },\n\n has(_t, key) {\n if (state === 'undecided') {\n ensureSync();\n }\n if (state === 'fulfilled') return key in Object(value as any);\n return false; // pending/rejected\uFF1A\u4FDD\u5B88\u5904\u7406\n },\n\n ownKeys() {\n if (state === 'undecided') ensureSync();\n if (state === 'fulfilled') return Reflect.ownKeys(Object(value as any));\n return [];\n },\n\n getOwnPropertyDescriptor(_t, key) {\n if (state === 'undecided') ensureSync();\n if (state === 'fulfilled')\n return Object.getOwnPropertyDescriptor(Object(value as any), key);\n return undefined;\n },\n });\n\n return proxy as Dual<T>;\n}\n", "export interface DispatcherOptions {\n /** Max attempts per task. Default 3. */\n maxAttempts?: number;\n /** Backoff base in ms. backoff = base * 2^failCount. Default 1000. */\n backoffBaseMs?: number;\n}\n\n// Internal task record\ntype Task<F extends (...args: any[]) => Promise<any>> = {\n args: Parameters<F>;\n resolve: (v: Awaited<ReturnType<F>>) => void;\n reject: (e: any) => void;\n attempts: number;\n lastError?: any;\n triedWorkers: Set<number>; // for global dispatch\n specificWorkerIndex?: number; // for dispatchSpecific only\n};\n\ntype WorkerState = {\n running: boolean;\n failCount: number;\n nextAvailableAt: number;\n totalRuns: number;\n};\n\ntype RemovalWaiter = () => void;\n\ntype ActiveSlot<F extends (...args: any[]) => Promise<any>> = {\n kind: 'active';\n fn: F;\n state: WorkerState;\n queue: Task<F>[];\n removalWaiters: RemovalWaiter[];\n removed?: boolean; // marker when removed while running; retained for completion callback\n};\n\ntype PendingSlot<F extends (...args: any[]) => Promise<any>> = {\n kind: 'pending';\n promise: Promise<F>;\n queue: Task<F>[];\n removalWaiters: RemovalWaiter[];\n error?: any;\n removed?: boolean; // if removed before resolved\n};\n\ntype RejectedSlot<F extends (...args: any[]) => Promise<any>> = {\n kind: 'rejected';\n error: any;\n queue: Task<F>[];\n removalWaiters: RemovalWaiter[];\n removed?: boolean;\n};\n\ntype Slot<F extends (...args: any[]) => Promise<any>> =\n | ActiveSlot<F>\n | PendingSlot<F>\n | RejectedSlot<F>;\n\nexport type WorkerSnapshot<F extends (...args: any[]) => Promise<any>> =\n | {\n index: number;\n status: 'active';\n fn: F;\n running: boolean;\n failCount: number;\n totalRuns: number;\n blockedMs: number;\n specificQueue: number;\n }\n | {\n index: number;\n status: 'pending';\n promise: Promise<F>;\n specificQueue: number;\n }\n | {\n index: number;\n status: 'rejected';\n error: string;\n specificQueue: number;\n };\n\nexport class WorkflowDispatcher<F extends (...args: any[]) => Promise<any>> {\n private readonly maxAttempts: number;\n private readonly backoffBaseMs: number;\n\n private readonly slots: Slot<F>[] = [];\n private readonly globalQueue: Task<F>[] = [];\n\n private pendingInits = 0;\n private everActivated = false;\n private drainScheduled = false;\n\n constructor(\n workersOrPromises: Array<F | Promise<F>>,\n options: DispatcherOptions = {},\n ) {\n // if (!workersOrPromises?.length) throw new Error('workers cannot be empty');\n\n this.maxAttempts = options.maxAttempts ?? 3;\n this.backoffBaseMs = options.backoffBaseMs ?? 1000;\n\n for (let i = 0; i < workersOrPromises.length; i++) {\n const w = workersOrPromises[i];\n if (typeof w === 'function') {\n const slot: ActiveSlot<F> = {\n kind: 'active',\n fn: w,\n state: {\n running: false,\n failCount: 0,\n nextAvailableAt: 0,\n totalRuns: 0,\n },\n queue: [],\n removalWaiters: [],\n };\n this.slots.push(slot);\n this.everActivated = true;\n } else {\n // Create a stable slot object and mutate it in-place on resolve/reject.\n this.pendingInits++;\n const slot: PendingSlot<F> = {\n kind: 'pending',\n promise: Promise.resolve(w),\n queue: [],\n removalWaiters: [],\n };\n this.slots.push(slot);\n\n slot.promise\n .then((fn) => {\n if (slot.removed) return; // was removed; ignore resolution\n // mutate in-place to active\n (slot as any).kind = 'active';\n (slot as any).fn = fn;\n (slot as any).state = {\n running: false,\n failCount: 0,\n nextAvailableAt: 0,\n totalRuns: 0,\n };\n this.everActivated = true;\n // keep queue & removalWaiters arrays as-is\n })\n .catch((err) => {\n if (slot.removed) return; // was removed; ignore\n // mutate in-place to rejected (keep queue/waiters)\n (slot as any).kind = 'rejected';\n (slot as any).error = err;\n })\n .finally(() => {\n this.pendingInits--;\n this.drain();\n if (this.pendingInits === 0 && !this.hasAnyActive()) {\n const err = new Error(\n 'No workers available (all failed to initialize).',\n );\n setTimeout(() => this.rejectAllQueued(err), 0);\n }\n });\n }\n }\n\n if (this.everActivated) this.drain();\n }\n\n /** Dispatch: choose eligible active with least totalRuns; retry across workers on failure. */\n dispatch(...args: Parameters<F>): Promise<Awaited<ReturnType<F>>> {\n return new Promise((resolve, reject) => {\n const task: Task<F> = {\n args,\n resolve,\n reject,\n attempts: 0,\n triedWorkers: new Set(),\n };\n this.globalQueue.push(task);\n this.drain();\n });\n }\n\n /** Dispatch to a specific worker (ignore backoff), wait until it is free; retry on the same worker. */\n dispatchSpecific(\n index: number,\n ...args: Parameters<F>\n ): Promise<Awaited<ReturnType<F>>> {\n if (index < 0 || index >= this.slots.length) {\n return Promise.reject(new Error(`worker index out of range: ${index}`));\n }\n return new Promise((resolve, reject) => {\n const task: Task<F> = {\n args,\n resolve,\n reject,\n attempts: 0,\n triedWorkers: new Set(),\n specificWorkerIndex: index,\n };\n const slot = this.slots[index];\n slot.queue.push(task);\n this.drain();\n });\n }\n\n /** Replace a worker at index with a new active worker function. */\n public replaceWorker(index: number, fn: F): void {\n if (index < 0 || index >= this.slots.length) {\n throw new Error(`worker index out of range: ${index}`);\n }\n const prevHadActive = this.hasAnyActive();\n const slot = this.slots[index];\n\n // Preserve queue & removal waiters; reset failure/backoff; keep totalRuns to avoid skew.\n const preservedQueue = slot.queue;\n const preservedWaiters = slot.removalWaiters ?? [];\n\n const next: ActiveSlot<F> = {\n kind: 'active',\n fn,\n state: {\n running: false,\n failCount: 0,\n nextAvailableAt: 0,\n totalRuns: (slot as any).state?.totalRuns ?? 0,\n },\n queue: preservedQueue,\n removalWaiters: preservedWaiters,\n };\n\n // Mutate in-place if possible (keeps references stable), else replace array entry.\n Object.assign(slot as any, next);\n (slot as any).kind = 'active';\n (slot as any).fn = fn;\n (slot as any).state.failCount = 0;\n (slot as any).state.nextAvailableAt = 0;\n\n this.everActivated = true;\n if (!prevHadActive && this.hasAnyActive()) {\n this.drain();\n } else {\n this.drain();\n }\n }\n\n /** Add a new active worker at the tail; return its index. */\n public addWorker(fn: F): number {\n const slot: ActiveSlot<F> = {\n kind: 'active',\n fn,\n state: { running: false, failCount: 0, nextAvailableAt: 0, totalRuns: 0 },\n queue: [],\n removalWaiters: [],\n };\n const index = this.slots.length;\n this.slots.push(slot);\n this.everActivated = true;\n this.drain();\n return index;\n }\n\n /**\n * Remove a worker completely (splice). It becomes unavailable immediately.\n * Returns a Promise that resolves when its last running task (if any) finishes.\n */\n public removeWorker(index: number): Promise<void> {\n if (index < 0 || index >= this.slots.length) {\n return Promise.reject(new Error(`worker index out of range: ${index}`));\n }\n\n const slot = this.slots[index];\n\n // Reject all queued specific tasks on this worker (macro-task to avoid unhandled)\n const queued = slot.queue.splice(0);\n const removalErr = new Error(`Worker[${index}] removed`);\n setTimeout(() => {\n for (const t of queued) t.reject(removalErr);\n }, 0);\n\n // Decide completion promise:\n let completion: Promise<void>;\n const isRunning = slot.kind === 'active' && slot.state.running;\n if (!isRunning) {\n completion = Promise.resolve();\n } else {\n completion = new Promise<void>((resolve) => {\n slot.removalWaiters.push(resolve);\n });\n }\n\n // Mark as removed (so any pending init resolution is ignored)\n (slot as any).removed = true;\n\n // Physically remove the slot\n this.slots.splice(index, 1);\n\n // Re-map indices in all remaining tasks:\n // 1) Fix specificWorkerIndex in every remaining slot.queue\n for (let i = 0; i < this.slots.length; i++) {\n const s = this.slots[i];\n for (const t of s.queue) {\n if (typeof t.specificWorkerIndex === 'number') {\n if (t.specificWorkerIndex === index) {\n // This should not happen because we just removed and flushed its queue,\n // but guard anyway.\n t.reject(new Error(`Worker[${index}] no longer exists`));\n } else if (t.specificWorkerIndex > index) {\n t.specificWorkerIndex -= 1;\n }\n }\n }\n }\n // 2) Fix triedWorkers sets in globalQueue\n for (const t of this.globalQueue) {\n if (t.triedWorkers.has(index)) t.triedWorkers.delete(index);\n const next = new Set<number>();\n for (const w of t.triedWorkers) {\n next.add(w > index ? w - 1 : w);\n }\n t.triedWorkers = next;\n }\n\n // Trigger scheduling for the remaining system\n this.drain();\n\n return completion;\n }\n\n snapshot(): WorkerSnapshot<F>[] {\n const now = Date.now();\n\n return this.slots.map((slot, i) => {\n switch (slot.kind) {\n case 'active': {\n const s = slot.state;\n return {\n index: i,\n status: 'active' as const,\n fn: slot.fn,\n running: s.running,\n failCount: s.failCount,\n totalRuns: s.totalRuns,\n blockedMs: Math.max(0, s.nextAvailableAt - now),\n specificQueue: slot.queue.length,\n };\n }\n\n case 'pending':\n return {\n index: i,\n status: 'pending' as const,\n promise: slot.promise,\n specificQueue: slot.queue.length,\n };\n\n case 'rejected':\n return {\n index: i,\n status: 'rejected' as const,\n error: String(slot.error ?? 'unknown error'),\n specificQueue: slot.queue.length,\n };\n }\n });\n }\n\n get pending(): number {\n return this.globalQueue.length;\n }\n\n // ---------------- scheduling ----------------\n\n private drain() {\n if (this.drainScheduled) return;\n this.drainScheduled = true;\n queueMicrotask(() => {\n this.drainScheduled = false;\n this._drainLoop();\n });\n }\n\n private _drainLoop() {\n // If no active workers and still initializing, wait; if all inited and none active, constructor already rejects all.\n if (!this.hasAnyActive()) {\n if (this.pendingInits > 0) return;\n return;\n }\n\n // First: flush rejected workers' specific queues (macro-task rejection)\n for (let i = 0; i < this.slots.length; i++) {\n const slot = this.slots[i];\n if (slot.kind === 'rejected' && slot.queue.length > 0) {\n const q = slot.queue.splice(0);\n const err = new Error(\n `Worker[${i}] failed to initialize: ${String(slot.error ?? 'unknown error')}`,\n );\n setTimeout(() => {\n for (const t of q) t.reject(err);\n }, 0);\n }\n }\n\n let progressed = true;\n while (progressed) {\n progressed = false;\n\n // 1) Run specific queues for active workers (ignore backoff)\n for (let i = 0; i < this.slots.length; i++) {\n const slot = this.slots[i];\n if (slot.kind !== 'active') continue;\n const st = slot.state;\n if (!st.running && slot.queue.length > 0) {\n const task = slot.queue.shift()!;\n this.startTaskOnActiveSlot(i, slot, task, /*fromSpecific*/ true);\n progressed = true;\n }\n }\n\n // 2) Run global queue (choose eligible active with least totalRuns)\n if (this.globalQueue.length > 0) {\n const idx = this.pickBestActiveForGlobal();\n if (idx !== -1) {\n const slot = this.slots[idx] as ActiveSlot<F>;\n const task = this.globalQueue.shift()!;\n this.startTaskOnActiveSlot(idx, slot, task, /*fromSpecific*/ false);\n progressed = true;\n }\n }\n }\n }\n\n private hasAnyActive() {\n return this.slots.some((s) => s.kind === 'active');\n }\n\n private rejectAllQueued(err: any) {\n while (this.globalQueue.length) this.globalQueue.shift()!.reject(err);\n for (const slot of this.slots) {\n while (slot.queue.length) slot.queue.shift()!.reject(err);\n }\n }\n\n private isEligibleActive(i: number, now: number) {\n const slot = this.slots[i] as ActiveSlot<F>;\n const slotGood = (s: ActiveSlot<F>) =>\n s.kind === 'active' && !s.state?.running;\n if (!slotGood(slot)) return false;\n if (now >= slot.state.nextAvailableAt) return true;\n return !this.slots.some((other: ActiveSlot<F>, j) => {\n if (j === i) return false;\n if (!slotGood(other)) return false;\n return now >= other.state.nextAvailableAt;\n });\n }\n\n private pickBestActiveForGlobal(): number {\n const now = Date.now();\n const task = this.globalQueue[0];\n\n // Prefer actives not tried yet\n let best = -1,\n bestRuns = Infinity;\n for (let i = 0; i < this.slots.length; i++) {\n if (!this.isEligibleActive(i, now)) continue;\n if (task?.triedWorkers.has(i)) continue;\n const slot = this.slots[i] as ActiveSlot<F>;\n if (slot.state.totalRuns < bestRuns) {\n bestRuns = slot.state.totalRuns;\n best = i;\n }\n }\n if (best !== -1) return best;\n\n // Allow already-tried actives\n best = -1;\n bestRuns = Infinity;\n for (let i = 0; i < this.slots.length; i++) {\n if (!this.isEligibleActive(i, now)) continue;\n const slot = this.slots[i] as ActiveSlot<F>;\n if (slot.state.totalRuns < bestRuns) {\n bestRuns = slot.state.totalRuns;\n best = i;\n }\n }\n return best;\n }\n\n private startTaskOnActiveSlot(\n index: number,\n slot: ActiveSlot<F>,\n task: Task<F>,\n fromSpecific: boolean,\n ) {\n const st = slot.state;\n st.running = true;\n st.totalRuns += 1;\n\n const finalize = () => {\n st.running = false;\n // If someone is waiting for this worker to finish (removeWorker), resolve them when idle.\n if (\n slot.removalWaiters.length > 0 &&\n !st.running &&\n slot.queue.length === 0\n ) {\n const list = slot.removalWaiters.splice(0);\n for (const w of list) w();\n }\n this.drain();\n };\n\n (async () => {\n try {\n const result = await slot.fn(...task.args);\n st.failCount = Math.max(0, st.failCount - 1);\n task.resolve(result as Awaited<ReturnType<F>>);\n } catch (err) {\n task.lastError = err;\n st.failCount += 1;\n st.nextAvailableAt =\n Date.now() + this.backoffBaseMs * Math.pow(2, st.failCount);\n\n if (fromSpecific) {\n task.attempts += 1;\n if (task.attempts >= this.maxAttempts) {\n task.reject(task.lastError);\n } else {\n // retry on the same worker (ignore backoff)\n slot.queue.push(task);\n }\n } else {\n task.attempts += 1;\n task.triedWorkers.add(index);\n const activeCount = this.slots.filter(\n (s) => s.kind === 'active',\n ).length;\n const allActiveTriedOnce = task.triedWorkers.size >= activeCount;\n const attemptsLimitReached = task.attempts >= this.maxAttempts;\n\n if (allActiveTriedOnce || attemptsLimitReached) {\n task.reject(task.lastError);\n } else {\n this.globalQueue.push(task);\n }\n }\n } finally {\n finalize();\n }\n })();\n }\n}\n", "export class RoundRobin<T> {\n private index = 0;\n\n constructor(public items: T[]) {\n if (items.length === 0) {\n throw new Error('RoundRobin requires at least one item');\n }\n }\n\n next(): T {\n const nextIndex = this.index % this.items.length;\n this.index = (this.index + 1) % this.items.length;\n return this.items[nextIndex];\n }\n}\n", "export class AbortedError extends Error {\n name = 'AbortError';\n constructor(\n msg = 'Operation aborted',\n public cause?: unknown,\n ) {\n super(msg);\n }\n}\n\ntype AnyFunc = (...args: any[]) => any;\nconst isObjectLike = (v: unknown): v is object | AnyFunc =>\n (typeof v === 'object' && v !== null) || typeof v === 'function';\n\nfunction boxPrimitive(v: unknown): object {\n return Object(v as any);\n}\n\nexport interface AbortableOpts {\n /** \u662F\u5426\u628A\u539F\u59CB\u503C\u88C5\u7BB1\u540E\u518D\u4EE3\u7406\uFF08\u4F1A\u6539\u53D8 typeof/=== \u8BED\u4E49\uFF0C\u9ED8\u8BA4 false\uFF09 */\n boxPrimitives?: boolean;\n /** \u4E0D\u9012\u5F52\u4EE3\u7406\u5B50\u5BF9\u8C61\uFF08\u4EC5\u4EE3\u7406\u9876\u5C42\u5BF9\u8C61/\u51FD\u6570\uFF0C\u9ED8\u8BA4 false\uFF09 */\n noRecursive?: boolean;\n}\n\nexport function abortable<T>(\n obj: T,\n signal: AbortSignal,\n opts?: AbortableOpts,\n): T {\n const { boxPrimitives = false, noRecursive = false } = opts ?? {};\n\n const throwIfAborted = () => {\n if (signal.aborted) {\n const r = (signal as any).reason;\n if (r instanceof Error) throw r;\n throw new AbortedError('Operation aborted', r);\n }\n };\n\n throwIfAborted();\n\n const targetToProxy = new WeakMap<object, any>();\n const proxyToTarget = new WeakMap<object, any>();\n\n const wrapNativePromise = <V>(pLike: PromiseLike<V>): Promise<V> => {\n const base = pLike instanceof Promise ? pLike : Promise.resolve(pLike);\n return base.then(\n async (v) => {\n throwIfAborted();\n return proxify(v);\n },\n async (e) => {\n throwIfAborted();\n throw e;\n },\n );\n };\n\n let shortCircuit = false;\n\n const proxify = <V>(value: V): V => {\n if (noRecursive) {\n if (shortCircuit) {\n return value;\n } else {\n shortCircuit = true;\n }\n }\n\n // Promise\uFF1A\u6309\u201C\u771F Promise + \u4EE3\u7406\u201D\u7684\u65B9\u6848\u5904\u7406\n if (typeof (value as any)?.then === 'function') {\n return wrapNativePromise(value as any) as unknown as V;\n }\n\n // \u539F\u59CB\u503C\n if (!isObjectLike(value)) {\n if (!boxPrimitives) return value;\n return proxify(boxPrimitive(value) as unknown as V);\n }\n\n // \u590D\u7528\n const cached = targetToProxy.get(value as object);\n if (cached) return cached;\n\n const handler: ProxyHandler<any> = {\n get(target, p, receiver) {\n throwIfAborted();\n const out = Reflect.get(target, p, receiver);\n return proxify(out);\n },\n set(target, p, val, receiver) {\n throwIfAborted();\n return Reflect.set(target, p, val, receiver);\n },\n apply(target, thisArg, argArray) {\n throwIfAborted();\n const unwrappedThis =\n (isObjectLike(thisArg) && proxyToTarget.get(thisArg as any)) ||\n thisArg;\n const ret = Reflect.apply(target as AnyFunc, unwrappedThis, argArray);\n return proxify(ret);\n },\n construct(target, argArray, newTarget) {\n throwIfAborted();\n const instance = Reflect.construct(\n target as AnyFunc,\n argArray,\n newTarget,\n );\n return proxify(instance);\n },\n defineProperty(t, p, attrs) {\n throwIfAborted();\n return Reflect.defineProperty(t, p, attrs);\n },\n deleteProperty(t, p) {\n throwIfAborted();\n return Reflect.deleteProperty(t, p);\n },\n getOwnPropertyDescriptor(t, p) {\n throwIfAborted();\n return Reflect.getOwnPropertyDescriptor(t, p);\n },\n getPrototypeOf(t) {\n throwIfAborted();\n return Reflect.getPrototypeOf(t);\n },\n setPrototypeOf(t, proto) {\n throwIfAborted();\n return Reflect.setPrototypeOf(t, proto);\n },\n has(t, p) {\n throwIfAborted();\n return Reflect.has(t, p);\n },\n isExtensible(t) {\n throwIfAborted();\n return Reflect.isExtensible(t);\n },\n ownKeys(t) {\n throwIfAborted();\n return Reflect.ownKeys(t);\n },\n preventExtensions(t) {\n throwIfAborted();\n return Reflect.preventExtensions(t);\n },\n };\n\n const proxy = new Proxy(value as any, handler);\n targetToProxy.set(value as object, proxy);\n proxyToTarget.set(proxy, value);\n return proxy;\n };\n\n return proxify(obj);\n}\n", "import {\n AnyFunc,\n MiddlewareDispatcherOptions,\n Middleware,\n MiddlewareResult,\n MiddlewareAcceptResult,\n MiddlewareErrorHandler,\n MiddlewareReturn,\n MiddlewareNextArgs,\n} from './types';\n\nexport class DynamicMiddlewareDispatcher<F extends AnyFunc> {\n constructor(protected options: MiddlewareDispatcherOptions<F> = {}) {}\n\n async buildMiddlewares(...args: Parameters<F>): Promise<Middleware<F>[]> {\n return [];\n }\n\n async dispatch(...args: Parameters<F>): MiddlewareResult<F> {\n const mws = await this.buildMiddlewares(...args);\n const acceptResult: MiddlewareAcceptResult<F> =\n this.options.acceptResult || ((res) => res != null);\n const errorHandler: MiddlewareErrorHandler<F> =\n this.options.errorHandler || ((e, args, next) => next());\n const dispatch = async (\n i: number,\n useArgs: Parameters<F>,\n ): MiddlewareResult<F> => {\n if (i >= mws.length) return undefined;\n\n const mw = mws[i];\n let nextCalled = false;\n\n const next = async (\n ...passedArgs: MiddlewareNextArgs<F>\n ): MiddlewareResult<F> => {\n if (nextCalled) {\n return undefined;\n }\n nextCalled = true;\n return dispatch(i + 1, [\n ...passedArgs,\n ...useArgs.slice(passedArgs.length),\n ] as Parameters<F>);\n };\n\n const runMw = async (cb: () => MiddlewareReturn<F>) => {\n const res = await cb();\n if (!nextCalled && !(await acceptResult(res))) {\n return dispatch(i + 1, useArgs);\n }\n return res;\n };\n\n try {\n return await runMw(() => mw(...useArgs, next));\n } catch (e) {\n return await runMw(() => errorHandler(e, useArgs, next));\n }\n };\n return dispatch(0, args);\n }\n}\n", "import { AnyFunc, Middleware } from './types';\nimport { DynamicMiddlewareDispatcher } from './dynamic-middleware-dispatcher';\n\nexport class MiddlewareDispatcher<\n F extends AnyFunc,\n> extends DynamicMiddlewareDispatcher<F> {\n middlewares: Middleware<F>[] = [];\n\n middleware(mw: Middleware<F>, prior = false) {\n if (prior) {\n this.middlewares.unshift(mw);\n } else {\n this.middlewares.push(mw);\n }\n return this;\n }\n\n removeMiddleware(mw: Middleware<F>) {\n const index = this.middlewares.indexOf(mw);\n if (index >= 0) {\n this.middlewares.splice(index, 1);\n }\n return this;\n }\n\n async buildMiddlewares(...args: Parameters<F>): Promise<Middleware<F>[]> {\n return this.middlewares;\n }\n}\n", "import { Middleware, MiddlewareResult } from './types';\nimport { AnyClass, ClassType } from '../types';\nimport { DynamicMiddlewareDispatcher } from './dynamic-middleware-dispatcher';\n\nexport type ProtoMiddlewareArgs<A extends any[] = [], T = any> = [\n inst: T,\n ...args: A,\n];\nexport type ProtoMiddlewareFunc<A extends any[] = [], T = any> = (\n ...args: ProtoMiddlewareArgs<A, T>\n) => T | undefined;\n\nexport class ProtoMiddlewareDispatcher<\n A extends any[] = [],\n> extends DynamicMiddlewareDispatcher<ProtoMiddlewareFunc<A>> {\n private middlewareProtoMap = new Map<\n AnyClass,\n Middleware<ProtoMiddlewareFunc<A>>[]\n >();\n private middlewareProtoMapPrior = new Map<\n AnyClass,\n Middleware<ProtoMiddlewareFunc<A>>[]\n >();\n\n middleware<T>(\n cls: ClassType<T>,\n mw: Middleware<ProtoMiddlewareFunc<A, T>>,\n prior = false,\n ) {\n const map = prior ? this.middlewareProtoMapPrior : this.middlewareProtoMap;\n const mws = map.get(cls) || [];\n mws.push(mw);\n map.set(cls, mws);\n return this;\n }\n\n removeMiddleware<T>(\n cls: ClassType<T>,\n mw: Middleware<ProtoMiddlewareFunc<A, T>>,\n ) {\n for (const map of [this.middlewareProtoMap, this.middlewareProtoMapPrior]) {\n const mws = map.get(cls);\n if (mws) {\n const index = mws.indexOf(mw);\n if (index >= 0) {\n mws.splice(index, 1);\n }\n }\n }\n return this;\n }\n\n async dispatch<T>(\n ...args: ProtoMiddlewareArgs<A, T>\n ): MiddlewareResult<ProtoMiddlewareFunc<A, T>> {\n return super.dispatch(...args);\n }\n\n async buildMiddlewares(...args: ProtoMiddlewareArgs<A>) {\n // buildMiddlewares \u53EA\u9700\u8981\u77E5\u9053 inst\n if (args.length === 0) return [];\n\n const inst = args[0];\n if (!inst || typeof inst !== 'object') return [];\n\n // 1. \u6536\u96C6\u539F\u578B\u94FE\uFF08Base \u2192 Sub\uFF09\n const chain: AnyClass[] = [];\n let cur: any = inst.constructor;\n\n while (cur && cur !== Object) {\n chain.push(cur);\n cur = Object.getPrototypeOf(cur.prototype)?.constructor;\n }\n\n chain.reverse();\n\n const result: Middleware<ProtoMiddlewareFunc<A>>[] = [];\n\n // 2. prior\uFF1ABase \u2192 Sub\n for (const cls of chain) {\n const mws = this.middlewareProtoMapPrior.get(cls);\n if (mws) {\n result.push(...[...mws].reverse());\n }\n }\n\n // 3. normal\uFF1ASub \u2192 Base\n for (let i = chain.length - 1; i >= 0; i--) {\n const cls = chain[i];\n const mws = this.middlewareProtoMap.get(cls);\n if (mws) {\n result.push(...mws);\n }\n }\n\n result.push((inst, ...args) => {\n return inst;\n });\n\n return result;\n }\n}\n", "// \u2014\u2014 \u89E3\u6790\u7ED3\u679C\u7ED3\u6784 \u2014\u2014 //\nexport type I18nPiece =\n | { type: 'raw'; value: string }\n | { type: 'ph'; rawInner: string; key: string };\n\n/**\n * \u6808\u5F0F\u89E3\u6790 #{ ... } \u5360\u4F4D\u3002\u652F\u6301\u5185\u90E8\u6210\u5BF9\u82B1\u62EC\u53F7\uFF0C\u5982 #{ foo {{ bar }} }\u3002\n * - \u672A\u95ED\u5408\u65F6\uFF1A\u628A\u4ECE\u4E0A\u6B21\u4F4D\u7F6E i \u5230\u7ED3\u5C3E\u6574\u4F53\u4F5C\u4E3A raw \u653E\u56DE\uFF08\u907F\u514D\u88AB\u62C6\u6210\u4E24\u6BB5\uFF09\n * - key = trim(rawInner)\n */\nexport const parseI18n = (text: string): I18nPiece[] => {\n const pieces: I18nPiece[] = [];\n if (!text) return pieces;\n\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n const start = text.indexOf('#{', i);\n if (start === -1) {\n // \u6CA1\u6709\u66F4\u591A\u5360\u4F4D\u7B26\n if (i < n) pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5148\u5C1D\u8BD5\u5339\u914D\u8FD9\u4E2A\u5360\u4F4D\u7B26\u662F\u5426\u95ED\u5408\uFF08\u6B64\u65F6\u4E0D\u7ACB\u5373\u63A8\u5165\u524D\u5BFC raw\uFF09\n let j = start + 2; // \u6307\u5411 '#{' \u540E\u7B2C\u4E00\u4E2A\u5B57\u7B26\n let depth = 1;\n while (j < n && depth > 0) {\n const ch = text.charCodeAt(j);\n if (ch === 123 /* '{' */) depth++;\n else if (ch === 125 /* '}' */) depth--;\n j++;\n }\n\n if (depth !== 0) {\n // \u672A\u95ED\u5408\uFF1A\u628A\u4ECE i \u5230\u672B\u5C3E\u6574\u4F53\u5F53\u4F5C raw\uFF08\u5305\u542B\u524D\u5BFC + '#{' \u5C3E\u5DF4\uFF09\n pieces.push({ type: 'raw', value: text.slice(i) });\n break;\n }\n\n // \u5230\u8FD9\u91CC\u8BF4\u660E\u5360\u4F4D\u95ED\u5408\uFF1A\u5148\u63A8\u5165\u524D\u5BFC raw\uFF0C\u518D\u63A8\u5360\u4F4D\u7247\u6BB5\n if (start > i) {\n pieces.push({ type: 'raw', value: text.slice(i, start) });\n }\n\n const rawInner = text.slice(start + 2, j - 1);\n const key = rawInner.trim();\n pieces.push({ type: 'ph', rawInner, key });\n\n i = j; // \u7EE7\u7EED\u5411\u540E\u626B\u63CF\n }\n\n return pieces;\n};\n", "import { Awaitable } from './types';\n\nexport const patchStringInObject = async <T>(\n obj: T,\n cb: (s: string) => Awaitable<string>,\n): Promise<T> => {\n const visited = new WeakSet<object>();\n\n const isSpecialObject = (v: any): boolean => {\n if (v == null || typeof v !== 'object') return false;\n if (\n v instanceof Date ||\n v instanceof RegExp ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n ArrayBuffer.isView(v)\n ) {\n return true;\n }\n\n const tag = Object.prototype.toString.call(v);\n switch (tag) {\n case '[object URL]':\n case '[object URLSearchParams]':\n case '[object Error]':\n case '[object Blob]':\n case '[object File]':\n case '[object FormData]':\n return true;\n default:\n return false;\n }\n };\n\n const checkValue = (\n v: any,\n ): { ok: false } | { ok: true; kind: 'string' | 'object' } => {\n if (!v) return { ok: false };\n\n const t = typeof v;\n if (\n t === 'number' ||\n t === 'bigint' ||\n t === 'symbol' ||\n t === 'function'\n ) {\n return { ok: false };\n }\n if (t === 'string') return { ok: true, kind: 'string' };\n if (t === 'object') return { ok: true, kind: 'object' };\n\n return { ok: false };\n };\n\n const rebuildObject = async (value: any): Promise<any> => {\n const proto = Object.getPrototypeOf(value);\n const out = Object.create(proto);\n\n const keys = Reflect.ownKeys(value);\n\n await Promise.all(\n keys.map(async (key) => {\n const desc = Object.getOwnPropertyDescriptor(value, key as any);\n if (!desc) return;\n\n if ('value' in desc) {\n const newVal = await walk(desc.value);\n Object.defineProperty(out, key, { ...desc, value: newVal });\n return;\n }\n\n Object.defineProperty(out, key, desc);\n\n let current: any = undefined;\n if (typeof desc.get === 'function') {\n try {\n current = desc.get.call(value);\n } catch {}\n }\n if (current === undefined) return;\n\n try {\n const newVal = await walk(current);\n if (typeof desc.set === 'function') {\n try {\n desc.set.call(out, newVal);\n } catch {}\n }\n } catch {}\n }),\n );\n\n return out;\n };\n\n const walk = async (value: any): Promise<any> => {\n const check = checkValue(value);\n\n if (!check.ok) return value;\n\n if (check.kind === 'string') {\n return cb(value);\n }\n\n if (value instanceof Promise) {\n return value.then((resolved) => walk(resolved));\n }\n\n if (typeof value === 'object') {\n if (!Array.isArray(value) && isSpecialObject(value)) return value;\n\n if (visited.has(value)) return value;\n visited.add(value);\n\n if (Array.isArray(value)) {\n const out = await Promise.all(value.map((v) => walk(v)));\n return out as any;\n }\n\n return rebuildObject(value);\n }\n\n return value;\n };\n\n return walk(obj);\n};\n", "import { parseI18n } from '../utility/parse-i18n';\nimport {\n I18nMiddleware,\n I18nMiddlewareFunc,\n I18nMiddlewareNext,\n I18nOptions,\n} from './types';\nimport { patchStringInObject } from '../patch-string-in-object';\nimport { DynamicMiddlewareDispatcher } from '../middleware-dispatcher';\n\nclass I18nMiddlewareDispatcher<\n Ex extends any[],\n> extends DynamicMiddlewareDispatcher<I18nMiddlewareFunc<Ex>> {\n constructor() {\n super({\n acceptResult: (res) => res != null,\n errorHandler: (e) => {\n throw e;\n },\n });\n }\n\n middlewares: I18nMiddleware<Ex>[] = [];\n\n async buildMiddlewares() {\n return this.middlewares.map(\n (mw) =>\n (locale: string, text: string, ...args: any[]) => {\n const ex = args.slice(0, -1) as Ex;\n const next = args[args.length - 1] as I18nMiddlewareNext<Ex>;\n return mw(locale, text, next, ...ex);\n },\n );\n }\n}\n\nexport class I18n<Ex extends any[] = []> {\n constructor(private options: I18nOptions) {}\n\n locales = new Set(this.options.locales);\n defaultLocale = this.options.defaultLocale ?? this.options.locales[0];\n\n private mw = new I18nMiddlewareDispatcher();\n\n middleware(mw: I18nMiddleware<Ex>, prior = false) {\n if (prior) {\n this.mw.middlewares.unshift(mw);\n } else {\n this.mw.middlewares.push(mw);\n }\n return this;\n }\n\n removeMiddleware(mw: I18nMiddleware<Ex>) {\n const idx = this.mw.middlewares.indexOf(mw);\n if (idx >= 0) {\n this.mw.middlewares.splice(idx, 1);\n }\n return this;\n }\n\n getExactLocale(locale: string) {\n const input = (locale ?? '').trim();\n if (!input) return this.defaultLocale;\n\n if (this.locales.has(input)) return input;\n\n // \u5C0F\u5199\u5316\u6BD4\u8F83\uFF0C\u4FDD\u7559\u539F\u5927\u5C0F\u5199\n const entries = Array.from(this.locales).map((l) => ({\n orig: l,\n lower: l.toLowerCase(),\n }));\n const lower = input.toLowerCase();\n\n // 1) \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // 2) \u6309 '-' \u62C6\u5206\uFF0C\u4F9D\u6B21\u5C1D\u8BD5\u53BB\u6389\u6700\u53F3\u8FB9\u7684\u6BB5\n // zh-Hans-CN \u2192 zh-Hans \u2192 zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n\n // 3) \u515C\u5E95\n return this.defaultLocale;\n }\n\n private buildFallbackChain(locale: string): string[] {\n const best = this.getExactLocale(locale); // \u4F60\u7684\u201C\u6700\u957F\u5339\u914D\u201D\u51FD\u6570\n // \u62C6\u5206 zh-Hans-CN -> ['zh-Hans-CN','zh-Hans','zh']\n const parts: string[] = [];\n const segs = best.split('-');\n for (let i = segs.length; i > 1; i--)\n parts.push(segs.slice(0, i).join('-'));\n parts.push(segs[0]); // 'zh'\n // \u9644\u52A0\u9ED8\u8BA4\u8BED\u8A00\n if (!parts.includes(this.defaultLocale)) parts.push(this.defaultLocale);\n // \u53BB\u91CD\n return Array.from(new Set(parts)).filter((p) => this.locales.has(p));\n }\n\n private async applyMiddlewares(\n locale: string,\n text: string,\n ...ex: Ex\n ): Promise<string | undefined> {\n const tryLocale = (locale: string) => this.mw.dispatch(locale, text, ...ex);\n\n for (const loc of this.buildFallbackChain(locale)) {\n const result = await tryLocale(loc);\n if (result != null) {\n return result;\n }\n }\n return undefined;\n }\n\n async translateString(\n locale: string,\n text: string,\n ...ex: Ex\n ): Promise<string> {\n if (!text) return text;\n\n locale = this.getExactLocale(locale);\n\n const pieces = parseI18n(text);\n if (!pieces.some((p) => p.type === 'ph')) {\n return pieces\n .map((p) => (p.type === 'raw' ? p.value : `#{${p.rawInner}}`))\n .join('');\n }\n\n const promises: Array<Promise<string | undefined | null>> = [];\n\n for (const p of pieces) {\n if (p.type === 'ph') {\n promises.push(this.applyMiddlewares(locale, p.key, ...ex));\n }\n }\n\n const results = await Promise.all(promises);\n\n let out = '';\n let k = 0;\n for (const p of pieces) {\n if (p.type === 'raw') {\n out += p.value;\n } else {\n const r = results[k++];\n out += r == null ? `#{${p.rawInner}}` : r;\n }\n }\n return out;\n }\n\n async translate<T>(locale: string, obj: T, ...ex: Ex): Promise<T> {\n return patchStringInObject(obj, (s) =>\n this.translateString(locale, s, ...ex),\n );\n }\n}\n", "import { I18nMiddleware } from '../types';\nimport { Awaitable } from '../../types';\n\nexport type I18nDictionary = Record<string, Record<string, string>>;\n\ntype MatchType = 'exact' | 'hierarchy' | 'startsWith';\n\nexport const I18nLookupMiddleware = <Ex extends any[] = []>(\n dict:\n | I18nDictionary\n | ((locale: string, key: string, ...ex: Ex) => Awaitable<I18nDictionary>),\n options?: { matchType?: MatchType },\n): I18nMiddleware<Ex> => {\n const matchType: MatchType = options?.matchType ?? 'exact';\n const dictFactory = typeof dict === 'function' ? dict : () => dict;\n\n // \u57FA\u4E8E locales \u5217\u8868\u505A\u201C\u7CBE\u786E\u2192\u5C42\u7EA7\u56DE\u9000(zh-Hans-CN\u2192zh-Hans\u2192zh)\u201D\u7684\u6700\u957F\u5339\u914D\n const pickBestByHierarchy = (\n input: string,\n locales: string[],\n ): string | undefined => {\n if (!input) return undefined;\n const entries = locales.map((l) => ({ orig: l, lower: l.toLowerCase() }));\n const lower = input.toLowerCase();\n\n // \u7CBE\u786E\u5339\u914D\uFF08\u5927\u5C0F\u5199\u4E0D\u654F\u611F\uFF09\n const exact = entries.find((e) => e.lower === lower);\n if (exact) return exact.orig;\n\n // \u9010\u7EA7\u56DE\u9000\uFF1Azh-Hans-CN -> zh-Hans -> zh\n const parts = lower.split('-');\n while (parts.length > 1) {\n parts.pop();\n const candidate = parts.join('-');\n const hit = entries.find((e) => e.lower === candidate);\n if (hit) return hit.orig;\n }\n return undefined;\n };\n\n return async (locale, key, next, ...ex) => {\n const dictResolved = await dictFactory(locale, key, ...ex);\n\n let dictionary = dictResolved[locale];\n\n if (!dictionary) {\n if (matchType === 'hierarchy') {\n const best = pickBestByHierarchy(locale, Object.keys(dictResolved));\n if (best) dictionary = dictResolved[best];\n } else if (matchType === 'startsWith') {\n const keys = Object.keys(dictResolved).filter((k) =>\n locale.startsWith(k),\n );\n if (keys.length) {\n const best = keys.reduce((a, b) => (b.length > a.length ? b : a));\n dictionary = dictResolved[best];\n }\n }\n }\n\n // \u547D\u4E2D\u5224\u65AD\uFF1A\u5141\u8BB8\u7A7A\u5B57\u7B26\u4E32 ''\uFF1B\u4EC5 null/undefined \u89C6\u4E3A\u672A\u547D\u4E2D\n if (dictionary && Object.prototype.hasOwnProperty.call(dictionary, key)) {\n const val = dictionary[key];\n if (val != null) {\n return val;\n }\n }\n\n return next();\n };\n};\n\nexport const createI18nLookupMiddleware = <Ex extends any[]>() =>\n I18nLookupMiddleware as typeof I18nLookupMiddleware<Ex>;\n", "export const observeDiff = <T>(\n obj: T,\n cb: <K extends keyof T>(change: {\n type: 'add' | 'update' | 'delete';\n key: K;\n oldValue: T[K] | undefined;\n newValue: T[K] | undefined;\n }) => any,\n): T => {\n return new Proxy(obj as any, {\n set(target, key: string | symbol, value) {\n const oldValue = target[key];\n const type = Object.prototype.hasOwnProperty.call(target, key)\n ? 'update'\n : 'add';\n target[key] = value;\n cb({ type, key: key as any, oldValue, newValue: value });\n return true;\n },\n deleteProperty(target, key: string | symbol) {\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n const oldValue = target[key];\n delete target[key];\n cb({ type: 'delete', key: key as any, oldValue, newValue: undefined });\n return true;\n }\n return false;\n },\n });\n};\n", "export const Memorize = () => {\n const cache = new WeakMap<object, any>();\n\n const isPromiseLike = (v: any): v is Promise<unknown> =>\n v != null && typeof v.then === 'function' && typeof v.catch === 'function';\n\n const getOrSet = (instance: object, compute: () => any) => {\n if (cache.has(instance)) return cache.get(instance);\n\n const result = compute();\n\n if (isPromiseLike(result)) {\n const wrapped = result.catch((err) => {\n cache.delete(instance); // \u4E0B\u6B21\u8FD8\u80FD\u91CD\u65B0\u7B97\n throw err;\n });\n cache.set(instance, wrapped);\n return wrapped;\n }\n\n cache.set(instance, result);\n return result;\n };\n\n return function (\n _target: any,\n _propertyKey: string,\n descriptor: PropertyDescriptor,\n ) {\n // getter\n if (typeof descriptor.get === 'function') {\n const originalGetter = descriptor.get;\n descriptor.get = function () {\n return getOrSet(this, () => originalGetter.call(this));\n };\n return;\n }\n\n // method\n if (typeof descriptor.value === 'function') {\n const originalMethod = descriptor.value;\n descriptor.value = function (...args: any[]) {\n return getOrSet(this, () => originalMethod.apply(this, args));\n };\n return;\n }\n };\n};\n", "export type MayBeArray<T> = T | T[];\n\nexport const makeArray = <T>(value: MayBeArray<T>): T[] => {\n return Array.isArray(value) ? value : [value];\n};\n", "import { AnyClass, Empty } from '../types';\nimport {\n AppContext,\n AppServiceClass,\n AppProvideArgs,\n AppProvidedMerged,\n AppProvideOptions,\n AppContextUsed,\n AppContextState,\n} from './types';\n\nconst ProvidePrefix = 'provide:';\n\nconst getMethodDescriptor = (cls: AnyClass, key: PropertyKey) => {\n let proto = cls.prototype;\n while (proto && proto !== Object.prototype) {\n const desc = Object.getOwnPropertyDescriptor(proto, key as any);\n if (desc) return desc;\n proto = Object.getPrototypeOf(proto);\n }\n return undefined;\n};\n\ntype ProvideRecord = {\n classRef: AnyClass;\n factory: (ctx: AppContextCore<any, any>) => any;\n};\n\ntype LoadEntry = {\n classRef: AnyClass;\n inst: any;\n};\n\ntype ObjectStep = (ctx: AppContextCore<any, any>) => void;\n\nexport class AppContextCore<Cur = Empty, Req = Empty> {\n private __current: Cur;\n private __required: Req;\n\n private provideRecords: ProvideRecord[] = [];\n private registry = new Map<string | AnyClass, LoadEntry>();\n private objectSteps: ObjectStep[] = [];\n started = false;\n private starting = false;\n private startingEntries: LoadEntry[] | null = null;\n private createdRecords: Set<ProvideRecord> | null = null;\n private createdEntries: Map<ProvideRecord, LoadEntry> | null = null;\n private loadingRecords = new Set<ProvideRecord>();\n\n private findProvideRecord(key: AnyClass): ProvideRecord | undefined {\n for (let i = 0; i < this.provideRecords.length; i += 1) {\n const record = this.provideRecords[i];\n if (\n record.classRef === key &&\n (!this.createdRecords || !this.createdRecords.has(record))\n ) {\n return record;\n }\n }\n return undefined;\n }\n\n private createEntryFromRecord(record: ProvideRecord): LoadEntry {\n const existing = this.createdEntries?.get(record);\n if (existing) {\n return existing;\n }\n\n if (this.loadingRecords.has(record)) {\n throw new Error(\n `Circular dependency detected while providing: ${record.classRef?.name ?? 'UnknownService'}`,\n );\n }\n\n this.loadingRecords.add(record);\n try {\n const entry: LoadEntry = {\n classRef: record.classRef,\n inst: record.factory(this),\n };\n this.createdRecords?.add(record);\n this.createdEntries?.set(record, entry);\n this.registry.set(record.classRef, entry);\n this.startingEntries?.push(entry);\n return entry;\n } finally {\n this.loadingRecords.delete(record);\n }\n }\n\n provide<\n C extends AppServiceClass<Cur, Req>,\n const P extends string = '',\n const M extends (keyof InstanceType<C>)[] = [],\n >(\n cls: C,\n ...args: AppProvideArgs<Cur, Req, C, P, M>\n ): AppProvidedMerged<Cur, Req, C, P, M> {\n const last = args[args.length - 1] as any;\n const hasOptions =\n !!last &&\n typeof last === 'object' &&\n ('provide' in last ||\n 'merge' in last ||\n 'useValue' in last ||\n 'useFactory' in last ||\n 'useClass' in last);\n\n const options = (hasOptions ? last : undefined) as\n | AppProvideOptions<Cur, Req, C, P, M>\n | undefined;\n\n const _args = (\n hasOptions ? args.slice(0, -1) : args\n ) as ConstructorParameters<C>;\n\n const classRef = cls as unknown as AnyClass;\n\n // Create factory function that will be called during start() with the target ctx.\n const factory = (ctx: AppContextCore<any, any>) =>\n options?.useValue ??\n (options?.useFactory\n ? options.useFactory(ctx as any, ..._args)\n : new (options?.useClass ?? cls)(ctx as any, ..._args));\n\n // Record the provide configuration\n this.provideRecords.push({\n classRef,\n factory,\n });\n\n // Set up property accessors if needed\n if (options?.provide) {\n const prop = options.provide;\n const step: ObjectStep = (ctx) => {\n Object.defineProperty(ctx, prop, {\n enumerable: true,\n configurable: true,\n get: () => {\n const currentEntry = ctx.registry.get(classRef);\n return currentEntry?.inst;\n },\n });\n };\n step(this);\n this.objectSteps.push(step);\n }\n\n if (options?.merge?.length) {\n for (const key of options.merge) {\n const desc = getMethodDescriptor(cls, key);\n const isMethod = !!desc && typeof desc.value === 'function';\n\n const step: ObjectStep = (ctx) => {\n if (isMethod) {\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n get: () => {\n const currentEntry = ctx.registry.get(classRef);\n const currentInst = currentEntry?.inst;\n const fn = (currentInst as any)?.[key];\n return typeof fn === 'function' ? fn.bind(currentInst) : fn;\n },\n });\n return;\n }\n\n Object.defineProperty(ctx, key, {\n enumerable: true,\n configurable: true,\n get: () => {\n const currentEntry = ctx.registry.get(classRef);\n return (currentEntry?.inst as any)?.[key];\n },\n set: (value: any) => {\n const currentEntry = ctx.registry.get(classRef);\n if (!currentEntry) return;\n (currentEntry.inst as any)[key] = value;\n },\n });\n };\n step(this);\n this.objectSteps.push(step);\n }\n }\n\n return this as any;\n }\n\n get<R>(\n cls:\n | AppServiceClass<Cur, Req, any, R>\n | (() => AppServiceClass<Cur, Req, any, R>),\n ): R {\n let key = cls as unknown as AnyClass;\n if (\n !this.registry.has(key) &&\n typeof cls === 'function' &&\n !(cls as any).prototype\n ) {\n key = (cls as () => AppServiceClass<Cur, Req, any, R>)() as AnyClass;\n }\n\n if (!this.registry.has(key) && this.starting) {\n const record = this.findProvideRecord(key);\n if (record) {\n this.createEntryFromRecord(record);\n }\n }\n\n if (!this.registry.has(key)) {\n throw new Error(`Service not provided: ${key?.name ?? cls.name}`);\n }\n\n const entry = this.registry.get(key)!;\n return entry.inst as any;\n }\n\n /**\n * @deprecated Use get() instead. getAsync() is no longer needed as all services are loaded synchronously during start().\n */\n async getAsync<R>(\n cls:\n | AppServiceClass<Cur, Req, any, R>\n | (() => AppServiceClass<Cur, Req, any, R>),\n ): Promise<R> {\n return this.get(cls);\n }\n\n use<const Ctxes extends AppContext<any, any>[]>(\n ...ctxes: Ctxes\n ): AppContextUsed<Cur, Req, Ctxes> {\n for (const ctx of ctxes) {\n const other = ctx as any as AppContextCore<any, any>;\n\n if (this.started && !other?.started) {\n throw new Error(\n 'Cannot use an unstarted context into a started context.',\n );\n }\n\n // Copy provide records\n if (Array.isArray(other?.provideRecords)) {\n this.provideRecords.push(...other.provideRecords);\n }\n\n // Copy and apply object steps\n if (Array.isArray(other?.objectSteps)) {\n this.objectSteps.push(...other.objectSteps);\n for (const step of other.objectSteps) {\n step(this);\n }\n }\n\n // If the other context has already started, copy loaded entries only.\n // They should remain initialized by the source context and must not be re-initialized.\n if (other?.started) {\n if (other?.registry instanceof Map) {\n for (const [key, value] of other.registry.entries()) {\n this.registry.set(key, value);\n }\n }\n }\n }\n\n return this as any;\n }\n\n define(): AppContext<Cur, Req> {\n return this as any;\n }\n\n async start(): Promise<Empty extends Req ? AppContext<Cur, Req> : never> {\n if (this.started) {\n return this as any;\n }\n\n const startedEntries: LoadEntry[] = [];\n const preloadedKeys = new Set(this.registry.keys());\n this.starting = true;\n this.startingEntries = startedEntries;\n this.createdRecords = new Set();\n this.createdEntries = new Map();\n try {\n // Create all instances. Dependencies requested via get() during construction\n // can be created on-demand from remaining provide records.\n for (const record of this.provideRecords) {\n if (preloadedKeys.has(record.classRef)) {\n continue;\n }\n this.createEntryFromRecord(record);\n }\n\n // Resolve all promises created in this start().\n for (const entry of startedEntries) {\n if (entry.inst && typeof entry.inst.then === 'function') {\n entry.inst = await entry.inst;\n }\n }\n\n // Init only instances created in this start().\n for (const entry of startedEntries) {\n const inst = entry.inst;\n if (inst && typeof inst.init === 'function') {\n await inst.init();\n }\n }\n this.started = true;\n return this as any;\n } finally {\n this.createdEntries = null;\n this.createdRecords = null;\n this.startingEntries = null;\n this.starting = false;\n }\n }\n}\n\nexport const createAppContext = <Req = Empty>() =>\n new AppContextCore<Empty, Req>() as AppContext<Empty, Req>;\n", "import { Empty } from '../types';\nimport { AppContext } from './types';\n\nexport class AppServiceBase<Cur = Empty, Config extends any[] = []> {\n constructor(\n public ctx: AppContext<Cur>,\n ...args: Config\n ) {}\n\n async init() {}\n}\n", "export class ConfigurerInstance<T extends Record<string, string>> {\n constructor(\n public config: T,\n private readonly defaultConfig: T,\n ) {}\n\n getString<K extends keyof T>(key: K): string {\n return (this.config[key] || this.defaultConfig[key]) as string;\n }\n\n getInt<K extends keyof T>(key: K): number {\n return parseInt(this.getString(key));\n }\n\n getFloat<K extends keyof T>(key: K): number {\n return parseFloat(this.getString(key));\n }\n\n getBoolean<K extends keyof T>(key: K): boolean {\n const defaultBoolean = parseConfigBoolean(this.defaultConfig[key], false);\n return parseConfigBoolean(this.getString(key), defaultBoolean);\n }\n\n getStringArray<K extends keyof T>(key: K): string[] {\n return convertStringArray(this.getString(key));\n }\n\n getIntArray<K extends keyof T>(key: K): number[] {\n return convertIntArray(this.getString(key));\n }\n\n getFloatArray<K extends keyof T>(key: K): number[] {\n return convertFloatArray(this.getString(key));\n }\n\n getBooleanArray<K extends keyof T>(key: K): boolean[] {\n const defaultBoolean = parseConfigBoolean(this.defaultConfig[key], false);\n return convertBooleanArray(this.getString(key), defaultBoolean);\n }\n\n getJSON<R = unknown, K extends keyof T = keyof T>(key: K): R {\n const value = this.getString(key);\n const jsonString =\n typeof value === 'string' && !value.trim()\n ? (this.defaultConfig[key] as string)\n : value;\n try {\n return JSON.parse(jsonString) as R;\n } catch (error) {\n const message =\n error instanceof Error ? `: ${error.message}` : '';\n throw new Error(\n `Failed to parse JSON config \"${String(key)}\"${message}`,\n );\n }\n }\n}\n\nexport class Configurer<T extends Record<string, string>> {\n constructor(public defaultConfig: T) {}\n\n loadConfig(\n options: { env?: Record<string, string | undefined>; obj?: any } = {},\n ): ConfigurerInstance<T> {\n const readConfig =\n options?.obj && typeof options.obj === 'object' ? options.obj : {};\n const normalizedConfig = normalizeConfigByDefaultKeys(\n readConfig,\n this.defaultConfig,\n );\n\n return new ConfigurerInstance<T>(\n {\n ...this.defaultConfig,\n ...normalizedConfig,\n ...(options?.env || {}),\n } as T,\n this.defaultConfig,\n );\n }\n\n generateExampleObject(): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(this.defaultConfig).map(([key, value]) => {\n const typedValue = toTypedValue(value);\n if (\n typedValue &&\n typeof typedValue === 'object' &&\n !Array.isArray(typedValue)\n ) {\n return [toCamelCaseKey(key), typedValue];\n }\n if (value.includes(',')) {\n return [\n toCamelCaseKey(key),\n value.split(',').map((v) => toTypedValue(v)),\n ];\n }\n return [toCamelCaseKey(key), typedValue];\n }),\n );\n }\n}\n\nexport type TypeFromConfigurer<C extends ConfigurerInstance<any>> =\n C extends ConfigurerInstance<infer T> ? T : never;\n\nfunction toCamelCaseKey(key: string): string {\n const lower = key.toLowerCase();\n return lower.replace(/_([a-z0-9])/g, (_, ch: string) => ch.toUpperCase());\n}\n\nfunction normalizeConfigValue(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number') {\n return value.toString();\n }\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n if (Array.isArray(value)) {\n return value.map((item) => normalizeArrayItem(item)).join(',');\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction normalizeArrayItem(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number') {\n return value.toString();\n }\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n return String(value);\n}\n\nfunction normalizeConfigByDefaultKeys<T extends Record<string, string>>(\n readConfig: Record<string, unknown>,\n defaultConfig: T,\n): Partial<T> {\n const normalizedConfig: Partial<T> = {};\n for (const key of Object.keys(defaultConfig) as Array<keyof T>) {\n const rawKey = key as string;\n const camelKey = toCamelCaseKey(rawKey);\n const value =\n readConfig[camelKey] !== undefined\n ? readConfig[camelKey]\n : readConfig[rawKey];\n const normalized = normalizeConfigValue(value);\n if (normalized !== undefined) {\n normalizedConfig[key] = normalized as T[typeof key];\n }\n }\n return normalizedConfig;\n}\n\nfunction parseConfigBoolean(value: unknown, defaultValue = false): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number') {\n return value !== 0;\n }\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase();\n if (defaultValue) {\n return !(\n normalized === '0' ||\n normalized === 'false' ||\n normalized === 'null'\n );\n }\n return !(\n normalized === '' ||\n normalized === '0' ||\n normalized === 'false' ||\n normalized === 'null'\n );\n }\n if (value == null) {\n return defaultValue;\n }\n return Boolean(value);\n}\n\nfunction convertStringArray(str: string): string[] {\n return (\n str\n ?.split(',')\n .map((s) => s.trim())\n .filter((s) => s) || []\n );\n}\n\nfunction convertIntArray(str: string): number[] {\n return (\n str\n ?.split(',')\n .map((s) => parseInt(s.trim()))\n .filter((n) => !isNaN(n)) || []\n );\n}\n\nfunction convertFloatArray(str: string): number[] {\n return (\n str\n ?.split(',')\n .map((s) => parseFloat(s.trim()))\n .filter((n) => !isNaN(n)) || []\n );\n}\n\nfunction convertBooleanArray(str: string, defaultValue = false): boolean[] {\n return (\n str\n ?.split(',')\n .map((s) => parseConfigBoolean(s.trim(), defaultValue))\n .filter((item) => typeof item === 'boolean') || []\n );\n}\n\nfunction toTypedValue(value: string): string | number | Record<string, unknown> {\n const trimmed = value.trim();\n if (/^\\d+$/.test(trimmed)) {\n return Number.parseInt(trimmed, 10);\n }\n const jsonObject = parseJsonObjectString(trimmed);\n if (jsonObject !== undefined) {\n return jsonObject;\n }\n return trimmed;\n}\n\nfunction parseJsonObjectString(\n value: string,\n): Record<string, unknown> | undefined {\n if (!value.startsWith('{') || !value.endsWith('}')) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(value);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["args", "inst", "args", "locale"]
|
|
7
7
|
}
|