@estjs/template 0.0.14-beta.4 → 0.0.14-beta.6
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.
- package/dist/template.cjs.js +14 -14
- package/dist/template.cjs.js.map +1 -1
- package/dist/template.dev.cjs.js +12 -5
- package/dist/template.dev.esm.js +13 -6
- package/dist/template.esm.js +4 -4
- package/dist/template.esm.js.map +1 -1
- package/package.json +3 -3
package/dist/template.cjs.js
CHANGED
|
@@ -4,24 +4,24 @@ var shared = require('@estjs/shared');
|
|
|
4
4
|
var signal = require('@estjs/signal');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* @estjs/template v0.0.14-beta.
|
|
7
|
+
* @estjs/template v0.0.14-beta.6
|
|
8
8
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
9
9
|
* @license MIT
|
|
10
10
|
**/
|
|
11
|
-
var D="on",G="update",T="children",w="",R="0",B="1";var H=" __PLACEHOLDER__ ";var X=class{constructor(){this.renderMode=0;}get isSSG(){return this.renderMode===1}get isSSR(){return this.renderMode===2}get isClient(){return this.renderMode===0}setSSR(){this.renderMode=2;}setSSG(){this.renderMode=1;}setClient(){this.renderMode=0;}},m=new X,z=new Map;function q(o,t){z.set(o,{index:t});}function W(o){var t;return (t=z.get(o))==null?void 0:t.index}var E=class E{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(t,e){var n;(n=this.hooks[t])==null||n.add(e);}getContext(t){return E.context[t]}setContext(t,e){E.context[t]=e;}initRef(){E.ref=this;}removeRef(){E.ref=null;}clearHooks(){Object.values(this.hooks).forEach(t=>t.clear());}};E.ref=null,E.context={};var u=E;function A(o){return o instanceof C}var b=1,C=class extends u{constructor(e,n={},r){super();this.template=e;this.props=n;this.key=r;q(e,b),this.templates=this.processTemplate();}processTemplate(){if(shared.isArray(this.template)){let e=this.template.join(H);return this.processHtmlString(e).split(H)}return []}processHtmlString(e){return e.replaceAll(/(<[^>]+>)|([^<]+)/g,(n,r,i)=>r?r.includes("data-ci")?n:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,a,l)=>`<${a} data-ci="${b}"${l||""}>`):i&&i.replace(H,"").trim()?`<!--0-${b}-->${i}<!$>`:n)}mount(){this.initRef();let e=this.render();return this.removeRef(),e}render(){if(shared.isFunction(this.template)){let e=this.template(this.props);return A(e)?e.mount():String(e)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([e,n])=>{let r=n.children;this.normalizeProps(n);let i=this.templates.findIndex(s=>s.includes(`data-hk="${e}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${e}"`,`data-hk="${e}" ${this.generateAttributes(n)}`);}),this.templates.join("")}normalizeProps(e){Object.entries(e).forEach(([n,r])=>{n==="children"||shared.isFunction(r)?delete e[n]:signal.isSignal(r)&&(e[n]=r.value);});}generateAttributes(e){return Object.entries(e).filter(([n,r])=>n!=="children"&&!shared.isFunction(r)).map(([n,r])=>`${n}="${shared.escape(String(r))}"`).join(" ")}renderChildren(e,n){e.forEach(([r])=>{b++;let i=this.renderChild(r);this.templates[n]+=i;});}renderChild(e){if(shared.isFunction(e))return this.renderChild(e(this.props));if(signal.isSignal(e))return `<!--1-${b}-->${e.value}<!$>`;if(A(e)){let n=e.mount();return shared.isFunction(n)?n(this.props):O(n)}else return `<!--1-${b}-->${e}<!$>`}};var ee="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(","),Ne="a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp".split(",");function F(o){if(f(o)||o instanceof Node||A(o))return o;let t=shared.isFalsy(o)?"":String(o);return document.createTextNode(t)}function g(o,t,e=null){let n=f(e)?e.firstChild:e,r=m.isSSR;f(t)?t.mount(o,n):n&&!r?n.before(t):r||o.append(t);}function v(o){f(o)?o.unmount():o.parentNode&&o.remove();}function J(o,t,e){g(o,t,e),v(e);}function V(o,t,e){t==="class"?ge(o,e):t==="style"?Ee(o,e):Te(o,t,e);}function ge(o,t){typeof t=="string"?o.className=t:shared.isArray(t)?o.className=t.join(" "):t&&typeof t=="object"&&(o.className=Object.entries(t).reduce((e,[n,r])=>e+(r?` ${n}`:""),"").trim());}function Ee(o,t){typeof t=="string"?o.style.cssText=t:t&&typeof t=="object"&&Object.entries(t).forEach(([n,r])=>{o.style.setProperty(shared.kebabCase(n),String(r));});}function Te(o,t,e){shared.isFalsy(e)?o.removeAttribute(t):e===!0?o.setAttribute(t,""):o instanceof HTMLInputElement&&t==="value"?o.value=String(e):o.setAttribute(t,String(e));}function te(o,t){if(o instanceof HTMLInputElement)switch(o.type){case"checkbox":return h(o,"change",()=>{t(!!o.checked);});case"date":return h(o,"change",()=>{t(o.value?o.value:"");});case"file":return h(o,"change",()=>{o.files&&t(o.files);});case"number":return h(o,"input",()=>{let e=Number.parseFloat(o.value);t(Number.isNaN(e)?"":String(e));});case"radio":return h(o,"change",()=>{t(o.checked?o.value:"");});case"text":return h(o,"input",()=>{t(o.value);})}if(o instanceof HTMLSelectElement)return h(o,"change",()=>{t(o.value);});if(o instanceof HTMLTextAreaElement)return h(o,"input",()=>{t(o.value);})}Promise.resolve();function h(o,t,e){return o.addEventListener(t,e),()=>o.removeEventListener(t,e)}function ne(o){let t=[],e=[],n=/<\/?([\da-z-]+)([^>]*)>/gi,r=0;for(;;){let i=n.exec(o);if(!i)break;let[s,a]=i,l=s[1]==="/";if(e.push(o.slice(r,i.index)),r=i.index+s.length,l){for(;t.length>0&&t[t.length-1]!==a;){let c=t.pop();c&&e.push(`</${c}>`);}t.length>0&&t.pop();}else ee.includes(a)||t.push(a);e.push(s);}for(e.push(o.slice(r));t.length>0;){let i=t.pop();i&&e.push(`</${i}>`);}return e.join("")}function oe(o){return Ne.includes(o)}function re(o){return ee.includes(o)?`<${o}/>`:`<${o}></${o}>`}function O(o){return signal.isSignal(o)?o.value:o}var M=class extends u{constructor(e,n,r){super();this.template=e;this.props=n;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=n==null?void 0:n.key),this.proxyProps=this.createProxyProps(n);}createProxyProps(e){return e?signal.shallowReactive(e,n=>shared.startsWith(n,D)||shared.startsWith(n,G)||n===T):{}}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}mount(e,n){var i,s,a,l;if(!shared.isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(i=this.rootNode)==null?void 0:i.mount(e,n))!=null?s:[];this.initRef(),this.rootNode=this.template(this.proxyProps);let r=(l=(a=this.rootNode)==null?void 0:a.mount(e,n))!=null?l:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var e;this.callDestroyHooks(),this.clearHooks(),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(e=>e());}callDestroyHooks(){this.hooks.destroy.forEach(e=>e());}clearEmitter(){for(let e of this.emitter)e();this.emitter.clear();}inheritNode(e){Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap,this.hooks=e.hooks;let n=this.props;this.props=e.props,this.patchProps(n);}getNodeTrack(e){let n=this.trackMap.get(e);return n||(n={cleanup:()=>{}},this.trackMap.set(e,n)),n.cleanup(),n}patchProps(e){var n;if(e){for(let[r,i]of Object.entries(e))shared.startsWith(r,D)&&((n=this.rootNode)!=null&&n.firstChild)?this.patchEventListener(r,i):r==="ref"?this.patchRef(i):shared.startsWith(r,G)?this.patchUpdateHandler(r,i):r!==T&&this.patchNormalProp(r,i);this.props=e;}}patchEventListener(e,n){let r=e.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,n);this.emitter.add(i);}patchRef(e){var n,r;e.value=(r=(n=this.rootNode)==null?void 0:n.firstChild)!=null?r:null;}patchUpdateHandler(e,n){this.props[e]=O(n);}patchNormalProp(e,n){let r=this.getNodeTrack(e);r.cleanup=signal.useEffect(()=>{this.proxyProps[e]=shared.isFunction(n)?n():n;});}};function se(o,t,e,n){let r=new Map,i=Array.from(t.values());if(i.length&&e.length===0)return ye(o,i,n),r;let s=[],a=be(e),l=0;for(let[c,p]of e.entries()){let d=i[l],x=S(d,c);for(;d&&!a.has(x);)v(d),t.delete(x),d=i[++l],x=S(d,c);let U=S(p,c),K=t.get(U);if(K&&(p=xe(o,K,p)),d)if(d===K)l++;else {let Y=document.createComment("");g(o,Y,d),s.push([Y,p]);}else g(o,p,n);r.set(U,p);}return s.forEach(([c,p])=>{J(o,p,c);}),t.forEach((c,p)=>{c.isConnected&&!r.has(p)&&v(c);}),r}function ye(o,t,e){if(o.childNodes.length===t.length+(e?1:0))o.innerHTML="",e&&g(o,e);else {let n=document.createRange(),r=t[0],i=f(r)?r.firstChild:r;n.setStartBefore(i),e?n.setEndBefore(e):n.setEndAfter(o),n.deleteContents();}t.forEach(n=>{f(n)&&n.unmount();});}function xe(o,t,e){return t===e?t:f(t)&&f(e)&&t.template===e.template?(e.inheritNode(t),e):t instanceof Text&&e instanceof Text?(t.textContent!==e.textContent&&(t.textContent=e.textContent),t):(J(o,e,t),e)}function be(o){let t=new Map;for(let[e,n]of o.entries()){let r=S(n,e);t.set(r,n);}return t}function S(o,t){if(f(o)){let e=o.key;if(e!=null)return String(e)}return `_$${t}$`}var y=class{constructor(t,e,n){this.template=t;this.props=e;this.key=n;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;this.key||(this.key=e==null?void 0:e.key),m.isSSR&&(this.componentIndex=W(this.template));}get firstChild(){var t;return (t=this.nodes[0])!=null?t:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(t,e){var i;if(this.parent=t,this.isConnected)return this.nodes.forEach(s=>g(t,s,e)),this.nodes;shared.isArray(this.template)&&(this.template=P(this.template.join("")));let n=this.template.content.cloneNode(!0),r=n.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r==null||r.childNodes.forEach(s=>{n.append(s);})),this.nodes=Array.from(n.childNodes),m.isSSR?this.mapSSGNodeTree(t):this.mapNodeTree(t,n),g(t,n,e),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){var t,e;if(this.trackMap.forEach(n=>{var r;(r=n.cleanup)==null||r.call(n);}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(n=>v(n)),!this.template.innerHTML&&!this.nodes.length){let n=(e=(t=this.props)==null?void 0:t[R])==null?void 0:e.children;n&&(shared.isArray(n)?n.forEach(r=>{this.deleteFragmentTextNode(r);}):this.deleteFragmentTextNode(n));}this.nodes=[],this.mounted=!1;}deleteFragmentTextNode(t){var e;shared.isPrimitive(t)?(e=this.parent)==null||e.childNodes.forEach(n=>{var r;n.nodeType===Node.TEXT_NODE&&n.textContent===`${t}`&&((r=this.parent)==null||r.removeChild(n));}):v(t);}inheritNode(t){this.mounted=t.mounted,this.nodes=t.nodes,this.trackMap=t.trackMap,this.treeMap=t.treeMap;let e=this.props;this.props=t.props,this.patchProps(e);}mapSSGNodeTree(t){this.treeMap.set(0,t),this.walkNodeTree(t,this.handleSSGNode.bind(this));}mapNodeTree(t,e){let n=1;this.treeMap.set(0,t);let r=[t],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(n++,s),r.push(s));};this.walkNodeTree(e,i);}walkNodeTree(t,e){t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&e(t);let n=t.firstChild;for(;n;)this.walkNodeTree(n,e),n=n.nextSibling;}handleSSGNode(t){var e;if(t.nodeType===Node.COMMENT_NODE){let[n,r]=((e=t.textContent)==null?void 0:e.split("-"))||[];if(0===+n&&+r===this.componentIndex){let i=t.nextSibling;this.treeMap.set(+r,i);}}else if(t.nodeType!==Node.TEXT_NODE){let{ci:n="-1",hk:r}=(t==null?void 0:t.dataset)||{};r&&+n===this.componentIndex&&this.treeMap.set(+r,t);}}patchProps(t){t&&(Object.entries(t).forEach(([e,n])=>{let r=Number(e),i=this.treeMap.get(r);i&&this.patchProp(e,i,n,r===0);}),this.props=t);}patchProp(t,e,n,r){n&&Object.entries(n).forEach(([i,s])=>{if(i===T&&s)this.patchChildren(t,e,s,r);else if(i==="ref")n[i].value=e;else if(shared.startsWith(i,"on"))this.patchEventListener(t,e,i,s);else {if(this.bindValueKeys.includes(i))return;let a=this.getBindUpdateValue(n,t,i);this.patchAttribute(t,e,i,s,a);}});}getBindUpdateValue(t,e,n){let i=`update${shared.capitalize(n)}`;if(i&&t[i]&&shared.isFunction(t[i]))return this.bindValueKeys.push(i),t[i]}patchChildren(t,e,n,r){if(shared.isArray(n))n.filter(Boolean).forEach((i,s)=>{var x;let[a,l]=shared.isArray(i)?i:[i,null],c=shared.isNil(l)?null:(x=this.treeMap.get(l))!=null?x:null,p=`${t}:${T}:${s}`,d=this.getNodeTrack(p,!0,r);this.patchChild(d,e,a,c);});else {let i=`${t}:${T}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,e,n,null);}}patchEventListener(t,e,n,r){let i=n.slice(2).toLowerCase(),s=this.getNodeTrack(`${t}:${n}`);s.cleanup=h(e,i,r);}patchAttribute(t,e,n,r,i){let s=this.getNodeTrack(`${t}:${n}`),a=shared.isFunction(r)?r():r,l=signal.isSignal(a)?a:signal.shallowSignal(a);V(e,n,l.value);let c=signal.useEffect(()=>{let d=shared.isFunction(r)?r():r;JSON.stringify(l.value)!==JSON.stringify(d)&&(l.value=signal.isSignal(d)?d.value:d,V(e,n,l.value));}),p;i&&shared.isHTMLElement(e)&&(p=te(e,d=>{i(d);})),s.cleanup=()=>{c&&c(),p&&p();};}getNodeTrack(t,e,n){var i;let r=this.trackMap.get(t);return r||(r={cleanup:()=>{}},e&&(r.lastNodes=new Map),n&&(r.isRoot=!0),this.trackMap.set(t,r)),(i=r.cleanup)==null||i.call(r),r}patchChild(t,e,n,r){shared.isFunction(n)?t.cleanup=signal.useEffect(()=>{let i=shared.coerceArray(n()).map(F);m.isSSR?t.lastNodes=this.reconcileChildren(e,i,r):t.lastNodes=se(e,t.lastNodes,i,r);}):shared.coerceArray(n).forEach((i,s)=>{let a=F(i),l=S(a,s);m.isSSR?t.lastNodes=this.reconcileChildren(e,[a],r):(t.lastNodes.set(l,a),g(e,a,r));});}reconcileChildren(t,e,n){let r=new Map,i=Array.from(t.childNodes).filter(s=>{var a,l;return s.nodeType===Node.TEXT_NODE&&((a=s.previousSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&((l=s.nextSibling)==null?void 0:l.nodeType)===Node.COMMENT_NODE});return e.forEach((s,a)=>{let l=S(s,a);s.nodeType===Node.TEXT_NODE?i.forEach(c=>{s.textContent===c.textContent&&t.replaceChild(s,c);}):g(t,s,n),r.set(l,s);}),r}};function L(o,t,e){if(shared.isString(o)){if(oe(o)){let n=re(o);return t={[B]:t},new y(P(n),t,e)}else if(o===w)return t={[R]:t},new y(P(w),t,e)}return shared.isFunction(o)?new M(o,t,e):new y(o,t,e)}function Oe(o){return o instanceof M}function f(o){return o instanceof M||o instanceof y}function P(o){let t=document.createElement("template");return t.innerHTML=ne(o),t}function _e(o){return L(w,{children:shared.isArray(o.children)?o.children.filter(Boolean):[o.children]})}function Ie(o){u.ref&&u.ref.addHook("mounted",o);}function je(o){u.ref&&u.ref.addHook("destroy",o);}function Ke(o,t){u.ref&&u.ref.setContext(o,t);}function Xe(o,t){var e;return (e=u.ref&&u.ref.getContext(o))!=null?e:t}function De(){return signal.shallowSignal(null)}function Ge(o,t){m.setSSG();let n=new C(o,t||{}).mount();return m.setClient(),n}function Fe(o,t){let e=typeof t=="string"?document.querySelector(t):t;if(!e)throw new Error(`Could not find container: ${t}`);m.setSSR(),L(o).mount(e),m.setClient();}function Je(o,t){return m.isSSG?new C(o,t):L(o,t)}
|
|
11
|
+
var X="on",D="update",T="children",L="",R="0",Y="1";var A=" __PLACEHOLDER__ ";var K=class{constructor(){this.renderMode=0;}get isSSG(){return this.renderMode===1}get isSSR(){return this.renderMode===2}get isClient(){return this.renderMode===0}setSSR(){this.renderMode=2;}setSSG(){this.renderMode=1;}setClient(){this.renderMode=0;}},m=new K,q=new Map;function z(o,t){q.set(o,{index:t});}function Q(o){var t;return (t=q.get(o))==null?void 0:t.index}var E=class E{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(t,e){var n;(n=this.hooks[t])==null||n.add(e);}getContext(t){return E.context[t]}setContext(t,e){E.context[t]=e;}initRef(){E.ref=this;}removeRef(){E.ref=null;}clearHooks(){Object.values(this.hooks).forEach(t=>t.clear());}};E.ref=null,E.context={};var d=E;function O(o){return o instanceof M}var b=1,M=class extends d{constructor(e,n={},r){super();this.template=e;this.props=n;this.key=r;z(e,b),this.templates=this.processTemplate();}processTemplate(){if(shared.isArray(this.template)){let e=this.template.join(A);return this.processHtmlString(e).split(A)}return []}processHtmlString(e){return e.replaceAll(/(<[^>]+>)|([^<]+)/g,(n,r,i)=>r?r.includes("data-ci")?n:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,a,l)=>`<${a} data-ci="${b}"${l||""}>`):i&&i.replace(A,"").trim()?`<!--0-${b}-->${i}<!$>`:n)}mount(){this.initRef();let e=this.render();return this.removeRef(),e}render(){if(shared.isFunction(this.template)){let e=this.template(this.props);return O(e)?e.mount():String(e)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([e,n])=>{let r=n.children;this.normalizeProps(n);let i=this.templates.findIndex(s=>s.includes(`data-hk="${e}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${e}"`,`data-hk="${e}" ${this.generateAttributes(n)}`);}),this.templates.join("")}normalizeProps(e){Object.entries(e).forEach(([n,r])=>{n==="children"||shared.isFunction(r)?delete e[n]:signal.isSignal(r)&&(e[n]=r.value);});}generateAttributes(e){return Object.entries(e).filter(([n,r])=>n!=="children"&&!shared.isFunction(r)).map(([n,r])=>`${n}="${shared.escape(String(r))}"`).join(" ")}renderChildren(e,n){e.forEach(([r])=>{b++;let i=this.renderChild(r);this.templates[n]+=i;});}renderChild(e){if(shared.isFunction(e))return this.renderChild(e(this.props));if(signal.isSignal(e))return `<!--1-${b}-->${e.value}<!$>`;if(O(e)){let n=e.mount();return shared.isFunction(n)?n(this.props):H(n)}else return `<!--1-${b}-->${e}<!$>`}};var te="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(","),Ee="a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp".split(",");function G(o){if(g(o)||o instanceof Node||O(o))return o;let t=shared.isFalsy(o)?"":String(o);return document.createTextNode(t)}function N(o,t,e=null){let n=g(e)?e.firstChild:e,r=m.isSSR;g(t)?t.mount(o,n):n&&!r?n.before(t):r||o.append(t);}function y(o){g(o)?o.unmount():o.parentNode&&o.remove();}function J(o,t,e){N(o,t,e),y(e);}function V(o,t,e){t==="class"?Te(o,e):t==="style"?ye(o,e):xe(o,t,e);}function Te(o,t){typeof t=="string"?o.className=t:shared.isArray(t)?o.className=t.join(" "):t&&typeof t=="object"&&(o.className=Object.entries(t).reduce((e,[n,r])=>e+(r?` ${n}`:""),"").trim());}function ye(o,t){typeof t=="string"?o.style.cssText=t:t&&typeof t=="object"&&Object.entries(t).forEach(([n,r])=>{o.style.setProperty(shared.kebabCase(n),String(r));});}function xe(o,t,e){shared.isFalsy(e)?o.removeAttribute(t):e===!0?o.setAttribute(t,""):o instanceof HTMLInputElement&&t==="value"?o.value=String(e):o.setAttribute(t,String(e));}function ne(o,t){if(o instanceof HTMLInputElement)switch(o.type){case"checkbox":return h(o,"change",()=>{t(!!o.checked);});case"date":return h(o,"change",()=>{t(o.value?o.value:"");});case"file":return h(o,"change",()=>{o.files&&t(o.files);});case"number":return h(o,"input",()=>{let e=Number.parseFloat(o.value);t(Number.isNaN(e)?"":String(e));});case"radio":return h(o,"change",()=>{t(o.checked?o.value:"");});case"text":return h(o,"input",()=>{t(o.value);})}if(o instanceof HTMLSelectElement)return h(o,"change",()=>{t(o.value);});if(o instanceof HTMLTextAreaElement)return h(o,"input",()=>{t(o.value);})}Promise.resolve();function h(o,t,e){return o.addEventListener(t,e),()=>o.removeEventListener(t,e)}function oe(o){let t=[],e=[],n=/<\/?([\da-z-]+)([^>]*)>/gi,r=0;for(;;){let i=n.exec(o);if(!i)break;let[s,a]=i,l=s[1]==="/";if(e.push(o.slice(r,i.index)),r=i.index+s.length,l){for(;t.length>0&&t[t.length-1]!==a;){let c=t.pop();c&&e.push(`</${c}>`);}t.length>0&&t.pop();}else te.includes(a)||t.push(a);e.push(s);}for(e.push(o.slice(r));t.length>0;){let i=t.pop();i&&e.push(`</${i}>`);}return e.join("")}function re(o){return Ee.includes(o)}function ie(o){return te.includes(o)?`<${o}/>`:`<${o}></${o}>`}function H(o){return signal.isSignal(o)?o.value:o}var k=class extends d{constructor(e,n,r){super();this.template=e;this.props=n;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=n==null?void 0:n.key),this.proxyProps=this.createProxyProps(n);}createProxyProps(e){return e?signal.signalObject(e,n=>shared.startsWith(n,X)||shared.startsWith(n,D)||n===T):{}}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}mount(e,n){var i,s,a,l;if(!shared.isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(i=this.rootNode)==null?void 0:i.mount(e,n))!=null?s:[];this.initRef(),this.rootNode=this.template(signal.useReactive(this.proxyProps,["children"]));let r=(l=(a=this.rootNode)==null?void 0:a.mount(e,n))!=null?l:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var e;this.callDestroyHooks(),this.clearHooks(),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(e=>e());}callDestroyHooks(){this.hooks.destroy.forEach(e=>e());}clearEmitter(){for(let e of this.emitter)e();this.emitter.clear();}inheritNode(e){Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap,this.hooks=e.hooks;let n=this.props;this.props=e.props,this.patchProps(n);}getNodeTrack(e){let n=this.trackMap.get(e);return n||(n={cleanup:()=>{}},this.trackMap.set(e,n)),n.cleanup(),n}patchProps(e){var n;if(e){for(let[r,i]of Object.entries(e))shared.startsWith(r,X)&&((n=this.rootNode)!=null&&n.firstChild)?this.patchEventListener(r,i):r==="ref"?this.patchRef(i):shared.startsWith(r,D)?this.patchUpdateHandler(r,i):r!==T&&this.patchNormalProp(r,i);this.props=e;}}patchEventListener(e,n){let r=e.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,n);this.emitter.add(i);}patchRef(e){var n,r;e.value=(r=(n=this.rootNode)==null?void 0:n.firstChild)!=null?r:null;}patchUpdateHandler(e,n){this.props[e]=H(n);}patchNormalProp(e,n){var s,a;let r=(a=(s=this.proxyProps)[e])!=null?a:s[e]=signal.useSignal(n),i=this.getNodeTrack(e);i.cleanup=signal.useEffect(()=>{r.value=shared.isFunction(n)?n():n;});}};var ae=Object.prototype.toString;var U=o=>ae.call(o)==="[object Object]";function le(o,t,e,n){let r=new Map,i=Array.from(t.values());if(i.length&&e.length===0)return ke(o,i,n),r;let s=[],a=Pe(e),l=0;for(let[c,u]of e.entries()){let p=i[l],S=x(p,c);for(;p&&!a.has(S);)y(p),t.delete(S),p=i[++l],S=x(p,c);let B=x(u,c),F=t.get(B);if(F&&(u=Ce(o,F,u)),p)if(p===F)l++;else {let W=document.createComment("");N(o,W,p),s.push([W,u]);}else N(o,u,n);r.set(B,u);}return s.forEach(([c,u])=>{J(o,u,c);}),t.forEach((c,u)=>{c.isConnected&&!r.has(u)&&y(c);}),r}function ke(o,t,e){if(o.childNodes.length===t.length+(e?1:0))o.innerHTML="",e&&N(o,e);else {let n=document.createRange(),r=t[0],i=g(r)?r.firstChild:r;n.setStartBefore(i),e?n.setEndBefore(e):n.setEndAfter(o),n.deleteContents();}t.forEach(n=>{g(n)&&n.unmount();});}function Ce(o,t,e){return t===e?t:g(t)&&g(e)&&t.template===e.template?(e.inheritNode(t),e):t instanceof Text&&e instanceof Text?(t.textContent!==e.textContent&&(t.textContent=e.textContent),t):(J(o,e,t),e)}function Pe(o){let t=new Map;for(let[e,n]of o.entries()){let r=x(n,e);t.set(r,n);}return t}function x(o,t){if(g(o)){let e=o.key;if(e!=null)return String(e)}return `_$${t}$`}var v=class{constructor(t,e,n){this.template=t;this.props=e;this.key=n;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;this.key||(this.key=e==null?void 0:e.key),m.isSSR&&(this.componentIndex=Q(this.template));}get firstChild(){var t;return (t=this.nodes[0])!=null?t:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(t,e){var i;if(this.parent=t,this.isConnected)return this.nodes.forEach(s=>N(t,s,e)),this.nodes;shared.isArray(this.template)&&(this.template=P(this.template.join("")));let n=this.template.content.cloneNode(!0),r=n.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r==null||r.childNodes.forEach(s=>{n.append(s);})),this.nodes=Array.from(n.childNodes),m.isSSR?this.mapSSGNodeTree(t):this.mapNodeTree(t,n),N(t,n,e),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){var t,e;if(this.trackMap.forEach(n=>{var r;(r=n.cleanup)==null||r.call(n);}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(n=>y(n)),!this.template.innerHTML&&!this.nodes.length){let n=(e=(t=this.props)==null?void 0:t[R])==null?void 0:e.children;n&&(shared.isArray(n)?n.forEach(r=>{this.deleteFragmentTextNode(r);}):this.deleteFragmentTextNode(n));}this.nodes=[],this.mounted=!1;}deleteFragmentTextNode(t){var e;shared.isPrimitive(t)?(e=this.parent)==null||e.childNodes.forEach(n=>{var r;n.nodeType===Node.TEXT_NODE&&n.textContent===`${t}`&&((r=this.parent)==null||r.removeChild(n));}):y(t);}inheritNode(t){this.mounted=t.mounted,this.nodes=t.nodes,this.trackMap=t.trackMap,this.treeMap=t.treeMap;let e=this.props;this.props=t.props,this.patchProps(e);}mapSSGNodeTree(t){this.treeMap.set(0,t),this.walkNodeTree(t,this.handleSSGNode.bind(this));}mapNodeTree(t,e){let n=1;this.treeMap.set(0,t);let r=[t],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(n++,s),r.push(s));};this.walkNodeTree(e,i);}walkNodeTree(t,e){t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&e(t);let n=t.firstChild;for(;n;)this.walkNodeTree(n,e),n=n.nextSibling;}handleSSGNode(t){var e;if(t.nodeType===Node.COMMENT_NODE){let[n,r]=((e=t.textContent)==null?void 0:e.split("-"))||[];if(0===+n&&+r===this.componentIndex){let i=t.nextSibling;this.treeMap.set(+r,i);}}else if(t.nodeType!==Node.TEXT_NODE){let{ci:n="-1",hk:r}=(t==null?void 0:t.dataset)||{};r&&+n===this.componentIndex&&this.treeMap.set(+r,t);}}patchProps(t){t&&(Object.entries(t).forEach(([e,n])=>{let r=Number(e),i=this.treeMap.get(r);i&&this.patchProp(e,i,n,r===0);}),this.props=t);}patchProp(t,e,n,r){n&&Object.entries(n).forEach(([i,s])=>{if(i===T&&s)this.patchChildren(t,e,s,r);else if(i==="ref")n[i].value=e;else if(shared.startsWith(i,"on"))this.patchEventListener(t,e,i,s);else {if(this.bindValueKeys.includes(i))return;let a=this.getBindUpdateValue(n,t,i);this.patchAttribute(t,e,i,s,a);}});}getBindUpdateValue(t,e,n){let i=`update${shared.capitalize(n)}`;if(i&&t[i]&&shared.isFunction(t[i]))return this.bindValueKeys.push(i),t[i]}patchChildren(t,e,n,r){if(shared.isArray(n))n.filter(Boolean).forEach((i,s)=>{var S;let[a,l]=shared.isArray(i)?i:[i,null],c=shared.isNil(l)?null:(S=this.treeMap.get(l))!=null?S:null,u=`${t}:${T}:${s}`,p=this.getNodeTrack(u,!0,r);this.patchChild(p,e,a,c);});else {let i=`${t}:${T}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,e,n,null);}}patchEventListener(t,e,n,r){let i=n.slice(2).toLowerCase(),s=this.getNodeTrack(`${t}:${n}`);s.cleanup=h(e,i,r);}patchAttribute(t,e,n,r,i){let s=this.getNodeTrack(`${t}:${n}`),a=shared.isFunction(r)?r():r,l=signal.isSignal(a)?a:signal.shallowSignal(a);V(e,n,l.value);let c=signal.useEffect(()=>{let p=shared.isFunction(r)?r():r;U(p)&&U(l.peek())&&JSON.stringify(l.value)===JSON.stringify(p)||(l.value=signal.isSignal(p)?p.value:p,V(e,n,l.value));}),u;i&&shared.isHTMLElement(e)&&(u=ne(e,p=>{i(p);})),s.cleanup=()=>{c&&c(),u&&u();};}getNodeTrack(t,e,n){var i;let r=this.trackMap.get(t);return r||(r={cleanup:()=>{}},e&&(r.lastNodes=new Map),n&&(r.isRoot=!0),this.trackMap.set(t,r)),(i=r.cleanup)==null||i.call(r),r}patchChild(t,e,n,r){shared.isFunction(n)?t.cleanup=signal.useEffect(()=>{let i=shared.coerceArray(n()).map(G);m.isSSR?t.lastNodes=this.reconcileChildren(e,i,r):t.lastNodes=le(e,t.lastNodes,i,r);}):shared.coerceArray(n).forEach((i,s)=>{let a=G(i),l=x(a,s);m.isSSR?t.lastNodes=this.reconcileChildren(e,[a],r):(t.lastNodes.set(l,a),N(e,a,r));});}reconcileChildren(t,e,n){let r=new Map,i=Array.from(t.childNodes).filter(s=>{var a,l;return s.nodeType===Node.TEXT_NODE&&((a=s.previousSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&((l=s.nextSibling)==null?void 0:l.nodeType)===Node.COMMENT_NODE});return e.forEach((s,a)=>{let l=x(s,a);s.nodeType===Node.TEXT_NODE?i.forEach(c=>{s.textContent===c.textContent&&t.replaceChild(s,c);}):N(t,s,n),r.set(l,s);}),r}};function w(o,t,e){if(shared.isString(o)){if(re(o)){let n=ie(o);return t={[Y]:t},new v(P(n),t,e)}else if(o===L)return t={[R]:t},new v(P(L),t,e)}return shared.isFunction(o)?new k(o,t,e):new v(o,t,e)}function Ie(o){return o instanceof k}function g(o){return o instanceof k||o instanceof v}function P(o){let t=document.createElement("template");return t.innerHTML=oe(o),t}function Fe(o){return w(L,{children:shared.isArray(o.children)?o.children.filter(Boolean):[o.children]})}function Xe(o){d.ref&&d.ref.addHook("mounted",o);}function De(o){d.ref&&d.ref.addHook("destroy",o);}function Ge(o,t){d.ref&&d.ref.setContext(o,t);}function Je(o,t){var e;return (e=d.ref&&d.ref.getContext(o))!=null?e:t}function Ve(){return signal.shallowSignal(null)}function Ue(o,t){m.setSSG();let n=new M(o,t||{}).mount();return m.setClient(),n}function Be(o,t){let e=typeof t=="string"?document.querySelector(t):t;if(!e)throw new Error(`Could not find container: ${t}`);m.setSSR(),w(o).mount(e),m.setClient();}function We(o,t){return m.isSSG?new M(o,t):w(o,t)}
|
|
12
12
|
|
|
13
|
-
exports.Fragment =
|
|
14
|
-
exports.h =
|
|
15
|
-
exports.hydrate =
|
|
16
|
-
exports.isComponent =
|
|
17
|
-
exports.isJsxElement =
|
|
18
|
-
exports.onDestroy =
|
|
19
|
-
exports.onMount =
|
|
20
|
-
exports.renderToString =
|
|
21
|
-
exports.ssg =
|
|
13
|
+
exports.Fragment = Fe;
|
|
14
|
+
exports.h = w;
|
|
15
|
+
exports.hydrate = Be;
|
|
16
|
+
exports.isComponent = Ie;
|
|
17
|
+
exports.isJsxElement = g;
|
|
18
|
+
exports.onDestroy = De;
|
|
19
|
+
exports.onMount = Xe;
|
|
20
|
+
exports.renderToString = Ue;
|
|
21
|
+
exports.ssg = We;
|
|
22
22
|
exports.template = P;
|
|
23
|
-
exports.useInject =
|
|
24
|
-
exports.useProvide =
|
|
25
|
-
exports.useRef =
|
|
23
|
+
exports.useInject = Je;
|
|
24
|
+
exports.useProvide = Ge;
|
|
25
|
+
exports.useRef = Ve;
|
|
26
26
|
//# sourceMappingURL=template.cjs.js.map
|
|
27
27
|
//# sourceMappingURL=template.cjs.js.map
|
package/dist/template.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sharedConfig.ts","../src/lifecycleContext.ts","../src/ssgNode.ts","../src/utils.ts","../src/componentNode.ts","../src/patch.ts","../src/templateNode.ts","../src/jsxRenderer.ts","../src/hooks.ts","../src/server.ts"],"names":["EVENT_PREFIX","UPDATE_PREFIX","CHILDREN_PROP","EMPTY_TEMPLATE","FRAGMENT_PROP_KEY","SINGLE_PROP_KEY","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","HTML_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","closeHtmlTags","input","tagStack","tagPattern","lastIndex","fullMatch","isEndTag","unclosedTag","isHtmlTagName","convertToHtmlTag","signal","ComponentNode","shallowReactive","startsWith","_b","_c","_d","mountedNode","cleanup","trackKey","track","prop","event","useEffect","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","isPrimitive","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","val","triggerValue","shallowSignal","val2","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","h","isString","htmlTemplate","isComponent","html","Fragment","onMount","onDestroy","useProvide","useInject","defaultValue","useRef","renderToString","component","hydrate","container","rootElement","ssg"],"mappings":"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","file":"template.cjs.js","sourcesContent":["/**\n * Framework render type\n *\n * CLIENT: client side\n * SSR: server side render\n * SSG: server side generate\n */\nexport enum RENDER_MODE {\n CLIENT,\n SSG,\n SSR,\n}\n\nexport const EVENT_PREFIX = 'on';\nexport const UPDATE_PREFIX = 'update';\nexport const CHILDREN_PROP = 'children';\n\nexport const EMPTY_TEMPLATE = '';\nexport const FRAGMENT_PROP_KEY = '0';\nexport const SINGLE_PROP_KEY = '1';\nexport const STYLE_KEY = 'style';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\n// Enum to represent different types of components\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\n// Function to enter a component and set its index\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\n// Function to get the index of a component\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal/*';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === 'children') {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== 'children' && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!SELF_CLOSING_TAGS.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, shallowReactive, useEffect } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, UPDATE_PREFIX } from './sharedConfig';\nimport type { TemplateNode } from './templateNode';\nimport type { EssorComponent, NodeTrack, Props } from '../types';\n\nexport class ComponentNode extends LifecycleContext implements JSX.Element {\n private proxyProps: Record<string, Signal<unknown>>;\n private emitter = new Set<() => void>();\n private rootNode: TemplateNode | null = null;\n private trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n this.key ||= props?.key as string;\n this.proxyProps = this.createProxyProps(props);\n }\n\n private createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return shallowReactive(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(this.proxyProps);\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.callMountHooks();\n this.patchProps(this.props);\n this.removeRef();\n\n return mountedNode;\n }\n\n unmount(): void {\n this.callDestroyHooks();\n this.clearHooks();\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.clearEmitter();\n }\n\n private callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n private callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n private clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n private getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === 'ref') {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n private patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n private patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n private patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n private patchNormalProp(key: string, prop: any): void {\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n this.proxyProps[key] = isFunction(prop) ? prop() : prop;\n });\n }\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './jsxRenderer';\n\n// Type alias for nodes that can be either DOM Node or JSX Element\ntype AnyNode = Node | JSX.Element;\n\n/**\n * Patches children of a parent node with new children.\n * This function is responsible for efficiently updating the DOM to reflect changes in the virtual DOM.\n *\n * @param parent - The parent node whose children are being updated\n * @param childrenMap - A map of current children, keyed by their unique identifiers\n * @param nextChildren - An array of new children to be patched in\n * @param before - The node before which new children should be inserted (if any)\n * @returns A new map of children after patching\n */\nexport function patchChildren(\n parent: Node,\n childrenMap: Map<string, AnyNode>,\n nextChildren: AnyNode[],\n before: Node | null,\n): Map<string, AnyNode> {\n const result = new Map<string, AnyNode>();\n const children = Array.from(childrenMap.values());\n\n // If there are no new children, clear all existing children\n if (children.length && nextChildren.length === 0) {\n clearChildren(parent, children, before);\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n // Iterate through new children and patch or insert as necessary\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\n // Remove any current children that are not in the new children set\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children[++childIndex];\n currKey = getKey(currChild, i);\n }\n\n const key = getKey(child, i);\n const origChild = childrenMap.get(key);\n\n // If the child already exists, patch it\n if (origChild) {\n child = patch(parent, origChild, child);\n }\n\n // Handle insertion or replacement of children\n if (currChild) {\n if (currChild === origChild) {\n childIndex++;\n } else {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n }\n } else {\n insertChild(parent, child, before);\n }\n\n result.set(key, child);\n }\n\n // Replace placeholders with actual nodes\n replaces.forEach(([placeholder, child]) => {\n replaceChild(parent, child, placeholder);\n });\n\n // Remove any remaining children that weren't in the new set\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\n/**\n * Clears all children from a parent node.\n *\n * @param parent - The parent node to clear children from\n * @param children - The array of children to be cleared\n * @param before - The node before which clearing should stop (if any)\n */\nfunction clearChildren(parent: Node, children: AnyNode[], before: Node | null) {\n if (parent.childNodes.length === children.length + (before ? 1 : 0)) {\n (parent as Element).innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children[0];\n const start = isJsxElement(child) ? child.firstChild : child;\n range.setStartBefore(start!);\n if (before) {\n range.setEndBefore(before);\n } else {\n range.setEndAfter(parent);\n }\n range.deleteContents();\n }\n children.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n}\n\n/**\n * Patches a single node, replacing it with a new node if necessary.\n *\n * @param parent - The parent node\n * @param node - The current node\n * @param next - The new node to patch with\n * @returns The patched node\n */\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\n/**\n * Maps an array of nodes to a Map, using their keys as identifiers.\n *\n * @param children - The array of nodes to map\n * @returns A Map of nodes, keyed by their unique identifiers\n */\nexport function mapKeys(children: AnyNode[]): Map<string, AnyNode> {\n const result = new Map();\n for (const [i, child] of children.entries()) {\n const key = getKey(child, i);\n result.set(key, child);\n }\n return result;\n}\n\n/**\n * Gets the key for a node, either from its 'key' property (if it's a JSX element)\n * or generates a key based on its index.\n *\n * @param node - The node to get the key for\n * @param index - The index of the node in its parent's children array\n * @returns A string key for the node\n */\nexport function getKey(node: AnyNode, index: number): string {\n if (isJsxElement(node)) {\n const jsxKey = (node as any).key;\n if (jsxKey !== undefined && jsxKey !== null) {\n return String(jsxKey);\n }\n }\n return `_$${index}$`;\n}\n","import {\n capitalize,\n coerceArray,\n isArray,\n isFunction,\n isHTMLElement,\n isNil,\n isPrimitive,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, shallowSignal, useEffect } from '@estjs/signal';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n FRAGMENT_PROP_KEY,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n // Private properties for managing the node's state\n private treeMap = new Map<number, Node>();\n private mounted = false;\n private nodes: Node[] = [];\n private trackMap = new Map<string, NodeTrack>();\n private bindValueKeys: string[] = [];\n private componentIndex: number;\n private parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n this.key ||= props?.key as string;\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n if (isArray(this.template)) {\n this.template = createTemplate(this.template.join(''));\n }\n\n const cloneNode = this.template.content.cloneNode(true);\n const firstChild = cloneNode.firstChild as HTMLElement | null;\n\n if (firstChild?.hasAttribute?.('_svg_')) {\n firstChild.remove();\n firstChild?.childNodes.forEach(node => {\n (cloneNode as Element).append(node);\n });\n }\n\n this.nodes = Array.from(cloneNode.childNodes);\n\n if (renderContext.isSSR) {\n this.mapSSGNodeTree(parent as HTMLElement);\n } else {\n this.mapNodeTree(parent, cloneNode);\n }\n insertChild(parent, cloneNode, before);\n this.patchProps(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n // Fragment\n if (!this.template.innerHTML && !this.nodes.length) {\n const children = this.props?.[FRAGMENT_PROP_KEY]?.children;\n\n if (children) {\n if (isArray(children)) {\n children.forEach(child => {\n this.deleteFragmentTextNode(child);\n });\n } else {\n this.deleteFragmentTextNode(children);\n }\n }\n }\n\n this.nodes = [];\n this.mounted = false;\n }\n\n deleteFragmentTextNode(child) {\n if (isPrimitive(child)) {\n this.parent?.childNodes.forEach(node => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent === `${child as any}`) {\n this.parent?.removeChild(node);\n }\n });\n } else {\n removeChild(child);\n }\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n private mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // Private method to map node tree\n private mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n private walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n private handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n private patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n private patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === 'ref') {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, 'on')) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n private getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const UPDATE_PREFIX = 'update';\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n private patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n private patchEventListener(key: string, node: Node, attr: string, listener: EventListener): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n private patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n const cleanup = useEffect(() => {\n // triggger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (JSON.stringify(triggerValue.value) === JSON.stringify(val2)) return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n private getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n private patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n private reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport type { EssorComponent, EssorNode, Props } from '../types';\n\n/**\n * Creates a JSX element from a given template.\n *\n * @param template - The template to render. Can be a string representing an HTML\n * element, a function representing a component, or an `HTMLTemplateElement`.\n * @param props - Properties to pass to the component or element.\n * @param key - The key of the element.\n * @returns The created JSX element.\n */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n template: EssorComponent | HTMLTemplateElement | K | '',\n props?: Props,\n key?: string,\n): JSX.Element {\n if (isString(template)) {\n if (isHtmlTagName(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n } else if (template === EMPTY_TEMPLATE) {\n props = { [FRAGMENT_PROP_KEY]: props };\n return new TemplateNode(createTemplate(EMPTY_TEMPLATE), props, key);\n }\n }\n\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template as HTMLTemplateElement, props, key);\n}\n\n/**\n * Checks if the given node is an instance of `ComponentNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is an instance of `ComponentNode`, otherwise `false`.\n */\nexport function isComponent(node: unknown): node is ComponentNode {\n return node instanceof ComponentNode;\n}\n\n/**\n * Checks if the given node is a JSX element. A JSX element is either an instance\n * of `ComponentNode` or an instance of `TemplateNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is a JSX element, otherwise `false`.\n */\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\n/**\n * Creates an HTML template element from a given HTML string.\n *\n * @param html The HTML string to create a template from.\n * @returns A new HTML template element.\n */\nexport function createTemplate(html: string): HTMLTemplateElement {\n const template = document.createElement('template');\n template.innerHTML = closeHtmlTags(html);\n return template;\n}\n\n/**\n * @param props - An object containing the `children` prop.\n * @param props.children - The children to be rendered. Can be a single JSX element, string, number, boolean,\n * or an array of these. Falsy values in arrays will be filtered out.\n * @returns A JSX element representing the fragment, wrapping the filtered children.\n */\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(props: { children: T }) {\n return h(EMPTY_TEMPLATE, {\n children: isArray(props.children) ? props.children.filter(Boolean) : [props.children],\n });\n}\n","import { isSymbol } from '@estjs/shared';\nimport { type Signal, shallowSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('useProvide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function useInject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('useInject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n\n/**\n * Creates a reactive ref that can be used to reference a DOM node\n * or a component instance within the component function body.\n *\n * @returns a reactive ref signal\n *\n * @example\n * const inputRef = useRef<HTMLInputElement>()\n *\n * <input ref={inputRef} />\n *\n * inputRef.value // input element\n */\nexport function useRef<T>(): Signal<T | null> {\n return shallowSignal<T | null>(null);\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sharedConfig.ts","../src/lifecycleContext.ts","../src/ssgNode.ts","../src/utils.ts","../src/componentNode.ts","../src/templateNode.ts","../../shared/src/comm.ts","../../shared/src/is.ts","../src/patch.ts","../src/jsxRenderer.ts","../src/hooks.ts","../src/server.ts"],"names":["EVENT_PREFIX","UPDATE_PREFIX","CHILDREN_PROP","EMPTY_TEMPLATE","FRAGMENT_PROP_KEY","SINGLE_PROP_KEY","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","HTML_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","closeHtmlTags","input","tagStack","tagPattern","lastIndex","fullMatch","isEndTag","unclosedTag","isHtmlTagName","convertToHtmlTag","signal","ComponentNode","signalObject","startsWith","_b","_c","_d","useReactive","mountedNode","cleanup","trackKey","track","prop","event","newValue","useSignal","useEffect","_toString","isPlainObject","val","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","isPrimitive","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","triggerValue","shallowSignal","val2","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","h","isString","htmlTemplate","isComponent","html","Fragment","onMount","onDestroy","useProvide","useInject","defaultValue","useRef","renderToString","component","hydrate","container","rootElement","ssg"],"mappings":"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","file":"template.cjs.js","sourcesContent":["/**\n * Framework render type\n *\n * CLIENT: client side\n * SSR: server side render\n * SSG: server side generate\n */\nexport enum RENDER_MODE {\n CLIENT,\n SSG,\n SSR,\n}\n\nexport const EVENT_PREFIX = 'on';\nexport const UPDATE_PREFIX = 'update';\nexport const CHILDREN_PROP = 'children';\n\nexport const EMPTY_TEMPLATE = '';\nexport const FRAGMENT_PROP_KEY = '0';\nexport const SINGLE_PROP_KEY = '1';\nexport const STYLE_KEY = 'style';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\n// Enum to represent different types of components\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\n// Function to enter a component and set its index\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\n// Function to get the index of a component\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal/*';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === 'children') {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== 'children' && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!SELF_CLOSING_TAGS.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, signalObject, useEffect, useSignal } from '@estjs/signal';\nimport { useReactive } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, UPDATE_PREFIX } from './sharedConfig';\nimport type { TemplateNode } from './templateNode';\nimport type { EssorComponent, NodeTrack, Props } from '../types';\n\nexport class ComponentNode extends LifecycleContext implements JSX.Element {\n private proxyProps: Record<string, Signal<unknown>>;\n private emitter = new Set<() => void>();\n private rootNode: TemplateNode | null = null;\n private trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n\n this.key ||= props?.key as string;\n this.proxyProps = this.createProxyProps(props);\n }\n\n private createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return signalObject(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(useReactive(this.proxyProps, ['children']));\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.callMountHooks();\n this.patchProps(this.props);\n this.removeRef();\n\n return mountedNode;\n }\n\n unmount(): void {\n this.callDestroyHooks();\n this.clearHooks();\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.clearEmitter();\n }\n\n private callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n private callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n private clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n private getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === 'ref') {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n private patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n private patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n private patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n private patchNormalProp(key: string, prop: any): void {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = isFunction(prop) ? prop() : prop;\n });\n }\n}\n","import {\n capitalize,\n coerceArray,\n isArray,\n isFunction,\n isHTMLElement,\n isNil,\n isPrimitive,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, shallowSignal, useEffect } from '@estjs/signal';\nimport { isPlainObject } from './../../shared/src/is';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n FRAGMENT_PROP_KEY,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n // Private properties for managing the node's state\n private treeMap = new Map<number, Node>();\n private mounted = false;\n private nodes: Node[] = [];\n private trackMap = new Map<string, NodeTrack>();\n private bindValueKeys: string[] = [];\n private componentIndex: number;\n private parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n this.key ||= props?.key as string;\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n if (isArray(this.template)) {\n this.template = createTemplate(this.template.join(''));\n }\n\n const cloneNode = this.template.content.cloneNode(true);\n const firstChild = cloneNode.firstChild as HTMLElement | null;\n\n if (firstChild?.hasAttribute?.('_svg_')) {\n firstChild.remove();\n firstChild?.childNodes.forEach(node => {\n (cloneNode as Element).append(node);\n });\n }\n\n this.nodes = Array.from(cloneNode.childNodes);\n\n if (renderContext.isSSR) {\n this.mapSSGNodeTree(parent as HTMLElement);\n } else {\n this.mapNodeTree(parent, cloneNode);\n }\n insertChild(parent, cloneNode, before);\n this.patchProps(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n // Fragment\n if (!this.template.innerHTML && !this.nodes.length) {\n const children = this.props?.[FRAGMENT_PROP_KEY]?.children;\n\n if (children) {\n if (isArray(children)) {\n children.forEach(child => {\n this.deleteFragmentTextNode(child);\n });\n } else {\n this.deleteFragmentTextNode(children);\n }\n }\n }\n\n this.nodes = [];\n this.mounted = false;\n }\n\n deleteFragmentTextNode(child) {\n if (isPrimitive(child)) {\n this.parent?.childNodes.forEach(node => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent === `${child as any}`) {\n this.parent?.removeChild(node);\n }\n });\n } else {\n removeChild(child);\n }\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n private mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // Private method to map node tree\n private mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n private walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n private handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n private patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n private patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === 'ref') {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, 'on')) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n private getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const UPDATE_PREFIX = 'update';\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n private patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n private patchEventListener(key: string, node: Node, attr: string, listener: EventListener): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n private patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n\n const cleanup = useEffect(() => {\n // triggger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (\n isPlainObject(val2) &&\n isPlainObject(triggerValue.peek()) &&\n JSON.stringify(triggerValue.value) === JSON.stringify(val2)\n )\n return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n private getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n private patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n private reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { isArray, isFunction, isString } from './is';\n\nexport const _toString = Object.prototype.toString;\nexport const extend = Object.assign;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nexport const hasOwn = (val: object, key: string | symbol): key is keyof typeof val =>\n hasOwnProperty.call(val, key);\n\nexport function coerceArray<T>(data: T | T[]): T[] {\n return isArray(data) ? (data.flat() as T[]) : [data];\n}\nexport const hasChanged = (value, oldValue) =>\n value !== oldValue && (value === value || oldValue === oldValue);\nexport const noop = Function.prototype as () => void;\n\n/**\n * A function that checks if a string starts with a specific substring.\n * indexOf faster under normal circumstances\n * @see https://www.measurethat.net/Benchmarks/Show/12350/0/startswith-vs-test-vs-match-vs-indexof#latest_results_block\n\n * @param {string} str - The input string to check.\n * @param {string} searchString - The substring to check for at the beginning of the input string.\n * @return {boolean} Returns true if the input string starts with the specified substring, otherwise false.\n */\nexport function startsWith(str, searchString) {\n if (!isString(str)) {\n return false;\n }\n return str.indexOf(searchString) === 0;\n}\n\n/**\n * Escapes special HTML characters in a string.\n * @param str - The string to escape.\n * @returns The escaped string.\n */\nexport function escape(str: string): string {\n return str.replaceAll(/[\"&'<>]/g, char => {\n switch (char) {\n case '&':\n return '&';\n case '<':\n return '<';\n case '>':\n return '>';\n case '\"':\n return '"';\n case \"'\":\n return ''';\n default:\n return char;\n }\n });\n}\n\nexport type ExcludeType = ((key: string | symbol) => boolean) | (string | symbol)[];\n\n/**\n * Checks if a key should be excluded based on the provided exclude criteria.\n * @param key - The key to check.\n * @param exclude - The exclusion criteria.\n * @returns True if the key should be excluded, otherwise false.\n */\nexport function isExclude(key: string | symbol, exclude?: ExcludeType): boolean {\n return isArray(exclude) ? exclude.includes(key) : isFunction(exclude) ? exclude(key) : false;\n}\n\n/**\n * Generates a unique random 8 character string ID.\n * The generated IDs only contain alphanumeric characters.\n * @returns A unique random 8 character string ID.\n */\nexport function generateUniqueId() {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n const charactersLength = characters.length;\n for (let i = 0; i < 8; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n\n/**\n * Checks if the current environment is a browser.\n * @returns True if the current environment is a browser, otherwise false.\n */\nexport function isBrowser() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport const cacheStringFunction = <T extends (str: string) => string>(fn: T): T => {\n const cache: Record<string, string> = Object.create(null);\n return ((str: string) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n }) as T;\n};\n","import { _toString } from './comm';\n\nexport const isObject = (val: unknown): val is Record<any, any> =>\n val !== null && typeof val === 'object';\nexport function isPromise(val: any): val is Promise<any> {\n return _toString.call(val) === '[object Promise]';\n}\n\nexport const isArray = Array.isArray;\n\nexport function isString(val: unknown): val is string {\n return typeof val === 'string';\n}\nexport function isNull(val: any): val is null {\n return val === null;\n}\nexport function isSymbol(val: unknown): val is symbol {\n return typeof val === 'symbol';\n}\n\nexport function isSet(val: any): val is Set<any> {\n return _toString.call(val) === '[object Set]';\n}\nexport function isWeakMap(val: any): val is WeakMap<any, any> {\n return _toString.call(val) === '[object WeakMap]';\n}\nexport function isWeakSet(val: any): val is WeakSet<any> {\n return _toString.call(val) === '[object WeakSet]';\n}\n\nexport function isMap(val: unknown): val is Map<any, any> {\n return _toString.call(val) === '[object Map]';\n}\nexport function isNil(x: any): x is null | undefined {\n return x === null || x === undefined;\n}\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function';\n\nexport function isFalsy(x: any): x is false | null | undefined {\n return x === false || x === null || x === undefined;\n}\n\nexport const isPrimitive = (\n val: unknown,\n): val is string | number | boolean | symbol | null | undefined =>\n ['string', 'number', 'boolean', 'symbol', 'undefined'].includes(typeof val) || isNull(val);\n\nexport function isHTMLElement(obj) {\n if (!obj) return false;\n return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';\n}\n\nexport const isPlainObject = (val: unknown): val is object =>\n _toString.call(val) === '[object Object]';\n\nexport type StringNumber = `${number}`;\nexport function isStringNumber(val: unknown): val is StringNumber {\n if (!isString(val)) {\n return false;\n }\n return !Number.isNaN(Number(val));\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './jsxRenderer';\n\n// Type alias for nodes that can be either DOM Node or JSX Element\ntype AnyNode = Node | JSX.Element;\n\n/**\n * Patches children of a parent node with new children.\n * This function is responsible for efficiently updating the DOM to reflect changes in the virtual DOM.\n *\n * @param parent - The parent node whose children are being updated\n * @param childrenMap - A map of current children, keyed by their unique identifiers\n * @param nextChildren - An array of new children to be patched in\n * @param before - The node before which new children should be inserted (if any)\n * @returns A new map of children after patching\n */\nexport function patchChildren(\n parent: Node,\n childrenMap: Map<string, AnyNode>,\n nextChildren: AnyNode[],\n before: Node | null,\n): Map<string, AnyNode> {\n const result = new Map<string, AnyNode>();\n const children = Array.from(childrenMap.values());\n\n // If there are no new children, clear all existing children\n if (children.length && nextChildren.length === 0) {\n clearChildren(parent, children, before);\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n // Iterate through new children and patch or insert as necessary\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\n // Remove any current children that are not in the new children set\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children[++childIndex];\n currKey = getKey(currChild, i);\n }\n\n const key = getKey(child, i);\n const origChild = childrenMap.get(key);\n\n // If the child already exists, patch it\n if (origChild) {\n child = patch(parent, origChild, child);\n }\n\n // Handle insertion or replacement of children\n if (currChild) {\n if (currChild === origChild) {\n childIndex++;\n } else {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n }\n } else {\n insertChild(parent, child, before);\n }\n\n result.set(key, child);\n }\n\n // Replace placeholders with actual nodes\n replaces.forEach(([placeholder, child]) => {\n replaceChild(parent, child, placeholder);\n });\n\n // Remove any remaining children that weren't in the new set\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\n/**\n * Clears all children from a parent node.\n *\n * @param parent - The parent node to clear children from\n * @param children - The array of children to be cleared\n * @param before - The node before which clearing should stop (if any)\n */\nfunction clearChildren(parent: Node, children: AnyNode[], before: Node | null) {\n if (parent.childNodes.length === children.length + (before ? 1 : 0)) {\n (parent as Element).innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children[0];\n const start = isJsxElement(child) ? child.firstChild : child;\n range.setStartBefore(start!);\n if (before) {\n range.setEndBefore(before);\n } else {\n range.setEndAfter(parent);\n }\n range.deleteContents();\n }\n children.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n}\n\n/**\n * Patches a single node, replacing it with a new node if necessary.\n *\n * @param parent - The parent node\n * @param node - The current node\n * @param next - The new node to patch with\n * @returns The patched node\n */\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\n/**\n * Maps an array of nodes to a Map, using their keys as identifiers.\n *\n * @param children - The array of nodes to map\n * @returns A Map of nodes, keyed by their unique identifiers\n */\nexport function mapKeys(children: AnyNode[]): Map<string, AnyNode> {\n const result = new Map();\n for (const [i, child] of children.entries()) {\n const key = getKey(child, i);\n result.set(key, child);\n }\n return result;\n}\n\n/**\n * Gets the key for a node, either from its 'key' property (if it's a JSX element)\n * or generates a key based on its index.\n *\n * @param node - The node to get the key for\n * @param index - The index of the node in its parent's children array\n * @returns A string key for the node\n */\nexport function getKey(node: AnyNode, index: number): string {\n if (isJsxElement(node)) {\n const jsxKey = (node as any).key;\n if (jsxKey !== undefined && jsxKey !== null) {\n return String(jsxKey);\n }\n }\n return `_$${index}$`;\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport type { EssorComponent, EssorNode, Props } from '../types';\n\n/**\n * Creates a JSX element from a given template.\n *\n * @param template - The template to render. Can be a string representing an HTML\n * element, a function representing a component, or an `HTMLTemplateElement`.\n * @param props - Properties to pass to the component or element.\n * @param key - The key of the element.\n * @returns The created JSX element.\n */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n template: EssorComponent | HTMLTemplateElement | K | '',\n props?: Props,\n key?: string,\n): JSX.Element {\n if (isString(template)) {\n if (isHtmlTagName(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n } else if (template === EMPTY_TEMPLATE) {\n props = { [FRAGMENT_PROP_KEY]: props };\n return new TemplateNode(createTemplate(EMPTY_TEMPLATE), props, key);\n }\n }\n\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template as HTMLTemplateElement, props, key);\n}\n\n/**\n * Checks if the given node is an instance of `ComponentNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is an instance of `ComponentNode`, otherwise `false`.\n */\nexport function isComponent(node: unknown): node is ComponentNode {\n return node instanceof ComponentNode;\n}\n\n/**\n * Checks if the given node is a JSX element. A JSX element is either an instance\n * of `ComponentNode` or an instance of `TemplateNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is a JSX element, otherwise `false`.\n */\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\n/**\n * Creates an HTML template element from a given HTML string.\n *\n * @param html The HTML string to create a template from.\n * @returns A new HTML template element.\n */\nexport function createTemplate(html: string): HTMLTemplateElement {\n const template = document.createElement('template');\n template.innerHTML = closeHtmlTags(html);\n return template;\n}\n\n/**\n * @param props - An object containing the `children` prop.\n * @param props.children - The children to be rendered. Can be a single JSX element, string, number, boolean,\n * or an array of these. Falsy values in arrays will be filtered out.\n * @returns A JSX element representing the fragment, wrapping the filtered children.\n */\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(props: { children: T }) {\n return h(EMPTY_TEMPLATE, {\n children: isArray(props.children) ? props.children.filter(Boolean) : [props.children],\n });\n}\n","import { isSymbol } from '@estjs/shared';\nimport { type Signal, shallowSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('useProvide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function useInject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('useInject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n\n/**\n * Creates a reactive ref that can be used to reference a DOM node\n * or a component instance within the component function body.\n *\n * @returns a reactive ref signal\n *\n * @example\n * const inputRef = useRef<HTMLInputElement>()\n *\n * <input ref={inputRef} />\n *\n * inputRef.value // input element\n */\nexport function useRef<T>(): Signal<T | null> {\n return shallowSignal<T | null>(null);\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|
package/dist/template.dev.cjs.js
CHANGED
|
@@ -4,7 +4,7 @@ var shared = require('@estjs/shared');
|
|
|
4
4
|
var signal = require('@estjs/signal');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* @estjs/template v0.0.14-beta.
|
|
7
|
+
* @estjs/template v0.0.14-beta.6
|
|
8
8
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
9
9
|
* @license MIT
|
|
10
10
|
**/
|
|
@@ -385,7 +385,7 @@ var ComponentNode = class extends LifecycleContext {
|
|
|
385
385
|
}
|
|
386
386
|
createProxyProps(props) {
|
|
387
387
|
if (!props) return {};
|
|
388
|
-
return signal.
|
|
388
|
+
return signal.signalObject(
|
|
389
389
|
props,
|
|
390
390
|
(key) => shared.startsWith(key, EVENT_PREFIX) || shared.startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP
|
|
391
391
|
);
|
|
@@ -407,7 +407,7 @@ var ComponentNode = class extends LifecycleContext {
|
|
|
407
407
|
return (_b = (_a = this.rootNode) == null ? void 0 : _a.mount(parent, before)) != null ? _b : [];
|
|
408
408
|
}
|
|
409
409
|
this.initRef();
|
|
410
|
-
this.rootNode = this.template(this.proxyProps);
|
|
410
|
+
this.rootNode = this.template(signal.useReactive(this.proxyProps, ["children"]));
|
|
411
411
|
const mountedNode = (_d = (_c = this.rootNode) == null ? void 0 : _c.mount(parent, before)) != null ? _d : [];
|
|
412
412
|
this.callMountHooks();
|
|
413
413
|
this.patchProps(this.props);
|
|
@@ -485,13 +485,19 @@ var ComponentNode = class extends LifecycleContext {
|
|
|
485
485
|
this.props[key] = extractSignal(prop);
|
|
486
486
|
}
|
|
487
487
|
patchNormalProp(key, prop) {
|
|
488
|
+
var _a, _b;
|
|
489
|
+
const newValue = (_b = (_a = this.proxyProps)[key]) != null ? _b : _a[key] = signal.useSignal(prop);
|
|
488
490
|
const track = this.getNodeTrack(key);
|
|
489
491
|
track.cleanup = signal.useEffect(() => {
|
|
490
|
-
|
|
492
|
+
newValue.value = shared.isFunction(prop) ? prop() : prop;
|
|
491
493
|
});
|
|
492
494
|
}
|
|
493
495
|
};
|
|
494
496
|
|
|
497
|
+
// ../shared/src/comm.ts
|
|
498
|
+
var _toString = Object.prototype.toString;
|
|
499
|
+
var isPlainObject = (val) => _toString.call(val) === "[object Object]";
|
|
500
|
+
|
|
495
501
|
// src/patch.ts
|
|
496
502
|
function patchChildren(parent, childrenMap, nextChildren, before) {
|
|
497
503
|
const result = /* @__PURE__ */ new Map();
|
|
@@ -806,7 +812,8 @@ var TemplateNode = class {
|
|
|
806
812
|
setAttribute(element, attr, triggerValue.value);
|
|
807
813
|
const cleanup = signal.useEffect(() => {
|
|
808
814
|
const val2 = shared.isFunction(value) ? value() : value;
|
|
809
|
-
if (JSON.stringify(triggerValue.value) === JSON.stringify(val2))
|
|
815
|
+
if (isPlainObject(val2) && isPlainObject(triggerValue.peek()) && JSON.stringify(triggerValue.value) === JSON.stringify(val2))
|
|
816
|
+
return;
|
|
810
817
|
triggerValue.value = signal.isSignal(val2) ? val2.value : val2;
|
|
811
818
|
setAttribute(element, attr, triggerValue.value);
|
|
812
819
|
});
|
package/dist/template.dev.esm.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isString, isFunction, isArray, isSymbol, escape, startsWith, isPrimitive, capitalize, isNil, isHTMLElement, coerceArray, isFalsy, kebabCase } from '@estjs/shared';
|
|
2
|
-
import { shallowSignal, isSignal,
|
|
2
|
+
import { shallowSignal, isSignal, signalObject, useReactive, useSignal, useEffect } from '@estjs/signal';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* @estjs/template v0.0.14-beta.
|
|
5
|
+
* @estjs/template v0.0.14-beta.6
|
|
6
6
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
7
7
|
* @license MIT
|
|
8
8
|
**/
|
|
@@ -383,7 +383,7 @@ var ComponentNode = class extends LifecycleContext {
|
|
|
383
383
|
}
|
|
384
384
|
createProxyProps(props) {
|
|
385
385
|
if (!props) return {};
|
|
386
|
-
return
|
|
386
|
+
return signalObject(
|
|
387
387
|
props,
|
|
388
388
|
(key) => startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP
|
|
389
389
|
);
|
|
@@ -405,7 +405,7 @@ var ComponentNode = class extends LifecycleContext {
|
|
|
405
405
|
return (_b = (_a = this.rootNode) == null ? void 0 : _a.mount(parent, before)) != null ? _b : [];
|
|
406
406
|
}
|
|
407
407
|
this.initRef();
|
|
408
|
-
this.rootNode = this.template(this.proxyProps);
|
|
408
|
+
this.rootNode = this.template(useReactive(this.proxyProps, ["children"]));
|
|
409
409
|
const mountedNode = (_d = (_c = this.rootNode) == null ? void 0 : _c.mount(parent, before)) != null ? _d : [];
|
|
410
410
|
this.callMountHooks();
|
|
411
411
|
this.patchProps(this.props);
|
|
@@ -483,13 +483,19 @@ var ComponentNode = class extends LifecycleContext {
|
|
|
483
483
|
this.props[key] = extractSignal(prop);
|
|
484
484
|
}
|
|
485
485
|
patchNormalProp(key, prop) {
|
|
486
|
+
var _a, _b;
|
|
487
|
+
const newValue = (_b = (_a = this.proxyProps)[key]) != null ? _b : _a[key] = useSignal(prop);
|
|
486
488
|
const track = this.getNodeTrack(key);
|
|
487
489
|
track.cleanup = useEffect(() => {
|
|
488
|
-
|
|
490
|
+
newValue.value = isFunction(prop) ? prop() : prop;
|
|
489
491
|
});
|
|
490
492
|
}
|
|
491
493
|
};
|
|
492
494
|
|
|
495
|
+
// ../shared/src/comm.ts
|
|
496
|
+
var _toString = Object.prototype.toString;
|
|
497
|
+
var isPlainObject = (val) => _toString.call(val) === "[object Object]";
|
|
498
|
+
|
|
493
499
|
// src/patch.ts
|
|
494
500
|
function patchChildren(parent, childrenMap, nextChildren, before) {
|
|
495
501
|
const result = /* @__PURE__ */ new Map();
|
|
@@ -804,7 +810,8 @@ var TemplateNode = class {
|
|
|
804
810
|
setAttribute(element, attr, triggerValue.value);
|
|
805
811
|
const cleanup = useEffect(() => {
|
|
806
812
|
const val2 = isFunction(value) ? value() : value;
|
|
807
|
-
if (JSON.stringify(triggerValue.value) === JSON.stringify(val2))
|
|
813
|
+
if (isPlainObject(val2) && isPlainObject(triggerValue.peek()) && JSON.stringify(triggerValue.value) === JSON.stringify(val2))
|
|
814
|
+
return;
|
|
808
815
|
triggerValue.value = isSignal(val2) ? val2.value : val2;
|
|
809
816
|
setAttribute(element, attr, triggerValue.value);
|
|
810
817
|
});
|
package/dist/template.esm.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { isString, isFunction, isArray, escape, startsWith, isPrimitive, capitalize, isNil, isHTMLElement, coerceArray, isFalsy, kebabCase } from '@estjs/shared';
|
|
2
|
-
import { shallowSignal, isSignal,
|
|
2
|
+
import { shallowSignal, isSignal, signalObject, useReactive, useSignal, useEffect } from '@estjs/signal';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* @estjs/template v0.0.14-beta.
|
|
5
|
+
* @estjs/template v0.0.14-beta.6
|
|
6
6
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
7
7
|
* @license MIT
|
|
8
8
|
**/
|
|
9
|
-
var G="on",F="update",v="children",R="",H="0",z="1";var A=" __PLACEHOLDER__ ";var D=class{constructor(){this.renderMode=0;}get isSSG(){return this.renderMode===1}get isSSR(){return this.renderMode===2}get isClient(){return this.renderMode===0}setSSR(){this.renderMode=2;}setSSG(){this.renderMode=1;}setClient(){this.renderMode=0;}},m=new D,q=new Map;function W(o,t){q.set(o,{index:t});}function Q(o){var t;return (t=q.get(o))==null?void 0:t.index}var T=class T{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(t,e){var n;(n=this.hooks[t])==null||n.add(e);}getContext(t){return T.context[t]}setContext(t,e){T.context[t]=e;}initRef(){T.ref=this;}removeRef(){T.ref=null;}clearHooks(){Object.values(this.hooks).forEach(t=>t.clear());}};T.ref=null,T.context={};var u=T;function O(o){return o instanceof M}var C=1,M=class extends u{constructor(e,n={},r){super();this.template=e;this.props=n;this.key=r;W(e,C),this.templates=this.processTemplate();}processTemplate(){if(isArray(this.template)){let e=this.template.join(A);return this.processHtmlString(e).split(A)}return []}processHtmlString(e){return e.replaceAll(/(<[^>]+>)|([^<]+)/g,(n,r,i)=>r?r.includes("data-ci")?n:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,a,l)=>`<${a} data-ci="${C}"${l||""}>`):i&&i.replace(A,"").trim()?`<!--0-${C}-->${i}<!$>`:n)}mount(){this.initRef();let e=this.render();return this.removeRef(),e}render(){if(isFunction(this.template)){let e=this.template(this.props);return O(e)?e.mount():String(e)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([e,n])=>{let r=n.children;this.normalizeProps(n);let i=this.templates.findIndex(s=>s.includes(`data-hk="${e}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${e}"`,`data-hk="${e}" ${this.generateAttributes(n)}`);}),this.templates.join("")}normalizeProps(e){Object.entries(e).forEach(([n,r])=>{n==="children"||isFunction(r)?delete e[n]:isSignal(r)&&(e[n]=r.value);});}generateAttributes(e){return Object.entries(e).filter(([n,r])=>n!=="children"&&!isFunction(r)).map(([n,r])=>`${n}="${escape(String(r))}"`).join(" ")}renderChildren(e,n){e.forEach(([r])=>{C++;let i=this.renderChild(r);this.templates[n]+=i;});}renderChild(e){if(isFunction(e))return this.renderChild(e(this.props));if(isSignal(e))return `<!--1-${C}-->${e.value}<!$>`;if(O(e)){let n=e.mount();return isFunction(n)?n(this.props):_(n)}else return `<!--1-${C}-->${e}<!$>`}};var te="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(","),ge="a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp".split(",");function J(o){if(f(o)||o instanceof Node||O(o))return o;let t=isFalsy(o)?"":String(o);return document.createTextNode(t)}function E(o,t,e=null){let n=f(e)?e.firstChild:e,r=m.isSSR;f(t)?t.mount(o,n):n&&!r?n.before(t):r||o.append(t);}function S(o){f(o)?o.unmount():o.parentNode&&o.remove();}function V(o,t,e){E(o,t,e),S(e);}function U(o,t,e){t==="class"?Ee(o,e):t==="style"?Te(o,e):ve(o,t,e);}function Ee(o,t){typeof t=="string"?o.className=t:isArray(t)?o.className=t.join(" "):t&&typeof t=="object"&&(o.className=Object.entries(t).reduce((e,[n,r])=>e+(r?` ${n}`:""),"").trim());}function Te(o,t){typeof t=="string"?o.style.cssText=t:t&&typeof t=="object"&&Object.entries(t).forEach(([n,r])=>{o.style.setProperty(kebabCase(n),String(r));});}function ve(o,t,e){isFalsy(e)?o.removeAttribute(t):e===!0?o.setAttribute(t,""):o instanceof HTMLInputElement&&t==="value"?o.value=String(e):o.setAttribute(t,String(e));}function ne(o,t){if(o instanceof HTMLInputElement)switch(o.type){case"checkbox":return h(o,"change",()=>{t(!!o.checked);});case"date":return h(o,"change",()=>{t(o.value?o.value:"");});case"file":return h(o,"change",()=>{o.files&&t(o.files);});case"number":return h(o,"input",()=>{let e=Number.parseFloat(o.value);t(Number.isNaN(e)?"":String(e));});case"radio":return h(o,"change",()=>{t(o.checked?o.value:"");});case"text":return h(o,"input",()=>{t(o.value);})}if(o instanceof HTMLSelectElement)return h(o,"change",()=>{t(o.value);});if(o instanceof HTMLTextAreaElement)return h(o,"input",()=>{t(o.value);})}Promise.resolve();function h(o,t,e){return o.addEventListener(t,e),()=>o.removeEventListener(t,e)}function oe(o){let t=[],e=[],n=/<\/?([\da-z-]+)([^>]*)>/gi,r=0;for(;;){let i=n.exec(o);if(!i)break;let[s,a]=i,l=s[1]==="/";if(e.push(o.slice(r,i.index)),r=i.index+s.length,l){for(;t.length>0&&t[t.length-1]!==a;){let c=t.pop();c&&e.push(`</${c}>`);}t.length>0&&t.pop();}else te.includes(a)||t.push(a);e.push(s);}for(e.push(o.slice(r));t.length>0;){let i=t.pop();i&&e.push(`</${i}>`);}return e.join("")}function re(o){return ge.includes(o)}function ie(o){return te.includes(o)?`<${o}/>`:`<${o}></${o}>`}function _(o){return isSignal(o)?o.value:o}var k=class extends u{constructor(e,n,r){super();this.template=e;this.props=n;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=n==null?void 0:n.key),this.proxyProps=this.createProxyProps(n);}createProxyProps(e){return e?shallowReactive(e,n=>startsWith(n,G)||startsWith(n,F)||n===v):{}}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}mount(e,n){var i,s,a,l;if(!isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(i=this.rootNode)==null?void 0:i.mount(e,n))!=null?s:[];this.initRef(),this.rootNode=this.template(this.proxyProps);let r=(l=(a=this.rootNode)==null?void 0:a.mount(e,n))!=null?l:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var e;this.callDestroyHooks(),this.clearHooks(),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(e=>e());}callDestroyHooks(){this.hooks.destroy.forEach(e=>e());}clearEmitter(){for(let e of this.emitter)e();this.emitter.clear();}inheritNode(e){Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap,this.hooks=e.hooks;let n=this.props;this.props=e.props,this.patchProps(n);}getNodeTrack(e){let n=this.trackMap.get(e);return n||(n={cleanup:()=>{}},this.trackMap.set(e,n)),n.cleanup(),n}patchProps(e){var n;if(e){for(let[r,i]of Object.entries(e))startsWith(r,G)&&((n=this.rootNode)!=null&&n.firstChild)?this.patchEventListener(r,i):r==="ref"?this.patchRef(i):startsWith(r,F)?this.patchUpdateHandler(r,i):r!==v&&this.patchNormalProp(r,i);this.props=e;}}patchEventListener(e,n){let r=e.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,n);this.emitter.add(i);}patchRef(e){var n,r;e.value=(r=(n=this.rootNode)==null?void 0:n.firstChild)!=null?r:null;}patchUpdateHandler(e,n){this.props[e]=_(n);}patchNormalProp(e,n){let r=this.getNodeTrack(e);r.cleanup=useEffect(()=>{this.proxyProps[e]=isFunction(n)?n():n;});}};function ae(o,t,e,n){let r=new Map,i=Array.from(t.values());if(i.length&&e.length===0)return xe(o,i,n),r;let s=[],a=Ce(e),l=0;for(let[c,p]of e.entries()){let d=i[l],b=y(d,c);for(;d&&!a.has(b);)S(d),t.delete(b),d=i[++l],b=y(d,c);let Y=y(p,c),X=t.get(Y);if(X&&(p=be(o,X,p)),d)if(d===X)l++;else {let B=document.createComment("");E(o,B,d),s.push([B,p]);}else E(o,p,n);r.set(Y,p);}return s.forEach(([c,p])=>{V(o,p,c);}),t.forEach((c,p)=>{c.isConnected&&!r.has(p)&&S(c);}),r}function xe(o,t,e){if(o.childNodes.length===t.length+(e?1:0))o.innerHTML="",e&&E(o,e);else {let n=document.createRange(),r=t[0],i=f(r)?r.firstChild:r;n.setStartBefore(i),e?n.setEndBefore(e):n.setEndAfter(o),n.deleteContents();}t.forEach(n=>{f(n)&&n.unmount();});}function be(o,t,e){return t===e?t:f(t)&&f(e)&&t.template===e.template?(e.inheritNode(t),e):t instanceof Text&&e instanceof Text?(t.textContent!==e.textContent&&(t.textContent=e.textContent),t):(V(o,e,t),e)}function Ce(o){let t=new Map;for(let[e,n]of o.entries()){let r=y(n,e);t.set(r,n);}return t}function y(o,t){if(f(o)){let e=o.key;if(e!=null)return String(e)}return `_$${t}$`}var x=class{constructor(t,e,n){this.template=t;this.props=e;this.key=n;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;this.key||(this.key=e==null?void 0:e.key),m.isSSR&&(this.componentIndex=Q(this.template));}get firstChild(){var t;return (t=this.nodes[0])!=null?t:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(t,e){var i;if(this.parent=t,this.isConnected)return this.nodes.forEach(s=>E(t,s,e)),this.nodes;isArray(this.template)&&(this.template=L(this.template.join("")));let n=this.template.content.cloneNode(!0),r=n.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r==null||r.childNodes.forEach(s=>{n.append(s);})),this.nodes=Array.from(n.childNodes),m.isSSR?this.mapSSGNodeTree(t):this.mapNodeTree(t,n),E(t,n,e),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){var t,e;if(this.trackMap.forEach(n=>{var r;(r=n.cleanup)==null||r.call(n);}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(n=>S(n)),!this.template.innerHTML&&!this.nodes.length){let n=(e=(t=this.props)==null?void 0:t[H])==null?void 0:e.children;n&&(isArray(n)?n.forEach(r=>{this.deleteFragmentTextNode(r);}):this.deleteFragmentTextNode(n));}this.nodes=[],this.mounted=!1;}deleteFragmentTextNode(t){var e;isPrimitive(t)?(e=this.parent)==null||e.childNodes.forEach(n=>{var r;n.nodeType===Node.TEXT_NODE&&n.textContent===`${t}`&&((r=this.parent)==null||r.removeChild(n));}):S(t);}inheritNode(t){this.mounted=t.mounted,this.nodes=t.nodes,this.trackMap=t.trackMap,this.treeMap=t.treeMap;let e=this.props;this.props=t.props,this.patchProps(e);}mapSSGNodeTree(t){this.treeMap.set(0,t),this.walkNodeTree(t,this.handleSSGNode.bind(this));}mapNodeTree(t,e){let n=1;this.treeMap.set(0,t);let r=[t],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(n++,s),r.push(s));};this.walkNodeTree(e,i);}walkNodeTree(t,e){t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&e(t);let n=t.firstChild;for(;n;)this.walkNodeTree(n,e),n=n.nextSibling;}handleSSGNode(t){var e;if(t.nodeType===Node.COMMENT_NODE){let[n,r]=((e=t.textContent)==null?void 0:e.split("-"))||[];if(0===+n&&+r===this.componentIndex){let i=t.nextSibling;this.treeMap.set(+r,i);}}else if(t.nodeType!==Node.TEXT_NODE){let{ci:n="-1",hk:r}=(t==null?void 0:t.dataset)||{};r&&+n===this.componentIndex&&this.treeMap.set(+r,t);}}patchProps(t){t&&(Object.entries(t).forEach(([e,n])=>{let r=Number(e),i=this.treeMap.get(r);i&&this.patchProp(e,i,n,r===0);}),this.props=t);}patchProp(t,e,n,r){n&&Object.entries(n).forEach(([i,s])=>{if(i===v&&s)this.patchChildren(t,e,s,r);else if(i==="ref")n[i].value=e;else if(startsWith(i,"on"))this.patchEventListener(t,e,i,s);else {if(this.bindValueKeys.includes(i))return;let a=this.getBindUpdateValue(n,t,i);this.patchAttribute(t,e,i,s,a);}});}getBindUpdateValue(t,e,n){let i=`update${capitalize(n)}`;if(i&&t[i]&&isFunction(t[i]))return this.bindValueKeys.push(i),t[i]}patchChildren(t,e,n,r){if(isArray(n))n.filter(Boolean).forEach((i,s)=>{var b;let[a,l]=isArray(i)?i:[i,null],c=isNil(l)?null:(b=this.treeMap.get(l))!=null?b:null,p=`${t}:${v}:${s}`,d=this.getNodeTrack(p,!0,r);this.patchChild(d,e,a,c);});else {let i=`${t}:${v}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,e,n,null);}}patchEventListener(t,e,n,r){let i=n.slice(2).toLowerCase(),s=this.getNodeTrack(`${t}:${n}`);s.cleanup=h(e,i,r);}patchAttribute(t,e,n,r,i){let s=this.getNodeTrack(`${t}:${n}`),a=isFunction(r)?r():r,l=isSignal(a)?a:shallowSignal(a);U(e,n,l.value);let c=useEffect(()=>{let d=isFunction(r)?r():r;JSON.stringify(l.value)!==JSON.stringify(d)&&(l.value=isSignal(d)?d.value:d,U(e,n,l.value));}),p;i&&isHTMLElement(e)&&(p=ne(e,d=>{i(d);})),s.cleanup=()=>{c&&c(),p&&p();};}getNodeTrack(t,e,n){var i;let r=this.trackMap.get(t);return r||(r={cleanup:()=>{}},e&&(r.lastNodes=new Map),n&&(r.isRoot=!0),this.trackMap.set(t,r)),(i=r.cleanup)==null||i.call(r),r}patchChild(t,e,n,r){isFunction(n)?t.cleanup=useEffect(()=>{let i=coerceArray(n()).map(J);m.isSSR?t.lastNodes=this.reconcileChildren(e,i,r):t.lastNodes=ae(e,t.lastNodes,i,r);}):coerceArray(n).forEach((i,s)=>{let a=J(i),l=y(a,s);m.isSSR?t.lastNodes=this.reconcileChildren(e,[a],r):(t.lastNodes.set(l,a),E(e,a,r));});}reconcileChildren(t,e,n){let r=new Map,i=Array.from(t.childNodes).filter(s=>{var a,l;return s.nodeType===Node.TEXT_NODE&&((a=s.previousSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&((l=s.nextSibling)==null?void 0:l.nodeType)===Node.COMMENT_NODE});return e.forEach((s,a)=>{let l=y(s,a);s.nodeType===Node.TEXT_NODE?i.forEach(c=>{s.textContent===c.textContent&&t.replaceChild(s,c);}):E(t,s,n),r.set(l,s);}),r}};function w(o,t,e){if(isString(o)){if(re(o)){let n=ie(o);return t={[z]:t},new x(L(n),t,e)}else if(o===R)return t={[H]:t},new x(L(R),t,e)}return isFunction(o)?new k(o,t,e):new x(o,t,e)}function _e(o){return o instanceof k}function f(o){return o instanceof k||o instanceof x}function L(o){let t=document.createElement("template");return t.innerHTML=oe(o),t}function $e(o){return w(R,{children:isArray(o.children)?o.children.filter(Boolean):[o.children]})}function je(o){u.ref&&u.ref.addHook("mounted",o);}function Ke(o){u.ref&&u.ref.addHook("destroy",o);}function Xe(o,t){u.ref&&u.ref.setContext(o,t);}function De(o,t){var e;return (e=u.ref&&u.ref.getContext(o))!=null?e:t}function Ge(){return shallowSignal(null)}function Fe(o,t){m.setSSG();let n=new M(o,t||{}).mount();return m.setClient(),n}function Je(o,t){let e=typeof t=="string"?document.querySelector(t):t;if(!e)throw new Error(`Could not find container: ${t}`);m.setSSR(),w(o).mount(e),m.setClient();}function Ve(o,t){return m.isSSG?new M(o,t):w(o,t)}
|
|
9
|
+
var D="on",G="update",y="children",R="",A="0",q="1";var O=" __PLACEHOLDER__ ";var X=class{constructor(){this.renderMode=0;}get isSSG(){return this.renderMode===1}get isSSR(){return this.renderMode===2}get isClient(){return this.renderMode===0}setSSR(){this.renderMode=2;}setSSG(){this.renderMode=1;}setClient(){this.renderMode=0;}},m=new X,z=new Map;function Q(o,t){z.set(o,{index:t});}function Z(o){var t;return (t=z.get(o))==null?void 0:t.index}var T=class T{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(t,e){var n;(n=this.hooks[t])==null||n.add(e);}getContext(t){return T.context[t]}setContext(t,e){T.context[t]=e;}initRef(){T.ref=this;}removeRef(){T.ref=null;}clearHooks(){Object.values(this.hooks).forEach(t=>t.clear());}};T.ref=null,T.context={};var d=T;function H(o){return o instanceof k}var M=1,k=class extends d{constructor(e,n={},r){super();this.template=e;this.props=n;this.key=r;Q(e,M),this.templates=this.processTemplate();}processTemplate(){if(isArray(this.template)){let e=this.template.join(O);return this.processHtmlString(e).split(O)}return []}processHtmlString(e){return e.replaceAll(/(<[^>]+>)|([^<]+)/g,(n,r,i)=>r?r.includes("data-ci")?n:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,a,l)=>`<${a} data-ci="${M}"${l||""}>`):i&&i.replace(O,"").trim()?`<!--0-${M}-->${i}<!$>`:n)}mount(){this.initRef();let e=this.render();return this.removeRef(),e}render(){if(isFunction(this.template)){let e=this.template(this.props);return H(e)?e.mount():String(e)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([e,n])=>{let r=n.children;this.normalizeProps(n);let i=this.templates.findIndex(s=>s.includes(`data-hk="${e}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${e}"`,`data-hk="${e}" ${this.generateAttributes(n)}`);}),this.templates.join("")}normalizeProps(e){Object.entries(e).forEach(([n,r])=>{n==="children"||isFunction(r)?delete e[n]:isSignal(r)&&(e[n]=r.value);});}generateAttributes(e){return Object.entries(e).filter(([n,r])=>n!=="children"&&!isFunction(r)).map(([n,r])=>`${n}="${escape(String(r))}"`).join(" ")}renderChildren(e,n){e.forEach(([r])=>{M++;let i=this.renderChild(r);this.templates[n]+=i;});}renderChild(e){if(isFunction(e))return this.renderChild(e(this.props));if(isSignal(e))return `<!--1-${M}-->${e.value}<!$>`;if(H(e)){let n=e.mount();return isFunction(n)?n(this.props):j(n)}else return `<!--1-${M}-->${e}<!$>`}};var ne="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(","),Te="a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp".split(",");function J(o){if(N(o)||o instanceof Node||H(o))return o;let t=isFalsy(o)?"":String(o);return document.createTextNode(t)}function E(o,t,e=null){let n=N(e)?e.firstChild:e,r=m.isSSR;N(t)?t.mount(o,n):n&&!r?n.before(t):r||o.append(t);}function x(o){N(o)?o.unmount():o.parentNode&&o.remove();}function V(o,t,e){E(o,t,e),x(e);}function U(o,t,e){t==="class"?ye(o,e):t==="style"?xe(o,e):ve(o,t,e);}function ye(o,t){typeof t=="string"?o.className=t:isArray(t)?o.className=t.join(" "):t&&typeof t=="object"&&(o.className=Object.entries(t).reduce((e,[n,r])=>e+(r?` ${n}`:""),"").trim());}function xe(o,t){typeof t=="string"?o.style.cssText=t:t&&typeof t=="object"&&Object.entries(t).forEach(([n,r])=>{o.style.setProperty(kebabCase(n),String(r));});}function ve(o,t,e){isFalsy(e)?o.removeAttribute(t):e===!0?o.setAttribute(t,""):o instanceof HTMLInputElement&&t==="value"?o.value=String(e):o.setAttribute(t,String(e));}function oe(o,t){if(o instanceof HTMLInputElement)switch(o.type){case"checkbox":return g(o,"change",()=>{t(!!o.checked);});case"date":return g(o,"change",()=>{t(o.value?o.value:"");});case"file":return g(o,"change",()=>{o.files&&t(o.files);});case"number":return g(o,"input",()=>{let e=Number.parseFloat(o.value);t(Number.isNaN(e)?"":String(e));});case"radio":return g(o,"change",()=>{t(o.checked?o.value:"");});case"text":return g(o,"input",()=>{t(o.value);})}if(o instanceof HTMLSelectElement)return g(o,"change",()=>{t(o.value);});if(o instanceof HTMLTextAreaElement)return g(o,"input",()=>{t(o.value);})}Promise.resolve();function g(o,t,e){return o.addEventListener(t,e),()=>o.removeEventListener(t,e)}function re(o){let t=[],e=[],n=/<\/?([\da-z-]+)([^>]*)>/gi,r=0;for(;;){let i=n.exec(o);if(!i)break;let[s,a]=i,l=s[1]==="/";if(e.push(o.slice(r,i.index)),r=i.index+s.length,l){for(;t.length>0&&t[t.length-1]!==a;){let c=t.pop();c&&e.push(`</${c}>`);}t.length>0&&t.pop();}else ne.includes(a)||t.push(a);e.push(s);}for(e.push(o.slice(r));t.length>0;){let i=t.pop();i&&e.push(`</${i}>`);}return e.join("")}function ie(o){return Te.includes(o)}function se(o){return ne.includes(o)?`<${o}/>`:`<${o}></${o}>`}function j(o){return isSignal(o)?o.value:o}var C=class extends d{constructor(e,n,r){super();this.template=e;this.props=n;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=n==null?void 0:n.key),this.proxyProps=this.createProxyProps(n);}createProxyProps(e){return e?signalObject(e,n=>startsWith(n,D)||startsWith(n,G)||n===y):{}}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}mount(e,n){var i,s,a,l;if(!isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(i=this.rootNode)==null?void 0:i.mount(e,n))!=null?s:[];this.initRef(),this.rootNode=this.template(useReactive(this.proxyProps,["children"]));let r=(l=(a=this.rootNode)==null?void 0:a.mount(e,n))!=null?l:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var e;this.callDestroyHooks(),this.clearHooks(),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(e=>e());}callDestroyHooks(){this.hooks.destroy.forEach(e=>e());}clearEmitter(){for(let e of this.emitter)e();this.emitter.clear();}inheritNode(e){Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap,this.hooks=e.hooks;let n=this.props;this.props=e.props,this.patchProps(n);}getNodeTrack(e){let n=this.trackMap.get(e);return n||(n={cleanup:()=>{}},this.trackMap.set(e,n)),n.cleanup(),n}patchProps(e){var n;if(e){for(let[r,i]of Object.entries(e))startsWith(r,D)&&((n=this.rootNode)!=null&&n.firstChild)?this.patchEventListener(r,i):r==="ref"?this.patchRef(i):startsWith(r,G)?this.patchUpdateHandler(r,i):r!==y&&this.patchNormalProp(r,i);this.props=e;}}patchEventListener(e,n){let r=e.slice(2).toLowerCase(),i=g(this.rootNode.nodes[0],r,n);this.emitter.add(i);}patchRef(e){var n,r;e.value=(r=(n=this.rootNode)==null?void 0:n.firstChild)!=null?r:null;}patchUpdateHandler(e,n){this.props[e]=j(n);}patchNormalProp(e,n){var s,a;let r=(a=(s=this.proxyProps)[e])!=null?a:s[e]=useSignal(n),i=this.getNodeTrack(e);i.cleanup=useEffect(()=>{r.value=isFunction(n)?n():n;});}};var le=Object.prototype.toString;var B=o=>le.call(o)==="[object Object]";function ce(o,t,e,n){let r=new Map,i=Array.from(t.values());if(i.length&&e.length===0)return Ce(o,i,n),r;let s=[],a=we(e),l=0;for(let[c,u]of e.entries()){let p=i[l],b=v(p,c);for(;p&&!a.has(b);)x(p),t.delete(b),p=i[++l],b=v(p,c);let W=v(u,c),K=t.get(W);if(K&&(u=Pe(o,K,u)),p)if(p===K)l++;else {let Y=document.createComment("");E(o,Y,p),s.push([Y,u]);}else E(o,u,n);r.set(W,u);}return s.forEach(([c,u])=>{V(o,u,c);}),t.forEach((c,u)=>{c.isConnected&&!r.has(u)&&x(c);}),r}function Ce(o,t,e){if(o.childNodes.length===t.length+(e?1:0))o.innerHTML="",e&&E(o,e);else {let n=document.createRange(),r=t[0],i=N(r)?r.firstChild:r;n.setStartBefore(i),e?n.setEndBefore(e):n.setEndAfter(o),n.deleteContents();}t.forEach(n=>{N(n)&&n.unmount();});}function Pe(o,t,e){return t===e?t:N(t)&&N(e)&&t.template===e.template?(e.inheritNode(t),e):t instanceof Text&&e instanceof Text?(t.textContent!==e.textContent&&(t.textContent=e.textContent),t):(V(o,e,t),e)}function we(o){let t=new Map;for(let[e,n]of o.entries()){let r=v(n,e);t.set(r,n);}return t}function v(o,t){if(N(o)){let e=o.key;if(e!=null)return String(e)}return `_$${t}$`}var S=class{constructor(t,e,n){this.template=t;this.props=e;this.key=n;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;this.key||(this.key=e==null?void 0:e.key),m.isSSR&&(this.componentIndex=Z(this.template));}get firstChild(){var t;return (t=this.nodes[0])!=null?t:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(t,e){var i;if(this.parent=t,this.isConnected)return this.nodes.forEach(s=>E(t,s,e)),this.nodes;isArray(this.template)&&(this.template=w(this.template.join("")));let n=this.template.content.cloneNode(!0),r=n.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r==null||r.childNodes.forEach(s=>{n.append(s);})),this.nodes=Array.from(n.childNodes),m.isSSR?this.mapSSGNodeTree(t):this.mapNodeTree(t,n),E(t,n,e),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){var t,e;if(this.trackMap.forEach(n=>{var r;(r=n.cleanup)==null||r.call(n);}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(n=>x(n)),!this.template.innerHTML&&!this.nodes.length){let n=(e=(t=this.props)==null?void 0:t[A])==null?void 0:e.children;n&&(isArray(n)?n.forEach(r=>{this.deleteFragmentTextNode(r);}):this.deleteFragmentTextNode(n));}this.nodes=[],this.mounted=!1;}deleteFragmentTextNode(t){var e;isPrimitive(t)?(e=this.parent)==null||e.childNodes.forEach(n=>{var r;n.nodeType===Node.TEXT_NODE&&n.textContent===`${t}`&&((r=this.parent)==null||r.removeChild(n));}):x(t);}inheritNode(t){this.mounted=t.mounted,this.nodes=t.nodes,this.trackMap=t.trackMap,this.treeMap=t.treeMap;let e=this.props;this.props=t.props,this.patchProps(e);}mapSSGNodeTree(t){this.treeMap.set(0,t),this.walkNodeTree(t,this.handleSSGNode.bind(this));}mapNodeTree(t,e){let n=1;this.treeMap.set(0,t);let r=[t],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(n++,s),r.push(s));};this.walkNodeTree(e,i);}walkNodeTree(t,e){t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&e(t);let n=t.firstChild;for(;n;)this.walkNodeTree(n,e),n=n.nextSibling;}handleSSGNode(t){var e;if(t.nodeType===Node.COMMENT_NODE){let[n,r]=((e=t.textContent)==null?void 0:e.split("-"))||[];if(0===+n&&+r===this.componentIndex){let i=t.nextSibling;this.treeMap.set(+r,i);}}else if(t.nodeType!==Node.TEXT_NODE){let{ci:n="-1",hk:r}=(t==null?void 0:t.dataset)||{};r&&+n===this.componentIndex&&this.treeMap.set(+r,t);}}patchProps(t){t&&(Object.entries(t).forEach(([e,n])=>{let r=Number(e),i=this.treeMap.get(r);i&&this.patchProp(e,i,n,r===0);}),this.props=t);}patchProp(t,e,n,r){n&&Object.entries(n).forEach(([i,s])=>{if(i===y&&s)this.patchChildren(t,e,s,r);else if(i==="ref")n[i].value=e;else if(startsWith(i,"on"))this.patchEventListener(t,e,i,s);else {if(this.bindValueKeys.includes(i))return;let a=this.getBindUpdateValue(n,t,i);this.patchAttribute(t,e,i,s,a);}});}getBindUpdateValue(t,e,n){let i=`update${capitalize(n)}`;if(i&&t[i]&&isFunction(t[i]))return this.bindValueKeys.push(i),t[i]}patchChildren(t,e,n,r){if(isArray(n))n.filter(Boolean).forEach((i,s)=>{var b;let[a,l]=isArray(i)?i:[i,null],c=isNil(l)?null:(b=this.treeMap.get(l))!=null?b:null,u=`${t}:${y}:${s}`,p=this.getNodeTrack(u,!0,r);this.patchChild(p,e,a,c);});else {let i=`${t}:${y}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,e,n,null);}}patchEventListener(t,e,n,r){let i=n.slice(2).toLowerCase(),s=this.getNodeTrack(`${t}:${n}`);s.cleanup=g(e,i,r);}patchAttribute(t,e,n,r,i){let s=this.getNodeTrack(`${t}:${n}`),a=isFunction(r)?r():r,l=isSignal(a)?a:shallowSignal(a);U(e,n,l.value);let c=useEffect(()=>{let p=isFunction(r)?r():r;B(p)&&B(l.peek())&&JSON.stringify(l.value)===JSON.stringify(p)||(l.value=isSignal(p)?p.value:p,U(e,n,l.value));}),u;i&&isHTMLElement(e)&&(u=oe(e,p=>{i(p);})),s.cleanup=()=>{c&&c(),u&&u();};}getNodeTrack(t,e,n){var i;let r=this.trackMap.get(t);return r||(r={cleanup:()=>{}},e&&(r.lastNodes=new Map),n&&(r.isRoot=!0),this.trackMap.set(t,r)),(i=r.cleanup)==null||i.call(r),r}patchChild(t,e,n,r){isFunction(n)?t.cleanup=useEffect(()=>{let i=coerceArray(n()).map(J);m.isSSR?t.lastNodes=this.reconcileChildren(e,i,r):t.lastNodes=ce(e,t.lastNodes,i,r);}):coerceArray(n).forEach((i,s)=>{let a=J(i),l=v(a,s);m.isSSR?t.lastNodes=this.reconcileChildren(e,[a],r):(t.lastNodes.set(l,a),E(e,a,r));});}reconcileChildren(t,e,n){let r=new Map,i=Array.from(t.childNodes).filter(s=>{var a,l;return s.nodeType===Node.TEXT_NODE&&((a=s.previousSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&((l=s.nextSibling)==null?void 0:l.nodeType)===Node.COMMENT_NODE});return e.forEach((s,a)=>{let l=v(s,a);s.nodeType===Node.TEXT_NODE?i.forEach(c=>{s.textContent===c.textContent&&t.replaceChild(s,c);}):E(t,s,n),r.set(l,s);}),r}};function L(o,t,e){if(isString(o)){if(ie(o)){let n=se(o);return t={[q]:t},new S(w(n),t,e)}else if(o===R)return t={[A]:t},new S(w(R),t,e)}return isFunction(o)?new C(o,t,e):new S(o,t,e)}function Fe(o){return o instanceof C}function N(o){return o instanceof C||o instanceof S}function w(o){let t=document.createElement("template");return t.innerHTML=re(o),t}function Ke(o){return L(R,{children:isArray(o.children)?o.children.filter(Boolean):[o.children]})}function De(o){d.ref&&d.ref.addHook("mounted",o);}function Ge(o){d.ref&&d.ref.addHook("destroy",o);}function Je(o,t){d.ref&&d.ref.setContext(o,t);}function Ve(o,t){var e;return (e=d.ref&&d.ref.getContext(o))!=null?e:t}function Ue(){return shallowSignal(null)}function Be(o,t){m.setSSG();let n=new k(o,t||{}).mount();return m.setClient(),n}function We(o,t){let e=typeof t=="string"?document.querySelector(t):t;if(!e)throw new Error(`Could not find container: ${t}`);m.setSSR(),L(o).mount(e),m.setClient();}function Ye(o,t){return m.isSSG?new k(o,t):L(o,t)}
|
|
10
10
|
|
|
11
|
-
export {
|
|
11
|
+
export { Ke as Fragment, L as h, We as hydrate, Fe as isComponent, N as isJsxElement, Ge as onDestroy, De as onMount, Be as renderToString, Ye as ssg, w as template, Ve as useInject, Je as useProvide, Ue as useRef };
|
|
12
12
|
//# sourceMappingURL=template.esm.js.map
|
|
13
13
|
//# sourceMappingURL=template.esm.js.map
|
package/dist/template.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sharedConfig.ts","../src/lifecycleContext.ts","../src/ssgNode.ts","../src/utils.ts","../src/componentNode.ts","../src/patch.ts","../src/templateNode.ts","../src/jsxRenderer.ts","../src/hooks.ts","../src/server.ts"],"names":["EVENT_PREFIX","UPDATE_PREFIX","CHILDREN_PROP","EMPTY_TEMPLATE","FRAGMENT_PROP_KEY","SINGLE_PROP_KEY","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","HTML_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","closeHtmlTags","input","tagStack","tagPattern","lastIndex","fullMatch","isEndTag","unclosedTag","isHtmlTagName","convertToHtmlTag","signal","ComponentNode","shallowReactive","startsWith","_b","_c","_d","mountedNode","cleanup","trackKey","track","prop","event","useEffect","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","isPrimitive","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","val","triggerValue","shallowSignal","val2","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","h","isString","htmlTemplate","isComponent","html","Fragment","onMount","onDestroy","useProvide","useInject","defaultValue","useRef","renderToString","component","hydrate","container","rootElement","ssg"],"mappings":";;;;;;;;AAaO,IAAMA,CAAAA,CAAe,IACfC,CAAAA,CAAAA,CAAgB,QAChBC,CAAAA,CAAAA,CAAgB,WAEhBC,CAAiB,CAAA,EAAA,CACjBC,EAAoB,GACpBC,CAAAA,CAAAA,CAAkB,IAGxB,IAAMC,CAAAA,CAAc,mBAS3B,CAAA,IAAMC,CAAN,CAAA,KAAoB,CAApB,WACE,EAAA,CAAA,IAAA,CAAA,UAAA,CAAa,EAEb,CAAA,IAAI,KAAQ,EAAA,CACV,OAAO,IAAK,CAAA,UAAA,GAAe,CAC7B,CAEA,IAAI,KAAA,EAAQ,CACV,OAAO,IAAA,CAAK,aAAe,CAC7B,CAEA,IAAI,QAAW,EAAA,CACb,OAAO,IAAA,CAAK,UAAe,GAAA,CAC7B,CAEA,MAAS,EAAA,CACP,IAAK,CAAA,UAAA,CAAa,EACpB,CAEA,QAAS,CACP,IAAA,CAAK,UAAa,CAAA,EACpB,CAEA,SAAA,EAAY,CACV,IAAK,CAAA,UAAA,CAAa,EACpB,CACF,CAAA,CAEaC,EAAgB,IAAID,CAAAA,CAE3BE,CAAe,CAAA,IAAI,GAGlB,CAAA,SAASC,EAAeC,CAAMC,CAAAA,CAAAA,CAAO,CAC1CH,CAAAA,CAAa,GAAIE,CAAAA,CAAAA,CAAM,CACrB,KAAAC,CAAAA,CACF,CAAC,EACH,CAGO,SAASC,EAAkBF,CAAM,CAAA,CAvExC,IAAAG,CAwEE,CAAA,OAAA,CAAOA,EAAAL,CAAa,CAAA,GAAA,CAAIE,CAAI,CAAA,GAArB,IAAAG,CAAAA,KAAAA,CAAAA,CAAAA,CAAAA,CAAwB,KACjC,CCtEO,IAAMC,CAAN,CAAA,MAAMA,CAAiB,CAAvB,WAAA,EAAA,CAQL,WAAuC,CACrC,OAAA,CAAS,IAAI,GAAA,CACb,OAAS,CAAA,IAAI,GACf,EAVA,CAAA,gBAAA,EAAyB,EACzB,mBAA4B,EAAA,EAY5B,OAAQC,CAAAA,CAAAA,CAAYC,CAAsB,CAAA,CAjB5C,IAAAH,CAAAA,CAAAA,CAkBIA,EAAA,IAAK,CAAA,KAAA,CAAME,CAAI,CAAf,GAAA,IAAA,EAAAF,EAAkB,GAAIG,CAAAA,CAAAA,EACxB,CAGA,UAAA,CAAcC,CAAkD,CAAA,CAC9D,OAAOH,CAAiB,CAAA,OAAA,CAAQG,CAAO,CACzC,CAGA,UAAA,CAAcA,EAAmCC,CAAgB,CAAA,CAC/DJ,CAAiB,CAAA,OAAA,CAAQG,CAAO,CAAA,CAAIC,EACtC,CAEA,OAAA,EAAU,CACRJ,CAAAA,CAAiB,GAAM,CAAA,KACzB,CAEA,SAAY,EAAA,CACVA,CAAiB,CAAA,GAAA,CAAM,KACzB,CAGA,YAAmB,CACjB,MAAA,CAAO,MAAO,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,QAAQK,CAAOA,EAAAA,CAAAA,CAAI,KAAM,EAAC,EACtD,CACF,EAxCaL,CAIJ,CAAA,GAAA,CAA+B,KAJ3BA,CAKJ,CAAA,OAAA,CAAuC,EALzC,CAAA,IAAMM,CAANN,CAAAA,CAAAA,CCKA,SAASO,CAAAA,CAAUC,EAAgC,CACxD,OAAOA,CAAgBC,YAAAA,CACzB,CAEA,IAAIC,EAAiB,CAERD,CAAAA,CAAAA,CAAN,cAAsBH,CAAiB,CAG5C,WAAA,CACUK,EACAC,CAAe,CAAA,GAChBC,CACP,CAAA,CACA,OAJQ,CAAA,IAAA,CAAA,QAAA,CAAAF,CACA,CAAA,IAAA,CAAA,KAAA,CAAAC,CACD,CAAA,IAAA,CAAA,GAAA,CAAAC,EAGPlB,CAAegB,CAAAA,CAAAA,CAAUD,CAAc,CAAA,CACvC,IAAK,CAAA,SAAA,CAAY,KAAK,eAAgB,GACxC,CAEQ,eAAA,EAA4B,CAClC,GAAII,QAAQ,IAAK,CAAA,QAAQ,EAAG,CAC1B,IAAMC,EAAa,IAAK,CAAA,QAAA,CAAS,IAAKxB,CAAAA,CAAW,CAEjD,CAAA,OADwB,KAAK,iBAAkBwB,CAAAA,CAAU,CAClC,CAAA,KAAA,CAAMxB,CAAW,CAC1C,CACA,OAAO,EACT,CAEQ,iBAAkBwB,CAAAA,CAAAA,CAA4B,CACpD,OAAOA,CAAAA,CAAW,UAAW,CAAA,oBAAA,CAAsB,CAACC,CAAAA,CAAOC,EAAIC,CACzDD,GAAAA,CAAAA,CACEA,CAAG,CAAA,QAAA,CAAS,SAAS,CAAA,CAAUD,EAC5BC,CAAG,CAAA,OAAA,CAAQ,4BAA8B,CAAA,CAACE,CAAGC,CAAAA,CAAAA,CAASC,IACpD,CAAID,CAAAA,EAAAA,CAAO,CAAaV,UAAAA,EAAAA,CAAc,CAAIW,CAAAA,EAAAA,CAAAA,EAAS,EAAE,CAC7D,CAAA,CAAA,CAAA,CACQH,GAAMA,CAAG,CAAA,OAAA,CAAQ3B,EAAa,EAAE,CAAA,CAAE,IAAK,EAAA,CACzC,CAA6BmB,MAAAA,EAAAA,CAAc,MAAMQ,CAAE,CAAA,IAAA,CAAA,CAErDF,CACR,CACH,CAEA,KAAA,EAAgB,CACd,IAAK,CAAA,OAAA,EACL,CAAA,IAAMM,CAAS,CAAA,IAAA,CAAK,QACpB,CAAA,OAAA,IAAA,CAAK,WACEA,CAAAA,CACT,CAEA,MAAiB,EAAA,CACf,GAAIC,UAAAA,CAAW,IAAK,CAAA,QAAQ,EAAG,CAC7B,IAAMC,CAAO,CAAA,IAAA,CAAK,QAAS,CAAA,IAAA,CAAK,KAAK,CACrC,CAAA,OAAIjB,CAAUiB,CAAAA,CAAI,CACTA,CAAAA,CAAAA,CAAK,OAEL,CAAA,MAAA,CAAOA,CAAI,CAEtB,CACA,OAAO,IAAK,CAAA,cAAA,EACd,CAEQ,cAAyB,EAAA,CAC/B,cAAO,OAAQ,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,OAAQ,CAAA,CAAC,CAACX,CAAKY,CAAAA,CAAG,CAAM,GAAA,CACjD,IAAMC,CAAAA,CAAWD,EAAI,QACrB,CAAA,IAAA,CAAK,cAAeA,CAAAA,CAAG,CACvB,CAAA,IAAME,EAAY,IAAK,CAAA,SAAA,CAAU,SAAUC,CAAAA,CAAAA,EAAKA,CAAE,CAAA,QAAA,CAAS,YAAYf,CAAG,CAAA,CAAA,CAAG,CAAC,CAAA,CAE1Ea,CACF,EAAA,IAAA,CAAK,eAAeA,CAAUC,CAAAA,CAAS,CAEzC,CAAA,IAAA,CAAK,SAAUA,CAAAA,CAAS,EAAI,IAAK,CAAA,SAAA,CAAUA,CAAS,CAAE,CAAA,OAAA,CACpD,YAAYd,CAAG,CAAA,CAAA,CAAA,CACf,CAAYA,SAAAA,EAAAA,CAAG,CAAK,EAAA,EAAA,IAAA,CAAK,mBAAmBY,CAAG,CAAC,CAClD,CAAA,EACF,CAAC,CAAA,CAEM,KAAK,SAAU,CAAA,IAAA,CAAK,EAAE,CAC/B,CAEQ,cAAA,CAAeb,EAAoB,CACzC,MAAA,CAAO,QAAQA,CAAK,CAAA,CAAE,QAAQ,CAAC,CAACC,CAAKT,CAAAA,CAAK,CAAM,GAAA,CAC1CS,IAAQ,UAEDU,EAAAA,UAAAA,CAAWnB,CAAK,CAAA,CADzB,OAAOQ,CAAAA,CAAMC,CAAG,CAGPgB,CAAAA,QAAAA,CAASzB,CAAK,CAAA,GACvBQ,CAAMC,CAAAA,CAAG,EAAIT,CAAM,CAAA,KAAA,EAEvB,CAAC,EACH,CAEQ,mBAAmBQ,CAAsB,CAAA,CAC/C,OAAO,MAAA,CAAO,OAAQA,CAAAA,CAAK,EACxB,MAAO,CAAA,CAAC,CAACC,CAAAA,CAAKT,CAAK,CAAA,GAAMS,IAAQ,UAAc,EAAA,CAACU,UAAWnB,CAAAA,CAAK,CAAC,CAAA,CACjE,IAAI,CAAC,CAACS,CAAKT,CAAAA,CAAK,CAAM,GAAA,CAAA,EAAGS,CAAG,CAAKiB,EAAAA,EAAAA,MAAAA,CAAO,MAAO1B,CAAAA,CAAK,CAAC,CAAC,GAAG,CACzD,CAAA,IAAA,CAAK,GAAG,CACb,CAEQ,cAAA,CAAesB,EAAiBC,CAAyB,CAAA,CAC/DD,CAAS,CAAA,OAAA,CAAQ,CAAC,CAACK,CAAK,CAAM,GAAA,CAC5BrB,IACA,IAAMsB,CAAAA,CAAgB,KAAK,WAAYD,CAAAA,CAAK,CAC5C,CAAA,IAAA,CAAK,SAAUJ,CAAAA,CAAS,GAAKK,EAC/B,CAAC,EACH,CAEQ,WAAYD,CAAAA,CAAAA,CAAuD,CACzE,GAAIR,UAAAA,CAAWQ,CAAK,CAAA,CAClB,OAAO,IAAA,CAAK,YAAYA,CAAM,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CACpC,GAAIF,QAASE,CAAAA,CAAK,CACvB,CAAA,OAAO,CAAuCrB,MAAAA,EAAAA,CAAc,MAAOqB,CAAsB,CAAA,KAAK,CACzF,IAAA,CAAA,CAAA,GAAIxB,CAAUwB,CAAAA,CAAK,EAAG,CAC3B,IAAME,CAAeF,CAAAA,CAAAA,CAAkB,KAAM,EAAA,CAC7C,OAAOR,UAAWU,CAAAA,CAAW,EAAIA,CAAY,CAAA,IAAA,CAAK,KAAK,CAAIC,CAAAA,CAAAA,CAAcD,CAAW,CACtF,CACE,KAAA,OAAO,SAAuCvB,CAAc,CAAA,GAAA,EAAMqB,CAAK,CAAA,IAAA,CAE3E,CACF,CAAA,CCvHA,IAAMI,EACJ,CAAA,sEAAA,CAAuE,KAAM,CAAA,GAAG,CAC5EC,CAAAA,EAAAA,CACJ,2wBAA2wB,KACzwB,CAAA,GACF,CAOK,CAAA,SAASC,CAAWC,CAAAA,CAAAA,CAAe,CACxC,GAAIC,CAAAA,CAAaD,CAAI,CAAA,EAAKA,CAAgB,YAAA,IAAA,EAAQ/B,EAAU+B,CAAI,CAAA,CAC9D,OAAOA,CAAAA,CAET,IAAME,CAAAA,CAAOC,QAAQH,CAAI,CAAA,CAAI,EAAK,CAAA,MAAA,CAAOA,CAAI,CAAA,CAC7C,OAAO,QAAS,CAAA,cAAA,CAAeE,CAAI,CACrC,CAQO,SAASE,CACdC,CAAAA,CAAAA,CACAZ,CACAa,CAAAA,CAAAA,CAAoC,IAC9B,CAAA,CACN,IAAMC,CAAaN,CAAAA,CAAAA,CAAaK,CAAM,CAAA,CAAIA,CAAO,CAAA,UAAA,CAAaA,EACxDE,CAAMrD,CAAAA,CAAAA,CAAc,KACtB8C,CAAAA,CAAAA,CAAaR,CAAK,CAAA,CACpBA,EAAM,KAAMY,CAAAA,CAAAA,CAAQE,CAAU,CAErBA,CAAAA,CAAAA,EAAc,CAACC,CACvBD,CAAAA,CAAAA,CAA2B,MAAOd,CAAAA,CAAK,CAE9Be,CAAAA,CAAAA,EACTH,EAAuB,MAAOZ,CAAAA,CAAK,EAExC,CAMO,SAASgB,CAAAA,CAAYhB,EAAiC,CACvDQ,CAAAA,CAAaR,CAAK,CAAA,CACpBA,CAAM,CAAA,OAAA,GAESA,CAAM,CAAA,UAAA,EAElBA,EAAsB,MAAO,GAGpC,CAQO,SAASiB,CAAAA,CACdL,CACAnC,CAAAA,CAAAA,CACAuB,CACM,CAAA,CACNW,EAAYC,CAAQnC,CAAAA,CAAAA,CAAMuB,CAAK,CAAA,CAC/BgB,CAAYhB,CAAAA,CAAK,EACnB,CAQO,SAASkB,CAAaC,CAAAA,CAAAA,CAAsBC,CAAc/C,CAAAA,CAAAA,CAAsB,CACjF+C,CAAS,GAAA,OAAA,CACXC,EAAkBF,CAAAA,CAAAA,CAAS9C,CAAK,CAAA,CACvB+C,IAAS,OAClBE,CAAAA,EAAAA,CAAkBH,CAAS9C,CAAAA,CAAK,CAEhCkD,CAAAA,EAAAA,CAAoBJ,EAASC,CAAM/C,CAAAA,CAAK,EAE5C,CAEA,SAASgD,EAAAA,CAAkBF,EAAsB9C,CAAsB,CAAA,CACjE,OAAOA,CAAAA,EAAU,QACnB8C,CAAAA,CAAAA,CAAQ,UAAY9C,CACXU,CAAAA,OAAAA,CAAQV,CAAK,CACtB8C,CAAAA,CAAAA,CAAQ,UAAY9C,CAAM,CAAA,IAAA,CAAK,GAAG,CAAA,CACzBA,CAAS,EAAA,OAAOA,GAAU,QACnC8C,GAAAA,CAAAA,CAAQ,SAAY,CAAA,MAAA,CAAO,OAAQ9C,CAAAA,CAAK,EACrC,MAAO,CAAA,CAACmD,CAAK,CAAA,CAAC1C,CAAKT,CAAAA,CAAK,IAAMmD,CAAOnD,EAAAA,CAAAA,CAAQ,IAAIS,CAAG,CAAA,CAAA,CAAK,IAAK,EAAE,CAAA,CAChE,IAAK,EAAA,EAEZ,CAEA,SAASwC,GAAkBH,CAAsB9C,CAAAA,CAAAA,CAAsB,CACjE,OAAOA,CAAU,EAAA,QAAA,CACnB8C,EAAQ,KAAM,CAAA,OAAA,CAAU9C,CACfA,CAAAA,CAAAA,EAAS,OAAOA,CAAAA,EAAU,UAEnC,MAAO,CAAA,OAAA,CADKA,CACM,CAAE,CAAA,OAAA,CAAQ,CAAC,CAACS,CAAAA,CAAKT,CAAK,CAAA,GAAM,CAC5C8C,CAAAA,CAAQ,MAAM,WAAYM,CAAAA,SAAAA,CAAU3C,CAAG,CAAA,CAAG,MAAOT,CAAAA,CAAK,CAAC,EACzD,CAAC,EAEL,CAEA,SAASkD,EAAAA,CAAoBJ,EAAsBC,CAAc/C,CAAAA,CAAAA,CAAsB,CACjFqC,OAAAA,CAAQrC,CAAK,CAAA,CACf8C,EAAQ,eAAgBC,CAAAA,CAAI,CACnB/C,CAAAA,CAAAA,GAAU,CACnB8C,CAAAA,CAAAA,CAAAA,CAAQ,aAAaC,CAAM,CAAA,EAAE,CAEzBD,CAAAA,CAAAA,YAAmB,gBAAoBC,EAAAA,CAAAA,GAAS,QAClDD,CAAQ,CAAA,KAAA,CAAQ,MAAO9C,CAAAA,CAAK,CAE5B8C,CAAAA,CAAAA,CAAQ,aAAaC,CAAM,CAAA,MAAA,CAAO/C,CAAK,CAAC,EAG9C,CAOO,SAASqD,EAAAA,CAASjD,CAAYkD,CAAAA,CAAAA,CAA8B,CACjE,GAAIlD,aAAgB,gBAClB,CAAA,OAAQA,CAAK,CAAA,IAAA,EACX,IAAK,WACH,OAAOmD,CAAAA,CAAiBnD,CAAM,CAAA,QAAA,CAAU,IAAM,CAC5CkD,EAAO,CAAQlD,CAAAA,CAAAA,CAAK,OAAQ,EAC9B,CAAC,EACH,IAAK,MAAA,CACH,OAAOmD,CAAAA,CAAiBnD,CAAM,CAAA,QAAA,CAAU,IAAM,CAC5CkD,CAAAA,CAAOlD,CAAK,CAAA,KAAA,CAAQA,CAAK,CAAA,KAAA,CAAQ,EAAE,EACrC,CAAC,CACH,CAAA,IAAK,MACH,CAAA,OAAOmD,EAAiBnD,CAAM,CAAA,QAAA,CAAU,IAAM,CACxCA,CAAAA,CAAK,OACPkD,CAAOlD,CAAAA,CAAAA,CAAK,KAAK,EAErB,CAAC,CAAA,CACH,IAAK,QACH,CAAA,OAAOmD,CAAiBnD,CAAAA,CAAAA,CAAM,OAAS,CAAA,IAAM,CAC3C,IAAMJ,CAAAA,CAAQ,MAAO,CAAA,UAAA,CAAWI,CAAK,CAAA,KAAK,EAC1CkD,CAAO,CAAA,MAAA,CAAO,MAAMtD,CAAK,CAAA,CAAI,GAAK,MAAOA,CAAAA,CAAK,CAAC,EACjD,CAAC,CAAA,CACH,IAAK,OACH,CAAA,OAAOuD,CAAiBnD,CAAAA,CAAAA,CAAM,QAAU,CAAA,IAAM,CAC5CkD,CAAOlD,CAAAA,CAAAA,CAAK,OAAUA,CAAAA,CAAAA,CAAK,KAAQ,CAAA,EAAE,EACvC,CAAC,CAAA,CACH,IAAK,MACH,CAAA,OAAOmD,EAAiBnD,CAAM,CAAA,OAAA,CAAS,IAAM,CAC3CkD,CAAOlD,CAAAA,CAAAA,CAAK,KAAK,EACnB,CAAC,CACL,CAGF,GAAIA,CAAAA,YAAgB,kBAClB,OAAOmD,CAAAA,CAAiBnD,CAAM,CAAA,QAAA,CAAU,IAAM,CAC5CkD,EAAOlD,CAAK,CAAA,KAAK,EACnB,CAAC,CAAA,CAGH,GAAIA,CAAgB,YAAA,mBAAA,CAClB,OAAOmD,CAAAA,CAAiBnD,CAAM,CAAA,OAAA,CAAS,IAAM,CAC3CkD,CAAAA,CAAOlD,CAAK,CAAA,KAAK,EACnB,CAAC,CAEL,CAOU,OAAA,CAAQ,OAAQ,GAmBnB,SAASmD,CACdnD,CAAAA,CAAAA,CACAoD,EACAC,CACY,CAAA,CACZ,OAAArD,CAAK,CAAA,gBAAA,CAAiBoD,CAAWC,CAAAA,CAAO,CACjC,CAAA,IAAMrD,EAAK,mBAAoBoD,CAAAA,CAAAA,CAAWC,CAAO,CAC1D,CAOO,SAASC,GAAcC,CAAuB,CAAA,CACnD,IAAMC,CAAAA,CAAqB,EAAC,CACtB1C,EAAmB,EAAC,CACpB2C,CAAa,CAAA,2BAAA,CACfC,CAAY,CAAA,CAAA,CAEhB,OAAa,CACX,IAAMlD,CAAQiD,CAAAA,CAAAA,CAAW,IAAKF,CAAAA,CAAK,EACnC,GAAI,CAAC/C,CAAO,CAAA,MAEZ,GAAM,CAACmD,EAAW/C,CAAO,CAAA,CAAIJ,CACvBoD,CAAAA,CAAAA,CAAWD,CAAU,CAAA,CAAC,IAAM,GAMlC,CAAA,GAHA7C,EAAO,IAAKyC,CAAAA,CAAAA,CAAM,MAAMG,CAAWlD,CAAAA,CAAAA,CAAM,KAAK,CAAC,CAC/CkD,CAAAA,CAAAA,CAAYlD,EAAM,KAAQmD,CAAAA,CAAAA,CAAU,MAEhCC,CAAAA,CAAAA,CAAU,CAEZ,KAAOJ,EAAS,MAAS,CAAA,CAAA,EAAKA,CAASA,CAAAA,CAAAA,CAAS,MAAS,CAAA,CAAC,IAAM5C,CAAS,EAAA,CACvE,IAAMiD,CAAcL,CAAAA,CAAAA,CAAS,KACzBK,CAAAA,CAAAA,EACF/C,CAAO,CAAA,IAAA,CAAK,CAAK+C,EAAAA,EAAAA,CAAW,GAAG,EAEnC,CACIL,CAAS,CAAA,MAAA,CAAS,CACpBA,EAAAA,CAAAA,CAAS,MAEb,CAAA,KAAY7B,EAAkB,CAAA,QAAA,CAASf,CAAO,CAAA,EAE5C4C,EAAS,IAAK5C,CAAAA,CAAO,EAEvBE,CAAO,CAAA,IAAA,CAAK6C,CAAS,EACvB,CAIA,IADA7C,CAAAA,CAAO,IAAKyC,CAAAA,CAAAA,CAAM,MAAMG,CAAS,CAAC,CAC3BF,CAAAA,CAAAA,CAAS,MAAS,CAAA,CAAA,EAAG,CAC1B,IAAMK,CAAAA,CAAcL,CAAS,CAAA,GAAA,EACzBK,CAAAA,CAAAA,EACF/C,EAAO,IAAK,CAAA,CAAA,EAAA,EAAK+C,CAAW,CAAA,CAAA,CAAG,EAEnC,CAEA,OAAO/C,CAAO,CAAA,IAAA,CAAK,EAAE,CACvB,CAOO,SAASgD,GAAclD,CAAyD,CAAA,CACrF,OAAOgB,EAAAA,CAAU,QAAShB,CAAAA,CAAO,CACnC,CAOO,SAASmD,EAAiBnD,CAAAA,CAAAA,CAAyB,CACxD,OAAOe,GAAkB,QAASf,CAAAA,CAAO,EAAI,CAAIA,CAAAA,EAAAA,CAAO,KAAO,CAAIA,CAAAA,EAAAA,CAAO,CAAMA,GAAAA,EAAAA,CAAO,CACzF,CAAA,CAAA,CAOO,SAASc,CAAiBsC,CAAAA,CAAAA,CAA0B,CACzD,OAAI3C,QAAS2C,CAAAA,CAAM,EACVA,CAAO,CAAA,KAAA,CAEPA,CAEX,CCnSO,IAAMC,CAAN,CAAA,cAA4BnE,CAAwC,CAMzE,WAAA,CACSK,CACAC,CAAAA,CAAAA,CACAC,CACP,CAAA,CACA,OAJO,CAAA,IAAA,CAAA,QAAA,CAAAF,CACA,CAAA,IAAA,CAAA,KAAA,CAAAC,CACA,CAAA,IAAA,CAAA,GAAA,CAAAC,EAPT,IAAQ,CAAA,OAAA,CAAU,IAAI,GACtB,CAAA,IAAA,CAAQ,SAAgC,IACxC,CAAA,IAAA,CAAQ,QAAW,CAAA,IAAI,GAQrB,CAAA,IAAA,CAAK,MAAL,IAAK,CAAA,GAAA,CAAQD,CAAA,EAAA,IAAA,CAAA,KAAA,CAAA,CAAAA,CAAO,CAAA,GAAA,CAAA,CACpB,KAAK,UAAa,CAAA,IAAA,CAAK,gBAAiBA,CAAAA,CAAK,EAC/C,CAEQ,iBAAiBA,CAAgD,CAAA,CACvE,OAAKA,CAAAA,CACE8D,eACL9D,CAAAA,CAAAA,CACAC,GACE8D,UAAW9D,CAAAA,CAAAA,CAAK5B,CAAY,CAAA,EAAK0F,UAAW9D,CAAAA,CAAAA,CAAK3B,CAAa,CAAK2B,EAAAA,CAAAA,GAAQ1B,CAC/E,CAAA,CALmB,EAMrB,CAEA,IAAI,UAAA,EAA0B,CAjChC,IAAAY,CAAA6E,CAAAA,CAAAA,CAkCI,QAAOA,CAAA7E,CAAAA,CAAAA,CAAAA,CAAA,KAAK,QAAL,GAAA,IAAA,CAAA,KAAA,CAAA,CAAAA,EAAe,UAAf,GAAA,IAAA,CAAA6E,CAA6B,CAAA,IACtC,CAEA,IAAI,aAAuB,CArC7B,IAAA7E,CAAA6E,CAAAA,CAAAA,CAsCI,OAAOA,CAAAA,CAAAA,CAAAA,CAAA7E,EAAA,IAAK,CAAA,QAAA,GAAL,IAAAA,CAAAA,KAAAA,CAAAA,CAAAA,CAAAA,CAAe,WAAf,GAAA,IAAA,CAAA6E,EAA8B,CACvC,CAAA,CAEA,MAAMjC,CAAcC,CAAAA,CAAAA,CAA8B,CAzCpD,IAAA7C,CAAAA,CAAA6E,CAAAC,CAAAA,CAAAA,CAAAC,CA0CI,CAAA,GAAI,CAACvD,UAAW,CAAA,IAAA,CAAK,QAAQ,CAAA,CAC3B,MAAM,IAAI,MAAM,6BAA6B,CAAA,CAE/C,GAAI,IAAA,CAAK,WACP,CAAA,OAAA,CAAOqD,GAAA7E,CAAA,CAAA,IAAA,CAAK,WAAL,IAAAA,CAAAA,KAAAA,CAAAA,CAAAA,CAAAA,CAAe,MAAM4C,CAAQC,CAAAA,CAAAA,CAAAA,GAA7B,IAAAgC,CAAAA,CAAAA,CAAwC,EAAC,CAGlD,KAAK,OAAQ,EAAA,CACb,IAAK,CAAA,QAAA,CAAW,IAAK,CAAA,QAAA,CAAS,KAAK,UAAU,CAAA,CAC7C,IAAMG,CAAAA,CAAAA,CAAcD,CAAAD,CAAAA,CAAAA,CAAAA,CAAA,KAAK,QAAL,GAAA,IAAA,CAAA,KAAA,CAAA,CAAAA,CAAe,CAAA,KAAA,CAAMlC,CAAQC,CAAAA,CAAAA,CAAAA,GAA7B,KAAAkC,CAAwC,CAAA,EAC5D,CAAA,OAAA,IAAA,CAAK,cAAe,EAAA,CACpB,KAAK,UAAW,CAAA,IAAA,CAAK,KAAK,CAAA,CAC1B,IAAK,CAAA,SAAA,GAEEC,CACT,CAEA,OAAgB,EAAA,CA3DlB,IAAAhF,CAAAA,CA4DI,KAAK,gBAAiB,EAAA,CACtB,KAAK,UAAW,EAAA,CAAA,CAChBA,EAAA,IAAK,CAAA,QAAA,GAAL,IAAAA,EAAAA,CAAAA,CAAe,OACf,EAAA,CAAA,IAAA,CAAK,SAAW,IAChB,CAAA,IAAA,CAAK,UAAa,CAAA,EAClB,CAAA,IAAA,CAAK,eACP,CAEQ,cAAuB,EAAA,CAC7B,IAAK,CAAA,KAAA,CAAM,QAAQ,OAAQ8D,CAAAA,CAAAA,EAAWA,GAAS,EACjD,CAEQ,gBAAyB,EAAA,CAC/B,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,OAAA,CAAQA,GAAWA,CAAQ,EAAC,EACjD,CAEQ,YAAqB,EAAA,CAC3B,QAAWmB,CAAW,IAAA,IAAA,CAAK,OACzBA,CAAAA,CAAAA,EAEF,CAAA,IAAA,CAAK,QAAQ,KAAM,GACrB,CAEA,WAAYxE,CAAAA,CAAAA,CAA2B,CACrC,MAAO,CAAA,MAAA,CAAO,IAAK,CAAA,UAAA,CAAYA,CAAK,CAAA,UAAU,EAC9C,IAAK,CAAA,QAAA,CAAWA,CAAK,CAAA,QAAA,CACrB,IAAK,CAAA,QAAA,CAAWA,EAAK,QACrB,CAAA,IAAA,CAAK,KAAQA,CAAAA,CAAAA,CAAK,KAElB,CAAA,IAAMI,EAAQ,IAAK,CAAA,KAAA,CACnB,IAAK,CAAA,KAAA,CAAQJ,CAAK,CAAA,KAAA,CAElB,KAAK,UAAWI,CAAAA,CAAK,EACvB,CAEQ,YAAaqE,CAAAA,CAAAA,CAA6B,CAChD,IAAIC,CAAAA,CAAQ,IAAK,CAAA,QAAA,CAAS,GAAID,CAAAA,CAAQ,EACtC,OAAKC,CAAAA,GACHA,CAAQ,CAAA,CAAE,OAAS,CAAA,IAAM,EAAG,CAAA,CAC5B,KAAK,QAAS,CAAA,GAAA,CAAID,EAAUC,CAAK,CAAA,CAAA,CAEnCA,CAAM,CAAA,OAAA,EACCA,CAAAA,CACT,CAEA,UAAWtE,CAAAA,CAAAA,CAAwC,CAzGrD,IAAAb,CA0GI,CAAA,GAAKa,EAGL,CAAW,IAAA,GAAA,CAACC,CAAKsE,CAAAA,CAAI,CAAK,GAAA,MAAA,CAAO,QAAQvE,CAAK,CAAA,CACxC+D,WAAW9D,CAAK5B,CAAAA,CAAY,KAAKc,CAAA,CAAA,IAAA,CAAK,QAAL,GAAA,IAAA,EAAAA,CAAe,CAAA,UAAA,CAAA,CAClD,KAAK,kBAAmBc,CAAAA,CAAAA,CAAKsE,CAAI,CAAA,CACxBtE,CAAQ,GAAA,KAAA,CACjB,KAAK,QAASsE,CAAAA,CAAI,CACTR,CAAAA,UAAAA,CAAW9D,CAAK3B,CAAAA,CAAa,EACtC,IAAK,CAAA,kBAAA,CAAmB2B,EAAKsE,CAAI,CAAA,CACxBtE,IAAQ1B,CACjB,EAAA,IAAA,CAAK,eAAgB0B,CAAAA,CAAAA,CAAKsE,CAAI,CAAA,CAGlC,KAAK,KAAQvE,CAAAA,EAAAA,CACf,CAEQ,kBAAA,CAAmBC,CAAasE,CAAAA,CAAAA,CAAiB,CACvD,IAAMC,CAAAA,CAAQvE,CAAI,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,aAErBmE,CAAAA,CAAAA,CAAUrB,CAAiB,CAAA,IAAA,CAAK,QAAS,CAAA,KAAA,CAAM,CAAC,CAAGyB,CAAAA,CAAAA,CAAOD,CAAI,CAAA,CACpE,IAAK,CAAA,OAAA,CAAQ,IAAIH,CAAO,EAC1B,CAEQ,QAAA,CAASG,CAAoC,CAAA,CAlIvD,IAAApF,CAAA6E,CAAAA,CAAAA,CAmIIO,CAAK,CAAA,KAAA,CAAA,CAAQP,CAAA7E,CAAAA,CAAAA,CAAAA,CAAA,KAAK,QAAL,GAAA,IAAA,CAAA,KAAA,CAAA,CAAAA,EAAe,UAAf,GAAA,IAAA,CAAA6E,EAA6B,KAC5C,CAEQ,kBAAmB/D,CAAAA,CAAAA,CAAasE,CAAiB,CAAA,CACvD,KAAK,KAAOtE,CAAAA,CAAG,CAAIqB,CAAAA,CAAAA,CAAciD,CAAI,EACvC,CAEQ,eAAgBtE,CAAAA,CAAAA,CAAasE,CAAiB,CAAA,CACpD,IAAMD,CAAAA,CAAQ,KAAK,YAAarE,CAAAA,CAAG,EACnCqE,CAAM,CAAA,OAAA,CAAUG,UAAU,IAAM,CAC9B,IAAK,CAAA,UAAA,CAAWxE,CAAG,CAAA,CAAIU,WAAW4D,CAAI,CAAA,CAAIA,CAAK,EAAA,CAAIA,EACrD,CAAC,EACH,CACF,CAAA,CChIO,SAASG,EACd3C,CAAAA,CAAAA,CACA4C,CACAC,CAAAA,CAAAA,CACA5C,EACsB,CACtB,IAAM6C,CAAS,CAAA,IAAI,GACb/D,CAAAA,CAAAA,CAAW,MAAM,IAAK6D,CAAAA,CAAAA,CAAY,MAAO,EAAC,CAGhD,CAAA,GAAI7D,EAAS,MAAU8D,EAAAA,CAAAA,CAAa,MAAW,GAAA,CAAA,CAC7C,OAAAE,EAAAA,CAAc/C,EAAQjB,CAAUkB,CAAAA,CAAM,CAC/B6C,CAAAA,CAAAA,CAGT,IAAME,CAAAA,CAAiC,EACjCC,CAAAA,CAAAA,CAAkBC,GAAQL,CAAY,CAAA,CACxCM,EAAa,CAGjB,CAAA,IAAA,GAAS,CAACC,CAAAA,CAAGhE,CAAK,CAAA,GAAKyD,EAAa,OAAQ,EAAA,CAAG,CAC7C,IAAIQ,CAAYtE,CAAAA,CAAAA,CAASoE,CAAU,CAC/BG,CAAAA,CAAAA,CAAUC,CAAOF,CAAAA,CAAAA,CAAWD,CAAC,CAAA,CAGjC,KAAOC,CAAa,EAAA,CAACJ,EAAgB,GAAIK,CAAAA,CAAO,GAC9ClD,CAAYiD,CAAAA,CAAS,CACrBT,CAAAA,CAAAA,CAAY,MAAOU,CAAAA,CAAO,EAC1BD,CAAYtE,CAAAA,CAAAA,CAAS,EAAEoE,CAAU,CACjCG,CAAAA,CAAAA,CAAUC,EAAOF,CAAWD,CAAAA,CAAC,CAG/B,CAAA,IAAMlF,CAAMqF,CAAAA,CAAAA,CAAOnE,EAAOgE,CAAC,CAAA,CACrBI,EAAYZ,CAAY,CAAA,GAAA,CAAI1E,CAAG,CAQrC,CAAA,GALIsF,CACFpE,GAAAA,CAAAA,CAAQqE,EAAMzD,CAAAA,CAAAA,CAAQwD,EAAWpE,CAAK,CAAA,CAAA,CAIpCiE,CACF,CAAA,GAAIA,CAAcG,GAAAA,CAAAA,CAChBL,SACK,CACL,IAAMO,CAAc,CAAA,QAAA,CAAS,aAAc,CAAA,EAAE,EAC7C3D,CAAYC,CAAAA,CAAAA,CAAQ0D,EAAaL,CAAS,CAAA,CAC1CL,EAAS,IAAK,CAAA,CAACU,CAAatE,CAAAA,CAAK,CAAC,EACpC,MAEAW,CAAYC,CAAAA,CAAAA,CAAQZ,CAAOa,CAAAA,CAAM,CAGnC6C,CAAAA,CAAAA,CAAO,IAAI5E,CAAKkB,CAAAA,CAAK,EACvB,CAGA,OAAA4D,CAAAA,CAAS,QAAQ,CAAC,CAACU,EAAatE,CAAK,CAAA,GAAM,CACzCiB,CAAaL,CAAAA,CAAAA,CAAQZ,CAAOsE,CAAAA,CAAW,EACzC,CAAC,EAGDd,CAAY,CAAA,OAAA,CAAQ,CAACxD,CAAAA,CAAOlB,CAAQ,GAAA,CAC9BkB,EAAM,WAAe,EAAA,CAAC0D,CAAO,CAAA,GAAA,CAAI5E,CAAG,CAAA,EACtCkC,EAAYhB,CAAK,EAErB,CAAC,CAEM0D,CAAAA,CACT,CASA,SAASC,EAAAA,CAAc/C,CAAcjB,CAAAA,CAAAA,CAAqBkB,CAAqB,CAAA,CAC7E,GAAID,CAAO,CAAA,UAAA,CAAW,MAAWjB,GAAAA,CAAAA,CAAS,MAAUkB,EAAAA,CAAAA,CAAS,EAAI,CAC9DD,CAAAA,CAAAA,CAAAA,CAAmB,SAAY,CAAA,EAAA,CAC5BC,CACFF,EAAAA,CAAAA,CAAYC,EAAQC,CAAM,CAAA,CAAA,KAEvB,CACL,IAAM0D,CAAAA,CAAQ,SAAS,WAAY,EAAA,CAC7BvE,CAAQL,CAAAA,CAAAA,CAAS,CAAC,CAAA,CAClB6E,EAAQhE,CAAaR,CAAAA,CAAK,CAAIA,CAAAA,CAAAA,CAAM,UAAaA,CAAAA,CAAAA,CACvDuE,EAAM,cAAeC,CAAAA,CAAM,CACvB3D,CAAAA,CAAAA,CACF0D,CAAM,CAAA,YAAA,CAAa1D,CAAM,CAEzB0D,CAAAA,CAAAA,CAAM,WAAY3D,CAAAA,CAAM,CAE1B2D,CAAAA,CAAAA,CAAM,iBACR,CACA5E,CAAS,CAAA,OAAA,CAAQlB,CAAQ,EAAA,CACnB+B,EAAa/B,CAAI,CAAA,EACnBA,CAAK,CAAA,OAAA,GAET,CAAC,EACH,CAUO,SAAS4F,EAAMzD,CAAAA,CAAAA,CAAcnC,CAAegG,CAAAA,CAAAA,CAAwB,CACzE,OAAIhG,CAAAA,GAASgG,EACJhG,CAEL+B,CAAAA,CAAAA,CAAa/B,CAAI,CAAK+B,EAAAA,CAAAA,CAAaiE,CAAI,CAAA,EAAKhG,CAAK,CAAA,QAAA,GAAagG,EAAK,QACrEA,EAAAA,CAAAA,CAAK,WAAYhG,CAAAA,CAAI,CACdgG,CAAAA,CAAAA,EAELhG,aAAgB,IAAQgG,EAAAA,CAAAA,YAAgB,IACtChG,EAAAA,CAAAA,CAAK,WAAgBgG,GAAAA,CAAAA,CAAK,cAC5BhG,CAAK,CAAA,WAAA,CAAcgG,EAAK,WAEnBhG,CAAAA,CAAAA,CAAAA,GAETwC,EAAaL,CAAQ6D,CAAAA,CAAAA,CAAMhG,CAAI,CAAA,CACxBgG,CACT,CAAA,CAQO,SAASX,EAAQnE,CAAAA,CAAAA,CAA2C,CACjE,IAAM+D,CAAS,CAAA,IAAI,IACnB,IAAW,GAAA,CAACM,CAAGhE,CAAAA,CAAK,CAAKL,GAAAA,CAAAA,CAAS,SAAW,CAAA,CAC3C,IAAMb,CAAMqF,CAAAA,CAAAA,CAAOnE,EAAOgE,CAAC,CAAA,CAC3BN,CAAO,CAAA,GAAA,CAAI5E,CAAKkB,CAAAA,CAAK,EACvB,CACA,OAAO0D,CACT,CAUO,SAASS,CAAAA,CAAO1F,EAAeX,CAAuB,CAAA,CAC3D,GAAI0C,CAAAA,CAAa/B,CAAI,CAAA,CAAG,CACtB,IAAMiG,CAAAA,CAAUjG,CAAa,CAAA,GAAA,CAC7B,GAA4BiG,CAAAA,EAAW,KACrC,OAAO,MAAA,CAAOA,CAAM,CAExB,CACA,OAAO,KAAK5G,CAAK,CAAA,CAAA,CACnB,CClJO,IAAM6G,CAAN,CAAA,KAA0C,CAU/C,WACS/F,CAAAA,CAAAA,CACAC,CACAC,CAAAA,CAAAA,CACP,CAHO,IAAA,CAAA,QAAA,CAAAF,EACA,IAAAC,CAAAA,KAAAA,CAAAA,CAAAA,CACA,SAAAC,CAXT,CAAA,IAAA,CAAQ,QAAU,IAAI,GAAA,CACtB,IAAQ,CAAA,OAAA,CAAU,CAClB,CAAA,CAAA,IAAA,CAAQ,MAAgB,EAAC,CACzB,IAAQ,CAAA,QAAA,CAAW,IAAI,GAAA,CACvB,KAAQ,aAA0B,CAAA,EAElC,CAAA,IAAA,CAAQ,MAAsB,CAAA,IAAA,CAO5B,KAAK,GAAL,GAAA,IAAA,CAAK,IAAQD,CAAA,EAAA,IAAA,CAAA,KAAA,CAAA,CAAAA,EAAO,GAChBnB,CAAAA,CAAAA,CAAAA,CAAc,KAChB,GAAA,IAAA,CAAK,cAAiBK,CAAAA,CAAAA,CAAkB,KAAK,QAAQ,CAAA,EAEzD,CAEA,IAAI,UAA0B,EAAA,CAnDhC,IAAAC,CAoDI,CAAA,OAAA,CAAOA,CAAA,CAAA,IAAA,CAAK,KAAM,CAAA,CAAC,IAAZ,IAAAA,CAAAA,CAAAA,CAAiB,IAC1B,CAEA,IAAI,aAAuB,CACzB,OAAO,IAAK,CAAA,OACd,CAEA,gBAAA,EAAyB,EACzB,mBAAA,EAA4B,EAE5B,KAAM4C,CAAAA,CAAAA,CAAcC,EAA8B,CA9DpD,IAAA7C,CAgEI,CAAA,GADA,IAAK,CAAA,MAAA,CAAS4C,EACV,IAAK,CAAA,WAAA,CACP,OAAK,IAAA,CAAA,KAAA,CAAM,OAAQnC,CAAAA,CAAAA,EAAQkC,EAAYC,CAAQnC,CAAAA,CAAAA,CAAMoC,CAAM,CAAC,CACrD,CAAA,IAAA,CAAK,MAGV9B,OAAQ,CAAA,IAAA,CAAK,QAAQ,CAAA,GACvB,IAAK,CAAA,QAAA,CAAW6F,EAAe,IAAK,CAAA,QAAA,CAAS,IAAK,CAAA,EAAE,CAAC,CAAA,CAAA,CAGvD,IAAMC,CAAY,CAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,SAAA,CAAU,EAAI,CAChDC,CAAAA,CAAAA,CAAaD,CAAU,CAAA,UAAA,CAE7B,OAAI7G,CAAAA,CAAAA,CAAA8G,GAAA,IAAAA,CAAAA,KAAAA,CAAAA,CAAAA,CAAAA,CAAY,YAAZ,GAAA,IAAA,EAAA9G,CAAA,CAAA,IAAA,CAAA8G,EAA2B,OAC7BA,CAAAA,GAAAA,CAAAA,CAAW,MAAO,EAAA,CAClBA,CAAA,EAAA,IAAA,EAAAA,EAAY,UAAW,CAAA,OAAA,CAAQrG,GAAQ,CACpCoG,CAAAA,CAAsB,OAAOpG,CAAI,EACpC,CAGF,CAAA,CAAA,CAAA,IAAA,CAAK,KAAQ,CAAA,KAAA,CAAM,KAAKoG,CAAU,CAAA,UAAU,CAExCnH,CAAAA,CAAAA,CAAc,KAChB,CAAA,IAAA,CAAK,eAAekD,CAAqB,CAAA,CAEzC,IAAK,CAAA,WAAA,CAAYA,CAAQiE,CAAAA,CAAS,EAEpClE,CAAYC,CAAAA,CAAAA,CAAQiE,EAAWhE,CAAM,CAAA,CACrC,KAAK,UAAW,CAAA,IAAA,CAAK,KAAK,CAAA,CAC1B,IAAK,CAAA,OAAA,CAAU,GACR,IAAK,CAAA,KACd,CAEA,OAAA,EAAgB,CAhGlB,IAAA7C,EAAA6E,CAyGI,CAAA,GARA,IAAK,CAAA,QAAA,CAAS,OAAQM,CAAAA,CAAAA,EAAS,CAjGnC,IAAAnF,CAAAA,CAAAA,CAkGMA,CAAAmF,CAAAA,CAAAA,CAAM,OAAN,GAAA,IAAA,EAAAnF,EAAA,IAAAmF,CAAAA,CAAAA,EACF,CAAC,CAAA,CACD,IAAK,CAAA,QAAA,CAAS,OACd,CAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EACb,CAAA,IAAA,CAAK,MAAM,OAAQ1E,CAAAA,CAAAA,EAAQuC,CAAYvC,CAAAA,CAAI,CAAC,CAAA,CAGxC,CAAC,IAAK,CAAA,QAAA,CAAS,WAAa,CAAC,IAAA,CAAK,MAAM,MAAQ,CAAA,CAClD,IAAMkB,CAAAA,CAAAA,CAAWkD,CAAA7E,CAAAA,CAAAA,CAAAA,CAAA,KAAK,KAAL,GAAA,IAAA,CAAA,KAAA,CAAA,CAAAA,CAAaV,CAAAA,CAAAA,CAAAA,GAAb,IAAAuF,CAAAA,KAAAA,CAAAA,CAAAA,CAAAA,CAAiC,SAE9ClD,CACEZ,GAAAA,OAAAA,CAAQY,CAAQ,CAAA,CAClBA,CAAS,CAAA,OAAA,CAAQK,GAAS,CACxB,IAAA,CAAK,uBAAuBA,CAAK,EACnC,CAAC,CAED,CAAA,IAAA,CAAK,sBAAuBL,CAAAA,CAAQ,CAG1C,EAAA,CAEA,KAAK,KAAQ,CAAA,EACb,CAAA,IAAA,CAAK,OAAU,CAAA,CAAA,EACjB,CAEA,sBAAuBK,CAAAA,CAAAA,CAAO,CA3HhC,IAAAhC,CA4HQ+G,CAAAA,WAAAA,CAAY/E,CAAK,CACnBhC,CAAAA,CAAAA,CAAAA,CAAA,KAAK,MAAL,GAAA,IAAA,EAAAA,EAAa,UAAW,CAAA,OAAA,CAAQS,CAAQ,EAAA,CA7H9C,IAAAT,CAAAA,CA8HYS,EAAK,QAAa,GAAA,IAAA,CAAK,SAAaA,EAAAA,CAAAA,CAAK,WAAgB,GAAA,CAAA,EAAGuB,CAAY,CAC1EhC,CAAAA,GAAAA,CAAAA,CAAAA,CAAA,IAAK,CAAA,MAAA,GAAL,IAAAA,EAAAA,CAAAA,CAAa,YAAYS,CAE7B,CAAA,EAAA,CAAA,CAAA,CAEAuC,CAAYhB,CAAAA,CAAK,EAErB,CAEA,YAAYvB,CAA0B,CAAA,CACpC,IAAK,CAAA,OAAA,CAAUA,CAAK,CAAA,OAAA,CACpB,KAAK,KAAQA,CAAAA,CAAAA,CAAK,KAClB,CAAA,IAAA,CAAK,QAAWA,CAAAA,CAAAA,CAAK,SACrB,IAAK,CAAA,OAAA,CAAUA,CAAK,CAAA,OAAA,CACpB,IAAMI,CAAAA,CAAQ,KAAK,KACnB,CAAA,IAAA,CAAK,MAAQJ,CAAK,CAAA,KAAA,CAClB,KAAK,UAAWI,CAAAA,CAAK,EACvB,CAEQ,cAAe+B,CAAAA,CAAAA,CAAoB,CACzC,IAAK,CAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,CAAGA,CAAM,CAAA,CAC1B,KAAK,YAAaA,CAAAA,CAAAA,CAAQ,IAAK,CAAA,aAAA,CAAc,IAAK,CAAA,IAAI,CAAC,EACzD,CAGQ,YAAYA,CAAcoE,CAAAA,CAAAA,CAAkB,CAClD,IAAIlH,CAAAA,CAAQ,CACZ,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,EAAG8C,CAAM,CAAA,CAC1B,IAAMqE,CAAAA,CAAM,CAACrE,CAAM,EAEbsE,CAAczG,CAAAA,CAAAA,EAAe,CAC7BA,CAAAA,CAAK,QAAa,GAAA,IAAA,CAAK,yBACzB,IAAK,CAAA,OAAA,CAAQ,IAAIX,CAASW,EAAAA,CAAAA,CAAI,EAC9BwG,CAAI,CAAA,IAAA,CAAKxG,CAAI,CAAA,EAEjB,CAEA,CAAA,IAAA,CAAK,aAAauG,CAAME,CAAAA,CAAU,EACpC,CAEQ,YAAazG,CAAAA,CAAAA,CAAYqD,EAAqC,CAChErD,CAAAA,CAAK,QAAa,GAAA,IAAA,CAAK,sBACzBqD,EAAAA,CAAAA,CAAQrD,CAAI,CAEd,CAAA,IAAIuB,CAAQvB,CAAAA,CAAAA,CAAK,UACjB,CAAA,KAAOuB,GACL,IAAK,CAAA,YAAA,CAAaA,CAAO8B,CAAAA,CAAO,CAChC9B,CAAAA,CAAAA,CAAQA,EAAM,YAElB,CAEQ,aAAcvB,CAAAA,CAAAA,CAAkB,CAjL1C,IAAAT,EAkLI,GAAIS,CAAAA,CAAK,QAAa,GAAA,IAAA,CAAK,YAAc,CAAA,CACvC,GAAM,CAAC0G,CAAAA,CAAMrH,CAAK,CAAIE,CAAAA,CAAAA,CAAAA,CAAAA,CAAAS,EAAK,WAAL,GAAA,IAAA,CAAA,KAAA,CAAA,CAAAT,CAAkB,CAAA,KAAA,CAAM,GAAQ,CAAA,GAAA,GACtD,GAAI,CAAA,GAAuB,CAACmH,CAAAA,EAAQ,CAACrH,CAAAA,GAAU,KAAK,cAAgB,CAAA,CAClE,IAAMsH,CAAAA,CAAW3G,CAAK,CAAA,WAAA,CACtB,KAAK,OAAQ,CAAA,GAAA,CAAI,CAACX,CAAOsH,CAAAA,CAAQ,EACnC,CACF,CAAA,KAAA,GAAW3G,CAAK,CAAA,QAAA,GAAa,IAAK,CAAA,SAAA,CAAW,CAC3C,GAAM,CAAE,EAAA4G,CAAAA,CAAAA,CAAK,IAAM,CAAA,EAAA,CAAAC,CAAG,CAAK7G,CAAAA,CAAAA,CAAAA,EAAA,IAAAA,CAAAA,KAAAA,CAAAA,CAAAA,CAAAA,CAAsB,OAAW,GAAA,GACxD6G,CAAM,EAAA,CAACD,IAAO,IAAK,CAAA,cAAA,EACrB,KAAK,OAAQ,CAAA,GAAA,CAAI,CAACC,CAAAA,CAAI7G,CAAI,EAE9B,CACF,CAEQ,UAAA,CAAWI,CAAkE,CAAA,CAC9EA,CAEL,GAAA,MAAA,CAAO,QAAQA,CAAK,CAAA,CAAE,OAAQ,CAAA,CAAC,CAACC,CAAAA,CAAKT,CAAK,CAAM,GAAA,CAC9C,IAAMP,CAAAA,CAAQ,MAAOgB,CAAAA,CAAG,EAClBL,CAAO,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAIX,CAAK,CAAA,CAC/BW,GACF,IAAK,CAAA,SAAA,CAAUK,CAAKL,CAAAA,CAAAA,CAAMJ,CAAOP,CAAAA,CAAAA,GAAU,CAAC,EAEhD,CAAC,CACD,CAAA,IAAA,CAAK,KAAQe,CAAAA,CAAAA,EACf,CAEQ,SACNC,CAAAA,CAAAA,CACAL,EACAI,CACA0G,CAAAA,CAAAA,CACM,CACD1G,CACL,EAAA,MAAA,CAAO,OAAQA,CAAAA,CAAK,CAAE,CAAA,OAAA,CAAQ,CAAC,CAACuC,CAAAA,CAAM/C,CAAK,CAAA,GAAM,CAC/C,GAAI+C,IAAShE,CAAiBiB,EAAAA,CAAAA,CAC5B,IAAK,CAAA,aAAA,CAAcS,CAAKL,CAAAA,CAAAA,CAAMJ,EAAOkH,CAAM,CAAA,CAAA,KAAA,GAClCnE,IAAS,KACjBvC,CAAAA,CAAAA,CAAMuC,CAAI,CAAsB,CAAA,KAAA,CAAQ3C,CAChCmE,CAAAA,KAAAA,GAAAA,UAAAA,CAAWxB,CAAM,CAAA,IAAI,EAC9B,IAAK,CAAA,kBAAA,CAAmBtC,CAAKL,CAAAA,CAAAA,CAAM2C,CAAM/C,CAAAA,CAAsB,OAC1D,CACL,GAAI,IAAK,CAAA,aAAA,CAAc,QAAS+C,CAAAA,CAAI,EAAG,OACvC,IAAMoE,EAAW,IAAK,CAAA,kBAAA,CAAmB3G,EAAOC,CAAKsC,CAAAA,CAAI,CACzD,CAAA,IAAA,CAAK,cAAetC,CAAAA,CAAAA,CAAKL,EAAqB2C,CAAM/C,CAAAA,CAAAA,CAAOmH,CAAQ,EACrE,CACF,CAAC,EACH,CAEQ,kBAAA,CAAmB3G,CAA4BC,CAAAA,CAAAA,CAAasC,CAAc,CAAA,CAEhF,IAAMqE,CAAY,CAAA,CAAA,MAAA,EAAmBC,UAAWtE,CAAAA,CAAI,CAAC,CAAA,CAAA,CACrD,GAAIqE,CAAa5G,EAAAA,CAAAA,CAAM4G,CAAS,CAAA,EAAKjG,UAAWX,CAAAA,CAAAA,CAAM4G,CAAS,CAAC,CAAA,CAC9D,OAAK,IAAA,CAAA,aAAA,CAAc,IAAKA,CAAAA,CAAS,EAC1B5G,CAAM4G,CAAAA,CAAS,CAE1B,CAEQ,aAAc3G,CAAAA,CAAAA,CAAaL,EAAYkB,CAAmB4F,CAAAA,CAAAA,CAAuB,CACvF,GAAKxG,OAAAA,CAAQY,CAAQ,CAKnBA,CAAAA,CAAAA,CAAS,MAAO,CAAA,OAAO,CAAE,CAAA,OAAA,CAAQ,CAACgG,CAAM7H,CAAAA,CAAAA,GAAU,CAlPxD,IAAAE,CAmPQ,CAAA,GAAM,CAACgC,CAAO4F,CAAAA,CAAI,CAAI7G,CAAAA,OAAAA,CAAQ4G,CAAI,CAAA,CAAIA,EAAO,CAACA,CAAAA,CAAM,IAAI,CAClD9E,CAAAA,CAAAA,CAASgF,MAAMD,CAAI,CAAA,CAAI,IAAQ5H,CAAAA,CAAAA,CAAAA,CAAA,IAAK,CAAA,OAAA,CAAQ,IAAI4H,CAAI,CAAA,GAArB,IAAA5H,CAAAA,CAAAA,CAA0B,IACzDkF,CAAAA,CAAAA,CAAW,GAAGpE,CAAG,CAAA,CAAA,EAAI1B,CAAa,CAAA,CAAA,EAAIU,CAAK,CAAA,CAAA,CAC3CqF,EAAQ,IAAK,CAAA,YAAA,CAAaD,EAAU,CAAMqC,CAAAA,CAAAA,CAAM,EACtD,IAAK,CAAA,UAAA,CAAWpC,CAAO1E,CAAAA,CAAAA,CAAMuB,CAAOa,CAAAA,CAAM,EAC5C,CAAC,CAAA,CAAA,KAXqB,CACtB,IAAMqC,CAAW,CAAA,CAAA,EAAGpE,CAAG,CAAI1B,CAAAA,EAAAA,CAAa,CAClC+F,EAAAA,CAAAA,CAAAA,CAAAA,CAAQ,IAAK,CAAA,YAAA,CAAaD,EAAU,CAAMqC,CAAAA,CAAAA,CAAM,CACtD,CAAA,IAAA,CAAK,UAAWpC,CAAAA,CAAAA,CAAO1E,EAAMkB,CAAU,CAAA,IAAI,EAC7C,CASF,CAEQ,kBAAA,CAAmBb,EAAaL,CAAY2C,CAAAA,CAAAA,CAAc0E,CAA+B,CAAA,CAC/F,IAAMjE,CAAAA,CAAYT,EAAK,KAAM,CAAA,CAAC,CAAE,CAAA,WAAA,EAC1B+B,CAAAA,CAAAA,CAAQ,KAAK,YAAa,CAAA,CAAA,EAAGrE,CAAG,CAAIsC,CAAAA,EAAAA,CAAI,EAAE,CAChD+B,CAAAA,CAAAA,CAAM,OAAUvB,CAAAA,CAAAA,CAAiBnD,CAAMoD,CAAAA,CAAAA,CAAWiE,CAAQ,EAC5D,CAEQ,cACNhH,CAAAA,CAAAA,CACAqC,CACAC,CAAAA,CAAAA,CACA/C,EACAmH,CACM,CAAA,CACN,IAAMrC,CAAAA,CAAQ,IAAK,CAAA,YAAA,CAAa,GAAGrE,CAAG,CAAA,CAAA,EAAIsC,CAAI,CAAE,CAAA,CAAA,CAG1C2E,EAAMvG,UAAWnB,CAAAA,CAAK,CAAIA,CAAAA,CAAAA,EAAUA,CAAAA,CAAAA,CACpC2H,EAAelG,QAASiG,CAAAA,CAAG,CAAIA,CAAAA,CAAAA,CAAME,aAAcF,CAAAA,CAAG,EAC5D7E,CAAaC,CAAAA,CAAAA,CAASC,CAAM4E,CAAAA,CAAAA,CAAa,KAAK,CAAA,CAC9C,IAAM/C,CAAUK,CAAAA,SAAAA,CAAU,IAAM,CAE9B,IAAM4C,EAAO1G,UAAWnB,CAAAA,CAAK,CAAIA,CAAAA,CAAAA,EAAUA,CAAAA,CAAAA,CAEvC,KAAK,SAAU2H,CAAAA,CAAAA,CAAa,KAAK,CAAA,GAAM,IAAK,CAAA,SAAA,CAAUE,CAAI,CAE9DF,GAAAA,CAAAA,CAAa,KAAQlG,CAAAA,QAAAA,CAASoG,CAAI,CAAA,CAAIA,EAAK,KAAQA,CAAAA,CAAAA,CACnDhF,CAAaC,CAAAA,CAAAA,CAASC,CAAM4E,CAAAA,CAAAA,CAAa,KAAK,CAChD,EAAA,CAAC,CAEGG,CAAAA,CAAAA,CACAX,CAAYY,EAAAA,aAAAA,CAAcjF,CAAO,CACnCgF,GAAAA,CAAAA,CAAczE,EAASP,CAAAA,CAAAA,CAAS9C,CAAS,EAAA,CACvCmH,EAASnH,CAAK,EAChB,CAAC,CAAA,CAAA,CAGH8E,CAAM,CAAA,OAAA,CAAU,IAAM,CACpBF,CAAAA,EAAWA,GACXkD,CAAAA,CAAAA,EAAeA,IACjB,EACF,CAEQ,YAAA,CAAajD,CAAkBmD,CAAAA,CAAAA,CAA0Bd,EAA6B,CAtShG,IAAAvH,CAuSI,CAAA,IAAImF,CAAQ,CAAA,IAAA,CAAK,SAAS,GAAID,CAAAA,CAAQ,CACtC,CAAA,OAAKC,CACHA,GAAAA,CAAAA,CAAQ,CAAE,OAAS,CAAA,IAAM,EAAG,CAAA,CACxBkD,IACFlD,CAAM,CAAA,SAAA,CAAY,IAAI,GAAA,CAAA,CAEpBoC,CACFpC,GAAAA,CAAAA,CAAM,OAAS,CAEjB,CAAA,CAAA,CAAA,IAAA,CAAK,QAAS,CAAA,GAAA,CAAID,CAAUC,CAAAA,CAAK,IAEnCnF,CAAAmF,CAAAA,CAAAA,CAAM,OAAN,GAAA,IAAA,EAAAnF,CAAA,CAAA,IAAA,CAAAmF,GACOA,CACT,CAEQ,WAAWA,CAAkBvC,CAAAA,CAAAA,CAAcZ,EAAgBa,CAA2B,CAAA,CACxFrB,UAAWQ,CAAAA,CAAK,CAClBmD,CAAAA,CAAAA,CAAM,QAAUG,SAAU,CAAA,IAAM,CAC9B,IAAMgD,CAAYC,CAAAA,WAAAA,CAAavG,GAAoB,CAAA,CAAE,GAAIM,CAAAA,CAAU,CAE/D5C,CAAAA,CAAAA,CAAc,MAChByF,CAAM,CAAA,SAAA,CAAY,IAAK,CAAA,iBAAA,CAAkBvC,CAAQ0F,CAAAA,CAAAA,CAAWzF,CAAM,CAElEsC,CAAAA,CAAAA,CAAM,SAAYI,CAAAA,EAAAA,CAAc3C,CAAQuC,CAAAA,CAAAA,CAAM,UAAYmD,CAAWzF,CAAAA,CAAM,EAE/E,CAAC,CAED0F,CAAAA,WAAAA,CAAYvG,CAAK,CAAE,CAAA,OAAA,CAAQ,CAACvB,CAAAA,CAAMX,CAAU,GAAA,CAC1C,IAAM0I,CAAUlG,CAAAA,CAAAA,CAAW7B,CAAI,CACzBK,CAAAA,CAAAA,CAAMqF,EAAOqC,CAAS1I,CAAAA,CAAK,CAE7BJ,CAAAA,CAAAA,CAAc,KAChByF,CAAAA,CAAAA,CAAM,UAAY,IAAK,CAAA,iBAAA,CAAkBvC,CAAQ,CAAA,CAAC4F,CAAO,CAAA,CAAG3F,CAAM,CAElEsC,EAAAA,CAAAA,CAAM,SAAW,CAAA,GAAA,CAAIrE,CAAK0H,CAAAA,CAAO,EACjC7F,CAAYC,CAAAA,CAAAA,CAAQ4F,EAAS3F,CAAM,CAAA,EAEvC,CAAC,EAEL,CAEQ,iBACND,CAAAA,CAAAA,CACA0F,CACAzF,CAAAA,CAAAA,CACmB,CACnB,IAAM6C,CAAAA,CAAS,IAAI,GAAA,CAEb+C,CAAY,CAAA,KAAA,CAAM,KAAK7F,CAAO,CAAA,UAAU,CAAE,CAAA,MAAA,CAC9CnC,CAAK,EAAA,CAxVX,IAAAT,CAAA6E,CAAAA,CAAAA,CAyVQ,OAAApE,CAAK,CAAA,QAAA,GAAa,KAAK,SACvBT,EAAAA,CAAAA,CAAAA,CAAAA,CAAAS,CAAK,CAAA,eAAA,GAAL,IAAAT,CAAAA,KAAAA,CAAAA,CAAAA,CAAAA,CAAsB,YAAa,IAAK,CAAA,YAAA,EAAA,CAAA,CACxC6E,CAAApE,CAAAA,CAAAA,CAAK,WAAL,GAAA,IAAA,CAAA,KAAA,CAAA,CAAAoE,EAAkB,QAAa,IAAA,IAAA,CAAK,YACxC,CAAA,CAAA,CAEA,OAAAyD,CAAAA,CAAU,QAAQ,CAAC7H,CAAAA,CAAMX,CAAU,GAAA,CACjC,IAAMgB,CAAAA,CAAMqF,EAAO1F,CAAMX,CAAAA,CAAK,CAC1BW,CAAAA,CAAAA,CAAK,QAAa,GAAA,IAAA,CAAK,UACzBgI,CAAU,CAAA,OAAA,CAAQC,CAAM,EAAA,CAClBjI,CAAK,CAAA,WAAA,GAAgBiI,EAAG,WAC1B9F,EAAAA,CAAAA,CAAO,YAAanC,CAAAA,CAAAA,CAAMiI,CAAE,EAEhC,CAAC,CAED/F,CAAAA,CAAAA,CAAYC,EAAQnC,CAAMoC,CAAAA,CAAM,EAElC6C,CAAO,CAAA,GAAA,CAAI5E,CAAKL,CAAAA,CAAI,EACtB,CAAC,EACMiF,CACT,CACF,CC7VO,CAAA,SAASiD,CACd/H,CAAAA,CAAAA,CACAC,EACAC,CACa,CAAA,CACb,GAAI8H,QAAAA,CAAShI,CAAQ,CAAA,CAAA,CACnB,GAAI2D,EAAc3D,CAAAA,CAAQ,EAAG,CAC3B,IAAMiI,EAAerE,EAAiB5D,CAAAA,CAAQ,CAC9C,CAAA,OAAAC,CAAQ,CAAA,CAAE,CAACtB,CAAe,EAAGsB,CAAM,CAAA,CAC5B,IAAI8F,CAAAA,CAAaC,EAAeiC,CAAY,CAAA,CAAGhI,CAAOC,CAAAA,CAAG,CAClE,CAAA,KAAA,GAAWF,IAAavB,CACtB,CAAA,OAAAwB,EAAQ,CAAE,CAACvB,CAAiB,EAAGuB,CAAM,CAC9B,CAAA,IAAI8F,CAAaC,CAAAA,CAAAA,CAAevH,CAAc,CAAGwB,CAAAA,CAAAA,CAAOC,CAAG,CAAA,CAItE,OAAOU,UAAAA,CAAWZ,CAAQ,CACtB,CAAA,IAAI8D,CAAc9D,CAAAA,CAAAA,CAAUC,CAAOC,CAAAA,CAAG,EACtC,IAAI6F,CAAAA,CAAa/F,CAAiCC,CAAAA,CAAAA,CAAOC,CAAG,CAClE,CAQO,SAASgI,EAAAA,CAAYrI,CAAsC,CAAA,CAChE,OAAOA,CAAAA,YAAgBiE,CACzB,CASO,SAASlC,CAAa/B,CAAAA,CAAAA,CAAkC,CAC7D,OAAOA,aAAgBiE,CAAiBjE,EAAAA,CAAAA,YAAgBkG,CAC1D,CAQO,SAASC,CAAAA,CAAemC,EAAmC,CAChE,IAAMnI,EAAW,QAAS,CAAA,aAAA,CAAc,UAAU,CAClD,CAAA,OAAAA,CAAS,CAAA,SAAA,CAAYmD,EAAcgF,CAAAA,CAAI,EAChCnI,CACT,CAQO,SAASoI,EAAAA,CAOdnI,CAAwB,CAAA,CACxB,OAAO8H,CAAEtJ,CAAAA,CAAAA,CAAgB,CACvB,QAAA,CAAU0B,OAAQF,CAAAA,CAAAA,CAAM,QAAQ,CAAIA,CAAAA,CAAAA,CAAM,SAAS,MAAO,CAAA,OAAO,EAAI,CAACA,CAAAA,CAAM,QAAQ,CACtF,CAAC,CACH,CC3EO,SAASoI,EAAQ9I,CAAAA,CAAAA,CAAsB,CAE5CI,EAAiB,GAAOA,EAAAA,CAAAA,CAAiB,IAAI,OAAQ,CAAA,SAAA,CAAWJ,CAAE,EACpE,CAUO,SAAS+I,EAAAA,CAAU/I,CAAsB,CAAA,CAE9CI,CAAiB,CAAA,GAAA,EAAOA,CAAiB,CAAA,GAAA,CAAI,QAAQ,SAAWJ,CAAAA,CAAE,EACpE,CAuBO,SAASgJ,GACdrI,CACAT,CAAAA,CAAAA,CACM,CAENE,CAAiB,CAAA,GAAA,EAAOA,CAAiB,CAAA,GAAA,CAAI,UAAWO,CAAAA,CAAAA,CAAeT,CAAK,EAC9E,CAcO,SAAS+I,EAAAA,CACdtI,CACAuI,CAAAA,CAAAA,CACuD,CA1EzD,IAAArJ,CAAAA,CA2EE,OACQA,CAAAA,CAAAA,CAAAO,CAAiB,CAAA,GAAA,EAAOA,CAAiB,CAAA,GAAA,CAAI,WAAWO,CAAa,CAAA,GAArE,IAAAd,CAAAA,CAAAA,CAA2EqJ,CACrF,CAeO,SAASC,EAA8B,EAAA,CAC5C,OAAOrB,aAAAA,CAAwB,IAAI,CACrC,CChFO,SAASsB,EAAAA,CAAeC,EAA2B3I,CAAuB,CAAA,CAC/EnB,EAAc,MAAO,EAAA,CAIrB,IAAMqJ,CAAAA,CAFU,IAAIrI,CAAAA,CAAQ8I,EAAW3I,CAAS,EAAA,EAAE,CAAA,CAE7B,KAAM,EAAA,CAC3B,OAAAnB,CAAc,CAAA,SAAA,EACPqJ,CAAAA,CACT,CAWO,SAASU,GAAQD,CAA2BE,CAAAA,CAAAA,CAAmC,CAEpF,IAAMC,CAAAA,CAAc,OAAOD,CAAc,EAAA,QAAA,CAAW,QAAS,CAAA,aAAA,CAAcA,CAAS,CAAA,CAAIA,EAExF,GAAI,CAACC,CACH,CAAA,MAAM,IAAI,KAAA,CAAM,6BAA6BD,CAAS,CAAA,CAAE,CAE1DhK,CAAAA,CAAAA,CAAc,MAAO,EAAA,CAErBiJ,EAAEa,CAAS,CAAA,CAAE,KAAMG,CAAAA,CAAW,CAC9BjK,CAAAA,CAAAA,CAAc,YAChB,CAWO,SAASkK,EAAAA,CAAIJ,CAA2B3I,CAAAA,CAAAA,CAAsC,CACnF,OAAInB,CAAAA,CAAc,KACT,CAAA,IAAIgB,CAAQ8I,CAAAA,CAAAA,CAAW3I,CAAK,CAG9B8H,CAAAA,CAAAA,CAAEa,CAAW3I,CAAAA,CAAK,CAC3B","file":"template.esm.js","sourcesContent":["/**\n * Framework render type\n *\n * CLIENT: client side\n * SSR: server side render\n * SSG: server side generate\n */\nexport enum RENDER_MODE {\n CLIENT,\n SSG,\n SSR,\n}\n\nexport const EVENT_PREFIX = 'on';\nexport const UPDATE_PREFIX = 'update';\nexport const CHILDREN_PROP = 'children';\n\nexport const EMPTY_TEMPLATE = '';\nexport const FRAGMENT_PROP_KEY = '0';\nexport const SINGLE_PROP_KEY = '1';\nexport const STYLE_KEY = 'style';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\n// Enum to represent different types of components\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\n// Function to enter a component and set its index\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\n// Function to get the index of a component\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal/*';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === 'children') {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== 'children' && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!SELF_CLOSING_TAGS.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, shallowReactive, useEffect } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, UPDATE_PREFIX } from './sharedConfig';\nimport type { TemplateNode } from './templateNode';\nimport type { EssorComponent, NodeTrack, Props } from '../types';\n\nexport class ComponentNode extends LifecycleContext implements JSX.Element {\n private proxyProps: Record<string, Signal<unknown>>;\n private emitter = new Set<() => void>();\n private rootNode: TemplateNode | null = null;\n private trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n this.key ||= props?.key as string;\n this.proxyProps = this.createProxyProps(props);\n }\n\n private createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return shallowReactive(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(this.proxyProps);\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.callMountHooks();\n this.patchProps(this.props);\n this.removeRef();\n\n return mountedNode;\n }\n\n unmount(): void {\n this.callDestroyHooks();\n this.clearHooks();\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.clearEmitter();\n }\n\n private callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n private callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n private clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n private getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === 'ref') {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n private patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n private patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n private patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n private patchNormalProp(key: string, prop: any): void {\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n this.proxyProps[key] = isFunction(prop) ? prop() : prop;\n });\n }\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './jsxRenderer';\n\n// Type alias for nodes that can be either DOM Node or JSX Element\ntype AnyNode = Node | JSX.Element;\n\n/**\n * Patches children of a parent node with new children.\n * This function is responsible for efficiently updating the DOM to reflect changes in the virtual DOM.\n *\n * @param parent - The parent node whose children are being updated\n * @param childrenMap - A map of current children, keyed by their unique identifiers\n * @param nextChildren - An array of new children to be patched in\n * @param before - The node before which new children should be inserted (if any)\n * @returns A new map of children after patching\n */\nexport function patchChildren(\n parent: Node,\n childrenMap: Map<string, AnyNode>,\n nextChildren: AnyNode[],\n before: Node | null,\n): Map<string, AnyNode> {\n const result = new Map<string, AnyNode>();\n const children = Array.from(childrenMap.values());\n\n // If there are no new children, clear all existing children\n if (children.length && nextChildren.length === 0) {\n clearChildren(parent, children, before);\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n // Iterate through new children and patch or insert as necessary\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\n // Remove any current children that are not in the new children set\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children[++childIndex];\n currKey = getKey(currChild, i);\n }\n\n const key = getKey(child, i);\n const origChild = childrenMap.get(key);\n\n // If the child already exists, patch it\n if (origChild) {\n child = patch(parent, origChild, child);\n }\n\n // Handle insertion or replacement of children\n if (currChild) {\n if (currChild === origChild) {\n childIndex++;\n } else {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n }\n } else {\n insertChild(parent, child, before);\n }\n\n result.set(key, child);\n }\n\n // Replace placeholders with actual nodes\n replaces.forEach(([placeholder, child]) => {\n replaceChild(parent, child, placeholder);\n });\n\n // Remove any remaining children that weren't in the new set\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\n/**\n * Clears all children from a parent node.\n *\n * @param parent - The parent node to clear children from\n * @param children - The array of children to be cleared\n * @param before - The node before which clearing should stop (if any)\n */\nfunction clearChildren(parent: Node, children: AnyNode[], before: Node | null) {\n if (parent.childNodes.length === children.length + (before ? 1 : 0)) {\n (parent as Element).innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children[0];\n const start = isJsxElement(child) ? child.firstChild : child;\n range.setStartBefore(start!);\n if (before) {\n range.setEndBefore(before);\n } else {\n range.setEndAfter(parent);\n }\n range.deleteContents();\n }\n children.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n}\n\n/**\n * Patches a single node, replacing it with a new node if necessary.\n *\n * @param parent - The parent node\n * @param node - The current node\n * @param next - The new node to patch with\n * @returns The patched node\n */\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\n/**\n * Maps an array of nodes to a Map, using their keys as identifiers.\n *\n * @param children - The array of nodes to map\n * @returns A Map of nodes, keyed by their unique identifiers\n */\nexport function mapKeys(children: AnyNode[]): Map<string, AnyNode> {\n const result = new Map();\n for (const [i, child] of children.entries()) {\n const key = getKey(child, i);\n result.set(key, child);\n }\n return result;\n}\n\n/**\n * Gets the key for a node, either from its 'key' property (if it's a JSX element)\n * or generates a key based on its index.\n *\n * @param node - The node to get the key for\n * @param index - The index of the node in its parent's children array\n * @returns A string key for the node\n */\nexport function getKey(node: AnyNode, index: number): string {\n if (isJsxElement(node)) {\n const jsxKey = (node as any).key;\n if (jsxKey !== undefined && jsxKey !== null) {\n return String(jsxKey);\n }\n }\n return `_$${index}$`;\n}\n","import {\n capitalize,\n coerceArray,\n isArray,\n isFunction,\n isHTMLElement,\n isNil,\n isPrimitive,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, shallowSignal, useEffect } from '@estjs/signal';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n FRAGMENT_PROP_KEY,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n // Private properties for managing the node's state\n private treeMap = new Map<number, Node>();\n private mounted = false;\n private nodes: Node[] = [];\n private trackMap = new Map<string, NodeTrack>();\n private bindValueKeys: string[] = [];\n private componentIndex: number;\n private parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n this.key ||= props?.key as string;\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n if (isArray(this.template)) {\n this.template = createTemplate(this.template.join(''));\n }\n\n const cloneNode = this.template.content.cloneNode(true);\n const firstChild = cloneNode.firstChild as HTMLElement | null;\n\n if (firstChild?.hasAttribute?.('_svg_')) {\n firstChild.remove();\n firstChild?.childNodes.forEach(node => {\n (cloneNode as Element).append(node);\n });\n }\n\n this.nodes = Array.from(cloneNode.childNodes);\n\n if (renderContext.isSSR) {\n this.mapSSGNodeTree(parent as HTMLElement);\n } else {\n this.mapNodeTree(parent, cloneNode);\n }\n insertChild(parent, cloneNode, before);\n this.patchProps(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n // Fragment\n if (!this.template.innerHTML && !this.nodes.length) {\n const children = this.props?.[FRAGMENT_PROP_KEY]?.children;\n\n if (children) {\n if (isArray(children)) {\n children.forEach(child => {\n this.deleteFragmentTextNode(child);\n });\n } else {\n this.deleteFragmentTextNode(children);\n }\n }\n }\n\n this.nodes = [];\n this.mounted = false;\n }\n\n deleteFragmentTextNode(child) {\n if (isPrimitive(child)) {\n this.parent?.childNodes.forEach(node => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent === `${child as any}`) {\n this.parent?.removeChild(node);\n }\n });\n } else {\n removeChild(child);\n }\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n private mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // Private method to map node tree\n private mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n private walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n private handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n private patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n private patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === 'ref') {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, 'on')) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n private getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const UPDATE_PREFIX = 'update';\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n private patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n private patchEventListener(key: string, node: Node, attr: string, listener: EventListener): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n private patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n const cleanup = useEffect(() => {\n // triggger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (JSON.stringify(triggerValue.value) === JSON.stringify(val2)) return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n private getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n private patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n private reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport type { EssorComponent, EssorNode, Props } from '../types';\n\n/**\n * Creates a JSX element from a given template.\n *\n * @param template - The template to render. Can be a string representing an HTML\n * element, a function representing a component, or an `HTMLTemplateElement`.\n * @param props - Properties to pass to the component or element.\n * @param key - The key of the element.\n * @returns The created JSX element.\n */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n template: EssorComponent | HTMLTemplateElement | K | '',\n props?: Props,\n key?: string,\n): JSX.Element {\n if (isString(template)) {\n if (isHtmlTagName(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n } else if (template === EMPTY_TEMPLATE) {\n props = { [FRAGMENT_PROP_KEY]: props };\n return new TemplateNode(createTemplate(EMPTY_TEMPLATE), props, key);\n }\n }\n\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template as HTMLTemplateElement, props, key);\n}\n\n/**\n * Checks if the given node is an instance of `ComponentNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is an instance of `ComponentNode`, otherwise `false`.\n */\nexport function isComponent(node: unknown): node is ComponentNode {\n return node instanceof ComponentNode;\n}\n\n/**\n * Checks if the given node is a JSX element. A JSX element is either an instance\n * of `ComponentNode` or an instance of `TemplateNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is a JSX element, otherwise `false`.\n */\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\n/**\n * Creates an HTML template element from a given HTML string.\n *\n * @param html The HTML string to create a template from.\n * @returns A new HTML template element.\n */\nexport function createTemplate(html: string): HTMLTemplateElement {\n const template = document.createElement('template');\n template.innerHTML = closeHtmlTags(html);\n return template;\n}\n\n/**\n * @param props - An object containing the `children` prop.\n * @param props.children - The children to be rendered. Can be a single JSX element, string, number, boolean,\n * or an array of these. Falsy values in arrays will be filtered out.\n * @returns A JSX element representing the fragment, wrapping the filtered children.\n */\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(props: { children: T }) {\n return h(EMPTY_TEMPLATE, {\n children: isArray(props.children) ? props.children.filter(Boolean) : [props.children],\n });\n}\n","import { isSymbol } from '@estjs/shared';\nimport { type Signal, shallowSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('useProvide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function useInject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('useInject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n\n/**\n * Creates a reactive ref that can be used to reference a DOM node\n * or a component instance within the component function body.\n *\n * @returns a reactive ref signal\n *\n * @example\n * const inputRef = useRef<HTMLInputElement>()\n *\n * <input ref={inputRef} />\n *\n * inputRef.value // input element\n */\nexport function useRef<T>(): Signal<T | null> {\n return shallowSignal<T | null>(null);\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sharedConfig.ts","../src/lifecycleContext.ts","../src/ssgNode.ts","../src/utils.ts","../src/componentNode.ts","../src/templateNode.ts","../../shared/src/comm.ts","../../shared/src/is.ts","../src/patch.ts","../src/jsxRenderer.ts","../src/hooks.ts","../src/server.ts"],"names":["EVENT_PREFIX","UPDATE_PREFIX","CHILDREN_PROP","EMPTY_TEMPLATE","FRAGMENT_PROP_KEY","SINGLE_PROP_KEY","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","HTML_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","closeHtmlTags","input","tagStack","tagPattern","lastIndex","fullMatch","isEndTag","unclosedTag","isHtmlTagName","convertToHtmlTag","signal","ComponentNode","signalObject","startsWith","_b","_c","_d","useReactive","mountedNode","cleanup","trackKey","track","prop","event","newValue","useSignal","useEffect","_toString","isPlainObject","val","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","isPrimitive","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","triggerValue","shallowSignal","val2","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","h","isString","htmlTemplate","isComponent","html","Fragment","onMount","onDestroy","useProvide","useInject","defaultValue","useRef","renderToString","component","hydrate","container","rootElement","ssg"],"mappings":"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","file":"template.esm.js","sourcesContent":["/**\n * Framework render type\n *\n * CLIENT: client side\n * SSR: server side render\n * SSG: server side generate\n */\nexport enum RENDER_MODE {\n CLIENT,\n SSG,\n SSR,\n}\n\nexport const EVENT_PREFIX = 'on';\nexport const UPDATE_PREFIX = 'update';\nexport const CHILDREN_PROP = 'children';\n\nexport const EMPTY_TEMPLATE = '';\nexport const FRAGMENT_PROP_KEY = '0';\nexport const SINGLE_PROP_KEY = '1';\nexport const STYLE_KEY = 'style';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\n// Enum to represent different types of components\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\n// Function to enter a component and set its index\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\n// Function to get the index of a component\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal/*';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === 'children') {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== 'children' && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!SELF_CLOSING_TAGS.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, signalObject, useEffect, useSignal } from '@estjs/signal';\nimport { useReactive } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, UPDATE_PREFIX } from './sharedConfig';\nimport type { TemplateNode } from './templateNode';\nimport type { EssorComponent, NodeTrack, Props } from '../types';\n\nexport class ComponentNode extends LifecycleContext implements JSX.Element {\n private proxyProps: Record<string, Signal<unknown>>;\n private emitter = new Set<() => void>();\n private rootNode: TemplateNode | null = null;\n private trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n\n this.key ||= props?.key as string;\n this.proxyProps = this.createProxyProps(props);\n }\n\n private createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return signalObject(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(useReactive(this.proxyProps, ['children']));\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.callMountHooks();\n this.patchProps(this.props);\n this.removeRef();\n\n return mountedNode;\n }\n\n unmount(): void {\n this.callDestroyHooks();\n this.clearHooks();\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.clearEmitter();\n }\n\n private callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n private callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n private clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n private getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === 'ref') {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n private patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n private patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n private patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n private patchNormalProp(key: string, prop: any): void {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = isFunction(prop) ? prop() : prop;\n });\n }\n}\n","import {\n capitalize,\n coerceArray,\n isArray,\n isFunction,\n isHTMLElement,\n isNil,\n isPrimitive,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, shallowSignal, useEffect } from '@estjs/signal';\nimport { isPlainObject } from './../../shared/src/is';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n FRAGMENT_PROP_KEY,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n // Private properties for managing the node's state\n private treeMap = new Map<number, Node>();\n private mounted = false;\n private nodes: Node[] = [];\n private trackMap = new Map<string, NodeTrack>();\n private bindValueKeys: string[] = [];\n private componentIndex: number;\n private parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n this.key ||= props?.key as string;\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n if (isArray(this.template)) {\n this.template = createTemplate(this.template.join(''));\n }\n\n const cloneNode = this.template.content.cloneNode(true);\n const firstChild = cloneNode.firstChild as HTMLElement | null;\n\n if (firstChild?.hasAttribute?.('_svg_')) {\n firstChild.remove();\n firstChild?.childNodes.forEach(node => {\n (cloneNode as Element).append(node);\n });\n }\n\n this.nodes = Array.from(cloneNode.childNodes);\n\n if (renderContext.isSSR) {\n this.mapSSGNodeTree(parent as HTMLElement);\n } else {\n this.mapNodeTree(parent, cloneNode);\n }\n insertChild(parent, cloneNode, before);\n this.patchProps(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n // Fragment\n if (!this.template.innerHTML && !this.nodes.length) {\n const children = this.props?.[FRAGMENT_PROP_KEY]?.children;\n\n if (children) {\n if (isArray(children)) {\n children.forEach(child => {\n this.deleteFragmentTextNode(child);\n });\n } else {\n this.deleteFragmentTextNode(children);\n }\n }\n }\n\n this.nodes = [];\n this.mounted = false;\n }\n\n deleteFragmentTextNode(child) {\n if (isPrimitive(child)) {\n this.parent?.childNodes.forEach(node => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent === `${child as any}`) {\n this.parent?.removeChild(node);\n }\n });\n } else {\n removeChild(child);\n }\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n private mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // Private method to map node tree\n private mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n private walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n private handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n private patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n private patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === 'ref') {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, 'on')) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n private getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const UPDATE_PREFIX = 'update';\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n private patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n private patchEventListener(key: string, node: Node, attr: string, listener: EventListener): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n private patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n\n const cleanup = useEffect(() => {\n // triggger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (\n isPlainObject(val2) &&\n isPlainObject(triggerValue.peek()) &&\n JSON.stringify(triggerValue.value) === JSON.stringify(val2)\n )\n return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n private getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n private patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n private reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { isArray, isFunction, isString } from './is';\n\nexport const _toString = Object.prototype.toString;\nexport const extend = Object.assign;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nexport const hasOwn = (val: object, key: string | symbol): key is keyof typeof val =>\n hasOwnProperty.call(val, key);\n\nexport function coerceArray<T>(data: T | T[]): T[] {\n return isArray(data) ? (data.flat() as T[]) : [data];\n}\nexport const hasChanged = (value, oldValue) =>\n value !== oldValue && (value === value || oldValue === oldValue);\nexport const noop = Function.prototype as () => void;\n\n/**\n * A function that checks if a string starts with a specific substring.\n * indexOf faster under normal circumstances\n * @see https://www.measurethat.net/Benchmarks/Show/12350/0/startswith-vs-test-vs-match-vs-indexof#latest_results_block\n\n * @param {string} str - The input string to check.\n * @param {string} searchString - The substring to check for at the beginning of the input string.\n * @return {boolean} Returns true if the input string starts with the specified substring, otherwise false.\n */\nexport function startsWith(str, searchString) {\n if (!isString(str)) {\n return false;\n }\n return str.indexOf(searchString) === 0;\n}\n\n/**\n * Escapes special HTML characters in a string.\n * @param str - The string to escape.\n * @returns The escaped string.\n */\nexport function escape(str: string): string {\n return str.replaceAll(/[\"&'<>]/g, char => {\n switch (char) {\n case '&':\n return '&';\n case '<':\n return '<';\n case '>':\n return '>';\n case '\"':\n return '"';\n case \"'\":\n return ''';\n default:\n return char;\n }\n });\n}\n\nexport type ExcludeType = ((key: string | symbol) => boolean) | (string | symbol)[];\n\n/**\n * Checks if a key should be excluded based on the provided exclude criteria.\n * @param key - The key to check.\n * @param exclude - The exclusion criteria.\n * @returns True if the key should be excluded, otherwise false.\n */\nexport function isExclude(key: string | symbol, exclude?: ExcludeType): boolean {\n return isArray(exclude) ? exclude.includes(key) : isFunction(exclude) ? exclude(key) : false;\n}\n\n/**\n * Generates a unique random 8 character string ID.\n * The generated IDs only contain alphanumeric characters.\n * @returns A unique random 8 character string ID.\n */\nexport function generateUniqueId() {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n const charactersLength = characters.length;\n for (let i = 0; i < 8; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n\n/**\n * Checks if the current environment is a browser.\n * @returns True if the current environment is a browser, otherwise false.\n */\nexport function isBrowser() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport const cacheStringFunction = <T extends (str: string) => string>(fn: T): T => {\n const cache: Record<string, string> = Object.create(null);\n return ((str: string) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n }) as T;\n};\n","import { _toString } from './comm';\n\nexport const isObject = (val: unknown): val is Record<any, any> =>\n val !== null && typeof val === 'object';\nexport function isPromise(val: any): val is Promise<any> {\n return _toString.call(val) === '[object Promise]';\n}\n\nexport const isArray = Array.isArray;\n\nexport function isString(val: unknown): val is string {\n return typeof val === 'string';\n}\nexport function isNull(val: any): val is null {\n return val === null;\n}\nexport function isSymbol(val: unknown): val is symbol {\n return typeof val === 'symbol';\n}\n\nexport function isSet(val: any): val is Set<any> {\n return _toString.call(val) === '[object Set]';\n}\nexport function isWeakMap(val: any): val is WeakMap<any, any> {\n return _toString.call(val) === '[object WeakMap]';\n}\nexport function isWeakSet(val: any): val is WeakSet<any> {\n return _toString.call(val) === '[object WeakSet]';\n}\n\nexport function isMap(val: unknown): val is Map<any, any> {\n return _toString.call(val) === '[object Map]';\n}\nexport function isNil(x: any): x is null | undefined {\n return x === null || x === undefined;\n}\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function';\n\nexport function isFalsy(x: any): x is false | null | undefined {\n return x === false || x === null || x === undefined;\n}\n\nexport const isPrimitive = (\n val: unknown,\n): val is string | number | boolean | symbol | null | undefined =>\n ['string', 'number', 'boolean', 'symbol', 'undefined'].includes(typeof val) || isNull(val);\n\nexport function isHTMLElement(obj) {\n if (!obj) return false;\n return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';\n}\n\nexport const isPlainObject = (val: unknown): val is object =>\n _toString.call(val) === '[object Object]';\n\nexport type StringNumber = `${number}`;\nexport function isStringNumber(val: unknown): val is StringNumber {\n if (!isString(val)) {\n return false;\n }\n return !Number.isNaN(Number(val));\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './jsxRenderer';\n\n// Type alias for nodes that can be either DOM Node or JSX Element\ntype AnyNode = Node | JSX.Element;\n\n/**\n * Patches children of a parent node with new children.\n * This function is responsible for efficiently updating the DOM to reflect changes in the virtual DOM.\n *\n * @param parent - The parent node whose children are being updated\n * @param childrenMap - A map of current children, keyed by their unique identifiers\n * @param nextChildren - An array of new children to be patched in\n * @param before - The node before which new children should be inserted (if any)\n * @returns A new map of children after patching\n */\nexport function patchChildren(\n parent: Node,\n childrenMap: Map<string, AnyNode>,\n nextChildren: AnyNode[],\n before: Node | null,\n): Map<string, AnyNode> {\n const result = new Map<string, AnyNode>();\n const children = Array.from(childrenMap.values());\n\n // If there are no new children, clear all existing children\n if (children.length && nextChildren.length === 0) {\n clearChildren(parent, children, before);\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n // Iterate through new children and patch or insert as necessary\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\n // Remove any current children that are not in the new children set\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children[++childIndex];\n currKey = getKey(currChild, i);\n }\n\n const key = getKey(child, i);\n const origChild = childrenMap.get(key);\n\n // If the child already exists, patch it\n if (origChild) {\n child = patch(parent, origChild, child);\n }\n\n // Handle insertion or replacement of children\n if (currChild) {\n if (currChild === origChild) {\n childIndex++;\n } else {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n }\n } else {\n insertChild(parent, child, before);\n }\n\n result.set(key, child);\n }\n\n // Replace placeholders with actual nodes\n replaces.forEach(([placeholder, child]) => {\n replaceChild(parent, child, placeholder);\n });\n\n // Remove any remaining children that weren't in the new set\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\n/**\n * Clears all children from a parent node.\n *\n * @param parent - The parent node to clear children from\n * @param children - The array of children to be cleared\n * @param before - The node before which clearing should stop (if any)\n */\nfunction clearChildren(parent: Node, children: AnyNode[], before: Node | null) {\n if (parent.childNodes.length === children.length + (before ? 1 : 0)) {\n (parent as Element).innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children[0];\n const start = isJsxElement(child) ? child.firstChild : child;\n range.setStartBefore(start!);\n if (before) {\n range.setEndBefore(before);\n } else {\n range.setEndAfter(parent);\n }\n range.deleteContents();\n }\n children.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n}\n\n/**\n * Patches a single node, replacing it with a new node if necessary.\n *\n * @param parent - The parent node\n * @param node - The current node\n * @param next - The new node to patch with\n * @returns The patched node\n */\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\n/**\n * Maps an array of nodes to a Map, using their keys as identifiers.\n *\n * @param children - The array of nodes to map\n * @returns A Map of nodes, keyed by their unique identifiers\n */\nexport function mapKeys(children: AnyNode[]): Map<string, AnyNode> {\n const result = new Map();\n for (const [i, child] of children.entries()) {\n const key = getKey(child, i);\n result.set(key, child);\n }\n return result;\n}\n\n/**\n * Gets the key for a node, either from its 'key' property (if it's a JSX element)\n * or generates a key based on its index.\n *\n * @param node - The node to get the key for\n * @param index - The index of the node in its parent's children array\n * @returns A string key for the node\n */\nexport function getKey(node: AnyNode, index: number): string {\n if (isJsxElement(node)) {\n const jsxKey = (node as any).key;\n if (jsxKey !== undefined && jsxKey !== null) {\n return String(jsxKey);\n }\n }\n return `_$${index}$`;\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport type { EssorComponent, EssorNode, Props } from '../types';\n\n/**\n * Creates a JSX element from a given template.\n *\n * @param template - The template to render. Can be a string representing an HTML\n * element, a function representing a component, or an `HTMLTemplateElement`.\n * @param props - Properties to pass to the component or element.\n * @param key - The key of the element.\n * @returns The created JSX element.\n */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n template: EssorComponent | HTMLTemplateElement | K | '',\n props?: Props,\n key?: string,\n): JSX.Element {\n if (isString(template)) {\n if (isHtmlTagName(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n } else if (template === EMPTY_TEMPLATE) {\n props = { [FRAGMENT_PROP_KEY]: props };\n return new TemplateNode(createTemplate(EMPTY_TEMPLATE), props, key);\n }\n }\n\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template as HTMLTemplateElement, props, key);\n}\n\n/**\n * Checks if the given node is an instance of `ComponentNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is an instance of `ComponentNode`, otherwise `false`.\n */\nexport function isComponent(node: unknown): node is ComponentNode {\n return node instanceof ComponentNode;\n}\n\n/**\n * Checks if the given node is a JSX element. A JSX element is either an instance\n * of `ComponentNode` or an instance of `TemplateNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is a JSX element, otherwise `false`.\n */\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\n/**\n * Creates an HTML template element from a given HTML string.\n *\n * @param html The HTML string to create a template from.\n * @returns A new HTML template element.\n */\nexport function createTemplate(html: string): HTMLTemplateElement {\n const template = document.createElement('template');\n template.innerHTML = closeHtmlTags(html);\n return template;\n}\n\n/**\n * @param props - An object containing the `children` prop.\n * @param props.children - The children to be rendered. Can be a single JSX element, string, number, boolean,\n * or an array of these. Falsy values in arrays will be filtered out.\n * @returns A JSX element representing the fragment, wrapping the filtered children.\n */\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(props: { children: T }) {\n return h(EMPTY_TEMPLATE, {\n children: isArray(props.children) ? props.children.filter(Boolean) : [props.children],\n });\n}\n","import { isSymbol } from '@estjs/shared';\nimport { type Signal, shallowSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('useProvide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function useInject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('useInject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n\n/**\n * Creates a reactive ref that can be used to reference a DOM node\n * or a component instance within the component function body.\n *\n * @returns a reactive ref signal\n *\n * @example\n * const inputRef = useRef<HTMLInputElement>()\n *\n * <input ref={inputRef} />\n *\n * inputRef.value // input element\n */\nexport function useRef<T>(): Signal<T | null> {\n return shallowSignal<T | null>(null);\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@estjs/template",
|
|
3
|
-
"version": "0.0.14-beta.
|
|
3
|
+
"version": "0.0.14-beta.6",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [],
|
|
@@ -54,8 +54,8 @@
|
|
|
54
54
|
"jsdelivr": "dist/template.esm.js",
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"csstype": "^3.1.3",
|
|
57
|
-
"@estjs/shared": "0.0.14-beta.
|
|
58
|
-
"@estjs/signal": "0.0.14-beta.
|
|
57
|
+
"@estjs/shared": "0.0.14-beta.6",
|
|
58
|
+
"@estjs/signal": "0.0.14-beta.6"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
61
|
"build": "tsup && cross-env NODE_ENV=production tsup --clean=false --treeshake --sourcemap=false",
|