@fluixi/compiler 1.0.0-alpha.68 → 1.0.0-alpha.70

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 (87) hide show
  1. package/dist/babel-NY6FXXLW.mjs +2 -0
  2. package/dist/codegen/backend.cjs +1 -1
  3. package/dist/codegen/backend.d.ts +14 -0
  4. package/dist/codegen/backend.d.ts.map +1 -1
  5. package/dist/codegen/backends/imperative.cjs +1 -1
  6. package/dist/codegen/backends/imperative.d.ts +10 -1
  7. package/dist/codegen/backends/imperative.d.ts.map +1 -1
  8. package/dist/codegen/backends/imperative.js +127 -16
  9. package/dist/codegen/backends/imperative.mjs +1 -1
  10. package/dist/codegen/partial-template.cjs +1 -0
  11. package/dist/codegen/partial-template.d.ts +62 -0
  12. package/dist/codegen/partial-template.d.ts.map +1 -0
  13. package/dist/codegen/partial-template.js +0 -0
  14. package/dist/codegen/partial-template.mjs +1 -0
  15. package/dist/codegen/serialize-static.cjs +1 -0
  16. package/dist/codegen/serialize-static.d.ts +23 -0
  17. package/dist/codegen/serialize-static.d.ts.map +1 -0
  18. package/dist/codegen/serialize-static.js +140 -0
  19. package/dist/codegen/serialize-static.mjs +1 -0
  20. package/dist/frontend/babel/build-ir-lit.cjs +1 -1
  21. package/dist/frontend/babel/build-ir-lit.d.ts.map +1 -1
  22. package/dist/frontend/babel/build-ir-lit.js +5 -1
  23. package/dist/frontend/babel/build-ir-lit.mjs +1 -1
  24. package/dist/frontend/babel/build-ir.cjs +1 -1
  25. package/dist/frontend/babel/build-ir.d.ts.map +1 -1
  26. package/dist/frontend/babel/build-ir.js +36 -8
  27. package/dist/frontend/babel/build-ir.mjs +1 -1
  28. package/dist/frontend/babel/index.cjs +2 -2
  29. package/dist/frontend/babel/index.mjs +2 -2
  30. package/dist/frontend/babel/lower-template.cjs +1 -1
  31. package/dist/frontend/babel/lower-template.d.ts.map +1 -1
  32. package/dist/frontend/babel/lower-template.js +34 -5
  33. package/dist/frontend/babel/lower-template.mjs +1 -1
  34. package/dist/frontend/babel/plugin.cjs +2 -2
  35. package/dist/frontend/babel/plugin.d.ts +14 -0
  36. package/dist/frontend/babel/plugin.d.ts.map +1 -1
  37. package/dist/frontend/babel/plugin.js +291 -34
  38. package/dist/frontend/babel/plugin.mjs +2 -2
  39. package/dist/index.cjs +1 -1
  40. package/dist/index.d.ts +3 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +5 -0
  43. package/dist/index.mjs +1 -1
  44. package/dist/integrations.cjs +8 -8
  45. package/dist/integrations.d.ts +13 -0
  46. package/dist/integrations.d.ts.map +1 -1
  47. package/dist/integrations.js +9 -0
  48. package/dist/integrations.mjs +3 -3
  49. package/dist/ir/nodes.cjs +1 -1
  50. package/dist/ir/nodes.d.ts +43 -0
  51. package/dist/ir/nodes.d.ts.map +1 -1
  52. package/dist/optimize/analyze-static.cjs +1 -0
  53. package/dist/optimize/analyze-static.d.ts +40 -0
  54. package/dist/optimize/analyze-static.d.ts.map +1 -0
  55. package/dist/optimize/analyze-static.js +131 -0
  56. package/dist/optimize/analyze-static.mjs +1 -0
  57. package/dist/optimize/collapse-strategies.cjs +1 -0
  58. package/dist/optimize/collapse-strategies.d.ts +31 -0
  59. package/dist/optimize/collapse-strategies.d.ts.map +1 -0
  60. package/dist/optimize/collapse-strategies.js +33 -0
  61. package/dist/optimize/collapse-strategies.mjs +1 -0
  62. package/dist/options.cjs +1 -1
  63. package/dist/options.d.ts +24 -0
  64. package/dist/options.d.ts.map +1 -1
  65. package/dist/resolve/builtins.cjs +1 -0
  66. package/dist/resolve/builtins.d.ts +69 -0
  67. package/dist/resolve/builtins.d.ts.map +1 -0
  68. package/dist/resolve/builtins.js +64 -0
  69. package/dist/resolve/builtins.mjs +1 -0
  70. package/dist/resolve/component-resolver.cjs +1 -0
  71. package/dist/resolve/component-resolver.d.ts +69 -0
  72. package/dist/resolve/component-resolver.d.ts.map +1 -0
  73. package/dist/resolve/component-resolver.js +95 -0
  74. package/dist/resolve/component-resolver.mjs +1 -0
  75. package/dist/resolve/load-directive.cjs +1 -0
  76. package/dist/resolve/load-directive.d.ts +54 -0
  77. package/dist/resolve/load-directive.d.ts.map +1 -0
  78. package/dist/resolve/load-directive.js +93 -0
  79. package/dist/resolve/load-directive.mjs +1 -0
  80. package/dist/resolve/resolve-ir.cjs +1 -0
  81. package/dist/resolve/resolve-ir.d.ts +54 -0
  82. package/dist/resolve/resolve-ir.d.ts.map +1 -0
  83. package/dist/resolve/resolve-ir.js +58 -0
  84. package/dist/resolve/resolve-ir.mjs +1 -0
  85. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  86. package/package.json +4 -4
  87. package/dist/babel-6UTCV3CC.mjs +0 -2
