@fluixi/compiler 1.0.0-alpha.69 → 1.0.0-alpha.71

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 (94) hide show
  1. package/dist/babel-DFIRSRWC.mjs +2 -0
  2. package/dist/chunk-EF6V4GTD.mjs +1 -0
  3. package/dist/codegen/backend.cjs +1 -1
  4. package/dist/codegen/backend.d.ts +14 -0
  5. package/dist/codegen/backend.d.ts.map +1 -1
  6. package/dist/codegen/backends/imperative.cjs +1 -1
  7. package/dist/codegen/backends/imperative.d.ts +10 -1
  8. package/dist/codegen/backends/imperative.d.ts.map +1 -1
  9. package/dist/codegen/backends/imperative.js +127 -16
  10. package/dist/codegen/backends/imperative.mjs +1 -1
  11. package/dist/codegen/partial-template.cjs +1 -0
  12. package/dist/codegen/partial-template.d.ts +62 -0
  13. package/dist/codegen/partial-template.d.ts.map +1 -0
  14. package/dist/codegen/partial-template.js +0 -0
  15. package/dist/codegen/partial-template.mjs +1 -0
  16. package/dist/codegen/serialize-static.cjs +1 -0
  17. package/dist/codegen/serialize-static.d.ts +23 -0
  18. package/dist/codegen/serialize-static.d.ts.map +1 -0
  19. package/dist/codegen/serialize-static.js +140 -0
  20. package/dist/codegen/serialize-static.mjs +1 -0
  21. package/dist/frontend/babel/build-ir-lit.cjs +1 -1
  22. package/dist/frontend/babel/build-ir-lit.d.ts.map +1 -1
  23. package/dist/frontend/babel/build-ir-lit.js +5 -1
  24. package/dist/frontend/babel/build-ir-lit.mjs +1 -1
  25. package/dist/frontend/babel/build-ir.cjs +1 -1
  26. package/dist/frontend/babel/build-ir.d.ts.map +1 -1
  27. package/dist/frontend/babel/build-ir.js +36 -8
  28. package/dist/frontend/babel/build-ir.mjs +1 -1
  29. package/dist/frontend/babel/index.cjs +2 -2
  30. package/dist/frontend/babel/index.mjs +2 -2
  31. package/dist/frontend/babel/lower-template.cjs +1 -1
  32. package/dist/frontend/babel/lower-template.d.ts.map +1 -1
  33. package/dist/frontend/babel/lower-template.js +34 -5
  34. package/dist/frontend/babel/lower-template.mjs +1 -1
  35. package/dist/frontend/babel/plugin.cjs +2 -2
  36. package/dist/frontend/babel/plugin.d.ts +4 -0
  37. package/dist/frontend/babel/plugin.d.ts.map +1 -1
  38. package/dist/frontend/babel/plugin.js +276 -50
  39. package/dist/frontend/babel/plugin.mjs +2 -2
  40. package/dist/index.cjs +22 -1
  41. package/dist/index.d.ts +4 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +4 -0
  44. package/dist/index.mjs +22 -1
  45. package/dist/integrations.cjs +29 -8
  46. package/dist/integrations.d.ts +22 -0
  47. package/dist/integrations.d.ts.map +1 -1
  48. package/dist/integrations.js +14 -0
  49. package/dist/integrations.mjs +26 -5
  50. package/dist/ir/nodes.cjs +1 -1
  51. package/dist/ir/nodes.d.ts +43 -0
  52. package/dist/ir/nodes.d.ts.map +1 -1
  53. package/dist/optimize/analyze-static.cjs +1 -0
  54. package/dist/optimize/analyze-static.d.ts +40 -0
  55. package/dist/optimize/analyze-static.d.ts.map +1 -0
  56. package/dist/optimize/analyze-static.js +131 -0
  57. package/dist/optimize/analyze-static.mjs +1 -0
  58. package/dist/optimize/collapse-strategies.cjs +1 -0
  59. package/dist/optimize/collapse-strategies.d.ts +31 -0
  60. package/dist/optimize/collapse-strategies.d.ts.map +1 -0
  61. package/dist/optimize/collapse-strategies.js +33 -0
  62. package/dist/optimize/collapse-strategies.mjs +1 -0
  63. package/dist/options.cjs +1 -1
  64. package/dist/options.d.ts +18 -0
  65. package/dist/options.d.ts.map +1 -1
  66. package/dist/resolve/builtins.cjs +1 -0
  67. package/dist/resolve/builtins.d.ts +69 -0
  68. package/dist/resolve/builtins.d.ts.map +1 -0
  69. package/dist/resolve/builtins.js +64 -0
  70. package/dist/resolve/builtins.mjs +1 -0
  71. package/dist/resolve/component-globals.cjs +22 -0
  72. package/dist/resolve/component-globals.d.ts +73 -0
  73. package/dist/resolve/component-globals.d.ts.map +1 -0
  74. package/dist/resolve/component-globals.js +137 -0
  75. package/dist/resolve/component-globals.mjs +22 -0
  76. package/dist/resolve/load-directive.cjs +1 -0
  77. package/dist/resolve/load-directive.d.ts +54 -0
  78. package/dist/resolve/load-directive.d.ts.map +1 -0
  79. package/dist/resolve/load-directive.js +93 -0
  80. package/dist/resolve/load-directive.mjs +1 -0
  81. package/dist/resolve/resolve-ir.cjs +1 -0
  82. package/dist/resolve/resolve-ir.d.ts +54 -0
  83. package/dist/resolve/resolve-ir.d.ts.map +1 -0
  84. package/dist/resolve/resolve-ir.js +58 -0
  85. package/dist/resolve/resolve-ir.mjs +1 -0
  86. package/dist/resolve/write-globals.cjs +22 -0
  87. package/dist/resolve/write-globals.d.ts +31 -0
  88. package/dist/resolve/write-globals.d.ts.map +1 -0
  89. package/dist/resolve/write-globals.js +136 -0
  90. package/dist/resolve/write-globals.mjs +22 -0
  91. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  92. package/package.json +4 -4
  93. package/dist/babel-UKVEBBZL.mjs +0 -2
  94. package/dist/chunk-3SAEGOMQ.mjs +0 -1
