@clayroach/unplugin 0.1.0-source-trace.4 → 0.1.0-source-trace.5
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/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/transformers/sourceTrace.js +56 -6
- package/dist/cjs/transformers/sourceTrace.js.map +1 -1
- package/dist/cjs/transformers/withSpanTrace.js +54 -2
- package/dist/cjs/transformers/withSpanTrace.js.map +1 -1
- package/dist/cjs/utils/effectDetection.js +54 -0
- package/dist/cjs/utils/effectDetection.js.map +1 -1
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/transformers/sourceTrace.d.ts +11 -2
- package/dist/dts/transformers/sourceTrace.d.ts.map +1 -1
- package/dist/dts/transformers/withSpanTrace.d.ts.map +1 -1
- package/dist/dts/utils/effectDetection.d.ts +15 -1
- package/dist/dts/utils/effectDetection.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/transformers/sourceTrace.js +66 -7
- package/dist/esm/transformers/sourceTrace.js.map +1 -1
- package/dist/esm/transformers/withSpanTrace.js +56 -2
- package/dist/esm/transformers/withSpanTrace.js.map +1 -1
- package/dist/esm/utils/effectDetection.js +54 -0
- package/dist/esm/utils/effectDetection.js.map +1 -1
- package/package.json +2 -5
- package/src/index.ts +7 -1
- package/src/transformers/sourceTrace.ts +91 -9
- package/src/transformers/withSpanTrace.ts +74 -2
- package/src/utils/effectDetection.ts +49 -1
package/dist/cjs/index.js
CHANGED
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_generator","_interopRequireDefault","require","_parser","_traverse2","_unplugin","_annotateEffects","_sourceTrace","_withSpanTrace","e","__esModule","default","traverse","_traverse","generate","_generate","DEFAULT_INCLUDE","DEFAULT_EXCLUDE","shouldTransform","id","include","exclude","pattern","includes","test","unpluginFactory","options","annotateEffects","sourceTrace","spanTrace","name","transformInclude","transform","code","ast","parse","sourceType","plugins","visitors","push","createSourceTraceVisitor","createWithSpanTraceVisitor","annotateState","filename","createAnnotateEffectsVisitor","undefined","length","states","map","hoisting","hoistedTraces","Map","counter","statements","i","output","sourceMaps","sourceFileName","unplugin","exports","createUnplugin","_default"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":";;;;;;AAwBA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAH,sBAAA,CAAAC,OAAA;AAEA,IAAAG,SAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AAA4E,SAAAD,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAiB5E;AACA,MAAMG,QAAQ,GAAe,OAAOC,kBAAS,KAAK,UAAU,GACxDA,kBAAuB,GACtBA,kBAAgD,CAACF,OAAO;AAE7D,MAAMG,QAAQ,GAAe,OAAOC,kBAAS,KAAK,UAAU,GACxDA,kBAAuB,GACtBA,kBAAgD,CAACJ,OAAO;
|
|
1
|
+
{"version":3,"file":"index.js","names":["_generator","_interopRequireDefault","require","_parser","_traverse2","_unplugin","_annotateEffects","_sourceTrace","_withSpanTrace","e","__esModule","default","traverse","_traverse","generate","_generate","DEFAULT_INCLUDE","DEFAULT_EXCLUDE","shouldTransform","id","include","exclude","pattern","includes","test","unpluginFactory","options","annotateEffects","sourceTrace","spanTrace","name","transformInclude","transform","code","ast","parse","sourceType","plugins","visitors","push","createSourceTraceVisitor","createWithSpanTraceVisitor","annotateState","filename","createAnnotateEffectsVisitor","undefined","length","states","map","hoisting","hoistedTraces","Map","counter","statements","generatorAdapters","i","output","sourceMaps","sourceFileName","unplugin","exports","createUnplugin","_default"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -9,6 +9,21 @@ var t = _interopRequireWildcard(require("@babel/types"));
|
|
|
9
9
|
var _effectDetection = require("../utils/effectDetection.js");
|
|
10
10
|
var _hoisting = require("../utils/hoisting.js");
|
|
11
11
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
|
+
/**
|
|
13
|
+
* Default adapter name to use when adding one to modern pattern generators.
|
|
14
|
+
*/
|
|
15
|
+
const INJECTED_ADAPTER_NAME = "$";
|
|
16
|
+
/**
|
|
17
|
+
* Gets the adapter parameter name from a generator function, or null if none.
|
|
18
|
+
*/
|
|
19
|
+
function getAdapterParamName(gen) {
|
|
20
|
+
if (gen.params.length === 0) return null;
|
|
21
|
+
const firstParam = gen.params[0];
|
|
22
|
+
if (t.isIdentifier(firstParam)) {
|
|
23
|
+
return firstParam.name;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
12
27
|
/**
|
|
13
28
|
* Creates a Babel visitor that injects source trace metadata into Effect.gen yields.
|
|
14
29
|
*/
|
|
@@ -18,6 +33,7 @@ function createSourceTraceVisitor(filename, _options) {
|
|
|
18
33
|
enter(_path, state) {
|
|
19
34
|
state.filename = filename;
|
|
20
35
|
state.hoisting = (0, _hoisting.createHoistingState)();
|
|
36
|
+
state.generatorAdapters = new Map();
|
|
21
37
|
},
|
|
22
38
|
exit(path, state) {
|
|
23
39
|
// Prepend all hoisted statements to the program body
|
|
@@ -26,22 +42,56 @@ function createSourceTraceVisitor(filename, _options) {
|
|
|
26
42
|
}
|
|
27
43
|
}
|
|
28
44
|
},
|
|
45
|
+
// Process Effect.gen calls to detect and optionally add adapter parameters
|
|
46
|
+
CallExpression(path, state) {
|
|
47
|
+
const node = path.node;
|
|
48
|
+
if (!(0, _effectDetection.isEffectGenCall)(node)) return;
|
|
49
|
+
const generator = (0, _effectDetection.getEffectGenGenerator)(node);
|
|
50
|
+
if (!generator) return;
|
|
51
|
+
// Check if generator already has an adapter parameter
|
|
52
|
+
const existingAdapter = getAdapterParamName(generator);
|
|
53
|
+
if (existingAdapter) {
|
|
54
|
+
// Generator uses legacy adapter pattern - store the name
|
|
55
|
+
state.generatorAdapters.set(generator, existingAdapter);
|
|
56
|
+
} else {
|
|
57
|
+
// Modern pattern - add adapter parameter
|
|
58
|
+
generator.params.unshift(t.identifier(INJECTED_ADAPTER_NAME));
|
|
59
|
+
state.generatorAdapters.set(generator, INJECTED_ADAPTER_NAME);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
29
62
|
YieldExpression(path, state) {
|
|
30
63
|
const node = path.node;
|
|
31
|
-
//
|
|
32
|
-
if (!
|
|
64
|
+
// Must be yield* (delegating)
|
|
65
|
+
if (!node.delegate || !node.argument) return;
|
|
66
|
+
// Find the enclosing generator function
|
|
67
|
+
let generatorPath = path.getFunctionParent();
|
|
68
|
+
if (!generatorPath) return;
|
|
69
|
+
const generatorNode = generatorPath.node;
|
|
70
|
+
if (!("generator" in generatorNode) || !generatorNode.generator) return;
|
|
71
|
+
// Get the adapter name for this generator
|
|
72
|
+
const adapterName = state.generatorAdapters.get(generatorNode);
|
|
73
|
+
if (!adapterName) {
|
|
74
|
+
// Not inside an Effect.gen - skip
|
|
33
75
|
return;
|
|
34
76
|
}
|
|
35
77
|
// Get source location
|
|
36
78
|
const loc = node.loc;
|
|
37
79
|
if (!loc) return;
|
|
38
|
-
// Extract label from parent (e.g., `const user = yield*
|
|
80
|
+
// Extract label from parent (e.g., `const user = yield* ...`)
|
|
39
81
|
const label = (0, _hoisting.extractLabelFromParent)(path);
|
|
40
82
|
// Get or create hoisted trace identifier
|
|
41
83
|
const traceId = (0, _hoisting.getOrCreateTraceIdentifier)(state.hoisting, state.filename, loc.start.line, loc.start.column, label);
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
84
|
+
// Check if this is already an adapter call
|
|
85
|
+
if (t.isCallExpression(node.argument) && (0, _effectDetection.isYieldAdapterCallWithName)(node, adapterName)) {
|
|
86
|
+
// Legacy pattern: _(effect) -> _(effect, trace)
|
|
87
|
+
const callExpr = node.argument;
|
|
88
|
+
callExpr.arguments.push(t.cloneNode(traceId));
|
|
89
|
+
} else if ((0, _effectDetection.isModernYield)(node)) {
|
|
90
|
+
// Modern pattern: effect -> $(effect, trace)
|
|
91
|
+
const originalArg = node.argument;
|
|
92
|
+
const wrappedCall = t.callExpression(t.identifier(adapterName), [originalArg, t.cloneNode(traceId)]);
|
|
93
|
+
node.argument = wrappedCall;
|
|
94
|
+
}
|
|
45
95
|
}
|
|
46
96
|
};
|
|
47
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourceTrace.js","names":["t","_interopRequireWildcard","require","_effectDetection","_hoisting","e","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","createSourceTraceVisitor","filename","_options","Program","enter","_path","state","hoisting","createHoistingState","exit","path","statements","
|
|
1
|
+
{"version":3,"file":"sourceTrace.js","names":["t","_interopRequireWildcard","require","_effectDetection","_hoisting","e","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","INJECTED_ADAPTER_NAME","getAdapterParamName","gen","params","length","firstParam","isIdentifier","name","createSourceTraceVisitor","filename","_options","Program","enter","_path","state","hoisting","createHoistingState","generatorAdapters","Map","exit","path","statements","unshiftContainer","CallExpression","node","isEffectGenCall","generator","getEffectGenGenerator","existingAdapter","unshift","identifier","YieldExpression","delegate","argument","generatorPath","getFunctionParent","generatorNode","adapterName","loc","label","extractLabelFromParent","traceId","getOrCreateTraceIdentifier","start","line","column","isCallExpression","isYieldAdapterCallWithName","callExpr","arguments","push","cloneNode","isModernYield","originalArg","wrappedCall","callExpression","sourceTraceTransformer","options","visitor"],"sources":["../../../src/transformers/sourceTrace.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -41,6 +41,44 @@ function isDataFirstCall(node) {
|
|
|
41
41
|
// Default to data-last pattern
|
|
42
42
|
return false;
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Extracts the basename from a filepath.
|
|
46
|
+
*/
|
|
47
|
+
function basename(filepath) {
|
|
48
|
+
const parts = filepath.split(/[/\\]/);
|
|
49
|
+
return parts[parts.length - 1] || filepath;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Modifies a span name to include source location.
|
|
53
|
+
* "fetchUser" -> "fetchUser (index.ts:9)"
|
|
54
|
+
*/
|
|
55
|
+
function createSpanNameWithLocation(originalName, filepath, line) {
|
|
56
|
+
const filename = basename(filepath);
|
|
57
|
+
return `${originalName} (${filename}:${line})`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Creates the source location suffix string.
|
|
61
|
+
*/
|
|
62
|
+
function createLocationSuffix(filepath, line) {
|
|
63
|
+
const filename = basename(filepath);
|
|
64
|
+
return ` (${filename}:${line})`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Modifies a template literal span name to include source location.
|
|
68
|
+
* Appends the location to the last quasi of the template.
|
|
69
|
+
*/
|
|
70
|
+
function modifyTemplateLiteralWithLocation(templateLiteral, filepath, line) {
|
|
71
|
+
const suffix = createLocationSuffix(filepath, line);
|
|
72
|
+
const quasis = [...templateLiteral.quasis];
|
|
73
|
+
const lastQuasi = quasis[quasis.length - 1];
|
|
74
|
+
// Create new quasi with appended location
|
|
75
|
+
const newLastQuasi = t.templateElement({
|
|
76
|
+
raw: lastQuasi.value.raw + suffix,
|
|
77
|
+
cooked: (lastQuasi.value.cooked || lastQuasi.value.raw) + suffix
|
|
78
|
+
}, lastQuasi.tail);
|
|
79
|
+
quasis[quasis.length - 1] = newLastQuasi;
|
|
80
|
+
return t.templateLiteral(quasis, [...templateLiteral.expressions]);
|
|
81
|
+
}
|
|
44
82
|
/**
|
|
45
83
|
* Creates the attributes object with source location.
|
|
46
84
|
*/
|
|
@@ -106,7 +144,14 @@ function createWithSpanTraceVisitor(filename, _options) {
|
|
|
106
144
|
const isDataFirst = isDataFirstCall(node);
|
|
107
145
|
if (isDataFirst) {
|
|
108
146
|
// Data-first: withSpan(effect, "name", options?)
|
|
109
|
-
//
|
|
147
|
+
// Name is at index 1, options at index 2
|
|
148
|
+
const nameArg = node.arguments[1];
|
|
149
|
+
if (t.isStringLiteral(nameArg)) {
|
|
150
|
+
const newName = createSpanNameWithLocation(nameArg.value, state.filename, line);
|
|
151
|
+
node.arguments[1] = t.stringLiteral(newName);
|
|
152
|
+
} else if (t.isTemplateLiteral(nameArg)) {
|
|
153
|
+
node.arguments[1] = modifyTemplateLiteralWithLocation(nameArg, state.filename, line);
|
|
154
|
+
}
|
|
110
155
|
const optionsArg = node.arguments[2];
|
|
111
156
|
const newOptions = mergeOrCreateOptions(optionsArg, sourceAttrs);
|
|
112
157
|
if (node.arguments.length >= 3) {
|
|
@@ -118,7 +163,14 @@ function createWithSpanTraceVisitor(filename, _options) {
|
|
|
118
163
|
}
|
|
119
164
|
} else {
|
|
120
165
|
// Data-last: withSpan("name", options?)
|
|
121
|
-
//
|
|
166
|
+
// Name is at index 0, options at index 1
|
|
167
|
+
const nameArg = node.arguments[0];
|
|
168
|
+
if (t.isStringLiteral(nameArg)) {
|
|
169
|
+
const newName = createSpanNameWithLocation(nameArg.value, state.filename, line);
|
|
170
|
+
node.arguments[0] = t.stringLiteral(newName);
|
|
171
|
+
} else if (t.isTemplateLiteral(nameArg)) {
|
|
172
|
+
node.arguments[0] = modifyTemplateLiteralWithLocation(nameArg, state.filename, line);
|
|
173
|
+
}
|
|
122
174
|
const optionsArg = node.arguments[1];
|
|
123
175
|
const newOptions = mergeOrCreateOptions(optionsArg, sourceAttrs);
|
|
124
176
|
if (node.arguments.length >= 2) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withSpanTrace.js","names":["t","_interopRequireWildcard","require","_hoisting","e","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","isWithSpanCall","node","callee","type","property","name","isDataFirstCall","arguments","length","isStringLiteral","
|
|
1
|
+
{"version":3,"file":"withSpanTrace.js","names":["t","_interopRequireWildcard","require","_hoisting","e","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","isWithSpanCall","node","callee","type","property","name","isDataFirstCall","arguments","length","isStringLiteral","basename","filepath","parts","split","createSpanNameWithLocation","originalName","line","filename","createLocationSuffix","modifyTemplateLiteralWithLocation","templateLiteral","suffix","quasis","lastQuasi","newLastQuasi","templateElement","raw","value","cooked","tail","expressions","createSourceAttributes","column","objectExpression","objectProperty","stringLiteral","numericLiteral","mergeOrCreateOptions","existingOptions","sourceAttrs","isSpreadElement","isArgumentPlaceholder","identifier","isObjectExpression","existingAttrsIndex","properties","findIndex","prop","isObjectProperty","isIdentifier","key","existingAttrsProp","mergedAttrs","spreadElement","newProperties","createWithSpanTraceVisitor","_options","Program","enter","_path","state","hoisting","createHoistingState","exit","path","statements","unshiftContainer","CallExpression","loc","start","isDataFirst","nameArg","newName","isTemplateLiteral","optionsArg","newOptions","push","withSpanTraceTransformer","options","visitor"],"sources":["../../../src/transformers/withSpanTrace.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -3,10 +3,21 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.getEffectGenGenerator = getEffectGenGenerator;
|
|
6
7
|
exports.isAdapterCall = isAdapterCall;
|
|
7
8
|
exports.isEffectGenCall = isEffectGenCall;
|
|
8
9
|
exports.isInsideEffectGen = isInsideEffectGen;
|
|
10
|
+
exports.isModernYield = isModernYield;
|
|
9
11
|
exports.isYieldAdapterCall = isYieldAdapterCall;
|
|
12
|
+
exports.isYieldAdapterCallWithName = isYieldAdapterCallWithName;
|
|
13
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
14
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
15
|
+
/**
|
|
16
|
+
* Utilities for detecting Effect patterns in AST nodes.
|
|
17
|
+
*
|
|
18
|
+
* @since 0.1.0
|
|
19
|
+
*/
|
|
20
|
+
|
|
10
21
|
/**
|
|
11
22
|
* Checks if a CallExpression is `Effect.gen(...)`.
|
|
12
23
|
*/
|
|
@@ -55,4 +66,47 @@ function isYieldAdapterCall(node) {
|
|
|
55
66
|
if (node.argument.type !== "CallExpression") return false;
|
|
56
67
|
return isAdapterCall(node.argument);
|
|
57
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Checks if a YieldExpression is a `yield* _(effect)` pattern with a specific adapter name.
|
|
71
|
+
*/
|
|
72
|
+
function isYieldAdapterCallWithName(node, adapterName) {
|
|
73
|
+
if (!node.delegate) return false; // Must be yield*, not yield
|
|
74
|
+
if (!node.argument) return false;
|
|
75
|
+
if (node.argument.type !== "CallExpression") return false;
|
|
76
|
+
const callee = node.argument.callee;
|
|
77
|
+
return callee.type === "Identifier" && callee.name === adapterName;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Checks if a YieldExpression is a modern `yield* effect` pattern (without adapter).
|
|
81
|
+
* This is the pattern used when Effect.gen is called without the adapter parameter.
|
|
82
|
+
*/
|
|
83
|
+
function isModernYield(node) {
|
|
84
|
+
if (!node.delegate) return false; // Must be yield*, not yield
|
|
85
|
+
if (!node.argument) return false;
|
|
86
|
+
// Modern yields are NOT adapter calls - they yield the effect directly
|
|
87
|
+
if (node.argument.type === "CallExpression" && isAdapterCall(node.argument)) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Gets the generator function from an Effect.gen call.
|
|
94
|
+
* Returns the FunctionExpression/ArrowFunctionExpression if found.
|
|
95
|
+
*/
|
|
96
|
+
function getEffectGenGenerator(node) {
|
|
97
|
+
// Effect.gen can be called with 1 or 2 arguments:
|
|
98
|
+
// Effect.gen(function*() { ... }) - 1 arg
|
|
99
|
+
// Effect.gen(context, function*() { ... }) - 2 args
|
|
100
|
+
const args = node.arguments;
|
|
101
|
+
for (let i = args.length - 1; i >= 0; i--) {
|
|
102
|
+
const arg = args[i];
|
|
103
|
+
if (t.isFunctionExpression(arg) && arg.generator) {
|
|
104
|
+
return arg;
|
|
105
|
+
}
|
|
106
|
+
if (t.isArrowFunctionExpression(arg) && arg.generator) {
|
|
107
|
+
return arg;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
58
112
|
//# sourceMappingURL=effectDetection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectDetection.js","names":["isEffectGenCall","node","type","callee","object","name","property","isInsideEffectGen","path","current","parentPath","parent","isAdapterCall","isYieldAdapterCall","delegate","argument"],"sources":["../../../src/utils/effectDetection.ts"],"sourcesContent":[null],"mappings":"
|
|
1
|
+
{"version":3,"file":"effectDetection.js","names":["t","_interopRequireWildcard","require","e","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","isEffectGenCall","node","type","callee","object","name","property","isInsideEffectGen","path","current","parentPath","parent","isAdapterCall","isYieldAdapterCall","delegate","argument","isYieldAdapterCallWithName","adapterName","isModernYield","getEffectGenGenerator","args","arguments","length","arg","isFunctionExpression","generator","isArrowFunctionExpression"],"sources":["../../../src/utils/effectDetection.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/dts/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAwC,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAwC,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAA;AA0CtF;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAE9B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;IAElC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAExC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACzC;AAuHD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,gBAAgB,CAAC,mBAAmB,GAAG,SAAS,EAAE,OAAO,CAAmC,CAAA;AAEnH;;;;GAIG;AACH,eAAe,QAAQ,CAAA"}
|
|
@@ -2,8 +2,12 @@
|
|
|
2
2
|
* Source location trace transformer.
|
|
3
3
|
*
|
|
4
4
|
* This transformer injects source location metadata into Effect.gen yield expressions.
|
|
5
|
-
* It
|
|
6
|
-
*
|
|
5
|
+
* It supports both patterns:
|
|
6
|
+
* - Legacy adapter: `yield* _(effect)` → `yield* _(effect, trace)`
|
|
7
|
+
* - Modern pattern: `yield* effect` → `yield* $_adapter(effect, trace)`
|
|
8
|
+
*
|
|
9
|
+
* For the modern pattern, the transformer adds an adapter parameter to the generator
|
|
10
|
+
* function if not present, since Effect.gen always passes the adapter at runtime.
|
|
7
11
|
*
|
|
8
12
|
* @since 0.1.0
|
|
9
13
|
*/
|
|
@@ -25,6 +29,11 @@ export interface SourceTraceOptions {
|
|
|
25
29
|
interface TransformState {
|
|
26
30
|
filename: string;
|
|
27
31
|
hoisting: HoistingState;
|
|
32
|
+
/**
|
|
33
|
+
* Map from generator function to its adapter parameter name.
|
|
34
|
+
* Used to track which generators have been processed and their adapter names.
|
|
35
|
+
*/
|
|
36
|
+
generatorAdapters: Map<unknown, string>;
|
|
28
37
|
}
|
|
29
38
|
/**
|
|
30
39
|
* Creates a Babel visitor that injects source trace metadata into Effect.gen yields.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourceTrace.d.ts","sourceRoot":"","sources":["../../../src/transformers/sourceTrace.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sourceTrace.d.ts","sourceRoot":"","sources":["../../../src/transformers/sourceTrace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAY,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAQxD,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAA;AAE7B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;CAChD;AAED;;GAEG;AACH,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,aAAa,CAAA;IACvB;;;OAGG;IACH,iBAAiB,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;CACxC;AAqBD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,cAAc,CAAC,CA6FzB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG;IACpE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAChC,IAAI,EAAE,MAAM,CAAA;CACb,CAKA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withSpanTrace.d.ts","sourceRoot":"","sources":["../../../src/transformers/withSpanTrace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAY,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAExD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAA;AAE7B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;CAChD;AAED;;GAEG;AACH,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,aAAa,CAAA;CACxB;
|
|
1
|
+
{"version":3,"file":"withSpanTrace.d.ts","sourceRoot":"","sources":["../../../src/transformers/withSpanTrace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAY,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAExD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAA;AAE7B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;CAChD;AAED;;GAEG;AACH,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,aAAa,CAAA;CACxB;AAkLD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA+EzB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG;IACxE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAChC,IAAI,EAAE,MAAM,CAAA;CACb,CAKA"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @since 0.1.0
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import * as t from "@babel/types";
|
|
7
7
|
/**
|
|
8
8
|
* Checks if a CallExpression is `Effect.gen(...)`.
|
|
9
9
|
*/
|
|
@@ -31,5 +31,19 @@ export declare function isAdapterCall(node: t.CallExpression): boolean;
|
|
|
31
31
|
* Checks if a YieldExpression is a `yield* _(effect)` pattern.
|
|
32
32
|
*/
|
|
33
33
|
export declare function isYieldAdapterCall(node: t.YieldExpression): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Checks if a YieldExpression is a `yield* _(effect)` pattern with a specific adapter name.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isYieldAdapterCallWithName(node: t.YieldExpression, adapterName: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Checks if a YieldExpression is a modern `yield* effect` pattern (without adapter).
|
|
40
|
+
* This is the pattern used when Effect.gen is called without the adapter parameter.
|
|
41
|
+
*/
|
|
42
|
+
export declare function isModernYield(node: t.YieldExpression): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Gets the generator function from an Effect.gen call.
|
|
45
|
+
* Returns the FunctionExpression/ArrowFunctionExpression if found.
|
|
46
|
+
*/
|
|
47
|
+
export declare function getEffectGenGenerator(node: t.CallExpression): t.FunctionExpression | t.ArrowFunctionExpression | null;
|
|
34
48
|
export {};
|
|
35
49
|
//# sourceMappingURL=effectDetection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectDetection.d.ts","sourceRoot":"","sources":["../../../src/utils/effectDetection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"effectDetection.d.ts","sourceRoot":"","sources":["../../../src/utils/effectDetection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,cAAc,CA0BtE;AAED;;;GAGG;AACH,UAAU,QAAQ;IAChB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAUzD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,cAAc,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,GAAG,OAAO,CAKnE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAMhG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,GAAG,OAAO,CAQ9D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,uBAAuB,GAAG,IAAI,CAiBrH"}
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAwBA,OAAO,SAAS,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAErC,OAAO,SAAS,MAAM,iBAAiB,CAAA;AAEvC,OAAO,EAAE,cAAc,EAA+C,MAAM,UAAU,CAAA;AACtF,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAA;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAiB5E,4DAA4D;AAC5D,MAAM,QAAQ,GAAe,OAAO,SAAS,KAAK,UAAU;IAC1D,CAAC,CAAC,SAAuB;IACzB,CAAC,CAAE,SAAgD,CAAC,OAAO,CAAA;AAE7D,MAAM,QAAQ,GAAe,OAAO,SAAS,KAAK,UAAU;IAC1D,CAAC,CAAC,SAAuB;IACzB,CAAC,CAAE,SAAgD,CAAC,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import * as t from "@babel/types";
|
|
2
|
-
import {
|
|
2
|
+
import { getEffectGenGenerator, isEffectGenCall, isModernYield, isYieldAdapterCallWithName } from "../utils/effectDetection.js";
|
|
3
3
|
import { createHoistingState, extractLabelFromParent, getOrCreateTraceIdentifier } from "../utils/hoisting.js";
|
|
4
|
+
/**
|
|
5
|
+
* Default adapter name to use when adding one to modern pattern generators.
|
|
6
|
+
*/
|
|
7
|
+
const INJECTED_ADAPTER_NAME = "$";
|
|
8
|
+
/**
|
|
9
|
+
* Gets the adapter parameter name from a generator function, or null if none.
|
|
10
|
+
*/
|
|
11
|
+
function getAdapterParamName(gen) {
|
|
12
|
+
if (gen.params.length === 0)
|
|
13
|
+
return null;
|
|
14
|
+
const firstParam = gen.params[0];
|
|
15
|
+
if (t.isIdentifier(firstParam)) {
|
|
16
|
+
return firstParam.name;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
4
20
|
/**
|
|
5
21
|
* Creates a Babel visitor that injects source trace metadata into Effect.gen yields.
|
|
6
22
|
*/
|
|
@@ -10,6 +26,7 @@ export function createSourceTraceVisitor(filename, _options) {
|
|
|
10
26
|
enter(_path, state) {
|
|
11
27
|
state.filename = filename;
|
|
12
28
|
state.hoisting = createHoistingState();
|
|
29
|
+
state.generatorAdapters = new Map();
|
|
13
30
|
},
|
|
14
31
|
exit(path, state) {
|
|
15
32
|
// Prepend all hoisted statements to the program body
|
|
@@ -18,23 +35,65 @@ export function createSourceTraceVisitor(filename, _options) {
|
|
|
18
35
|
}
|
|
19
36
|
}
|
|
20
37
|
},
|
|
38
|
+
// Process Effect.gen calls to detect and optionally add adapter parameters
|
|
39
|
+
CallExpression(path, state) {
|
|
40
|
+
const node = path.node;
|
|
41
|
+
if (!isEffectGenCall(node))
|
|
42
|
+
return;
|
|
43
|
+
const generator = getEffectGenGenerator(node);
|
|
44
|
+
if (!generator)
|
|
45
|
+
return;
|
|
46
|
+
// Check if generator already has an adapter parameter
|
|
47
|
+
const existingAdapter = getAdapterParamName(generator);
|
|
48
|
+
if (existingAdapter) {
|
|
49
|
+
// Generator uses legacy adapter pattern - store the name
|
|
50
|
+
state.generatorAdapters.set(generator, existingAdapter);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Modern pattern - add adapter parameter
|
|
54
|
+
generator.params.unshift(t.identifier(INJECTED_ADAPTER_NAME));
|
|
55
|
+
state.generatorAdapters.set(generator, INJECTED_ADAPTER_NAME);
|
|
56
|
+
}
|
|
57
|
+
},
|
|
21
58
|
YieldExpression(path, state) {
|
|
22
59
|
const node = path.node;
|
|
23
|
-
//
|
|
24
|
-
if (!
|
|
60
|
+
// Must be yield* (delegating)
|
|
61
|
+
if (!node.delegate || !node.argument)
|
|
62
|
+
return;
|
|
63
|
+
// Find the enclosing generator function
|
|
64
|
+
let generatorPath = path.getFunctionParent();
|
|
65
|
+
if (!generatorPath)
|
|
66
|
+
return;
|
|
67
|
+
const generatorNode = generatorPath.node;
|
|
68
|
+
if (!("generator" in generatorNode) || !generatorNode.generator)
|
|
69
|
+
return;
|
|
70
|
+
// Get the adapter name for this generator
|
|
71
|
+
const adapterName = state.generatorAdapters.get(generatorNode);
|
|
72
|
+
if (!adapterName) {
|
|
73
|
+
// Not inside an Effect.gen - skip
|
|
25
74
|
return;
|
|
26
75
|
}
|
|
27
76
|
// Get source location
|
|
28
77
|
const loc = node.loc;
|
|
29
78
|
if (!loc)
|
|
30
79
|
return;
|
|
31
|
-
// Extract label from parent (e.g., `const user = yield*
|
|
80
|
+
// Extract label from parent (e.g., `const user = yield* ...`)
|
|
32
81
|
const label = extractLabelFromParent(path);
|
|
33
82
|
// Get or create hoisted trace identifier
|
|
34
83
|
const traceId = getOrCreateTraceIdentifier(state.hoisting, state.filename, loc.start.line, loc.start.column, label);
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
84
|
+
// Check if this is already an adapter call
|
|
85
|
+
if (t.isCallExpression(node.argument) &&
|
|
86
|
+
isYieldAdapterCallWithName(node, adapterName)) {
|
|
87
|
+
// Legacy pattern: _(effect) -> _(effect, trace)
|
|
88
|
+
const callExpr = node.argument;
|
|
89
|
+
callExpr.arguments.push(t.cloneNode(traceId));
|
|
90
|
+
}
|
|
91
|
+
else if (isModernYield(node)) {
|
|
92
|
+
// Modern pattern: effect -> $(effect, trace)
|
|
93
|
+
const originalArg = node.argument;
|
|
94
|
+
const wrappedCall = t.callExpression(t.identifier(adapterName), [originalArg, t.cloneNode(traceId)]);
|
|
95
|
+
node.argument = wrappedCall;
|
|
96
|
+
}
|
|
38
97
|
}
|
|
39
98
|
};
|
|
40
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourceTrace.js","sourceRoot":"","sources":["../../../src/transformers/sourceTrace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sourceTrace.js","sourceRoot":"","sources":["../../../src/transformers/sourceTrace.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,44 @@ function isDataFirstCall(node) {
|
|
|
35
35
|
// Default to data-last pattern
|
|
36
36
|
return false;
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Extracts the basename from a filepath.
|
|
40
|
+
*/
|
|
41
|
+
function basename(filepath) {
|
|
42
|
+
const parts = filepath.split(/[/\\]/);
|
|
43
|
+
return parts[parts.length - 1] || filepath;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Modifies a span name to include source location.
|
|
47
|
+
* "fetchUser" -> "fetchUser (index.ts:9)"
|
|
48
|
+
*/
|
|
49
|
+
function createSpanNameWithLocation(originalName, filepath, line) {
|
|
50
|
+
const filename = basename(filepath);
|
|
51
|
+
return `${originalName} (${filename}:${line})`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Creates the source location suffix string.
|
|
55
|
+
*/
|
|
56
|
+
function createLocationSuffix(filepath, line) {
|
|
57
|
+
const filename = basename(filepath);
|
|
58
|
+
return ` (${filename}:${line})`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Modifies a template literal span name to include source location.
|
|
62
|
+
* Appends the location to the last quasi of the template.
|
|
63
|
+
*/
|
|
64
|
+
function modifyTemplateLiteralWithLocation(templateLiteral, filepath, line) {
|
|
65
|
+
const suffix = createLocationSuffix(filepath, line);
|
|
66
|
+
const quasis = [...templateLiteral.quasis];
|
|
67
|
+
const lastQuasi = quasis[quasis.length - 1];
|
|
68
|
+
// Create new quasi with appended location
|
|
69
|
+
const newLastQuasi = t.templateElement({
|
|
70
|
+
raw: lastQuasi.value.raw + suffix,
|
|
71
|
+
cooked: (lastQuasi.value.cooked || lastQuasi.value.raw) + suffix
|
|
72
|
+
}, lastQuasi.tail);
|
|
73
|
+
quasis[quasis.length - 1] = newLastQuasi;
|
|
74
|
+
return t.templateLiteral(quasis, [...templateLiteral.expressions]);
|
|
75
|
+
}
|
|
38
76
|
/**
|
|
39
77
|
* Creates the attributes object with source location.
|
|
40
78
|
*/
|
|
@@ -119,7 +157,15 @@ export function createWithSpanTraceVisitor(filename, _options) {
|
|
|
119
157
|
const isDataFirst = isDataFirstCall(node);
|
|
120
158
|
if (isDataFirst) {
|
|
121
159
|
// Data-first: withSpan(effect, "name", options?)
|
|
122
|
-
//
|
|
160
|
+
// Name is at index 1, options at index 2
|
|
161
|
+
const nameArg = node.arguments[1];
|
|
162
|
+
if (t.isStringLiteral(nameArg)) {
|
|
163
|
+
const newName = createSpanNameWithLocation(nameArg.value, state.filename, line);
|
|
164
|
+
node.arguments[1] = t.stringLiteral(newName);
|
|
165
|
+
}
|
|
166
|
+
else if (t.isTemplateLiteral(nameArg)) {
|
|
167
|
+
node.arguments[1] = modifyTemplateLiteralWithLocation(nameArg, state.filename, line);
|
|
168
|
+
}
|
|
123
169
|
const optionsArg = node.arguments[2];
|
|
124
170
|
const newOptions = mergeOrCreateOptions(optionsArg, sourceAttrs);
|
|
125
171
|
if (node.arguments.length >= 3) {
|
|
@@ -133,7 +179,15 @@ export function createWithSpanTraceVisitor(filename, _options) {
|
|
|
133
179
|
}
|
|
134
180
|
else {
|
|
135
181
|
// Data-last: withSpan("name", options?)
|
|
136
|
-
//
|
|
182
|
+
// Name is at index 0, options at index 1
|
|
183
|
+
const nameArg = node.arguments[0];
|
|
184
|
+
if (t.isStringLiteral(nameArg)) {
|
|
185
|
+
const newName = createSpanNameWithLocation(nameArg.value, state.filename, line);
|
|
186
|
+
node.arguments[0] = t.stringLiteral(newName);
|
|
187
|
+
}
|
|
188
|
+
else if (t.isTemplateLiteral(nameArg)) {
|
|
189
|
+
node.arguments[0] = modifyTemplateLiteralWithLocation(nameArg, state.filename, line);
|
|
190
|
+
}
|
|
137
191
|
const optionsArg = node.arguments[1];
|
|
138
192
|
const newOptions = mergeOrCreateOptions(optionsArg, sourceAttrs);
|
|
139
193
|
if (node.arguments.length >= 2) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withSpanTrace.js","sourceRoot":"","sources":["../../../src/transformers/withSpanTrace.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"withSpanTrace.js","sourceRoot":"","sources":["../../../src/transformers/withSpanTrace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for detecting Effect patterns in AST nodes.
|
|
3
|
+
*
|
|
4
|
+
* @since 0.1.0
|
|
5
|
+
*/
|
|
6
|
+
import * as t from "@babel/types";
|
|
1
7
|
/**
|
|
2
8
|
* Checks if a CallExpression is `Effect.gen(...)`.
|
|
3
9
|
*/
|
|
@@ -56,4 +62,52 @@ export function isYieldAdapterCall(node) {
|
|
|
56
62
|
return false;
|
|
57
63
|
return isAdapterCall(node.argument);
|
|
58
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Checks if a YieldExpression is a `yield* _(effect)` pattern with a specific adapter name.
|
|
67
|
+
*/
|
|
68
|
+
export function isYieldAdapterCallWithName(node, adapterName) {
|
|
69
|
+
if (!node.delegate)
|
|
70
|
+
return false; // Must be yield*, not yield
|
|
71
|
+
if (!node.argument)
|
|
72
|
+
return false;
|
|
73
|
+
if (node.argument.type !== "CallExpression")
|
|
74
|
+
return false;
|
|
75
|
+
const callee = node.argument.callee;
|
|
76
|
+
return callee.type === "Identifier" && callee.name === adapterName;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Checks if a YieldExpression is a modern `yield* effect` pattern (without adapter).
|
|
80
|
+
* This is the pattern used when Effect.gen is called without the adapter parameter.
|
|
81
|
+
*/
|
|
82
|
+
export function isModernYield(node) {
|
|
83
|
+
if (!node.delegate)
|
|
84
|
+
return false; // Must be yield*, not yield
|
|
85
|
+
if (!node.argument)
|
|
86
|
+
return false;
|
|
87
|
+
// Modern yields are NOT adapter calls - they yield the effect directly
|
|
88
|
+
if (node.argument.type === "CallExpression" && isAdapterCall(node.argument)) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Gets the generator function from an Effect.gen call.
|
|
95
|
+
* Returns the FunctionExpression/ArrowFunctionExpression if found.
|
|
96
|
+
*/
|
|
97
|
+
export function getEffectGenGenerator(node) {
|
|
98
|
+
// Effect.gen can be called with 1 or 2 arguments:
|
|
99
|
+
// Effect.gen(function*() { ... }) - 1 arg
|
|
100
|
+
// Effect.gen(context, function*() { ... }) - 2 args
|
|
101
|
+
const args = node.arguments;
|
|
102
|
+
for (let i = args.length - 1; i >= 0; i--) {
|
|
103
|
+
const arg = args[i];
|
|
104
|
+
if (t.isFunctionExpression(arg) && arg.generator) {
|
|
105
|
+
return arg;
|
|
106
|
+
}
|
|
107
|
+
if (t.isArrowFunctionExpression(arg) && arg.generator) {
|
|
108
|
+
return arg;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
59
113
|
//# sourceMappingURL=effectDetection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"effectDetection.js","sourceRoot":"","sources":["../../../src/utils/effectDetection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"effectDetection.js","sourceRoot":"","sources":["../../../src/utils/effectDetection.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clayroach/unplugin",
|
|
3
|
-
"version": "0.1.0-source-trace.
|
|
3
|
+
"version": "0.1.0-source-trace.5",
|
|
4
4
|
"description": "Universal bundler plugin for Effect transformations",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -18,10 +18,7 @@
|
|
|
18
18
|
"@babel/generator": "^7.26.0"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
|
-
"
|
|
22
|
-
},
|
|
23
|
-
"publishConfig": {
|
|
24
|
-
"provenance": true
|
|
21
|
+
"effect": "^3.19.14"
|
|
25
22
|
},
|
|
26
23
|
"main": "./dist/cjs/index.js",
|
|
27
24
|
"module": "./dist/esm/index.js",
|
package/src/index.ts
CHANGED
|
@@ -62,6 +62,11 @@ const generate: GenerateFn = typeof _generate === "function"
|
|
|
62
62
|
interface TransformState {
|
|
63
63
|
filename: string
|
|
64
64
|
hoisting: HoistingState
|
|
65
|
+
/**
|
|
66
|
+
* Map from generator function to its adapter parameter name.
|
|
67
|
+
* Used by source trace transformer to track Effect.gen generators.
|
|
68
|
+
*/
|
|
69
|
+
generatorAdapters: Map<unknown, string>
|
|
65
70
|
}
|
|
66
71
|
|
|
67
72
|
/**
|
|
@@ -202,7 +207,8 @@ const unpluginFactory: UnpluginFactory<EffectPluginOptions | undefined> = (optio
|
|
|
202
207
|
hoistedTraces: new Map(),
|
|
203
208
|
counter: 0,
|
|
204
209
|
statements: []
|
|
205
|
-
}
|
|
210
|
+
},
|
|
211
|
+
generatorAdapters: new Map()
|
|
206
212
|
}))
|
|
207
213
|
|
|
208
214
|
// Run each visitor
|
|
@@ -2,14 +2,23 @@
|
|
|
2
2
|
* Source location trace transformer.
|
|
3
3
|
*
|
|
4
4
|
* This transformer injects source location metadata into Effect.gen yield expressions.
|
|
5
|
-
* It
|
|
6
|
-
*
|
|
5
|
+
* It supports both patterns:
|
|
6
|
+
* - Legacy adapter: `yield* _(effect)` → `yield* _(effect, trace)`
|
|
7
|
+
* - Modern pattern: `yield* effect` → `yield* $_adapter(effect, trace)`
|
|
8
|
+
*
|
|
9
|
+
* For the modern pattern, the transformer adds an adapter parameter to the generator
|
|
10
|
+
* function if not present, since Effect.gen always passes the adapter at runtime.
|
|
7
11
|
*
|
|
8
12
|
* @since 0.1.0
|
|
9
13
|
*/
|
|
10
14
|
import type { NodePath, Visitor } from "@babel/traverse"
|
|
11
15
|
import * as t from "@babel/types"
|
|
12
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
getEffectGenGenerator,
|
|
18
|
+
isEffectGenCall,
|
|
19
|
+
isModernYield,
|
|
20
|
+
isYieldAdapterCallWithName
|
|
21
|
+
} from "../utils/effectDetection.js"
|
|
13
22
|
import {
|
|
14
23
|
createHoistingState,
|
|
15
24
|
extractLabelFromParent,
|
|
@@ -34,6 +43,30 @@ export interface SourceTraceOptions {
|
|
|
34
43
|
interface TransformState {
|
|
35
44
|
filename: string
|
|
36
45
|
hoisting: HoistingState
|
|
46
|
+
/**
|
|
47
|
+
* Map from generator function to its adapter parameter name.
|
|
48
|
+
* Used to track which generators have been processed and their adapter names.
|
|
49
|
+
*/
|
|
50
|
+
generatorAdapters: Map<unknown, string>
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Default adapter name to use when adding one to modern pattern generators.
|
|
55
|
+
*/
|
|
56
|
+
const INJECTED_ADAPTER_NAME = "$"
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Gets the adapter parameter name from a generator function, or null if none.
|
|
60
|
+
*/
|
|
61
|
+
function getAdapterParamName(
|
|
62
|
+
gen: t.FunctionExpression | t.ArrowFunctionExpression
|
|
63
|
+
): string | null {
|
|
64
|
+
if (gen.params.length === 0) return null
|
|
65
|
+
const firstParam = gen.params[0]
|
|
66
|
+
if (t.isIdentifier(firstParam)) {
|
|
67
|
+
return firstParam.name
|
|
68
|
+
}
|
|
69
|
+
return null
|
|
37
70
|
}
|
|
38
71
|
|
|
39
72
|
/**
|
|
@@ -48,6 +81,7 @@ export function createSourceTraceVisitor(
|
|
|
48
81
|
enter(_path, state) {
|
|
49
82
|
state.filename = filename
|
|
50
83
|
state.hoisting = createHoistingState()
|
|
84
|
+
state.generatorAdapters = new Map()
|
|
51
85
|
},
|
|
52
86
|
exit(path, state) {
|
|
53
87
|
// Prepend all hoisted statements to the program body
|
|
@@ -57,11 +91,45 @@ export function createSourceTraceVisitor(
|
|
|
57
91
|
}
|
|
58
92
|
},
|
|
59
93
|
|
|
94
|
+
// Process Effect.gen calls to detect and optionally add adapter parameters
|
|
95
|
+
CallExpression(path: NodePath<t.CallExpression>, state) {
|
|
96
|
+
const node = path.node
|
|
97
|
+
|
|
98
|
+
if (!isEffectGenCall(node)) return
|
|
99
|
+
|
|
100
|
+
const generator = getEffectGenGenerator(node)
|
|
101
|
+
if (!generator) return
|
|
102
|
+
|
|
103
|
+
// Check if generator already has an adapter parameter
|
|
104
|
+
const existingAdapter = getAdapterParamName(generator)
|
|
105
|
+
|
|
106
|
+
if (existingAdapter) {
|
|
107
|
+
// Generator uses legacy adapter pattern - store the name
|
|
108
|
+
state.generatorAdapters.set(generator, existingAdapter)
|
|
109
|
+
} else {
|
|
110
|
+
// Modern pattern - add adapter parameter
|
|
111
|
+
generator.params.unshift(t.identifier(INJECTED_ADAPTER_NAME))
|
|
112
|
+
state.generatorAdapters.set(generator, INJECTED_ADAPTER_NAME)
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
|
|
60
116
|
YieldExpression(path: NodePath<t.YieldExpression>, state) {
|
|
61
117
|
const node = path.node
|
|
62
118
|
|
|
63
|
-
//
|
|
64
|
-
if (!
|
|
119
|
+
// Must be yield* (delegating)
|
|
120
|
+
if (!node.delegate || !node.argument) return
|
|
121
|
+
|
|
122
|
+
// Find the enclosing generator function
|
|
123
|
+
let generatorPath = path.getFunctionParent()
|
|
124
|
+
if (!generatorPath) return
|
|
125
|
+
|
|
126
|
+
const generatorNode = generatorPath.node as t.FunctionExpression | t.ArrowFunctionExpression
|
|
127
|
+
if (!("generator" in generatorNode) || !generatorNode.generator) return
|
|
128
|
+
|
|
129
|
+
// Get the adapter name for this generator
|
|
130
|
+
const adapterName = state.generatorAdapters.get(generatorNode)
|
|
131
|
+
if (!adapterName) {
|
|
132
|
+
// Not inside an Effect.gen - skip
|
|
65
133
|
return
|
|
66
134
|
}
|
|
67
135
|
|
|
@@ -69,7 +137,7 @@ export function createSourceTraceVisitor(
|
|
|
69
137
|
const loc = node.loc
|
|
70
138
|
if (!loc) return
|
|
71
139
|
|
|
72
|
-
// Extract label from parent (e.g., `const user = yield*
|
|
140
|
+
// Extract label from parent (e.g., `const user = yield* ...`)
|
|
73
141
|
const label = extractLabelFromParent(path)
|
|
74
142
|
|
|
75
143
|
// Get or create hoisted trace identifier
|
|
@@ -81,9 +149,23 @@ export function createSourceTraceVisitor(
|
|
|
81
149
|
label
|
|
82
150
|
)
|
|
83
151
|
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
152
|
+
// Check if this is already an adapter call
|
|
153
|
+
if (
|
|
154
|
+
t.isCallExpression(node.argument) &&
|
|
155
|
+
isYieldAdapterCallWithName(node, adapterName)
|
|
156
|
+
) {
|
|
157
|
+
// Legacy pattern: _(effect) -> _(effect, trace)
|
|
158
|
+
const callExpr = node.argument
|
|
159
|
+
callExpr.arguments.push(t.cloneNode(traceId))
|
|
160
|
+
} else if (isModernYield(node)) {
|
|
161
|
+
// Modern pattern: effect -> $(effect, trace)
|
|
162
|
+
const originalArg = node.argument
|
|
163
|
+
const wrappedCall = t.callExpression(
|
|
164
|
+
t.identifier(adapterName),
|
|
165
|
+
[originalArg, t.cloneNode(traceId)]
|
|
166
|
+
)
|
|
167
|
+
node.argument = wrappedCall
|
|
168
|
+
}
|
|
87
169
|
}
|
|
88
170
|
}
|
|
89
171
|
}
|
|
@@ -73,6 +73,62 @@ function isDataFirstCall(node: t.CallExpression): boolean {
|
|
|
73
73
|
return false
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
/**
|
|
77
|
+
* Extracts the basename from a filepath.
|
|
78
|
+
*/
|
|
79
|
+
function basename(filepath: string): string {
|
|
80
|
+
const parts = filepath.split(/[/\\]/)
|
|
81
|
+
return parts[parts.length - 1] || filepath
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Modifies a span name to include source location.
|
|
86
|
+
* "fetchUser" -> "fetchUser (index.ts:9)"
|
|
87
|
+
*/
|
|
88
|
+
function createSpanNameWithLocation(
|
|
89
|
+
originalName: string,
|
|
90
|
+
filepath: string,
|
|
91
|
+
line: number
|
|
92
|
+
): string {
|
|
93
|
+
const filename = basename(filepath)
|
|
94
|
+
return `${originalName} (${filename}:${line})`
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Creates the source location suffix string.
|
|
99
|
+
*/
|
|
100
|
+
function createLocationSuffix(filepath: string, line: number): string {
|
|
101
|
+
const filename = basename(filepath)
|
|
102
|
+
return ` (${filename}:${line})`
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Modifies a template literal span name to include source location.
|
|
107
|
+
* Appends the location to the last quasi of the template.
|
|
108
|
+
*/
|
|
109
|
+
function modifyTemplateLiteralWithLocation(
|
|
110
|
+
templateLiteral: t.TemplateLiteral,
|
|
111
|
+
filepath: string,
|
|
112
|
+
line: number
|
|
113
|
+
): t.TemplateLiteral {
|
|
114
|
+
const suffix = createLocationSuffix(filepath, line)
|
|
115
|
+
const quasis = [...templateLiteral.quasis]
|
|
116
|
+
const lastQuasi = quasis[quasis.length - 1]
|
|
117
|
+
|
|
118
|
+
// Create new quasi with appended location
|
|
119
|
+
const newLastQuasi = t.templateElement(
|
|
120
|
+
{
|
|
121
|
+
raw: lastQuasi.value.raw + suffix,
|
|
122
|
+
cooked: (lastQuasi.value.cooked || lastQuasi.value.raw) + suffix
|
|
123
|
+
},
|
|
124
|
+
lastQuasi.tail
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
quasis[quasis.length - 1] = newLastQuasi
|
|
128
|
+
|
|
129
|
+
return t.templateLiteral(quasis, [...templateLiteral.expressions])
|
|
130
|
+
}
|
|
131
|
+
|
|
76
132
|
/**
|
|
77
133
|
* Creates the attributes object with source location.
|
|
78
134
|
*/
|
|
@@ -193,7 +249,15 @@ export function createWithSpanTraceVisitor(
|
|
|
193
249
|
|
|
194
250
|
if (isDataFirst) {
|
|
195
251
|
// Data-first: withSpan(effect, "name", options?)
|
|
196
|
-
//
|
|
252
|
+
// Name is at index 1, options at index 2
|
|
253
|
+
const nameArg = node.arguments[1]
|
|
254
|
+
if (t.isStringLiteral(nameArg)) {
|
|
255
|
+
const newName = createSpanNameWithLocation(nameArg.value, state.filename, line)
|
|
256
|
+
node.arguments[1] = t.stringLiteral(newName)
|
|
257
|
+
} else if (t.isTemplateLiteral(nameArg)) {
|
|
258
|
+
node.arguments[1] = modifyTemplateLiteralWithLocation(nameArg, state.filename, line)
|
|
259
|
+
}
|
|
260
|
+
|
|
197
261
|
const optionsArg = node.arguments[2]
|
|
198
262
|
const newOptions = mergeOrCreateOptions(optionsArg, sourceAttrs)
|
|
199
263
|
|
|
@@ -206,7 +270,15 @@ export function createWithSpanTraceVisitor(
|
|
|
206
270
|
}
|
|
207
271
|
} else {
|
|
208
272
|
// Data-last: withSpan("name", options?)
|
|
209
|
-
//
|
|
273
|
+
// Name is at index 0, options at index 1
|
|
274
|
+
const nameArg = node.arguments[0]
|
|
275
|
+
if (t.isStringLiteral(nameArg)) {
|
|
276
|
+
const newName = createSpanNameWithLocation(nameArg.value, state.filename, line)
|
|
277
|
+
node.arguments[0] = t.stringLiteral(newName)
|
|
278
|
+
} else if (t.isTemplateLiteral(nameArg)) {
|
|
279
|
+
node.arguments[0] = modifyTemplateLiteralWithLocation(nameArg, state.filename, line)
|
|
280
|
+
}
|
|
281
|
+
|
|
210
282
|
const optionsArg = node.arguments[1]
|
|
211
283
|
const newOptions = mergeOrCreateOptions(optionsArg, sourceAttrs)
|
|
212
284
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @since 0.1.0
|
|
5
5
|
*/
|
|
6
|
-
import
|
|
6
|
+
import * as t from "@babel/types"
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Checks if a CallExpression is `Effect.gen(...)`.
|
|
@@ -79,3 +79,51 @@ export function isYieldAdapterCall(node: t.YieldExpression): boolean {
|
|
|
79
79
|
if (node.argument.type !== "CallExpression") return false
|
|
80
80
|
return isAdapterCall(node.argument)
|
|
81
81
|
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Checks if a YieldExpression is a `yield* _(effect)` pattern with a specific adapter name.
|
|
85
|
+
*/
|
|
86
|
+
export function isYieldAdapterCallWithName(node: t.YieldExpression, adapterName: string): boolean {
|
|
87
|
+
if (!node.delegate) return false // Must be yield*, not yield
|
|
88
|
+
if (!node.argument) return false
|
|
89
|
+
if (node.argument.type !== "CallExpression") return false
|
|
90
|
+
const callee = node.argument.callee
|
|
91
|
+
return callee.type === "Identifier" && callee.name === adapterName
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Checks if a YieldExpression is a modern `yield* effect` pattern (without adapter).
|
|
96
|
+
* This is the pattern used when Effect.gen is called without the adapter parameter.
|
|
97
|
+
*/
|
|
98
|
+
export function isModernYield(node: t.YieldExpression): boolean {
|
|
99
|
+
if (!node.delegate) return false // Must be yield*, not yield
|
|
100
|
+
if (!node.argument) return false
|
|
101
|
+
// Modern yields are NOT adapter calls - they yield the effect directly
|
|
102
|
+
if (node.argument.type === "CallExpression" && isAdapterCall(node.argument)) {
|
|
103
|
+
return false
|
|
104
|
+
}
|
|
105
|
+
return true
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Gets the generator function from an Effect.gen call.
|
|
110
|
+
* Returns the FunctionExpression/ArrowFunctionExpression if found.
|
|
111
|
+
*/
|
|
112
|
+
export function getEffectGenGenerator(node: t.CallExpression): t.FunctionExpression | t.ArrowFunctionExpression | null {
|
|
113
|
+
// Effect.gen can be called with 1 or 2 arguments:
|
|
114
|
+
// Effect.gen(function*() { ... }) - 1 arg
|
|
115
|
+
// Effect.gen(context, function*() { ... }) - 2 args
|
|
116
|
+
const args = node.arguments
|
|
117
|
+
|
|
118
|
+
for (let i = args.length - 1; i >= 0; i--) {
|
|
119
|
+
const arg = args[i]
|
|
120
|
+
if (t.isFunctionExpression(arg) && arg.generator) {
|
|
121
|
+
return arg
|
|
122
|
+
}
|
|
123
|
+
if (t.isArrowFunctionExpression(arg) && arg.generator) {
|
|
124
|
+
return arg
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return null
|
|
129
|
+
}
|