@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.
Files changed (241) 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.d.ts +2 -2
  4. package/dist/analyze/expr-shape.js +1 -1
  5. package/dist/analyze/expr-shape.mjs +41 -1
  6. package/dist/analyze/intrinsics.cjs +80 -1
  7. package/dist/analyze/intrinsics.d.cts +66 -0
  8. package/dist/analyze/intrinsics.d.ts +7 -7
  9. package/dist/analyze/intrinsics.d.ts.map +1 -1
  10. package/dist/analyze/intrinsics.js +3 -3
  11. package/dist/analyze/intrinsics.mjs +59 -1
  12. package/dist/analyze/paren.cjs +134 -0
  13. package/dist/analyze/paren.d.cts +23 -0
  14. package/dist/analyze/paren.d.ts +24 -0
  15. package/dist/analyze/paren.d.ts.map +1 -0
  16. package/dist/analyze/paren.js +168 -0
  17. package/dist/analyze/paren.mjs +113 -0
  18. package/dist/analyze/props-destructure.cjs +226 -1
  19. package/dist/analyze/props-destructure.d.cts +83 -0
  20. package/dist/analyze/props-destructure.d.ts +3 -3
  21. package/dist/analyze/props-destructure.d.ts.map +1 -1
  22. package/dist/analyze/props-destructure.js +4 -4
  23. package/dist/analyze/props-destructure.mjs +205 -1
  24. package/dist/analyze/reactive-bindings.cjs +190 -1
  25. package/dist/analyze/reactive-bindings.d.cts +42 -0
  26. package/dist/analyze/reactive-bindings.d.ts +1 -1
  27. package/dist/analyze/reactive-bindings.js +2 -2
  28. package/dist/analyze/reactive-bindings.mjs +167 -1
  29. package/dist/analyze/reactive-expr.cjs +38 -1
  30. package/dist/analyze/reactive-expr.d.cts +38 -0
  31. package/dist/analyze/reactive-expr.d.ts +4 -4
  32. package/dist/analyze/reactive-expr.d.ts.map +1 -1
  33. package/dist/analyze/reactive-expr.js +2 -2
  34. package/dist/analyze/reactive-expr.mjs +17 -1
  35. package/dist/analyze/static-graph.cjs +811 -1
  36. package/dist/analyze/static-graph.d.cts +102 -0
  37. package/dist/analyze/static-graph.d.ts +1 -1
  38. package/dist/analyze/static-graph.d.ts.map +1 -1
  39. package/dist/analyze/static-graph.js +11 -11
  40. package/dist/analyze/static-graph.mjs +793 -1
  41. package/dist/babel-TGY76XJ7.mjs +636 -0
  42. package/dist/chunk-4PLHS2FP.mjs +158 -0
  43. package/dist/chunk-6DB5FXS4.mjs +1718 -0
  44. package/dist/chunk-F74GFKSL.mjs +16 -0
  45. package/dist/chunk-G6QC2WRJ.mjs +11 -0
  46. package/dist/chunk-RUDJDZAA.mjs +1078 -0
  47. package/dist/codegen/backend.cjs +18 -1
  48. package/dist/codegen/backend.d.cts +35 -0
  49. package/dist/codegen/backends/imperative.cjs +542 -1
  50. package/dist/codegen/backends/imperative.d.cts +11 -0
  51. package/dist/codegen/backends/imperative.d.ts +1 -1
  52. package/dist/codegen/backends/imperative.d.ts.map +1 -1
  53. package/dist/codegen/backends/imperative.js +24 -20
  54. package/dist/codegen/backends/imperative.mjs +519 -1
  55. package/dist/codegen/contract.cjs +52 -1
  56. package/dist/codegen/contract.d.cts +24 -0
  57. package/dist/codegen/contract.d.ts +2 -2
  58. package/dist/codegen/contract.js +2 -2
  59. package/dist/codegen/contract.mjs +31 -1
  60. package/dist/codegen/partial-template.cjs +176 -1
  61. package/dist/codegen/partial-template.d.cts +61 -0
  62. package/dist/codegen/partial-template.d.ts +4 -4
  63. package/dist/codegen/partial-template.js +0 -0
  64. package/dist/codegen/partial-template.mjs +153 -1
  65. package/dist/codegen/serialize-static.cjs +125 -1
  66. package/dist/codegen/serialize-static.d.cts +38 -0
  67. package/dist/codegen/serialize-static.d.ts +3 -3
  68. package/dist/codegen/serialize-static.js +6 -6
  69. package/dist/codegen/serialize-static.mjs +104 -1
  70. package/dist/frontend/babel/build-ir-lit.cjs +1509 -1
  71. package/dist/frontend/babel/build-ir-lit.d.cts +26 -0
  72. package/dist/frontend/babel/build-ir-lit.d.ts +2 -2
  73. package/dist/frontend/babel/build-ir-lit.mjs +1478 -1
  74. package/dist/frontend/babel/build-ir.cjs +1524 -1
  75. package/dist/frontend/babel/build-ir.d.cts +35 -0
  76. package/dist/frontend/babel/build-ir.d.ts +2 -2
  77. package/dist/frontend/babel/build-ir.js +2 -2
  78. package/dist/frontend/babel/build-ir.mjs +1495 -1
  79. package/dist/frontend/babel/index.cjs +2186 -1
  80. package/dist/frontend/babel/index.d.cts +33 -0
  81. package/dist/frontend/babel/index.d.ts +1 -1
  82. package/dist/frontend/babel/index.js +1 -1
  83. package/dist/frontend/babel/index.mjs +2156 -1
  84. package/dist/frontend/babel/lower-template.cjs +1507 -1
  85. package/dist/frontend/babel/lower-template.d.cts +23 -0
  86. package/dist/frontend/babel/lower-template.d.ts +1 -1
  87. package/dist/frontend/babel/lower-template.js +2 -2
  88. package/dist/frontend/babel/lower-template.mjs +1478 -1
  89. package/dist/frontend/babel/plugin.cjs +2132 -1
  90. package/dist/frontend/babel/plugin.d.cts +95 -0
  91. package/dist/frontend/babel/plugin.d.ts +5 -5
  92. package/dist/frontend/babel/plugin.d.ts.map +1 -1
  93. package/dist/frontend/babel/plugin.js +14 -14
  94. package/dist/frontend/babel/plugin.mjs +2103 -1
  95. package/dist/frontend/babel/server-functions.cjs +110 -1
  96. package/dist/frontend/babel/server-functions.d.cts +10 -0
  97. package/dist/frontend/babel/server-functions.mjs +89 -1
  98. package/dist/frontend/babel/types.cjs +18 -1
  99. package/dist/frontend/babel/types.d.cts +33 -0
  100. package/dist/frontend/types.cjs +18 -1
  101. package/dist/frontend/types.d.cts +25 -0
  102. package/dist/frontend/vocabulary.cjs +98 -0
  103. package/dist/frontend/vocabulary.d.cts +79 -0
  104. package/dist/frontend/vocabulary.d.ts +80 -0
  105. package/dist/frontend/vocabulary.d.ts.map +1 -0
  106. package/dist/frontend/vocabulary.js +124 -0
  107. package/dist/frontend/vocabulary.mjs +77 -0
  108. package/dist/index.cjs +1595 -14
  109. package/dist/index.d.cts +27 -0
  110. package/dist/index.d.ts +1 -1
  111. package/dist/index.js +4 -4
  112. package/dist/index.mjs +1575 -14
  113. package/dist/integrations.cjs +4312 -26
  114. package/dist/integrations.d.cts +215 -0
  115. package/dist/integrations.d.ts +9 -9
  116. package/dist/integrations.d.ts.map +1 -1
  117. package/dist/integrations.js +29 -8
  118. package/dist/integrations.mjs +536 -18
  119. package/dist/ir/nodes.cjs +18 -1
  120. package/dist/ir/nodes.d.cts +168 -0
  121. package/dist/ir/nodes.d.ts +6 -6
  122. package/dist/lower/compile-template.cjs +1356 -1
  123. package/dist/lower/compile-template.d.cts +69 -0
  124. package/dist/lower/compile-template.d.ts +3 -3
  125. package/dist/lower/compile-template.js +1 -1
  126. package/dist/lower/compile-template.mjs +1336 -1
  127. package/dist/lower/jsx.cjs +529 -1
  128. package/dist/lower/jsx.d.cts +25 -0
  129. package/dist/lower/jsx.d.ts +1 -1
  130. package/dist/lower/jsx.d.ts.map +1 -1
  131. package/dist/lower/jsx.js +6 -5
  132. package/dist/lower/jsx.mjs +506 -1
  133. package/dist/lower/template.cjs +1061 -1
  134. package/dist/lower/template.d.cts +53 -0
  135. package/dist/lower/template.d.ts +3 -3
  136. package/dist/lower/template.d.ts.map +1 -1
  137. package/dist/lower/template.js +12 -11
  138. package/dist/lower/template.mjs +1042 -1
  139. package/dist/lower/text.cjs +42 -1
  140. package/dist/lower/text.d.cts +10 -0
  141. package/dist/lower/text.d.ts +2 -2
  142. package/dist/lower/text.d.ts.map +1 -1
  143. package/dist/lower/text.js +2 -2
  144. package/dist/lower/text.mjs +21 -1
  145. package/dist/optimize/analyze-static.cjs +112 -1
  146. package/dist/optimize/analyze-static.d.cts +39 -0
  147. package/dist/optimize/analyze-static.d.ts +2 -2
  148. package/dist/optimize/analyze-static.js +2 -2
  149. package/dist/optimize/analyze-static.mjs +91 -1
  150. package/dist/optimize/collapse-strategies.cjs +90 -1
  151. package/dist/optimize/collapse-strategies.d.cts +30 -0
  152. package/dist/optimize/collapse-strategies.d.ts +3 -3
  153. package/dist/optimize/collapse-strategies.mjs +67 -1
  154. package/dist/options.cjs +33 -1
  155. package/dist/options.d.cts +39 -0
  156. package/dist/options.d.ts +2 -2
  157. package/dist/options.mjs +12 -1
  158. package/dist/resolve/builtins.cjs +73 -1
  159. package/dist/resolve/builtins.d.cts +68 -0
  160. package/dist/resolve/builtins.d.ts +8 -8
  161. package/dist/resolve/builtins.d.ts.map +1 -1
  162. package/dist/resolve/builtins.js +4 -4
  163. package/dist/resolve/builtins.mjs +53 -1
  164. package/dist/resolve/component-globals.cjs +234 -14
  165. package/dist/resolve/component-globals.d.cts +80 -0
  166. package/dist/resolve/component-globals.d.ts +5 -5
  167. package/dist/resolve/component-globals.js +10 -10
  168. package/dist/resolve/component-globals.mjs +211 -14
  169. package/dist/resolve/component-resolver.cjs +80 -1
  170. package/dist/resolve/component-resolver.d.cts +68 -0
  171. package/dist/resolve/component-resolver.d.ts +3 -3
  172. package/dist/resolve/component-resolver.d.ts.map +1 -1
  173. package/dist/resolve/component-resolver.js +3 -3
  174. package/dist/resolve/component-resolver.mjs +59 -1
  175. package/dist/resolve/load-directive.cjs +93 -1
  176. package/dist/resolve/load-directive.d.cts +53 -0
  177. package/dist/resolve/load-directive.d.ts +5 -5
  178. package/dist/resolve/load-directive.js +6 -6
  179. package/dist/resolve/load-directive.mjs +72 -1
  180. package/dist/resolve/resolve-ir.cjs +108 -1
  181. package/dist/resolve/resolve-ir.d.cts +53 -0
  182. package/dist/resolve/resolve-ir.d.ts +6 -6
  183. package/dist/resolve/resolve-ir.d.ts.map +1 -1
  184. package/dist/resolve/resolve-ir.js +1 -1
  185. package/dist/resolve/resolve-ir.mjs +85 -1
  186. package/dist/resolve/write-globals.cjs +319 -14
  187. package/dist/resolve/write-globals.d.cts +30 -0
  188. package/dist/resolve/write-globals.js +2 -2
  189. package/dist/resolve/write-globals.mjs +298 -14
  190. package/dist/server-fns-ZYWQTSZU.mjs +78 -0
  191. package/dist/server-functions-PCERFA7A.mjs +82 -0
  192. package/dist/transform/bindings.cjs +71 -1
  193. package/dist/transform/bindings.d.cts +16 -0
  194. package/dist/transform/bindings.d.ts +1 -1
  195. package/dist/transform/bindings.js +1 -1
  196. package/dist/transform/bindings.mjs +50 -1
  197. package/dist/transform/index.cjs +2732 -8
  198. package/dist/transform/index.d.cts +15 -0
  199. package/dist/transform/index.mjs +3773 -17
  200. package/dist/transform/intrinsics.cjs +216 -3
  201. package/dist/transform/intrinsics.d.cts +21 -0
  202. package/dist/transform/intrinsics.js +1 -1
  203. package/dist/transform/intrinsics.mjs +193 -3
  204. package/dist/transform/props.cjs +441 -3
  205. package/dist/transform/props.d.cts +45 -0
  206. package/dist/transform/props.d.ts +1 -1
  207. package/dist/transform/props.d.ts.map +1 -1
  208. package/dist/transform/props.js +4 -4
  209. package/dist/transform/props.mjs +1482 -12
  210. package/dist/transform/server-fn-id.cjs +35 -1
  211. package/dist/transform/server-fn-id.d.cts +9 -0
  212. package/dist/transform/server-fn-id.d.ts +1 -1
  213. package/dist/transform/server-fn-id.js +2 -2
  214. package/dist/transform/server-fn-id.mjs +14 -1
  215. package/dist/transform/server-fns.cjs +114 -2
  216. package/dist/transform/server-fns.d.cts +12 -0
  217. package/dist/transform/server-fns.js +3 -3
  218. package/dist/transform/server-fns.mjs +1155 -11
  219. package/dist/transform/source-locations.cjs +330 -1
  220. package/dist/transform/source-locations.d.cts +43 -0
  221. package/dist/transform/source-locations.d.ts +1 -1
  222. package/dist/transform/source-locations.js +5 -5
  223. package/dist/transform/source-locations.mjs +307 -1
  224. package/dist/transform/templates.cjs +2701 -7
  225. package/dist/transform/templates.d.cts +69 -0
  226. package/dist/transform/templates.d.ts +2 -2
  227. package/dist/transform/templates.d.ts.map +1 -1
  228. package/dist/transform/templates.js +7 -7
  229. package/dist/transform/templates.mjs +3743 -16
  230. package/dist/transform-RWDTQUF5.mjs +893 -0
  231. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  232. package/package.json +6 -5
  233. package/dist/babel-VXKH6MRQ.mjs +0 -1
  234. package/dist/chunk-3SAEGOMQ.mjs +0 -1
  235. package/dist/chunk-5KMMN5QP.mjs +0 -1
  236. package/dist/chunk-IBRM4W7I.mjs +0 -10
  237. package/dist/chunk-OHHZCYIQ.mjs +0 -1
  238. package/dist/chunk-YKZ54NVE.mjs +0 -1
  239. package/dist/server-fns-6QM243HC.mjs +0 -2
  240. package/dist/server-functions-E3LKCZ4R.mjs +0 -1
  241. package/dist/transform-C4ZXRVGP.mjs +0 -8
