@fluixi/compiler 1.0.0-alpha.82 → 1.0.0-alpha.84

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 (188) hide show
  1. package/dist/analyze/expr-shape.cjs +62 -1
  2. package/dist/analyze/expr-shape.d.cts +14 -0
  3. package/dist/analyze/expr-shape.mjs +41 -1
  4. package/dist/analyze/intrinsics.cjs +80 -1
  5. package/dist/analyze/intrinsics.d.cts +66 -0
  6. package/dist/analyze/intrinsics.mjs +59 -1
  7. package/dist/analyze/paren.cjs +134 -0
  8. package/dist/analyze/paren.d.cts +23 -0
  9. package/dist/analyze/paren.d.ts +24 -0
  10. package/dist/analyze/paren.d.ts.map +1 -0
  11. package/dist/analyze/paren.js +168 -0
  12. package/dist/analyze/paren.mjs +113 -0
  13. package/dist/analyze/props-destructure.cjs +226 -1
  14. package/dist/analyze/props-destructure.d.cts +83 -0
  15. package/dist/analyze/props-destructure.mjs +205 -1
  16. package/dist/analyze/reactive-bindings.cjs +190 -1
  17. package/dist/analyze/reactive-bindings.d.cts +42 -0
  18. package/dist/analyze/reactive-bindings.mjs +167 -1
  19. package/dist/analyze/reactive-expr.cjs +38 -1
  20. package/dist/analyze/reactive-expr.d.cts +38 -0
  21. package/dist/analyze/reactive-expr.mjs +17 -1
  22. package/dist/analyze/static-graph.cjs +811 -0
  23. package/dist/analyze/static-graph.d.cts +102 -0
  24. package/dist/analyze/static-graph.d.ts +103 -0
  25. package/dist/analyze/static-graph.d.ts.map +1 -0
  26. package/dist/analyze/static-graph.js +869 -0
  27. package/dist/analyze/static-graph.mjs +793 -0
  28. package/dist/babel-NRW4EFTG.mjs +636 -0
  29. package/dist/chunk-3YKZ4GNH.mjs +11 -0
  30. package/dist/chunk-EZR7NZOY.mjs +1718 -0
  31. package/dist/chunk-FSSWUXUR.mjs +16 -0
  32. package/dist/chunk-MJV3UXIL.mjs +158 -0
  33. package/dist/chunk-R2VHAZAX.mjs +1078 -0
  34. package/dist/codegen/backend.cjs +18 -1
  35. package/dist/codegen/backend.d.cts +35 -0
  36. package/dist/codegen/backends/imperative.cjs +542 -1
  37. package/dist/codegen/backends/imperative.d.cts +11 -0
  38. package/dist/codegen/backends/imperative.d.ts.map +1 -1
  39. package/dist/codegen/backends/imperative.js +68 -13
  40. package/dist/codegen/backends/imperative.mjs +519 -1
  41. package/dist/codegen/contract.cjs +52 -1
  42. package/dist/codegen/contract.d.cts +24 -0
  43. package/dist/codegen/contract.mjs +31 -1
  44. package/dist/codegen/partial-template.cjs +176 -1
  45. package/dist/codegen/partial-template.d.cts +61 -0
  46. package/dist/codegen/partial-template.mjs +153 -1
  47. package/dist/codegen/serialize-static.cjs +125 -1
  48. package/dist/codegen/serialize-static.d.cts +38 -0
  49. package/dist/codegen/serialize-static.d.ts +16 -0
  50. package/dist/codegen/serialize-static.d.ts.map +1 -1
  51. package/dist/codegen/serialize-static.js +25 -0
  52. package/dist/codegen/serialize-static.mjs +104 -1
  53. package/dist/frontend/babel/build-ir-lit.cjs +1509 -1
  54. package/dist/frontend/babel/build-ir-lit.d.cts +26 -0
  55. package/dist/frontend/babel/build-ir-lit.mjs +1478 -1
  56. package/dist/frontend/babel/build-ir.cjs +1524 -1
  57. package/dist/frontend/babel/build-ir.d.cts +35 -0
  58. package/dist/frontend/babel/build-ir.mjs +1495 -1
  59. package/dist/frontend/babel/index.cjs +2186 -1
  60. package/dist/frontend/babel/index.d.cts +33 -0
  61. package/dist/frontend/babel/index.mjs +2156 -1
  62. package/dist/frontend/babel/lower-template.cjs +1507 -1
  63. package/dist/frontend/babel/lower-template.d.cts +23 -0
  64. package/dist/frontend/babel/lower-template.mjs +1478 -1
  65. package/dist/frontend/babel/plugin.cjs +2132 -1
  66. package/dist/frontend/babel/plugin.d.cts +95 -0
  67. package/dist/frontend/babel/plugin.mjs +2103 -1
  68. package/dist/frontend/babel/server-functions.cjs +110 -1
  69. package/dist/frontend/babel/server-functions.d.cts +10 -0
  70. package/dist/frontend/babel/server-functions.mjs +89 -1
  71. package/dist/frontend/babel/types.cjs +18 -1
  72. package/dist/frontend/babel/types.d.cts +33 -0
  73. package/dist/frontend/types.cjs +18 -1
  74. package/dist/frontend/types.d.cts +25 -0
  75. package/dist/frontend/vocabulary.cjs +98 -0
  76. package/dist/frontend/vocabulary.d.cts +79 -0
  77. package/dist/frontend/vocabulary.d.ts +80 -0
  78. package/dist/frontend/vocabulary.d.ts.map +1 -0
  79. package/dist/frontend/vocabulary.js +124 -0
  80. package/dist/frontend/vocabulary.mjs +77 -0
  81. package/dist/index.cjs +1594 -13
  82. package/dist/index.d.cts +27 -0
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -0
  85. package/dist/index.mjs +1574 -13
  86. package/dist/integrations.cjs +4307 -25
  87. package/dist/integrations.d.cts +215 -0
  88. package/dist/integrations.d.ts +16 -0
  89. package/dist/integrations.d.ts.map +1 -1
  90. package/dist/integrations.js +21 -2
  91. package/dist/integrations.mjs +531 -17
  92. package/dist/ir/nodes.cjs +18 -1
  93. package/dist/ir/nodes.d.cts +168 -0
  94. package/dist/ir/nodes.d.ts +46 -0
  95. package/dist/ir/nodes.d.ts.map +1 -1
  96. package/dist/lower/compile-template.cjs +1356 -1
  97. package/dist/lower/compile-template.d.cts +69 -0
  98. package/dist/lower/compile-template.d.ts +12 -0
  99. package/dist/lower/compile-template.d.ts.map +1 -1
  100. package/dist/lower/compile-template.js +5 -1
  101. package/dist/lower/compile-template.mjs +1336 -1
  102. package/dist/lower/jsx.cjs +529 -1
  103. package/dist/lower/jsx.d.cts +25 -0
  104. package/dist/lower/jsx.d.ts +2 -0
  105. package/dist/lower/jsx.d.ts.map +1 -1
  106. package/dist/lower/jsx.js +27 -4
  107. package/dist/lower/jsx.mjs +506 -1
  108. package/dist/lower/template.cjs +1061 -1
  109. package/dist/lower/template.d.cts +53 -0
  110. package/dist/lower/template.d.ts +14 -1
  111. package/dist/lower/template.d.ts.map +1 -1
  112. package/dist/lower/template.js +106 -19
  113. package/dist/lower/template.mjs +1042 -1
  114. package/dist/lower/text.cjs +42 -1
  115. package/dist/lower/text.d.cts +10 -0
  116. package/dist/lower/text.mjs +21 -1
  117. package/dist/optimize/analyze-static.cjs +112 -1
  118. package/dist/optimize/analyze-static.d.cts +39 -0
  119. package/dist/optimize/analyze-static.mjs +91 -1
  120. package/dist/optimize/collapse-strategies.cjs +90 -1
  121. package/dist/optimize/collapse-strategies.d.cts +30 -0
  122. package/dist/optimize/collapse-strategies.mjs +67 -1
  123. package/dist/options.cjs +33 -1
  124. package/dist/options.d.cts +39 -0
  125. package/dist/options.mjs +12 -1
  126. package/dist/resolve/builtins.cjs +73 -1
  127. package/dist/resolve/builtins.d.cts +68 -0
  128. package/dist/resolve/builtins.mjs +53 -1
  129. package/dist/resolve/component-globals.cjs +233 -13
  130. package/dist/resolve/component-globals.d.cts +80 -0
  131. package/dist/resolve/component-globals.mjs +210 -13
  132. package/dist/resolve/component-resolver.cjs +80 -1
  133. package/dist/resolve/component-resolver.d.cts +68 -0
  134. package/dist/resolve/component-resolver.mjs +59 -1
  135. package/dist/resolve/load-directive.cjs +93 -1
  136. package/dist/resolve/load-directive.d.cts +53 -0
  137. package/dist/resolve/load-directive.mjs +72 -1
  138. package/dist/resolve/resolve-ir.cjs +108 -1
  139. package/dist/resolve/resolve-ir.d.cts +53 -0
  140. package/dist/resolve/resolve-ir.mjs +85 -1
  141. package/dist/resolve/write-globals.cjs +318 -13
  142. package/dist/resolve/write-globals.d.cts +30 -0
  143. package/dist/resolve/write-globals.mjs +297 -13
  144. package/dist/server-fns-4ZXN6DYU.mjs +78 -0
  145. package/dist/server-functions-V6D6DRIA.mjs +82 -0
  146. package/dist/transform/bindings.cjs +71 -1
  147. package/dist/transform/bindings.d.cts +16 -0
  148. package/dist/transform/bindings.mjs +50 -1
  149. package/dist/transform/index.cjs +2732 -8
  150. package/dist/transform/index.d.cts +15 -0
  151. package/dist/transform/index.mjs +3773 -17
  152. package/dist/transform/intrinsics.cjs +216 -3
  153. package/dist/transform/intrinsics.d.cts +21 -0
  154. package/dist/transform/intrinsics.mjs +193 -3
  155. package/dist/transform/props.cjs +441 -3
  156. package/dist/transform/props.d.cts +45 -0
  157. package/dist/transform/props.mjs +1482 -12
  158. package/dist/transform/server-fn-id.cjs +35 -1
  159. package/dist/transform/server-fn-id.d.cts +9 -0
  160. package/dist/transform/server-fn-id.mjs +14 -1
  161. package/dist/transform/server-fns.cjs +114 -2
  162. package/dist/transform/server-fns.d.cts +12 -0
  163. package/dist/transform/server-fns.mjs +1155 -11
  164. package/dist/transform/source-locations.cjs +330 -0
  165. package/dist/transform/source-locations.d.cts +43 -0
  166. package/dist/transform/source-locations.d.ts +44 -0
  167. package/dist/transform/source-locations.d.ts.map +1 -0
  168. package/dist/transform/source-locations.js +238 -0
  169. package/dist/transform/source-locations.mjs +307 -0
  170. package/dist/transform/templates.cjs +2701 -7
  171. package/dist/transform/templates.d.cts +69 -0
  172. package/dist/transform/templates.d.ts +12 -4
  173. package/dist/transform/templates.d.ts.map +1 -1
  174. package/dist/transform/templates.js +72 -7
  175. package/dist/transform/templates.mjs +3743 -16
  176. package/dist/transform-BT4MMASR.mjs +893 -0
  177. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  178. package/package.json +6 -5
  179. package/dist/babel-4JUDAR2G.mjs +0 -1
  180. package/dist/chunk-3SAEGOMQ.mjs +0 -1
  181. package/dist/chunk-IBRM4W7I.mjs +0 -10
  182. package/dist/chunk-OHHZCYIQ.mjs +0 -1
  183. package/dist/chunk-PVR2SN3B.mjs +0 -1
  184. package/dist/chunk-QUIYULS2.mjs +0 -1
  185. package/dist/chunk-YR3SAEO7.mjs +0 -1
  186. package/dist/server-fns-6QM243HC.mjs +0 -2
  187. package/dist/server-functions-E3LKCZ4R.mjs +0 -1
  188. package/dist/transform-5WC4FWJE.mjs +0 -8
