bitfab 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-LHFNHB2J.js → chunk-O75EYGVO.js} +8 -3
- package/dist/chunk-O75EYGVO.js.map +1 -0
- package/dist/{chunk-PXAL7PPD.js → chunk-YCTQONNS.js} +154 -68
- package/dist/chunk-YCTQONNS.js.map +1 -0
- 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-BYW5MCLO.js → replay-K3UMQAKO.js} +2 -2
- package/dist/replayCli.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-LHFNHB2J.js.map +0 -1
- package/dist/chunk-PXAL7PPD.js.map +0 -1
- /package/dist/{replay-BYW5MCLO.js.map → replay-K3UMQAKO.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":"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","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
|
@@ -51,7 +51,7 @@ var __version__, __packageName__;
|
|
|
51
51
|
var init_version_generated = __esm({
|
|
52
52
|
"src/version.generated.ts"() {
|
|
53
53
|
"use strict";
|
|
54
|
-
__version__ = "0.38.
|
|
54
|
+
__version__ = "0.38.6";
|
|
55
55
|
__packageName__ = "bitfab";
|
|
56
56
|
}
|
|
57
57
|
});
|
|
@@ -2196,11 +2196,16 @@ function normalizeMockOverrides(mockOverride) {
|
|
|
2196
2196
|
if (mockOverride === void 0) {
|
|
2197
2197
|
return [];
|
|
2198
2198
|
}
|
|
2199
|
-
|
|
2199
|
+
const overrides = Array.isArray(mockOverride) ? mockOverride : [mockOverride];
|
|
2200
|
+
return overrides.map(
|
|
2201
|
+
(override) => typeof override === "function" ? { match: () => true, value: override } : override
|
|
2202
|
+
);
|
|
2200
2203
|
}
|
|
2204
|
+
var NO_MOCK_OVERRIDE;
|
|
2201
2205
|
var init_mockOverride = __esm({
|
|
2202
2206
|
"src/mockOverride.ts"() {
|
|
2203
2207
|
"use strict";
|
|
2208
|
+
NO_MOCK_OVERRIDE = /* @__PURE__ */ Symbol("bitfab.noMockOverride");
|
|
2204
2209
|
}
|
|
2205
2210
|
});
|
|
2206
2211
|
|
|
@@ -3142,6 +3147,7 @@ __export(index_exports, {
|
|
|
3142
3147
|
DEFAULT_SERVICE_URL: () => DEFAULT_SERVICE_URL,
|
|
3143
3148
|
DbBranchReplayError: () => DbBranchReplayError,
|
|
3144
3149
|
HttpClient: () => HttpClient,
|
|
3150
|
+
NO_MOCK_OVERRIDE: () => NO_MOCK_OVERRIDE,
|
|
3145
3151
|
ReplayError: () => ReplayError,
|
|
3146
3152
|
SUPPORTED_PROVIDERS: () => SUPPORTED_PROVIDERS,
|
|
3147
3153
|
__version__: () => __version__,
|
|
@@ -3883,11 +3889,18 @@ function currentAutoTraceScope() {
|
|
|
3883
3889
|
}
|
|
3884
3890
|
function __setBitfabAutoTraceCapturePolicy(client, traceFunctionKey, functionIds) {
|
|
3885
3891
|
const policies = autoTraceState.capturePolicies.get(client) ?? /* @__PURE__ */ new Map();
|
|
3892
|
+
if (functionIds === void 0) {
|
|
3893
|
+
policies.delete(traceFunctionKey);
|
|
3894
|
+
if (policies.size === 0) {
|
|
3895
|
+
autoTraceState.capturePolicies.delete(client);
|
|
3896
|
+
}
|
|
3897
|
+
return;
|
|
3898
|
+
}
|
|
3886
3899
|
policies.set(traceFunctionKey, new Set(functionIds));
|
|
3887
3900
|
autoTraceState.capturePolicies.set(client, policies);
|
|
3888
3901
|
}
|
|
3889
3902
|
function getAutoTraceCapturePolicy(client, traceFunctionKey) {
|
|
3890
|
-
return autoTraceState.capturePolicies.get(client)?.get(traceFunctionKey)
|
|
3903
|
+
return autoTraceState.capturePolicies.get(client)?.get(traceFunctionKey);
|
|
3891
3904
|
}
|
|
3892
3905
|
|
|
3893
3906
|
// src/optionalPeer.ts
|
|
@@ -5676,8 +5689,9 @@ var Bitfab = class {
|
|
|
5676
5689
|
* Decorate a class method as an automatically expanded trace root.
|
|
5677
5690
|
*
|
|
5678
5691
|
* Build instrumentation turns repository functions called beneath this
|
|
5679
|
-
* method into nested spans
|
|
5680
|
-
*
|
|
5692
|
+
* method into nested spans that capture inputs, outputs, and errors by
|
|
5693
|
+
* default. A confirmed capture policy can narrow rich capture to selected
|
|
5694
|
+
* function IDs.
|
|
5681
5695
|
* Without a compatible build transform, this still records the decorated
|
|
5682
5696
|
* method as a normal rich root span but cannot discover child calls.
|
|
5683
5697
|
*
|
|
@@ -5887,7 +5901,7 @@ var Bitfab = class {
|
|
|
5887
5901
|
type: nodeConfiguration?.type ?? "function",
|
|
5888
5902
|
captureWhen: "nested",
|
|
5889
5903
|
functionId: definition.id,
|
|
5890
|
-
captureContent: nodeConfiguration !== void 0 || capturePolicy.has(definition.id),
|
|
5904
|
+
captureContent: nodeConfiguration !== void 0 || capturePolicy === void 0 || capturePolicy.has(definition.id),
|
|
5891
5905
|
autoTraceDefinition: definition,
|
|
5892
5906
|
...nodeConfiguration?.testRunId !== void 0 && {
|
|
5893
5907
|
testRunId: nodeConfiguration.testRunId
|
|
@@ -5952,7 +5966,11 @@ var Bitfab = class {
|
|
|
5952
5966
|
const functionIds = Array.isArray(policy.functionIds) ? policy.functionIds.filter(
|
|
5953
5967
|
(id) => typeof id === "string" && id.startsWith(`${AUTO_TRACE_PROTOCOL}:`)
|
|
5954
5968
|
).slice(0, DEFAULT_AUTO_TRACE_MAX_SPANS) : [];
|
|
5955
|
-
__setBitfabAutoTraceCapturePolicy(
|
|
5969
|
+
__setBitfabAutoTraceCapturePolicy(
|
|
5970
|
+
this,
|
|
5971
|
+
traceFunctionKey,
|
|
5972
|
+
policy.revision === null ? void 0 : functionIds
|
|
5973
|
+
);
|
|
5956
5974
|
state.refreshAfter = Date.now() + AUTO_TRACE_POLICY_REFRESH_MS;
|
|
5957
5975
|
}).catch(() => {
|
|
5958
5976
|
state.refreshAfter = Date.now() + AUTO_TRACE_POLICY_RETRY_MS;
|
|
@@ -6564,6 +6582,49 @@ var Bitfab = class {
|
|
|
6564
6582
|
} catch {
|
|
6565
6583
|
}
|
|
6566
6584
|
};
|
|
6585
|
+
const recordSpan = (result) => {
|
|
6586
|
+
if (options.finalize) {
|
|
6587
|
+
void self.httpClient.trackDeferred(
|
|
6588
|
+
Promise.resolve().then(() => options.finalize(result)).then((output) => sendSpan({ result: output })).catch(
|
|
6589
|
+
(error) => sendSpan({
|
|
6590
|
+
result: void 0,
|
|
6591
|
+
error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
|
|
6592
|
+
})
|
|
6593
|
+
)
|
|
6594
|
+
);
|
|
6595
|
+
} else {
|
|
6596
|
+
void sendSpan({ result });
|
|
6597
|
+
}
|
|
6598
|
+
};
|
|
6599
|
+
executeWithContext = () => {
|
|
6600
|
+
let result;
|
|
6601
|
+
try {
|
|
6602
|
+
result = fn.apply(this, args);
|
|
6603
|
+
} catch (error) {
|
|
6604
|
+
void sendSpan({
|
|
6605
|
+
result: void 0,
|
|
6606
|
+
error: error instanceof Error ? error.message : String(error)
|
|
6607
|
+
});
|
|
6608
|
+
throw error;
|
|
6609
|
+
}
|
|
6610
|
+
if (result instanceof Promise) {
|
|
6611
|
+
return result.then((resolvedResult) => {
|
|
6612
|
+
recordSpan(resolvedResult);
|
|
6613
|
+
return resolvedResult;
|
|
6614
|
+
}).catch((error) => {
|
|
6615
|
+
void sendSpan({
|
|
6616
|
+
result: void 0,
|
|
6617
|
+
error: error instanceof Error ? error.message : String(error)
|
|
6618
|
+
});
|
|
6619
|
+
throw error;
|
|
6620
|
+
});
|
|
6621
|
+
}
|
|
6622
|
+
if (isAsyncGenerator(result)) {
|
|
6623
|
+
return wrapAsyncGenerator(result, newStack, sendSpan);
|
|
6624
|
+
}
|
|
6625
|
+
recordSpan(result);
|
|
6626
|
+
return result;
|
|
6627
|
+
};
|
|
6567
6628
|
const replayCtxForMock = getReplayContext();
|
|
6568
6629
|
if (replayCtxForMock?.mockTree && !isRootSpan) {
|
|
6569
6630
|
const counters = replayCtxForMock.callCounters;
|
|
@@ -6622,6 +6683,7 @@ var Bitfab = class {
|
|
|
6622
6683
|
}
|
|
6623
6684
|
return output;
|
|
6624
6685
|
};
|
|
6686
|
+
const shouldMockWithBaseStrategy = replayCtxForMock.mockStrategy === "all" || replayCtxForMock.mockStrategy === "marked" && options.mockOnReplay === true;
|
|
6625
6687
|
if (replayCtxForMock.mockOverrides?.length) {
|
|
6626
6688
|
const nodeMeta = {
|
|
6627
6689
|
traceFunctionKey,
|
|
@@ -6629,28 +6691,75 @@ var Bitfab = class {
|
|
|
6629
6691
|
type: options.type ?? "custom",
|
|
6630
6692
|
originalSpanId: mockSpan?.sourceSpanId
|
|
6631
6693
|
};
|
|
6632
|
-
const
|
|
6633
|
-
|
|
6634
|
-
|
|
6635
|
-
|
|
6636
|
-
|
|
6637
|
-
|
|
6638
|
-
|
|
6639
|
-
|
|
6640
|
-
|
|
6641
|
-
|
|
6642
|
-
|
|
6694
|
+
const overrideCtx = {
|
|
6695
|
+
node: nodeMeta,
|
|
6696
|
+
inputs: args,
|
|
6697
|
+
getOriginalOutput: () => Promise.resolve(resolveRecordedOutput())
|
|
6698
|
+
};
|
|
6699
|
+
const resolveOverrideFrom = (startIndex) => {
|
|
6700
|
+
for (let index = startIndex; index < replayCtxForMock.mockOverrides.length; index += 1) {
|
|
6701
|
+
const override = replayCtxForMock.mockOverrides[index];
|
|
6702
|
+
if (!override?.match(nodeMeta)) {
|
|
6703
|
+
continue;
|
|
6704
|
+
}
|
|
6705
|
+
const injected = resolveMockValue(override.value, overrideCtx);
|
|
6706
|
+
if (injected instanceof Promise) {
|
|
6707
|
+
return injected.then(
|
|
6708
|
+
(output) => output === NO_MOCK_OVERRIDE ? resolveOverrideFrom(index + 1) : { matched: true, output }
|
|
6709
|
+
);
|
|
6710
|
+
}
|
|
6711
|
+
if (injected !== NO_MOCK_OVERRIDE) {
|
|
6712
|
+
return { matched: true, output: injected };
|
|
6713
|
+
}
|
|
6643
6714
|
}
|
|
6644
|
-
return
|
|
6715
|
+
return { matched: false };
|
|
6716
|
+
};
|
|
6717
|
+
const resolution = resolveOverrideFrom(0);
|
|
6718
|
+
if (resolution instanceof Promise) {
|
|
6719
|
+
if (!fnReturnsPromise) {
|
|
6720
|
+
throw new BitfabError(
|
|
6721
|
+
`Cannot resolve an asynchronous mock override for synchronous span "${traceFunctionKey}". Make the wrapped function async or return NO_MOCK_OVERRIDE synchronously.`
|
|
6722
|
+
);
|
|
6723
|
+
}
|
|
6724
|
+
return runWithSpanStack(newStack, async () => {
|
|
6725
|
+
const resolved = await resolution;
|
|
6726
|
+
if (resolved.matched) {
|
|
6727
|
+
void sendSpan({
|
|
6728
|
+
result: resolved.output,
|
|
6729
|
+
mocked: true,
|
|
6730
|
+
mockTarget: "output",
|
|
6731
|
+
mockSource: "override"
|
|
6732
|
+
});
|
|
6733
|
+
return resolved.output;
|
|
6734
|
+
}
|
|
6735
|
+
if (shouldMockWithBaseStrategy && !mockSpan) {
|
|
6736
|
+
throw new BitfabError(
|
|
6737
|
+
`Replay selected span "${traceFunctionKey}:${baseSpanParams.spanName}" for mocking, but recorded occurrence ${callIndex + 1} is unavailable. The real span was not executed.`
|
|
6738
|
+
);
|
|
6739
|
+
}
|
|
6740
|
+
if (shouldMockWithBaseStrategy) {
|
|
6741
|
+
const output = await resolveRecordedOutput();
|
|
6742
|
+
void sendSpan({
|
|
6743
|
+
result: output,
|
|
6744
|
+
mocked: true,
|
|
6745
|
+
mockTarget: "output",
|
|
6746
|
+
mockSource: "recorded"
|
|
6747
|
+
});
|
|
6748
|
+
return output;
|
|
6749
|
+
}
|
|
6750
|
+
return executeWithContext();
|
|
6751
|
+
});
|
|
6752
|
+
}
|
|
6753
|
+
if (resolution.matched) {
|
|
6754
|
+
return emitMock(resolution.output, "override");
|
|
6645
6755
|
}
|
|
6646
6756
|
}
|
|
6647
|
-
|
|
6648
|
-
if (shouldMock && !mockSpan) {
|
|
6757
|
+
if (shouldMockWithBaseStrategy && !mockSpan) {
|
|
6649
6758
|
throw new BitfabError(
|
|
6650
6759
|
`Replay selected span "${traceFunctionKey}:${baseSpanParams.spanName}" for mocking, but recorded occurrence ${callIndex + 1} is unavailable. The real span was not executed.`
|
|
6651
6760
|
);
|
|
6652
6761
|
}
|
|
6653
|
-
if (
|
|
6762
|
+
if (shouldMockWithBaseStrategy) {
|
|
6654
6763
|
const recorded = resolveRecordedOutput();
|
|
6655
6764
|
if (recorded instanceof Promise) {
|
|
6656
6765
|
return emitMockAsync(recorded, "recorded");
|
|
@@ -6658,49 +6767,6 @@ var Bitfab = class {
|
|
|
6658
6767
|
return emitMock(recorded, "recorded");
|
|
6659
6768
|
}
|
|
6660
6769
|
}
|
|
6661
|
-
const recordSpan = (result) => {
|
|
6662
|
-
if (options.finalize) {
|
|
6663
|
-
void self.httpClient.trackDeferred(
|
|
6664
|
-
Promise.resolve().then(() => options.finalize(result)).then((output) => sendSpan({ result: output })).catch(
|
|
6665
|
-
(error) => sendSpan({
|
|
6666
|
-
result: void 0,
|
|
6667
|
-
error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
|
|
6668
|
-
})
|
|
6669
|
-
)
|
|
6670
|
-
);
|
|
6671
|
-
} else {
|
|
6672
|
-
void sendSpan({ result });
|
|
6673
|
-
}
|
|
6674
|
-
};
|
|
6675
|
-
executeWithContext = () => {
|
|
6676
|
-
let result;
|
|
6677
|
-
try {
|
|
6678
|
-
result = fn.apply(this, args);
|
|
6679
|
-
} catch (error) {
|
|
6680
|
-
void sendSpan({
|
|
6681
|
-
result: void 0,
|
|
6682
|
-
error: error instanceof Error ? error.message : String(error)
|
|
6683
|
-
});
|
|
6684
|
-
throw error;
|
|
6685
|
-
}
|
|
6686
|
-
if (result instanceof Promise) {
|
|
6687
|
-
return result.then((resolvedResult) => {
|
|
6688
|
-
recordSpan(resolvedResult);
|
|
6689
|
-
return resolvedResult;
|
|
6690
|
-
}).catch((error) => {
|
|
6691
|
-
void sendSpan({
|
|
6692
|
-
result: void 0,
|
|
6693
|
-
error: error instanceof Error ? error.message : String(error)
|
|
6694
|
-
});
|
|
6695
|
-
throw error;
|
|
6696
|
-
});
|
|
6697
|
-
}
|
|
6698
|
-
if (isAsyncGenerator(result)) {
|
|
6699
|
-
return wrapAsyncGenerator(result, newStack, sendSpan);
|
|
6700
|
-
}
|
|
6701
|
-
recordSpan(result);
|
|
6702
|
-
return result;
|
|
6703
|
-
};
|
|
6704
6770
|
} catch (setupError) {
|
|
6705
6771
|
if (registeredTraceId) {
|
|
6706
6772
|
activeTraceStates.delete(registeredTraceId);
|
|
@@ -6987,8 +7053,40 @@ var Bitfab = class {
|
|
|
6987
7053
|
...params.mockSource && { mockSource: params.mockSource }
|
|
6988
7054
|
});
|
|
6989
7055
|
}
|
|
6990
|
-
registerMockOverride(
|
|
6991
|
-
|
|
7056
|
+
registerMockOverride(overrideOrResolverOrMatch, ...values) {
|
|
7057
|
+
let override;
|
|
7058
|
+
if (typeof overrideOrResolverOrMatch === "string") {
|
|
7059
|
+
const keyedOverride = values[0];
|
|
7060
|
+
if (values.length !== 1 || keyedOverride === void 0) {
|
|
7061
|
+
throw new BitfabError(
|
|
7062
|
+
"registerMockOverride(traceFunctionKey, override) requires a resolver function or { match, value } override."
|
|
7063
|
+
);
|
|
7064
|
+
}
|
|
7065
|
+
if (typeof keyedOverride === "function") {
|
|
7066
|
+
override = {
|
|
7067
|
+
match: (node) => node.traceFunctionKey === overrideOrResolverOrMatch,
|
|
7068
|
+
value: keyedOverride
|
|
7069
|
+
};
|
|
7070
|
+
} else if (typeof keyedOverride === "object" && keyedOverride !== null && "match" in keyedOverride && "value" in keyedOverride) {
|
|
7071
|
+
override = {
|
|
7072
|
+
match: (node) => node.traceFunctionKey === overrideOrResolverOrMatch && keyedOverride.match(node),
|
|
7073
|
+
value: keyedOverride.value
|
|
7074
|
+
};
|
|
7075
|
+
} else {
|
|
7076
|
+
throw new BitfabError(
|
|
7077
|
+
"registerMockOverride(traceFunctionKey, override) requires a resolver function or { match, value } override."
|
|
7078
|
+
);
|
|
7079
|
+
}
|
|
7080
|
+
} else if (typeof overrideOrResolverOrMatch !== "function") {
|
|
7081
|
+
override = overrideOrResolverOrMatch;
|
|
7082
|
+
} else if (values.length === 0) {
|
|
7083
|
+
override = { match: () => true, value: overrideOrResolverOrMatch };
|
|
7084
|
+
} else {
|
|
7085
|
+
override = {
|
|
7086
|
+
match: overrideOrResolverOrMatch,
|
|
7087
|
+
value: values[0]
|
|
7088
|
+
};
|
|
7089
|
+
}
|
|
6992
7090
|
this.mockOverrides.push(override);
|
|
6993
7091
|
}
|
|
6994
7092
|
/** Remove all overrides registered via {@link registerMockOverride}. */
|
|
@@ -7238,6 +7336,7 @@ var finalizers = {
|
|
|
7238
7336
|
|
|
7239
7337
|
// src/index.ts
|
|
7240
7338
|
init_http();
|
|
7339
|
+
init_mockOverride();
|
|
7241
7340
|
init_replay();
|
|
7242
7341
|
|
|
7243
7342
|
// src/replayRegistry.ts
|
|
@@ -7261,6 +7360,7 @@ function defineReplayRegistry(registry) {
|
|
|
7261
7360
|
DEFAULT_SERVICE_URL,
|
|
7262
7361
|
DbBranchReplayError,
|
|
7263
7362
|
HttpClient,
|
|
7363
|
+
NO_MOCK_OVERRIDE,
|
|
7264
7364
|
ReplayError,
|
|
7265
7365
|
SUPPORTED_PROVIDERS,
|
|
7266
7366
|
__version__,
|