@@ -0,0 +1,2 @@
1
+ import{b as Je,c as Te,d as pe,e as Q,f as ue,g as Pe}from"./chunk-EF6V4GTD.mjs";import{declare as rn}from"@babel/helper-plugin-utils";var j={kind:"eager"},vt=["pointerdown","focusin","keydown"],Me=new Set(["eager","idle","visible","interaction","media","never"]),T=class extends Error{};function V(e){return e.startsWith("load:")}function D(e,t){let r=e.slice(5);if(!Me.has(r))throw new T(`Unknown load strategy 'load:${r}'. Expected one of ${[...Me].join(", ")}.`);switch(r){case"eager":return j;case"idle":return{kind:"idle"};case"never":return{kind:"never"};case"visible":return t?{kind:"visible",rootMargin:t}:{kind:"visible"};case"interaction":return{kind:"interaction",events:t?bt(t):[...vt]};case"media":if(!t)throw new T(`'load:media' needs a query, e.g. load:media="(min-width: 1024px)".`);return{kind:"media",query:t};default:throw new T(`Unhandled load strategy '${r}'.`)}}function bt(e){let t=e.split(/[\s,]+/).map(r=>r.trim()).filter(Boolean);if(t.length===0)throw new T("'load:interaction' was given no event names.");return t}function X(e){return e.kind!=="eager"&&e.kind!=="never"}function de(e,t={}){let{resolver:r,isBound:o,modules:i,strategyFor:s}=t,a=Pe(i),l=new Map,c=new Set,p=u=>{let{name:h}=u;if(!h||h.includes(".")||o?.(h))return;let y=m(h);if(!y){c.add(h);return}let C=y.origin==="builtin"&&ue.has(h)?j:s?.(u)??j;u.source={...y,loading:C},l.set(h,u.source)},m=u=>{if(ue.has(u))return{module:a[u],export:u,origin:"builtin"};let h=r?.resolve(u);if(h)return{module:h.module,export:h.export,origin:"rule"};if(Q.includes(u))return{module:a[u],export:u,origin:"builtin"}};return ee(e,u=>{u.kind==="component"&&p(u)}),{resolved:l,unresolved:[...c]}}function ee(e,t){let r=Array.isArray(e)?e:[e];for(let o of r){t(o);let i=o.children;i&&ee(i,t)}}function fe(e){let t=[];ee(e,s=>{s.kind==="component"&&s.source&&t.push(s)});let r=new Set,o=new Set;for(let s of t){let{module:a,loading:l}=s.source;l.kind==="eager"&&r.add(a),l.kind==="never"&&o.add(a)}let i=new Map;for(let s of t){let a=s.source;X(a.loading)&&r.has(a.module)&&(a.loading={kind:"eager"},i.set(a.module,(i.get(a.module)??0)+1))}return{collapsed:i,conflicted:[...o].filter(s=>r.has(s))}}import{types as n,template as it}from"@babel/core";import{types as f,traverse as Wt,template as qt}from"@babel/core";import Ge from"@babel/generator";var yt=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Xe={className:"class",htmlFor:"for"},Rt=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),Ct=new Set(["script","style","textarea","title"]);function me(e){return Ct.has(e)}function $e(e){return Xe[e]??e}function H(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!Rt.has(e.name)}function ge(e){if(!e.static||me(e.tag))return!1;for(let t of e.props)if(!H(t))return!1;for(let t of e.children)if(t.kind!=="text"&&!(t.kind==="element"&&ge(t)))return!1;return!0}function W(e){let t=e.props.map(wt).filter(Boolean).join(""),r=`<${e.tag}${t}>`;return yt.has(e.tag)?r:`${r}${e.children.map(It).join("")}</${e.tag}>`}function It(e){if(e.kind==="text")return Nt(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return W(e)}function wt(e){let t=Xe[e.name]??e.name,r=e.literal;return r===!0||r===void 0?` ${t}`:r===!1||r===null?"":` ${t}="${kt(String(r))}"`}function kt(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Nt(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var Lt="<!--fx-->",Jt="<!--fx/-->";function ne(e){return e.kind==="expr"||e.kind==="component"||e.kind==="control"}function Tt(e){return e.kind==="text"||e.kind==="element"&&Ae(e)}function Ae(e){return e.svg||me(e.tag)||!e.props.every(t=>H(t))?!1:e.children.every(t=>Tt(t)||ne(t))}function te(e){if(ne(e))return!0;let t=e.children;return t?t.some(te):!1}function je(e){for(let t=0;t<e.children.length;t++){let r=e.children[t];if(r.kind==="text"&&(r.value===""||e.children[t+1]?.kind==="text"))return!1}return e.children.every(t=>t.kind!=="element"||je(t))}function Fe(e){if(!Ae(e)||!je(e)||!e.children.some(te))return null;let t=[],r=[],o=0,i=a=>{let l=`_n$${o++}`;return t.push({ref:l,expr:a}),l};return s(e,"_el$"),{html:Pt(e),tag:e.tag,steps:t,holes:r};function s(a,l){let c=-1;a.children.forEach((m,u)=>{te(m)&&(c=u)});let p=null;for(let m=0;m<=c;m++){let u=a.children[m],h=p?`${p}.nextSibling`:`${l}.firstChild`;if(ne(u)){let C=i(h),I=i(`holeEnd(${C})`);r.push({parentRef:l,startRef:C,endRef:I,node:u}),p=I;continue}let y=i(h);u.kind==="element"&&te(u)&&s(u,y),p=y}}}function Pt(e){return W(Oe(e)).split(De).join(Lt+Jt)}function Oe(e){return{...e,children:e.children.map(t=>ne(t)?{kind:"text",value:De}:t.kind==="element"?Oe(t):t)}}var De="\0fx-hole\0";var he={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},On={version:2,module:"@fluixi/dom",symbols:[...he.symbols,"template","cloneTemplate","walk"]};var Mt={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function Xt(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function ze(e){return Xt(e)?e:JSON.stringify(e)}function $t(e){return e.expr!==void 0?e.reactive?`() => (${e.expr})`:`(${e.expr})`:JSON.stringify(e.literal??!0)}function At(e){return e.expr!==void 0?`(${e.expr})`:JSON.stringify(e.literal??!0)}function jt(e,t,r){let o=e.filter(l=>l.kind==="spread"),s=e.filter(l=>l.kind!=="spread").map(l=>`${ze(l.name)}: ${$t(l)}`);t!=null&&s.push(`children: ${t}`);let a=`{ ${s.join(", ")} }`;return o.length>0?(r.add("mergeProps"),`mergeProps(${o.map(l=>l.expr).join(", ")}, ${a})`):a}function Be(e,t,r){return e.length===1?q(e[0],t,r):`[${e.map(o=>q(o,t,r)).join(", ")}]`}function _e(e,t,r,o,i){o.add("createMemo"),o.add("createComponent");let s=t.filter(p=>p.kind==="spread"),l=t.filter(p=>p.kind!=="spread").map(p=>`get ${ze(p.name)}() { return ${At(p)}; }`);r.length>0&&l.push(`get children() { return ${Be(r,o,i)}; }`);let c=`{ ${l.join(", ")} }`;return s.length>0&&(o.add("mergeProps"),c=`mergeProps(${s.map(p=>p.expr).join(", ")}, ${c})`),`createMemo(() => createComponent(${e}, ${c}))`}function Ft(e,t){let r=$e(t.name),o=t.literal;return o===!0||o===void 0?`${e}.setAttribute(${JSON.stringify(r)}, "");`:o===!1||o===null?"":`${e}.setAttribute(${JSON.stringify(r)}, ${JSON.stringify(String(o))});`}var Ve=!1;function q(e,t,r){switch(e.kind){case"text":return JSON.stringify(e.value);case"expr":return e.reactive?`() => (${e.code})`:`(${e.code})`;case"fragment":return e.children.length===0?"null":Be(e.children,t,r);case"component":return _e(e.name,e.props,e.children,t,r);case"control":{let o=Mt[e.control]??e.control;return t.add(o),_e(o,e.props,e.children,t,r)}case"element":{if(r&&e.static&&!e.svg&&ge(e)){t.add("templateNode");let l=`_tmpl$${r.length}`;return r.push({id:l,html:W(e),tag:e.tag,svg:!1}),`templateNode(${l}, ${JSON.stringify(e.tag)})`}if(r&&Ve){let l=Fe(e);if(l){t.add("templateNode"),t.add("insert"),t.add("holeEnd"),t.add("holeContent"),t.add("holeScope");let c=`_tmpl$${r.length}`;r.push({id:c,html:l.html,tag:l.tag,svg:!1});let p=[`const _el$ = templateNode(${c}, ${JSON.stringify(l.tag)}, true);`];for(let m of l.steps)p.push(`const ${m.ref} = ${m.expr};`);for(let m of l.holes)p.push(`insert(${m.parentRef}, holeScope(${m.startRef}, () => (${q(m.node,t,r)})), ${m.endRef}, holeContent(${m.startRef}, ${m.endRef}));`);return p.push("return _el$;"),`(() => { ${p.join(" ")} })()`}}t.add("createNativeElement");let o=JSON.stringify(e.tag),i="_el$",s=[],a=e.svg?`${o}, true`:o;if(s.push(`const ${i} = createNativeElement(${a});`),e.props.length>0)if(!e.svg&&e.props.every(H))for(let l of e.props)s.push(Ft(i,l));else{t.add("spread");let l=e.svg?", isSVG: true":"";s.push(`spread({ element: ${i}, props: ${jt(e.props,null,t)}${l} });`)}for(let l of e.children){t.add("insert");let c=q(l,t,r),p=l.kind==="expr"&&l.reactive||l.kind==="component"||l.kind==="control";s.push(p?`insert(${i}, ${c}, null);`:`insert(${i}, ${c});`)}return s.push(`return ${i};`),`(() => { ${s.join(" ")} })()`}}}function U(e,t){if(!t||t.length===0)return e;let r=new Map(t.map(o=>[o.id,JSON.stringify(o.html)]));return e.replace(/_tmpl\$\d+/g,o=>r.get(o)??o)}var $={name:"imperative",contract:he,emit(e,t){let r=new Set,o=t?.templateClone!==!1?[]:void 0;return Ve=t?.partialTemplates===!0,{code:q(e,r,o),imports:Array.from(r),templates:o}}};import{types as re}from"@babel/core";import He from"@babel/generator";import{parseTemplate as Ot}from"@fluixi/template-parser";var Dt=He.default??He;function _t(e){return Dt(e,{concise:!0}).code}var We=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function zt(e){return e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function qe(e){return e.charAt(0).toUpperCase()+e.slice(1)}var Ee=class{constructor(t,r){this.holes=t;this.used=r}hole(t){return this.holes[t]??{node:re.identifier("undefined"),code:"undefined",reactive:!1}}emit(t){let{code:r,imports:o,templates:i}=$.emit(t,{});for(let s of o)this.used.add(s);return U(r,i)}lowerRoot(t){let r=this.lowerChildren(t);return r.length===1?r[0]:{kind:"fragment",children:r}}lowerChildren(t){let r=[];for(let o=0;o<t.length;o++){let i=t[o];if(i.kind==="Element"||i.kind==="Component"){let a=i.attributes.find(l=>l.kind==="IfDirective");if(a&&a.kind==="IfDirective"){let l=o+1;l<t.length&&this.isBlankText(t[l])&&l++;let c=t[l],p=c&&(c.kind==="Element"||c.kind==="Component")&&c.attributes.some(m=>m.kind==="ElseDirective");r.push(this.lowerIf(i,a.hole,p?c:null)),p&&(o=l);continue}if(i.attributes.some(l=>l.kind==="EachDirective")){r.push(this.lowerEach(i));continue}}let s=this.lowerNode(i);s&&r.push(s)}return r}isBlankText(t){return t.kind==="Text"&&!t.raw&&ie(t.value)===""}lowerNode(t){switch(t.kind){case"Text":{if(t.raw)return{kind:"text",value:t.value};let r=ie(t.value);return r?{kind:"text",value:r}:null}case"Comment":return null;case"Expression":{let r=this.hole(t.hole);return{kind:"expr",code:r.code,reactive:r.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(t.children)};case"Element":return this.lowerElement(t);case"Component":return this.lowerComponent(t);default:return null}}lowerElement(t){let r=t.attributes.find(o=>o.kind==="Attribute"&&o.name==="is");if(t.tag==="component"&&r&&r.value&&r.value.kind==="hole"){let o=t.attributes.filter(s=>s!==r),i=this.lowerComponent({...t,kind:"Component",tag:"Dynamic",tagHole:null,attributes:o});return i.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(r.value.hole).code})`}),i}return{kind:"element",tag:t.tag,svg:t.namespace==="svg",props:this.lowerAttributes(t.attributes),children:this.lowerChildren(t.children),static:!1}}lowerComponent(t){let r=t.tagHole!=null?this.hole(t.tagHole).code:t.tag,o=this.lowerAttributes(t.attributes),{slots:i,rest:s}=this.partitionSlots(t.children);for(let[c,p]of i){let m=p.length===1?p[0]:{kind:"fragment",children:p},u={name:c,kind:"attr",expr:this.emit(m),jsxElement:!0},h=o.findIndex(y=>y.name===c);h>=0?o[h]=u:o.push(u)}let a=t.attributes.find(c=>c.kind==="LoadDirective"),l=a?D(`load:${a.strategy}`,a.modifier):void 0;return{kind:"component",name:r,props:o,children:this.lowerChildren(s),...l?{load:l}:{}}}partitionSlots(t){let r=new Map,o=[];for(let i of t){if(i.kind==="Element"||i.kind==="Component"){let s=i.attributes.find(a=>a.kind==="Attribute"&&a.name==="slot");if(s&&s.value&&s.value.kind==="static"){let a={...i,attributes:i.attributes.filter(p=>p!==s)},l=a.kind==="Element"?this.lowerElement(a):this.lowerComponent(a),c=r.get(s.value.value)??[];c.push(l),r.set(s.value.value,c);continue}}o.push(i)}return{slots:r,rest:o}}lowerIf(t,r,o){let i=this.hole(r),s=[{name:"when",kind:"attr",expr:i.code,reactive:i.reactive}];if(o){let l=this.stripAndLower(o,c=>c.kind==="ElseDirective");s.push({name:"fallback",kind:"attr",expr:this.emit(l),jsxElement:!0})}let a=this.stripAndLower(t,l=>l.kind==="IfDirective");return{kind:"component",name:"Show",props:s,children:[a]}}lowerEach(t){let r=t.attributes.find(c=>c.kind==="EachDirective");if(!r||r.kind!=="EachDirective")return this.lowerNode(t);let o=this.hole(r.hole),i=[{name:"each",kind:"attr",expr:o.code,reactive:o.reactive}];if(r.key){let c="static"in r.key?`(item) => item[${JSON.stringify(r.key.static)}]`:this.hole(r.key.hole).code;i.push({name:"by",kind:"attr",expr:c})}let s=this.itemArrow(t),a;if(s){let c=s.body,p={kind:"expr",code:A(c,this.used),reactive:k(c)},m=this.rebuildWithChildren(t,[p]);a=`(${s.params.map(u=>_t(u)).join(", ")}) => (${this.emit(m)})`}else{let c=this.stripAndLower(t,p=>p.kind==="EachDirective");a=`() => (${this.emit(c)})`}return{kind:"component",name:"For",props:i,children:[{kind:"expr",code:a,reactive:!1}]}}itemArrow(t){let r=t.children.filter(i=>!this.isBlankText(i));if(r.length!==1||r[0].kind!=="Expression")return null;let o=this.hole(r[0].hole).node;return re.isArrowFunctionExpression(o)&&!re.isBlockStatement(o.body)?o:null}stripAndLower(t,r){let o={...t,attributes:t.attributes.filter(i=>!r(i))};return o.kind==="Element"?this.lowerElement(o):this.lowerComponent(o)}rebuildWithChildren(t,r){let o=this.lowerAttributes(t.attributes.filter(i=>i.kind!=="EachDirective"));return t.kind==="Element"?{kind:"element",tag:t.tag,svg:t.namespace==="svg",props:o,children:r,static:!1}:{kind:"component",name:t.tag,props:o,children:r}}lowerAttributes(t){let r=[],o=[],i=!1,s=[],a=!1,l=[];for(let c of t)switch(c.kind){case"IfDirective":case"EachDirective":case"ElseDirective":break;case"Attribute":r.push(this.plainAttr(c));break;case"PropertyBinding":r.push({name:c.name,kind:"prop",expr:this.hole(c.hole).code,reactive:this.hole(c.hole).reactive});break;case"EventBinding":r.push(this.eventProp(c));break;case"RefBinding":r.push({name:"ref",kind:"ref",expr:this.hole(c.hole).code,reactive:this.hole(c.hole).reactive});break;case"Spread":r.push({name:"",kind:"spread",expr:this.hole(c.hole).code});break;case"ClassDirective":{let p=this.hole(c.hole);o.push(`${JSON.stringify(c.name)}: ${p.code}`),i=i||p.reactive;break}case"StyleDirective":{let p=this.hole(c.hole);s.push(`${JSON.stringify(c.name)}: ${p.code}`),a=a||p.reactive;break}case"BindDirective":r.push(...this.bindProps(c.name,this.hole(c.hole).code));break;case"UseDirective":{let p=c.name??(c.hole!=null?this.hole(c.hole).code:null);if(!p)break;l.push(c.name!=null&&c.hole!=null?`[${p}, () => (${this.hole(c.hole).code})]`:`[${p}]`);break}}return o.length>0&&r.push({name:"classList",kind:"attr",expr:`{ ${o.join(", ")} }`,reactive:i}),s.length>0&&r.push({name:"style",kind:"attr",expr:`{ ${s.join(", ")} }`,reactive:a}),l.length>0&&r.push({name:"use",kind:"attr",expr:`[${l.join(", ")}]`}),r}eventProp(t){let r=t.name.toLowerCase(),o=this.hole(t.hole).code;if(!(t.syntax==="colon"||t.modifiers.length>0))return{name:"on"+qe(t.name),kind:"event",event:{name:r,delegated:We.has(r)},expr:o};let s=this.wrapHandler(o,t.modifiers),a=this.eventOptions(t.modifiers),l=a?`[${s}, ${a}]`:s;return{name:"on:"+r,kind:"attr",expr:l}}wrapHandler(t,r){let o=r.includes("self")?"if (e.target !== e.currentTarget) return; ":"",i=[];return r.includes("prevent")&&i.push("e.preventDefault();"),r.includes("stop")&&i.push("e.stopPropagation();"),!o&&i.length===0?t:`(e) => { ${o}${i.join(" ")} return (${t})(e); }`}eventOptions(t){let r=[];return t.includes("capture")&&r.push("capture: true"),t.includes("once")&&r.push("once: true"),t.includes("passive")&&r.push("passive: true"),r.length?`{ ${r.join(", ")} }`:null}bindProps(t,r){let o=t==="checked",i=o?"change":"input",s=o?"checked":"value",a=`(${r})`;return[{name:t,kind:"attr",expr:`${a}[0]()`,reactive:!0},{name:"on"+qe(i),kind:"event",event:{name:i,delegated:We.has(i)},expr:`(e) => ${a}[1](e.target.${s})`}]}plainAttr(t){let r=t.value,o=t.name;t.name==="class"?o=r&&r.kind==="hole"&&re.isObjectExpression(this.hole(r.hole).node)?"classList":"className":t.name==="html"&&(o="innerHTML");let s={name:o,kind:"attr"};if(r==null)return s.literal=!0,s;if(r.kind==="static")return s.literal=r.value,s;if(r.kind==="hole"){let c=this.hole(r.hole);return s.expr=c.code,s.reactive=c.reactive,s}let a=!1,l=r.parts.map(c=>{if("text"in c)return zt(c.text);let p=this.hole(c.hole);return a=a||p.reactive,"${"+p.code+"}"}).join("");return s.expr="`"+l+"`",s.reactive=a,s}};function Ue(e,t,r={}){let o=e.quasi,i=o.expressions.map(l=>{let c=l;return{node:c,code:A(c,t),reactive:k(c)}}),s=Bt(o),{root:a}=Ot(s,{svg:r.svg});return new Ee(i,t).lowerRoot(a.children)}function Bt(e){let t=[];return e.quasis.forEach((r,o)=>{let i=r.value.cooked??r.value.raw;if(t.push({kind:"static",text:i,start:r.start??0}),o<e.expressions.length){let s=e.expressions[o];t.push({kind:"hole",index:o,start:s.start??0,end:s.end??0})}}),t}function Vt(e){switch(e.kind){case"event":return"event";case"ref":return"ref";case"spread":return"spread";case"class":case"style":return"class-or-style-directive";case"attr":case"prop":return e.reactive?"reactive-prop":e.expr!==void 0?"expression-prop":void 0;default:return"expression-prop"}}function oe(e){let t=[],r=new Map,o=i=>{switch(i.kind){case"text":return!0;case"expr":return!1;case"component":case"control":for(let s of i.children)o(s);return!1;case"fragment":for(let s of i.children)o(s);return!1;case"element":{let s=!0;for(let l of i.children)o(l)||(s=!1);let a;for(let l of i.props)if(a=Vt(l),a)break;return!a&&!s&&(a=Ht(i)),i.static=!a,a?r.set(i,a):t.push(i),i.static}default:return!1}};for(let i of Array.isArray(e)?e:[e])o(i);return{staticElements:t,reasons:r}}function Ht(e){for(let t of e.children){if(t.kind==="expr")return"expression-child";if(t.kind==="component")return"component-child";if(t.kind==="control")return"control-child";if(t.kind==="element"&&!t.static||t.kind==="fragment")return"expression-child"}return"expression-child"}function se(e,t=new Set,r={}){let o=Ue(e,t,r);return oe(o),o}var Ut=Ge.default??Ge;function Ye(e){return Ut(e,{concise:!0}).code}function Gt(e,t){let r=f.cloneNode(e,!0),o=f.file(f.program([f.expressionStatement(r)])),i=!1,s=(a,l,c)=>{for(let p of c)t.add(p);a.replaceWith(qt.expression(l,{placeholderPattern:!1,plugins:["typescript"]})()),a.skip(),i=!0};return Wt(o,{"JSXElement|JSXFragment"(a){let l=a.node,{code:c,imports:p,templates:m}=$.emit(ve(l,t),{});s(a,U(c,m),p)},TaggedTemplateExpression(a){let l=a.node.tag;if(!f.isIdentifier(l)||l.name!=="html"&&l.name!=="svg")return;let c=se(a.node,t,{svg:l.name==="svg"}),{code:p,imports:m,templates:u}=$.emit(c,{});s(a,U(p,u),m)}}),i?o.program.body[0].expression:e}function A(e,t){return Ye(Gt(e,t))}var Kt=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),Zt=/^on[A-Z]/,Yt=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function Qt(e){if(f.isJSXIdentifier(e)){let t=e.name[0]!==e.name[0].toLowerCase();return{tag:e.name,component:t}}return f.isJSXMemberExpression(e)?{tag:Ye(e),component:!0}:f.isJSXNamespacedName(e)?{tag:`${e.namespace.name}:${e.name.name}`,component:!1}:{tag:"div",component:!1}}function Se(e){return f.isJSXIdentifier(e)?e.name==="class"?"className":e.name:f.isJSXNamespacedName(e)?`${e.namespace.name}:${e.name.name}`:"unknown"}function k(e){return f.isCallExpression(e)||f.isOptionalCallExpression(e)?!0:f.isMemberExpression(e)||f.isOptionalMemberExpression(e)?!(!e.computed&&f.isIdentifier(e.property,{name:"children"})):f.isConditionalExpression(e)?k(e.test)||k(e.consequent)||k(e.alternate):f.isLogicalExpression(e)||f.isBinaryExpression(e)?k(e.left)||k(e.right):f.isTemplateLiteral(e)?e.expressions.some(t=>k(t)):f.isObjectExpression(e)?e.properties.some(t=>f.isObjectProperty(t)&&!t.computed&&k(t.value)):f.isArrayExpression(e)?e.elements.some(t=>t!=null&&!f.isSpreadElement(t)&&k(t)):!1}function en(e,t){let r=Se(e.name),o=Zt.test(r),i=o||r.startsWith("on:"),a={name:r,kind:o?"event":"attr"};o&&(a.event={name:r.slice(2).toLowerCase(),delegated:Yt.has(r.slice(2).toLowerCase())});let l=e.value;if(l==null)return a.literal=!0,a;if(f.isStringLiteral(l))return a.literal=l.value,a;if(f.isJSXExpressionContainer(l)&&!f.isJSXEmptyExpression(l.expression)){let c=l.expression;return f.isStringLiteral(c)||f.isNumericLiteral(c)||f.isBooleanLiteral(c)?(a.literal=c.value,a):(a.expr=A(c,t),a.reactive=i?!1:k(c),(f.isJSXElement(c)||f.isJSXFragment(c))&&(a.jsxElement=!0),a)}return a.literal=!0,a}function Ke(e,t){let r=e.value;return r==null?null:f.isStringLiteral(r)?JSON.stringify(r.value):f.isJSXExpressionContainer(r)&&!f.isJSXEmptyExpression(r.expression)?A(r.expression,t):null}function tn(e,t){let r=[],o=[];for(let i of e){if(f.isJSXSpreadAttribute(i)){r.push({name:"",kind:"spread",expr:A(i.argument,t)});continue}if(!f.isJSXAttribute(i)||V(Se(i.name)))continue;let s=f.isJSXNamespacedName(i.name)?i.name.namespace.name:null;if(s==="use"){let a=i.name.name.name;t.add(a);let l=Ke(i,t);o.push(l!=null?`[${a}, () => (${l})]`:`[${a}]`);continue}if(s==="oncapture"){let a=i.name.name.name.toLowerCase(),l=Ke(i,t)??"undefined";r.push({name:"on:"+a,kind:"attr",expr:`[${l}, { capture: true }]`});continue}r.push(en(i,t))}return o.length>0&&r.push({name:"use",kind:"attr",expr:`[${o.join(", ")}]`}),r}function ie(e){let t=e.split(/\r\n|\n|\r/),r=0;for(let i=0;i<t.length;i++)/[^ \t]/.test(t[i])&&(r=i);let o="";for(let i=0;i<t.length;i++){let s=t[i].replace(/\t/g," ");i!==0&&(s=s.replace(/^ +/,"")),i!==t.length-1&&(s=s.replace(/ +$/,"")),s&&(i!==r&&(s+=" "),o+=s)}return o}function Ze(e,t){let r=[];for(let o of e)if(f.isJSXText(o)){let i=ie(o.value);i&&r.push({kind:"text",value:i})}else if(f.isJSXExpressionContainer(o)){if(!f.isJSXEmptyExpression(o.expression)){let i=o.expression;r.push({kind:"expr",code:A(i,t),reactive:k(i)})}}else f.isJSXElement(o)||f.isJSXFragment(o)?r.push(xe(o,t)):f.isJSXSpreadChild(o)&&r.push({kind:"expr",code:A(o.expression,t),reactive:!1});return r}function ve(e,t=new Set){let r=xe(e,t);return oe(r),r}function xe(e,t){if(f.isJSXFragment(e))return{kind:"fragment",children:Ze(e.children,t)};let{tag:r,component:o}=Qt(e.openingElement.name),i=tn(e.openingElement.attributes,t),s=Ze(e.children,t);if(o){let a=nn(e.openingElement.attributes);return{kind:"component",name:r,props:i,children:s,...a?{load:a}:{}}}return{kind:"element",tag:r,svg:Kt.has(r),props:i,children:s,static:!1}}function nn(e){for(let t of e){if(!f.isJSXAttribute(t))continue;let r=Se(t.name);if(V(r)){if(t.value&&!f.isStringLiteral(t.value))throw new T(`'${r}' needs a literal value, not an expression — the strategy is compile-time.`);return D(r,t.value?t.value.value:null)}}}var le=new Set([...Te,...pe]),Qe=new Set(pe),ae=new Set(Q),on={Show:"when",For:"each",Index:"each",Match:"when"};var ot=/^on[A-Z]/,st=["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup","mouseover","mouseout","mouseenter","mouseleave"],K=rn((e,t={})=>{e.assertVersion(7);let{runtime:r="automatic",importSource:o="@fluixi/jsx",pragma:i="jsx",pragmaFrag:s="Fragment",development:a=!1,detectReactivity:l=!0,useLitHTML:c=!0,hoistStatics:p=!0,delegateEvents:m=!0,delegatedEvents:u=st,optimizeControlFlow:h=!0,sourceMaps:y=!0,signalModule:C="@fluixi/dom",controlFlowModule:I="@fluixi/dom",routerModule:_="@fluixi/core/router-next",reactiveModule:M="@fluixi/reactive/signal",autoShowTransform:z=!1,backend:J="imperative",codegen:B="ir",templateClone:we=!0,partialTemplates:ke=!0,format:Ne="both",litTag:ht="html",resolve:Et=[]}=t,Le=Je(Et),xt=Ne==="lit"||Ne==="both",St={backend:J,codegen:B,irImports:new Set,libModule:"@fluixi/core",controlFlowModule:I,routerModule:_,templateClone:we,partialTemplates:ke,hasJSX:!1,hasReactivity:!1,hasLitHTML:!1,needsSignalImport:!1,needsControlFlowImport:!1,needsCreateMemo:!1,controlFlowComponents:new Set,resolvedComponents:new Map,deferredComponents:new Map,componentResolver:Le,delegatedEvents:new Set,staticElements:new Map,staticTemplates:new Map,staticCounter:0};return{name:"@fluixi/babel-plugin-jsx",manipulateOptions(g,d){d.plugins.push("jsx","typescript")},pre(g){Object.assign(g,St)},visitor:{ImportDeclaration(g,d){g.node.source.value==="@fluixi/core/rx"&&(g.node.source=n.stringLiteral("@fluixi/reactive"))},Program:{enter(g,d){Object.assign(d,{hasJSX:!1,hasReactivity:!1,hasLitHTML:!1,hasLitIR:!1,needsSignalImport:!1,needsControlFlowImport:!1,needsCreateMemo:!1,controlFlowComponents:new Set,resolvedComponents:new Map,deferredComponents:new Map,componentResolver:Le,delegatedEvents:new Set,staticElements:new Map,staticTemplates:new Map,autoShow:z,staticCounter:0,libModule:"@fluixi/core",controlFlowModule:I,routerModule:_,templateClone:we,partialTemplates:ke,backend:J,codegen:B,irImports:new Set,needsCreateNativeElement:!1,needsInsert:!1,needsSpread:!1,needsCreateComponent:!1,needsMergeProps:!1})},exit(g,d){let E=[];if(d.hasJSX||d.needsSignalImport&&E.push(n.importDeclaration([n.importSpecifier(n.identifier("signal"),n.identifier("signal"))],n.stringLiteral(C))),d.hasJSX||d.hasLitIR){if(d.irImports.size>0){let S=new Set(["Show","For","Index","Switch","Match","Dynamic","ErrorBoundary","Portal","Suspense"]),x=new Set(["createMemo","createEffect","createRenderEffect","createRoot","createSignal","onCleanup","batch","untrack"]),v=Array.from(d.irImports),R=b=>n.importSpecifier(n.identifier(b),n.identifier(b)),L=b=>!g.scope.hasBinding(b),O=v.filter(b=>x.has(b)&&L(b)),w=v.filter(b=>!S.has(b)&&!x.has(b)&&L(b)),Y=v.filter(b=>S.has(b)&&L(b));O.length>0&&E.push(n.importDeclaration(O.map(R),n.stringLiteral(M))),w.length>0&&E.push(n.importDeclaration(w.map(R),n.stringLiteral(C))),Y.length>0&&E.push(n.importDeclaration(Y.map(R),n.stringLiteral(I)))}if(d.hasJSX&&J==="imperative"&&B!=="ir"){let x=[[!!d.needsCreateNativeElement,"createNativeElement"],[!!d.needsSpread,"spread"],[!!d.needsInsert,"insert"],[!!d.needsCreateComponent,"createComponent"],[!!d.needsMergeProps,"mergeProps"]].filter(([v,R])=>v&&!g.scope.hasBinding(R)).map(([,v])=>n.importSpecifier(n.identifier(v),n.identifier(v)));x.length>0&&E.push(n.importDeclaration(x,n.stringLiteral(C)))}else if(d.hasJSX&&r==="automatic"&&J!=="imperative"){let S=[n.importSpecifier(n.identifier("jsx"),n.identifier("jsx")),n.importSpecifier(n.identifier("jsxs"),n.identifier("jsxs")),n.importSpecifier(n.identifier("Fragment"),n.identifier("Fragment"))];a&&S.push(n.importSpecifier(n.identifier("jsxDEV"),n.identifier("jsxDEV"))),d.needsMergeProps&&S.push(n.importSpecifier(n.identifier("mergeProps"),n.identifier("mergeProps"))),E.push(n.importDeclaration(S,n.stringLiteral(o)))}if(d.needsCreateMemo&&!g.scope.hasBinding("createMemo")&&E.push(n.importDeclaration([n.importSpecifier(n.identifier("createMemo"),n.identifier("createMemo"))],n.stringLiteral(J==="imperative"?M:d.libModule??"@fluixi/core"))),d.needsControlFlowImport&&d.controlFlowComponents.size>0){let S=Array.from(d.controlFlowComponents).filter(w=>!g.scope.hasBinding(w)),x=d.libModule??"@fluixi/core",v=S.filter(w=>ae.has(w)),R=S.filter(w=>Qe.has(w)),L=S.filter(w=>!Qe.has(w)&&!ae.has(w)),O=(w,Y)=>n.importDeclaration(w.map(b=>n.importSpecifier(n.identifier(b),n.identifier(b))),n.stringLiteral(Y));L.length>0&&E.push(O(L,I)),R.length>0&&E.push(O(R,x)),v.length>0&&E.push(O(v,_))}let N=[];if(d.deferredComponents.size>0){for(let[S,x]of d.deferredComponents)g.scope.hasBinding(S)||N.push(n.variableDeclaration("const",[n.variableDeclarator(n.identifier(S),n.callExpression(n.identifier("deferred"),[n.arrowFunctionExpression([],n.callExpression(n.import(),[n.stringLiteral(x.module)])),n.objectExpression([n.objectProperty(n.identifier("strategy"),pn(x.strategy)),n.objectProperty(n.identifier("export"),n.stringLiteral(x.export))])]))]));N.length>0&&!g.scope.hasBinding("deferred")&&E.push(n.importDeclaration([n.importSpecifier(n.identifier("deferred"),n.identifier("deferred"))],n.stringLiteral(d.libModule??"@fluixi/core")))}if(d.resolvedComponents.size>0){let S=new Map;for(let[x,v]of d.resolvedComponents){if(g.scope.hasBinding(x))continue;let R=S.get(v.module)??[];R.push({local:x,exported:v.export}),S.set(v.module,R)}for(let[x,v]of S)E.push(n.importDeclaration(v.map(({local:R,exported:L})=>L==="default"?n.importDefaultSpecifier(n.identifier(R)):n.importSpecifier(n.identifier(R),n.identifier(L))),n.stringLiteral(x)))}if(m&&d.delegatedEvents.size>0){E.push(n.importDeclaration([n.importSpecifier(n.identifier("delegateEvents"),n.identifier("delegateEvents"))],n.stringLiteral(J==="imperative"?C:"@fluixi/jsx")));let S=n.arrayExpression(Array.from(d.delegatedEvents).map(v=>n.stringLiteral(v))),x=n.expressionStatement(n.callExpression(n.identifier("delegateEvents"),[S]));g.node.body.unshift(x)}if(p&&d.staticElements.size>0){let S=[];d.staticElements.forEach((x,v)=>{S.push(n.variableDeclaration("const",[n.variableDeclarator(n.identifier(v),x)]))}),g.node.body.unshift(...S)}if(N.length>0&&g.node.body.unshift(...N),d.staticTemplates.size>0){let S=[];for(let[x,v]of d.staticTemplates){let L=x.startsWith("svg:")?x.slice(4):x;S.push(n.variableDeclaration("const",[n.variableDeclarator(n.identifier(v),n.stringLiteral(L))]))}g.node.body.unshift(...S)}}E.length>0&&g.node.body.unshift(...dn(E))}},JSXElement(g,d){if(d.hasJSX=!0,J==="imperative"&&B==="ir"){g.replaceWith(tt(g.node,d));return}let E=g.node,N=E.openingElement;if(n.isJSXIdentifier(N.name)&&ae.has(N.name.name)&&!d.componentResolver?.resolve(N.name.name)&&(d.controlFlowComponents.add(N.name.name),d.needsControlFlowImport=!0),n.isJSXIdentifier(N.name)&&le.has(N.name.name)&&(d.controlFlowComponents.add(N.name.name),h)){let x=wn(E,d);if(x){g.replaceWith(x);return}}if(p&&J!=="imperative"&&gt(E,d)){let x=In(E,d);if(x){g.replaceWith(x);return}}let S=sn(E,d,{runtime:r,pragma:i,development:a,detectReactivity:l,useLitHTML:c,autoShow:z});g.replaceWith(S)},JSXFragment(g,d){if(d.hasJSX=!0,J==="imperative"&&B==="ir"){g.replaceWith(tt(g.node,d));return}let E=ce(g.node,d,{runtime:r,pragmaFrag:s,development:a});g.replaceWith(E)},CallExpression(g,d){if(!l)return;let E=g.node.callee;E.name,n.isIdentifier(E)&&(E.name==="createSignal"||E.name==="createStore"||E.name==="useContext"||E.name==="useLocation")&&(d.hasReactivity=!0)},JSXExpressionContainer(g){},TaggedTemplateExpression(g,d){if(xt&&J==="imperative"&&n.isIdentifier(g.node.tag)&&(g.node.tag.name===ht||g.node.tag.name==="svg")){g.replaceWith(fn(g.node,d));return}}}}});function sn(e,t,r){let{runtime:o,pragma:i,development:s,autoShow:a=!0}=r;return o==="automatic"?Z(e,t,s,a):hn(e,t,i)}var an=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]);function et(e,t,r){return t.length>0?(r.needsMergeProps=!0,n.callExpression(n.identifier("mergeProps"),[...t,n.objectExpression(e)])):n.objectExpression(e)}function at(e){return e.length===1?e[0]:n.arrayExpression(e)}function ln(e,t,r,o,i,s){if(!t){let u=[...r];return i.length>0&&u.push(n.objectMethod("get",n.identifier("children"),[],n.blockStatement([n.returnStatement(at(i))]))),lt(e,et(u,o,s),s)}let a=e.value,l=an.has(a),c=n.identifier("_el$"),p=[];s.needsCreateNativeElement=!0;let m=[e];if(l&&m.push(n.booleanLiteral(!0)),p.push(n.variableDeclaration("const",[n.variableDeclarator(c,n.callExpression(n.identifier("createNativeElement"),m))])),r.length>0||o.length>0){s.needsSpread=!0;let u=[n.objectProperty(n.identifier("element"),c),n.objectProperty(n.identifier("props"),et(r,o,s))];l&&u.push(n.objectProperty(n.identifier("isSVG"),n.booleanLiteral(!0))),p.push(n.expressionStatement(n.callExpression(n.identifier("spread"),[n.objectExpression(u)])))}if(i.length>0){s.needsInsert=!0;for(let u of i){let y=n.isArrowFunctionExpression(u)||n.isFunctionExpression(u)||n.isCallExpression(u)&&n.isIdentifier(u.callee)&&u.callee.name==="createMemo"?[n.cloneNode(c),u,n.nullLiteral()]:[n.cloneNode(c),u];p.push(n.expressionStatement(n.callExpression(n.identifier("insert"),y)))}}return p.push(n.returnStatement(c)),n.callExpression(n.arrowFunctionExpression([],n.blockStatement(p)),[])}function cn(e,t){let r=null;if(t.value)if(n.isStringLiteral(t.value))r=t.value.value;else throw new T(`'${e}' needs a literal value, not an expression — the strategy is compile-time.`);return D(e,r)}function pn(e){let t=[n.objectProperty(n.identifier("kind"),n.stringLiteral(e.kind))];return e.kind==="visible"&&e.rootMargin&&t.push(n.objectProperty(n.identifier("rootMargin"),n.stringLiteral(e.rootMargin))),e.kind==="interaction"&&t.push(n.objectProperty(n.identifier("events"),n.arrayExpression(e.events.map(r=>n.stringLiteral(r))))),e.kind==="media"&&t.push(n.objectProperty(n.identifier("query"),n.stringLiteral(e.query))),n.objectExpression(t)}function un(e,t){return!X(e)||!X(t)?j:e}function lt(e,t,r){n.isIdentifier(e)&&le.has(e.name)&&(r.controlFlowComponents.add(e.name),r.needsControlFlowImport=!0);let o=!1;if(n.isIdentifier(e)&&!le.has(e.name)&&r.componentResolver){let i=r.componentResolver.resolve(e.name);if(i){let s=r.pendingLoad??j,a=r.resolvedComponents.has(e.name);if(X(s)&&!a){let l=r.deferredComponents.get(e.name),c=l?un(l.strategy,s):s;X(c)?r.deferredComponents.set(e.name,{...i,strategy:c}):(r.deferredComponents.delete(e.name),r.resolvedComponents.set(e.name,i))}else r.deferredComponents.delete(e.name),r.resolvedComponents.set(e.name,i);o=!0}}return r.pendingLoad=void 0,!o&&n.isIdentifier(e)&&ae.has(e.name)&&(r.controlFlowComponents.add(e.name),r.needsControlFlowImport=!0),r.backend==="imperative"?(r.needsCreateComponent=!0,r.needsCreateMemo=!0,n.callExpression(n.identifier("createMemo"),[n.arrowFunctionExpression([],n.callExpression(n.identifier("createComponent"),[e,t]))])):n.callExpression(n.identifier("jsx"),[e,t])}function ct(e,t,r){if(!t||t.length===0)return e;let o=new Map;for(let i of t){let s=`${i.svg?"svg:":""}${i.html}`,a=r.staticTemplates.get(s);a||(a=`_tmpl$${r.staticTemplates.size}`,r.staticTemplates.set(s,a)),o.set(i.id,a)}return e.replace(/_tmpl\$\d+/g,i=>o.get(i)??i)}function tt(e,t){let r=new Set,o=ve(e,r);de(o,{resolver:t.componentResolver,modules:{controlFlowModule:t.controlFlowModule,coreModule:t.libModule,routerModule:t.routerModule},strategyFor:c=>c.load}),fe(o);let{code:i,imports:s,templates:a}=$.emit(o,{templateClone:t.templateClone,partialTemplates:t.partialTemplates});for(let c of s)r.add(c);for(let c of r)t.irImports.add(c);ye(o,t);let l=ct(i,a,t);return it.expression(l,{placeholderPattern:!1,plugins:["typescript"]})()}function dn(e){let t=new Map,r=[];for(let o of e){let i=o.source.value;if(!o.specifiers.every(l=>n.isImportSpecifier(l))){r.push(o);continue}let a=t.get(i);if(!a){let l=new Set(o.specifiers.map(c=>c.local.name));t.set(i,{decl:o,names:l}),r.push(o);continue}for(let l of o.specifiers)a.names.has(l.local.name)||(a.names.add(l.local.name),a.decl.specifiers.push(l))}return r}function fn(e,t){let r=new Set,o=n.isIdentifier(e.tag)&&e.tag.name==="svg",i=se(e,r,{svg:o});de(i,{resolver:t.componentResolver,modules:{controlFlowModule:t.controlFlowModule,coreModule:t.libModule,routerModule:t.routerModule},strategyFor:p=>p.load}),fe(i);let{code:s,imports:a,templates:l}=$.emit(i,{templateClone:t.templateClone,partialTemplates:t.partialTemplates});for(let p of a)r.add(p);for(let p of r)t.irImports.add(p);ye(i,t),t.hasLitIR=!0;let c=it.expression(ct(s,l,t),{placeholderPattern:!1,plugins:["typescript"]})();return mn(c,e),c}function mn(e,t){if(!t.loc)return;let r=new Set,o=i=>{if(!r.has(i)){r.add(i),i.loc||(i.loc=t.loc,i.start=t.start,i.end=t.end);for(let s of n.VISITOR_KEYS[i.type]??[]){let a=i[s];if(Array.isArray(a))for(let l of a)l&&typeof l=="object"&&"type"in l&&o(l);else a&&typeof a=="object"&&"type"in a&&o(a)}}};o(e)}function ye(e,t){if(e.kind==="component"&&e.source&&(e.source.origin==="builtin"?(t.controlFlowComponents.add(e.name),t.needsControlFlowImport=!0):X(e.source.loading)&&!t.resolvedComponents.has(e.name)?t.deferredComponents.set(e.name,{module:e.source.module,export:e.source.export,strategy:e.source.loading}):(t.deferredComponents.delete(e.name),t.resolvedComponents.set(e.name,{module:e.source.module,export:e.source.export}))),(e.kind==="element"||e.kind==="component"||e.kind==="control")&&"props"in e)for(let r of e.props)r.kind==="event"&&r.event?.delegated&&t.delegatedEvents.add(r.event.name);if("children"in e&&e.children)for(let r of e.children)ye(r,t)}function gn(e){return e.map(t=>{if(n.isObjectProperty(t)){let r=t.key,o=t.computed,i=t.value;return n.objectMethod("get",r,[],n.blockStatement([n.returnStatement(i)]),o)}return t})}function Z(e,t,r,o=!0){let i=e.openingElement,s=e.children,a=pt(i.name),l=n.isJSXIdentifier(i.name)&&/^[a-z]/.test(i.name.name),c=dt(i.attributes,t,l,n.isJSXIdentifier(i.name)?i.name.name:""),p=c.props,m=c.spreads;l||(p=gn(p));let u=Re(s,t,o);if(t.backend==="imperative")return ln(a,l,p,m,u,t);if(u.length>0){let I=u.length===1?u[0]:n.arrayExpression(u);p.push(n.objectProperty(n.identifier("children"),I))}let h;if(m.length>0){let I=p.length>0?n.objectExpression(p):n.objectExpression([]);t.needsMergeProps=!0,h=n.callExpression(n.identifier("mergeProps"),[...m,I])}else h=n.objectExpression(p);let y=r?"jsxDEV":u.length>1?"jsxs":"jsx",C=[a,h];return r&&C.push(n.identifier("undefined"),n.booleanLiteral(!1),n.identifier("undefined"),n.identifier("undefined")),n.callExpression(n.identifier(y),C)}function hn(e,t,r){let o=e.openingElement,i=e.children,s=pt(o.name),a=n.isJSXIdentifier(o.name)&&/^[a-z]/.test(o.name.name),{props:l,spreads:c}=dt(o.attributes,t,a,n.isJSXIdentifier(o.name)?o.name.name:""),p=Re(i,t,t.autoShow??!0),m;if(c.length>0){let h=l.length>0?n.objectExpression(l):n.objectExpression([]);t.needsMergeProps=!0,m=n.callExpression(n.identifier("mergeProps"),[...c,h])}else m=l.length>0?n.objectExpression(l):n.nullLiteral();let u=[s,m,...p];return n.callExpression(n.identifier(r),u)}function ce(e,t,r){let{runtime:o,pragmaFrag:i,development:s}=r,a=Re(e.children,t,t.autoShow??!0);if(t.backend==="imperative")return a.length===0?n.nullLiteral():at(a);if(o==="automatic"){let l=s?"jsxDEV":a.length>1?"jsxs":"jsx",c=n.objectExpression([n.objectProperty(n.identifier("children"),a.length===1?a[0]:n.arrayExpression(a))]),p=[n.identifier("Fragment"),c];return s&&p.push(n.identifier("undefined"),n.booleanLiteral(!1),n.identifier("undefined"),n.identifier("undefined")),n.callExpression(n.identifier(l),p)}else return n.callExpression(n.identifier(i),a)}function pt(e){if(n.isJSXIdentifier(e)){let t=e.name;return t[0]===t[0].toLowerCase()?n.stringLiteral(t):n.identifier(t)}return n.isJSXMemberExpression(e)?ut(e):n.isJSXNamespacedName(e)?n.stringLiteral(`${e.namespace.name}:${e.name.name}`):n.stringLiteral("div")}function ut(e){let t;return n.isJSXIdentifier(e.object)?t=n.identifier(e.object.name):t=ut(e.object),n.memberExpression(t,n.identifier(e.property.name))}function En(e){return/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)}function dt(e,t,r=!0,o=""){let i=[],s=[],a=on[o],l=[];t.pendingLoad=void 0;for(let c of e)if(n.isJSXSpreadAttribute(c))s.push(c.argument);else if(n.isJSXAttribute(c)){let p=xn(c.name);if(V(p)){t.pendingLoad=cn(p,c);continue}if(n.isJSXNamespacedName(c.name)&&c.name.namespace.name==="use"){let M=n.identifier(c.name.name.name),z=c.value===null?null:nt(c.value,t,p,r);l.push(n.arrayExpression(z?[M,n.arrowFunctionExpression([],z)]:[M]));continue}let m=nt(c.value,t,p,r);if(ot.test(p)){let M=p.slice(2).toLowerCase();st.includes(M)&&t.delegatedEvents.add(M)}let u=En(p)?n.identifier(p):n.stringLiteral(p),h=c.value,y=n.isJSXElement(h)||n.isJSXFragment(h)||n.isJSXExpressionContainer(h)&&(n.isJSXElement(h.expression)||n.isJSXFragment(h.expression)),C=!r&&p===a,I=n.isJSXExpressionContainer(h)&&!n.isJSXEmptyExpression(h.expression)?h.expression:null,_=!r&&!!I&&ft(I,p);!r&&y||C||_?i.push(n.objectMethod("get",u,[],n.blockStatement([n.returnStatement(m)]))):i.push(n.objectProperty(u,m))}return l.length>0&&i.push(n.objectProperty(n.identifier("use"),n.arrayExpression(l))),{props:i,spreads:s}}function xn(e){return n.isJSXIdentifier(e)?e.name==="class"?"className":e.name:n.isJSXNamespacedName(e)?`${e.namespace.name}:${e.name.name}`:"unknown"}function nt(e,t,r="",o=!0){if(e===null)return n.booleanLiteral(!0);if(n.isStringLiteral(e))return e.value.includes(`
2
+ `)?n.stringLiteral(e.value.replace(/\s+/g," ").trim()):e;if(n.isJSXExpressionContainer(e)){if(n.isJSXEmptyExpression(e.expression))return n.booleanLiteral(!0);let i=e.expression;return o&&ft(i,r)?n.arrowFunctionExpression([],i):i}return n.isJSXElement(e)?Z(e,t,!1,t.autoShow??!0):n.isJSXFragment(e)?ce(e,t,{runtime:"automatic",pragmaFrag:"Fragment",development:!1}):n.booleanLiteral(!0)}function ft(e,t){return ot.test(t)||t.startsWith("on:")||t==="ref"||t.startsWith("use:")||n.isArrowFunctionExpression(e)||n.isFunctionExpression(e)||n.isIdentifier(e)||n.isStringLiteral(e)||n.isNumericLiteral(e)||n.isBooleanLiteral(e)||n.isNullLiteral(e)?!1:!!(n.isCallExpression(e)||n.isOptionalCallExpression(e)||n.isMemberExpression(e)||n.isOptionalMemberExpression(e)||n.isLogicalExpression(e)||n.isConditionalExpression(e)||n.isBinaryExpression(e)||n.isUnaryExpression(e)||n.isTemplateLiteral(e)||n.isObjectExpression(e)||n.isArrayExpression(e))}function Sn(e){let t=e.split(/\r\n|\n|\r/),r=0;for(let i=0;i<t.length;i++)/[^ \t]/.test(t[i])&&(r=i);let o="";for(let i=0;i<t.length;i++){let s=t[i].replace(/\t/g," ");i!==0&&(s=s.replace(/^ +/,"")),i!==t.length-1&&(s=s.replace(/ +$/,"")),s&&(i!==r&&(s+=" "),o+=s)}return o}function Re(e,t,r=!0){let o=[];for(let i of e)if(n.isJSXText(i)){let s=Sn(i.value);s&&o.push(n.stringLiteral(s))}else if(n.isJSXExpressionContainer(i)){if(!n.isJSXEmptyExpression(i.expression)){let s=i.expression;if(r){let a=vn(s,t)??bn(s,t);if(a){o.push(a);continue}}else{let a=yn(s,t);if(a){o.push(a);continue}}Cn(s)?o.push(n.arrowFunctionExpression([],s)):o.push(s)}}else n.isJSXElement(i)?o.push(Z(i,t,!1,t.autoShow??!0)):n.isJSXFragment(i)?o.push(ce(i,t,{runtime:"automatic",pragmaFrag:"Fragment",development:!1})):n.isJSXSpreadChild(i)&&o.push(i.expression);return o}function vn(e,t){if(!n.isArrowFunctionExpression(e)||e.params.length!==0||e.async)return null;let r=e.body;if(n.isLogicalExpression(r)&&r.operator==="&&"){let o=P(r.right);if(o)return G(F(r.left),o,null,t)}if(n.isConditionalExpression(r)){let o=P(r.consequent);if(o){let i=Ce(r.alternate,t);return G(F(r.test),o,i,t,!0)}}return null}function bn(e,t){if(n.isLogicalExpression(e)&&e.operator==="&&"){let r=P(e.right);if(r)return G(F(e.left),r,null,t)}if(n.isConditionalExpression(e)){let r=P(e.consequent);if(r){let o=Ce(e.alternate,t);return G(F(e.test),r,o,t)}}return null}function yn(e,t){let r=n.isArrowFunctionExpression(e)&&e.params.length===0&&!e.async&&n.isExpression(e.body)?e.body:e;if(n.isConditionalExpression(r)){let o=F(r.test),s=P(r.consequent)??r.consequent,l=P(r.alternate)??r.alternate,c=n.conditionalExpression(o,s,l);return be(r.consequent)||be(r.alternate)?null:(t.needsCreateMemo=!0,n.callExpression(n.identifier("createMemo"),[n.arrowFunctionExpression([],c)]))}if(n.isLogicalExpression(r)&&r.operator==="&&"){let o=F(r.left),s=P(r.right)??r.right,a=n.logicalExpression("&&",o,s);return be(r.right)?null:(t.needsCreateMemo=!0,n.callExpression(n.identifier("createMemo"),[n.arrowFunctionExpression([],a)]))}return null}function Ce(e,t){if(Rn(e))return null;let r=P(e);if(r)return mt(r,t);if(n.isConditionalExpression(e)){let o=e,i=P(o.consequent);if(i){let s=Ce(o.alternate,t);return G(F(o.test),i,s,t)}}return e}function rt(e){return n.isJSXElement(e)||n.isJSXFragment(e)}function be(e){let t=P(e);if(!t||!n.isJSXElement(t))return!1;let r=t.openingElement.name;return n.isJSXIdentifier(r)&&le.has(r.name)}function P(e){return rt(e)?e:n.isArrowFunctionExpression(e)&&e.params.length===0&&!e.async&&rt(e.body)?e.body:null}function F(e){return n.isArrowFunctionExpression(e)&&e.params.length===0&&!e.async&&n.isExpression(e.body)?e.body:e}function Rn(e){return n.isNullLiteral(e)||n.isIdentifier(e)&&e.name==="undefined"||n.isBooleanLiteral(e)&&e.value===!1}function mt(e,t){return n.isJSXElement(e)?Z(e,t,!1,t.autoShow??!0):ce(e,t,{runtime:"automatic",pragmaFrag:"Fragment",development:!1})}function G(e,t,r,o,i=!1){o.controlFlowComponents.add("Show"),o.needsControlFlowImport=!0;let s=mt(t,o),a=[n.objectProperty(n.identifier("when"),n.arrowFunctionExpression([],e)),n.objectProperty(n.identifier("children"),s)];return r&&a.push(n.objectProperty(n.identifier("fallback"),r)),lt(n.identifier("Show"),n.objectExpression(a),o)}function Cn(e){return n.isMemberExpression(e)||n.isOptionalMemberExpression(e)?!(!e.computed&&n.isIdentifier(e.property,{name:"children"})):n.isCallExpression(e)||n.isOptionalCallExpression(e)?!0:n.isIdentifier(e)?!1:!!(n.isLogicalExpression(e)||n.isConditionalExpression(e)||n.isBinaryExpression(e)||n.isUnaryExpression(e)||n.isTemplateLiteral(e))}function gt(e,t){let r=e.openingElement;if(!n.isJSXIdentifier(r.name))return!1;let o=r.name.name;if(o[0]!==o[0].toLowerCase())return!1;for(let i of r.attributes){if(n.isJSXSpreadAttribute(i))return!1;if(n.isJSXAttribute(i)){let s=i.value;if(n.isJSXExpressionContainer(s)&&!n.isStringLiteral(s.expression)&&!n.isNumericLiteral(s.expression))return!1}}for(let i of e.children)if(n.isJSXElement(i)&&!gt(i,t)||n.isJSXExpressionContainer(i))return!1;return!0}function In(e,t){let r=`_$static${t.staticCounter++}`,o=Z(e,t,!1);return t.staticElements.set(r,o),n.identifier(r)}function wn(e,t){let r=e.openingElement.name.name;return r==="Show"?kn(e,t):r==="For"?Nn(e,t):null}function kn(e,t){return null}function Nn(e,t){return null}var br=K;function yr(e){return[K,e]}function Ie(e={}){return{plugins:[[K,{runtime:"automatic",importSource:"@fluixi/jsx",development:!1,detectReactivity:!0,useLitHTML:!0,hoistStatics:!0,delegateEvents:!0,optimizeControlFlow:!0,sourceMaps:!0,...e}]]}}var Rr={production:Ie({development:!1,hoistStatics:!0,delegateEvents:!0,optimizeControlFlow:!0}),development:Ie({development:!0,hoistStatics:!1,sourceMaps:!0}),minimal:Ie({detectReactivity:!1,useLitHTML:!1,hoistStatics:!1,delegateEvents:!1,optimizeControlFlow:!1})};export{br as babelPluginReactiveJSX,yr as createPlugin,Ie as createPreset,K as default,Rr as presets};
@@ -0,0 +1 @@
1
+ var M=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(o,r)=>(typeof require<"u"?require:o)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var C=e=>"components"in e;function f(e,o){return e.replace(/\$(\d+)/g,(r,c)=>o[Number(c)]??r)}function x(e,o){return typeof o=="string"?{module:o,export:e}:o}function O(e=[]){let o=new Map,r=[],c=[];for(let n of e){if(!C(n)){c.push(n);continue}for(let[t,l]of Object.entries(n.components)){let i=x(t,l),p=o.get(t);if(p&&p.module!==i.module){let d=r.find(g=>g.name===t);d?d.modules.push(i.module):r.push({name:t,modules:[p.module,i.module]});continue}o.set(t,i)}}let s=new Map;return{resolve:n=>{if(s.has(n))return s.get(n);let t=o.get(n);if(!t)for(let l of c){let i=n.match(new RegExp(l.match.source,l.match.flags.replace("g","")));if(i){t={module:f(l.module,i),export:l.export?f(l.export,i):n};break}}return s.set(n,t),t},names:()=>[...o.keys()],conflicts:()=>r}}var m=["Show","For","Index","Switch","Match","Portal","Dynamic","ErrorBoundary"],a=["Suspense","SuspenseList","Await"],R=["Router","Outlet","Redirect","Link"],E=[...m,...a,...R],N=new Set([...m,...a]);function S(e={}){let{controlFlowModule:o="@fluixi/dom",coreModule:r="@fluixi/core",routerModule:c="@fluixi/core/router-next"}=e,s={};for(let u of m)s[u]=o;for(let u of a)s[u]=r;for(let u of R)s[u]=c;return s}export{M as a,O as b,m as c,a as d,R as e,N as f,S as g};
@@ -1 +1 @@
1
- "use strict";var r=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var c=(o,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of m(t))!s.call(o,e)&&e!==i&&r(o,e,{get:()=>t[e],enumerable:!(n=p(t,e))||n.enumerable});return o};var a=o=>c(r({},"__esModule",{value:!0}),o);var d={};module.exports=a(d);
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);
@@ -6,6 +6,20 @@ export interface CodegenResult {
6
6
  map?: unknown;
7
7
  /** runtime symbols this output imports (subset of the backend's contract) */
8
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;
9
23
  }
10
24
  /**
11
25
  * A codegen backend turns IR into runtime calls. This is the swap point: the
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/codegen/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6EAA6E;IAC7E,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC;CAC7D"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/codegen/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6EAA6E;IAC7E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC;CAC7D"}
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var C=(e,t)=>{for(var r in t)l(e,r,{get:t[r],enumerable:!0})},N=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $(t))!h.call(e,o)&&o!==r&&l(e,o,{get:()=>t[o],enumerable:!(n=f(t,o))||n.enumerable});return e};var R=e=>N(l({},"__esModule",{value:!0}),e);var O={};C(O,{imperativeBackend:()=>k});module.exports=R(O);var m={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},T={version:2,module:"@fluixi/dom",symbols:[...m.symbols,"template","cloneTemplate","walk"]};var y={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function x(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function g(e){return x(e)?e:JSON.stringify(e)}function v(e){return e.expr!==void 0?e.reactive?`() => (${e.expr})`:`(${e.expr})`:JSON.stringify(e.literal??!0)}function I(e){return e.expr!==void 0?`(${e.expr})`:JSON.stringify(e.literal??!0)}function S(e,t,r){let n=e.filter(i=>i.kind==="spread"),c=e.filter(i=>i.kind!=="spread").map(i=>`${g(i.name)}: ${v(i)}`);t!=null&&c.push(`children: ${t}`);let s=`{ ${c.join(", ")} }`;return n.length>0?(r.add("mergeProps"),`mergeProps(${n.map(i=>i.expr).join(", ")}, ${s})`):s}function d(e,t){return e.length===1?p(e[0],t):`[${e.map(r=>p(r,t)).join(", ")}]`}function u(e,t,r,n){n.add("createMemo"),n.add("createComponent");let o=t.filter(a=>a.kind==="spread"),s=t.filter(a=>a.kind!=="spread").map(a=>`get ${g(a.name)}() { return ${I(a)}; }`);r.length>0&&s.push(`get children() { return ${d(r,n)}; }`);let i=`{ ${s.join(", ")} }`;return o.length>0&&(n.add("mergeProps"),i=`mergeProps(${o.map(a=>a.expr).join(", ")}, ${i})`),`createMemo(() => createComponent(${e}, ${i}))`}function p(e,t){switch(e.kind){case"text":return JSON.stringify(e.value);case"expr":return e.reactive?`() => (${e.code})`:`(${e.code})`;case"fragment":return e.children.length===0?"null":d(e.children,t);case"component":return u(e.name,e.props,e.children,t);case"control":{let r=y[e.control]??e.control;return t.add(r),u(r,e.props,e.children,t)}case"element":{t.add("createNativeElement");let r=JSON.stringify(e.tag),n="_el$",o=[],c=e.svg?`${r}, true`:r;if(o.push(`const ${n} = createNativeElement(${c});`),e.props.length>0){t.add("spread");let s=e.svg?", isSVG: true":"";o.push(`spread({ element: ${n}, props: ${S(e.props,null,t)}${s} });`)}for(let s of e.children){t.add("insert");let i=p(s,t),a=s.kind==="expr"&&s.reactive||s.kind==="component"||s.kind==="control";o.push(a?`insert(${n}, ${i}, null);`:`insert(${n}, ${i});`)}return o.push(`return ${n};`),`(() => { ${o.join(" ")} })()`}}}var k={name:"imperative",contract:m,emit(e,t){let r=new Set;return{code:p(e,r),imports:Array.from(r)}}};
1
+ "use strict";var $=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var J=(e,t)=>{for(var r in t)$(e,r,{get:t[r],enumerable:!0})},H=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of L(t))!z.call(e,o)&&o!==r&&$(e,o,{get:()=>t[o],enumerable:!(i=M(t,o))||i.enumerable});return e};var V=e=>H($({},"__esModule",{value:!0}),e);var ae={};J(ae,{imperativeBackend:()=>se,inlineTemplates:()=>oe});module.exports=V(ae);var B=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),k={className:"class",htmlFor:"for"},F=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),W=new Set(["script","style","textarea","title"]);function R(e){return W.has(e)}function y(e){return k[e]??e}function p(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!F.has(e.name)}function x(e){if(!e.static||R(e.tag))return!1;for(let t of e.props)if(!p(t))return!1;for(let t of e.children)if(t.kind!=="text"&&!(t.kind==="element"&&x(t)))return!1;return!0}function m(e){let t=e.props.map(U).filter(Boolean).join(""),r=`<${e.tag}${t}>`;return B.has(e.tag)?r:`${r}${e.children.map(D).join("")}</${e.tag}>`}function D(e){if(e.kind==="text")return Z(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return m(e)}function U(e){let t=k[e.name]??e.name,r=e.literal;return r===!0||r===void 0?` ${t}`:r===!1||r===null?"":` ${t}="${Y(String(r))}"`}function Y(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Z(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var q="<!--fx-->",G="<!--fx/-->";function h(e){return e.kind==="expr"||e.kind==="component"||e.kind==="control"}function K(e){return e.kind==="text"||e.kind==="element"&&v(e)}function v(e){return e.svg||R(e.tag)||!e.props.every(t=>p(t))?!1:e.children.every(t=>K(t)||h(t))}function d(e){if(h(e))return!0;let t=e.children;return t?t.some(d):!1}function C(e){for(let t=0;t<e.children.length;t++){let r=e.children[t];if(r.kind==="text"&&(r.value===""||e.children[t+1]?.kind==="text"))return!1}return e.children.every(t=>t.kind!=="element"||C(t))}function b(e){if(!v(e)||!C(e)||!e.children.some(d))return null;let t=[],r=[],i=0,o=f=>{let n=`_n$${i++}`;return t.push({ref:n,expr:f}),n};return a(e,"_el$"),{html:X(e),tag:e.tag,steps:t,holes:r};function a(f,n){let c=-1;f.children.forEach((l,u)=>{d(l)&&(c=u)});let s=null;for(let l=0;l<=c;l++){let u=f.children[l],S=s?`${s}.nextSibling`:`${n}.firstChild`;if(h(u)){let T=o(S),E=o(`holeEnd(${T})`);r.push({parentRef:n,startRef:T,endRef:E,node:u}),s=E;continue}let I=o(S);u.kind==="element"&&d(u)&&a(u,I),s=I}}}function X(e){return m(P(e)).split(O).join(q+G)}function P(e){return{...e,children:e.children.map(t=>h(t)?{kind:"text",value:O}:t.kind==="element"?P(t):t)}}var O="\0fx-hole\0";var N={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},pe={version:2,module:"@fluixi/dom",symbols:[...N.symbols,"template","cloneTemplate","walk"]};var Q={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function ee(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function A(e){return ee(e)?e:JSON.stringify(e)}function te(e){return e.expr!==void 0?e.reactive?`() => (${e.expr})`:`(${e.expr})`:JSON.stringify(e.literal??!0)}function re(e){return e.expr!==void 0?`(${e.expr})`:JSON.stringify(e.literal??!0)}function ne(e,t,r){let i=e.filter(n=>n.kind==="spread"),a=e.filter(n=>n.kind!=="spread").map(n=>`${A(n.name)}: ${te(n)}`);t!=null&&a.push(`children: ${t}`);let f=`{ ${a.join(", ")} }`;return i.length>0?(r.add("mergeProps"),`mergeProps(${i.map(n=>n.expr).join(", ")}, ${f})`):f}function w(e,t,r){return e.length===1?g(e[0],t,r):`[${e.map(i=>g(i,t,r)).join(", ")}]`}function _(e,t,r,i,o){i.add("createMemo"),i.add("createComponent");let a=t.filter(s=>s.kind==="spread"),n=t.filter(s=>s.kind!=="spread").map(s=>`get ${A(s.name)}() { return ${re(s)}; }`);r.length>0&&n.push(`get children() { return ${w(r,i,o)}; }`);let c=`{ ${n.join(", ")} }`;return a.length>0&&(i.add("mergeProps"),c=`mergeProps(${a.map(s=>s.expr).join(", ")}, ${c})`),`createMemo(() => createComponent(${e}, ${c}))`}function ie(e,t){let r=y(t.name),i=t.literal;return i===!0||i===void 0?`${e}.setAttribute(${JSON.stringify(r)}, "");`:i===!1||i===null?"":`${e}.setAttribute(${JSON.stringify(r)}, ${JSON.stringify(String(i))});`}var j=!1;function g(e,t,r){switch(e.kind){case"text":return JSON.stringify(e.value);case"expr":return e.reactive?`() => (${e.code})`:`(${e.code})`;case"fragment":return e.children.length===0?"null":w(e.children,t,r);case"component":return _(e.name,e.props,e.children,t,r);case"control":{let i=Q[e.control]??e.control;return t.add(i),_(i,e.props,e.children,t,r)}case"element":{if(r&&e.static&&!e.svg&&x(e)){t.add("templateNode");let n=`_tmpl$${r.length}`;return r.push({id:n,html:m(e),tag:e.tag,svg:!1}),`templateNode(${n}, ${JSON.stringify(e.tag)})`}if(r&&j){let n=b(e);if(n){t.add("templateNode"),t.add("insert"),t.add("holeEnd"),t.add("holeContent"),t.add("holeScope");let c=`_tmpl$${r.length}`;r.push({id:c,html:n.html,tag:n.tag,svg:!1});let s=[`const _el$ = templateNode(${c}, ${JSON.stringify(n.tag)}, true);`];for(let l of n.steps)s.push(`const ${l.ref} = ${l.expr};`);for(let l of n.holes)s.push(`insert(${l.parentRef}, holeScope(${l.startRef}, () => (${g(l.node,t,r)})), ${l.endRef}, holeContent(${l.startRef}, ${l.endRef}));`);return s.push("return _el$;"),`(() => { ${s.join(" ")} })()`}}t.add("createNativeElement");let i=JSON.stringify(e.tag),o="_el$",a=[],f=e.svg?`${i}, true`:i;if(a.push(`const ${o} = createNativeElement(${f});`),e.props.length>0)if(!e.svg&&e.props.every(p))for(let n of e.props)a.push(ie(o,n));else{t.add("spread");let n=e.svg?", isSVG: true":"";a.push(`spread({ element: ${o}, props: ${ne(e.props,null,t)}${n} });`)}for(let n of e.children){t.add("insert");let c=g(n,t,r),s=n.kind==="expr"&&n.reactive||n.kind==="component"||n.kind==="control";a.push(s?`insert(${o}, ${c}, null);`:`insert(${o}, ${c});`)}return a.push(`return ${o};`),`(() => { ${a.join(" ")} })()`}}}function oe(e,t){if(!t||t.length===0)return e;let r=new Map(t.map(i=>[i.id,JSON.stringify(i.html)]));return e.replace(/_tmpl\$\d+/g,i=>r.get(i)??i)}var se={name:"imperative",contract:N,emit(e,t){let r=new Set,i=t?.templateClone!==!1?[]:void 0;return j=t?.partialTemplates===!0,{code:g(e,r,i),imports:Array.from(r),templates:i}}};
@@ -1,3 +1,12 @@
1
- import type { CodegenBackend } from '../backend.js';
1
+ import type { CodegenBackend, StaticTemplate } from '../backend.js';
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;
2
11
  export declare const imperativeBackend: CodegenBackend;
3
12
  //# sourceMappingURL=imperative.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"imperative.d.ts","sourceRoot":"","sources":["../../../src/codegen/backends/imperative.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,eAAe,CAAC;AAkKnE,eAAO,MAAM,iBAAiB,EAAE,cAQ/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;AAgQnF;;;;;;;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,3 +1,5 @@
1
+ import { planPartialTemplate } from '../partial-template.js';
2
+ import { isSerializable, serializeStatic, isPlainLiteralAttr, htmlAttrName, } from '../serialize-static.js';
1
3
  import { RUNTIME_CONTRACT_V1 } from '../contract.js';
2
4
  /**
3
5
  * Imperative fine-grained backend — emits createNativeElement/insert/spread/
@@ -65,12 +67,12 @@ function emitProps(props, childrenExpr, used) {
65
67
  }
66
68
  return obj;
67
69
  }
68
- function emitChildren(children, used) {
70
+ function emitChildren(children, used, templates) {
69
71
  if (children.length === 1)
70
- return emitNode(children[0], used);
71
- return `[${children.map((c) => emitNode(c, used)).join(', ')}]`;
72
+ return emitNode(children[0], used, templates);
73
+ return `[${children.map((c) => emitNode(c, used, templates)).join(', ')}]`;
72
74
  }
73
- function emitComponent(name, props, children, used) {
75
+ function emitComponent(name, props, children, used, templates) {
74
76
  used.add('createMemo');
75
77
  used.add('createComponent');
76
78
  const spreads = props.filter((p) => p.kind === 'spread');
@@ -86,16 +88,48 @@ function emitComponent(name, props, children, used) {
86
88
  // child components are created in the component's owner scope (preserves owner
87
89
  // nesting for context/Suspense), after the component runs (correct provider
88
90
  // ordering), and lazily (ErrorBoundary can still catch a throwing child).
89
- entries.push(`get children() { return ${emitChildren(children, used)}; }`);
91
+ entries.push(`get children() { return ${emitChildren(children, used, templates)}; }`);
90
92
  }
91
93
  let obj = `{ ${entries.join(', ')} }`;
92
94
  if (spreads.length > 0) {
93
95
  used.add('mergeProps');
94
96
  obj = `mergeProps(${spreads.map((s) => s.expr).join(', ')}, ${obj})`;
95
97
  }
98
+ // The memo never recomputes — every prop is a getter, so this callback reads nothing
99
+ // reactive. It is here for what it makes `insert` do, and it cannot be elided.
100
+ //
101
+ // A component whose return value is *itself* bare control flow (`return <Show …/>`)
102
+ // produces a memo, which `createComponent` deliberately does not stamp as a component.
103
+ // Without this wrapper `insert` stops re-reading it, and the subtree goes stale when a
104
+ // sibling updates the context it depends on — see `show-context-insert.spec.ts`.
105
+ //
106
+ // Static props are not a sufficient condition for dropping it either: safety depends on
107
+ // what the callee *returns*, which lives in another module and is not visible here.
108
+ //
109
+ // Nor can it be a plain `() => createComponent(...)` thunk. The memo also provides
110
+ // *identity*: it runs once and caches. A thunk is re-invoked by insert's render effect
111
+ // on every run, rebuilding the component with a fresh owner — which loses context,
112
+ // duplicates the tree on hydration and piles up Portals. Measured: dropping the wrapper
113
+ // fails 3 tests, replacing it with a thunk fails 14.
114
+ //
115
+ // Control flow does use a bare arrow, and that is not a counter-example: control flow
116
+ // is the reactive boundary and is *meant* to re-run. A user component is meant to run
117
+ // once.
96
118
  return `createMemo(() => createComponent(${name}, ${obj}))`;
97
119
  }
98
- function emitNode(node, used) {
120
+ /** `el.setAttribute("class", "card")` for a compile-time constant. */
121
+ function staticAttrAssignment(el, prop) {
122
+ const name = htmlAttrName(prop.name);
123
+ const value = prop.literal;
124
+ // A valueless attribute is `true` in the IR and the empty string in the DOM.
125
+ if (value === true || value === undefined)
126
+ return `${el}.setAttribute(${JSON.stringify(name)}, "");`;
127
+ if (value === false || value === null)
128
+ return '';
129
+ return `${el}.setAttribute(${JSON.stringify(name)}, ${JSON.stringify(String(value))});`;
130
+ }
131
+ let partial = false;
132
+ function emitNode(node, used, templates) {
99
133
  switch (node.kind) {
100
134
  case 'text':
101
135
  return JSON.stringify(node.value);
@@ -104,15 +138,59 @@ function emitNode(node, used) {
104
138
  case 'fragment':
105
139
  if (node.children.length === 0)
106
140
  return 'null';
107
- return emitChildren(node.children, used);
141
+ return emitChildren(node.children, used, templates);
108
142
  case 'component':
109
- return emitComponent(node.name, node.props, node.children, used);
143
+ return emitComponent(node.name, node.props, node.children, used, templates);
110
144
  case 'control': {
111
145
  const name = CONTROL_COMPONENT[node.control] ?? node.control;
112
146
  used.add(name);
113
- return emitComponent(name, node.props, node.children, used);
147
+ return emitComponent(name, node.props, node.children, used, templates);
114
148
  }
115
149
  case 'element': {
150
+ // A static subtree is parsed once into a <template> and cloned per instance:
151
+ // one cloneNode instead of an createNativeElement + spread per element.
152
+ // SVG is excluded: the runtime wraps SVG template HTML in an <svg> host and
153
+ // `cloneTemplate(t, true)` returns that wrapper, not the serialized element, so
154
+ // cloning would hand back the wrong node. Correctness first — SVG keeps the
155
+ // imperative path until the runtime grows an unwrapping clone.
156
+ if (templates && node.static && !node.svg && isSerializable(node)) {
157
+ used.add('templateNode');
158
+ const id = `_tmpl$${templates.length}`;
159
+ templates.push({ id, html: serializeStatic(node), tag: node.tag, svg: false });
160
+ return `templateNode(${id}, ${JSON.stringify(node.tag)})`;
161
+ }
162
+ // Structure static, contents dynamic — the common shape. One template for the
163
+ // structure, then each hole filled through a reference into the clone. Every
164
+ // reference is read before any insertion, since inserting shifts later positions.
165
+ if (templates && partial) {
166
+ const plan = planPartialTemplate(node);
167
+ if (plan) {
168
+ used.add('templateNode');
169
+ used.add('insert');
170
+ used.add('holeEnd');
171
+ used.add('holeContent');
172
+ used.add('holeScope');
173
+ const id = `_tmpl$${templates.length}`;
174
+ templates.push({ id, html: plan.html, tag: plan.tag, svg: false });
175
+ const lines = [`const _el$ = templateNode(${id}, ${JSON.stringify(plan.tag)}, true);`];
176
+ // Every reference first: inserting shifts what follows, so the walk has to be
177
+ // complete before any content goes in.
178
+ for (const step of plan.steps)
179
+ lines.push(`const ${step.ref} = ${step.expr};`);
180
+ for (const hole of plan.holes) {
181
+ // The fourth argument is what the hole already holds — nothing on a fresh
182
+ // clone, the server's content when hydrating. `insert` reconciles against it,
183
+ // so hydration reuses those nodes rather than building new ones.
184
+ // `holeScope` places the hydration cursor at what the server rendered for
185
+ // this hole, so anything the content builds internally adopts too.
186
+ lines.push(`insert(${hole.parentRef}, holeScope(${hole.startRef}, () => ` +
187
+ `(${emitNode(hole.node, used, templates)})), ` +
188
+ `${hole.endRef}, holeContent(${hole.startRef}, ${hole.endRef}));`);
189
+ }
190
+ lines.push('return _el$;');
191
+ return `(() => { ${lines.join(' ')} })()`;
192
+ }
193
+ }
116
194
  used.add('createNativeElement');
117
195
  const tag = JSON.stringify(node.tag);
118
196
  const el = '_el$';
@@ -120,9 +198,19 @@ function emitNode(node, used) {
120
198
  const createArgs = node.svg ? `${tag}, true` : tag;
121
199
  parts.push(`const ${el} = createNativeElement(${createArgs});`);
122
200
  if (node.props.length > 0) {
123
- used.add('spread');
124
- const svgFlag = node.svg ? ', isSVG: true' : '';
125
- parts.push(`spread({ element: ${el}, props: ${emitProps(node.props, null, used)}${svgFlag} });`);
201
+ // Literal attributes are written straight on. `spread` is a generic helper that
202
+ // walks every prop checking for reactivity, events, refs, class/style objects and
203
+ // namespaces none of which a compile-time constant needs. Same predicate the
204
+ // template serializer uses, so the two agree on what a plain attribute is.
205
+ if (!node.svg && node.props.every(isPlainLiteralAttr)) {
206
+ for (const p of node.props)
207
+ parts.push(staticAttrAssignment(el, p));
208
+ }
209
+ else {
210
+ used.add('spread');
211
+ const svgFlag = node.svg ? ', isSVG: true' : '';
212
+ parts.push(`spread({ element: ${el}, props: ${emitProps(node.props, null, used)}${svgFlag} });`);
213
+ }
126
214
  }
127
215
  // Insert each child individually (like the jsx runtime's applyProps), so a
128
216
  // reactive/component child that isn't the only child still gets its own
@@ -130,7 +218,7 @@ function emitNode(node, used) {
130
218
  // elements sitting inside the array.
131
219
  for (const child of node.children) {
132
220
  used.add('insert');
133
- const childCode = emitNode(child, used);
221
+ const childCode = emitNode(child, used, templates);
134
222
  const isFn = (child.kind === 'expr' && child.reactive) ||
135
223
  child.kind === 'component' ||
136
224
  child.kind === 'control';
@@ -141,12 +229,35 @@ function emitNode(node, used) {
141
229
  }
142
230
  }
143
231
  }
232
+ /**
233
+ * Substitute template declarations into the code as inline `createTemplate` calls.
234
+ *
235
+ * For hosts that cannot hoist — nested JSX lowered inside an expression, where there is
236
+ * no module scope to reach. `createTemplate` caches by HTML string, so this costs a Map
237
+ * lookup per instantiation rather than a re-parse, and is still far cheaper than
238
+ * building the subtree element by element.
239
+ */
240
+ export function inlineTemplates(code, templates) {
241
+ if (!templates || templates.length === 0)
242
+ return code;
243
+ const byId = new Map(templates.map((t) => [t.id, JSON.stringify(t.html)]));
244
+ // Single pass, for the same reason `adoptTemplates` needs one.
245
+ return code.replace(/_tmpl\$\d+/g, (id) => byId.get(id) ?? id);
246
+ }
144
247
  export const imperativeBackend = {
145
248
  name: 'imperative',
146
249
  contract: RUNTIME_CONTRACT_V1,
147
- emit(node, _options) {
250
+ emit(node, options) {
148
251
  const used = new Set();
149
- const code = emitNode(node, used);
150
- return { code, imports: Array.from(used) };
252
+ // Off by default: `createTemplate` builds real DOM nodes, so on the server they
253
+ // land in a ServerElement tree and clash, and during hydration a clone creates a
254
+ // fresh node where the existing one must be adopted. Both need runtime support
255
+ // that does not exist yet, so the client-only win stays opt-in until it does.
256
+ const templates = options?.templateClone !== false
257
+ ? []
258
+ : undefined;
259
+ partial = options?.partialTemplates === true;
260
+ const code = emitNode(node, used, templates);
261
+ return { code, imports: Array.from(used), templates };
151
262
  },
152
263
  };
@@ -1 +1 @@
1
- var l={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},N={version:2,module:"@fluixi/dom",symbols:[...l.symbols,"template","cloneTemplate","walk"]};var d={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function f(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function u(e){return f(e)?e:JSON.stringify(e)}function $(e){return e.expr!==void 0?e.reactive?`() => (${e.expr})`:`(${e.expr})`:JSON.stringify(e.literal??!0)}function h(e){return e.expr!==void 0?`(${e.expr})`:JSON.stringify(e.literal??!0)}function C(e,t,r){let o=e.filter(n=>n.kind==="spread"),c=e.filter(n=>n.kind!=="spread").map(n=>`${u(n.name)}: ${$(n)}`);t!=null&&c.push(`children: ${t}`);let i=`{ ${c.join(", ")} }`;return o.length>0?(r.add("mergeProps"),`mergeProps(${o.map(n=>n.expr).join(", ")}, ${i})`):i}function g(e,t){return e.length===1?p(e[0],t):`[${e.map(r=>p(r,t)).join(", ")}]`}function m(e,t,r,o){o.add("createMemo"),o.add("createComponent");let a=t.filter(s=>s.kind==="spread"),i=t.filter(s=>s.kind!=="spread").map(s=>`get ${u(s.name)}() { return ${h(s)}; }`);r.length>0&&i.push(`get children() { return ${g(r,o)}; }`);let n=`{ ${i.join(", ")} }`;return a.length>0&&(o.add("mergeProps"),n=`mergeProps(${a.map(s=>s.expr).join(", ")}, ${n})`),`createMemo(() => createComponent(${e}, ${n}))`}function p(e,t){switch(e.kind){case"text":return JSON.stringify(e.value);case"expr":return e.reactive?`() => (${e.code})`:`(${e.code})`;case"fragment":return e.children.length===0?"null":g(e.children,t);case"component":return m(e.name,e.props,e.children,t);case"control":{let r=d[e.control]??e.control;return t.add(r),m(r,e.props,e.children,t)}case"element":{t.add("createNativeElement");let r=JSON.stringify(e.tag),o="_el$",a=[],c=e.svg?`${r}, true`:r;if(a.push(`const ${o} = createNativeElement(${c});`),e.props.length>0){t.add("spread");let i=e.svg?", isSVG: true":"";a.push(`spread({ element: ${o}, props: ${C(e.props,null,t)}${i} });`)}for(let i of e.children){t.add("insert");let n=p(i,t),s=i.kind==="expr"&&i.reactive||i.kind==="component"||i.kind==="control";a.push(s?`insert(${o}, ${n}, null);`:`insert(${o}, ${n});`)}return a.push(`return ${o};`),`(() => { ${a.join(" ")} })()`}}}var x={name:"imperative",contract:l,emit(e,t){let r=new Set;return{code:p(e,r),imports:Array.from(r)}}};export{x as imperativeBackend};
1
+ var j=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),E={className:"class",htmlFor:"for"},M=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),L=new Set(["script","style","textarea","title"]);function $(e){return L.has(e)}function k(e){return E[e]??e}function p(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!M.has(e.name)}function R(e){if(!e.static||$(e.tag))return!1;for(let t of e.props)if(!p(t))return!1;for(let t of e.children)if(t.kind!=="text"&&!(t.kind==="element"&&R(t)))return!1;return!0}function m(e){let t=e.props.map(J).filter(Boolean).join(""),r=`<${e.tag}${t}>`;return j.has(e.tag)?r:`${r}${e.children.map(z).join("")}</${e.tag}>`}function z(e){if(e.kind==="text")return V(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return m(e)}function J(e){let t=E[e.name]??e.name,r=e.literal;return r===!0||r===void 0?` ${t}`:r===!1||r===null?"":` ${t}="${H(String(r))}"`}function H(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function V(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var B="<!--fx-->",F="<!--fx/-->";function h(e){return e.kind==="expr"||e.kind==="component"||e.kind==="control"}function W(e){return e.kind==="text"||e.kind==="element"&&y(e)}function y(e){return e.svg||$(e.tag)||!e.props.every(t=>p(t))?!1:e.children.every(t=>W(t)||h(t))}function d(e){if(h(e))return!0;let t=e.children;return t?t.some(d):!1}function v(e){for(let t=0;t<e.children.length;t++){let r=e.children[t];if(r.kind==="text"&&(r.value===""||e.children[t+1]?.kind==="text"))return!1}return e.children.every(t=>t.kind!=="element"||v(t))}function C(e){if(!y(e)||!v(e)||!e.children.some(d))return null;let t=[],r=[],i=0,l=f=>{let n=`_n$${i++}`;return t.push({ref:n,expr:f}),n};return s(e,"_el$"),{html:D(e),tag:e.tag,steps:t,holes:r};function s(f,n){let c=-1;f.children.forEach((a,u)=>{d(a)&&(c=u)});let o=null;for(let a=0;a<=c;a++){let u=f.children[a],N=o?`${o}.nextSibling`:`${n}.firstChild`;if(h(u)){let I=l(N),T=l(`holeEnd(${I})`);r.push({parentRef:n,startRef:I,endRef:T,node:u}),o=T;continue}let S=l(N);u.kind==="element"&&d(u)&&s(u,S),o=S}}}function D(e){return m(b(e)).split(P).join(B+F)}function b(e){return{...e,children:e.children.map(t=>h(t)?{kind:"text",value:P}:t.kind==="element"?b(t):t)}}var P="\0fx-hole\0";var x={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},te={version:2,module:"@fluixi/dom",symbols:[...x.symbols,"template","cloneTemplate","walk"]};var U={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function Y(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function _(e){return Y(e)?e:JSON.stringify(e)}function Z(e){return e.expr!==void 0?e.reactive?`() => (${e.expr})`:`(${e.expr})`:JSON.stringify(e.literal??!0)}function q(e){return e.expr!==void 0?`(${e.expr})`:JSON.stringify(e.literal??!0)}function G(e,t,r){let i=e.filter(n=>n.kind==="spread"),s=e.filter(n=>n.kind!=="spread").map(n=>`${_(n.name)}: ${Z(n)}`);t!=null&&s.push(`children: ${t}`);let f=`{ ${s.join(", ")} }`;return i.length>0?(r.add("mergeProps"),`mergeProps(${i.map(n=>n.expr).join(", ")}, ${f})`):f}function A(e,t,r){return e.length===1?g(e[0],t,r):`[${e.map(i=>g(i,t,r)).join(", ")}]`}function O(e,t,r,i,l){i.add("createMemo"),i.add("createComponent");let s=t.filter(o=>o.kind==="spread"),n=t.filter(o=>o.kind!=="spread").map(o=>`get ${_(o.name)}() { return ${q(o)}; }`);r.length>0&&n.push(`get children() { return ${A(r,i,l)}; }`);let c=`{ ${n.join(", ")} }`;return s.length>0&&(i.add("mergeProps"),c=`mergeProps(${s.map(o=>o.expr).join(", ")}, ${c})`),`createMemo(() => createComponent(${e}, ${c}))`}function K(e,t){let r=k(t.name),i=t.literal;return i===!0||i===void 0?`${e}.setAttribute(${JSON.stringify(r)}, "");`:i===!1||i===null?"":`${e}.setAttribute(${JSON.stringify(r)}, ${JSON.stringify(String(i))});`}var w=!1;function g(e,t,r){switch(e.kind){case"text":return JSON.stringify(e.value);case"expr":return e.reactive?`() => (${e.code})`:`(${e.code})`;case"fragment":return e.children.length===0?"null":A(e.children,t,r);case"component":return O(e.name,e.props,e.children,t,r);case"control":{let i=U[e.control]??e.control;return t.add(i),O(i,e.props,e.children,t,r)}case"element":{if(r&&e.static&&!e.svg&&R(e)){t.add("templateNode");let n=`_tmpl$${r.length}`;return r.push({id:n,html:m(e),tag:e.tag,svg:!1}),`templateNode(${n}, ${JSON.stringify(e.tag)})`}if(r&&w){let n=C(e);if(n){t.add("templateNode"),t.add("insert"),t.add("holeEnd"),t.add("holeContent"),t.add("holeScope");let c=`_tmpl$${r.length}`;r.push({id:c,html:n.html,tag:n.tag,svg:!1});let o=[`const _el$ = templateNode(${c}, ${JSON.stringify(n.tag)}, true);`];for(let a of n.steps)o.push(`const ${a.ref} = ${a.expr};`);for(let a of n.holes)o.push(`insert(${a.parentRef}, holeScope(${a.startRef}, () => (${g(a.node,t,r)})), ${a.endRef}, holeContent(${a.startRef}, ${a.endRef}));`);return o.push("return _el$;"),`(() => { ${o.join(" ")} })()`}}t.add("createNativeElement");let i=JSON.stringify(e.tag),l="_el$",s=[],f=e.svg?`${i}, true`:i;if(s.push(`const ${l} = createNativeElement(${f});`),e.props.length>0)if(!e.svg&&e.props.every(p))for(let n of e.props)s.push(K(l,n));else{t.add("spread");let n=e.svg?", isSVG: true":"";s.push(`spread({ element: ${l}, props: ${G(e.props,null,t)}${n} });`)}for(let n of e.children){t.add("insert");let c=g(n,t,r),o=n.kind==="expr"&&n.reactive||n.kind==="component"||n.kind==="control";s.push(o?`insert(${l}, ${c}, null);`:`insert(${l}, ${c});`)}return s.push(`return ${l};`),`(() => { ${s.join(" ")} })()`}}}function se(e,t){if(!t||t.length===0)return e;let r=new Map(t.map(i=>[i.id,JSON.stringify(i.html)]));return e.replace(/_tmpl\$\d+/g,i=>r.get(i)??i)}var ae={name:"imperative",contract:x,emit(e,t){let r=new Set,i=t?.templateClone!==!1?[]:void 0;return w=t?.partialTemplates===!0,{code:g(e,r,i),imports:Array.from(r),templates:i}}};export{ae as imperativeBackend,se as inlineTemplates};
@@ -0,0 +1 @@
1
+ "use strict";var p=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var H=(e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})},_=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of L(t))!w.call(e,r)&&r!==n&&p(e,r,{get:()=>t[r],enumerable:!(s=v(t,r))||s.enumerable});return e};var z=e=>_(p({},"__esModule",{value:!0}),e);var B={};H(B,{HOLE_END:()=>N,HOLE_START:()=>T,planPartialTemplate:()=>Y});module.exports=z(B);var A=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),M={className:"class",htmlFor:"for"},y=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),C=new Set(["script","style","textarea","title"]);function I(e){return C.has(e)}function k(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!y.has(e.name)}function m(e){let t=e.props.map(O).filter(Boolean).join(""),n=`<${e.tag}${t}>`;return A.has(e.tag)?n:`${n}${e.children.map(j).join("")}</${e.tag}>`}function j(e){if(e.kind==="text")return D(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return m(e)}function O(e){let t=M[e.name]??e.name,n=e.literal;return n===!0||n===void 0?` ${t}`:n===!1||n===null?"":` ${t}="${W(String(n))}"`}function W(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function D(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var T="<!--fx-->",N="<!--fx/-->";function c(e){return e.kind==="expr"||e.kind==="component"||e.kind==="control"}function V(e){return e.kind==="text"||e.kind==="element"&&S(e)}function S(e){return e.svg||I(e.tag)||!e.props.every(t=>k(t))?!1:e.children.every(t=>V(t)||c(t))}function u(e){if(c(e))return!0;let t=e.children;return t?t.some(u):!1}function b(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"||b(t))}function Y(e){if(!S(e)||!b(e)||!e.children.some(u))return null;let t=[],n=[],s=0,r=o=>{let l=`_n$${s++}`;return t.push({ref:l,expr:o}),l};return d(e,"_el$"),{html:q(e),tag:e.tag,steps:t,holes:n};function d(o,l){let g=-1;o.children.forEach((a,i)=>{u(a)&&(g=i)});let f=null;for(let a=0;a<=g;a++){let i=o.children[a],R=f?`${f}.nextSibling`:`${l}.firstChild`;if(c(i)){let x=r(R),E=r(`holeEnd(${x})`);n.push({parentRef:l,startRef:x,endRef:E,node:i}),f=E;continue}let h=r(R);i.kind==="element"&&u(i)&&d(i,h),f=h}}}function q(e){return m($(e)).split(P).join(T+N)}function $(e){return{...e,children:e.children.map(t=>c(t)?{kind:"text",value:P}:t.kind==="element"?$(t):t)}}var P="\0fx-hole\0";
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Cloning a subtree whose *structure* is static but which contains dynamic holes.
3
+ *
4
+ * The fully-static case is easy: serialize, clone, done. The common case is not static —
5
+ * a card wrapper with one reactive value inside — and a single hole used to send the
6
+ * whole subtree back to being built an element at a time. This plans the middle ground:
7
+ * the structure becomes one template, and each hole is filled through a reference into
8
+ * the cloned tree.
9
+ *
10
+ * Three things make it correct in all three environments — fresh client render, server
11
+ * render, and hydration:
12
+ *
13
+ * - **Each hole is bracketed by a marker pair.** A hole's content is then, by
14
+ * definition, the nodes between its own two markers. That is what lets hydration
15
+ * *adopt* what the server rendered rather than rebuild it, with no dependence on where
16
+ * a hydration cursor happens to be.
17
+ * - **The walk is sequential, not positional.** Index arithmetic against the template
18
+ * only describes a fresh clone: the server's DOM has the rendered content sitting
19
+ * between the markers, so every position after a hole is shifted. Each node is reached
20
+ * from the previous sibling instead, and a hole's end marker is found at runtime.
21
+ * - **Every reference is read before any insertion**, since inserting shifts what
22
+ * follows.
23
+ */
24
+ import type { IRElement, IRNode } from '../ir/nodes.js';
25
+ /**
26
+ * The comments bracketing a hole.
27
+ *
28
+ * Named rather than anonymous so they are recognisable in devtools and in a page's
29
+ * source — an unexplained `<!---->` is a support question.
30
+ */
31
+ export declare const HOLE_START = "<!--fx-->";
32
+ export declare const HOLE_END = "<!--fx/-->";
33
+ /** `const <ref> = <expr>;`, emitted before any insertion happens. */
34
+ export interface WalkStep {
35
+ ref: string;
36
+ expr: string;
37
+ }
38
+ /** A dynamic child, and the markers its content lives between. */
39
+ export interface TemplateHole {
40
+ /** Reference to the hole's parent element. */
41
+ parentRef: string;
42
+ /** Reference to the opening marker. */
43
+ startRef: string;
44
+ /** Reference to the closing marker, resolved at runtime by scanning from the start. */
45
+ endRef: string;
46
+ node: IRNode;
47
+ }
48
+ export interface PartialTemplate {
49
+ html: string;
50
+ tag: string;
51
+ /** Declarations to emit in order, before the inserts. */
52
+ steps: WalkStep[];
53
+ holes: TemplateHole[];
54
+ }
55
+ /**
56
+ * Plan a partial template for `root`, or null when it does not qualify.
57
+ *
58
+ * Returns null for a subtree with no holes: that is the fully-static case, which has a
59
+ * cheaper path of its own and must not be routed through this one.
60
+ */
61
+ export declare function planPartialTemplate(root: IRElement): PartialTemplate | null;
62
+ //# sourceMappingURL=partial-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial-template.d.ts","sourceRoot":"","sources":["../../src/codegen/partial-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAU,MAAM,gBAAgB,CAAC;AAGhE;;;;;GAKG;AACH,eAAO,MAAM,UAAU,cAAc,CAAC;AACtC,eAAO,MAAM,QAAQ,eAAe,CAAC;AAErC,qEAAqE;AACrE,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAkDD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,eAAe,GAAG,IAAI,CA8C3E"}
Binary file
@@ -0,0 +1 @@
1
+ var b=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),$={className:"class",htmlFor:"for"},P=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),v=new Set(["script","style","textarea","title"]);function x(e){return v.has(e)}function E(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!P.has(e.name)}function c(e){let t=e.props.map(w).filter(Boolean).join(""),n=`<${e.tag}${t}>`;return b.has(e.tag)?n:`${n}${e.children.map(L).join("")}</${e.tag}>`}function L(e){if(e.kind==="text")return _(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return c(e)}function w(e){let t=$[e.name]??e.name,n=e.literal;return n===!0||n===void 0?` ${t}`:n===!1||n===null?"":` ${t}="${H(String(n))}"`}function H(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function _(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var z="<!--fx-->",A="<!--fx/-->";function f(e){return e.kind==="expr"||e.kind==="component"||e.kind==="control"}function M(e){return e.kind==="text"||e.kind==="element"&&I(e)}function I(e){return e.svg||x(e.tag)||!e.props.every(t=>E(t))?!1:e.children.every(t=>M(t)||f(t))}function o(e){if(f(e))return!0;let t=e.children;return t?t.some(o):!1}function k(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"||k(t))}function O(e){if(!I(e)||!k(e)||!e.children.some(o))return null;let t=[],n=[],S=0,u=a=>{let i=`_n$${S++}`;return t.push({ref:i,expr:a}),i};return p(e,"_el$"),{html:y(e),tag:e.tag,steps:t,holes:n};function p(a,i){let m=-1;a.children.forEach((l,r)=>{o(l)&&(m=r)});let s=null;for(let l=0;l<=m;l++){let r=a.children[l],d=s?`${s}.nextSibling`:`${i}.firstChild`;if(f(r)){let R=u(d),h=u(`holeEnd(${R})`);n.push({parentRef:i,startRef:R,endRef:h,node:r}),s=h;continue}let g=u(d);r.kind==="element"&&o(r)&&p(r,g),s=g}}}function y(e){return c(T(e)).split(N).join(z+A)}function T(e){return{...e,children:e.children.map(t=>f(t)?{kind:"text",value:N}:t.kind==="element"?T(t):t)}}var N="\0fx-hole\0";export{A as HOLE_END,z as HOLE_START,O as planPartialTemplate};
@@ -0,0 +1 @@
1
+ "use strict";var i=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var m=(e,t)=>{for(var r in t)i(e,r,{get:t[r],enumerable:!0})},d=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of g(t))!p.call(e,n)&&n!==r&&i(e,n,{get:()=>t[n],enumerable:!(a=f(t,n))||a.enumerable});return e};var x=e=>d(i({},"__esModule",{value:!0}),e);var b={};m(b,{htmlAttrName:()=>h,isPlainLiteralAttr:()=>o,isRawTextElement:()=>l,isSerializable:()=>u,serializeStatic:()=>c});module.exports=x(b);var E=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),s={className:"class",htmlFor:"for"},R=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),T=new Set(["script","style","textarea","title"]);function l(e){return T.has(e)}function h(e){return s[e]??e}function o(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!R.has(e.name)}function u(e){if(!e.static||l(e.tag))return!1;for(let t of e.props)if(!o(t))return!1;for(let t of e.children)if(t.kind!=="text"&&!(t.kind==="element"&&u(t)))return!1;return!0}function c(e){let t=e.props.map(I).filter(Boolean).join(""),r=`<${e.tag}${t}>`;return E.has(e.tag)?r:`${r}${e.children.map(k).join("")}</${e.tag}>`}function k(e){if(e.kind==="text")return $(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return c(e)}function I(e){let t=s[e.name]??e.name,r=e.literal;return r===!0||r===void 0?` ${t}`:r===!1||r===null?"":` ${t}="${S(String(r))}"`}function S(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function $(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Serialize a static IR subtree to the HTML a `<template>` can be built from.
3
+ *
4
+ * Only called for nodes `analyzeStatic` marked static, so every prop is a literal and
5
+ * every child is text or another static element — there is nothing here that could need
6
+ * an expression. That invariant is what makes this safe: the serializer never has to
7
+ * guess, and anything it cannot represent is a bug in the analysis, not a fallback.
8
+ */
9
+ import type { IRElement, IRProp } from '../ir/nodes.js';
10
+ /** True when this element's content must not be entity-escaped. */
11
+ export declare function isRawTextElement(tag: string): boolean;
12
+ /** The HTML spelling of an IR prop name. */
13
+ export declare function htmlAttrName(name: string): string;
14
+ /**
15
+ * True for a prop that is a plain HTML attribute with a compile-time constant value —
16
+ * safe to write straight onto the element, with no runtime interpretation.
17
+ */
18
+ export declare function isPlainLiteralAttr(prop: IRProp): boolean;
19
+ /** True when the subtree can be represented as HTML text with no loss. */
20
+ export declare function isSerializable(node: IRElement): boolean;
21
+ /** The subtree as HTML. */
22
+ export declare function serializeStatic(node: IRElement): string;
23
+ //# sourceMappingURL=serialize-static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize-static.d.ts","sourceRoot":"","sources":["../../src/codegen/serialize-static.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAU,MAAM,EAAE,MAAM,gBAAgB,CAAC;AA6DhE,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAgBvD;AAED,2BAA2B;AAC3B,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAKvD"}