@estjs/template 0.0.14-beta.6 → 0.0.14
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 +3 -23
- package/dist/template.cjs.js.map +1 -1
- package/dist/template.d.cts +76 -40
- package/dist/template.d.ts +76 -40
- package/dist/template.dev.cjs.js +100 -145
- package/dist/template.dev.esm.js +101 -145
- package/dist/template.esm.js +3 -9
- package/dist/template.esm.js.map +1 -1
- package/package.json +3 -3
package/dist/template.cjs.js
CHANGED
|
@@ -1,27 +1,7 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var shared = require('@estjs/shared');
|
|
4
|
-
var signal = require('@estjs/signal');
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @estjs/template v0.0.14-beta.6
|
|
1
|
+
'use strict';var shared=require('@estjs/shared'),signal=require('@estjs/signal');/**
|
|
2
|
+
* @estjs/template v0.0.14
|
|
8
3
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
9
4
|
* @license MIT
|
|
10
5
|
**/
|
|
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
|
-
|
|
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
|
-
exports.template = P;
|
|
23
|
-
exports.useInject = Je;
|
|
24
|
-
exports.useProvide = Ge;
|
|
25
|
-
exports.useRef = Ve;
|
|
26
|
-
//# sourceMappingURL=template.cjs.js.map
|
|
6
|
+
var R="on",w="update",E="children",A="",U="0",B="1";var H="ref",_=" __PLACEHOLDER__ ";var G=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;}},u=new G,q=new Map;function z(n,t){q.set(n,{index:t});}function W(n){var t;return (t=q.get(n))==null?void 0:t.index}var T=class T{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(t,e){var o;(o=this.hooks[t])==null||o.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 l=T;function O(n){return n instanceof b}var C=1,b=class extends l{constructor(e,o={},r){super();this.template=e;this.props=o;this.key=r;z(e,C),this.templates=this.processTemplate();}processTemplate(){if(shared.isArray(this.template)){let e=this.template.join(_);return this.processHtmlString(e).split(_)}return []}processHtmlString(e){return e.replaceAll(/(<[^>]+>)|([^<]+)/g,(o,r,i)=>r?r.includes("data-ci")?o:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,c,a)=>`<${c} data-ci="${C}"${a||""}>`):i&&i.replace(_,"").trim()?`<!--0-${C}-->${i}<!$>`:o)}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,o])=>{let r=o.children;this.normalizeProps(o);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(o)}`);}),this.templates.join("")}normalizeProps(e){Object.entries(e).forEach(([o,r])=>{o===E||shared.isFunction(r)?delete e[o]:signal.isSignal(r)&&(e[o]=r.value);});}generateAttributes(e){return Object.entries(e).filter(([o,r])=>o!==E&&!shared.isFunction(r)).map(([o,r])=>`${o}="${shared.escape(String(r))}"`).join(" ")}renderChildren(e,o){e.forEach(([r])=>{C++;let i=this.renderChild(r);this.templates[o]+=i;});}renderChild(e){if(signal.isSignal(e))return `<!--1-${C}-->${e.value}<!$>`;if(shared.isFunction(e))return this.renderChild(e(this.props));if(O(e)){let o=e.mount();return shared.isFunction(o)?o(this.props):$(o)}else return `<!--1-${C}-->${e}<!$>`}};var Ne="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(",");function D(n){if(h(n)||n instanceof Node||O(n))return n;let t=shared.isFalsy(n)?"":String(n);return document.createTextNode(t)}function g(n,t,e=null){let o=h(e)?e.firstChild:e,r=u.isSSR;h(t)?t.mount(n,o):o&&!r?o.before(t):r||n.append(t);}function M(n){h(n)?n.unmount():n.parentNode&&n.remove();}function F(n,t,e){g(n,t,e),M(e);}function ee(n,t,e){t==="class"?Ee(n,e):t==="style"?ge(n,e):Te(n,t,e);}function Ee(n,t){typeof t=="string"?n.className=t:shared.isArray(t)?n.className=t.join(" "):t&&typeof t=="object"&&(n.className=Object.entries(t).reduce((e,[o,r])=>e+(r?` ${o}`:""),"").trim());}function ge(n,t){typeof t=="string"?n.style.cssText=t:t&&typeof t=="object"&&Object.entries(t).forEach(([o,r])=>{n.style.setProperty(shared.kebabCase(o),String(r));});}function Te(n,t,e){shared.isFalsy(e)?n.removeAttribute(t):e===!0?n.setAttribute(t,""):n instanceof HTMLInputElement&&t==="value"?n.value=String(e):n.setAttribute(t,String(e));}function te(n,t){if(n instanceof HTMLInputElement)switch(n.type){case"checkbox":return m(n,"change",()=>{t(!!n.checked);});case"date":return m(n,"change",()=>{t(n.value?n.value:"");});case"file":return m(n,"change",()=>{n.files&&t(n.files);});case"number":return m(n,"input",()=>{let e=Number.parseFloat(n.value);t(Number.isNaN(e)?"":String(e));});case"radio":return m(n,"change",()=>{t(n.checked?n.value:"");});case"text":return m(n,"input",()=>{t(n.value);})}if(n instanceof HTMLSelectElement)return m(n,"change",()=>{t(n.value);});if(n instanceof HTMLTextAreaElement)return m(n,"input",()=>{t(n.value);})}function m(n,t,e){return n.addEventListener(t,e),()=>n.removeEventListener(t,e)}function oe(n){return Ne.includes(n)?`<${n}/>`:`<${n}></${n}>`}function $(n){return signal.isSignal(n)?n.value:n}var y=class extends l{constructor(e,o,r){super();this.template=e;this.props=o;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.nodes=[];this.parent=null;this.before=null;this.key||(this.key=o&&o.key),this.proxyProps||(this.proxyProps=signal.shallowReactive(o||{}));}get firstChild(){var e,o;return (o=(e=this.rootNode)==null?void 0:e.firstChild)!=null?o:null}get isConnected(){var e,o;return (o=(e=this.rootNode)==null?void 0:e.isConnected)!=null?o:!1}mount(e,o){var r,i,s,c;if(this.parent=e,!shared.isFunction(this.template))throw new Error("Template must be a function");return this.isConnected?(i=(r=this.rootNode)==null?void 0:r.mount(e,o))!=null?i:[]:(this.initRef(),this.rootNode=this.template(signal.useReactive(this.proxyProps,[E])),this.nodes=(c=(s=this.rootNode)==null?void 0:s.mount(e,o))!=null?c:[],this.callMountHooks(),this.patchProps(this.props),this.removeRef(),this.nodes)}unmount(){var e;this.callLifecycleHooks("destroy"),this.cleanup(),(e=this.rootNode)==null||e.unmount(),this.resetState(),this.key&&k.delete(this.key);}resetState(){this.rootNode=null,this.proxyProps={},this.nodes=[],this.parent=null;}callLifecycleHooks(e){this.hooks[e].forEach(o=>o());}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){if(Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap,this.hooks=e.hooks,shared.hasChanged(e.props,this.props)){let o=this.props;this.props=e.props,this.patchProps(o);}}getNodeTrack(e){let o=this.trackMap.get(e);return o||(o={cleanup:()=>{}},this.trackMap.set(e,o)),o.cleanup(),o}patchProps(e){var o;if(e){for(let[r,i]of Object.entries(e))shared.startsWith(r,R)&&((o=this.rootNode)!=null&&o.firstChild)?this.patchEventListener(r,i):r===H?this.patchRef(i):shared.startsWith(r,w)?this.patchUpdateHandler(r,i):r!==E&&this.patchNormalProp(r,i);this.props=e;}}patchEventListener(e,o){let r=e.slice(2).toLowerCase(),i=m(this.rootNode.nodes[0],r,o);this.emitter.add(i);}patchRef(e){var o,r;e.value=(r=(o=this.rootNode)==null?void 0:o.firstChild)!=null?r:null;}patchUpdateHandler(e,o){this.proxyProps[e]=$(o);}patchNormalProp(e,o){let r=this.getNodeTrack(e);r.cleanup=signal.useEffect(()=>{this.proxyProps[e]=shared.isFunction(o)?o():o;});}cleanup(){this.trackMap.forEach(e=>{var o;return (o=e.cleanup)==null?void 0:o.call(e)}),this.trackMap.clear(),this.emitter.forEach(e=>e()),this.emitter.clear();}};function ie(n,t,e,o){let r=new Map,i=Array.from(t.values());if(i.length&&e.length===0)return Ce(n,i,o),r;let s=[],c=Me(e),a=0;for(let[d,p]of e.entries()){let f=i[a],v=S(f,d);for(;f&&!c.has(v);)M(f),t.delete(v),f=i[++a],v=S(f,d);let V=S(p,d),X=t.get(V);if(X&&(p=be(n,X,p)),f)if(f===X)a++;else {let Y=document.createComment("");g(n,Y,f),s.push([Y,p]);}else g(n,p,o);r.set(V,p);}return s.forEach(([d,p])=>{F(n,p,d);}),t.forEach((d,p)=>{d.isConnected&&!r.has(p)&&M(d);}),r}function Ce(n,t,e){if(n.childNodes.length===t.length+(e?1:0))n.innerHTML="",e&&g(n,e);else {let o=document.createRange(),r=t[0],i=h(r)?r.firstChild:r;o.setStartBefore(i),e?o.setEndBefore(e):o.setEndAfter(n),o.deleteContents();}t.forEach(o=>{h(o)&&o.unmount();});}function be(n,t,e){return t===e?t:h(t)&&h(e)&&t.template===e.template?(e.inheritNode(t),e):t instanceof Text&&e instanceof Text?(t.textContent!==e.textContent&&(t.textContent=e.textContent),t):(F(n,e,t),e)}function Me(n){let t=new Map;for(let[e,o]of n.entries()){let r=S(o,e);t.set(r,o);}return t}function S(n,t){if(h(n)){let e=n.key;if(e!=null)return String(e)}return `_$${t}$`}var x=class{constructor(t,e,o){this.template=t;this.props=e;this.key=o;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;u.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 o=this.template.content.cloneNode(!0),r=o.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r.childNodes.forEach(s=>{o.append(s);})),this.nodes=Array.from(o.childNodes),u.isSSR?this.mapSSGNodeTree(t):this.mapNodeTree(t,o),g(t,o,e),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){this.trackMap.forEach(t=>{t.cleanup&&t.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(t=>M(t)),this.nodes=[],this.mounted=!1,this.key&&k.delete(this.key);}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 o=1;this.treeMap.set(0,t);let r=[t],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(o++,s),r.push(s));};this.walkNodeTree(e,i);}walkNodeTree(t,e){t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&e(t);let o=t.firstChild;for(;o;)this.walkNodeTree(o,e),o=o.nextSibling;}handleSSGNode(t){var e;if(t.nodeType===Node.COMMENT_NODE){let[o,r]=((e=t.textContent)==null?void 0:e.split("-"))||[];if(0===+o&&+r===this.componentIndex){let i=t.nextSibling;this.treeMap.set(+r,i);}}else if(t.nodeType!==Node.TEXT_NODE){let{ci:o="-1",hk:r}=(t==null?void 0:t.dataset)||{};r&&+o===this.componentIndex&&this.treeMap.set(+r,t);}}patchProps(t){t&&(Object.entries(t).forEach(([e,o])=>{let r=Number(e),i=this.treeMap.get(r);i&&this.patchProp(e,i,o,r===0);}),this.props=t);}patchProp(t,e,o,r){o&&Object.entries(o).forEach(([i,s])=>{if(i===E&&s)this.patchChildren(t,e,s,r);else if(i===H)o[i].value=e;else if(shared.startsWith(i,R))this.patchEventListener(t,e,i,s);else {if(this.bindValueKeys.includes(i))return;let c=this.getBindUpdateValue(o,t,i);this.patchAttribute(t,e,i,s,c);}});}getBindUpdateValue(t,e,o){let r=`${w}${shared.capitalize(o)}`;if(r&&t[r]&&shared.isFunction(t[r]))return this.bindValueKeys.push(r),t[r]}patchChildren(t,e,o,r){if(shared.isArray(o))o.filter(Boolean).forEach((i,s)=>{var v;let[c,a]=shared.isArray(i)?i:[i,null],d=shared.isNil(a)?null:(v=this.treeMap.get(a))!=null?v:null,p=`${t}:${E}:${s}`,f=this.getNodeTrack(p,!0,r);this.patchChild(f,e,c,d);});else {let i=`${t}:${E}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,e,o,null);}}patchEventListener(t,e,o,r){let i=o.slice(2).toLowerCase(),s=this.getNodeTrack(`${t}:${o}`);s.cleanup=m(e,i,r);}patchAttribute(t,e,o,r,i){let s=this.getNodeTrack(`${t}:${o}`),c=signal.shallowSignal(),a=signal.useEffect(()=>{c.value=signal.isSignal(r)||signal.isComputed(r)?r.value:r,ee(e,o,c.value);}),d;i&&shared.isHTMLElement(e)&&(d=te(e,p=>{i(p);})),s.cleanup=()=>{a&&a(),d&&d();};}getNodeTrack(t,e,o){let r=this.trackMap.get(t);return r||(r={cleanup:()=>{}},e&&(r.lastNodes=new Map),o&&(r.isRoot=!0),this.trackMap.set(t,r)),r.cleanup&&r.cleanup(),r}patchChild(t,e,o,r){shared.isFunction(o)?t.cleanup=signal.useEffect(()=>{let i=shared.coerceArray(o()).map(D);u.isSSR?t.lastNodes=this.reconcileChildren(e,i,r):t.lastNodes=ie(e,t.lastNodes,i,r);}):shared.coerceArray(o).forEach((i,s)=>{let c=D(i),a=S(c,s);u.isSSR?t.lastNodes=this.reconcileChildren(e,[c],r):(t.lastNodes.set(a,c),g(e,c,r));});}reconcileChildren(t,e,o){let r=new Map,i=Array.from(t.childNodes).filter(s=>{var c,a;return s.nodeType===Node.TEXT_NODE&&((c=s.previousSibling)==null?void 0:c.nodeType)===Node.COMMENT_NODE&&((a=s.nextSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE});return e.forEach((s,c)=>{let a=S(s,c);s.nodeType===Node.TEXT_NODE?i.forEach(d=>{s.textContent===d.textContent&&t.replaceChild(s,d);}):g(t,s,o),r.set(a,s);}),r}};var k=new Map;function I(n,t,e={},o){if(o){let i=k.get(o);if(i)return i}typeof t=="string"&&(t=P(t));let r=new n(t,e,o);return o&&r instanceof y&&k.set(o,r),r}function j(n,t={},e){if(n===A)return de(n,t);if(shared.isString(n)){let o=oe(n),r={[B]:t};return I(x,o,r,e)}return shared.isFunction(n)?I(y,n,t,e):I(x,n,t,e)}function $e(n){return n instanceof y}function h(n){return n instanceof y||n instanceof x}function P(n){let t=document.createElement("template");return t.innerHTML=n,t}function de(n,t){let e=t.children?{[U]:{children:Array.isArray(t.children)?t.children.filter(Boolean):[t.children]}}:t,o=n===A?P(A):n;return I(x,o,e)}function Ie(n){l.ref&&l.ref.addHook("mounted",n);}function je(n){l.ref&&l.ref.addHook("destroy",n);}function Ke(n,t){l.ref&&l.ref.setContext(n,t);}function Xe(n,t){var e;return (e=l.ref&&l.ref.getContext(n))!=null?e:t}function Ge(n,t){u.setSSG();let o=new b(n,t||{}).mount();return u.setClient(),o}function De(n,t){let e=typeof t=="string"?document.querySelector(t):t;if(!e)throw new Error(`Could not find container: ${t}`);u.setSSR(),j(n).mount(e),u.setClient();}function Fe(n,t){return u.isSSG?new b(n,t):j(n,t)}exports.Fragment=de;exports.h=j;exports.hydrate=De;exports.inject=Xe;exports.isComponent=$e;exports.isJsxElement=h;exports.onDestroy=je;exports.onMount=Ie;exports.provide=Ke;exports.renderToString=Ge;exports.ssg=Fe;exports.template=P;//# sourceMappingURL=template.cjs.js.map
|
|
27
7
|
//# 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/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"]}
|
|
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","REF_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","convertToHtmlTag","signal","ComponentNode","shallowReactive","_b","_c","_d","useReactive","componentCache","type","cleanup","hasChanged","trackKey","track","prop","startsWith","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","tree","arr","handleNode","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","triggerValue","shallowSignal","isComputed","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","createNodeCache","NodeConstructor","cached","h","Fragment","isString","htmlTemplate","wrappedProps","isComponent","html","processedProps","templateElement","onMount","onDestroy","provide","inject","defaultValue","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';\nexport const REF_KEY = 'ref';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\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\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\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 { CHILDREN_PROP, 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_PROP) {\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_PROP && !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 (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isFunction(child)) {\n return this.renderChild(child(this.props));\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\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\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 * 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 { hasChanged, isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, shallowReactive, useEffect } from '@estjs/signal';\nimport { useReactive } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, REF_KEY, UPDATE_PREFIX } from './sharedConfig';\nimport { componentCache } from './jsxRenderer';\nimport type { EssorComponent, NodeTrack, Props } from '../types';\nimport type { TemplateNode } from './templateNode';\n\nexport class ComponentNode extends LifecycleContext implements JSX.Element {\n protected proxyProps: Record<string, Signal<unknown>>;\n protected emitter = new Set<() => void>();\n protected rootNode: TemplateNode | null = null;\n protected trackMap = new Map<string, NodeTrack>();\n protected nodes: Node[] = [];\n protected parent: Node | null = null;\n protected before: Node | null = null;\n\n constructor(\n public template: EssorComponent,\n public props: Props,\n public key?: string,\n ) {\n super();\n this.key ||= props && (props.key as string);\n this.proxyProps ||= shallowReactive(props || {});\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 this.parent = parent;\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 this.initRef();\n this.rootNode = this.template(useReactive(this.proxyProps, [CHILDREN_PROP]));\n this.nodes = this.rootNode?.mount(parent, before) ?? [];\n this.callMountHooks();\n this.patchProps(this.props);\n this.removeRef();\n\n return this.nodes;\n }\n\n unmount(): void {\n this.callLifecycleHooks('destroy');\n this.cleanup();\n this.rootNode?.unmount();\n this.resetState();\n\n if (this.key) {\n componentCache.delete(this.key);\n }\n }\n\n private resetState(): void {\n this.rootNode = null;\n this.proxyProps = {};\n this.nodes = [];\n this.parent = null;\n }\n\n protected callLifecycleHooks(type: 'mounted' | 'destroy'): void {\n this.hooks[type].forEach(handler => handler());\n }\n\n protected callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n protected callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n protected 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 if (hasChanged(node.props, this.props)) {\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n }\n\n protected 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\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_KEY) {\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 protected patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n const cleanup = addEventListener((this.rootNode as any)!.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n protected patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n protected patchUpdateHandler(key: string, prop: any): void {\n this.proxyProps![key] = extractSignal(prop);\n }\n\n protected 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 protected cleanup(): void {\n this.trackMap.forEach(track => track.cleanup?.());\n this.trackMap.clear();\n this.emitter.forEach(cleanup => cleanup());\n this.emitter.clear();\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 startsWith,\n} from '@estjs/shared';\nimport { isComputed, 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 EVENT_PREFIX,\n REF_KEY,\n UPDATE_PREFIX,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { componentCache, createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n protected treeMap = new Map<number, Node>();\n protected mounted = false;\n protected nodes: Node[] = [];\n protected trackMap = new Map<string, NodeTrack>();\n protected bindValueKeys: string[] = [];\n protected componentIndex: number;\n protected parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props: Props,\n public key?: string,\n ) {\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 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 && track.cleanup();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n this.nodes = [];\n this.mounted = false;\n\n if (this.key) {\n componentCache.delete(this.key);\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 protected mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // protected method to map node tree\n protected 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 protected 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 protected 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 protected 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 protected patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n\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_KEY) {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, EVENT_PREFIX)) {\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 protected getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\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 protected 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 protected patchEventListener(\n key: string,\n node: Node,\n attr: string,\n listener: EventListener,\n ): 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 protected 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 const triggerValue = shallowSignal();\n // FIXME: need support {a:b.value ?'1':'2'}, like this condition,value is signal or computed\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(value) || isComputed(value) ? value.value : value;\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 protected 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 && track.cleanup();\n return track;\n }\n\n protected 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 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 protected 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 { isFunction, isString } from '@estjs/shared';\nimport { convertToHtmlTag } 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\nexport const componentCache = new Map();\n\nfunction createNodeCache(\n NodeConstructor: typeof ComponentNode | typeof TemplateNode,\n template: EssorComponent | HTMLTemplateElement | string,\n props: Props = {},\n key?: string,\n): JSX.Element {\n if (key) {\n const cached = componentCache.get(key);\n if (cached) {\n return cached;\n }\n }\n\n if (typeof template === 'string') {\n template = createTemplate(template);\n }\n\n const newNode = new NodeConstructor(template as any, props, key);\n if (key && newNode instanceof ComponentNode) {\n componentCache.set(key, newNode);\n }\n return newNode;\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 // handle fragment\n if (template === EMPTY_TEMPLATE) {\n return Fragment(template, props) as JSX.Element;\n }\n\n // Handle string templates\n if (isString(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n const wrappedProps = { [SINGLE_PROP_KEY]: props };\n return createNodeCache(TemplateNode, htmlTemplate, wrappedProps, key);\n }\n\n // Handle functional templates (Components)\n if (isFunction(template)) {\n return createNodeCache(ComponentNode, template, props, key);\n }\n\n // Handle HTMLTemplateElement\n return createNodeCache(TemplateNode, template, 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 /**\n * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-serialisation-algorithm\n * the code that sets the unclosed tag, the browser's innerHTML method is, will automatically close the tag.\n * like `<div><button type=button>`\n * it will be translated:\n * `<div><button type=button></button></div>`\n */\n template.innerHTML = html;\n return template;\n}\n\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | Array<JSX.JSXElement | string | number | boolean>,\n>(\n template: HTMLTemplateElement | '',\n props: { children: T } | { [key: string]: { children: T } },\n): JSX.Element {\n const processedProps = props.children\n ? {\n [FRAGMENT_PROP_KEY]: {\n children: (Array.isArray(props.children)\n ? props.children.filter(Boolean)\n : [props.children]) as T,\n },\n }\n : props;\n\n const templateElement = template === EMPTY_TEMPLATE ? createTemplate(EMPTY_TEMPLATE) : template;\n\n return createNodeCache(TemplateNode, templateElement, processedProps);\n}\n\nexport function createApp(component: EssorComponent, root: HTMLElement | string) {\n const rootElement = typeof root === 'string' ? document.querySelector(root) : root;\n if (!rootElement) {\n throw new Error('Root element not found');\n }\n const rootNode = h(component).mount(rootElement);\n return rootNode;\n}\n","import { isSymbol } from '@estjs/shared';\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 provide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('provide', 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 inject<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('inject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\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"]}
|