@clayroach/unplugin 0.1.0-source-trace.3 → 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.
Files changed (34) hide show
  1. package/dist/cjs/index.js +12 -3
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/transformers/annotateEffects.js +141 -0
  4. package/dist/cjs/transformers/annotateEffects.js.map +1 -0
  5. package/dist/cjs/transformers/sourceTrace.js +56 -6
  6. package/dist/cjs/transformers/sourceTrace.js.map +1 -1
  7. package/dist/cjs/transformers/withSpanTrace.js +54 -2
  8. package/dist/cjs/transformers/withSpanTrace.js.map +1 -1
  9. package/dist/cjs/utils/effectDetection.js +54 -0
  10. package/dist/cjs/utils/effectDetection.js.map +1 -1
  11. package/dist/dts/index.d.ts.map +1 -1
  12. package/dist/dts/transformers/annotateEffects.d.ts +41 -0
  13. package/dist/dts/transformers/annotateEffects.d.ts.map +1 -0
  14. package/dist/dts/transformers/sourceTrace.d.ts +11 -2
  15. package/dist/dts/transformers/sourceTrace.d.ts.map +1 -1
  16. package/dist/dts/transformers/withSpanTrace.d.ts.map +1 -1
  17. package/dist/dts/utils/effectDetection.d.ts +15 -1
  18. package/dist/dts/utils/effectDetection.d.ts.map +1 -1
  19. package/dist/esm/index.js +10 -3
  20. package/dist/esm/index.js.map +1 -1
  21. package/dist/esm/transformers/annotateEffects.js +140 -0
  22. package/dist/esm/transformers/annotateEffects.js.map +1 -0
  23. package/dist/esm/transformers/sourceTrace.js +66 -7
  24. package/dist/esm/transformers/sourceTrace.js.map +1 -1
  25. package/dist/esm/transformers/withSpanTrace.js +56 -2
  26. package/dist/esm/transformers/withSpanTrace.js.map +1 -1
  27. package/dist/esm/utils/effectDetection.js +54 -0
  28. package/dist/esm/utils/effectDetection.js.map +1 -1
  29. package/package.json +2 -5
  30. package/src/index.ts +16 -3
  31. package/src/transformers/annotateEffects.ts +197 -0
  32. package/src/transformers/sourceTrace.ts +91 -9
  33. package/src/transformers/withSpanTrace.ts +74 -2
  34. package/src/utils/effectDetection.ts +49 -1
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @since 0.1.0
5
5
  */
6
- import type * as t from "@babel/types";
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,KAAK,CAAC,MAAM,cAAc,CAAA;AAEtC;;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"}
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
@@ -2,6 +2,7 @@ import _generate from "@babel/generator";
2
2
  import { parse } from "@babel/parser";
3
3
  import _traverse from "@babel/traverse";
4
4
  import { createUnplugin } from "unplugin";
5
+ import { createAnnotateEffectsVisitor } from "./transformers/annotateEffects.js";
5
6
  import { createSourceTraceVisitor } from "./transformers/sourceTrace.js";
6
7
  import { createWithSpanTraceVisitor } from "./transformers/withSpanTrace.js";
7
8
  // Handle both ESM and CJS module exports for Babel packages