@@ -0,0 +1,140 @@
1
+ /** Elements the HTML parser closes itself; emitting `</br>` would create a second node. */
2
+ const VOID_ELEMENTS = new Set([
3
+ 'area',
4
+ 'base',
5
+ 'br',
6
+ 'col',
7
+ 'embed',
8
+ 'hr',
9
+ 'img',
10
+ 'input',
11
+ 'link',
12
+ 'meta',
13
+ 'param',
14
+ 'source',
15
+ 'track',
16
+ 'wbr',
17
+ ]);
18
+ /**
19
+ * Attribute names the IR normalises away from their HTML spelling. Serializing to HTML
20
+ * means going back: a template is parsed by the browser, which knows `class`, not
21
+ * `className`.
22
+ */
23
+ const HTML_NAME = {
24
+ className: 'class',
25
+ htmlFor: 'for',
26
+ };
27
+ /**
28
+ * Names the runtime assigns as DOM properties, whatever they look like.
29
+ *
30
+ * `innerHTML="<b>x</b>"` in a template would be escaped into visible text, and `value`
31
+ * as an attribute sets the *default* value rather than the current one. Serializing any
32
+ * of these changes what the code means, so they stay on the imperative path.
33
+ */
34
+ const PROPERTY_ONLY = new Set([
35
+ 'innerHTML',
36
+ 'outerHTML',
37
+ 'innerText',
38
+ 'textContent',
39
+ 'value',
40
+ 'checked',
41
+ 'selected',
42
+ 'muted',
43
+ 'defaultValue',
44
+ 'defaultChecked',
45
+ 'children',
46
+ 'ref',
47
+ ]);
48
+ /**
49
+ * Elements whose content the HTML parser does not decode entities inside.
50
+ *
51
+ * Escaping `>` in a `<style>` body would leave a literal `&gt;` in the CSS rather than
52
+ * the character. There is nothing to gain from templating these — their content is the
53
+ * interesting part, not their structure — so they stay on the imperative path.
54
+ */
55
+ const RAW_TEXT_ELEMENTS = new Set(['script', 'style', 'textarea', 'title']);
56
+ /** True when this element's content must not be entity-escaped. */
57
+ export function isRawTextElement(tag) {
58
+ return RAW_TEXT_ELEMENTS.has(tag);
59
+ }
60
+ /** The HTML spelling of an IR prop name. */
61
+ export function htmlAttrName(name) {
62
+ return HTML_NAME[name] ?? name;
63
+ }
64
+ /**
65
+ * True for a prop that is a plain HTML attribute with a compile-time constant value —
66
+ * safe to write straight onto the element, with no runtime interpretation.
67
+ */
68
+ export function isPlainLiteralAttr(prop) {
69
+ if (prop.kind !== 'attr')
70
+ return false;
71
+ if (prop.expr !== undefined)
72
+ return false;
73
+ if (prop.name.includes(':'))
74
+ return false;
75
+ return !PROPERTY_ONLY.has(prop.name);
76
+ }
77
+ /** True when the subtree can be represented as HTML text with no loss. */
78
+ export function isSerializable(node) {
79
+ if (!node.static)
80
+ return false;
81
+ if (isRawTextElement(node.tag))
82
+ return false;
83
+ // Nothing may end up needing an expression once inside the template.
84
+ for (const prop of node.props) {
85
+ // Namespaced names (`prop:value`, `attr:x`, `bool:disabled`, `on:click`) are
86
+ // instructions to the runtime, not HTML, and property-only names are assigned
87
+ // rather than set — both stay on the imperative path.
88
+ if (!isPlainLiteralAttr(prop))
89
+ return false;
90
+ }
91
+ for (const child of node.children) {
92
+ if (child.kind === 'text')
93
+ continue;
94
+ if (child.kind === 'element' && isSerializable(child))
95
+ continue;
96
+ return false;
97
+ }
98
+ return true;
99
+ }
100
+ /** The subtree as HTML. */
101
+ export function serializeStatic(node) {
102
+ const attrs = node.props.map(serializeProp).filter(Boolean).join('');
103
+ const open = `<${node.tag}${attrs}>`;
104
+ if (VOID_ELEMENTS.has(node.tag))
105
+ return open;
106
+ return `${open}${node.children.map(serializeChild).join('')}</${node.tag}>`;
107
+ }
108
+ function serializeChild(child) {
109
+ if (child.kind === 'text')
110
+ return escapeText(child.value);
111
+ /* c8 ignore next */
112
+ if (child.kind !== 'element')
113
+ throw new Error(`serializeStatic: unexpected ${child.kind}`);
114
+ return serializeStatic(child);
115
+ }
116
+ function serializeProp(prop) {
117
+ const name = HTML_NAME[prop.name] ?? prop.name;
118
+ const value = prop.literal;
119
+ // A valueless attribute (`disabled`) is `true` in the IR and bare in HTML.
120
+ if (value === true || value === undefined)
121
+ return ` ${name}`;
122
+ if (value === false || value === null)
123
+ return '';
124
+ return ` ${name}="${escapeAttr(String(value))}"`;
125
+ }
126
+ /**
127
+ * Escaping is deliberately aggressive. This string is assigned to `innerHTML`, so a
128
+ * literal that happens to contain markup would otherwise become elements — a value like
129
+ * `class="a<b"` must stay one attribute.
130
+ */
131
+ function escapeAttr(value) {
132
+ return value
133
+ .replace(/&/g, '&amp;')
134
+ .replace(/"/g, '&quot;')
135
+ .replace(/</g, '&lt;')
136
+ .replace(/>/g, '&gt;');
137
+ }
138
+ function escapeText(value) {
139
+ return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
140
+ }
@@ -0,0 +1 @@
1
+ var i=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),n={className:"class",htmlFor:"for"},a=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),s=new Set(["script","style","textarea","title"]);function l(e){return s.has(e)}function d(e){return n[e]??e}function o(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!a.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(g).filter(Boolean).join(""),r=`<${e.tag}${t}>`;return i.has(e.tag)?r:`${r}${e.children.map(f).join("")}</${e.tag}>`}function f(e){if(e.kind==="text")return m(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return c(e)}function g(e){let t=n[e.name]??e.name,r=e.literal;return r===!0||r===void 0?` ${t}`:r===!1||r===null?"":` ${t}="${p(String(r))}"`}function p(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function m(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}export{d as htmlAttrName,o as isPlainLiteralAttr,l as isRawTextElement,u as isSerializable,c as serializeStatic};
@@ -1 +1 @@
1
- "use strict";var O=Object.create;var g=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var H=(n,e)=>{for(var t in e)g(n,t,{get:e[t],enumerable:!0})},R=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of F(e))!_.call(n,i)&&i!==t&&g(n,i,{get:()=>e[i],enumerable:!(r=B(e,i))||r.enumerable});return n};var I=(n,e,t)=>(t=n!=null?O(M(n)):{},R(e||!n||!n.__esModule?g(t,"default",{value:n,enumerable:!0}):t,n)),V=n=>R(g({},"__esModule",{value:!0}),n);var ce={};H(ce,{buildIRFromLit:()=>b});module.exports=V(ce);var f=require("@babel/core"),y=I(require("@babel/generator"),1),j=require("@fluixi/template-parser");var k={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},ue={version:2,module:"@fluixi/dom",symbols:[...k.symbols,"template","cloneTemplate","walk"]};var G={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function K(n){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(n)}function w(n){return K(n)?n:JSON.stringify(n)}function U(n){return n.expr!==void 0?n.reactive?`() => (${n.expr})`:`(${n.expr})`:JSON.stringify(n.literal??!0)}function W(n){return n.expr!==void 0?`(${n.expr})`:JSON.stringify(n.literal??!0)}function z(n,e,t){let r=n.filter(l=>l.kind==="spread"),a=n.filter(l=>l.kind!=="spread").map(l=>`${w(l.name)}: ${U(l)}`);e!=null&&a.push(`children: ${e}`);let o=`{ ${a.join(", ")} }`;return r.length>0?(t.add("mergeProps"),`mergeProps(${r.map(l=>l.expr).join(", ")}, ${o})`):o}function C(n,e){return n.length===1?v(n[0],e):`[${n.map(t=>v(t,e)).join(", ")}]`}function $(n,e,t,r){r.add("createMemo"),r.add("createComponent");let i=e.filter(s=>s.kind==="spread"),o=e.filter(s=>s.kind!=="spread").map(s=>`get ${w(s.name)}() { return ${W(s)}; }`);t.length>0&&o.push(`get children() { return ${C(t,r)}; }`);let l=`{ ${o.join(", ")} }`;return i.length>0&&(r.add("mergeProps"),l=`mergeProps(${i.map(s=>s.expr).join(", ")}, ${l})`),`createMemo(() => createComponent(${n}, ${l}))`}function v(n,e){switch(n.kind){case"text":return JSON.stringify(n.value);case"expr":return n.reactive?`() => (${n.code})`:`(${n.code})`;case"fragment":return n.children.length===0?"null":C(n.children,e);case"component":return $(n.name,n.props,n.children,e);case"control":{let t=G[n.control]??n.control;return e.add(t),$(t,n.props,n.children,e)}case"element":{e.add("createNativeElement");let t=JSON.stringify(n.tag),r="_el$",i=[],a=n.svg?`${t}, true`:t;if(i.push(`const ${r} = createNativeElement(${a});`),n.props.length>0){e.add("spread");let o=n.svg?", isSVG: true":"";i.push(`spread({ element: ${r}, props: ${z(n.props,null,e)}${o} });`)}for(let o of n.children){e.add("insert");let l=v(o,e),s=o.kind==="expr"&&o.reactive||o.kind==="component"||o.kind==="control";i.push(s?`insert(${r}, ${l}, null);`:`insert(${r}, ${l});`)}return i.push(`return ${r};`),`(() => { ${i.join(" ")} })()`}}}var h={name:"imperative",contract:k,emit(n,e){let t=new Set;return{code:v(n,t),imports:Array.from(t)}}};var c=require("@babel/core"),E=I(require("@babel/generator"),1);var Z=E.default.default??E.default;function P(n){return Z(n,{concise:!0}).code}function q(n,e){let t=c.types.cloneNode(n,!0),r=c.types.file(c.types.program([c.types.expressionStatement(t)])),i=!1,a=(o,l,s)=>{for(let p of s)e.add(p);o.replaceWith(c.template.expression(l,{placeholderPattern:!1,plugins:["typescript"]})()),o.skip(),i=!0};return(0,c.traverse)(r,{"JSXElement|JSXFragment"(o){let l=o.node,{code:s,imports:p}=h.emit(N(l,e),{});a(o,s,p)},TaggedTemplateExpression(o){let l=o.node.tag;if(!c.types.isIdentifier(l)||l.name!=="html"&&l.name!=="svg")return;let s=b(o.node,e,{svg:l.name==="svg"}),{code:p,imports:m}=h.emit(s,{});a(o,p,m)}}),i?r.program.body[0].expression:n}function d(n,e){return P(q(n,e))}var Q=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),Y=/^on[A-Z]/,ee=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function te(n){if(c.types.isJSXIdentifier(n)){let e=n.name[0]!==n.name[0].toLowerCase();return{tag:n.name,component:e}}return c.types.isJSXMemberExpression(n)?{tag:P(n),component:!0}:c.types.isJSXNamespacedName(n)?{tag:`${n.namespace.name}:${n.name.name}`,component:!1}:{tag:"div",component:!1}}function ne(n){return c.types.isJSXIdentifier(n)?n.name==="class"?"className":n.name:c.types.isJSXNamespacedName(n)?`${n.namespace.name}:${n.name.name}`:"unknown"}function u(n){return c.types.isCallExpression(n)||c.types.isOptionalCallExpression(n)?!0:c.types.isMemberExpression(n)||c.types.isOptionalMemberExpression(n)?!(!n.computed&&c.types.isIdentifier(n.property,{name:"children"})):c.types.isConditionalExpression(n)?u(n.test)||u(n.consequent)||u(n.alternate):c.types.isLogicalExpression(n)||c.types.isBinaryExpression(n)?u(n.left)||u(n.right):c.types.isTemplateLiteral(n)?n.expressions.some(e=>u(e)):c.types.isObjectExpression(n)?n.properties.some(e=>c.types.isObjectProperty(e)&&!e.computed&&u(e.value)):c.types.isArrayExpression(n)?n.elements.some(e=>e!=null&&!c.types.isSpreadElement(e)&&u(e)):!1}function re(n,e){let t=ne(n.name),r=Y.test(t),i=r||t.startsWith("on:"),o={name:t,kind:r?"event":"attr"};r&&(o.event={name:t.slice(2).toLowerCase(),delegated:ee.has(t.slice(2).toLowerCase())});let l=n.value;if(l==null)return o.literal=!0,o;if(c.types.isStringLiteral(l))return o.literal=l.value,o;if(c.types.isJSXExpressionContainer(l)&&!c.types.isJSXEmptyExpression(l.expression)){let s=l.expression;return c.types.isStringLiteral(s)||c.types.isNumericLiteral(s)||c.types.isBooleanLiteral(s)?(o.literal=s.value,o):(o.expr=d(s,e),o.reactive=i?!1:u(s),(c.types.isJSXElement(s)||c.types.isJSXFragment(s))&&(o.jsxElement=!0),o)}return o.literal=!0,o}function A(n,e){let t=n.value;return t==null?null:c.types.isStringLiteral(t)?JSON.stringify(t.value):c.types.isJSXExpressionContainer(t)&&!c.types.isJSXEmptyExpression(t.expression)?d(t.expression,e):null}function ie(n,e){let t=[],r=[];for(let i of n){if(c.types.isJSXSpreadAttribute(i)){t.push({name:"",kind:"spread",expr:d(i.argument,e)});continue}if(!c.types.isJSXAttribute(i))continue;let a=c.types.isJSXNamespacedName(i.name)?i.name.namespace.name:null;if(a==="use"){let o=i.name.name.name;e.add(o);let l=A(i,e);r.push(l!=null?`[${o}, () => (${l})]`:`[${o}]`);continue}if(a==="oncapture"){let o=i.name.name.name.toLowerCase(),l=A(i,e)??"undefined";t.push({name:"on:"+o,kind:"attr",expr:`[${l}, { capture: true }]`});continue}t.push(re(i,e))}return r.length>0&&t.push({name:"use",kind:"attr",expr:`[${r.join(", ")}]`}),t}function x(n){let e=n.split(/\r\n|\n|\r/),t=0;for(let i=0;i<e.length;i++)/[^ \t]/.test(e[i])&&(t=i);let r="";for(let i=0;i<e.length;i++){let a=e[i].replace(/\t/g," ");i!==0&&(a=a.replace(/^ +/,"")),i!==e.length-1&&(a=a.replace(/ +$/,"")),a&&(i!==t&&(a+=" "),r+=a)}return r}function J(n,e){let t=[];for(let r of n)if(c.types.isJSXText(r)){let i=x(r.value);i&&t.push({kind:"text",value:i})}else if(c.types.isJSXExpressionContainer(r)){if(!c.types.isJSXEmptyExpression(r.expression)){let i=r.expression;t.push({kind:"expr",code:d(i,e),reactive:u(i)})}}else c.types.isJSXElement(r)||c.types.isJSXFragment(r)?t.push(N(r,e)):c.types.isJSXSpreadChild(r)&&t.push({kind:"expr",code:d(r.expression,e),reactive:!1});return t}function N(n,e=new Set){if(c.types.isJSXFragment(n))return{kind:"fragment",children:J(n.children,e)};let{tag:t,component:r}=te(n.openingElement.name),i=ie(n.openingElement.attributes,e),a=J(n.children,e);return r?{kind:"component",name:t,props:i,children:a}:{kind:"element",tag:t,svg:Q.has(t),props:i,children:a,static:!1}}var se=y.default.default??y.default;function oe(n){return se(n,{concise:!0}).code}var T=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function ae(n){return n.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function X(n){return n.charAt(0).toUpperCase()+n.slice(1)}var S=class{constructor(e,t){this.holes=e;this.used=t}hole(e){return this.holes[e]??{node:f.types.identifier("undefined"),code:"undefined",reactive:!1}}emit(e){let{code:t,imports:r}=h.emit(e,{});for(let i of r)this.used.add(i);return t}lowerRoot(e){let t=this.lowerChildren(e);return t.length===1?t[0]:{kind:"fragment",children:t}}lowerChildren(e){let t=[];for(let r=0;r<e.length;r++){let i=e[r];if(i.kind==="Element"||i.kind==="Component"){let o=i.attributes.find(l=>l.kind==="IfDirective");if(o&&o.kind==="IfDirective"){let l=r+1;l<e.length&&this.isBlankText(e[l])&&l++;let s=e[l],p=s&&(s.kind==="Element"||s.kind==="Component")&&s.attributes.some(m=>m.kind==="ElseDirective");t.push(this.lowerIf(i,o.hole,p?s:null)),p&&(r=l);continue}if(i.attributes.some(l=>l.kind==="EachDirective")){t.push(this.lowerEach(i));continue}}let a=this.lowerNode(i);a&&t.push(a)}return t}isBlankText(e){return e.kind==="Text"&&!e.raw&&x(e.value)===""}lowerNode(e){switch(e.kind){case"Text":{if(e.raw)return{kind:"text",value:e.value};let t=x(e.value);return t?{kind:"text",value:t}:null}case"Comment":return null;case"Expression":{let t=this.hole(e.hole);return{kind:"expr",code:t.code,reactive:t.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(e.children)};case"Element":return this.lowerElement(e);case"Component":return this.lowerComponent(e);default:return null}}lowerElement(e){let t=e.attributes.find(r=>r.kind==="Attribute"&&r.name==="is");if(e.tag==="component"&&t&&t.value&&t.value.kind==="hole"){let r=e.attributes.filter(a=>a!==t),i=this.lowerComponent({...e,kind:"Component",tag:"Dynamic",tagHole:null,attributes:r});return i.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(t.value.hole).code})`}),i}return{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:this.lowerAttributes(e.attributes),children:this.lowerChildren(e.children),static:!1}}lowerComponent(e){let t=e.tagHole!=null?this.hole(e.tagHole).code:e.tag,r=this.lowerAttributes(e.attributes),{slots:i,rest:a}=this.partitionSlots(e.children);for(let[o,l]of i){let s=l.length===1?l[0]:{kind:"fragment",children:l};r.push({name:o,kind:"attr",expr:this.emit(s),jsxElement:!0})}return{kind:"component",name:t,props:r,children:this.lowerChildren(a)}}partitionSlots(e){let t=new Map,r=[];for(let i of e){if(i.kind==="Element"||i.kind==="Component"){let a=i.attributes.find(o=>o.kind==="Attribute"&&o.name==="slot");if(a&&a.value&&a.value.kind==="static"){let o={...i,attributes:i.attributes.filter(p=>p!==a)},l=o.kind==="Element"?this.lowerElement(o):this.lowerComponent(o),s=t.get(a.value.value)??[];s.push(l),t.set(a.value.value,s);continue}}r.push(i)}return{slots:t,rest:r}}lowerIf(e,t,r){let i=this.hole(t),a=[{name:"when",kind:"attr",expr:i.code,reactive:i.reactive}];if(r){let l=this.stripAndLower(r,s=>s.kind==="ElseDirective");a.push({name:"fallback",kind:"attr",expr:this.emit(l),jsxElement:!0})}let o=this.stripAndLower(e,l=>l.kind==="IfDirective");return{kind:"component",name:"Show",props:a,children:[o]}}lowerEach(e){let t=e.attributes.find(s=>s.kind==="EachDirective");if(!t||t.kind!=="EachDirective")return this.lowerNode(e);let r=this.hole(t.hole),i=[{name:"each",kind:"attr",expr:r.code,reactive:r.reactive}];if(t.key){let s="static"in t.key?`(item) => item[${JSON.stringify(t.key.static)}]`:this.hole(t.key.hole).code;i.push({name:"by",kind:"attr",expr:s})}let a=this.itemArrow(e),o;if(a){let s=a.body,p={kind:"expr",code:d(s,this.used),reactive:u(s)},m=this.rebuildWithChildren(e,[p]);o=`(${a.params.map(D=>oe(D)).join(", ")}) => (${this.emit(m)})`}else{let s=this.stripAndLower(e,p=>p.kind==="EachDirective");o=`() => (${this.emit(s)})`}return{kind:"component",name:"For",props:i,children:[{kind:"expr",code:o,reactive:!1}]}}itemArrow(e){let t=e.children.filter(i=>!this.isBlankText(i));if(t.length!==1||t[0].kind!=="Expression")return null;let r=this.hole(t[0].hole).node;return f.types.isArrowFunctionExpression(r)&&!f.types.isBlockStatement(r.body)?r:null}stripAndLower(e,t){let r={...e,attributes:e.attributes.filter(i=>!t(i))};return r.kind==="Element"?this.lowerElement(r):this.lowerComponent(r)}rebuildWithChildren(e,t){let r=this.lowerAttributes(e.attributes.filter(i=>i.kind!=="EachDirective"));return e.kind==="Element"?{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:r,children:t,static:!1}:{kind:"component",name:e.tag,props:r,children:t}}lowerAttributes(e){let t=[],r=[],i=!1,a=[],o=!1,l=[];for(let s of e)switch(s.kind){case"IfDirective":case"EachDirective":case"ElseDirective":break;case"Attribute":t.push(this.plainAttr(s));break;case"PropertyBinding":t.push({name:s.name,kind:"prop",expr:this.hole(s.hole).code,reactive:this.hole(s.hole).reactive});break;case"EventBinding":t.push(this.eventProp(s));break;case"RefBinding":t.push({name:"ref",kind:"ref",expr:this.hole(s.hole).code,reactive:this.hole(s.hole).reactive});break;case"Spread":t.push({name:"",kind:"spread",expr:this.hole(s.hole).code});break;case"ClassDirective":{let p=this.hole(s.hole);r.push(`${JSON.stringify(s.name)}: ${p.code}`),i=i||p.reactive;break}case"StyleDirective":{let p=this.hole(s.hole);a.push(`${JSON.stringify(s.name)}: ${p.code}`),o=o||p.reactive;break}case"BindDirective":t.push(...this.bindProps(s.name,this.hole(s.hole).code));break;case"UseDirective":{let p=s.name??(s.hole!=null?this.hole(s.hole).code:null);if(!p)break;l.push(s.name!=null&&s.hole!=null?`[${p}, () => (${this.hole(s.hole).code})]`:`[${p}]`);break}}return r.length>0&&t.push({name:"classList",kind:"attr",expr:`{ ${r.join(", ")} }`,reactive:i}),a.length>0&&t.push({name:"style",kind:"attr",expr:`{ ${a.join(", ")} }`,reactive:o}),l.length>0&&t.push({name:"use",kind:"attr",expr:`[${l.join(", ")}]`}),t}eventProp(e){let t=e.name.toLowerCase(),r=this.hole(e.hole).code;if(!(e.syntax==="colon"||e.modifiers.length>0))return{name:"on"+X(e.name),kind:"event",event:{name:t,delegated:T.has(t)},expr:r};let a=this.wrapHandler(r,e.modifiers),o=this.eventOptions(e.modifiers),l=o?`[${a}, ${o}]`:a;return{name:"on:"+t,kind:"attr",expr:l}}wrapHandler(e,t){let r=t.includes("self")?"if (e.target !== e.currentTarget) return; ":"",i=[];return t.includes("prevent")&&i.push("e.preventDefault();"),t.includes("stop")&&i.push("e.stopPropagation();"),!r&&i.length===0?e:`(e) => { ${r}${i.join(" ")} return (${e})(e); }`}eventOptions(e){let t=[];return e.includes("capture")&&t.push("capture: true"),e.includes("once")&&t.push("once: true"),e.includes("passive")&&t.push("passive: true"),t.length?`{ ${t.join(", ")} }`:null}bindProps(e,t){let r=e==="checked",i=r?"change":"input",a=r?"checked":"value",o=`(${t})`;return[{name:e,kind:"attr",expr:`${o}[0]()`,reactive:!0},{name:"on"+X(i),kind:"event",event:{name:i,delegated:T.has(i)},expr:`(e) => ${o}[1](e.target.${a})`}]}plainAttr(e){let t=e.value,r=e.name;e.name==="class"?r=t&&t.kind==="hole"&&f.types.isObjectExpression(this.hole(t.hole).node)?"classList":"className":e.name==="html"&&(r="innerHTML");let a={name:r,kind:"attr"};if(t==null)return a.literal=!0,a;if(t.kind==="static")return a.literal=t.value,a;if(t.kind==="hole"){let s=this.hole(t.hole);return a.expr=s.code,a.reactive=s.reactive,a}let o=!1,l=t.parts.map(s=>{if("text"in s)return ae(s.text);let p=this.hole(s.hole);return o=o||p.reactive,"${"+p.code+"}"}).join("");return a.expr="`"+l+"`",a.reactive=o,a}};function L(n,e,t={}){let r=n.quasi,i=r.expressions.map(l=>{let s=l;return{node:s,code:d(s,e),reactive:u(s)}}),a=le(r),{root:o}=(0,j.parseTemplate)(a,{svg:t.svg});return new S(i,e).lowerRoot(o.children)}function le(n){let e=[];return n.quasis.forEach((t,r)=>{let i=t.value.cooked??t.value.raw;if(e.push({kind:"static",text:i,start:t.start??0}),r<n.expressions.length){let a=n.expressions[r];e.push({kind:"hole",index:r,start:a.start??0,end:a.end??0})}}),e}function b(n,e=new Set,t={}){return L(n,e,t)}
1
+ "use strict";var ce=Object.create;var b=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var de=Object.getPrototypeOf,me=Object.prototype.hasOwnProperty;var fe=(t,e)=>{for(var n in e)b(t,n,{get:e[n],enumerable:!0})},H=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ue(e))!me.call(t,i)&&i!==n&&b(t,i,{get:()=>e[i],enumerable:!(r=pe(e,i))||r.enumerable});return t};var F=(t,e,n)=>(n=t!=null?ce(de(t)):{},H(e||!t||!t.__esModule?b(n,"default",{value:t,enumerable:!0}):n,t)),he=t=>H(b({},"__esModule",{value:!0}),t);var Ye={};fe(Ye,{buildIRFromLit:()=>j});module.exports=he(Ye);var N=require("@babel/core"),O=F(require("@babel/generator"),1),ae=require("@fluixi/template-parser");var ge={kind:"eager"},ve=["pointerdown","focusin","keydown"],z=new Set(["eager","idle","visible","interaction","media","never"]),f=class extends Error{};function C(t){return t.startsWith("load:")}function y(t,e){let n=t.slice(5);if(!z.has(n))throw new f(`Unknown load strategy 'load:${n}'. Expected one of ${[...z].join(", ")}.`);switch(n){case"eager":return ge;case"idle":return{kind:"idle"};case"never":return{kind:"never"};case"visible":return e?{kind:"visible",rootMargin:e}:{kind:"visible"};case"interaction":return{kind:"interaction",events:e?xe(e):[...ve]};case"media":if(!e)throw new f(`'load:media' needs a query, e.g. load:media="(min-width: 1024px)".`);return{kind:"media",query:e};default:throw new f(`Unhandled load strategy '${n}'.`)}}function xe(t){let e=t.split(/[\s,]+/).map(n=>n.trim()).filter(Boolean);if(e.length===0)throw new f("'load:interaction' was given no event names.");return e}var ke=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),V={className:"class",htmlFor:"for"},Ee=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),Re=new Set(["script","style","textarea","title"]);function A(t){return Re.has(t)}function W(t){return V[t]??t}function v(t){return t.kind!=="attr"||t.expr!==void 0||t.name.includes(":")?!1:!Ee.has(t.name)}function P(t){if(!t.static||A(t.tag))return!1;for(let e of t.props)if(!v(e))return!1;for(let e of t.children)if(e.kind!=="text"&&!(e.kind==="element"&&P(e)))return!1;return!0}function x(t){let e=t.props.map(Se).filter(Boolean).join(""),n=`<${t.tag}${e}>`;return ke.has(t.tag)?n:`${n}${t.children.map(Ne).join("")}</${t.tag}>`}function Ne(t){if(t.kind==="text")return ye(t.value);if(t.kind!=="element")throw new Error(`serializeStatic: unexpected ${t.kind}`);return x(t)}function Se(t){let e=V[t.name]??t.name,n=t.literal;return n===!0||n===void 0?` ${e}`:n===!1||n===null?"":` ${e}="${be(String(n))}"`}function be(t){return t.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ye(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var Ie="<!--fx-->",$e="<!--fx/-->";function $(t){return t.kind==="expr"||t.kind==="component"||t.kind==="control"}function we(t){return t.kind==="text"||t.kind==="element"&&U(t)}function U(t){return t.svg||A(t.tag)||!t.props.every(e=>v(e))?!1:t.children.every(e=>we(e)||$(e))}function I(t){if($(t))return!0;let e=t.children;return e?e.some(I):!1}function G(t){for(let e=0;e<t.children.length;e++){let n=t.children[e];if(n.kind==="text"&&(n.value===""||t.children[e+1]?.kind==="text"))return!1}return t.children.every(e=>e.kind!=="element"||G(e))}function K(t){if(!U(t)||!G(t)||!t.children.some(I))return null;let e=[],n=[],r=0,i=a=>{let s=`_n$${r++}`;return e.push({ref:s,expr:a}),s};return o(t,"_el$"),{html:Te(t),tag:t.tag,steps:e,holes:n};function o(a,s){let l=-1;a.children.forEach((u,d)=>{I(u)&&(l=d)});let c=null;for(let u=0;u<=l;u++){let d=a.children[u],g=c?`${c}.nextSibling`:`${s}.firstChild`;if($(d)){let M=i(g),B=i(`holeEnd(${M})`);n.push({parentRef:s,startRef:M,endRef:B,node:d}),c=B;continue}let S=i(g);d.kind==="element"&&I(d)&&o(d,S),c=S}}}function Te(t){return x(q(t)).split(Z).join(Ie+$e)}function q(t){return{...t,children:t.children.map(e=>$(e)?{kind:"text",value:Z}:e.kind==="element"?q(e):e)}}var Z="\0fx-hole\0";var J={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},it={version:2,module:"@fluixi/dom",symbols:[...J.symbols,"template","cloneTemplate","walk"]};var Ce={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function Ae(t){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(t)}function Q(t){return Ae(t)?t:JSON.stringify(t)}function Pe(t){return t.expr!==void 0?t.reactive?`() => (${t.expr})`:`(${t.expr})`:JSON.stringify(t.literal??!0)}function Je(t){return t.expr!==void 0?`(${t.expr})`:JSON.stringify(t.literal??!0)}function Le(t,e,n){let r=t.filter(s=>s.kind==="spread"),o=t.filter(s=>s.kind!=="spread").map(s=>`${Q(s.name)}: ${Pe(s)}`);e!=null&&o.push(`children: ${e}`);let a=`{ ${o.join(", ")} }`;return r.length>0?(n.add("mergeProps"),`mergeProps(${r.map(s=>s.expr).join(", ")}, ${a})`):a}function ee(t,e,n){return t.length===1?k(t[0],e,n):`[${t.map(r=>k(r,e,n)).join(", ")}]`}function Y(t,e,n,r,i){r.add("createMemo"),r.add("createComponent");let o=e.filter(c=>c.kind==="spread"),s=e.filter(c=>c.kind!=="spread").map(c=>`get ${Q(c.name)}() { return ${Je(c)}; }`);n.length>0&&s.push(`get children() { return ${ee(n,r,i)}; }`);let l=`{ ${s.join(", ")} }`;return o.length>0&&(r.add("mergeProps"),l=`mergeProps(${o.map(c=>c.expr).join(", ")}, ${l})`),`createMemo(() => createComponent(${t}, ${l}))`}function Xe(t,e){let n=W(e.name),r=e.literal;return r===!0||r===void 0?`${t}.setAttribute(${JSON.stringify(n)}, "");`:r===!1||r===null?"":`${t}.setAttribute(${JSON.stringify(n)}, ${JSON.stringify(String(r))});`}var te=!1;function k(t,e,n){switch(t.kind){case"text":return JSON.stringify(t.value);case"expr":return t.reactive?`() => (${t.code})`:`(${t.code})`;case"fragment":return t.children.length===0?"null":ee(t.children,e,n);case"component":return Y(t.name,t.props,t.children,e,n);case"control":{let r=Ce[t.control]??t.control;return e.add(r),Y(r,t.props,t.children,e,n)}case"element":{if(n&&t.static&&!t.svg&&P(t)){e.add("templateNode");let s=`_tmpl$${n.length}`;return n.push({id:s,html:x(t),tag:t.tag,svg:!1}),`templateNode(${s}, ${JSON.stringify(t.tag)})`}if(n&&te){let s=K(t);if(s){e.add("templateNode"),e.add("insert"),e.add("holeEnd"),e.add("holeContent"),e.add("holeScope");let l=`_tmpl$${n.length}`;n.push({id:l,html:s.html,tag:s.tag,svg:!1});let c=[`const _el$ = templateNode(${l}, ${JSON.stringify(s.tag)}, true);`];for(let u of s.steps)c.push(`const ${u.ref} = ${u.expr};`);for(let u of s.holes)c.push(`insert(${u.parentRef}, holeScope(${u.startRef}, () => (${k(u.node,e,n)})), ${u.endRef}, holeContent(${u.startRef}, ${u.endRef}));`);return c.push("return _el$;"),`(() => { ${c.join(" ")} })()`}}e.add("createNativeElement");let r=JSON.stringify(t.tag),i="_el$",o=[],a=t.svg?`${r}, true`:r;if(o.push(`const ${i} = createNativeElement(${a});`),t.props.length>0)if(!t.svg&&t.props.every(v))for(let s of t.props)o.push(Xe(i,s));else{e.add("spread");let s=t.svg?", isSVG: true":"";o.push(`spread({ element: ${i}, props: ${Le(t.props,null,e)}${s} });`)}for(let s of t.children){e.add("insert");let l=k(s,e,n),c=s.kind==="expr"&&s.reactive||s.kind==="component"||s.kind==="control";o.push(c?`insert(${i}, ${l}, null);`:`insert(${i}, ${l});`)}return o.push(`return ${i};`),`(() => { ${o.join(" ")} })()`}}}function E(t,e){if(!e||e.length===0)return t;let n=new Map(e.map(r=>[r.id,JSON.stringify(r.html)]));return t.replace(/_tmpl\$\d+/g,r=>n.get(r)??r)}var R={name:"imperative",contract:J,emit(t,e){let n=new Set,r=e?.templateClone!==!1?[]:void 0;return te=e?.partialTemplates===!0,{code:k(t,n,r),imports:Array.from(n),templates:r}}};var p=require("@babel/core"),L=F(require("@babel/generator"),1);function De(t){switch(t.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 t.reactive?"reactive-prop":t.expr!==void 0?"expression-prop":void 0;default:return"expression-prop"}}function w(t){let e=[],n=new Map,r=i=>{switch(i.kind){case"text":return!0;case"expr":return!1;case"component":case"control":for(let o of i.children)r(o);return!1;case"fragment":for(let o of i.children)r(o);return!1;case"element":{let o=!0;for(let s of i.children)r(s)||(o=!1);let a;for(let s of i.props)if(a=De(s),a)break;return!a&&!o&&(a=je(i)),i.static=!a,a?n.set(i,a):e.push(i),i.static}default:return!1}};for(let i of Array.isArray(t)?t:[t])r(i);return{staticElements:e,reasons:n}}function je(t){for(let e of t.children){if(e.kind==="expr")return"expression-child";if(e.kind==="component")return"component-child";if(e.kind==="control")return"control-child";if(e.kind==="element"&&!e.static||e.kind==="fragment")return"expression-child"}return"expression-child"}var Oe=L.default.default??L.default;function ie(t){return Oe(t,{concise:!0}).code}function _e(t,e){let n=p.types.cloneNode(t,!0),r=p.types.file(p.types.program([p.types.expressionStatement(n)])),i=!1,o=(a,s,l)=>{for(let c of l)e.add(c);a.replaceWith(p.template.expression(s,{placeholderPattern:!1,plugins:["typescript"]})()),a.skip(),i=!0};return(0,p.traverse)(r,{"JSXElement|JSXFragment"(a){let s=a.node,{code:l,imports:c,templates:u}=R.emit(We(s,e),{});o(a,E(l,u),c)},TaggedTemplateExpression(a){let s=a.node.tag;if(!p.types.isIdentifier(s)||s.name!=="html"&&s.name!=="svg")return;let l=j(a.node,e,{svg:s.name==="svg"}),{code:c,imports:u,templates:d}=R.emit(l,{});o(a,E(c,d),u)}}),i?r.program.body[0].expression:t}function h(t,e){return ie(_e(t,e))}var Me=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),Be=/^on[A-Z]/,He=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function Fe(t){if(p.types.isJSXIdentifier(t)){let e=t.name[0]!==t.name[0].toLowerCase();return{tag:t.name,component:e}}return p.types.isJSXMemberExpression(t)?{tag:ie(t),component:!0}:p.types.isJSXNamespacedName(t)?{tag:`${t.namespace.name}:${t.name.name}`,component:!1}:{tag:"div",component:!1}}function D(t){return p.types.isJSXIdentifier(t)?t.name==="class"?"className":t.name:p.types.isJSXNamespacedName(t)?`${t.namespace.name}:${t.name.name}`:"unknown"}function m(t){return p.types.isCallExpression(t)||p.types.isOptionalCallExpression(t)?!0:p.types.isMemberExpression(t)||p.types.isOptionalMemberExpression(t)?!(!t.computed&&p.types.isIdentifier(t.property,{name:"children"})):p.types.isConditionalExpression(t)?m(t.test)||m(t.consequent)||m(t.alternate):p.types.isLogicalExpression(t)||p.types.isBinaryExpression(t)?m(t.left)||m(t.right):p.types.isTemplateLiteral(t)?t.expressions.some(e=>m(e)):p.types.isObjectExpression(t)?t.properties.some(e=>p.types.isObjectProperty(e)&&!e.computed&&m(e.value)):p.types.isArrayExpression(t)?t.elements.some(e=>e!=null&&!p.types.isSpreadElement(e)&&m(e)):!1}function ze(t,e){let n=D(t.name),r=Be.test(n),i=r||n.startsWith("on:"),a={name:n,kind:r?"event":"attr"};r&&(a.event={name:n.slice(2).toLowerCase(),delegated:He.has(n.slice(2).toLowerCase())});let s=t.value;if(s==null)return a.literal=!0,a;if(p.types.isStringLiteral(s))return a.literal=s.value,a;if(p.types.isJSXExpressionContainer(s)&&!p.types.isJSXEmptyExpression(s.expression)){let l=s.expression;return p.types.isStringLiteral(l)||p.types.isNumericLiteral(l)||p.types.isBooleanLiteral(l)?(a.literal=l.value,a):(a.expr=h(l,e),a.reactive=i?!1:m(l),(p.types.isJSXElement(l)||p.types.isJSXFragment(l))&&(a.jsxElement=!0),a)}return a.literal=!0,a}function ne(t,e){let n=t.value;return n==null?null:p.types.isStringLiteral(n)?JSON.stringify(n.value):p.types.isJSXExpressionContainer(n)&&!p.types.isJSXEmptyExpression(n.expression)?h(n.expression,e):null}function Ve(t,e){let n=[],r=[];for(let i of t){if(p.types.isJSXSpreadAttribute(i)){n.push({name:"",kind:"spread",expr:h(i.argument,e)});continue}if(!p.types.isJSXAttribute(i)||C(D(i.name)))continue;let o=p.types.isJSXNamespacedName(i.name)?i.name.namespace.name:null;if(o==="use"){let a=i.name.name.name;e.add(a);let s=ne(i,e);r.push(s!=null?`[${a}, () => (${s})]`:`[${a}]`);continue}if(o==="oncapture"){let a=i.name.name.name.toLowerCase(),s=ne(i,e)??"undefined";n.push({name:"on:"+a,kind:"attr",expr:`[${s}, { capture: true }]`});continue}n.push(ze(i,e))}return r.length>0&&n.push({name:"use",kind:"attr",expr:`[${r.join(", ")}]`}),n}function T(t){let e=t.split(/\r\n|\n|\r/),n=0;for(let i=0;i<e.length;i++)/[^ \t]/.test(e[i])&&(n=i);let r="";for(let i=0;i<e.length;i++){let o=e[i].replace(/\t/g," ");i!==0&&(o=o.replace(/^ +/,"")),i!==e.length-1&&(o=o.replace(/ +$/,"")),o&&(i!==n&&(o+=" "),r+=o)}return r}function re(t,e){let n=[];for(let r of t)if(p.types.isJSXText(r)){let i=T(r.value);i&&n.push({kind:"text",value:i})}else if(p.types.isJSXExpressionContainer(r)){if(!p.types.isJSXEmptyExpression(r.expression)){let i=r.expression;n.push({kind:"expr",code:h(i,e),reactive:m(i)})}}else p.types.isJSXElement(r)||p.types.isJSXFragment(r)?n.push(X(r,e)):p.types.isJSXSpreadChild(r)&&n.push({kind:"expr",code:h(r.expression,e),reactive:!1});return n}function We(t,e=new Set){let n=X(t,e);return w(n),n}function X(t,e){if(p.types.isJSXFragment(t))return{kind:"fragment",children:re(t.children,e)};let{tag:n,component:r}=Fe(t.openingElement.name),i=Ve(t.openingElement.attributes,e),o=re(t.children,e);if(r){let a=Ue(t.openingElement.attributes);return{kind:"component",name:n,props:i,children:o,...a?{load:a}:{}}}return{kind:"element",tag:n,svg:Me.has(n),props:i,children:o,static:!1}}function Ue(t){for(let e of t){if(!p.types.isJSXAttribute(e))continue;let n=D(e.name);if(C(n)){if(e.value&&!p.types.isStringLiteral(e.value))throw new f(`'${n}' needs a literal value, not an expression — the strategy is compile-time.`);return y(n,e.value?e.value.value:null)}}}var Ge=O.default.default??O.default;function Ke(t){return Ge(t,{concise:!0}).code}var se=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function qe(t){return t.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function oe(t){return t.charAt(0).toUpperCase()+t.slice(1)}var _=class{constructor(e,n){this.holes=e;this.used=n}hole(e){return this.holes[e]??{node:N.types.identifier("undefined"),code:"undefined",reactive:!1}}emit(e){let{code:n,imports:r,templates:i}=R.emit(e,{});for(let o of r)this.used.add(o);return E(n,i)}lowerRoot(e){let n=this.lowerChildren(e);return n.length===1?n[0]:{kind:"fragment",children:n}}lowerChildren(e){let n=[];for(let r=0;r<e.length;r++){let i=e[r];if(i.kind==="Element"||i.kind==="Component"){let a=i.attributes.find(s=>s.kind==="IfDirective");if(a&&a.kind==="IfDirective"){let s=r+1;s<e.length&&this.isBlankText(e[s])&&s++;let l=e[s],c=l&&(l.kind==="Element"||l.kind==="Component")&&l.attributes.some(u=>u.kind==="ElseDirective");n.push(this.lowerIf(i,a.hole,c?l:null)),c&&(r=s);continue}if(i.attributes.some(s=>s.kind==="EachDirective")){n.push(this.lowerEach(i));continue}}let o=this.lowerNode(i);o&&n.push(o)}return n}isBlankText(e){return e.kind==="Text"&&!e.raw&&T(e.value)===""}lowerNode(e){switch(e.kind){case"Text":{if(e.raw)return{kind:"text",value:e.value};let n=T(e.value);return n?{kind:"text",value:n}:null}case"Comment":return null;case"Expression":{let n=this.hole(e.hole);return{kind:"expr",code:n.code,reactive:n.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(e.children)};case"Element":return this.lowerElement(e);case"Component":return this.lowerComponent(e);default:return null}}lowerElement(e){let n=e.attributes.find(r=>r.kind==="Attribute"&&r.name==="is");if(e.tag==="component"&&n&&n.value&&n.value.kind==="hole"){let r=e.attributes.filter(o=>o!==n),i=this.lowerComponent({...e,kind:"Component",tag:"Dynamic",tagHole:null,attributes:r});return i.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(n.value.hole).code})`}),i}return{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:this.lowerAttributes(e.attributes),children:this.lowerChildren(e.children),static:!1}}lowerComponent(e){let n=e.tagHole!=null?this.hole(e.tagHole).code:e.tag,r=this.lowerAttributes(e.attributes),{slots:i,rest:o}=this.partitionSlots(e.children);for(let[l,c]of i){let u=c.length===1?c[0]:{kind:"fragment",children:c},d={name:l,kind:"attr",expr:this.emit(u),jsxElement:!0},g=r.findIndex(S=>S.name===l);g>=0?r[g]=d:r.push(d)}let a=e.attributes.find(l=>l.kind==="LoadDirective"),s=a?y(`load:${a.strategy}`,a.modifier):void 0;return{kind:"component",name:n,props:r,children:this.lowerChildren(o),...s?{load:s}:{}}}partitionSlots(e){let n=new Map,r=[];for(let i of e){if(i.kind==="Element"||i.kind==="Component"){let o=i.attributes.find(a=>a.kind==="Attribute"&&a.name==="slot");if(o&&o.value&&o.value.kind==="static"){let a={...i,attributes:i.attributes.filter(c=>c!==o)},s=a.kind==="Element"?this.lowerElement(a):this.lowerComponent(a),l=n.get(o.value.value)??[];l.push(s),n.set(o.value.value,l);continue}}r.push(i)}return{slots:n,rest:r}}lowerIf(e,n,r){let i=this.hole(n),o=[{name:"when",kind:"attr",expr:i.code,reactive:i.reactive}];if(r){let s=this.stripAndLower(r,l=>l.kind==="ElseDirective");o.push({name:"fallback",kind:"attr",expr:this.emit(s),jsxElement:!0})}let a=this.stripAndLower(e,s=>s.kind==="IfDirective");return{kind:"component",name:"Show",props:o,children:[a]}}lowerEach(e){let n=e.attributes.find(l=>l.kind==="EachDirective");if(!n||n.kind!=="EachDirective")return this.lowerNode(e);let r=this.hole(n.hole),i=[{name:"each",kind:"attr",expr:r.code,reactive:r.reactive}];if(n.key){let l="static"in n.key?`(item) => item[${JSON.stringify(n.key.static)}]`:this.hole(n.key.hole).code;i.push({name:"by",kind:"attr",expr:l})}let o=this.itemArrow(e),a;if(o){let l=o.body,c={kind:"expr",code:h(l,this.used),reactive:m(l)},u=this.rebuildWithChildren(e,[c]);a=`(${o.params.map(d=>Ke(d)).join(", ")}) => (${this.emit(u)})`}else{let l=this.stripAndLower(e,c=>c.kind==="EachDirective");a=`() => (${this.emit(l)})`}return{kind:"component",name:"For",props:i,children:[{kind:"expr",code:a,reactive:!1}]}}itemArrow(e){let n=e.children.filter(i=>!this.isBlankText(i));if(n.length!==1||n[0].kind!=="Expression")return null;let r=this.hole(n[0].hole).node;return N.types.isArrowFunctionExpression(r)&&!N.types.isBlockStatement(r.body)?r:null}stripAndLower(e,n){let r={...e,attributes:e.attributes.filter(i=>!n(i))};return r.kind==="Element"?this.lowerElement(r):this.lowerComponent(r)}rebuildWithChildren(e,n){let r=this.lowerAttributes(e.attributes.filter(i=>i.kind!=="EachDirective"));return e.kind==="Element"?{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:r,children:n,static:!1}:{kind:"component",name:e.tag,props:r,children:n}}lowerAttributes(e){let n=[],r=[],i=!1,o=[],a=!1,s=[];for(let l of e)switch(l.kind){case"IfDirective":case"EachDirective":case"ElseDirective":break;case"Attribute":n.push(this.plainAttr(l));break;case"PropertyBinding":n.push({name:l.name,kind:"prop",expr:this.hole(l.hole).code,reactive:this.hole(l.hole).reactive});break;case"EventBinding":n.push(this.eventProp(l));break;case"RefBinding":n.push({name:"ref",kind:"ref",expr:this.hole(l.hole).code,reactive:this.hole(l.hole).reactive});break;case"Spread":n.push({name:"",kind:"spread",expr:this.hole(l.hole).code});break;case"ClassDirective":{let c=this.hole(l.hole);r.push(`${JSON.stringify(l.name)}: ${c.code}`),i=i||c.reactive;break}case"StyleDirective":{let c=this.hole(l.hole);o.push(`${JSON.stringify(l.name)}: ${c.code}`),a=a||c.reactive;break}case"BindDirective":n.push(...this.bindProps(l.name,this.hole(l.hole).code));break;case"UseDirective":{let c=l.name??(l.hole!=null?this.hole(l.hole).code:null);if(!c)break;s.push(l.name!=null&&l.hole!=null?`[${c}, () => (${this.hole(l.hole).code})]`:`[${c}]`);break}}return r.length>0&&n.push({name:"classList",kind:"attr",expr:`{ ${r.join(", ")} }`,reactive:i}),o.length>0&&n.push({name:"style",kind:"attr",expr:`{ ${o.join(", ")} }`,reactive:a}),s.length>0&&n.push({name:"use",kind:"attr",expr:`[${s.join(", ")}]`}),n}eventProp(e){let n=e.name.toLowerCase(),r=this.hole(e.hole).code;if(!(e.syntax==="colon"||e.modifiers.length>0))return{name:"on"+oe(e.name),kind:"event",event:{name:n,delegated:se.has(n)},expr:r};let o=this.wrapHandler(r,e.modifiers),a=this.eventOptions(e.modifiers),s=a?`[${o}, ${a}]`:o;return{name:"on:"+n,kind:"attr",expr:s}}wrapHandler(e,n){let r=n.includes("self")?"if (e.target !== e.currentTarget) return; ":"",i=[];return n.includes("prevent")&&i.push("e.preventDefault();"),n.includes("stop")&&i.push("e.stopPropagation();"),!r&&i.length===0?e:`(e) => { ${r}${i.join(" ")} return (${e})(e); }`}eventOptions(e){let n=[];return e.includes("capture")&&n.push("capture: true"),e.includes("once")&&n.push("once: true"),e.includes("passive")&&n.push("passive: true"),n.length?`{ ${n.join(", ")} }`:null}bindProps(e,n){let r=e==="checked",i=r?"change":"input",o=r?"checked":"value",a=`(${n})`;return[{name:e,kind:"attr",expr:`${a}[0]()`,reactive:!0},{name:"on"+oe(i),kind:"event",event:{name:i,delegated:se.has(i)},expr:`(e) => ${a}[1](e.target.${o})`}]}plainAttr(e){let n=e.value,r=e.name;e.name==="class"?r=n&&n.kind==="hole"&&N.types.isObjectExpression(this.hole(n.hole).node)?"classList":"className":e.name==="html"&&(r="innerHTML");let o={name:r,kind:"attr"};if(n==null)return o.literal=!0,o;if(n.kind==="static")return o.literal=n.value,o;if(n.kind==="hole"){let l=this.hole(n.hole);return o.expr=l.code,o.reactive=l.reactive,o}let a=!1,s=n.parts.map(l=>{if("text"in l)return qe(l.text);let c=this.hole(l.hole);return a=a||c.reactive,"${"+c.code+"}"}).join("");return o.expr="`"+s+"`",o.reactive=a,o}};function le(t,e,n={}){let r=t.quasi,i=r.expressions.map(s=>{let l=s;return{node:l,code:h(l,e),reactive:m(l)}}),o=Ze(r),{root:a}=(0,ae.parseTemplate)(o,{svg:n.svg});return new _(i,e).lowerRoot(a.children)}function Ze(t){let e=[];return t.quasis.forEach((n,r)=>{let i=n.value.cooked??n.value.raw;if(e.push({kind:"static",text:i,start:n.start??0}),r<t.expressions.length){let o=t.expressions[r];e.push({kind:"hole",index:r,start:o.start??0,end:o.end??0})}}),e}function j(t,e=new Set,n={}){let r=le(t,e,n);return w(r),r}
@@ -1 +1 @@
1
- {"version":3,"file":"build-ir-lit.d.ts","sourceRoot":"","sources":["../../../src/frontend/babel/build-ir-lit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,CAAC,CAAC,wBAAwB,EAChC,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,EAC7B,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3B,MAAM,CAER"}
1
+ {"version":3,"file":"build-ir-lit.d.ts","sourceRoot":"","sources":["../../../src/frontend/babel/build-ir-lit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,CAAC,CAAC,wBAAwB,EAChC,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,EAC7B,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3B,MAAM,CAKR"}
@@ -1,9 +1,13 @@
1
1
  import { lowerLitTemplate } from './lower-template.js';
2
+ import { analyzeStatic } from '../../optimize/analyze-static.js';
2
3
  /**
3
4
  * Build IR from a lit `` html`...` `` (or `` svg`...` ``) TaggedTemplateExpression.
4
5
  * `used` collects runtime symbols emitted for anything nested inside a hole.
5
6
  * Pass `svg: true` for an `` svg`...` `` root.
6
7
  */
7
8
  export function buildIRFromLit(node, used = new Set(), opts = {}) {
8
- return lowerLitTemplate(node, used, opts);
9
+ const ir = lowerLitTemplate(node, used, opts);
10
+ // Same pass as the JSX frontend, so both agree on what is inert.
11
+ analyzeStatic(ir);
12
+ return ir;
9
13
  }
@@ -1 +1 @@
1
- import{types as v}from"@babel/core";import C from"@babel/generator";import{parseTemplate as Z}from"@fluixi/template-parser";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 X={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function j(n){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(n)}function b(n){return j(n)?n:JSON.stringify(n)}function L(n){return n.expr!==void 0?n.reactive?`() => (${n.expr})`:`(${n.expr})`:JSON.stringify(n.literal??!0)}function D(n){return n.expr!==void 0?`(${n.expr})`:JSON.stringify(n.literal??!0)}function O(n,e,t){let r=n.filter(l=>l.kind==="spread"),a=n.filter(l=>l.kind!=="spread").map(l=>`${b(l.name)}: ${L(l)}`);e!=null&&a.push(`children: ${e}`);let o=`{ ${a.join(", ")} }`;return r.length>0?(t.add("mergeProps"),`mergeProps(${r.map(l=>l.expr).join(", ")}, ${o})`):o}function y(n,e){return n.length===1?f(n[0],e):`[${n.map(t=>f(t,e)).join(", ")}]`}function N(n,e,t,r){r.add("createMemo"),r.add("createComponent");let i=e.filter(s=>s.kind==="spread"),o=e.filter(s=>s.kind!=="spread").map(s=>`get ${b(s.name)}() { return ${D(s)}; }`);t.length>0&&o.push(`get children() { return ${y(t,r)}; }`);let l=`{ ${o.join(", ")} }`;return i.length>0&&(r.add("mergeProps"),l=`mergeProps(${i.map(s=>s.expr).join(", ")}, ${l})`),`createMemo(() => createComponent(${n}, ${l}))`}function f(n,e){switch(n.kind){case"text":return JSON.stringify(n.value);case"expr":return n.reactive?`() => (${n.code})`:`(${n.code})`;case"fragment":return n.children.length===0?"null":y(n.children,e);case"component":return N(n.name,n.props,n.children,e);case"control":{let t=X[n.control]??n.control;return e.add(t),N(t,n.props,n.children,e)}case"element":{e.add("createNativeElement");let t=JSON.stringify(n.tag),r="_el$",i=[],a=n.svg?`${t}, true`:t;if(i.push(`const ${r} = createNativeElement(${a});`),n.props.length>0){e.add("spread");let o=n.svg?", isSVG: true":"";i.push(`spread({ element: ${r}, props: ${O(n.props,null,e)}${o} });`)}for(let o of n.children){e.add("insert");let l=f(o,e),s=o.kind==="expr"&&o.reactive||o.kind==="component"||o.kind==="control";i.push(s?`insert(${r}, ${l}, null);`:`insert(${r}, ${l});`)}return i.push(`return ${r};`),`(() => { ${i.join(" ")} })()`}}}var h={name:"imperative",contract:x,emit(n,e){let t=new Set;return{code:f(n,t),imports:Array.from(t)}}};import{types as c,traverse as B,template as F}from"@babel/core";import S from"@babel/generator";var M=S.default??S;function $(n){return M(n,{concise:!0}).code}function _(n,e){let t=c.cloneNode(n,!0),r=c.file(c.program([c.expressionStatement(t)])),i=!1,a=(o,l,s)=>{for(let p of s)e.add(p);o.replaceWith(F.expression(l,{placeholderPattern:!1,plugins:["typescript"]})()),o.skip(),i=!0};return B(r,{"JSXElement|JSXFragment"(o){let l=o.node,{code:s,imports:p}=h.emit(k(l,e),{});a(o,s,p)},TaggedTemplateExpression(o){let l=o.node.tag;if(!c.isIdentifier(l)||l.name!=="html"&&l.name!=="svg")return;let s=w(o.node,e,{svg:l.name==="svg"}),{code:p,imports:m}=h.emit(s,{});a(o,p,m)}}),i?r.program.body[0].expression:n}function d(n,e){return $(_(n,e))}var H=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),V=/^on[A-Z]/,G=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function K(n){if(c.isJSXIdentifier(n)){let e=n.name[0]!==n.name[0].toLowerCase();return{tag:n.name,component:e}}return c.isJSXMemberExpression(n)?{tag:$(n),component:!0}:c.isJSXNamespacedName(n)?{tag:`${n.namespace.name}:${n.name.name}`,component:!1}:{tag:"div",component:!1}}function U(n){return c.isJSXIdentifier(n)?n.name==="class"?"className":n.name:c.isJSXNamespacedName(n)?`${n.namespace.name}:${n.name.name}`:"unknown"}function u(n){return c.isCallExpression(n)||c.isOptionalCallExpression(n)?!0:c.isMemberExpression(n)||c.isOptionalMemberExpression(n)?!(!n.computed&&c.isIdentifier(n.property,{name:"children"})):c.isConditionalExpression(n)?u(n.test)||u(n.consequent)||u(n.alternate):c.isLogicalExpression(n)||c.isBinaryExpression(n)?u(n.left)||u(n.right):c.isTemplateLiteral(n)?n.expressions.some(e=>u(e)):c.isObjectExpression(n)?n.properties.some(e=>c.isObjectProperty(e)&&!e.computed&&u(e.value)):c.isArrayExpression(n)?n.elements.some(e=>e!=null&&!c.isSpreadElement(e)&&u(e)):!1}function W(n,e){let t=U(n.name),r=V.test(t),i=r||t.startsWith("on:"),o={name:t,kind:r?"event":"attr"};r&&(o.event={name:t.slice(2).toLowerCase(),delegated:G.has(t.slice(2).toLowerCase())});let l=n.value;if(l==null)return o.literal=!0,o;if(c.isStringLiteral(l))return o.literal=l.value,o;if(c.isJSXExpressionContainer(l)&&!c.isJSXEmptyExpression(l.expression)){let s=l.expression;return c.isStringLiteral(s)||c.isNumericLiteral(s)||c.isBooleanLiteral(s)?(o.literal=s.value,o):(o.expr=d(s,e),o.reactive=i?!1:u(s),(c.isJSXElement(s)||c.isJSXFragment(s))&&(o.jsxElement=!0),o)}return o.literal=!0,o}function R(n,e){let t=n.value;return t==null?null:c.isStringLiteral(t)?JSON.stringify(t.value):c.isJSXExpressionContainer(t)&&!c.isJSXEmptyExpression(t.expression)?d(t.expression,e):null}function z(n,e){let t=[],r=[];for(let i of n){if(c.isJSXSpreadAttribute(i)){t.push({name:"",kind:"spread",expr:d(i.argument,e)});continue}if(!c.isJSXAttribute(i))continue;let a=c.isJSXNamespacedName(i.name)?i.name.namespace.name:null;if(a==="use"){let o=i.name.name.name;e.add(o);let l=R(i,e);r.push(l!=null?`[${o}, () => (${l})]`:`[${o}]`);continue}if(a==="oncapture"){let o=i.name.name.name.toLowerCase(),l=R(i,e)??"undefined";t.push({name:"on:"+o,kind:"attr",expr:`[${l}, { capture: true }]`});continue}t.push(W(i,e))}return r.length>0&&t.push({name:"use",kind:"attr",expr:`[${r.join(", ")}]`}),t}function g(n){let e=n.split(/\r\n|\n|\r/),t=0;for(let i=0;i<e.length;i++)/[^ \t]/.test(e[i])&&(t=i);let r="";for(let i=0;i<e.length;i++){let a=e[i].replace(/\t/g," ");i!==0&&(a=a.replace(/^ +/,"")),i!==e.length-1&&(a=a.replace(/ +$/,"")),a&&(i!==t&&(a+=" "),r+=a)}return r}function I(n,e){let t=[];for(let r of n)if(c.isJSXText(r)){let i=g(r.value);i&&t.push({kind:"text",value:i})}else if(c.isJSXExpressionContainer(r)){if(!c.isJSXEmptyExpression(r.expression)){let i=r.expression;t.push({kind:"expr",code:d(i,e),reactive:u(i)})}}else c.isJSXElement(r)||c.isJSXFragment(r)?t.push(k(r,e)):c.isJSXSpreadChild(r)&&t.push({kind:"expr",code:d(r.expression,e),reactive:!1});return t}function k(n,e=new Set){if(c.isJSXFragment(n))return{kind:"fragment",children:I(n.children,e)};let{tag:t,component:r}=K(n.openingElement.name),i=z(n.openingElement.attributes,e),a=I(n.children,e);return r?{kind:"component",name:t,props:i,children:a}:{kind:"element",tag:t,svg:H.has(t),props:i,children:a,static:!1}}var q=C.default??C;function Q(n){return q(n,{concise:!0}).code}var A=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function Y(n){return n.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function J(n){return n.charAt(0).toUpperCase()+n.slice(1)}var E=class{constructor(e,t){this.holes=e;this.used=t}hole(e){return this.holes[e]??{node:v.identifier("undefined"),code:"undefined",reactive:!1}}emit(e){let{code:t,imports:r}=h.emit(e,{});for(let i of r)this.used.add(i);return t}lowerRoot(e){let t=this.lowerChildren(e);return t.length===1?t[0]:{kind:"fragment",children:t}}lowerChildren(e){let t=[];for(let r=0;r<e.length;r++){let i=e[r];if(i.kind==="Element"||i.kind==="Component"){let o=i.attributes.find(l=>l.kind==="IfDirective");if(o&&o.kind==="IfDirective"){let l=r+1;l<e.length&&this.isBlankText(e[l])&&l++;let s=e[l],p=s&&(s.kind==="Element"||s.kind==="Component")&&s.attributes.some(m=>m.kind==="ElseDirective");t.push(this.lowerIf(i,o.hole,p?s:null)),p&&(r=l);continue}if(i.attributes.some(l=>l.kind==="EachDirective")){t.push(this.lowerEach(i));continue}}let a=this.lowerNode(i);a&&t.push(a)}return t}isBlankText(e){return e.kind==="Text"&&!e.raw&&g(e.value)===""}lowerNode(e){switch(e.kind){case"Text":{if(e.raw)return{kind:"text",value:e.value};let t=g(e.value);return t?{kind:"text",value:t}:null}case"Comment":return null;case"Expression":{let t=this.hole(e.hole);return{kind:"expr",code:t.code,reactive:t.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(e.children)};case"Element":return this.lowerElement(e);case"Component":return this.lowerComponent(e);default:return null}}lowerElement(e){let t=e.attributes.find(r=>r.kind==="Attribute"&&r.name==="is");if(e.tag==="component"&&t&&t.value&&t.value.kind==="hole"){let r=e.attributes.filter(a=>a!==t),i=this.lowerComponent({...e,kind:"Component",tag:"Dynamic",tagHole:null,attributes:r});return i.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(t.value.hole).code})`}),i}return{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:this.lowerAttributes(e.attributes),children:this.lowerChildren(e.children),static:!1}}lowerComponent(e){let t=e.tagHole!=null?this.hole(e.tagHole).code:e.tag,r=this.lowerAttributes(e.attributes),{slots:i,rest:a}=this.partitionSlots(e.children);for(let[o,l]of i){let s=l.length===1?l[0]:{kind:"fragment",children:l};r.push({name:o,kind:"attr",expr:this.emit(s),jsxElement:!0})}return{kind:"component",name:t,props:r,children:this.lowerChildren(a)}}partitionSlots(e){let t=new Map,r=[];for(let i of e){if(i.kind==="Element"||i.kind==="Component"){let a=i.attributes.find(o=>o.kind==="Attribute"&&o.name==="slot");if(a&&a.value&&a.value.kind==="static"){let o={...i,attributes:i.attributes.filter(p=>p!==a)},l=o.kind==="Element"?this.lowerElement(o):this.lowerComponent(o),s=t.get(a.value.value)??[];s.push(l),t.set(a.value.value,s);continue}}r.push(i)}return{slots:t,rest:r}}lowerIf(e,t,r){let i=this.hole(t),a=[{name:"when",kind:"attr",expr:i.code,reactive:i.reactive}];if(r){let l=this.stripAndLower(r,s=>s.kind==="ElseDirective");a.push({name:"fallback",kind:"attr",expr:this.emit(l),jsxElement:!0})}let o=this.stripAndLower(e,l=>l.kind==="IfDirective");return{kind:"component",name:"Show",props:a,children:[o]}}lowerEach(e){let t=e.attributes.find(s=>s.kind==="EachDirective");if(!t||t.kind!=="EachDirective")return this.lowerNode(e);let r=this.hole(t.hole),i=[{name:"each",kind:"attr",expr:r.code,reactive:r.reactive}];if(t.key){let s="static"in t.key?`(item) => item[${JSON.stringify(t.key.static)}]`:this.hole(t.key.hole).code;i.push({name:"by",kind:"attr",expr:s})}let a=this.itemArrow(e),o;if(a){let s=a.body,p={kind:"expr",code:d(s,this.used),reactive:u(s)},m=this.rebuildWithChildren(e,[p]);o=`(${a.params.map(T=>Q(T)).join(", ")}) => (${this.emit(m)})`}else{let s=this.stripAndLower(e,p=>p.kind==="EachDirective");o=`() => (${this.emit(s)})`}return{kind:"component",name:"For",props:i,children:[{kind:"expr",code:o,reactive:!1}]}}itemArrow(e){let t=e.children.filter(i=>!this.isBlankText(i));if(t.length!==1||t[0].kind!=="Expression")return null;let r=this.hole(t[0].hole).node;return v.isArrowFunctionExpression(r)&&!v.isBlockStatement(r.body)?r:null}stripAndLower(e,t){let r={...e,attributes:e.attributes.filter(i=>!t(i))};return r.kind==="Element"?this.lowerElement(r):this.lowerComponent(r)}rebuildWithChildren(e,t){let r=this.lowerAttributes(e.attributes.filter(i=>i.kind!=="EachDirective"));return e.kind==="Element"?{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:r,children:t,static:!1}:{kind:"component",name:e.tag,props:r,children:t}}lowerAttributes(e){let t=[],r=[],i=!1,a=[],o=!1,l=[];for(let s of e)switch(s.kind){case"IfDirective":case"EachDirective":case"ElseDirective":break;case"Attribute":t.push(this.plainAttr(s));break;case"PropertyBinding":t.push({name:s.name,kind:"prop",expr:this.hole(s.hole).code,reactive:this.hole(s.hole).reactive});break;case"EventBinding":t.push(this.eventProp(s));break;case"RefBinding":t.push({name:"ref",kind:"ref",expr:this.hole(s.hole).code,reactive:this.hole(s.hole).reactive});break;case"Spread":t.push({name:"",kind:"spread",expr:this.hole(s.hole).code});break;case"ClassDirective":{let p=this.hole(s.hole);r.push(`${JSON.stringify(s.name)}: ${p.code}`),i=i||p.reactive;break}case"StyleDirective":{let p=this.hole(s.hole);a.push(`${JSON.stringify(s.name)}: ${p.code}`),o=o||p.reactive;break}case"BindDirective":t.push(...this.bindProps(s.name,this.hole(s.hole).code));break;case"UseDirective":{let p=s.name??(s.hole!=null?this.hole(s.hole).code:null);if(!p)break;l.push(s.name!=null&&s.hole!=null?`[${p}, () => (${this.hole(s.hole).code})]`:`[${p}]`);break}}return r.length>0&&t.push({name:"classList",kind:"attr",expr:`{ ${r.join(", ")} }`,reactive:i}),a.length>0&&t.push({name:"style",kind:"attr",expr:`{ ${a.join(", ")} }`,reactive:o}),l.length>0&&t.push({name:"use",kind:"attr",expr:`[${l.join(", ")}]`}),t}eventProp(e){let t=e.name.toLowerCase(),r=this.hole(e.hole).code;if(!(e.syntax==="colon"||e.modifiers.length>0))return{name:"on"+J(e.name),kind:"event",event:{name:t,delegated:A.has(t)},expr:r};let a=this.wrapHandler(r,e.modifiers),o=this.eventOptions(e.modifiers),l=o?`[${a}, ${o}]`:a;return{name:"on:"+t,kind:"attr",expr:l}}wrapHandler(e,t){let r=t.includes("self")?"if (e.target !== e.currentTarget) return; ":"",i=[];return t.includes("prevent")&&i.push("e.preventDefault();"),t.includes("stop")&&i.push("e.stopPropagation();"),!r&&i.length===0?e:`(e) => { ${r}${i.join(" ")} return (${e})(e); }`}eventOptions(e){let t=[];return e.includes("capture")&&t.push("capture: true"),e.includes("once")&&t.push("once: true"),e.includes("passive")&&t.push("passive: true"),t.length?`{ ${t.join(", ")} }`:null}bindProps(e,t){let r=e==="checked",i=r?"change":"input",a=r?"checked":"value",o=`(${t})`;return[{name:e,kind:"attr",expr:`${o}[0]()`,reactive:!0},{name:"on"+J(i),kind:"event",event:{name:i,delegated:A.has(i)},expr:`(e) => ${o}[1](e.target.${a})`}]}plainAttr(e){let t=e.value,r=e.name;e.name==="class"?r=t&&t.kind==="hole"&&v.isObjectExpression(this.hole(t.hole).node)?"classList":"className":e.name==="html"&&(r="innerHTML");let a={name:r,kind:"attr"};if(t==null)return a.literal=!0,a;if(t.kind==="static")return a.literal=t.value,a;if(t.kind==="hole"){let s=this.hole(t.hole);return a.expr=s.code,a.reactive=s.reactive,a}let o=!1,l=t.parts.map(s=>{if("text"in s)return Y(s.text);let p=this.hole(s.hole);return o=o||p.reactive,"${"+p.code+"}"}).join("");return a.expr="`"+l+"`",a.reactive=o,a}};function P(n,e,t={}){let r=n.quasi,i=r.expressions.map(l=>{let s=l;return{node:s,code:d(s,e),reactive:u(s)}}),a=ee(r),{root:o}=Z(a,{svg:t.svg});return new E(i,e).lowerRoot(o.children)}function ee(n){let e=[];return n.quasis.forEach((t,r)=>{let i=t.value.cooked??t.value.raw;if(e.push({kind:"static",text:i,start:t.start??0}),r<n.expressions.length){let a=n.expressions[r];e.push({kind:"hole",index:r,start:a.start??0,end:a.end??0})}}),e}function w(n,e=new Set,t={}){return P(n,e,t)}export{w as buildIRFromLit};
1
+ import{types as w}from"@babel/core";import te from"@babel/generator";import{parseTemplate as _e}from"@fluixi/template-parser";var se={kind:"eager"},oe=["pointerdown","focusin","keydown"],O=new Set(["eager","idle","visible","interaction","media","never"]),f=class extends Error{};function T(t){return t.startsWith("load:")}function S(t,e){let n=t.slice(5);if(!O.has(n))throw new f(`Unknown load strategy 'load:${n}'. Expected one of ${[...O].join(", ")}.`);switch(n){case"eager":return se;case"idle":return{kind:"idle"};case"never":return{kind:"never"};case"visible":return e?{kind:"visible",rootMargin:e}:{kind:"visible"};case"interaction":return{kind:"interaction",events:e?ae(e):[...oe]};case"media":if(!e)throw new f(`'load:media' needs a query, e.g. load:media="(min-width: 1024px)".`);return{kind:"media",query:e};default:throw new f(`Unhandled load strategy '${n}'.`)}}function ae(t){let e=t.split(/[\s,]+/).map(n=>n.trim()).filter(Boolean);if(e.length===0)throw new f("'load:interaction' was given no event names.");return e}var le=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),_={className:"class",htmlFor:"for"},ce=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),pe=new Set(["script","style","textarea","title"]);function C(t){return pe.has(t)}function M(t){return _[t]??t}function v(t){return t.kind!=="attr"||t.expr!==void 0||t.name.includes(":")?!1:!ce.has(t.name)}function A(t){if(!t.static||C(t.tag))return!1;for(let e of t.props)if(!v(e))return!1;for(let e of t.children)if(e.kind!=="text"&&!(e.kind==="element"&&A(e)))return!1;return!0}function x(t){let e=t.props.map(de).filter(Boolean).join(""),n=`<${t.tag}${e}>`;return le.has(t.tag)?n:`${n}${t.children.map(ue).join("")}</${t.tag}>`}function ue(t){if(t.kind==="text")return fe(t.value);if(t.kind!=="element")throw new Error(`serializeStatic: unexpected ${t.kind}`);return x(t)}function de(t){let e=_[t.name]??t.name,n=t.literal;return n===!0||n===void 0?` ${e}`:n===!1||n===null?"":` ${e}="${me(String(n))}"`}function me(t){return t.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function fe(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var he="<!--fx-->",ge="<!--fx/-->";function y(t){return t.kind==="expr"||t.kind==="component"||t.kind==="control"}function ve(t){return t.kind==="text"||t.kind==="element"&&B(t)}function B(t){return t.svg||C(t.tag)||!t.props.every(e=>v(e))?!1:t.children.every(e=>ve(e)||y(e))}function b(t){if(y(t))return!0;let e=t.children;return e?e.some(b):!1}function H(t){for(let e=0;e<t.children.length;e++){let n=t.children[e];if(n.kind==="text"&&(n.value===""||t.children[e+1]?.kind==="text"))return!1}return t.children.every(e=>e.kind!=="element"||H(e))}function F(t){if(!B(t)||!H(t)||!t.children.some(b))return null;let e=[],n=[],r=0,i=a=>{let s=`_n$${r++}`;return e.push({ref:s,expr:a}),s};return o(t,"_el$"),{html:xe(t),tag:t.tag,steps:e,holes:n};function o(a,s){let l=-1;a.children.forEach((u,d)=>{b(u)&&(l=d)});let c=null;for(let u=0;u<=l;u++){let d=a.children[u],g=c?`${c}.nextSibling`:`${s}.firstChild`;if(y(d)){let D=i(g),j=i(`holeEnd(${D})`);n.push({parentRef:s,startRef:D,endRef:j,node:d}),c=j;continue}let N=i(g);d.kind==="element"&&b(d)&&o(d,N),c=N}}}function xe(t){return x(z(t)).split(V).join(he+ge)}function z(t){return{...t,children:t.children.map(e=>y(e)?{kind:"text",value:V}:e.kind==="element"?z(e):e)}}var V="\0fx-hole\0";var P={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},Ge={version:2,module:"@fluixi/dom",symbols:[...P.symbols,"template","cloneTemplate","walk"]};var ke={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function Ee(t){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(t)}function U(t){return Ee(t)?t:JSON.stringify(t)}function Re(t){return t.expr!==void 0?t.reactive?`() => (${t.expr})`:`(${t.expr})`:JSON.stringify(t.literal??!0)}function Ne(t){return t.expr!==void 0?`(${t.expr})`:JSON.stringify(t.literal??!0)}function Se(t,e,n){let r=t.filter(s=>s.kind==="spread"),o=t.filter(s=>s.kind!=="spread").map(s=>`${U(s.name)}: ${Re(s)}`);e!=null&&o.push(`children: ${e}`);let a=`{ ${o.join(", ")} }`;return r.length>0?(n.add("mergeProps"),`mergeProps(${r.map(s=>s.expr).join(", ")}, ${a})`):a}function G(t,e,n){return t.length===1?k(t[0],e,n):`[${t.map(r=>k(r,e,n)).join(", ")}]`}function W(t,e,n,r,i){r.add("createMemo"),r.add("createComponent");let o=e.filter(c=>c.kind==="spread"),s=e.filter(c=>c.kind!=="spread").map(c=>`get ${U(c.name)}() { return ${Ne(c)}; }`);n.length>0&&s.push(`get children() { return ${G(n,r,i)}; }`);let l=`{ ${s.join(", ")} }`;return o.length>0&&(r.add("mergeProps"),l=`mergeProps(${o.map(c=>c.expr).join(", ")}, ${l})`),`createMemo(() => createComponent(${t}, ${l}))`}function be(t,e){let n=M(e.name),r=e.literal;return r===!0||r===void 0?`${t}.setAttribute(${JSON.stringify(n)}, "");`:r===!1||r===null?"":`${t}.setAttribute(${JSON.stringify(n)}, ${JSON.stringify(String(r))});`}var K=!1;function k(t,e,n){switch(t.kind){case"text":return JSON.stringify(t.value);case"expr":return t.reactive?`() => (${t.code})`:`(${t.code})`;case"fragment":return t.children.length===0?"null":G(t.children,e,n);case"component":return W(t.name,t.props,t.children,e,n);case"control":{let r=ke[t.control]??t.control;return e.add(r),W(r,t.props,t.children,e,n)}case"element":{if(n&&t.static&&!t.svg&&A(t)){e.add("templateNode");let s=`_tmpl$${n.length}`;return n.push({id:s,html:x(t),tag:t.tag,svg:!1}),`templateNode(${s}, ${JSON.stringify(t.tag)})`}if(n&&K){let s=F(t);if(s){e.add("templateNode"),e.add("insert"),e.add("holeEnd"),e.add("holeContent"),e.add("holeScope");let l=`_tmpl$${n.length}`;n.push({id:l,html:s.html,tag:s.tag,svg:!1});let c=[`const _el$ = templateNode(${l}, ${JSON.stringify(s.tag)}, true);`];for(let u of s.steps)c.push(`const ${u.ref} = ${u.expr};`);for(let u of s.holes)c.push(`insert(${u.parentRef}, holeScope(${u.startRef}, () => (${k(u.node,e,n)})), ${u.endRef}, holeContent(${u.startRef}, ${u.endRef}));`);return c.push("return _el$;"),`(() => { ${c.join(" ")} })()`}}e.add("createNativeElement");let r=JSON.stringify(t.tag),i="_el$",o=[],a=t.svg?`${r}, true`:r;if(o.push(`const ${i} = createNativeElement(${a});`),t.props.length>0)if(!t.svg&&t.props.every(v))for(let s of t.props)o.push(be(i,s));else{e.add("spread");let s=t.svg?", isSVG: true":"";o.push(`spread({ element: ${i}, props: ${Se(t.props,null,e)}${s} });`)}for(let s of t.children){e.add("insert");let l=k(s,e,n),c=s.kind==="expr"&&s.reactive||s.kind==="component"||s.kind==="control";o.push(c?`insert(${i}, ${l}, null);`:`insert(${i}, ${l});`)}return o.push(`return ${i};`),`(() => { ${o.join(" ")} })()`}}}function E(t,e){if(!e||e.length===0)return t;let n=new Map(e.map(r=>[r.id,JSON.stringify(r.html)]));return t.replace(/_tmpl\$\d+/g,r=>n.get(r)??r)}var R={name:"imperative",contract:P,emit(t,e){let n=new Set,r=e?.templateClone!==!1?[]:void 0;return K=e?.partialTemplates===!0,{code:k(t,n,r),imports:Array.from(n),templates:r}}};import{types as p,traverse as $e,template as we}from"@babel/core";import q from"@babel/generator";function ye(t){switch(t.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 t.reactive?"reactive-prop":t.expr!==void 0?"expression-prop":void 0;default:return"expression-prop"}}function I(t){let e=[],n=new Map,r=i=>{switch(i.kind){case"text":return!0;case"expr":return!1;case"component":case"control":for(let o of i.children)r(o);return!1;case"fragment":for(let o of i.children)r(o);return!1;case"element":{let o=!0;for(let s of i.children)r(s)||(o=!1);let a;for(let s of i.props)if(a=ye(s),a)break;return!a&&!o&&(a=Ie(i)),i.static=!a,a?n.set(i,a):e.push(i),i.static}default:return!1}};for(let i of Array.isArray(t)?t:[t])r(i);return{staticElements:e,reasons:n}}function Ie(t){for(let e of t.children){if(e.kind==="expr")return"expression-child";if(e.kind==="component")return"component-child";if(e.kind==="control")return"control-child";if(e.kind==="element"&&!e.static||e.kind==="fragment")return"expression-child"}return"expression-child"}var Te=q.default??q;function Q(t){return Te(t,{concise:!0}).code}function Ce(t,e){let n=p.cloneNode(t,!0),r=p.file(p.program([p.expressionStatement(n)])),i=!1,o=(a,s,l)=>{for(let c of l)e.add(c);a.replaceWith(we.expression(s,{placeholderPattern:!1,plugins:["typescript"]})()),a.skip(),i=!0};return $e(r,{"JSXElement|JSXFragment"(a){let s=a.node,{code:l,imports:c,templates:u}=R.emit(je(s,e),{});o(a,E(l,u),c)},TaggedTemplateExpression(a){let s=a.node.tag;if(!p.isIdentifier(s)||s.name!=="html"&&s.name!=="svg")return;let l=ee(a.node,e,{svg:s.name==="svg"}),{code:c,imports:u,templates:d}=R.emit(l,{});o(a,E(c,d),u)}}),i?r.program.body[0].expression:t}function h(t,e){return Q(Ce(t,e))}var Ae=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),Pe=/^on[A-Z]/,Je=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function Le(t){if(p.isJSXIdentifier(t)){let e=t.name[0]!==t.name[0].toLowerCase();return{tag:t.name,component:e}}return p.isJSXMemberExpression(t)?{tag:Q(t),component:!0}:p.isJSXNamespacedName(t)?{tag:`${t.namespace.name}:${t.name.name}`,component:!1}:{tag:"div",component:!1}}function L(t){return p.isJSXIdentifier(t)?t.name==="class"?"className":t.name:p.isJSXNamespacedName(t)?`${t.namespace.name}:${t.name.name}`:"unknown"}function m(t){return p.isCallExpression(t)||p.isOptionalCallExpression(t)?!0:p.isMemberExpression(t)||p.isOptionalMemberExpression(t)?!(!t.computed&&p.isIdentifier(t.property,{name:"children"})):p.isConditionalExpression(t)?m(t.test)||m(t.consequent)||m(t.alternate):p.isLogicalExpression(t)||p.isBinaryExpression(t)?m(t.left)||m(t.right):p.isTemplateLiteral(t)?t.expressions.some(e=>m(e)):p.isObjectExpression(t)?t.properties.some(e=>p.isObjectProperty(e)&&!e.computed&&m(e.value)):p.isArrayExpression(t)?t.elements.some(e=>e!=null&&!p.isSpreadElement(e)&&m(e)):!1}function Xe(t,e){let n=L(t.name),r=Pe.test(n),i=r||n.startsWith("on:"),a={name:n,kind:r?"event":"attr"};r&&(a.event={name:n.slice(2).toLowerCase(),delegated:Je.has(n.slice(2).toLowerCase())});let s=t.value;if(s==null)return a.literal=!0,a;if(p.isStringLiteral(s))return a.literal=s.value,a;if(p.isJSXExpressionContainer(s)&&!p.isJSXEmptyExpression(s.expression)){let l=s.expression;return p.isStringLiteral(l)||p.isNumericLiteral(l)||p.isBooleanLiteral(l)?(a.literal=l.value,a):(a.expr=h(l,e),a.reactive=i?!1:m(l),(p.isJSXElement(l)||p.isJSXFragment(l))&&(a.jsxElement=!0),a)}return a.literal=!0,a}function Z(t,e){let n=t.value;return n==null?null:p.isStringLiteral(n)?JSON.stringify(n.value):p.isJSXExpressionContainer(n)&&!p.isJSXEmptyExpression(n.expression)?h(n.expression,e):null}function De(t,e){let n=[],r=[];for(let i of t){if(p.isJSXSpreadAttribute(i)){n.push({name:"",kind:"spread",expr:h(i.argument,e)});continue}if(!p.isJSXAttribute(i)||T(L(i.name)))continue;let o=p.isJSXNamespacedName(i.name)?i.name.namespace.name:null;if(o==="use"){let a=i.name.name.name;e.add(a);let s=Z(i,e);r.push(s!=null?`[${a}, () => (${s})]`:`[${a}]`);continue}if(o==="oncapture"){let a=i.name.name.name.toLowerCase(),s=Z(i,e)??"undefined";n.push({name:"on:"+a,kind:"attr",expr:`[${s}, { capture: true }]`});continue}n.push(Xe(i,e))}return r.length>0&&n.push({name:"use",kind:"attr",expr:`[${r.join(", ")}]`}),n}function $(t){let e=t.split(/\r\n|\n|\r/),n=0;for(let i=0;i<e.length;i++)/[^ \t]/.test(e[i])&&(n=i);let r="";for(let i=0;i<e.length;i++){let o=e[i].replace(/\t/g," ");i!==0&&(o=o.replace(/^ +/,"")),i!==e.length-1&&(o=o.replace(/ +$/,"")),o&&(i!==n&&(o+=" "),r+=o)}return r}function Y(t,e){let n=[];for(let r of t)if(p.isJSXText(r)){let i=$(r.value);i&&n.push({kind:"text",value:i})}else if(p.isJSXExpressionContainer(r)){if(!p.isJSXEmptyExpression(r.expression)){let i=r.expression;n.push({kind:"expr",code:h(i,e),reactive:m(i)})}}else p.isJSXElement(r)||p.isJSXFragment(r)?n.push(J(r,e)):p.isJSXSpreadChild(r)&&n.push({kind:"expr",code:h(r.expression,e),reactive:!1});return n}function je(t,e=new Set){let n=J(t,e);return I(n),n}function J(t,e){if(p.isJSXFragment(t))return{kind:"fragment",children:Y(t.children,e)};let{tag:n,component:r}=Le(t.openingElement.name),i=De(t.openingElement.attributes,e),o=Y(t.children,e);if(r){let a=Oe(t.openingElement.attributes);return{kind:"component",name:n,props:i,children:o,...a?{load:a}:{}}}return{kind:"element",tag:n,svg:Ae.has(n),props:i,children:o,static:!1}}function Oe(t){for(let e of t){if(!p.isJSXAttribute(e))continue;let n=L(e.name);if(T(n)){if(e.value&&!p.isStringLiteral(e.value))throw new f(`'${n}' needs a literal value, not an expression — the strategy is compile-time.`);return S(n,e.value?e.value.value:null)}}}var Me=te.default??te;function Be(t){return Me(t,{concise:!0}).code}var ne=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function He(t){return t.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function re(t){return t.charAt(0).toUpperCase()+t.slice(1)}var X=class{constructor(e,n){this.holes=e;this.used=n}hole(e){return this.holes[e]??{node:w.identifier("undefined"),code:"undefined",reactive:!1}}emit(e){let{code:n,imports:r,templates:i}=R.emit(e,{});for(let o of r)this.used.add(o);return E(n,i)}lowerRoot(e){let n=this.lowerChildren(e);return n.length===1?n[0]:{kind:"fragment",children:n}}lowerChildren(e){let n=[];for(let r=0;r<e.length;r++){let i=e[r];if(i.kind==="Element"||i.kind==="Component"){let a=i.attributes.find(s=>s.kind==="IfDirective");if(a&&a.kind==="IfDirective"){let s=r+1;s<e.length&&this.isBlankText(e[s])&&s++;let l=e[s],c=l&&(l.kind==="Element"||l.kind==="Component")&&l.attributes.some(u=>u.kind==="ElseDirective");n.push(this.lowerIf(i,a.hole,c?l:null)),c&&(r=s);continue}if(i.attributes.some(s=>s.kind==="EachDirective")){n.push(this.lowerEach(i));continue}}let o=this.lowerNode(i);o&&n.push(o)}return n}isBlankText(e){return e.kind==="Text"&&!e.raw&&$(e.value)===""}lowerNode(e){switch(e.kind){case"Text":{if(e.raw)return{kind:"text",value:e.value};let n=$(e.value);return n?{kind:"text",value:n}:null}case"Comment":return null;case"Expression":{let n=this.hole(e.hole);return{kind:"expr",code:n.code,reactive:n.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(e.children)};case"Element":return this.lowerElement(e);case"Component":return this.lowerComponent(e);default:return null}}lowerElement(e){let n=e.attributes.find(r=>r.kind==="Attribute"&&r.name==="is");if(e.tag==="component"&&n&&n.value&&n.value.kind==="hole"){let r=e.attributes.filter(o=>o!==n),i=this.lowerComponent({...e,kind:"Component",tag:"Dynamic",tagHole:null,attributes:r});return i.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(n.value.hole).code})`}),i}return{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:this.lowerAttributes(e.attributes),children:this.lowerChildren(e.children),static:!1}}lowerComponent(e){let n=e.tagHole!=null?this.hole(e.tagHole).code:e.tag,r=this.lowerAttributes(e.attributes),{slots:i,rest:o}=this.partitionSlots(e.children);for(let[l,c]of i){let u=c.length===1?c[0]:{kind:"fragment",children:c},d={name:l,kind:"attr",expr:this.emit(u),jsxElement:!0},g=r.findIndex(N=>N.name===l);g>=0?r[g]=d:r.push(d)}let a=e.attributes.find(l=>l.kind==="LoadDirective"),s=a?S(`load:${a.strategy}`,a.modifier):void 0;return{kind:"component",name:n,props:r,children:this.lowerChildren(o),...s?{load:s}:{}}}partitionSlots(e){let n=new Map,r=[];for(let i of e){if(i.kind==="Element"||i.kind==="Component"){let o=i.attributes.find(a=>a.kind==="Attribute"&&a.name==="slot");if(o&&o.value&&o.value.kind==="static"){let a={...i,attributes:i.attributes.filter(c=>c!==o)},s=a.kind==="Element"?this.lowerElement(a):this.lowerComponent(a),l=n.get(o.value.value)??[];l.push(s),n.set(o.value.value,l);continue}}r.push(i)}return{slots:n,rest:r}}lowerIf(e,n,r){let i=this.hole(n),o=[{name:"when",kind:"attr",expr:i.code,reactive:i.reactive}];if(r){let s=this.stripAndLower(r,l=>l.kind==="ElseDirective");o.push({name:"fallback",kind:"attr",expr:this.emit(s),jsxElement:!0})}let a=this.stripAndLower(e,s=>s.kind==="IfDirective");return{kind:"component",name:"Show",props:o,children:[a]}}lowerEach(e){let n=e.attributes.find(l=>l.kind==="EachDirective");if(!n||n.kind!=="EachDirective")return this.lowerNode(e);let r=this.hole(n.hole),i=[{name:"each",kind:"attr",expr:r.code,reactive:r.reactive}];if(n.key){let l="static"in n.key?`(item) => item[${JSON.stringify(n.key.static)}]`:this.hole(n.key.hole).code;i.push({name:"by",kind:"attr",expr:l})}let o=this.itemArrow(e),a;if(o){let l=o.body,c={kind:"expr",code:h(l,this.used),reactive:m(l)},u=this.rebuildWithChildren(e,[c]);a=`(${o.params.map(d=>Be(d)).join(", ")}) => (${this.emit(u)})`}else{let l=this.stripAndLower(e,c=>c.kind==="EachDirective");a=`() => (${this.emit(l)})`}return{kind:"component",name:"For",props:i,children:[{kind:"expr",code:a,reactive:!1}]}}itemArrow(e){let n=e.children.filter(i=>!this.isBlankText(i));if(n.length!==1||n[0].kind!=="Expression")return null;let r=this.hole(n[0].hole).node;return w.isArrowFunctionExpression(r)&&!w.isBlockStatement(r.body)?r:null}stripAndLower(e,n){let r={...e,attributes:e.attributes.filter(i=>!n(i))};return r.kind==="Element"?this.lowerElement(r):this.lowerComponent(r)}rebuildWithChildren(e,n){let r=this.lowerAttributes(e.attributes.filter(i=>i.kind!=="EachDirective"));return e.kind==="Element"?{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:r,children:n,static:!1}:{kind:"component",name:e.tag,props:r,children:n}}lowerAttributes(e){let n=[],r=[],i=!1,o=[],a=!1,s=[];for(let l of e)switch(l.kind){case"IfDirective":case"EachDirective":case"ElseDirective":break;case"Attribute":n.push(this.plainAttr(l));break;case"PropertyBinding":n.push({name:l.name,kind:"prop",expr:this.hole(l.hole).code,reactive:this.hole(l.hole).reactive});break;case"EventBinding":n.push(this.eventProp(l));break;case"RefBinding":n.push({name:"ref",kind:"ref",expr:this.hole(l.hole).code,reactive:this.hole(l.hole).reactive});break;case"Spread":n.push({name:"",kind:"spread",expr:this.hole(l.hole).code});break;case"ClassDirective":{let c=this.hole(l.hole);r.push(`${JSON.stringify(l.name)}: ${c.code}`),i=i||c.reactive;break}case"StyleDirective":{let c=this.hole(l.hole);o.push(`${JSON.stringify(l.name)}: ${c.code}`),a=a||c.reactive;break}case"BindDirective":n.push(...this.bindProps(l.name,this.hole(l.hole).code));break;case"UseDirective":{let c=l.name??(l.hole!=null?this.hole(l.hole).code:null);if(!c)break;s.push(l.name!=null&&l.hole!=null?`[${c}, () => (${this.hole(l.hole).code})]`:`[${c}]`);break}}return r.length>0&&n.push({name:"classList",kind:"attr",expr:`{ ${r.join(", ")} }`,reactive:i}),o.length>0&&n.push({name:"style",kind:"attr",expr:`{ ${o.join(", ")} }`,reactive:a}),s.length>0&&n.push({name:"use",kind:"attr",expr:`[${s.join(", ")}]`}),n}eventProp(e){let n=e.name.toLowerCase(),r=this.hole(e.hole).code;if(!(e.syntax==="colon"||e.modifiers.length>0))return{name:"on"+re(e.name),kind:"event",event:{name:n,delegated:ne.has(n)},expr:r};let o=this.wrapHandler(r,e.modifiers),a=this.eventOptions(e.modifiers),s=a?`[${o}, ${a}]`:o;return{name:"on:"+n,kind:"attr",expr:s}}wrapHandler(e,n){let r=n.includes("self")?"if (e.target !== e.currentTarget) return; ":"",i=[];return n.includes("prevent")&&i.push("e.preventDefault();"),n.includes("stop")&&i.push("e.stopPropagation();"),!r&&i.length===0?e:`(e) => { ${r}${i.join(" ")} return (${e})(e); }`}eventOptions(e){let n=[];return e.includes("capture")&&n.push("capture: true"),e.includes("once")&&n.push("once: true"),e.includes("passive")&&n.push("passive: true"),n.length?`{ ${n.join(", ")} }`:null}bindProps(e,n){let r=e==="checked",i=r?"change":"input",o=r?"checked":"value",a=`(${n})`;return[{name:e,kind:"attr",expr:`${a}[0]()`,reactive:!0},{name:"on"+re(i),kind:"event",event:{name:i,delegated:ne.has(i)},expr:`(e) => ${a}[1](e.target.${o})`}]}plainAttr(e){let n=e.value,r=e.name;e.name==="class"?r=n&&n.kind==="hole"&&w.isObjectExpression(this.hole(n.hole).node)?"classList":"className":e.name==="html"&&(r="innerHTML");let o={name:r,kind:"attr"};if(n==null)return o.literal=!0,o;if(n.kind==="static")return o.literal=n.value,o;if(n.kind==="hole"){let l=this.hole(n.hole);return o.expr=l.code,o.reactive=l.reactive,o}let a=!1,s=n.parts.map(l=>{if("text"in l)return He(l.text);let c=this.hole(l.hole);return a=a||c.reactive,"${"+c.code+"}"}).join("");return o.expr="`"+s+"`",o.reactive=a,o}};function ie(t,e,n={}){let r=t.quasi,i=r.expressions.map(s=>{let l=s;return{node:l,code:h(l,e),reactive:m(l)}}),o=Fe(r),{root:a}=_e(o,{svg:n.svg});return new X(i,e).lowerRoot(a.children)}function Fe(t){let e=[];return t.quasis.forEach((n,r)=>{let i=n.value.cooked??n.value.raw;if(e.push({kind:"static",text:i,start:n.start??0}),r<t.expressions.length){let o=t.expressions[r];e.push({kind:"hole",index:r,start:o.start??0,end:o.end??0})}}),e}function ee(t,e=new Set,n={}){let r=ie(t,e,n);return I(r),r}export{ee as buildIRFromLit};
@@ -1 +1 @@
1
- "use strict";var B=Object.create;var v=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var V=(n,e)=>{for(var t in e)v(n,t,{get:e[t],enumerable:!0})},S=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of M(e))!H.call(n,i)&&i!==t&&v(n,i,{get:()=>e[i],enumerable:!(r=F(e,i))||r.enumerable});return n};var R=(n,e,t)=>(t=n!=null?B(_(n)):{},S(e||!n||!n.__esModule?v(t,"default",{value:n,enumerable:!0}):t,n)),G=n=>S(v({},"__esModule",{value:!0}),n);var ce={};V(ce,{SVG_TAGS:()=>D,buildIR:()=>k,cleanJSXText:()=>g,genExpr:()=>d,isReactiveExpr:()=>u});module.exports=G(ce);var c=require("@babel/core"),y=R(require("@babel/generator"),1);var E={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},ue={version:2,module:"@fluixi/dom",symbols:[...E.symbols,"template","cloneTemplate","walk"]};var K={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function U(n){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(n)}function $(n){return U(n)?n:JSON.stringify(n)}function W(n){return n.expr!==void 0?n.reactive?`() => (${n.expr})`:`(${n.expr})`:JSON.stringify(n.literal??!0)}function z(n){return n.expr!==void 0?`(${n.expr})`:JSON.stringify(n.literal??!0)}function Z(n,e,t){let r=n.filter(l=>l.kind==="spread"),a=n.filter(l=>l.kind!=="spread").map(l=>`${$(l.name)}: ${W(l)}`);e!=null&&a.push(`children: ${e}`);let o=`{ ${a.join(", ")} }`;return r.length>0?(t.add("mergeProps"),`mergeProps(${r.map(l=>l.expr).join(", ")}, ${o})`):o}function w(n,e){return n.length===1?x(n[0],e):`[${n.map(t=>x(t,e)).join(", ")}]`}function I(n,e,t,r){r.add("createMemo"),r.add("createComponent");let i=e.filter(s=>s.kind==="spread"),o=e.filter(s=>s.kind!=="spread").map(s=>`get ${$(s.name)}() { return ${z(s)}; }`);t.length>0&&o.push(`get children() { return ${w(t,r)}; }`);let l=`{ ${o.join(", ")} }`;return i.length>0&&(r.add("mergeProps"),l=`mergeProps(${i.map(s=>s.expr).join(", ")}, ${l})`),`createMemo(() => createComponent(${n}, ${l}))`}function x(n,e){switch(n.kind){case"text":return JSON.stringify(n.value);case"expr":return n.reactive?`() => (${n.code})`:`(${n.code})`;case"fragment":return n.children.length===0?"null":w(n.children,e);case"component":return I(n.name,n.props,n.children,e);case"control":{let t=K[n.control]??n.control;return e.add(t),I(t,n.props,n.children,e)}case"element":{e.add("createNativeElement");let t=JSON.stringify(n.tag),r="_el$",i=[],a=n.svg?`${t}, true`:t;if(i.push(`const ${r} = createNativeElement(${a});`),n.props.length>0){e.add("spread");let o=n.svg?", isSVG: true":"";i.push(`spread({ element: ${r}, props: ${Z(n.props,null,e)}${o} });`)}for(let o of n.children){e.add("insert");let l=x(o,e),s=o.kind==="expr"&&o.reactive||o.kind==="component"||o.kind==="control";i.push(s?`insert(${r}, ${l}, null);`:`insert(${r}, ${l});`)}return i.push(`return ${r};`),`(() => { ${i.join(" ")} })()`}}}var h={name:"imperative",contract:E,emit(n,e){let t=new Set;return{code:x(n,t),imports:Array.from(t)}}};var f=require("@babel/core"),N=R(require("@babel/generator"),1),J=require("@fluixi/template-parser");var q=N.default.default??N.default;function Q(n){return q(n,{concise:!0}).code}var C=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function Y(n){return n.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function A(n){return n.charAt(0).toUpperCase()+n.slice(1)}var b=class{constructor(e,t){this.holes=e;this.used=t}hole(e){return this.holes[e]??{node:f.types.identifier("undefined"),code:"undefined",reactive:!1}}emit(e){let{code:t,imports:r}=h.emit(e,{});for(let i of r)this.used.add(i);return t}lowerRoot(e){let t=this.lowerChildren(e);return t.length===1?t[0]:{kind:"fragment",children:t}}lowerChildren(e){let t=[];for(let r=0;r<e.length;r++){let i=e[r];if(i.kind==="Element"||i.kind==="Component"){let o=i.attributes.find(l=>l.kind==="IfDirective");if(o&&o.kind==="IfDirective"){let l=r+1;l<e.length&&this.isBlankText(e[l])&&l++;let s=e[l],p=s&&(s.kind==="Element"||s.kind==="Component")&&s.attributes.some(m=>m.kind==="ElseDirective");t.push(this.lowerIf(i,o.hole,p?s:null)),p&&(r=l);continue}if(i.attributes.some(l=>l.kind==="EachDirective")){t.push(this.lowerEach(i));continue}}let a=this.lowerNode(i);a&&t.push(a)}return t}isBlankText(e){return e.kind==="Text"&&!e.raw&&g(e.value)===""}lowerNode(e){switch(e.kind){case"Text":{if(e.raw)return{kind:"text",value:e.value};let t=g(e.value);return t?{kind:"text",value:t}:null}case"Comment":return null;case"Expression":{let t=this.hole(e.hole);return{kind:"expr",code:t.code,reactive:t.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(e.children)};case"Element":return this.lowerElement(e);case"Component":return this.lowerComponent(e);default:return null}}lowerElement(e){let t=e.attributes.find(r=>r.kind==="Attribute"&&r.name==="is");if(e.tag==="component"&&t&&t.value&&t.value.kind==="hole"){let r=e.attributes.filter(a=>a!==t),i=this.lowerComponent({...e,kind:"Component",tag:"Dynamic",tagHole:null,attributes:r});return i.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(t.value.hole).code})`}),i}return{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:this.lowerAttributes(e.attributes),children:this.lowerChildren(e.children),static:!1}}lowerComponent(e){let t=e.tagHole!=null?this.hole(e.tagHole).code:e.tag,r=this.lowerAttributes(e.attributes),{slots:i,rest:a}=this.partitionSlots(e.children);for(let[o,l]of i){let s=l.length===1?l[0]:{kind:"fragment",children:l};r.push({name:o,kind:"attr",expr:this.emit(s),jsxElement:!0})}return{kind:"component",name:t,props:r,children:this.lowerChildren(a)}}partitionSlots(e){let t=new Map,r=[];for(let i of e){if(i.kind==="Element"||i.kind==="Component"){let a=i.attributes.find(o=>o.kind==="Attribute"&&o.name==="slot");if(a&&a.value&&a.value.kind==="static"){let o={...i,attributes:i.attributes.filter(p=>p!==a)},l=o.kind==="Element"?this.lowerElement(o):this.lowerComponent(o),s=t.get(a.value.value)??[];s.push(l),t.set(a.value.value,s);continue}}r.push(i)}return{slots:t,rest:r}}lowerIf(e,t,r){let i=this.hole(t),a=[{name:"when",kind:"attr",expr:i.code,reactive:i.reactive}];if(r){let l=this.stripAndLower(r,s=>s.kind==="ElseDirective");a.push({name:"fallback",kind:"attr",expr:this.emit(l),jsxElement:!0})}let o=this.stripAndLower(e,l=>l.kind==="IfDirective");return{kind:"component",name:"Show",props:a,children:[o]}}lowerEach(e){let t=e.attributes.find(s=>s.kind==="EachDirective");if(!t||t.kind!=="EachDirective")return this.lowerNode(e);let r=this.hole(t.hole),i=[{name:"each",kind:"attr",expr:r.code,reactive:r.reactive}];if(t.key){let s="static"in t.key?`(item) => item[${JSON.stringify(t.key.static)}]`:this.hole(t.key.hole).code;i.push({name:"by",kind:"attr",expr:s})}let a=this.itemArrow(e),o;if(a){let s=a.body,p={kind:"expr",code:d(s,this.used),reactive:u(s)},m=this.rebuildWithChildren(e,[p]);o=`(${a.params.map(O=>Q(O)).join(", ")}) => (${this.emit(m)})`}else{let s=this.stripAndLower(e,p=>p.kind==="EachDirective");o=`() => (${this.emit(s)})`}return{kind:"component",name:"For",props:i,children:[{kind:"expr",code:o,reactive:!1}]}}itemArrow(e){let t=e.children.filter(i=>!this.isBlankText(i));if(t.length!==1||t[0].kind!=="Expression")return null;let r=this.hole(t[0].hole).node;return f.types.isArrowFunctionExpression(r)&&!f.types.isBlockStatement(r.body)?r:null}stripAndLower(e,t){let r={...e,attributes:e.attributes.filter(i=>!t(i))};return r.kind==="Element"?this.lowerElement(r):this.lowerComponent(r)}rebuildWithChildren(e,t){let r=this.lowerAttributes(e.attributes.filter(i=>i.kind!=="EachDirective"));return e.kind==="Element"?{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:r,children:t,static:!1}:{kind:"component",name:e.tag,props:r,children:t}}lowerAttributes(e){let t=[],r=[],i=!1,a=[],o=!1,l=[];for(let s of e)switch(s.kind){case"IfDirective":case"EachDirective":case"ElseDirective":break;case"Attribute":t.push(this.plainAttr(s));break;case"PropertyBinding":t.push({name:s.name,kind:"prop",expr:this.hole(s.hole).code,reactive:this.hole(s.hole).reactive});break;case"EventBinding":t.push(this.eventProp(s));break;case"RefBinding":t.push({name:"ref",kind:"ref",expr:this.hole(s.hole).code,reactive:this.hole(s.hole).reactive});break;case"Spread":t.push({name:"",kind:"spread",expr:this.hole(s.hole).code});break;case"ClassDirective":{let p=this.hole(s.hole);r.push(`${JSON.stringify(s.name)}: ${p.code}`),i=i||p.reactive;break}case"StyleDirective":{let p=this.hole(s.hole);a.push(`${JSON.stringify(s.name)}: ${p.code}`),o=o||p.reactive;break}case"BindDirective":t.push(...this.bindProps(s.name,this.hole(s.hole).code));break;case"UseDirective":{let p=s.name??(s.hole!=null?this.hole(s.hole).code:null);if(!p)break;l.push(s.name!=null&&s.hole!=null?`[${p}, () => (${this.hole(s.hole).code})]`:`[${p}]`);break}}return r.length>0&&t.push({name:"classList",kind:"attr",expr:`{ ${r.join(", ")} }`,reactive:i}),a.length>0&&t.push({name:"style",kind:"attr",expr:`{ ${a.join(", ")} }`,reactive:o}),l.length>0&&t.push({name:"use",kind:"attr",expr:`[${l.join(", ")}]`}),t}eventProp(e){let t=e.name.toLowerCase(),r=this.hole(e.hole).code;if(!(e.syntax==="colon"||e.modifiers.length>0))return{name:"on"+A(e.name),kind:"event",event:{name:t,delegated:C.has(t)},expr:r};let a=this.wrapHandler(r,e.modifiers),o=this.eventOptions(e.modifiers),l=o?`[${a}, ${o}]`:a;return{name:"on:"+t,kind:"attr",expr:l}}wrapHandler(e,t){let r=t.includes("self")?"if (e.target !== e.currentTarget) return; ":"",i=[];return t.includes("prevent")&&i.push("e.preventDefault();"),t.includes("stop")&&i.push("e.stopPropagation();"),!r&&i.length===0?e:`(e) => { ${r}${i.join(" ")} return (${e})(e); }`}eventOptions(e){let t=[];return e.includes("capture")&&t.push("capture: true"),e.includes("once")&&t.push("once: true"),e.includes("passive")&&t.push("passive: true"),t.length?`{ ${t.join(", ")} }`:null}bindProps(e,t){let r=e==="checked",i=r?"change":"input",a=r?"checked":"value",o=`(${t})`;return[{name:e,kind:"attr",expr:`${o}[0]()`,reactive:!0},{name:"on"+A(i),kind:"event",event:{name:i,delegated:C.has(i)},expr:`(e) => ${o}[1](e.target.${a})`}]}plainAttr(e){let t=e.value,r=e.name;e.name==="class"?r=t&&t.kind==="hole"&&f.types.isObjectExpression(this.hole(t.hole).node)?"classList":"className":e.name==="html"&&(r="innerHTML");let a={name:r,kind:"attr"};if(t==null)return a.literal=!0,a;if(t.kind==="static")return a.literal=t.value,a;if(t.kind==="hole"){let s=this.hole(t.hole);return a.expr=s.code,a.reactive=s.reactive,a}let o=!1,l=t.parts.map(s=>{if("text"in s)return Y(s.text);let p=this.hole(s.hole);return o=o||p.reactive,"${"+p.code+"}"}).join("");return a.expr="`"+l+"`",a.reactive=o,a}};function P(n,e,t={}){let r=n.quasi,i=r.expressions.map(l=>{let s=l;return{node:s,code:d(s,e),reactive:u(s)}}),a=ee(r),{root:o}=(0,J.parseTemplate)(a,{svg:t.svg});return new b(i,e).lowerRoot(o.children)}function ee(n){let e=[];return n.quasis.forEach((t,r)=>{let i=t.value.cooked??t.value.raw;if(e.push({kind:"static",text:i,start:t.start??0}),r<n.expressions.length){let a=n.expressions[r];e.push({kind:"hole",index:r,start:a.start??0,end:a.end??0})}}),e}function T(n,e=new Set,t={}){return P(n,e,t)}var te=y.default.default??y.default;function L(n){return te(n,{concise:!0}).code}function ne(n,e){let t=c.types.cloneNode(n,!0),r=c.types.file(c.types.program([c.types.expressionStatement(t)])),i=!1,a=(o,l,s)=>{for(let p of s)e.add(p);o.replaceWith(c.template.expression(l,{placeholderPattern:!1,plugins:["typescript"]})()),o.skip(),i=!0};return(0,c.traverse)(r,{"JSXElement|JSXFragment"(o){let l=o.node,{code:s,imports:p}=h.emit(k(l,e),{});a(o,s,p)},TaggedTemplateExpression(o){let l=o.node.tag;if(!c.types.isIdentifier(l)||l.name!=="html"&&l.name!=="svg")return;let s=T(o.node,e,{svg:l.name==="svg"}),{code:p,imports:m}=h.emit(s,{});a(o,p,m)}}),i?r.program.body[0].expression:n}function d(n,e){return L(ne(n,e))}var D=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),re=/^on[A-Z]/,ie=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function se(n){if(c.types.isJSXIdentifier(n)){let e=n.name[0]!==n.name[0].toLowerCase();return{tag:n.name,component:e}}return c.types.isJSXMemberExpression(n)?{tag:L(n),component:!0}:c.types.isJSXNamespacedName(n)?{tag:`${n.namespace.name}:${n.name.name}`,component:!1}:{tag:"div",component:!1}}function oe(n){return c.types.isJSXIdentifier(n)?n.name==="class"?"className":n.name:c.types.isJSXNamespacedName(n)?`${n.namespace.name}:${n.name.name}`:"unknown"}function u(n){return c.types.isCallExpression(n)||c.types.isOptionalCallExpression(n)?!0:c.types.isMemberExpression(n)||c.types.isOptionalMemberExpression(n)?!(!n.computed&&c.types.isIdentifier(n.property,{name:"children"})):c.types.isConditionalExpression(n)?u(n.test)||u(n.consequent)||u(n.alternate):c.types.isLogicalExpression(n)||c.types.isBinaryExpression(n)?u(n.left)||u(n.right):c.types.isTemplateLiteral(n)?n.expressions.some(e=>u(e)):c.types.isObjectExpression(n)?n.properties.some(e=>c.types.isObjectProperty(e)&&!e.computed&&u(e.value)):c.types.isArrayExpression(n)?n.elements.some(e=>e!=null&&!c.types.isSpreadElement(e)&&u(e)):!1}function ae(n,e){let t=oe(n.name),r=re.test(t),i=r||t.startsWith("on:"),o={name:t,kind:r?"event":"attr"};r&&(o.event={name:t.slice(2).toLowerCase(),delegated:ie.has(t.slice(2).toLowerCase())});let l=n.value;if(l==null)return o.literal=!0,o;if(c.types.isStringLiteral(l))return o.literal=l.value,o;if(c.types.isJSXExpressionContainer(l)&&!c.types.isJSXEmptyExpression(l.expression)){let s=l.expression;return c.types.isStringLiteral(s)||c.types.isNumericLiteral(s)||c.types.isBooleanLiteral(s)?(o.literal=s.value,o):(o.expr=d(s,e),o.reactive=i?!1:u(s),(c.types.isJSXElement(s)||c.types.isJSXFragment(s))&&(o.jsxElement=!0),o)}return o.literal=!0,o}function X(n,e){let t=n.value;return t==null?null:c.types.isStringLiteral(t)?JSON.stringify(t.value):c.types.isJSXExpressionContainer(t)&&!c.types.isJSXEmptyExpression(t.expression)?d(t.expression,e):null}function le(n,e){let t=[],r=[];for(let i of n){if(c.types.isJSXSpreadAttribute(i)){t.push({name:"",kind:"spread",expr:d(i.argument,e)});continue}if(!c.types.isJSXAttribute(i))continue;let a=c.types.isJSXNamespacedName(i.name)?i.name.namespace.name:null;if(a==="use"){let o=i.name.name.name;e.add(o);let l=X(i,e);r.push(l!=null?`[${o}, () => (${l})]`:`[${o}]`);continue}if(a==="oncapture"){let o=i.name.name.name.toLowerCase(),l=X(i,e)??"undefined";t.push({name:"on:"+o,kind:"attr",expr:`[${l}, { capture: true }]`});continue}t.push(ae(i,e))}return r.length>0&&t.push({name:"use",kind:"attr",expr:`[${r.join(", ")}]`}),t}function g(n){let e=n.split(/\r\n|\n|\r/),t=0;for(let i=0;i<e.length;i++)/[^ \t]/.test(e[i])&&(t=i);let r="";for(let i=0;i<e.length;i++){let a=e[i].replace(/\t/g," ");i!==0&&(a=a.replace(/^ +/,"")),i!==e.length-1&&(a=a.replace(/ +$/,"")),a&&(i!==t&&(a+=" "),r+=a)}return r}function j(n,e){let t=[];for(let r of n)if(c.types.isJSXText(r)){let i=g(r.value);i&&t.push({kind:"text",value:i})}else if(c.types.isJSXExpressionContainer(r)){if(!c.types.isJSXEmptyExpression(r.expression)){let i=r.expression;t.push({kind:"expr",code:d(i,e),reactive:u(i)})}}else c.types.isJSXElement(r)||c.types.isJSXFragment(r)?t.push(k(r,e)):c.types.isJSXSpreadChild(r)&&t.push({kind:"expr",code:d(r.expression,e),reactive:!1});return t}function k(n,e=new Set){if(c.types.isJSXFragment(n))return{kind:"fragment",children:j(n.children,e)};let{tag:t,component:r}=se(n.openingElement.name),i=le(n.openingElement.attributes,e),a=j(n.children,e);return r?{kind:"component",name:t,props:i,children:a}:{kind:"element",tag:t,svg:D.has(t),props:i,children:a,static:!1}}
1
+ "use strict";var ue=Object.create;var y=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var fe=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var ge=(t,e)=>{for(var n in e)y(t,n,{get:e[n],enumerable:!0})},B=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of me(e))!he.call(t,i)&&i!==n&&y(t,i,{get:()=>e[i],enumerable:!(r=de(e,i))||r.enumerable});return t};var H=(t,e,n)=>(n=t!=null?ue(fe(t)):{},B(e||!t||!t.__esModule?y(n,"default",{value:t,enumerable:!0}):n,t)),ve=t=>B(y({},"__esModule",{value:!0}),t);var Ye={};ge(Ye,{SVG_TAGS:()=>ce,buildIR:()=>pe,cleanJSXText:()=>S,genExpr:()=>f,isReactiveExpr:()=>m});module.exports=ve(Ye);var p=require("@babel/core"),D=H(require("@babel/generator"),1);var xe=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),F={className:"class",htmlFor:"for"},ke=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),Ee=new Set(["script","style","textarea","title"]);function C(t){return Ee.has(t)}function z(t){return F[t]??t}function v(t){return t.kind!=="attr"||t.expr!==void 0||t.name.includes(":")?!1:!ke.has(t.name)}function A(t){if(!t.static||C(t.tag))return!1;for(let e of t.props)if(!v(e))return!1;for(let e of t.children)if(e.kind!=="text"&&!(e.kind==="element"&&A(e)))return!1;return!0}function x(t){let e=t.props.map(Ne).filter(Boolean).join(""),n=`<${t.tag}${e}>`;return xe.has(t.tag)?n:`${n}${t.children.map(Re).join("")}</${t.tag}>`}function Re(t){if(t.kind==="text")return be(t.value);if(t.kind!=="element")throw new Error(`serializeStatic: unexpected ${t.kind}`);return x(t)}function Ne(t){let e=F[t.name]??t.name,n=t.literal;return n===!0||n===void 0?` ${e}`:n===!1||n===null?"":` ${e}="${Se(String(n))}"`}function Se(t){return t.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function be(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var ye="<!--fx-->",Ie="<!--fx/-->";function $(t){return t.kind==="expr"||t.kind==="component"||t.kind==="control"}function $e(t){return t.kind==="text"||t.kind==="element"&&V(t)}function V(t){return t.svg||C(t.tag)||!t.props.every(e=>v(e))?!1:t.children.every(e=>$e(e)||$(e))}function I(t){if($(t))return!0;let e=t.children;return e?e.some(I):!1}function W(t){for(let e=0;e<t.children.length;e++){let n=t.children[e];if(n.kind==="text"&&(n.value===""||t.children[e+1]?.kind==="text"))return!1}return t.children.every(e=>e.kind!=="element"||W(e))}function U(t){if(!V(t)||!W(t)||!t.children.some(I))return null;let e=[],n=[],r=0,i=a=>{let s=`_n$${r++}`;return e.push({ref:s,expr:a}),s};return o(t,"_el$"),{html:we(t),tag:t.tag,steps:e,holes:n};function o(a,s){let l=-1;a.children.forEach((u,d)=>{I(u)&&(l=d)});let c=null;for(let u=0;u<=l;u++){let d=a.children[u],g=c?`${c}.nextSibling`:`${s}.firstChild`;if($(d)){let _=i(g),M=i(`holeEnd(${_})`);n.push({parentRef:s,startRef:_,endRef:M,node:d}),c=M;continue}let b=i(g);d.kind==="element"&&I(d)&&o(d,b),c=b}}}function we(t){return x(G(t)).split(K).join(ye+Ie)}function G(t){return{...t,children:t.children.map(e=>$(e)?{kind:"text",value:K}:e.kind==="element"?G(e):e)}}var K="\0fx-hole\0";var P={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},rt={version:2,module:"@fluixi/dom",symbols:[...P.symbols,"template","cloneTemplate","walk"]};var Te={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function Ce(t){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(t)}function Z(t){return Ce(t)?t:JSON.stringify(t)}function Ae(t){return t.expr!==void 0?t.reactive?`() => (${t.expr})`:`(${t.expr})`:JSON.stringify(t.literal??!0)}function Pe(t){return t.expr!==void 0?`(${t.expr})`:JSON.stringify(t.literal??!0)}function Je(t,e,n){let r=t.filter(s=>s.kind==="spread"),o=t.filter(s=>s.kind!=="spread").map(s=>`${Z(s.name)}: ${Ae(s)}`);e!=null&&o.push(`children: ${e}`);let a=`{ ${o.join(", ")} }`;return r.length>0?(n.add("mergeProps"),`mergeProps(${r.map(s=>s.expr).join(", ")}, ${a})`):a}function Y(t,e,n){return t.length===1?k(t[0],e,n):`[${t.map(r=>k(r,e,n)).join(", ")}]`}function q(t,e,n,r,i){r.add("createMemo"),r.add("createComponent");let o=e.filter(c=>c.kind==="spread"),s=e.filter(c=>c.kind!=="spread").map(c=>`get ${Z(c.name)}() { return ${Pe(c)}; }`);n.length>0&&s.push(`get children() { return ${Y(n,r,i)}; }`);let l=`{ ${s.join(", ")} }`;return o.length>0&&(r.add("mergeProps"),l=`mergeProps(${o.map(c=>c.expr).join(", ")}, ${l})`),`createMemo(() => createComponent(${t}, ${l}))`}function Le(t,e){let n=z(e.name),r=e.literal;return r===!0||r===void 0?`${t}.setAttribute(${JSON.stringify(n)}, "");`:r===!1||r===null?"":`${t}.setAttribute(${JSON.stringify(n)}, ${JSON.stringify(String(r))});`}var Q=!1;function k(t,e,n){switch(t.kind){case"text":return JSON.stringify(t.value);case"expr":return t.reactive?`() => (${t.code})`:`(${t.code})`;case"fragment":return t.children.length===0?"null":Y(t.children,e,n);case"component":return q(t.name,t.props,t.children,e,n);case"control":{let r=Te[t.control]??t.control;return e.add(r),q(r,t.props,t.children,e,n)}case"element":{if(n&&t.static&&!t.svg&&A(t)){e.add("templateNode");let s=`_tmpl$${n.length}`;return n.push({id:s,html:x(t),tag:t.tag,svg:!1}),`templateNode(${s}, ${JSON.stringify(t.tag)})`}if(n&&Q){let s=U(t);if(s){e.add("templateNode"),e.add("insert"),e.add("holeEnd"),e.add("holeContent"),e.add("holeScope");let l=`_tmpl$${n.length}`;n.push({id:l,html:s.html,tag:s.tag,svg:!1});let c=[`const _el$ = templateNode(${l}, ${JSON.stringify(s.tag)}, true);`];for(let u of s.steps)c.push(`const ${u.ref} = ${u.expr};`);for(let u of s.holes)c.push(`insert(${u.parentRef}, holeScope(${u.startRef}, () => (${k(u.node,e,n)})), ${u.endRef}, holeContent(${u.startRef}, ${u.endRef}));`);return c.push("return _el$;"),`(() => { ${c.join(" ")} })()`}}e.add("createNativeElement");let r=JSON.stringify(t.tag),i="_el$",o=[],a=t.svg?`${r}, true`:r;if(o.push(`const ${i} = createNativeElement(${a});`),t.props.length>0)if(!t.svg&&t.props.every(v))for(let s of t.props)o.push(Le(i,s));else{e.add("spread");let s=t.svg?", isSVG: true":"";o.push(`spread({ element: ${i}, props: ${Je(t.props,null,e)}${s} });`)}for(let s of t.children){e.add("insert");let l=k(s,e,n),c=s.kind==="expr"&&s.reactive||s.kind==="component"||s.kind==="control";o.push(c?`insert(${i}, ${l}, null);`:`insert(${i}, ${l});`)}return o.push(`return ${i};`),`(() => { ${o.join(" ")} })()`}}}function E(t,e){if(!e||e.length===0)return t;let n=new Map(e.map(r=>[r.id,JSON.stringify(r.html)]));return t.replace(/_tmpl\$\d+/g,r=>n.get(r)??r)}var R={name:"imperative",contract:P,emit(t,e){let n=new Set,r=e?.templateClone!==!1?[]:void 0;return Q=e?.partialTemplates===!0,{code:k(t,n,r),imports:Array.from(n),templates:r}}};var N=require("@babel/core"),L=H(require("@babel/generator"),1),re=require("@fluixi/template-parser");var Xe={kind:"eager"},De=["pointerdown","focusin","keydown"],ee=new Set(["eager","idle","visible","interaction","media","never"]),h=class extends Error{};function J(t){return t.startsWith("load:")}function w(t,e){let n=t.slice(5);if(!ee.has(n))throw new h(`Unknown load strategy 'load:${n}'. Expected one of ${[...ee].join(", ")}.`);switch(n){case"eager":return Xe;case"idle":return{kind:"idle"};case"never":return{kind:"never"};case"visible":return e?{kind:"visible",rootMargin:e}:{kind:"visible"};case"interaction":return{kind:"interaction",events:e?je(e):[...De]};case"media":if(!e)throw new h(`'load:media' needs a query, e.g. load:media="(min-width: 1024px)".`);return{kind:"media",query:e};default:throw new h(`Unhandled load strategy '${n}'.`)}}function je(t){let e=t.split(/[\s,]+/).map(n=>n.trim()).filter(Boolean);if(e.length===0)throw new h("'load:interaction' was given no event names.");return e}var Oe=L.default.default??L.default;function _e(t){return Oe(t,{concise:!0}).code}var te=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function Me(t){return t.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function ne(t){return t.charAt(0).toUpperCase()+t.slice(1)}var X=class{constructor(e,n){this.holes=e;this.used=n}hole(e){return this.holes[e]??{node:N.types.identifier("undefined"),code:"undefined",reactive:!1}}emit(e){let{code:n,imports:r,templates:i}=R.emit(e,{});for(let o of r)this.used.add(o);return E(n,i)}lowerRoot(e){let n=this.lowerChildren(e);return n.length===1?n[0]:{kind:"fragment",children:n}}lowerChildren(e){let n=[];for(let r=0;r<e.length;r++){let i=e[r];if(i.kind==="Element"||i.kind==="Component"){let a=i.attributes.find(s=>s.kind==="IfDirective");if(a&&a.kind==="IfDirective"){let s=r+1;s<e.length&&this.isBlankText(e[s])&&s++;let l=e[s],c=l&&(l.kind==="Element"||l.kind==="Component")&&l.attributes.some(u=>u.kind==="ElseDirective");n.push(this.lowerIf(i,a.hole,c?l:null)),c&&(r=s);continue}if(i.attributes.some(s=>s.kind==="EachDirective")){n.push(this.lowerEach(i));continue}}let o=this.lowerNode(i);o&&n.push(o)}return n}isBlankText(e){return e.kind==="Text"&&!e.raw&&S(e.value)===""}lowerNode(e){switch(e.kind){case"Text":{if(e.raw)return{kind:"text",value:e.value};let n=S(e.value);return n?{kind:"text",value:n}:null}case"Comment":return null;case"Expression":{let n=this.hole(e.hole);return{kind:"expr",code:n.code,reactive:n.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(e.children)};case"Element":return this.lowerElement(e);case"Component":return this.lowerComponent(e);default:return null}}lowerElement(e){let n=e.attributes.find(r=>r.kind==="Attribute"&&r.name==="is");if(e.tag==="component"&&n&&n.value&&n.value.kind==="hole"){let r=e.attributes.filter(o=>o!==n),i=this.lowerComponent({...e,kind:"Component",tag:"Dynamic",tagHole:null,attributes:r});return i.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(n.value.hole).code})`}),i}return{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:this.lowerAttributes(e.attributes),children:this.lowerChildren(e.children),static:!1}}lowerComponent(e){let n=e.tagHole!=null?this.hole(e.tagHole).code:e.tag,r=this.lowerAttributes(e.attributes),{slots:i,rest:o}=this.partitionSlots(e.children);for(let[l,c]of i){let u=c.length===1?c[0]:{kind:"fragment",children:c},d={name:l,kind:"attr",expr:this.emit(u),jsxElement:!0},g=r.findIndex(b=>b.name===l);g>=0?r[g]=d:r.push(d)}let a=e.attributes.find(l=>l.kind==="LoadDirective"),s=a?w(`load:${a.strategy}`,a.modifier):void 0;return{kind:"component",name:n,props:r,children:this.lowerChildren(o),...s?{load:s}:{}}}partitionSlots(e){let n=new Map,r=[];for(let i of e){if(i.kind==="Element"||i.kind==="Component"){let o=i.attributes.find(a=>a.kind==="Attribute"&&a.name==="slot");if(o&&o.value&&o.value.kind==="static"){let a={...i,attributes:i.attributes.filter(c=>c!==o)},s=a.kind==="Element"?this.lowerElement(a):this.lowerComponent(a),l=n.get(o.value.value)??[];l.push(s),n.set(o.value.value,l);continue}}r.push(i)}return{slots:n,rest:r}}lowerIf(e,n,r){let i=this.hole(n),o=[{name:"when",kind:"attr",expr:i.code,reactive:i.reactive}];if(r){let s=this.stripAndLower(r,l=>l.kind==="ElseDirective");o.push({name:"fallback",kind:"attr",expr:this.emit(s),jsxElement:!0})}let a=this.stripAndLower(e,s=>s.kind==="IfDirective");return{kind:"component",name:"Show",props:o,children:[a]}}lowerEach(e){let n=e.attributes.find(l=>l.kind==="EachDirective");if(!n||n.kind!=="EachDirective")return this.lowerNode(e);let r=this.hole(n.hole),i=[{name:"each",kind:"attr",expr:r.code,reactive:r.reactive}];if(n.key){let l="static"in n.key?`(item) => item[${JSON.stringify(n.key.static)}]`:this.hole(n.key.hole).code;i.push({name:"by",kind:"attr",expr:l})}let o=this.itemArrow(e),a;if(o){let l=o.body,c={kind:"expr",code:f(l,this.used),reactive:m(l)},u=this.rebuildWithChildren(e,[c]);a=`(${o.params.map(d=>_e(d)).join(", ")}) => (${this.emit(u)})`}else{let l=this.stripAndLower(e,c=>c.kind==="EachDirective");a=`() => (${this.emit(l)})`}return{kind:"component",name:"For",props:i,children:[{kind:"expr",code:a,reactive:!1}]}}itemArrow(e){let n=e.children.filter(i=>!this.isBlankText(i));if(n.length!==1||n[0].kind!=="Expression")return null;let r=this.hole(n[0].hole).node;return N.types.isArrowFunctionExpression(r)&&!N.types.isBlockStatement(r.body)?r:null}stripAndLower(e,n){let r={...e,attributes:e.attributes.filter(i=>!n(i))};return r.kind==="Element"?this.lowerElement(r):this.lowerComponent(r)}rebuildWithChildren(e,n){let r=this.lowerAttributes(e.attributes.filter(i=>i.kind!=="EachDirective"));return e.kind==="Element"?{kind:"element",tag:e.tag,svg:e.namespace==="svg",props:r,children:n,static:!1}:{kind:"component",name:e.tag,props:r,children:n}}lowerAttributes(e){let n=[],r=[],i=!1,o=[],a=!1,s=[];for(let l of e)switch(l.kind){case"IfDirective":case"EachDirective":case"ElseDirective":break;case"Attribute":n.push(this.plainAttr(l));break;case"PropertyBinding":n.push({name:l.name,kind:"prop",expr:this.hole(l.hole).code,reactive:this.hole(l.hole).reactive});break;case"EventBinding":n.push(this.eventProp(l));break;case"RefBinding":n.push({name:"ref",kind:"ref",expr:this.hole(l.hole).code,reactive:this.hole(l.hole).reactive});break;case"Spread":n.push({name:"",kind:"spread",expr:this.hole(l.hole).code});break;case"ClassDirective":{let c=this.hole(l.hole);r.push(`${JSON.stringify(l.name)}: ${c.code}`),i=i||c.reactive;break}case"StyleDirective":{let c=this.hole(l.hole);o.push(`${JSON.stringify(l.name)}: ${c.code}`),a=a||c.reactive;break}case"BindDirective":n.push(...this.bindProps(l.name,this.hole(l.hole).code));break;case"UseDirective":{let c=l.name??(l.hole!=null?this.hole(l.hole).code:null);if(!c)break;s.push(l.name!=null&&l.hole!=null?`[${c}, () => (${this.hole(l.hole).code})]`:`[${c}]`);break}}return r.length>0&&n.push({name:"classList",kind:"attr",expr:`{ ${r.join(", ")} }`,reactive:i}),o.length>0&&n.push({name:"style",kind:"attr",expr:`{ ${o.join(", ")} }`,reactive:a}),s.length>0&&n.push({name:"use",kind:"attr",expr:`[${s.join(", ")}]`}),n}eventProp(e){let n=e.name.toLowerCase(),r=this.hole(e.hole).code;if(!(e.syntax==="colon"||e.modifiers.length>0))return{name:"on"+ne(e.name),kind:"event",event:{name:n,delegated:te.has(n)},expr:r};let o=this.wrapHandler(r,e.modifiers),a=this.eventOptions(e.modifiers),s=a?`[${o}, ${a}]`:o;return{name:"on:"+n,kind:"attr",expr:s}}wrapHandler(e,n){let r=n.includes("self")?"if (e.target !== e.currentTarget) return; ":"",i=[];return n.includes("prevent")&&i.push("e.preventDefault();"),n.includes("stop")&&i.push("e.stopPropagation();"),!r&&i.length===0?e:`(e) => { ${r}${i.join(" ")} return (${e})(e); }`}eventOptions(e){let n=[];return e.includes("capture")&&n.push("capture: true"),e.includes("once")&&n.push("once: true"),e.includes("passive")&&n.push("passive: true"),n.length?`{ ${n.join(", ")} }`:null}bindProps(e,n){let r=e==="checked",i=r?"change":"input",o=r?"checked":"value",a=`(${n})`;return[{name:e,kind:"attr",expr:`${a}[0]()`,reactive:!0},{name:"on"+ne(i),kind:"event",event:{name:i,delegated:te.has(i)},expr:`(e) => ${a}[1](e.target.${o})`}]}plainAttr(e){let n=e.value,r=e.name;e.name==="class"?r=n&&n.kind==="hole"&&N.types.isObjectExpression(this.hole(n.hole).node)?"classList":"className":e.name==="html"&&(r="innerHTML");let o={name:r,kind:"attr"};if(n==null)return o.literal=!0,o;if(n.kind==="static")return o.literal=n.value,o;if(n.kind==="hole"){let l=this.hole(n.hole);return o.expr=l.code,o.reactive=l.reactive,o}let a=!1,s=n.parts.map(l=>{if("text"in l)return Me(l.text);let c=this.hole(l.hole);return a=a||c.reactive,"${"+c.code+"}"}).join("");return o.expr="`"+s+"`",o.reactive=a,o}};function ie(t,e,n={}){let r=t.quasi,i=r.expressions.map(s=>{let l=s;return{node:l,code:f(l,e),reactive:m(l)}}),o=Be(r),{root:a}=(0,re.parseTemplate)(o,{svg:n.svg});return new X(i,e).lowerRoot(a.children)}function Be(t){let e=[];return t.quasis.forEach((n,r)=>{let i=n.value.cooked??n.value.raw;if(e.push({kind:"static",text:i,start:n.start??0}),r<t.expressions.length){let o=t.expressions[r];e.push({kind:"hole",index:r,start:o.start??0,end:o.end??0})}}),e}function He(t){switch(t.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 t.reactive?"reactive-prop":t.expr!==void 0?"expression-prop":void 0;default:return"expression-prop"}}function T(t){let e=[],n=new Map,r=i=>{switch(i.kind){case"text":return!0;case"expr":return!1;case"component":case"control":for(let o of i.children)r(o);return!1;case"fragment":for(let o of i.children)r(o);return!1;case"element":{let o=!0;for(let s of i.children)r(s)||(o=!1);let a;for(let s of i.props)if(a=He(s),a)break;return!a&&!o&&(a=Fe(i)),i.static=!a,a?n.set(i,a):e.push(i),i.static}default:return!1}};for(let i of Array.isArray(t)?t:[t])r(i);return{staticElements:e,reasons:n}}function Fe(t){for(let e of t.children){if(e.kind==="expr")return"expression-child";if(e.kind==="component")return"component-child";if(e.kind==="control")return"control-child";if(e.kind==="element"&&!e.static||e.kind==="fragment")return"expression-child"}return"expression-child"}function se(t,e=new Set,n={}){let r=ie(t,e,n);return T(r),r}var ze=D.default.default??D.default;function le(t){return ze(t,{concise:!0}).code}function Ve(t,e){let n=p.types.cloneNode(t,!0),r=p.types.file(p.types.program([p.types.expressionStatement(n)])),i=!1,o=(a,s,l)=>{for(let c of l)e.add(c);a.replaceWith(p.template.expression(s,{placeholderPattern:!1,plugins:["typescript"]})()),a.skip(),i=!0};return(0,p.traverse)(r,{"JSXElement|JSXFragment"(a){let s=a.node,{code:l,imports:c,templates:u}=R.emit(pe(s,e),{});o(a,E(l,u),c)},TaggedTemplateExpression(a){let s=a.node.tag;if(!p.types.isIdentifier(s)||s.name!=="html"&&s.name!=="svg")return;let l=se(a.node,e,{svg:s.name==="svg"}),{code:c,imports:u,templates:d}=R.emit(l,{});o(a,E(c,d),u)}}),i?r.program.body[0].expression:t}function f(t,e){return le(Ve(t,e))}var ce=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),We=/^on[A-Z]/,Ue=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function Ge(t){if(p.types.isJSXIdentifier(t)){let e=t.name[0]!==t.name[0].toLowerCase();return{tag:t.name,component:e}}return p.types.isJSXMemberExpression(t)?{tag:le(t),component:!0}:p.types.isJSXNamespacedName(t)?{tag:`${t.namespace.name}:${t.name.name}`,component:!1}:{tag:"div",component:!1}}function O(t){return p.types.isJSXIdentifier(t)?t.name==="class"?"className":t.name:p.types.isJSXNamespacedName(t)?`${t.namespace.name}:${t.name.name}`:"unknown"}function m(t){return p.types.isCallExpression(t)||p.types.isOptionalCallExpression(t)?!0:p.types.isMemberExpression(t)||p.types.isOptionalMemberExpression(t)?!(!t.computed&&p.types.isIdentifier(t.property,{name:"children"})):p.types.isConditionalExpression(t)?m(t.test)||m(t.consequent)||m(t.alternate):p.types.isLogicalExpression(t)||p.types.isBinaryExpression(t)?m(t.left)||m(t.right):p.types.isTemplateLiteral(t)?t.expressions.some(e=>m(e)):p.types.isObjectExpression(t)?t.properties.some(e=>p.types.isObjectProperty(e)&&!e.computed&&m(e.value)):p.types.isArrayExpression(t)?t.elements.some(e=>e!=null&&!p.types.isSpreadElement(e)&&m(e)):!1}function Ke(t,e){let n=O(t.name),r=We.test(n),i=r||n.startsWith("on:"),a={name:n,kind:r?"event":"attr"};r&&(a.event={name:n.slice(2).toLowerCase(),delegated:Ue.has(n.slice(2).toLowerCase())});let s=t.value;if(s==null)return a.literal=!0,a;if(p.types.isStringLiteral(s))return a.literal=s.value,a;if(p.types.isJSXExpressionContainer(s)&&!p.types.isJSXEmptyExpression(s.expression)){let l=s.expression;return p.types.isStringLiteral(l)||p.types.isNumericLiteral(l)||p.types.isBooleanLiteral(l)?(a.literal=l.value,a):(a.expr=f(l,e),a.reactive=i?!1:m(l),(p.types.isJSXElement(l)||p.types.isJSXFragment(l))&&(a.jsxElement=!0),a)}return a.literal=!0,a}function oe(t,e){let n=t.value;return n==null?null:p.types.isStringLiteral(n)?JSON.stringify(n.value):p.types.isJSXExpressionContainer(n)&&!p.types.isJSXEmptyExpression(n.expression)?f(n.expression,e):null}function qe(t,e){let n=[],r=[];for(let i of t){if(p.types.isJSXSpreadAttribute(i)){n.push({name:"",kind:"spread",expr:f(i.argument,e)});continue}if(!p.types.isJSXAttribute(i)||J(O(i.name)))continue;let o=p.types.isJSXNamespacedName(i.name)?i.name.namespace.name:null;if(o==="use"){let a=i.name.name.name;e.add(a);let s=oe(i,e);r.push(s!=null?`[${a}, () => (${s})]`:`[${a}]`);continue}if(o==="oncapture"){let a=i.name.name.name.toLowerCase(),s=oe(i,e)??"undefined";n.push({name:"on:"+a,kind:"attr",expr:`[${s}, { capture: true }]`});continue}n.push(Ke(i,e))}return r.length>0&&n.push({name:"use",kind:"attr",expr:`[${r.join(", ")}]`}),n}function S(t){let e=t.split(/\r\n|\n|\r/),n=0;for(let i=0;i<e.length;i++)/[^ \t]/.test(e[i])&&(n=i);let r="";for(let i=0;i<e.length;i++){let o=e[i].replace(/\t/g," ");i!==0&&(o=o.replace(/^ +/,"")),i!==e.length-1&&(o=o.replace(/ +$/,"")),o&&(i!==n&&(o+=" "),r+=o)}return r}function ae(t,e){let n=[];for(let r of t)if(p.types.isJSXText(r)){let i=S(r.value);i&&n.push({kind:"text",value:i})}else if(p.types.isJSXExpressionContainer(r)){if(!p.types.isJSXEmptyExpression(r.expression)){let i=r.expression;n.push({kind:"expr",code:f(i,e),reactive:m(i)})}}else p.types.isJSXElement(r)||p.types.isJSXFragment(r)?n.push(j(r,e)):p.types.isJSXSpreadChild(r)&&n.push({kind:"expr",code:f(r.expression,e),reactive:!1});return n}function pe(t,e=new Set){let n=j(t,e);return T(n),n}function j(t,e){if(p.types.isJSXFragment(t))return{kind:"fragment",children:ae(t.children,e)};let{tag:n,component:r}=Ge(t.openingElement.name),i=qe(t.openingElement.attributes,e),o=ae(t.children,e);if(r){let a=Ze(t.openingElement.attributes);return{kind:"component",name:n,props:i,children:o,...a?{load:a}:{}}}return{kind:"element",tag:n,svg:ce.has(n),props:i,children:o,static:!1}}function Ze(t){for(let e of t){if(!p.types.isJSXAttribute(e))continue;let n=O(e.name);if(J(n)){if(e.value&&!p.types.isStringLiteral(e.value))throw new h(`'${n}' needs a literal value, not an expression — the strategy is compile-time.`);return w(n,e.value?e.value.value:null)}}}
@@ -1 +1 @@
1
- {"version":3,"file":"build-ir.d.ts","sourceRoot":"","sources":["../../../src/frontend/babel/build-ir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,IAAI,CAAC,EAAsB,MAAM,aAAa,CAAC;AAI7D,OAAO,KAAK,EACV,MAAM,EAGP,MAAM,mBAAmB,CAAC;AAgD3B,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAErE;AAED,eAAO,MAAM,QAAQ,aAGnB,CAAC;AA2BH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,OAAO,CA+B1D;AAsFD,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBlD;AA2BD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,MAAM,CAYjG"}
1
+ {"version":3,"file":"build-ir.d.ts","sourceRoot":"","sources":["../../../src/frontend/babel/build-ir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,IAAI,CAAC,EAAsB,MAAM,aAAa,CAAC;AAW7D,OAAO,KAAK,EACV,MAAM,EAGP,MAAM,mBAAmB,CAAC;AAgD3B,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAErE;AAED,eAAO,MAAM,QAAQ,aAGnB,CAAC;AA2BH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,OAAO,CA+B1D;AAwFD,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBlD;AA2BD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,MAAM,CAMjG"}
@@ -14,8 +14,10 @@
14
14
  */
15
15
  import { types as t, traverse, template } from '@babel/core';
16
16
  import _generate from '@babel/generator';
17
- import { imperativeBackend } from '../../codegen/backends/imperative.js';
17
+ import { imperativeBackend, inlineTemplates } from '../../codegen/backends/imperative.js';
18
18
  import { buildIRFromLit } from './build-ir-lit.js';
19
+ import { analyzeStatic } from '../../optimize/analyze-static.js';
20
+ import { isLoadDirective, parseLoadDirective, LoadDirectiveError, } from '../../resolve/load-directive.js';
19
21
  // @babel/generator's ESM/CJS interop default (its types aren't callable under nodenext).
20
22
  const generate = _generate.default ?? _generate;
21
23
  /** Stringify an AST node back to source. */
@@ -43,8 +45,8 @@ function transformNestedJSX(node, used) {
43
45
  traverse(file, {
44
46
  'JSXElement|JSXFragment'(path) {
45
47
  const jsx = path.node;
46
- const { code, imports } = imperativeBackend.emit(buildIR(jsx, used), {});
47
- emitInto(path, code, imports);
48
+ const { code, imports, templates } = imperativeBackend.emit(buildIR(jsx, used), {});
49
+ emitInto(path, inlineTemplates(code, templates), imports);
48
50
  },
49
51
  // Nested lit templates compose: ${cond ? html`…` : html`…`},
50
52
  // ${list.map(x => html`<li>${x}</li>`)}. Compile them the same way.
@@ -53,8 +55,8 @@ function transformNestedJSX(node, used) {
53
55
  if (!t.isIdentifier(tag) || (tag.name !== 'html' && tag.name !== 'svg'))
54
56
  return;
55
57
  const ir = buildIRFromLit(path.node, used, { svg: tag.name === 'svg' });
56
- const { code, imports } = imperativeBackend.emit(ir, {});
57
- emitInto(path, code, imports);
58
+ const { code, imports, templates } = imperativeBackend.emit(ir, {});
59
+ emitInto(path, inlineTemplates(code, templates), imports);
58
60
  },
59
61
  });
60
62
  return changed
@@ -188,6 +190,9 @@ function buildProps(attrs, used) {
188
190
  }
189
191
  if (!t.isJSXAttribute(a))
190
192
  continue;
193
+ // `load:` is a directive, not a prop — the resolve pass reads it off the node.
194
+ if (isLoadDirective(attrName(a.name)))
195
+ continue;
191
196
  const ns = t.isJSXNamespacedName(a.name) ? a.name.namespace.name : null;
192
197
  // use:name / use:name={opts} -> [dir, () => opts] pair; dir is an in-scope fn
193
198
  if (ns === 'use') {
@@ -253,10 +258,10 @@ function buildChildren(children, used) {
253
258
  }
254
259
  }
255
260
  else if (t.isJSXElement(child)) {
256
- out.push(buildIR(child, used));
261
+ out.push(buildIRNode(child, used));
257
262
  }
258
263
  else if (t.isJSXFragment(child)) {
259
- out.push(buildIR(child, used));
264
+ out.push(buildIRNode(child, used));
260
265
  }
261
266
  else if (t.isJSXSpreadChild(child)) {
262
267
  out.push({ kind: 'expr', code: genExpr(child.expression, used), reactive: false });
@@ -270,6 +275,13 @@ function buildChildren(children, used) {
270
275
  * inject the right imports).
271
276
  */
272
277
  export function buildIR(node, used = new Set()) {
278
+ const ir = buildIRNode(node, used);
279
+ // `static` is decided by one shared pass rather than at construction, because it is a
280
+ // property of a whole subtree: an element is only inert once its children are known.
281
+ analyzeStatic(ir);
282
+ return ir;
283
+ }
284
+ function buildIRNode(node, used) {
273
285
  if (t.isJSXFragment(node)) {
274
286
  return { kind: 'fragment', children: buildChildren(node.children, used) };
275
287
  }
@@ -277,7 +289,23 @@ export function buildIR(node, used = new Set()) {
277
289
  const props = buildProps(node.openingElement.attributes, used);
278
290
  const children = buildChildren(node.children, used);
279
291
  if (component) {
280
- return { kind: 'component', name: tag, props, children };
292
+ const load = readLoad(node.openingElement.attributes);
293
+ return { kind: 'component', name: tag, props, children, ...(load ? { load } : {}) };
281
294
  }
282
295
  return { kind: 'element', tag, svg: SVG_TAGS.has(tag), props, children, static: false };
283
296
  }
297
+ /** The `load:` strategy written on a component tag, if any. */
298
+ function readLoad(attrs) {
299
+ for (const a of attrs) {
300
+ if (!t.isJSXAttribute(a))
301
+ continue;
302
+ const name = attrName(a.name);
303
+ if (!isLoadDirective(name))
304
+ continue;
305
+ if (a.value && !t.isStringLiteral(a.value)) {
306
+ throw new LoadDirectiveError(`'${name}' needs a literal value, not an expression — the strategy is compile-time.`);
307
+ }
308
+ return parseLoadDirective(name, a.value ? a.value.value : null);
309
+ }
310
+ return undefined;
311
+ }