@estjs/template 0.0.10 → 0.0.11
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 +12 -12
- package/dist/template.cjs.js.map +1 -1
- package/dist/template.d.cts +4 -3
- package/dist/template.d.ts +4 -3
- package/dist/template.dev.cjs.js +38 -23
- package/dist/template.dev.esm.js +38 -23
- package/dist/template.esm.js +4 -4
- package/dist/template.esm.js.map +1 -1
- package/package.json +3 -3
package/dist/template.cjs.js
CHANGED
|
@@ -4,26 +4,26 @@ var shared = require('@estjs/shared');
|
|
|
4
4
|
var signal = require('@estjs/signal');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* @estjs/template v0.0.
|
|
7
|
+
* @estjs/template v0.0.11
|
|
8
8
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
9
9
|
* @license MIT
|
|
10
10
|
**/
|
|
11
|
-
var N=class N{constructor(e,n){this.template=e;this.props=n;this.proxyProps={};this.context={};this.emitter=new Set;this.mounted=!1;this.rootNode=null;this.hooks={mounted:new Set,destroy:new Set};this.trackMap=new Map;this.proxyProps=signal.signalObject(n,o=>shared.startsWith(o,"on")||shared.startsWith(o,"update"));}addEventListener(){}removeEventListener(){}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}addHook(e,n){var o;(o=this.hooks[e])==null||o.add(n);}getContext(e){return N.context[e]}setContext(e,n){N.context[e]=n;}inheritNode(e){this.context=e.context,this.hooks=e.hooks,Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap;let n=this.props;this.props=e.props,this.patchProps(n);}mount(e,n){var r,i,c,s;if(!shared.isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (i=(r=this.rootNode)==null?void 0:r.mount(e,n))!=null?i:[];N.ref=this,this.rootNode=this.template(signal.useReactive(this.proxyProps,["children"])),N.ref=null,this.mounted=!0;let o=(s=(c=this.rootNode)==null?void 0:c.mount(e,n))!=null?s:[];return this.hooks.mounted.forEach(a=>a()),this.patchProps(this.props),o}unmount(){var e;this.hooks.destroy.forEach(n=>n()),Object.values(this.hooks).forEach(n=>n.clear()),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.mounted=!1,this.emitter.forEach(n=>n());}getNodeTrack(e,n){let o=this.trackMap.get(e);return o||(o={cleanup:()=>{}},this.trackMap.set(e,o)),n||o.cleanup(),o}patchProps(e){var n,o,r,i,c;for(let[s,a]of Object.entries(e))if(shared.startsWith(s,"on")&&((n=this.rootNode)!=null&&n.nodes)){let d=s.slice(2).toLowerCase(),l=a,u=m(this.rootNode.nodes[0],d,l);this.emitter.add(u);}else if(s==="ref")signal.isSignal(a)?e[s].value=(o=this.rootNode)==null?void 0:o.nodes[0]:shared.isFunction(a)&&e[s]((r=this.rootNode)==null?void 0:r.nodes[0]);else if(shared.startsWith(s,"update"))e[s]=signal.isSignal(a)?a.value:a;else if(s!=="children"){let d=(c=(i=this.proxyProps)[s])!=null?c:i[s]=signal.useSignal(a),l=this.getNodeTrack(s);l.cleanup=signal.useEffect(()=>{d.value=shared.isFunction(a)?a():a;});}this.props=e;}};N.ref=null,N.context={};var f=N;function re(t,e){return shared.isString(t)&&(I(t)&&(t=O(t),e={1:e}),t===""&&(e={0:e}),t=J(t)),shared.isFunction(t)?new f(t,e):new E(t,e)}function h(t){return t instanceof f||t instanceof E}function J(t){t=F(t);let e=document.createElement("template");return e.innerHTML=t,e}function ie(t){return t.children}var B="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr",ce="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";function S(t){if(h(t)||t instanceof Node)return t;let e=shared.isFalsy(t)?"":String(t);return document.createTextNode(e)}function g(t,e,n=null){let o=h(n)?n.firstChild:n;h(e)?e.mount(t,o):o?o.before(e):t.append(e);}function T(t){h(t)?t.unmount():t.parentNode&&t.remove();}function w(t,e,n){g(t,e,n),T(n);}function A(t,e,n){if(e==="class"){typeof n=="string"?t.className=n:Array.isArray(n)?t.className=n.join(" "):n&&typeof n=="object"&&(t.className=Object.entries(n).reduce((o,[r,i])=>o+(i?` ${r}`:""),"").trim());return}if(e==="style"){if(typeof n=="string")t.style.cssText=n;else if(n&&typeof n=="object"){let o=n;Object.keys(o).forEach(r=>{t.style.setProperty(shared.kebabCase(r),String(o[r]));});}return}shared.isFalsy(n)?t.removeAttribute(e):n===!0?t.setAttribute(e,""):t instanceof HTMLInputElement?t.value=String(n):t.setAttribute(e,String(n));}function D(t,e){if(t instanceof HTMLInputElement)switch(t.type){case"checkbox":return m(t,"change",()=>{e(!!t.checked);});case"date":return m(t,"change",()=>{e(t.value?t.value:"");});case"file":return m(t,"change",()=>{t.files&&e(t.files);});case"number":return m(t,"input",()=>{let n=Number.parseFloat(t.value);e(Number.isNaN(n)?"":String(n));});case"radio":return m(t,"change",()=>{e(t.checked?t.value:"");});case"text":return m(t,"input",()=>{e(t.value);})}if(t instanceof HTMLSelectElement)return m(t,"change",()=>{e(t.value);});if(t instanceof HTMLTextAreaElement)return m(t,"input",()=>{e(t.value);})}var X=Promise.resolve();function ae(t){return t?X.then(t):X}function m(t,e,n){return t.addEventListener(e,n),()=>t.removeEventListener(e,n)}function F(t){let e=B.split(","),n=[],o=[],r=/<\/?([\da-z-]+)([^>]*)>/gi,i=0;for(;;){let c=r.exec(t);if(!c)break;let[s,a]=c,d=s[1]==="/";if(o.push(t.slice(i,c.index)),i=c.index+s.length,d){for(;n.length>0&&n[n.length-1]!==a;){let l=n.pop();l&&o.push(`</${l}>`);}n.length>0&&n.pop();}else e.includes(a)||n.push(a);o.push(s);}for(o.push(t.slice(i));n.length>0;){let c=n.pop();c&&o.push(`</${c}>`);}return o.join("")}function I(t){return ce.split(",").includes(t)}function O(t){return B.split(",").includes(t)?`<${t}/>`:`<${t}></${t}>`}function q(t,e,n,o){let r=new Map,i=Array.from(e.values()),c=i.length;if(e.size>0&&n.length===0){if(t.childNodes.length===c+(o?1:0))t.innerHTML="",o&&g(t,o);else {let l=document.createRange(),u=i[0],p=h(u)?u.firstChild:u;l.setStartBefore(p),o?l.setEndBefore(o):l.setEndAfter(t),l.deleteContents();}return i.forEach(l=>{h(l)&&l.unmount();}),r}let s=[],a=de(n),d=0;for(let[l,u]of n.entries()){let p=i[d],x=v(p,l);for(;p&&!a.has(x);)T(p),e.delete(x),p=i[++d],x=v(p,l);let K=v(u,l),M=e.get(K);if(M&&(u=le(t,M,u)),p)if(p===M)d++;else {let P=document.createComment("");g(t,P,p),s.push([P,u]);}else g(t,u,o);r.set(K,u);}return s.forEach(([l,u])=>w(t,u,l)),e.forEach((l,u)=>{l.isConnected&&!r.has(u)&&T(l);}),r}function le(t,e,n){return e===n?e:h(e)&&h(n)&&e.template===n.template?(n.inheritNode(e),n):e instanceof Text&&n instanceof Text?(e.textContent!==n.textContent&&(e.textContent=n.textContent),e):(w(t,n,e),n)}function de(t){let e=new Map;for(let[n,o]of t.entries()){let r=v(o,n);e.set(r,o);}return e}function v(t,e){let n=t instanceof Element?t.id:void 0,o=n===""?void 0:n;return o!=null?o:`_$${e}$`}var E=class t{constructor(e,n){this.template=e;this.props=n;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.provides={};this.trackMap=new Map;this.parent=null;}get firstChild(){var e;return (e=this.nodes[0])!=null?e:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}unmount(){this.trackMap.forEach(e=>{var n,o;(n=e.cleanup)==null||n.call(e),(o=e.lastNodes)==null||o.forEach(r=>{e.isRoot?T(r):r instanceof t&&r.unmount();});}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>T(e)),this.nodes=[],this.mounted=!1;}mount(e,n){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(c=>g(e,c,n)),this.nodes;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==null||r.childNodes.forEach(c=>{o.append(c);})),this.nodes=Array.from(o.childNodes),this.mapNodeTree(e,o),g(e,o,n),this.patchNodes(this.props),this.mounted=!0,this.nodes}mapNodeTree(e,n){let o=1;this.treeMap.set(0,e);let r=i=>{i.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&this.treeMap.set(o++,i);let c=i.firstChild;for(;c;)r(c),c=c.nextSibling;};r(n);}patchNodes(e){for(let n in e){let o=Number(n),r=this.treeMap.get(o);if(r){let i=this.props[n];this.patchNode(n,r,i,o===0);}}this.props=e;}getNodeTrack(e,n,o){var i;let r=this.trackMap.get(e);return r||(r={cleanup:()=>{}},n&&(r.lastNodes=new Map),o&&(r.isRoot=!0),this.trackMap.set(e,r)),(i=r.cleanup)==null||i.call(r),r}inheritNode(e){this.mounted=e.mounted,this.nodes=e.nodes,this.trackMap=e.trackMap,this.treeMap=e.treeMap;let n=this.props;this.props=e.props,this.patchNodes(n);}patchNode(e,n,o,r){for(let i in o)if(i==="children"&&o.children)if(shared.isArray(o.children))o.children.filter(Boolean).forEach((c,s)=>{var x;let[a,d]=shared.isArray(c)?c:[c,null],l=shared.isNil(d)?null:(x=this.treeMap.get(d))!=null?x:null,u=`${e}:${i}:${s}`,p=this.getNodeTrack(u,!0,r);Q(p,n,a,l);});else {let c=`${e}:${i}:0`,s=this.getNodeTrack(c,!0,r);Q(s,n,o.children,null);}else if(i==="ref")signal.isSignal(o[i])?o[i].value=n:shared.isFunction(o[i])&&o[i](n);else if(shared.startsWith(i,"on")){let c=i.slice(2).toLocaleLowerCase(),s=this.getNodeTrack(`${e}:${i}`),a=o[i];s.cleanup=m(n,c,a);}else if(!shared.startsWith(i,"update")){let c=this.getNodeTrack(`${e}:${i}`),s=o[i],a=signal.isSignal(s)?s:signal.useSignal(s);U(c,n,i,a.value);let d=signal.useEffect(()=>{a.value=signal.isSignal(s)?s.value:s,U(c,n,i,a.value);}),l,u=`update${shared.capitalizeFirstLetter(i)}`;o[u]&&(l=D(n,p=>{o[u](p);})),c.cleanup=()=>{d&&d(),l&&l();};}}};function U(t,e,n,o){let r=e;r.setAttribute&&(shared.isFunction(o)?t.cleanup=signal.useEffect(()=>{A(r,n,o());}):A(r,n,o));}function Q(t,e,n,o){shared.isFunction(n)?t.cleanup=signal.useEffect(()=>{let r=shared.coerceArray(n()).map(S);t.lastNodes=q(e,t.lastNodes,r,o);}):shared.coerceArray(n).forEach((r,i)=>{let c=S(r);t.lastNodes.set(String(i),c),g(e,c,o);});}function me(t){var e;k("onMounted"),(e=f.ref)==null||e.addHook("mounted",t);}function he(t){var e;k("onDestroy"),(e=f.ref)==null||e.addHook("destroy",t);}function k(t){f.ref||console.error(`"${t}" can only be called within the component function body
|
|
12
|
-
and cannot be used in asynchronous or deferred calls.`);}function
|
|
11
|
+
var N=class N{constructor(e,n){this.template=e;this.props=n;this.proxyProps={};this.context={};this.emitter=new Set;this.mounted=!1;this.rootNode=null;this.hooks={mounted:new Set,destroy:new Set};this.trackMap=new Map;this.proxyProps=signal.signalObject(n,o=>shared.startsWith(o,"on")||shared.startsWith(o,"update"));}addEventListener(){}removeEventListener(){}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}addHook(e,n){var o;(o=this.hooks[e])==null||o.add(n);}getContext(e){return N.context[e]}setContext(e,n){N.context[e]=n;}inheritNode(e){this.context=e.context,this.hooks=e.hooks,Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap;let n=this.props;this.props=e.props,this.patchProps(n);}mount(e,n){var r,s,c,i;if(!shared.isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(r=this.rootNode)==null?void 0:r.mount(e,n))!=null?s:[];N.ref=this,this.rootNode=this.template(signal.useReactive(this.proxyProps,["children"])),N.ref=null,this.mounted=!0;let o=(i=(c=this.rootNode)==null?void 0:c.mount(e,n))!=null?i:[];return this.hooks.mounted.forEach(a=>a()),this.patchProps(this.props),o}unmount(){var e;this.hooks.destroy.forEach(n=>n()),Object.values(this.hooks).forEach(n=>n.clear()),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.mounted=!1,this.emitter.forEach(n=>n());}getNodeTrack(e,n){let o=this.trackMap.get(e);return o||(o={cleanup:()=>{}},this.trackMap.set(e,o)),n||o.cleanup(),o}patchProps(e){var n,o,r,s,c;for(let[i,a]of Object.entries(e))if(shared.startsWith(i,"on")&&((n=this.rootNode)!=null&&n.nodes)){let u=i.slice(2).toLowerCase(),l=a,d=m(this.rootNode.nodes[0],u,l);this.emitter.add(d);}else if(i==="ref")signal.isSignal(a)?e[i].value=(o=this.rootNode)==null?void 0:o.nodes[0]:shared.isFunction(a)&&e[i]((r=this.rootNode)==null?void 0:r.nodes[0]);else if(shared.startsWith(i,"update"))e[i]=signal.isSignal(a)?a.value:a;else if(i!=="children"){let u=(c=(s=this.proxyProps)[i])!=null?c:s[i]=signal.useSignal(a),l=this.getNodeTrack(i);l.cleanup=signal.useEffect(()=>{u.value=shared.isFunction(a)?a():a;});}this.props=e;}};N.ref=null,N.context={};var f=N;function se(t,e){return shared.isString(t)&&(F(t)&&(t=O(t),e={1:e}),t===""&&(e={0:e}),t=I(t)),shared.isFunction(t)?new f(t,e):new b(t,e)}function h(t){return t instanceof f||t instanceof b}function I(t){t=J(t);let e=document.createElement("template");return e.innerHTML=t,e}function ie(t){return t.children}var B="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr",ae="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";function S(t){if(h(t)||t instanceof Node)return t;let e=shared.isFalsy(t)?"":String(t);return document.createTextNode(e)}function g(t,e,n=null){let o=h(n)?n.firstChild:n;h(e)?e.mount(t,o):o?o.before(e):t.append(e);}function T(t){h(t)?t.unmount():t.parentNode&&t.remove();}function w(t,e,n){g(t,e,n),T(n);}function A(t,e,n){if(e==="class"){typeof n=="string"?t.className=n:Array.isArray(n)?t.className=n.join(" "):n&&typeof n=="object"&&(t.className=Object.entries(n).reduce((o,[r,s])=>o+(s?` ${r}`:""),"").trim());return}if(e==="style"){if(typeof n=="string")t.style.cssText=n;else if(n&&typeof n=="object"){let o=n;Object.keys(o).forEach(r=>{t.style.setProperty(shared.kebabCase(r),String(o[r]));});}return}shared.isFalsy(n)?t.removeAttribute(e):n===!0?t.setAttribute(e,""):t instanceof HTMLInputElement?t.value=String(n):t.setAttribute(e,String(n));}function D(t,e){if(t instanceof HTMLInputElement)switch(t.type){case"checkbox":return m(t,"change",()=>{e(!!t.checked);});case"date":return m(t,"change",()=>{e(t.value?t.value:"");});case"file":return m(t,"change",()=>{t.files&&e(t.files);});case"number":return m(t,"input",()=>{let n=Number.parseFloat(t.value);e(Number.isNaN(n)?"":String(n));});case"radio":return m(t,"change",()=>{e(t.checked?t.value:"");});case"text":return m(t,"input",()=>{e(t.value);})}if(t instanceof HTMLSelectElement)return m(t,"change",()=>{e(t.value);});if(t instanceof HTMLTextAreaElement)return m(t,"input",()=>{e(t.value);})}var X=Promise.resolve();function le(t){return t?X.then(t):X}function m(t,e,n){return t.addEventListener(e,n),()=>t.removeEventListener(e,n)}function J(t){let e=B.split(","),n=[],o=[],r=/<\/?([\da-z-]+)([^>]*)>/gi,s=0;for(;;){let c=r.exec(t);if(!c)break;let[i,a]=c,u=i[1]==="/";if(o.push(t.slice(s,c.index)),s=c.index+i.length,u){for(;n.length>0&&n[n.length-1]!==a;){let l=n.pop();l&&o.push(`</${l}>`);}n.length>0&&n.pop();}else e.includes(a)||n.push(a);o.push(i);}for(o.push(t.slice(s));n.length>0;){let c=n.pop();c&&o.push(`</${c}>`);}return o.join("")}function F(t){return ae.split(",").includes(t)}function O(t){return B.split(",").includes(t)?`<${t}/>`:`<${t}></${t}>`}function q(){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e="",n=t.length;for(let o=0;o<8;o++)e+=t.charAt(Math.floor(Math.random()*n));return e}function z(t,e,n,o){let r=new Map,s=Array.from(e.values()),c=s.length;if(e.size>0&&n.length===0){if(t.childNodes.length===c+(o?1:0))t.innerHTML="",o&&g(t,o);else {let l=document.createRange(),d=s[0],p=h(d)?d.firstChild:d;l.setStartBefore(p),o?l.setEndBefore(o):l.setEndAfter(t),l.deleteContents();}return s.forEach(l=>{h(l)&&l.unmount();}),r}let i=[],a=de(n),u=0;for(let[l,d]of n.entries()){let p=s[u],x=v(p,l);for(;p&&!a.has(x);)T(p),e.delete(x),p=s[++u],x=v(p,l);let K=v(d,l),M=e.get(K);if(M&&(d=ue(t,M,d)),p)if(p===M)u++;else {let P=document.createComment("");g(t,P,p),i.push([P,d]);}else g(t,d,o);r.set(K,d);}return i.forEach(([l,d])=>w(t,d,l)),e.forEach((l,d)=>{l.isConnected&&!r.has(d)&&T(l);}),r}function ue(t,e,n){return e===n?e:h(e)&&h(n)&&e.template===n.template?(n.inheritNode(e),n):e instanceof Text&&n instanceof Text?(e.textContent!==n.textContent&&(e.textContent=n.textContent),e):(w(t,n,e),n)}function de(t){let e=new Map;for(let[n,o]of t.entries()){let r=v(o,n);e.set(r,o);}return e}function v(t,e){if(h(t)){let n=t.key;if(n!=null)return String(n)}return `_$${e}$`}var b=class t{constructor(e,n,o){this.template=e;this.props=n;this.key=o;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.provides={};this.trackMap=new Map;this.parent=null;}get firstChild(){var e;return (e=this.nodes[0])!=null?e:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(e,n){var s;if(this.parent=e,this.isConnected)return this.nodes.forEach(c=>g(e,c,n)),this.nodes;this.key=this.key||q();let o=this.template.content.cloneNode(!0),r=o.firstChild;return (s=r==null?void 0:r.hasAttribute)!=null&&s.call(r,"_svg_")&&(r.remove(),r==null||r.childNodes.forEach(c=>{o.append(c);})),this.nodes=Array.from(o.childNodes),this.mapNodeTree(e,o),g(e,o,n),this.patchNodes(this.props),this.mounted=!0,this.nodes}unmount(){this.trackMap.forEach(e=>{var n,o;(n=e.cleanup)==null||n.call(e),(o=e.lastNodes)==null||o.forEach(r=>{e.isRoot?T(r):r instanceof t&&r.unmount();});}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>T(e)),this.nodes=[],this.mounted=!1;}mapNodeTree(e,n){let o=1;this.treeMap.set(0,e);let r=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&this.treeMap.set(o++,s);let c=s.firstChild;for(;c;)r(c),c=c.nextSibling;};r(n);}patchNodes(e){for(let n in e){let o=Number(n),r=this.treeMap.get(o);if(r){let s=this.props[n];this.patchNode(n,r,s,o===0);}}this.props=e;}getNodeTrack(e,n,o){var s;let r=this.trackMap.get(e);return r||(r={cleanup:()=>{}},n&&(r.lastNodes=new Map),o&&(r.isRoot=!0),this.trackMap.set(e,r)),(s=r.cleanup)==null||s.call(r),r}inheritNode(e){this.mounted=e.mounted,this.nodes=e.nodes,this.trackMap=e.trackMap,this.treeMap=e.treeMap;let n=this.props;this.props=e.props,this.patchNodes(n);}patchNode(e,n,o,r){for(let s in o)if(s==="children"&&o.children)if(shared.isArray(o.children))o.children.filter(Boolean).forEach((c,i)=>{var x;let[a,u]=shared.isArray(c)?c:[c,null],l=shared.isNil(u)?null:(x=this.treeMap.get(u))!=null?x:null,d=`${e}:${s}:${i}`,p=this.getNodeTrack(d,!0,r);Y(p,n,a,l);});else {let c=`${e}:${s}:0`,i=this.getNodeTrack(c,!0,r);Y(i,n,o.children,null);}else if(s==="ref")signal.isSignal(o[s])?o[s].value=n:shared.isFunction(o[s])&&o[s](n);else if(shared.startsWith(s,"on")){let c=s.slice(2).toLocaleLowerCase(),i=this.getNodeTrack(`${e}:${s}`),a=o[s];i.cleanup=m(n,c,a);}else if(!shared.startsWith(s,"update")){let c=this.getNodeTrack(`${e}:${s}`),i=o[s],a=signal.isSignal(i)?i:signal.useSignal(i);Q(c,n,s,a.value);let u=signal.useEffect(()=>{a.value=signal.isSignal(i)?i.value:i,Q(c,n,s,a.value);}),l,d=`update${shared.capitalizeFirstLetter(s)}`;o[d]&&(l=D(n,p=>{o[d](p);})),c.cleanup=()=>{u&&u(),l&&l();};}}};function Q(t,e,n,o){let r=e;r.setAttribute&&(shared.isFunction(o)?t.cleanup=signal.useEffect(()=>{A(r,n,o());}):A(r,n,o));}function Y(t,e,n,o){shared.isFunction(n)?t.cleanup=signal.useEffect(()=>{let r=shared.coerceArray(n()).map(S);t.lastNodes=z(e,t.lastNodes,r,o);}):shared.coerceArray(n).forEach((r,s)=>{let c=S(r);t.lastNodes.set(String(s),c),g(e,c,o);});}function he(t){var e;k("onMounted"),(e=f.ref)==null||e.addHook("mounted",t);}function ge(t){var e;k("onDestroy"),(e=f.ref)==null||e.addHook("destroy",t);}function k(t){f.ref||console.error(`"${t}" can only be called within the component function body
|
|
12
|
+
and cannot be used in asynchronous or deferred calls.`);}function Ne(t,e){var n;k("useProvide"),(n=f.ref)==null||n.setContext(t,e);}function ye(t,e){var n;return k("useInject"),((n=f.ref)==null?void 0:n.getContext(t))||e}function be(t){return Object.entries(t).map(([e,n])=>`${e}=${JSON.stringify(escape(String(n)))}`).join(" ")}function C(t,e){if(shared.isFunction(t))return t(e);let n=Array.isArray(t)?t.reduce((s,c,i)=>(s[i+1]={template:c},s),{}):t,o={},r={};if(shared.isObject(n))for(let[s,c]of Object.entries(n)){let i=e[s];if(i){for(let a in i)shared.startsWith(a,"on")&&shared.isFunction(i[a])&&delete i[a];if(i.children){for(let[a,u]of i.children)o[u]||(o[u]=[]),o[u].push(a);delete i.children;}}r[s]={template:c.template,props:i};}return Object.entries(r).map(([s,{template:c,props:i}])=>{let a=c;return i&&(a+=` ${be(i)}`),o[s]&&(a+=o[s].map(u=>C(u,i)).join("")),a}).join("")}function Ee(t,e){return C(t,e)}function ve(t,e,n={}){e.innerHTML=C(t,n);}
|
|
13
13
|
|
|
14
14
|
exports.ComponentNode = f;
|
|
15
15
|
exports.Fragment = ie;
|
|
16
|
-
exports.TemplateNode =
|
|
17
|
-
exports.h =
|
|
16
|
+
exports.TemplateNode = b;
|
|
17
|
+
exports.h = se;
|
|
18
18
|
exports.isJsxElement = h;
|
|
19
|
-
exports.nextTick =
|
|
20
|
-
exports.onDestroy =
|
|
21
|
-
exports.onMount =
|
|
22
|
-
exports.renderSSG =
|
|
19
|
+
exports.nextTick = le;
|
|
20
|
+
exports.onDestroy = ge;
|
|
21
|
+
exports.onMount = he;
|
|
22
|
+
exports.renderSSG = ve;
|
|
23
23
|
exports.renderTemplate = C;
|
|
24
24
|
exports.renderToString = Ee;
|
|
25
|
-
exports.template =
|
|
26
|
-
exports.useInject =
|
|
27
|
-
exports.useProvide =
|
|
25
|
+
exports.template = I;
|
|
26
|
+
exports.useInject = ye;
|
|
27
|
+
exports.useProvide = Ne;
|
|
28
28
|
//# sourceMappingURL=template.cjs.js.map
|
|
29
29
|
//# sourceMappingURL=template.cjs.js.map
|
package/dist/template.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/component-node.ts","../src/template.ts","../src/utils.ts","../src/patch.ts","../src/template-node.ts","../src/hooks.ts","../src/server.ts"],"names":["_ComponentNode","template","props","signalObject","key","startsWith","_a","_b","hook","cb","context","value","node","parent","before","_c","_d","isFunction","useReactive","mountedNode","handler","set","emitter","trackKey","suppressCleanupCall","track","_e","prop","event","listener","cleanup","addEventListener","isSignal","newValue","useSignal","useEffect","ComponentNode","h","_template","isString","isHtmlTagName","convertToHtmlTag","TemplateNode","isJsxElement","html","closeHtmlTags","Fragment","selfClosingTags","htmlTags","coerceNode","data","text","isFalsy","insertChild","child","beforeNode","removeChild","replaceChild","setAttribute","element","attr","acc","obj","kebabCase","binNode","setter","p","nextTick","fn","eventName","input","selfClosingTagList","tagStack","output","tagPattern","lastIndex","match","fullMatch","tagName","isEndTag","unclosedTag","patchChildren","childrenMap","nextChildren","result","children","childrenLength","range","start","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","next","index","id","_TemplateNode","cloneNode","firstChild","tree","walk","trackLastNodes","isRoot","isArray","item","path","isNil","patchChild","val","triggerValue","patchAttribute","cleanupBind","updateKey","capitalizeFirstLetter","nextNodes","coerceArray","newNode","onMount","throwIfOutsideComponent","onDestroy","useProvide","useInject","defaultValue","convertJsonToAttributes","json","renderTemplate","templateCollection","tmpl","childNodesMap","processedTemplates","isObject","propKey","idx","renderedString","renderToString","component","renderSSG","root"],"mappings":"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","file":"template.cjs.js","sourcesContent":["import { isFunction, startsWith } from '@estjs/shared';\nimport { isSignal, signalObject } from '@estjs/signal';\nimport { type Signal, useEffect, useReactive, useSignal } from '@estjs/signal';\nimport { addEventListener } from './utils';\nimport type { EssorComponent, NodeTrack } from '../types';\nimport type { TemplateNode } from './template-node';\nimport type { Listener } from './utils';\nexport type Hook = 'mounted' | 'destroy';\n\nexport class ComponentNode implements JSX.Element {\n constructor(\n public template: EssorComponent,\n public props: Record<string, any>,\n ) {\n this.proxyProps = signalObject(\n props,\n key => startsWith(key, 'on') || startsWith(key, 'update'),\n );\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: ComponentNode | null = null;\n static context: Record<symbol, Signal<any>> = {};\n id?: string;\n private proxyProps: Record<string, Signal<any>> = {};\n context: Record<symbol | string | number, any> = {};\n emitter = new Set<Function>();\n mounted = false;\n rootNode: TemplateNode | null = null;\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n private trackMap = new Map<string, NodeTrack>();\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 addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n getContext<T>(context: symbol | string | number): T | undefined {\n return ComponentNode.context[context];\n }\n\n setContext<T>(context: symbol | string | number, value: T): void {\n ComponentNode.context[context] = value;\n }\n\n inheritNode(node: ComponentNode): void {\n this.context = node.context;\n this.hooks = node.hooks;\n\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n\n // patch props\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\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 ComponentNode.ref = this;\n this.rootNode = this.template(useReactive(this.proxyProps, ['children']));\n ComponentNode.ref = null;\n this.mounted = true;\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.hooks.mounted.forEach(handler => handler());\n this.patchProps(this.props);\n\n return mountedNode;\n }\n\n unmount(): void {\n this.hooks.destroy.forEach(handler => handler());\n Object.values(this.hooks).forEach(set => set.clear());\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.mounted = false;\n this.emitter.forEach(emitter => emitter());\n }\n\n private getNodeTrack(trackKey: string, suppressCleanupCall?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n if (!suppressCleanupCall) {\n track.cleanup();\n }\n return track;\n }\n\n patchProps(props: Record<string, any>) {\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, 'on') && this.rootNode?.nodes) {\n const event = key.slice(2).toLowerCase();\n const listener = prop as Listener<unknown>;\n const cleanup = addEventListener(this.rootNode.nodes[0], event, listener);\n this.emitter.add(cleanup);\n } else if (key === 'ref') {\n if (isSignal(prop)) {\n (props[key] as any).value = this.rootNode?.nodes[0];\n } else if (isFunction(prop)) {\n (props[key] as Function)(this.rootNode?.nodes[0]);\n }\n } else if (startsWith(key, 'update')) {\n props[key] = isSignal(prop) ? prop.value : prop;\n } else if (key !== 'children') {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = isFunction(prop) ? prop() : prop;\n });\n }\n }\n this.props = props;\n }\n}\n","import { isFunction, isString } from '@estjs/shared';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport type { EssorComponent, EssorNode } from '../types';\n\nexport function h<K extends keyof HTMLElementTagNameMap>(\n _template: EssorComponent | HTMLTemplateElement | K | '',\n props: Record<string, any>,\n): JSX.Element {\n if (isString(_template)) {\n if (isHtmlTagName(_template)) {\n (_template as string) = convertToHtmlTag(_template as string);\n props = {\n 1: props,\n };\n }\n if (_template === '') {\n props = {\n 0: props,\n };\n }\n\n _template = template(_template as string);\n }\n\n return isFunction(_template)\n ? new ComponentNode(_template, props)\n : new TemplateNode(_template as HTMLTemplateElement, props);\n}\n\nexport function isComponentOf(node: unknown, component: EssorComponent) {\n return node instanceof ComponentNode && node.template === component;\n}\n\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\nexport function template(html: string): HTMLTemplateElement {\n html = closeHtmlTags(html);\n const template = document.createElement('template');\n template.innerHTML = html;\n return template;\n}\nexport function Fragment(props: { children: JSX.Element }) {\n return props.children;\n}\n","import { isFalsy, kebabCase } from '@estjs/shared';\nimport { isJsxElement } from './template';\n\nconst selfClosingTags = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';\nconst htmlTags =\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';\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) {\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 if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n } else if (beforeNode) {\n (beforeNode as HTMLElement).before(child);\n } else {\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 if (typeof value === 'string') {\n element.className = value;\n } else if (Array.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 return;\n }\n\n if (attr === 'style') {\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\n Object.keys(obj).forEach(key => {\n element.style.setProperty(kebabCase(key), String(obj[key]));\n });\n }\n return;\n }\n\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement) {\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 binNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const selfClosingTagList = selfClosingTags.split(',');\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!selfClosingTagList.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): boolean {\n const htmlTagsList = htmlTags.split(',');\n return htmlTagsList.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 const selfClosingTagList = selfClosingTags.split(',');\n if (selfClosingTagList.includes(tagName)) {\n return `<${tagName}/>`;\n } else {\n return `<${tagName}></${tagName}>`;\n }\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './template';\n\ntype AnyNode = Node | JSX.Element;\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 const childrenLength = children.length;\n\n if (childrenMap.size > 0 && nextChildren.length === 0) {\n if (parent.childNodes.length === childrenLength + (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 return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\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 (origChild) {\n child = patch(parent, origChild, child);\n }\n\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 replaces.forEach(([placeholder, child]) => replaceChild(parent, child, placeholder));\n\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\nfunction 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\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\nexport function getKey(node, index): string {\n const id = node instanceof Element ? node.id : undefined;\n const result = id === '' ? undefined : id;\n return result ?? `_$${index}$`;\n}\n","import {\n capitalizeFirstLetter,\n coerceArray,\n isArray,\n isFunction,\n isNil,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, useEffect, useSignal } from '@estjs/signal';\nimport {\n addEventListener,\n binNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { patchChildren } from './patch';\nimport type { NodeTrack } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n treeMap = new Map<number, Node>();\n constructor(\n public template: HTMLTemplateElement,\n public props: Record<string, unknown>,\n ) {}\n\n mounted = false;\n nodes: Node[] = [];\n provides: Record<string, unknown> = {};\n trackMap = new Map<string, NodeTrack>();\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n track.lastNodes?.forEach(node => {\n if (track.isRoot) {\n removeChild(node);\n } else if (node instanceof TemplateNode) {\n node.unmount();\n }\n });\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n this.nodes = [];\n this.mounted = false;\n }\n\n parent: Node | null = null;\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n 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 this.mapNodeTree(parent, cloneNode);\n\n insertChild(parent, cloneNode, before);\n\n this.patchNodes(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n mapNodeTree(parent: Node, tree: Node) {\n let index = 1;\n this.treeMap.set(0, parent);\n const walk = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n }\n let child = node.firstChild;\n while (child) {\n walk(child);\n child = child.nextSibling;\n }\n };\n walk(tree);\n }\n\n patchNodes(props) {\n for (const key in props) {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n const value = this.props[key];\n this.patchNode(key, node, value, index === 0);\n }\n }\n this.props = props;\n }\n\n getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n 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\n const props = this.props;\n this.props = node.props;\n this.patchNodes(props);\n }\n\n patchNode(key, node, props, isRoot) {\n for (const attr in props) {\n if (attr === 'children' && props.children) {\n if (!isArray(props.children)) {\n const trackKey = `${key}:${attr}:${0}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n patchChild(track, node, props.children, null);\n } else {\n props.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}:${attr}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n patchChild(track, node, child, before);\n });\n }\n } else if (attr === 'ref') {\n if (isSignal(props[attr])) {\n props[attr].value = node;\n } else if (isFunction(props[attr])) {\n (props[attr] as Function)(node);\n }\n }\n // handle events\n else if (startsWith(attr, 'on')) {\n const eventName = attr.slice(2).toLocaleLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n const listener = props[attr];\n track.cleanup = addEventListener(node, eventName, listener);\n // attr\n } else if (!startsWith(attr, 'update')) {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n const val = props[attr];\n\n const triggerValue = isSignal(val) ? val : useSignal(val);\n patchAttribute(track, node, attr, triggerValue.value);\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(val) ? val.value : val;\n patchAttribute(track, node, attr, triggerValue.value);\n });\n\n let cleanupBind;\n const updateKey = `update${capitalizeFirstLetter(attr)}`;\n if (props[updateKey]) {\n cleanupBind = binNode(node, value => {\n props[updateKey](value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n }\n }\n}\n\nfunction patchAttribute(track: NodeTrack, node: Node, attr: string, data: unknown): void {\n const element = node as HTMLElement;\n if (!element.setAttribute) {\n return;\n }\n if (isFunction(data)) {\n track.cleanup = useEffect(() => {\n setAttribute(element, attr, data());\n });\n } else {\n setAttribute(element, attr, data);\n }\n}\n\nfunction patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode);\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n });\n } else {\n coerceArray(child).forEach((node, i) => {\n const newNode = coerceNode(node);\n track.lastNodes!.set(String(i), newNode);\n insertChild(parent, newNode, before);\n });\n }\n}\n","import { ComponentNode } from './component-node';\n\nexport function onMount(cb: () => void): void {\n throwIfOutsideComponent('onMounted');\n ComponentNode.ref?.addHook('mounted', cb);\n}\n\nexport function onDestroy(cb: () => void): void {\n throwIfOutsideComponent('onDestroy');\n ComponentNode.ref?.addHook('destroy', cb);\n}\n\nfunction throwIfOutsideComponent(hook: string) {\n if (!ComponentNode.ref) {\n console.error(\n `\"${hook}\" can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\nexport function getCurrentComponent(): ComponentNode | null {\n return ComponentNode.ref;\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\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n) {\n throwIfOutsideComponent('useProvide');\n\n ComponentNode.ref?.setContext(key as string, value);\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 throwIfOutsideComponent('useInject');\n return ComponentNode.ref?.getContext(key as string) || defaultValue;\n}\n\n// export function useProps(props) {\n// const propsValue = props;\n// const propsAction = () => {};\n// const propsRef = () => {};\n// const propsChild = () => {};\n// }\n","import { isFunction, isObject, startsWith } from '@estjs/shared';\nimport type { EssorNode } from '../types';\n\ninterface TemplateEntry {\n template: string;\n props?: Record<string, any>;\n}\n\ninterface TemplateCollection {\n [key: number]: TemplateEntry;\n}\n\ntype Props = Record<string, any>;\n\n/**\n * Converts a JSON object to a string of HTML attributes.\n * @param json - The JSON object to be converted.\n * @returns A string representing the HTML attributes.\n */\nfunction convertJsonToAttributes(json: Record<string, any>): string {\n return Object.entries(json)\n .map(([key, value]) => `${key}=${JSON.stringify(escape(String(value)))}`)\n .join(' ');\n}\n\n/**\n * Renders a template to a string based on provided props.\n * Handles both function-based and object-based templates.\n * @param template - The template to render, which can be an array, an object, or a function.\n * @param props - The properties used for rendering the template.\n * @returns The rendered template as a string.\n */\nexport function renderTemplate(template: string[] | EssorNode | Function, props: Props): string {\n // If the template is a function, invoke it with props and return the result\n if (isFunction(template)) {\n return template(props);\n }\n\n // Convert array-based templates to TemplateCollection format\n const templateCollection: TemplateCollection = Array.isArray(template)\n ? template.reduce((acc, tmpl, index) => {\n acc[index + 1] = { template: tmpl };\n return acc;\n }, {})\n : template;\n\n const childNodesMap: Record<string, EssorNode[]> = {};\n const processedTemplates: TemplateCollection = {};\n\n if (isObject(templateCollection)) {\n for (const [key, tmpl] of Object.entries(templateCollection)) {\n const prop = props[key];\n if (prop) {\n // Remove event listeners (props starting with 'on') from the properties\n for (const propKey in prop) {\n if (startsWith(propKey, 'on') && isFunction(prop[propKey])) {\n delete prop[propKey];\n }\n }\n\n // Handle child elements if present\n if (prop.children) {\n for (const [child, idx] of prop.children) {\n if (!childNodesMap[idx]) childNodesMap[idx] = [];\n childNodesMap[idx].push(child);\n }\n delete prop.children;\n }\n }\n\n // Store the processed template and associated props\n processedTemplates[key] = { template: tmpl.template, props: prop };\n }\n }\n\n // Render the final template as a string\n return Object.entries(processedTemplates)\n .map(([key, { template: tmpl, props: prop }]) => {\n let renderedString = tmpl;\n if (prop) {\n renderedString += ` ${convertJsonToAttributes(prop)}`;\n }\n if (childNodesMap[key]) {\n renderedString += childNodesMap[key].map(child => renderTemplate(child, prop)).join('');\n }\n\n return renderedString;\n })\n .join('');\n}\n\n/**\n * Renders a component to a string using the given properties.\n * @param component - The component function to be rendered.\n * @param props - The properties to be passed to the component.\n * @returns The rendered component as a string.\n */\nexport function renderToString(component: (...args: any[]) => string, props: Props): string {\n return renderTemplate(component, props);\n}\n\n/**\n * Renders a component to a string and sets it as the innerHTML of the specified root element.\n * @param component - The component function to be rendered.\n * @param root - The root element in which to render the component.\n * @param props - The properties to be passed to the component.\n */\nexport function renderSSG(component, root: HTMLElement, props: Props = {}): void {\n root.innerHTML = renderTemplate(component, props);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/component-node.ts","../src/template.ts","../src/utils.ts","../src/patch.ts","../src/template-node.ts","../src/hooks.ts","../src/server.ts"],"names":["_ComponentNode","template","props","signalObject","key","startsWith","_a","_b","hook","cb","context","value","node","parent","before","_c","_d","isFunction","useReactive","mountedNode","handler","set","emitter","trackKey","suppressCleanupCall","track","_e","prop","event","listener","cleanup","addEventListener","isSignal","newValue","useSignal","useEffect","ComponentNode","h","_template","isString","isHtmlTagName","convertToHtmlTag","TemplateNode","isJsxElement","html","closeHtmlTags","Fragment","selfClosingTags","htmlTags","coerceNode","data","text","isFalsy","insertChild","child","beforeNode","removeChild","replaceChild","setAttribute","element","attr","acc","obj","kebabCase","binNode","setter","p","nextTick","fn","eventName","input","selfClosingTagList","tagStack","output","tagPattern","lastIndex","match","fullMatch","tagName","isEndTag","unclosedTag","generateShortId","characters","result","charactersLength","i","patchChildren","childrenMap","nextChildren","children","childrenLength","range","start","replaces","nextChildrenMap","mapKeys","childIndex","currChild","currKey","getKey","origChild","patch","placeholder","next","index","jsxKey","_TemplateNode","cloneNode","firstChild","tree","walk","trackLastNodes","isRoot","isArray","item","path","isNil","patchChild","val","triggerValue","patchAttribute","cleanupBind","updateKey","capitalizeFirstLetter","nextNodes","coerceArray","newNode","onMount","throwIfOutsideComponent","onDestroy","useProvide","useInject","defaultValue","convertJsonToAttributes","json","renderTemplate","templateCollection","tmpl","childNodesMap","processedTemplates","isObject","propKey","idx","renderedString","renderToString","component","renderSSG","root"],"mappings":"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","file":"template.cjs.js","sourcesContent":["import { isFunction, startsWith } from '@estjs/shared';\nimport { isSignal, signalObject } from '@estjs/signal';\nimport { type Signal, useEffect, useReactive, useSignal } from '@estjs/signal';\nimport { addEventListener } from './utils';\nimport type { EssorComponent, NodeTrack } from '../types';\nimport type { TemplateNode } from './template-node';\nimport type { Listener } from './utils';\nexport type Hook = 'mounted' | 'destroy';\n\nexport class ComponentNode implements JSX.Element {\n constructor(\n public template: EssorComponent,\n public props: Record<string, any>,\n ) {\n this.proxyProps = signalObject(\n props,\n key => startsWith(key, 'on') || startsWith(key, 'update'),\n );\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: ComponentNode | null = null;\n static context: Record<symbol, Signal<any>> = {};\n id?: string;\n private proxyProps: Record<string, Signal<any>> = {};\n context: Record<symbol | string | number, any> = {};\n emitter = new Set<Function>();\n mounted = false;\n rootNode: TemplateNode | null = null;\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n private trackMap = new Map<string, NodeTrack>();\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 addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n getContext<T>(context: symbol | string | number): T | undefined {\n return ComponentNode.context[context];\n }\n\n setContext<T>(context: symbol | string | number, value: T): void {\n ComponentNode.context[context] = value;\n }\n\n inheritNode(node: ComponentNode): void {\n this.context = node.context;\n this.hooks = node.hooks;\n\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n\n // patch props\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\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 ComponentNode.ref = this;\n this.rootNode = this.template(useReactive(this.proxyProps, ['children']));\n ComponentNode.ref = null;\n this.mounted = true;\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.hooks.mounted.forEach(handler => handler());\n this.patchProps(this.props);\n\n return mountedNode;\n }\n\n unmount(): void {\n this.hooks.destroy.forEach(handler => handler());\n Object.values(this.hooks).forEach(set => set.clear());\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.mounted = false;\n this.emitter.forEach(emitter => emitter());\n }\n\n private getNodeTrack(trackKey: string, suppressCleanupCall?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n if (!suppressCleanupCall) {\n track.cleanup();\n }\n return track;\n }\n\n patchProps(props: Record<string, any>) {\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, 'on') && this.rootNode?.nodes) {\n const event = key.slice(2).toLowerCase();\n const listener = prop as Listener<unknown>;\n const cleanup = addEventListener(this.rootNode.nodes[0], event, listener);\n this.emitter.add(cleanup);\n } else if (key === 'ref') {\n if (isSignal(prop)) {\n (props[key] as any).value = this.rootNode?.nodes[0];\n } else if (isFunction(prop)) {\n (props[key] as Function)(this.rootNode?.nodes[0]);\n }\n } else if (startsWith(key, 'update')) {\n props[key] = isSignal(prop) ? prop.value : prop;\n } else if (key !== 'children') {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = isFunction(prop) ? prop() : prop;\n });\n }\n }\n this.props = props;\n }\n}\n","import { isFunction, isString } from '@estjs/shared';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport type { EssorComponent, EssorNode } from '../types';\n\nexport function h<K extends keyof HTMLElementTagNameMap>(\n _template: EssorComponent | HTMLTemplateElement | K | '',\n props: Record<string, any>,\n): JSX.Element {\n if (isString(_template)) {\n if (isHtmlTagName(_template)) {\n (_template as string) = convertToHtmlTag(_template as string);\n props = {\n 1: props,\n };\n }\n if (_template === '') {\n props = {\n 0: props,\n };\n }\n\n _template = template(_template as string);\n }\n\n return isFunction(_template)\n ? new ComponentNode(_template, props)\n : new TemplateNode(_template as HTMLTemplateElement, props);\n}\n\nexport function isComponentOf(node: unknown, component: EssorComponent) {\n return node instanceof ComponentNode && node.template === component;\n}\n\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\nexport function template(html: string): HTMLTemplateElement {\n html = closeHtmlTags(html);\n const template = document.createElement('template');\n template.innerHTML = html;\n return template;\n}\nexport function Fragment(props: { children: JSX.Element }) {\n return props.children;\n}\n","import { isFalsy, kebabCase } from '@estjs/shared';\nimport { isJsxElement } from './template';\n\nconst selfClosingTags = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';\nconst htmlTags =\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';\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) {\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 if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n } else if (beforeNode) {\n (beforeNode as HTMLElement).before(child);\n } else {\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 if (typeof value === 'string') {\n element.className = value;\n } else if (Array.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 return;\n }\n\n if (attr === 'style') {\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\n Object.keys(obj).forEach(key => {\n element.style.setProperty(kebabCase(key), String(obj[key]));\n });\n }\n return;\n }\n\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement) {\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 binNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const selfClosingTagList = selfClosingTags.split(',');\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!selfClosingTagList.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): boolean {\n const htmlTagsList = htmlTags.split(',');\n return htmlTagsList.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 const selfClosingTagList = selfClosingTags.split(',');\n if (selfClosingTagList.includes(tagName)) {\n return `<${tagName}/>`;\n } else {\n return `<${tagName}></${tagName}>`;\n }\n}\nexport function generateShortId() {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n const charactersLength = characters.length;\n for (let i = 0; i < 8; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './template';\n\ntype AnyNode = Node | JSX.Element;\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 const childrenLength = children.length;\n\n if (childrenMap.size > 0 && nextChildren.length === 0) {\n if (parent.childNodes.length === childrenLength + (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 return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\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 (origChild) {\n child = patch(parent, origChild, child);\n }\n\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 replaces.forEach(([placeholder, child]) => replaceChild(parent, child, placeholder));\n\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\nfunction 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\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}\nexport function getKey(node: AnyNode, index: number): string {\n if (isJsxElement(node)) {\n // use jsx key\n const jsxKey = (node as any).key;\n if (jsxKey !== undefined && jsxKey !== null) {\n return String(jsxKey);\n }\n }\n\n // use index\n return `_$${index}$`;\n}\n","import {\n capitalizeFirstLetter,\n coerceArray,\n isArray,\n isFunction,\n isNil,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, useEffect, useSignal } from '@estjs/signal';\nimport {\n addEventListener,\n binNode,\n coerceNode,\n generateShortId,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { patchChildren } from './patch';\nimport type { NodeTrack } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n treeMap = new Map<number, Node>();\n constructor(\n public template: HTMLTemplateElement,\n public props: Record<string, unknown>,\n public key?: string,\n ) {}\n\n mounted = false;\n nodes: Node[] = [];\n provides: Record<string, unknown> = {};\n trackMap = new Map<string, NodeTrack>();\n parent: Node | null = null;\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n this.key = this.key || generateShortId();\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 this.mapNodeTree(parent, cloneNode);\n\n insertChild(parent, cloneNode, before);\n\n this.patchNodes(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n track.lastNodes?.forEach(node => {\n if (track.isRoot) {\n removeChild(node);\n } else if (node instanceof TemplateNode) {\n node.unmount();\n }\n });\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n this.nodes = [];\n this.mounted = false;\n }\n\n mapNodeTree(parent: Node, tree: Node) {\n let index = 1;\n this.treeMap.set(0, parent);\n const walk = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n }\n let child = node.firstChild;\n while (child) {\n walk(child);\n child = child.nextSibling;\n }\n };\n walk(tree);\n }\n\n patchNodes(props) {\n for (const key in props) {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n const value = this.props[key];\n this.patchNode(key, node, value, index === 0);\n }\n }\n this.props = props;\n }\n\n getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n 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\n const props = this.props;\n this.props = node.props;\n this.patchNodes(props);\n }\n\n patchNode(key, node, props, isRoot) {\n for (const attr in props) {\n if (attr === 'children' && props.children) {\n if (!isArray(props.children)) {\n const trackKey = `${key}:${attr}:${0}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n patchChild(track, node, props.children, null);\n } else {\n props.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}:${attr}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n patchChild(track, node, child, before);\n });\n }\n } else if (attr === 'ref') {\n if (isSignal(props[attr])) {\n props[attr].value = node;\n } else if (isFunction(props[attr])) {\n (props[attr] as Function)(node);\n }\n }\n // handle events\n else if (startsWith(attr, 'on')) {\n const eventName = attr.slice(2).toLocaleLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n const listener = props[attr];\n track.cleanup = addEventListener(node, eventName, listener);\n // attr\n } else if (!startsWith(attr, 'update')) {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n const val = props[attr];\n\n const triggerValue = isSignal(val) ? val : useSignal(val);\n patchAttribute(track, node, attr, triggerValue.value);\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(val) ? val.value : val;\n patchAttribute(track, node, attr, triggerValue.value);\n });\n\n let cleanupBind;\n const updateKey = `update${capitalizeFirstLetter(attr)}`;\n if (props[updateKey]) {\n cleanupBind = binNode(node, value => {\n props[updateKey](value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n }\n }\n}\n\nfunction patchAttribute(track: NodeTrack, node: Node, attr: string, data: unknown): void {\n const element = node as HTMLElement;\n if (!element.setAttribute) {\n return;\n }\n if (isFunction(data)) {\n track.cleanup = useEffect(() => {\n setAttribute(element, attr, data());\n });\n } else {\n setAttribute(element, attr, data);\n }\n}\n\nfunction patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode);\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n });\n } else {\n coerceArray(child).forEach((node, i) => {\n const newNode = coerceNode(node);\n track.lastNodes!.set(String(i), newNode);\n insertChild(parent, newNode, before);\n });\n }\n}\n","import { ComponentNode } from './component-node';\n\nexport function onMount(cb: () => void): void {\n throwIfOutsideComponent('onMounted');\n ComponentNode.ref?.addHook('mounted', cb);\n}\n\nexport function onDestroy(cb: () => void): void {\n throwIfOutsideComponent('onDestroy');\n ComponentNode.ref?.addHook('destroy', cb);\n}\n\nfunction throwIfOutsideComponent(hook: string) {\n if (!ComponentNode.ref) {\n console.error(\n `\"${hook}\" can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\nexport function getCurrentComponent(): ComponentNode | null {\n return ComponentNode.ref;\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\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n) {\n throwIfOutsideComponent('useProvide');\n\n ComponentNode.ref?.setContext(key as string, value);\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 throwIfOutsideComponent('useInject');\n return ComponentNode.ref?.getContext(key as string) || defaultValue;\n}\n\n// export function useProps(props) {\n// const propsValue = props;\n// const propsAction = () => {};\n// const propsRef = () => {};\n// const propsChild = () => {};\n// }\n","import { isFunction, isObject, startsWith } from '@estjs/shared';\nimport type { EssorNode } from '../types';\n\ninterface TemplateEntry {\n template: string;\n props?: Record<string, any>;\n}\n\ninterface TemplateCollection {\n [key: number]: TemplateEntry;\n}\n\ntype Props = Record<string, any>;\n\n/**\n * Converts a JSON object to a string of HTML attributes.\n * @param json - The JSON object to be converted.\n * @returns A string representing the HTML attributes.\n */\nfunction convertJsonToAttributes(json: Record<string, any>): string {\n return Object.entries(json)\n .map(([key, value]) => `${key}=${JSON.stringify(escape(String(value)))}`)\n .join(' ');\n}\n\n/**\n * Renders a template to a string based on provided props.\n * Handles both function-based and object-based templates.\n * @param template - The template to render, which can be an array, an object, or a function.\n * @param props - The properties used for rendering the template.\n * @returns The rendered template as a string.\n */\nexport function renderTemplate(template: string[] | EssorNode | Function, props: Props): string {\n // If the template is a function, invoke it with props and return the result\n if (isFunction(template)) {\n return template(props);\n }\n\n // Convert array-based templates to TemplateCollection format\n const templateCollection: TemplateCollection = Array.isArray(template)\n ? template.reduce((acc, tmpl, index) => {\n acc[index + 1] = { template: tmpl };\n return acc;\n }, {})\n : template;\n\n const childNodesMap: Record<string, EssorNode[]> = {};\n const processedTemplates: TemplateCollection = {};\n\n if (isObject(templateCollection)) {\n for (const [key, tmpl] of Object.entries(templateCollection)) {\n const prop = props[key];\n if (prop) {\n // Remove event listeners (props starting with 'on') from the properties\n for (const propKey in prop) {\n if (startsWith(propKey, 'on') && isFunction(prop[propKey])) {\n delete prop[propKey];\n }\n }\n\n // Handle child elements if present\n if (prop.children) {\n for (const [child, idx] of prop.children) {\n if (!childNodesMap[idx]) childNodesMap[idx] = [];\n childNodesMap[idx].push(child);\n }\n delete prop.children;\n }\n }\n\n // Store the processed template and associated props\n processedTemplates[key] = { template: tmpl.template, props: prop };\n }\n }\n\n // Render the final template as a string\n return Object.entries(processedTemplates)\n .map(([key, { template: tmpl, props: prop }]) => {\n let renderedString = tmpl;\n if (prop) {\n renderedString += ` ${convertJsonToAttributes(prop)}`;\n }\n if (childNodesMap[key]) {\n renderedString += childNodesMap[key].map(child => renderTemplate(child, prop)).join('');\n }\n\n return renderedString;\n })\n .join('');\n}\n\n/**\n * Renders a component to a string using the given properties.\n * @param component - The component function to be rendered.\n * @param props - The properties to be passed to the component.\n * @returns The rendered component as a string.\n */\nexport function renderToString(component: (...args: any[]) => string, props: Props): string {\n return renderTemplate(component, props);\n}\n\n/**\n * Renders a component to a string and sets it as the innerHTML of the specified root element.\n * @param component - The component function to be rendered.\n * @param root - The root element in which to render the component.\n * @param props - The properties to be passed to the component.\n */\nexport function renderSSG(component, root: HTMLElement, props: Props = {}): void {\n root.innerHTML = renderTemplate(component, props);\n}\n"]}
|
package/dist/template.d.cts
CHANGED
|
@@ -2216,19 +2216,20 @@ declare global {
|
|
|
2216
2216
|
declare class TemplateNode$1 implements JSX.Element {
|
|
2217
2217
|
template: HTMLTemplateElement;
|
|
2218
2218
|
props: Record<string, unknown>;
|
|
2219
|
+
key?: string | undefined;
|
|
2219
2220
|
treeMap: Map<number, Node>;
|
|
2220
|
-
constructor(template: HTMLTemplateElement, props: Record<string, unknown
|
|
2221
|
+
constructor(template: HTMLTemplateElement, props: Record<string, unknown>, key?: string | undefined);
|
|
2221
2222
|
mounted: boolean;
|
|
2222
2223
|
nodes: Node[];
|
|
2223
2224
|
provides: Record<string, unknown>;
|
|
2224
2225
|
trackMap: Map<string, NodeTrack>;
|
|
2226
|
+
parent: Node | null;
|
|
2225
2227
|
get firstChild(): Node | null;
|
|
2226
2228
|
get isConnected(): boolean;
|
|
2227
2229
|
addEventListener(): void;
|
|
2228
2230
|
removeEventListener(): void;
|
|
2229
|
-
unmount(): void;
|
|
2230
|
-
parent: Node | null;
|
|
2231
2231
|
mount(parent: Node, before?: Node | null): Node[];
|
|
2232
|
+
unmount(): void;
|
|
2232
2233
|
mapNodeTree(parent: Node, tree: Node): void;
|
|
2233
2234
|
patchNodes(props: any): void;
|
|
2234
2235
|
getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack;
|
package/dist/template.d.ts
CHANGED
|
@@ -2216,19 +2216,20 @@ declare global {
|
|
|
2216
2216
|
declare class TemplateNode$1 implements JSX.Element {
|
|
2217
2217
|
template: HTMLTemplateElement;
|
|
2218
2218
|
props: Record<string, unknown>;
|
|
2219
|
+
key?: string | undefined;
|
|
2219
2220
|
treeMap: Map<number, Node>;
|
|
2220
|
-
constructor(template: HTMLTemplateElement, props: Record<string, unknown
|
|
2221
|
+
constructor(template: HTMLTemplateElement, props: Record<string, unknown>, key?: string | undefined);
|
|
2221
2222
|
mounted: boolean;
|
|
2222
2223
|
nodes: Node[];
|
|
2223
2224
|
provides: Record<string, unknown>;
|
|
2224
2225
|
trackMap: Map<string, NodeTrack>;
|
|
2226
|
+
parent: Node | null;
|
|
2225
2227
|
get firstChild(): Node | null;
|
|
2226
2228
|
get isConnected(): boolean;
|
|
2227
2229
|
addEventListener(): void;
|
|
2228
2230
|
removeEventListener(): void;
|
|
2229
|
-
unmount(): void;
|
|
2230
|
-
parent: Node | null;
|
|
2231
2231
|
mount(parent: Node, before?: Node | null): Node[];
|
|
2232
|
+
unmount(): void;
|
|
2232
2233
|
mapNodeTree(parent: Node, tree: Node): void;
|
|
2233
2234
|
patchNodes(props: any): void;
|
|
2234
2235
|
getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack;
|
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.
|
|
7
|
+
* @estjs/template v0.0.11
|
|
8
8
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
9
9
|
* @license MIT
|
|
10
10
|
**/
|
|
@@ -329,6 +329,15 @@ function convertToHtmlTag(tagName) {
|
|
|
329
329
|
return `<${tagName}></${tagName}>`;
|
|
330
330
|
}
|
|
331
331
|
}
|
|
332
|
+
function generateShortId() {
|
|
333
|
+
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
334
|
+
let result = "";
|
|
335
|
+
const charactersLength = characters.length;
|
|
336
|
+
for (let i = 0; i < 8; i++) {
|
|
337
|
+
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
|
338
|
+
}
|
|
339
|
+
return result;
|
|
340
|
+
}
|
|
332
341
|
|
|
333
342
|
// src/patch.ts
|
|
334
343
|
function patchChildren(parent, childrenMap, nextChildren, before) {
|
|
@@ -424,16 +433,21 @@ function mapKeys(children) {
|
|
|
424
433
|
return result;
|
|
425
434
|
}
|
|
426
435
|
function getKey(node, index) {
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
436
|
+
if (isJsxElement(node)) {
|
|
437
|
+
const jsxKey = node.key;
|
|
438
|
+
if (jsxKey !== void 0 && jsxKey !== null) {
|
|
439
|
+
return String(jsxKey);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return `_$${index}$`;
|
|
430
443
|
}
|
|
431
444
|
|
|
432
445
|
// src/template-node.ts
|
|
433
446
|
var TemplateNode = class _TemplateNode {
|
|
434
|
-
constructor(template2, props) {
|
|
447
|
+
constructor(template2, props, key) {
|
|
435
448
|
this.template = template2;
|
|
436
449
|
this.props = props;
|
|
450
|
+
this.key = key;
|
|
437
451
|
this.treeMap = /* @__PURE__ */ new Map();
|
|
438
452
|
this.mounted = false;
|
|
439
453
|
this.nodes = [];
|
|
@@ -452,24 +466,6 @@ var TemplateNode = class _TemplateNode {
|
|
|
452
466
|
}
|
|
453
467
|
removeEventListener() {
|
|
454
468
|
}
|
|
455
|
-
unmount() {
|
|
456
|
-
this.trackMap.forEach((track) => {
|
|
457
|
-
var _a, _b;
|
|
458
|
-
(_a = track.cleanup) == null ? void 0 : _a.call(track);
|
|
459
|
-
(_b = track.lastNodes) == null ? void 0 : _b.forEach((node) => {
|
|
460
|
-
if (track.isRoot) {
|
|
461
|
-
removeChild(node);
|
|
462
|
-
} else if (node instanceof _TemplateNode) {
|
|
463
|
-
node.unmount();
|
|
464
|
-
}
|
|
465
|
-
});
|
|
466
|
-
});
|
|
467
|
-
this.trackMap.clear();
|
|
468
|
-
this.treeMap.clear();
|
|
469
|
-
this.nodes.forEach((node) => removeChild(node));
|
|
470
|
-
this.nodes = [];
|
|
471
|
-
this.mounted = false;
|
|
472
|
-
}
|
|
473
469
|
mount(parent, before) {
|
|
474
470
|
var _a;
|
|
475
471
|
this.parent = parent;
|
|
@@ -477,6 +473,7 @@ var TemplateNode = class _TemplateNode {
|
|
|
477
473
|
this.nodes.forEach((node) => insertChild(parent, node, before));
|
|
478
474
|
return this.nodes;
|
|
479
475
|
}
|
|
476
|
+
this.key = this.key || generateShortId();
|
|
480
477
|
const cloneNode = this.template.content.cloneNode(true);
|
|
481
478
|
const firstChild = cloneNode.firstChild;
|
|
482
479
|
if ((_a = firstChild == null ? void 0 : firstChild.hasAttribute) == null ? void 0 : _a.call(firstChild, "_svg_")) {
|
|
@@ -492,6 +489,24 @@ var TemplateNode = class _TemplateNode {
|
|
|
492
489
|
this.mounted = true;
|
|
493
490
|
return this.nodes;
|
|
494
491
|
}
|
|
492
|
+
unmount() {
|
|
493
|
+
this.trackMap.forEach((track) => {
|
|
494
|
+
var _a, _b;
|
|
495
|
+
(_a = track.cleanup) == null ? void 0 : _a.call(track);
|
|
496
|
+
(_b = track.lastNodes) == null ? void 0 : _b.forEach((node) => {
|
|
497
|
+
if (track.isRoot) {
|
|
498
|
+
removeChild(node);
|
|
499
|
+
} else if (node instanceof _TemplateNode) {
|
|
500
|
+
node.unmount();
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
this.trackMap.clear();
|
|
505
|
+
this.treeMap.clear();
|
|
506
|
+
this.nodes.forEach((node) => removeChild(node));
|
|
507
|
+
this.nodes = [];
|
|
508
|
+
this.mounted = false;
|
|
509
|
+
}
|
|
495
510
|
mapNodeTree(parent, tree) {
|
|
496
511
|
let index = 1;
|
|
497
512
|
this.treeMap.set(0, parent);
|
package/dist/template.dev.esm.js
CHANGED
|
@@ -2,7 +2,7 @@ import { isString, isFunction, isArray, isNil, startsWith, capitalizeFirstLetter
|
|
|
2
2
|
import { isSignal, useSignal, useEffect, signalObject, useReactive } from '@estjs/signal';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* @estjs/template v0.0.
|
|
5
|
+
* @estjs/template v0.0.11
|
|
6
6
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
7
7
|
* @license MIT
|
|
8
8
|
**/
|
|
@@ -327,6 +327,15 @@ function convertToHtmlTag(tagName) {
|
|
|
327
327
|
return `<${tagName}></${tagName}>`;
|
|
328
328
|
}
|
|
329
329
|
}
|
|
330
|
+
function generateShortId() {
|
|
331
|
+
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
332
|
+
let result = "";
|
|
333
|
+
const charactersLength = characters.length;
|
|
334
|
+
for (let i = 0; i < 8; i++) {
|
|
335
|
+
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
|
336
|
+
}
|
|
337
|
+
return result;
|
|
338
|
+
}
|
|
330
339
|
|
|
331
340
|
// src/patch.ts
|
|
332
341
|
function patchChildren(parent, childrenMap, nextChildren, before) {
|
|
@@ -422,16 +431,21 @@ function mapKeys(children) {
|
|
|
422
431
|
return result;
|
|
423
432
|
}
|
|
424
433
|
function getKey(node, index) {
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
434
|
+
if (isJsxElement(node)) {
|
|
435
|
+
const jsxKey = node.key;
|
|
436
|
+
if (jsxKey !== void 0 && jsxKey !== null) {
|
|
437
|
+
return String(jsxKey);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return `_$${index}$`;
|
|
428
441
|
}
|
|
429
442
|
|
|
430
443
|
// src/template-node.ts
|
|
431
444
|
var TemplateNode = class _TemplateNode {
|
|
432
|
-
constructor(template2, props) {
|
|
445
|
+
constructor(template2, props, key) {
|
|
433
446
|
this.template = template2;
|
|
434
447
|
this.props = props;
|
|
448
|
+
this.key = key;
|
|
435
449
|
this.treeMap = /* @__PURE__ */ new Map();
|
|
436
450
|
this.mounted = false;
|
|
437
451
|
this.nodes = [];
|
|
@@ -450,24 +464,6 @@ var TemplateNode = class _TemplateNode {
|
|
|
450
464
|
}
|
|
451
465
|
removeEventListener() {
|
|
452
466
|
}
|
|
453
|
-
unmount() {
|
|
454
|
-
this.trackMap.forEach((track) => {
|
|
455
|
-
var _a, _b;
|
|
456
|
-
(_a = track.cleanup) == null ? void 0 : _a.call(track);
|
|
457
|
-
(_b = track.lastNodes) == null ? void 0 : _b.forEach((node) => {
|
|
458
|
-
if (track.isRoot) {
|
|
459
|
-
removeChild(node);
|
|
460
|
-
} else if (node instanceof _TemplateNode) {
|
|
461
|
-
node.unmount();
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
});
|
|
465
|
-
this.trackMap.clear();
|
|
466
|
-
this.treeMap.clear();
|
|
467
|
-
this.nodes.forEach((node) => removeChild(node));
|
|
468
|
-
this.nodes = [];
|
|
469
|
-
this.mounted = false;
|
|
470
|
-
}
|
|
471
467
|
mount(parent, before) {
|
|
472
468
|
var _a;
|
|
473
469
|
this.parent = parent;
|
|
@@ -475,6 +471,7 @@ var TemplateNode = class _TemplateNode {
|
|
|
475
471
|
this.nodes.forEach((node) => insertChild(parent, node, before));
|
|
476
472
|
return this.nodes;
|
|
477
473
|
}
|
|
474
|
+
this.key = this.key || generateShortId();
|
|
478
475
|
const cloneNode = this.template.content.cloneNode(true);
|
|
479
476
|
const firstChild = cloneNode.firstChild;
|
|
480
477
|
if ((_a = firstChild == null ? void 0 : firstChild.hasAttribute) == null ? void 0 : _a.call(firstChild, "_svg_")) {
|
|
@@ -490,6 +487,24 @@ var TemplateNode = class _TemplateNode {
|
|
|
490
487
|
this.mounted = true;
|
|
491
488
|
return this.nodes;
|
|
492
489
|
}
|
|
490
|
+
unmount() {
|
|
491
|
+
this.trackMap.forEach((track) => {
|
|
492
|
+
var _a, _b;
|
|
493
|
+
(_a = track.cleanup) == null ? void 0 : _a.call(track);
|
|
494
|
+
(_b = track.lastNodes) == null ? void 0 : _b.forEach((node) => {
|
|
495
|
+
if (track.isRoot) {
|
|
496
|
+
removeChild(node);
|
|
497
|
+
} else if (node instanceof _TemplateNode) {
|
|
498
|
+
node.unmount();
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
this.trackMap.clear();
|
|
503
|
+
this.treeMap.clear();
|
|
504
|
+
this.nodes.forEach((node) => removeChild(node));
|
|
505
|
+
this.nodes = [];
|
|
506
|
+
this.mounted = false;
|
|
507
|
+
}
|
|
493
508
|
mapNodeTree(parent, tree) {
|
|
494
509
|
let index = 1;
|
|
495
510
|
this.treeMap.set(0, parent);
|
package/dist/template.esm.js
CHANGED
|
@@ -2,13 +2,13 @@ import { isString, isFunction, isArray, isNil, startsWith, capitalizeFirstLetter
|
|
|
2
2
|
import { isSignal, useSignal, useEffect, signalObject, useReactive } from '@estjs/signal';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* @estjs/template v0.0.
|
|
5
|
+
* @estjs/template v0.0.11
|
|
6
6
|
* (c) 2023-Present jiangxd <jiangxd2016@gmail.com>
|
|
7
7
|
* @license MIT
|
|
8
8
|
**/
|
|
9
|
-
var N=class N{constructor(e,n){this.template=e;this.props=n;this.proxyProps={};this.context={};this.emitter=new Set;this.mounted=!1;this.rootNode=null;this.hooks={mounted:new Set,destroy:new Set};this.trackMap=new Map;this.proxyProps=signalObject(n,o=>startsWith(o,"on")||startsWith(o,"update"));}addEventListener(){}removeEventListener(){}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}addHook(e,n){var o;(o=this.hooks[e])==null||o.add(n);}getContext(e){return N.context[e]}setContext(e,n){N.context[e]=n;}inheritNode(e){this.context=e.context,this.hooks=e.hooks,Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap;let n=this.props;this.props=e.props,this.patchProps(n);}mount(e,n){var r,
|
|
10
|
-
and cannot be used in asynchronous or deferred calls.`);}function
|
|
9
|
+
var N=class N{constructor(e,n){this.template=e;this.props=n;this.proxyProps={};this.context={};this.emitter=new Set;this.mounted=!1;this.rootNode=null;this.hooks={mounted:new Set,destroy:new Set};this.trackMap=new Map;this.proxyProps=signalObject(n,o=>startsWith(o,"on")||startsWith(o,"update"));}addEventListener(){}removeEventListener(){}get firstChild(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.firstChild)!=null?n:null}get isConnected(){var e,n;return (n=(e=this.rootNode)==null?void 0:e.isConnected)!=null?n:!1}addHook(e,n){var o;(o=this.hooks[e])==null||o.add(n);}getContext(e){return N.context[e]}setContext(e,n){N.context[e]=n;}inheritNode(e){this.context=e.context,this.hooks=e.hooks,Object.assign(this.proxyProps,e.proxyProps),this.rootNode=e.rootNode,this.trackMap=e.trackMap;let n=this.props;this.props=e.props,this.patchProps(n);}mount(e,n){var r,s,c,i;if(!isFunction(this.template))throw new Error("Template must be a function");if(this.isConnected)return (s=(r=this.rootNode)==null?void 0:r.mount(e,n))!=null?s:[];N.ref=this,this.rootNode=this.template(useReactive(this.proxyProps,["children"])),N.ref=null,this.mounted=!0;let o=(i=(c=this.rootNode)==null?void 0:c.mount(e,n))!=null?i:[];return this.hooks.mounted.forEach(a=>a()),this.patchProps(this.props),o}unmount(){var e;this.hooks.destroy.forEach(n=>n()),Object.values(this.hooks).forEach(n=>n.clear()),(e=this.rootNode)==null||e.unmount(),this.rootNode=null,this.proxyProps={},this.mounted=!1,this.emitter.forEach(n=>n());}getNodeTrack(e,n){let o=this.trackMap.get(e);return o||(o={cleanup:()=>{}},this.trackMap.set(e,o)),n||o.cleanup(),o}patchProps(e){var n,o,r,s,c;for(let[i,a]of Object.entries(e))if(startsWith(i,"on")&&((n=this.rootNode)!=null&&n.nodes)){let u=i.slice(2).toLowerCase(),l=a,d=m(this.rootNode.nodes[0],u,l);this.emitter.add(d);}else if(i==="ref")isSignal(a)?e[i].value=(o=this.rootNode)==null?void 0:o.nodes[0]:isFunction(a)&&e[i]((r=this.rootNode)==null?void 0:r.nodes[0]);else if(startsWith(i,"update"))e[i]=isSignal(a)?a.value:a;else if(i!=="children"){let u=(c=(s=this.proxyProps)[i])!=null?c:s[i]=useSignal(a),l=this.getNodeTrack(i);l.cleanup=useEffect(()=>{u.value=isFunction(a)?a():a;});}this.props=e;}};N.ref=null,N.context={};var f=N;function ie(t,e){return isString(t)&&(O(t)&&(t=X(t),e={1:e}),t===""&&(e={0:e}),t=J(t)),isFunction(t)?new f(t,e):new E(t,e)}function h(t){return t instanceof f||t instanceof E}function J(t){t=F(t);let e=document.createElement("template");return e.innerHTML=t,e}function ce(t){return t.children}var D="area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr",le="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";function w(t){if(h(t)||t instanceof Node)return t;let e=isFalsy(t)?"":String(t);return document.createTextNode(e)}function g(t,e,n=null){let o=h(n)?n.firstChild:n;h(e)?e.mount(t,o):o?o.before(e):t.append(e);}function x(t){h(t)?t.unmount():t.parentNode&&t.remove();}function A(t,e,n){g(t,e,n),x(n);}function H(t,e,n){if(e==="class"){typeof n=="string"?t.className=n:Array.isArray(n)?t.className=n.join(" "):n&&typeof n=="object"&&(t.className=Object.entries(n).reduce((o,[r,s])=>o+(s?` ${r}`:""),"").trim());return}if(e==="style"){if(typeof n=="string")t.style.cssText=n;else if(n&&typeof n=="object"){let o=n;Object.keys(o).forEach(r=>{t.style.setProperty(kebabCase(r),String(o[r]));});}return}isFalsy(n)?t.removeAttribute(e):n===!0?t.setAttribute(e,""):t instanceof HTMLInputElement?t.value=String(n):t.setAttribute(e,String(n));}function q(t,e){if(t instanceof HTMLInputElement)switch(t.type){case"checkbox":return m(t,"change",()=>{e(!!t.checked);});case"date":return m(t,"change",()=>{e(t.value?t.value:"");});case"file":return m(t,"change",()=>{t.files&&e(t.files);});case"number":return m(t,"input",()=>{let n=Number.parseFloat(t.value);e(Number.isNaN(n)?"":String(n));});case"radio":return m(t,"change",()=>{e(t.checked?t.value:"");});case"text":return m(t,"input",()=>{e(t.value);})}if(t instanceof HTMLSelectElement)return m(t,"change",()=>{e(t.value);});if(t instanceof HTMLTextAreaElement)return m(t,"input",()=>{e(t.value);})}var V=Promise.resolve();function ue(t){return t?V.then(t):V}function m(t,e,n){return t.addEventListener(e,n),()=>t.removeEventListener(e,n)}function F(t){let e=D.split(","),n=[],o=[],r=/<\/?([\da-z-]+)([^>]*)>/gi,s=0;for(;;){let c=r.exec(t);if(!c)break;let[i,a]=c,u=i[1]==="/";if(o.push(t.slice(s,c.index)),s=c.index+i.length,u){for(;n.length>0&&n[n.length-1]!==a;){let l=n.pop();l&&o.push(`</${l}>`);}n.length>0&&n.pop();}else e.includes(a)||n.push(a);o.push(i);}for(o.push(t.slice(s));n.length>0;){let c=n.pop();c&&o.push(`</${c}>`);}return o.join("")}function O(t){return le.split(",").includes(t)}function X(t){return D.split(",").includes(t)?`<${t}/>`:`<${t}></${t}>`}function z(){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e="",n=t.length;for(let o=0;o<8;o++)e+=t.charAt(Math.floor(Math.random()*n));return e}function G(t,e,n,o){let r=new Map,s=Array.from(e.values()),c=s.length;if(e.size>0&&n.length===0){if(t.childNodes.length===c+(o?1:0))t.innerHTML="",o&&g(t,o);else {let l=document.createRange(),d=s[0],p=h(d)?d.firstChild:d;l.setStartBefore(p),o?l.setEndBefore(o):l.setEndAfter(t),l.deleteContents();}return s.forEach(l=>{h(l)&&l.unmount();}),r}let i=[],a=pe(n),u=0;for(let[l,d]of n.entries()){let p=s[u],b=k(p,l);for(;p&&!a.has(b);)x(p),e.delete(b),p=s[++u],b=k(p,l);let P=k(d,l),L=e.get(P);if(L&&(d=de(t,L,d)),p)if(p===L)u++;else {let R=document.createComment("");g(t,R,p),i.push([R,d]);}else g(t,d,o);r.set(P,d);}return i.forEach(([l,d])=>A(t,d,l)),e.forEach((l,d)=>{l.isConnected&&!r.has(d)&&x(l);}),r}function de(t,e,n){return e===n?e:h(e)&&h(n)&&e.template===n.template?(n.inheritNode(e),n):e instanceof Text&&n instanceof Text?(e.textContent!==n.textContent&&(e.textContent=n.textContent),e):(A(t,n,e),n)}function pe(t){let e=new Map;for(let[n,o]of t.entries()){let r=k(o,n);e.set(r,o);}return e}function k(t,e){if(h(t)){let n=t.key;if(n!=null)return String(n)}return `_$${e}$`}var E=class t{constructor(e,n,o){this.template=e;this.props=n;this.key=o;this.treeMap=new Map;this.mounted=!1;this.nodes=[];this.provides={};this.trackMap=new Map;this.parent=null;}get firstChild(){var e;return (e=this.nodes[0])!=null?e:null}get isConnected(){return this.mounted}addEventListener(){}removeEventListener(){}mount(e,n){var s;if(this.parent=e,this.isConnected)return this.nodes.forEach(c=>g(e,c,n)),this.nodes;this.key=this.key||z();let o=this.template.content.cloneNode(!0),r=o.firstChild;return (s=r==null?void 0:r.hasAttribute)!=null&&s.call(r,"_svg_")&&(r.remove(),r==null||r.childNodes.forEach(c=>{o.append(c);})),this.nodes=Array.from(o.childNodes),this.mapNodeTree(e,o),g(e,o,n),this.patchNodes(this.props),this.mounted=!0,this.nodes}unmount(){this.trackMap.forEach(e=>{var n,o;(n=e.cleanup)==null||n.call(e),(o=e.lastNodes)==null||o.forEach(r=>{e.isRoot?x(r):r instanceof t&&r.unmount();});}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>x(e)),this.nodes=[],this.mounted=!1;}mapNodeTree(e,n){let o=1;this.treeMap.set(0,e);let r=s=>{s.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&this.treeMap.set(o++,s);let c=s.firstChild;for(;c;)r(c),c=c.nextSibling;};r(n);}patchNodes(e){for(let n in e){let o=Number(n),r=this.treeMap.get(o);if(r){let s=this.props[n];this.patchNode(n,r,s,o===0);}}this.props=e;}getNodeTrack(e,n,o){var s;let r=this.trackMap.get(e);return r||(r={cleanup:()=>{}},n&&(r.lastNodes=new Map),o&&(r.isRoot=!0),this.trackMap.set(e,r)),(s=r.cleanup)==null||s.call(r),r}inheritNode(e){this.mounted=e.mounted,this.nodes=e.nodes,this.trackMap=e.trackMap,this.treeMap=e.treeMap;let n=this.props;this.props=e.props,this.patchNodes(n);}patchNode(e,n,o,r){for(let s in o)if(s==="children"&&o.children)if(isArray(o.children))o.children.filter(Boolean).forEach((c,i)=>{var b;let[a,u]=isArray(c)?c:[c,null],l=isNil(u)?null:(b=this.treeMap.get(u))!=null?b:null,d=`${e}:${s}:${i}`,p=this.getNodeTrack(d,!0,r);Z(p,n,a,l);});else {let c=`${e}:${s}:0`,i=this.getNodeTrack(c,!0,r);Z(i,n,o.children,null);}else if(s==="ref")isSignal(o[s])?o[s].value=n:isFunction(o[s])&&o[s](n);else if(startsWith(s,"on")){let c=s.slice(2).toLocaleLowerCase(),i=this.getNodeTrack(`${e}:${s}`),a=o[s];i.cleanup=m(n,c,a);}else if(!startsWith(s,"update")){let c=this.getNodeTrack(`${e}:${s}`),i=o[s],a=isSignal(i)?i:useSignal(i);Y(c,n,s,a.value);let u=useEffect(()=>{a.value=isSignal(i)?i.value:i,Y(c,n,s,a.value);}),l,d=`update${capitalizeFirstLetter(s)}`;o[d]&&(l=q(n,p=>{o[d](p);})),c.cleanup=()=>{u&&u(),l&&l();};}}};function Y(t,e,n,o){let r=e;r.setAttribute&&(isFunction(o)?t.cleanup=useEffect(()=>{H(r,n,o());}):H(r,n,o));}function Z(t,e,n,o){isFunction(n)?t.cleanup=useEffect(()=>{let r=coerceArray(n()).map(w);t.lastNodes=G(e,t.lastNodes,r,o);}):coerceArray(n).forEach((r,s)=>{let c=w(r);t.lastNodes.set(String(s),c),g(e,c,o);});}function ge(t){var e;C("onMounted"),(e=f.ref)==null||e.addHook("mounted",t);}function Ne(t){var e;C("onDestroy"),(e=f.ref)==null||e.addHook("destroy",t);}function C(t){f.ref||console.error(`"${t}" can only be called within the component function body
|
|
10
|
+
and cannot be used in asynchronous or deferred calls.`);}function ye(t,e){var n;C("useProvide"),(n=f.ref)==null||n.setContext(t,e);}function Te(t,e){var n;return C("useInject"),((n=f.ref)==null?void 0:n.getContext(t))||e}function Ee(t){return Object.entries(t).map(([e,n])=>`${e}=${JSON.stringify(escape(String(n)))}`).join(" ")}function M(t,e){if(isFunction(t))return t(e);let n=Array.isArray(t)?t.reduce((s,c,i)=>(s[i+1]={template:c},s),{}):t,o={},r={};if(isObject(n))for(let[s,c]of Object.entries(n)){let i=e[s];if(i){for(let a in i)startsWith(a,"on")&&isFunction(i[a])&&delete i[a];if(i.children){for(let[a,u]of i.children)o[u]||(o[u]=[]),o[u].push(a);delete i.children;}}r[s]={template:c.template,props:i};}return Object.entries(r).map(([s,{template:c,props:i}])=>{let a=c;return i&&(a+=` ${Ee(i)}`),o[s]&&(a+=o[s].map(u=>M(u,i)).join("")),a}).join("")}function ve(t,e){return M(t,e)}function ke(t,e,n={}){e.innerHTML=M(t,n);}
|
|
11
11
|
|
|
12
|
-
export { f as ComponentNode,
|
|
12
|
+
export { f as ComponentNode, ce as Fragment, E as TemplateNode, ie as h, h as isJsxElement, ue as nextTick, Ne as onDestroy, ge as onMount, ke as renderSSG, M as renderTemplate, ve as renderToString, J as template, Te as useInject, ye as useProvide };
|
|
13
13
|
//# sourceMappingURL=template.esm.js.map
|
|
14
14
|
//# sourceMappingURL=template.esm.js.map
|
package/dist/template.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/component-node.ts","../src/template.ts","../src/utils.ts","../src/patch.ts","../src/template-node.ts","../src/hooks.ts","../src/server.ts"],"names":["_ComponentNode","template","props","signalObject","key","startsWith","_a","_b","hook","cb","context","value","node","parent","before","_c","_d","isFunction","useReactive","mountedNode","handler","set","emitter","trackKey","suppressCleanupCall","track","_e","prop","event","listener","cleanup","addEventListener","isSignal","newValue","useSignal","useEffect","ComponentNode","h","_template","isString","isHtmlTagName","convertToHtmlTag","TemplateNode","isJsxElement","html","closeHtmlTags","Fragment","selfClosingTags","htmlTags","coerceNode","data","text","isFalsy","insertChild","child","beforeNode","removeChild","replaceChild","setAttribute","element","attr","acc","obj","kebabCase","binNode","setter","p","nextTick","fn","eventName","input","selfClosingTagList","tagStack","output","tagPattern","lastIndex","match","fullMatch","tagName","isEndTag","unclosedTag","patchChildren","childrenMap","nextChildren","result","children","childrenLength","range","start","replaces","nextChildrenMap","mapKeys","childIndex","i","currChild","currKey","getKey","origChild","patch","placeholder","next","index","id","_TemplateNode","cloneNode","firstChild","tree","walk","trackLastNodes","isRoot","isArray","item","path","isNil","patchChild","val","triggerValue","patchAttribute","cleanupBind","updateKey","capitalizeFirstLetter","nextNodes","coerceArray","newNode","onMount","throwIfOutsideComponent","onDestroy","useProvide","useInject","defaultValue","convertJsonToAttributes","json","renderTemplate","templateCollection","tmpl","childNodesMap","processedTemplates","isObject","propKey","idx","renderedString","renderToString","component","renderSSG","root"],"mappings":"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","file":"template.esm.js","sourcesContent":["import { isFunction, startsWith } from '@estjs/shared';\nimport { isSignal, signalObject } from '@estjs/signal';\nimport { type Signal, useEffect, useReactive, useSignal } from '@estjs/signal';\nimport { addEventListener } from './utils';\nimport type { EssorComponent, NodeTrack } from '../types';\nimport type { TemplateNode } from './template-node';\nimport type { Listener } from './utils';\nexport type Hook = 'mounted' | 'destroy';\n\nexport class ComponentNode implements JSX.Element {\n constructor(\n public template: EssorComponent,\n public props: Record<string, any>,\n ) {\n this.proxyProps = signalObject(\n props,\n key => startsWith(key, 'on') || startsWith(key, 'update'),\n );\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: ComponentNode | null = null;\n static context: Record<symbol, Signal<any>> = {};\n id?: string;\n private proxyProps: Record<string, Signal<any>> = {};\n context: Record<symbol | string | number, any> = {};\n emitter = new Set<Function>();\n mounted = false;\n rootNode: TemplateNode | null = null;\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n private trackMap = new Map<string, NodeTrack>();\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 addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n getContext<T>(context: symbol | string | number): T | undefined {\n return ComponentNode.context[context];\n }\n\n setContext<T>(context: symbol | string | number, value: T): void {\n ComponentNode.context[context] = value;\n }\n\n inheritNode(node: ComponentNode): void {\n this.context = node.context;\n this.hooks = node.hooks;\n\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n\n // patch props\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\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 ComponentNode.ref = this;\n this.rootNode = this.template(useReactive(this.proxyProps, ['children']));\n ComponentNode.ref = null;\n this.mounted = true;\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.hooks.mounted.forEach(handler => handler());\n this.patchProps(this.props);\n\n return mountedNode;\n }\n\n unmount(): void {\n this.hooks.destroy.forEach(handler => handler());\n Object.values(this.hooks).forEach(set => set.clear());\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.mounted = false;\n this.emitter.forEach(emitter => emitter());\n }\n\n private getNodeTrack(trackKey: string, suppressCleanupCall?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n if (!suppressCleanupCall) {\n track.cleanup();\n }\n return track;\n }\n\n patchProps(props: Record<string, any>) {\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, 'on') && this.rootNode?.nodes) {\n const event = key.slice(2).toLowerCase();\n const listener = prop as Listener<unknown>;\n const cleanup = addEventListener(this.rootNode.nodes[0], event, listener);\n this.emitter.add(cleanup);\n } else if (key === 'ref') {\n if (isSignal(prop)) {\n (props[key] as any).value = this.rootNode?.nodes[0];\n } else if (isFunction(prop)) {\n (props[key] as Function)(this.rootNode?.nodes[0]);\n }\n } else if (startsWith(key, 'update')) {\n props[key] = isSignal(prop) ? prop.value : prop;\n } else if (key !== 'children') {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = isFunction(prop) ? prop() : prop;\n });\n }\n }\n this.props = props;\n }\n}\n","import { isFunction, isString } from '@estjs/shared';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport type { EssorComponent, EssorNode } from '../types';\n\nexport function h<K extends keyof HTMLElementTagNameMap>(\n _template: EssorComponent | HTMLTemplateElement | K | '',\n props: Record<string, any>,\n): JSX.Element {\n if (isString(_template)) {\n if (isHtmlTagName(_template)) {\n (_template as string) = convertToHtmlTag(_template as string);\n props = {\n 1: props,\n };\n }\n if (_template === '') {\n props = {\n 0: props,\n };\n }\n\n _template = template(_template as string);\n }\n\n return isFunction(_template)\n ? new ComponentNode(_template, props)\n : new TemplateNode(_template as HTMLTemplateElement, props);\n}\n\nexport function isComponentOf(node: unknown, component: EssorComponent) {\n return node instanceof ComponentNode && node.template === component;\n}\n\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\nexport function template(html: string): HTMLTemplateElement {\n html = closeHtmlTags(html);\n const template = document.createElement('template');\n template.innerHTML = html;\n return template;\n}\nexport function Fragment(props: { children: JSX.Element }) {\n return props.children;\n}\n","import { isFalsy, kebabCase } from '@estjs/shared';\nimport { isJsxElement } from './template';\n\nconst selfClosingTags = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';\nconst htmlTags =\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';\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) {\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 if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n } else if (beforeNode) {\n (beforeNode as HTMLElement).before(child);\n } else {\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 if (typeof value === 'string') {\n element.className = value;\n } else if (Array.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 return;\n }\n\n if (attr === 'style') {\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\n Object.keys(obj).forEach(key => {\n element.style.setProperty(kebabCase(key), String(obj[key]));\n });\n }\n return;\n }\n\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement) {\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 binNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const selfClosingTagList = selfClosingTags.split(',');\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!selfClosingTagList.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): boolean {\n const htmlTagsList = htmlTags.split(',');\n return htmlTagsList.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 const selfClosingTagList = selfClosingTags.split(',');\n if (selfClosingTagList.includes(tagName)) {\n return `<${tagName}/>`;\n } else {\n return `<${tagName}></${tagName}>`;\n }\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './template';\n\ntype AnyNode = Node | JSX.Element;\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 const childrenLength = children.length;\n\n if (childrenMap.size > 0 && nextChildren.length === 0) {\n if (parent.childNodes.length === childrenLength + (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 return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\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 (origChild) {\n child = patch(parent, origChild, child);\n }\n\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 replaces.forEach(([placeholder, child]) => replaceChild(parent, child, placeholder));\n\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\nfunction 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\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\nexport function getKey(node, index): string {\n const id = node instanceof Element ? node.id : undefined;\n const result = id === '' ? undefined : id;\n return result ?? `_$${index}$`;\n}\n","import {\n capitalizeFirstLetter,\n coerceArray,\n isArray,\n isFunction,\n isNil,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, useEffect, useSignal } from '@estjs/signal';\nimport {\n addEventListener,\n binNode,\n coerceNode,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { patchChildren } from './patch';\nimport type { NodeTrack } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n treeMap = new Map<number, Node>();\n constructor(\n public template: HTMLTemplateElement,\n public props: Record<string, unknown>,\n ) {}\n\n mounted = false;\n nodes: Node[] = [];\n provides: Record<string, unknown> = {};\n trackMap = new Map<string, NodeTrack>();\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n track.lastNodes?.forEach(node => {\n if (track.isRoot) {\n removeChild(node);\n } else if (node instanceof TemplateNode) {\n node.unmount();\n }\n });\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n this.nodes = [];\n this.mounted = false;\n }\n\n parent: Node | null = null;\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n 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 this.mapNodeTree(parent, cloneNode);\n\n insertChild(parent, cloneNode, before);\n\n this.patchNodes(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n mapNodeTree(parent: Node, tree: Node) {\n let index = 1;\n this.treeMap.set(0, parent);\n const walk = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n }\n let child = node.firstChild;\n while (child) {\n walk(child);\n child = child.nextSibling;\n }\n };\n walk(tree);\n }\n\n patchNodes(props) {\n for (const key in props) {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n const value = this.props[key];\n this.patchNode(key, node, value, index === 0);\n }\n }\n this.props = props;\n }\n\n getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n 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\n const props = this.props;\n this.props = node.props;\n this.patchNodes(props);\n }\n\n patchNode(key, node, props, isRoot) {\n for (const attr in props) {\n if (attr === 'children' && props.children) {\n if (!isArray(props.children)) {\n const trackKey = `${key}:${attr}:${0}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n patchChild(track, node, props.children, null);\n } else {\n props.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}:${attr}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n patchChild(track, node, child, before);\n });\n }\n } else if (attr === 'ref') {\n if (isSignal(props[attr])) {\n props[attr].value = node;\n } else if (isFunction(props[attr])) {\n (props[attr] as Function)(node);\n }\n }\n // handle events\n else if (startsWith(attr, 'on')) {\n const eventName = attr.slice(2).toLocaleLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n const listener = props[attr];\n track.cleanup = addEventListener(node, eventName, listener);\n // attr\n } else if (!startsWith(attr, 'update')) {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n const val = props[attr];\n\n const triggerValue = isSignal(val) ? val : useSignal(val);\n patchAttribute(track, node, attr, triggerValue.value);\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(val) ? val.value : val;\n patchAttribute(track, node, attr, triggerValue.value);\n });\n\n let cleanupBind;\n const updateKey = `update${capitalizeFirstLetter(attr)}`;\n if (props[updateKey]) {\n cleanupBind = binNode(node, value => {\n props[updateKey](value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n }\n }\n}\n\nfunction patchAttribute(track: NodeTrack, node: Node, attr: string, data: unknown): void {\n const element = node as HTMLElement;\n if (!element.setAttribute) {\n return;\n }\n if (isFunction(data)) {\n track.cleanup = useEffect(() => {\n setAttribute(element, attr, data());\n });\n } else {\n setAttribute(element, attr, data);\n }\n}\n\nfunction patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode);\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n });\n } else {\n coerceArray(child).forEach((node, i) => {\n const newNode = coerceNode(node);\n track.lastNodes!.set(String(i), newNode);\n insertChild(parent, newNode, before);\n });\n }\n}\n","import { ComponentNode } from './component-node';\n\nexport function onMount(cb: () => void): void {\n throwIfOutsideComponent('onMounted');\n ComponentNode.ref?.addHook('mounted', cb);\n}\n\nexport function onDestroy(cb: () => void): void {\n throwIfOutsideComponent('onDestroy');\n ComponentNode.ref?.addHook('destroy', cb);\n}\n\nfunction throwIfOutsideComponent(hook: string) {\n if (!ComponentNode.ref) {\n console.error(\n `\"${hook}\" can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\nexport function getCurrentComponent(): ComponentNode | null {\n return ComponentNode.ref;\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\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n) {\n throwIfOutsideComponent('useProvide');\n\n ComponentNode.ref?.setContext(key as string, value);\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 throwIfOutsideComponent('useInject');\n return ComponentNode.ref?.getContext(key as string) || defaultValue;\n}\n\n// export function useProps(props) {\n// const propsValue = props;\n// const propsAction = () => {};\n// const propsRef = () => {};\n// const propsChild = () => {};\n// }\n","import { isFunction, isObject, startsWith } from '@estjs/shared';\nimport type { EssorNode } from '../types';\n\ninterface TemplateEntry {\n template: string;\n props?: Record<string, any>;\n}\n\ninterface TemplateCollection {\n [key: number]: TemplateEntry;\n}\n\ntype Props = Record<string, any>;\n\n/**\n * Converts a JSON object to a string of HTML attributes.\n * @param json - The JSON object to be converted.\n * @returns A string representing the HTML attributes.\n */\nfunction convertJsonToAttributes(json: Record<string, any>): string {\n return Object.entries(json)\n .map(([key, value]) => `${key}=${JSON.stringify(escape(String(value)))}`)\n .join(' ');\n}\n\n/**\n * Renders a template to a string based on provided props.\n * Handles both function-based and object-based templates.\n * @param template - The template to render, which can be an array, an object, or a function.\n * @param props - The properties used for rendering the template.\n * @returns The rendered template as a string.\n */\nexport function renderTemplate(template: string[] | EssorNode | Function, props: Props): string {\n // If the template is a function, invoke it with props and return the result\n if (isFunction(template)) {\n return template(props);\n }\n\n // Convert array-based templates to TemplateCollection format\n const templateCollection: TemplateCollection = Array.isArray(template)\n ? template.reduce((acc, tmpl, index) => {\n acc[index + 1] = { template: tmpl };\n return acc;\n }, {})\n : template;\n\n const childNodesMap: Record<string, EssorNode[]> = {};\n const processedTemplates: TemplateCollection = {};\n\n if (isObject(templateCollection)) {\n for (const [key, tmpl] of Object.entries(templateCollection)) {\n const prop = props[key];\n if (prop) {\n // Remove event listeners (props starting with 'on') from the properties\n for (const propKey in prop) {\n if (startsWith(propKey, 'on') && isFunction(prop[propKey])) {\n delete prop[propKey];\n }\n }\n\n // Handle child elements if present\n if (prop.children) {\n for (const [child, idx] of prop.children) {\n if (!childNodesMap[idx]) childNodesMap[idx] = [];\n childNodesMap[idx].push(child);\n }\n delete prop.children;\n }\n }\n\n // Store the processed template and associated props\n processedTemplates[key] = { template: tmpl.template, props: prop };\n }\n }\n\n // Render the final template as a string\n return Object.entries(processedTemplates)\n .map(([key, { template: tmpl, props: prop }]) => {\n let renderedString = tmpl;\n if (prop) {\n renderedString += ` ${convertJsonToAttributes(prop)}`;\n }\n if (childNodesMap[key]) {\n renderedString += childNodesMap[key].map(child => renderTemplate(child, prop)).join('');\n }\n\n return renderedString;\n })\n .join('');\n}\n\n/**\n * Renders a component to a string using the given properties.\n * @param component - The component function to be rendered.\n * @param props - The properties to be passed to the component.\n * @returns The rendered component as a string.\n */\nexport function renderToString(component: (...args: any[]) => string, props: Props): string {\n return renderTemplate(component, props);\n}\n\n/**\n * Renders a component to a string and sets it as the innerHTML of the specified root element.\n * @param component - The component function to be rendered.\n * @param root - The root element in which to render the component.\n * @param props - The properties to be passed to the component.\n */\nexport function renderSSG(component, root: HTMLElement, props: Props = {}): void {\n root.innerHTML = renderTemplate(component, props);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/component-node.ts","../src/template.ts","../src/utils.ts","../src/patch.ts","../src/template-node.ts","../src/hooks.ts","../src/server.ts"],"names":["_ComponentNode","template","props","signalObject","key","startsWith","_a","_b","hook","cb","context","value","node","parent","before","_c","_d","isFunction","useReactive","mountedNode","handler","set","emitter","trackKey","suppressCleanupCall","track","_e","prop","event","listener","cleanup","addEventListener","isSignal","newValue","useSignal","useEffect","ComponentNode","h","_template","isString","isHtmlTagName","convertToHtmlTag","TemplateNode","isJsxElement","html","closeHtmlTags","Fragment","selfClosingTags","htmlTags","coerceNode","data","text","isFalsy","insertChild","child","beforeNode","removeChild","replaceChild","setAttribute","element","attr","acc","obj","kebabCase","binNode","setter","p","nextTick","fn","eventName","input","selfClosingTagList","tagStack","output","tagPattern","lastIndex","match","fullMatch","tagName","isEndTag","unclosedTag","generateShortId","characters","result","charactersLength","i","patchChildren","childrenMap","nextChildren","children","childrenLength","range","start","replaces","nextChildrenMap","mapKeys","childIndex","currChild","currKey","getKey","origChild","patch","placeholder","next","index","jsxKey","_TemplateNode","cloneNode","firstChild","tree","walk","trackLastNodes","isRoot","isArray","item","path","isNil","patchChild","val","triggerValue","patchAttribute","cleanupBind","updateKey","capitalizeFirstLetter","nextNodes","coerceArray","newNode","onMount","throwIfOutsideComponent","onDestroy","useProvide","useInject","defaultValue","convertJsonToAttributes","json","renderTemplate","templateCollection","tmpl","childNodesMap","processedTemplates","isObject","propKey","idx","renderedString","renderToString","component","renderSSG","root"],"mappings":"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","file":"template.esm.js","sourcesContent":["import { isFunction, startsWith } from '@estjs/shared';\nimport { isSignal, signalObject } from '@estjs/signal';\nimport { type Signal, useEffect, useReactive, useSignal } from '@estjs/signal';\nimport { addEventListener } from './utils';\nimport type { EssorComponent, NodeTrack } from '../types';\nimport type { TemplateNode } from './template-node';\nimport type { Listener } from './utils';\nexport type Hook = 'mounted' | 'destroy';\n\nexport class ComponentNode implements JSX.Element {\n constructor(\n public template: EssorComponent,\n public props: Record<string, any>,\n ) {\n this.proxyProps = signalObject(\n props,\n key => startsWith(key, 'on') || startsWith(key, 'update'),\n );\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: ComponentNode | null = null;\n static context: Record<symbol, Signal<any>> = {};\n id?: string;\n private proxyProps: Record<string, Signal<any>> = {};\n context: Record<symbol | string | number, any> = {};\n emitter = new Set<Function>();\n mounted = false;\n rootNode: TemplateNode | null = null;\n hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n private trackMap = new Map<string, NodeTrack>();\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 addHook(hook: Hook, cb: () => void): void {\n this.hooks[hook]?.add(cb);\n }\n\n getContext<T>(context: symbol | string | number): T | undefined {\n return ComponentNode.context[context];\n }\n\n setContext<T>(context: symbol | string | number, value: T): void {\n ComponentNode.context[context] = value;\n }\n\n inheritNode(node: ComponentNode): void {\n this.context = node.context;\n this.hooks = node.hooks;\n\n Object.assign(this.proxyProps, node.proxyProps);\n this.rootNode = node.rootNode;\n this.trackMap = node.trackMap;\n\n // patch props\n const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\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 ComponentNode.ref = this;\n this.rootNode = this.template(useReactive(this.proxyProps, ['children']));\n ComponentNode.ref = null;\n this.mounted = true;\n const mountedNode = this.rootNode?.mount(parent, before) ?? [];\n this.hooks.mounted.forEach(handler => handler());\n this.patchProps(this.props);\n\n return mountedNode;\n }\n\n unmount(): void {\n this.hooks.destroy.forEach(handler => handler());\n Object.values(this.hooks).forEach(set => set.clear());\n this.rootNode?.unmount();\n this.rootNode = null;\n this.proxyProps = {};\n this.mounted = false;\n this.emitter.forEach(emitter => emitter());\n }\n\n private getNodeTrack(trackKey: string, suppressCleanupCall?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n this.trackMap.set(trackKey, track);\n }\n if (!suppressCleanupCall) {\n track.cleanup();\n }\n return track;\n }\n\n patchProps(props: Record<string, any>) {\n for (const [key, prop] of Object.entries(props)) {\n if (startsWith(key, 'on') && this.rootNode?.nodes) {\n const event = key.slice(2).toLowerCase();\n const listener = prop as Listener<unknown>;\n const cleanup = addEventListener(this.rootNode.nodes[0], event, listener);\n this.emitter.add(cleanup);\n } else if (key === 'ref') {\n if (isSignal(prop)) {\n (props[key] as any).value = this.rootNode?.nodes[0];\n } else if (isFunction(prop)) {\n (props[key] as Function)(this.rootNode?.nodes[0]);\n }\n } else if (startsWith(key, 'update')) {\n props[key] = isSignal(prop) ? prop.value : prop;\n } else if (key !== 'children') {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = isFunction(prop) ? prop() : prop;\n });\n }\n }\n this.props = props;\n }\n}\n","import { isFunction, isString } from '@estjs/shared';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport { closeHtmlTags, convertToHtmlTag, isHtmlTagName } from './utils';\nimport type { EssorComponent, EssorNode } from '../types';\n\nexport function h<K extends keyof HTMLElementTagNameMap>(\n _template: EssorComponent | HTMLTemplateElement | K | '',\n props: Record<string, any>,\n): JSX.Element {\n if (isString(_template)) {\n if (isHtmlTagName(_template)) {\n (_template as string) = convertToHtmlTag(_template as string);\n props = {\n 1: props,\n };\n }\n if (_template === '') {\n props = {\n 0: props,\n };\n }\n\n _template = template(_template as string);\n }\n\n return isFunction(_template)\n ? new ComponentNode(_template, props)\n : new TemplateNode(_template as HTMLTemplateElement, props);\n}\n\nexport function isComponentOf(node: unknown, component: EssorComponent) {\n return node instanceof ComponentNode && node.template === component;\n}\n\nexport function isJsxElement(node: unknown): node is EssorNode {\n return node instanceof ComponentNode || node instanceof TemplateNode;\n}\n\nexport function template(html: string): HTMLTemplateElement {\n html = closeHtmlTags(html);\n const template = document.createElement('template');\n template.innerHTML = html;\n return template;\n}\nexport function Fragment(props: { children: JSX.Element }) {\n return props.children;\n}\n","import { isFalsy, kebabCase } from '@estjs/shared';\nimport { isJsxElement } from './template';\n\nconst selfClosingTags = 'area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr';\nconst htmlTags =\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';\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) {\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 if (isJsxElement(child)) {\n child.mount(parent, beforeNode);\n } else if (beforeNode) {\n (beforeNode as HTMLElement).before(child);\n } else {\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 if (typeof value === 'string') {\n element.className = value;\n } else if (Array.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 return;\n }\n\n if (attr === 'style') {\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\n Object.keys(obj).forEach(key => {\n element.style.setProperty(kebabCase(key), String(obj[key]));\n });\n }\n return;\n }\n\n if (isFalsy(value)) {\n element.removeAttribute(attr);\n } else if (value === true) {\n element.setAttribute(attr, '');\n } else {\n if (element instanceof HTMLInputElement) {\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 binNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n switch (node.type) {\n case 'checkbox':\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n case 'date':\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n case 'file':\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n case 'number':\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n case 'radio':\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n case 'text':\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n }\n\n if (node instanceof HTMLSelectElement) {\n return addEventListener(node, 'change', () => {\n setter(node.value);\n });\n }\n\n if (node instanceof HTMLTextAreaElement) {\n return addEventListener(node, 'input', () => {\n setter(node.value);\n });\n }\n}\n\n/**\n * Defers the execution of a function until the next tick of the event loop.\n * @param fn - The function to be executed on the next tick.\n * @returns A Promise that resolves after the next tick.\n */\nconst p = Promise.resolve();\nexport function nextTick(fn?: () => void): Promise<void> {\n return fn ? p.then(fn) : p;\n}\n\nexport type Listener<T> = (value: T) => void;\n\nexport interface EventTarget {\n addEventListener(type: string, listener: Listener<unknown>): void;\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\n\n/**\n * Adds an event listener to a DOM node and returns a function to remove it.\n * @param node - The target node to add the event listener to.\n * @param eventName - The name of the event.\n * @param handler - The event handler function.\n * @returns A function to remove the event listener.\n */\nexport function addEventListener(\n node: EventTarget,\n eventName: string,\n handler: Listener<any>,\n): () => void {\n node.addEventListener(eventName, handler);\n return () => node.removeEventListener(eventName, handler);\n}\n\n/**\n * Closes unclosed HTML tags in a given input string.\n * @param input - The input HTML string to process.\n * @returns The HTML string with unclosed tags properly closed.\n */\nexport function closeHtmlTags(input: string): string {\n const selfClosingTagList = selfClosingTags.split(',');\n const tagStack: string[] = [];\n const output: string[] = [];\n const tagPattern = /<\\/?([\\da-z-]+)([^>]*)>/gi;\n let lastIndex = 0;\n\n while (true) {\n const match = tagPattern.exec(input);\n if (!match) break;\n\n const [fullMatch, tagName] = match;\n const isEndTag = fullMatch[1] === '/';\n\n // Push text content between tags\n output.push(input.slice(lastIndex, match.index));\n lastIndex = match.index + fullMatch.length;\n\n if (isEndTag) {\n // Handle end tag\n while (tagStack.length > 0 && tagStack[tagStack.length - 1] !== tagName) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n if (tagStack.length > 0) {\n tagStack.pop(); // pop the matching start tag\n }\n } else if (!selfClosingTagList.includes(tagName)) {\n // Handle start tag\n tagStack.push(tagName);\n }\n output.push(fullMatch); // Push the current tag\n }\n\n // Add any remaining unclosed tags\n output.push(input.slice(lastIndex));\n while (tagStack.length > 0) {\n const unclosedTag = tagStack.pop();\n if (unclosedTag) {\n output.push(`</${unclosedTag}>`);\n }\n }\n\n return output.join('');\n}\n\n/**\n * Checks if a given tag name is a valid HTML tag.\n * @param tagName - The tag name to check.\n * @returns A boolean indicating if the tag name is valid.\n */\nexport function isHtmlTagName(tagName: string): boolean {\n const htmlTagsList = htmlTags.split(',');\n return htmlTagsList.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 const selfClosingTagList = selfClosingTags.split(',');\n if (selfClosingTagList.includes(tagName)) {\n return `<${tagName}/>`;\n } else {\n return `<${tagName}></${tagName}>`;\n }\n}\nexport function generateShortId() {\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n const charactersLength = characters.length;\n for (let i = 0; i < 8; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n","import { insertChild, removeChild, replaceChild } from './utils';\nimport { isJsxElement } from './template';\n\ntype AnyNode = Node | JSX.Element;\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 const childrenLength = children.length;\n\n if (childrenMap.size > 0 && nextChildren.length === 0) {\n if (parent.childNodes.length === childrenLength + (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 return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n let childIndex = 0;\n\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children[childIndex];\n let currKey = getKey(currChild, i);\n\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 (origChild) {\n child = patch(parent, origChild, child);\n }\n\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 replaces.forEach(([placeholder, child]) => replaceChild(parent, child, placeholder));\n\n childrenMap.forEach((child, key) => {\n if (child.isConnected && !result.has(key)) {\n removeChild(child);\n }\n });\n\n return result;\n}\n\nfunction 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\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}\nexport function getKey(node: AnyNode, index: number): string {\n if (isJsxElement(node)) {\n // use jsx key\n const jsxKey = (node as any).key;\n if (jsxKey !== undefined && jsxKey !== null) {\n return String(jsxKey);\n }\n }\n\n // use index\n return `_$${index}$`;\n}\n","import {\n capitalizeFirstLetter,\n coerceArray,\n isArray,\n isFunction,\n isNil,\n startsWith,\n} from '@estjs/shared';\nimport { isSignal, useEffect, useSignal } from '@estjs/signal';\nimport {\n addEventListener,\n binNode,\n coerceNode,\n generateShortId,\n insertChild,\n removeChild,\n setAttribute,\n} from './utils';\nimport { patchChildren } from './patch';\nimport type { NodeTrack } from '../types';\n\nexport class TemplateNode implements JSX.Element {\n treeMap = new Map<number, Node>();\n constructor(\n public template: HTMLTemplateElement,\n public props: Record<string, unknown>,\n public key?: string,\n ) {}\n\n mounted = false;\n nodes: Node[] = [];\n provides: Record<string, unknown> = {};\n trackMap = new Map<string, NodeTrack>();\n parent: Node | null = null;\n\n get firstChild(): Node | null {\n return this.nodes[0] ?? null;\n }\n\n get isConnected(): boolean {\n return this.mounted;\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n mount(parent: Node, before?: Node | null): Node[] {\n this.parent = parent;\n if (this.isConnected) {\n this.nodes.forEach(node => insertChild(parent, node, before));\n return this.nodes;\n }\n\n this.key = this.key || generateShortId();\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 this.mapNodeTree(parent, cloneNode);\n\n insertChild(parent, cloneNode, before);\n\n this.patchNodes(this.props);\n this.mounted = true;\n return this.nodes;\n }\n\n unmount(): void {\n this.trackMap.forEach(track => {\n track.cleanup?.();\n track.lastNodes?.forEach(node => {\n if (track.isRoot) {\n removeChild(node);\n } else if (node instanceof TemplateNode) {\n node.unmount();\n }\n });\n });\n this.trackMap.clear();\n this.treeMap.clear();\n this.nodes.forEach(node => removeChild(node));\n this.nodes = [];\n this.mounted = false;\n }\n\n mapNodeTree(parent: Node, tree: Node) {\n let index = 1;\n this.treeMap.set(0, parent);\n const walk = (node: Node) => {\n if (node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n this.treeMap.set(index++, node);\n }\n let child = node.firstChild;\n while (child) {\n walk(child);\n child = child.nextSibling;\n }\n };\n walk(tree);\n }\n\n patchNodes(props) {\n for (const key in props) {\n const index = Number(key);\n const node = this.treeMap.get(index);\n if (node) {\n const value = this.props[key];\n this.patchNode(key, node, value, index === 0);\n }\n }\n this.props = props;\n }\n\n getNodeTrack(trackKey: string, trackLastNodes?: boolean, isRoot?: boolean): NodeTrack {\n let track = this.trackMap.get(trackKey);\n if (!track) {\n track = { cleanup: () => {} };\n if (trackLastNodes) {\n track.lastNodes = new Map();\n }\n if (isRoot) {\n track.isRoot = true;\n }\n this.trackMap.set(trackKey, track);\n }\n track.cleanup?.();\n return track;\n }\n\n 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\n const props = this.props;\n this.props = node.props;\n this.patchNodes(props);\n }\n\n patchNode(key, node, props, isRoot) {\n for (const attr in props) {\n if (attr === 'children' && props.children) {\n if (!isArray(props.children)) {\n const trackKey = `${key}:${attr}:${0}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n patchChild(track, node, props.children, null);\n } else {\n props.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}:${attr}:${index}`;\n const track = this.getNodeTrack(trackKey, true, isRoot);\n patchChild(track, node, child, before);\n });\n }\n } else if (attr === 'ref') {\n if (isSignal(props[attr])) {\n props[attr].value = node;\n } else if (isFunction(props[attr])) {\n (props[attr] as Function)(node);\n }\n }\n // handle events\n else if (startsWith(attr, 'on')) {\n const eventName = attr.slice(2).toLocaleLowerCase();\n const track = this.getNodeTrack(`${key}:${attr}`);\n const listener = props[attr];\n track.cleanup = addEventListener(node, eventName, listener);\n // attr\n } else if (!startsWith(attr, 'update')) {\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n const val = props[attr];\n\n const triggerValue = isSignal(val) ? val : useSignal(val);\n patchAttribute(track, node, attr, triggerValue.value);\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(val) ? val.value : val;\n patchAttribute(track, node, attr, triggerValue.value);\n });\n\n let cleanupBind;\n const updateKey = `update${capitalizeFirstLetter(attr)}`;\n if (props[updateKey]) {\n cleanupBind = binNode(node, value => {\n props[updateKey](value);\n });\n }\n\n track.cleanup = () => {\n cleanup && cleanup();\n cleanupBind && cleanupBind();\n };\n }\n }\n }\n}\n\nfunction patchAttribute(track: NodeTrack, node: Node, attr: string, data: unknown): void {\n const element = node as HTMLElement;\n if (!element.setAttribute) {\n return;\n }\n if (isFunction(data)) {\n track.cleanup = useEffect(() => {\n setAttribute(element, attr, data());\n });\n } else {\n setAttribute(element, attr, data);\n }\n}\n\nfunction patchChild(track: NodeTrack, parent: Node, child: unknown, before: Node | null): void {\n if (isFunction(child)) {\n track.cleanup = useEffect(() => {\n const nextNodes = coerceArray((child as Function)()).map(coerceNode);\n track.lastNodes = patchChildren(parent, track.lastNodes!, nextNodes, before);\n });\n } else {\n coerceArray(child).forEach((node, i) => {\n const newNode = coerceNode(node);\n track.lastNodes!.set(String(i), newNode);\n insertChild(parent, newNode, before);\n });\n }\n}\n","import { ComponentNode } from './component-node';\n\nexport function onMount(cb: () => void): void {\n throwIfOutsideComponent('onMounted');\n ComponentNode.ref?.addHook('mounted', cb);\n}\n\nexport function onDestroy(cb: () => void): void {\n throwIfOutsideComponent('onDestroy');\n ComponentNode.ref?.addHook('destroy', cb);\n}\n\nfunction throwIfOutsideComponent(hook: string) {\n if (!ComponentNode.ref) {\n console.error(\n `\"${hook}\" can only be called within the component function body\n and cannot be used in asynchronous or deferred calls.`,\n );\n }\n}\n\nexport function getCurrentComponent(): ComponentNode | null {\n return ComponentNode.ref;\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\nexport function useProvide<T, K = InjectionKey<T> | string | number>(\n key: K,\n value: K extends InjectionKey<infer V> ? V : T,\n) {\n throwIfOutsideComponent('useProvide');\n\n ComponentNode.ref?.setContext(key as string, value);\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 throwIfOutsideComponent('useInject');\n return ComponentNode.ref?.getContext(key as string) || defaultValue;\n}\n\n// export function useProps(props) {\n// const propsValue = props;\n// const propsAction = () => {};\n// const propsRef = () => {};\n// const propsChild = () => {};\n// }\n","import { isFunction, isObject, startsWith } from '@estjs/shared';\nimport type { EssorNode } from '../types';\n\ninterface TemplateEntry {\n template: string;\n props?: Record<string, any>;\n}\n\ninterface TemplateCollection {\n [key: number]: TemplateEntry;\n}\n\ntype Props = Record<string, any>;\n\n/**\n * Converts a JSON object to a string of HTML attributes.\n * @param json - The JSON object to be converted.\n * @returns A string representing the HTML attributes.\n */\nfunction convertJsonToAttributes(json: Record<string, any>): string {\n return Object.entries(json)\n .map(([key, value]) => `${key}=${JSON.stringify(escape(String(value)))}`)\n .join(' ');\n}\n\n/**\n * Renders a template to a string based on provided props.\n * Handles both function-based and object-based templates.\n * @param template - The template to render, which can be an array, an object, or a function.\n * @param props - The properties used for rendering the template.\n * @returns The rendered template as a string.\n */\nexport function renderTemplate(template: string[] | EssorNode | Function, props: Props): string {\n // If the template is a function, invoke it with props and return the result\n if (isFunction(template)) {\n return template(props);\n }\n\n // Convert array-based templates to TemplateCollection format\n const templateCollection: TemplateCollection = Array.isArray(template)\n ? template.reduce((acc, tmpl, index) => {\n acc[index + 1] = { template: tmpl };\n return acc;\n }, {})\n : template;\n\n const childNodesMap: Record<string, EssorNode[]> = {};\n const processedTemplates: TemplateCollection = {};\n\n if (isObject(templateCollection)) {\n for (const [key, tmpl] of Object.entries(templateCollection)) {\n const prop = props[key];\n if (prop) {\n // Remove event listeners (props starting with 'on') from the properties\n for (const propKey in prop) {\n if (startsWith(propKey, 'on') && isFunction(prop[propKey])) {\n delete prop[propKey];\n }\n }\n\n // Handle child elements if present\n if (prop.children) {\n for (const [child, idx] of prop.children) {\n if (!childNodesMap[idx]) childNodesMap[idx] = [];\n childNodesMap[idx].push(child);\n }\n delete prop.children;\n }\n }\n\n // Store the processed template and associated props\n processedTemplates[key] = { template: tmpl.template, props: prop };\n }\n }\n\n // Render the final template as a string\n return Object.entries(processedTemplates)\n .map(([key, { template: tmpl, props: prop }]) => {\n let renderedString = tmpl;\n if (prop) {\n renderedString += ` ${convertJsonToAttributes(prop)}`;\n }\n if (childNodesMap[key]) {\n renderedString += childNodesMap[key].map(child => renderTemplate(child, prop)).join('');\n }\n\n return renderedString;\n })\n .join('');\n}\n\n/**\n * Renders a component to a string using the given properties.\n * @param component - The component function to be rendered.\n * @param props - The properties to be passed to the component.\n * @returns The rendered component as a string.\n */\nexport function renderToString(component: (...args: any[]) => string, props: Props): string {\n return renderTemplate(component, props);\n}\n\n/**\n * Renders a component to a string and sets it as the innerHTML of the specified root element.\n * @param component - The component function to be rendered.\n * @param root - The root element in which to render the component.\n * @param props - The properties to be passed to the component.\n */\nexport function renderSSG(component, root: HTMLElement, props: Props = {}): void {\n root.innerHTML = renderTemplate(component, props);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@estjs/template",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [],
|
|
@@ -54,8 +54,8 @@
|
|
|
54
54
|
"jsdelivr": "dist/template.esm.js",
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"csstype": "^3.1.3",
|
|
57
|
-
"@estjs/shared": "0.0.
|
|
58
|
-
"@estjs/signal": "0.0.
|
|
57
|
+
"@estjs/shared": "0.0.11",
|
|
58
|
+
"@estjs/signal": "0.0.11"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
61
|
"build": "tsup && cross-env NODE_ENV=production tsup --clean=false --treeshake --sourcemap=false",
|