@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,18 @@
1
- "use strict";var i=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var a=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of s(t))!m.call(e,o)&&o!==r&&i(e,o,{get:()=>t[o],enumerable:!(n=p(t,o))||n.enumerable});return e};var c=e=>a(i({},"__esModule",{value:!0}),e);var g={};module.exports=c(g);
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 __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+
16
+ // src/codegen/backend.ts
17
+ var backend_exports = {};
18
+ module.exports = __toCommonJS(backend_exports);
@@ -0,0 +1,35 @@
1
+ import type { IRNode } from '../ir/nodes.cjs';
2
+ import type { RuntimeContract } from './contract.cjs';
3
+ import type { CompilerOptions } from '../options.cjs';
4
+ export interface CodegenResult {
5
+ code: string;
6
+ map?: unknown;
7
+ /** runtime symbols this output imports (subset of the backend's contract) */
8
+ imports: string[];
9
+ /**
10
+ * Templates to declare once at module scope, so a static subtree is parsed once and
11
+ * cloned per instance rather than rebuilt element by element.
12
+ */
13
+ templates?: StaticTemplate[];
14
+ }
15
+ export interface StaticTemplate {
16
+ /** Identifier to declare, unique within the emitted unit. */
17
+ id: string;
18
+ /** The HTML the template is built from. */
19
+ html: string;
20
+ /** Root tag name, so hydration can match the server's node before adopting it. */
21
+ tag: string;
22
+ svg: boolean;
23
+ }
24
+ /**
25
+ * A codegen backend turns IR into runtime calls. This is the swap point: the
26
+ * imperative backend ships now; a template-clone backend (and hybrids/islands
27
+ * variants) plug in later without touching the front-ends or IR.
28
+ */
29
+ export interface CodegenBackend {
30
+ /** stable id used in CompilerOptions.backend */
31
+ name: string;
32
+ /** the runtime contract this backend emits against */
33
+ contract: RuntimeContract;
34
+ emit(node: IRNode, options: CompilerOptions): CodegenResult;
35
+ }
@@ -1 +1,542 @@
1
- "use strict";var $=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var z=(e,t)=>{for(var n in t)$(e,n,{get:t[n],enumerable:!0})},W=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of K(t))!U.call(e,s)&&s!==n&&$(e,s,{get:()=>t[s],enumerable:!(r=B(t,s))||r.enumerable});return e};var G=e=>W($({},"__esModule",{value:!0}),e);var Ne={};z(Ne,{imperativeBackend:()=>ge,inlineTemplates:()=>de});module.exports=G(Ne);var Y=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),C={className:"class",htmlFor:"for"},Z=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),q=new Set(["script","style","textarea","title"]);function S(e){return q.has(e)}function O(e){return C[e]??e}function d(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!Z.has(e.name)}function x(e){if(!e.static||S(e.tag))return!1;for(let t of e.props)if(!d(t))return!1;for(let t of e.children)if(t.kind!=="text"&&!(t.kind==="element"&&x(t)))return!1;return!0}function g(e){let t=e.props.map(Q).filter(Boolean).join(""),n=`<${e.tag}${t}>`;return Y.has(e.tag)?n:`${n}${e.children.map(X).join("")}</${e.tag}>`}function X(e){if(e.kind==="text")return te(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return g(e)}function Q(e){let t=C[e.name]??e.name,n=e.literal;return n===!0||n===void 0?` ${t}`:n===!1||n===null?"":` ${t}="${ee(String(n))}"`}function ee(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function te(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function I(e){let t=[],n,r=s=>{n??=s.at?.file,t.push(s.at?.line??0,s.at?.column??0);for(let o of s.children)o.kind==="element"&&r(o)};return r(e),n&&t.some(s=>s!==0)?{file:n,pos:t}:void 0}var ne="<!--fx-->",re="<!--fx/-->";function R(e){return e.kind==="expr"||e.kind==="component"||e.kind==="control"}function ie(e){return e.kind==="text"||e.kind==="element"&&P(e)}function P(e){return e.svg||S(e.tag)||!e.props.every(t=>d(t))?!1:e.children.every(t=>ie(t)||R(t))}function y(e){if(R(e))return!0;let t=e.children;return t?t.some(y):!1}function w(e){for(let t=0;t<e.children.length;t++){let n=e.children[t];if(n.kind==="text"&&(n.value===""||e.children[t+1]?.kind==="text"))return!1}return e.children.every(t=>t.kind!=="element"||w(t))}function _(e){if(!P(e)||!w(e)||!e.children.some(y))return null;let t=[],n=[],r=0,s=p=>{let i=`_n$${r++}`;return t.push({ref:i,expr:p}),i};return o(e,"_el$"),{html:se(e),tag:e.tag,steps:t,holes:n};function o(p,i){let f=-1;p.children.forEach((u,a)=>{y(u)&&(f=a)});let l=null;for(let u=0;u<=f;u++){let a=p.children[u],c=l?`${l}.nextSibling`:`${i}.firstChild`;if(R(a)){let T=s(c),k=s(`holeEnd(${T})`);n.push({parentRef:i,startRef:T,endRef:k,node:a}),l=k;continue}let v=s(c);a.kind==="element"&&y(a)&&o(a,v),l=v}}}function se(e){return g(A(e)).split(M).join(ne+re)}function A(e){return{...e,children:e.children.map(t=>R(t)?{kind:"text",value:M}:t.kind==="element"?A(t):t)}}var M="\0fx-hole\0";var E={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},Se={version:2,module:"@fluixi/dom",symbols:[...E.symbols,"template","cloneTemplate","walk"]};var m="@fluixi/reactive/signal",b={$signal:{export:"signal",module:m,returns:"signal-handle"},$memo:{export:"memo",module:m,returns:"memo-handle"},$effect:{export:"effect",module:m,returns:"effect"},$store:{export:"store",module:"@fluixi/reactive/store",returns:"store-handle"},$resource:{export:"resource",module:m,returns:"resource-handle"},$selector:{export:"createSelector",module:m,returns:"memo-accessor"},$deferred:{export:"createDeferred",module:m,returns:"memo-accessor"},$untrack:{export:"untrack",module:m,returns:"plain"},$untrackStore:{export:"untrackStore",module:"@fluixi/reactive/store",returns:"plain"}};var Ie=new RegExp(`\\$(?:${Object.keys(b).map(e=>e.slice(1)).join("|")})\\s*\\(`);var D="__fx_source";var oe="__fx_hole",N=(e,t,n,r)=>`(globalThis.${oe} ?? ((f) => f))(${e},${t},${n}${r===void 0?"":`,${JSON.stringify(r)}`})`,ae="__fx_props",j=(e,t)=>`(globalThis.${ae} ?? ((p) => p))(${e},${JSON.stringify(t)})`;var ce={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function le(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function V(e){return le(e)?e:JSON.stringify(e)}function fe(e){if(e.expr!==void 0){if(e.name==="ref"&&e.at)return N(`(${e.expr})`,e.at.line,e.at.column,e.expr);if(!e.reactive)return`(${e.expr})`;let t=`() => (${e.expr})`;return e.at?N(t,e.at.line,e.at.column,e.directive):t}return JSON.stringify(e.literal??!0)}function ue(e){return e.expr!==void 0?`(${e.expr})`:JSON.stringify(e.literal??!0)}function pe(e,t,n){let r=e.filter(i=>i.kind==="spread"),o=e.filter(i=>i.kind!=="spread").map(i=>`${V(i.name)}: ${fe(i)}`);t!=null&&o.push(`children: ${t}`);let p=`{ ${o.join(", ")} }`;return r.length>0?(n.add("mergeProps"),`mergeProps(${r.map(i=>i.expr).join(", ")}, ${p})`):p}function J(e,t){return t?N(e,t.line,t.column):e}function F(e,t,n){return e.length===1?h(e[0],t,n):`[${e.map(r=>h(r,t,n)).join(", ")}]`}function L(e,t,n,r,s,o){r.add("createMemo"),r.add("createComponent");let p=t.filter(c=>c.kind==="spread"),i=t.filter(c=>c.kind!=="spread"),f=i.map(c=>`get ${V(c.name)}() { return ${ue(c)}; }`);n.length>0&&f.push(`get children() { return ${F(n,r,s)}; }`);let l=`{ ${f.join(", ")} }`;p.length>0&&(r.add("mergeProps"),l=`mergeProps(${p.map(c=>c.expr).join(", ")}, ${l})`);let u={};for(let c of i)c.at&&(u[c.name]=[c.at.line,c.at.column]);return Object.keys(u).length&&(l=j(l,u)),`createMemo((${o?`globalThis.${D}?.(${JSON.stringify(o.file)},${o.line},${o.column},${JSON.stringify(e)}), `:""}() => createComponent(${e}, ${l})))`}function me(e,t){let n=O(t.name),r=t.literal;return r===!0||r===void 0?`${e}.setAttribute(${JSON.stringify(n)}, "");`:r===!1||r===null?"":`${e}.setAttribute(${JSON.stringify(n)}, ${JSON.stringify(String(r))});`}var H=!1;function h(e,t,n){switch(e.kind){case"text":return JSON.stringify(e.value);case"expr":{if(!e.reactive)return`(${e.code})`;let r=`() => (${e.code})`;return e.at?N(r,e.at.line,e.at.column):r}case"fragment":return e.children.length===0?"null":F(e.children,t,n);case"component":return J(L(e.name,e.props,e.children,t,n,e.at),e.bindAt??e.at);case"control":{let r=ce[e.control]??e.control;return t.add(r),J(L(r,e.props,e.children,t,n),e.bindAt)}case"element":{if(n&&e.static&&!e.svg&&x(e)){t.add("templateNode");let i=`_tmpl$${n.length}`;n.push({id:i,html:g(e),tag:e.tag,svg:!1});let f=I(e);return f?`templateNode(${i}, ${JSON.stringify(e.tag)}, false, false, ${JSON.stringify(f)})`:`templateNode(${i}, ${JSON.stringify(e.tag)})`}if(n&&H){let i=_(e);if(i){t.add("templateNode"),t.add("insert"),t.add("holeEnd"),t.add("holeContent"),t.add("holeScope");let f=`_tmpl$${n.length}`;n.push({id:f,html:i.html,tag:i.tag,svg:!1});let l=I(e),u=[`const _el$ = templateNode(${f}, ${JSON.stringify(i.tag)}, true${l?`, false, ${JSON.stringify(l)}`:""});`];for(let a of i.steps)u.push(`const ${a.ref} = ${a.expr};`);for(let a of i.holes)u.push(`insert(${a.parentRef}, holeScope(${a.startRef}, () => (${h(a.node,t,n)})), ${a.endRef}, holeContent(${a.startRef}, ${a.endRef}));`);return u.push("return _el$;"),`(() => { ${u.join(" ")} })()`}}t.add("createNativeElement");let r=JSON.stringify(e.tag),s="_el$",o=[],p=e.at?`${r}, ${e.svg}, ${JSON.stringify(e.at)}`:e.svg?`${r}, true`:r;if(o.push(`const ${s} = createNativeElement(${p});`),e.props.length>0)if(!e.svg&&e.props.every(d))for(let i of e.props)o.push(me(s,i));else{t.add("spread");let i=e.svg?", isSVG: true":"";o.push(`spread({ element: ${s}, props: ${pe(e.props,null,t)}${i} });`)}for(let i of e.children){t.add("insert");let f=h(i,t,n),l=i.kind==="expr"&&i.reactive||i.kind==="component"||i.kind==="control";o.push(l?`insert(${s}, ${f}, null);`:`insert(${s}, ${f});`)}return o.push(`return ${s};`),`(() => { ${o.join(" ")} })()`}}}function de(e,t){if(!t||t.length===0)return e;let n=new Map(t.map(r=>[r.id,JSON.stringify(r.html)]));return e.replace(/_tmpl\$\d+/g,r=>n.get(r)??r)}var ge={name:"imperative",contract:E,emit(e,t){let n=new Set,r=t?.templateClone!==!1?[]:void 0;return H=t?.partialTemplates===!0,{code:h(e,n,r),imports:Array.from(n),templates:r}}};
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/codegen/backends/imperative.ts
21
+ var imperative_exports = {};
22
+ __export(imperative_exports, {
23
+ imperativeBackend: () => imperativeBackend,
24
+ inlineTemplates: () => inlineTemplates
25
+ });
26
+ module.exports = __toCommonJS(imperative_exports);
27
+
28
+ // src/codegen/serialize-static.ts
29
+ var VOID_ELEMENTS = /* @__PURE__ */ new Set([
30
+ "area",
31
+ "base",
32
+ "br",
33
+ "col",
34
+ "embed",
35
+ "hr",
36
+ "img",
37
+ "input",
38
+ "link",
39
+ "meta",
40
+ "param",
41
+ "source",
42
+ "track",
43
+ "wbr"
44
+ ]);
45
+ var HTML_NAME = {
46
+ className: "class",
47
+ htmlFor: "for"
48
+ };
49
+ var PROPERTY_ONLY = /* @__PURE__ */ new Set([
50
+ "innerHTML",
51
+ "outerHTML",
52
+ "innerText",
53
+ "textContent",
54
+ "value",
55
+ "checked",
56
+ "selected",
57
+ "muted",
58
+ "defaultValue",
59
+ "defaultChecked",
60
+ "children",
61
+ "ref"
62
+ ]);
63
+ var RAW_TEXT_ELEMENTS = /* @__PURE__ */ new Set(["script", "style", "textarea", "title"]);
64
+ function isRawTextElement(tag) {
65
+ return RAW_TEXT_ELEMENTS.has(tag);
66
+ }
67
+ function htmlAttrName(name) {
68
+ return HTML_NAME[name] ?? name;
69
+ }
70
+ function isPlainLiteralAttr(prop) {
71
+ if (prop.kind !== "attr") return false;
72
+ if (prop.expr !== void 0) return false;
73
+ if (prop.name.includes(":")) return false;
74
+ return !PROPERTY_ONLY.has(prop.name);
75
+ }
76
+ function isSerializable(node) {
77
+ if (!node.static) return false;
78
+ if (isRawTextElement(node.tag)) return false;
79
+ for (const prop of node.props) {
80
+ if (!isPlainLiteralAttr(prop)) return false;
81
+ }
82
+ for (const child of node.children) {
83
+ if (child.kind === "text") continue;
84
+ if (child.kind === "element" && isSerializable(child)) continue;
85
+ return false;
86
+ }
87
+ return true;
88
+ }
89
+ function serializeStatic(node) {
90
+ const attrs = node.props.map(serializeProp).filter(Boolean).join("");
91
+ const open = `<${node.tag}${attrs}>`;
92
+ if (VOID_ELEMENTS.has(node.tag)) return open;
93
+ return `${open}${node.children.map(serializeChild).join("")}</${node.tag}>`;
94
+ }
95
+ function serializeChild(child) {
96
+ if (child.kind === "text") return escapeText(child.value);
97
+ if (child.kind !== "element") throw new Error(`serializeStatic: unexpected ${child.kind}`);
98
+ return serializeStatic(child);
99
+ }
100
+ function serializeProp(prop) {
101
+ const name = HTML_NAME[prop.name] ?? prop.name;
102
+ const value = prop.literal;
103
+ if (value === true || value === void 0) return ` ${name}`;
104
+ if (value === false || value === null) return "";
105
+ return ` ${name}="${escapeAttr(String(value))}"`;
106
+ }
107
+ function escapeAttr(value) {
108
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
109
+ }
110
+ function escapeText(value) {
111
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
112
+ }
113
+ function templatePositions(root) {
114
+ const pos = [];
115
+ let file;
116
+ const walk = (el) => {
117
+ file ??= el.at?.file;
118
+ pos.push(el.at?.line ?? 0, el.at?.column ?? 0);
119
+ for (const child of el.children) if (child.kind === "element") walk(child);
120
+ };
121
+ walk(root);
122
+ return file && pos.some((n) => n !== 0) ? { file, pos } : void 0;
123
+ }
124
+
125
+ // src/codegen/partial-template.ts
126
+ var HOLE_START = "<!--fx-->";
127
+ var HOLE_END = "<!--fx/-->";
128
+ function isHole(node) {
129
+ return node.kind === "expr" || node.kind === "component" || node.kind === "control";
130
+ }
131
+ function isTemplateChild(node) {
132
+ return node.kind === "text" || node.kind === "element" && isTemplateElement(node);
133
+ }
134
+ function isTemplateElement(node) {
135
+ if (node.svg) return false;
136
+ if (isRawTextElement(node.tag)) return false;
137
+ if (!node.props.every((p) => isPlainLiteralAttr(p))) return false;
138
+ return node.children.every((c) => isTemplateChild(c) || isHole(c));
139
+ }
140
+ function containsHole(node) {
141
+ if (isHole(node)) return true;
142
+ const children = node.children;
143
+ return children ? children.some(containsHole) : false;
144
+ }
145
+ function addressable(el) {
146
+ for (let i = 0; i < el.children.length; i++) {
147
+ const child = el.children[i];
148
+ if (child.kind === "text") {
149
+ if (child.value === "") return false;
150
+ if (el.children[i + 1]?.kind === "text") return false;
151
+ }
152
+ }
153
+ return el.children.every((c) => c.kind !== "element" || addressable(c));
154
+ }
155
+ function planPartialTemplate(root) {
156
+ if (!isTemplateElement(root)) return null;
157
+ if (!addressable(root)) return null;
158
+ if (!root.children.some(containsHole)) return null;
159
+ const steps = [];
160
+ const holes = [];
161
+ let refCount = 0;
162
+ const declare = (expr) => {
163
+ const ref = `_n$${refCount++}`;
164
+ steps.push({ ref, expr });
165
+ return ref;
166
+ };
167
+ walk(root, "_el$");
168
+ return { html: serializeWithMarkers(root), tag: root.tag, steps, holes };
169
+ function walk(el, elementRef) {
170
+ let last = -1;
171
+ el.children.forEach((child, i) => {
172
+ if (containsHole(child)) last = i;
173
+ });
174
+ let previous = null;
175
+ for (let i = 0; i <= last; i++) {
176
+ const child = el.children[i];
177
+ const expr = previous ? `${previous}.nextSibling` : `${elementRef}.firstChild`;
178
+ if (isHole(child)) {
179
+ const startRef = declare(expr);
180
+ const endRef = declare(`holeEnd(${startRef})`);
181
+ holes.push({ parentRef: elementRef, startRef, endRef, node: child });
182
+ previous = endRef;
183
+ continue;
184
+ }
185
+ const ref = declare(expr);
186
+ if (child.kind === "element" && containsHole(child)) walk(child, ref);
187
+ previous = ref;
188
+ }
189
+ }
190
+ }
191
+ function serializeWithMarkers(el) {
192
+ return serializeStatic(withSentinels(el)).split(SENTINEL).join(HOLE_START + HOLE_END);
193
+ }
194
+ function withSentinels(el) {
195
+ return {
196
+ ...el,
197
+ children: el.children.map(
198
+ (child) => isHole(child) ? { kind: "text", value: SENTINEL } : child.kind === "element" ? withSentinels(child) : child
199
+ )
200
+ };
201
+ }
202
+ var SENTINEL = "\0fx-hole\0";
203
+
204
+ // src/codegen/contract.ts
205
+ var RUNTIME_CONTRACT_V1 = {
206
+ version: 1,
207
+ module: "@fluixi/dom",
208
+ symbols: [
209
+ "createNativeElement",
210
+ "insert",
211
+ "spread",
212
+ "setAttribute",
213
+ "delegateEvents",
214
+ "createComponent",
215
+ "createMemo",
216
+ "untrack",
217
+ "Show",
218
+ "For",
219
+ "Index",
220
+ "Switch",
221
+ "Match",
222
+ "Dynamic",
223
+ "ErrorBoundary"
224
+ ]
225
+ };
226
+ var RUNTIME_CONTRACT_V2 = {
227
+ version: 2,
228
+ module: "@fluixi/dom",
229
+ symbols: [...RUNTIME_CONTRACT_V1.symbols, "template", "cloneTemplate", "walk"]
230
+ };
231
+
232
+ // src/analyze/intrinsics.ts
233
+ var REACTIVE_MODULE = "@fluixi/reactive/signal";
234
+ var INTRINSICS = {
235
+ $signal: { export: "signal", module: REACTIVE_MODULE, returns: "signal-handle" },
236
+ $memo: { export: "memo", module: REACTIVE_MODULE, returns: "memo-handle" },
237
+ $effect: { export: "effect", module: REACTIVE_MODULE, returns: "effect" },
238
+ $store: { export: "store", module: "@fluixi/reactive/store", returns: "store-handle" },
239
+ $resource: { export: "resource", module: REACTIVE_MODULE, returns: "resource-handle" },
240
+ // No short runtime form for these yet, so the intrinsic stands for the `create*`
241
+ // name. Still worth having: no import to write, and when a shorter form is
242
+ // designed, the change is this line rather than a compiler pass.
243
+ $selector: { export: "createSelector", module: REACTIVE_MODULE, returns: "memo-accessor" },
244
+ $deferred: { export: "createDeferred", module: REACTIVE_MODULE, returns: "memo-accessor" },
245
+ // Not value constructors, but the compiler has to know them: they change what a read
246
+ // does. `untrack` suppresses dependency collection, which is exactly the kind of thing
247
+ // dependency analysis must not guess at.
248
+ $untrack: { export: "untrack", module: REACTIVE_MODULE, returns: "plain" },
249
+ $untrackStore: { export: "untrackStore", module: "@fluixi/reactive/store", returns: "plain" }
250
+ };
251
+ var INTRINSIC_CALL = new RegExp(`\\$(?:${Object.keys(INTRINSICS).map((n) => n.slice(1)).join("|")})\\s*\\(`);
252
+
253
+ // src/transform/source-locations.ts
254
+ var SOURCE_MARKER = "__fx_source";
255
+ var HOLE_MARKER = "__fx_hole";
256
+ var markHole = (accessor, line, column, name) => `(globalThis.${HOLE_MARKER} ?? ((f) => f))(${accessor},${line},${column}${name === void 0 ? "" : `,${JSON.stringify(name)}`})`;
257
+ var PROPS_MARKER = "__fx_props";
258
+ var markProps = (object, at) => `(globalThis.${PROPS_MARKER} ?? ((p) => p))(${object},${JSON.stringify(at)})`;
259
+
260
+ // src/analyze/paren.ts
261
+ function skipQuoted(src, start) {
262
+ const quote = src[start];
263
+ for (let i = start + 1; i < src.length; i++) {
264
+ const c = src[i];
265
+ if (c === "\\") i++;
266
+ else if (c === quote) return i + 1;
267
+ else if (c === "\n") return -1;
268
+ }
269
+ return -1;
270
+ }
271
+ function skipTemplate(src, start) {
272
+ let i = start + 1;
273
+ while (i < src.length) {
274
+ const c = src[i];
275
+ if (c === "\\") {
276
+ i += 2;
277
+ } else if (c === "`") {
278
+ return i + 1;
279
+ } else if (c === "$" && src[i + 1] === "{") {
280
+ let depth = 1;
281
+ i += 2;
282
+ while (i < src.length && depth > 0) {
283
+ const k = src[i];
284
+ if (k === "\\") i += 2;
285
+ else if (k === "`") {
286
+ const end = skipTemplate(src, i);
287
+ if (end < 0) return -1;
288
+ i = end;
289
+ } else if (k === '"' || k === "'") {
290
+ const end = skipQuoted(src, i);
291
+ if (end < 0) return -1;
292
+ i = end;
293
+ } else {
294
+ if (k === "{") depth++;
295
+ else if (k === "}") depth--;
296
+ i++;
297
+ }
298
+ }
299
+ } else {
300
+ i++;
301
+ }
302
+ }
303
+ return -1;
304
+ }
305
+ function skipRegex(src, start) {
306
+ let inClass = false;
307
+ for (let i = start + 1; i < src.length; i++) {
308
+ const c = src[i];
309
+ if (c === "\\") i++;
310
+ else if (c === "[") inClass = true;
311
+ else if (c === "]") inClass = false;
312
+ else if (c === "\n") return -1;
313
+ else if (c === "/" && !inClass) {
314
+ let end = i + 1;
315
+ while (end < src.length && /[a-z]/i.test(src[end])) end++;
316
+ return end;
317
+ }
318
+ }
319
+ return -1;
320
+ }
321
+ function divides(prev) {
322
+ return prev !== "" && /[A-Za-z0-9_$)\]]/.test(prev);
323
+ }
324
+ function topLevelComma(src) {
325
+ let depth = 0;
326
+ let prev = "";
327
+ let i = 0;
328
+ while (i < src.length) {
329
+ const c = src[i];
330
+ if (c === '"' || c === "'") {
331
+ const end = skipQuoted(src, i);
332
+ if (end < 0) return null;
333
+ i = end;
334
+ prev = c;
335
+ } else if (c === "`") {
336
+ const end = skipTemplate(src, i);
337
+ if (end < 0) return null;
338
+ i = end;
339
+ prev = c;
340
+ } else if (c === "/" && src[i + 1] === "/") {
341
+ return null;
342
+ } else if (c === "/" && src[i + 1] === "*") {
343
+ const end = src.indexOf("*/", i + 2);
344
+ if (end < 0) return null;
345
+ i = end + 2;
346
+ } else if (c === "/" && !divides(prev)) {
347
+ const end = skipRegex(src, i);
348
+ if (end < 0) return null;
349
+ i = end;
350
+ prev = "/";
351
+ } else {
352
+ if (c === "(" || c === "[" || c === "{") depth++;
353
+ else if (c === ")" || c === "]" || c === "}") {
354
+ depth--;
355
+ if (depth < 0) return null;
356
+ } else if (c === "," && depth === 0) return true;
357
+ if (!/\s/.test(c)) prev = c;
358
+ i++;
359
+ }
360
+ }
361
+ return depth === 0 ? false : null;
362
+ }
363
+ function paren(code, position) {
364
+ const src = code.trim();
365
+ if (src === "") return `(${code})`;
366
+ if (position === "arrowBody" && src[0] === "{") return `(${code})`;
367
+ return topLevelComma(src) === false ? code : `(${code})`;
368
+ }
369
+
370
+ // src/codegen/backends/imperative.ts
371
+ var CONTROL_COMPONENT = {
372
+ show: "Show",
373
+ for: "For",
374
+ index: "Index",
375
+ switch: "Switch",
376
+ match: "Match",
377
+ dynamic: "Dynamic",
378
+ errorBoundary: "ErrorBoundary",
379
+ suspense: "Suspense"
380
+ };
381
+ function isIdent(name) {
382
+ return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name);
383
+ }
384
+ function propKey(name) {
385
+ return isIdent(name) ? name : JSON.stringify(name);
386
+ }
387
+ function propValue(p) {
388
+ if (p.expr !== void 0) {
389
+ if (p.name === "ref" && p.at)
390
+ return markHole(paren(p.expr, "value"), p.at.line, p.at.column, p.expr);
391
+ if (!p.reactive) return paren(p.expr, "value");
392
+ const accessor = `() => ${paren(p.expr, "arrowBody")}`;
393
+ return p.at ? markHole(accessor, p.at.line, p.at.column, p.directive) : accessor;
394
+ }
395
+ return JSON.stringify(p.literal ?? true);
396
+ }
397
+ function componentPropValue(p) {
398
+ if (p.expr !== void 0) return paren(p.expr, "value");
399
+ return JSON.stringify(p.literal ?? true);
400
+ }
401
+ function emitProps(props, childrenExpr, used) {
402
+ const spreads = props.filter((p) => p.kind === "spread");
403
+ const normal = props.filter((p) => p.kind !== "spread");
404
+ const entries = normal.map((p) => `${propKey(p.name)}: ${propValue(p)}`);
405
+ if (childrenExpr != null) entries.push(`children: ${childrenExpr}`);
406
+ const obj = `{ ${entries.join(", ")} }`;
407
+ if (spreads.length > 0) {
408
+ used.add("mergeProps");
409
+ return `mergeProps(${spreads.map((s) => s.expr).join(", ")}, ${obj})`;
410
+ }
411
+ return obj;
412
+ }
413
+ function markBind(code, at) {
414
+ return at ? markHole(code, at.line, at.column) : code;
415
+ }
416
+ function emitChildren(children, used, templates) {
417
+ if (children.length === 1) return emitNode(children[0], used, templates);
418
+ return `[${children.map((c) => emitNode(c, used, templates)).join(", ")}]`;
419
+ }
420
+ function emitComponent(name, props, children, used, templates, at) {
421
+ used.add("createMemo");
422
+ used.add("createComponent");
423
+ const spreads = props.filter((p) => p.kind === "spread");
424
+ const normal = props.filter((p) => p.kind !== "spread");
425
+ const entries = normal.map(
426
+ (p) => `get ${propKey(p.name)}() { return ${componentPropValue(p)}; }`
427
+ );
428
+ if (children.length > 0) {
429
+ entries.push(`get children() { return ${emitChildren(children, used, templates)}; }`);
430
+ }
431
+ let obj = `{ ${entries.join(", ")} }`;
432
+ if (spreads.length > 0) {
433
+ used.add("mergeProps");
434
+ obj = `mergeProps(${spreads.map((s) => s.expr).join(", ")}, ${obj})`;
435
+ }
436
+ const propAt = {};
437
+ for (const p of normal) if (p.at) propAt[p.name] = [p.at.line, p.at.column];
438
+ if (Object.keys(propAt).length) obj = markProps(obj, propAt);
439
+ const mark = at ? `globalThis.${SOURCE_MARKER}?.(${JSON.stringify(at.file)},${at.line},${at.column},${JSON.stringify(name)}), ` : "";
440
+ return `createMemo(${paren(`${mark}() => createComponent(${name}, ${obj})`, "value")})`;
441
+ }
442
+ function staticAttrAssignment(el, prop) {
443
+ const name = htmlAttrName(prop.name);
444
+ const value = prop.literal;
445
+ if (value === true || value === void 0) return `${el}.setAttribute(${JSON.stringify(name)}, "");`;
446
+ if (value === false || value === null) return "";
447
+ return `${el}.setAttribute(${JSON.stringify(name)}, ${JSON.stringify(String(value))});`;
448
+ }
449
+ var partial = false;
450
+ function emitNode(node, used, templates) {
451
+ switch (node.kind) {
452
+ case "text":
453
+ return JSON.stringify(node.value);
454
+ case "expr": {
455
+ if (!node.reactive) return paren(node.code, "value");
456
+ const accessor = `() => ${paren(node.code, "arrowBody")}`;
457
+ return node.at ? markHole(accessor, node.at.line, node.at.column) : accessor;
458
+ }
459
+ case "fragment":
460
+ if (node.children.length === 0) return "null";
461
+ return emitChildren(node.children, used, templates);
462
+ case "component":
463
+ return markBind(emitComponent(node.name, node.props, node.children, used, templates, node.at), node.bindAt ?? node.at);
464
+ case "control": {
465
+ const name = CONTROL_COMPONENT[node.control] ?? node.control;
466
+ used.add(name);
467
+ return markBind(emitComponent(name, node.props, node.children, used, templates), node.bindAt);
468
+ }
469
+ case "element": {
470
+ if (templates && node.static && !node.svg && isSerializable(node)) {
471
+ used.add("templateNode");
472
+ const id = `_tmpl$${templates.length}`;
473
+ templates.push({ id, html: serializeStatic(node), tag: node.tag, svg: false });
474
+ const at = templatePositions(node);
475
+ return at ? `templateNode(${id}, ${JSON.stringify(node.tag)}, false, false, ${JSON.stringify(at)})` : `templateNode(${id}, ${JSON.stringify(node.tag)})`;
476
+ }
477
+ if (templates && partial) {
478
+ const plan = planPartialTemplate(node);
479
+ if (plan) {
480
+ used.add("templateNode");
481
+ used.add("insert");
482
+ used.add("holeEnd");
483
+ used.add("holeContent");
484
+ used.add("holeScope");
485
+ const id = `_tmpl$${templates.length}`;
486
+ templates.push({ id, html: plan.html, tag: plan.tag, svg: false });
487
+ const at = templatePositions(node);
488
+ const lines = [
489
+ `const _el$ = templateNode(${id}, ${JSON.stringify(plan.tag)}, true${at ? `, false, ${JSON.stringify(at)}` : ""});`
490
+ ];
491
+ for (const step of plan.steps) lines.push(`const ${step.ref} = ${step.expr};`);
492
+ for (const hole of plan.holes) {
493
+ lines.push(
494
+ `insert(${hole.parentRef}, holeScope(${hole.startRef}, () => ${paren(emitNode(hole.node, used, templates), "arrowBody")}), ${hole.endRef}, holeContent(${hole.startRef}, ${hole.endRef}));`
495
+ );
496
+ }
497
+ lines.push("return _el$;");
498
+ return `(() => { ${lines.join(" ")} })()`;
499
+ }
500
+ }
501
+ used.add("createNativeElement");
502
+ const tag = JSON.stringify(node.tag);
503
+ const el = "_el$";
504
+ const parts = [];
505
+ const createArgs = node.at ? `${tag}, ${node.svg}, ${JSON.stringify(node.at)}` : node.svg ? `${tag}, true` : tag;
506
+ parts.push(`const ${el} = createNativeElement(${createArgs});`);
507
+ if (node.props.length > 0) {
508
+ if (!node.svg && node.props.every(isPlainLiteralAttr)) {
509
+ for (const p of node.props) parts.push(staticAttrAssignment(el, p));
510
+ } else {
511
+ used.add("spread");
512
+ const svgFlag = node.svg ? ", isSVG: true" : "";
513
+ parts.push(`spread({ element: ${el}, props: ${emitProps(node.props, null, used)}${svgFlag} });`);
514
+ }
515
+ }
516
+ for (const child of node.children) {
517
+ used.add("insert");
518
+ const childCode = emitNode(child, used, templates);
519
+ const isFn = child.kind === "expr" && child.reactive || child.kind === "component" || child.kind === "control";
520
+ parts.push(isFn ? `insert(${el}, ${childCode}, null);` : `insert(${el}, ${childCode});`);
521
+ }
522
+ parts.push(`return ${el};`);
523
+ return `(() => { ${parts.join(" ")} })()`;
524
+ }
525
+ }
526
+ }
527
+ function inlineTemplates(code, templates) {
528
+ if (!templates || templates.length === 0) return code;
529
+ const byId = new Map(templates.map((t) => [t.id, JSON.stringify(t.html)]));
530
+ return code.replace(/_tmpl\$\d+/g, (id) => byId.get(id) ?? id);
531
+ }
532
+ var imperativeBackend = {
533
+ name: "imperative",
534
+ contract: RUNTIME_CONTRACT_V1,
535
+ emit(node, options) {
536
+ const used = /* @__PURE__ */ new Set();
537
+ const templates = options?.templateClone !== false ? [] : void 0;
538
+ partial = options?.partialTemplates === true;
539
+ const code = emitNode(node, used, templates);
540
+ return { code, imports: Array.from(used), templates };
541
+ }
542
+ };
@@ -0,0 +1,11 @@
1
+ import type { CodegenBackend, StaticTemplate } from '../backend.cjs';
2
+ /**
3
+ * Substitute template declarations into the code as inline `createTemplate` calls.
4
+ *
5
+ * For hosts that cannot hoist: nested JSX lowered inside an expression, where there is
6
+ * no module scope to reach. `createTemplate` caches by HTML string, so this costs a Map
7
+ * lookup per instantiation rather than a re-parse, and is still far cheaper than
8
+ * building the subtree element by element.
9
+ */
10
+ export declare function inlineTemplates(code: string, templates: StaticTemplate[] | undefined): string;
11
+ export declare const imperativeBackend: CodegenBackend;
@@ -2,7 +2,7 @@ import type { CodegenBackend, StaticTemplate } from '../backend.js';
2
2
  /**
3
3
  * Substitute template declarations into the code as inline `createTemplate` calls.
4
4
  *
5
- * For hosts that cannot hoist nested JSX lowered inside an expression, where there is
5
+ * For hosts that cannot hoist: nested JSX lowered inside an expression, where there is
6
6
  * no module scope to reach. `createTemplate` caches by HTML string, so this costs a Map
7
7
  * lookup per instantiation rather than a re-parse, and is still far cheaper than
8
8
  * building the subtree element by element.
@@ -1 +1 @@
1
- {"version":3,"file":"imperative.d.ts","sourceRoot":"","sources":["../../../src/codegen/backends/imperative.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,cAAc,EAAE,MAAM,eAAe,CAAC;AAwTnF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,SAAS,GAAG,MAAM,CAK7F;AAED,eAAO,MAAM,iBAAiB,EAAE,cAgB/B,CAAC"}
1
+ {"version":3,"file":"imperative.d.ts","sourceRoot":"","sources":["../../../src/codegen/backends/imperative.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,cAAc,EAAE,MAAM,eAAe,CAAC;AA8TnF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,SAAS,GAAG,MAAM,CAK7F;AAED,eAAO,MAAM,iBAAiB,EAAE,cAgB/B,CAAC"}