@@ -49,7 +50,7 @@ function shouldTransform(id, include, exclude) {
49
50
  * Creates the unplugin factory.
50
51
  */
51
52
  const unpluginFactory = (options = {}) => {
52
- const { annotateEffects: _annotateEffects = false, exclude = DEFAULT_EXCLUDE, include = DEFAULT_INCLUDE, sourceTrace = true, spanTrace = true } = options;
53
+ const { annotateEffects = false, exclude = DEFAULT_EXCLUDE, include = DEFAULT_INCLUDE, sourceTrace = true, spanTrace = true } = options;
53
54
  return {
54
55
  name: "@effect/unplugin",
55
56
  transformInclude(id) {
@@ -69,8 +70,13 @@ const unpluginFactory = (options = {}) => {
69
70
  if (spanTrace) {
70
71
  visitors.push(createWithSpanTraceVisitor(id));
71
72
  }
73
+ // Run annotateEffects separately (it has a simpler state)
74
+ if (annotateEffects) {
75
+ const annotateState = { filename: id };
76
+ traverse(ast, createAnnotateEffectsVisitor(id), undefined, annotateState);
77
+ }
72
78
  // Combine visitors
73
- if (visitors.length === 0) {
79
+ if (visitors.length === 0 && !annotateEffects) {
74
80
  return null;
75
81
  }
76
82
  // Initialize state for each visitor
@@ -80,7 +86,8 @@ const unpluginFactory = (options = {}) => {
80
86
  hoistedTraces: new Map(),
81
87
  counter: 0,
82
88
  statements: []
83
- }
89
+ },
90
+ generatorAdapters: new Map()
84
91
  }));
85
92
  // Run each visitor
86
93
  for (let i = 0; i < visitors.length; i++) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ const PURE_ANNOTATION = "#__PURE__";
2
+ /**
3
+ * Checks if a node already has a PURE annotation.
4
+ */
5
+ function isPureAnnotated(node) {
6
+ const leadingComments = node.leadingComments;
7
+ if (!leadingComments) {
8
+ return false;
9
+ }
10
+ return leadingComments.some((comment) => /[@#]__PURE__/.test(comment.value));
11
+ }
12
+ /**
13
+ * Adds a PURE annotation comment to a node.
14
+ */
15
+ function annotateAsPure(path) {
16
+ if (isPureAnnotated(path.node)) {
17
+ return;
18
+ }
19
+ path.addComment("leading", PURE_ANNOTATION);
20
+ }
21
+ /**
22
+ * Checks if the parent is a CallExpression or NewExpression.
23
+ */
24
+ function hasCallableParent(path) {
25
+ const parentPath = path.parentPath;
26
+ if (!parentPath)
27
+ return false;
28
+ return parentPath.isCallExpression() || parentPath.isNewExpression();
29
+ }
30
+ /**
31
+ * Checks if this node is used as a callee (e.g., `foo()` where foo is the callee).
32
+ */
33
+ function isUsedAsCallee(path) {
34
+ if (!hasCallableParent(path)) {
35
+ return false;
36
+ }
37
+ const parentPath = path.parentPath;
38
+ return parentPath.get("callee") === path;
39
+ }
40
+ /**
41
+ * Checks if this node is inside a callee chain (e.g., `foo()()` or `foo.bar()`).
42
+ */
43
+ function isInCallee(path) {
44
+ let current = path;
45
+ do {
46
+ current = current.parentPath;
47
+ if (!current)
48
+ return false;
49
+ if (isUsedAsCallee(current)) {
50
+ return true;
51
+ }
52
+ } while (!current.isStatement() && !current.isFunction());
53
+ return false;
54
+ }
55
+ /**
56
+ * Checks if this expression is executed during module initialization
57
+ * (not inside a function that isn't immediately invoked).
58
+ */
59
+ function isExecutedDuringInitialization(path) {
60
+ let functionParent = path.getFunctionParent();
61
+ while (functionParent) {
62
+ if (!isUsedAsCallee(functionParent)) {
63
+ return false;
64
+ }
65
+ functionParent = functionParent.getFunctionParent();
66
+ }
67
+ return true;
68
+ }
69
+ /**
70
+ * Checks if this expression is in an assignment context
71
+ * (variable declaration, assignment expression, or class).
72
+ */
73
+ function isInAssignmentContext(path) {
74
+ const statement = path.getStatementParent();
75
+ if (!statement)
76
+ return false;
77
+ let currentPath = path;
78
+ do {
79
+ currentPath = currentPath.parentPath;
80
+ if (!currentPath)
81
+ return false;
82
+ if (currentPath.isVariableDeclaration() ||
83
+ currentPath.isAssignmentExpression() ||
84
+ currentPath.isClass()) {
85
+ return true;
86
+ }
87
+ } while (currentPath !== statement);
88
+ return false;
89
+ }
90
+ /**
91
+ * Visitor function for CallExpression and NewExpression nodes.
92
+ */
93
+ function callableExpressionVisitor(path, _state) {
94
+ // Skip if this is used as a callee (e.g., foo()())
95
+ if (isUsedAsCallee(path)) {
96
+ return;
97
+ }
98
+ // Skip if this is inside a callee chain
99
+ if (isInCallee(path)) {
100
+ return;
101
+ }
102
+ // Skip if not executed during initialization
103
+ if (!isExecutedDuringInitialization(path)) {
104
+ return;
105
+ }
106
+ // Must be in assignment context or export default
107
+ const statement = path.getStatementParent();
108
+ if (!isInAssignmentContext(path) && !statement?.isExportDefaultDeclaration()) {
109
+ return;
110
+ }
111
+ annotateAsPure(path);
112
+ }
113
+ /**
114
+ * Creates a Babel visitor that adds PURE annotations to call expressions.
115
+ */
116
+ export function createAnnotateEffectsVisitor(filename, _options) {
117
+ return {
118
+ Program: {
119
+ enter(_path, state) {
120
+ state.filename = filename;
121
+ }
122
+ },
123
+ CallExpression(path, state) {
124
+ callableExpressionVisitor(path, state);
125
+ },
126
+ NewExpression(path, state) {
127
+ callableExpressionVisitor(path, state);
128
+ }
129
+ };
130
+ }
131
+ /**
132
+ * Creates the annotate effects transformer plugin.
133
+ */
134
+ export function annotateEffectsTransformer(options) {
135
+ return {
136
+ name: "effect-annotate-pure-calls",
137
+ visitor: createAnnotateEffectsVisitor("", options)
138
+ };
139
+ }
140
+ //# sourceMappingURL=annotateEffects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotateEffects.js","sourceRoot":"","sources":["../../../src/transformers/annotateEffects.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,22 @@
1
1
  import * as t from "@babel/types";
2
- import { isYieldAdapterCall } from "../utils/effectDetection.js";
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
- // Only transform yield* _(effect) patterns
24
- if (!isYieldAdapterCall(node)) {
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
- // Inject trace as second argument: _(effect) -> _(effect, trace)
36
- const callExpr = node.argument;
37
- callExpr.arguments.push(t.cloneNode(traceId));
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":"AAUA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAE3B,MAAM,sBAAsB,CAAA;AAqB7B;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,QAA6B;IAE7B,OAAO;QACL,OAAO,EAAE;YACP,KAAK,CAAC,KAAK,EAAE,KAAK;gBAChB,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBACzB,KAAK,CAAC,QAAQ,GAAG,mBAAmB,EAAE,CAAA;YACxC,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,KAAK;gBACd,qDAAqD;gBACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;gBAC1D,CAAC;YACH,CAAC;SACF;QAED,eAAe,CAAC,IAAiC,EAAE,KAAK;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;YAEtB,2CAA2C;YAC3C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,OAAM;YACR,CAAC;YAED,sBAAsB;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;YACpB,IAAI,CAAC,GAAG;gBAAE,OAAM;YAEhB,iEAAiE;YACjE,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;YAE1C,yCAAyC;YACzC,MAAM,OAAO,GAAG,0BAA0B,CACxC,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,QAAQ,EACd,GAAG,CAAC,KAAK,CAAC,IAAI,EACd,GAAG,CAAC,KAAK,CAAC,MAAM,EAChB,KAAK,CACN,CAAA;YAED,iEAAiE;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA4B,CAAA;YAClD,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;QAC/C,CAAC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAA4B;IAIjE,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,wBAAwB,CAAC,EAAE,EAAE,OAAO,CAAC;KAC/C,CAAA;AACH,CAAC"}
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
- // Options is at index 2
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
- // Options is at index 1
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":"AAOA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,KAAK,CAAA;IAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAE1B,wBAAwB;IACxB,IACE,MAAM,CAAC,IAAI,KAAK,kBAAkB;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;QACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,EAC9B,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,kDAAkD;IAClD,IACE,MAAM,CAAC,IAAI,KAAK,kBAAkB;QAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;QACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,EAC9B,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAA;IAC7B,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,OAAO,CAAC,MAA4B,CAAA;QACjD,IAAI,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,UAAU,CAAA;IAC9B,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAsB;IAClD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAA;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAA,CAAC,4BAA4B;IAC7D,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAA;IAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,KAAK,CAAA;IACzD,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AACrC,CAAC"}
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",
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
- "@clayroach/effect": "^3.19.14-source-trace.3"
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
@@ -28,6 +28,7 @@ import type { Scope, TraverseOptions, Visitor } from "@babel/traverse"
28
28
  import _traverse from "@babel/traverse"
29
29
  import type { Node } from "@babel/types"
30
30
  import { createUnplugin, type UnpluginFactory, type UnpluginInstance } from "unplugin"
31
+ import { createAnnotateEffectsVisitor } from "./transformers/annotateEffects.js"
31
32
  import { createSourceTraceVisitor } from "./transformers/sourceTrace.js"
32
33
  import { createWithSpanTraceVisitor } from "./transformers/withSpanTrace.js"
33
34
  import type { HoistingState } from "./utils/hoisting.js"
@@ -61,6 +62,11 @@ const generate: GenerateFn = typeof _generate === "function"
61
62
  interface TransformState {
62
63
  filename: string
63
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>
64
70
  }
65
71
 
66
72
  /**
@@ -151,7 +157,7 @@ function shouldTransform(
151
157
  */
152
158
  const unpluginFactory: UnpluginFactory<EffectPluginOptions | undefined> = (options = {}) => {
153
159
  const {
154
- annotateEffects: _annotateEffects = false,
160
+ annotateEffects = false,
155
161
  exclude = DEFAULT_EXCLUDE,
156
162
  include = DEFAULT_INCLUDE,
157
163
  sourceTrace = true,
@@ -183,8 +189,14 @@ const unpluginFactory: UnpluginFactory<EffectPluginOptions | undefined> = (optio
183
189
  visitors.push(createWithSpanTraceVisitor(id))
184
190
  }
185
191
 
192
+ // Run annotateEffects separately (it has a simpler state)
193
+ if (annotateEffects) {
194
+ const annotateState = { filename: id }
195
+ traverse(ast, createAnnotateEffectsVisitor(id), undefined, annotateState)
196
+ }
197
+
186
198
  // Combine visitors
187
- if (visitors.length === 0) {
199
+ if (visitors.length === 0 && !annotateEffects) {
188
200
  return null
189
201
  }
190
202
 
@@ -195,7 +207,8 @@ const unpluginFactory: UnpluginFactory<EffectPluginOptions | undefined> = (optio
195
207
  hoistedTraces: new Map(),
196
208
  counter: 0,
197
209
  statements: []
198
- }
210
+ },
211
+ generatorAdapters: new Map()
199
212
  }))
200
213
 
201
214
  // Run each visitor