@estjs/template 0.0.14-beta.2 → 0.0.14-beta.4
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 +4 -4
- package/dist/template.cjs.js.map +1 -1
- package/dist/template.dev.cjs.js +10 -60
- package/dist/template.dev.esm.js +12 -62
- package/dist/template.esm.js +5 -5
- package/dist/template.esm.js.map +1 -1
- package/package.json +3 -3
package/dist/template.cjs.js
CHANGED
|
@@ -4,16 +4,16 @@ var shared = require('@estjs/shared');
|
|
|
4
4
|
var signal = require('@estjs/signal');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* @estjs/template v0.0.14-beta.
|
|
7
|
+
* @estjs/template v0.0.14-beta.4
|
|
8
8
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
9
9
|
* @license MIT
|
|
10
10
|
**/
|
|
11
|
-
var D="on",G="update",T="children",w="",R="0",B="1";var H=" __PLACEHOLDER__ ";var X=class{constructor(){this.renderMode=0;}get isSSG(){return this.renderMode===1}get isSSR(){return this.renderMode===2}get isClient(){return this.renderMode===0}setSSR(){this.renderMode=2;}setSSG(){this.renderMode=1;}setClient(){this.renderMode=0;}},m=new X,z=new Map;function q(o,t){z.set(o,{index:t});}function W(o){var t;return (t=z.get(o))==null?void 0:t.index}var E=class E{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(t,e){var n;(n=this.hooks[t])==null||n.add(e);}getContext(t){return E.context[t]}setContext(t,e){E.context[t]=e;}initRef(){E.ref=this;}removeRef(){E.ref=null;}clearHooks(){Object.values(this.hooks).forEach(t=>t.clear());}};E.ref=null,E.context={};var u=E;function A(o){return o instanceof C}var b=1,C=class extends u{constructor(e,n={},r){super();this.template=e;this.props=n;this.key=r;q(e,b),this.templates=this.processTemplate();}processTemplate(){if(shared.isArray(this.template)){let e=this.template.join(H);return this.processHtmlString(e).split(H)}return []}processHtmlString(e){return e.replaceAll(/(<[^>]+>)|([^<]+)/g,(n,r,i)=>r?r.includes("data-ci")?n:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,a,l)=>`<${a} data-ci="${b}"${l||""}>`):i&&i.replace(H,"").trim()?`<!--0-${b}-->${i}<!$>`:n)}mount(){this.initRef();let e=this.render();return this.removeRef(),e}render(){if(shared.isFunction(this.template)){let e=this.template(this.props);return A(e)?e.mount():String(e)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([e,n])=>{let r=n.children;this.normalizeProps(n);let i=this.templates.findIndex(s=>s.includes(`data-hk="${e}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${e}"`,`data-hk="${e}" ${this.generateAttributes(n)}`);}),this.templates.join("")}normalizeProps(e){Object.entries(e).forEach(([n,r])=>{n==="children"||shared.isFunction(r)?delete e[n]:signal.isSignal(r)&&(e[n]=r.value);});}generateAttributes(e){return Object.entries(e).filter(([n,r])=>n!=="children"&&!shared.isFunction(r)).map(([n,r])=>`${n}="${shared.escape(String(r))}"`).join(" ")}renderChildren(e,n){e.forEach(([r])=>{b++;let i=this.renderChild(r);this.templates[n]+=i;});}renderChild(e){if(shared.isFunction(e))return this.renderChild(e(this.props));if(signal.isSignal(e))return `<!--1-${b}-->${e.value}<!$>`;if(A(e)){let n=e.mount();return shared.isFunction(n)?n(this.props):_(n)}else return `<!--1-${b}-->${e}<!$>`}};var ee="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(","),Ne="a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp".split(",");function F(o){if(f(o)||o instanceof Node||A(o))return o;let t=shared.isFalsy(o)?"":String(o);return document.createTextNode(t)}function g(o,t,e=null){let n=f(e)?e.firstChild:e,r=m.isSSR;f(t)?t.mount(o,n):n&&!r?n.before(t):r||o.append(t);}function v(o){f(o)?o.unmount():o.parentNode&&o.remove();}function J(o,t,e){g(o,t,e),v(e);}function V(o,t,e){t==="class"?ge(o,e):t==="style"?Ee(o,e):Te(o,t,e);}function ge(o,t){typeof t=="string"?o.className=t:shared.isArray(t)?o.className=t.join(" "):t&&typeof t=="object"&&(o.className=Object.entries(t).reduce((e,[n,r])=>e+(r?` ${n}`:""),"").trim());}function Ee(o,t){typeof t=="string"?o.style.cssText=t:t&&typeof t=="object"&&Object.entries(t).forEach(([n,r])=>{o.style.setProperty(shared.kebabCase(n),String(r));});}function Te(o,t,e){shared.isFalsy(e)?o.removeAttribute(t):e===!0?o.setAttribute(t,""):o instanceof HTMLInputElement&&t==="value"?o.value=String(e):o.setAttribute(t,String(e));}function te(o,t){if(o instanceof HTMLInputElement)switch(o.type){case"checkbox":return h(o,"change",()=>{t(!!o.checked);});case"date":return h(o,"change",()=>{t(o.value?o.value:"");});case"file":return h(o,"change",()=>{o.files&&t(o.files);});case"number":return h(o,"input",()=>{let e=Number.parseFloat(o.value);t(Number.isNaN(e)?"":String(e));});case"radio":return h(o,"change",()=>{t(o.checked?o.value:"");});case"text":return h(o,"input",()=>{t(o.value);})}if(o instanceof HTMLSelectElement)return h(o,"change",()=>{t(o.value);});if(o instanceof HTMLTextAreaElement)return h(o,"input",()=>{t(o.value);})}Promise.resolve();function h(o,t,e){return o.addEventListener(t,e),()=>o.removeEventListener(t,e)}function ne(o){let t=[],e=[],n=/<\/?([\da-z-]+)([^>]*)>/gi,r=0;for(;;){let i=n.exec(o);if(!i)break;let[s,a]=i,l=s[1]==="/";if(e.push(o.slice(r,i.index)),r=i.index+s.length,l){for(;t.length>0&&t[t.length-1]!==a;){let c=t.pop();c&&e.push(`</${c}>`);}t.length>0&&t.pop();}else ee.includes(a)||t.push(a);e.push(s);}for(e.push(o.slice(r));t.length>0;){let i=t.pop();i&&e.push(`</${i}>`);}return e.join("")}function oe(o){return Ne.includes(o)}function re(o){return ee.includes(o)?`<${o}/>`:`<${o}></${o}>`}function _(o){return signal.isSignal(o)?o.value:o}var M=class extends u{constructor(e,n,r){super();this.template=e;this.props=n;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=n==null?void 0:n.key),this.proxyProps=this.createProxyProps(n);}createProxyProps(e){return e?signal.useReactive(e,n=>shared.startsWith(n,D)||shared.startsWith(n,G)||n===T):{}}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}mount(e,n){var i,s,a,l;if(!shared.isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(i=this.rootNode)==null?void 0:i.mount(e,n))!=null?s:[];this.initRef(),this.rootNode=this.template(this.proxyProps);let r=(l=(a=this.rootNode)==null?void 0:a.mount(e,n))!=null?l:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var e;this.callDestroyHooks(),this.clearHooks(),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(e=>e());}callDestroyHooks(){this.hooks.destroy.forEach(e=>e());}clearEmitter(){for(let e of this.emitter)e();this.emitter.clear();}inheritNode(e){Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap,this.hooks=e.hooks;let n=this.props;this.props=e.props,this.patchProps(n);}getNodeTrack(e){let n=this.trackMap.get(e);return n||(n={cleanup:()=>{}},this.trackMap.set(e,n)),n.cleanup(),n}patchProps(e){var n;if(e){for(let[r,i]of Object.entries(e))shared.startsWith(r,D)&&((n=this.rootNode)!=null&&n.firstChild)?this.patchEventListener(r,i):r==="ref"?this.patchRef(i):shared.startsWith(r,G)?this.patchUpdateHandler(r,i):r!==T&&this.patchNormalProp(r,i);this.props=e;}}patchEventListener(e,n){let r=e.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,n);this.emitter.add(i);}patchRef(e){var n,r;e.value=(r=(n=this.rootNode)==null?void 0:n.firstChild)!=null?r:null;}patchUpdateHandler(e,n){this.props[e]=_(n);}patchNormalProp(e,n){let r=this.getNodeTrack(e);r.cleanup=signal.useEffect(()=>{this.proxyProps[e]=shared.isFunction(n)?n():n;});}};function se(o,t,e,n){let r=new Map,i=Array.from(t.values());if(i.length&&e.length===0)return ye(o,i,n),r;let s=[],a=be(e),l=0;for(let[c,d]of e.entries()){let p=i[l],x=S(p,c);for(;p&&!a.has(x);)v(p),t.delete(x),p=i[++l],x=S(p,c);let U=S(d,c),K=t.get(U);if(K&&(d=xe(o,K,d)),p)if(p===K)l++;else {let Y=document.createComment("");g(o,Y,p),s.push([Y,d]);}else g(o,d,n);r.set(U,d);}return s.forEach(([c,d])=>{J(o,d,c);}),t.forEach((c,d)=>{c.isConnected&&!r.has(d)&&v(c);}),r}function ye(o,t,e){if(o.childNodes.length===t.length+(e?1:0))o.innerHTML="",e&&g(o,e);else {let n=document.createRange(),r=t[0],i=f(r)?r.firstChild:r;n.setStartBefore(i),e?n.setEndBefore(e):n.setEndAfter(o),n.deleteContents();}t.forEach(n=>{f(n)&&n.unmount();});}function xe(o,t,e){return t===e?t:f(t)&&f(e)&&t.template===e.template?(e.inheritNode(t),e):t instanceof Text&&e instanceof Text?(t.textContent!==e.textContent&&(t.textContent=e.textContent),t):(J(o,e,t),e)}function be(o){let t=new Map;for(let[e,n]of o.entries()){let r=S(n,e);t.set(r,n);}return t}function S(o,t){if(f(o)){let e=o.key;if(e!=null)return String(e)}return `_$${t}$`}var y=class{constructor(t,e,n){this.template=t;this.props=e;this.key=n;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;this.key||(this.key=e==null?void 0:e.key),m.isSSR&&(this.componentIndex=W(this.template));}get firstChild(){var t;return (t=this.nodes[0])!=null?t:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(t,e){var i;if(this.parent=t,this.isConnected)return this.nodes.forEach(s=>g(t,s,e)),this.nodes;shared.isArray(this.template)&&(this.template=P(this.template.join("")));let n=this.template.content.cloneNode(!0),r=n.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r==null||r.childNodes.forEach(s=>{n.append(s);})),this.nodes=Array.from(n.childNodes),m.isSSR?this.mapSSGNodeTree(t):this.mapNodeTree(t,n),g(t,n,e),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){var t,e;if(this.trackMap.forEach(n=>{var r;(r=n.cleanup)==null||r.call(n);}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(n=>v(n)),!this.template.innerHTML&&!this.nodes.length){let n=(e=(t=this.props)==null?void 0:t[R])==null?void 0:e.children;n&&(shared.isArray(n)?n.forEach(r=>{this.deleteFragmentTextNode(r);}):this.deleteFragmentTextNode(n));}this.nodes=[],this.mounted=!1;}deleteFragmentTextNode(t){var e;shared.isPrimitive(t)?(e=this.parent)==null||e.childNodes.forEach(n=>{var r;n.nodeType===Node.TEXT_NODE&&n.textContent===`${t}`&&((r=this.parent)==null||r.removeChild(n));}):v(t);}inheritNode(t){this.mounted=t.mounted,this.nodes=t.nodes,this.trackMap=t.trackMap,this.treeMap=t.treeMap;let e=this.props;this.props=t.props,this.patchProps(e);}mapSSGNodeTree(t){this.treeMap.set(0,t),this.walkNodeTree(t,this.handleSSGNode.bind(this));}mapNodeTree(t,e){let n=1;this.treeMap.set(0,t);let r=[t],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(n++,s),r.push(s));};this.walkNodeTree(e,i);}walkNodeTree(t,e){t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&e(t);let n=t.firstChild;for(;n;)this.walkNodeTree(n,e),n=n.nextSibling;}handleSSGNode(t){var e;if(t.nodeType===Node.COMMENT_NODE){let[n,r]=((e=t.textContent)==null?void 0:e.split("-"))||[];if(0===+n&&+r===this.componentIndex){let i=t.nextSibling;this.treeMap.set(+r,i);}}else if(t.nodeType!==Node.TEXT_NODE){let{ci:n="-1",hk:r}=(t==null?void 0:t.dataset)||{};r&&+n===this.componentIndex&&this.treeMap.set(+r,t);}}patchProps(t){t&&(Object.entries(t).forEach(([e,n])=>{let r=Number(e),i=this.treeMap.get(r);i&&this.patchProp(e,i,n,r===0);}),this.props=t);}patchProp(t,e,n,r){n&&Object.entries(n).forEach(([i,s])=>{if(i===T&&s)this.patchChildren(t,e,s,r);else if(i==="ref")n[i].value=e;else if(shared.startsWith(i,"on"))this.patchEventListener(t,e,i,s);else {if(this.bindValueKeys.includes(i))return;let a=this.getBindUpdateValue(n,t,i);this.patchAttribute(t,e,i,s,a);}});}getBindUpdateValue(t,e,n){let i=`update${shared.capitalizeFirstLetter(n)}`;if(i&&t[i]&&shared.isFunction(t[i]))return this.bindValueKeys.push(i),t[i]}patchChildren(t,e,n,r){if(shared.isArray(n))n.filter(Boolean).forEach((i,s)=>{var x;let[a,l]=shared.isArray(i)?i:[i,null],c=shared.isNil(l)?null:(x=this.treeMap.get(l))!=null?x:null,d=`${t}:${T}:${s}`,p=this.getNodeTrack(d,!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.useSignal(a);V(e,n,l.value);let c=signal.useEffect(()=>{let p=shared.isFunction(r)?r():r;l.value=signal.isSignal(p)?p.value:p,V(e,n,l.value);}),d;i&&shared.isHTMLElement(e)&&(d=te(e,p=>{i(p);})),s.cleanup=()=>{c&&c(),d&&d();};}getNodeTrack(t,e,n){var i;let r=this.trackMap.get(t);return r||(r={cleanup:()=>{}},e&&(r.lastNodes=new Map),n&&(r.isRoot=!0),this.trackMap.set(t,r)),(i=r.cleanup)==null||i.call(r),r}patchChild(t,e,n,r){shared.isFunction(n)?t.cleanup=signal.useEffect(()=>{let i=shared.coerceArray(n()).map(F);m.isSSR?t.lastNodes=this.reconcileChildren(e,i,r):t.lastNodes=se(e,t.lastNodes,i,r);}):shared.coerceArray(n).forEach((i,s)=>{let a=F(i),l=S(a,s);m.isSSR?t.lastNodes=this.reconcileChildren(e,[a],r):(t.lastNodes.set(l,a),g(e,a,r));});}reconcileChildren(t,e,n){let r=new Map,i=Array.from(t.childNodes).filter(s=>{var a,l;return s.nodeType===Node.TEXT_NODE&&((a=s.previousSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&((l=s.nextSibling)==null?void 0:l.nodeType)===Node.COMMENT_NODE});return e.forEach((s,a)=>{let l=S(s,a);s.nodeType===Node.TEXT_NODE?i.forEach(c=>{s.textContent===c.textContent&&t.replaceChild(s,c);}):g(t,s,n),r.set(l,s);}),r}};function L(o,t,e){if(shared.isString(o)){if(oe(o)){let n=re(o);return t={[B]:t},new y(P(n),t,e)}else if(o===w)return t={[R]:t},new y(P(w),t,e)}return shared.isFunction(o)?new M(o,t,e):new y(o,t,e)}function _e(o){return o instanceof M}function f(o){return o instanceof M||o instanceof y}function P(o){let t=document.createElement("template");return t.innerHTML=ne(o),t}function Oe(o){return L(w,{children:shared.isArray(o.children)?o.children.filter(Boolean):[o.children]})}function Ie(o){u.ref&&u.ref.addHook("mounted",o);}function je(o){u.ref&&u.ref.addHook("destroy",o);}function Ke(o,t){u.ref&&u.ref.setContext(o,t);}function Xe(o,t){var e;return (e=u.ref&&u.ref.getContext(o))!=null?e:t}function De(){return signal.shallowSignal(null)}function Ge(o,t){m.setSSG();let n=new C(o,t||{}).mount();return m.setClient(),n}function Fe(o,t){let e=typeof t=="string"?document.querySelector(t):t;if(!e)throw new Error(`Could not find container: ${t}`);m.setSSR(),L(o).mount(e),m.setClient();}function Je(o,t){return m.isSSG?new C(o,t):L(o,t)}
|
|
11
|
+
var D="on",G="update",T="children",w="",R="0",B="1";var H=" __PLACEHOLDER__ ";var X=class{constructor(){this.renderMode=0;}get isSSG(){return this.renderMode===1}get isSSR(){return this.renderMode===2}get isClient(){return this.renderMode===0}setSSR(){this.renderMode=2;}setSSG(){this.renderMode=1;}setClient(){this.renderMode=0;}},m=new X,z=new Map;function q(o,t){z.set(o,{index:t});}function W(o){var t;return (t=z.get(o))==null?void 0:t.index}var E=class E{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(t,e){var n;(n=this.hooks[t])==null||n.add(e);}getContext(t){return E.context[t]}setContext(t,e){E.context[t]=e;}initRef(){E.ref=this;}removeRef(){E.ref=null;}clearHooks(){Object.values(this.hooks).forEach(t=>t.clear());}};E.ref=null,E.context={};var u=E;function A(o){return o instanceof C}var b=1,C=class extends u{constructor(e,n={},r){super();this.template=e;this.props=n;this.key=r;q(e,b),this.templates=this.processTemplate();}processTemplate(){if(shared.isArray(this.template)){let e=this.template.join(H);return this.processHtmlString(e).split(H)}return []}processHtmlString(e){return e.replaceAll(/(<[^>]+>)|([^<]+)/g,(n,r,i)=>r?r.includes("data-ci")?n:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,a,l)=>`<${a} data-ci="${b}"${l||""}>`):i&&i.replace(H,"").trim()?`<!--0-${b}-->${i}<!$>`:n)}mount(){this.initRef();let e=this.render();return this.removeRef(),e}render(){if(shared.isFunction(this.template)){let e=this.template(this.props);return A(e)?e.mount():String(e)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([e,n])=>{let r=n.children;this.normalizeProps(n);let i=this.templates.findIndex(s=>s.includes(`data-hk="${e}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${e}"`,`data-hk="${e}" ${this.generateAttributes(n)}`);}),this.templates.join("")}normalizeProps(e){Object.entries(e).forEach(([n,r])=>{n==="children"||shared.isFunction(r)?delete e[n]:signal.isSignal(r)&&(e[n]=r.value);});}generateAttributes(e){return Object.entries(e).filter(([n,r])=>n!=="children"&&!shared.isFunction(r)).map(([n,r])=>`${n}="${shared.escape(String(r))}"`).join(" ")}renderChildren(e,n){e.forEach(([r])=>{b++;let i=this.renderChild(r);this.templates[n]+=i;});}renderChild(e){if(shared.isFunction(e))return this.renderChild(e(this.props));if(signal.isSignal(e))return `<!--1-${b}-->${e.value}<!$>`;if(A(e)){let n=e.mount();return shared.isFunction(n)?n(this.props):O(n)}else return `<!--1-${b}-->${e}<!$>`}};var ee="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(","),Ne="a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp".split(",");function F(o){if(f(o)||o instanceof Node||A(o))return o;let t=shared.isFalsy(o)?"":String(o);return document.createTextNode(t)}function g(o,t,e=null){let n=f(e)?e.firstChild:e,r=m.isSSR;f(t)?t.mount(o,n):n&&!r?n.before(t):r||o.append(t);}function v(o){f(o)?o.unmount():o.parentNode&&o.remove();}function J(o,t,e){g(o,t,e),v(e);}function V(o,t,e){t==="class"?ge(o,e):t==="style"?Ee(o,e):Te(o,t,e);}function ge(o,t){typeof t=="string"?o.className=t:shared.isArray(t)?o.className=t.join(" "):t&&typeof t=="object"&&(o.className=Object.entries(t).reduce((e,[n,r])=>e+(r?` ${n}`:""),"").trim());}function Ee(o,t){typeof t=="string"?o.style.cssText=t:t&&typeof t=="object"&&Object.entries(t).forEach(([n,r])=>{o.style.setProperty(shared.kebabCase(n),String(r));});}function Te(o,t,e){shared.isFalsy(e)?o.removeAttribute(t):e===!0?o.setAttribute(t,""):o instanceof HTMLInputElement&&t==="value"?o.value=String(e):o.setAttribute(t,String(e));}function te(o,t){if(o instanceof HTMLInputElement)switch(o.type){case"checkbox":return h(o,"change",()=>{t(!!o.checked);});case"date":return h(o,"change",()=>{t(o.value?o.value:"");});case"file":return h(o,"change",()=>{o.files&&t(o.files);});case"number":return h(o,"input",()=>{let e=Number.parseFloat(o.value);t(Number.isNaN(e)?"":String(e));});case"radio":return h(o,"change",()=>{t(o.checked?o.value:"");});case"text":return h(o,"input",()=>{t(o.value);})}if(o instanceof HTMLSelectElement)return h(o,"change",()=>{t(o.value);});if(o instanceof HTMLTextAreaElement)return h(o,"input",()=>{t(o.value);})}Promise.resolve();function h(o,t,e){return o.addEventListener(t,e),()=>o.removeEventListener(t,e)}function ne(o){let t=[],e=[],n=/<\/?([\da-z-]+)([^>]*)>/gi,r=0;for(;;){let i=n.exec(o);if(!i)break;let[s,a]=i,l=s[1]==="/";if(e.push(o.slice(r,i.index)),r=i.index+s.length,l){for(;t.length>0&&t[t.length-1]!==a;){let c=t.pop();c&&e.push(`</${c}>`);}t.length>0&&t.pop();}else ee.includes(a)||t.push(a);e.push(s);}for(e.push(o.slice(r));t.length>0;){let i=t.pop();i&&e.push(`</${i}>`);}return e.join("")}function oe(o){return Ne.includes(o)}function re(o){return ee.includes(o)?`<${o}/>`:`<${o}></${o}>`}function O(o){return signal.isSignal(o)?o.value:o}var M=class extends u{constructor(e,n,r){super();this.template=e;this.props=n;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=n==null?void 0:n.key),this.proxyProps=this.createProxyProps(n);}createProxyProps(e){return e?signal.shallowReactive(e,n=>shared.startsWith(n,D)||shared.startsWith(n,G)||n===T):{}}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}mount(e,n){var i,s,a,l;if(!shared.isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(i=this.rootNode)==null?void 0:i.mount(e,n))!=null?s:[];this.initRef(),this.rootNode=this.template(this.proxyProps);let r=(l=(a=this.rootNode)==null?void 0:a.mount(e,n))!=null?l:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var e;this.callDestroyHooks(),this.clearHooks(),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(e=>e());}callDestroyHooks(){this.hooks.destroy.forEach(e=>e());}clearEmitter(){for(let e of this.emitter)e();this.emitter.clear();}inheritNode(e){Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap,this.hooks=e.hooks;let n=this.props;this.props=e.props,this.patchProps(n);}getNodeTrack(e){let n=this.trackMap.get(e);return n||(n={cleanup:()=>{}},this.trackMap.set(e,n)),n.cleanup(),n}patchProps(e){var n;if(e){for(let[r,i]of Object.entries(e))shared.startsWith(r,D)&&((n=this.rootNode)!=null&&n.firstChild)?this.patchEventListener(r,i):r==="ref"?this.patchRef(i):shared.startsWith(r,G)?this.patchUpdateHandler(r,i):r!==T&&this.patchNormalProp(r,i);this.props=e;}}patchEventListener(e,n){let r=e.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,n);this.emitter.add(i);}patchRef(e){var n,r;e.value=(r=(n=this.rootNode)==null?void 0:n.firstChild)!=null?r:null;}patchUpdateHandler(e,n){this.props[e]=O(n);}patchNormalProp(e,n){let r=this.getNodeTrack(e);r.cleanup=signal.useEffect(()=>{this.proxyProps[e]=shared.isFunction(n)?n():n;});}};function se(o,t,e,n){let r=new Map,i=Array.from(t.values());if(i.length&&e.length===0)return ye(o,i,n),r;let s=[],a=be(e),l=0;for(let[c,p]of e.entries()){let d=i[l],x=S(d,c);for(;d&&!a.has(x);)v(d),t.delete(x),d=i[++l],x=S(d,c);let U=S(p,c),K=t.get(U);if(K&&(p=xe(o,K,p)),d)if(d===K)l++;else {let Y=document.createComment("");g(o,Y,d),s.push([Y,p]);}else g(o,p,n);r.set(U,p);}return s.forEach(([c,p])=>{J(o,p,c);}),t.forEach((c,p)=>{c.isConnected&&!r.has(p)&&v(c);}),r}function ye(o,t,e){if(o.childNodes.length===t.length+(e?1:0))o.innerHTML="",e&&g(o,e);else {let n=document.createRange(),r=t[0],i=f(r)?r.firstChild:r;n.setStartBefore(i),e?n.setEndBefore(e):n.setEndAfter(o),n.deleteContents();}t.forEach(n=>{f(n)&&n.unmount();});}function xe(o,t,e){return t===e?t:f(t)&&f(e)&&t.template===e.template?(e.inheritNode(t),e):t instanceof Text&&e instanceof Text?(t.textContent!==e.textContent&&(t.textContent=e.textContent),t):(J(o,e,t),e)}function be(o){let t=new Map;for(let[e,n]of o.entries()){let r=S(n,e);t.set(r,n);}return t}function S(o,t){if(f(o)){let e=o.key;if(e!=null)return String(e)}return `_$${t}$`}var y=class{constructor(t,e,n){this.template=t;this.props=e;this.key=n;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;this.key||(this.key=e==null?void 0:e.key),m.isSSR&&(this.componentIndex=W(this.template));}get firstChild(){var t;return (t=this.nodes[0])!=null?t:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(t,e){var i;if(this.parent=t,this.isConnected)return this.nodes.forEach(s=>g(t,s,e)),this.nodes;shared.isArray(this.template)&&(this.template=P(this.template.join("")));let n=this.template.content.cloneNode(!0),r=n.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r==null||r.childNodes.forEach(s=>{n.append(s);})),this.nodes=Array.from(n.childNodes),m.isSSR?this.mapSSGNodeTree(t):this.mapNodeTree(t,n),g(t,n,e),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){var t,e;if(this.trackMap.forEach(n=>{var r;(r=n.cleanup)==null||r.call(n);}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(n=>v(n)),!this.template.innerHTML&&!this.nodes.length){let n=(e=(t=this.props)==null?void 0:t[R])==null?void 0:e.children;n&&(shared.isArray(n)?n.forEach(r=>{this.deleteFragmentTextNode(r);}):this.deleteFragmentTextNode(n));}this.nodes=[],this.mounted=!1;}deleteFragmentTextNode(t){var e;shared.isPrimitive(t)?(e=this.parent)==null||e.childNodes.forEach(n=>{var r;n.nodeType===Node.TEXT_NODE&&n.textContent===`${t}`&&((r=this.parent)==null||r.removeChild(n));}):v(t);}inheritNode(t){this.mounted=t.mounted,this.nodes=t.nodes,this.trackMap=t.trackMap,this.treeMap=t.treeMap;let e=this.props;this.props=t.props,this.patchProps(e);}mapSSGNodeTree(t){this.treeMap.set(0,t),this.walkNodeTree(t,this.handleSSGNode.bind(this));}mapNodeTree(t,e){let n=1;this.treeMap.set(0,t);let r=[t],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(n++,s),r.push(s));};this.walkNodeTree(e,i);}walkNodeTree(t,e){t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&e(t);let n=t.firstChild;for(;n;)this.walkNodeTree(n,e),n=n.nextSibling;}handleSSGNode(t){var e;if(t.nodeType===Node.COMMENT_NODE){let[n,r]=((e=t.textContent)==null?void 0:e.split("-"))||[];if(0===+n&&+r===this.componentIndex){let i=t.nextSibling;this.treeMap.set(+r,i);}}else if(t.nodeType!==Node.TEXT_NODE){let{ci:n="-1",hk:r}=(t==null?void 0:t.dataset)||{};r&&+n===this.componentIndex&&this.treeMap.set(+r,t);}}patchProps(t){t&&(Object.entries(t).forEach(([e,n])=>{let r=Number(e),i=this.treeMap.get(r);i&&this.patchProp(e,i,n,r===0);}),this.props=t);}patchProp(t,e,n,r){n&&Object.entries(n).forEach(([i,s])=>{if(i===T&&s)this.patchChildren(t,e,s,r);else if(i==="ref")n[i].value=e;else if(shared.startsWith(i,"on"))this.patchEventListener(t,e,i,s);else {if(this.bindValueKeys.includes(i))return;let a=this.getBindUpdateValue(n,t,i);this.patchAttribute(t,e,i,s,a);}});}getBindUpdateValue(t,e,n){let i=`update${shared.capitalize(n)}`;if(i&&t[i]&&shared.isFunction(t[i]))return this.bindValueKeys.push(i),t[i]}patchChildren(t,e,n,r){if(shared.isArray(n))n.filter(Boolean).forEach((i,s)=>{var x;let[a,l]=shared.isArray(i)?i:[i,null],c=shared.isNil(l)?null:(x=this.treeMap.get(l))!=null?x:null,p=`${t}:${T}:${s}`,d=this.getNodeTrack(p,!0,r);this.patchChild(d,e,a,c);});else {let i=`${t}:${T}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,e,n,null);}}patchEventListener(t,e,n,r){let i=n.slice(2).toLowerCase(),s=this.getNodeTrack(`${t}:${n}`);s.cleanup=h(e,i,r);}patchAttribute(t,e,n,r,i){let s=this.getNodeTrack(`${t}:${n}`),a=shared.isFunction(r)?r():r,l=signal.isSignal(a)?a:signal.shallowSignal(a);V(e,n,l.value);let c=signal.useEffect(()=>{let d=shared.isFunction(r)?r():r;JSON.stringify(l.value)!==JSON.stringify(d)&&(l.value=signal.isSignal(d)?d.value:d,V(e,n,l.value));}),p;i&&shared.isHTMLElement(e)&&(p=te(e,d=>{i(d);})),s.cleanup=()=>{c&&c(),p&&p();};}getNodeTrack(t,e,n){var i;let r=this.trackMap.get(t);return r||(r={cleanup:()=>{}},e&&(r.lastNodes=new Map),n&&(r.isRoot=!0),this.trackMap.set(t,r)),(i=r.cleanup)==null||i.call(r),r}patchChild(t,e,n,r){shared.isFunction(n)?t.cleanup=signal.useEffect(()=>{let i=shared.coerceArray(n()).map(F);m.isSSR?t.lastNodes=this.reconcileChildren(e,i,r):t.lastNodes=se(e,t.lastNodes,i,r);}):shared.coerceArray(n).forEach((i,s)=>{let a=F(i),l=S(a,s);m.isSSR?t.lastNodes=this.reconcileChildren(e,[a],r):(t.lastNodes.set(l,a),g(e,a,r));});}reconcileChildren(t,e,n){let r=new Map,i=Array.from(t.childNodes).filter(s=>{var a,l;return s.nodeType===Node.TEXT_NODE&&((a=s.previousSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&((l=s.nextSibling)==null?void 0:l.nodeType)===Node.COMMENT_NODE});return e.forEach((s,a)=>{let l=S(s,a);s.nodeType===Node.TEXT_NODE?i.forEach(c=>{s.textContent===c.textContent&&t.replaceChild(s,c);}):g(t,s,n),r.set(l,s);}),r}};function L(o,t,e){if(shared.isString(o)){if(oe(o)){let n=re(o);return t={[B]:t},new y(P(n),t,e)}else if(o===w)return t={[R]:t},new y(P(w),t,e)}return shared.isFunction(o)?new M(o,t,e):new y(o,t,e)}function Oe(o){return o instanceof M}function f(o){return o instanceof M||o instanceof y}function P(o){let t=document.createElement("template");return t.innerHTML=ne(o),t}function _e(o){return L(w,{children:shared.isArray(o.children)?o.children.filter(Boolean):[o.children]})}function Ie(o){u.ref&&u.ref.addHook("mounted",o);}function je(o){u.ref&&u.ref.addHook("destroy",o);}function Ke(o,t){u.ref&&u.ref.setContext(o,t);}function Xe(o,t){var e;return (e=u.ref&&u.ref.getContext(o))!=null?e:t}function De(){return signal.shallowSignal(null)}function Ge(o,t){m.setSSG();let n=new C(o,t||{}).mount();return m.setClient(),n}function Fe(o,t){let e=typeof t=="string"?document.querySelector(t):t;if(!e)throw new Error(`Could not find container: ${t}`);m.setSSR(),L(o).mount(e),m.setClient();}function Je(o,t){return m.isSSG?new C(o,t):L(o,t)}
|
|
12
12
|
|
|
13
|
-
exports.Fragment =
|
|
13
|
+
exports.Fragment = _e;
|
|
14
14
|
exports.h = L;
|
|
15
15
|
exports.hydrate = Fe;
|
|
16
|
-
exports.isComponent =
|
|
16
|
+
exports.isComponent = Oe;
|
|
17
17
|
exports.isJsxElement = f;
|
|
18
18
|
exports.onDestroy = je;
|
|
19
19
|
exports.onMount = Ie;
|
package/dist/template.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared-config.ts","../src/lifecycle-context.ts","../src/ssg-node.ts","../src/utils.ts","../src/component-node.ts","../src/patch.ts","../src/template-node.ts","../src/jsx-renderer.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","useReactive","startsWith","_b","_c","_d","mountedNode","cleanup","trackKey","track","prop","event","useEffect","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","isPrimitive","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalizeFirstLetter","item","path","isNil","listener","val","triggerValue","useSignal","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","h","isString","htmlTemplate","isComponent","html","Fragment","onMount","onDestroy","useProvide","useInject","defaultValue","useRef","shallowSignal","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\n// Class to manage render context\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n // Getter to check if the current mode is SSG\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n // Getter to check if the current mode is SSR\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n // Getter to check if the current mode is Client\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n // Set render mode to SSR\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n // Set render mode to SSG\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n // Set render mode to Client\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\n// Export a singleton instance of RenderContext\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\n// Class to manage lifecycle and context for components\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n // Static reference to the current context\n static ref: LifecycleContext | null = null;\n // Static context to store shared values\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 // Initialize the static reference\n initRef() {\n LifecycleContext.ref = this;\n }\n\n // Remove the static reference\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 './lifecycle-context';\nimport { extractSignal } from './utils';\nimport { ComponentType, PLACEHOLDER, enterComponent } from './shared-config';\nimport type { Signal } from '@estjs/signal/*';\nimport type { EssorNode, Props } from '../types';\n\n// Type guard to check if a node is an SSGNode\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\n// Global counter for component indexing\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 // Process the template and return an array of processed strings\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 // Process HTML string by adding component index and handling text nodes\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 the SSGNode and return the rendered string\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n // Render the SSGNode\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 // Render the template by processing props and children\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 // Normalize props by removing children and handling signals\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 // Generate HTML attributes string from props\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 // Render children and append them to the template\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 // Render a single child node\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 './jsx-renderer';\nimport { renderContext } from './shared-config';\nimport { isSSGNode } from './ssg-node';\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, useEffect, useReactive } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycle-context';\nimport { CHILDREN_PROP, EVENT_PREFIX, UPDATE_PREFIX } from './shared-config';\nimport type { TemplateNode } from './template-node';\nimport type { EssorComponent, NodeTrack, Props } from '../types';\n\n// Class representing a component node in the virtual DOM\nexport class ComponentNode extends LifecycleContext implements JSX.Element {\n private proxyProps: Record<string, Signal<unknown>>;\n private emitter = new Set<() => void>();\n private rootNode: TemplateNode | null = null;\n private trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n this.key ||= props?.key as string;\n this.proxyProps = this.createProxyProps(props);\n }\n\n // Create reactive props\n private createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return useReactive(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n // Getter for the first child node\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n // Getter to check if the node is connected to the DOM\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n // Method to mount the component to the DOM\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(this.proxyProps);\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.callMountHooks();\n this.patchProps(this.props);\n this.removeRef();\n\n return mountedNode;\n }\n\n // Method to unmount the component from the DOM\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 method to call mount hooks\n private callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n // Private method to call destroy hooks\n private callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n // Private method to clear the event emitter\n private clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n // Method to inherit properties from another ComponentNode\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 method to get or create a NodeTrack\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 // Method to patch props onto the component\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 method to patch event listeners\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 method to patch ref\n private patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n // Private method to patch update handlers\n private patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n // Private method to patch normal props\n private patchNormalProp(key: string, prop: any): void {\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n this.proxyProps[key] = isFunction(prop) ? prop() : prop;\n });\n }\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './jsx-renderer';\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 capitalizeFirstLetter,\n coerceArray,\n isArray,\n isFunction,\n isHTMLElement,\n isNil,\n isPrimitive,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, useEffect, useSignal } from '@estjs/signal';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n FRAGMENT_PROP_KEY,\n getComponentIndex,\n renderContext,\n} from './shared-config';\nimport { createTemplate } from './jsx-renderer';\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\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n // Getter for the first child node\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n // Getter to check if the node is connected to the DOM\n get isConnected(): boolean {\n return this.mounted;\n }\n\n // Placeholder methods for event handling\n addEventListener(): void {}\n removeEventListener(): void {}\n\n // Method to mount the node to the DOM\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 // Method to unmount the node from the DOM\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 // Method to inherit properties from another TemplateNode\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 method to map SSG node tree\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 method to walk through the node tree\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 method to handle SSG nodes\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 // Method to patch props onto the node\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 method to patch a single prop\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}${capitalizeFirstLetter(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n // Private method to patch children\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 method to patch event listeners\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 method to patch attributes\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 : useSignal(val);\n setAttribute(element, attr, triggerValue.value);\n const cleanup = useEffect(() => {\n // triggger conditional expression\n const val = isFunction(value) ? value() : value;\n triggerValue.value = isSignal(val) ? val.value : val;\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 method to get or create a NodeTrack\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 method to patch a child node\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 method to reconcile children nodes\n private reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './shared-config';\nimport type { EssorComponent, EssorNode, Props } from '../types';\n\n// 新增:常量定义\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 './lifecycle-context';\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 './ssg-node';\nimport { renderContext } from './shared-config';\nimport { h } from './jsx-renderer';\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","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","HTML_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","closeHtmlTags","input","tagStack","tagPattern","lastIndex","fullMatch","isEndTag","unclosedTag","isHtmlTagName","convertToHtmlTag","signal","ComponentNode","shallowReactive","startsWith","_b","_c","_d","mountedNode","cleanup","trackKey","track","prop","event","useEffect","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","isPrimitive","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","val","triggerValue","shallowSignal","val2","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","h","isString","htmlTemplate","isComponent","html","Fragment","onMount","onDestroy","useProvide","useInject","defaultValue","useRef","renderToString","component","hydrate","container","rootElement","ssg"],"mappings":"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","file":"template.cjs.js","sourcesContent":["/**\n * Framework render type\n *\n * CLIENT: client side\n * SSR: server side render\n * SSG: server side generate\n */\nexport enum RENDER_MODE {\n CLIENT,\n SSG,\n SSR,\n}\n\nexport const EVENT_PREFIX = 'on';\nexport const UPDATE_PREFIX = 'update';\nexport const CHILDREN_PROP = 'children';\n\nexport const EMPTY_TEMPLATE = '';\nexport const FRAGMENT_PROP_KEY = '0';\nexport const SINGLE_PROP_KEY = '1';\nexport const STYLE_KEY = 'style';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\n// Enum to represent different types of components\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\n// Function to enter a component and set its index\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\n// Function to get the index of a component\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal/*';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === 'children') {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== 'children' && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!SELF_CLOSING_TAGS.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, shallowReactive, useEffect } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, UPDATE_PREFIX } from './sharedConfig';\nimport type { TemplateNode } from './templateNode';\nimport type { EssorComponent, NodeTrack, Props } from '../types';\n\nexport class ComponentNode extends LifecycleContext implements JSX.Element {\n private proxyProps: Record<string, Signal<unknown>>;\n private emitter = new Set<() => void>();\n private rootNode: TemplateNode | null = null;\n private trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n this.key ||= props?.key as string;\n this.proxyProps = this.createProxyProps(props);\n }\n\n private createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return shallowReactive(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(this.proxyProps);\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.callMountHooks();\n this.patchProps(this.props);\n this.removeRef();\n\n return mountedNode;\n }\n\n unmount(): void {\n this.callDestroyHooks();\n this.clearHooks();\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.clearEmitter();\n }\n\n private callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n private callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n private clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n private getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === 'ref') {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n private patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n private patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n private patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n private patchNormalProp(key: string, prop: any): void {\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n this.proxyProps[key] = isFunction(prop) ? prop() : prop;\n });\n }\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './jsxRenderer';\n\n// Type alias for nodes that can be either DOM Node or JSX Element\ntype AnyNode = Node | JSX.Element;\n\n/**\n * Patches children of a parent node with new children.\n * This function is responsible for efficiently updating the DOM to reflect changes in the virtual DOM.\n *\n * @param parent - The parent node whose children are being updated\n * @param childrenMap - A map of current children, keyed by their unique identifiers\n * @param nextChildren - An array of new children to be patched in\n * @param before - The node before which new children should be inserted (if any)\n * @returns A new map of children after patching\n */\nexport function patchChildren(\n parent: Node,\n childrenMap: Map<string, AnyNode>,\n nextChildren: AnyNode[],\n before: Node | null,\n): Map<string, AnyNode> {\n const result = new Map<string, AnyNode>();\n const children = Array.from(childrenMap.values());\n\n // If there are no new children, clear all existing children\n if (children.length && nextChildren.length === 0) {\n clearChildren(parent, children, before);\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n // Iterate through new children and patch or insert as necessary\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\n // Remove any current children that are not in the new children set\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children[++childIndex];\n currKey = getKey(currChild, i);\n }\n\n const key = getKey(child, i);\n const origChild = childrenMap.get(key);\n\n // If the child already exists, patch it\n if (origChild) {\n child = patch(parent, origChild, child);\n }\n\n // Handle insertion or replacement of children\n if (currChild) {\n if (currChild === origChild) {\n childIndex++;\n } else {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n }\n } else {\n insertChild(parent, child, before);\n }\n\n result.set(key, child);\n }\n\n // Replace placeholders with actual nodes\n replaces.forEach(([placeholder, child]) => {\n replaceChild(parent, child, placeholder);\n });\n\n // Remove any remaining children that weren't in the new set\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\n/**\n * Clears all children from a parent node.\n *\n * @param parent - The parent node to clear children from\n * @param children - The array of children to be cleared\n * @param before - The node before which clearing should stop (if any)\n */\nfunction clearChildren(parent: Node, children: AnyNode[], before: Node | null) {\n if (parent.childNodes.length === children.length + (before ? 1 : 0)) {\n (parent as Element).innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children[0];\n const start = isJsxElement(child) ? child.firstChild : child;\n range.setStartBefore(start!);\n if (before) {\n range.setEndBefore(before);\n } else {\n range.setEndAfter(parent);\n }\n range.deleteContents();\n }\n children.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n}\n\n/**\n * Patches a single node, replacing it with a new node if necessary.\n *\n * @param parent - The parent node\n * @param node - The current node\n * @param next - The new node to patch with\n * @returns The patched node\n */\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\n/**\n * Maps an array of nodes to a Map, using their keys as identifiers.\n *\n * @param children - The array of nodes to map\n * @returns A Map of nodes, keyed by their unique identifiers\n */\nexport function mapKeys(children: AnyNode[]): Map<string, AnyNode> {\n const result = new Map();\n for (const [i, child] of children.entries()) {\n const key = getKey(child, i);\n result.set(key, child);\n }\n return result;\n}\n\n/**\n * Gets the key for a node, either from its 'key' property (if it's a JSX element)\n * or generates a key based on its index.\n *\n * @param node - The node to get the key for\n * @param index - The index of the node in its parent's children array\n * @returns A string key for the node\n */\nexport function getKey(node: AnyNode, index: number): string {\n if (isJsxElement(node)) {\n const jsxKey = (node as any).key;\n if (jsxKey !== undefined && jsxKey !== null) {\n return String(jsxKey);\n }\n }\n return `_$${index}$`;\n}\n","import {\n capitalize,\n coerceArray,\n isArray,\n isFunction,\n isHTMLElement,\n isNil,\n isPrimitive,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, shallowSignal, useEffect } from '@estjs/signal';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n FRAGMENT_PROP_KEY,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n // Private properties for managing the node's state\n private treeMap = new Map<number, Node>();\n private mounted = false;\n private nodes: Node[] = [];\n private trackMap = new Map<string, NodeTrack>();\n private bindValueKeys: string[] = [];\n private componentIndex: number;\n private parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n this.key ||= props?.key as string;\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n if (isArray(this.template)) {\n this.template = createTemplate(this.template.join(''));\n }\n\n const cloneNode = this.template.content.cloneNode(true);\n const firstChild = cloneNode.firstChild as HTMLElement | null;\n\n if (firstChild?.hasAttribute?.('_svg_')) {\n firstChild.remove();\n firstChild?.childNodes.forEach(node => {\n (cloneNode as Element).append(node);\n });\n }\n\n this.nodes = Array.from(cloneNode.childNodes);\n\n if (renderContext.isSSR) {\n this.mapSSGNodeTree(parent as HTMLElement);\n } else {\n this.mapNodeTree(parent, cloneNode);\n }\n insertChild(parent, cloneNode, before);\n this.patchProps(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n // Fragment\n if (!this.template.innerHTML && !this.nodes.length) {\n const children = this.props?.[FRAGMENT_PROP_KEY]?.children;\n\n if (children) {\n if (isArray(children)) {\n children.forEach(child => {\n this.deleteFragmentTextNode(child);\n });\n } else {\n this.deleteFragmentTextNode(children);\n }\n }\n }\n\n this.nodes = [];\n this.mounted = false;\n }\n\n deleteFragmentTextNode(child) {\n if (isPrimitive(child)) {\n this.parent?.childNodes.forEach(node => {\n if (node.nodeType === Node.TEXT_NODE && node.textContent === `${child as any}`) {\n this.parent?.removeChild(node);\n }\n });\n } else {\n removeChild(child);\n }\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n private mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // Private method to map node tree\n private mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n private walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n private handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n private patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n private patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === 'ref') {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, 'on')) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n private getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const UPDATE_PREFIX = 'update';\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n private patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n private patchEventListener(key: string, node: Node, attr: string, listener: EventListener): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n private patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n const cleanup = useEffect(() => {\n // triggger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (JSON.stringify(triggerValue.value) === JSON.stringify(val2)) return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n private getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n private patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n private reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport type { EssorComponent, EssorNode, Props } from '../types';\n\n/**\n * Creates a JSX element from a given template.\n *\n * @param template - The template to render. Can be a string representing an HTML\n * element, a function representing a component, or an `HTMLTemplateElement`.\n * @param props - Properties to pass to the component or element.\n * @param key - The key of the element.\n * @returns The created JSX element.\n */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n template: EssorComponent | HTMLTemplateElement | K | '',\n props?: Props,\n key?: string,\n): JSX.Element {\n if (isString(template)) {\n if (isHtmlTagName(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n } else if (template === EMPTY_TEMPLATE) {\n props = { [FRAGMENT_PROP_KEY]: props };\n return new TemplateNode(createTemplate(EMPTY_TEMPLATE), props, key);\n }\n }\n\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template as HTMLTemplateElement, props, key);\n}\n\n/**\n * Checks if the given node is an instance of `ComponentNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is an instance of `ComponentNode`, otherwise `false`.\n */\nexport function isComponent(node: unknown): node is ComponentNode {\n return node instanceof ComponentNode;\n}\n\n/**\n * Checks if the given node is a JSX element. A JSX element is either an instance\n * of `ComponentNode` or an instance of `TemplateNode`.\n *\n * @param node The node to check.\n * @returns `true` if the node is a JSX element, otherwise `false`.\n */\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\n/**\n * Creates an HTML template element from a given HTML string.\n *\n * @param html The HTML string to create a template from.\n * @returns A new HTML template element.\n */\nexport function createTemplate(html: string): HTMLTemplateElement {\n const template = document.createElement('template');\n template.innerHTML = closeHtmlTags(html);\n return template;\n}\n\n/**\n * @param props - An object containing the `children` prop.\n * @param props.children - The children to be rendered. Can be a single JSX element, string, number, boolean,\n * or an array of these. Falsy values in arrays will be filtered out.\n * @returns A JSX element representing the fragment, wrapping the filtered children.\n */\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(props: { children: T }) {\n return h(EMPTY_TEMPLATE, {\n children: isArray(props.children) ? props.children.filter(Boolean) : [props.children],\n });\n}\n","import { isSymbol } from '@estjs/shared';\nimport { type Signal, shallowSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('useProvide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function useInject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('useInject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n\n/**\n * Creates a reactive ref that can be used to reference a DOM node\n * or a component instance within the component function body.\n *\n * @returns a reactive ref signal\n *\n * @example\n * const inputRef = useRef<HTMLInputElement>()\n *\n * <input ref={inputRef} />\n *\n * inputRef.value // input element\n */\nexport function useRef<T>(): Signal<T | null> {\n return shallowSignal<T | null>(null);\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|