@fluixi/compiler 1.0.0-alpha.83 → 1.0.0-alpha.85
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/analyze/expr-shape.cjs +62 -1
- package/dist/analyze/expr-shape.d.cts +14 -0
- package/dist/analyze/expr-shape.d.ts +2 -2
- package/dist/analyze/expr-shape.js +1 -1
- package/dist/analyze/expr-shape.mjs +41 -1
- package/dist/analyze/intrinsics.cjs +80 -1
- package/dist/analyze/intrinsics.d.cts +66 -0
- package/dist/analyze/intrinsics.d.ts +7 -7
- package/dist/analyze/intrinsics.d.ts.map +1 -1
- package/dist/analyze/intrinsics.js +3 -3
- package/dist/analyze/intrinsics.mjs +59 -1
- package/dist/analyze/paren.cjs +134 -0
- package/dist/analyze/paren.d.cts +23 -0
- package/dist/analyze/paren.d.ts +24 -0
- package/dist/analyze/paren.d.ts.map +1 -0
- package/dist/analyze/paren.js +168 -0
- package/dist/analyze/paren.mjs +113 -0
- package/dist/analyze/props-destructure.cjs +226 -1
- package/dist/analyze/props-destructure.d.cts +83 -0
- package/dist/analyze/props-destructure.d.ts +3 -3
- package/dist/analyze/props-destructure.d.ts.map +1 -1
- package/dist/analyze/props-destructure.js +4 -4
- package/dist/analyze/props-destructure.mjs +205 -1
- package/dist/analyze/reactive-bindings.cjs +190 -1
- package/dist/analyze/reactive-bindings.d.cts +42 -0
- package/dist/analyze/reactive-bindings.d.ts +1 -1
- package/dist/analyze/reactive-bindings.js +2 -2
- package/dist/analyze/reactive-bindings.mjs +167 -1
- package/dist/analyze/reactive-expr.cjs +38 -1
- package/dist/analyze/reactive-expr.d.cts +38 -0
- package/dist/analyze/reactive-expr.d.ts +4 -4
- package/dist/analyze/reactive-expr.d.ts.map +1 -1
- package/dist/analyze/reactive-expr.js +2 -2
- package/dist/analyze/reactive-expr.mjs +17 -1
- package/dist/analyze/static-graph.cjs +811 -1
- package/dist/analyze/static-graph.d.cts +102 -0
- package/dist/analyze/static-graph.d.ts +1 -1
- package/dist/analyze/static-graph.d.ts.map +1 -1
- package/dist/analyze/static-graph.js +11 -11
- package/dist/analyze/static-graph.mjs +793 -1
- package/dist/babel-TGY76XJ7.mjs +636 -0
- package/dist/chunk-4PLHS2FP.mjs +158 -0
- package/dist/chunk-6DB5FXS4.mjs +1718 -0
- package/dist/chunk-F74GFKSL.mjs +16 -0
- package/dist/chunk-G6QC2WRJ.mjs +11 -0
- package/dist/chunk-RUDJDZAA.mjs +1078 -0
- package/dist/codegen/backend.cjs +18 -1
- package/dist/codegen/backend.d.cts +35 -0
- package/dist/codegen/backends/imperative.cjs +542 -1
- package/dist/codegen/backends/imperative.d.cts +11 -0
- package/dist/codegen/backends/imperative.d.ts +1 -1
- package/dist/codegen/backends/imperative.d.ts.map +1 -1
- package/dist/codegen/backends/imperative.js +24 -20
- package/dist/codegen/backends/imperative.mjs +519 -1
- package/dist/codegen/contract.cjs +52 -1
- package/dist/codegen/contract.d.cts +24 -0
- package/dist/codegen/contract.d.ts +2 -2
- package/dist/codegen/contract.js +2 -2
- package/dist/codegen/contract.mjs +31 -1
- package/dist/codegen/partial-template.cjs +176 -1
- package/dist/codegen/partial-template.d.cts +61 -0
- package/dist/codegen/partial-template.d.ts +4 -4
- package/dist/codegen/partial-template.js +0 -0
- package/dist/codegen/partial-template.mjs +153 -1
- package/dist/codegen/serialize-static.cjs +125 -1
- package/dist/codegen/serialize-static.d.cts +38 -0
- package/dist/codegen/serialize-static.d.ts +3 -3
- package/dist/codegen/serialize-static.js +6 -6
- package/dist/codegen/serialize-static.mjs +104 -1
- package/dist/frontend/babel/build-ir-lit.cjs +1509 -1
- package/dist/frontend/babel/build-ir-lit.d.cts +26 -0
- package/dist/frontend/babel/build-ir-lit.d.ts +2 -2
- package/dist/frontend/babel/build-ir-lit.mjs +1478 -1
- package/dist/frontend/babel/build-ir.cjs +1524 -1
- package/dist/frontend/babel/build-ir.d.cts +35 -0
- package/dist/frontend/babel/build-ir.d.ts +2 -2
- package/dist/frontend/babel/build-ir.js +2 -2
- package/dist/frontend/babel/build-ir.mjs +1495 -1
- package/dist/frontend/babel/index.cjs +2186 -1
- package/dist/frontend/babel/index.d.cts +33 -0
- package/dist/frontend/babel/index.d.ts +1 -1
- package/dist/frontend/babel/index.js +1 -1
- package/dist/frontend/babel/index.mjs +2156 -1
- package/dist/frontend/babel/lower-template.cjs +1507 -1
- package/dist/frontend/babel/lower-template.d.cts +23 -0
- package/dist/frontend/babel/lower-template.d.ts +1 -1
- package/dist/frontend/babel/lower-template.js +2 -2
- package/dist/frontend/babel/lower-template.mjs +1478 -1
- package/dist/frontend/babel/plugin.cjs +2132 -1
- package/dist/frontend/babel/plugin.d.cts +95 -0
- package/dist/frontend/babel/plugin.d.ts +5 -5
- package/dist/frontend/babel/plugin.d.ts.map +1 -1
- package/dist/frontend/babel/plugin.js +14 -14
- package/dist/frontend/babel/plugin.mjs +2103 -1
- package/dist/frontend/babel/server-functions.cjs +110 -1
- package/dist/frontend/babel/server-functions.d.cts +10 -0
- package/dist/frontend/babel/server-functions.mjs +89 -1
- package/dist/frontend/babel/types.cjs +18 -1
- package/dist/frontend/babel/types.d.cts +33 -0
- package/dist/frontend/types.cjs +18 -1
- package/dist/frontend/types.d.cts +25 -0
- package/dist/frontend/vocabulary.cjs +98 -0
- package/dist/frontend/vocabulary.d.cts +79 -0
- package/dist/frontend/vocabulary.d.ts +80 -0
- package/dist/frontend/vocabulary.d.ts.map +1 -0
- package/dist/frontend/vocabulary.js +124 -0
- package/dist/frontend/vocabulary.mjs +77 -0
- package/dist/index.cjs +1595 -14
- package/dist/index.d.cts +27 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/index.mjs +1575 -14
- package/dist/integrations.cjs +4312 -26
- package/dist/integrations.d.cts +215 -0
- package/dist/integrations.d.ts +9 -9
- package/dist/integrations.d.ts.map +1 -1
- package/dist/integrations.js +29 -8
- package/dist/integrations.mjs +536 -18
- package/dist/ir/nodes.cjs +18 -1
- package/dist/ir/nodes.d.cts +168 -0
- package/dist/ir/nodes.d.ts +6 -6
- package/dist/lower/compile-template.cjs +1356 -1
- package/dist/lower/compile-template.d.cts +69 -0
- package/dist/lower/compile-template.d.ts +3 -3
- package/dist/lower/compile-template.js +1 -1
- package/dist/lower/compile-template.mjs +1336 -1
- package/dist/lower/jsx.cjs +529 -1
- package/dist/lower/jsx.d.cts +25 -0
- package/dist/lower/jsx.d.ts +1 -1
- package/dist/lower/jsx.d.ts.map +1 -1
- package/dist/lower/jsx.js +6 -5
- package/dist/lower/jsx.mjs +506 -1
- package/dist/lower/template.cjs +1061 -1
- package/dist/lower/template.d.cts +53 -0
- package/dist/lower/template.d.ts +3 -3
- package/dist/lower/template.d.ts.map +1 -1
- package/dist/lower/template.js +12 -11
- package/dist/lower/template.mjs +1042 -1
- package/dist/lower/text.cjs +42 -1
- package/dist/lower/text.d.cts +10 -0
- package/dist/lower/text.d.ts +2 -2
- package/dist/lower/text.d.ts.map +1 -1
- package/dist/lower/text.js +2 -2
- package/dist/lower/text.mjs +21 -1
- package/dist/optimize/analyze-static.cjs +112 -1
- package/dist/optimize/analyze-static.d.cts +39 -0
- package/dist/optimize/analyze-static.d.ts +2 -2
- package/dist/optimize/analyze-static.js +2 -2
- package/dist/optimize/analyze-static.mjs +91 -1
- package/dist/optimize/collapse-strategies.cjs +90 -1
- package/dist/optimize/collapse-strategies.d.cts +30 -0
- package/dist/optimize/collapse-strategies.d.ts +3 -3
- package/dist/optimize/collapse-strategies.mjs +67 -1
- package/dist/options.cjs +33 -1
- package/dist/options.d.cts +39 -0
- package/dist/options.d.ts +2 -2
- package/dist/options.mjs +12 -1
- package/dist/resolve/builtins.cjs +73 -1
- package/dist/resolve/builtins.d.cts +68 -0
- package/dist/resolve/builtins.d.ts +8 -8
- package/dist/resolve/builtins.d.ts.map +1 -1
- package/dist/resolve/builtins.js +4 -4
- package/dist/resolve/builtins.mjs +53 -1
- package/dist/resolve/component-globals.cjs +234 -14
- package/dist/resolve/component-globals.d.cts +80 -0
- package/dist/resolve/component-globals.d.ts +5 -5
- package/dist/resolve/component-globals.js +10 -10
- package/dist/resolve/component-globals.mjs +211 -14
- package/dist/resolve/component-resolver.cjs +80 -1
- package/dist/resolve/component-resolver.d.cts +68 -0
- package/dist/resolve/component-resolver.d.ts +3 -3
- package/dist/resolve/component-resolver.d.ts.map +1 -1
- package/dist/resolve/component-resolver.js +3 -3
- package/dist/resolve/component-resolver.mjs +59 -1
- package/dist/resolve/load-directive.cjs +93 -1
- package/dist/resolve/load-directive.d.cts +53 -0
- package/dist/resolve/load-directive.d.ts +5 -5
- package/dist/resolve/load-directive.js +6 -6
- package/dist/resolve/load-directive.mjs +72 -1
- package/dist/resolve/resolve-ir.cjs +108 -1
- package/dist/resolve/resolve-ir.d.cts +53 -0
- package/dist/resolve/resolve-ir.d.ts +6 -6
- package/dist/resolve/resolve-ir.d.ts.map +1 -1
- package/dist/resolve/resolve-ir.js +1 -1
- package/dist/resolve/resolve-ir.mjs +85 -1
- package/dist/resolve/write-globals.cjs +319 -14
- package/dist/resolve/write-globals.d.cts +30 -0
- package/dist/resolve/write-globals.js +2 -2
- package/dist/resolve/write-globals.mjs +298 -14
- package/dist/server-fns-ZYWQTSZU.mjs +78 -0
- package/dist/server-functions-PCERFA7A.mjs +82 -0
- package/dist/transform/bindings.cjs +71 -1
- package/dist/transform/bindings.d.cts +16 -0
- package/dist/transform/bindings.d.ts +1 -1
- package/dist/transform/bindings.js +1 -1
- package/dist/transform/bindings.mjs +50 -1
- package/dist/transform/index.cjs +2732 -8
- package/dist/transform/index.d.cts +15 -0
- package/dist/transform/index.mjs +3773 -17
- package/dist/transform/intrinsics.cjs +216 -3
- package/dist/transform/intrinsics.d.cts +21 -0
- package/dist/transform/intrinsics.js +1 -1
- package/dist/transform/intrinsics.mjs +193 -3
- package/dist/transform/props.cjs +441 -3
- package/dist/transform/props.d.cts +45 -0
- package/dist/transform/props.d.ts +1 -1
- package/dist/transform/props.d.ts.map +1 -1
- package/dist/transform/props.js +4 -4
- package/dist/transform/props.mjs +1482 -12
- package/dist/transform/server-fn-id.cjs +35 -1
- package/dist/transform/server-fn-id.d.cts +9 -0
- package/dist/transform/server-fn-id.d.ts +1 -1
- package/dist/transform/server-fn-id.js +2 -2
- package/dist/transform/server-fn-id.mjs +14 -1
- package/dist/transform/server-fns.cjs +114 -2
- package/dist/transform/server-fns.d.cts +12 -0
- package/dist/transform/server-fns.js +3 -3
- package/dist/transform/server-fns.mjs +1155 -11
- package/dist/transform/source-locations.cjs +330 -1
- package/dist/transform/source-locations.d.cts +43 -0
- package/dist/transform/source-locations.d.ts +1 -1
- package/dist/transform/source-locations.js +5 -5
- package/dist/transform/source-locations.mjs +307 -1
- package/dist/transform/templates.cjs +2701 -7
- package/dist/transform/templates.d.cts +69 -0
- package/dist/transform/templates.d.ts +2 -2
- package/dist/transform/templates.d.ts.map +1 -1
- package/dist/transform/templates.js +7 -7
- package/dist/transform/templates.mjs +3743 -16
- package/dist/transform-RWDTQUF5.mjs +893 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +6 -5
- package/dist/babel-VXKH6MRQ.mjs +0 -1
- package/dist/chunk-3SAEGOMQ.mjs +0 -1
- package/dist/chunk-5KMMN5QP.mjs +0 -1
- package/dist/chunk-IBRM4W7I.mjs +0 -10
- package/dist/chunk-OHHZCYIQ.mjs +0 -1
- package/dist/chunk-YKZ54NVE.mjs +0 -1
- package/dist/server-fns-6QM243HC.mjs +0 -2
- package/dist/server-functions-E3LKCZ4R.mjs +0 -1
- package/dist/transform-C4ZXRVGP.mjs +0 -8
|
@@ -1 +1,307 @@
|
|
|
1
|
-
|
|
1
|
+
// src/analyze/intrinsics.ts
|
|
2
|
+
var REACTIVE_MODULE = "@fluixi/reactive/signal";
|
|
3
|
+
var INTRINSICS = {
|
|
4
|
+
$signal: { export: "signal", module: REACTIVE_MODULE, returns: "signal-handle" },
|
|
5
|
+
$memo: { export: "memo", module: REACTIVE_MODULE, returns: "memo-handle" },
|
|
6
|
+
$effect: { export: "effect", module: REACTIVE_MODULE, returns: "effect" },
|
|
7
|
+
$store: { export: "store", module: "@fluixi/reactive/store", returns: "store-handle" },
|
|
8
|
+
$resource: { export: "resource", module: REACTIVE_MODULE, returns: "resource-handle" },
|
|
9
|
+
// No short runtime form for these yet, so the intrinsic stands for the `create*`
|
|
10
|
+
// name. Still worth having: no import to write, and when a shorter form is
|
|
11
|
+
// designed, the change is this line rather than a compiler pass.
|
|
12
|
+
$selector: { export: "createSelector", module: REACTIVE_MODULE, returns: "memo-accessor" },
|
|
13
|
+
$deferred: { export: "createDeferred", module: REACTIVE_MODULE, returns: "memo-accessor" },
|
|
14
|
+
// Not value constructors, but the compiler has to know them: they change what a read
|
|
15
|
+
// does. `untrack` suppresses dependency collection, which is exactly the kind of thing
|
|
16
|
+
// dependency analysis must not guess at.
|
|
17
|
+
$untrack: { export: "untrack", module: REACTIVE_MODULE, returns: "plain" },
|
|
18
|
+
$untrackStore: { export: "untrackStore", module: "@fluixi/reactive/store", returns: "plain" }
|
|
19
|
+
};
|
|
20
|
+
var RUNTIME_PRIMITIVES = {
|
|
21
|
+
signal: "signal-handle",
|
|
22
|
+
memo: "memo-handle",
|
|
23
|
+
effect: "effect",
|
|
24
|
+
store: "store-handle",
|
|
25
|
+
createSignal: ["signal-accessor", "signal-setter"],
|
|
26
|
+
createMemo: "memo-accessor",
|
|
27
|
+
createEffect: "effect",
|
|
28
|
+
createRenderEffect: "effect",
|
|
29
|
+
createStore: "reactive-object",
|
|
30
|
+
resource: "resource-handle",
|
|
31
|
+
createResource: "reactive-object",
|
|
32
|
+
createSelector: "memo-accessor",
|
|
33
|
+
createDeferred: "memo-accessor"
|
|
34
|
+
};
|
|
35
|
+
var PRIMITIVE_MODULES = [
|
|
36
|
+
"@fluixi/reactive",
|
|
37
|
+
"@fluixi/reactive/signal",
|
|
38
|
+
"@fluixi/reactive/store",
|
|
39
|
+
"@fluixi/core"
|
|
40
|
+
];
|
|
41
|
+
var INTRINSIC_CALL = new RegExp(`\\$(?:${Object.keys(INTRINSICS).map((n) => n.slice(1)).join("|")})\\s*\\(`);
|
|
42
|
+
function isIntrinsicName(name) {
|
|
43
|
+
return Object.prototype.hasOwnProperty.call(INTRINSICS, name);
|
|
44
|
+
}
|
|
45
|
+
function isPrimitiveModule(source) {
|
|
46
|
+
return PRIMITIVE_MODULES.includes(source);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// src/analyze/reactive-bindings.ts
|
|
50
|
+
function patternNames(node, out) {
|
|
51
|
+
if (!node) return;
|
|
52
|
+
switch (node.type) {
|
|
53
|
+
case "Identifier":
|
|
54
|
+
out.add(node.name);
|
|
55
|
+
return;
|
|
56
|
+
case "ObjectPattern":
|
|
57
|
+
for (const p of node.properties ?? []) {
|
|
58
|
+
if (p.type === "RestElement") patternNames(p.argument, out);
|
|
59
|
+
else patternNames(p.value, out);
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
case "ArrayPattern":
|
|
63
|
+
for (const e of node.elements ?? []) patternNames(e, out);
|
|
64
|
+
return;
|
|
65
|
+
case "AssignmentPattern":
|
|
66
|
+
patternNames(node.left, out);
|
|
67
|
+
return;
|
|
68
|
+
case "RestElement":
|
|
69
|
+
patternNames(node.argument, out);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function walk(root, visit) {
|
|
74
|
+
if (!root || typeof root !== "object" || typeof root.type !== "string") return;
|
|
75
|
+
visit(root);
|
|
76
|
+
for (const key of Object.keys(root)) {
|
|
77
|
+
if (key === "loc" || key === "leadingComments" || key === "trailingComments") continue;
|
|
78
|
+
const value = root[key];
|
|
79
|
+
if (Array.isArray(value)) for (const item of value) walk(item, visit);
|
|
80
|
+
else if (value && typeof value === "object") walk(value, visit);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function calledPrimitive(node, bindings) {
|
|
84
|
+
if (node.type !== "CallExpression") return void 0;
|
|
85
|
+
const callee = node.callee;
|
|
86
|
+
if (callee?.type !== "Identifier") return void 0;
|
|
87
|
+
const name = callee.name;
|
|
88
|
+
const imported = bindings.primitives.get(name);
|
|
89
|
+
if (imported) return imported;
|
|
90
|
+
const intrinsic = INTRINSICS[name];
|
|
91
|
+
if (intrinsic && !bindings.shadowed.has(name)) return intrinsic.returns;
|
|
92
|
+
return void 0;
|
|
93
|
+
}
|
|
94
|
+
function classify(id, returns, kinds) {
|
|
95
|
+
if (Array.isArray(returns)) {
|
|
96
|
+
if (id.type === "ArrayPattern") {
|
|
97
|
+
id.elements.forEach((element, index) => {
|
|
98
|
+
const kind = returns[index];
|
|
99
|
+
if (element?.type === "Identifier" && kind) kinds.set(element.name, kind);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (id.type === "Identifier") kinds.set(id.name, returns);
|
|
105
|
+
}
|
|
106
|
+
function resolveReactiveBindings(program) {
|
|
107
|
+
const bindings = { kinds: /* @__PURE__ */ new Map(), primitives: /* @__PURE__ */ new Map(), shadowed: /* @__PURE__ */ new Set() };
|
|
108
|
+
const root = program;
|
|
109
|
+
walk(root, (node) => {
|
|
110
|
+
const names = /* @__PURE__ */ new Set();
|
|
111
|
+
if (node.type === "VariableDeclarator") patternNames(node.id, names);
|
|
112
|
+
else if (node.type === "FunctionDeclaration" || node.type === "ClassDeclaration") patternNames(node.id, names);
|
|
113
|
+
else if (node.type === "ImportDefaultSpecifier" || node.type === "ImportNamespaceSpecifier") patternNames(node.local, names);
|
|
114
|
+
else if (node.type === "ImportSpecifier") patternNames(node.local, names);
|
|
115
|
+
else if (node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression" || node.type === "FunctionDeclaration") {
|
|
116
|
+
for (const p of node.params ?? []) patternNames(p, names);
|
|
117
|
+
}
|
|
118
|
+
for (const name of names) if (INTRINSICS[name]) bindings.shadowed.add(name);
|
|
119
|
+
});
|
|
120
|
+
for (const statement of root.body ?? []) {
|
|
121
|
+
if (statement.type !== "ImportDeclaration") continue;
|
|
122
|
+
if (!isPrimitiveModule(statement.source?.value)) continue;
|
|
123
|
+
for (const specifier of statement.specifiers ?? []) {
|
|
124
|
+
if (specifier.type !== "ImportSpecifier") continue;
|
|
125
|
+
const importedNode = specifier.imported;
|
|
126
|
+
const imported = importedNode.type === "Identifier" ? importedNode.name : importedNode.value;
|
|
127
|
+
const returns = RUNTIME_PRIMITIVES[imported];
|
|
128
|
+
if (returns) bindings.primitives.set(specifier.local.name, returns);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
walk(root, (node) => {
|
|
132
|
+
if (node.type !== "VariableDeclarator" || !node.init) return;
|
|
133
|
+
const returns = calledPrimitive(node.init, bindings);
|
|
134
|
+
if (returns) classify(node.id, returns, bindings.kinds);
|
|
135
|
+
});
|
|
136
|
+
return bindings;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// src/transform/source-locations.ts
|
|
140
|
+
var SOURCE_MARKER = "__fx_source";
|
|
141
|
+
var COMPONENT_MARKER = "__fx_component";
|
|
142
|
+
var HOLE_MARKER = "__fx_hole";
|
|
143
|
+
var markHole = (accessor, line, column, name) => `(globalThis.${HOLE_MARKER} ?? ((f) => f))(${accessor},${line},${column}${name === void 0 ? "" : `,${JSON.stringify(name)}`})`;
|
|
144
|
+
var PROPS_MARKER = "__fx_props";
|
|
145
|
+
var markProps = (object, at) => `(globalThis.${PROPS_MARKER} ?? ((p) => p))(${object},${JSON.stringify(at)})`;
|
|
146
|
+
var RUNTIME_PRIMITIVES2 = /* @__PURE__ */ new Set([
|
|
147
|
+
"signal",
|
|
148
|
+
"memo",
|
|
149
|
+
"effect",
|
|
150
|
+
"store",
|
|
151
|
+
"resource",
|
|
152
|
+
"watch",
|
|
153
|
+
"createSignal",
|
|
154
|
+
"createMemo",
|
|
155
|
+
"createEffect",
|
|
156
|
+
"createStore",
|
|
157
|
+
"createResource"
|
|
158
|
+
]);
|
|
159
|
+
function mayHaveReactiveCall(code) {
|
|
160
|
+
for (const name of RUNTIME_PRIMITIVES2) {
|
|
161
|
+
if (code.includes(name)) return true;
|
|
162
|
+
}
|
|
163
|
+
return code.includes("$signal") || code.includes("$memo") || code.includes("$effect") || code.includes("$store");
|
|
164
|
+
}
|
|
165
|
+
var SINGLE_STATEMENT_PARENTS = /* @__PURE__ */ new Set([
|
|
166
|
+
"IfStatement",
|
|
167
|
+
"ForStatement",
|
|
168
|
+
"ForInStatement",
|
|
169
|
+
"ForOfStatement",
|
|
170
|
+
"WhileStatement",
|
|
171
|
+
"DoWhileStatement",
|
|
172
|
+
"LabeledStatement",
|
|
173
|
+
"WithStatement"
|
|
174
|
+
]);
|
|
175
|
+
function isLoneBranch(statement, parent) {
|
|
176
|
+
if (!parent || statement.type === "BlockStatement") return false;
|
|
177
|
+
return SINGLE_STATEMENT_PARENTS.has(parent.type);
|
|
178
|
+
}
|
|
179
|
+
function isExport(node) {
|
|
180
|
+
return node.type === "ExportNamedDeclaration" || node.type === "ExportDefaultDeclaration";
|
|
181
|
+
}
|
|
182
|
+
function isStatement(node) {
|
|
183
|
+
return node.type.endsWith("Statement") || node.type === "VariableDeclaration";
|
|
184
|
+
}
|
|
185
|
+
function walk2(node, visit, stack = []) {
|
|
186
|
+
if (!node || typeof node.type !== "string") return;
|
|
187
|
+
visit(node, stack);
|
|
188
|
+
stack.push(node);
|
|
189
|
+
for (const key of Object.keys(node)) {
|
|
190
|
+
if (key === "loc" || key === "parent") continue;
|
|
191
|
+
const value = node[key];
|
|
192
|
+
if (Array.isArray(value)) {
|
|
193
|
+
for (const child of value) walk2(child, visit, stack);
|
|
194
|
+
} else if (value && typeof value.type === "string") {
|
|
195
|
+
walk2(value, visit, stack);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
stack.pop();
|
|
199
|
+
}
|
|
200
|
+
function nameFor(stack) {
|
|
201
|
+
const declarator = stack[stack.length - 1];
|
|
202
|
+
if (declarator?.type !== "VariableDeclarator") return void 0;
|
|
203
|
+
const id = declarator.id;
|
|
204
|
+
if (id?.type === "Identifier") return id.name;
|
|
205
|
+
if (id?.type === "ArrayPattern") {
|
|
206
|
+
const first = id.elements?.[0];
|
|
207
|
+
if (first?.type === "Identifier") return first.name;
|
|
208
|
+
}
|
|
209
|
+
return void 0;
|
|
210
|
+
}
|
|
211
|
+
function componentName(node) {
|
|
212
|
+
if (node.type === "FunctionDeclaration") {
|
|
213
|
+
const name = node.id?.name;
|
|
214
|
+
return name && name[0] === name[0]?.toUpperCase() ? name : void 0;
|
|
215
|
+
}
|
|
216
|
+
if (node.type === "VariableDeclarator") {
|
|
217
|
+
const id = node.id;
|
|
218
|
+
const init = node.init;
|
|
219
|
+
if (id?.type !== "Identifier" || !init) return void 0;
|
|
220
|
+
if (init.type !== "ArrowFunctionExpression" && init.type !== "FunctionExpression") return void 0;
|
|
221
|
+
const name = id.name;
|
|
222
|
+
return name[0] === name[0]?.toUpperCase() ? name : void 0;
|
|
223
|
+
}
|
|
224
|
+
return void 0;
|
|
225
|
+
}
|
|
226
|
+
function collectSourceEdits(program, filename) {
|
|
227
|
+
const edits = [];
|
|
228
|
+
const claimed = /* @__PURE__ */ new Set();
|
|
229
|
+
const { primitives, shadowed } = resolveReactiveBindings(program);
|
|
230
|
+
walk2(program, (node, stack) => {
|
|
231
|
+
const component = componentName(node);
|
|
232
|
+
if (component) {
|
|
233
|
+
const at = node.loc?.start;
|
|
234
|
+
let end2 = node.end;
|
|
235
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
236
|
+
const up = stack[i];
|
|
237
|
+
if (up.type !== "VariableDeclaration" && up.type !== "ExportNamedDeclaration" && up.type !== "ExportDefaultDeclaration") {
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
end2 = up.end;
|
|
241
|
+
}
|
|
242
|
+
if (at) {
|
|
243
|
+
edits.push({
|
|
244
|
+
start: end2,
|
|
245
|
+
end: end2,
|
|
246
|
+
code: `;globalThis.${COMPONENT_MARKER}?.(${JSON.stringify(component)},${JSON.stringify(filename)},${at.line},${at.column});`
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (node.type !== "CallExpression") return;
|
|
251
|
+
const callee = node.callee;
|
|
252
|
+
if (callee?.type !== "Identifier") return;
|
|
253
|
+
const name = callee.name;
|
|
254
|
+
const intrinsic = isIntrinsicName(name) && !shadowed.has(name) ? INTRINSICS[name] : void 0;
|
|
255
|
+
const imported = primitives.has(name) || RUNTIME_PRIMITIVES2.has(name);
|
|
256
|
+
if (!intrinsic && !imported) return;
|
|
257
|
+
const position = node.loc?.start;
|
|
258
|
+
if (!position) return;
|
|
259
|
+
let statement;
|
|
260
|
+
let parent;
|
|
261
|
+
let index = -1;
|
|
262
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
263
|
+
if (isStatement(stack[i]) || isExport(stack[i])) {
|
|
264
|
+
statement = stack[i];
|
|
265
|
+
parent = stack[i - 1];
|
|
266
|
+
index = i;
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (!statement) return;
|
|
271
|
+
let start = statement.start;
|
|
272
|
+
let end = statement.end;
|
|
273
|
+
for (let i = index - 1; i >= 0; i--) {
|
|
274
|
+
if (!isExport(stack[i])) break;
|
|
275
|
+
start = stack[i].start;
|
|
276
|
+
end = stack[i].end;
|
|
277
|
+
parent = stack[i - 1];
|
|
278
|
+
}
|
|
279
|
+
if (claimed.has(start)) return;
|
|
280
|
+
claimed.add(start);
|
|
281
|
+
const label = nameFor(stack);
|
|
282
|
+
const args = [
|
|
283
|
+
JSON.stringify(filename),
|
|
284
|
+
String(position.line),
|
|
285
|
+
String(position.column),
|
|
286
|
+
label ? JSON.stringify(label) : void 0
|
|
287
|
+
].filter((a) => a !== void 0).join(",");
|
|
288
|
+
const mark = `globalThis.${SOURCE_MARKER}?.(${args});`;
|
|
289
|
+
if (isLoneBranch(statement, parent)) {
|
|
290
|
+
edits.push({ start, end: start, code: `{${mark}` });
|
|
291
|
+
edits.push({ start: end, end, code: "}" });
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
edits.push({ start, end: start, code: mark });
|
|
295
|
+
});
|
|
296
|
+
return { edits, marked: edits.length };
|
|
297
|
+
}
|
|
298
|
+
export {
|
|
299
|
+
COMPONENT_MARKER,
|
|
300
|
+
HOLE_MARKER,
|
|
301
|
+
PROPS_MARKER,
|
|
302
|
+
SOURCE_MARKER,
|
|
303
|
+
collectSourceEdits,
|
|
304
|
+
markHole,
|
|
305
|
+
markProps,
|
|
306
|
+
mayHaveReactiveCall
|
|
307
|
+
};
|