@@ -1 +1,307 @@
1
- var u="@fluixi/reactive/signal",d={$signal:{export:"signal",module:u,returns:"signal-handle"},$memo:{export:"memo",module:u,returns:"memo-handle"},$effect:{export:"effect",module:u,returns:"effect"},$store:{export:"store",module:"@fluixi/reactive/store",returns:"store-handle"},$resource:{export:"resource",module:u,returns:"resource-handle"},$selector:{export:"createSelector",module:u,returns:"memo-accessor"},$deferred:{export:"createDeferred",module:u,returns:"memo-accessor"},$untrack:{export:"untrack",module:u,returns:"plain"},$untrackStore:{export:"untrackStore",module:"@fluixi/reactive/store",returns:"plain"}},D={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"},F=["@fluixi/reactive","@fluixi/reactive/signal","@fluixi/reactive/store","@fluixi/core"],z=new RegExp(`\\$(?:${Object.keys(d).map(e=>e.slice(1)).join("|")})\\s*\\(`);function M(e){return Object.prototype.hasOwnProperty.call(d,e)}function _(e){return F.includes(e)}function c(e,n){if(e)switch(e.type){case"Identifier":n.add(e.name);return;case"ObjectPattern":for(let r of e.properties??[])r.type==="RestElement"?c(r.argument,n):c(r.value,n);return;case"ArrayPattern":for(let r of e.elements??[])c(r,n);return;case"AssignmentPattern":c(e.left,n);return;case"RestElement":c(e.argument,n);return}}function N(e,n){if(!(!e||typeof e!="object"||typeof e.type!="string")){n(e);for(let r of Object.keys(e)){if(r==="loc"||r==="leadingComments"||r==="trailingComments")continue;let t=e[r];if(Array.isArray(t))for(let i of t)N(i,n);else t&&typeof t=="object"&&N(t,n)}}}function j(e,n){if(e.type!=="CallExpression")return;let r=e.callee;if(r?.type!=="Identifier")return;let t=r.name,i=n.primitives.get(t);if(i)return i;let o=d[t];if(o&&!n.shadowed.has(t))return o.returns}function V(e,n,r){if(Array.isArray(n)){e.type==="ArrayPattern"&&e.elements.forEach((t,i)=>{let o=n[i];t?.type==="Identifier"&&o&&r.set(t.name,o)});return}e.type==="Identifier"&&r.set(e.name,n)}function A(e){let n={kinds:new Map,primitives:new Map,shadowed:new Set},r=e;N(r,t=>{let i=new Set;if(t.type==="VariableDeclarator")c(t.id,i);else if(t.type==="FunctionDeclaration"||t.type==="ClassDeclaration")c(t.id,i);else if(t.type==="ImportDefaultSpecifier"||t.type==="ImportNamespaceSpecifier")c(t.local,i);else if(t.type==="ImportSpecifier")c(t.local,i);else if(t.type==="FunctionExpression"||t.type==="ArrowFunctionExpression"||t.type==="FunctionDeclaration")for(let o of t.params??[])c(o,i);for(let o of i)d[o]&&n.shadowed.add(o)});for(let t of r.body??[])if(t.type==="ImportDeclaration"&&_(t.source?.value))for(let i of t.specifiers??[]){if(i.type!=="ImportSpecifier")continue;let o=i.imported,l=o.type==="Identifier"?o.name:o.value,a=D[l];a&&n.primitives.set(i.local.name,a)}return N(r,t=>{if(t.type!=="VariableDeclarator"||!t.init)return;let i=j(t.init,n);i&&V(t.id,i,n.kinds)}),n}var K="__fx_source",L="__fx_component",B="__fx_hole",te=(e,n,r,t)=>`(globalThis.${B} ?? ((f) => f))(${e},${n},${r}${t===void 0?"":`,${JSON.stringify(t)}`})`,U="__fx_props",ne=(e,n)=>`(globalThis.${U} ?? ((p) => p))(${e},${JSON.stringify(n)})`,C=new Set(["signal","memo","effect","store","resource","watch","createSignal","createMemo","createEffect","createStore","createResource"]);function re(e){for(let n of C)if(e.includes(n))return!0;return e.includes("$signal")||e.includes("$memo")||e.includes("$effect")||e.includes("$store")}var J=new Set(["IfStatement","ForStatement","ForInStatement","ForOfStatement","WhileStatement","DoWhileStatement","LabeledStatement","WithStatement"]);function H(e,n){return!n||e.type==="BlockStatement"?!1:J.has(n.type)}function T(e){return e.type==="ExportNamedDeclaration"||e.type==="ExportDefaultDeclaration"}function W(e){return e.type.endsWith("Statement")||e.type==="VariableDeclaration"}function h(e,n,r=[]){if(!(!e||typeof e.type!="string")){n(e,r),r.push(e);for(let t of Object.keys(e)){if(t==="loc"||t==="parent")continue;let i=e[t];if(Array.isArray(i))for(let o of i)h(o,n,r);else i&&typeof i.type=="string"&&h(i,n,r)}r.pop()}}function G(e){let n=e[e.length-1];if(n?.type!=="VariableDeclarator")return;let r=n.id;if(r?.type==="Identifier")return r.name;if(r?.type==="ArrayPattern"){let t=r.elements?.[0];if(t?.type==="Identifier")return t.name}}function q(e){if(e.type==="FunctionDeclaration"){let n=e.id?.name;return n&&n[0]===n[0]?.toUpperCase()?n:void 0}if(e.type==="VariableDeclarator"){let n=e.id,r=e.init;if(n?.type!=="Identifier"||!r||r.type!=="ArrowFunctionExpression"&&r.type!=="FunctionExpression")return;let t=n.name;return t[0]===t[0]?.toUpperCase()?t:void 0}}function ie(e,n){let r=[],t=new Set,{primitives:i,shadowed:o}=A(e);return h(e,(l,a)=>{let E=q(l);if(E){let s=l.loc?.start,I=l.end;for(let R=a.length-1;R>=0;R--){let g=a[R];if(g.type!=="VariableDeclaration"&&g.type!=="ExportNamedDeclaration"&&g.type!=="ExportDefaultDeclaration")break;I=g.end}s&&r.push({start:I,end:I,code:`;globalThis.${L}?.(${JSON.stringify(E)},${JSON.stringify(n)},${s.line},${s.column});`})}if(l.type!=="CallExpression")return;let b=l.callee;if(b?.type!=="Identifier")return;let p=b.name,O=M(p)&&!o.has(p)?d[p]:void 0,P=i.has(p)||C.has(p);if(!O&&!P)return;let y=l.loc?.start;if(!y)return;let m,S,v=-1;for(let s=a.length-1;s>=0;s--)if(W(a[s])||T(a[s])){m=a[s],S=a[s-1],v=s;break}if(!m)return;let f=m.start,x=m.end;for(let s=v-1;s>=0&&T(a[s]);s--)f=a[s].start,x=a[s].end,S=a[s-1];if(t.has(f))return;t.add(f);let $=G(a),k=[JSON.stringify(n),String(y.line),String(y.column),$?JSON.stringify($):void 0].filter(s=>s!==void 0).join(","),w=`globalThis.${K}?.(${k});`;if(H(m,S)){r.push({start:f,end:f,code:`{${w}`}),r.push({start:x,end:x,code:"}"});return}r.push({start:f,end:f,code:w})}),{edits:r,marked:r.length}}export{L as COMPONENT_MARKER,B as HOLE_MARKER,U as PROPS_MARKER,K as SOURCE_MARKER,ie as collectSourceEdits,te as markHole,ne as markProps,re as mayHaveReactiveCall};
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
+ };