bitfab 0.66.0 → 0.68.0
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-CQw0qMBt.cjs → autoTrace-BikML0lX.cjs} +86 -4
- package/dist/autoTrace-BikML0lX.cjs.map +1 -0
- package/dist/{autoTrace-O40k8f5M.js → autoTrace-CVt9EDyo.js} +75 -5
- package/dist/autoTrace-CVt9EDyo.js.map +1 -0
- package/dist/autoTrace.cjs +3 -1
- package/dist/autoTrace.d.cts +23 -0
- package/dist/autoTrace.d.ts +23 -0
- package/dist/autoTrace.js +1 -1
- package/dist/{babelPlugin-C70OxrqA.js → babelPlugin-a7ofCoOd.js} +83 -4
- package/dist/babelPlugin-a7ofCoOd.js.map +1 -0
- package/dist/{babelPlugin-Nta4-VcL.cjs → babelPlugin-s8EFjT6e.cjs} +83 -4
- package/dist/babelPlugin-s8EFjT6e.cjs.map +1 -0
- package/dist/{http-D91qP2J-.js → http-_cgR_DM2.js} +3 -3
- package/dist/{http-D91qP2J-.js.map → http-_cgR_DM2.js.map} +1 -1
- package/dist/{http-DIz8mEMq.cjs → http-psFF1ptn.cjs} +3 -3
- package/dist/{http-DIz8mEMq.cjs.map → http-psFF1ptn.cjs.map} +1 -1
- package/dist/{index-DiYFr-KV.d.cts → index-j7SrvOqe.d.cts} +44 -2
- package/dist/{index-DiYFr-KV.d.ts → index-j7SrvOqe.d.ts} +44 -2
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/node.cjs +3 -3
- package/dist/node.d.cts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +3 -3
- package/dist/registryCommand-Dk4Y1ZgW.js.map +1 -1
- package/dist/{src-CL5eQlNk.js → src-DyEKM7yn.js} +178 -14
- package/dist/src-DyEKM7yn.js.map +1 -0
- package/dist/{src-rJcHXJEz.cjs → src-Dze8o7iU.cjs} +178 -14
- package/dist/src-Dze8o7iU.cjs.map +1 -0
- package/dist/transform/babel.cjs +1 -1
- package/dist/transform/babel.d.cts +3 -0
- package/dist/transform/babel.d.ts +3 -0
- package/dist/transform/babel.js +1 -1
- package/dist/transform/loaderRuntime.cjs +2 -2
- package/dist/transform/loaderRuntime.js +2 -2
- package/dist/transform/nodeLoader.js +82 -3
- package/dist/transform/nodeLoader.js.map +1 -1
- package/dist/transform/swc.cjs +1 -1
- package/dist/transform/swc.js +1 -1
- package/dist/transform/unplugin.cjs +2 -2
- package/dist/transform/unplugin.js +2 -2
- package/dist/{transform-BjxHGGKc.cjs → transform-BBzrqpVH.cjs} +2 -2
- package/dist/{transform-BjxHGGKc.cjs.map → transform-BBzrqpVH.cjs.map} +1 -1
- package/dist/{transform-BcyUocwm.js → transform-DkcFn_tg.js} +2 -2
- package/dist/{transform-BcyUocwm.js.map → transform-DkcFn_tg.js.map} +1 -1
- package/package.json +2 -1
- package/dist/autoTrace-CQw0qMBt.cjs.map +0 -1
- package/dist/autoTrace-O40k8f5M.js.map +0 -1
- package/dist/babelPlugin-C70OxrqA.js.map +0 -1
- package/dist/babelPlugin-Nta4-VcL.cjs.map +0 -1
- package/dist/src-CL5eQlNk.js.map +0 -1
- package/dist/src-rJcHXJEz.cjs.map +0 -1
|
@@ -44,6 +44,11 @@ function functionName(path, types) {
|
|
|
44
44
|
const { line, column } = sourcePosition(path);
|
|
45
45
|
return `anonymous-${line}-${column}`;
|
|
46
46
|
}
|
|
47
|
+
const JEV_METHOD = "systemOne";
|
|
48
|
+
function isJevMethodDefinition(path, types) {
|
|
49
|
+
const parent = path.parentPath?.node;
|
|
50
|
+
return (types.isClassMethod(path.node) || types.isObjectMethod(path.node) || types.isObjectProperty(parent) || types.isClassProperty(parent)) && functionName(path, types) === JEV_METHOD;
|
|
51
|
+
}
|
|
47
52
|
function isInstrumentableFunction(node, types) {
|
|
48
53
|
if (node.generator || types.isClassPrivateMethod(node)) return false;
|
|
49
54
|
return !(types.isClassMethod(node) || types.isObjectMethod(node)) || node.kind === "method";
|
|
@@ -105,6 +110,24 @@ function withNodeFunctionName(path, types) {
|
|
|
105
110
|
if (types.isFunctionExpression(fn) && fn.id) return fn.id.name;
|
|
106
111
|
return null;
|
|
107
112
|
}
|
|
113
|
+
const BAML_GENERATED_HEADER = "This file was generated by BAML";
|
|
114
|
+
const BAML_CLIENT_CLASSES = /* @__PURE__ */ new Set(["BamlAsyncClient", "BamlSyncClient"]);
|
|
115
|
+
const BAML_OPTIONS_PARAMETER = "__baml_options__";
|
|
116
|
+
function isBamlGeneratedSource(code) {
|
|
117
|
+
return code.slice(0, 4096).includes(BAML_GENERATED_HEADER);
|
|
118
|
+
}
|
|
119
|
+
function isBamlClientMethod(path, types) {
|
|
120
|
+
const node = path.node;
|
|
121
|
+
if (!types.isClassMethod(node) || node.kind !== "method" || node.static) return false;
|
|
122
|
+
const classPath = path.parentPath?.parentPath;
|
|
123
|
+
if (!classPath || !(classPath.isClassDeclaration() || classPath.isClassExpression()) || !classPath.node.id || !BAML_CLIENT_CLASSES.has(classPath.node.id.name)) return false;
|
|
124
|
+
const parameters = runtimeParameters(node, types);
|
|
125
|
+
const last = parameters[parameters.length - 1];
|
|
126
|
+
return types.isIdentifier(last, { name: BAML_OPTIONS_PARAMETER });
|
|
127
|
+
}
|
|
128
|
+
function bamlOptionsDeclaration(callerOptions, withCollector, types) {
|
|
129
|
+
return types.variableDeclaration("const", [types.variableDeclarator(types.identifier(BAML_OPTIONS_PARAMETER), types.conditionalExpression(types.binaryExpression("===", types.cloneNode(withCollector), types.identifier("undefined")), types.cloneNode(callerOptions), types.callExpression(types.cloneNode(withCollector), [types.cloneNode(callerOptions), types.memberExpression(types.thisExpression(), types.identifier("bamlOptions"))])))]);
|
|
130
|
+
}
|
|
108
131
|
function runtimeParameters(node, types) {
|
|
109
132
|
return node.params.filter((parameter) => !types.isIdentifier(parameter, { name: "this" }));
|
|
110
133
|
}
|
|
@@ -128,6 +151,44 @@ function isRestWrapper(path, types) {
|
|
|
128
151
|
const parameters = runtimeParameters(path.node, types);
|
|
129
152
|
return parameters.length === 1 && types.isRestElement(parameters[0]);
|
|
130
153
|
}
|
|
154
|
+
function jevReceiver(node, types) {
|
|
155
|
+
const callee = node.callee;
|
|
156
|
+
if (!(types.isMemberExpression(callee) || types.isOptionalMemberExpression(callee)) || callee.computed || !types.isIdentifier(callee.property, { name: JEV_METHOD }) || types.isSuper(callee.object)) return null;
|
|
157
|
+
return callee.object;
|
|
158
|
+
}
|
|
159
|
+
function isOptionalChain(node, types) {
|
|
160
|
+
return types.isOptionalMemberExpression(node) || types.isOptionalCallExpression(node);
|
|
161
|
+
}
|
|
162
|
+
function continuesOptionalChain(path, types) {
|
|
163
|
+
const parent = path.parent;
|
|
164
|
+
return types.isOptionalMemberExpression(parent) && parent.object === path.node || types.isOptionalCallExpression(parent) && parent.callee === path.node;
|
|
165
|
+
}
|
|
166
|
+
function rewriteJevCall(path, state, types) {
|
|
167
|
+
if (state.skipFile || state.bamlGenerated || !state.jevIdentifier) return;
|
|
168
|
+
const node = path.node;
|
|
169
|
+
const receiver = jevReceiver(node, types);
|
|
170
|
+
if (receiver === null) return;
|
|
171
|
+
const optionalReceiver = types.isOptionalMemberExpression(node.callee) && node.callee.optional;
|
|
172
|
+
const optionalMethod = types.isOptionalCallExpression(node) && node.optional;
|
|
173
|
+
if (types.isOptionalCallExpression(node)) {
|
|
174
|
+
if (continuesOptionalChain(path, types) || !optionalReceiver && isOptionalChain(receiver, types)) return;
|
|
175
|
+
}
|
|
176
|
+
const guarded = optionalReceiver || optionalMethod;
|
|
177
|
+
const receiverReference = guarded && !path.scope.isStatic(receiver) ? path.scope.generateDeclaredUidIdentifier("bitfabJevReceiver") : null;
|
|
178
|
+
const receiverValue = () => receiverReference === null ? types.cloneNode(receiver) : types.cloneNode(receiverReference);
|
|
179
|
+
const call = types.callExpression(types.cloneNode(state.jevIdentifier), [receiverValue(), ...node.arguments]);
|
|
180
|
+
state.usedRuntime = true;
|
|
181
|
+
state.usedJev = true;
|
|
182
|
+
if (!guarded) {
|
|
183
|
+
path.replaceWith(call);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const firstReceiver = receiverReference === null ? types.cloneNode(receiver) : types.assignmentExpression("=", types.cloneNode(receiverReference), receiver);
|
|
187
|
+
const missing = (value) => types.binaryExpression("==", value, types.nullLiteral());
|
|
188
|
+
const methodOf = (value) => types.memberExpression(value, types.identifier(JEV_METHOD));
|
|
189
|
+
const test = optionalReceiver ? optionalMethod ? types.logicalExpression("||", missing(firstReceiver), missing(methodOf(receiverValue()))) : missing(firstReceiver) : missing(methodOf(firstReceiver));
|
|
190
|
+
path.replaceWith(types.conditionalExpression(test, types.unaryExpression("void", types.numericLiteral(0)), call));
|
|
191
|
+
}
|
|
131
192
|
function bitfabBabelPlugin(api) {
|
|
132
193
|
const { types } = api;
|
|
133
194
|
return {
|
|
@@ -139,9 +200,12 @@ function bitfabBabelPlugin(api) {
|
|
|
139
200
|
state.runtimeIdentifier = path.scope.generateUidIdentifier("bitfabAutoSpan");
|
|
140
201
|
state.activeIdentifier = path.scope.generateUidIdentifier("bitfabAutoTraceActive");
|
|
141
202
|
state.wrapperIdentifier = path.scope.generateUidIdentifier("bitfabAutoWrap");
|
|
203
|
+
state.jevIdentifier = path.scope.generateUidIdentifier("bitfabAutoJev");
|
|
204
|
+
state.bamlGenerated = isBamlGeneratedSource(state.file.code ?? "");
|
|
142
205
|
state.definitions = [];
|
|
143
206
|
state.usedRuntime = false;
|
|
144
207
|
state.usedWrapper = false;
|
|
208
|
+
state.usedJev = false;
|
|
145
209
|
},
|
|
146
210
|
exit(path, state) {
|
|
147
211
|
if (state.skipFile || !state.usedRuntime || !state.runtimeIdentifier || !state.activeIdentifier || !state.wrapperIdentifier) return;
|
|
@@ -150,7 +214,8 @@ function bitfabBabelPlugin(api) {
|
|
|
150
214
|
types.importDeclaration([
|
|
151
215
|
types.importSpecifier(state.runtimeIdentifier, types.identifier("__bitfabAutoSpan")),
|
|
152
216
|
types.importSpecifier(state.activeIdentifier, types.identifier("__bitfabAutoTraceActive")),
|
|
153
|
-
...state.usedWrapper ? [types.importSpecifier(state.wrapperIdentifier, types.identifier("__bitfabAutoWrap"))] : []
|
|
217
|
+
...state.usedWrapper ? [types.importSpecifier(state.wrapperIdentifier, types.identifier("__bitfabAutoWrap"))] : [],
|
|
218
|
+
...state.usedJev && state.jevIdentifier ? [types.importSpecifier(state.jevIdentifier, types.identifier("__bitfabAutoJev"))] : []
|
|
154
219
|
], types.stringLiteral(state.opts.runtimeModule ?? "bitfab/auto")),
|
|
155
220
|
types.variableDeclaration("const", [types.variableDeclarator(types.identifier(AUTO_TRACE_TRANSFORM_MARKER), types.assignmentExpression("=", types.memberExpression(types.identifier("globalThis"), types.identifier(AUTO_TRACE_TRANSFORM_MARKER)), types.booleanLiteral(true)))]),
|
|
156
221
|
...state.definitions ?? []
|
|
@@ -159,14 +224,24 @@ function bitfabBabelPlugin(api) {
|
|
|
159
224
|
},
|
|
160
225
|
CallExpression: { exit(path, state) {
|
|
161
226
|
if (state.skipFile) return;
|
|
227
|
+
if (jevReceiver(path.node, types) !== null) {
|
|
228
|
+
rewriteJevCall(path, state, types);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
162
231
|
const configuredName = withNodeFunctionName(path, types);
|
|
163
232
|
if (configuredName === null) return;
|
|
164
233
|
if (path.node.arguments.length === 1) path.node.arguments.push(types.identifier("undefined"));
|
|
165
234
|
path.node.arguments.push(types.stringLiteral(configuredName));
|
|
166
235
|
} },
|
|
236
|
+
OptionalCallExpression: { exit(path, state) {
|
|
237
|
+
rewriteJevCall(path, state, types);
|
|
238
|
+
} },
|
|
167
239
|
Function: { exit(path, state) {
|
|
168
240
|
const node = path.node;
|
|
169
241
|
if (state.skipFile || node._bitfabInstrumented || !isInstrumentableFunction(node, types) || isTraceDecoratorRoot(path, types) || !state.runtimeIdentifier || !state.activeIdentifier || !state.wrapperIdentifier) return;
|
|
242
|
+
const bamlMethod = state.bamlGenerated === true && isBamlClientMethod(path, types);
|
|
243
|
+
if (state.bamlGenerated && !bamlMethod) return;
|
|
244
|
+
if (isJevMethodDefinition(path, types)) return;
|
|
170
245
|
const name = qualifiedFunctionName(path, types);
|
|
171
246
|
if (name.startsWith("anonymous-")) return;
|
|
172
247
|
const normalizedFilename = autoTraceFilename(state.file.opts.filename ?? "unknown", state.opts.cwd ?? state.file.opts.cwd ?? process.cwd());
|
|
@@ -178,6 +253,7 @@ function bitfabBabelPlugin(api) {
|
|
|
178
253
|
types.objectProperty(types.identifier("line"), types.numericLiteral(line)),
|
|
179
254
|
types.objectProperty(types.identifier("column"), types.numericLiteral(column)),
|
|
180
255
|
...node.async ? [types.objectProperty(types.identifier("async"), types.booleanLiteral(true))] : [],
|
|
256
|
+
...bamlMethod ? [types.objectProperty(types.identifier("baml"), types.booleanLiteral(true))] : [],
|
|
181
257
|
...isRestWrapper(path, types) ? [types.objectProperty(types.identifier("wrapper"), types.booleanLiteral(true))] : []
|
|
182
258
|
]);
|
|
183
259
|
const definitionIdentifier = path.scope.getProgramParent().generateUidIdentifier("bitfabAutoDefinition");
|
|
@@ -192,10 +268,13 @@ function bitfabBabelPlugin(api) {
|
|
|
192
268
|
const originalBody = types.isBlockStatement(node.body) ? node.body : types.blockStatement([types.returnStatement(node.body)]);
|
|
193
269
|
const directives = originalBody.directives;
|
|
194
270
|
originalBody.directives = [];
|
|
195
|
-
|
|
271
|
+
const callerOptions = bamlMethod ? path.scope.generateUidIdentifier("bitfabBamlOptions") : void 0;
|
|
272
|
+
const withCollector = bamlMethod ? path.scope.generateUidIdentifier("bitfabBamlWithCollector") : void 0;
|
|
273
|
+
const tracedBody = callerOptions && withCollector ? types.blockStatement([bamlOptionsDeclaration(callerOptions, withCollector, types), ...types.cloneNode(originalBody, true).body], []) : types.cloneNode(originalBody, true);
|
|
274
|
+
node.body = types.blockStatement([types.ifStatement(types.callExpression(types.cloneNode(state.activeIdentifier), []), types.blockStatement([...callerOptions ? [types.variableDeclaration("const", [types.variableDeclarator(callerOptions, types.identifier(BAML_OPTIONS_PARAMETER))])] : [], types.returnStatement(types.callExpression(types.cloneNode(state.runtimeIdentifier), [
|
|
196
275
|
types.cloneNode(definitionIdentifier),
|
|
197
276
|
parameterInputs(path, types),
|
|
198
|
-
types.arrowFunctionExpression([
|
|
277
|
+
types.arrowFunctionExpression(withCollector ? [types.cloneNode(withCollector)] : [], tracedBody, node.async ?? false)
|
|
199
278
|
]))])), ...originalBody.body], directives);
|
|
200
279
|
node._bitfabInstrumented = true;
|
|
201
280
|
state.usedRuntime = true;
|
|
@@ -206,4 +285,4 @@ function bitfabBabelPlugin(api) {
|
|
|
206
285
|
//#endregion
|
|
207
286
|
export { sourceFilename as i, AUTO_TRACE_TRANSFORM_MARKER as n, shouldTransformBitfabFile as r, bitfabBabelPlugin as t };
|
|
208
287
|
|
|
209
|
-
//# sourceMappingURL=babelPlugin-
|
|
288
|
+
//# sourceMappingURL=babelPlugin-a7ofCoOd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babelPlugin-a7ofCoOd.js","names":[],"sources":["../../bitfab-typescript-transform/src/transformOptions.ts","../../bitfab-typescript-transform/src/babelPlugin.ts"],"sourcesContent":["export interface BitfabTransformOptions {\n /** Module that exports the automatic span runtime. */\n runtimeModule?: string\n /** Working directory removed from generated function IDs. */\n cwd?: string\n /** Return false to leave a file unchanged. */\n include?: (filename: string) => boolean\n}\n\nconst AUTO_TRACE_FUNCTION_ID_VERSION = \"ts-auto-v1\"\nexport const AUTO_TRACE_TRANSFORM_MARKER =\n \"__bitfab_auto_trace_transformed_v1__\"\n\nexport function autoTraceFunctionId(file: string, name: string): string {\n return `${AUTO_TRACE_FUNCTION_ID_VERSION}:${file}#${name}`\n}\n\nexport function sourceFilename(filename: string): string {\n return filename.replace(/\\\\/g, \"/\").split(/[?#]/, 1)[0] ?? \"\"\n}\n\nexport function autoTraceFilename(filename: string, cwd: string): string {\n const normalized = sourceFilename(filename)\n const normalizedCwd = cwd.replace(/\\\\/g, \"/\").replace(/\\/$/, \"\")\n return normalized.startsWith(`${normalizedCwd}/`)\n ? normalized.slice(normalizedCwd.length + 1)\n : normalized\n}\n\nexport function shouldTransformBitfabFile(\n filename: string,\n options: BitfabTransformOptions,\n): boolean {\n if (!filename) {\n return false\n }\n if (options.include && !options.include(filename)) {\n return false\n }\n\n const normalized = sourceFilename(filename)\n const normalizedCwd = options.cwd?.replace(/\\\\/g, \"/\").replace(/\\/$/, \"\")\n const isAbsolute =\n normalized.startsWith(\"/\") || /^[A-Za-z]:\\//.test(normalized)\n if (\n normalizedCwd &&\n isAbsolute &&\n normalized !== normalizedCwd &&\n !normalized.startsWith(`${normalizedCwd}/`)\n ) {\n return false\n }\n return (\n !normalized.includes(\"/node_modules/\") &&\n !normalized.endsWith(\".d.ts\") &&\n /\\.[cm]?[jt]sx?$/.test(normalized)\n )\n}\n","import type { NodePath, PluginObject, PluginPass } from \"@babel/core\"\nimport type * as BabelTypes from \"@babel/types\"\nimport type { BitfabTransformOptions } from \"./transformOptions.js\"\nimport {\n AUTO_TRACE_TRANSFORM_MARKER,\n autoTraceFilename,\n autoTraceFunctionId,\n shouldTransformBitfabFile,\n} from \"./transformOptions.js\"\n\ntype BabelTypesApi = typeof BabelTypes\n\ntype BitfabPluginOptions = BitfabTransformOptions\n\ninterface BitfabPluginState extends PluginPass {\n opts: BitfabPluginOptions\n runtimeIdentifier?: ReturnType<BabelTypesApi[\"identifier\"]>\n activeIdentifier?: ReturnType<BabelTypesApi[\"identifier\"]>\n wrapperIdentifier?: ReturnType<BabelTypesApi[\"identifier\"]>\n jevIdentifier?: ReturnType<BabelTypesApi[\"identifier\"]>\n definitions?: Array<ReturnType<BabelTypesApi[\"variableDeclaration\"]>>\n skipFile?: boolean\n bamlGenerated?: boolean\n usedRuntime?: boolean\n usedWrapper?: boolean\n usedJev?: boolean\n}\n\ninterface InstrumentedFunction {\n _bitfabInstrumented?: boolean\n}\n\nfunction propertyName(\n node: BabelTypes.Node | null | undefined,\n types: BabelTypesApi,\n): string | null {\n if (types.isIdentifier(node)) {\n return node.name\n }\n if (types.isStringLiteral(node)) {\n return node.value\n }\n return null\n}\n\nfunction functionName(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): string {\n const node = path.node\n if (types.isFunctionDeclaration(node) || types.isFunctionExpression(node)) {\n if (node.id) {\n return node.id.name\n }\n }\n\n if (\n (types.isClassMethod(node) || types.isObjectMethod(node)) &&\n !node.computed &&\n types.isIdentifier(node.key)\n ) {\n return node.key.name\n }\n\n const parent = path.parentPath?.node\n if (types.isVariableDeclarator(parent)) {\n return propertyName(parent.id, types) ?? \"anonymous\"\n }\n if (types.isObjectProperty(parent) && !parent.computed) {\n return propertyName(parent.key, types) ?? \"anonymous\"\n }\n if (types.isClassProperty(parent) && !parent.computed) {\n const name = propertyName(parent.key, types)\n if (name) {\n return name\n }\n }\n\n const { line, column } = sourcePosition(path)\n return `anonymous-${line}-${column}`\n}\n\nconst JEV_METHOD = \"systemOne\"\n\nfunction isJevMethodDefinition(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n const parent = path.parentPath?.node\n const isMethod =\n types.isClassMethod(path.node) ||\n types.isObjectMethod(path.node) ||\n types.isObjectProperty(parent) ||\n types.isClassProperty(parent)\n return isMethod && functionName(path, types) === JEV_METHOD\n}\n\nfunction isInstrumentableFunction(\n node: BabelTypes.Function,\n types: BabelTypesApi,\n): boolean {\n if (node.generator || types.isClassPrivateMethod(node)) {\n return false\n }\n return (\n !(types.isClassMethod(node) || types.isObjectMethod(node)) ||\n node.kind === \"method\"\n )\n}\n\nfunction sourcePosition(path: NodePath<BabelTypes.Function>): {\n line: number\n column: number\n} {\n const exportDeclaration = path.parentPath?.isExportDeclaration()\n ? path.parentPath.node\n : undefined\n const start = (exportDeclaration ?? path.node).loc?.start\n return { line: start?.line ?? 0, column: start?.column ?? 0 }\n}\n\nfunction qualifiedFunctionName(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): string {\n const ownName = functionName(path, types)\n if (ownName.startsWith(\"anonymous-\")) {\n return ownName\n }\n const scopes: string[] = []\n let ancestor: NodePath | null = path.parentPath\n while (ancestor) {\n if (ancestor.isFunction()) {\n if (!isInstrumentableFunction(ancestor.node, types)) {\n ancestor = ancestor.parentPath\n continue\n }\n const name = functionName(\n ancestor as NodePath<BabelTypes.Function>,\n types,\n )\n if (!name.startsWith(\"anonymous-\")) {\n scopes.unshift(name)\n }\n } else if (\n (ancestor.isClassDeclaration() || ancestor.isClassExpression()) &&\n ancestor.node.id\n ) {\n scopes.unshift(ancestor.node.id.name)\n } else if (ancestor.isObjectExpression()) {\n const parent = ancestor.parentPath?.node\n if (types.isVariableDeclarator(parent)) {\n const name = propertyName(parent.id, types)\n if (name) {\n scopes.unshift(name)\n }\n } else if (types.isObjectProperty(parent) && !parent.computed) {\n const name = propertyName(parent.key, types)\n if (name) {\n scopes.unshift(name)\n }\n }\n }\n ancestor = ancestor.parentPath\n }\n return [...scopes, ownName].join(\".\")\n}\n\nfunction isTraceDecoratorRoot(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n const node = path.node\n const parent = path.parentPath?.node\n const decorated =\n types.isClassMethod(node) || types.isClassPrivateMethod(node)\n ? node\n : types.isClassProperty(parent) && parent.value === node\n ? parent\n : null\n if (!decorated) {\n return false\n }\n\n return (\n decorated.decorators?.some((decorator) => {\n const expression = decorator.expression\n if (!types.isCallExpression(expression)) {\n return false\n }\n const callee = expression.callee\n return (\n types.isMemberExpression(callee) &&\n !callee.computed &&\n types.isIdentifier(callee.property, { name: \"trace\" })\n )\n }) ?? false\n )\n}\n\nfunction withNodeFunctionName(\n path: NodePath<BabelTypes.CallExpression>,\n types: BabelTypesApi,\n): string | null {\n if (path.node.arguments.length > 2) {\n return null\n }\n const callee = path.node.callee\n if (\n !types.isMemberExpression(callee) ||\n callee.computed ||\n !types.isIdentifier(callee.property, { name: \"withNode\" })\n ) {\n return null\n }\n const fn = path.node.arguments[path.node.arguments.length - 1]\n if (types.isIdentifier(fn)) {\n return fn.name\n }\n if (types.isMemberExpression(fn) && !fn.computed) {\n return propertyName(fn.property, types)\n }\n if (types.isFunctionExpression(fn) && fn.id) {\n return fn.id.name\n }\n return null\n}\n\nconst BAML_GENERATED_HEADER = \"This file was generated by BAML\"\nconst BAML_CLIENT_CLASSES = new Set([\"BamlAsyncClient\", \"BamlSyncClient\"])\nconst BAML_OPTIONS_PARAMETER = \"__baml_options__\"\n\nfunction isBamlGeneratedSource(code: string): boolean {\n return code.slice(0, 4096).includes(BAML_GENERATED_HEADER)\n}\n\nfunction isBamlClientMethod(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n const node = path.node\n if (!types.isClassMethod(node) || node.kind !== \"method\" || node.static) {\n return false\n }\n const classPath = path.parentPath?.parentPath\n if (\n !classPath ||\n !(classPath.isClassDeclaration() || classPath.isClassExpression()) ||\n !classPath.node.id ||\n !BAML_CLIENT_CLASSES.has(classPath.node.id.name)\n ) {\n return false\n }\n const parameters = runtimeParameters(node, types)\n const last = parameters[parameters.length - 1]\n return types.isIdentifier(last, { name: BAML_OPTIONS_PARAMETER })\n}\n\nfunction bamlOptionsDeclaration(\n callerOptions: BabelTypes.Identifier,\n withCollector: BabelTypes.Identifier,\n types: BabelTypesApi,\n): BabelTypes.VariableDeclaration {\n return types.variableDeclaration(\"const\", [\n types.variableDeclarator(\n types.identifier(BAML_OPTIONS_PARAMETER),\n types.conditionalExpression(\n types.binaryExpression(\n \"===\",\n types.cloneNode(withCollector),\n types.identifier(\"undefined\"),\n ),\n types.cloneNode(callerOptions),\n types.callExpression(types.cloneNode(withCollector), [\n types.cloneNode(callerOptions),\n types.memberExpression(\n types.thisExpression(),\n types.identifier(\"bamlOptions\"),\n ),\n ]),\n ),\n ),\n ])\n}\n\nfunction runtimeParameters(\n node: BabelTypes.Function,\n types: BabelTypesApi,\n): BabelTypes.Function[\"params\"] {\n return node.params.filter(\n (parameter) => !types.isIdentifier(parameter, { name: \"this\" }),\n )\n}\n\nfunction parameterInputs(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): ReturnType<BabelTypesApi[\"arrayExpression\"]> {\n const elements: Array<BabelTypes.Expression | BabelTypes.SpreadElement> = []\n\n for (const [index, parameter] of runtimeParameters(\n path.node,\n types,\n ).entries()) {\n if (!types.isArrowFunctionExpression(path.node)) {\n if (types.isRestElement(parameter)) {\n elements.push(\n types.spreadElement(\n types.callExpression(\n types.memberExpression(\n types.arrayExpression([\n types.spreadElement(types.identifier(\"arguments\")),\n ]),\n types.identifier(\"slice\"),\n ),\n [types.numericLiteral(index)],\n ),\n ),\n )\n } else {\n elements.push(\n types.memberExpression(\n types.identifier(\"arguments\"),\n types.numericLiteral(index),\n true,\n ),\n )\n }\n continue\n }\n\n if (types.isIdentifier(parameter)) {\n elements.push(types.identifier(parameter.name))\n } else if (\n types.isRestElement(parameter) &&\n types.isIdentifier(parameter.argument)\n ) {\n elements.push(\n types.spreadElement(types.identifier(parameter.argument.name)),\n )\n }\n }\n\n return types.arrayExpression(elements)\n}\n\nfunction needsArgumentWrapper(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n return (\n types.isArrowFunctionExpression(path.node) &&\n path.node.params.some(\n (parameter) =>\n !types.isIdentifier(parameter) &&\n !(\n types.isRestElement(parameter) &&\n types.isIdentifier(parameter.argument)\n ),\n )\n )\n}\n\nfunction isRestWrapper(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n const parameters = runtimeParameters(path.node, types)\n return parameters.length === 1 && types.isRestElement(parameters[0])\n}\n\ntype JevCallNode = BabelTypes.CallExpression | BabelTypes.OptionalCallExpression\n\nfunction jevReceiver(\n node: JevCallNode,\n types: BabelTypesApi,\n): BabelTypes.Expression | null {\n const callee = node.callee\n if (\n !(\n types.isMemberExpression(callee) ||\n types.isOptionalMemberExpression(callee)\n ) ||\n callee.computed ||\n !types.isIdentifier(callee.property, { name: JEV_METHOD }) ||\n types.isSuper(callee.object)\n ) {\n return null\n }\n return callee.object\n}\n\nfunction isOptionalChain(node: BabelTypes.Node, types: BabelTypesApi): boolean {\n return (\n types.isOptionalMemberExpression(node) ||\n types.isOptionalCallExpression(node)\n )\n}\n\nfunction continuesOptionalChain(\n path: NodePath<BabelTypes.OptionalCallExpression>,\n types: BabelTypesApi,\n): boolean {\n const parent = path.parent\n return (\n (types.isOptionalMemberExpression(parent) && parent.object === path.node) ||\n (types.isOptionalCallExpression(parent) && parent.callee === path.node)\n )\n}\n\nfunction rewriteJevCall(\n path: NodePath<JevCallNode>,\n state: BitfabPluginState,\n types: BabelTypesApi,\n): void {\n if (state.skipFile || state.bamlGenerated || !state.jevIdentifier) {\n return\n }\n const node = path.node\n const receiver = jevReceiver(node, types)\n if (receiver === null) {\n return\n }\n const optionalReceiver =\n types.isOptionalMemberExpression(node.callee) && node.callee.optional\n const optionalMethod = types.isOptionalCallExpression(node) && node.optional\n if (types.isOptionalCallExpression(node)) {\n if (\n continuesOptionalChain(\n path as NodePath<BabelTypes.OptionalCallExpression>,\n types,\n ) ||\n (!optionalReceiver && isOptionalChain(receiver, types))\n ) {\n return\n }\n }\n const guarded = optionalReceiver || optionalMethod\n const receiverReference =\n guarded && !path.scope.isStatic(receiver)\n ? path.scope.generateDeclaredUidIdentifier(\"bitfabJevReceiver\")\n : null\n const receiverValue = (): BabelTypes.Expression =>\n receiverReference === null\n ? types.cloneNode(receiver)\n : types.cloneNode(receiverReference)\n const call = types.callExpression(types.cloneNode(state.jevIdentifier), [\n receiverValue(),\n ...node.arguments,\n ])\n state.usedRuntime = true\n state.usedJev = true\n if (!guarded) {\n path.replaceWith(call)\n return\n }\n const firstReceiver =\n receiverReference === null\n ? types.cloneNode(receiver)\n : types.assignmentExpression(\n \"=\",\n types.cloneNode(receiverReference),\n receiver,\n )\n const missing = (value: BabelTypes.Expression): BabelTypes.BinaryExpression =>\n types.binaryExpression(\"==\", value, types.nullLiteral())\n const methodOf = (value: BabelTypes.Expression): BabelTypes.Expression =>\n types.memberExpression(value, types.identifier(JEV_METHOD))\n const test = optionalReceiver\n ? optionalMethod\n ? types.logicalExpression(\n \"||\",\n missing(firstReceiver),\n missing(methodOf(receiverValue())),\n )\n : missing(firstReceiver)\n : missing(methodOf(firstReceiver))\n path.replaceWith(\n types.conditionalExpression(\n test,\n types.unaryExpression(\"void\", types.numericLiteral(0)),\n call,\n ),\n )\n}\n\n/**\n * Babel adapter for Bitfab's experimental automatic call-span runtime.\n *\n * @experimental The transform protocol and generated function identities may\n * change before the feature is stable.\n */\nexport default function bitfabBabelPlugin(api: {\n types: BabelTypesApi\n}): PluginObject<BitfabPluginState> {\n const { types } = api\n\n return {\n name: \"bitfab-auto-trace\",\n visitor: {\n Program: {\n enter(path: NodePath<BabelTypes.Program>, state: BitfabPluginState) {\n const filename = state.file.opts.filename ?? \"unknown\"\n state.skipFile =\n !shouldTransformBitfabFile(filename, state.opts) ||\n path.scope.hasBinding(AUTO_TRACE_TRANSFORM_MARKER) ||\n path.node.directives.some(\n (directive) => directive.value.value === \"use client\",\n )\n state.runtimeIdentifier =\n path.scope.generateUidIdentifier(\"bitfabAutoSpan\")\n state.activeIdentifier = path.scope.generateUidIdentifier(\n \"bitfabAutoTraceActive\",\n )\n state.wrapperIdentifier =\n path.scope.generateUidIdentifier(\"bitfabAutoWrap\")\n state.jevIdentifier =\n path.scope.generateUidIdentifier(\"bitfabAutoJev\")\n state.bamlGenerated = isBamlGeneratedSource(state.file.code ?? \"\")\n state.definitions = []\n state.usedRuntime = false\n state.usedWrapper = false\n state.usedJev = false\n },\n exit(path: NodePath<BabelTypes.Program>, state: BitfabPluginState) {\n if (\n state.skipFile ||\n !state.usedRuntime ||\n !state.runtimeIdentifier ||\n !state.activeIdentifier ||\n !state.wrapperIdentifier\n ) {\n return\n }\n\n state.file.metadata[AUTO_TRACE_TRANSFORM_MARKER] = true\n path.unshiftContainer(\"body\", [\n types.importDeclaration(\n [\n types.importSpecifier(\n state.runtimeIdentifier,\n types.identifier(\"__bitfabAutoSpan\"),\n ),\n types.importSpecifier(\n state.activeIdentifier,\n types.identifier(\"__bitfabAutoTraceActive\"),\n ),\n ...(state.usedWrapper\n ? [\n types.importSpecifier(\n state.wrapperIdentifier,\n types.identifier(\"__bitfabAutoWrap\"),\n ),\n ]\n : []),\n ...(state.usedJev && state.jevIdentifier\n ? [\n types.importSpecifier(\n state.jevIdentifier,\n types.identifier(\"__bitfabAutoJev\"),\n ),\n ]\n : []),\n ],\n types.stringLiteral(\n state.opts.runtimeModule ?? \"bitfab/auto\",\n ),\n ),\n types.variableDeclaration(\"const\", [\n types.variableDeclarator(\n types.identifier(AUTO_TRACE_TRANSFORM_MARKER),\n types.assignmentExpression(\n \"=\",\n types.memberExpression(\n types.identifier(\"globalThis\"),\n types.identifier(AUTO_TRACE_TRANSFORM_MARKER),\n ),\n types.booleanLiteral(true),\n ),\n ),\n ]),\n ...(state.definitions ?? []),\n ])\n },\n },\n CallExpression: {\n exit(\n path: NodePath<BabelTypes.CallExpression>,\n state: BitfabPluginState,\n ) {\n if (state.skipFile) {\n return\n }\n if (jevReceiver(path.node, types) !== null) {\n rewriteJevCall(path, state, types)\n return\n }\n const configuredName = withNodeFunctionName(path, types)\n if (configuredName === null) {\n return\n }\n if (path.node.arguments.length === 1) {\n path.node.arguments.push(types.identifier(\"undefined\"))\n }\n path.node.arguments.push(types.stringLiteral(configuredName))\n },\n },\n OptionalCallExpression: {\n exit(\n path: NodePath<BabelTypes.OptionalCallExpression>,\n state: BitfabPluginState,\n ) {\n rewriteJevCall(path, state, types)\n },\n },\n Function: {\n exit(path: NodePath<BabelTypes.Function>, state: BitfabPluginState) {\n const node = path.node as typeof path.node & InstrumentedFunction\n if (\n state.skipFile ||\n node._bitfabInstrumented ||\n !isInstrumentableFunction(node, types) ||\n isTraceDecoratorRoot(path, types) ||\n !state.runtimeIdentifier ||\n !state.activeIdentifier ||\n !state.wrapperIdentifier\n ) {\n return\n }\n const bamlMethod =\n state.bamlGenerated === true && isBamlClientMethod(path, types)\n if (state.bamlGenerated && !bamlMethod) {\n return\n }\n if (isJevMethodDefinition(path, types)) {\n return\n }\n const name = qualifiedFunctionName(path, types)\n if (name.startsWith(\"anonymous-\")) {\n return\n }\n const normalizedFilename = autoTraceFilename(\n state.file.opts.filename ?? \"unknown\",\n state.opts.cwd ?? state.file.opts.cwd ?? process.cwd(),\n )\n const { line, column } = sourcePosition(path)\n const definition = types.objectExpression([\n types.objectProperty(\n types.identifier(\"id\"),\n types.stringLiteral(\n autoTraceFunctionId(normalizedFilename, name),\n ),\n ),\n types.objectProperty(\n types.identifier(\"name\"),\n types.stringLiteral(name),\n ),\n types.objectProperty(\n types.identifier(\"file\"),\n types.stringLiteral(normalizedFilename),\n ),\n types.objectProperty(\n types.identifier(\"line\"),\n types.numericLiteral(line),\n ),\n types.objectProperty(\n types.identifier(\"column\"),\n types.numericLiteral(column),\n ),\n ...(node.async\n ? [\n types.objectProperty(\n types.identifier(\"async\"),\n types.booleanLiteral(true),\n ),\n ]\n : []),\n ...(bamlMethod\n ? [\n types.objectProperty(\n types.identifier(\"baml\"),\n types.booleanLiteral(true),\n ),\n ]\n : []),\n ...(isRestWrapper(path, types)\n ? [\n types.objectProperty(\n types.identifier(\"wrapper\"),\n types.booleanLiteral(true),\n ),\n ]\n : []),\n ])\n const definitionIdentifier = path.scope\n .getProgramParent()\n .generateUidIdentifier(\"bitfabAutoDefinition\")\n state.definitions?.push(\n types.variableDeclaration(\"const\", [\n types.variableDeclarator(definitionIdentifier, definition),\n ]),\n )\n\n if (needsArgumentWrapper(path, types)) {\n node._bitfabInstrumented = true\n path.replaceWith(\n types.callExpression(types.cloneNode(state.wrapperIdentifier), [\n types.cloneNode(definitionIdentifier),\n node as BabelTypes.ArrowFunctionExpression,\n ]),\n )\n state.usedRuntime = true\n state.usedWrapper = true\n return\n }\n\n const originalBody = types.isBlockStatement(node.body)\n ? node.body\n : types.blockStatement([types.returnStatement(node.body)])\n const directives = originalBody.directives\n originalBody.directives = []\n\n const callerOptions = bamlMethod\n ? path.scope.generateUidIdentifier(\"bitfabBamlOptions\")\n : undefined\n const withCollector = bamlMethod\n ? path.scope.generateUidIdentifier(\"bitfabBamlWithCollector\")\n : undefined\n const tracedBody =\n callerOptions && withCollector\n ? types.blockStatement(\n [\n bamlOptionsDeclaration(callerOptions, withCollector, types),\n ...types.cloneNode(originalBody, true).body,\n ],\n [],\n )\n : types.cloneNode(originalBody, true)\n const body = types.blockStatement(\n [\n types.ifStatement(\n types.callExpression(\n types.cloneNode(state.activeIdentifier),\n [],\n ),\n types.blockStatement([\n ...(callerOptions\n ? [\n types.variableDeclaration(\"const\", [\n types.variableDeclarator(\n callerOptions,\n types.identifier(BAML_OPTIONS_PARAMETER),\n ),\n ]),\n ]\n : []),\n types.returnStatement(\n types.callExpression(\n types.cloneNode(state.runtimeIdentifier),\n [\n types.cloneNode(definitionIdentifier),\n parameterInputs(path, types),\n types.arrowFunctionExpression(\n withCollector ? [types.cloneNode(withCollector)] : [],\n tracedBody,\n node.async ?? false,\n ),\n ],\n ),\n ),\n ]),\n ),\n ...originalBody.body,\n ],\n directives,\n )\n node.body = body\n node._bitfabInstrumented = true\n state.usedRuntime = true\n },\n },\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -44,6 +44,11 @@ function functionName(path, types) {
|
|
|
44
44
|
const { line, column } = sourcePosition(path);
|
|
45
45
|
return `anonymous-${line}-${column}`;
|
|
46
46
|
}
|
|
47
|
+
const JEV_METHOD = "systemOne";
|
|
48
|
+
function isJevMethodDefinition(path, types) {
|
|
49
|
+
const parent = path.parentPath?.node;
|
|
50
|
+
return (types.isClassMethod(path.node) || types.isObjectMethod(path.node) || types.isObjectProperty(parent) || types.isClassProperty(parent)) && functionName(path, types) === JEV_METHOD;
|
|
51
|
+
}
|
|
47
52
|
function isInstrumentableFunction(node, types) {
|
|
48
53
|
if (node.generator || types.isClassPrivateMethod(node)) return false;
|
|
49
54
|
return !(types.isClassMethod(node) || types.isObjectMethod(node)) || node.kind === "method";
|
|
@@ -105,6 +110,24 @@ function withNodeFunctionName(path, types) {
|
|
|
105
110
|
if (types.isFunctionExpression(fn) && fn.id) return fn.id.name;
|
|
106
111
|
return null;
|
|
107
112
|
}
|
|
113
|
+
const BAML_GENERATED_HEADER = "This file was generated by BAML";
|
|
114
|
+
const BAML_CLIENT_CLASSES = /* @__PURE__ */ new Set(["BamlAsyncClient", "BamlSyncClient"]);
|
|
115
|
+
const BAML_OPTIONS_PARAMETER = "__baml_options__";
|
|
116
|
+
function isBamlGeneratedSource(code) {
|
|
117
|
+
return code.slice(0, 4096).includes(BAML_GENERATED_HEADER);
|
|
118
|
+
}
|
|
119
|
+
function isBamlClientMethod(path, types) {
|
|
120
|
+
const node = path.node;
|
|
121
|
+
if (!types.isClassMethod(node) || node.kind !== "method" || node.static) return false;
|
|
122
|
+
const classPath = path.parentPath?.parentPath;
|
|
123
|
+
if (!classPath || !(classPath.isClassDeclaration() || classPath.isClassExpression()) || !classPath.node.id || !BAML_CLIENT_CLASSES.has(classPath.node.id.name)) return false;
|
|
124
|
+
const parameters = runtimeParameters(node, types);
|
|
125
|
+
const last = parameters[parameters.length - 1];
|
|
126
|
+
return types.isIdentifier(last, { name: BAML_OPTIONS_PARAMETER });
|
|
127
|
+
}
|
|
128
|
+
function bamlOptionsDeclaration(callerOptions, withCollector, types) {
|
|
129
|
+
return types.variableDeclaration("const", [types.variableDeclarator(types.identifier(BAML_OPTIONS_PARAMETER), types.conditionalExpression(types.binaryExpression("===", types.cloneNode(withCollector), types.identifier("undefined")), types.cloneNode(callerOptions), types.callExpression(types.cloneNode(withCollector), [types.cloneNode(callerOptions), types.memberExpression(types.thisExpression(), types.identifier("bamlOptions"))])))]);
|
|
130
|
+
}
|
|
108
131
|
function runtimeParameters(node, types) {
|
|
109
132
|
return node.params.filter((parameter) => !types.isIdentifier(parameter, { name: "this" }));
|
|
110
133
|
}
|
|
@@ -128,6 +151,44 @@ function isRestWrapper(path, types) {
|
|
|
128
151
|
const parameters = runtimeParameters(path.node, types);
|
|
129
152
|
return parameters.length === 1 && types.isRestElement(parameters[0]);
|
|
130
153
|
}
|
|
154
|
+
function jevReceiver(node, types) {
|
|
155
|
+
const callee = node.callee;
|
|
156
|
+
if (!(types.isMemberExpression(callee) || types.isOptionalMemberExpression(callee)) || callee.computed || !types.isIdentifier(callee.property, { name: JEV_METHOD }) || types.isSuper(callee.object)) return null;
|
|
157
|
+
return callee.object;
|
|
158
|
+
}
|
|
159
|
+
function isOptionalChain(node, types) {
|
|
160
|
+
return types.isOptionalMemberExpression(node) || types.isOptionalCallExpression(node);
|
|
161
|
+
}
|
|
162
|
+
function continuesOptionalChain(path, types) {
|
|
163
|
+
const parent = path.parent;
|
|
164
|
+
return types.isOptionalMemberExpression(parent) && parent.object === path.node || types.isOptionalCallExpression(parent) && parent.callee === path.node;
|
|
165
|
+
}
|
|
166
|
+
function rewriteJevCall(path, state, types) {
|
|
167
|
+
if (state.skipFile || state.bamlGenerated || !state.jevIdentifier) return;
|
|
168
|
+
const node = path.node;
|
|
169
|
+
const receiver = jevReceiver(node, types);
|
|
170
|
+
if (receiver === null) return;
|
|
171
|
+
const optionalReceiver = types.isOptionalMemberExpression(node.callee) && node.callee.optional;
|
|
172
|
+
const optionalMethod = types.isOptionalCallExpression(node) && node.optional;
|
|
173
|
+
if (types.isOptionalCallExpression(node)) {
|
|
174
|
+
if (continuesOptionalChain(path, types) || !optionalReceiver && isOptionalChain(receiver, types)) return;
|
|
175
|
+
}
|
|
176
|
+
const guarded = optionalReceiver || optionalMethod;
|
|
177
|
+
const receiverReference = guarded && !path.scope.isStatic(receiver) ? path.scope.generateDeclaredUidIdentifier("bitfabJevReceiver") : null;
|
|
178
|
+
const receiverValue = () => receiverReference === null ? types.cloneNode(receiver) : types.cloneNode(receiverReference);
|
|
179
|
+
const call = types.callExpression(types.cloneNode(state.jevIdentifier), [receiverValue(), ...node.arguments]);
|
|
180
|
+
state.usedRuntime = true;
|
|
181
|
+
state.usedJev = true;
|
|
182
|
+
if (!guarded) {
|
|
183
|
+
path.replaceWith(call);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const firstReceiver = receiverReference === null ? types.cloneNode(receiver) : types.assignmentExpression("=", types.cloneNode(receiverReference), receiver);
|
|
187
|
+
const missing = (value) => types.binaryExpression("==", value, types.nullLiteral());
|
|
188
|
+
const methodOf = (value) => types.memberExpression(value, types.identifier(JEV_METHOD));
|
|
189
|
+
const test = optionalReceiver ? optionalMethod ? types.logicalExpression("||", missing(firstReceiver), missing(methodOf(receiverValue()))) : missing(firstReceiver) : missing(methodOf(firstReceiver));
|
|
190
|
+
path.replaceWith(types.conditionalExpression(test, types.unaryExpression("void", types.numericLiteral(0)), call));
|
|
191
|
+
}
|
|
131
192
|
function bitfabBabelPlugin(api) {
|
|
132
193
|
const { types } = api;
|
|
133
194
|
return {
|
|
@@ -139,9 +200,12 @@ function bitfabBabelPlugin(api) {
|
|
|
139
200
|
state.runtimeIdentifier = path.scope.generateUidIdentifier("bitfabAutoSpan");
|
|
140
201
|
state.activeIdentifier = path.scope.generateUidIdentifier("bitfabAutoTraceActive");
|
|
141
202
|
state.wrapperIdentifier = path.scope.generateUidIdentifier("bitfabAutoWrap");
|
|
203
|
+
state.jevIdentifier = path.scope.generateUidIdentifier("bitfabAutoJev");
|
|
204
|
+
state.bamlGenerated = isBamlGeneratedSource(state.file.code ?? "");
|
|
142
205
|
state.definitions = [];
|
|
143
206
|
state.usedRuntime = false;
|
|
144
207
|
state.usedWrapper = false;
|
|
208
|
+
state.usedJev = false;
|
|
145
209
|
},
|
|
146
210
|
exit(path, state) {
|
|
147
211
|
if (state.skipFile || !state.usedRuntime || !state.runtimeIdentifier || !state.activeIdentifier || !state.wrapperIdentifier) return;
|
|
@@ -150,7 +214,8 @@ function bitfabBabelPlugin(api) {
|
|
|
150
214
|
types.importDeclaration([
|
|
151
215
|
types.importSpecifier(state.runtimeIdentifier, types.identifier("__bitfabAutoSpan")),
|
|
152
216
|
types.importSpecifier(state.activeIdentifier, types.identifier("__bitfabAutoTraceActive")),
|
|
153
|
-
...state.usedWrapper ? [types.importSpecifier(state.wrapperIdentifier, types.identifier("__bitfabAutoWrap"))] : []
|
|
217
|
+
...state.usedWrapper ? [types.importSpecifier(state.wrapperIdentifier, types.identifier("__bitfabAutoWrap"))] : [],
|
|
218
|
+
...state.usedJev && state.jevIdentifier ? [types.importSpecifier(state.jevIdentifier, types.identifier("__bitfabAutoJev"))] : []
|
|
154
219
|
], types.stringLiteral(state.opts.runtimeModule ?? "bitfab/auto")),
|
|
155
220
|
types.variableDeclaration("const", [types.variableDeclarator(types.identifier(AUTO_TRACE_TRANSFORM_MARKER), types.assignmentExpression("=", types.memberExpression(types.identifier("globalThis"), types.identifier(AUTO_TRACE_TRANSFORM_MARKER)), types.booleanLiteral(true)))]),
|
|
156
221
|
...state.definitions ?? []
|
|
@@ -159,14 +224,24 @@ function bitfabBabelPlugin(api) {
|
|
|
159
224
|
},
|
|
160
225
|
CallExpression: { exit(path, state) {
|
|
161
226
|
if (state.skipFile) return;
|
|
227
|
+
if (jevReceiver(path.node, types) !== null) {
|
|
228
|
+
rewriteJevCall(path, state, types);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
162
231
|
const configuredName = withNodeFunctionName(path, types);
|
|
163
232
|
if (configuredName === null) return;
|
|
164
233
|
if (path.node.arguments.length === 1) path.node.arguments.push(types.identifier("undefined"));
|
|
165
234
|
path.node.arguments.push(types.stringLiteral(configuredName));
|
|
166
235
|
} },
|
|
236
|
+
OptionalCallExpression: { exit(path, state) {
|
|
237
|
+
rewriteJevCall(path, state, types);
|
|
238
|
+
} },
|
|
167
239
|
Function: { exit(path, state) {
|
|
168
240
|
const node = path.node;
|
|
169
241
|
if (state.skipFile || node._bitfabInstrumented || !isInstrumentableFunction(node, types) || isTraceDecoratorRoot(path, types) || !state.runtimeIdentifier || !state.activeIdentifier || !state.wrapperIdentifier) return;
|
|
242
|
+
const bamlMethod = state.bamlGenerated === true && isBamlClientMethod(path, types);
|
|
243
|
+
if (state.bamlGenerated && !bamlMethod) return;
|
|
244
|
+
if (isJevMethodDefinition(path, types)) return;
|
|
170
245
|
const name = qualifiedFunctionName(path, types);
|
|
171
246
|
if (name.startsWith("anonymous-")) return;
|
|
172
247
|
const normalizedFilename = autoTraceFilename(state.file.opts.filename ?? "unknown", state.opts.cwd ?? state.file.opts.cwd ?? process.cwd());
|
|
@@ -178,6 +253,7 @@ function bitfabBabelPlugin(api) {
|
|
|
178
253
|
types.objectProperty(types.identifier("line"), types.numericLiteral(line)),
|
|
179
254
|
types.objectProperty(types.identifier("column"), types.numericLiteral(column)),
|
|
180
255
|
...node.async ? [types.objectProperty(types.identifier("async"), types.booleanLiteral(true))] : [],
|
|
256
|
+
...bamlMethod ? [types.objectProperty(types.identifier("baml"), types.booleanLiteral(true))] : [],
|
|
181
257
|
...isRestWrapper(path, types) ? [types.objectProperty(types.identifier("wrapper"), types.booleanLiteral(true))] : []
|
|
182
258
|
]);
|
|
183
259
|
const definitionIdentifier = path.scope.getProgramParent().generateUidIdentifier("bitfabAutoDefinition");
|
|
@@ -192,10 +268,13 @@ function bitfabBabelPlugin(api) {
|
|
|
192
268
|
const originalBody = types.isBlockStatement(node.body) ? node.body : types.blockStatement([types.returnStatement(node.body)]);
|
|
193
269
|
const directives = originalBody.directives;
|
|
194
270
|
originalBody.directives = [];
|
|
195
|
-
|
|
271
|
+
const callerOptions = bamlMethod ? path.scope.generateUidIdentifier("bitfabBamlOptions") : void 0;
|
|
272
|
+
const withCollector = bamlMethod ? path.scope.generateUidIdentifier("bitfabBamlWithCollector") : void 0;
|
|
273
|
+
const tracedBody = callerOptions && withCollector ? types.blockStatement([bamlOptionsDeclaration(callerOptions, withCollector, types), ...types.cloneNode(originalBody, true).body], []) : types.cloneNode(originalBody, true);
|
|
274
|
+
node.body = types.blockStatement([types.ifStatement(types.callExpression(types.cloneNode(state.activeIdentifier), []), types.blockStatement([...callerOptions ? [types.variableDeclaration("const", [types.variableDeclarator(callerOptions, types.identifier(BAML_OPTIONS_PARAMETER))])] : [], types.returnStatement(types.callExpression(types.cloneNode(state.runtimeIdentifier), [
|
|
196
275
|
types.cloneNode(definitionIdentifier),
|
|
197
276
|
parameterInputs(path, types),
|
|
198
|
-
types.arrowFunctionExpression([
|
|
277
|
+
types.arrowFunctionExpression(withCollector ? [types.cloneNode(withCollector)] : [], tracedBody, node.async ?? false)
|
|
199
278
|
]))])), ...originalBody.body], directives);
|
|
200
279
|
node._bitfabInstrumented = true;
|
|
201
280
|
state.usedRuntime = true;
|
|
@@ -229,4 +308,4 @@ Object.defineProperty(exports, "sourceFilename", {
|
|
|
229
308
|
}
|
|
230
309
|
});
|
|
231
310
|
|
|
232
|
-
//# sourceMappingURL=babelPlugin-
|
|
311
|
+
//# sourceMappingURL=babelPlugin-s8EFjT6e.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babelPlugin-s8EFjT6e.cjs","names":[],"sources":["../../bitfab-typescript-transform/src/transformOptions.ts","../../bitfab-typescript-transform/src/babelPlugin.ts"],"sourcesContent":["export interface BitfabTransformOptions {\n /** Module that exports the automatic span runtime. */\n runtimeModule?: string\n /** Working directory removed from generated function IDs. */\n cwd?: string\n /** Return false to leave a file unchanged. */\n include?: (filename: string) => boolean\n}\n\nconst AUTO_TRACE_FUNCTION_ID_VERSION = \"ts-auto-v1\"\nexport const AUTO_TRACE_TRANSFORM_MARKER =\n \"__bitfab_auto_trace_transformed_v1__\"\n\nexport function autoTraceFunctionId(file: string, name: string): string {\n return `${AUTO_TRACE_FUNCTION_ID_VERSION}:${file}#${name}`\n}\n\nexport function sourceFilename(filename: string): string {\n return filename.replace(/\\\\/g, \"/\").split(/[?#]/, 1)[0] ?? \"\"\n}\n\nexport function autoTraceFilename(filename: string, cwd: string): string {\n const normalized = sourceFilename(filename)\n const normalizedCwd = cwd.replace(/\\\\/g, \"/\").replace(/\\/$/, \"\")\n return normalized.startsWith(`${normalizedCwd}/`)\n ? normalized.slice(normalizedCwd.length + 1)\n : normalized\n}\n\nexport function shouldTransformBitfabFile(\n filename: string,\n options: BitfabTransformOptions,\n): boolean {\n if (!filename) {\n return false\n }\n if (options.include && !options.include(filename)) {\n return false\n }\n\n const normalized = sourceFilename(filename)\n const normalizedCwd = options.cwd?.replace(/\\\\/g, \"/\").replace(/\\/$/, \"\")\n const isAbsolute =\n normalized.startsWith(\"/\") || /^[A-Za-z]:\\//.test(normalized)\n if (\n normalizedCwd &&\n isAbsolute &&\n normalized !== normalizedCwd &&\n !normalized.startsWith(`${normalizedCwd}/`)\n ) {\n return false\n }\n return (\n !normalized.includes(\"/node_modules/\") &&\n !normalized.endsWith(\".d.ts\") &&\n /\\.[cm]?[jt]sx?$/.test(normalized)\n )\n}\n","import type { NodePath, PluginObject, PluginPass } from \"@babel/core\"\nimport type * as BabelTypes from \"@babel/types\"\nimport type { BitfabTransformOptions } from \"./transformOptions.js\"\nimport {\n AUTO_TRACE_TRANSFORM_MARKER,\n autoTraceFilename,\n autoTraceFunctionId,\n shouldTransformBitfabFile,\n} from \"./transformOptions.js\"\n\ntype BabelTypesApi = typeof BabelTypes\n\ntype BitfabPluginOptions = BitfabTransformOptions\n\ninterface BitfabPluginState extends PluginPass {\n opts: BitfabPluginOptions\n runtimeIdentifier?: ReturnType<BabelTypesApi[\"identifier\"]>\n activeIdentifier?: ReturnType<BabelTypesApi[\"identifier\"]>\n wrapperIdentifier?: ReturnType<BabelTypesApi[\"identifier\"]>\n jevIdentifier?: ReturnType<BabelTypesApi[\"identifier\"]>\n definitions?: Array<ReturnType<BabelTypesApi[\"variableDeclaration\"]>>\n skipFile?: boolean\n bamlGenerated?: boolean\n usedRuntime?: boolean\n usedWrapper?: boolean\n usedJev?: boolean\n}\n\ninterface InstrumentedFunction {\n _bitfabInstrumented?: boolean\n}\n\nfunction propertyName(\n node: BabelTypes.Node | null | undefined,\n types: BabelTypesApi,\n): string | null {\n if (types.isIdentifier(node)) {\n return node.name\n }\n if (types.isStringLiteral(node)) {\n return node.value\n }\n return null\n}\n\nfunction functionName(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): string {\n const node = path.node\n if (types.isFunctionDeclaration(node) || types.isFunctionExpression(node)) {\n if (node.id) {\n return node.id.name\n }\n }\n\n if (\n (types.isClassMethod(node) || types.isObjectMethod(node)) &&\n !node.computed &&\n types.isIdentifier(node.key)\n ) {\n return node.key.name\n }\n\n const parent = path.parentPath?.node\n if (types.isVariableDeclarator(parent)) {\n return propertyName(parent.id, types) ?? \"anonymous\"\n }\n if (types.isObjectProperty(parent) && !parent.computed) {\n return propertyName(parent.key, types) ?? \"anonymous\"\n }\n if (types.isClassProperty(parent) && !parent.computed) {\n const name = propertyName(parent.key, types)\n if (name) {\n return name\n }\n }\n\n const { line, column } = sourcePosition(path)\n return `anonymous-${line}-${column}`\n}\n\nconst JEV_METHOD = \"systemOne\"\n\nfunction isJevMethodDefinition(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n const parent = path.parentPath?.node\n const isMethod =\n types.isClassMethod(path.node) ||\n types.isObjectMethod(path.node) ||\n types.isObjectProperty(parent) ||\n types.isClassProperty(parent)\n return isMethod && functionName(path, types) === JEV_METHOD\n}\n\nfunction isInstrumentableFunction(\n node: BabelTypes.Function,\n types: BabelTypesApi,\n): boolean {\n if (node.generator || types.isClassPrivateMethod(node)) {\n return false\n }\n return (\n !(types.isClassMethod(node) || types.isObjectMethod(node)) ||\n node.kind === \"method\"\n )\n}\n\nfunction sourcePosition(path: NodePath<BabelTypes.Function>): {\n line: number\n column: number\n} {\n const exportDeclaration = path.parentPath?.isExportDeclaration()\n ? path.parentPath.node\n : undefined\n const start = (exportDeclaration ?? path.node).loc?.start\n return { line: start?.line ?? 0, column: start?.column ?? 0 }\n}\n\nfunction qualifiedFunctionName(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): string {\n const ownName = functionName(path, types)\n if (ownName.startsWith(\"anonymous-\")) {\n return ownName\n }\n const scopes: string[] = []\n let ancestor: NodePath | null = path.parentPath\n while (ancestor) {\n if (ancestor.isFunction()) {\n if (!isInstrumentableFunction(ancestor.node, types)) {\n ancestor = ancestor.parentPath\n continue\n }\n const name = functionName(\n ancestor as NodePath<BabelTypes.Function>,\n types,\n )\n if (!name.startsWith(\"anonymous-\")) {\n scopes.unshift(name)\n }\n } else if (\n (ancestor.isClassDeclaration() || ancestor.isClassExpression()) &&\n ancestor.node.id\n ) {\n scopes.unshift(ancestor.node.id.name)\n } else if (ancestor.isObjectExpression()) {\n const parent = ancestor.parentPath?.node\n if (types.isVariableDeclarator(parent)) {\n const name = propertyName(parent.id, types)\n if (name) {\n scopes.unshift(name)\n }\n } else if (types.isObjectProperty(parent) && !parent.computed) {\n const name = propertyName(parent.key, types)\n if (name) {\n scopes.unshift(name)\n }\n }\n }\n ancestor = ancestor.parentPath\n }\n return [...scopes, ownName].join(\".\")\n}\n\nfunction isTraceDecoratorRoot(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n const node = path.node\n const parent = path.parentPath?.node\n const decorated =\n types.isClassMethod(node) || types.isClassPrivateMethod(node)\n ? node\n : types.isClassProperty(parent) && parent.value === node\n ? parent\n : null\n if (!decorated) {\n return false\n }\n\n return (\n decorated.decorators?.some((decorator) => {\n const expression = decorator.expression\n if (!types.isCallExpression(expression)) {\n return false\n }\n const callee = expression.callee\n return (\n types.isMemberExpression(callee) &&\n !callee.computed &&\n types.isIdentifier(callee.property, { name: \"trace\" })\n )\n }) ?? false\n )\n}\n\nfunction withNodeFunctionName(\n path: NodePath<BabelTypes.CallExpression>,\n types: BabelTypesApi,\n): string | null {\n if (path.node.arguments.length > 2) {\n return null\n }\n const callee = path.node.callee\n if (\n !types.isMemberExpression(callee) ||\n callee.computed ||\n !types.isIdentifier(callee.property, { name: \"withNode\" })\n ) {\n return null\n }\n const fn = path.node.arguments[path.node.arguments.length - 1]\n if (types.isIdentifier(fn)) {\n return fn.name\n }\n if (types.isMemberExpression(fn) && !fn.computed) {\n return propertyName(fn.property, types)\n }\n if (types.isFunctionExpression(fn) && fn.id) {\n return fn.id.name\n }\n return null\n}\n\nconst BAML_GENERATED_HEADER = \"This file was generated by BAML\"\nconst BAML_CLIENT_CLASSES = new Set([\"BamlAsyncClient\", \"BamlSyncClient\"])\nconst BAML_OPTIONS_PARAMETER = \"__baml_options__\"\n\nfunction isBamlGeneratedSource(code: string): boolean {\n return code.slice(0, 4096).includes(BAML_GENERATED_HEADER)\n}\n\nfunction isBamlClientMethod(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n const node = path.node\n if (!types.isClassMethod(node) || node.kind !== \"method\" || node.static) {\n return false\n }\n const classPath = path.parentPath?.parentPath\n if (\n !classPath ||\n !(classPath.isClassDeclaration() || classPath.isClassExpression()) ||\n !classPath.node.id ||\n !BAML_CLIENT_CLASSES.has(classPath.node.id.name)\n ) {\n return false\n }\n const parameters = runtimeParameters(node, types)\n const last = parameters[parameters.length - 1]\n return types.isIdentifier(last, { name: BAML_OPTIONS_PARAMETER })\n}\n\nfunction bamlOptionsDeclaration(\n callerOptions: BabelTypes.Identifier,\n withCollector: BabelTypes.Identifier,\n types: BabelTypesApi,\n): BabelTypes.VariableDeclaration {\n return types.variableDeclaration(\"const\", [\n types.variableDeclarator(\n types.identifier(BAML_OPTIONS_PARAMETER),\n types.conditionalExpression(\n types.binaryExpression(\n \"===\",\n types.cloneNode(withCollector),\n types.identifier(\"undefined\"),\n ),\n types.cloneNode(callerOptions),\n types.callExpression(types.cloneNode(withCollector), [\n types.cloneNode(callerOptions),\n types.memberExpression(\n types.thisExpression(),\n types.identifier(\"bamlOptions\"),\n ),\n ]),\n ),\n ),\n ])\n}\n\nfunction runtimeParameters(\n node: BabelTypes.Function,\n types: BabelTypesApi,\n): BabelTypes.Function[\"params\"] {\n return node.params.filter(\n (parameter) => !types.isIdentifier(parameter, { name: \"this\" }),\n )\n}\n\nfunction parameterInputs(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): ReturnType<BabelTypesApi[\"arrayExpression\"]> {\n const elements: Array<BabelTypes.Expression | BabelTypes.SpreadElement> = []\n\n for (const [index, parameter] of runtimeParameters(\n path.node,\n types,\n ).entries()) {\n if (!types.isArrowFunctionExpression(path.node)) {\n if (types.isRestElement(parameter)) {\n elements.push(\n types.spreadElement(\n types.callExpression(\n types.memberExpression(\n types.arrayExpression([\n types.spreadElement(types.identifier(\"arguments\")),\n ]),\n types.identifier(\"slice\"),\n ),\n [types.numericLiteral(index)],\n ),\n ),\n )\n } else {\n elements.push(\n types.memberExpression(\n types.identifier(\"arguments\"),\n types.numericLiteral(index),\n true,\n ),\n )\n }\n continue\n }\n\n if (types.isIdentifier(parameter)) {\n elements.push(types.identifier(parameter.name))\n } else if (\n types.isRestElement(parameter) &&\n types.isIdentifier(parameter.argument)\n ) {\n elements.push(\n types.spreadElement(types.identifier(parameter.argument.name)),\n )\n }\n }\n\n return types.arrayExpression(elements)\n}\n\nfunction needsArgumentWrapper(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n return (\n types.isArrowFunctionExpression(path.node) &&\n path.node.params.some(\n (parameter) =>\n !types.isIdentifier(parameter) &&\n !(\n types.isRestElement(parameter) &&\n types.isIdentifier(parameter.argument)\n ),\n )\n )\n}\n\nfunction isRestWrapper(\n path: NodePath<BabelTypes.Function>,\n types: BabelTypesApi,\n): boolean {\n const parameters = runtimeParameters(path.node, types)\n return parameters.length === 1 && types.isRestElement(parameters[0])\n}\n\ntype JevCallNode = BabelTypes.CallExpression | BabelTypes.OptionalCallExpression\n\nfunction jevReceiver(\n node: JevCallNode,\n types: BabelTypesApi,\n): BabelTypes.Expression | null {\n const callee = node.callee\n if (\n !(\n types.isMemberExpression(callee) ||\n types.isOptionalMemberExpression(callee)\n ) ||\n callee.computed ||\n !types.isIdentifier(callee.property, { name: JEV_METHOD }) ||\n types.isSuper(callee.object)\n ) {\n return null\n }\n return callee.object\n}\n\nfunction isOptionalChain(node: BabelTypes.Node, types: BabelTypesApi): boolean {\n return (\n types.isOptionalMemberExpression(node) ||\n types.isOptionalCallExpression(node)\n )\n}\n\nfunction continuesOptionalChain(\n path: NodePath<BabelTypes.OptionalCallExpression>,\n types: BabelTypesApi,\n): boolean {\n const parent = path.parent\n return (\n (types.isOptionalMemberExpression(parent) && parent.object === path.node) ||\n (types.isOptionalCallExpression(parent) && parent.callee === path.node)\n )\n}\n\nfunction rewriteJevCall(\n path: NodePath<JevCallNode>,\n state: BitfabPluginState,\n types: BabelTypesApi,\n): void {\n if (state.skipFile || state.bamlGenerated || !state.jevIdentifier) {\n return\n }\n const node = path.node\n const receiver = jevReceiver(node, types)\n if (receiver === null) {\n return\n }\n const optionalReceiver =\n types.isOptionalMemberExpression(node.callee) && node.callee.optional\n const optionalMethod = types.isOptionalCallExpression(node) && node.optional\n if (types.isOptionalCallExpression(node)) {\n if (\n continuesOptionalChain(\n path as NodePath<BabelTypes.OptionalCallExpression>,\n types,\n ) ||\n (!optionalReceiver && isOptionalChain(receiver, types))\n ) {\n return\n }\n }\n const guarded = optionalReceiver || optionalMethod\n const receiverReference =\n guarded && !path.scope.isStatic(receiver)\n ? path.scope.generateDeclaredUidIdentifier(\"bitfabJevReceiver\")\n : null\n const receiverValue = (): BabelTypes.Expression =>\n receiverReference === null\n ? types.cloneNode(receiver)\n : types.cloneNode(receiverReference)\n const call = types.callExpression(types.cloneNode(state.jevIdentifier), [\n receiverValue(),\n ...node.arguments,\n ])\n state.usedRuntime = true\n state.usedJev = true\n if (!guarded) {\n path.replaceWith(call)\n return\n }\n const firstReceiver =\n receiverReference === null\n ? types.cloneNode(receiver)\n : types.assignmentExpression(\n \"=\",\n types.cloneNode(receiverReference),\n receiver,\n )\n const missing = (value: BabelTypes.Expression): BabelTypes.BinaryExpression =>\n types.binaryExpression(\"==\", value, types.nullLiteral())\n const methodOf = (value: BabelTypes.Expression): BabelTypes.Expression =>\n types.memberExpression(value, types.identifier(JEV_METHOD))\n const test = optionalReceiver\n ? optionalMethod\n ? types.logicalExpression(\n \"||\",\n missing(firstReceiver),\n missing(methodOf(receiverValue())),\n )\n : missing(firstReceiver)\n : missing(methodOf(firstReceiver))\n path.replaceWith(\n types.conditionalExpression(\n test,\n types.unaryExpression(\"void\", types.numericLiteral(0)),\n call,\n ),\n )\n}\n\n/**\n * Babel adapter for Bitfab's experimental automatic call-span runtime.\n *\n * @experimental The transform protocol and generated function identities may\n * change before the feature is stable.\n */\nexport default function bitfabBabelPlugin(api: {\n types: BabelTypesApi\n}): PluginObject<BitfabPluginState> {\n const { types } = api\n\n return {\n name: \"bitfab-auto-trace\",\n visitor: {\n Program: {\n enter(path: NodePath<BabelTypes.Program>, state: BitfabPluginState) {\n const filename = state.file.opts.filename ?? \"unknown\"\n state.skipFile =\n !shouldTransformBitfabFile(filename, state.opts) ||\n path.scope.hasBinding(AUTO_TRACE_TRANSFORM_MARKER) ||\n path.node.directives.some(\n (directive) => directive.value.value === \"use client\",\n )\n state.runtimeIdentifier =\n path.scope.generateUidIdentifier(\"bitfabAutoSpan\")\n state.activeIdentifier = path.scope.generateUidIdentifier(\n \"bitfabAutoTraceActive\",\n )\n state.wrapperIdentifier =\n path.scope.generateUidIdentifier(\"bitfabAutoWrap\")\n state.jevIdentifier =\n path.scope.generateUidIdentifier(\"bitfabAutoJev\")\n state.bamlGenerated = isBamlGeneratedSource(state.file.code ?? \"\")\n state.definitions = []\n state.usedRuntime = false\n state.usedWrapper = false\n state.usedJev = false\n },\n exit(path: NodePath<BabelTypes.Program>, state: BitfabPluginState) {\n if (\n state.skipFile ||\n !state.usedRuntime ||\n !state.runtimeIdentifier ||\n !state.activeIdentifier ||\n !state.wrapperIdentifier\n ) {\n return\n }\n\n state.file.metadata[AUTO_TRACE_TRANSFORM_MARKER] = true\n path.unshiftContainer(\"body\", [\n types.importDeclaration(\n [\n types.importSpecifier(\n state.runtimeIdentifier,\n types.identifier(\"__bitfabAutoSpan\"),\n ),\n types.importSpecifier(\n state.activeIdentifier,\n types.identifier(\"__bitfabAutoTraceActive\"),\n ),\n ...(state.usedWrapper\n ? [\n types.importSpecifier(\n state.wrapperIdentifier,\n types.identifier(\"__bitfabAutoWrap\"),\n ),\n ]\n : []),\n ...(state.usedJev && state.jevIdentifier\n ? [\n types.importSpecifier(\n state.jevIdentifier,\n types.identifier(\"__bitfabAutoJev\"),\n ),\n ]\n : []),\n ],\n types.stringLiteral(\n state.opts.runtimeModule ?? \"bitfab/auto\",\n ),\n ),\n types.variableDeclaration(\"const\", [\n types.variableDeclarator(\n types.identifier(AUTO_TRACE_TRANSFORM_MARKER),\n types.assignmentExpression(\n \"=\",\n types.memberExpression(\n types.identifier(\"globalThis\"),\n types.identifier(AUTO_TRACE_TRANSFORM_MARKER),\n ),\n types.booleanLiteral(true),\n ),\n ),\n ]),\n ...(state.definitions ?? []),\n ])\n },\n },\n CallExpression: {\n exit(\n path: NodePath<BabelTypes.CallExpression>,\n state: BitfabPluginState,\n ) {\n if (state.skipFile) {\n return\n }\n if (jevReceiver(path.node, types) !== null) {\n rewriteJevCall(path, state, types)\n return\n }\n const configuredName = withNodeFunctionName(path, types)\n if (configuredName === null) {\n return\n }\n if (path.node.arguments.length === 1) {\n path.node.arguments.push(types.identifier(\"undefined\"))\n }\n path.node.arguments.push(types.stringLiteral(configuredName))\n },\n },\n OptionalCallExpression: {\n exit(\n path: NodePath<BabelTypes.OptionalCallExpression>,\n state: BitfabPluginState,\n ) {\n rewriteJevCall(path, state, types)\n },\n },\n Function: {\n exit(path: NodePath<BabelTypes.Function>, state: BitfabPluginState) {\n const node = path.node as typeof path.node & InstrumentedFunction\n if (\n state.skipFile ||\n node._bitfabInstrumented ||\n !isInstrumentableFunction(node, types) ||\n isTraceDecoratorRoot(path, types) ||\n !state.runtimeIdentifier ||\n !state.activeIdentifier ||\n !state.wrapperIdentifier\n ) {\n return\n }\n const bamlMethod =\n state.bamlGenerated === true && isBamlClientMethod(path, types)\n if (state.bamlGenerated && !bamlMethod) {\n return\n }\n if (isJevMethodDefinition(path, types)) {\n return\n }\n const name = qualifiedFunctionName(path, types)\n if (name.startsWith(\"anonymous-\")) {\n return\n }\n const normalizedFilename = autoTraceFilename(\n state.file.opts.filename ?? \"unknown\",\n state.opts.cwd ?? state.file.opts.cwd ?? process.cwd(),\n )\n const { line, column } = sourcePosition(path)\n const definition = types.objectExpression([\n types.objectProperty(\n types.identifier(\"id\"),\n types.stringLiteral(\n autoTraceFunctionId(normalizedFilename, name),\n ),\n ),\n types.objectProperty(\n types.identifier(\"name\"),\n types.stringLiteral(name),\n ),\n types.objectProperty(\n types.identifier(\"file\"),\n types.stringLiteral(normalizedFilename),\n ),\n types.objectProperty(\n types.identifier(\"line\"),\n types.numericLiteral(line),\n ),\n types.objectProperty(\n types.identifier(\"column\"),\n types.numericLiteral(column),\n ),\n ...(node.async\n ? [\n types.objectProperty(\n types.identifier(\"async\"),\n types.booleanLiteral(true),\n ),\n ]\n : []),\n ...(bamlMethod\n ? [\n types.objectProperty(\n types.identifier(\"baml\"),\n types.booleanLiteral(true),\n ),\n ]\n : []),\n ...(isRestWrapper(path, types)\n ? [\n types.objectProperty(\n types.identifier(\"wrapper\"),\n types.booleanLiteral(true),\n ),\n ]\n : []),\n ])\n const definitionIdentifier = path.scope\n .getProgramParent()\n .generateUidIdentifier(\"bitfabAutoDefinition\")\n state.definitions?.push(\n types.variableDeclaration(\"const\", [\n types.variableDeclarator(definitionIdentifier, definition),\n ]),\n )\n\n if (needsArgumentWrapper(path, types)) {\n node._bitfabInstrumented = true\n path.replaceWith(\n types.callExpression(types.cloneNode(state.wrapperIdentifier), [\n types.cloneNode(definitionIdentifier),\n node as BabelTypes.ArrowFunctionExpression,\n ]),\n )\n state.usedRuntime = true\n state.usedWrapper = true\n return\n }\n\n const originalBody = types.isBlockStatement(node.body)\n ? node.body\n : types.blockStatement([types.returnStatement(node.body)])\n const directives = originalBody.directives\n originalBody.directives = []\n\n const callerOptions = bamlMethod\n ? path.scope.generateUidIdentifier(\"bitfabBamlOptions\")\n : undefined\n const withCollector = bamlMethod\n ? path.scope.generateUidIdentifier(\"bitfabBamlWithCollector\")\n : undefined\n const tracedBody =\n callerOptions && withCollector\n ? types.blockStatement(\n [\n bamlOptionsDeclaration(callerOptions, withCollector, types),\n ...types.cloneNode(originalBody, true).body,\n ],\n [],\n )\n : types.cloneNode(originalBody, true)\n const body = types.blockStatement(\n [\n types.ifStatement(\n types.callExpression(\n types.cloneNode(state.activeIdentifier),\n [],\n ),\n types.blockStatement([\n ...(callerOptions\n ? [\n types.variableDeclaration(\"const\", [\n types.variableDeclarator(\n callerOptions,\n types.identifier(BAML_OPTIONS_PARAMETER),\n ),\n ]),\n ]\n : []),\n types.returnStatement(\n types.callExpression(\n types.cloneNode(state.runtimeIdentifier),\n [\n types.cloneNode(definitionIdentifier),\n parameterInputs(path, types),\n types.arrowFunctionExpression(\n withCollector ? [types.cloneNode(withCollector)] : [],\n tracedBody,\n node.async ?? false,\n ),\n ],\n ),\n ),\n ]),\n ),\n ...originalBody.body,\n ],\n directives,\n )\n node.body = body\n node._bitfabInstrumented = true\n state.usedRuntime = true\n },\n },\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
|
-
import {
|
|
2
|
+
import { b as asyncStorageReady, h as warnOnce, m as warn, v as runWithCaptureSuppressed, x as createAsyncLocalStorage } from "./autoTrace-CVt9EDyo.js";
|
|
3
3
|
import { SpanStatusCode } from "@opentelemetry/api";
|
|
4
4
|
import { ExportResultCode } from "@opentelemetry/core";
|
|
5
5
|
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
6
6
|
import { AlwaysOnSampler, BasicTracerProvider, BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
7
7
|
//#region src/version.generated.ts
|
|
8
|
-
const __version__ = "0.
|
|
8
|
+
const __version__ = "0.68.0";
|
|
9
9
|
const __packageName__ = "bitfab";
|
|
10
10
|
//#endregion
|
|
11
11
|
//#region src/traceCompletion.ts
|
|
@@ -2160,4 +2160,4 @@ function experimentIdWireFields(experimentId) {
|
|
|
2160
2160
|
//#endregion
|
|
2161
2161
|
export { readEnv as C, MixedTracingError as S, getReplayContext as _, http_exports as a, gitRunner as b, recordCallerTraceMetadata as c, DECLARED_NODE_FIELD as d, ROOT_TRACE_FUNCTION_KEY_FIELD as f, MAX_COMPRESSIBLE_SPAN_CARRIER_BYTES as g, makeSpanOrigin as h, flushTraces as i, retireTraceMetadata as l, isFrameworkInstrumentation as m, SPAN_TYPES as n, unrefTimer as o, SimulationPlan as p, experimentIdWireFields as r, callerTraceMetadata as s, HttpClient as t, CONTENT_OFF_KEY as u, replayContextReady as v, __version__ as w, BitfabError as x, runWithReplayContext as y };
|
|
2162
2162
|
|
|
2163
|
-
//# sourceMappingURL=http-
|
|
2163
|
+
//# sourceMappingURL=http-_cgR_DM2.js.map
|