@bubblelab/bubble-runtime 0.1.14 → 0.1.15
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/extraction/BubbleParser.d.ts +186 -8
- package/dist/extraction/BubbleParser.d.ts.map +1 -1
- package/dist/extraction/BubbleParser.js +2255 -117
- package/dist/extraction/BubbleParser.js.map +1 -1
- package/dist/extraction/index.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/injection/BubbleInjector.d.ts +27 -1
- package/dist/injection/BubbleInjector.d.ts.map +1 -1
- package/dist/injection/BubbleInjector.js +341 -29
- package/dist/injection/BubbleInjector.js.map +1 -1
- package/dist/injection/LoggerInjector.d.ts +12 -1
- package/dist/injection/LoggerInjector.d.ts.map +1 -1
- package/dist/injection/LoggerInjector.js +301 -13
- package/dist/injection/LoggerInjector.js.map +1 -1
- package/dist/injection/index.js +1 -0
- package/dist/parse/BubbleScript.d.ts +46 -2
- package/dist/parse/BubbleScript.d.ts.map +1 -1
- package/dist/parse/BubbleScript.js +39 -11
- package/dist/parse/BubbleScript.js.map +1 -1
- package/dist/parse/index.d.ts +0 -1
- package/dist/parse/index.d.ts.map +1 -1
- package/dist/parse/index.js +1 -1
- package/dist/parse/index.js.map +1 -1
- package/dist/runtime/BubbleRunner.d.ts +8 -2
- package/dist/runtime/BubbleRunner.d.ts.map +1 -1
- package/dist/runtime/BubbleRunner.js +40 -18
- package/dist/runtime/BubbleRunner.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/types.js +1 -0
- package/dist/types/index.js +1 -0
- package/dist/utils/bubble-helper.d.ts +2 -2
- package/dist/utils/bubble-helper.d.ts.map +1 -1
- package/dist/utils/bubble-helper.js +6 -1
- package/dist/utils/bubble-helper.js.map +1 -1
- package/dist/utils/normalize-control-flow.d.ts +14 -0
- package/dist/utils/normalize-control-flow.d.ts.map +1 -0
- package/dist/utils/normalize-control-flow.js +179 -0
- package/dist/utils/normalize-control-flow.js.map +1 -0
- package/dist/utils/parameter-formatter.d.ts +14 -5
- package/dist/utils/parameter-formatter.d.ts.map +1 -1
- package/dist/utils/parameter-formatter.js +164 -45
- package/dist/utils/parameter-formatter.js.map +1 -1
- package/dist/utils/sanitize-script.d.ts +11 -0
- package/dist/utils/sanitize-script.d.ts.map +1 -0
- package/dist/utils/sanitize-script.js +43 -0
- package/dist/utils/sanitize-script.js.map +1 -0
- package/dist/validation/BubbleValidator.d.ts +15 -0
- package/dist/validation/BubbleValidator.d.ts.map +1 -1
- package/dist/validation/BubbleValidator.js +168 -1
- package/dist/validation/BubbleValidator.js.map +1 -1
- package/dist/validation/index.d.ts +6 -3
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +32 -9
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/lint-rules.d.ts +91 -0
- package/dist/validation/lint-rules.d.ts.map +1 -0
- package/dist/validation/lint-rules.js +755 -0
- package/dist/validation/lint-rules.js.map +1 -0
- package/package.json +4 -4
- package/dist/parse/traceDependencies.d.ts +0 -18
- package/dist/parse/traceDependencies.d.ts.map +0 -1
- package/dist/parse/traceDependencies.js +0 -195
- package/dist/parse/traceDependencies.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { hashToVariableId, buildCallSiteKey } from '@bubblelab/shared-schemas';
|
|
1
2
|
export class LoggerInjector {
|
|
2
3
|
bubbleScript;
|
|
3
4
|
options;
|
|
@@ -16,12 +17,18 @@ export class LoggerInjector {
|
|
|
16
17
|
injectLogging() {
|
|
17
18
|
const modifiedScript = this.bubbleScript.currentBubbleScript;
|
|
18
19
|
const lines = modifiedScript.split('\n');
|
|
19
|
-
// Inject
|
|
20
|
+
// Inject function call logging FIRST (before line logging shifts line numbers)
|
|
21
|
+
this.injectFunctionCallLogging(lines);
|
|
22
|
+
// Update the script and reparse AST after function call logging
|
|
23
|
+
this.bubbleScript.currentBubbleScript = lines.join('\n');
|
|
24
|
+
this.bubbleScript.reparseAST();
|
|
25
|
+
// Inject statement-level logging in handle method (now with updated AST)
|
|
20
26
|
if (this.options.enableLineByLineLogging) {
|
|
21
|
-
this.
|
|
27
|
+
const updatedLines = this.bubbleScript.currentBubbleScript.split('\n');
|
|
28
|
+
this.injectLineLogging(updatedLines);
|
|
29
|
+
this.bubbleScript.currentBubbleScript = updatedLines.join('\n');
|
|
22
30
|
}
|
|
23
|
-
this.bubbleScript.currentBubbleScript
|
|
24
|
-
return lines.join('\n');
|
|
31
|
+
return this.bubbleScript.currentBubbleScript;
|
|
25
32
|
}
|
|
26
33
|
/**
|
|
27
34
|
* Inject logging using original line numbers for traceability
|
|
@@ -93,21 +100,48 @@ export class LoggerInjector {
|
|
|
93
100
|
}
|
|
94
101
|
}
|
|
95
102
|
/**
|
|
96
|
-
* Inject `const __bubbleFlowSelf = this;` at the beginning of
|
|
103
|
+
* Inject `const __bubbleFlowSelf = this;` at the beginning of all instance method bodies
|
|
97
104
|
* This captures `this` in a lexical variable that works at any nesting level
|
|
98
105
|
* This should be called BEFORE reapplyBubbleInstantiations so bubble instantiations can use __bubbleFlowSelf.logger
|
|
99
106
|
*/
|
|
100
107
|
injectSelfCapture() {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
108
|
+
// Reparse AST first to get updated method locations after script modifications
|
|
109
|
+
this.bubbleScript.reparseAST();
|
|
110
|
+
const instanceMethodsLocation = this.bubbleScript.instanceMethodsLocation;
|
|
111
|
+
if (!instanceMethodsLocation ||
|
|
112
|
+
Object.keys(instanceMethodsLocation).length === 0) {
|
|
113
|
+
console.warn('Instance methods location not found, skipping __bubbleFlowSelf injection');
|
|
104
114
|
return;
|
|
105
115
|
}
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
116
|
+
// Process methods in reverse order of bodyStartLine to avoid line number shifts
|
|
117
|
+
const methods = Object.entries(instanceMethodsLocation).sort((a, b) => b[1].bodyStartLine - a[1].bodyStartLine);
|
|
118
|
+
for (const [, location] of methods) {
|
|
119
|
+
// Get the indentation from the method body start line
|
|
120
|
+
const lines = this.bubbleScript.currentBubbleScript.split('\n');
|
|
121
|
+
const bodyStartLineIndex = location.bodyStartLine - 1;
|
|
122
|
+
if (bodyStartLineIndex >= 0 && bodyStartLineIndex < lines.length) {
|
|
123
|
+
const bodyStartLine = lines[bodyStartLineIndex];
|
|
124
|
+
// Check if __bubbleFlowSelf already exists in this method to avoid duplicates
|
|
125
|
+
const methodStartIndex = location.startLine - 1;
|
|
126
|
+
const methodEndIndex = Math.min(location.endLine, lines.length);
|
|
127
|
+
const methodBodyLines = lines.slice(methodStartIndex, methodEndIndex);
|
|
128
|
+
const methodBody = methodBodyLines.join('\n');
|
|
129
|
+
if (methodBody.includes('const __bubbleFlowSelf = this;')) {
|
|
130
|
+
// Already injected, skip
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// Extract indentation from the line (usually 2 spaces for method body)
|
|
134
|
+
const match = bodyStartLine.match(/^(\s*)/);
|
|
135
|
+
const indentation = match ? match[1] : ' ';
|
|
136
|
+
// Add one level of indentation for the injected statement
|
|
137
|
+
const selfCapture = `${indentation} const __bubbleFlowSelf = this;`;
|
|
138
|
+
// Inject self capture at body start line (after opening brace)
|
|
139
|
+
// bodyStartLine is the line with the opening brace, so inject on the next line
|
|
140
|
+
this.bubbleScript.injectLines([selfCapture], location.bodyStartLine + 1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
this.bubbleScript.reparseAST();
|
|
144
|
+
this.bubbleScript.showScript('[LoggerInjector] After injectSelfCapture in all methods');
|
|
111
145
|
}
|
|
112
146
|
/**
|
|
113
147
|
* Find all statements within the handle method using AST
|
|
@@ -172,5 +206,259 @@ export class LoggerInjector {
|
|
|
172
206
|
visitValue(value);
|
|
173
207
|
}
|
|
174
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Inject logging for all method invocations using pre-tracked invocation data
|
|
211
|
+
* Uses rich invocation info captured during AST parsing
|
|
212
|
+
*/
|
|
213
|
+
injectFunctionCallLogging(lines) {
|
|
214
|
+
// Reparse AST to get current invocation lines (after script modifications)
|
|
215
|
+
this.bubbleScript.reparseAST();
|
|
216
|
+
const instanceMethods = this.bubbleScript.instanceMethodsLocation;
|
|
217
|
+
if (!instanceMethods || Object.keys(instanceMethods).length === 0) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
// Collect all invocations with their rich metadata
|
|
221
|
+
const invocations = [];
|
|
222
|
+
for (const [methodName, methodInfo] of Object.entries(instanceMethods)) {
|
|
223
|
+
for (const invocationInfo of methodInfo.invocationLines) {
|
|
224
|
+
// Generate a deterministic variableId based on method name + call site location
|
|
225
|
+
// This ensures each invocation gets a unique ID even when the same method is called multiple times
|
|
226
|
+
const variableId = hashToVariableId(buildCallSiteKey(methodName, invocationInfo.invocationIndex));
|
|
227
|
+
invocations.push({ ...invocationInfo, methodName, variableId });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Sort by line number in reverse order for safe insertion
|
|
231
|
+
invocations.sort((a, b) => b.lineNumber - a.lineNumber);
|
|
232
|
+
// Inject logging for each invocation
|
|
233
|
+
for (const invocation of invocations) {
|
|
234
|
+
this.injectLoggingForInvocation(lines, invocation);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Inject logging before and after a method invocation line
|
|
239
|
+
* Uses pre-parsed invocation data from AST analysis - no regex parsing needed
|
|
240
|
+
*/
|
|
241
|
+
injectLoggingForInvocation(lines, invocation) {
|
|
242
|
+
const { lineNumber, endLineNumber, methodName, variableId, invocationIndex, hasAwait, arguments: args, statementType, variableName, variableType, destructuringPattern, context = 'default', containingStatementLine, callText, } = invocation;
|
|
243
|
+
const lineIndex = lineNumber - 1;
|
|
244
|
+
const endLineIndex = endLineNumber - 1;
|
|
245
|
+
if (lineIndex < 0 || lineIndex >= lines.length) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const line = lines[lineIndex];
|
|
249
|
+
const indentation = line.match(/^\s*/)?.[0] || ' ';
|
|
250
|
+
// Use pre-parsed arguments
|
|
251
|
+
const argsArray = args ? `[${args}]` : '[]';
|
|
252
|
+
const callSiteKey = buildCallSiteKey(methodName, invocationIndex);
|
|
253
|
+
const callSiteKeyLiteral = JSON.stringify(callSiteKey);
|
|
254
|
+
const resultVar = `__functionCallResult_${variableId}`;
|
|
255
|
+
const durationVar = `__functionCallDuration_${variableId}`;
|
|
256
|
+
const argsVar = `__functionCallArgs_${variableId}`;
|
|
257
|
+
const prevInvocationVar = `__prevInvocationCallSiteKey_${variableId}`;
|
|
258
|
+
const setInvocationLine = `${indentation}const ${prevInvocationVar} = __bubbleFlowSelf?.__setInvocationCallSiteKey?.(${callSiteKeyLiteral});`;
|
|
259
|
+
const restoreInvocationLine = `${indentation}__bubbleFlowSelf?.__restoreInvocationCallSiteKey?.(${prevInvocationVar});`;
|
|
260
|
+
const startLog = `${indentation}const __functionCallStart_${variableId} = Date.now();`;
|
|
261
|
+
const argsLog = `${indentation}const ${argsVar} = ${argsArray};`;
|
|
262
|
+
const startCallLog = `${indentation}__bubbleFlowSelf.logger?.logFunctionCallStart(${variableId}, '${methodName}', ${argsVar}, ${lineNumber});`;
|
|
263
|
+
// Calculate how many lines to remove (from lineNumber to endLineNumber)
|
|
264
|
+
const linesToRemove = endLineIndex - lineIndex + 1;
|
|
265
|
+
if (context === 'promise_all_element') {
|
|
266
|
+
this.injectPromiseAllElementLogging(lines, lineIndex, linesToRemove, indentation, {
|
|
267
|
+
args,
|
|
268
|
+
argsArray,
|
|
269
|
+
argsVar,
|
|
270
|
+
durationVar,
|
|
271
|
+
lineNumber,
|
|
272
|
+
methodName,
|
|
273
|
+
resultVar,
|
|
274
|
+
variableId,
|
|
275
|
+
callSiteKeyLiteral,
|
|
276
|
+
callText,
|
|
277
|
+
});
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// Handle function calls inside condition expressions (if/while/for/switch)
|
|
281
|
+
// Strategy: Insert logging + call extraction BEFORE the containing statement,
|
|
282
|
+
// then replace the call text in the original line with the result variable
|
|
283
|
+
if (statementType === 'condition_expression' &&
|
|
284
|
+
containingStatementLine &&
|
|
285
|
+
callText) {
|
|
286
|
+
const containingLineIndex = containingStatementLine - 1;
|
|
287
|
+
if (containingLineIndex < 0 || containingLineIndex >= lines.length) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const containingLine = lines[containingLineIndex];
|
|
291
|
+
const containingIndentation = containingLine.match(/^\s*/)?.[0] || ' ';
|
|
292
|
+
// Build the logging preamble to insert BEFORE the containing statement
|
|
293
|
+
const callLine = `${containingIndentation}const ${resultVar} = ${hasAwait ? 'await ' : ''}this.${methodName}(${args});`;
|
|
294
|
+
const completeLog = `${containingIndentation}const ${durationVar} = Date.now() - __functionCallStart_${variableId}; __bubbleFlowSelf.logger?.logFunctionCallComplete(${variableId}, '${methodName}', ${resultVar}, ${durationVar}, ${lineNumber});`;
|
|
295
|
+
const preambleLines = [
|
|
296
|
+
`${containingIndentation}const __functionCallStart_${variableId} = Date.now();`,
|
|
297
|
+
`${containingIndentation}const ${argsVar} = ${argsArray};`,
|
|
298
|
+
`${containingIndentation}__bubbleFlowSelf.logger?.logFunctionCallStart(${variableId}, '${methodName}', ${argsVar}, ${lineNumber});`,
|
|
299
|
+
`${containingIndentation}const ${prevInvocationVar} = __bubbleFlowSelf?.__setInvocationCallSiteKey?.(${callSiteKeyLiteral});`,
|
|
300
|
+
callLine,
|
|
301
|
+
completeLog,
|
|
302
|
+
`${containingIndentation}__bubbleFlowSelf?.__restoreInvocationCallSiteKey?.(${prevInvocationVar});`,
|
|
303
|
+
];
|
|
304
|
+
// Insert preamble BEFORE the containing statement
|
|
305
|
+
lines.splice(containingLineIndex, 0, ...preambleLines);
|
|
306
|
+
// Now replace the call text with the result variable in the original line
|
|
307
|
+
// The original line has shifted by preambleLines.length
|
|
308
|
+
const shiftedLineIndex = containingLineIndex + preambleLines.length;
|
|
309
|
+
// The call might span multiple lines, so we need to find and replace it
|
|
310
|
+
// For single-line calls, just replace in the shifted line
|
|
311
|
+
// For multi-line, we need to handle the range
|
|
312
|
+
if (lineNumber === endLineNumber) {
|
|
313
|
+
// Single line call - simple replacement
|
|
314
|
+
const originalLine = lines[shiftedLineIndex];
|
|
315
|
+
lines[shiftedLineIndex] = originalLine.replace(callText, resultVar);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
// Multi-line call - need to handle more carefully
|
|
319
|
+
// Join the lines, replace, then split back
|
|
320
|
+
const startShiftedIndex = shiftedLineIndex + (lineNumber - containingStatementLine);
|
|
321
|
+
const endShiftedIndex = shiftedLineIndex + (endLineNumber - containingStatementLine);
|
|
322
|
+
// Get all lines that contain the call
|
|
323
|
+
const callLines = lines.slice(startShiftedIndex, endShiftedIndex + 1);
|
|
324
|
+
const joinedCall = callLines.join('\n');
|
|
325
|
+
// Replace the call text with result variable
|
|
326
|
+
const replaced = joinedCall.replace(callText, resultVar);
|
|
327
|
+
const replacedLines = replaced.split('\n');
|
|
328
|
+
// Splice out the old lines and insert the new ones
|
|
329
|
+
lines.splice(startShiftedIndex, callLines.length, ...replacedLines);
|
|
330
|
+
}
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
// Handle function calls nested inside other call expressions (e.g., arr.push(this.method()))
|
|
334
|
+
// Strategy: Insert logging + call extraction BEFORE the containing statement,
|
|
335
|
+
// then replace the call text in the original line with the result variable
|
|
336
|
+
if (statementType === 'nested_call_expression' &&
|
|
337
|
+
containingStatementLine &&
|
|
338
|
+
callText) {
|
|
339
|
+
const containingLineIndex = containingStatementLine - 1;
|
|
340
|
+
if (containingLineIndex < 0 || containingLineIndex >= lines.length) {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
const containingLine = lines[containingLineIndex];
|
|
344
|
+
const containingIndentation = containingLine.match(/^\s*/)?.[0] || ' ';
|
|
345
|
+
// Build the logging preamble to insert BEFORE the containing statement
|
|
346
|
+
const callLine = `${containingIndentation}const ${resultVar} = ${hasAwait ? 'await ' : ''}this.${methodName}(${args});`;
|
|
347
|
+
const completeLog = `${containingIndentation}const ${durationVar} = Date.now() - __functionCallStart_${variableId}; __bubbleFlowSelf.logger?.logFunctionCallComplete(${variableId}, '${methodName}', ${resultVar}, ${durationVar}, ${lineNumber});`;
|
|
348
|
+
const preambleLines = [
|
|
349
|
+
`${containingIndentation}const __functionCallStart_${variableId} = Date.now();`,
|
|
350
|
+
`${containingIndentation}const ${argsVar} = ${argsArray};`,
|
|
351
|
+
`${containingIndentation}__bubbleFlowSelf.logger?.logFunctionCallStart(${variableId}, '${methodName}', ${argsVar}, ${lineNumber});`,
|
|
352
|
+
`${containingIndentation}const ${prevInvocationVar} = __bubbleFlowSelf?.__setInvocationCallSiteKey?.(${callSiteKeyLiteral});`,
|
|
353
|
+
callLine,
|
|
354
|
+
completeLog,
|
|
355
|
+
`${containingIndentation}__bubbleFlowSelf?.__restoreInvocationCallSiteKey?.(${prevInvocationVar});`,
|
|
356
|
+
];
|
|
357
|
+
// Insert preamble BEFORE the containing statement
|
|
358
|
+
lines.splice(containingLineIndex, 0, ...preambleLines);
|
|
359
|
+
// Now replace the call text with the result variable in the original line
|
|
360
|
+
// The original line has shifted by preambleLines.length
|
|
361
|
+
const shiftedLineIndex = containingLineIndex + preambleLines.length;
|
|
362
|
+
// The call might span multiple lines, so we need to find and replace it
|
|
363
|
+
// For single-line calls, just replace in the shifted line
|
|
364
|
+
// For multi-line, we need to handle the range
|
|
365
|
+
if (lineNumber === endLineNumber) {
|
|
366
|
+
// Single line call - simple replacement
|
|
367
|
+
const originalLine = lines[shiftedLineIndex];
|
|
368
|
+
lines[shiftedLineIndex] = originalLine.replace(callText, resultVar);
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
// Multi-line call - need to handle more carefully
|
|
372
|
+
// Join the lines, replace, then split back
|
|
373
|
+
const startShiftedIndex = shiftedLineIndex + (lineNumber - containingStatementLine);
|
|
374
|
+
const endShiftedIndex = shiftedLineIndex + (endLineNumber - containingStatementLine);
|
|
375
|
+
// Get all lines that contain the call
|
|
376
|
+
const callLines = lines.slice(startShiftedIndex, endShiftedIndex + 1);
|
|
377
|
+
const joinedCall = callLines.join('\n');
|
|
378
|
+
// Replace the call text with result variable
|
|
379
|
+
const replaced = joinedCall.replace(callText, resultVar);
|
|
380
|
+
const replacedLines = replaced.split('\n');
|
|
381
|
+
// Splice out the old lines and insert the new ones
|
|
382
|
+
lines.splice(startShiftedIndex, callLines.length, ...replacedLines);
|
|
383
|
+
}
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
// Use pre-determined statement type instead of regex matching
|
|
387
|
+
if (statementType === 'variable_declaration' &&
|
|
388
|
+
(variableName || destructuringPattern) &&
|
|
389
|
+
variableType) {
|
|
390
|
+
const callLine = `${indentation}const ${resultVar} = ${hasAwait ? 'await ' : ''}this.${methodName}(${args});`;
|
|
391
|
+
const completeLog = `${indentation}const ${durationVar} = Date.now() - __functionCallStart_${variableId}; __bubbleFlowSelf.logger?.logFunctionCallComplete(${variableId}, '${methodName}', ${resultVar}, ${durationVar}, ${lineNumber});`;
|
|
392
|
+
// Use destructuring pattern if present, otherwise use simple variable name
|
|
393
|
+
const assignPattern = destructuringPattern || variableName;
|
|
394
|
+
const assignLine = `${indentation}${variableType} ${assignPattern} = ${resultVar};`;
|
|
395
|
+
lines.splice(lineIndex, linesToRemove, startLog, argsLog, startCallLog, setInvocationLine, callLine, completeLog, restoreInvocationLine, assignLine);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
if (statementType === 'return') {
|
|
399
|
+
const callLine = `${indentation}const ${resultVar} = ${hasAwait ? 'await ' : ''}this.${methodName}(${args});`;
|
|
400
|
+
const completeLog = `${indentation}const ${durationVar} = Date.now() - __functionCallStart_${variableId}; __bubbleFlowSelf.logger?.logFunctionCallComplete(${variableId}, '${methodName}', ${resultVar}, ${durationVar}, ${lineNumber});`;
|
|
401
|
+
const returnLine = `${indentation}return ${resultVar};`;
|
|
402
|
+
lines.splice(lineIndex, linesToRemove, startLog, argsLog, startCallLog, setInvocationLine, callLine, completeLog, restoreInvocationLine, returnLine);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (statementType === 'assignment' && variableName) {
|
|
406
|
+
const callLine = `${indentation}const ${resultVar} = ${hasAwait ? 'await ' : ''}this.${methodName}(${args});`;
|
|
407
|
+
const completeLog = `${indentation}const ${durationVar} = Date.now() - __functionCallStart_${variableId}; __bubbleFlowSelf.logger?.logFunctionCallComplete(${variableId}, '${methodName}', ${resultVar}, ${durationVar}, ${lineNumber});`;
|
|
408
|
+
const assignLine = `${indentation}${variableName} = ${resultVar};`;
|
|
409
|
+
lines.splice(lineIndex, linesToRemove, startLog, argsLog, startCallLog, setInvocationLine, callLine, completeLog, restoreInvocationLine, assignLine);
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
// Simple statement (no assignment, no return)
|
|
413
|
+
const callLine = `${indentation}const ${resultVar} = ${hasAwait ? 'await ' : ''}this.${methodName}(${args});`;
|
|
414
|
+
const completeLog = `${indentation}const ${durationVar} = Date.now() - __functionCallStart_${variableId}; __bubbleFlowSelf.logger?.logFunctionCallComplete(${variableId}, '${methodName}', ${resultVar}, ${durationVar}, ${lineNumber});`;
|
|
415
|
+
lines.splice(lineIndex, linesToRemove, startLog, argsLog, startCallLog, setInvocationLine, callLine, completeLog, restoreInvocationLine);
|
|
416
|
+
}
|
|
417
|
+
injectPromiseAllElementLogging(lines, lineIndex, linesToRemove, indentation, details) {
|
|
418
|
+
const { args, argsArray, argsVar, durationVar, lineNumber, methodName, resultVar, variableId, callSiteKeyLiteral, callText, } = details;
|
|
419
|
+
const innerIndent = `${indentation} `;
|
|
420
|
+
const prevInvocationVar = `__promiseAllPrevInvocationCallSiteKey_${variableId}`;
|
|
421
|
+
// Build the async IIFE that wraps the method call with logging
|
|
422
|
+
const asyncIIFE = [
|
|
423
|
+
`(async () => {`,
|
|
424
|
+
`${innerIndent}const __functionCallStart_${variableId} = Date.now();`,
|
|
425
|
+
`${innerIndent}const ${argsVar} = ${argsArray};`,
|
|
426
|
+
`${innerIndent}__bubbleFlowSelf.logger?.logFunctionCallStart(${variableId}, '${methodName}', ${argsVar}, ${lineNumber});`,
|
|
427
|
+
`${innerIndent}const ${prevInvocationVar} = __bubbleFlowSelf?.__setInvocationCallSiteKey?.(${callSiteKeyLiteral});`,
|
|
428
|
+
`${innerIndent}const ${resultVar} = await this.${methodName}(${args});`,
|
|
429
|
+
`${innerIndent}const ${durationVar} = Date.now() - __functionCallStart_${variableId};`,
|
|
430
|
+
`${innerIndent}__bubbleFlowSelf.logger?.logFunctionCallComplete(${variableId}, '${methodName}', ${resultVar}, ${durationVar}, ${lineNumber});`,
|
|
431
|
+
`${innerIndent}__bubbleFlowSelf?.__restoreInvocationCallSiteKey?.(${prevInvocationVar});`,
|
|
432
|
+
`${innerIndent}return ${resultVar};`,
|
|
433
|
+
`${indentation}})()`,
|
|
434
|
+
].join('\n');
|
|
435
|
+
// If callText is provided, do inline replacement (for arrow function expression bodies)
|
|
436
|
+
if (callText) {
|
|
437
|
+
const originalLines = lines.slice(lineIndex, lineIndex + linesToRemove);
|
|
438
|
+
const joinedOriginal = originalLines.join('\n');
|
|
439
|
+
const replaced = joinedOriginal.replace(callText, asyncIIFE);
|
|
440
|
+
const replacedLines = replaced.split('\n');
|
|
441
|
+
lines.splice(lineIndex, linesToRemove, ...replacedLines);
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
// Original behavior: replace entire lines (for Promise.all array elements)
|
|
445
|
+
const originalLines = lines.slice(lineIndex, lineIndex + linesToRemove);
|
|
446
|
+
const lastOriginalLine = originalLines[originalLines.length - 1] || '';
|
|
447
|
+
const trailingComma = lastOriginalLine.trimEnd().endsWith(',');
|
|
448
|
+
const wrappedLines = [
|
|
449
|
+
`${indentation}(async () => {`,
|
|
450
|
+
`${innerIndent}const __functionCallStart_${variableId} = Date.now();`,
|
|
451
|
+
`${innerIndent}const ${argsVar} = ${argsArray};`,
|
|
452
|
+
`${innerIndent}__bubbleFlowSelf.logger?.logFunctionCallStart(${variableId}, '${methodName}', ${argsVar}, ${lineNumber});`,
|
|
453
|
+
`${innerIndent}const ${prevInvocationVar} = __bubbleFlowSelf?.__setInvocationCallSiteKey?.(${callSiteKeyLiteral});`,
|
|
454
|
+
`${innerIndent}const ${resultVar} = await this.${methodName}(${args});`,
|
|
455
|
+
`${innerIndent}const ${durationVar} = Date.now() - __functionCallStart_${variableId};`,
|
|
456
|
+
`${innerIndent}__bubbleFlowSelf.logger?.logFunctionCallComplete(${variableId}, '${methodName}', ${resultVar}, ${durationVar}, ${lineNumber});`,
|
|
457
|
+
`${innerIndent}__bubbleFlowSelf?.__restoreInvocationCallSiteKey?.(${prevInvocationVar});`,
|
|
458
|
+
`${innerIndent}return ${resultVar};`,
|
|
459
|
+
`${indentation}})()${trailingComma ? ',' : ''}`,
|
|
460
|
+
];
|
|
461
|
+
lines.splice(lineIndex, linesToRemove, ...wrappedLines);
|
|
462
|
+
}
|
|
175
463
|
}
|
|
176
464
|
//# sourceMappingURL=LoggerInjector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoggerInjector.js","sourceRoot":"","sources":["../../src/injection/LoggerInjector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LoggerInjector.js","sourceRoot":"","sources":["../../src/injection/LoggerInjector.ts"],"names":[],"mappings":"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"}
|
package/dist/injection/index.js
CHANGED
|
@@ -1,15 +1,48 @@
|
|
|
1
1
|
import type { TSESTree } from '@typescript-eslint/typescript-estree';
|
|
2
2
|
import type { ScopeManager, Variable } from '@bubblelab/ts-scope-manager';
|
|
3
3
|
import { BubbleFactory } from '@bubblelab/bubble-core';
|
|
4
|
-
import type { ParsedBubbleWithInfo, BubbleTrigger } from '@bubblelab/shared-schemas';
|
|
4
|
+
import type { ParsedBubbleWithInfo, BubbleTrigger, ParsedWorkflow } from '@bubblelab/shared-schemas';
|
|
5
|
+
/**
|
|
6
|
+
* Detailed information about a method invocation captured during AST parsing
|
|
7
|
+
*/
|
|
8
|
+
export interface MethodInvocationInfo {
|
|
9
|
+
lineNumber: number;
|
|
10
|
+
endLineNumber: number;
|
|
11
|
+
columnNumber: number;
|
|
12
|
+
invocationIndex: number;
|
|
13
|
+
hasAwait: boolean;
|
|
14
|
+
arguments: string;
|
|
15
|
+
statementType: 'variable_declaration' | 'assignment' | 'return' | 'simple' | 'condition_expression' | 'nested_call_expression';
|
|
16
|
+
variableName?: string;
|
|
17
|
+
variableType?: 'const' | 'let' | 'var';
|
|
18
|
+
destructuringPattern?: string;
|
|
19
|
+
context?: 'default' | 'promise_all_element';
|
|
20
|
+
/** For condition_expression: the line where the containing statement (if/while/etc) starts */
|
|
21
|
+
containingStatementLine?: number;
|
|
22
|
+
/** For condition_expression: the exact source range of the call expression to replace */
|
|
23
|
+
callRange?: {
|
|
24
|
+
start: number;
|
|
25
|
+
end: number;
|
|
26
|
+
};
|
|
27
|
+
/** For condition_expression: the full text of the call expression (e.g., "this.validateEmail(email)") */
|
|
28
|
+
callText?: string;
|
|
29
|
+
}
|
|
5
30
|
export declare class BubbleScript {
|
|
6
31
|
private ast;
|
|
7
32
|
private scopeManager;
|
|
33
|
+
parsingErrors: string[];
|
|
8
34
|
private parsedBubbles;
|
|
9
35
|
private originalParsedBubbles;
|
|
36
|
+
private workflow;
|
|
10
37
|
private scriptVariables;
|
|
11
38
|
private variableLocations;
|
|
12
|
-
|
|
39
|
+
instanceMethodsLocation: Record<string, {
|
|
40
|
+
startLine: number;
|
|
41
|
+
endLine: number;
|
|
42
|
+
definitionStartLine: number;
|
|
43
|
+
bodyStartLine: number;
|
|
44
|
+
invocationLines: MethodInvocationInfo[];
|
|
45
|
+
}>;
|
|
13
46
|
private bubbleScript;
|
|
14
47
|
private bubbleFactory;
|
|
15
48
|
currentBubbleScript: string;
|
|
@@ -95,6 +128,10 @@ export declare class BubbleScript {
|
|
|
95
128
|
* Get the parsed bubbles found in the script
|
|
96
129
|
*/
|
|
97
130
|
getParsedBubbles(): Record<number, ParsedBubbleWithInfo>;
|
|
131
|
+
/**
|
|
132
|
+
* Get the hierarchical workflow structure
|
|
133
|
+
*/
|
|
134
|
+
getWorkflow(): ParsedWorkflow;
|
|
98
135
|
/**
|
|
99
136
|
* Get the handle method location (start and end lines)
|
|
100
137
|
*/
|
|
@@ -104,6 +141,13 @@ export declare class BubbleScript {
|
|
|
104
141
|
definitionStartLine: number;
|
|
105
142
|
bodyStartLine: number;
|
|
106
143
|
} | null;
|
|
144
|
+
getInstanceMethodLocation(methodName: string): {
|
|
145
|
+
startLine: number;
|
|
146
|
+
endLine: number;
|
|
147
|
+
definitionStartLine: number;
|
|
148
|
+
bodyStartLine: number;
|
|
149
|
+
invocationLines: MethodInvocationInfo[];
|
|
150
|
+
} | null;
|
|
107
151
|
/**
|
|
108
152
|
* Get location information for a variable by its $id
|
|
109
153
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BubbleScript.d.ts","sourceRoot":"","sources":["../../src/parse/BubbleScript.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,EACV,YAAY,EAEZ,QAAQ,EACT,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,
|
|
1
|
+
{"version":3,"file":"BubbleScript.d.ts","sourceRoot":"","sources":["../../src/parse/BubbleScript.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { analyze, resetIds } from '@bubblelab/ts-scope-manager';
|
|
2
2
|
import { parse } from '@typescript-eslint/typescript-estree';
|
|
3
3
|
import { BubbleParser } from '../extraction/BubbleParser';
|
|
4
|
+
import { normalizeBracelessControlFlow } from '../utils/normalize-control-flow';
|
|
4
5
|
export class BubbleScript {
|
|
5
6
|
ast;
|
|
6
7
|
scopeManager;
|
|
8
|
+
parsingErrors = [];
|
|
7
9
|
// Stores parsed bubble information with variable $id as key
|
|
8
10
|
parsedBubbles;
|
|
9
11
|
originalParsedBubbles;
|
|
12
|
+
workflow;
|
|
10
13
|
scriptVariables; // Maps Variable.$id to Variable
|
|
11
14
|
variableLocations; // Maps Variable.$id to location
|
|
12
|
-
|
|
15
|
+
instanceMethodsLocation;
|
|
13
16
|
bubbleScript;
|
|
14
17
|
bubbleFactory;
|
|
15
18
|
currentBubbleScript;
|
|
@@ -28,7 +31,6 @@ export class BubbleScript {
|
|
|
28
31
|
sourceType: 'module', // Treat as ES module
|
|
29
32
|
ecmaVersion: 2022, // Modern JS/TS features
|
|
30
33
|
});
|
|
31
|
-
console.log('Done parsing AST');
|
|
32
34
|
// Analyze scope to build variable dependency graph
|
|
33
35
|
this.scopeManager = analyze(this.ast, {
|
|
34
36
|
sourceType: 'module',
|
|
@@ -39,18 +41,21 @@ export class BubbleScript {
|
|
|
39
41
|
// Parse bubble dependencies from AST using the provided factory and scope manager
|
|
40
42
|
const bubbleParser = new BubbleParser(this.currentBubbleScript);
|
|
41
43
|
const parseResult = bubbleParser.parseBubblesFromAST(this.bubbleFactory, this.ast, this.scopeManager);
|
|
42
|
-
this.
|
|
44
|
+
this.instanceMethodsLocation = parseResult.instanceMethodsLocation;
|
|
43
45
|
this.parsedBubbles = parseResult.bubbles;
|
|
46
|
+
this.workflow = parseResult.workflow;
|
|
44
47
|
this.trigger = this.getBubbleTriggerEventType() ?? { type: 'webhook/http' };
|
|
45
48
|
}
|
|
46
49
|
constructor(bubbleScript, bubbleFactory) {
|
|
47
50
|
// Reset ID generator to ensure deterministic variable IDs
|
|
48
51
|
resetIds();
|
|
52
|
+
// Normalize braceless control flow statements to prevent injection issues
|
|
53
|
+
const normalizedScript = normalizeBracelessControlFlow(bubbleScript);
|
|
49
54
|
// Parse the bubble script into AST
|
|
50
|
-
this.bubbleScript =
|
|
51
|
-
this.currentBubbleScript =
|
|
55
|
+
this.bubbleScript = normalizedScript;
|
|
56
|
+
this.currentBubbleScript = normalizedScript;
|
|
52
57
|
this.bubbleFactory = bubbleFactory;
|
|
53
|
-
this.ast = parse(
|
|
58
|
+
this.ast = parse(normalizedScript, {
|
|
54
59
|
range: true, // Required for scope-manager
|
|
55
60
|
loc: true, // Location info for line numbers
|
|
56
61
|
sourceType: 'module', // Treat as ES module
|
|
@@ -64,11 +69,12 @@ export class BubbleScript {
|
|
|
64
69
|
// Build variable mapping first
|
|
65
70
|
this.scriptVariables = this.buildVariableMapping();
|
|
66
71
|
// Parse bubble dependencies from AST using the provided factory and scope manager
|
|
67
|
-
const bubbleParser = new BubbleParser(
|
|
72
|
+
const bubbleParser = new BubbleParser(normalizedScript);
|
|
68
73
|
const parseResult = bubbleParser.parseBubblesFromAST(bubbleFactory, this.ast, this.scopeManager);
|
|
69
74
|
this.parsedBubbles = parseResult.bubbles;
|
|
70
75
|
this.originalParsedBubbles = parseResult.bubbles;
|
|
71
|
-
this.
|
|
76
|
+
this.workflow = parseResult.workflow;
|
|
77
|
+
this.instanceMethodsLocation = parseResult.instanceMethodsLocation;
|
|
72
78
|
this.trigger = this.getBubbleTriggerEventType() ?? { type: 'webhook/http' };
|
|
73
79
|
}
|
|
74
80
|
// getter for bubblescript (computed property)
|
|
@@ -89,8 +95,11 @@ export class BubbleScript {
|
|
|
89
95
|
for (const bubble of Object.values(bubbles)) {
|
|
90
96
|
console.debug(`Bubble ${bubble.bubbleName} location: ${bubble.location.startLine}-${bubble.location.endLine}`);
|
|
91
97
|
}
|
|
92
|
-
// Print
|
|
93
|
-
console.debug(
|
|
98
|
+
// Print instance methods locations
|
|
99
|
+
console.debug('Instance methods locations:');
|
|
100
|
+
for (const [methodName, location] of Object.entries(this.instanceMethodsLocation)) {
|
|
101
|
+
console.debug(` ${methodName}: ${location.bodyStartLine}-${location.endLine} (invocations: ${location.invocationLines.join(', ')})`);
|
|
102
|
+
}
|
|
94
103
|
console.debug('---------------------------------');
|
|
95
104
|
console.debug(`##################`);
|
|
96
105
|
}
|
|
@@ -386,11 +395,30 @@ export class BubbleScript {
|
|
|
386
395
|
getParsedBubbles() {
|
|
387
396
|
return this.parsedBubbles;
|
|
388
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Get the hierarchical workflow structure
|
|
400
|
+
*/
|
|
401
|
+
getWorkflow() {
|
|
402
|
+
return this.workflow;
|
|
403
|
+
}
|
|
389
404
|
/**
|
|
390
405
|
* Get the handle method location (start and end lines)
|
|
391
406
|
*/
|
|
392
407
|
getHandleMethodLocation() {
|
|
393
|
-
return
|
|
408
|
+
// Backward compatibility: return handle method from instanceMethodsLocation
|
|
409
|
+
const handleMethod = this.instanceMethodsLocation['handle'];
|
|
410
|
+
if (handleMethod) {
|
|
411
|
+
return {
|
|
412
|
+
startLine: handleMethod.startLine,
|
|
413
|
+
endLine: handleMethod.endLine,
|
|
414
|
+
definitionStartLine: handleMethod.definitionStartLine,
|
|
415
|
+
bodyStartLine: handleMethod.bodyStartLine,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
getInstanceMethodLocation(methodName) {
|
|
421
|
+
return this.instanceMethodsLocation[methodName] || null;
|
|
394
422
|
}
|
|
395
423
|
/**
|
|
396
424
|
* Get location information for a variable by its $id
|