@bitfab/sdk 0.38.4 → 0.38.6
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/autoTrace.cjs +8 -1
- package/dist/autoTrace.cjs.map +1 -1
- package/dist/autoTrace.d.cts +2 -2
- package/dist/autoTrace.d.ts +2 -2
- package/dist/autoTrace.js +1 -1
- package/dist/{chunk-NKX3EY35.js → chunk-P2MYK27A.js} +154 -68
- package/dist/chunk-P2MYK27A.js.map +1 -0
- package/dist/{chunk-5GWBJGYZ.js → chunk-QTTKZMHM.js} +8 -3
- package/dist/{chunk-5GWBJGYZ.js.map → chunk-QTTKZMHM.js.map} +1 -1
- package/dist/{chunk-J47KPS77.js → chunk-ZUD7OFYB.js} +9 -2
- package/dist/{chunk-J47KPS77.js.map → chunk-ZUD7OFYB.js.map} +1 -1
- package/dist/index.cjs +167 -67
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -11
- package/dist/index.d.ts +41 -11
- package/dist/index.js +5 -3
- package/dist/node.cjs +167 -67
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.cts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +5 -3
- package/dist/node.js.map +1 -1
- package/dist/{replay-O2WFIRM4.js → replay-H3AS4IF2.js} +2 -2
- package/dist/replayCli.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-NKX3EY35.js.map +0 -1
- /package/dist/{replay-O2WFIRM4.js.map → replay-H3AS4IF2.js.map} +0 -0
|
@@ -155,11 +155,18 @@ function currentAutoTraceScope() {
|
|
|
155
155
|
}
|
|
156
156
|
function __setBitfabAutoTraceCapturePolicy(client, traceFunctionKey, functionIds) {
|
|
157
157
|
const policies = autoTraceState.capturePolicies.get(client) ?? /* @__PURE__ */ new Map();
|
|
158
|
+
if (functionIds === void 0) {
|
|
159
|
+
policies.delete(traceFunctionKey);
|
|
160
|
+
if (policies.size === 0) {
|
|
161
|
+
autoTraceState.capturePolicies.delete(client);
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
158
165
|
policies.set(traceFunctionKey, new Set(functionIds));
|
|
159
166
|
autoTraceState.capturePolicies.set(client, policies);
|
|
160
167
|
}
|
|
161
168
|
function getAutoTraceCapturePolicy(client, traceFunctionKey) {
|
|
162
|
-
return autoTraceState.capturePolicies.get(client)?.get(traceFunctionKey)
|
|
169
|
+
return autoTraceState.capturePolicies.get(client)?.get(traceFunctionKey);
|
|
163
170
|
}
|
|
164
171
|
|
|
165
172
|
export {
|
|
@@ -172,4 +179,4 @@ export {
|
|
|
172
179
|
__setBitfabAutoTraceCapturePolicy,
|
|
173
180
|
getAutoTraceCapturePolicy
|
|
174
181
|
};
|
|
175
|
-
//# sourceMappingURL=chunk-
|
|
182
|
+
//# sourceMappingURL=chunk-ZUD7OFYB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/autoTrace.ts"],"sourcesContent":["import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\n\nexport interface AutoTraceFunctionDefinition {\n id: string\n name: string\n file: string\n line: number\n column: number\n async?: boolean\n wrapper?: boolean\n}\n\nexport interface AutoTraceNodeConfiguration {\n functionName: string\n name?: string\n type?: \"llm\" | \"agent\" | \"function\" | \"guardrail\" | \"handoff\" | \"custom\"\n capture: boolean\n testRunId?: string\n mockOnReplay?: boolean\n // biome-ignore lint/suspicious/noExplicitAny: node finalizers receive the configured function's result, whose type is owned by the caller\n finalize?: (result: any) => unknown | Promise<unknown>\n}\n\nexport interface AutoTraceContext {\n invoke<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n depth: number,\n nodeConfiguration?: AutoTraceNodeConfiguration,\n ): T\n}\n\ninterface AutoTraceScope {\n context: AutoTraceContext\n depth: number\n nodeConfiguration?: AutoTraceNodeConfiguration\n}\n\ninterface AutoTraceState {\n storage: AsyncLocalStorageLike<AutoTraceScope> | null\n browserScope: AutoTraceScope | undefined\n capturePolicies: WeakMap<object, Map<string, ReadonlySet<string>>>\n activeRoots: number\n}\n\ninterface AutoTraceGlobal {\n __bitfabAutoTraceStateV3?: AutoTraceState\n}\n\ninterface AutoTraceAsyncGenerator {\n next(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n return(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n throw(error?: unknown): Promise<IteratorResult<unknown, unknown>>\n [Symbol.asyncIterator](): AutoTraceAsyncGenerator\n}\n\nconst autoTraceGlobal = globalThis as unknown as AutoTraceGlobal\nconst autoTraceState: AutoTraceState =\n autoTraceGlobal.__bitfabAutoTraceStateV3 ?? {\n storage: null,\n browserScope: undefined,\n capturePolicies: new WeakMap(),\n activeRoots: 0,\n }\nautoTraceGlobal.__bitfabAutoTraceStateV3 = autoTraceState\n\nfunction initializeAutoTraceStorage(): void {\n autoTraceState.storage ??= createAsyncLocalStorage<AutoTraceScope>()\n}\n\nexport function runWithAutoTraceContext<T>(\n context: AutoTraceContext,\n fn: () => T,\n depth = 0,\n): T {\n initializeAutoTraceStorage()\n const scope = { context, depth }\n if (autoTraceState.storage) {\n return autoTraceState.storage.run(scope, fn)\n }\n\n const previous = autoTraceState.browserScope\n autoTraceState.browserScope = scope\n try {\n return fn()\n } finally {\n autoTraceState.browserScope = previous\n }\n}\n\nexport function runWithAutoTraceNodeConfiguration<T>(\n nodeConfiguration: AutoTraceNodeConfiguration,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope) {\n return fn()\n }\n\n const configuredScope = { ...scope, nodeConfiguration }\n let result: T\n if (autoTraceState.storage) {\n result = autoTraceState.storage.run(configuredScope, fn)\n } else {\n const previous = autoTraceState.browserScope\n autoTraceState.browserScope = configuredScope\n try {\n result = fn()\n } finally {\n autoTraceState.browserScope = previous\n }\n }\n\n if (isAutoTraceAsyncGenerator(result)) {\n return wrapAutoTraceNodeAsyncGenerator(nodeConfiguration, result) as T\n }\n return result\n}\n\nexport function runWithAutoTraceRootContext<T>(\n context: AutoTraceContext,\n fn: () => T,\n): T {\n autoTraceState.activeRoots += 1\n let result: T\n try {\n result = runWithAutoTraceContext(context, fn)\n } catch (error) {\n autoTraceState.activeRoots -= 1\n throw error\n }\n\n if (isAutoTraceAsyncGenerator(result)) {\n autoTraceState.activeRoots -= 1\n return wrapAutoTraceAsyncGenerator(context, result) as T\n }\n\n if (result instanceof Promise) {\n return result.finally(() => {\n autoTraceState.activeRoots -= 1\n }) as T\n }\n\n autoTraceState.activeRoots -= 1\n return result\n}\n\nfunction isAutoTraceAsyncGenerator(\n value: unknown,\n): value is AutoTraceAsyncGenerator {\n if (value === null || typeof value !== \"object\") {\n return false\n }\n const candidate = value as Record<PropertyKey, unknown>\n return (\n typeof candidate.next === \"function\" &&\n typeof candidate.return === \"function\" &&\n typeof candidate.throw === \"function\" &&\n typeof candidate[Symbol.asyncIterator] === \"function\"\n )\n}\n\nfunction wrapAutoTraceAsyncGenerator(\n context: AutoTraceContext,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceRootContext(context, () => source[method](value))\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nfunction wrapAutoTraceNodeAsyncGenerator(\n nodeConfiguration: AutoTraceNodeConfiguration,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceNodeConfiguration(nodeConfiguration, () =>\n source[method](value),\n )\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nexport function __bitfabAutoSpan<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope) {\n return fn()\n }\n const nameParts = definition.name.split(\".\")\n const simpleName = nameParts[nameParts.length - 1]\n const nodeConfiguration =\n simpleName === scope.nodeConfiguration?.functionName\n ? scope.nodeConfiguration\n : undefined\n return scope.context.invoke(\n definition,\n inputs,\n fn,\n scope.depth,\n nodeConfiguration,\n )\n}\n\n/**\n * Preserve a function's original call arguments for transform cases where\n * parameter bindings discard them, such as destructured arrow parameters.\n *\n * This helper is internal transform/runtime protocol. The proxy preserves the\n * target's callability, arity, async identity, and non-constructibility while\n * only allocating a trace closure beneath an active automatic trace root.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoWrap<T extends (...args: never[]) => unknown>(\n definition: AutoTraceFunctionDefinition,\n fn: T,\n): T {\n if (fn.name === \"\") {\n const nameParts = definition.name.split(\".\")\n const inferredName = nameParts[nameParts.length - 1]\n if (inferredName !== undefined) {\n Object.defineProperty(fn, \"name\", {\n configurable: true,\n value: inferredName,\n })\n }\n }\n\n const target = fn as unknown as (...args: unknown[]) => unknown\n return new Proxy(target, {\n apply(callTarget, thisArg, args) {\n if (!__bitfabAutoTraceActive()) {\n return Reflect.apply(callTarget, thisArg, args)\n }\n return __bitfabAutoSpan(definition, args, () =>\n Reflect.apply(callTarget, thisArg, args),\n )\n },\n }) as unknown as T\n}\n\n/**\n * Return whether the current call is inside an automatic trace root.\n *\n * Build transforms use this before allocating function metadata, captured\n * inputs, or an invocation closure. It is internal transform/runtime protocol,\n * not a supported application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoTraceActive(): boolean {\n if (autoTraceState.activeRoots === 0) {\n return false\n }\n return currentAutoTraceScope() !== undefined\n}\n\nfunction currentAutoTraceScope(): AutoTraceScope | undefined {\n initializeAutoTraceStorage()\n return autoTraceState.storage?.getStore() ?? autoTraceState.browserScope\n}\n\nexport function __setBitfabAutoTraceCapturePolicy(\n client: object,\n traceFunctionKey: string,\n functionIds: Iterable<string>,\n): void {\n const policies = autoTraceState.capturePolicies.get(client) ?? new Map()\n policies.set(traceFunctionKey, new Set(functionIds))\n autoTraceState.capturePolicies.set(client, policies)\n}\n\nexport function getAutoTraceCapturePolicy(\n client: object,\n traceFunctionKey: string,\n): ReadonlySet<string> {\n return (\n autoTraceState.capturePolicies.get(client)?.get(traceFunctionKey) ??\n new Set()\n )\n}\n"],"mappings":";;;;;AA4DA,IAAM,kBAAkB;AACxB,IAAM,iBACJ,gBAAgB,4BAA4B;AAAA,EAC1C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,iBAAiB,oBAAI,QAAQ;AAAA,EAC7B,aAAa;AACf;AACF,gBAAgB,2BAA2B;AAE3C,SAAS,6BAAmC;AAC1C,iBAAe,YAAf,eAAe,UAAY,wBAAwC;AACrE;AAEO,SAAS,wBACd,SACA,IACA,QAAQ,GACL;AACH,6BAA2B;AAC3B,QAAM,QAAQ,EAAE,SAAS,MAAM;AAC/B,MAAI,eAAe,SAAS;AAC1B,WAAO,eAAe,QAAQ,IAAI,OAAO,EAAE;AAAA,EAC7C;AAEA,QAAM,WAAW,eAAe;AAChC,iBAAe,eAAe;AAC9B,MAAI;AACF,WAAO,GAAG;AAAA,EACZ,UAAE;AACA,mBAAe,eAAe;AAAA,EAChC;AACF;AAEO,SAAS,kCACd,mBACA,IACG;AACH,QAAM,QAAQ,sBAAsB;AACpC,MAAI,CAAC,OAAO;AACV,WAAO,GAAG;AAAA,EACZ;AAEA,QAAM,kBAAkB,EAAE,GAAG,OAAO,kBAAkB;AACtD,MAAI;AACJ,MAAI,eAAe,SAAS;AAC1B,aAAS,eAAe,QAAQ,IAAI,iBAAiB,EAAE;AAAA,EACzD,OAAO;AACL,UAAM,WAAW,eAAe;AAChC,mBAAe,eAAe;AAC9B,QAAI;AACF,eAAS,GAAG;AAAA,IACd,UAAE;AACA,qBAAe,eAAe;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,0BAA0B,MAAM,GAAG;AACrC,WAAO,gCAAgC,mBAAmB,MAAM;AAAA,EAClE;AACA,SAAO;AACT;AAEO,SAAS,4BACd,SACA,IACG;AACH,iBAAe,eAAe;AAC9B,MAAI;AACJ,MAAI;AACF,aAAS,wBAAwB,SAAS,EAAE;AAAA,EAC9C,SAAS,OAAO;AACd,mBAAe,eAAe;AAC9B,UAAM;AAAA,EACR;AAEA,MAAI,0BAA0B,MAAM,GAAG;AACrC,mBAAe,eAAe;AAC9B,WAAO,4BAA4B,SAAS,MAAM;AAAA,EACpD;AAEA,MAAI,kBAAkB,SAAS;AAC7B,WAAO,OAAO,QAAQ,MAAM;AAC1B,qBAAe,eAAe;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,iBAAe,eAAe;AAC9B,SAAO;AACT;AAEA,SAAS,0BACP,OACkC;AAClC,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,SAAS,cAC1B,OAAO,UAAU,WAAW,cAC5B,OAAO,UAAU,UAAU,cAC3B,OAAO,UAAU,OAAO,aAAa,MAAM;AAE/C;AAEA,SAAS,4BACP,SACA,QACyB;AACzB,QAAM,OAAO,CACX,QACA,UAEA,4BAA4B,SAAS,MAAM,OAAO,MAAM,EAAE,KAAK,CAAC;AAClE,QAAM,UAAmC;AAAA,IACvC,MAAM,CAAC,UAAU,KAAK,QAAQ,KAAK;AAAA,IACnC,QAAQ,CAAC,UAAU,KAAK,UAAU,KAAK;AAAA,IACvC,OAAO,CAAC,UAAU,KAAK,SAAS,KAAK;AAAA,IACrC,CAAC,OAAO,aAAa,GAAG,MAAM;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,gCACP,mBACA,QACyB;AACzB,QAAM,OAAO,CACX,QACA,UAEA;AAAA,IAAkC;AAAA,IAAmB,MACnD,OAAO,MAAM,EAAE,KAAK;AAAA,EACtB;AACF,QAAM,UAAmC;AAAA,IACvC,MAAM,CAAC,UAAU,KAAK,QAAQ,KAAK;AAAA,IACnC,QAAQ,CAAC,UAAU,KAAK,UAAU,KAAK;AAAA,IACvC,OAAO,CAAC,UAAU,KAAK,SAAS,KAAK;AAAA,IACrC,CAAC,OAAO,aAAa,GAAG,MAAM;AAAA,EAChC;AACA,SAAO;AACT;AAEO,SAAS,iBACd,YACA,QACA,IACG;AACH,QAAM,QAAQ,sBAAsB;AACpC,MAAI,CAAC,OAAO;AACV,WAAO,GAAG;AAAA,EACZ;AACA,QAAM,YAAY,WAAW,KAAK,MAAM,GAAG;AAC3C,QAAM,aAAa,UAAU,UAAU,SAAS,CAAC;AACjD,QAAM,oBACJ,eAAe,MAAM,mBAAmB,eACpC,MAAM,oBACN;AACN,SAAO,MAAM,QAAQ;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAYO,SAAS,iBACd,YACA,IACG;AACH,MAAI,GAAG,SAAS,IAAI;AAClB,UAAM,YAAY,WAAW,KAAK,MAAM,GAAG;AAC3C,UAAM,eAAe,UAAU,UAAU,SAAS,CAAC;AACnD,QAAI,iBAAiB,QAAW;AAC9B,aAAO,eAAe,IAAI,QAAQ;AAAA,QAChC,cAAc;AAAA,QACd,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,SAAS;AACf,SAAO,IAAI,MAAM,QAAQ;AAAA,IACvB,MAAM,YAAY,SAAS,MAAM;AAC/B,UAAI,CAAC,wBAAwB,GAAG;AAC9B,eAAO,QAAQ,MAAM,YAAY,SAAS,IAAI;AAAA,MAChD;AACA,aAAO;AAAA,QAAiB;AAAA,QAAY;AAAA,QAAM,MACxC,QAAQ,MAAM,YAAY,SAAS,IAAI;AAAA,MACzC;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAWO,SAAS,0BAAmC;AACjD,MAAI,eAAe,gBAAgB,GAAG;AACpC,WAAO;AAAA,EACT;AACA,SAAO,sBAAsB,MAAM;AACrC;AAEA,SAAS,wBAAoD;AAC3D,6BAA2B;AAC3B,SAAO,eAAe,SAAS,SAAS,KAAK,eAAe;AAC9D;AAEO,SAAS,kCACd,QACA,kBACA,aACM;AACN,QAAM,WAAW,eAAe,gBAAgB,IAAI,MAAM,KAAK,oBAAI,IAAI;AACvE,WAAS,IAAI,kBAAkB,IAAI,IAAI,WAAW,CAAC;AACnD,iBAAe,gBAAgB,IAAI,QAAQ,QAAQ;AACrD;AAEO,SAAS,0BACd,QACA,kBACqB;AACrB,SACE,eAAe,gBAAgB,IAAI,MAAM,GAAG,IAAI,gBAAgB,KAChE,oBAAI,IAAI;AAEZ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/autoTrace.ts"],"sourcesContent":["import {\n type AsyncLocalStorageLike,\n createAsyncLocalStorage,\n} from \"./asyncStorage.js\"\n\nexport interface AutoTraceFunctionDefinition {\n id: string\n name: string\n file: string\n line: number\n column: number\n async?: boolean\n wrapper?: boolean\n}\n\nexport interface AutoTraceNodeConfiguration {\n functionName: string\n name?: string\n type?: \"llm\" | \"agent\" | \"function\" | \"guardrail\" | \"handoff\" | \"custom\"\n capture: boolean\n testRunId?: string\n mockOnReplay?: boolean\n // biome-ignore lint/suspicious/noExplicitAny: node finalizers receive the configured function's result, whose type is owned by the caller\n finalize?: (result: any) => unknown | Promise<unknown>\n}\n\nexport interface AutoTraceContext {\n invoke<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n depth: number,\n nodeConfiguration?: AutoTraceNodeConfiguration,\n ): T\n}\n\ninterface AutoTraceScope {\n context: AutoTraceContext\n depth: number\n nodeConfiguration?: AutoTraceNodeConfiguration\n}\n\ninterface AutoTraceState {\n storage: AsyncLocalStorageLike<AutoTraceScope> | null\n browserScope: AutoTraceScope | undefined\n capturePolicies: WeakMap<object, Map<string, ReadonlySet<string>>>\n activeRoots: number\n}\n\ninterface AutoTraceGlobal {\n __bitfabAutoTraceStateV3?: AutoTraceState\n}\n\ninterface AutoTraceAsyncGenerator {\n next(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n return(value?: unknown): Promise<IteratorResult<unknown, unknown>>\n throw(error?: unknown): Promise<IteratorResult<unknown, unknown>>\n [Symbol.asyncIterator](): AutoTraceAsyncGenerator\n}\n\nconst autoTraceGlobal = globalThis as unknown as AutoTraceGlobal\nconst autoTraceState: AutoTraceState =\n autoTraceGlobal.__bitfabAutoTraceStateV3 ?? {\n storage: null,\n browserScope: undefined,\n capturePolicies: new WeakMap(),\n activeRoots: 0,\n }\nautoTraceGlobal.__bitfabAutoTraceStateV3 = autoTraceState\n\nfunction initializeAutoTraceStorage(): void {\n autoTraceState.storage ??= createAsyncLocalStorage<AutoTraceScope>()\n}\n\nexport function runWithAutoTraceContext<T>(\n context: AutoTraceContext,\n fn: () => T,\n depth = 0,\n): T {\n initializeAutoTraceStorage()\n const scope = { context, depth }\n if (autoTraceState.storage) {\n return autoTraceState.storage.run(scope, fn)\n }\n\n const previous = autoTraceState.browserScope\n autoTraceState.browserScope = scope\n try {\n return fn()\n } finally {\n autoTraceState.browserScope = previous\n }\n}\n\nexport function runWithAutoTraceNodeConfiguration<T>(\n nodeConfiguration: AutoTraceNodeConfiguration,\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope) {\n return fn()\n }\n\n const configuredScope = { ...scope, nodeConfiguration }\n let result: T\n if (autoTraceState.storage) {\n result = autoTraceState.storage.run(configuredScope, fn)\n } else {\n const previous = autoTraceState.browserScope\n autoTraceState.browserScope = configuredScope\n try {\n result = fn()\n } finally {\n autoTraceState.browserScope = previous\n }\n }\n\n if (isAutoTraceAsyncGenerator(result)) {\n return wrapAutoTraceNodeAsyncGenerator(nodeConfiguration, result) as T\n }\n return result\n}\n\nexport function runWithAutoTraceRootContext<T>(\n context: AutoTraceContext,\n fn: () => T,\n): T {\n autoTraceState.activeRoots += 1\n let result: T\n try {\n result = runWithAutoTraceContext(context, fn)\n } catch (error) {\n autoTraceState.activeRoots -= 1\n throw error\n }\n\n if (isAutoTraceAsyncGenerator(result)) {\n autoTraceState.activeRoots -= 1\n return wrapAutoTraceAsyncGenerator(context, result) as T\n }\n\n if (result instanceof Promise) {\n return result.finally(() => {\n autoTraceState.activeRoots -= 1\n }) as T\n }\n\n autoTraceState.activeRoots -= 1\n return result\n}\n\nfunction isAutoTraceAsyncGenerator(\n value: unknown,\n): value is AutoTraceAsyncGenerator {\n if (value === null || typeof value !== \"object\") {\n return false\n }\n const candidate = value as Record<PropertyKey, unknown>\n return (\n typeof candidate.next === \"function\" &&\n typeof candidate.return === \"function\" &&\n typeof candidate.throw === \"function\" &&\n typeof candidate[Symbol.asyncIterator] === \"function\"\n )\n}\n\nfunction wrapAutoTraceAsyncGenerator(\n context: AutoTraceContext,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceRootContext(context, () => source[method](value))\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nfunction wrapAutoTraceNodeAsyncGenerator(\n nodeConfiguration: AutoTraceNodeConfiguration,\n source: AutoTraceAsyncGenerator,\n): AutoTraceAsyncGenerator {\n const step = (\n method: \"next\" | \"return\" | \"throw\",\n value?: unknown,\n ): Promise<IteratorResult<unknown, unknown>> =>\n runWithAutoTraceNodeConfiguration(nodeConfiguration, () =>\n source[method](value),\n )\n const wrapped: AutoTraceAsyncGenerator = {\n next: (value) => step(\"next\", value),\n return: (value) => step(\"return\", value),\n throw: (error) => step(\"throw\", error),\n [Symbol.asyncIterator]: () => wrapped,\n }\n return wrapped\n}\n\nexport function __bitfabAutoSpan<T>(\n definition: AutoTraceFunctionDefinition,\n inputs: unknown[],\n fn: () => T,\n): T {\n const scope = currentAutoTraceScope()\n if (!scope) {\n return fn()\n }\n const nameParts = definition.name.split(\".\")\n const simpleName = nameParts[nameParts.length - 1]\n const nodeConfiguration =\n simpleName === scope.nodeConfiguration?.functionName\n ? scope.nodeConfiguration\n : undefined\n return scope.context.invoke(\n definition,\n inputs,\n fn,\n scope.depth,\n nodeConfiguration,\n )\n}\n\n/**\n * Preserve a function's original call arguments for transform cases where\n * parameter bindings discard them, such as destructured arrow parameters.\n *\n * This helper is internal transform/runtime protocol. The proxy preserves the\n * target's callability, arity, async identity, and non-constructibility while\n * only allocating a trace closure beneath an active automatic trace root.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoWrap<T extends (...args: never[]) => unknown>(\n definition: AutoTraceFunctionDefinition,\n fn: T,\n): T {\n if (fn.name === \"\") {\n const nameParts = definition.name.split(\".\")\n const inferredName = nameParts[nameParts.length - 1]\n if (inferredName !== undefined) {\n Object.defineProperty(fn, \"name\", {\n configurable: true,\n value: inferredName,\n })\n }\n }\n\n const target = fn as unknown as (...args: unknown[]) => unknown\n return new Proxy(target, {\n apply(callTarget, thisArg, args) {\n if (!__bitfabAutoTraceActive()) {\n return Reflect.apply(callTarget, thisArg, args)\n }\n return __bitfabAutoSpan(definition, args, () =>\n Reflect.apply(callTarget, thisArg, args),\n )\n },\n }) as unknown as T\n}\n\n/**\n * Return whether the current call is inside an automatic trace root.\n *\n * Build transforms use this before allocating function metadata, captured\n * inputs, or an invocation closure. It is internal transform/runtime protocol,\n * not a supported application API.\n *\n * @experimental The automatic tracing protocol may change.\n */\nexport function __bitfabAutoTraceActive(): boolean {\n if (autoTraceState.activeRoots === 0) {\n return false\n }\n return currentAutoTraceScope() !== undefined\n}\n\nfunction currentAutoTraceScope(): AutoTraceScope | undefined {\n initializeAutoTraceStorage()\n return autoTraceState.storage?.getStore() ?? autoTraceState.browserScope\n}\n\nexport function __setBitfabAutoTraceCapturePolicy(\n client: object,\n traceFunctionKey: string,\n functionIds: Iterable<string> | undefined,\n): void {\n const policies = autoTraceState.capturePolicies.get(client) ?? new Map()\n if (functionIds === undefined) {\n policies.delete(traceFunctionKey)\n if (policies.size === 0) {\n autoTraceState.capturePolicies.delete(client)\n }\n return\n }\n policies.set(traceFunctionKey, new Set(functionIds))\n autoTraceState.capturePolicies.set(client, policies)\n}\n\nexport function getAutoTraceCapturePolicy(\n client: object,\n traceFunctionKey: string,\n): ReadonlySet<string> | undefined {\n return autoTraceState.capturePolicies.get(client)?.get(traceFunctionKey)\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -42,7 +42,7 @@ var __version__, __packageName__;
|
|
|
42
42
|
var init_version_generated = __esm({
|
|
43
43
|
"src/version.generated.ts"() {
|
|
44
44
|
"use strict";
|
|
45
|
-
__version__ = "0.38.
|
|
45
|
+
__version__ = "0.38.6";
|
|
46
46
|
__packageName__ = "@bitfab/sdk";
|
|
47
47
|
}
|
|
48
48
|
});
|
|
@@ -2187,11 +2187,16 @@ function normalizeMockOverrides(mockOverride) {
|
|
|
2187
2187
|
if (mockOverride === void 0) {
|
|
2188
2188
|
return [];
|
|
2189
2189
|
}
|
|
2190
|
-
|
|
2190
|
+
const overrides = Array.isArray(mockOverride) ? mockOverride : [mockOverride];
|
|
2191
|
+
return overrides.map(
|
|
2192
|
+
(override) => typeof override === "function" ? { match: () => true, value: override } : override
|
|
2193
|
+
);
|
|
2191
2194
|
}
|
|
2195
|
+
var NO_MOCK_OVERRIDE;
|
|
2192
2196
|
var init_mockOverride = __esm({
|
|
2193
2197
|
"src/mockOverride.ts"() {
|
|
2194
2198
|
"use strict";
|
|
2199
|
+
NO_MOCK_OVERRIDE = /* @__PURE__ */ Symbol("bitfab.noMockOverride");
|
|
2195
2200
|
}
|
|
2196
2201
|
});
|
|
2197
2202
|
|
|
@@ -3133,6 +3138,7 @@ __export(index_exports, {
|
|
|
3133
3138
|
DEFAULT_SERVICE_URL: () => DEFAULT_SERVICE_URL,
|
|
3134
3139
|
DbBranchReplayError: () => DbBranchReplayError,
|
|
3135
3140
|
HttpClient: () => HttpClient,
|
|
3141
|
+
NO_MOCK_OVERRIDE: () => NO_MOCK_OVERRIDE,
|
|
3136
3142
|
ReplayError: () => ReplayError,
|
|
3137
3143
|
SUPPORTED_PROVIDERS: () => SUPPORTED_PROVIDERS,
|
|
3138
3144
|
__version__: () => __version__,
|
|
@@ -3874,11 +3880,18 @@ function currentAutoTraceScope() {
|
|
|
3874
3880
|
}
|
|
3875
3881
|
function __setBitfabAutoTraceCapturePolicy(client, traceFunctionKey, functionIds) {
|
|
3876
3882
|
const policies = autoTraceState.capturePolicies.get(client) ?? /* @__PURE__ */ new Map();
|
|
3883
|
+
if (functionIds === void 0) {
|
|
3884
|
+
policies.delete(traceFunctionKey);
|
|
3885
|
+
if (policies.size === 0) {
|
|
3886
|
+
autoTraceState.capturePolicies.delete(client);
|
|
3887
|
+
}
|
|
3888
|
+
return;
|
|
3889
|
+
}
|
|
3877
3890
|
policies.set(traceFunctionKey, new Set(functionIds));
|
|
3878
3891
|
autoTraceState.capturePolicies.set(client, policies);
|
|
3879
3892
|
}
|
|
3880
3893
|
function getAutoTraceCapturePolicy(client, traceFunctionKey) {
|
|
3881
|
-
return autoTraceState.capturePolicies.get(client)?.get(traceFunctionKey)
|
|
3894
|
+
return autoTraceState.capturePolicies.get(client)?.get(traceFunctionKey);
|
|
3882
3895
|
}
|
|
3883
3896
|
|
|
3884
3897
|
// src/optionalPeer.ts
|
|
@@ -5667,8 +5680,9 @@ var Bitfab = class {
|
|
|
5667
5680
|
* Decorate a class method as an automatically expanded trace root.
|
|
5668
5681
|
*
|
|
5669
5682
|
* Build instrumentation turns repository functions called beneath this
|
|
5670
|
-
* method into nested spans
|
|
5671
|
-
*
|
|
5683
|
+
* method into nested spans that capture inputs, outputs, and errors by
|
|
5684
|
+
* default. A confirmed capture policy can narrow rich capture to selected
|
|
5685
|
+
* function IDs.
|
|
5672
5686
|
* Without a compatible build transform, this still records the decorated
|
|
5673
5687
|
* method as a normal rich root span but cannot discover child calls.
|
|
5674
5688
|
*
|
|
@@ -5878,7 +5892,7 @@ var Bitfab = class {
|
|
|
5878
5892
|
type: nodeConfiguration?.type ?? "function",
|
|
5879
5893
|
captureWhen: "nested",
|
|
5880
5894
|
functionId: definition.id,
|
|
5881
|
-
captureContent: nodeConfiguration !== void 0 || capturePolicy.has(definition.id),
|
|
5895
|
+
captureContent: nodeConfiguration !== void 0 || capturePolicy === void 0 || capturePolicy.has(definition.id),
|
|
5882
5896
|
autoTraceDefinition: definition,
|
|
5883
5897
|
...nodeConfiguration?.testRunId !== void 0 && {
|
|
5884
5898
|
testRunId: nodeConfiguration.testRunId
|
|
@@ -5943,7 +5957,11 @@ var Bitfab = class {
|
|
|
5943
5957
|
const functionIds = Array.isArray(policy.functionIds) ? policy.functionIds.filter(
|
|
5944
5958
|
(id) => typeof id === "string" && id.startsWith(`${AUTO_TRACE_PROTOCOL}:`)
|
|
5945
5959
|
).slice(0, DEFAULT_AUTO_TRACE_MAX_SPANS) : [];
|
|
5946
|
-
__setBitfabAutoTraceCapturePolicy(
|
|
5960
|
+
__setBitfabAutoTraceCapturePolicy(
|
|
5961
|
+
this,
|
|
5962
|
+
traceFunctionKey,
|
|
5963
|
+
policy.revision === null ? void 0 : functionIds
|
|
5964
|
+
);
|
|
5947
5965
|
state.refreshAfter = Date.now() + AUTO_TRACE_POLICY_REFRESH_MS;
|
|
5948
5966
|
}).catch(() => {
|
|
5949
5967
|
state.refreshAfter = Date.now() + AUTO_TRACE_POLICY_RETRY_MS;
|
|
@@ -6555,6 +6573,49 @@ var Bitfab = class {
|
|
|
6555
6573
|
} catch {
|
|
6556
6574
|
}
|
|
6557
6575
|
};
|
|
6576
|
+
const recordSpan = (result) => {
|
|
6577
|
+
if (options.finalize) {
|
|
6578
|
+
void self.httpClient.trackDeferred(
|
|
6579
|
+
Promise.resolve().then(() => options.finalize(result)).then((output) => sendSpan({ result: output })).catch(
|
|
6580
|
+
(error) => sendSpan({
|
|
6581
|
+
result: void 0,
|
|
6582
|
+
error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
|
|
6583
|
+
})
|
|
6584
|
+
)
|
|
6585
|
+
);
|
|
6586
|
+
} else {
|
|
6587
|
+
void sendSpan({ result });
|
|
6588
|
+
}
|
|
6589
|
+
};
|
|
6590
|
+
executeWithContext = () => {
|
|
6591
|
+
let result;
|
|
6592
|
+
try {
|
|
6593
|
+
result = fn.apply(this, args);
|
|
6594
|
+
} catch (error) {
|
|
6595
|
+
void sendSpan({
|
|
6596
|
+
result: void 0,
|
|
6597
|
+
error: error instanceof Error ? error.message : String(error)
|
|
6598
|
+
});
|
|
6599
|
+
throw error;
|
|
6600
|
+
}
|
|
6601
|
+
if (result instanceof Promise) {
|
|
6602
|
+
return result.then((resolvedResult) => {
|
|
6603
|
+
recordSpan(resolvedResult);
|
|
6604
|
+
return resolvedResult;
|
|
6605
|
+
}).catch((error) => {
|
|
6606
|
+
void sendSpan({
|
|
6607
|
+
result: void 0,
|
|
6608
|
+
error: error instanceof Error ? error.message : String(error)
|
|
6609
|
+
});
|
|
6610
|
+
throw error;
|
|
6611
|
+
});
|
|
6612
|
+
}
|
|
6613
|
+
if (isAsyncGenerator(result)) {
|
|
6614
|
+
return wrapAsyncGenerator(result, newStack, sendSpan);
|
|
6615
|
+
}
|
|
6616
|
+
recordSpan(result);
|
|
6617
|
+
return result;
|
|
6618
|
+
};
|
|
6558
6619
|
const replayCtxForMock = getReplayContext();
|
|
6559
6620
|
if (replayCtxForMock?.mockTree && !isRootSpan) {
|
|
6560
6621
|
const counters = replayCtxForMock.callCounters;
|
|
@@ -6613,6 +6674,7 @@ var Bitfab = class {
|
|
|
6613
6674
|
}
|
|
6614
6675
|
return output;
|
|
6615
6676
|
};
|
|
6677
|
+
const shouldMockWithBaseStrategy = replayCtxForMock.mockStrategy === "all" || replayCtxForMock.mockStrategy === "marked" && options.mockOnReplay === true;
|
|
6616
6678
|
if (replayCtxForMock.mockOverrides?.length) {
|
|
6617
6679
|
const nodeMeta = {
|
|
6618
6680
|
traceFunctionKey,
|
|
@@ -6620,28 +6682,75 @@ var Bitfab = class {
|
|
|
6620
6682
|
type: options.type ?? "custom",
|
|
6621
6683
|
originalSpanId: mockSpan?.sourceSpanId
|
|
6622
6684
|
};
|
|
6623
|
-
const
|
|
6624
|
-
|
|
6625
|
-
|
|
6626
|
-
|
|
6627
|
-
|
|
6628
|
-
|
|
6629
|
-
|
|
6630
|
-
|
|
6631
|
-
|
|
6632
|
-
|
|
6633
|
-
|
|
6685
|
+
const overrideCtx = {
|
|
6686
|
+
node: nodeMeta,
|
|
6687
|
+
inputs: args,
|
|
6688
|
+
getOriginalOutput: () => Promise.resolve(resolveRecordedOutput())
|
|
6689
|
+
};
|
|
6690
|
+
const resolveOverrideFrom = (startIndex) => {
|
|
6691
|
+
for (let index = startIndex; index < replayCtxForMock.mockOverrides.length; index += 1) {
|
|
6692
|
+
const override = replayCtxForMock.mockOverrides[index];
|
|
6693
|
+
if (!override?.match(nodeMeta)) {
|
|
6694
|
+
continue;
|
|
6695
|
+
}
|
|
6696
|
+
const injected = resolveMockValue(override.value, overrideCtx);
|
|
6697
|
+
if (injected instanceof Promise) {
|
|
6698
|
+
return injected.then(
|
|
6699
|
+
(output) => output === NO_MOCK_OVERRIDE ? resolveOverrideFrom(index + 1) : { matched: true, output }
|
|
6700
|
+
);
|
|
6701
|
+
}
|
|
6702
|
+
if (injected !== NO_MOCK_OVERRIDE) {
|
|
6703
|
+
return { matched: true, output: injected };
|
|
6704
|
+
}
|
|
6634
6705
|
}
|
|
6635
|
-
return
|
|
6706
|
+
return { matched: false };
|
|
6707
|
+
};
|
|
6708
|
+
const resolution = resolveOverrideFrom(0);
|
|
6709
|
+
if (resolution instanceof Promise) {
|
|
6710
|
+
if (!fnReturnsPromise) {
|
|
6711
|
+
throw new BitfabError(
|
|
6712
|
+
`Cannot resolve an asynchronous mock override for synchronous span "${traceFunctionKey}". Make the wrapped function async or return NO_MOCK_OVERRIDE synchronously.`
|
|
6713
|
+
);
|
|
6714
|
+
}
|
|
6715
|
+
return runWithSpanStack(newStack, async () => {
|
|
6716
|
+
const resolved = await resolution;
|
|
6717
|
+
if (resolved.matched) {
|
|
6718
|
+
void sendSpan({
|
|
6719
|
+
result: resolved.output,
|
|
6720
|
+
mocked: true,
|
|
6721
|
+
mockTarget: "output",
|
|
6722
|
+
mockSource: "override"
|
|
6723
|
+
});
|
|
6724
|
+
return resolved.output;
|
|
6725
|
+
}
|
|
6726
|
+
if (shouldMockWithBaseStrategy && !mockSpan) {
|
|
6727
|
+
throw new BitfabError(
|
|
6728
|
+
`Replay selected span "${traceFunctionKey}:${baseSpanParams.spanName}" for mocking, but recorded occurrence ${callIndex + 1} is unavailable. The real span was not executed.`
|
|
6729
|
+
);
|
|
6730
|
+
}
|
|
6731
|
+
if (shouldMockWithBaseStrategy) {
|
|
6732
|
+
const output = await resolveRecordedOutput();
|
|
6733
|
+
void sendSpan({
|
|
6734
|
+
result: output,
|
|
6735
|
+
mocked: true,
|
|
6736
|
+
mockTarget: "output",
|
|
6737
|
+
mockSource: "recorded"
|
|
6738
|
+
});
|
|
6739
|
+
return output;
|
|
6740
|
+
}
|
|
6741
|
+
return executeWithContext();
|
|
6742
|
+
});
|
|
6743
|
+
}
|
|
6744
|
+
if (resolution.matched) {
|
|
6745
|
+
return emitMock(resolution.output, "override");
|
|
6636
6746
|
}
|
|
6637
6747
|
}
|
|
6638
|
-
|
|
6639
|
-
if (shouldMock && !mockSpan) {
|
|
6748
|
+
if (shouldMockWithBaseStrategy && !mockSpan) {
|
|
6640
6749
|
throw new BitfabError(
|
|
6641
6750
|
`Replay selected span "${traceFunctionKey}:${baseSpanParams.spanName}" for mocking, but recorded occurrence ${callIndex + 1} is unavailable. The real span was not executed.`
|
|
6642
6751
|
);
|
|
6643
6752
|
}
|
|
6644
|
-
if (
|
|
6753
|
+
if (shouldMockWithBaseStrategy) {
|
|
6645
6754
|
const recorded = resolveRecordedOutput();
|
|
6646
6755
|
if (recorded instanceof Promise) {
|
|
6647
6756
|
return emitMockAsync(recorded, "recorded");
|
|
@@ -6649,49 +6758,6 @@ var Bitfab = class {
|
|
|
6649
6758
|
return emitMock(recorded, "recorded");
|
|
6650
6759
|
}
|
|
6651
6760
|
}
|
|
6652
|
-
const recordSpan = (result) => {
|
|
6653
|
-
if (options.finalize) {
|
|
6654
|
-
void self.httpClient.trackDeferred(
|
|
6655
|
-
Promise.resolve().then(() => options.finalize(result)).then((output) => sendSpan({ result: output })).catch(
|
|
6656
|
-
(error) => sendSpan({
|
|
6657
|
-
result: void 0,
|
|
6658
|
-
error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
|
|
6659
|
-
})
|
|
6660
|
-
)
|
|
6661
|
-
);
|
|
6662
|
-
} else {
|
|
6663
|
-
void sendSpan({ result });
|
|
6664
|
-
}
|
|
6665
|
-
};
|
|
6666
|
-
executeWithContext = () => {
|
|
6667
|
-
let result;
|
|
6668
|
-
try {
|
|
6669
|
-
result = fn.apply(this, args);
|
|
6670
|
-
} catch (error) {
|
|
6671
|
-
void sendSpan({
|
|
6672
|
-
result: void 0,
|
|
6673
|
-
error: error instanceof Error ? error.message : String(error)
|
|
6674
|
-
});
|
|
6675
|
-
throw error;
|
|
6676
|
-
}
|
|
6677
|
-
if (result instanceof Promise) {
|
|
6678
|
-
return result.then((resolvedResult) => {
|
|
6679
|
-
recordSpan(resolvedResult);
|
|
6680
|
-
return resolvedResult;
|
|
6681
|
-
}).catch((error) => {
|
|
6682
|
-
void sendSpan({
|
|
6683
|
-
result: void 0,
|
|
6684
|
-
error: error instanceof Error ? error.message : String(error)
|
|
6685
|
-
});
|
|
6686
|
-
throw error;
|
|
6687
|
-
});
|
|
6688
|
-
}
|
|
6689
|
-
if (isAsyncGenerator(result)) {
|
|
6690
|
-
return wrapAsyncGenerator(result, newStack, sendSpan);
|
|
6691
|
-
}
|
|
6692
|
-
recordSpan(result);
|
|
6693
|
-
return result;
|
|
6694
|
-
};
|
|
6695
6761
|
} catch (setupError) {
|
|
6696
6762
|
if (registeredTraceId) {
|
|
6697
6763
|
activeTraceStates.delete(registeredTraceId);
|
|
@@ -6978,8 +7044,40 @@ var Bitfab = class {
|
|
|
6978
7044
|
...params.mockSource && { mockSource: params.mockSource }
|
|
6979
7045
|
});
|
|
6980
7046
|
}
|
|
6981
|
-
registerMockOverride(
|
|
6982
|
-
|
|
7047
|
+
registerMockOverride(overrideOrResolverOrMatch, ...values) {
|
|
7048
|
+
let override;
|
|
7049
|
+
if (typeof overrideOrResolverOrMatch === "string") {
|
|
7050
|
+
const keyedOverride = values[0];
|
|
7051
|
+
if (values.length !== 1 || keyedOverride === void 0) {
|
|
7052
|
+
throw new BitfabError(
|
|
7053
|
+
"registerMockOverride(traceFunctionKey, override) requires a resolver function or { match, value } override."
|
|
7054
|
+
);
|
|
7055
|
+
}
|
|
7056
|
+
if (typeof keyedOverride === "function") {
|
|
7057
|
+
override = {
|
|
7058
|
+
match: (node) => node.traceFunctionKey === overrideOrResolverOrMatch,
|
|
7059
|
+
value: keyedOverride
|
|
7060
|
+
};
|
|
7061
|
+
} else if (typeof keyedOverride === "object" && keyedOverride !== null && "match" in keyedOverride && "value" in keyedOverride) {
|
|
7062
|
+
override = {
|
|
7063
|
+
match: (node) => node.traceFunctionKey === overrideOrResolverOrMatch && keyedOverride.match(node),
|
|
7064
|
+
value: keyedOverride.value
|
|
7065
|
+
};
|
|
7066
|
+
} else {
|
|
7067
|
+
throw new BitfabError(
|
|
7068
|
+
"registerMockOverride(traceFunctionKey, override) requires a resolver function or { match, value } override."
|
|
7069
|
+
);
|
|
7070
|
+
}
|
|
7071
|
+
} else if (typeof overrideOrResolverOrMatch !== "function") {
|
|
7072
|
+
override = overrideOrResolverOrMatch;
|
|
7073
|
+
} else if (values.length === 0) {
|
|
7074
|
+
override = { match: () => true, value: overrideOrResolverOrMatch };
|
|
7075
|
+
} else {
|
|
7076
|
+
override = {
|
|
7077
|
+
match: overrideOrResolverOrMatch,
|
|
7078
|
+
value: values[0]
|
|
7079
|
+
};
|
|
7080
|
+
}
|
|
6983
7081
|
this.mockOverrides.push(override);
|
|
6984
7082
|
}
|
|
6985
7083
|
/** Remove all overrides registered via {@link registerMockOverride}. */
|
|
@@ -7229,6 +7327,7 @@ var finalizers = {
|
|
|
7229
7327
|
|
|
7230
7328
|
// src/index.ts
|
|
7231
7329
|
init_http();
|
|
7330
|
+
init_mockOverride();
|
|
7232
7331
|
init_replay();
|
|
7233
7332
|
|
|
7234
7333
|
// src/replayRegistry.ts
|
|
@@ -7252,6 +7351,7 @@ function defineReplayRegistry(registry) {
|
|
|
7252
7351
|
DEFAULT_SERVICE_URL,
|
|
7253
7352
|
DbBranchReplayError,
|
|
7254
7353
|
HttpClient,
|
|
7354
|
+
NO_MOCK_OVERRIDE,
|
|
7255
7355
|
ReplayError,
|
|
7256
7356
|
SUPPORTED_PROVIDERS,
|
|
7257
7357
|
__version__,
|