@fluixi/compiler 1.0.0-alpha.76 → 1.0.0-alpha.78

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.
@@ -1,6 +1,7 @@
1
- "use strict";var pt=Object.create;var V=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,mt=Object.prototype.hasOwnProperty;var gt=(e,t)=>{for(var n in t)V(e,n,{get:t[n],enumerable:!0})},Re=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ut(t))!mt.call(e,s)&&s!==n&&V(e,s,{get:()=>t[s],enumerable:!(r=dt(t,s))||r.enumerable});return e};var ke=(e,t,n)=>(n=e!=null?pt(ft(e)):{},Re(t||!e||!e.__esModule?V(n,"default",{value:e,enumerable:!0}):n,e)),ht=e=>Re(V({},"__esModule",{value:!0}),e);var kn={};gt(kn,{transformTemplates:()=>vn});module.exports=ht(kn);var ot=require("@babel/parser"),at=ke(require("magic-string"),1);function yt(e){switch(e.kind){case"event":return"event";case"ref":return"ref";case"spread":return"spread";case"class":case"style":return"class-or-style-directive";case"attr":case"prop":return e.reactive?"reactive-prop":e.expr!==void 0?"expression-prop":void 0;default:return"expression-prop"}}function C(e){let t=[],n=new Map,r=s=>{switch(s.kind){case"text":return!0;case"expr":return!1;case"component":case"control":for(let i of s.children)r(i);return!1;case"fragment":for(let i of s.children)r(i);return!1;case"element":{let i=!0;for(let a of s.children)r(a)||(i=!1);let o;for(let a of s.props)if(o=yt(a),o)break;return!o&&!i&&(o=Nt(s)),s.static=!o,o?n.set(s,o):t.push(s),s.static}default:return!1}};for(let s of Array.isArray(e)?e:[e])r(s);return{staticElements:t,reasons:n}}function Nt(e){for(let t of e.children){if(t.kind==="expr")return"expression-child";if(t.kind==="component")return"component-child";if(t.kind==="control")return"control-child";if(t.kind==="element"&&!t.static||t.kind==="fragment")return"expression-child"}return"expression-child"}var z={kind:"eager"},vt=["pointerdown","focusin","keydown"],be=new Set(["eager","idle","visible","interaction","media","never"]),b=class extends Error{};function ie(e){return e.startsWith("load:")}function U(e,t){let n=e.slice(5);if(!be.has(n))throw new b(`Unknown load strategy 'load:${n}'. Expected one of ${[...be].join(", ")}.`);switch(n){case"eager":return z;case"idle":return{kind:"idle"};case"never":return{kind:"never"};case"visible":return t?{kind:"visible",rootMargin:t}:{kind:"visible"};case"interaction":return{kind:"interaction",events:t?xt(t):[...vt]};case"media":if(!t)throw new b(`'load:media' needs a query, e.g. load:media="(min-width: 1024px)".`);return{kind:"media",query:t};default:throw new b(`Unhandled load strategy '${n}'.`)}}function xt(e){let t=e.split(/[\s,]+/).map(n=>n.trim()).filter(Boolean);if(t.length===0)throw new b("'load:interaction' was given no event names.");return t}function W(e){return e.kind!=="eager"&&e.kind!=="never"}var O=["Show","For","Index","Switch","Match","Portal","Dynamic","ErrorBoundary"],D=["Suspense","SuspenseList","Await"],T=["Router","Outlet","Redirect","Link"],In=[...O,...D,...T],oe=new Set([...O,...D]);function Se(e={}){let{controlFlowModule:t="@fluixi/dom",coreModule:n="@fluixi/core",routerModule:r="@fluixi/core/router-next"}=e,s={};for(let i of O)s[i]=t;for(let i of D)s[i]=n;for(let i of T)s[i]=r;return s}function q(e,t={}){let{resolver:n,isBound:r,modules:s,strategyFor:i}=t,o=Se(s),a=new Map,l=new Set,c=u=>{let{name:d}=u;if(!d||d.includes(".")||r?.(d))return;let g=p(d);if(!g){l.add(d);return}let f=g.origin==="builtin"&&oe.has(d)?z:i?.(u)??z;u.source={...g,loading:f},a.set(d,u.source)},p=u=>{if(oe.has(u))return{module:o[u],export:u,origin:"builtin"};let d=n?.resolve(u);if(d)return{module:d.module,export:d.export,origin:"rule"};if(T.includes(u))return{module:o[u],export:u,origin:"builtin"}};return K(e,u=>{u.kind==="component"&&c(u)}),{resolved:a,unresolved:[...l]}}function K(e,t){let n=Array.isArray(e)?e:[e];for(let r of n){t(r);let s=r.children;s&&K(s,t)}}function G(e){let t=[];K(e,i=>{i.kind==="component"&&i.source&&t.push(i)});let n=new Set,r=new Set;for(let i of t){let{module:o,loading:a}=i.source;a.kind==="eager"&&n.add(o),a.kind==="never"&&r.add(o)}let s=new Map;for(let i of t){let o=i.source;W(o.loading)&&n.has(o.module)&&(o.loading={kind:"eager"},s.set(o.module,(s.get(o.module)??0)+1))}return{collapsed:s,conflicted:[...r].filter(i=>n.has(i))}}var Rt=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Ee={className:"class",htmlFor:"for"},kt=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),bt=new Set(["script","style","textarea","title"]);function ae(e){return bt.has(e)}function Ie(e){return Ee[e]??e}function A(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!kt.has(e.name)}function le(e){if(!e.static||ae(e.tag))return!1;for(let t of e.props)if(!A(t))return!1;for(let t of e.children)if(t.kind!=="text"&&!(t.kind==="element"&&le(t)))return!1;return!0}function j(e){let t=e.props.map(Et).filter(Boolean).join(""),n=`<${e.tag}${t}>`;return Rt.has(e.tag)?n:`${n}${e.children.map(St).join("")}</${e.tag}>`}function St(e){if(e.kind==="text")return wt(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return j(e)}function Et(e){let t=Ee[e.name]??e.name,n=e.literal;return n===!0||n===void 0?` ${t}`:n===!1||n===null?"":` ${t}="${It(String(n))}"`}function It(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function wt(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var Ct="<!--fx-->",Tt="<!--fx/-->";function Y(e){return e.kind==="expr"||e.kind==="component"||e.kind==="control"}function $t(e){return e.kind==="text"||e.kind==="element"&&we(e)}function we(e){return e.svg||ae(e.tag)||!e.props.every(t=>A(t))?!1:e.children.every(t=>$t(t)||Y(t))}function Z(e){if(Y(e))return!0;let t=e.children;return t?t.some(Z):!1}function Ce(e){for(let t=0;t<e.children.length;t++){let n=e.children[t];if(n.kind==="text"&&(n.value===""||e.children[t+1]?.kind==="text"))return!1}return e.children.every(t=>t.kind!=="element"||Ce(t))}function Te(e){if(!we(e)||!Ce(e)||!e.children.some(Z))return null;let t=[],n=[],r=0,s=o=>{let a=`_n$${r++}`;return t.push({ref:a,expr:o}),a};return i(e,"_el$"),{html:Pt(e),tag:e.tag,steps:t,holes:n};function i(o,a){let l=-1;o.children.forEach((p,u)=>{Z(p)&&(l=u)});let c=null;for(let p=0;p<=l;p++){let u=o.children[p],d=c?`${c}.nextSibling`:`${a}.firstChild`;if(Y(u)){let f=s(d),h=s(`holeEnd(${f})`);n.push({parentRef:a,startRef:f,endRef:h,node:u}),c=h;continue}let g=s(d);u.kind==="element"&&Z(u)&&i(u,g),c=g}}}function Pt(e){return j($e(e)).split(Pe).join(Ct+Tt)}function $e(e){return{...e,children:e.children.map(t=>Y(t)?{kind:"text",value:Pe}:t.kind==="element"?$e(t):t)}}var Pe="\0fx-hole\0";var ce={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},Ln={version:2,module:"@fluixi/dom",symbols:[...ce.symbols,"template","cloneTemplate","walk"]};var Mt={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function Ot(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function Oe(e){return Ot(e)?e:JSON.stringify(e)}function Dt(e){return e.expr!==void 0?e.reactive?`() => (${e.expr})`:`(${e.expr})`:JSON.stringify(e.literal??!0)}function At(e){return e.expr!==void 0?`(${e.expr})`:JSON.stringify(e.literal??!0)}function jt(e,t,n){let r=e.filter(a=>a.kind==="spread"),i=e.filter(a=>a.kind!=="spread").map(a=>`${Oe(a.name)}: ${Dt(a)}`);t!=null&&i.push(`children: ${t}`);let o=`{ ${i.join(", ")} }`;return r.length>0?(n.add("mergeProps"),`mergeProps(${r.map(a=>a.expr).join(", ")}, ${o})`):o}function De(e,t,n){return e.length===1?L(e[0],t,n):`[${e.map(r=>L(r,t,n)).join(", ")}]`}function Me(e,t,n,r,s){r.add("createMemo"),r.add("createComponent");let i=t.filter(c=>c.kind==="spread"),a=t.filter(c=>c.kind!=="spread").map(c=>`get ${Oe(c.name)}() { return ${At(c)}; }`);n.length>0&&a.push(`get children() { return ${De(n,r,s)}; }`);let l=`{ ${a.join(", ")} }`;return i.length>0&&(r.add("mergeProps"),l=`mergeProps(${i.map(c=>c.expr).join(", ")}, ${l})`),`createMemo(() => createComponent(${e}, ${l}))`}function Lt(e,t){let n=Ie(t.name),r=t.literal;return r===!0||r===void 0?`${e}.setAttribute(${JSON.stringify(n)}, "");`:r===!1||r===null?"":`${e}.setAttribute(${JSON.stringify(n)}, ${JSON.stringify(String(r))});`}var Ae=!1;function L(e,t,n){switch(e.kind){case"text":return JSON.stringify(e.value);case"expr":return e.reactive?`() => (${e.code})`:`(${e.code})`;case"fragment":return e.children.length===0?"null":De(e.children,t,n);case"component":return Me(e.name,e.props,e.children,t,n);case"control":{let r=Mt[e.control]??e.control;return t.add(r),Me(r,e.props,e.children,t,n)}case"element":{if(n&&e.static&&!e.svg&&le(e)){t.add("templateNode");let a=`_tmpl$${n.length}`;return n.push({id:a,html:j(e),tag:e.tag,svg:!1}),`templateNode(${a}, ${JSON.stringify(e.tag)})`}if(n&&Ae){let a=Te(e);if(a){t.add("templateNode"),t.add("insert"),t.add("holeEnd"),t.add("holeContent"),t.add("holeScope");let l=`_tmpl$${n.length}`;n.push({id:l,html:a.html,tag:a.tag,svg:!1});let c=[`const _el$ = templateNode(${l}, ${JSON.stringify(a.tag)}, true);`];for(let p of a.steps)c.push(`const ${p.ref} = ${p.expr};`);for(let p of a.holes)c.push(`insert(${p.parentRef}, holeScope(${p.startRef}, () => (${L(p.node,t,n)})), ${p.endRef}, holeContent(${p.startRef}, ${p.endRef}));`);return c.push("return _el$;"),`(() => { ${c.join(" ")} })()`}}t.add("createNativeElement");let r=JSON.stringify(e.tag),s="_el$",i=[],o=e.svg?`${r}, true`:r;if(i.push(`const ${s} = createNativeElement(${o});`),e.props.length>0)if(!e.svg&&e.props.every(A))for(let a of e.props)i.push(Lt(s,a));else{t.add("spread");let a=e.svg?", isSVG: true":"";i.push(`spread({ element: ${s}, props: ${jt(e.props,null,t)}${a} });`)}for(let a of e.children){t.add("insert");let l=L(a,t,n),c=a.kind==="expr"&&a.reactive||a.kind==="component"||a.kind==="control";i.push(c?`insert(${s}, ${l}, null);`:`insert(${s}, ${l});`)}return i.push(`return ${s};`),`(() => { ${i.join(" ")} })()`}}}function Q(e,t){if(!t||t.length===0)return e;let n=new Map(t.map(r=>[r.id,JSON.stringify(r.html)]));return e.replace(/_tmpl\$\d+/g,r=>n.get(r)??r)}var $={name:"imperative",contract:ce,emit(e,t){let n=new Set,r=t?.templateClone!==!1?[]:void 0;return Ae=t?.partialTemplates===!0,{code:L(e,n,r),imports:Array.from(n),templates:r}}};var Jt=e=>"components"in e;function je(e,t){return e.replace(/\$(\d+)/g,(n,r)=>t[Number(r)]??n)}function _t(e,t){return typeof t=="string"?{module:t,export:e}:t}function ee(e=[]){let t=new Map,n=[],r=[];for(let o of e){if(!Jt(o)){r.push(o);continue}for(let[a,l]of Object.entries(o.components)){let c=_t(a,l),p=t.get(a);if(p&&p.module!==c.module){let u=n.find(d=>d.name===a);u?u.modules.push(c.module):n.push({name:a,modules:[p.module,c.module]});continue}t.set(a,c)}}let s=new Map;return{resolve:o=>{if(s.has(o))return s.get(o);let a=t.get(o);if(!a)for(let l of r){let c=o.match(new RegExp(l.match.source,l.match.flags.replace("g","")));if(c){a={module:je(l.module,c),export:l.export?je(l.export,c):o};break}}return s.set(o,a),a},names:()=>[...t.keys()],conflicts:()=>n}}var _e=require("@fluixi/template-parser");function J(e){let t=e.split(/\r\n|\n|\r/),n=0;for(let s=0;s<t.length;s++)/[^ \t]/.test(t[s])&&(n=s);let r="";for(let s=0;s<t.length;s++){let i=t[s].replace(/\t/g," ");s!==0&&(i=i.replace(/^ +/,"")),s!==t.length-1&&(i=i.replace(/ +$/,"")),i&&(s!==n&&(i+=" "),r+=i)}return r}var Le=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function Bt(e){return e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function Je(e){return e.charAt(0).toUpperCase()+e.slice(1)}var pe=class{constructor(t,n){this.holes=t;this.used=n}hole(t){return this.holes[t]??{code:"undefined",reactive:!1}}emit(t){let{code:n,imports:r,templates:s}=$.emit(t,{});for(let i of r)this.used.add(i);return Q(n,s)}lowerRoot(t){let n=this.lowerChildren(t);return n.length===1?n[0]:{kind:"fragment",children:n}}lowerChildren(t){let n=[];for(let r=0;r<t.length;r++){let s=t[r];if(s.kind==="Element"||s.kind==="Component"){let o=s.attributes.find(a=>a.kind==="IfDirective");if(o&&o.kind==="IfDirective"){let a=r+1;a<t.length&&this.isBlankText(t[a])&&a++;let l=t[a],c=l&&(l.kind==="Element"||l.kind==="Component")&&l.attributes.some(p=>p.kind==="ElseDirective");n.push(this.lowerIf(s,o.hole,c?l:null)),c&&(r=a);continue}if(s.attributes.some(a=>a.kind==="EachDirective")){n.push(this.lowerEach(s));continue}}let i=this.lowerNode(s);i&&n.push(i)}return n}isBlankText(t){return t.kind==="Text"&&!t.raw&&J(t.value)===""}lowerNode(t){switch(t.kind){case"Text":{if(t.raw)return{kind:"text",value:t.value};let n=J(t.value);return n?{kind:"text",value:n}:null}case"Comment":return null;case"Expression":{let n=this.hole(t.hole);return{kind:"expr",code:n.code,reactive:n.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(t.children)};case"Element":return this.lowerElement(t);case"Component":return this.lowerComponent(t);default:return null}}lowerElement(t){let n=t.attributes.find(r=>r.kind==="Attribute"&&r.name==="is");if(t.tag==="component"&&n&&n.value&&n.value.kind==="hole"){let r=t.attributes.filter(i=>i!==n),s=this.lowerComponent({...t,kind:"Component",tag:"Dynamic",tagHole:null,attributes:r});return s.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(n.value.hole).code})`}),s}return{kind:"element",tag:t.tag,svg:t.namespace==="svg",props:this.lowerAttributes(t.attributes),children:this.lowerChildren(t.children),static:!1}}lowerComponent(t){let n=t.tagHole!=null?this.hole(t.tagHole).code:t.tag,r=this.lowerAttributes(t.attributes),{slots:s,rest:i}=this.partitionSlots(t.children);for(let[l,c]of s){let p=c.length===1?c[0]:{kind:"fragment",children:c},u={name:l,kind:"attr",expr:this.emit(p),jsxElement:!0},d=r.findIndex(g=>g.name===l);d>=0?r[d]=u:r.push(u)}let o=t.attributes.find(l=>l.kind==="LoadDirective"),a=o?U(`load:${o.strategy}`,o.modifier):void 0;return{kind:"component",name:n,props:r,children:this.lowerChildren(i),...a?{load:a}:{}}}partitionSlots(t){let n=new Map,r=[];for(let s of t){if(s.kind==="Element"||s.kind==="Component"){let i=s.attributes.find(o=>o.kind==="Attribute"&&o.name==="slot");if(i&&i.value&&i.value.kind==="static"){let o={...s,attributes:s.attributes.filter(c=>c!==i)},a=o.kind==="Element"?this.lowerElement(o):this.lowerComponent(o),l=n.get(i.value.value)??[];l.push(a),n.set(i.value.value,l);continue}}r.push(s)}return{slots:n,rest:r}}lowerIf(t,n,r){let s=this.hole(n),i=[{name:"when",kind:"attr",expr:s.code,reactive:s.reactive}];if(r){let a=this.stripAndLower(r,l=>l.kind==="ElseDirective");i.push({name:"fallback",kind:"attr",expr:this.emit(a),jsxElement:!0})}let o=this.stripAndLower(t,a=>a.kind==="IfDirective");return{kind:"component",name:"Show",props:i,children:[o]}}lowerEach(t){let n=t.attributes.find(l=>l.kind==="EachDirective");if(!n||n.kind!=="EachDirective")return this.lowerNode(t);let r=this.hole(n.hole),s=[{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;s.push({name:"by",kind:"attr",expr:l})}let i=this.itemArrow(t),o;if(i){let l={kind:"expr",code:i.body,reactive:i.bodyReactive},c=this.rebuildWithChildren(t,[l]);o=`(${i.params.join(", ")}) => (${this.emit(c)})`}else{let l=this.stripAndLower(t,c=>c.kind==="EachDirective");o=`() => (${this.emit(l)})`}return{kind:"component",name:"For",props:s,children:[{kind:"expr",code:o,reactive:!1}]}}itemArrow(t){let n=t.children.filter(r=>!this.isBlankText(r));return n.length!==1||n[0].kind!=="Expression"?null:this.hole(n[0].hole).arrow??null}stripAndLower(t,n){let r={...t,attributes:t.attributes.filter(s=>!n(s))};return r.kind==="Element"?this.lowerElement(r):this.lowerComponent(r)}rebuildWithChildren(t,n){let r=this.lowerAttributes(t.attributes.filter(s=>s.kind!=="EachDirective"));return t.kind==="Element"?{kind:"element",tag:t.tag,svg:t.namespace==="svg",props:r,children:n,static:!1}:{kind:"component",name:t.tag,props:r,children:n}}lowerAttributes(t){let n=[],r=[],s=!1,i=[],o=!1,a=[];for(let l of t)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}`),s=s||c.reactive;break}case"StyleDirective":{let c=this.hole(l.hole);i.push(`${JSON.stringify(l.name)}: ${c.code}`),o=o||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;a.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:s}),i.length>0&&n.push({name:"style",kind:"attr",expr:`{ ${i.join(", ")} }`,reactive:o}),a.length>0&&n.push({name:"use",kind:"attr",expr:`[${a.join(", ")}]`}),n}eventProp(t){let n=t.name.toLowerCase(),r=this.hole(t.hole).code;if(!(t.syntax==="colon"||t.modifiers.length>0))return{name:"on"+Je(t.name),kind:"event",event:{name:n,delegated:Le.has(n)},expr:r};let i=this.wrapHandler(r,t.modifiers),o=this.eventOptions(t.modifiers),a=o?`[${i}, ${o}]`:i;return{name:"on:"+n,kind:"attr",expr:a}}wrapHandler(t,n){let r=n.includes("self")?"if (e.target !== e.currentTarget) return; ":"",s=[];return n.includes("prevent")&&s.push("e.preventDefault();"),n.includes("stop")&&s.push("e.stopPropagation();"),!r&&s.length===0?t:`(e) => { ${r}${s.join(" ")} return (${t})(e); }`}eventOptions(t){let n=[];return t.includes("capture")&&n.push("capture: true"),t.includes("once")&&n.push("once: true"),t.includes("passive")&&n.push("passive: true"),n.length?`{ ${n.join(", ")} }`:null}bindProps(t,n){let r=t==="checked",s=r?"change":"input",i=r?"checked":"value";this.used.add("bindPair");let o=`bindPair(${n})`;return[{name:t,kind:"attr",expr:`${o}[0]()`,reactive:!0},{name:"on"+Je(s),kind:"event",event:{name:s,delegated:Le.has(s)},expr:`(e) => ${o}[1](e.target.${i})`}]}plainAttr(t){let n=t.value,r=t.name;t.name==="class"?r=n&&n.kind==="hole"&&this.hole(n.hole).object?"classList":"className":t.name==="html"&&(r="innerHTML");let i={name:r,kind:"attr"};if(n==null)return i.literal=!0,i;if(n.kind==="static")return i.literal=n.value,i;if(n.kind==="hole"){let l=this.hole(n.hole);return i.expr=l.code,i.reactive=l.reactive,i}let o=!1,a=n.parts.map(l=>{if("text"in l)return Bt(l.text);let c=this.hole(l.hole);return o=o||c.reactive,"${"+c.code+"}"}).join("");return i.expr="`"+a+"`",i.reactive=o,i}};function Be(e,t,n,r={}){let{root:s}=(0,_e.parseTemplate)(e,{svg:r.svg});return new pe(t,n).lowerRoot(s.children)}function Fe(e,t,n={}){let r=new Set,s=Be(e,[...t],r,{svg:n.svg});C(s),q(s,{resolver:ee(n.resolve??[]),modules:{controlFlowModule:n.controlFlowModule??"@fluixi/dom",coreModule:n.coreModule??"@fluixi/core",routerModule:n.routerModule??"@fluixi/core/router-next"},strategyFor:l=>l.load}),G(s);let{code:i,imports:o,templates:a}=$.emit(s,{templateClone:n.templateClone,partialTemplates:n.partialTemplates});for(let l of o)r.add(l);return n.hoistTemplates?{code:i,imports:[...r],ir:s,templates:a}:{code:Q(i,a),imports:[...r],ir:s}}var Ft="children";function P(e){switch(e.kind){case"call":return!0;case"member":return e.property!==Ft;case"compound":return e.parts.some(P);case"opaque":return!1}}var Ht=new Set(["CallExpression","OptionalCallExpression"]),Xt=new Set(["MemberExpression","OptionalMemberExpression"]);function M(e){if(!e)return{kind:"opaque"};if(Ht.has(e.type))return{kind:"call"};if(Xt.has(e.type)){let t=e.property;return{kind:"member",property:!(e.computed===!0)&&t?.type==="Identifier"?t.name:null}}return e.type==="ConditionalExpression"?{kind:"compound",parts:[e.test,e.consequent,e.alternate].map(_)}:e.type==="LogicalExpression"||e.type==="BinaryExpression"?{kind:"compound",parts:[e.left,e.right].map(_)}:e.type==="TemplateLiteral"?{kind:"compound",parts:e.expressions.map(_)}:e.type==="ObjectExpression"?{kind:"compound",parts:e.properties.filter(n=>(n.type==="ObjectProperty"||n.type==="Property")&&n.computed!==!0).map(n=>_(n.value))}:e.type==="ArrayExpression"?{kind:"compound",parts:e.elements.filter(n=>n!=null&&n.type!=="SpreadElement").map(_)}:{kind:"opaque"}}var _=e=>M(e);var Vt=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),zt=/^on[A-Z]/,Ut=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]),Ve=e=>P(M(e));function B(e){if(e.type==="StringLiteral"||e.type==="NumericLiteral"||e.type==="BooleanLiteral"||e.type==="Literal"&&(typeof e.value=="string"||typeof e.value=="number"||typeof e.value=="boolean"))return e.value}var de=e=>!!e&&typeof B(e)=="string";function Wt(e,t){return e.type==="JSXIdentifier"?{tag:e.name,component:e.name[0]!==e.name[0].toLowerCase()}:e.type==="JSXMemberExpression"?{tag:t.code(e),component:!0}:e.type==="JSXNamespacedName"?{tag:`${e.namespace.name}:${e.name.name}`,component:!1}:{tag:"div",component:!1}}function ue(e){return e.type==="JSXIdentifier"?e.name==="class"?"className":e.name:e.type==="JSXNamespacedName"?`${e.namespace.name}:${e.name.name}`:"unknown"}function qt(e,t){let n=ue(e.name),r=zt.test(n),s=r||n.startsWith("on:")||n==="ref",o={name:n,kind:r?"event":"attr"};if(r){let l=n.slice(2).toLowerCase();o.event={name:l,delegated:Ut.has(l)}}let a=e.value;if(a==null)return o.literal=!0,o;if(de(a))return o.literal=B(a),o;if(a.type==="JSXExpressionContainer"&&a.expression?.type!=="JSXEmptyExpression"){let l=a.expression,c=B(l);return c!==void 0?(o.literal=c,o):(o.expr=t.code(l),o.reactive=s?!1:Ve(l),(l.type==="JSXElement"||l.type==="JSXFragment")&&(o.jsxElement=!0),o)}return o.literal=!0,o}function He(e,t){let n=e.value;return n==null?null:de(n)?JSON.stringify(B(n)):n.type==="JSXExpressionContainer"&&n.expression?.type!=="JSXEmptyExpression"?t.code(n.expression):null}function Kt(e,t){let n=[],r=[];for(let s of e){if(s.type==="JSXSpreadAttribute"){n.push({name:"",kind:"spread",expr:t.code(s.argument)});continue}if(s.type!=="JSXAttribute"||ie(ue(s.name)))continue;let i=s.name.type==="JSXNamespacedName"?s.name.namespace.name:null;if(i==="use"){let o=s.name.name.name;t.used.add(o);let a=He(s,t);r.push(a!=null?`[${o}, () => (${a})]`:`[${o}]`);continue}if(i==="oncapture"){let o=s.name.name.name.toLowerCase(),a=He(s,t)??"undefined";n.push({name:"on:"+o,kind:"attr",expr:`[${a}, { capture: true }]`});continue}n.push(qt(s,t))}return r.length>0&&n.push({name:"use",kind:"attr",expr:`[${r.join(", ")}]`}),n}function Xe(e,t){let n=[];for(let r of e)if(r.type==="JSXText"){let s=J(r.value);s&&n.push({kind:"text",value:s})}else if(r.type==="JSXExpressionContainer"){if(r.expression?.type!=="JSXEmptyExpression"){let s=r.expression;n.push({kind:"expr",code:t.code(s),reactive:Ve(s)})}}else r.type==="JSXElement"||r.type==="JSXFragment"?n.push(ze(r,t)):r.type==="JSXSpreadChild"&&n.push({kind:"expr",code:t.code(r.expression),reactive:!1});return n}function Gt(e){for(let t of e){if(t.type!=="JSXAttribute")continue;let n=ue(t.name);if(ie(n)){if(t.value&&!de(t.value))throw new b(`'${n}' needs a literal value, not an expression — the strategy is compile-time.`);return U(n,t.value?B(t.value):null)}}}function ze(e,t){if(e.type==="JSXFragment")return{kind:"fragment",children:Xe(e.children,t)};let{tag:n,component:r}=Wt(e.openingElement.name,t),s=Kt(e.openingElement.attributes,t),i=Xe(e.children,t);if(r){let o=Gt(e.openingElement.attributes);return{kind:"component",name:n,props:s,children:i,...o?{load:o}:{}}}return{kind:"element",tag:n,svg:Vt.has(n),props:s,children:i,static:!1}}function Ue(e,t){let n=ze(e,t);return C(n),n}function S(e,t){if(e)switch(e.type){case"Identifier":t.add(e.name);return;case"ObjectPattern":for(let n of e.properties)n.type==="RestElement"?S(n.argument,t):S(n.value,t);return;case"ArrayPattern":for(let n of e.elements)S(n,t);return;case"AssignmentPattern":S(e.left,t);return;case"RestElement":S(e.argument,t);return}}function We(e,t){switch(e.type){case"ImportDeclaration":for(let n of e.specifiers)S(n.local,t);return;case"VariableDeclaration":for(let n of e.declarations)S(n.id,t);return;case"FunctionDeclaration":case"ClassDeclaration":S(e.id,t);return;case"ExportNamedDeclaration":case"ExportDefaultDeclaration":e.declaration&&We(e.declaration,t);return}}function fe(e){let t=new Set;for(let n of e.body)We(n,t);return t}var Qt=require("@babel/parser"),en=ke(require("magic-string"),1);function N(e,t){if(e)switch(e.type){case"Identifier":t.add(e.name);return;case"ObjectPattern":for(let n of e.properties)n.type==="RestElement"?N(n.argument,t):N(n.value,t);return;case"ArrayPattern":for(let n of e.elements)N(n,t);return;case"AssignmentPattern":N(e.left,t);return;case"RestElement":N(e.argument,t);return}}function me(e){switch(e.type){case"StringLiteral":case"NumericLiteral":case"BooleanLiteral":case"NullLiteral":case"BigIntLiteral":case"RegExpLiteral":case"Identifier":return!0;case"Literal":return!0;case"TemplateLiteral":return e.expressions.every(me);case"UnaryExpression":return me(e.argument);case"MemberExpression":return!1;default:return!1}}function te(e,t){if(!(!e||typeof e!="object")){t(e);for(let n of Object.keys(e)){if(n==="loc"||n==="range"||n==="leadingComments"||n==="trailingComments")continue;let r=e[n];if(Array.isArray(r))for(let s of r)s&&typeof s=="object"&&te(s,t);else r&&typeof r=="object"&&typeof r.type=="string"&&te(r,t)}}}function Zt(e){let t=new Set;return te(e,n=>{if(n.type==="AssignmentExpression")N(n.left,t);else if(n.type==="UpdateExpression"){let r=n.argument;r?.type==="Identifier"&&t.add(r.name)}}),t}function Yt(e,t){let n=new Set,r=s=>{let i=new Set;N(s,i);for(let o of i)t.has(o)&&n.add(o)};return te(e,s=>{switch(s.type){case"VariableDeclarator":r(s.id);return;case"FunctionDeclaration":case"FunctionExpression":case"ArrowFunctionExpression":r(s.id);for(let i of s.params??[])r(i);return;case"CatchClause":r(s.param);return;case"ClassDeclaration":case"ClassExpression":r(s.id);return}}),n}function qe(e,t,n){for(let r of e.properties??[]){if(r.type==="RestElement"){let p=r.argument;if(p?.type!=="Identifier"||t.length>0){let u=new Set;N(p,u);for(let d of u)n.bails.push({name:d,reason:"rest"});continue}n.rest={name:p.name,keys:[]};continue}if(r.computed){let p=new Set;N(r.value,p);for(let u of p)n.bails.push({name:u,reason:"computed"});continue}let s=r.key,i=s.type==="Identifier"?s.name:s.value,o=r.value,a;o.type==="AssignmentPattern"&&(a=o.right,o=o.left);let l=[...t,i];if(o.type==="Identifier"){if(a&&!me(a)){n.bails.push({name:o.name,reason:"unsafe-default"});continue}n.reads.push({name:o.name,path:l,...a?{fallback:a}:{}});continue}if(o.type==="ObjectPattern"){if(a){let p=new Set;N(o,p);for(let u of p)n.bails.push({name:u,reason:"unsafe-default"});continue}qe(o,l,n);continue}let c=new Set;N(o,c);for(let p of c)n.bails.push({name:p,reason:"computed"})}}function Ke(e,t){let n={reads:[],bails:[]};if(e?.type!=="ObjectPattern"||(qe(e,[],n),n.rest&&(t?.type!=="BlockStatement"?(n.bails.push({name:n.rest.name,reason:"rest"}),delete n.rest):n.rest.keys=(e.properties??[]).filter(a=>a.type!=="RestElement"&&!a.computed).map(a=>{let l=a.key;return l.type==="Identifier"?l.name:l.value})),n.reads.length===0&&!n.rest))return n;let r=new Set(n.reads.map(a=>a.name));n.rest&&r.add(n.rest.name);let s=Zt(t),i=Yt(t,r),o=[];for(let a of n.reads)s.has(a.name)?n.bails.push({name:a.name,reason:"reassigned"}):i.has(a.name)?n.bails.push({name:a.name,reason:"shadowed"}):o.push(a);return n.reads=o,n.rest&&s.has(n.rest.name)?(n.bails.push({name:n.rest.name,reason:"reassigned"}),delete n.rest):n.rest&&i.has(n.rest.name)&&(n.bails.push({name:n.rest.name,reason:"shadowed"}),delete n.rest),n}function Ge(e){switch(e){case"rest":return"this rest element cannot be served by splitProps, and copying the props into a plain object would lose the getters";case"computed":return"the property is not known until it runs";case"reassigned":return"the binding is assigned to, and props are read-only";case"shadowed":return"an inner scope binds the same name";case"unsafe-default":return"the default would have to run again on every read"}}function F(e,t,n=null){if(!(!e||typeof e!="object"||typeof e.type!="string")&&!e.type.startsWith("TS")&&t(e,n)!==!1)for(let r of Object.keys(e)){if(r==="loc"||r==="leadingComments"||r==="trailingComments")continue;let s=e[r];if(Array.isArray(s))for(let i of s)F(i,t,e);else s&&typeof s=="object"&&F(s,t,e)}}function Ze(e){return!!e&&e[0]>="A"&&e[0]<="Z"}function tn(e){let t=[];return F(e,n=>{if(n.type==="FunctionDeclaration"&&Ze(n.id?.name)){t.push(n);return}if(n.type==="VariableDeclarator"&&Ze(n.id?.name)){let r=n.init;r&&(r.type==="ArrowFunctionExpression"||r.type==="FunctionExpression")&&t.push(r)}}),t}function nn(e){let t=new Set;return F(e,n=>{n.type==="Identifier"&&t.add(n.name)}),t}function rn(e,t){if(!t)return!0;switch(t.type){case"MemberExpression":case"OptionalMemberExpression":return!(t.property===e&&!t.computed);case"ObjectProperty":case"ObjectMethod":case"ClassProperty":case"ClassMethod":return!(t.key===e&&!t.computed);case"LabeledStatement":case"BreakStatement":case"ContinueStatement":return t.label!==e;case"ImportSpecifier":case"ExportSpecifier":return!1;default:return!0}}function Ye(e,t,n={}){let r=[],s=[],i=new Set;for(let o of tn(e)){let a=o.params?.[0];if(a?.type!=="ObjectPattern")continue;let l=Ke(a,o.body);for(let f of l.bails)s.push({name:f.name,reason:f.reason,message:Ge(f.reason),start:a.start});if(l.bails.length>0||l.reads.length===0&&!l.rest)continue;let c=nn(o),p=n.parameterName??"props";for(;c.has(p);)p=`_${p}`;let u=new Map;for(let f of l.reads){let h=`${p}.${f.path.join(".")}`,y=f.fallback;u.set(f.name,y?`(${h} === undefined ? ${t.slice(y.start,y.end)} : ${h})`:h)}let d=a.typeAnnotation;if(r.push({start:a.start,end:d?.start??a.end,code:p}),l.rest){let f=l.rest.keys.map(y=>JSON.stringify(y)).join(", "),h=o.body;r.push({start:h.start+1,end:h.start+1,code:`
2
- const [, ${l.rest.name}] = splitProps(${p}, [${f}]);`}),i.add("splitProps")}let g=[];F(o.body,(f,h)=>{if(f.type!=="Identifier")return;let y=u.get(f.name);if(!y)return;let k=h?.type==="ObjectProperty"&&h.shorthand&&h.value===f;if(!k&&!rn(f,h))return;let v=l.reads.find(H=>H.name===f.name).path;g.push({node:f,parent:k?h:null,text:y,property:v[v.length-1]})});for(let f of g)f.parent?r.push({start:f.parent.start,end:f.parent.end,code:`${f.node.name}: ${f.text}`}):r.push({start:f.node.start,end:f.node.end,code:f.text}),sn(f.node,p,f.property)}return{edits:r,diagnostics:s,used:i}}function sn(e,t,n){e.type="MemberExpression",e.computed=!1,e.optional=!1,e.object={type:"Identifier",name:t,start:e.start,end:e.start},e.property={type:"Identifier",name:n,start:e.end,end:e.end},delete e.name}var I="@fluixi/reactive/signal",w={$signal:{export:"signal",module:I,returns:"signal-handle"},$memo:{export:"memo",module:I,returns:"memo-handle"},$effect:{export:"effect",module:I,returns:"effect"},$store:{export:"store",module:"@fluixi/reactive/store",returns:"store-handle"},$resource:{export:"resource",module:I,returns:"resource-handle"},$selector:{export:"createSelector",module:I,returns:"memo-accessor"},$deferred:{export:"createDeferred",module:I,returns:"memo-accessor"},$untrack:{export:"untrack",module:I,returns:"plain"},$untrackStore:{export:"untrackStore",module:"@fluixi/reactive/store",returns:"plain"}},Qe={signal:"signal-handle",memo:"memo-handle",effect:"effect",store:"store-handle",createSignal:["signal-accessor","signal-setter"],createMemo:"memo-accessor",createEffect:"effect",createRenderEffect:"effect",createStore:"reactive-object",resource:"resource-handle",createResource:"reactive-object",createSelector:"memo-accessor",createDeferred:"memo-accessor"},on=["@fluixi/reactive","@fluixi/reactive/signal","@fluixi/reactive/signal-next","@fluixi/reactive/store","@fluixi/core","@fluixi/core/rx"],an=new RegExp(`\\$(?:${Object.keys(w).map(e=>e.slice(1)).join("|")})\\s*\\(`);function et(e){return an.test(e)}function tt(e){return Object.prototype.hasOwnProperty.call(w,e)}function nt(e){return on.includes(e)}function x(e,t){if(e)switch(e.type){case"Identifier":t.add(e.name);return;case"ObjectPattern":for(let n of e.properties??[])n.type==="RestElement"?x(n.argument,t):x(n.value,t);return;case"ArrayPattern":for(let n of e.elements??[])x(n,t);return;case"AssignmentPattern":x(e.left,t);return;case"RestElement":x(e.argument,t);return}}function ne(e,t){if(!(!e||typeof e!="object"||typeof e.type!="string")){t(e);for(let n of Object.keys(e)){if(n==="loc"||n==="leadingComments"||n==="trailingComments")continue;let r=e[n];if(Array.isArray(r))for(let s of r)ne(s,t);else r&&typeof r=="object"&&ne(r,t)}}}function ln(e,t){if(e.type!=="CallExpression")return;let n=e.callee;if(n?.type!=="Identifier")return;let r=n.name,s=t.primitives.get(r);if(s)return s;let i=w[r];if(i&&!t.shadowed.has(r))return i.returns}function cn(e,t,n){if(Array.isArray(t)){e.type==="ArrayPattern"&&e.elements.forEach((r,s)=>{let i=t[s];r?.type==="Identifier"&&i&&n.set(r.name,i)});return}e.type==="Identifier"&&n.set(e.name,t)}function rt(e){let t={kinds:new Map,primitives:new Map,shadowed:new Set},n=e;ne(n,r=>{let s=new Set;if(r.type==="VariableDeclarator")x(r.id,s);else if(r.type==="FunctionDeclaration"||r.type==="ClassDeclaration")x(r.id,s);else if(r.type==="ImportDefaultSpecifier"||r.type==="ImportNamespaceSpecifier")x(r.local,s);else if(r.type==="ImportSpecifier")x(r.local,s);else if(r.type==="FunctionExpression"||r.type==="ArrowFunctionExpression"||r.type==="FunctionDeclaration")for(let i of r.params??[])x(i,s);for(let i of s)w[i]&&t.shadowed.add(i)});for(let r of n.body??[])if(r.type==="ImportDeclaration"&&nt(r.source?.value))for(let s of r.specifiers??[]){if(s.type!=="ImportSpecifier")continue;let i=s.imported,o=i.type==="Identifier"?i.name:i.value,a=Qe[o];a&&t.primitives.set(s.local.name,a)}return ne(n,r=>{if(r.type!=="VariableDeclarator"||!r.init)return;let s=ln(r.init,t);s&&cn(r.id,s,t.kinds)}),t}function ge(e,t){if(!(!e||typeof e!="object"||typeof e.type!="string")){t(e);for(let n of Object.keys(e)){if(n==="loc"||n==="leadingComments"||n==="trailingComments")continue;let r=e[n];if(Array.isArray(r))for(let s of r)ge(s,t);else r&&typeof r=="object"&&ge(r,t)}}}function st(e){let t=[],n=[],r=new Map,s=new Set,{shadowed:i}=rt(e);return ge(e,o=>{if(o.type!=="CallExpression")return;let a=o.callee;if(a?.type!=="Identifier")return;let l=a.name;if(!tt(l))return;if(i.has(l)){s.has(l)||(s.add(l),n.push({name:l,message:`${l} is reserved for the compiler, and this module binds it. The call keeps your binding's meaning; rename it to use the intrinsic.`,start:a.start}));return}let c=w[l];t.push({start:a.start,end:a.end,code:c.export});let p=r.get(c.module)??new Set;p.add(c.export),r.set(c.module,p)}),{edits:t,diagnostics:n,imports:r}}function it(e,t){let n=[];for(let[r,s]of[...e.imports].sort(([i],[o])=>i.localeCompare(o))){let i=[...s].filter(o=>!t.has(o)).sort();i.length&&n.push(`import { ${i.join(", ")} } from ${JSON.stringify(r)};`)}return n.length?`${n.join(`
1
+ "use strict";var ht=Object.create;var K=Object.defineProperty;var yt=Object.getOwnPropertyDescriptor;var Nt=Object.getOwnPropertyNames;var vt=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty;var Rt=(e,t)=>{for(var n in t)K(e,n,{get:t[n],enumerable:!0})},Ie=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Nt(t))!xt.call(e,o)&&o!==n&&K(e,o,{get:()=>t[o],enumerable:!(r=yt(t,o))||r.enumerable});return e};var Ee=(e,t,n)=>(n=e!=null?ht(vt(e)):{},Ie(t||!e||!e.__esModule?K(n,"default",{value:e,enumerable:!0}):n,e)),kt=e=>Ie(K({},"__esModule",{value:!0}),e);var Pn={};Rt(Pn,{transformTemplates:()=>Cn});module.exports=kt(Pn);var dt=require("@babel/parser"),ut=Ee(require("magic-string"),1);function bt(e){switch(e.kind){case"event":return"event";case"ref":return"ref";case"spread":return"spread";case"class":case"style":return"class-or-style-directive";case"attr":case"prop":return e.reactive?"reactive-prop":e.expr!==void 0?"expression-prop":void 0;default:return"expression-prop"}}function P(e){let t=[],n=new Map,r=o=>{switch(o.kind){case"text":return!0;case"expr":return!1;case"component":case"control":for(let s of o.children)r(s);return!1;case"fragment":for(let s of o.children)r(s);return!1;case"element":{let s=!0;for(let a of o.children)r(a)||(s=!1);let i;for(let a of o.props)if(i=bt(a),i)break;return!i&&!s&&(i=St(o)),o.static=!i,i?n.set(o,i):t.push(o),o.static}default:return!1}};for(let o of Array.isArray(e)?e:[e])r(o);return{staticElements:t,reasons:n}}function St(e){for(let t of e.children){if(t.kind==="expr")return"expression-child";if(t.kind==="component")return"component-child";if(t.kind==="control")return"control-child";if(t.kind==="element"&&!t.static||t.kind==="fragment")return"expression-child"}return"expression-child"}var G={kind:"eager"},It=["pointerdown","focusin","keydown"],we=new Set(["eager","idle","visible","interaction","media","never"]),E=class extends Error{};function le(e){return e.startsWith("load:")}function Z(e,t){let n=e.slice(5);if(!we.has(n))throw new E(`Unknown load strategy 'load:${n}'. Expected one of ${[...we].join(", ")}.`);switch(n){case"eager":return G;case"idle":return{kind:"idle"};case"never":return{kind:"never"};case"visible":return t?{kind:"visible",rootMargin:t}:{kind:"visible"};case"interaction":return{kind:"interaction",events:t?Et(t):[...It]};case"media":if(!t)throw new E(`'load:media' needs a query, e.g. load:media="(min-width: 1024px)".`);return{kind:"media",query:t};default:throw new E(`Unhandled load strategy '${n}'.`)}}function Et(e){let t=e.split(/[\s,]+/).map(n=>n.trim()).filter(Boolean);if(t.length===0)throw new E("'load:interaction' was given no event names.");return t}function L(e){return e.kind!=="eager"&&e.kind!=="never"}var j=["Show","For","Index","Switch","Match","Portal","Dynamic","ErrorBoundary"],J=["Suspense","SuspenseList","Await"],M=["Router","Outlet","Redirect","Link"],An=[...j,...J,...M],ce=new Set([...j,...J]);function Ce(e={}){let{controlFlowModule:t="@fluixi/dom",coreModule:n="@fluixi/core",routerModule:r="@fluixi/core/router-next"}=e,o={};for(let s of j)o[s]=t;for(let s of J)o[s]=n;for(let s of M)o[s]=r;return o}function Y(e,t={}){let{resolver:n,isBound:r,modules:o,strategyFor:s}=t,i=Ce(o),a=new Map,l=new Set,c=f=>{let{name:u}=f;if(!u||u.includes(".")||r?.(u))return;let g=p(u);if(!g){l.add(u);return}let m=g.origin==="builtin"&&ce.has(u)?G:s?.(f)??G;f.source={...g,loading:m},a.set(u,f.source)},p=f=>{if(ce.has(f))return{module:i[f],export:f,origin:"builtin"};let u=n?.resolve(f);if(u)return{module:u.module,export:u.export,origin:"rule"};if(M.includes(f))return{module:i[f],export:f,origin:"builtin"}};return Q(e,f=>{f.kind==="component"&&c(f)}),{resolved:a,unresolved:[...l]}}function Q(e,t){let n=Array.isArray(e)?e:[e];for(let r of n){t(r);let o=r.children;o&&Q(o,t)}}function ee(e){let t=[];Q(e,s=>{s.kind==="component"&&s.source&&t.push(s)});let n=new Set,r=new Set;for(let s of t){let{module:i,loading:a}=s.source;a.kind==="eager"&&n.add(i),a.kind==="never"&&r.add(i)}let o=new Map;for(let s of t){let i=s.source;L(i.loading)&&n.has(i.module)&&(i.loading={kind:"eager"},o.set(i.module,(o.get(i.module)??0)+1))}return{collapsed:o,conflicted:[...r].filter(s=>n.has(s))}}var wt=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),$e={className:"class",htmlFor:"for"},Ct=new Set(["innerHTML","outerHTML","innerText","textContent","value","checked","selected","muted","defaultValue","defaultChecked","children","ref"]),$t=new Set(["script","style","textarea","title"]);function pe(e){return $t.has(e)}function Te(e){return $e[e]??e}function B(e){return e.kind!=="attr"||e.expr!==void 0||e.name.includes(":")?!1:!Ct.has(e.name)}function de(e){if(!e.static||pe(e.tag))return!1;for(let t of e.props)if(!B(t))return!1;for(let t of e.children)if(t.kind!=="text"&&!(t.kind==="element"&&de(t)))return!1;return!0}function _(e){let t=e.props.map(Pt).filter(Boolean).join(""),n=`<${e.tag}${t}>`;return wt.has(e.tag)?n:`${n}${e.children.map(Tt).join("")}</${e.tag}>`}function Tt(e){if(e.kind==="text")return Ot(e.value);if(e.kind!=="element")throw new Error(`serializeStatic: unexpected ${e.kind}`);return _(e)}function Pt(e){let t=$e[e.name]??e.name,n=e.literal;return n===!0||n===void 0?` ${t}`:n===!1||n===null?"":` ${t}="${Mt(String(n))}"`}function Mt(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Ot(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var Dt="<!--fx-->",At="<!--fx/-->";function ne(e){return e.kind==="expr"||e.kind==="component"||e.kind==="control"}function Lt(e){return e.kind==="text"||e.kind==="element"&&Pe(e)}function Pe(e){return e.svg||pe(e.tag)||!e.props.every(t=>B(t))?!1:e.children.every(t=>Lt(t)||ne(t))}function te(e){if(ne(e))return!0;let t=e.children;return t?t.some(te):!1}function Me(e){for(let t=0;t<e.children.length;t++){let n=e.children[t];if(n.kind==="text"&&(n.value===""||e.children[t+1]?.kind==="text"))return!1}return e.children.every(t=>t.kind!=="element"||Me(t))}function Oe(e){if(!Pe(e)||!Me(e)||!e.children.some(te))return null;let t=[],n=[],r=0,o=i=>{let a=`_n$${r++}`;return t.push({ref:a,expr:i}),a};return s(e,"_el$"),{html:jt(e),tag:e.tag,steps:t,holes:n};function s(i,a){let l=-1;i.children.forEach((p,f)=>{te(p)&&(l=f)});let c=null;for(let p=0;p<=l;p++){let f=i.children[p],u=c?`${c}.nextSibling`:`${a}.firstChild`;if(ne(f)){let m=o(u),h=o(`holeEnd(${m})`);n.push({parentRef:a,startRef:m,endRef:h,node:f}),c=h;continue}let g=o(u);f.kind==="element"&&te(f)&&s(f,g),c=g}}}function jt(e){return _(De(e)).split(Ae).join(Dt+At)}function De(e){return{...e,children:e.children.map(t=>ne(t)?{kind:"text",value:Ae}:t.kind==="element"?De(t):t)}}var Ae="\0fx-hole\0";var ue={version:1,module:"@fluixi/dom",symbols:["createNativeElement","insert","spread","setAttribute","delegateEvents","createComponent","createMemo","untrack","Show","For","Index","Switch","Match","Dynamic","ErrorBoundary"]},zn={version:2,module:"@fluixi/dom",symbols:[...ue.symbols,"template","cloneTemplate","walk"]};var Jt={show:"Show",for:"For",index:"Index",switch:"Switch",match:"Match",dynamic:"Dynamic",errorBoundary:"ErrorBoundary",suspense:"Suspense"};function Bt(e){return/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(e)}function je(e){return Bt(e)?e:JSON.stringify(e)}function _t(e){return e.expr!==void 0?e.reactive?`() => (${e.expr})`:`(${e.expr})`:JSON.stringify(e.literal??!0)}function Ft(e){return e.expr!==void 0?`(${e.expr})`:JSON.stringify(e.literal??!0)}function Ht(e,t,n){let r=e.filter(a=>a.kind==="spread"),s=e.filter(a=>a.kind!=="spread").map(a=>`${je(a.name)}: ${_t(a)}`);t!=null&&s.push(`children: ${t}`);let i=`{ ${s.join(", ")} }`;return r.length>0?(n.add("mergeProps"),`mergeProps(${r.map(a=>a.expr).join(", ")}, ${i})`):i}function Je(e,t,n){return e.length===1?F(e[0],t,n):`[${e.map(r=>F(r,t,n)).join(", ")}]`}function Le(e,t,n,r,o){r.add("createMemo"),r.add("createComponent");let s=t.filter(c=>c.kind==="spread"),a=t.filter(c=>c.kind!=="spread").map(c=>`get ${je(c.name)}() { return ${Ft(c)}; }`);n.length>0&&a.push(`get children() { return ${Je(n,r,o)}; }`);let l=`{ ${a.join(", ")} }`;return s.length>0&&(r.add("mergeProps"),l=`mergeProps(${s.map(c=>c.expr).join(", ")}, ${l})`),`createMemo(() => createComponent(${e}, ${l}))`}function Vt(e,t){let n=Te(t.name),r=t.literal;return r===!0||r===void 0?`${e}.setAttribute(${JSON.stringify(n)}, "");`:r===!1||r===null?"":`${e}.setAttribute(${JSON.stringify(n)}, ${JSON.stringify(String(r))});`}var Be=!1;function F(e,t,n){switch(e.kind){case"text":return JSON.stringify(e.value);case"expr":return e.reactive?`() => (${e.code})`:`(${e.code})`;case"fragment":return e.children.length===0?"null":Je(e.children,t,n);case"component":return Le(e.name,e.props,e.children,t,n);case"control":{let r=Jt[e.control]??e.control;return t.add(r),Le(r,e.props,e.children,t,n)}case"element":{if(n&&e.static&&!e.svg&&de(e)){t.add("templateNode");let a=`_tmpl$${n.length}`;return n.push({id:a,html:_(e),tag:e.tag,svg:!1}),`templateNode(${a}, ${JSON.stringify(e.tag)})`}if(n&&Be){let a=Oe(e);if(a){t.add("templateNode"),t.add("insert"),t.add("holeEnd"),t.add("holeContent"),t.add("holeScope");let l=`_tmpl$${n.length}`;n.push({id:l,html:a.html,tag:a.tag,svg:!1});let c=[`const _el$ = templateNode(${l}, ${JSON.stringify(a.tag)}, true);`];for(let p of a.steps)c.push(`const ${p.ref} = ${p.expr};`);for(let p of a.holes)c.push(`insert(${p.parentRef}, holeScope(${p.startRef}, () => (${F(p.node,t,n)})), ${p.endRef}, holeContent(${p.startRef}, ${p.endRef}));`);return c.push("return _el$;"),`(() => { ${c.join(" ")} })()`}}t.add("createNativeElement");let r=JSON.stringify(e.tag),o="_el$",s=[],i=e.svg?`${r}, true`:r;if(s.push(`const ${o} = createNativeElement(${i});`),e.props.length>0)if(!e.svg&&e.props.every(B))for(let a of e.props)s.push(Vt(o,a));else{t.add("spread");let a=e.svg?", isSVG: true":"";s.push(`spread({ element: ${o}, props: ${Ht(e.props,null,t)}${a} });`)}for(let a of e.children){t.add("insert");let l=F(a,t,n),c=a.kind==="expr"&&a.reactive||a.kind==="component"||a.kind==="control";s.push(c?`insert(${o}, ${l}, null);`:`insert(${o}, ${l});`)}return s.push(`return ${o};`),`(() => { ${s.join(" ")} })()`}}}function re(e,t){if(!t||t.length===0)return e;let n=new Map(t.map(r=>[r.id,JSON.stringify(r.html)]));return e.replace(/_tmpl\$\d+/g,r=>n.get(r)??r)}var O={name:"imperative",contract:ue,emit(e,t){let n=new Set,r=t?.templateClone!==!1?[]:void 0;return Be=t?.partialTemplates===!0,{code:F(e,n,r),imports:Array.from(n),templates:r}}};var Xt=e=>"components"in e;function _e(e,t){return e.replace(/\$(\d+)/g,(n,r)=>t[Number(r)]??n)}function Ut(e,t){return typeof t=="string"?{module:t,export:e}:t}function oe(e=[]){let t=new Map,n=[],r=[];for(let i of e){if(!Xt(i)){r.push(i);continue}for(let[a,l]of Object.entries(i.components)){let c=Ut(a,l),p=t.get(a);if(p&&p.module!==c.module){let f=n.find(u=>u.name===a);f?f.modules.push(c.module):n.push({name:a,modules:[p.module,c.module]});continue}t.set(a,c)}}let o=new Map;return{resolve:i=>{if(o.has(i))return o.get(i);let a=t.get(i);if(!a)for(let l of r){let c=i.match(new RegExp(l.match.source,l.match.flags.replace("g","")));if(c){a={module:_e(l.module,c),export:l.export?_e(l.export,c):i};break}}return o.set(i,a),a},names:()=>[...t.keys()],conflicts:()=>n}}var Ve=require("@fluixi/template-parser");function H(e){let t=e.split(/\r\n|\n|\r/),n=0;for(let o=0;o<t.length;o++)/[^ \t]/.test(t[o])&&(n=o);let r="";for(let o=0;o<t.length;o++){let s=t[o].replace(/\t/g," ");o!==0&&(s=s.replace(/^ +/,"")),o!==t.length-1&&(s=s.replace(/ +$/,"")),s&&(o!==n&&(s+=" "),r+=s)}return r}var Fe=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]);function zt(e){return e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}function He(e){return e.charAt(0).toUpperCase()+e.slice(1)}var fe=class{constructor(t,n){this.holes=t;this.used=n}hole(t){return this.holes[t]??{code:"undefined",reactive:!1}}emit(t){let{code:n,imports:r,templates:o}=O.emit(t,{});for(let s of r)this.used.add(s);return re(n,o)}lowerRoot(t){let n=this.lowerChildren(t);return n.length===1?n[0]:{kind:"fragment",children:n}}lowerChildren(t){let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.kind==="Element"||o.kind==="Component"){let i=o.attributes.find(a=>a.kind==="IfDirective");if(i&&i.kind==="IfDirective"){let a=r+1;a<t.length&&this.isBlankText(t[a])&&a++;let l=t[a],c=l&&(l.kind==="Element"||l.kind==="Component")&&l.attributes.some(p=>p.kind==="ElseDirective");n.push(this.lowerIf(o,i.hole,c?l:null)),c&&(r=a);continue}if(o.attributes.some(a=>a.kind==="EachDirective")){n.push(this.lowerEach(o));continue}}let s=this.lowerNode(o);s&&n.push(s)}return n}isBlankText(t){return t.kind==="Text"&&!t.raw&&H(t.value)===""}lowerNode(t){switch(t.kind){case"Text":{if(t.raw)return{kind:"text",value:t.value};let n=H(t.value);return n?{kind:"text",value:n}:null}case"Comment":return null;case"Expression":{let n=this.hole(t.hole);return{kind:"expr",code:n.code,reactive:n.reactive}}case"Fragment":return{kind:"fragment",children:this.lowerChildren(t.children)};case"Element":return this.lowerElement(t);case"Component":return this.lowerComponent(t);default:return null}}lowerElement(t){let n=t.attributes.find(r=>r.kind==="Attribute"&&r.name==="is");if(t.tag==="component"&&n&&n.value&&n.value.kind==="hole"){let r=t.attributes.filter(s=>s!==n),o=this.lowerComponent({...t,kind:"Component",tag:"Dynamic",tagHole:null,attributes:r});return o.props.unshift({name:"component",kind:"attr",expr:`() => (${this.hole(n.value.hole).code})`}),o}return{kind:"element",tag:t.tag,svg:t.namespace==="svg",props:this.lowerAttributes(t.attributes),children:this.lowerChildren(t.children),static:!1}}lowerComponent(t){let n=t.tagHole!=null?this.hole(t.tagHole).code:t.tag,r=this.lowerAttributes(t.attributes),{slots:o,rest:s}=this.partitionSlots(t.children);for(let[l,c]of o){let p=c.length===1?c[0]:{kind:"fragment",children:c},f={name:l,kind:"attr",expr:this.emit(p),jsxElement:!0},u=r.findIndex(g=>g.name===l);u>=0?r[u]=f:r.push(f)}let i=t.attributes.find(l=>l.kind==="LoadDirective"),a=i?Z(`load:${i.strategy}`,i.modifier):void 0;return{kind:"component",name:n,props:r,children:this.lowerChildren(s),...a?{load:a}:{}}}partitionSlots(t){let n=new Map,r=[];for(let o of t){if(o.kind==="Element"||o.kind==="Component"){let s=o.attributes.find(i=>i.kind==="Attribute"&&i.name==="slot");if(s&&s.value&&s.value.kind==="static"){let i={...o,attributes:o.attributes.filter(c=>c!==s)},a=i.kind==="Element"?this.lowerElement(i):this.lowerComponent(i),l=n.get(s.value.value)??[];l.push(a),n.set(s.value.value,l);continue}}r.push(o)}return{slots:n,rest:r}}lowerIf(t,n,r){let o=this.hole(n),s=[{name:"when",kind:"attr",expr:o.code,reactive:o.reactive}];if(r){let a=this.stripAndLower(r,l=>l.kind==="ElseDirective");s.push({name:"fallback",kind:"attr",expr:this.emit(a),jsxElement:!0})}let i=this.stripAndLower(t,a=>a.kind==="IfDirective");return{kind:"component",name:"Show",props:s,children:[i]}}lowerEach(t){let n=t.attributes.find(l=>l.kind==="EachDirective");if(!n||n.kind!=="EachDirective")return this.lowerNode(t);let r=this.hole(n.hole),o=[{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;o.push({name:"by",kind:"attr",expr:l})}let s=this.itemArrow(t),i;if(s){let l={kind:"expr",code:s.body,reactive:s.bodyReactive},c=this.rebuildWithChildren(t,[l]);i=`(${s.params.join(", ")}) => (${this.emit(c)})`}else{let l=this.stripAndLower(t,c=>c.kind==="EachDirective");i=`() => (${this.emit(l)})`}return{kind:"component",name:"For",props:o,children:[{kind:"expr",code:i,reactive:!1}]}}itemArrow(t){let n=t.children.filter(r=>!this.isBlankText(r));return n.length!==1||n[0].kind!=="Expression"?null:this.hole(n[0].hole).arrow??null}stripAndLower(t,n){let r={...t,attributes:t.attributes.filter(o=>!n(o))};return r.kind==="Element"?this.lowerElement(r):this.lowerComponent(r)}rebuildWithChildren(t,n){let r=this.lowerAttributes(t.attributes.filter(o=>o.kind!=="EachDirective"));return t.kind==="Element"?{kind:"element",tag:t.tag,svg:t.namespace==="svg",props:r,children:n,static:!1}:{kind:"component",name:t.tag,props:r,children:n}}lowerAttributes(t){let n=[],r=[],o=!1,s=[],i=!1,a=[];for(let l of t)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}`),o=o||c.reactive;break}case"StyleDirective":{let c=this.hole(l.hole);s.push(`${JSON.stringify(l.name)}: ${c.code}`),i=i||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;a.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:o}),s.length>0&&n.push({name:"style",kind:"attr",expr:`{ ${s.join(", ")} }`,reactive:i}),a.length>0&&n.push({name:"use",kind:"attr",expr:`[${a.join(", ")}]`}),n}eventProp(t){let n=t.name.toLowerCase(),r=this.hole(t.hole).code;if(!(t.syntax==="colon"||t.modifiers.length>0))return{name:"on"+He(t.name),kind:"event",event:{name:n,delegated:Fe.has(n)},expr:r};let s=this.wrapHandler(r,t.modifiers),i=this.eventOptions(t.modifiers),a=i?`[${s}, ${i}]`:s;return{name:"on:"+n,kind:"attr",expr:a}}wrapHandler(t,n){let r=n.includes("self")?"if (e.target !== e.currentTarget) return; ":"",o=[];return n.includes("prevent")&&o.push("e.preventDefault();"),n.includes("stop")&&o.push("e.stopPropagation();"),!r&&o.length===0?t:`(e) => { ${r}${o.join(" ")} return (${t})(e); }`}eventOptions(t){let n=[];return t.includes("capture")&&n.push("capture: true"),t.includes("once")&&n.push("once: true"),t.includes("passive")&&n.push("passive: true"),n.length?`{ ${n.join(", ")} }`:null}bindProps(t,n){let r=t==="checked",o=r?"change":"input",s=r?"checked":"value";this.used.add("bindPair");let i=`bindPair(${n})`;return[{name:t,kind:"attr",expr:`${i}[0]()`,reactive:!0},{name:"on"+He(o),kind:"event",event:{name:o,delegated:Fe.has(o)},expr:`(e) => ${i}[1](e.target.${s})`}]}plainAttr(t){let n=t.value,r=t.name;t.name==="class"?r=n&&n.kind==="hole"&&this.hole(n.hole).object?"classList":"className":t.name==="html"&&(r="innerHTML");let s={name:r,kind:"attr"};if(n==null)return s.literal=!0,s;if(n.kind==="static")return s.literal=n.value,s;if(n.kind==="hole"){let l=this.hole(n.hole);return s.expr=l.code,s.reactive=l.reactive,s}let i=!1,a=n.parts.map(l=>{if("text"in l)return zt(l.text);let c=this.hole(l.hole);return i=i||c.reactive,"${"+c.code+"}"}).join("");return s.expr="`"+a+"`",s.reactive=i,s}};function Xe(e,t,n,r={}){let{root:o}=(0,Ve.parseTemplate)(e,{svg:r.svg});return new fe(t,n).lowerRoot(o.children)}function Ue(e,t,n={}){let r=new Set,o=Xe(e,[...t],r,{svg:n.svg});P(o),Y(o,{resolver:oe(n.resolve??[]),modules:{controlFlowModule:n.controlFlowModule??"@fluixi/dom",coreModule:n.coreModule??"@fluixi/core",routerModule:n.routerModule??"@fluixi/core/router-next"},strategyFor:l=>l.load}),ee(o);let{code:s,imports:i,templates:a}=O.emit(o,{templateClone:n.templateClone,partialTemplates:n.partialTemplates});for(let l of i)r.add(l);return n.hoistTemplates?{code:s,imports:[...r],ir:o,templates:a}:{code:re(s,a),imports:[...r],ir:o}}var Wt="children";function D(e){switch(e.kind){case"call":return!0;case"member":return e.property!==Wt;case"compound":return e.parts.some(D);case"opaque":return!1}}var qt=new Set(["CallExpression","OptionalCallExpression"]),Kt=new Set(["MemberExpression","OptionalMemberExpression"]);function A(e){if(!e)return{kind:"opaque"};if(qt.has(e.type))return{kind:"call"};if(Kt.has(e.type)){let t=e.property;return{kind:"member",property:!(e.computed===!0)&&t?.type==="Identifier"?t.name:null}}return e.type==="ConditionalExpression"?{kind:"compound",parts:[e.test,e.consequent,e.alternate].map(V)}:e.type==="LogicalExpression"||e.type==="BinaryExpression"?{kind:"compound",parts:[e.left,e.right].map(V)}:e.type==="TemplateLiteral"?{kind:"compound",parts:e.expressions.map(V)}:e.type==="ObjectExpression"?{kind:"compound",parts:e.properties.filter(n=>(n.type==="ObjectProperty"||n.type==="Property")&&n.computed!==!0).map(n=>V(n.value))}:e.type==="ArrayExpression"?{kind:"compound",parts:e.elements.filter(n=>n!=null&&n.type!=="SpreadElement").map(V)}:{kind:"opaque"}}var V=e=>A(e);var Gt=new Set(["svg","path","circle","rect","line","polygon","polyline","ellipse","g","defs","clipPath","text"]),Zt=/^on[A-Z]/,Yt=new Set(["click","dblclick","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup"]),qe=e=>D(A(e));function X(e){if(e.type==="StringLiteral"||e.type==="NumericLiteral"||e.type==="BooleanLiteral"||e.type==="Literal"&&(typeof e.value=="string"||typeof e.value=="number"||typeof e.value=="boolean"))return e.value}var me=e=>!!e&&typeof X(e)=="string";function Qt(e,t){return e.type==="JSXIdentifier"?{tag:e.name,component:e.name[0]!==e.name[0].toLowerCase()}:e.type==="JSXMemberExpression"?{tag:t.code(e),component:!0}:e.type==="JSXNamespacedName"?{tag:`${e.namespace.name}:${e.name.name}`,component:!1}:{tag:"div",component:!1}}function ge(e){return e.type==="JSXIdentifier"?e.name==="class"?"className":e.name:e.type==="JSXNamespacedName"?`${e.namespace.name}:${e.name.name}`:"unknown"}function en(e,t){let n=ge(e.name),r=Zt.test(n),o=r||n.startsWith("on:")||n==="ref",i={name:n,kind:r?"event":"attr"};if(r){let l=n.slice(2).toLowerCase();i.event={name:l,delegated:Yt.has(l)}}let a=e.value;if(a==null)return i.literal=!0,i;if(me(a))return i.literal=X(a),i;if(a.type==="JSXExpressionContainer"&&a.expression?.type!=="JSXEmptyExpression"){let l=a.expression,c=X(l);return c!==void 0?(i.literal=c,i):(i.expr=t.code(l),i.reactive=o?!1:qe(l),(l.type==="JSXElement"||l.type==="JSXFragment")&&(i.jsxElement=!0),i)}return i.literal=!0,i}function ze(e,t){let n=e.value;return n==null?null:me(n)?JSON.stringify(X(n)):n.type==="JSXExpressionContainer"&&n.expression?.type!=="JSXEmptyExpression"?t.code(n.expression):null}function tn(e,t){let n=[],r=[];for(let o of e){if(o.type==="JSXSpreadAttribute"){n.push({name:"",kind:"spread",expr:t.code(o.argument)});continue}if(o.type!=="JSXAttribute"||le(ge(o.name)))continue;let s=o.name.type==="JSXNamespacedName"?o.name.namespace.name:null;if(s==="use"){let i=o.name.name.name;t.used.add(i);let a=ze(o,t);r.push(a!=null?`[${i}, () => (${a})]`:`[${i}]`);continue}if(s==="oncapture"){let i=o.name.name.name.toLowerCase(),a=ze(o,t)??"undefined";n.push({name:"on:"+i,kind:"attr",expr:`[${a}, { capture: true }]`});continue}n.push(en(o,t))}return r.length>0&&n.push({name:"use",kind:"attr",expr:`[${r.join(", ")}]`}),n}function We(e,t){let n=[];for(let r of e)if(r.type==="JSXText"){let o=H(r.value);o&&n.push({kind:"text",value:o})}else if(r.type==="JSXExpressionContainer"){if(r.expression?.type!=="JSXEmptyExpression"){let o=r.expression;n.push({kind:"expr",code:t.code(o),reactive:qe(o)})}}else r.type==="JSXElement"||r.type==="JSXFragment"?n.push(Ke(r,t)):r.type==="JSXSpreadChild"&&n.push({kind:"expr",code:t.code(r.expression),reactive:!1});return n}function nn(e){for(let t of e){if(t.type!=="JSXAttribute")continue;let n=ge(t.name);if(le(n)){if(t.value&&!me(t.value))throw new E(`'${n}' needs a literal value, not an expression — the strategy is compile-time.`);return Z(n,t.value?X(t.value):null)}}}function Ke(e,t){if(e.type==="JSXFragment")return{kind:"fragment",children:We(e.children,t)};let{tag:n,component:r}=Qt(e.openingElement.name,t),o=tn(e.openingElement.attributes,t),s=We(e.children,t);if(r){let i=nn(e.openingElement.attributes);return{kind:"component",name:n,props:o,children:s,...i?{load:i}:{}}}return{kind:"element",tag:n,svg:Gt.has(n),props:o,children:s,static:!1}}function Ge(e,t){let n=Ke(e,t);return P(n),n}function w(e,t){if(e)switch(e.type){case"Identifier":t.add(e.name);return;case"ObjectPattern":for(let n of e.properties)n.type==="RestElement"?w(n.argument,t):w(n.value,t);return;case"ArrayPattern":for(let n of e.elements)w(n,t);return;case"AssignmentPattern":w(e.left,t);return;case"RestElement":w(e.argument,t);return}}function Ze(e,t){switch(e.type){case"ImportDeclaration":for(let n of e.specifiers)w(n.local,t);return;case"VariableDeclaration":for(let n of e.declarations)w(n.id,t);return;case"FunctionDeclaration":case"ClassDeclaration":w(e.id,t);return;case"ExportNamedDeclaration":case"ExportDefaultDeclaration":e.declaration&&Ze(e.declaration,t);return}}function he(e){let t=new Set;for(let n of e.body)Ze(n,t);return t}var sn=require("@babel/parser"),an=Ee(require("magic-string"),1);function b(e,t){if(e)switch(e.type){case"Identifier":t.add(e.name);return;case"ObjectPattern":for(let n of e.properties)n.type==="RestElement"?b(n.argument,t):b(n.value,t);return;case"ArrayPattern":for(let n of e.elements)b(n,t);return;case"AssignmentPattern":b(e.left,t);return;case"RestElement":b(e.argument,t);return}}function ye(e){switch(e.type){case"StringLiteral":case"NumericLiteral":case"BooleanLiteral":case"NullLiteral":case"BigIntLiteral":case"RegExpLiteral":case"Identifier":return!0;case"Literal":return!0;case"TemplateLiteral":return e.expressions.every(ye);case"UnaryExpression":return ye(e.argument);case"MemberExpression":return!1;default:return!1}}function se(e,t){if(!(!e||typeof e!="object")){t(e);for(let n of Object.keys(e)){if(n==="loc"||n==="range"||n==="leadingComments"||n==="trailingComments")continue;let r=e[n];if(Array.isArray(r))for(let o of r)o&&typeof o=="object"&&se(o,t);else r&&typeof r=="object"&&typeof r.type=="string"&&se(r,t)}}}function rn(e){let t=new Set;return se(e,n=>{if(n.type==="AssignmentExpression")b(n.left,t);else if(n.type==="UpdateExpression"){let r=n.argument;r?.type==="Identifier"&&t.add(r.name)}}),t}function on(e,t){let n=new Set,r=o=>{let s=new Set;b(o,s);for(let i of s)t.has(i)&&n.add(i)};return se(e,o=>{switch(o.type){case"VariableDeclarator":r(o.id);return;case"FunctionDeclaration":case"FunctionExpression":case"ArrowFunctionExpression":r(o.id);for(let s of o.params??[])r(s);return;case"CatchClause":r(o.param);return;case"ClassDeclaration":case"ClassExpression":r(o.id);return}}),n}function Ye(e,t,n){for(let r of e.properties??[]){if(r.type==="RestElement"){let p=r.argument;if(p?.type!=="Identifier"||t.length>0){let f=new Set;b(p,f);for(let u of f)n.bails.push({name:u,reason:"rest"});continue}n.rest={name:p.name,keys:[]};continue}if(r.computed){let p=new Set;b(r.value,p);for(let f of p)n.bails.push({name:f,reason:"computed"});continue}let o=r.key,s=o.type==="Identifier"?o.name:o.value,i=r.value,a;i.type==="AssignmentPattern"&&(a=i.right,i=i.left);let l=[...t,s];if(i.type==="Identifier"){if(a&&!ye(a)){n.bails.push({name:i.name,reason:"unsafe-default"});continue}n.reads.push({name:i.name,path:l,...a?{fallback:a}:{}});continue}if(i.type==="ObjectPattern"){if(a){let p=new Set;b(i,p);for(let f of p)n.bails.push({name:f,reason:"unsafe-default"});continue}Ye(i,l,n);continue}let c=new Set;b(i,c);for(let p of c)n.bails.push({name:p,reason:"computed"})}}function Qe(e,t){let n={reads:[],bails:[]};if(e?.type!=="ObjectPattern"||(Ye(e,[],n),n.rest&&(t?.type!=="BlockStatement"?(n.bails.push({name:n.rest.name,reason:"rest"}),delete n.rest):n.rest.keys=(e.properties??[]).filter(a=>a.type!=="RestElement"&&!a.computed).map(a=>{let l=a.key;return l.type==="Identifier"?l.name:l.value})),n.reads.length===0&&!n.rest))return n;let r=new Set(n.reads.map(a=>a.name));n.rest&&r.add(n.rest.name);let o=rn(t),s=on(t,r),i=[];for(let a of n.reads)o.has(a.name)?n.bails.push({name:a.name,reason:"reassigned"}):s.has(a.name)?n.bails.push({name:a.name,reason:"shadowed"}):i.push(a);return n.reads=i,n.rest&&o.has(n.rest.name)?(n.bails.push({name:n.rest.name,reason:"reassigned"}),delete n.rest):n.rest&&s.has(n.rest.name)&&(n.bails.push({name:n.rest.name,reason:"shadowed"}),delete n.rest),n}function et(e){switch(e){case"rest":return"this rest element cannot be served by splitProps, and copying the props into a plain object would lose the getters";case"computed":return"the property is not known until it runs";case"reassigned":return"the binding is assigned to, and props are read-only";case"shadowed":return"an inner scope binds the same name";case"unsafe-default":return"the default would have to run again on every read"}}function U(e,t,n=null){if(!(!e||typeof e!="object"||typeof e.type!="string")&&!e.type.startsWith("TS")&&t(e,n)!==!1)for(let r of Object.keys(e)){if(r==="loc"||r==="leadingComments"||r==="trailingComments")continue;let o=e[r];if(Array.isArray(o))for(let s of o)U(s,t,e);else o&&typeof o=="object"&&U(o,t,e)}}function tt(e){return!!e&&e[0]>="A"&&e[0]<="Z"}function ln(e){let t=[];return U(e,n=>{if(n.type==="FunctionDeclaration"&&tt(n.id?.name)){t.push(n);return}if(n.type==="VariableDeclarator"&&tt(n.id?.name)){let r=n.init;r&&(r.type==="ArrowFunctionExpression"||r.type==="FunctionExpression")&&t.push(r)}}),t}function cn(e){let t=new Set;return U(e,n=>{n.type==="Identifier"&&t.add(n.name)}),t}function pn(e,t){if(!t)return!0;switch(t.type){case"MemberExpression":case"OptionalMemberExpression":return!(t.property===e&&!t.computed);case"ObjectProperty":case"ObjectMethod":case"ClassProperty":case"ClassMethod":return!(t.key===e&&!t.computed);case"LabeledStatement":case"BreakStatement":case"ContinueStatement":return t.label!==e;case"ImportSpecifier":case"ExportSpecifier":return!1;default:return!0}}function nt(e,t,n={}){let r=[],o=[],s=new Set;for(let i of ln(e)){let a=i.params?.[0];if(a?.type!=="ObjectPattern")continue;let l=Qe(a,i.body);for(let m of l.bails)o.push({name:m.name,reason:m.reason,message:et(m.reason),start:a.start});if(l.bails.length>0||l.reads.length===0&&!l.rest)continue;let c=cn(i),p=n.parameterName??"props";for(;c.has(p);)p=`_${p}`;let f=new Map;for(let m of l.reads){let h=`${p}.${m.path.join(".")}`,v=m.fallback;f.set(m.name,v?`(${h} === undefined ? ${t.slice(v.start,v.end)} : ${h})`:h)}let u=a.typeAnnotation;if(r.push({start:a.start,end:u?.start??a.end,code:p}),l.rest){let m=l.rest.keys.map(v=>JSON.stringify(v)).join(", "),h=i.body;r.push({start:h.start+1,end:h.start+1,code:`
2
+ const [, ${l.rest.name}] = splitProps(${p}, [${m}]);`}),s.add("splitProps")}let g=[];U(i.body,(m,h)=>{if(m.type!=="Identifier")return;let v=f.get(m.name);if(!v)return;let S=h?.type==="ObjectProperty"&&h.shorthand&&h.value===m;if(!S&&!pn(m,h))return;let R=l.reads.find(C=>C.name===m.name).path;g.push({node:m,parent:S?h:null,text:v,property:R[R.length-1]})});for(let m of g)m.parent?r.push({start:m.parent.start,end:m.parent.end,code:`${m.node.name}: ${m.text}`}):r.push({start:m.node.start,end:m.node.end,code:m.text}),dn(m.node,p,m.property)}return{edits:r,diagnostics:o,used:s}}function dn(e,t,n){e.type="MemberExpression",e.computed=!1,e.optional=!1,e.object={type:"Identifier",name:t,start:e.start,end:e.start},e.property={type:"Identifier",name:n,start:e.end,end:e.end},delete e.name}var $="@fluixi/reactive/signal",T={$signal:{export:"signal",module:$,returns:"signal-handle"},$memo:{export:"memo",module:$,returns:"memo-handle"},$effect:{export:"effect",module:$,returns:"effect"},$store:{export:"store",module:"@fluixi/reactive/store",returns:"store-handle"},$resource:{export:"resource",module:$,returns:"resource-handle"},$selector:{export:"createSelector",module:$,returns:"memo-accessor"},$deferred:{export:"createDeferred",module:$,returns:"memo-accessor"},$untrack:{export:"untrack",module:$,returns:"plain"},$untrackStore:{export:"untrackStore",module:"@fluixi/reactive/store",returns:"plain"}},rt={signal:"signal-handle",memo:"memo-handle",effect:"effect",store:"store-handle",createSignal:["signal-accessor","signal-setter"],createMemo:"memo-accessor",createEffect:"effect",createRenderEffect:"effect",createStore:"reactive-object",resource:"resource-handle",createResource:"reactive-object",createSelector:"memo-accessor",createDeferred:"memo-accessor"},un=["@fluixi/reactive","@fluixi/reactive/signal","@fluixi/reactive/store","@fluixi/core","@fluixi/core/rx"],fn=new RegExp(`\\$(?:${Object.keys(T).map(e=>e.slice(1)).join("|")})\\s*\\(`);function ot(e){return fn.test(e)}function st(e){return Object.prototype.hasOwnProperty.call(T,e)}function it(e){return un.includes(e)}function y(e,t){if(e)switch(e.type){case"Identifier":t.add(e.name);return;case"ObjectPattern":for(let n of e.properties??[])n.type==="RestElement"?y(n.argument,t):y(n.value,t);return;case"ArrayPattern":for(let n of e.elements??[])y(n,t);return;case"AssignmentPattern":y(e.left,t);return;case"RestElement":y(e.argument,t);return}}function z(e,t){if(!(!e||typeof e!="object"||typeof e.type!="string")){t(e);for(let n of Object.keys(e)){if(n==="loc"||n==="leadingComments"||n==="trailingComments")continue;let r=e[n];if(Array.isArray(r))for(let o of r)z(o,t);else r&&typeof r=="object"&&z(r,t)}}}function mn(e,t){if(e.type!=="CallExpression")return;let n=e.callee;if(n?.type!=="Identifier")return;let r=n.name,o=t.primitives.get(r);if(o)return o;let s=T[r];if(s&&!t.shadowed.has(r))return s.returns}function gn(e,t,n){if(Array.isArray(t)){e.type==="ArrayPattern"&&e.elements.forEach((r,o)=>{let s=t[o];r?.type==="Identifier"&&s&&n.set(r.name,s)});return}e.type==="Identifier"&&n.set(e.name,t)}function at(e){let t=new Set;return z(e,n=>{switch(n.type){case"VariableDeclarator":y(n.id,t);return;case"FunctionDeclaration":case"FunctionExpression":case"ArrowFunctionExpression":y(n.id,t);for(let r of n.params??[])y(r,t);return;case"ClassDeclaration":case"ClassExpression":y(n.id,t);return;case"ImportSpecifier":case"ImportDefaultSpecifier":case"ImportNamespaceSpecifier":y(n.local,t);return;case"CatchClause":y(n.param,t);return}}),t}function lt(e){let t={kinds:new Map,primitives:new Map,shadowed:new Set},n=e;z(n,r=>{let o=new Set;if(r.type==="VariableDeclarator")y(r.id,o);else if(r.type==="FunctionDeclaration"||r.type==="ClassDeclaration")y(r.id,o);else if(r.type==="ImportDefaultSpecifier"||r.type==="ImportNamespaceSpecifier")y(r.local,o);else if(r.type==="ImportSpecifier")y(r.local,o);else if(r.type==="FunctionExpression"||r.type==="ArrowFunctionExpression"||r.type==="FunctionDeclaration")for(let s of r.params??[])y(s,o);for(let s of o)T[s]&&t.shadowed.add(s)});for(let r of n.body??[])if(r.type==="ImportDeclaration"&&it(r.source?.value))for(let o of r.specifiers??[]){if(o.type!=="ImportSpecifier")continue;let s=o.imported,i=s.type==="Identifier"?s.name:s.value,a=rt[i];a&&t.primitives.set(o.local.name,a)}return z(n,r=>{if(r.type!=="VariableDeclarator"||!r.init)return;let o=mn(r.init,t);o&&gn(r.id,o,t.kinds)}),t}function Ne(e,t){if(!(!e||typeof e!="object"||typeof e.type!="string")){t(e);for(let n of Object.keys(e)){if(n==="loc"||n==="leadingComments"||n==="trailingComments")continue;let r=e[n];if(Array.isArray(r))for(let o of r)Ne(o,t);else r&&typeof r=="object"&&Ne(r,t)}}}function ct(e){let t=[],n=[],r=new Map,o=new Set,{shadowed:s}=lt(e);return Ne(e,i=>{if(i.type!=="CallExpression")return;let a=i.callee;if(a?.type!=="Identifier")return;let l=a.name;if(!st(l))return;if(s.has(l)){o.has(l)||(o.add(l),n.push({name:l,message:`${l} is reserved for the compiler, and this module binds it. The call keeps your binding's meaning; rename it to use the intrinsic.`,start:a.start}));return}let c=T[l];t.push({start:a.start,end:a.end,code:c.export});let p=r.get(c.module)??new Set;p.add(c.export),r.set(c.module,p)}),{edits:t,diagnostics:n,imports:r}}function pt(e,t){let n=[];for(let[r,o]of[...e.imports].sort(([s],[i])=>s.localeCompare(i))){let s=[...o].filter(i=>!t.has(i)).sort();s.length&&n.push(`import { ${s.join(", ")} } from ${JSON.stringify(r)};`)}return n.length?`${n.join(`
3
3
  `)}
4
- `:""}var pn=new Set(O),dn=new Set(D),un=new Set(T),fn=new Set(["createMemo","createEffect","createRenderEffect","createRoot","createSignal","onCleanup","batch","untrack"]);function he(e,t,n=null,r=""){if(!(!e||typeof e!="object")){if(Array.isArray(e)){for(let s of e)he(s,t,n,r);return}typeof e.type=="string"&&t(e,n,r);for(let s of Object.keys(e))s==="loc"||s==="leadingComments"||s==="trailingComments"||he(e[s],t,typeof e.type=="string"?e:n,s)}}var ye=e=>e.type==="JSXElement"||e.type==="JSXFragment";function mn(e,t,n){return ye(e)?!(t&&ye(t)&&n==="children"):!1}function gn(e,t){return e.type==="TaggedTemplateExpression"&&e.tag?.type==="Identifier"&&(e.tag.name===t||e.tag.name==="svg")}function lt(e){return e.filter(t=>!e.some(n=>n!==t&&n.start<=t.start&&n.end>=t.end&&n.end-n.start>t.end-t.start))}function re(e,t,n,r){let s=lt(r.filter(o=>o.start>=t&&o.end<=n)).sort((o,a)=>a.start-o.start),i=e.slice(t,n);for(let o of s)i=i.slice(0,o.start-t)+o.code+i.slice(o.end-t);return i}function hn(e,t,n){let r={code:re(e,t.start,t.end,n),reactive:P(M(t))};return t.type==="ArrowFunctionExpression"&&t.body?.type!=="BlockStatement"&&(r.arrow={params:t.params.map(s=>re(e,s.start,s.end,n)),body:re(e,t.body.start,t.body.end,n),bodyReactive:P(M(t.body))}),t.type==="ObjectExpression"&&(r.object=!0),r}function ct(e,t,n){if(!t||t.length===0)return e;let r=new Map;for(let s of t){let i=`${s.svg?"svg:":""}${s.html}`,o=n.get(i);o||(o=`_fxTmpl$${n.size}`,n.set(i,o)),r.set(s.id,o)}return e.replace(/_tmpl\$\d+/g,s=>r.get(s)??s)}function Ne(e,t){if(e.kind==="component"&&e.source){let n=e.source;n.origin==="builtin"?t.builtins.add(e.name):W(n.loading)&&!t.resolved.has(e.name)?t.deferred.set(e.name,n):(t.deferred.delete(e.name),t.resolved.set(e.name,n))}if("props"in e&&e.props)for(let n of e.props)n.kind==="event"&&n.event?.delegated&&t.delegatedEvents.add(n.event.name);if("children"in e&&e.children)for(let n of e.children)Ne(n,t)}function yn(e){let t=[`kind: ${JSON.stringify(e.kind)}`];return e.kind==="visible"&&e.rootMargin&&t.push(`rootMargin: ${JSON.stringify(e.rootMargin)}`),e.kind==="interaction"&&t.push(`events: ${JSON.stringify(e.events)}`),e.kind==="media"&&t.push(`query: ${JSON.stringify(e.query)}`),`{ ${t.join(", ")} }`}function Nn(e){let t=[];return e.quasi.quasis.forEach((n,r)=>{if(t.push({kind:"static",text:n.value.cooked??n.value.raw,start:n.start}),r<e.quasi.expressions.length){let s=e.quasi.expressions[r];t.push({kind:"hole",index:r,start:s.start,end:s.end})}}),t}function vn(e,t,n={}){let r=n.litTag??"html",s=n.format??"both",i=s!=="jsx",o=s!=="lit",a=i&&(e.includes(`${r}\``)||e.includes("svg`")),l=n.intrinsics!==!1&&et(e);if(!a&&!(o&&e.includes("<"))&&!l)return null;let c=(0,ot.parse)(e,{sourceType:"module",plugins:["jsx","typescript"],errorRecovery:!0}),p=[];he(c.program,(m,E,se)=>{(i&&gn(m,r)||o&&mn(m,E,se))&&p.push(m)});let u=n.propsDestructure?Ye(c.program,e,{runtimeModule:n.runtimeModule}):{edits:[],diagnostics:[],used:new Set},d=n.intrinsics===!1?{edits:[],diagnostics:[],imports:new Map}:st(c.program);if(p.length===0&&u.edits.length===0&&d.edits.length===0&&d.diagnostics.length===0&&u.diagnostics.length===0)return null;p.sort((m,E)=>E.start-m.start||m.end-E.end);let f=new Set(u.used),h={builtins:new Set,resolved:new Map,deferred:new Map,delegatedEvents:new Set},y=new Map,k=[...u.edits,...d.edits];for(let m of p){let E=p.some(R=>R!==m&&R.start<=m.start&&R.end>=m.end&&R.end-R.start>m.end-m.start);if(ye(m)){k.push({start:m.start,end:m.end,code:xn(e,m,k,E,f,h,y,n)});continue}let se=m.quasi.expressions.map(R=>hn(e,R,k)),X=Fe(Nn(m),se,{...n,hoistTemplates:!0,templateClone:n.templateClone??!0,partialTemplates:E?!1:n.partialTemplates??!0,svg:m.tag.name==="svg"});for(let R of X.imports)f.add(R);Ne(X.ir,h),k.push({start:m.start,end:m.end,code:ct(X.code,X.templates,y)})}let v=new at.default(e);for(let m of lt(k))m.start===m.end?v.appendLeft(m.start,m.code):v.overwrite(m.start,m.end,m.code);let H=fe(c.program),ve=Rn(f,h,y,H,n);ve&&v.prepend(ve);let xe=it(d,H);xe&&v.prepend(xe);for(let m of c.program.body)m.type==="ImportDeclaration"&&m.source?.value==="@fluixi/core/rx"&&v.overwrite(m.source.start,m.source.end,JSON.stringify("@fluixi/reactive"));return{code:v.toString(),map:v.generateMap({source:t,includeContent:!0,hires:!0}),...u.diagnostics.length?{propsDiagnostics:u.diagnostics}:{},...d.diagnostics.length?{intrinsicDiagnostics:d.diagnostics}:{}}}function xn(e,t,n,r,s,i,o,a){let l=Ue(t,{code:p=>re(e,p.start,p.end,n),used:s});C(l),q(l,{resolver:ee(a.resolve??[]),modules:{controlFlowModule:a.controlFlowModule??a.runtimeModule??"@fluixi/dom",coreModule:a.coreModule??"@fluixi/core",routerModule:a.routerModule??"@fluixi/core/router-next"},strategyFor:p=>p.load}),G(l);let c=$.emit(l,{templateClone:a.templateClone??!0,partialTemplates:r?!1:a.partialTemplates??!0});for(let p of c.imports)s.add(p);return Ne(l,i),ct(c.code,c.templates,o)}function Rn(e,t,n,r,s){let i=s.runtimeModule??"@fluixi/dom",o=s.coreModule??"@fluixi/core",a=new Map,l=(d,g)=>a.set(d,[...a.get(d)??[],g]),c=new Set(e);for(let d of t.builtins)c.add(d);t.delegatedEvents.size>0&&c.add("delegateEvents");for(let d of[...c].sort())r.has(d)||(fn.has(d)?l(s.reactiveModule??"@fluixi/reactive/signal",d):un.has(d)?l(s.routerModule??"@fluixi/core/router-next",d):dn.has(d)?l(o,d):pn.has(d)?l(s.controlFlowModule??i,d):l(i,d));for(let[d,g]of t.resolved)r.has(d)||l(g.module,g.export==="default"?`default as ${d}`:d===g.export?d:`${g.export} as ${d}`);let p=[];for(let[d,g]of a)p.push(`import { ${g.join(", ")} } from ${JSON.stringify(d)};`);let u=[...t.deferred].filter(([d])=>!r.has(d));if(u.length>0){r.has("deferred")||p.push(`import { deferred } from ${JSON.stringify(o)};`);for(let[d,g]of u)p.push(`const ${d} = deferred(() => import(${JSON.stringify(g.module)}), { strategy: ${yn(g.loading)}, export: ${JSON.stringify(g.export)} });`)}for(let[d,g]of n)p.push(`const ${g} = ${JSON.stringify(d.startsWith("svg:")?d.slice(4):d)};`);return t.delegatedEvents.size>0&&p.push(`delegateEvents(${JSON.stringify([...t.delegatedEvents])});`),p.length>0?p.join(`
4
+ `:""}var hn=new Set(j),yn=new Set(J),Nn=new Set(M),vn=new Set(["createMemo","createEffect","createRenderEffect","createRoot","createSignal","onCleanup","batch","untrack"]);function ae(e,t,n=null,r=""){if(!(!e||typeof e!="object")){if(Array.isArray(e)){for(let o of e)ae(o,t,n,r);return}typeof e.type=="string"&&t(e,n,r);for(let o of Object.keys(e))o==="loc"||o==="leadingComments"||o==="trailingComments"||ae(e[o],t,typeof e.type=="string"?e:n,o)}}var ve=e=>e.type==="JSXElement"||e.type==="JSXFragment";function xn(e,t,n){return ve(e)?!(t&&ve(t)&&n==="children"):!1}function Rn(e,t){return e.type==="TaggedTemplateExpression"&&e.tag?.type==="Identifier"&&(e.tag.name===t||e.tag.name==="svg")}function ft(e){return e.filter(t=>!e.some(n=>n!==t&&n.start<=t.start&&n.end>=t.end&&n.end-n.start>t.end-t.start))}function ie(e,t,n,r){let o=ft(r.filter(i=>i.start>=t&&i.end<=n)).sort((i,a)=>a.start-i.start),s=e.slice(t,n);for(let i of o)s=s.slice(0,i.start-t)+i.code+s.slice(i.end-t);return s}function kn(e,t,n){let r={code:ie(e,t.start,t.end,n),reactive:D(A(t))};return t.type==="ArrowFunctionExpression"&&t.body?.type!=="BlockStatement"&&(r.arrow={params:t.params.map(o=>ie(e,o.start,o.end,n)),body:ie(e,t.body.start,t.body.end,n),bodyReactive:D(A(t.body))}),t.type==="ObjectExpression"&&(r.object=!0),r}function mt(e,t,n){if(!t||t.length===0)return e;let r=new Map;for(let o of t){let s=`${o.svg?"svg:":""}${o.html}`,i=n.get(s);i||(i=`_fxTmpl$${n.size}`,n.set(s,i)),r.set(o.id,i)}return e.replace(/_tmpl\$\d+/g,o=>r.get(o)??o)}function xe(e,t){if(e.kind==="component"&&e.load&&!e.source&&L(e.load)&&(t.ignoredLoad.has(e.name)||t.ignoredLoad.set(e.name,e.load)),e.kind==="component"&&e.source){let n=e.source;n.origin==="builtin"?t.builtins.add(e.name):L(n.loading)&&!t.resolved.has(e.name)?t.deferred.set(e.name,n):(t.deferred.delete(e.name),t.resolved.set(e.name,n))}if("props"in e&&e.props)for(let n of e.props)n.kind==="event"&&n.event?.delegated&&t.delegatedEvents.add(n.event.name);if("children"in e&&e.children)for(let n of e.children)xe(n,t)}function bn(e,t){for(let n of e.body??[])if(n.type==="ImportDeclaration")for(let r of n.specifiers??[]){if(r.local?.name!==t)continue;if(r.type==="ImportNamespaceSpecifier")return;let o=r.type==="ImportDefaultSpecifier"?"default":r.imported?.name??r.imported?.value;return{module:n.source.value,export:o,declaration:n,specifier:r}}}function Sn(e,t){for(let n of e.body??[])if(n.type==="ImportDeclaration"){for(let r of n.specifiers??[])if(r.type==="ImportNamespaceSpecifier"&&r.local?.name===t)return!0}return!1}function In(e,t,n){let r=!1;return ae(e,o=>{r||o.type!=="Identifier"||o.name!==t||o.start===n.local?.start&&o.end===n.local?.end||(r=!0)}),r}function En(e){let t=[`kind: ${JSON.stringify(e.kind)}`];return e.kind==="visible"&&e.rootMargin&&t.push(`rootMargin: ${JSON.stringify(e.rootMargin)}`),e.kind==="interaction"&&t.push(`events: ${JSON.stringify(e.events)}`),e.kind==="media"&&t.push(`query: ${JSON.stringify(e.query)}`),`{ ${t.join(", ")} }`}function wn(e){let t=[];return e.quasi.quasis.forEach((n,r)=>{if(t.push({kind:"static",text:n.value.cooked??n.value.raw,start:n.start}),r<e.quasi.expressions.length){let o=e.quasi.expressions[r];t.push({kind:"hole",index:r,start:o.start,end:o.end})}}),t}function Cn(e,t,n={}){let r=n.litTag??"html",o=n.format??"both",s=o!=="jsx",i=o!=="lit",a=s&&(e.includes(`${r}\``)||e.includes("svg`")),l=n.intrinsics!==!1&&ot(e);if(!a&&!(i&&e.includes("<"))&&!l)return null;let c=(0,dt.parse)(e,{sourceType:"module",plugins:["jsx","typescript"],errorRecovery:!0}),p=[];ae(c.program,(d,x,N)=>{(s&&Rn(d,r)||i&&xn(d,x,N))&&p.push(d)});let f=n.propsDestructure===!1?{edits:[],diagnostics:[],used:new Set}:nt(c.program,e,{runtimeModule:n.runtimeModule}),u=n.intrinsics===!1?{edits:[],diagnostics:[],imports:new Map}:ct(c.program);if(p.length===0&&f.edits.length===0&&u.edits.length===0&&u.diagnostics.length===0&&f.diagnostics.length===0)return null;p.sort((d,x)=>x.start-d.start||d.end-x.end);let m=new Set(f.used),h={builtins:new Set,resolved:new Map,deferred:new Map,delegatedEvents:new Set,ignoredLoad:new Map,unresolved:new Set,declared:at(c.program)},v=new Map,S=[...f.edits,...u.edits];for(let d of p){let x=p.some(k=>k!==d&&k.start<=d.start&&k.end>=d.end&&k.end-k.start>d.end-d.start);if(ve(d)){S.push({start:d.start,end:d.end,code:$n(e,d,S,x,m,h,v,n)});continue}let N=d.quasi.expressions.map(k=>kn(e,k,S)),I=Ue(wn(d),N,{...n,hoistTemplates:!0,templateClone:n.templateClone??!0,partialTemplates:x?!1:n.partialTemplates??!0,svg:d.tag.name==="svg"});for(let k of I.imports)m.add(k);xe(I.ir,h),S.push({start:d.start,end:d.end,code:mt(I.code,I.templates,v)})}let R=new ut.default(e);for(let d of ft(S))d.start===d.end?R.appendLeft(d.start,d.code):R.overwrite(d.start,d.end,d.code);let C=he(c.program),W=new Map;for(let[d]of h.ignoredLoad)C.has(d)||W.set(d,"unsupplied");for(let[d,x]of[...h.ignoredLoad]){if(!C.has(d))continue;let N=bn(c.program,d);if(!N){W.set(d,Sn(c.program,d)?"namespace":"local");continue}if(In(c.program,d,N.specifier)){W.set(d,"value");continue}let I=N.declaration.specifiers.filter(q=>q!==N.specifier),k=I.length===0&&e[N.declaration.end]===`
5
+ `?N.declaration.end+1:N.declaration.end;R.overwrite(N.declaration.start,k,I.length===0?"":`import { ${I.map(q=>e.slice(q.start,q.end)).join(", ")} } from ${JSON.stringify(N.declaration.source.value)};`),h.deferred.set(d,{module:N.module,export:N.export,origin:"rule",loading:x}),C.delete(d),h.ignoredLoad.delete(d)}let Re=Tn(m,h,v,C,n);Re&&R.prepend(Re);let ke=pt(u,C);ke&&R.prepend(ke);for(let d of c.program.body)d.type==="ImportDeclaration"&&d.source?.value==="@fluixi/core/rx"&&R.overwrite(d.source.start,d.source.end,JSON.stringify("@fluixi/reactive"));let gt={value:d=>`${d} is used as a value here, not only as a tag, so its import has to stay — deferring would hand those references a lazy wrapper instead of the component. Defer it at the point it is rendered, or keep it eager.`,namespace:d=>`${d} came in through a namespace import, which has no single export to defer. Import ${d} by name.`,local:d=>`${d} is declared in this file, so there is no module to load separately. Move it to its own file and import it.`,unsupplied:d=>`nothing supplies ${d}, so there is no import to defer. Import it, or add a \`resolve\` rule for it.`},be=[...h.ignoredLoad].map(([d,x])=>({name:d,strategy:x,message:`load:${x.kind} has no effect on <${d}>: ${gt[W.get(d)??"unsupplied"](d)}`})),Se=[...h.unresolved].map(d=>({name:d,message:`<${d}> is not defined: nothing imports it and no \`resolve\` rule supplies it. This compiles to a reference to a name that does not exist, so the component renders nothing. Import ${d}, or add a \`resolve\` rule for it.`}));return{code:R.toString(),map:R.generateMap({source:t,includeContent:!0,hires:!0}),...be.length?{loadDiagnostics:be}:{},...Se.length?{unresolvedDiagnostics:Se}:{},...f.diagnostics.length?{propsDiagnostics:f.diagnostics}:{},...u.diagnostics.length?{intrinsicDiagnostics:u.diagnostics}:{}}}function $n(e,t,n,r,o,s,i,a){let l=Ge(t,{code:f=>ie(e,f.start,f.end,n),used:o});P(l);let c=Y(l,{resolver:oe(a.resolve??[]),isBound:f=>s.declared.has(f),modules:{controlFlowModule:a.controlFlowModule??a.runtimeModule??"@fluixi/dom",coreModule:a.coreModule??"@fluixi/core",routerModule:a.routerModule??"@fluixi/core/router-next"},strategyFor:f=>f.load});for(let f of c.unresolved)s.unresolved.add(f);ee(l);let p=O.emit(l,{templateClone:a.templateClone??!0,partialTemplates:r?!1:a.partialTemplates??!0});for(let f of p.imports)o.add(f);return xe(l,s),mt(p.code,p.templates,i)}function Tn(e,t,n,r,o){let s=o.runtimeModule??"@fluixi/dom",i=o.coreModule??"@fluixi/core",a=new Map,l=(u,g)=>a.set(u,[...a.get(u)??[],g]),c=new Set(e);for(let u of t.builtins)c.add(u);t.delegatedEvents.size>0&&c.add("delegateEvents");for(let u of[...c].sort())r.has(u)||(vn.has(u)?l(o.reactiveModule??"@fluixi/reactive/signal",u):Nn.has(u)?l(o.routerModule??"@fluixi/core/router-next",u):yn.has(u)?l(i,u):hn.has(u)?l(o.controlFlowModule??s,u):l(s,u));for(let[u,g]of t.resolved)r.has(u)||l(g.module,g.export==="default"?`default as ${u}`:u===g.export?u:`${g.export} as ${u}`);let p=[];for(let[u,g]of a)p.push(`import { ${g.join(", ")} } from ${JSON.stringify(u)};`);let f=[...t.deferred].filter(([u])=>!r.has(u));if(f.length>0){r.has("deferred")||p.push(`import { deferred } from ${JSON.stringify(i)};`);for(let[u,g]of f)p.push(`const ${u} = deferred(() => import(${JSON.stringify(g.module)}), { strategy: ${En(g.loading)}, export: ${JSON.stringify(g.export)} });`)}for(let[u,g]of n)p.push(`const ${g} = ${JSON.stringify(u.startsWith("svg:")?u.slice(4):u)};`);return t.delegatedEvents.size>0&&p.push(`delegateEvents(${JSON.stringify([...t.delegatedEvents])});`),p.length>0?p.join(`
5
6
  `)+`
6
7
  `:null}
@@ -1,5 +1,6 @@
1
1
  import MagicString from 'magic-string';
2
2
  import { type CompileTemplateOptions } from '../lower/compile-template.js';
3
+ import type { IRLoadStrategy } from '../ir/nodes.js';
3
4
  import { type PropsDiagnostic } from './props.js';
4
5
  import { type IntrinsicDiagnostic } from './intrinsics.js';
5
6
  export interface TransformOptions extends CompileTemplateOptions {
@@ -20,7 +21,7 @@ export interface TransformOptions extends CompileTemplateOptions {
20
21
  * `function Card({ title })` keeps updating instead of reading `title` once.
21
22
  * The edits go into the same string as the template edits, so the map still points
22
23
  * at what the author wrote.
23
- * @default false
24
+ * @default true
24
25
  */
25
26
  propsDestructure?: boolean;
26
27
  /**
@@ -30,6 +31,17 @@ export interface TransformOptions extends CompileTemplateOptions {
30
31
  */
31
32
  intrinsics?: boolean;
32
33
  }
34
+ export interface UnresolvedDiagnostic {
35
+ /** The tag nothing supplies. */
36
+ name: string;
37
+ message: string;
38
+ }
39
+ export interface LoadDiagnostic {
40
+ /** The component the directive was written on. */
41
+ name: string;
42
+ strategy: IRLoadStrategy;
43
+ message: string;
44
+ }
33
45
  export interface TransformResult {
34
46
  code: string;
35
47
  map: ReturnType<MagicString['generateMap']>;
@@ -37,6 +49,10 @@ export interface TransformResult {
37
49
  propsDiagnostics?: PropsDiagnostic[];
38
50
  /** `$` names the module bound itself, so the intrinsic did not fire. */
39
51
  intrinsicDiagnostics?: IntrinsicDiagnostic[];
52
+ /** `load:` directives that could not take effect, and why. */
53
+ loadDiagnostics?: LoadDiagnostic[];
54
+ /** Capitalised tags nothing supplies — they compile to an undefined reference. */
55
+ unresolvedDiagnostics?: UnresolvedDiagnostic[];
40
56
  }
41
57
  /**
42
58
  * Compile every template in `code`. Returns null when the module has none, so a
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/transform/templates.ts"],"names":[],"mappings":"AASA,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAiB,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAc1F,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAA2C,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAkBpG,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB;IAC9D;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5C,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAC9C;AAkLD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,gBAAqB,GAC7B,eAAe,GAAG,IAAI,CA4GxB"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/transform/templates.ts"],"names":[],"mappings":"AASA,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAiB,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAG1F,OAAO,KAAK,EAAqB,cAAc,EAAU,MAAM,gBAAgB,CAAC;AAWhF,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAA2C,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAmBpG,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB;IAC9D;;;;OAIG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5C,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7C,8DAA8D;IAC9D,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,kFAAkF;IAClF,qBAAqB,CAAC,EAAE,oBAAoB,EAAE,CAAC;CAChD;AAwQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,gBAAqB,GAC7B,eAAe,GAAG,IAAI,CA+LxB"}
@@ -22,6 +22,7 @@ import { moduleBindings } from './bindings.js';
22
22
  import { collectPropsEdits } from './props.js';
23
23
  import { collectIntrinsicEdits, intrinsicImports } from './intrinsics.js';
24
24
  import { mayHaveIntrinsic } from '../analyze/intrinsics.js';
25
+ import { declaredNames } from '../analyze/reactive-bindings.js';
25
26
  import { DOM_CONTROL_FLOW, CORE_CONTROL_FLOW, ROUTER_COMPONENTS } from '../resolve/builtins.js';
26
27
  // Which builtin comes from which module is published by resolve/builtins.ts —
27
28
  // the same lists the resolve pass and the TS plugin read. Restating them here is
@@ -137,6 +138,11 @@ function adoptTemplates(code, templates, hoisted) {
137
138
  return code.replace(/_tmpl\$\d+/g, (id) => rename.get(id) ?? id);
138
139
  }
139
140
  function collectNeeds(node, out) {
141
+ if (node.kind === 'component' && node.load && !node.source && isDeferred(node.load)) {
142
+ // One report per name, not one per usage.
143
+ if (!out.ignoredLoad.has(node.name))
144
+ out.ignoredLoad.set(node.name, node.load);
145
+ }
140
146
  if (node.kind === 'component' && node.source) {
141
147
  const src = node.source;
142
148
  if (src.origin === 'builtin')
@@ -158,6 +164,63 @@ function collectNeeds(node, out) {
158
164
  for (const c of node.children)
159
165
  collectNeeds(c, out);
160
166
  }
167
+ /**
168
+ * An import this file wrote that we can turn into a deferred binding instead.
169
+ *
170
+ * `load:` on a component the author imported did nothing, because deferring means
171
+ * *creating* the reference as a dynamic import and there was already a static one. Here we
172
+ * take the static one away: remove the specifier, emit the `deferred()` binding, and the
173
+ * chunk splits like any other.
174
+ *
175
+ * Only when the name is used **exclusively as a tag**. JSX element names are
176
+ * `JSXIdentifier`, so a component used only in markup has zero `Identifier` references —
177
+ * which makes the check exact rather than a guess. Anything else (passed to a function,
178
+ * re-exported, `Chart.displayName`) keeps its import and its warning: replacing the real
179
+ * binding with a lazy wrapper would change what those sites see.
180
+ */
181
+ function deferrableImport(program, name) {
182
+ for (const statement of program.body ?? []) {
183
+ if (statement.type !== 'ImportDeclaration')
184
+ continue;
185
+ for (const specifier of statement.specifiers ?? []) {
186
+ if (specifier.local?.name !== name)
187
+ continue;
188
+ // A namespace import is the whole module; there is no single export to defer.
189
+ if (specifier.type === 'ImportNamespaceSpecifier')
190
+ return undefined;
191
+ const exported = specifier.type === 'ImportDefaultSpecifier'
192
+ ? 'default'
193
+ : (specifier.imported?.name ?? specifier.imported?.value);
194
+ return { module: statement.source.value, export: exported, declaration: statement, specifier };
195
+ }
196
+ }
197
+ return undefined;
198
+ }
199
+ /** Whether `name` came in through `import * as name`, which has no single export. */
200
+ function hasNamespaceImport(program, name) {
201
+ for (const statement of program.body ?? []) {
202
+ if (statement.type !== 'ImportDeclaration')
203
+ continue;
204
+ for (const specifier of statement.specifiers ?? []) {
205
+ if (specifier.type === 'ImportNamespaceSpecifier' && specifier.local?.name === name)
206
+ return true;
207
+ }
208
+ }
209
+ return false;
210
+ }
211
+ /** Whether `name` is referenced as a value anywhere — a tag alone does not count. */
212
+ function usedAsValue(program, name, specifier) {
213
+ let seen = false;
214
+ walk(program, (node) => {
215
+ if (seen || node.type !== 'Identifier' || node.name !== name)
216
+ return;
217
+ // The import specifier's own local binding is the declaration, not a use.
218
+ if (node.start === specifier.local?.start && node.end === specifier.local?.end)
219
+ return;
220
+ seen = true;
221
+ });
222
+ return seen;
223
+ }
161
224
  /** The strategy object a `deferred()` binding is given. */
162
225
  function strategyLiteral(s) {
163
226
  const parts = [`kind: ${JSON.stringify(s.kind)}`];
@@ -210,9 +273,9 @@ export function transformTemplates(code, id, options = {}) {
210
273
  });
211
274
  // Props first: holes are sliced out of the function body, so the rewrite has to be
212
275
  // in the edit list before any template is compiled.
213
- const props = options.propsDestructure
214
- ? collectPropsEdits(ast.program, code, { runtimeModule: options.runtimeModule })
215
- : { edits: [], diagnostics: [], used: new Set() };
276
+ const props = options.propsDestructure === false
277
+ ? { edits: [], diagnostics: [], used: new Set() }
278
+ : collectPropsEdits(ast.program, code, { runtimeModule: options.runtimeModule });
216
279
  // `$signal(…)` → `createSignal(…)`. Same edit list, so the callee is already rewritten
217
280
  // by the time a template slices a hole containing one.
218
281
  const intrinsics = options.intrinsics === false
@@ -235,6 +298,8 @@ export function transformTemplates(code, id, options = {}) {
235
298
  const used = new Set(props.used);
236
299
  const needs = {
237
300
  builtins: new Set(), resolved: new Map(), deferred: new Map(), delegatedEvents: new Set(),
301
+ ignoredLoad: new Map(), unresolved: new Set(),
302
+ declared: declaredNames(ast.program),
238
303
  };
239
304
  const hoisted = new Map();
240
305
  const edits = [...props.edits, ...intrinsics.edits];
@@ -271,6 +336,42 @@ export function transformTemplates(code, id, options = {}) {
271
336
  out.overwrite(e.start, e.end, e.code);
272
337
  }
273
338
  const bound = moduleBindings(ast.program);
339
+ // A `load:` on an import the author wrote: take the import away and let the prologue
340
+ // emit the deferred binding, so this spelling and a `resolve` rule produce the same
341
+ // output rather than merely equivalent output.
342
+ const why = new Map();
343
+ for (const [name] of needs.ignoredLoad) {
344
+ if (!bound.has(name))
345
+ why.set(name, 'unsupplied');
346
+ }
347
+ for (const [name, strategy] of [...needs.ignoredLoad]) {
348
+ if (!bound.has(name))
349
+ continue;
350
+ const found = deferrableImport(ast.program, name);
351
+ if (!found) {
352
+ // Bound, but not by an import we can turn into a dynamic one.
353
+ why.set(name, hasNamespaceImport(ast.program, name) ? 'namespace' : 'local');
354
+ continue;
355
+ }
356
+ if (usedAsValue(ast.program, name, found.specifier)) {
357
+ why.set(name, 'value');
358
+ continue;
359
+ }
360
+ const rest = found.declaration.specifiers.filter((sp) => sp !== found.specifier);
361
+ // Take the line's newline with it when the whole statement goes, or the output keeps
362
+ // a blank line exactly where the import used to be.
363
+ const end = rest.length === 0 && code[found.declaration.end] === '\n'
364
+ ? found.declaration.end + 1
365
+ : found.declaration.end;
366
+ out.overwrite(found.declaration.start, end, rest.length === 0
367
+ ? ''
368
+ : `import { ${rest.map((sp) => code.slice(sp.start, sp.end)).join(', ')} } from ` +
369
+ `${JSON.stringify(found.declaration.source.value)};`);
370
+ needs.deferred.set(name, { module: found.module, export: found.export, origin: 'rule', loading: strategy });
371
+ // The prologue skips names the file binds, and this one no longer does.
372
+ bound.delete(name);
373
+ needs.ignoredLoad.delete(name);
374
+ }
274
375
  const prologue = buildPrologue(used, needs, hoisted, bound, options);
275
376
  if (prologue)
276
377
  out.prepend(prologue);
@@ -283,9 +384,36 @@ export function transformTemplates(code, id, options = {}) {
283
384
  out.overwrite(node.source.start, node.source.end, JSON.stringify('@fluixi/reactive'));
284
385
  }
285
386
  }
387
+ // Each of these has a different fix, so the message has to name the actual reason.
388
+ // Saying "drop the import" to someone whose component is used as a value sends them
389
+ // somewhere that does not work.
390
+ const reasons = {
391
+ value: (name) => `${name} is used as a value here, not only as a tag, so its import has to stay — ` +
392
+ `deferring would hand those references a lazy wrapper instead of the component. ` +
393
+ `Defer it at the point it is rendered, or keep it eager.`,
394
+ namespace: (name) => `${name} came in through a namespace import, which has no single export to defer. ` +
395
+ `Import ${name} by name.`,
396
+ local: (name) => `${name} is declared in this file, so there is no module to load separately. ` +
397
+ `Move it to its own file and import it.`,
398
+ unsupplied: (name) => `nothing supplies ${name}, so there is no import to defer. Import it, or add a ` +
399
+ `\`resolve\` rule for it.`,
400
+ };
401
+ const loadDiagnostics = [...needs.ignoredLoad].map(([name, strategy]) => ({
402
+ name,
403
+ strategy,
404
+ message: `load:${strategy.kind} has no effect on <${name}>: ${reasons[why.get(name) ?? 'unsupplied'](name)}`,
405
+ }));
406
+ const unresolvedDiagnostics = [...needs.unresolved].map((name) => ({
407
+ name,
408
+ message: `<${name}> is not defined: nothing imports it and no \`resolve\` rule supplies it. ` +
409
+ `This compiles to a reference to a name that does not exist, so the component renders ` +
410
+ `nothing. Import ${name}, or add a \`resolve\` rule for it.`,
411
+ }));
286
412
  return {
287
413
  code: out.toString(),
288
414
  map: out.generateMap({ source: id, includeContent: true, hires: true }),
415
+ ...(loadDiagnostics.length ? { loadDiagnostics } : {}),
416
+ ...(unresolvedDiagnostics.length ? { unresolvedDiagnostics } : {}),
289
417
  ...(props.diagnostics.length ? { propsDiagnostics: props.diagnostics } : {}),
290
418
  ...(intrinsics.diagnostics.length ? { intrinsicDiagnostics: intrinsics.diagnostics } : {}),
291
419
  };
@@ -301,8 +429,11 @@ function compileJsx(code, node, edits, nested, used, needs, hoisted, options) {
301
429
  used,
302
430
  });
303
431
  analyzeStatic(ir);
304
- resolveComponentSources(ir, {
432
+ const report = resolveComponentSources(ir, {
305
433
  resolver: createComponentResolver(options.resolve ?? []),
434
+ // Without this the pass calls every author-imported component unresolved, and the
435
+ // report is unusable for diagnostics.
436
+ isBound: (name) => needs.declared.has(name),
306
437
  modules: {
307
438
  controlFlowModule: options.controlFlowModule ?? options.runtimeModule ?? '@fluixi/dom',
308
439
  coreModule: options.coreModule ?? '@fluixi/core',
@@ -310,6 +441,8 @@ function compileJsx(code, node, edits, nested, used, needs, hoisted, options) {
310
441
  },
311
442
  strategyFor: (n) => n.load,
312
443
  });
444
+ for (const name of report.unresolved)
445
+ needs.unresolved.add(name);
313
446
  collapseStrategies(ir);
314
447
  const emitted = imperativeBackend.emit(ir, {
315
448
  templateClone: options.templateClone ?? true,