@estjs/template 0.0.14-beta.15 → 0.0.14-beta.16
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 +2 -2
- package/dist/template.cjs.js.map +1 -1
- package/dist/template.d.cts +3 -17
- package/dist/template.d.ts +3 -17
- package/dist/template.dev.cjs.js +7 -11
- package/dist/template.dev.esm.js +7 -10
- package/dist/template.esm.js +3 -3
- package/dist/template.esm.js.map +1 -1
- package/package.json +3 -3
package/dist/template.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';var shared=require('@estjs/shared'),signal=require('@estjs/signal');/**
|
|
2
|
-
* @estjs/template v0.0.14-beta.
|
|
2
|
+
* @estjs/template v0.0.14-beta.16
|
|
3
3
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
4
4
|
* @license MIT
|
|
5
5
|
**/
|
|
6
|
-
var k="on",P="update",E="children",w="",q="0",z="1";var H="ref",A=" __PLACEHOLDER__ ";var G=class{constructor(){this.renderMode=0;}get isSSG(){return this.renderMode===1}get isSSR(){return this.renderMode===2}get isClient(){return this.renderMode===0}setSSR(){this.renderMode=2;}setSSG(){this.renderMode=1;}setClient(){this.renderMode=0;}},m=new G,W=new Map;function Q(n,e){W.set(n,{index:e});}function Z(n){var e;return (e=W.get(n))==null?void 0:e.index}var S=class S{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(e,t){var o;(o=this.hooks[e])==null||o.add(t);}getContext(e){return S.context[e]}setContext(e,t){S.context[e]=t;}initRef(){S.ref=this;}removeRef(){S.ref=null;}clearHooks(){Object.values(this.hooks).forEach(e=>e.clear());}};S.ref=null,S.context={};var u=S;function O(n){return n instanceof C}var b=1,C=class extends u{constructor(t,o={},r){super();this.template=t;this.props=o;this.key=r;Q(t,b),this.templates=this.processTemplate();}processTemplate(){if(shared.isArray(this.template)){let t=this.template.join(A);return this.processHtmlString(t).split(A)}return []}processHtmlString(t){return t.replaceAll(/(<[^>]+>)|([^<]+)/g,(o,r,i)=>r?r.includes("data-ci")?o:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,a,c)=>`<${a} data-ci="${b}"${c||""}>`):i&&i.replace(A,"").trim()?`<!--0-${b}-->${i}<!$>`:o)}mount(){this.initRef();let t=this.render();return this.removeRef(),t}render(){if(shared.isFunction(this.template)){let t=this.template(this.props);return O(t)?t.mount():String(t)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([t,o])=>{let r=o.children;this.normalizeProps(o);let i=this.templates.findIndex(s=>s.includes(`data-hk="${t}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${t}"`,`data-hk="${t}" ${this.generateAttributes(o)}`);}),this.templates.join("")}normalizeProps(t){Object.entries(t).forEach(([o,r])=>{o===E||shared.isFunction(r)?delete t[o]:signal.isSignal(r)&&(t[o]=r.value);});}generateAttributes(t){return Object.entries(t).filter(([o,r])=>o!==E&&!shared.isFunction(r)).map(([o,r])=>`${o}="${shared.escape(String(r))}"`).join(" ")}renderChildren(t,o){t.forEach(([r])=>{b++;let i=this.renderChild(r);this.templates[o]+=i;});}renderChild(t){if(signal.isSignal(t))return `<!--1-${b}-->${t.value}<!$>`;if(shared.isFunction(t))return this.renderChild(t(this.props));if(O(t)){let o=t.mount();return shared.isFunction(o)?o(this.props):_(o)}else return `<!--1-${b}-->${t}<!$>`}};var Ee="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(",");function F(n){if(f(n)||n instanceof Node||O(n))return n;let e=shared.isFalsy(n)?"":String(n);return document.createTextNode(e)}function g(n,e,t=null){let o=f(t)?t.firstChild:t,r=m.isSSR;f(e)?e.mount(n,o):o&&!r?o.before(e):r||n.append(e);}function T(n){f(n)?n.unmount():n.parentNode&&n.remove();}function J(n,e,t){g(n,e,t),T(t);}function V(n,e,t){e==="class"?ge(n,t):e==="style"?Te(n,t):Se(n,e,t);}function ge(n,e){typeof e=="string"?n.className=e:shared.isArray(e)?n.className=e.join(" "):e&&typeof e=="object"&&(n.className=Object.entries(e).reduce((t,[o,r])=>t+(r?` ${o}`:""),"").trim());}function Te(n,e){typeof e=="string"?n.style.cssText=e:e&&typeof e=="object"&&Object.entries(e).forEach(([o,r])=>{n.style.setProperty(shared.kebabCase(o),String(r));});}function Se(n,e,t){shared.isFalsy(t)?n.removeAttribute(e):t===!0?n.setAttribute(e,""):n instanceof HTMLInputElement&&e==="value"?n.value=String(t):n.setAttribute(e,String(t));}function oe(n,e){if(n instanceof HTMLInputElement)switch(n.type){case"checkbox":return h(n,"change",()=>{e(!!n.checked);});case"date":return h(n,"change",()=>{e(n.value?n.value:"");});case"file":return h(n,"change",()=>{n.files&&e(n.files);});case"number":return h(n,"input",()=>{let t=Number.parseFloat(n.value);e(Number.isNaN(t)?"":String(t));});case"radio":return h(n,"change",()=>{e(n.checked?n.value:"");});case"text":return h(n,"input",()=>{e(n.value);})}if(n instanceof HTMLSelectElement)return h(n,"change",()=>{e(n.value);});if(n instanceof HTMLTextAreaElement)return h(n,"input",()=>{e(n.value);})}function h(n,e,t){return n.addEventListener(e,t),()=>n.removeEventListener(e,t)}function ne(n){return Ee.includes(n)?`<${n}/>`:`<${n}></${n}>`}function _(n){return signal.isSignal(n)?n.value:n}var M=class extends u{constructor(t,o,r){super();this.template=t;this.props=o;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=o&&o.key),this.proxyProps=this.createProxyProps(o);}createProxyProps(t){return t?signal.signalObject(t,o=>shared.startsWith(o,k)||shared.startsWith(o,P)||o===E):{}}get firstChild(){var t,o;return (o=(t=this.rootNode)==null?void 0:t.firstChild)!=null?o:null}get isConnected(){var t,o;return (o=(t=this.rootNode)==null?void 0:t.isConnected)!=null?o:!1}mount(t,o){var i,s,a,c;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(t,o))!=null?s:[];this.initRef(),this.rootNode=this.template(signal.reactive(this.proxyProps,[E]));let r=(c=(a=this.rootNode)==null?void 0:a.mount(t,o))!=null?c:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var t;this.callDestroyHooks(),this.clearHooks(),(t=this.rootNode)==null||t.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(t=>t());}callDestroyHooks(){this.hooks.destroy.forEach(t=>t());}clearEmitter(){for(let t of this.emitter)t();this.emitter.clear();}inheritNode(t){Object.assign(this.proxyProps,t.proxyProps),this.rootNode=t.rootNode,this.trackMap=t.trackMap,this.hooks=t.hooks;let o=this.props;this.props=t.props,this.patchProps(o);}getNodeTrack(t){let o=this.trackMap.get(t);return o||(o={cleanup:()=>{}},this.trackMap.set(t,o)),o.cleanup(),o}patchProps(t){var o;if(t){for(let[r,i]of Object.entries(t))shared.startsWith(r,k)&&((o=this.rootNode)!=null&&o.firstChild)?this.patchEventListener(r,i):r===H?this.patchRef(i):shared.startsWith(r,P)?this.patchUpdateHandler(r,i):r!==E&&this.patchNormalProp(r,i);this.props=t;}}patchEventListener(t,o){let r=t.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,o);this.emitter.add(i);}patchRef(t){var o,r;t.value=(r=(o=this.rootNode)==null?void 0:o.firstChild)!=null?r:null;}patchUpdateHandler(t,o){this.props[t]=_(o);}patchNormalProp(t,o){var s,a;let r=(a=(s=this.proxyProps)[t])!=null?a:s[t]=signal.signal(o),i=this.getNodeTrack(t);i.cleanup=signal.effect(()=>{r.value=shared.isFunction(o)?o():o;});}};function ie(n,e,t,o){let r=new Map,i=Array.from(e.values());if(i.length&&t.length===0)return Ce(n,i,o),r;let s=[],a=ke(t),c=0;for(let[d,p]of t.entries()){let l=i[c],v=x(l,d);for(;l&&!a.has(v);)T(l),e.delete(v),l=i[++c],v=x(l,d);let U=x(p,d),D=e.get(U);if(D&&(p=Me(n,D,p)),l)if(l===D)c++;else {let B=document.createComment("");g(n,B,l),s.push([B,p]);}else g(n,p,o);r.set(U,p);}return s.forEach(([d,p])=>{J(n,p,d);}),e.forEach((d,p)=>{d.isConnected&&!r.has(p)&&T(d);}),r}function Ce(n,e,t){if(n.childNodes.length===e.length+(t?1:0))n.innerHTML="",t&&g(n,t);else {let o=document.createRange(),r=e[0],i=f(r)?r.firstChild:r;o.setStartBefore(i),t?o.setEndBefore(t):o.setEndAfter(n),o.deleteContents();}e.forEach(o=>{f(o)&&o.unmount();});}function Me(n,e,t){return e===t?e:f(e)&&f(t)&&e.template===t.template?(t.inheritNode(e),t):e instanceof Text&&t instanceof Text?(e.textContent!==t.textContent&&(e.textContent=t.textContent),e):(J(n,t,e),t)}function ke(n){let e=new Map;for(let[t,o]of n.entries()){let r=x(o,t);e.set(r,o);}return e}function x(n,e){if(f(n)){let t=n.key;if(t!=null)return String(t)}return `_$${e}$`}var y=class{constructor(e,t,o){this.template=e;this.props=t;this.key=o;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;m.isSSR&&(this.componentIndex=Z(this.template));}get firstChild(){var e;return (e=this.nodes[0])!=null?e:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(e,t){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(s=>g(e,s,t)),this.nodes;shared.isArray(this.template)&&(this.template=R(this.template.join("")));let o=this.template.content.cloneNode(!0),r=o.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r.childNodes.forEach(s=>{o.append(s);})),this.nodes=Array.from(o.childNodes),m.isSSR?this.mapSSGNodeTree(e):this.mapNodeTree(e,o),g(e,o,t),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){this.trackMap.forEach(e=>{e.cleanup&&e.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>T(e)),this.nodes=[],this.mounted=!1;}inheritNode(e){this.mounted=e.mounted,this.nodes=e.nodes,this.trackMap=e.trackMap,this.treeMap=e.treeMap;let t=this.props;this.props=e.props,this.patchProps(t);}mapSSGNodeTree(e){this.treeMap.set(0,e),this.walkNodeTree(e,this.handleSSGNode.bind(this));}mapNodeTree(e,t){let o=1;this.treeMap.set(0,e);let r=[e],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(o++,s),r.push(s));};this.walkNodeTree(t,i);}walkNodeTree(e,t){e.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&t(e);let o=e.firstChild;for(;o;)this.walkNodeTree(o,t),o=o.nextSibling;}handleSSGNode(e){var t;if(e.nodeType===Node.COMMENT_NODE){let[o,r]=((t=e.textContent)==null?void 0:t.split("-"))||[];if(0===+o&&+r===this.componentIndex){let i=e.nextSibling;this.treeMap.set(+r,i);}}else if(e.nodeType!==Node.TEXT_NODE){let{ci:o="-1",hk:r}=(e==null?void 0:e.dataset)||{};r&&+o===this.componentIndex&&this.treeMap.set(+r,e);}}patchProps(e){e&&(Object.entries(e).forEach(([t,o])=>{let r=Number(t),i=this.treeMap.get(r);i&&this.patchProp(t,i,o,r===0);}),this.props=e);}patchProp(e,t,o,r){o&&Object.entries(o).forEach(([i,s])=>{if(i===E&&s)this.patchChildren(e,t,s,r);else if(i===H)o[i].value=t;else if(shared.startsWith(i,k))this.patchEventListener(e,t,i,s);else {if(this.bindValueKeys.includes(i))return;let a=this.getBindUpdateValue(o,e,i);this.patchAttribute(e,t,i,s,a);}});}getBindUpdateValue(e,t,o){let r=`${P}${shared.capitalize(o)}`;if(r&&e[r]&&shared.isFunction(e[r]))return this.bindValueKeys.push(r),e[r]}patchChildren(e,t,o,r){if(shared.isArray(o))o.filter(Boolean).forEach((i,s)=>{var v;let[a,c]=shared.isArray(i)?i:[i,null],d=shared.isNil(c)?null:(v=this.treeMap.get(c))!=null?v:null,p=`${e}:${E}:${s}`,l=this.getNodeTrack(p,!0,r);this.patchChild(l,t,a,d);});else {let i=`${e}:${E}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,t,o,null);}}patchEventListener(e,t,o,r){let i=o.slice(2).toLowerCase(),s=this.getNodeTrack(`${e}:${o}`);s.cleanup=h(t,i,r);}patchAttribute(e,t,o,r,i){let s=this.getNodeTrack(`${e}:${o}`),a=shared.isFunction(r)?r():r,c=signal.isSignal(a)?a:signal.shallowSignal(a);V(t,o,c.value);let d=signal.effect(()=>{let l=shared.isFunction(r)?r():r;shared.isPlainObject(l)&&shared.isPlainObject(c.peek())&&JSON.stringify(c.value)===JSON.stringify(l)||(c.value=signal.isSignal(l)?l.value:l,V(t,o,c.value));}),p;i&&shared.isHTMLElement(t)&&(p=oe(t,l=>{i(l);})),s.cleanup=()=>{d&&d(),p&&p();};}getNodeTrack(e,t,o){let r=this.trackMap.get(e);return r||(r={cleanup:()=>{}},t&&(r.lastNodes=new Map),o&&(r.isRoot=!0),this.trackMap.set(e,r)),r.cleanup&&r.cleanup(),r}patchChild(e,t,o,r){shared.isFunction(o)?e.cleanup=signal.effect(()=>{let i=shared.coerceArray(o()).map(F);m.isSSR?e.lastNodes=this.reconcileChildren(t,i,r):e.lastNodes=ie(t,e.lastNodes,i,r);}):shared.coerceArray(o).forEach((i,s)=>{let a=F(i),c=x(a,s);m.isSSR?e.lastNodes=this.reconcileChildren(t,[a],r):(e.lastNodes.set(c,a),g(t,a,r));});}reconcileChildren(e,t,o){let r=new Map,i=Array.from(e.childNodes).filter(s=>{var a,c;return s.nodeType===Node.TEXT_NODE&&((a=s.previousSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&((c=s.nextSibling)==null?void 0:c.nodeType)===Node.COMMENT_NODE});return t.forEach((s,a)=>{let c=x(s,a);s.nodeType===Node.TEXT_NODE?i.forEach(d=>{s.textContent===d.textContent&&e.replaceChild(s,d);}):g(e,s,o),r.set(c,s);}),r}};var j=class extends y{unmount(){this.trackMap.forEach(e=>{e.lastNodes&&e.lastNodes.forEach(t=>{T(t);}),e.cleanup&&e.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>{T(e);}),this.nodes=[],this.mounted=!1;}};function K(n,e,t){if(n===w)return de(n,e);if(shared.isString(n)){let o=ne(n);return e={[z]:e},new y(R(o),e,t)}return shared.isFunction(n)?new M(n,e,t):new y(n,e,t)}function $e(n){return n instanceof M}function f(n){return n instanceof M||n instanceof y}function R(n){let e=document.createElement("template");return e.innerHTML=n,e}function de(n,e){return e.children&&(e={[q]:{children:shared.isArray(e.children)?e.children.filter(Boolean):[e.children]}}),n===w&&(n=R(w)),new j(n,e)}function je(n){u.ref&&u.ref.addHook("mounted",n);}function Ke(n){u.ref&&u.ref.addHook("destroy",n);}function Xe(n,e){u.ref&&u.ref.setContext(n,e);}function De(n,e){var t;return (t=u.ref&&u.ref.getContext(n))!=null?t:e}function Ge(){return signal.shallowSignal(null)}function Fe(n,e){m.setSSG();let o=new C(n,e||{}).mount();return m.setClient(),o}function Je(n,e){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Could not find container: ${e}`);m.setSSR(),K(n).mount(t),m.setClient();}function Ve(n,e){return m.isSSG?new C(n,e):K(n,e)}exports.Fragment=de;exports.h=K;exports.hydrate=Je;exports.isComponent=$e;exports.isJsxElement=f;exports.onDestroy=Ke;exports.onMount=je;exports.renderToString=Fe;exports.ssg=Ve;exports.template=R;exports.useInject=De;exports.useProvide=Xe;exports.useRef=Ge;//# sourceMappingURL=template.cjs.js.map
|
|
6
|
+
var k="on",P="update",E="children",w="",q="0",z="1";var H="ref",A=" __PLACEHOLDER__ ";var G=class{constructor(){this.renderMode=0;}get isSSG(){return this.renderMode===1}get isSSR(){return this.renderMode===2}get isClient(){return this.renderMode===0}setSSR(){this.renderMode=2;}setSSG(){this.renderMode=1;}setClient(){this.renderMode=0;}},m=new G,W=new Map;function Q(n,e){W.set(n,{index:e});}function Z(n){var e;return (e=W.get(n))==null?void 0:e.index}var S=class S{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(e,t){var o;(o=this.hooks[e])==null||o.add(t);}getContext(e){return S.context[e]}setContext(e,t){S.context[e]=t;}initRef(){S.ref=this;}removeRef(){S.ref=null;}clearHooks(){Object.values(this.hooks).forEach(e=>e.clear());}};S.ref=null,S.context={};var u=S;function O(n){return n instanceof C}var b=1,C=class extends u{constructor(t,o={},r){super();this.template=t;this.props=o;this.key=r;Q(t,b),this.templates=this.processTemplate();}processTemplate(){if(shared.isArray(this.template)){let t=this.template.join(A);return this.processHtmlString(t).split(A)}return []}processHtmlString(t){return t.replaceAll(/(<[^>]+>)|([^<]+)/g,(o,r,i)=>r?r.includes("data-ci")?o:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,c,a)=>`<${c} data-ci="${b}"${a||""}>`):i&&i.replace(A,"").trim()?`<!--0-${b}-->${i}<!$>`:o)}mount(){this.initRef();let t=this.render();return this.removeRef(),t}render(){if(shared.isFunction(this.template)){let t=this.template(this.props);return O(t)?t.mount():String(t)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([t,o])=>{let r=o.children;this.normalizeProps(o);let i=this.templates.findIndex(s=>s.includes(`data-hk="${t}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${t}"`,`data-hk="${t}" ${this.generateAttributes(o)}`);}),this.templates.join("")}normalizeProps(t){Object.entries(t).forEach(([o,r])=>{o===E||shared.isFunction(r)?delete t[o]:signal.isSignal(r)&&(t[o]=r.value);});}generateAttributes(t){return Object.entries(t).filter(([o,r])=>o!==E&&!shared.isFunction(r)).map(([o,r])=>`${o}="${shared.escape(String(r))}"`).join(" ")}renderChildren(t,o){t.forEach(([r])=>{b++;let i=this.renderChild(r);this.templates[o]+=i;});}renderChild(t){if(signal.isSignal(t))return `<!--1-${b}-->${t.value}<!$>`;if(shared.isFunction(t))return this.renderChild(t(this.props));if(O(t)){let o=t.mount();return shared.isFunction(o)?o(this.props):_(o)}else return `<!--1-${b}-->${t}<!$>`}};var Ee="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(",");function F(n){if(f(n)||n instanceof Node||O(n))return n;let e=shared.isFalsy(n)?"":String(n);return document.createTextNode(e)}function g(n,e,t=null){let o=f(t)?t.firstChild:t,r=m.isSSR;f(e)?e.mount(n,o):o&&!r?o.before(e):r||n.append(e);}function T(n){f(n)?n.unmount():n.parentNode&&n.remove();}function J(n,e,t){g(n,e,t),T(t);}function V(n,e,t){e==="class"?ge(n,t):e==="style"?Te(n,t):Se(n,e,t);}function ge(n,e){typeof e=="string"?n.className=e:shared.isArray(e)?n.className=e.join(" "):e&&typeof e=="object"&&(n.className=Object.entries(e).reduce((t,[o,r])=>t+(r?` ${o}`:""),"").trim());}function Te(n,e){typeof e=="string"?n.style.cssText=e:e&&typeof e=="object"&&Object.entries(e).forEach(([o,r])=>{n.style.setProperty(shared.kebabCase(o),String(r));});}function Se(n,e,t){shared.isFalsy(t)?n.removeAttribute(e):t===!0?n.setAttribute(e,""):n instanceof HTMLInputElement&&e==="value"?n.value=String(t):n.setAttribute(e,String(t));}function oe(n,e){if(n instanceof HTMLInputElement)switch(n.type){case"checkbox":return h(n,"change",()=>{e(!!n.checked);});case"date":return h(n,"change",()=>{e(n.value?n.value:"");});case"file":return h(n,"change",()=>{n.files&&e(n.files);});case"number":return h(n,"input",()=>{let t=Number.parseFloat(n.value);e(Number.isNaN(t)?"":String(t));});case"radio":return h(n,"change",()=>{e(n.checked?n.value:"");});case"text":return h(n,"input",()=>{e(n.value);})}if(n instanceof HTMLSelectElement)return h(n,"change",()=>{e(n.value);});if(n instanceof HTMLTextAreaElement)return h(n,"input",()=>{e(n.value);})}function h(n,e,t){return n.addEventListener(e,t),()=>n.removeEventListener(e,t)}function ne(n){return Ee.includes(n)?`<${n}/>`:`<${n}></${n}>`}function _(n){return signal.isSignal(n)?n.value:n}var M=class extends u{constructor(t,o,r){super();this.template=t;this.props=o;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=o&&o.key),this.proxyProps=this.createProxyProps(o);}createProxyProps(t){return t?signal.signalObject(t,o=>shared.startsWith(o,k)||shared.startsWith(o,P)||o===E):{}}get firstChild(){var t,o;return (o=(t=this.rootNode)==null?void 0:t.firstChild)!=null?o:null}get isConnected(){var t,o;return (o=(t=this.rootNode)==null?void 0:t.isConnected)!=null?o:!1}mount(t,o){var i,s,c,a;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(t,o))!=null?s:[];this.initRef(),this.rootNode=this.template(signal.reactive(this.proxyProps,[E]));let r=(a=(c=this.rootNode)==null?void 0:c.mount(t,o))!=null?a:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var t;this.callDestroyHooks(),this.clearHooks(),(t=this.rootNode)==null||t.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(t=>t());}callDestroyHooks(){this.hooks.destroy.forEach(t=>t());}clearEmitter(){for(let t of this.emitter)t();this.emitter.clear();}inheritNode(t){Object.assign(this.proxyProps,t.proxyProps),this.rootNode=t.rootNode,this.trackMap=t.trackMap,this.hooks=t.hooks;let o=this.props;this.props=t.props,this.patchProps(o);}getNodeTrack(t){let o=this.trackMap.get(t);return o||(o={cleanup:()=>{}},this.trackMap.set(t,o)),o.cleanup(),o}patchProps(t){var o;if(t){for(let[r,i]of Object.entries(t))shared.startsWith(r,k)&&((o=this.rootNode)!=null&&o.firstChild)?this.patchEventListener(r,i):r===H?this.patchRef(i):shared.startsWith(r,P)?this.patchUpdateHandler(r,i):r!==E&&this.patchNormalProp(r,i);this.props=t;}}patchEventListener(t,o){let r=t.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,o);this.emitter.add(i);}patchRef(t){var o,r;t.value=(r=(o=this.rootNode)==null?void 0:o.firstChild)!=null?r:null;}patchUpdateHandler(t,o){this.props[t]=_(o);}patchNormalProp(t,o){var s,c;let r=(c=(s=this.proxyProps)[t])!=null?c:s[t]=signal.signal(o),i=this.getNodeTrack(t);i.cleanup=signal.effect(()=>{r.value=shared.isFunction(o)?o():o;});}};function ie(n,e,t,o){let r=new Map,i=Array.from(e.values());if(i.length&&t.length===0)return Ce(n,i,o),r;let s=[],c=ke(t),a=0;for(let[d,p]of t.entries()){let l=i[a],v=x(l,d);for(;l&&!c.has(v);)T(l),e.delete(v),l=i[++a],v=x(l,d);let U=x(p,d),D=e.get(U);if(D&&(p=Me(n,D,p)),l)if(l===D)a++;else {let B=document.createComment("");g(n,B,l),s.push([B,p]);}else g(n,p,o);r.set(U,p);}return s.forEach(([d,p])=>{J(n,p,d);}),e.forEach((d,p)=>{d.isConnected&&!r.has(p)&&T(d);}),r}function Ce(n,e,t){if(n.childNodes.length===e.length+(t?1:0))n.innerHTML="",t&&g(n,t);else {let o=document.createRange(),r=e[0],i=f(r)?r.firstChild:r;o.setStartBefore(i),t?o.setEndBefore(t):o.setEndAfter(n),o.deleteContents();}e.forEach(o=>{f(o)&&o.unmount();});}function Me(n,e,t){return e===t?e:f(e)&&f(t)&&e.template===t.template?(t.inheritNode(e),t):e instanceof Text&&t instanceof Text?(e.textContent!==t.textContent&&(e.textContent=t.textContent),e):(J(n,t,e),t)}function ke(n){let e=new Map;for(let[t,o]of n.entries()){let r=x(o,t);e.set(r,o);}return e}function x(n,e){if(f(n)){let t=n.key;if(t!=null)return String(t)}return `_$${e}$`}var y=class{constructor(e,t,o){this.template=e;this.props=t;this.key=o;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;m.isSSR&&(this.componentIndex=Z(this.template));}get firstChild(){var e;return (e=this.nodes[0])!=null?e:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(e,t){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(s=>g(e,s,t)),this.nodes;shared.isArray(this.template)&&(this.template=R(this.template.join("")));let o=this.template.content.cloneNode(!0),r=o.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r.childNodes.forEach(s=>{o.append(s);})),this.nodes=Array.from(o.childNodes),m.isSSR?this.mapSSGNodeTree(e):this.mapNodeTree(e,o),g(e,o,t),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){this.trackMap.forEach(e=>{e.cleanup&&e.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>T(e)),this.nodes=[],this.mounted=!1;}inheritNode(e){this.mounted=e.mounted,this.nodes=e.nodes,this.trackMap=e.trackMap,this.treeMap=e.treeMap;let t=this.props;this.props=e.props,this.patchProps(t);}mapSSGNodeTree(e){this.treeMap.set(0,e),this.walkNodeTree(e,this.handleSSGNode.bind(this));}mapNodeTree(e,t){let o=1;this.treeMap.set(0,e);let r=[e],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(o++,s),r.push(s));};this.walkNodeTree(t,i);}walkNodeTree(e,t){e.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&t(e);let o=e.firstChild;for(;o;)this.walkNodeTree(o,t),o=o.nextSibling;}handleSSGNode(e){var t;if(e.nodeType===Node.COMMENT_NODE){let[o,r]=((t=e.textContent)==null?void 0:t.split("-"))||[];if(0===+o&&+r===this.componentIndex){let i=e.nextSibling;this.treeMap.set(+r,i);}}else if(e.nodeType!==Node.TEXT_NODE){let{ci:o="-1",hk:r}=(e==null?void 0:e.dataset)||{};r&&+o===this.componentIndex&&this.treeMap.set(+r,e);}}patchProps(e){e&&(Object.entries(e).forEach(([t,o])=>{let r=Number(t),i=this.treeMap.get(r);i&&this.patchProp(t,i,o,r===0);}),this.props=e);}patchProp(e,t,o,r){o&&Object.entries(o).forEach(([i,s])=>{if(i===E&&s)this.patchChildren(e,t,s,r);else if(i===H)o[i].value=t;else if(shared.startsWith(i,k))this.patchEventListener(e,t,i,s);else {if(this.bindValueKeys.includes(i))return;let c=this.getBindUpdateValue(o,e,i);this.patchAttribute(e,t,i,s,c);}});}getBindUpdateValue(e,t,o){let r=`${P}${shared.capitalize(o)}`;if(r&&e[r]&&shared.isFunction(e[r]))return this.bindValueKeys.push(r),e[r]}patchChildren(e,t,o,r){if(shared.isArray(o))o.filter(Boolean).forEach((i,s)=>{var v;let[c,a]=shared.isArray(i)?i:[i,null],d=shared.isNil(a)?null:(v=this.treeMap.get(a))!=null?v:null,p=`${e}:${E}:${s}`,l=this.getNodeTrack(p,!0,r);this.patchChild(l,t,c,d);});else {let i=`${e}:${E}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,t,o,null);}}patchEventListener(e,t,o,r){let i=o.slice(2).toLowerCase(),s=this.getNodeTrack(`${e}:${o}`);s.cleanup=h(t,i,r);}patchAttribute(e,t,o,r,i){let s=this.getNodeTrack(`${e}:${o}`),c=shared.isFunction(r)?r():r,a=signal.isSignal(c)?c:signal.shallowSignal(c);V(t,o,a.value);let d=signal.effect(()=>{let l=shared.isFunction(r)?r():r;shared.isPlainObject(l)&&shared.isPlainObject(a.peek())&&JSON.stringify(a.value)===JSON.stringify(l)||(a.value=signal.isSignal(l)?l.value:l,V(t,o,a.value));}),p;i&&shared.isHTMLElement(t)&&(p=oe(t,l=>{i(l);})),s.cleanup=()=>{d&&d(),p&&p();};}getNodeTrack(e,t,o){let r=this.trackMap.get(e);return r||(r={cleanup:()=>{}},t&&(r.lastNodes=new Map),o&&(r.isRoot=!0),this.trackMap.set(e,r)),r.cleanup&&r.cleanup(),r}patchChild(e,t,o,r){shared.isFunction(o)?e.cleanup=signal.effect(()=>{let i=shared.coerceArray(o()).map(F);m.isSSR?e.lastNodes=this.reconcileChildren(t,i,r):e.lastNodes=ie(t,e.lastNodes,i,r);}):shared.coerceArray(o).forEach((i,s)=>{let c=F(i),a=x(c,s);m.isSSR?e.lastNodes=this.reconcileChildren(t,[c],r):(e.lastNodes.set(a,c),g(t,c,r));});}reconcileChildren(e,t,o){let r=new Map,i=Array.from(e.childNodes).filter(s=>{var c,a;return s.nodeType===Node.TEXT_NODE&&((c=s.previousSibling)==null?void 0:c.nodeType)===Node.COMMENT_NODE&&((a=s.nextSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE});return t.forEach((s,c)=>{let a=x(s,c);s.nodeType===Node.TEXT_NODE?i.forEach(d=>{s.textContent===d.textContent&&e.replaceChild(s,d);}):g(e,s,o),r.set(a,s);}),r}};var j=class extends y{unmount(){this.trackMap.forEach(e=>{e.lastNodes&&e.lastNodes.forEach(t=>{T(t);}),e.cleanup&&e.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>{T(e);}),this.nodes=[],this.mounted=!1;}};function K(n,e,t){if(n===w)return de(n,e);if(shared.isString(n)){let o=ne(n);return e={[z]:e},new y(R(o),e,t)}return shared.isFunction(n)?new M(n,e,t):new y(n,e,t)}function $e(n){return n instanceof M}function f(n){return n instanceof M||n instanceof y}function R(n){let e=document.createElement("template");return e.innerHTML=n,e}function de(n,e){return e.children&&(e={[q]:{children:shared.isArray(e.children)?e.children.filter(Boolean):[e.children]}}),n===w&&(n=R(w)),new j(n,e)}function Ie(n){u.ref&&u.ref.addHook("mounted",n);}function je(n){u.ref&&u.ref.addHook("destroy",n);}function Ke(n,e){u.ref&&u.ref.setContext(n,e);}function Xe(n,e){var t;return (t=u.ref&&u.ref.getContext(n))!=null?t:e}function De(n,e){m.setSSG();let o=new C(n,e||{}).mount();return m.setClient(),o}function Ge(n,e){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Could not find container: ${e}`);m.setSSR(),K(n).mount(t),m.setClient();}function Fe(n,e){return m.isSSG?new C(n,e):K(n,e)}exports.Fragment=de;exports.h=K;exports.hydrate=Ge;exports.inject=Xe;exports.isComponent=$e;exports.isJsxElement=f;exports.onDestroy=je;exports.onMount=Ie;exports.provide=Ke;exports.renderToString=De;exports.ssg=Fe;exports.template=R;//# sourceMappingURL=template.cjs.js.map
|
|
7
7
|
//# sourceMappingURL=template.cjs.js.map
|
package/dist/template.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sharedConfig.ts","../src/lifecycleContext.ts","../src/ssgNode.ts","../src/utils.ts","../src/componentNode.ts","../src/templateNode.ts","../src/patch.ts","../src/fragmentNode.ts","../src/jsxRenderer.ts","../src/hooks.ts","../src/server.ts"],"names":["EVENT_PREFIX","UPDATE_PREFIX","CHILDREN_PROP","EMPTY_TEMPLATE","FRAGMENT_PROP_KEY","SINGLE_PROP_KEY","REF_KEY","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","HTML_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","convertToHtmlTag","signal","ComponentNode","signalObject","startsWith","_b","_c","_d","reactive","mountedNode","cleanup","trackKey","track","prop","event","newValue","effect","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","val","triggerValue","shallowSignal","val2","isPlainObject","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","FragmentNode","h","Fragment","isString","htmlTemplate","isComponent","html","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';\nexport const REF_KEY = 'ref';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { CHILDREN_PROP, ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === CHILDREN_PROP) {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== CHILDREN_PROP && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, effect, signal, signalObject } from '@estjs/signal';\nimport { reactive } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, REF_KEY, 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 protected proxyProps: Record<string, Signal<unknown>>;\n protected emitter = new Set<() => void>();\n protected rootNode: TemplateNode | null = null;\n protected trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n\n this.key ||= props && (props.key as string);\n this.proxyProps = this.createProxyProps(props);\n }\n\n protected createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return signalObject(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(reactive(this.proxyProps, [CHILDREN_PROP]));\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 protected callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n protected callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n protected clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n protected getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === REF_KEY) {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n protected patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n protected patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n protected patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n protected patchNormalProp(key: string, prop: any): void {\n const newValue = (this.proxyProps[key] ??= signal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = effect(() => {\n newValue.value = isFunction(prop) ? prop() : prop;\n });\n }\n}\n","import {\n capitalize,\n coerceArray,\n isArray,\n isFunction,\n isHTMLElement,\n isNil,\n isPlainObject,\n startsWith,\n} from '@estjs/shared';\nimport { effect, isSignal, shallowSignal } from '@estjs/signal';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n EVENT_PREFIX,\n REF_KEY,\n UPDATE_PREFIX,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n protected treeMap = new Map<number, Node>();\n protected mounted = false;\n protected nodes: Node[] = [];\n protected trackMap = new Map<string, NodeTrack>();\n protected bindValueKeys: string[] = [];\n protected componentIndex: number;\n protected parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n\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 && track.cleanup();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n this.nodes = [];\n this.mounted = false;\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n protected mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // protected method to map node tree\n protected mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n protected walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n protected handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n protected patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n protected patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === REF_KEY) {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, EVENT_PREFIX)) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n protected getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n protected patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n protected patchEventListener(\n key: string,\n node: Node,\n attr: string,\n listener: EventListener,\n ): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n protected patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n\n const cleanup = effect(() => {\n // trigger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (\n isPlainObject(val2) &&\n isPlainObject(triggerValue.peek()) &&\n JSON.stringify(triggerValue.value) === JSON.stringify(val2)\n )\n return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n protected getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup && track.cleanup();\n return track;\n }\n\n protected patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = effect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n protected reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { 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 { removeChild } from './utils';\nimport { TemplateNode } from './templateNode';\n\nexport class FragmentNode extends TemplateNode {\n unmount(): void {\n this.trackMap.forEach(track => {\n // clear track node\n if (track.lastNodes) {\n track.lastNodes.forEach(node => {\n removeChild(node);\n });\n }\n track.cleanup && track.cleanup();\n });\n\n this.trackMap.clear();\n this.treeMap.clear();\n\n this.nodes.forEach(node => {\n removeChild(node);\n });\n\n this.nodes = [];\n this.mounted = false;\n }\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { convertToHtmlTag } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport { FragmentNode } from './fragmentNode';\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 // handle fragment\n if (template === EMPTY_TEMPLATE) {\n return Fragment(template, props!);\n }\n // Handle string templates\n if (isString(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n }\n\n // Handle functional templates (Components)\n if (isFunction(template)) {\n return new ComponentNode(template, props, key);\n }\n\n // Handle HTMLTemplateElement\n return 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 /**\n * the code that sets the unclosed tag, the browser's innerHTML method is, will automatically close the tag.\n * like `<div><button type=button>`\n * it will be translated:\n * `<div><button type=button></button></div>`\n */\n template.innerHTML = html;\n return template;\n}\n\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(\n template: HTMLTemplateElement | '',\n props:\n | { children: T }\n | {\n [key in string]: {\n children: T;\n };\n },\n) {\n if (props.children) {\n props = {\n [FRAGMENT_PROP_KEY]: {\n children: (isArray(props.children)\n ? props.children.filter(Boolean)\n : [props.children]) as T,\n },\n };\n }\n if (template === EMPTY_TEMPLATE) {\n template = createTemplate(EMPTY_TEMPLATE);\n }\n return new FragmentNode(template, props);\n}\n","import { isSymbol } from '@estjs/shared';\nimport { type Signal, shallowSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('useProvide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function useInject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('useInject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n\n/**\n * Creates a reactive ref that can be used to reference a DOM node\n * or a component instance within the component function body.\n *\n * @returns a reactive ref signal\n *\n * @example\n * const inputRef = useRef<HTMLInputElement>()\n *\n * <input ref={inputRef} />\n *\n * inputRef.value // input element\n */\nexport function useRef<T>(): Signal<T | null> {\n return shallowSignal<T | null>(null);\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sharedConfig.ts","../src/lifecycleContext.ts","../src/ssgNode.ts","../src/utils.ts","../src/componentNode.ts","../src/patch.ts","../src/templateNode.ts","../src/fragmentNode.ts","../src/jsxRenderer.ts","../src/hooks.ts","../src/server.ts"],"names":["EVENT_PREFIX","UPDATE_PREFIX","CHILDREN_PROP","EMPTY_TEMPLATE","FRAGMENT_PROP_KEY","SINGLE_PROP_KEY","REF_KEY","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","convertToHtmlTag","signal","ComponentNode","signalObject","startsWith","_b","_c","_d","reactive","mountedNode","cleanup","trackKey","track","prop","event","newValue","effect","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","val","triggerValue","shallowSignal","val2","isPlainObject","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","FragmentNode","h","Fragment","isString","htmlTemplate","isComponent","html","onMount","onDestroy","provide","inject","defaultValue","renderToString","component","hydrate","container","rootElement","ssg"],"mappings":"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","file":"template.cjs.js","sourcesContent":["/**\n * Framework render type\n *\n * CLIENT: client side\n * SSR: server side render\n * SSG: server side generate\n */\nexport enum RENDER_MODE {\n CLIENT,\n SSG,\n SSR,\n}\n\nexport const EVENT_PREFIX = 'on';\nexport const UPDATE_PREFIX = 'update';\nexport const CHILDREN_PROP = 'children';\n\nexport const EMPTY_TEMPLATE = '';\nexport const FRAGMENT_PROP_KEY = '0';\nexport const SINGLE_PROP_KEY = '1';\nexport const STYLE_KEY = 'style';\nexport const REF_KEY = 'ref';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { CHILDREN_PROP, ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === CHILDREN_PROP) {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== CHILDREN_PROP && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, effect, signal, signalObject } from '@estjs/signal';\nimport { reactive } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, REF_KEY, 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 protected proxyProps: Record<string, Signal<unknown>>;\n protected emitter = new Set<() => void>();\n protected rootNode: TemplateNode | null = null;\n protected trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n\n this.key ||= props && (props.key as string);\n this.proxyProps = this.createProxyProps(props);\n }\n\n protected createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return signalObject(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(reactive(this.proxyProps, [CHILDREN_PROP]));\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 protected callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n protected callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n protected clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n protected getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === REF_KEY) {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n protected patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n protected patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n protected patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n protected patchNormalProp(key: string, prop: any): void {\n const newValue = (this.proxyProps[key] ??= signal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = effect(() => {\n newValue.value = 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 isPlainObject,\n startsWith,\n} from '@estjs/shared';\nimport { effect, isSignal, shallowSignal } from '@estjs/signal';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n EVENT_PREFIX,\n REF_KEY,\n UPDATE_PREFIX,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n protected treeMap = new Map<number, Node>();\n protected mounted = false;\n protected nodes: Node[] = [];\n protected trackMap = new Map<string, NodeTrack>();\n protected bindValueKeys: string[] = [];\n protected componentIndex: number;\n protected parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n\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 && track.cleanup();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n this.nodes = [];\n this.mounted = false;\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n protected mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // protected method to map node tree\n protected mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n protected walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n protected handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n protected patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n protected patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === REF_KEY) {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, EVENT_PREFIX)) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n protected getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n protected patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n protected patchEventListener(\n key: string,\n node: Node,\n attr: string,\n listener: EventListener,\n ): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n protected patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n\n const cleanup = effect(() => {\n // trigger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (\n isPlainObject(val2) &&\n isPlainObject(triggerValue.peek()) &&\n JSON.stringify(triggerValue.value) === JSON.stringify(val2)\n )\n return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n protected getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup && track.cleanup();\n return track;\n }\n\n protected patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = effect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n protected reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { removeChild } from './utils';\nimport { TemplateNode } from './templateNode';\n\nexport class FragmentNode extends TemplateNode {\n unmount(): void {\n this.trackMap.forEach(track => {\n // clear track node\n if (track.lastNodes) {\n track.lastNodes.forEach(node => {\n removeChild(node);\n });\n }\n track.cleanup && track.cleanup();\n });\n\n this.trackMap.clear();\n this.treeMap.clear();\n\n this.nodes.forEach(node => {\n removeChild(node);\n });\n\n this.nodes = [];\n this.mounted = false;\n }\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { convertToHtmlTag } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport { FragmentNode } from './fragmentNode';\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 // handle fragment\n if (template === EMPTY_TEMPLATE) {\n return Fragment(template, props!);\n }\n // Handle string templates\n if (isString(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n }\n\n // Handle functional templates (Components)\n if (isFunction(template)) {\n return new ComponentNode(template, props, key);\n }\n\n // Handle HTMLTemplateElement\n return 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 /**\n * the code that sets the unclosed tag, the browser's innerHTML method is, will automatically close the tag.\n * like `<div><button type=button>`\n * it will be translated:\n * `<div><button type=button></button></div>`\n */\n template.innerHTML = html;\n return template;\n}\n\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(\n template: HTMLTemplateElement | '',\n props:\n | { children: T }\n | {\n [key in string]: {\n children: T;\n };\n },\n) {\n if (props.children) {\n props = {\n [FRAGMENT_PROP_KEY]: {\n children: (isArray(props.children)\n ? props.children.filter(Boolean)\n : [props.children]) as T,\n },\n };\n }\n if (template === EMPTY_TEMPLATE) {\n template = createTemplate(EMPTY_TEMPLATE);\n }\n return new FragmentNode(template, props);\n}\n","import { isSymbol } from '@estjs/shared';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function provide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('provide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function inject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('inject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|
package/dist/template.d.cts
CHANGED
|
@@ -2358,7 +2358,7 @@ interface InjectionKey<T> extends Symbol {
|
|
|
2358
2358
|
* @param key - The key to store the value in the LifecycleContext with.
|
|
2359
2359
|
* @param value - The value to store in the LifecycleContext with the given key.
|
|
2360
2360
|
*/
|
|
2361
|
-
declare function
|
|
2361
|
+
declare function provide<T, K = InjectionKey<T> | string | number>(key: K, value: K extends InjectionKey<infer V> ? V : T): void;
|
|
2362
2362
|
/**
|
|
2363
2363
|
* Injects a value from the current component LifecycleContext.
|
|
2364
2364
|
*
|
|
@@ -2371,21 +2371,7 @@ declare function useProvide<T, K = InjectionKey<T> | string | number>(key: K, va
|
|
|
2371
2371
|
* @returns The value stored in the LifecycleContext with the given key, or the default
|
|
2372
2372
|
* value if the key is not present in the LifecycleContext.
|
|
2373
2373
|
*/
|
|
2374
|
-
declare function
|
|
2375
|
-
/**
|
|
2376
|
-
* Creates a reactive ref that can be used to reference a DOM node
|
|
2377
|
-
* or a component instance within the component function body.
|
|
2378
|
-
*
|
|
2379
|
-
* @returns a reactive ref signal
|
|
2380
|
-
*
|
|
2381
|
-
* @example
|
|
2382
|
-
* const inputRef = useRef<HTMLInputElement>()
|
|
2383
|
-
*
|
|
2384
|
-
* <input ref={inputRef} />
|
|
2385
|
-
*
|
|
2386
|
-
* inputRef.value // input element
|
|
2387
|
-
*/
|
|
2388
|
-
declare function useRef<T>(): Signal$1<T | null>;
|
|
2374
|
+
declare function inject<T, K = InjectionKey<T> | string | number>(key: K, defaultValue?: K extends InjectionKey<infer V> ? V : T): (K extends InjectionKey<infer V> ? V : T) | undefined;
|
|
2389
2375
|
|
|
2390
2376
|
declare class SSGNode extends LifecycleContext {
|
|
2391
2377
|
private template;
|
|
@@ -2435,4 +2421,4 @@ declare function hydrate(component: EssorComponent, container: string | Element)
|
|
|
2435
2421
|
*/
|
|
2436
2422
|
declare function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element;
|
|
2437
2423
|
|
|
2438
|
-
export { Fragment, type InjectionKey, h, hydrate, isComponent, isJsxElement, onDestroy, onMount, renderToString, ssg, createTemplate as template
|
|
2424
|
+
export { Fragment, type InjectionKey, h, hydrate, inject, isComponent, isJsxElement, onDestroy, onMount, provide, renderToString, ssg, createTemplate as template };
|
package/dist/template.d.ts
CHANGED
|
@@ -2358,7 +2358,7 @@ interface InjectionKey<T> extends Symbol {
|
|
|
2358
2358
|
* @param key - The key to store the value in the LifecycleContext with.
|
|
2359
2359
|
* @param value - The value to store in the LifecycleContext with the given key.
|
|
2360
2360
|
*/
|
|
2361
|
-
declare function
|
|
2361
|
+
declare function provide<T, K = InjectionKey<T> | string | number>(key: K, value: K extends InjectionKey<infer V> ? V : T): void;
|
|
2362
2362
|
/**
|
|
2363
2363
|
* Injects a value from the current component LifecycleContext.
|
|
2364
2364
|
*
|
|
@@ -2371,21 +2371,7 @@ declare function useProvide<T, K = InjectionKey<T> | string | number>(key: K, va
|
|
|
2371
2371
|
* @returns The value stored in the LifecycleContext with the given key, or the default
|
|
2372
2372
|
* value if the key is not present in the LifecycleContext.
|
|
2373
2373
|
*/
|
|
2374
|
-
declare function
|
|
2375
|
-
/**
|
|
2376
|
-
* Creates a reactive ref that can be used to reference a DOM node
|
|
2377
|
-
* or a component instance within the component function body.
|
|
2378
|
-
*
|
|
2379
|
-
* @returns a reactive ref signal
|
|
2380
|
-
*
|
|
2381
|
-
* @example
|
|
2382
|
-
* const inputRef = useRef<HTMLInputElement>()
|
|
2383
|
-
*
|
|
2384
|
-
* <input ref={inputRef} />
|
|
2385
|
-
*
|
|
2386
|
-
* inputRef.value // input element
|
|
2387
|
-
*/
|
|
2388
|
-
declare function useRef<T>(): Signal$1<T | null>;
|
|
2374
|
+
declare function inject<T, K = InjectionKey<T> | string | number>(key: K, defaultValue?: K extends InjectionKey<infer V> ? V : T): (K extends InjectionKey<infer V> ? V : T) | undefined;
|
|
2389
2375
|
|
|
2390
2376
|
declare class SSGNode extends LifecycleContext {
|
|
2391
2377
|
private template;
|
|
@@ -2435,4 +2421,4 @@ declare function hydrate(component: EssorComponent, container: string | Element)
|
|
|
2435
2421
|
*/
|
|
2436
2422
|
declare function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element;
|
|
2437
2423
|
|
|
2438
|
-
export { Fragment, type InjectionKey, h, hydrate, isComponent, isJsxElement, onDestroy, onMount, renderToString, ssg, createTemplate as template
|
|
2424
|
+
export { Fragment, type InjectionKey, h, hydrate, inject, isComponent, isJsxElement, onDestroy, onMount, provide, renderToString, ssg, createTemplate as template };
|
package/dist/template.dev.cjs.js
CHANGED
|
@@ -4,7 +4,7 @@ var shared = require('@estjs/shared');
|
|
|
4
4
|
var signal = require('@estjs/signal');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* @estjs/template v0.0.14-beta.
|
|
7
|
+
* @estjs/template v0.0.14-beta.16
|
|
8
8
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
9
9
|
* @license MIT
|
|
10
10
|
**/
|
|
@@ -892,18 +892,15 @@ function assertInsideComponent(hookName, key) {
|
|
|
892
892
|
);
|
|
893
893
|
}
|
|
894
894
|
}
|
|
895
|
-
function
|
|
896
|
-
assertInsideComponent("
|
|
895
|
+
function provide(key, value) {
|
|
896
|
+
assertInsideComponent("provide", key);
|
|
897
897
|
LifecycleContext.ref && LifecycleContext.ref.setContext(key, value);
|
|
898
898
|
}
|
|
899
|
-
function
|
|
899
|
+
function inject(key, defaultValue) {
|
|
900
900
|
var _a;
|
|
901
|
-
assertInsideComponent("
|
|
901
|
+
assertInsideComponent("inject", key);
|
|
902
902
|
return (_a = LifecycleContext.ref && LifecycleContext.ref.getContext(key)) != null ? _a : defaultValue;
|
|
903
903
|
}
|
|
904
|
-
function useRef() {
|
|
905
|
-
return signal.shallowSignal(null);
|
|
906
|
-
}
|
|
907
904
|
|
|
908
905
|
// src/server.ts
|
|
909
906
|
function renderToString(component, props) {
|
|
@@ -932,13 +929,12 @@ function ssg(component, props) {
|
|
|
932
929
|
exports.Fragment = Fragment;
|
|
933
930
|
exports.h = h;
|
|
934
931
|
exports.hydrate = hydrate;
|
|
932
|
+
exports.inject = inject;
|
|
935
933
|
exports.isComponent = isComponent;
|
|
936
934
|
exports.isJsxElement = isJsxElement;
|
|
937
935
|
exports.onDestroy = onDestroy;
|
|
938
936
|
exports.onMount = onMount;
|
|
937
|
+
exports.provide = provide;
|
|
939
938
|
exports.renderToString = renderToString;
|
|
940
939
|
exports.ssg = ssg;
|
|
941
940
|
exports.template = createTemplate;
|
|
942
|
-
exports.useInject = useInject;
|
|
943
|
-
exports.useProvide = useProvide;
|
|
944
|
-
exports.useRef = useRef;
|
package/dist/template.dev.esm.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { isString, isFunction, isArray, isSymbol, escape, startsWith, capitalize, isNil, isPlainObject, isHTMLElement, coerceArray, isFalsy, kebabCase } from '@estjs/shared';
|
|
2
|
-
import {
|
|
2
|
+
import { isSignal, signalObject, reactive, signal, effect, shallowSignal } from '@estjs/signal';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* @estjs/template v0.0.14-beta.
|
|
5
|
+
* @estjs/template v0.0.14-beta.16
|
|
6
6
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
7
7
|
* @license MIT
|
|
8
8
|
**/
|
|
@@ -890,18 +890,15 @@ function assertInsideComponent(hookName, key) {
|
|
|
890
890
|
);
|
|
891
891
|
}
|
|
892
892
|
}
|
|
893
|
-
function
|
|
894
|
-
assertInsideComponent("
|
|
893
|
+
function provide(key, value) {
|
|
894
|
+
assertInsideComponent("provide", key);
|
|
895
895
|
LifecycleContext.ref && LifecycleContext.ref.setContext(key, value);
|
|
896
896
|
}
|
|
897
|
-
function
|
|
897
|
+
function inject(key, defaultValue) {
|
|
898
898
|
var _a;
|
|
899
|
-
assertInsideComponent("
|
|
899
|
+
assertInsideComponent("inject", key);
|
|
900
900
|
return (_a = LifecycleContext.ref && LifecycleContext.ref.getContext(key)) != null ? _a : defaultValue;
|
|
901
901
|
}
|
|
902
|
-
function useRef() {
|
|
903
|
-
return shallowSignal(null);
|
|
904
|
-
}
|
|
905
902
|
|
|
906
903
|
// src/server.ts
|
|
907
904
|
function renderToString(component, props) {
|
|
@@ -927,4 +924,4 @@ function ssg(component, props) {
|
|
|
927
924
|
return h(component, props);
|
|
928
925
|
}
|
|
929
926
|
|
|
930
|
-
export { Fragment, h, hydrate, isComponent, isJsxElement, onDestroy, onMount, renderToString, ssg, createTemplate as template
|
|
927
|
+
export { Fragment, h, hydrate, inject, isComponent, isJsxElement, onDestroy, onMount, provide, renderToString, ssg, createTemplate as template };
|
package/dist/template.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {isString,isFunction,isArray,escape,startsWith,capitalize,isNil,isPlainObject,isHTMLElement,coerceArray,isFalsy,kebabCase}from'@estjs/shared';import {
|
|
2
|
-
* @estjs/template v0.0.14-beta.
|
|
1
|
+
import {isString,isFunction,isArray,escape,startsWith,capitalize,isNil,isPlainObject,isHTMLElement,coerceArray,isFalsy,kebabCase}from'@estjs/shared';import {isSignal,signalObject,reactive,signal,effect,shallowSignal}from'@estjs/signal';/**
|
|
2
|
+
* @estjs/template v0.0.14-beta.16
|
|
3
3
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
4
4
|
* @license MIT
|
|
5
5
|
**/
|
|
6
|
-
var P="on",L="update",g="children",H="",z="0",W="1";var A="ref",O=" __PLACEHOLDER__ ";var F=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 F,Q=new Map;function Z(n,e){Q.set(n,{index:e});}function ee(n){var e;return (e=Q.get(n))==null?void 0:e.index}var y=class y{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(e,t){var o;(o=this.hooks[e])==null||o.add(t);}getContext(e){return y.context[e]}setContext(e,t){y.context[e]=t;}initRef(){y.ref=this;}removeRef(){y.ref=null;}clearHooks(){Object.values(this.hooks).forEach(e=>e.clear());}};y.ref=null,y.context={};var u=y;function _(n){return n instanceof M}var C=1,M=class extends u{constructor(t,o={},r){super();this.template=t;this.props=o;this.key=r;Z(t,C),this.templates=this.processTemplate();}processTemplate(){if(isArray(this.template)){let t=this.template.join(O);return this.processHtmlString(t).split(O)}return []}processHtmlString(t){return t.replaceAll(/(<[^>]+>)|([^<]+)/g,(o,r,i)=>r?r.includes("data-ci")?o:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,a,c)=>`<${a} data-ci="${C}"${c||""}>`):i&&i.replace(O,"").trim()?`<!--0-${C}-->${i}<!$>`:o)}mount(){this.initRef();let t=this.render();return this.removeRef(),t}render(){if(isFunction(this.template)){let t=this.template(this.props);return _(t)?t.mount():String(t)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([t,o])=>{let r=o.children;this.normalizeProps(o);let i=this.templates.findIndex(s=>s.includes(`data-hk="${t}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${t}"`,`data-hk="${t}" ${this.generateAttributes(o)}`);}),this.templates.join("")}normalizeProps(t){Object.entries(t).forEach(([o,r])=>{o===g||isFunction(r)?delete t[o]:isSignal(r)&&(t[o]=r.value);});}generateAttributes(t){return Object.entries(t).filter(([o,r])=>o!==g&&!isFunction(r)).map(([o,r])=>`${o}="${escape(String(r))}"`).join(" ")}renderChildren(t,o){t.forEach(([r])=>{C++;let i=this.renderChild(r);this.templates[o]+=i;});}renderChild(t){if(isSignal(t))return `<!--1-${C}-->${t.value}<!$>`;if(isFunction(t))return this.renderChild(t(this.props));if(_(t)){let o=t.mount();return isFunction(o)?o(this.props):$(o)}else return `<!--1-${C}-->${t}<!$>`}};var ge="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(",");function J(n){if(f(n)||n instanceof Node||_(n))return n;let e=isFalsy(n)?"":String(n);return document.createTextNode(e)}function T(n,e,t=null){let o=f(t)?t.firstChild:t,r=m.isSSR;f(e)?e.mount(n,o):o&&!r?o.before(e):r||n.append(e);}function S(n){f(n)?n.unmount():n.parentNode&&n.remove();}function V(n,e,t){T(n,e,t),S(t);}function Y(n,e,t){e==="class"?Te(n,t):e==="style"?Se(n,t):ye(n,e,t);}function Te(n,e){typeof e=="string"?n.className=e:isArray(e)?n.className=e.join(" "):e&&typeof e=="object"&&(n.className=Object.entries(e).reduce((t,[o,r])=>t+(r?` ${o}`:""),"").trim());}function Se(n,e){typeof e=="string"?n.style.cssText=e:e&&typeof e=="object"&&Object.entries(e).forEach(([o,r])=>{n.style.setProperty(kebabCase(o),String(r));});}function ye(n,e,t){isFalsy(t)?n.removeAttribute(e):t===!0?n.setAttribute(e,""):n instanceof HTMLInputElement&&e==="value"?n.value=String(t):n.setAttribute(e,String(t));}function ne(n,e){if(n instanceof HTMLInputElement)switch(n.type){case"checkbox":return h(n,"change",()=>{e(!!n.checked);});case"date":return h(n,"change",()=>{e(n.value?n.value:"");});case"file":return h(n,"change",()=>{n.files&&e(n.files);});case"number":return h(n,"input",()=>{let t=Number.parseFloat(n.value);e(Number.isNaN(t)?"":String(t));});case"radio":return h(n,"change",()=>{e(n.checked?n.value:"");});case"text":return h(n,"input",()=>{e(n.value);})}if(n instanceof HTMLSelectElement)return h(n,"change",()=>{e(n.value);});if(n instanceof HTMLTextAreaElement)return h(n,"input",()=>{e(n.value);})}function h(n,e,t){return n.addEventListener(e,t),()=>n.removeEventListener(e,t)}function re(n){return ge.includes(n)?`<${n}/>`:`<${n}></${n}>`}function $(n){return isSignal(n)?n.value:n}var k=class extends u{constructor(t,o,r){super();this.template=t;this.props=o;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=o&&o.key),this.proxyProps=this.createProxyProps(o);}createProxyProps(t){return t?signalObject(t,o=>startsWith(o,P)||startsWith(o,L)||o===g):{}}get firstChild(){var t,o;return (o=(t=this.rootNode)==null?void 0:t.firstChild)!=null?o:null}get isConnected(){var t,o;return (o=(t=this.rootNode)==null?void 0:t.isConnected)!=null?o:!1}mount(t,o){var i,s,a,c;if(!isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(i=this.rootNode)==null?void 0:i.mount(t,o))!=null?s:[];this.initRef(),this.rootNode=this.template(reactive(this.proxyProps,[g]));let r=(c=(a=this.rootNode)==null?void 0:a.mount(t,o))!=null?c:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var t;this.callDestroyHooks(),this.clearHooks(),(t=this.rootNode)==null||t.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(t=>t());}callDestroyHooks(){this.hooks.destroy.forEach(t=>t());}clearEmitter(){for(let t of this.emitter)t();this.emitter.clear();}inheritNode(t){Object.assign(this.proxyProps,t.proxyProps),this.rootNode=t.rootNode,this.trackMap=t.trackMap,this.hooks=t.hooks;let o=this.props;this.props=t.props,this.patchProps(o);}getNodeTrack(t){let o=this.trackMap.get(t);return o||(o={cleanup:()=>{}},this.trackMap.set(t,o)),o.cleanup(),o}patchProps(t){var o;if(t){for(let[r,i]of Object.entries(t))startsWith(r,P)&&((o=this.rootNode)!=null&&o.firstChild)?this.patchEventListener(r,i):r===A?this.patchRef(i):startsWith(r,L)?this.patchUpdateHandler(r,i):r!==g&&this.patchNormalProp(r,i);this.props=t;}}patchEventListener(t,o){let r=t.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,o);this.emitter.add(i);}patchRef(t){var o,r;t.value=(r=(o=this.rootNode)==null?void 0:o.firstChild)!=null?r:null;}patchUpdateHandler(t,o){this.props[t]=$(o);}patchNormalProp(t,o){var s,a;let r=(a=(s=this.proxyProps)[t])!=null?a:s[t]=signal(o),i=this.getNodeTrack(t);i.cleanup=effect(()=>{r.value=isFunction(o)?o():o;});}};function se(n,e,t,o){let r=new Map,i=Array.from(e.values());if(i.length&&t.length===0)return Me(n,i,o),r;let s=[],a=Pe(t),c=0;for(let[d,p]of t.entries()){let l=i[c],b=v(l,d);for(;l&&!a.has(b);)S(l),e.delete(b),l=i[++c],b=v(l,d);let B=v(p,d),G=e.get(B);if(G&&(p=ke(n,G,p)),l)if(l===G)c++;else {let q=document.createComment("");T(n,q,l),s.push([q,p]);}else T(n,p,o);r.set(B,p);}return s.forEach(([d,p])=>{V(n,p,d);}),e.forEach((d,p)=>{d.isConnected&&!r.has(p)&&S(d);}),r}function Me(n,e,t){if(n.childNodes.length===e.length+(t?1:0))n.innerHTML="",t&&T(n,t);else {let o=document.createRange(),r=e[0],i=f(r)?r.firstChild:r;o.setStartBefore(i),t?o.setEndBefore(t):o.setEndAfter(n),o.deleteContents();}e.forEach(o=>{f(o)&&o.unmount();});}function ke(n,e,t){return e===t?e:f(e)&&f(t)&&e.template===t.template?(t.inheritNode(e),t):e instanceof Text&&t instanceof Text?(e.textContent!==t.textContent&&(e.textContent=t.textContent),e):(V(n,t,e),t)}function Pe(n){let e=new Map;for(let[t,o]of n.entries()){let r=v(o,t);e.set(r,o);}return e}function v(n,e){if(f(n)){let t=n.key;if(t!=null)return String(t)}return `_$${e}$`}var x=class{constructor(e,t,o){this.template=e;this.props=t;this.key=o;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;m.isSSR&&(this.componentIndex=ee(this.template));}get firstChild(){var e;return (e=this.nodes[0])!=null?e:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(e,t){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(s=>T(e,s,t)),this.nodes;isArray(this.template)&&(this.template=w(this.template.join("")));let o=this.template.content.cloneNode(!0),r=o.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r.childNodes.forEach(s=>{o.append(s);})),this.nodes=Array.from(o.childNodes),m.isSSR?this.mapSSGNodeTree(e):this.mapNodeTree(e,o),T(e,o,t),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){this.trackMap.forEach(e=>{e.cleanup&&e.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>S(e)),this.nodes=[],this.mounted=!1;}inheritNode(e){this.mounted=e.mounted,this.nodes=e.nodes,this.trackMap=e.trackMap,this.treeMap=e.treeMap;let t=this.props;this.props=e.props,this.patchProps(t);}mapSSGNodeTree(e){this.treeMap.set(0,e),this.walkNodeTree(e,this.handleSSGNode.bind(this));}mapNodeTree(e,t){let o=1;this.treeMap.set(0,e);let r=[e],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(o++,s),r.push(s));};this.walkNodeTree(t,i);}walkNodeTree(e,t){e.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&t(e);let o=e.firstChild;for(;o;)this.walkNodeTree(o,t),o=o.nextSibling;}handleSSGNode(e){var t;if(e.nodeType===Node.COMMENT_NODE){let[o,r]=((t=e.textContent)==null?void 0:t.split("-"))||[];if(0===+o&&+r===this.componentIndex){let i=e.nextSibling;this.treeMap.set(+r,i);}}else if(e.nodeType!==Node.TEXT_NODE){let{ci:o="-1",hk:r}=(e==null?void 0:e.dataset)||{};r&&+o===this.componentIndex&&this.treeMap.set(+r,e);}}patchProps(e){e&&(Object.entries(e).forEach(([t,o])=>{let r=Number(t),i=this.treeMap.get(r);i&&this.patchProp(t,i,o,r===0);}),this.props=e);}patchProp(e,t,o,r){o&&Object.entries(o).forEach(([i,s])=>{if(i===g&&s)this.patchChildren(e,t,s,r);else if(i===A)o[i].value=t;else if(startsWith(i,P))this.patchEventListener(e,t,i,s);else {if(this.bindValueKeys.includes(i))return;let a=this.getBindUpdateValue(o,e,i);this.patchAttribute(e,t,i,s,a);}});}getBindUpdateValue(e,t,o){let r=`${L}${capitalize(o)}`;if(r&&e[r]&&isFunction(e[r]))return this.bindValueKeys.push(r),e[r]}patchChildren(e,t,o,r){if(isArray(o))o.filter(Boolean).forEach((i,s)=>{var b;let[a,c]=isArray(i)?i:[i,null],d=isNil(c)?null:(b=this.treeMap.get(c))!=null?b:null,p=`${e}:${g}:${s}`,l=this.getNodeTrack(p,!0,r);this.patchChild(l,t,a,d);});else {let i=`${e}:${g}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,t,o,null);}}patchEventListener(e,t,o,r){let i=o.slice(2).toLowerCase(),s=this.getNodeTrack(`${e}:${o}`);s.cleanup=h(t,i,r);}patchAttribute(e,t,o,r,i){let s=this.getNodeTrack(`${e}:${o}`),a=isFunction(r)?r():r,c=isSignal(a)?a:shallowSignal(a);Y(t,o,c.value);let d=effect(()=>{let l=isFunction(r)?r():r;isPlainObject(l)&&isPlainObject(c.peek())&&JSON.stringify(c.value)===JSON.stringify(l)||(c.value=isSignal(l)?l.value:l,Y(t,o,c.value));}),p;i&&isHTMLElement(t)&&(p=ne(t,l=>{i(l);})),s.cleanup=()=>{d&&d(),p&&p();};}getNodeTrack(e,t,o){let r=this.trackMap.get(e);return r||(r={cleanup:()=>{}},t&&(r.lastNodes=new Map),o&&(r.isRoot=!0),this.trackMap.set(e,r)),r.cleanup&&r.cleanup(),r}patchChild(e,t,o,r){isFunction(o)?e.cleanup=effect(()=>{let i=coerceArray(o()).map(J);m.isSSR?e.lastNodes=this.reconcileChildren(t,i,r):e.lastNodes=se(t,e.lastNodes,i,r);}):coerceArray(o).forEach((i,s)=>{let a=J(i),c=v(a,s);m.isSSR?e.lastNodes=this.reconcileChildren(t,[a],r):(e.lastNodes.set(c,a),T(t,a,r));});}reconcileChildren(e,t,o){let r=new Map,i=Array.from(e.childNodes).filter(s=>{var a,c;return s.nodeType===Node.TEXT_NODE&&((a=s.previousSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&((c=s.nextSibling)==null?void 0:c.nodeType)===Node.COMMENT_NODE});return t.forEach((s,a)=>{let c=v(s,a);s.nodeType===Node.TEXT_NODE?i.forEach(d=>{s.textContent===d.textContent&&e.replaceChild(s,d);}):T(e,s,o),r.set(c,s);}),r}};var K=class extends x{unmount(){this.trackMap.forEach(e=>{e.lastNodes&&e.lastNodes.forEach(t=>{S(t);}),e.cleanup&&e.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>{S(e);}),this.nodes=[],this.mounted=!1;}};function X(n,e,t){if(n===H)return pe(n,e);if(isString(n)){let o=re(n);return e={[W]:e},new x(w(o),e,t)}return isFunction(n)?new k(n,e,t):new x(n,e,t)}function Ie(n){return n instanceof k}function f(n){return n instanceof k||n instanceof x}function w(n){let e=document.createElement("template");return e.innerHTML=n,e}function pe(n,e){return e.children&&(e={[z]:{children:isArray(e.children)?e.children.filter(Boolean):[e.children]}}),n===H&&(n=w(H)),new K(n,e)}function Ke(n){u.ref&&u.ref.addHook("mounted",n);}function Xe(n){u.ref&&u.ref.addHook("destroy",n);}function De(n,e){u.ref&&u.ref.setContext(n,e);}function Ge(n,e){var t;return (t=u.ref&&u.ref.getContext(n))!=null?t:e}function Fe(){return shallowSignal(null)}function Je(n,e){m.setSSG();let o=new M(n,e||{}).mount();return m.setClient(),o}function Ve(n,e){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Could not find container: ${e}`);m.setSSR(),X(n).mount(t),m.setClient();}function Ye(n,e){return m.isSSG?new M(n,e):X(n,e)}export{pe as Fragment,X as h,Ve as hydrate,Ie as isComponent,f as isJsxElement,Xe as onDestroy,Ke as onMount,Je as renderToString,Ye as ssg,w as template,Ge as useInject,De as useProvide,Fe as useRef};//# sourceMappingURL=template.esm.js.map
|
|
6
|
+
var P="on",L="update",g="children",H="",z="0",W="1";var A="ref",O=" __PLACEHOLDER__ ";var F=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 F,Q=new Map;function Z(n,e){Q.set(n,{index:e});}function ee(n){var e;return (e=Q.get(n))==null?void 0:e.index}var y=class y{constructor(){this.hooks={mounted:new Set,destroy:new Set};}addEventListener(){}removeEventListener(){}addHook(e,t){var o;(o=this.hooks[e])==null||o.add(t);}getContext(e){return y.context[e]}setContext(e,t){y.context[e]=t;}initRef(){y.ref=this;}removeRef(){y.ref=null;}clearHooks(){Object.values(this.hooks).forEach(e=>e.clear());}};y.ref=null,y.context={};var u=y;function _(n){return n instanceof M}var C=1,M=class extends u{constructor(t,o={},r){super();this.template=t;this.props=o;this.key=r;Z(t,C),this.templates=this.processTemplate();}processTemplate(){if(isArray(this.template)){let t=this.template.join(O);return this.processHtmlString(t).split(O)}return []}processHtmlString(t){return t.replaceAll(/(<[^>]+>)|([^<]+)/g,(o,r,i)=>r?r.includes("data-ci")?o:r.replace(/<\s*([\da-z]+)(\s[^>]*)?>/i,(s,c,a)=>`<${c} data-ci="${C}"${a||""}>`):i&&i.replace(O,"").trim()?`<!--0-${C}-->${i}<!$>`:o)}mount(){this.initRef();let t=this.render();return this.removeRef(),t}render(){if(isFunction(this.template)){let t=this.template(this.props);return _(t)?t.mount():String(t)}return this.renderTemplate()}renderTemplate(){return Object.entries(this.props).forEach(([t,o])=>{let r=o.children;this.normalizeProps(o);let i=this.templates.findIndex(s=>s.includes(`data-hk="${t}"`));r&&this.renderChildren(r,i),this.templates[i]=this.templates[i].replace(`data-hk="${t}"`,`data-hk="${t}" ${this.generateAttributes(o)}`);}),this.templates.join("")}normalizeProps(t){Object.entries(t).forEach(([o,r])=>{o===g||isFunction(r)?delete t[o]:isSignal(r)&&(t[o]=r.value);});}generateAttributes(t){return Object.entries(t).filter(([o,r])=>o!==g&&!isFunction(r)).map(([o,r])=>`${o}="${escape(String(r))}"`).join(" ")}renderChildren(t,o){t.forEach(([r])=>{C++;let i=this.renderChild(r);this.templates[o]+=i;});}renderChild(t){if(isSignal(t))return `<!--1-${C}-->${t.value}<!$>`;if(isFunction(t))return this.renderChild(t(this.props));if(_(t)){let o=t.mount();return isFunction(o)?o(this.props):$(o)}else return `<!--1-${C}-->${t}<!$>`}};var ge="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr".split(",");function J(n){if(f(n)||n instanceof Node||_(n))return n;let e=isFalsy(n)?"":String(n);return document.createTextNode(e)}function T(n,e,t=null){let o=f(t)?t.firstChild:t,r=m.isSSR;f(e)?e.mount(n,o):o&&!r?o.before(e):r||n.append(e);}function S(n){f(n)?n.unmount():n.parentNode&&n.remove();}function V(n,e,t){T(n,e,t),S(t);}function Y(n,e,t){e==="class"?Te(n,t):e==="style"?Se(n,t):ye(n,e,t);}function Te(n,e){typeof e=="string"?n.className=e:isArray(e)?n.className=e.join(" "):e&&typeof e=="object"&&(n.className=Object.entries(e).reduce((t,[o,r])=>t+(r?` ${o}`:""),"").trim());}function Se(n,e){typeof e=="string"?n.style.cssText=e:e&&typeof e=="object"&&Object.entries(e).forEach(([o,r])=>{n.style.setProperty(kebabCase(o),String(r));});}function ye(n,e,t){isFalsy(t)?n.removeAttribute(e):t===!0?n.setAttribute(e,""):n instanceof HTMLInputElement&&e==="value"?n.value=String(t):n.setAttribute(e,String(t));}function ne(n,e){if(n instanceof HTMLInputElement)switch(n.type){case"checkbox":return h(n,"change",()=>{e(!!n.checked);});case"date":return h(n,"change",()=>{e(n.value?n.value:"");});case"file":return h(n,"change",()=>{n.files&&e(n.files);});case"number":return h(n,"input",()=>{let t=Number.parseFloat(n.value);e(Number.isNaN(t)?"":String(t));});case"radio":return h(n,"change",()=>{e(n.checked?n.value:"");});case"text":return h(n,"input",()=>{e(n.value);})}if(n instanceof HTMLSelectElement)return h(n,"change",()=>{e(n.value);});if(n instanceof HTMLTextAreaElement)return h(n,"input",()=>{e(n.value);})}function h(n,e,t){return n.addEventListener(e,t),()=>n.removeEventListener(e,t)}function re(n){return ge.includes(n)?`<${n}/>`:`<${n}></${n}>`}function $(n){return isSignal(n)?n.value:n}var k=class extends u{constructor(t,o,r){super();this.template=t;this.props=o;this.key=r;this.emitter=new Set;this.rootNode=null;this.trackMap=new Map;this.key||(this.key=o&&o.key),this.proxyProps=this.createProxyProps(o);}createProxyProps(t){return t?signalObject(t,o=>startsWith(o,P)||startsWith(o,L)||o===g):{}}get firstChild(){var t,o;return (o=(t=this.rootNode)==null?void 0:t.firstChild)!=null?o:null}get isConnected(){var t,o;return (o=(t=this.rootNode)==null?void 0:t.isConnected)!=null?o:!1}mount(t,o){var i,s,c,a;if(!isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(i=this.rootNode)==null?void 0:i.mount(t,o))!=null?s:[];this.initRef(),this.rootNode=this.template(reactive(this.proxyProps,[g]));let r=(a=(c=this.rootNode)==null?void 0:c.mount(t,o))!=null?a:[];return this.callMountHooks(),this.patchProps(this.props),this.removeRef(),r}unmount(){var t;this.callDestroyHooks(),this.clearHooks(),(t=this.rootNode)==null||t.unmount(),this.rootNode=null,this.proxyProps={},this.clearEmitter();}callMountHooks(){this.hooks.mounted.forEach(t=>t());}callDestroyHooks(){this.hooks.destroy.forEach(t=>t());}clearEmitter(){for(let t of this.emitter)t();this.emitter.clear();}inheritNode(t){Object.assign(this.proxyProps,t.proxyProps),this.rootNode=t.rootNode,this.trackMap=t.trackMap,this.hooks=t.hooks;let o=this.props;this.props=t.props,this.patchProps(o);}getNodeTrack(t){let o=this.trackMap.get(t);return o||(o={cleanup:()=>{}},this.trackMap.set(t,o)),o.cleanup(),o}patchProps(t){var o;if(t){for(let[r,i]of Object.entries(t))startsWith(r,P)&&((o=this.rootNode)!=null&&o.firstChild)?this.patchEventListener(r,i):r===A?this.patchRef(i):startsWith(r,L)?this.patchUpdateHandler(r,i):r!==g&&this.patchNormalProp(r,i);this.props=t;}}patchEventListener(t,o){let r=t.slice(2).toLowerCase(),i=h(this.rootNode.nodes[0],r,o);this.emitter.add(i);}patchRef(t){var o,r;t.value=(r=(o=this.rootNode)==null?void 0:o.firstChild)!=null?r:null;}patchUpdateHandler(t,o){this.props[t]=$(o);}patchNormalProp(t,o){var s,c;let r=(c=(s=this.proxyProps)[t])!=null?c:s[t]=signal(o),i=this.getNodeTrack(t);i.cleanup=effect(()=>{r.value=isFunction(o)?o():o;});}};function se(n,e,t,o){let r=new Map,i=Array.from(e.values());if(i.length&&t.length===0)return Me(n,i,o),r;let s=[],c=Pe(t),a=0;for(let[d,p]of t.entries()){let l=i[a],b=v(l,d);for(;l&&!c.has(b);)S(l),e.delete(b),l=i[++a],b=v(l,d);let B=v(p,d),G=e.get(B);if(G&&(p=ke(n,G,p)),l)if(l===G)a++;else {let q=document.createComment("");T(n,q,l),s.push([q,p]);}else T(n,p,o);r.set(B,p);}return s.forEach(([d,p])=>{V(n,p,d);}),e.forEach((d,p)=>{d.isConnected&&!r.has(p)&&S(d);}),r}function Me(n,e,t){if(n.childNodes.length===e.length+(t?1:0))n.innerHTML="",t&&T(n,t);else {let o=document.createRange(),r=e[0],i=f(r)?r.firstChild:r;o.setStartBefore(i),t?o.setEndBefore(t):o.setEndAfter(n),o.deleteContents();}e.forEach(o=>{f(o)&&o.unmount();});}function ke(n,e,t){return e===t?e:f(e)&&f(t)&&e.template===t.template?(t.inheritNode(e),t):e instanceof Text&&t instanceof Text?(e.textContent!==t.textContent&&(e.textContent=t.textContent),e):(V(n,t,e),t)}function Pe(n){let e=new Map;for(let[t,o]of n.entries()){let r=v(o,t);e.set(r,o);}return e}function v(n,e){if(f(n)){let t=n.key;if(t!=null)return String(t)}return `_$${e}$`}var x=class{constructor(e,t,o){this.template=e;this.props=t;this.key=o;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.trackMap=new Map;this.bindValueKeys=[];this.parent=null;m.isSSR&&(this.componentIndex=ee(this.template));}get firstChild(){var e;return (e=this.nodes[0])!=null?e:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(e,t){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(s=>T(e,s,t)),this.nodes;isArray(this.template)&&(this.template=w(this.template.join("")));let o=this.template.content.cloneNode(!0),r=o.firstChild;return (i=r==null?void 0:r.hasAttribute)!=null&&i.call(r,"_svg_")&&(r.remove(),r.childNodes.forEach(s=>{o.append(s);})),this.nodes=Array.from(o.childNodes),m.isSSR?this.mapSSGNodeTree(e):this.mapNodeTree(e,o),T(e,o,t),this.patchProps(this.props),this.mounted=!0,this.nodes}unmount(){this.trackMap.forEach(e=>{e.cleanup&&e.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>S(e)),this.nodes=[],this.mounted=!1;}inheritNode(e){this.mounted=e.mounted,this.nodes=e.nodes,this.trackMap=e.trackMap,this.treeMap=e.treeMap;let t=this.props;this.props=e.props,this.patchProps(t);}mapSSGNodeTree(e){this.treeMap.set(0,e),this.walkNodeTree(e,this.handleSSGNode.bind(this));}mapNodeTree(e,t){let o=1;this.treeMap.set(0,e);let r=[e],i=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.treeMap.set(o++,s),r.push(s));};this.walkNodeTree(t,i);}walkNodeTree(e,t){e.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&t(e);let o=e.firstChild;for(;o;)this.walkNodeTree(o,t),o=o.nextSibling;}handleSSGNode(e){var t;if(e.nodeType===Node.COMMENT_NODE){let[o,r]=((t=e.textContent)==null?void 0:t.split("-"))||[];if(0===+o&&+r===this.componentIndex){let i=e.nextSibling;this.treeMap.set(+r,i);}}else if(e.nodeType!==Node.TEXT_NODE){let{ci:o="-1",hk:r}=(e==null?void 0:e.dataset)||{};r&&+o===this.componentIndex&&this.treeMap.set(+r,e);}}patchProps(e){e&&(Object.entries(e).forEach(([t,o])=>{let r=Number(t),i=this.treeMap.get(r);i&&this.patchProp(t,i,o,r===0);}),this.props=e);}patchProp(e,t,o,r){o&&Object.entries(o).forEach(([i,s])=>{if(i===g&&s)this.patchChildren(e,t,s,r);else if(i===A)o[i].value=t;else if(startsWith(i,P))this.patchEventListener(e,t,i,s);else {if(this.bindValueKeys.includes(i))return;let c=this.getBindUpdateValue(o,e,i);this.patchAttribute(e,t,i,s,c);}});}getBindUpdateValue(e,t,o){let r=`${L}${capitalize(o)}`;if(r&&e[r]&&isFunction(e[r]))return this.bindValueKeys.push(r),e[r]}patchChildren(e,t,o,r){if(isArray(o))o.filter(Boolean).forEach((i,s)=>{var b;let[c,a]=isArray(i)?i:[i,null],d=isNil(a)?null:(b=this.treeMap.get(a))!=null?b:null,p=`${e}:${g}:${s}`,l=this.getNodeTrack(p,!0,r);this.patchChild(l,t,c,d);});else {let i=`${e}:${g}:0`,s=this.getNodeTrack(i,!0,r);this.patchChild(s,t,o,null);}}patchEventListener(e,t,o,r){let i=o.slice(2).toLowerCase(),s=this.getNodeTrack(`${e}:${o}`);s.cleanup=h(t,i,r);}patchAttribute(e,t,o,r,i){let s=this.getNodeTrack(`${e}:${o}`),c=isFunction(r)?r():r,a=isSignal(c)?c:shallowSignal(c);Y(t,o,a.value);let d=effect(()=>{let l=isFunction(r)?r():r;isPlainObject(l)&&isPlainObject(a.peek())&&JSON.stringify(a.value)===JSON.stringify(l)||(a.value=isSignal(l)?l.value:l,Y(t,o,a.value));}),p;i&&isHTMLElement(t)&&(p=ne(t,l=>{i(l);})),s.cleanup=()=>{d&&d(),p&&p();};}getNodeTrack(e,t,o){let r=this.trackMap.get(e);return r||(r={cleanup:()=>{}},t&&(r.lastNodes=new Map),o&&(r.isRoot=!0),this.trackMap.set(e,r)),r.cleanup&&r.cleanup(),r}patchChild(e,t,o,r){isFunction(o)?e.cleanup=effect(()=>{let i=coerceArray(o()).map(J);m.isSSR?e.lastNodes=this.reconcileChildren(t,i,r):e.lastNodes=se(t,e.lastNodes,i,r);}):coerceArray(o).forEach((i,s)=>{let c=J(i),a=v(c,s);m.isSSR?e.lastNodes=this.reconcileChildren(t,[c],r):(e.lastNodes.set(a,c),T(t,c,r));});}reconcileChildren(e,t,o){let r=new Map,i=Array.from(e.childNodes).filter(s=>{var c,a;return s.nodeType===Node.TEXT_NODE&&((c=s.previousSibling)==null?void 0:c.nodeType)===Node.COMMENT_NODE&&((a=s.nextSibling)==null?void 0:a.nodeType)===Node.COMMENT_NODE});return t.forEach((s,c)=>{let a=v(s,c);s.nodeType===Node.TEXT_NODE?i.forEach(d=>{s.textContent===d.textContent&&e.replaceChild(s,d);}):T(e,s,o),r.set(a,s);}),r}};var K=class extends x{unmount(){this.trackMap.forEach(e=>{e.lastNodes&&e.lastNodes.forEach(t=>{S(t);}),e.cleanup&&e.cleanup();}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>{S(e);}),this.nodes=[],this.mounted=!1;}};function X(n,e,t){if(n===H)return pe(n,e);if(isString(n)){let o=re(n);return e={[W]:e},new x(w(o),e,t)}return isFunction(n)?new k(n,e,t):new x(n,e,t)}function Ie(n){return n instanceof k}function f(n){return n instanceof k||n instanceof x}function w(n){let e=document.createElement("template");return e.innerHTML=n,e}function pe(n,e){return e.children&&(e={[z]:{children:isArray(e.children)?e.children.filter(Boolean):[e.children]}}),n===H&&(n=w(H)),new K(n,e)}function je(n){u.ref&&u.ref.addHook("mounted",n);}function Ke(n){u.ref&&u.ref.addHook("destroy",n);}function Xe(n,e){u.ref&&u.ref.setContext(n,e);}function De(n,e){var t;return (t=u.ref&&u.ref.getContext(n))!=null?t:e}function Ge(n,e){m.setSSG();let o=new M(n,e||{}).mount();return m.setClient(),o}function Fe(n,e){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Could not find container: ${e}`);m.setSSR(),X(n).mount(t),m.setClient();}function Je(n,e){return m.isSSG?new M(n,e):X(n,e)}export{pe as Fragment,X as h,Fe as hydrate,De as inject,Ie as isComponent,f as isJsxElement,Ke as onDestroy,je as onMount,Xe as provide,Ge as renderToString,Je as ssg,w as template};//# sourceMappingURL=template.esm.js.map
|
|
7
7
|
//# sourceMappingURL=template.esm.js.map
|
package/dist/template.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sharedConfig.ts","../src/lifecycleContext.ts","../src/ssgNode.ts","../src/utils.ts","../src/componentNode.ts","../src/templateNode.ts","../src/patch.ts","../src/fragmentNode.ts","../src/jsxRenderer.ts","../src/hooks.ts","../src/server.ts"],"names":["EVENT_PREFIX","UPDATE_PREFIX","CHILDREN_PROP","EMPTY_TEMPLATE","FRAGMENT_PROP_KEY","SINGLE_PROP_KEY","REF_KEY","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","HTML_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","convertToHtmlTag","signal","ComponentNode","signalObject","startsWith","_b","_c","_d","reactive","mountedNode","cleanup","trackKey","track","prop","event","newValue","effect","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","val","triggerValue","shallowSignal","val2","isPlainObject","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","FragmentNode","h","Fragment","isString","htmlTemplate","isComponent","html","onMount","onDestroy","useProvide","useInject","defaultValue","useRef","renderToString","component","hydrate","container","rootElement","ssg"],"mappings":"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","file":"template.esm.js","sourcesContent":["/**\n * Framework render type\n *\n * CLIENT: client side\n * SSR: server side render\n * SSG: server side generate\n */\nexport enum RENDER_MODE {\n CLIENT,\n SSG,\n SSR,\n}\n\nexport const EVENT_PREFIX = 'on';\nexport const UPDATE_PREFIX = 'update';\nexport const CHILDREN_PROP = 'children';\n\nexport const EMPTY_TEMPLATE = '';\nexport const FRAGMENT_PROP_KEY = '0';\nexport const SINGLE_PROP_KEY = '1';\nexport const STYLE_KEY = 'style';\nexport const REF_KEY = 'ref';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { CHILDREN_PROP, ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === CHILDREN_PROP) {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== CHILDREN_PROP && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, effect, signal, signalObject } from '@estjs/signal';\nimport { reactive } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, REF_KEY, 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 protected proxyProps: Record<string, Signal<unknown>>;\n protected emitter = new Set<() => void>();\n protected rootNode: TemplateNode | null = null;\n protected trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n\n this.key ||= props && (props.key as string);\n this.proxyProps = this.createProxyProps(props);\n }\n\n protected createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return signalObject(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(reactive(this.proxyProps, [CHILDREN_PROP]));\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 protected callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n protected callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n protected clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n protected getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === REF_KEY) {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n protected patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n protected patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n protected patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n protected patchNormalProp(key: string, prop: any): void {\n const newValue = (this.proxyProps[key] ??= signal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = effect(() => {\n newValue.value = isFunction(prop) ? prop() : prop;\n });\n }\n}\n","import {\n capitalize,\n coerceArray,\n isArray,\n isFunction,\n isHTMLElement,\n isNil,\n isPlainObject,\n startsWith,\n} from '@estjs/shared';\nimport { effect, isSignal, shallowSignal } from '@estjs/signal';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n EVENT_PREFIX,\n REF_KEY,\n UPDATE_PREFIX,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n protected treeMap = new Map<number, Node>();\n protected mounted = false;\n protected nodes: Node[] = [];\n protected trackMap = new Map<string, NodeTrack>();\n protected bindValueKeys: string[] = [];\n protected componentIndex: number;\n protected parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n\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 && track.cleanup();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n this.nodes = [];\n this.mounted = false;\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n protected mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // protected method to map node tree\n protected mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n protected walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n protected handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n protected patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n protected patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === REF_KEY) {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, EVENT_PREFIX)) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n protected getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n protected patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n protected patchEventListener(\n key: string,\n node: Node,\n attr: string,\n listener: EventListener,\n ): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n protected patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n\n const cleanup = effect(() => {\n // trigger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (\n isPlainObject(val2) &&\n isPlainObject(triggerValue.peek()) &&\n JSON.stringify(triggerValue.value) === JSON.stringify(val2)\n )\n return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n protected getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup && track.cleanup();\n return track;\n }\n\n protected patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = effect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n protected reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { 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 { removeChild } from './utils';\nimport { TemplateNode } from './templateNode';\n\nexport class FragmentNode extends TemplateNode {\n unmount(): void {\n this.trackMap.forEach(track => {\n // clear track node\n if (track.lastNodes) {\n track.lastNodes.forEach(node => {\n removeChild(node);\n });\n }\n track.cleanup && track.cleanup();\n });\n\n this.trackMap.clear();\n this.treeMap.clear();\n\n this.nodes.forEach(node => {\n removeChild(node);\n });\n\n this.nodes = [];\n this.mounted = false;\n }\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { convertToHtmlTag } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport { FragmentNode } from './fragmentNode';\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 // handle fragment\n if (template === EMPTY_TEMPLATE) {\n return Fragment(template, props!);\n }\n // Handle string templates\n if (isString(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n }\n\n // Handle functional templates (Components)\n if (isFunction(template)) {\n return new ComponentNode(template, props, key);\n }\n\n // Handle HTMLTemplateElement\n return 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 /**\n * the code that sets the unclosed tag, the browser's innerHTML method is, will automatically close the tag.\n * like `<div><button type=button>`\n * it will be translated:\n * `<div><button type=button></button></div>`\n */\n template.innerHTML = html;\n return template;\n}\n\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(\n template: HTMLTemplateElement | '',\n props:\n | { children: T }\n | {\n [key in string]: {\n children: T;\n };\n },\n) {\n if (props.children) {\n props = {\n [FRAGMENT_PROP_KEY]: {\n children: (isArray(props.children)\n ? props.children.filter(Boolean)\n : [props.children]) as T,\n },\n };\n }\n if (template === EMPTY_TEMPLATE) {\n template = createTemplate(EMPTY_TEMPLATE);\n }\n return new FragmentNode(template, props);\n}\n","import { isSymbol } from '@estjs/shared';\nimport { type Signal, shallowSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('useProvide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function useInject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('useInject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n\n/**\n * Creates a reactive ref that can be used to reference a DOM node\n * or a component instance within the component function body.\n *\n * @returns a reactive ref signal\n *\n * @example\n * const inputRef = useRef<HTMLInputElement>()\n *\n * <input ref={inputRef} />\n *\n * inputRef.value // input element\n */\nexport function useRef<T>(): Signal<T | null> {\n return shallowSignal<T | null>(null);\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sharedConfig.ts","../src/lifecycleContext.ts","../src/ssgNode.ts","../src/utils.ts","../src/componentNode.ts","../src/patch.ts","../src/templateNode.ts","../src/fragmentNode.ts","../src/jsxRenderer.ts","../src/hooks.ts","../src/server.ts"],"names":["EVENT_PREFIX","UPDATE_PREFIX","CHILDREN_PROP","EMPTY_TEMPLATE","FRAGMENT_PROP_KEY","SINGLE_PROP_KEY","REF_KEY","PLACEHOLDER","RenderContext","renderContext","componentMap","enterComponent","temp","index","getComponentIndex","_a","_LifecycleContext","hook","cb","context","value","set","LifecycleContext","isSSGNode","node","SSGNode","componentIndex","template","props","key","isArray","htmlString","match","p1","p2","_","tagName","attrs","output","isFunction","root","cur","children","findIndex","t","isSignal","escape","child","renderedChild","childResult","extractSignal","SELF_CLOSING_TAGS","coerceNode","data","isJsxElement","text","isFalsy","insertChild","parent","before","beforeNode","ssr","removeChild","replaceChild","setAttribute","element","attr","setClassAttribute","setStyleAttribute","setGenericAttribute","acc","kebabCase","bindNode","setter","addEventListener","eventName","handler","convertToHtmlTag","signal","ComponentNode","signalObject","startsWith","_b","_c","_d","reactive","mountedNode","cleanup","trackKey","track","prop","event","newValue","effect","patchChildren","childrenMap","nextChildren","result","clearChildren","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","range","start","next","jsxKey","TemplateNode","createTemplate","cloneNode","firstChild","tree","arr","handleNode","type","textNode","ci","hk","isRoot","updateFn","updateKey","capitalize","item","path","isNil","listener","val","triggerValue","shallowSignal","val2","isPlainObject","cleanupBind","isHTMLElement","trackLastNodes","nextNodes","coerceArray","newNode","textNodes","ne","FragmentNode","h","Fragment","isString","htmlTemplate","isComponent","html","onMount","onDestroy","provide","inject","defaultValue","renderToString","component","hydrate","container","rootElement","ssg"],"mappings":"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","file":"template.esm.js","sourcesContent":["/**\n * Framework render type\n *\n * CLIENT: client side\n * SSR: server side render\n * SSG: server side generate\n */\nexport enum RENDER_MODE {\n CLIENT,\n SSG,\n SSR,\n}\n\nexport const EVENT_PREFIX = 'on';\nexport const UPDATE_PREFIX = 'update';\nexport const CHILDREN_PROP = 'children';\n\nexport const EMPTY_TEMPLATE = '';\nexport const FRAGMENT_PROP_KEY = '0';\nexport const SINGLE_PROP_KEY = '1';\nexport const STYLE_KEY = 'style';\nexport const REF_KEY = 'ref';\n\nexport const PLACEHOLDER = ' __PLACEHOLDER__ ';\n\nexport enum ComponentType {\n TEXT,\n TEXT_COMPONENT,\n COMPONENT,\n}\n\nclass RenderContext {\n renderMode = RENDER_MODE.CLIENT;\n\n get isSSG() {\n return this.renderMode === RENDER_MODE.SSG;\n }\n\n get isSSR() {\n return this.renderMode === RENDER_MODE.SSR;\n }\n\n get isClient() {\n return this.renderMode === RENDER_MODE.CLIENT;\n }\n\n setSSR() {\n this.renderMode = RENDER_MODE.SSR;\n }\n\n setSSG() {\n this.renderMode = RENDER_MODE.SSG;\n }\n\n setClient() {\n this.renderMode = RENDER_MODE.CLIENT;\n }\n}\n\nexport const renderContext = new RenderContext();\n\nconst componentMap = new Map();\n\nexport function enterComponent(temp, index) {\n componentMap.set(temp, {\n index,\n });\n}\n\nexport function getComponentIndex(temp) {\n return componentMap.get(temp)?.index;\n}\n","import type { Signal } from '@estjs/signal';\nimport type { Hook } from '../types';\n\nexport class LifecycleContext {\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: LifecycleContext | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n // Hooks for different lifecycle stages\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n\n // Add a hook for a specific lifecycle stage\n addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n // Get a value from the static context\n getContext<T>(context: symbol | string | number): T | undefined {\n return LifecycleContext.context[context];\n }\n\n // Set a value in the static context\n setContext<T>(context: symbol | string | number, value: T): void {\n LifecycleContext.context[context] = value;\n }\n\n initRef() {\n LifecycleContext.ref = this;\n }\n\n removeRef() {\n LifecycleContext.ref = null;\n }\n\n // Clear all hooks\n clearHooks(): void {\n Object.values(this.hooks).forEach(set => set.clear());\n }\n}\n","import { escape, isArray, isFunction } from '@estjs/shared';\nimport { isSignal } from '@estjs/signal';\nimport { LifecycleContext } from './lifecycleContext';\nimport { extractSignal } from './utils';\nimport { CHILDREN_PROP, ComponentType, PLACEHOLDER, enterComponent } from './sharedConfig';\nimport type { Signal } from '@estjs/signal';\nimport type { EssorNode, Props } from '../types';\n\nexport function isSSGNode(node: unknown): node is SSGNode {\n return node instanceof SSGNode;\n}\n\nlet componentIndex = 1;\n\nexport class SSGNode extends LifecycleContext {\n private templates: string[];\n\n constructor(\n private template: string[] | SSGNode | ((props: Props) => SSGNode),\n private props: Props = {},\n public key?: string,\n ) {\n super();\n enterComponent(template, componentIndex);\n this.templates = this.processTemplate();\n }\n\n private processTemplate(): string[] {\n if (isArray(this.template)) {\n const htmlString = this.template.join(PLACEHOLDER);\n const processedString = this.processHtmlString(htmlString);\n return processedString.split(PLACEHOLDER);\n }\n return [];\n }\n\n private processHtmlString(htmlString: string): string {\n return htmlString.replaceAll(/(<[^>]+>)|([^<]+)/g, (match, p1, p2) => {\n if (p1) {\n if (p1.includes('data-ci')) return match;\n return p1.replace(/<\\s*([\\da-z]+)(\\s[^>]*)?>/i, (_, tagName, attrs) => {\n return `<${tagName} data-ci=\"${componentIndex}\"${attrs || ''}>`;\n });\n } else if (p2 && p2.replace(PLACEHOLDER, '').trim()) {\n return `<!--${ComponentType.TEXT}-${componentIndex}-->${p2}<!$>`;\n }\n return match;\n });\n }\n\n mount(): string {\n this.initRef();\n const output = this.render();\n this.removeRef();\n return output;\n }\n\n render(): string {\n if (isFunction(this.template)) {\n const root = this.template(this.props);\n if (isSSGNode(root)) {\n return root.mount();\n } else {\n return String(root);\n }\n }\n return this.renderTemplate();\n }\n\n private renderTemplate(): string {\n Object.entries(this.props).forEach(([key, cur]) => {\n const children = cur.children;\n this.normalizeProps(cur);\n const findIndex = this.templates.findIndex(t => t.includes(`data-hk=\"${key}\"`));\n\n if (children) {\n this.renderChildren(children, findIndex);\n }\n this.templates[findIndex] = this.templates[findIndex].replace(\n `data-hk=\"${key}\"`,\n `data-hk=\"${key}\" ${this.generateAttributes(cur)}`,\n );\n });\n\n return this.templates.join('');\n }\n\n private normalizeProps(props: Props): void {\n Object.entries(props).forEach(([key, value]) => {\n if (key === CHILDREN_PROP) {\n delete props[key];\n } else if (isFunction(value)) {\n delete props[key];\n } else if (isSignal(value)) {\n props[key] = value.value;\n }\n });\n }\n\n private generateAttributes(props: Props): string {\n return Object.entries(props)\n .filter(([key, value]) => key !== CHILDREN_PROP && !isFunction(value))\n .map(([key, value]) => `${key}=\"${escape(String(value))}\"`)\n .join(' ');\n }\n\n private renderChildren(children: any[], findIndex: number): void {\n children.forEach(([child]) => {\n componentIndex++;\n const renderedChild = this.renderChild(child);\n this.templates[findIndex] += renderedChild;\n });\n }\n\n private renderChild(child: EssorNode | Function | Signal<unknown>): string {\n if (isSignal(child)) {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${(child as Signal<any>).value}<!$>`;\n } else if (isFunction(child)) {\n return this.renderChild(child(this.props));\n } else if (isSSGNode(child)) {\n const childResult = (child as SSGNode).mount();\n return isFunction(childResult) ? childResult(this.props) : extractSignal(childResult);\n } else {\n return `<!--${ComponentType.TEXT_COMPONENT}-${componentIndex}-->${child}<!$>`;\n }\n }\n}\n","import { isArray, isFalsy, kebabCase } from '@estjs/shared';\nimport { type Signal, isSignal } from '@estjs/signal';\nimport { isJsxElement } from './jsxRenderer';\nimport { renderContext } from './sharedConfig';\nimport { isSSGNode } from './ssgNode';\n\n// 新增:常量定义\nconst SELF_CLOSING_TAGS =\n 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr'.split(',');\nconst HTML_TAGS =\n 'a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp'.split(\n ',',\n );\n\n/**\n * Converts any data to a Node or JSX.Element type.\n * @param data - The data to be coerced into a Node or JSX.Element.\n * @returns A Node or JSX.Element.\n */\nexport function coerceNode(data: unknown) {\n if (isJsxElement(data) || data instanceof Node || isSSGNode(data)) {\n return data;\n }\n const text = isFalsy(data) ? '' : String(data);\n return document.createTextNode(text);\n}\n\n/**\n * Inserts a child Node or JSX.Element into a parent Node at a specified position.\n * @param parent - The parent Node where the child will be inserted.\n * @param child - The child Node or JSX.Element to insert.\n * @param before - The Node or JSX.Element before which the new child will be inserted.\n */\nexport function insertChild(\n parent: Node,\n child: Node | JSX.Element,\n before: Node | JSX.Element | null = null,\n): void {\n const beforeNode = isJsxElement(before) ? before.firstChild : before;\n const ssr = renderContext.isSSR;\n if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n // hack ssr compile node\n } else if (beforeNode && !ssr) {\n (beforeNode as HTMLElement).before(child);\n // hack ssr compile node\n } else if (!ssr) {\n (parent as HTMLElement).append(child);\n }\n}\n\n/**\n * Removes a child Node or JSX.Element from its parent.\n * @param child - The child Node or JSX.Element to remove.\n */\nexport function removeChild(child: Node | JSX.Element): void {\n if (isJsxElement(child)) {\n child.unmount();\n } else {\n const parent = child.parentNode;\n if (parent) {\n (child as HTMLElement).remove();\n }\n }\n}\n\n/**\n * Replaces an existing child Node or JSX.Element with a new one in a parent Node.\n * @param parent - The parent Node where the replacement will occur.\n * @param node - The new Node or JSX.Element to insert.\n * @param child - The existing Node or JSX.Element to be replaced.\n */\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n insertChild(parent, node, child);\n removeChild(child);\n}\n\n/**\n * Sets an attribute on an HTMLElement, handling special cases for 'class' and 'style'.\n * @param element - The HTMLElement on which to set the attribute.\n * @param attr - The attribute name.\n * @param value - The attribute value.\n */\nexport function setAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (attr === 'class') {\n setClassAttribute(element, value);\n } else if (attr === 'style') {\n setStyleAttribute(element, value);\n } else {\n setGenericAttribute(element, attr, value);\n }\n}\n\nfunction setClassAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.className = value;\n } else if (isArray(value)) {\n element.className = value.join(' ');\n } else if (value && typeof value === 'object') {\n element.className = Object.entries(value)\n .reduce((acc, [key, value]) => acc + (value ? ` ${key}` : ''), '')\n .trim();\n }\n}\n\nfunction setStyleAttribute(element: HTMLElement, value: unknown): void {\n if (typeof value === 'string') {\n element.style.cssText = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n Object.entries(obj).forEach(([key, value]) => {\n element.style.setProperty(kebabCase(key), String(value));\n });\n }\n}\n\nfunction setGenericAttribute(element: HTMLElement, attr: string, value: unknown): void {\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement && attr === 'value') {\n element.value = String(value);\n } else {\n element.setAttribute(attr, String(value));\n }\n }\n}\n\n/**\n * Binds an event listener to an input element to update a state setter based on the input type.\n * @param node - The input HTML element to bind the event listener to.\n * @param setter - The function to call when the input value changes.\n */\nexport function bindNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): tagName is keyof HTMLElementTagNameMap {\n return HTML_TAGS.includes(tagName);\n}\n\n/**\n * Converts a string to a valid HTML tag name.\n * @param tagName - The input string to convert.\n * @returns The valid HTML tag name.\n */\nexport function convertToHtmlTag(tagName: string): string {\n return SELF_CLOSING_TAGS.includes(tagName) ? `<${tagName}/>` : `<${tagName}></${tagName}>`;\n}\n\n/**\n * Extracts the value from a signal if given, or returns the given value if not a signal.\n * @param signal - The signal or value to extract.\n * @returns The extracted value.\n */\nexport function extractSignal<T>(signal: T | Signal<T>): T {\n if (isSignal(signal)) {\n return signal.value;\n } else {\n return signal;\n }\n}\n","import { isFunction, startsWith } from '@estjs/shared';\nimport { type Signal, effect, signal, signalObject } from '@estjs/signal';\nimport { reactive } from '@estjs/signal';\nimport { addEventListener, extractSignal } from './utils';\nimport { LifecycleContext } from './lifecycleContext';\nimport { CHILDREN_PROP, EVENT_PREFIX, REF_KEY, 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 protected proxyProps: Record<string, Signal<unknown>>;\n protected emitter = new Set<() => void>();\n protected rootNode: TemplateNode | null = null;\n protected trackMap = new Map<string, NodeTrack>();\n\n constructor(\n public template: EssorComponent,\n public props?: Props,\n public key?: string,\n ) {\n super();\n\n this.key ||= props && (props.key as string);\n this.proxyProps = this.createProxyProps(props);\n }\n\n protected createProxyProps(props?: Props): Record<string, Signal<unknown>> {\n if (!props) return {};\n return signalObject(\n props,\n key =>\n startsWith(key, EVENT_PREFIX) || startsWith(key, UPDATE_PREFIX) || key === CHILDREN_PROP,\n );\n }\n\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n mount(parent: Node, before?: Node | null): Node[] {\n if (!isFunction(this.template)) {\n throw new Error('Template must be a function');\n }\n if (this.isConnected) {\n return this.rootNode?.mount(parent, before) ?? [];\n }\n\n this.initRef();\n this.rootNode = this.template(reactive(this.proxyProps, [CHILDREN_PROP]));\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 protected callMountHooks(): void {\n this.hooks.mounted.forEach(handler => handler());\n }\n\n protected callDestroyHooks(): void {\n this.hooks.destroy.forEach(handler => handler());\n }\n\n protected clearEmitter(): void {\n for (const cleanup of this.emitter) {\n cleanup();\n }\n this.emitter.clear();\n }\n\n inheritNode(node: ComponentNode): void {\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n this.hooks = node.hooks;\n\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\n }\n\n protected getNodeTrack(trackKey: string): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n track.cleanup();\n return track;\n }\n\n patchProps(props: Record<string, any> | undefined) {\n if (!props) {\n return;\n }\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, EVENT_PREFIX) && this.rootNode?.firstChild) {\n this.patchEventListener(key, prop);\n } else if (key === REF_KEY) {\n this.patchRef(prop);\n } else if (startsWith(key, UPDATE_PREFIX)) {\n this.patchUpdateHandler(key, prop);\n } else if (key !== CHILDREN_PROP) {\n this.patchNormalProp(key, prop);\n }\n }\n this.props = props;\n }\n\n protected patchEventListener(key: string, prop: any): void {\n const event = key.slice(2).toLowerCase();\n // @ts-ignore\n const cleanup = addEventListener(this.rootNode.nodes[0], event, prop);\n this.emitter.add(cleanup);\n }\n\n protected patchRef(prop: { value: Node | null }): void {\n prop.value = this.rootNode?.firstChild ?? null;\n }\n\n protected patchUpdateHandler(key: string, prop: any): void {\n this.props![key] = extractSignal(prop);\n }\n\n protected patchNormalProp(key: string, prop: any): void {\n const newValue = (this.proxyProps[key] ??= signal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = effect(() => {\n newValue.value = 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 isPlainObject,\n startsWith,\n} from '@estjs/shared';\nimport { effect, isSignal, shallowSignal } from '@estjs/signal';\nimport {\n addEventListener,\n bindNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { getKey, patchChildren } from './patch';\nimport {\n CHILDREN_PROP,\n ComponentType,\n EVENT_PREFIX,\n REF_KEY,\n UPDATE_PREFIX,\n getComponentIndex,\n renderContext,\n} from './sharedConfig';\nimport { createTemplate } from './jsxRenderer';\nimport type { NodeTrack, Props } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n protected treeMap = new Map<number, Node>();\n protected mounted = false;\n protected nodes: Node[] = [];\n protected trackMap = new Map<string, NodeTrack>();\n protected bindValueKeys: string[] = [];\n protected componentIndex: number;\n protected parent: Node | null = null;\n\n constructor(\n public template: HTMLTemplateElement,\n public props?: Props,\n public key?: string,\n ) {\n if (renderContext.isSSR) {\n this.componentIndex = getComponentIndex(this.template);\n }\n }\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n\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 && track.cleanup();\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n\n this.nodes = [];\n this.mounted = false;\n }\n\n inheritNode(node: TemplateNode): void {\n this.mounted = node.mounted;\n this.nodes = node.nodes;\n this.trackMap = node.trackMap;\n this.treeMap = node.treeMap;\n const props = this.props;\n this.props = node.props;\n this.patchProps(props);\n }\n\n protected mapSSGNodeTree(parent: Node): void {\n this.treeMap.set(0, parent);\n this.walkNodeTree(parent, this.handleSSGNode.bind(this));\n }\n\n // protected method to map node tree\n protected mapNodeTree(parent: Node, tree: Node): void {\n let index = 1;\n this.treeMap.set(0, parent);\n const arr = [parent];\n\n const handleNode = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n arr.push(node);\n }\n };\n\n this.walkNodeTree(tree, handleNode);\n }\n\n protected walkNodeTree(node: Node, handler: (node: Node) => void): void {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n handler(node);\n }\n let child = node.firstChild;\n while (child) {\n this.walkNodeTree(child, handler);\n child = child.nextSibling;\n }\n }\n\n protected handleSSGNode(node: Node): void {\n if (node.nodeType === Node.COMMENT_NODE) {\n const [type, index] = node.textContent?.split('-') || [];\n if (ComponentType.TEXT === +type && +index === this.componentIndex) {\n const textNode = node.nextSibling as Text;\n this.treeMap.set(+index, textNode);\n }\n } else if (node.nodeType !== Node.TEXT_NODE) {\n const { ci = '-1', hk } = (node as HTMLElement)?.dataset || {};\n if (hk && +ci === this.componentIndex) {\n this.treeMap.set(+hk, node);\n }\n }\n }\n\n protected patchProps(props: Record<string, Record<string, unknown>> | undefined): void {\n if (!props) return;\n\n Object.entries(props).forEach(([key, value]) => {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n this.patchProp(key, node, value, index === 0);\n }\n });\n this.props = props;\n }\n\n protected patchProp(\n key: string,\n node: Node,\n props: Record<string, unknown>,\n isRoot: boolean,\n ): void {\n if (!props) return;\n Object.entries(props).forEach(([attr, value]) => {\n if (attr === CHILDREN_PROP && value) {\n this.patchChildren(key, node, value, isRoot);\n } else if (attr === REF_KEY) {\n (props[attr] as { value: Node }).value = node;\n } else if (startsWith(attr, EVENT_PREFIX)) {\n this.patchEventListener(key, node, attr, value as EventListener);\n } else {\n if (this.bindValueKeys.includes(attr)) return;\n const updateFn = this.getBindUpdateValue(props, key, attr);\n this.patchAttribute(key, node as HTMLElement, attr, value, updateFn);\n }\n });\n }\n\n protected getBindUpdateValue(props: Record<string, any>, key: string, attr: string) {\n const updateKey = `${UPDATE_PREFIX}${capitalize(attr)}`;\n if (updateKey && props[updateKey] && isFunction(props[updateKey])) {\n this.bindValueKeys.push(updateKey);\n return props[updateKey];\n }\n }\n\n protected patchChildren(key: string, node: Node, children: unknown, isRoot: boolean): void {\n if (!isArray(children)) {\n const trackKey = `${key}:${CHILDREN_PROP}:0`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, children, null);\n } else {\n children.filter(Boolean).forEach((item, index) => {\n const [child, path] = isArray(item) ? item : [item, null];\n const before = isNil(path) ? null : (this.treeMap.get(path) ?? null);\n const trackKey = `${key}:${CHILDREN_PROP}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n this.patchChild(track, node, child, before);\n });\n }\n }\n\n protected patchEventListener(\n key: string,\n node: Node,\n attr: string,\n listener: EventListener,\n ): void {\n const eventName = attr.slice(2).toLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n track.cleanup = addEventListener(node, eventName, listener);\n }\n\n protected patchAttribute(\n key: string,\n element: HTMLElement,\n attr: string,\n value: unknown,\n updateFn?: Function,\n ): void {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n // Set the initial value\n const val = isFunction(value) ? value() : value;\n const triggerValue = isSignal(val) ? val : shallowSignal(val);\n setAttribute(element, attr, triggerValue.value);\n\n const cleanup = effect(() => {\n // trigger conditional expression\n const val2 = isFunction(value) ? value() : value;\n // TODO: class and style should be pure object\n if (\n isPlainObject(val2) &&\n isPlainObject(triggerValue.peek()) &&\n JSON.stringify(triggerValue.value) === JSON.stringify(val2)\n )\n return;\n\n triggerValue.value = isSignal(val2) ? val2.value : val2;\n setAttribute(element, attr, triggerValue.value);\n });\n\n let cleanupBind;\n if (updateFn && isHTMLElement(element)) {\n cleanupBind = bindNode(element, value => {\n updateFn(value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n\n protected getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup && track.cleanup();\n return track;\n }\n\n protected patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = effect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode) as Node[];\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, nextNodes, before);\n } else {\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n }\n });\n } else {\n coerceArray(child).forEach((node, index) => {\n const newNode = coerceNode(node) as Node;\n const key = getKey(newNode, index);\n\n if (renderContext.isSSR) {\n track.lastNodes = this.reconcileChildren(parent, [newNode], before);\n } else {\n track.lastNodes!.set(key, newNode);\n insertChild(parent, newNode, before);\n }\n });\n }\n }\n\n protected reconcileChildren(\n parent: Node,\n nextNodes: Node[],\n before: Node | null,\n ): Map<string, Node> {\n const result = new Map<string, Node>();\n\n const textNodes = Array.from(parent.childNodes).filter(\n node =>\n node.nodeType === Node.TEXT_NODE &&\n node.previousSibling?.nodeType === Node.COMMENT_NODE &&\n node.nextSibling?.nodeType === Node.COMMENT_NODE,\n );\n\n nextNodes.forEach((node, index) => {\n const key = getKey(node, index);\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.forEach(ne => {\n if (node.textContent === ne.textContent) {\n parent.replaceChild(node, ne);\n }\n });\n } else {\n insertChild(parent, node, before);\n }\n result.set(key, node);\n });\n return result;\n }\n}\n","import { removeChild } from './utils';\nimport { TemplateNode } from './templateNode';\n\nexport class FragmentNode extends TemplateNode {\n unmount(): void {\n this.trackMap.forEach(track => {\n // clear track node\n if (track.lastNodes) {\n track.lastNodes.forEach(node => {\n removeChild(node);\n });\n }\n track.cleanup && track.cleanup();\n });\n\n this.trackMap.clear();\n this.treeMap.clear();\n\n this.nodes.forEach(node => {\n removeChild(node);\n });\n\n this.nodes = [];\n this.mounted = false;\n }\n}\n","import { isArray, isFunction, isString } from '@estjs/shared';\nimport { convertToHtmlTag } from './utils';\nimport { ComponentNode } from './componentNode';\nimport { TemplateNode } from './templateNode';\nimport { EMPTY_TEMPLATE, FRAGMENT_PROP_KEY, SINGLE_PROP_KEY } from './sharedConfig';\nimport { FragmentNode } from './fragmentNode';\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 // handle fragment\n if (template === EMPTY_TEMPLATE) {\n return Fragment(template, props!);\n }\n // Handle string templates\n if (isString(template)) {\n const htmlTemplate = convertToHtmlTag(template);\n props = { [SINGLE_PROP_KEY]: props };\n return new TemplateNode(createTemplate(htmlTemplate), props, key);\n }\n\n // Handle functional templates (Components)\n if (isFunction(template)) {\n return new ComponentNode(template, props, key);\n }\n\n // Handle HTMLTemplateElement\n return 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 /**\n * the code that sets the unclosed tag, the browser's innerHTML method is, will automatically close the tag.\n * like `<div><button type=button>`\n * it will be translated:\n * `<div><button type=button></button></div>`\n */\n template.innerHTML = html;\n return template;\n}\n\nexport function Fragment<\n T extends\n | JSX.JSXElement\n | string\n | number\n | boolean\n | (JSX.JSXElement | string | number | boolean)[],\n>(\n template: HTMLTemplateElement | '',\n props:\n | { children: T }\n | {\n [key in string]: {\n children: T;\n };\n },\n) {\n if (props.children) {\n props = {\n [FRAGMENT_PROP_KEY]: {\n children: (isArray(props.children)\n ? props.children.filter(Boolean)\n : [props.children]) as T,\n },\n };\n }\n if (template === EMPTY_TEMPLATE) {\n template = createTemplate(EMPTY_TEMPLATE);\n }\n return new FragmentNode(template, props);\n}\n","import { isSymbol } from '@estjs/shared';\nimport { LifecycleContext } from './lifecycleContext';\n\n/**\n * Registers a hook to be called when the component is mounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is mounted.\n */\nexport function onMount(cb: () => void): void {\n assertInsideComponent('onMounted');\n LifecycleContext.ref && LifecycleContext.ref.addHook('mounted', cb);\n}\n\n/**\n * Registers a hook to be called when the component is about to be unmounted.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param cb - The function to call when the component is about to be unmounted.\n */\nexport function onDestroy(cb: () => void): void {\n assertInsideComponent('onDestroy');\n LifecycleContext.ref && LifecycleContext.ref.addHook('destroy', cb);\n}\n\nfunction assertInsideComponent(hookName: string, key?: unknown) {\n if (!LifecycleContext.ref && __DEV__) {\n console.error(\n `\"${hookName}\"(key: ${isSymbol(key) ? key.toString() : key}) can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-wrapper-object-types, unused-imports/no-unused-vars\nexport interface InjectionKey<T> extends Symbol {}\n\n/**\n * Provides a value to be used in the component tree.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to store the value in the LifecycleContext with.\n * @param value - The value to store in the LifecycleContext with the given key.\n */\nexport function provide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n): void {\n assertInsideComponent('provide', key);\n LifecycleContext.ref && LifecycleContext.ref.setContext(key as string, value);\n}\n\n/**\n * Injects a value from the current component LifecycleContext.\n *\n * @remarks\n * This function can only be called in the component function body.\n * It cannot be used in asynchronous or deferred calls.\n * @param key - The key to retrieve the value from the LifecycleContext with.\n * @param defaultValue - The default value to return if the key is not present\n * in the LifecycleContext.\n * @returns The value stored in the LifecycleContext with the given key, or the default\n * value if the key is not present in the LifecycleContext.\n */\nexport function inject<T, K = InjectionKey<T> | string | number>(\n key: K,\n defaultValue?: K extends InjectionKey<infer V> ? V : T,\n): (K extends InjectionKey<infer V> ? V : T) | undefined {\n assertInsideComponent('inject', key);\n return (LifecycleContext.ref && LifecycleContext.ref.getContext(key as string)) ?? defaultValue;\n}\n","import { SSGNode } from './ssgNode';\nimport { renderContext } from './sharedConfig';\nimport { h } from './jsxRenderer';\nimport type { EssorComponent, Props } from '../types';\n\n/**\n * Render a component to a string.\n *\n * This function renders a component to an HTML string. It is used for server-side rendering (SSR) and static site generation (SSG).\n *\n * @param component The component to render.\n * @param props Optional props to pass to the component.\n * @returns The rendered HTML string.\n */\nexport function renderToString(component: EssorComponent, props?: Props): string {\n renderContext.setSSG();\n // Create a new SSGNode with the component and props\n const ssrNode = new SSGNode(component, props || {});\n // Mount the SSGNode to get the rendered HTML\n const html = ssrNode.mount();\n renderContext.setClient();\n return html;\n}\n\n/**\n * Hydrate a component in a container.\n *\n * This function hydrates a component in a container element. It is used for server-side rendering (SSR) and client-side rendering (CSR).\n *\n * @param component The component to hydrate.\n * @param container The container element to hydrate in. Can be a string selector or an Element.\n * @throws Error if the container is not found.\n */\nexport function hydrate(component: EssorComponent, container: string | Element): void {\n // Find the root element based on the container parameter\n const rootElement = typeof container === 'string' ? document.querySelector(container) : container;\n\n if (!rootElement) {\n throw new Error(`Could not find container: ${container}`);\n }\n renderContext.setSSR();\n // Create a new component using the h function and mount it to the root element\n h(component).mount(rootElement);\n renderContext.setClient();\n}\n\n/**\n * Create a server-side generation (SSG) node from a component.\n *\n * If the render context is set to SSG, this function will create a new SSGNode from the component. Otherwise, it will create a new JSX element using the h function.\n *\n * @param component The component to create the SSGNode from.\n * @param props Optional props to pass to the component.\n * @returns The SSGNode or JSX element.\n */\nexport function ssg(component: EssorComponent, props?: Props): SSGNode | JSX.Element {\n if (renderContext.isSSG) {\n return new SSGNode(component, props);\n }\n // If not in SSG mode, create and return a new JSX element\n return h(component, props);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@estjs/template",
|
|
3
|
-
"version": "0.0.14-beta.
|
|
3
|
+
"version": "0.0.14-beta.16",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [],
|
|
@@ -54,8 +54,8 @@
|
|
|
54
54
|
"jsdelivr": "dist/template.esm.js",
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"csstype": "^3.1.3",
|
|
57
|
-
"@estjs/signal": "0.0.14-beta.
|
|
58
|
-
"@estjs/shared": "0.0.14-beta.
|
|
57
|
+
"@estjs/signal": "0.0.14-beta.16",
|
|
58
|
+
"@estjs/shared": "0.0.14-beta.16"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
61
|
"build": "tsup && cross-env NODE_ENV=production tsup --clean=false --treeshake --sourcemap=false",
|