@@ -1 +1,205 @@
1
- function u(s,n){if(s)switch(s.type){case"Identifier":n.add(s.name);return;case"ObjectPattern":for(let e of s.properties)e.type==="RestElement"?u(e.argument,n):u(e.value,n);return;case"ArrayPattern":for(let e of s.elements)u(e,n);return;case"AssignmentPattern":u(s.left,n);return;case"RestElement":u(s.argument,n);return}}function p(s){switch(s.type){case"StringLiteral":case"NumericLiteral":case"BooleanLiteral":case"NullLiteral":case"BigIntLiteral":case"RegExpLiteral":case"Identifier":return!0;case"Literal":return!0;case"TemplateLiteral":return s.expressions.every(p);case"UnaryExpression":return p(s.argument);case"MemberExpression":return!1;default:return!1}}function f(s,n){if(!(!s||typeof s!="object")){n(s);for(let e of Object.keys(s)){if(e==="loc"||e==="range"||e==="leadingComments"||e==="trailingComments")continue;let t=s[e];if(Array.isArray(t))for(let a of t)a&&typeof a=="object"&&f(a,n);else t&&typeof t=="object"&&typeof t.type=="string"&&f(t,n)}}}function y(s){let n=new Set;return f(s,e=>{if(e.type==="AssignmentExpression")u(e.left,n);else if(e.type==="UpdateExpression"){let t=e.argument;t?.type==="Identifier"&&n.add(t.name)}}),n}function h(s,n){let e=new Set,t=a=>{let c=new Set;u(a,c);for(let i of c)n.has(i)&&e.add(i)};return f(s,a=>{switch(a.type){case"VariableDeclarator":t(a.id);return;case"FunctionDeclaration":case"FunctionExpression":case"ArrowFunctionExpression":t(a.id);for(let c of a.params??[])t(c);return;case"CatchClause":t(a.param);return;case"ClassDeclaration":case"ClassExpression":t(a.id);return}}),e}function g(s,n,e){for(let t of s.properties??[]){if(t.type==="RestElement"){let o=t.argument;if(o?.type!=="Identifier"||n.length>0){let l=new Set;u(o,l);for(let N of l)e.bails.push({name:N,reason:"rest"});continue}e.rest={name:o.name,keys:[]};continue}if(t.computed){let o=new Set;u(t.value,o);for(let l of o)e.bails.push({name:l,reason:"computed"});continue}let a=t.key,c=a.type==="Identifier"?a.name:a.value,i=t.value,r;i.type==="AssignmentPattern"&&(r=i.right,i=i.left);let d=[...n,c];if(i.type==="Identifier"){if(r&&!p(r)){e.bails.push({name:i.name,reason:"unsafe-default"});continue}e.reads.push({name:i.name,path:d,...r?{fallback:r}:{}});continue}if(i.type==="ObjectPattern"){if(r){let o=new Set;u(i,o);for(let l of o)e.bails.push({name:l,reason:"unsafe-default"});continue}g(i,d,e);continue}let m=new Set;u(i,m);for(let o of m)e.bails.push({name:o,reason:"computed"})}}function w(s,n){let e={reads:[],bails:[]};if(s?.type!=="ObjectPattern"||(g(s,[],e),e.rest&&(n?.type!=="BlockStatement"?(e.bails.push({name:e.rest.name,reason:"rest"}),delete e.rest):e.rest.keys=(s.properties??[]).filter(r=>r.type!=="RestElement"&&!r.computed).map(r=>{let d=r.key;return d.type==="Identifier"?d.name:d.value})),e.reads.length===0&&!e.rest))return e;let t=new Set(e.reads.map(r=>r.name));e.rest&&t.add(e.rest.name);let a=y(n),c=h(n,t),i=[];for(let r of e.reads)a.has(r.name)?e.bails.push({name:r.name,reason:"reassigned"}):c.has(r.name)?e.bails.push({name:r.name,reason:"shadowed"}):i.push(r);return e.reads=i,e.rest&&a.has(e.rest.name)?(e.bails.push({name:e.rest.name,reason:"reassigned"}),delete e.rest):e.rest&&c.has(e.rest.name)&&(e.bails.push({name:e.rest.name,reason:"shadowed"}),delete e.rest),e}function b(s){switch(s){case"rest":return"this rest element cannot be served by splitProps, and copying the props into a plain object would lose the getters";case"computed":return"the property is not known until it runs";case"reassigned":return"the binding is assigned to, and props are read-only";case"shadowed":return"an inner scope binds the same name";case"unsafe-default":return"the default would have to run again on every read"}}export{b as explainBail,w as planPropsDestructure};
1
+ // src/analyze/props-destructure.ts
2
+ function patternNames(node, out) {
3
+ if (!node) return;
4
+ switch (node.type) {
5
+ case "Identifier":
6
+ out.add(node.name);
7
+ return;
8
+ case "ObjectPattern":
9
+ for (const p of node.properties) {
10
+ if (p.type === "RestElement") patternNames(p.argument, out);
11
+ else patternNames(p.value, out);
12
+ }
13
+ return;
14
+ case "ArrayPattern":
15
+ for (const e of node.elements) patternNames(e, out);
16
+ return;
17
+ case "AssignmentPattern":
18
+ patternNames(node.left, out);
19
+ return;
20
+ case "RestElement":
21
+ patternNames(node.argument, out);
22
+ return;
23
+ }
24
+ }
25
+ function isSafeDefault(node) {
26
+ switch (node.type) {
27
+ case "StringLiteral":
28
+ case "NumericLiteral":
29
+ case "BooleanLiteral":
30
+ case "NullLiteral":
31
+ case "BigIntLiteral":
32
+ case "RegExpLiteral":
33
+ case "Identifier":
34
+ return true;
35
+ // ESTree spells every literal as `Literal`; both shapes reach this analysis.
36
+ case "Literal":
37
+ return true;
38
+ case "TemplateLiteral":
39
+ return node.expressions.every(isSafeDefault);
40
+ case "UnaryExpression":
41
+ return isSafeDefault(node.argument);
42
+ case "MemberExpression":
43
+ return false;
44
+ default:
45
+ return false;
46
+ }
47
+ }
48
+ function walk(root, visit) {
49
+ if (!root || typeof root !== "object") return;
50
+ visit(root);
51
+ for (const key of Object.keys(root)) {
52
+ if (key === "loc" || key === "range" || key === "leadingComments" || key === "trailingComments") continue;
53
+ const value = root[key];
54
+ if (Array.isArray(value)) {
55
+ for (const item of value) if (item && typeof item === "object") walk(item, visit);
56
+ } else if (value && typeof value === "object" && typeof value.type === "string") {
57
+ walk(value, visit);
58
+ }
59
+ }
60
+ }
61
+ function reassignedNames(body) {
62
+ const written = /* @__PURE__ */ new Set();
63
+ walk(body, (node) => {
64
+ if (node.type === "AssignmentExpression") patternNames(node.left, written);
65
+ else if (node.type === "UpdateExpression") {
66
+ const arg = node.argument;
67
+ if (arg?.type === "Identifier") written.add(arg.name);
68
+ }
69
+ });
70
+ return written;
71
+ }
72
+ function shadowedNames(body, candidates) {
73
+ const shadowed = /* @__PURE__ */ new Set();
74
+ const note = (node) => {
75
+ const names = /* @__PURE__ */ new Set();
76
+ patternNames(node, names);
77
+ for (const n of names) if (candidates.has(n)) shadowed.add(n);
78
+ };
79
+ walk(body, (node) => {
80
+ switch (node.type) {
81
+ case "VariableDeclarator":
82
+ note(node.id);
83
+ return;
84
+ case "FunctionDeclaration":
85
+ case "FunctionExpression":
86
+ case "ArrowFunctionExpression":
87
+ note(node.id);
88
+ for (const p of node.params ?? []) note(p);
89
+ return;
90
+ case "CatchClause":
91
+ note(node.param);
92
+ return;
93
+ case "ClassDeclaration":
94
+ case "ClassExpression":
95
+ note(node.id);
96
+ return;
97
+ }
98
+ });
99
+ return shadowed;
100
+ }
101
+ function collect(pattern, path, plan) {
102
+ for (const property of pattern.properties ?? []) {
103
+ if (property.type === "RestElement") {
104
+ const argument = property.argument;
105
+ if (argument?.type !== "Identifier" || path.length > 0) {
106
+ const names2 = /* @__PURE__ */ new Set();
107
+ patternNames(argument, names2);
108
+ for (const name of names2) plan.bails.push({ name, reason: "rest" });
109
+ continue;
110
+ }
111
+ plan.rest = { name: argument.name, keys: [] };
112
+ continue;
113
+ }
114
+ if (property.computed) {
115
+ const names2 = /* @__PURE__ */ new Set();
116
+ patternNames(property.value, names2);
117
+ for (const name of names2) plan.bails.push({ name, reason: "computed" });
118
+ continue;
119
+ }
120
+ const key = property.key;
121
+ const propertyName = key.type === "Identifier" ? key.name : key.value;
122
+ let value = property.value;
123
+ let fallback;
124
+ if (value.type === "AssignmentPattern") {
125
+ fallback = value.right;
126
+ value = value.left;
127
+ }
128
+ const here = [...path, propertyName];
129
+ if (value.type === "Identifier") {
130
+ if (fallback && !isSafeDefault(fallback)) {
131
+ plan.bails.push({ name: value.name, reason: "unsafe-default" });
132
+ continue;
133
+ }
134
+ plan.reads.push({ name: value.name, path: here, ...fallback ? { fallback } : {} });
135
+ continue;
136
+ }
137
+ if (value.type === "ObjectPattern") {
138
+ if (fallback) {
139
+ const names2 = /* @__PURE__ */ new Set();
140
+ patternNames(value, names2);
141
+ for (const name of names2) plan.bails.push({ name, reason: "unsafe-default" });
142
+ continue;
143
+ }
144
+ collect(value, here, plan);
145
+ continue;
146
+ }
147
+ const names = /* @__PURE__ */ new Set();
148
+ patternNames(value, names);
149
+ for (const name of names) plan.bails.push({ name, reason: "computed" });
150
+ }
151
+ }
152
+ function planPropsDestructure(pattern, body) {
153
+ const plan = { reads: [], bails: [] };
154
+ if (pattern?.type !== "ObjectPattern") return plan;
155
+ collect(pattern, [], plan);
156
+ if (plan.rest) {
157
+ if (body?.type !== "BlockStatement") {
158
+ plan.bails.push({ name: plan.rest.name, reason: "rest" });
159
+ delete plan.rest;
160
+ } else {
161
+ plan.rest.keys = (pattern.properties ?? []).filter((p) => p.type !== "RestElement" && !p.computed).map((p) => {
162
+ const key = p.key;
163
+ return key.type === "Identifier" ? key.name : key.value;
164
+ });
165
+ }
166
+ }
167
+ if (plan.reads.length === 0 && !plan.rest) return plan;
168
+ const candidates = new Set(plan.reads.map((r) => r.name));
169
+ if (plan.rest) candidates.add(plan.rest.name);
170
+ const written = reassignedNames(body);
171
+ const shadowed = shadowedNames(body, candidates);
172
+ const kept = [];
173
+ for (const read of plan.reads) {
174
+ if (written.has(read.name)) plan.bails.push({ name: read.name, reason: "reassigned" });
175
+ else if (shadowed.has(read.name)) plan.bails.push({ name: read.name, reason: "shadowed" });
176
+ else kept.push(read);
177
+ }
178
+ plan.reads = kept;
179
+ if (plan.rest && written.has(plan.rest.name)) {
180
+ plan.bails.push({ name: plan.rest.name, reason: "reassigned" });
181
+ delete plan.rest;
182
+ } else if (plan.rest && shadowed.has(plan.rest.name)) {
183
+ plan.bails.push({ name: plan.rest.name, reason: "shadowed" });
184
+ delete plan.rest;
185
+ }
186
+ return plan;
187
+ }
188
+ function explainBail(reason) {
189
+ switch (reason) {
190
+ case "rest":
191
+ return "this rest element cannot be served by splitProps, and copying the props into a plain object would lose the getters";
192
+ case "computed":
193
+ return "the property is not known until it runs";
194
+ case "reassigned":
195
+ return "the binding is assigned to, and props are read-only";
196
+ case "shadowed":
197
+ return "an inner scope binds the same name";
198
+ case "unsafe-default":
199
+ return "the default would have to run again on every read";
200
+ }
201
+ }
202
+ export {
203
+ explainBail,
204
+ planPropsDestructure
205
+ };
@@ -1 +1,190 @@
1
- "use strict";var f=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var I=(r,e)=>{for(var n in e)f(r,n,{get:e[n],enumerable:!0})},v=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of y(e))!N.call(r,i)&&i!==n&&f(r,i,{get:()=>e[i],enumerable:!(t=g(e,i))||t.enumerable});return r};var x=r=>v(f({},"__esModule",{value:!0}),r);var b={};I(b,{declaredNames:()=>E,resolveReactiveBindings:()=>w});module.exports=x(b);var o="@fluixi/reactive/signal",l={$signal:{export:"signal",module:o,returns:"signal-handle"},$memo:{export:"memo",module:o,returns:"memo-handle"},$effect:{export:"effect",module:o,returns:"effect"},$store:{export:"store",module:"@fluixi/reactive/store",returns:"store-handle"},$resource:{export:"resource",module:o,returns:"resource-handle"},$selector:{export:"createSelector",module:o,returns:"memo-accessor"},$deferred:{export:"createDeferred",module:o,returns:"memo-accessor"},$untrack:{export:"untrack",module:o,returns:"plain"},$untrackStore:{export:"untrackStore",module:"@fluixi/reactive/store",returns:"plain"}},p={signal:"signal-handle",memo:"memo-handle",effect:"effect",store:"store-handle",createSignal:["signal-accessor","signal-setter"],createMemo:"memo-accessor",createEffect:"effect",createRenderEffect:"effect",createStore:"reactive-object",resource:"resource-handle",createResource:"reactive-object",createSelector:"memo-accessor",createDeferred:"memo-accessor"},R=["@fluixi/reactive","@fluixi/reactive/signal","@fluixi/reactive/store","@fluixi/core"],D=new RegExp(`\\$(?:${Object.keys(l).map(r=>r.slice(1)).join("|")})\\s*\\(`);function d(r){return R.includes(r)}function s(r,e){if(r)switch(r.type){case"Identifier":e.add(r.name);return;case"ObjectPattern":for(let n of r.properties??[])n.type==="RestElement"?s(n.argument,e):s(n.value,e);return;case"ArrayPattern":for(let n of r.elements??[])s(n,e);return;case"AssignmentPattern":s(r.left,e);return;case"RestElement":s(r.argument,e);return}}function c(r,e){if(!(!r||typeof r!="object"||typeof r.type!="string")){e(r);for(let n of Object.keys(r)){if(n==="loc"||n==="leadingComments"||n==="trailingComments")continue;let t=r[n];if(Array.isArray(t))for(let i of t)c(i,e);else t&&typeof t=="object"&&c(t,e)}}}function S(r,e){if(r.type!=="CallExpression")return;let n=r.callee;if(n?.type!=="Identifier")return;let t=n.name,i=e.primitives.get(t);if(i)return i;let a=l[t];if(a&&!e.shadowed.has(t))return a.returns}function h(r,e,n){if(Array.isArray(e)){r.type==="ArrayPattern"&&r.elements.forEach((t,i)=>{let a=e[i];t?.type==="Identifier"&&a&&n.set(t.name,a)});return}r.type==="Identifier"&&n.set(r.name,e)}function E(r){let e=new Set;return c(r,n=>{switch(n.type){case"VariableDeclarator":s(n.id,e);return;case"FunctionDeclaration":case"FunctionExpression":case"ArrowFunctionExpression":s(n.id,e);for(let t of n.params??[])s(t,e);return;case"ClassDeclaration":case"ClassExpression":s(n.id,e);return;case"ImportSpecifier":case"ImportDefaultSpecifier":case"ImportNamespaceSpecifier":s(n.local,e);return;case"CatchClause":s(n.param,e);return}}),e}function w(r){let e={kinds:new Map,primitives:new Map,shadowed:new Set},n=r;c(n,t=>{let i=new Set;if(t.type==="VariableDeclarator")s(t.id,i);else if(t.type==="FunctionDeclaration"||t.type==="ClassDeclaration")s(t.id,i);else if(t.type==="ImportDefaultSpecifier"||t.type==="ImportNamespaceSpecifier")s(t.local,i);else if(t.type==="ImportSpecifier")s(t.local,i);else if(t.type==="FunctionExpression"||t.type==="ArrowFunctionExpression"||t.type==="FunctionDeclaration")for(let a of t.params??[])s(a,i);for(let a of i)l[a]&&e.shadowed.add(a)});for(let t of n.body??[])if(t.type==="ImportDeclaration"&&d(t.source?.value))for(let i of t.specifiers??[]){if(i.type!=="ImportSpecifier")continue;let a=i.imported,m=a.type==="Identifier"?a.name:a.value,u=p[m];u&&e.primitives.set(i.local.name,u)}return c(n,t=>{if(t.type!=="VariableDeclarator"||!t.init)return;let i=S(t.init,e);i&&h(t.id,i,e.kinds)}),e}
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/analyze/reactive-bindings.ts
21
+ var reactive_bindings_exports = {};
22
+ __export(reactive_bindings_exports, {
23
+ declaredNames: () => declaredNames,
24
+ resolveReactiveBindings: () => resolveReactiveBindings
25
+ });
26
+ module.exports = __toCommonJS(reactive_bindings_exports);
27
+
28
+ // src/analyze/intrinsics.ts
29
+ var REACTIVE_MODULE = "@fluixi/reactive/signal";
30
+ var INTRINSICS = {
31
+ $signal: { export: "signal", module: REACTIVE_MODULE, returns: "signal-handle" },
32
+ $memo: { export: "memo", module: REACTIVE_MODULE, returns: "memo-handle" },
33
+ $effect: { export: "effect", module: REACTIVE_MODULE, returns: "effect" },
34
+ $store: { export: "store", module: "@fluixi/reactive/store", returns: "store-handle" },
35
+ $resource: { export: "resource", module: REACTIVE_MODULE, returns: "resource-handle" },
36
+ // No short runtime form for these yet, so the intrinsic stands for the `create*`
37
+ // name. Still worth having — no import to write — and when a shorter form is
38
+ // designed, the change is this line rather than a compiler pass.
39
+ $selector: { export: "createSelector", module: REACTIVE_MODULE, returns: "memo-accessor" },
40
+ $deferred: { export: "createDeferred", module: REACTIVE_MODULE, returns: "memo-accessor" },
41
+ // Not value constructors, but the compiler has to know them: they change what a read
42
+ // does. `untrack` suppresses dependency collection, which is exactly the kind of thing
43
+ // dependency analysis must not guess at.
44
+ $untrack: { export: "untrack", module: REACTIVE_MODULE, returns: "plain" },
45
+ $untrackStore: { export: "untrackStore", module: "@fluixi/reactive/store", returns: "plain" }
46
+ };
47
+ var RUNTIME_PRIMITIVES = {
48
+ signal: "signal-handle",
49
+ memo: "memo-handle",
50
+ effect: "effect",
51
+ store: "store-handle",
52
+ createSignal: ["signal-accessor", "signal-setter"],
53
+ createMemo: "memo-accessor",
54
+ createEffect: "effect",
55
+ createRenderEffect: "effect",
56
+ createStore: "reactive-object",
57
+ resource: "resource-handle",
58
+ createResource: "reactive-object",
59
+ createSelector: "memo-accessor",
60
+ createDeferred: "memo-accessor"
61
+ };
62
+ var PRIMITIVE_MODULES = [
63
+ "@fluixi/reactive",
64
+ "@fluixi/reactive/signal",
65
+ "@fluixi/reactive/store",
66
+ "@fluixi/core"
67
+ ];
68
+ var INTRINSIC_CALL = new RegExp(`\\$(?:${Object.keys(INTRINSICS).map((n) => n.slice(1)).join("|")})\\s*\\(`);
69
+ function isPrimitiveModule(source) {
70
+ return PRIMITIVE_MODULES.includes(source);
71
+ }
72
+
73
+ // src/analyze/reactive-bindings.ts
74
+ function patternNames(node, out) {
75
+ if (!node) return;
76
+ switch (node.type) {
77
+ case "Identifier":
78
+ out.add(node.name);
79
+ return;
80
+ case "ObjectPattern":
81
+ for (const p of node.properties ?? []) {
82
+ if (p.type === "RestElement") patternNames(p.argument, out);
83
+ else patternNames(p.value, out);
84
+ }
85
+ return;
86
+ case "ArrayPattern":
87
+ for (const e of node.elements ?? []) patternNames(e, out);
88
+ return;
89
+ case "AssignmentPattern":
90
+ patternNames(node.left, out);
91
+ return;
92
+ case "RestElement":
93
+ patternNames(node.argument, out);
94
+ return;
95
+ }
96
+ }
97
+ function walk(root, visit) {
98
+ if (!root || typeof root !== "object" || typeof root.type !== "string") return;
99
+ visit(root);
100
+ for (const key of Object.keys(root)) {
101
+ if (key === "loc" || key === "leadingComments" || key === "trailingComments") continue;
102
+ const value = root[key];
103
+ if (Array.isArray(value)) for (const item of value) walk(item, visit);
104
+ else if (value && typeof value === "object") walk(value, visit);
105
+ }
106
+ }
107
+ function calledPrimitive(node, bindings) {
108
+ if (node.type !== "CallExpression") return void 0;
109
+ const callee = node.callee;
110
+ if (callee?.type !== "Identifier") return void 0;
111
+ const name = callee.name;
112
+ const imported = bindings.primitives.get(name);
113
+ if (imported) return imported;
114
+ const intrinsic = INTRINSICS[name];
115
+ if (intrinsic && !bindings.shadowed.has(name)) return intrinsic.returns;
116
+ return void 0;
117
+ }
118
+ function classify(id, returns, kinds) {
119
+ if (Array.isArray(returns)) {
120
+ if (id.type === "ArrayPattern") {
121
+ id.elements.forEach((element, index) => {
122
+ const kind = returns[index];
123
+ if (element?.type === "Identifier" && kind) kinds.set(element.name, kind);
124
+ });
125
+ }
126
+ return;
127
+ }
128
+ if (id.type === "Identifier") kinds.set(id.name, returns);
129
+ }
130
+ function declaredNames(program) {
131
+ const names = /* @__PURE__ */ new Set();
132
+ walk(program, (node) => {
133
+ switch (node.type) {
134
+ case "VariableDeclarator":
135
+ patternNames(node.id, names);
136
+ return;
137
+ case "FunctionDeclaration":
138
+ case "FunctionExpression":
139
+ case "ArrowFunctionExpression":
140
+ patternNames(node.id, names);
141
+ for (const p of node.params ?? []) patternNames(p, names);
142
+ return;
143
+ case "ClassDeclaration":
144
+ case "ClassExpression":
145
+ patternNames(node.id, names);
146
+ return;
147
+ case "ImportSpecifier":
148
+ case "ImportDefaultSpecifier":
149
+ case "ImportNamespaceSpecifier":
150
+ patternNames(node.local, names);
151
+ return;
152
+ case "CatchClause":
153
+ patternNames(node.param, names);
154
+ return;
155
+ }
156
+ });
157
+ return names;
158
+ }
159
+ function resolveReactiveBindings(program) {
160
+ const bindings = { kinds: /* @__PURE__ */ new Map(), primitives: /* @__PURE__ */ new Map(), shadowed: /* @__PURE__ */ new Set() };
161
+ const root = program;
162
+ walk(root, (node) => {
163
+ const names = /* @__PURE__ */ new Set();
164
+ if (node.type === "VariableDeclarator") patternNames(node.id, names);
165
+ else if (node.type === "FunctionDeclaration" || node.type === "ClassDeclaration") patternNames(node.id, names);
166
+ else if (node.type === "ImportDefaultSpecifier" || node.type === "ImportNamespaceSpecifier") patternNames(node.local, names);
167
+ else if (node.type === "ImportSpecifier") patternNames(node.local, names);
168
+ else if (node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression" || node.type === "FunctionDeclaration") {
169
+ for (const p of node.params ?? []) patternNames(p, names);
170
+ }
171
+ for (const name of names) if (INTRINSICS[name]) bindings.shadowed.add(name);
172
+ });
173
+ for (const statement of root.body ?? []) {
174
+ if (statement.type !== "ImportDeclaration") continue;
175
+ if (!isPrimitiveModule(statement.source?.value)) continue;
176
+ for (const specifier of statement.specifiers ?? []) {
177
+ if (specifier.type !== "ImportSpecifier") continue;
178
+ const importedNode = specifier.imported;
179
+ const imported = importedNode.type === "Identifier" ? importedNode.name : importedNode.value;
180
+ const returns = RUNTIME_PRIMITIVES[imported];
181
+ if (returns) bindings.primitives.set(specifier.local.name, returns);
182
+ }
183
+ }
184
+ walk(root, (node) => {
185
+ if (node.type !== "VariableDeclarator" || !node.init) return;
186
+ const returns = calledPrimitive(node.init, bindings);
187
+ if (returns) classify(node.id, returns, bindings.kinds);
188
+ });
189
+ return bindings;
190
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Which names in a module hold reactive values, and what kind.
3
+ *
4
+ * Resolved from where a name came from, never from how it reads. This has to hold:
5
+ *
6
+ * import { createSignal as useState } from '@fluixi/reactive/signal';
7
+ * const count = useState(0); // a signal
8
+ *
9
+ * function createSignal() { return 42; }
10
+ * const value = createSignal(); // not a signal
11
+ *
12
+ * A name tells you nothing; the binding it resolves to tells you everything. So this
13
+ * walks the imports first, then the declarations that call them, and a local
14
+ * declaration always wins over anything the compiler would otherwise assume.
15
+ *
16
+ * Babel-free by the rule in no-babel-in-core: nodes are read structurally.
17
+ */
18
+ import { type Intrinsic, type ReactiveKind } from './intrinsics.cjs';
19
+ export interface ReactiveBindings {
20
+ /** Local name → what it holds. */
21
+ kinds: Map<string, ReactiveKind>;
22
+ /** Local name → the primitive it calls, for names imported from the runtime. */
23
+ primitives: Map<string, Intrinsic['returns']>;
24
+ /** `$name`s the module shadows with its own binding, so the intrinsic must not fire. */
25
+ shadowed: Set<string>;
26
+ }
27
+ /**
28
+ * Every name the module binds, in any scope.
29
+ *
30
+ * Deliberately scope-blind: it answers "does this file declare this name anywhere", which
31
+ * is the question a diagnostic needs. A component declared inside a function
32
+ * (`const Row = () => …`) is bound just as much as an import, and warning about it would
33
+ * be noise. Over-permissive on purpose — missing a warning beats inventing one.
34
+ */
35
+ export declare function declaredNames(program: unknown): Set<string>;
36
+ /**
37
+ * Read a module's reactive bindings.
38
+ *
39
+ * Two passes, because a call can only be classified once its callee is known: imports
40
+ * and local declarations first, then the declarations that call them.
41
+ */
42
+ export declare function resolveReactiveBindings(program: unknown): ReactiveBindings;
@@ -1 +1,167 @@
1
- var o="@fluixi/reactive/signal",l={$signal:{export:"signal",module:o,returns:"signal-handle"},$memo:{export:"memo",module:o,returns:"memo-handle"},$effect:{export:"effect",module:o,returns:"effect"},$store:{export:"store",module:"@fluixi/reactive/store",returns:"store-handle"},$resource:{export:"resource",module:o,returns:"resource-handle"},$selector:{export:"createSelector",module:o,returns:"memo-accessor"},$deferred:{export:"createDeferred",module:o,returns:"memo-accessor"},$untrack:{export:"untrack",module:o,returns:"plain"},$untrackStore:{export:"untrackStore",module:"@fluixi/reactive/store",returns:"plain"}},u={signal:"signal-handle",memo:"memo-handle",effect:"effect",store:"store-handle",createSignal:["signal-accessor","signal-setter"],createMemo:"memo-accessor",createEffect:"effect",createRenderEffect:"effect",createStore:"reactive-object",resource:"resource-handle",createResource:"reactive-object",createSelector:"memo-accessor",createDeferred:"memo-accessor"},m=["@fluixi/reactive","@fluixi/reactive/signal","@fluixi/reactive/store","@fluixi/core"],N=new RegExp(`\\$(?:${Object.keys(l).map(r=>r.slice(1)).join("|")})\\s*\\(`);function p(r){return m.includes(r)}function s(r,t){if(r)switch(r.type){case"Identifier":t.add(r.name);return;case"ObjectPattern":for(let n of r.properties??[])n.type==="RestElement"?s(n.argument,t):s(n.value,t);return;case"ArrayPattern":for(let n of r.elements??[])s(n,t);return;case"AssignmentPattern":s(r.left,t);return;case"RestElement":s(r.argument,t);return}}function c(r,t){if(!(!r||typeof r!="object"||typeof r.type!="string")){t(r);for(let n of Object.keys(r)){if(n==="loc"||n==="leadingComments"||n==="trailingComments")continue;let e=r[n];if(Array.isArray(e))for(let i of e)c(i,t);else e&&typeof e=="object"&&c(e,t)}}}function g(r,t){if(r.type!=="CallExpression")return;let n=r.callee;if(n?.type!=="Identifier")return;let e=n.name,i=t.primitives.get(e);if(i)return i;let a=l[e];if(a&&!t.shadowed.has(e))return a.returns}function y(r,t,n){if(Array.isArray(t)){r.type==="ArrayPattern"&&r.elements.forEach((e,i)=>{let a=t[i];e?.type==="Identifier"&&a&&n.set(e.name,a)});return}r.type==="Identifier"&&n.set(r.name,t)}function x(r){let t=new Set;return c(r,n=>{switch(n.type){case"VariableDeclarator":s(n.id,t);return;case"FunctionDeclaration":case"FunctionExpression":case"ArrowFunctionExpression":s(n.id,t);for(let e of n.params??[])s(e,t);return;case"ClassDeclaration":case"ClassExpression":s(n.id,t);return;case"ImportSpecifier":case"ImportDefaultSpecifier":case"ImportNamespaceSpecifier":s(n.local,t);return;case"CatchClause":s(n.param,t);return}}),t}function R(r){let t={kinds:new Map,primitives:new Map,shadowed:new Set},n=r;c(n,e=>{let i=new Set;if(e.type==="VariableDeclarator")s(e.id,i);else if(e.type==="FunctionDeclaration"||e.type==="ClassDeclaration")s(e.id,i);else if(e.type==="ImportDefaultSpecifier"||e.type==="ImportNamespaceSpecifier")s(e.local,i);else if(e.type==="ImportSpecifier")s(e.local,i);else if(e.type==="FunctionExpression"||e.type==="ArrowFunctionExpression"||e.type==="FunctionDeclaration")for(let a of e.params??[])s(a,i);for(let a of i)l[a]&&t.shadowed.add(a)});for(let e of n.body??[])if(e.type==="ImportDeclaration"&&p(e.source?.value))for(let i of e.specifiers??[]){if(i.type!=="ImportSpecifier")continue;let a=i.imported,d=a.type==="Identifier"?a.name:a.value,f=u[d];f&&t.primitives.set(i.local.name,f)}return c(n,e=>{if(e.type!=="VariableDeclarator"||!e.init)return;let i=g(e.init,t);i&&y(e.id,i,t.kinds)}),t}export{x as declaredNames,R as resolveReactiveBindings};
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 isPrimitiveModule(source) {
43
+ return PRIMITIVE_MODULES.includes(source);
44
+ }
45
+
46
+ // src/analyze/reactive-bindings.ts
47
+ function patternNames(node, out) {
48
+ if (!node) return;
49
+ switch (node.type) {
50
+ case "Identifier":
51
+ out.add(node.name);
52
+ return;
53
+ case "ObjectPattern":
54
+ for (const p of node.properties ?? []) {
55
+ if (p.type === "RestElement") patternNames(p.argument, out);
56
+ else patternNames(p.value, out);
57
+ }
58
+ return;
59
+ case "ArrayPattern":
60
+ for (const e of node.elements ?? []) patternNames(e, out);
61
+ return;
62
+ case "AssignmentPattern":
63
+ patternNames(node.left, out);
64
+ return;
65
+ case "RestElement":
66
+ patternNames(node.argument, out);
67
+ return;
68
+ }
69
+ }
70
+ function walk(root, visit) {
71
+ if (!root || typeof root !== "object" || typeof root.type !== "string") return;
72
+ visit(root);
73
+ for (const key of Object.keys(root)) {
74
+ if (key === "loc" || key === "leadingComments" || key === "trailingComments") continue;
75
+ const value = root[key];
76
+ if (Array.isArray(value)) for (const item of value) walk(item, visit);
77
+ else if (value && typeof value === "object") walk(value, visit);
78
+ }
79
+ }
80
+ function calledPrimitive(node, bindings) {
81
+ if (node.type !== "CallExpression") return void 0;
82
+ const callee = node.callee;
83
+ if (callee?.type !== "Identifier") return void 0;
84
+ const name = callee.name;
85
+ const imported = bindings.primitives.get(name);
86
+ if (imported) return imported;
87
+ const intrinsic = INTRINSICS[name];
88
+ if (intrinsic && !bindings.shadowed.has(name)) return intrinsic.returns;
89
+ return void 0;
90
+ }
91
+ function classify(id, returns, kinds) {
92
+ if (Array.isArray(returns)) {
93
+ if (id.type === "ArrayPattern") {
94
+ id.elements.forEach((element, index) => {
95
+ const kind = returns[index];
96
+ if (element?.type === "Identifier" && kind) kinds.set(element.name, kind);
97
+ });
98
+ }
99
+ return;
100
+ }
101
+ if (id.type === "Identifier") kinds.set(id.name, returns);
102
+ }
103
+ function declaredNames(program) {
104
+ const names = /* @__PURE__ */ new Set();
105
+ walk(program, (node) => {
106
+ switch (node.type) {
107
+ case "VariableDeclarator":
108
+ patternNames(node.id, names);
109
+ return;
110
+ case "FunctionDeclaration":
111
+ case "FunctionExpression":
112
+ case "ArrowFunctionExpression":
113
+ patternNames(node.id, names);
114
+ for (const p of node.params ?? []) patternNames(p, names);
115
+ return;
116
+ case "ClassDeclaration":
117
+ case "ClassExpression":
118
+ patternNames(node.id, names);
119
+ return;
120
+ case "ImportSpecifier":
121
+ case "ImportDefaultSpecifier":
122
+ case "ImportNamespaceSpecifier":
123
+ patternNames(node.local, names);
124
+ return;
125
+ case "CatchClause":
126
+ patternNames(node.param, names);
127
+ return;
128
+ }
129
+ });
130
+ return names;
131
+ }
132
+ function resolveReactiveBindings(program) {
133
+ const bindings = { kinds: /* @__PURE__ */ new Map(), primitives: /* @__PURE__ */ new Map(), shadowed: /* @__PURE__ */ new Set() };
134
+ const root = program;
135
+ walk(root, (node) => {
136
+ const names = /* @__PURE__ */ new Set();
137
+ if (node.type === "VariableDeclarator") patternNames(node.id, names);
138
+ else if (node.type === "FunctionDeclaration" || node.type === "ClassDeclaration") patternNames(node.id, names);
139
+ else if (node.type === "ImportDefaultSpecifier" || node.type === "ImportNamespaceSpecifier") patternNames(node.local, names);
140
+ else if (node.type === "ImportSpecifier") patternNames(node.local, names);
141
+ else if (node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression" || node.type === "FunctionDeclaration") {
142
+ for (const p of node.params ?? []) patternNames(p, names);
143
+ }
144
+ for (const name of names) if (INTRINSICS[name]) bindings.shadowed.add(name);
145
+ });
146
+ for (const statement of root.body ?? []) {
147
+ if (statement.type !== "ImportDeclaration") continue;
148
+ if (!isPrimitiveModule(statement.source?.value)) continue;
149
+ for (const specifier of statement.specifiers ?? []) {
150
+ if (specifier.type !== "ImportSpecifier") continue;
151
+ const importedNode = specifier.imported;
152
+ const imported = importedNode.type === "Identifier" ? importedNode.name : importedNode.value;
153
+ const returns = RUNTIME_PRIMITIVES[imported];
154
+ if (returns) bindings.primitives.set(specifier.local.name, returns);
155
+ }
156
+ }
157
+ walk(root, (node) => {
158
+ if (node.type !== "VariableDeclarator" || !node.init) return;
159
+ const returns = calledPrimitive(node.init, bindings);
160
+ if (returns) classify(node.id, returns, bindings.kinds);
161
+ });
162
+ return bindings;
163
+ }
164
+ export {
165
+ declaredNames,
166
+ resolveReactiveBindings
167
+ };
@@ -1 +1,38 @@
1
- "use strict";var t=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var s=(e,r)=>{for(var p in r)t(e,p,{get:r[p],enumerable:!0})},l=(e,r,p,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of i(r))!u.call(e,n)&&n!==p&&t(e,n,{get:()=>r[n],enumerable:!(a=c(r,n))||a.enumerable});return e};var d=e=>l(t({},"__esModule",{value:!0}),e);var E={};s(E,{isReactiveShape:()=>o});module.exports=d(E);var m="children";function o(e){switch(e.kind){case"call":return!0;case"member":return e.property!==m;case"compound":return e.parts.some(o);case"opaque":return!1}}
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/analyze/reactive-expr.ts
21
+ var reactive_expr_exports = {};
22
+ __export(reactive_expr_exports, {
23
+ isReactiveShape: () => isReactiveShape
24
+ });
25
+ module.exports = __toCommonJS(reactive_expr_exports);
26
+ var STABLE_MEMBER = "children";
27
+ function isReactiveShape(shape) {
28
+ switch (shape.kind) {
29
+ case "call":
30
+ return true;
31
+ case "member":
32
+ return shape.property !== STABLE_MEMBER;
33
+ case "compound":
34
+ return shape.parts.some(isReactiveShape);
35
+ case "opaque":
36
+ return false;
37
+ }
38
+ }