essor 0.0.5 → 0.0.6-beta.1

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/index.cjs.js CHANGED
@@ -1,25 +1,29 @@
1
1
  'use strict';
2
2
 
3
- var ie=Object.defineProperty;var W=Object.getOwnPropertySymbols;var se=Object.prototype.hasOwnProperty,ae=Object.prototype.propertyIsEnumerable;var Z=(t,e,n)=>e in t?ie(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,q=(t,e)=>{for(var n in e||(e={}))se.call(e,n)&&Z(t,n,e[n]);if(W)for(var n of W(e))ae.call(e,n)&&Z(t,n,e[n]);return t};var E=null,A=null,P=new Set,K=new WeakMap,F=new Set;function O(t,e){let n=K.get(t);n||(n=new Map,K.set(t,n));let o=n.get(e);o||(o=new Set,n.set(e,o)),E&&o.add(E),A&&P.add(A);}function Q(t,e){P.size>0&&P.forEach(r=>r.run());let n=K.get(t);if(!n)return;let o=n.get(e);o&&o.forEach(r=>F.has(r)&&r());}var L=class{constructor(e){this._value=e;}valueOf(){return O(this,"value"),this._value}toString(){return O(this,"value"),String(this._value)}toJSON(){return this._value}get value(){return O(this,"value"),this._value}set value(e){this._value!==e&&(this._value=e,Q(this,"value"));}peek(){return this._value}update(){Q(this,"value");}};function g(t){return v(t)?t:new L(t)}function v(t){return t instanceof L}var H=class{constructor(e){this.fn=e;let n=A;A=this,O(this,"_value"),this._value=this.fn(),A=n;}peek(){return this._value}run(){let e=this.fn();e!==this._value&&(this._value=e);}get value(){return O(this,"_value"),this._value}};function R(t){return new H(t)}function x(t){function e(){let n=E;E=e,t(),E=n;}return F.add(e),e(),()=>{F.delete(e),E=null;}}function k(t){return Object.entries(t).reduce((n,[o,r])=>(n[o]=v(r)?r:g(r),n),{})}function C(t){return t?v(t)?t.peek():Object.entries(t).reduce((e,[n,o])=>(e[n]=v(o)?o.peek():o,e),{}):{}}var j=0,J=new Map;function ce(t){let{state:e,getters:n,actions:o}=t,r=q({},e!=null?e:{}),i=k(e!=null?e:{}),l=[],p=[],u={patch$(a){Object.assign(i,k(a)),l.forEach(c=>c(C(i))),p.forEach(c=>c(C(i)));},subscribe$(a){l.push(a);},unsubscribe$(a){let c=l.indexOf(a);c!==-1&&l.splice(c,1);},onAction$(a){p.push(a);},reset$(){u.patch$(r);}},s={_id:`store_${j}`};for(let a in n){let c=n[a];c&&(s[a]=R(()=>c.call(i)));}for(let a in o){let c=o[a];c&&(s[a]=c.bind(i));}return J.set(j,g),++j,new Proxy({},{get(a,c){return c==="state"?C(i):c in s?s[c]:c in u?u[c]:i[c].value}})}function le(t){return function(){return J.has(j)?J.get(j):ce(t)}}function G(t){return Array.isArray(t)?t.flat():[t]}var I=Array.isArray;function Y(t){return t==null}var T=t=>typeof t=="function";function X(t){return t===!1||t===null||t===void 0||t===""}var ee=t=>t.replaceAll(/[A-Z]+/g,(e,n)=>`${n>0?"-":""}${e.toLocaleLowerCase()}`);var b=class b{constructor(e,n,o){this.template=e;this.props=n;this.key=o;this.proxyProps={};this.trackMap=new Map;this.context={};this.emitter=new Set;this.mounted=!1;this.rootNode=null;this.hooks={mounted:new Set,destroy:new Set};this.proxyProps=k(n);}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 b.context[e]}setContext(e,n){b.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);}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()),b.context={};}mount(e,n){var r,i,l,p;if(!T(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:[];b.ref=this,this.rootNode=this.template(C(this.proxyProps)),b.ref=null,this.mounted=!0;let o=(p=(l=this.rootNode)==null?void 0:l.mount(e,n))!=null?p:[];return this.hooks.mounted.forEach(u=>u()),this.patchProps(this.props),o}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,l,p;for(let[u,s]of Object.entries(e))if(u.indexOf("on")===0&&((n=this.rootNode)!=null&&n.nodes)){let a=u.slice(2).toLowerCase(),c=s,N=m(this.rootNode.nodes[0],a,c);this.emitter.add(N);}else if(u.indexOf("bind:")===0)this.proxyProps[u]=g(s);else if(u==="ref")T(s)?e[u]((o=this.rootNode)==null?void 0:o.nodes[0]):v(s)?e[u].value=(r=this.rootNode)==null?void 0:r.nodes[0]:e[u]=(i=this.rootNode)==null?void 0:i.nodes[0];else {let a=(p=(l=this.proxyProps)[u])!=null?p:l[u]=g(s),c=this.getNodeTrack(u);c.cleanup=x(()=>{a.value=s;});}this.props=e;}};b.ref=null,b.context={};var d=b;function ue(t,e,n){return T(t)?new d(t,e,n):new w(t,e,n)}function h(t){return t instanceof d||t instanceof w}function pe(t){let e=document.createElement("template");return e.innerHTML=t,e}function fe(t){return t.children}function V(t){if(h(t)||t instanceof Node)return t;let e=X(t)?"":String(t);return document.createTextNode(e)}function y(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 S(t){h(t)?t.unmount():t.parentNode&&t.remove();}function D(t,e,n){y(t,e,n),S(n);}function z(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(ee(r),String(o[r]));});}return}X(n)?t.removeAttribute(e):n===!0?t.setAttribute(e,""):t.setAttribute(e,String(n));}function ne(t,e){if(t instanceof HTMLInputElement){if(t.type==="checkbox")return m(t,"change",()=>{e(!!t.checked);});if(t.type==="date")return m(t,"change",()=>{e(t.value?t.value:"");});if(t.type==="file")return m(t,"change",()=>{t.files&&e(t.files);});if(t.type==="number")return m(t,"input",()=>{let n=Number.parseFloat(t.value);e(Number.isNaN(n)?"":String(n));});if(t.type==="radio")return m(t,"change",()=>{e(t.checked?t.value:"");});if(t.type==="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 te=Promise.resolve();function de(t){return t?te.then(t):te}function m(t,e,n){return t.addEventListener(e,n),()=>t.removeEventListener(e,n)}function oe(t,e,n,o){let r=new Map,i=e.values(),l=t.childNodes.length;if(e.size>0&&n.length===0){if(l===e.size+(o?1:0)){let s=t;s.innerHTML="",o&&y(t,o);}else {let s=document.createRange(),a=i.next().value,c=h(a)?a.firstChild:a;s.setStartBefore(c),o?s.setEndBefore(o):s.setEndAfter(t),s.deleteContents();}return e.forEach(s=>{h(s)&&s.unmount();}),r}let p=[],u=he(n);for(let[s,a]of n.entries()){let c=i.next().value,N=$(c,s);for(;c&&!u.has(N);)S(c),e.delete(N),c=i.next().value,N=$(c,s);let M=$(a,s),B=e.get(M);if(B&&(a=me(t,B,a)),c)if(c){let U=document.createComment("");y(t,U,c),p.push([U,a]);}else y(t,a,o);else y(t,a,o);r.set(M,a);}return p.forEach(([s,a])=>D(t,a,s)),e.forEach((s,a)=>{s.isConnected&&!r.has(a)&&S(s);}),r}function me(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):(D(t,n,e),n)}function he(t){let e=new Map;for(let[n,o]of t.entries()){let r=$(o,n);e.set(r,o);}return e}function $(t,e){let n=t instanceof Element?t.id:void 0,o=n===""?void 0:n;return o!=null?o:`_$${e}$`}var w=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(){}unmount(){this.trackMap.forEach(e=>{var n,o;(n=e.cleanup)==null||n.call(e),(o=e.lastNodes)==null||o.forEach(r=>{e.isRoot?S(r):r instanceof t&&r.unmount();});}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>S(e)),this.nodes=[],this.mounted=!1;}mount(e,n){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(l=>y(e,l,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==null||r.childNodes.forEach(l=>{o.append(l);}),r.remove()),this.nodes=Array.from(o.childNodes),this.mapNodeTree(e,o),y(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 l=i.firstChild;for(;l;)r(l),l=l.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(I(o.children))o.children.forEach((l,p)=>{var M;if(!l)return;let[u,s]=I(l)?l:[l,null],a=Y(s)?null:(M=this.treeMap.get(s))!=null?M:null,c=`${e}:${i}:${p}`,N=this.getNodeTrack(c,!0,r);re(N,n,u,a);});else {let l=`${e}:${i}:0`,p=this.getNodeTrack(l,!0,r);re(p,n,o.children,null);}else if(i==="ref")T(o[i])?o[i](n):o[i]=n;else if(i.indexOf("on")===0){let l=i.slice(2).toLocaleLowerCase(),p=this.getNodeTrack(`${e}:${i}`),u=o[i];p.cleanup=m(n,l,u);}else if(i.indexOf("bind:")===0){let l=i.slice(5).toLocaleLowerCase(),p=o[i],u=this.getNodeTrack(`${e}:${i}`),s=v(p)?p:g(p),a=x(()=>{s.value=p,n[l]=s.value;}),c=ne(n,N=>{o[`update:${l}`](N);});u.cleanup=()=>{a==null||a(),c==null||c();};}else if(i.indexOf("update:")!==0){let l=this.getNodeTrack(`${e}:${i}`),p=o[i],u=v(p)?p:g(p),s=x(()=>{u.value=p,ge(l,n,i,u.value);});l.cleanup=()=>{s==null||s();};}}};function ge(t,e,n,o){let r=e;r.setAttribute&&(T(o)?t.cleanup=x(()=>{z(r,n,o());}):z(r,n,o));}function re(t,e,n,o){T(n)?t.cleanup=x(()=>{let r=G(n()).map(V);t.lastNodes=oe(e,t.lastNodes,r,o);}):G(n).forEach((r,i)=>{let l=V(r);t.lastNodes.set(String(i),l),y(e,l,o);});}function ye(t){var e;_("onMounted"),(e=d.ref)==null||e.addHook("mounted",t);}function Ne(t){var e;_("onDestroy"),(e=d.ref)==null||e.addHook("destroy",t);}function _(t){if(!d.ref)throw new Error(`"${t}" can only be called within the component function body
4
- and cannot be used in asynchronous or deferred calls.`)}function ve(t,e){var n;_("useProvide"),(n=d.ref)==null||n.setContext(t,e);}function Te(t,e){var n;return _("useInject"),((n=d.ref)==null?void 0:n.getContext(t))||e}function be(){let t=null;return new Proxy({},{get(e,n){return n==="__is_ref"?!0:t},set(e,n,o){return t=o,!0}})}var Tt="0.0.5-beta.7";
3
+ var ae=Object.defineProperty;var W=Object.getOwnPropertySymbols;var ce=Object.prototype.hasOwnProperty,ue=Object.prototype.propertyIsEnumerable;var Z=(t,e,n)=>e in t?ae(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,q=(t,e)=>{for(var n in e||(e={}))ce.call(e,n)&&Z(t,n,e[n]);if(W)for(var n of W(e))ue.call(e,n)&&Z(t,n,e[n]);return t};var S=null,w=null,_=new Set,H=new WeakMap,F=new Set;function j(t,e){let n=H.get(t);n||(n=new Map,H.set(t,n));let o=n.get(e);o||(o=new Set,n.set(e,o)),S&&o.add(S),w&&_.add(w);}function Q(t,e){_.size>0&&_.forEach(r=>r.run());let n=H.get(t);if(!n)return;let o=n.get(e);o&&o.forEach(r=>F.has(r)&&r());}var O=class{constructor(e){this._value=e;}valueOf(){return j(this,"value"),this._value}toString(){return j(this,"value"),String(this._value)}toJSON(){return this._value}get value(){return j(this,"value"),this._value}set value(e){this._value!==e&&(this._value=e,Q(this,"value"));}peek(){return this._value}update(){Q(this,"value");}};function y(t){return d(t)?t:new O(t)}function d(t){return t instanceof O}var R=class{constructor(e){this.fn=e;let n=w;w=this,j(this,"_value"),this._value=this.fn(),w=n;}peek(){return this._value}run(){let e=this.fn();e!==this._value&&(this._value=e);}get value(){return j(this,"_value"),this._value}};function K(t){return new R(t)}function b(t){function e(){let n=S;S=e,t(),S=n;}return F.add(e),e(),()=>{F.delete(e),S=null;}}function k(t){return Object.entries(t).reduce((n,[o,r])=>(n[o]=d(r)?r:y(r),n),{})}function L(t){return t?d(t)?t.peek():Object.entries(t).reduce((e,[n,o])=>(e[n]=d(o)?o.peek():o,e),{}):{}}var A=0,J=new Map;function le(t){let{state:e,getters:n,actions:o}=t,r=q({},e!=null?e:{}),i=k(e!=null?e:{}),s=[],a=[],p={patch$(c){Object.assign(i,k(c)),s.forEach(u=>u(L(i))),a.forEach(u=>u(L(i)));},subscribe$(c){s.push(c);},unsubscribe$(c){let u=s.indexOf(c);u!==-1&&s.splice(u,1);},onAction$(c){a.push(c);},reset$(){p.patch$(r);}},l={_id:`store_${A}`};for(let c in n){let u=n[c];u&&(l[c]=K(()=>u.call(i)));}for(let c in o){let u=o[c];u&&(l[c]=u.bind(i));}return J.set(A,y),++A,new Proxy({},{get(c,u){return u==="state"?L(i):u in l?l[u]:u in p?p[u]:i[u].value}})}function pe(t){return function(){return J.has(A)?J.get(A):le(t)}}function G(t){return Array.isArray(t)?t.flat():[t]}var Y=t=>t!==null&&typeof t=="object";var I=Array.isArray;function ee(t){return t==null}var N=t=>typeof t=="function";function X(t){return t===!1||t===null||t===void 0||t===""}var te=t=>t.replaceAll(/[A-Z]+/g,(e,n)=>`${n>0?"-":""}${e.toLocaleLowerCase()}`);var T=class T{constructor(e,n,o){this.template=e;this.props=n;this.key=o;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=k(n);}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 T.context[e]}setContext(e,n){T.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);}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()),T.context={};}mount(e,n){var r,i,s,a;if(!N(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:[];T.ref=this,this.rootNode=this.template(this.proxyProps),T.ref=null,this.mounted=!0;let o=(a=(s=this.rootNode)==null?void 0:s.mount(e,n))!=null?a:[];return this.hooks.mounted.forEach(p=>p()),this.patchProps(this.props),o}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,s;for(let[a,p]of Object.entries(e))if(a.indexOf("on")===0&&((n=this.rootNode)!=null&&n.nodes)){let l=a.slice(2).toLowerCase(),c=p,u=h(this.rootNode.nodes[0],l,c);this.emitter.add(u);}else if(a.indexOf("bind:")===0)this.proxyProps[a]=y(p);else if(a==="ref")d(p)?e[a].value=(o=this.rootNode)==null?void 0:o.nodes[0]:e[a]=(r=this.rootNode)==null?void 0:r.nodes[0];else {let l=(s=(i=this.proxyProps)[a])!=null?s:i[a]=y(p),c=this.getNodeTrack(a);c.cleanup=b(()=>{l.value=p;});}this.props=e;}};T.ref=null,T.context={};var m=T;function fe(t,e,n){return N(t)?new m(t,e,n):new C(t,e,n)}function g(t){return t instanceof m||t instanceof C}function de(t){let e=document.createElement("template");return e.innerHTML=t,e}function me(t){return t.children}function V(t){if(g(t)||t instanceof Node)return t;let e=X(t)?"":String(t);return document.createTextNode(e)}function v(t,e,n=null){let o=g(n)?n.firstChild:n;g(e)?e.mount(t,o):o?o.before(e):t.append(e);}function E(t){g(t)?t.unmount():t.parentNode&&t.remove();}function D(t,e,n){v(t,e,n),E(n);}function z(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(te(r),String(o[r]));});}return}X(n)?t.removeAttribute(e):n===!0?t.setAttribute(e,""):t.setAttribute(e,String(n));}function oe(t,e){if(t instanceof HTMLInputElement){if(t.type==="checkbox")return h(t,"change",()=>{e(!!t.checked);});if(t.type==="date")return h(t,"change",()=>{e(t.value?t.value:"");});if(t.type==="file")return h(t,"change",()=>{t.files&&e(t.files);});if(t.type==="number")return h(t,"input",()=>{let n=Number.parseFloat(t.value);e(Number.isNaN(n)?"":String(n));});if(t.type==="radio")return h(t,"change",()=>{e(t.checked?t.value:"");});if(t.type==="text")return h(t,"input",()=>{e(t.value);})}if(t instanceof HTMLSelectElement)return h(t,"change",()=>{e(t.value);});if(t instanceof HTMLTextAreaElement)return h(t,"input",()=>{e(t.value);})}var ne=Promise.resolve();function he(t){return t?ne.then(t):ne}function h(t,e,n){return t.addEventListener(e,n),()=>t.removeEventListener(e,n)}function re(t,e,n,o){let r=new Map,i=e.values(),s=t.childNodes.length;if(e.size>0&&n.length===0){if(s===e.size+(o?1:0)){let l=t;l.innerHTML="",o&&v(t,o);}else {let l=document.createRange(),c=i.next().value,u=g(c)?c.firstChild:c;l.setStartBefore(u),o?l.setEndBefore(o):l.setEndAfter(t),l.deleteContents();}return e.forEach(l=>{g(l)&&l.unmount();}),r}let a=[],p=ye(n);for(let[l,c]of n.entries()){let u=i.next().value,x=$(u,l);for(;u&&!p.has(x);)E(u),e.delete(x),u=i.next().value,x=$(u,l);let M=$(c,l),B=e.get(M);if(B&&(c=ge(t,B,c)),u)if(u){let U=document.createComment("");v(t,U,u),a.push([U,c]);}else v(t,c,o);else v(t,c,o);r.set(M,c);}return a.forEach(([l,c])=>D(t,c,l)),e.forEach((l,c)=>{l.isConnected&&!r.has(c)&&E(l);}),r}function ge(t,e,n){return e===n?e:g(e)&&g(n)&&e.template===n.template?(n.inheritNode(e),n):e instanceof Text&&n instanceof Text?(e.textContent!==n.textContent&&(e.textContent=n.textContent),e):(D(t,n,e),n)}function ye(t){let e=new Map;for(let[n,o]of t.entries()){let r=$(o,n);e.set(r,o);}return e}function $(t,e){let n=t instanceof Element?t.id:void 0,o=n===""?void 0:n;return o!=null?o:`_$${e}$`}var C=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(){}unmount(){this.trackMap.forEach(e=>{var n,o;(n=e.cleanup)==null||n.call(e),(o=e.lastNodes)==null||o.forEach(r=>{e.isRoot?E(r):r instanceof t&&r.unmount();});}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>E(e)),this.nodes=[],this.mounted=!1;}mount(e,n){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(s=>v(e,s,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(s=>{o.append(s);})),this.nodes=Array.from(o.childNodes),this.mapNodeTree(e,o),v(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 s=i.firstChild;for(;s;)r(s),s=s.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(I(o.children))o.children.forEach((s,a)=>{var M;if(!s)return;let[p,l]=I(s)?s:[s,null],c=ee(l)?null:(M=this.treeMap.get(l))!=null?M:null,u=`${e}:${i}:${a}`,x=this.getNodeTrack(u,!0,r);ie(x,n,p,c);});else {let s=`${e}:${i}:0`,a=this.getNodeTrack(s,!0,r);ie(a,n,o.children,null);}else if(i==="ref")d(o[i])?o[i].value=n:o[i]=n;else if(i.indexOf("on")===0){let s=i.slice(2).toLocaleLowerCase(),a=this.getNodeTrack(`${e}:${i}`),p=o[i];a.cleanup=h(n,s,p);}else if(i.indexOf("bind:")===0){let s=i.slice(5).toLocaleLowerCase(),a=o[i],p=this.getNodeTrack(`${e}:${i}`),l=d(a)?a:y(a),c=b(()=>{l.value=d(a)?a.value:a,n[s]=l.value;}),u=oe(n,x=>{o[`update:${s}`](x);});p.cleanup=()=>{c==null||c(),u==null||u();};}else if(i.indexOf("update:")!==0){let s=this.getNodeTrack(`${e}:${i}`),a=o[i],p=d(a)?a:y(a),l=b(()=>{p.value=d(a)?a.value:a,Ne(s,n,i,p.value);});s.cleanup=()=>{l==null||l();};}}};function Ne(t,e,n,o){let r=e;r.setAttribute&&(N(o)?t.cleanup=b(()=>{z(r,n,o());}):z(r,n,o));}function ie(t,e,n,o){N(n)?t.cleanup=b(()=>{let r=G(n()).map(V);t.lastNodes=re(e,t.lastNodes,r,o);}):G(n).forEach((r,i)=>{let s=V(r);t.lastNodes.set(String(i),s),v(e,s,o);});}function ve(t){var e;P("onMounted"),(e=m.ref)==null||e.addHook("mounted",t);}function Te(t){var e;P("onDestroy"),(e=m.ref)==null||e.addHook("destroy",t);}function P(t){if(!m.ref)throw new Error(`"${t}" can only be called within the component function body
4
+ and cannot be used in asynchronous or deferred calls.`)}function be(t,e){var n;P("useProvide"),(n=m.ref)==null||n.setContext(t,e);}function xe(t,e){var n;return P("useInject"),((n=m.ref)==null?void 0:n.getContext(t))||e}function Ee(){let t=null;return new Proxy({},{get(e,n){return n==="__is_ref"?!0:t},set(e,n,o){return t=o,!0}})}var Et="0.0.5";function Mt(t=[]){return t.reduce((e,n,o)=>(e[o+1]={template:n},e),{})}function Se(t){return Object.entries(t).map(([e,n])=>`${e}=${JSON.stringify(n)}`).join(" ")}function se(t,e){if(N(t))return t(e);let n={},o={};return Y(t)&&Object.entries(t).forEach(([r,i])=>{let s=e[r];s&&(Object.keys(s).forEach(a=>{a.startsWith("on")&&N(s[a])&&delete s[a];}),s.children&&(s.children.forEach(([a,p])=>{n[p]=[...n[p]||[],a];}),delete s.children)),o[r]={template:i.template,prop:s};}),Object.entries(o).map(([r,{template:i,prop:s}])=>{let a=i;return s&&(a+=` ${Se(s)}`),n[r]&&(a+=n[r].map(p=>se(p,s)).join("")),a}).join("")}function wt(t,e){return se(t,e)}function jt(t,e){e.innerHTML="",t.mount(e);}
5
5
 
6
- exports.ComponentNode = d;
7
- exports.Fragment = fe;
8
- exports.TemplateNode = w;
9
- exports.__essor_version = Tt;
10
- exports.createStore = le;
11
- exports.h = ue;
12
- exports.isJsxElement = h;
13
- exports.nextTick = de;
14
- exports.onDestroy = Ne;
15
- exports.onMount = ye;
6
+ exports.ComponentNode = m;
7
+ exports.Fragment = me;
8
+ exports.TemplateNode = C;
9
+ exports.__essor_version = Et;
10
+ exports.createStore = pe;
11
+ exports.h = fe;
12
+ exports.hydrate = jt;
13
+ exports.isJsxElement = g;
14
+ exports.nextTick = he;
15
+ exports.onDestroy = Te;
16
+ exports.onMount = ve;
17
+ exports.renderToString = wt;
16
18
  exports.signalObject = k;
17
- exports.template = pe;
18
- exports.useComputed = R;
19
- exports.useEffect = x;
20
- exports.useInject = Te;
21
- exports.useProvide = ve;
22
- exports.useRef = be;
23
- exports.useSignal = g;
19
+ exports.ssr = se;
20
+ exports.ssrtmpl = Mt;
21
+ exports.template = de;
22
+ exports.useComputed = K;
23
+ exports.useEffect = b;
24
+ exports.useInject = xe;
25
+ exports.useProvide = be;
26
+ exports.useRef = Ee;
27
+ exports.useSignal = y;
24
28
  //# sourceMappingURL=out.js.map
25
29
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signal/signal.ts","../src/signal/store.ts","../../shared/src/comm.ts","../../shared/src/is.ts","../../shared/src/name.ts","../src/template/component-node.ts","../src/template/template.ts","../src/template/utils.ts","../src/template/patch.ts","../src/template/template-node.ts","../src/template/hooks.ts","../src/version.ts"],"names":["activeEffect","activeComputed","computedSet","targetMap","EffectDeps","track","target","key","depsMap","dep","trigger","computedSignal","effect","Signal","value","newValue","useSignal","isSignal","Computed","fn","prev","useComputed","useEffect","effectFn","signalObject","initialValues","acc","signalToObject","signal","_id","StoreMap","createOptionsStore","options","state","getters","actions","initState","__spreadValues","signalState","subscriptions","actionCallbacks","default_actions","payload","callback","index","states","getter","action","_","createStore","coerceArray","data","noop","isArray","isNil","x","isFunction","val","isFalsy","kebabCase","string","match","offset","_ComponentNode","template","props","_a","_b","hook","cb","context","node","handler","set","emitter","parent","before","_c","_d","mountedNode","trackKey","suppressCleanupCall","_e","_f","prop","event","listener","cleanup","addEventListener","ComponentNode","h","TemplateNode","isJsxElement","html","Fragment","coerceNode","text","insertChild","child","beforeNode","removeChild","replaceChild","setAttribute","element","attr","obj","binNode","setter","p","nextTick","eventName","patchChildren","childrenMap","nextChildren","result","children","parentChildNodesLength","parentElement","range","start","replaces","nextChildrenMap","mapKeys","i","currChild","currKey","getKey","origChild","patch","placeholder","next","id","_TemplateNode","cloneNode","firstChild","tree","walk","trackLastNodes","isRoot","item","path","patchChild","bindKey","triggerValue","cleanupBind","patchAttribute","nextNodes","newNode","onMount","throwIfOutsideComponent","onDestroy","useProvide","useInject","defaultValue","useRef","refValue","__essor_version"],"mappings":"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","sourcesContent":["type EffectFn = () => void;\n\nlet activeEffect: EffectFn | null = null;\nlet activeComputed: Computed<unknown> | null = null;\n\nconst computedSet = new Set<Computed<unknown>>();\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<EffectFn>>>();\nconst EffectDeps = new Set<EffectFn>();\n\nfunction track(target, key) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n depsMap = new Map();\n targetMap.set(target, depsMap);\n }\n let dep = depsMap.get(key);\n if (!dep) {\n dep = new Set();\n depsMap.set(key, dep);\n }\n if (activeEffect) dep.add(activeEffect);\n if (activeComputed) {\n computedSet.add(activeComputed);\n }\n}\n\nfunction trigger(target, key) {\n if (computedSet.size > 0) {\n computedSet.forEach(computedSignal => computedSignal.run());\n }\n\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const dep = depsMap.get(key);\n if (dep) {\n dep.forEach(effect => EffectDeps.has(effect) && effect());\n }\n}\n\nexport class Signal<T> {\n private _value: T;\n\n constructor(value: T) {\n this._value = value;\n }\n\n valueOf(): T {\n track(this, 'value');\n return this._value;\n }\n\n toString(): string {\n track(this, 'value');\n return String(this._value);\n }\n\n toJSON(): T {\n return this._value;\n }\n\n get value(): T {\n track(this, 'value');\n return this._value;\n }\n\n set value(newValue: T) {\n if (this._value !== newValue) {\n this._value = newValue;\n trigger(this, 'value');\n }\n }\n\n peek(): T {\n return this._value;\n }\n\n update() {\n trigger(this, 'value');\n }\n}\nexport function useSignal<T>(value?: T): Signal<T> {\n if (isSignal(value)) {\n return value as Signal<T>;\n }\n return new Signal<T>(value as T);\n}\n\nexport function isSignal<T>(value: any): value is Signal<T> {\n return value instanceof Signal;\n}\nexport class Computed<T> {\n private _value: T;\n\n constructor(private readonly fn: () => T) {\n const prev = activeComputed;\n activeComputed = this;\n track(this, '_value');\n this._value = this.fn();\n activeComputed = prev;\n }\n\n peek(): T {\n return this._value;\n }\n\n run() {\n const newValue = this.fn();\n if (newValue !== this._value) {\n this._value = newValue;\n }\n }\n\n get value(): T {\n track(this, '_value');\n return this._value;\n }\n}\n\nexport function useComputed<T>(fn: () => T) {\n return new Computed(fn);\n}\n\nexport function isComputed<T>(value: any): value is Computed<T> {\n return value instanceof Computed;\n}\n\nexport function useEffect(fn: EffectFn): () => void {\n function effectFn() {\n const prev = activeEffect;\n activeEffect = effectFn;\n fn();\n activeEffect = prev;\n }\n\n EffectDeps.add(effectFn);\n effectFn();\n\n return () => {\n EffectDeps.delete(effectFn);\n activeEffect = null;\n };\n}\n\nexport type SignalObject<T> = {\n [K in keyof T]: Signal<T[K]>;\n};\nexport function signalObject<T extends Object>(initialValues: T): SignalObject<T> {\n const signals = Object.entries(initialValues).reduce((acc, [key, value]) => {\n acc[key] = isSignal(value) ? value : useSignal(value);\n return acc;\n }, {} as SignalObject<T>);\n\n return signals;\n}\n\nexport function signalToObject<T>(signal: SignalObject<T> | T | Signal<T>): T {\n if (!signal) return {} as T;\n if (isSignal(signal)) {\n return signal.peek();\n }\n return Object.entries(signal).reduce((acc, [key, value]) => {\n acc[key] = isSignal(value) ? value.peek() : value;\n return acc;\n }, {} as T);\n}\n","import {\n type Signal,\n type SignalObject,\n signalObject,\n signalToObject,\n useComputed,\n useSignal,\n} from './signal';\n\ninterface StoreOptions<S, G, A> {\n state?: S;\n getters?: G;\n actions?: A;\n}\ntype PatchPayload = Record<string, any>;\ntype Callback = (value: any) => void;\nexport interface StoreActions {\n patch$: (payload: PatchPayload) => void;\n subscribe$: (callback: Callback) => void;\n unsubscribe$: (callback: Callback) => void;\n onAction$: (callback: Callback) => void;\n reset$: () => void;\n}\n\nlet _id = 0;\nconst StoreMap = new Map<number, any>();\n\nfunction createOptionsStore<S, G, A>(options: StoreOptions<S, G, A>) {\n const { state, getters, actions } = options as StoreOptions<any, any, any>;\n\n const initState = { ...(state ?? {}) };\n const signalState: SignalObject<S> = signalObject(state ?? {});\n\n const subscriptions: Callback[] = [];\n const actionCallbacks: Callback[] = [];\n const default_actions: StoreActions = {\n patch$(payload: PatchPayload) {\n Object.assign(signalState, signalObject(payload));\n subscriptions.forEach(callback => callback(signalToObject(signalState)));\n actionCallbacks.forEach(callback => callback(signalToObject(signalState)));\n },\n subscribe$(callback: Callback) {\n subscriptions.push(callback);\n },\n unsubscribe$(callback: Callback) {\n const index = subscriptions.indexOf(callback);\n if (index !== -1) {\n subscriptions.splice(index, 1);\n }\n },\n onAction$(callback: Callback) {\n actionCallbacks.push(callback);\n },\n reset$() {\n default_actions.patch$(initState);\n },\n };\n const states = {\n _id: `store_${_id}`,\n };\n for (const key in getters) {\n const getter = getters[key];\n if (getter) {\n states[key] = useComputed(() => {\n return getter.call(signalState);\n });\n }\n }\n\n for (const key in actions) {\n const action = actions[key];\n if (action) {\n states[key] = action.bind(signalState);\n }\n }\n\n StoreMap.set(_id, useSignal);\n ++_id;\n\n return new Proxy(\n {},\n {\n get(_, key) {\n if (key === 'state') {\n return signalToObject(signalState);\n }\n if (key in states) {\n return states[key];\n }\n if (key in default_actions) {\n return default_actions[key];\n }\n return signalState[key].value;\n },\n },\n );\n}\n\ntype Getters<S> = {\n [K in keyof S]: S[K] extends (...args: any[]) => any ? Signal<ReturnType<S[K]>> : Signal<S[K]>;\n};\n\nexport function createStore<S, G, A>(\n options: {\n state: S;\n getters?: G;\n actions?: A;\n } & ThisType<SignalObject<S> & Getters<G> & A>,\n): () => S & Getters<G> & A & StoreActions & { state: S } {\n return function () {\n if (StoreMap.has(_id)) {\n return StoreMap.get(_id)!;\n }\n\n return createOptionsStore<S, G, A>(options);\n };\n}\n","export const _toString = Object.prototype.toString;\nexport const extend = Object.assign;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nexport const hasOwn = (val: object, key: string | symbol): key is keyof typeof val =>\n hasOwnProperty.call(val, key);\n\nexport function coerceArray<T>(data: T | T[]): T[] {\n return Array.isArray(data) ? (data.flat() as T[]) : [data];\n}\nexport function hasChanged(value, oldValue) {\n return !Object.is(value, oldValue);\n}\nexport const noop = Function.prototype as () => void;\n","import { _toString } from './comm';\n\nexport const isObject = (val: unknown): val is Record<any, any> =>\n val !== null && typeof val === 'object';\nexport function isPromise(val: any): boolean {\n return _toString.call(val) === '[object Promise]';\n}\n\nexport const isArray = Array.isArray;\n\nexport function isString(val: unknown): val is string {\n return typeof val === 'string';\n}\n\nexport function isSymbol(val: unknown): val is symbol {\n return typeof val === 'symbol';\n}\nexport function isMap(val: unknown): val is Map<any, any> {\n return _toString.call(val) === '[object Map]';\n}\nexport function isNil(x: any): x is null | undefined {\n return x === null || x === undefined;\n}\n\nexport const isIntegerKey = (key: unknown) =>\n isString(key) && key !== 'NaN' && key[0] !== '-' && `${Number.parseInt(key, 10)}` === key;\nexport function isClass(func) {\n return typeof func === 'function' && /^class\\s/.test(Function.prototype.toString.call(func));\n}\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function';\nexport function isPrimitive(s: any): s is string | number {\n return (\n typeof s === 'string' || typeof s === 'number' || s instanceof String || s instanceof Number\n );\n}\nexport function isFalsy(x: any): x is false | null | undefined {\n return x === false || x === null || x === undefined || x === '';\n}\n","export const kebabCase = (string: string): string => {\n return string.replaceAll(/[A-Z]+/g, (match, offset) => {\n return `${offset > 0 ? '-' : ''}${match.toLocaleLowerCase()}`;\n });\n};\n\nexport const camelCase = (str: string): string => {\n const s = str.replaceAll(/[\\s_-]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''));\n return s[0].toLowerCase() + s.slice(1);\n};\n","import { isFunction } from 'essor-shared';\nimport { signalObject } from '../signal';\nimport { type Signal, useEffect, useSignal } from '../signal';\nimport { type SignalObject, isSignal, signalToObject } from '../signal/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, unknown>,\n public key?: string,\n ) {\n this.proxyProps = signalObject(props);\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: ComponentNode | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n private proxyProps: SignalObject<any> = {};\n private trackMap = new Map<string, NodeTrack>();\n\n id?: string;\n private context: Record<symbol | string | number, any> = {};\n private emitter = new Set<Function>();\n mounted = false;\n private rootNode: TemplateNode | null = null;\n private hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n 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 const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\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 ComponentNode.context = {};\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(signalToObject(this.proxyProps));\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 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, unknown>) {\n for (const [key, prop] of Object.entries(props)) {\n if (key.indexOf('on') === 0 && 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.indexOf('bind:') === 0) {\n this.proxyProps[key] = useSignal(prop);\n } else if (key === 'ref') {\n if (isFunction(prop)) {\n (props[key] as Function)(this.rootNode?.nodes[0]);\n } else {\n if (isSignal(prop)) {\n (props[key] as any).value = this.rootNode?.nodes[0];\n } else {\n props[key] = this.rootNode?.nodes[0];\n }\n }\n } else {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = prop;\n });\n }\n }\n this.props = props;\n }\n}\n","import { isFunction } from 'essor-shared';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport type { EssorComponent, EssorNode } from '../../types';\n\nexport function h(\n template: EssorComponent | HTMLTemplateElement,\n props: Record<string, any>,\n key?: string,\n): JSX.Element {\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template, props, key);\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 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 'essor-shared';\nimport { isJsxElement } from './template';\n\n// 将任意数据转换为 Node 或 JSX.Element 类型\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\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\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\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n // 先插入新节点,再移除旧节点\n insertChild(parent, node, child);\n removeChild(child);\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 element.setAttribute(attr, String(value));\n }\n}\n\nexport function binNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n // checkbox\n if (node.type === 'checkbox') {\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n }\n\n // date\n if (node.type === 'date') {\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n }\n\n // file\n if (node.type === 'file') {\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n }\n\n // number\n if (node.type === 'number') {\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n }\n\n // radio\n if (node.type === 'radio') {\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n }\n\n // text\n if (node.type === '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}\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 // 添加事件监听器\n addEventListener(type: string, listener: Listener<unknown>): void;\n // 移除事件监听器\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\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","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 = childrenMap.values();\n const parentChildNodesLength = parent.childNodes.length;\n\n if (childrenMap.size > 0 && nextChildren.length === 0) {\n if (parentChildNodesLength === childrenMap.size + (before ? 1 : 0)) {\n const parentElement = parent as Element;\n parentElement.innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children.next().value;\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\n childrenMap.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children.next().value;\n let currKey = getKey(currChild, i);\n\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children.next().value;\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) {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n } else {\n insertChild(parent, child, before);\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\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\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 { coerceArray, isArray, isFunction, isNil } from 'essor-shared';\nimport { useEffect, useSignal } from '../signal';\nimport { isSignal } from '../signal/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 public key?: string,\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\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?.childNodes.forEach(node => {\n (cloneNode as Element).append(node);\n });\n firstChild.remove();\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.forEach((item, index) => {\n if (!item) {\n return;\n }\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 (isFunction(props[attr])) {\n props[attr](node);\n } else {\n props[attr] = node;\n }\n } else if (attr.indexOf('on') === 0) {\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 } else if (attr.indexOf('bind:') === 0) {\n const bindKey = attr.slice(5).toLocaleLowerCase();\n const val = props[attr];\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n const triggerValue = isSignal(val) ? val : useSignal(val);\n const cleanup = useEffect(() => {\n triggerValue.value = val;\n node[bindKey] = triggerValue.value;\n });\n\n const cleanupBind = binNode(node, value => {\n props[`update:${bindKey}`](value);\n });\n\n track.cleanup = () => {\n cleanup?.();\n cleanupBind?.();\n };\n } else if (attr.indexOf('update:') !== 0) {\n const track = this.getNodeTrack(`${key}:${attr}`);\n const val = props[attr];\n const triggerValue = isSignal(val) ? val : useSignal(val);\n const cleanup = useEffect(() => {\n triggerValue.value = val;\n patchAttribute(track, node, attr, triggerValue.value);\n });\n\n track.cleanup = () => {\n cleanup?.();\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 throw new 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\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) {\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\n/**\n * Initializes a reference with a null value of type T or null.\n *\n * @template T - The type of the reference.\n * @return {T & { __is_ref: boolean; current: T | null }} A proxy object allowing custom get and set behavior.\n */\nexport function useRef<T>(): {\n __is_ref: boolean;\n current: T | null;\n} {\n // 初始化 ref 为 null,类型为 T 或 null\n let refValue: T | null = null;\n\n // 使用 Proxy 创建一个代理对象,以便我们可以自定义 get 和 set 行为\n return new Proxy({} as any, {\n get(target, key: string | symbol) {\n // 特殊属性 __is_ref 始终返回 true\n if (key === '__is_ref') {\n return true;\n }\n // 直接返回 refValue\n return refValue;\n },\n set(target, prop: string | symbol, value: any) {\n if (prop === 'current') {\n refValue = value;\n return true;\n }\n refValue = value;\n return true;\n },\n });\n}\n","export const __essor_version = '0.0.5-beta.7';\n"]}
1
+ {"version":3,"sources":["../src/signal/signal.ts","../src/signal/store.ts","../../shared/src/comm.ts","../../shared/src/is.ts","../../shared/src/name.ts","../src/template/component-node.ts","../src/template/template.ts","../src/template/utils.ts","../src/template/patch.ts","../src/template/template-node.ts","../src/template/hooks.ts","../src/version.ts","../src/server/index.ts"],"names":["activeEffect","activeComputed","computedSet","targetMap","EffectDeps","track","target","key","depsMap","dep","trigger","computedSignal","effect","Signal","value","newValue","useSignal","isSignal","Computed","fn","prev","useComputed","useEffect","effectFn","signalObject","initialValues","acc","signalToObject","signal","_id","StoreMap","createOptionsStore","options","state","getters","actions","initState","__spreadValues","signalState","subscriptions","actionCallbacks","default_actions","payload","callback","index","states","getter","action","_","createStore","coerceArray","data","noop","isObject","val","isArray","isNil","x","isFunction","isFalsy","kebabCase","string","match","offset","_ComponentNode","template","props","_a","_b","hook","cb","context","node","handler","set","emitter","parent","before","_c","_d","mountedNode","trackKey","suppressCleanupCall","_e","prop","event","listener","cleanup","addEventListener","ComponentNode","h","TemplateNode","isJsxElement","html","Fragment","coerceNode","text","insertChild","child","beforeNode","removeChild","replaceChild","setAttribute","element","attr","obj","binNode","setter","p","nextTick","eventName","patchChildren","childrenMap","nextChildren","result","children","parentChildNodesLength","parentElement","range","start","replaces","nextChildrenMap","mapKeys","i","currChild","currKey","getKey","origChild","patch","placeholder","next","id","_TemplateNode","cloneNode","firstChild","tree","walk","trackLastNodes","isRoot","item","path","patchChild","bindKey","triggerValue","cleanupBind","patchAttribute","nextNodes","newNode","onMount","throwIfOutsideComponent","onDestroy","useProvide","useInject","defaultValue","useRef","refValue","__essor_version","ssrtmpl","templates","jsonToAttrs","json","ssr","newTemplate","tmpl","propKey","idx","str","renderToString","component","hydrate","root"],"mappings":"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","sourcesContent":["type EffectFn = () => void;\n\nlet activeEffect: EffectFn | null = null;\nlet activeComputed: Computed<unknown> | null = null;\n\nconst computedSet = new Set<Computed<unknown>>();\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<EffectFn>>>();\nconst EffectDeps = new Set<EffectFn>();\n\nfunction track(target, key) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n depsMap = new Map();\n targetMap.set(target, depsMap);\n }\n let dep = depsMap.get(key);\n if (!dep) {\n dep = new Set();\n depsMap.set(key, dep);\n }\n if (activeEffect) dep.add(activeEffect);\n if (activeComputed) {\n computedSet.add(activeComputed);\n }\n}\n\nfunction trigger(target, key) {\n if (computedSet.size > 0) {\n computedSet.forEach(computedSignal => computedSignal.run());\n }\n\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const dep = depsMap.get(key);\n if (dep) {\n dep.forEach(effect => EffectDeps.has(effect) && effect());\n }\n}\n\nexport class Signal<T> {\n private _value: T;\n\n constructor(value: T) {\n this._value = value;\n }\n\n valueOf(): T {\n track(this, 'value');\n return this._value;\n }\n\n toString(): string {\n track(this, 'value');\n return String(this._value);\n }\n\n toJSON(): T {\n return this._value;\n }\n\n get value(): T {\n track(this, 'value');\n return this._value;\n }\n\n set value(newValue: T) {\n if (this._value !== newValue) {\n this._value = newValue;\n trigger(this, 'value');\n }\n }\n\n peek(): T {\n return this._value;\n }\n\n update() {\n trigger(this, 'value');\n }\n}\nexport function useSignal<T>(value?: T): Signal<T> {\n if (isSignal(value)) {\n return value as Signal<T>;\n }\n return new Signal<T>(value as T);\n}\n\nexport function isSignal<T>(value: any): value is Signal<T> {\n return value instanceof Signal;\n}\nexport class Computed<T> {\n private _value: T;\n\n constructor(private readonly fn: () => T) {\n const prev = activeComputed;\n activeComputed = this;\n track(this, '_value');\n this._value = this.fn();\n activeComputed = prev;\n }\n\n peek(): T {\n return this._value;\n }\n\n run() {\n const newValue = this.fn();\n if (newValue !== this._value) {\n this._value = newValue;\n }\n }\n\n get value(): T {\n track(this, '_value');\n return this._value;\n }\n}\n\nexport function useComputed<T>(fn: () => T) {\n return new Computed(fn);\n}\n\nexport function isComputed<T>(value: any): value is Computed<T> {\n return value instanceof Computed;\n}\n\nexport function useEffect(fn: EffectFn): () => void {\n function effectFn() {\n const prev = activeEffect;\n activeEffect = effectFn;\n fn();\n activeEffect = prev;\n }\n\n EffectDeps.add(effectFn);\n effectFn();\n\n return () => {\n EffectDeps.delete(effectFn);\n activeEffect = null;\n };\n}\n\nexport type SignalObject<T> = {\n [K in keyof T]: Signal<T[K]>;\n};\nexport function signalObject<T extends Object>(initialValues: T): SignalObject<T> {\n const signals = Object.entries(initialValues).reduce((acc, [key, value]) => {\n acc[key] = isSignal(value) ? value : useSignal(value);\n return acc;\n }, {} as SignalObject<T>);\n\n return signals;\n}\n\nexport function signalToObject<T>(signal: SignalObject<T> | T | Signal<T>): T {\n if (!signal) return {} as T;\n if (isSignal(signal)) {\n return signal.peek();\n }\n return Object.entries(signal).reduce((acc, [key, value]) => {\n acc[key] = isSignal(value) ? value.peek() : value;\n return acc;\n }, {} as T);\n}\n","import {\n type Signal,\n type SignalObject,\n signalObject,\n signalToObject,\n useComputed,\n useSignal,\n} from './signal';\n\ninterface StoreOptions<S, G, A> {\n state?: S;\n getters?: G;\n actions?: A;\n}\ntype PatchPayload = Record<string, any>;\ntype Callback = (value: any) => void;\nexport interface StoreActions {\n patch$: (payload: PatchPayload) => void;\n subscribe$: (callback: Callback) => void;\n unsubscribe$: (callback: Callback) => void;\n onAction$: (callback: Callback) => void;\n reset$: () => void;\n}\n\nlet _id = 0;\nconst StoreMap = new Map<number, any>();\n\nfunction createOptionsStore<S, G, A>(options: StoreOptions<S, G, A>) {\n const { state, getters, actions } = options as StoreOptions<any, any, any>;\n\n const initState = { ...(state ?? {}) };\n const signalState: SignalObject<S> = signalObject(state ?? {});\n\n const subscriptions: Callback[] = [];\n const actionCallbacks: Callback[] = [];\n const default_actions: StoreActions = {\n patch$(payload: PatchPayload) {\n Object.assign(signalState, signalObject(payload));\n subscriptions.forEach(callback => callback(signalToObject(signalState)));\n actionCallbacks.forEach(callback => callback(signalToObject(signalState)));\n },\n subscribe$(callback: Callback) {\n subscriptions.push(callback);\n },\n unsubscribe$(callback: Callback) {\n const index = subscriptions.indexOf(callback);\n if (index !== -1) {\n subscriptions.splice(index, 1);\n }\n },\n onAction$(callback: Callback) {\n actionCallbacks.push(callback);\n },\n reset$() {\n default_actions.patch$(initState);\n },\n };\n const states = {\n _id: `store_${_id}`,\n };\n for (const key in getters) {\n const getter = getters[key];\n if (getter) {\n states[key] = useComputed(() => {\n return getter.call(signalState);\n });\n }\n }\n\n for (const key in actions) {\n const action = actions[key];\n if (action) {\n states[key] = action.bind(signalState);\n }\n }\n\n StoreMap.set(_id, useSignal);\n ++_id;\n\n return new Proxy(\n {},\n {\n get(_, key) {\n if (key === 'state') {\n return signalToObject(signalState);\n }\n if (key in states) {\n return states[key];\n }\n if (key in default_actions) {\n return default_actions[key];\n }\n return signalState[key].value;\n },\n },\n );\n}\n\ntype Getters<S> = {\n [K in keyof S]: S[K] extends (...args: any[]) => any ? Signal<ReturnType<S[K]>> : Signal<S[K]>;\n};\n\nexport function createStore<S, G, A>(\n options: {\n state: S;\n getters?: G;\n actions?: A;\n } & ThisType<SignalObject<S> & Getters<G> & A>,\n): () => S & Getters<G> & A & StoreActions & { state: S } {\n return function () {\n if (StoreMap.has(_id)) {\n return StoreMap.get(_id)!;\n }\n\n return createOptionsStore<S, G, A>(options);\n };\n}\n","export const _toString = Object.prototype.toString;\nexport const extend = Object.assign;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nexport const hasOwn = (val: object, key: string | symbol): key is keyof typeof val =>\n hasOwnProperty.call(val, key);\n\nexport function coerceArray<T>(data: T | T[]): T[] {\n return Array.isArray(data) ? (data.flat() as T[]) : [data];\n}\nexport function hasChanged(value, oldValue) {\n return !Object.is(value, oldValue);\n}\nexport const noop = Function.prototype as () => void;\n","import { _toString } from './comm';\n\nexport const isObject = (val: unknown): val is Record<any, any> =>\n val !== null && typeof val === 'object';\nexport function isPromise(val: any): boolean {\n return _toString.call(val) === '[object Promise]';\n}\n\nexport const isArray = Array.isArray;\n\nexport function isString(val: unknown): val is string {\n return typeof val === 'string';\n}\n\nexport function isSymbol(val: unknown): val is symbol {\n return typeof val === 'symbol';\n}\nexport function isMap(val: unknown): val is Map<any, any> {\n return _toString.call(val) === '[object Map]';\n}\nexport function isNil(x: any): x is null | undefined {\n return x === null || x === undefined;\n}\n\nexport const isIntegerKey = (key: unknown) =>\n isString(key) && key !== 'NaN' && key[0] !== '-' && `${Number.parseInt(key, 10)}` === key;\nexport function isClass(func) {\n return typeof func === 'function' && /^class\\s/.test(Function.prototype.toString.call(func));\n}\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function';\nexport function isPrimitive(s: any): s is string | number {\n return (\n typeof s === 'string' || typeof s === 'number' || s instanceof String || s instanceof Number\n );\n}\nexport function isFalsy(x: any): x is false | null | undefined {\n return x === false || x === null || x === undefined || x === '';\n}\n","export const kebabCase = (string: string): string => {\n return string.replaceAll(/[A-Z]+/g, (match, offset) => {\n return `${offset > 0 ? '-' : ''}${match.toLocaleLowerCase()}`;\n });\n};\n\nexport const camelCase = (str: string): string => {\n const s = str.replaceAll(/[\\s_-]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''));\n return s[0].toLowerCase() + s.slice(1);\n};\n","import { isFunction } from 'essor-shared';\nimport { signalObject } from '../signal';\nimport { type Signal, useEffect, useSignal } from '../signal';\nimport { isSignal } from '../signal/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, unknown>,\n public key?: string,\n ) {\n this.proxyProps = signalObject(props);\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 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 ComponentNode.context = {};\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(this.proxyProps);\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 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, unknown>) {\n for (const [key, prop] of Object.entries(props)) {\n if (key.indexOf('on') === 0 && 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.indexOf('bind:') === 0) {\n this.proxyProps[key] = useSignal(prop);\n } else if (key === 'ref') {\n if (isSignal(prop)) {\n (props[key] as any).value = this.rootNode?.nodes[0];\n } else {\n props[key] = this.rootNode?.nodes[0];\n }\n } else {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = prop;\n });\n }\n }\n this.props = props;\n }\n}\n","import { isFunction } from 'essor-shared';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport type { EssorComponent, EssorNode } from '../../types';\n\nexport function h(\n template: EssorComponent | HTMLTemplateElement,\n props: Record<string, any>,\n key?: string,\n): JSX.Element {\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template, props, key);\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 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 'essor-shared';\nimport { isJsxElement } from './template';\n\n// 将任意数据转换为 Node 或 JSX.Element 类型\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\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\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\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n // 先插入新节点,再移除旧节点\n insertChild(parent, node, child);\n removeChild(child);\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 element.setAttribute(attr, String(value));\n }\n}\n\nexport function binNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n // checkbox\n if (node.type === 'checkbox') {\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n }\n\n // date\n if (node.type === 'date') {\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n }\n\n // file\n if (node.type === 'file') {\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n }\n\n // number\n if (node.type === 'number') {\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n }\n\n // radio\n if (node.type === 'radio') {\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n }\n\n // text\n if (node.type === '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}\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 // 添加事件监听器\n addEventListener(type: string, listener: Listener<unknown>): void;\n // 移除事件监听器\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\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","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 = childrenMap.values();\n const parentChildNodesLength = parent.childNodes.length;\n\n if (childrenMap.size > 0 && nextChildren.length === 0) {\n if (parentChildNodesLength === childrenMap.size + (before ? 1 : 0)) {\n const parentElement = parent as Element;\n parentElement.innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children.next().value;\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\n childrenMap.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children.next().value;\n let currKey = getKey(currChild, i);\n\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children.next().value;\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) {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n } else {\n insertChild(parent, child, before);\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\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\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 { coerceArray, isArray, isFunction, isNil } from 'essor-shared';\nimport { useEffect, useSignal } from '../signal';\nimport { isSignal } from '../signal/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 public key?: string,\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.forEach((item, index) => {\n if (!item) {\n return;\n }\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 {\n props[attr] = node;\n }\n } else if (attr.indexOf('on') === 0) {\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 } else if (attr.indexOf('bind:') === 0) {\n const bindKey = attr.slice(5).toLocaleLowerCase();\n const val = props[attr];\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n const triggerValue = isSignal(val) ? val : useSignal(val);\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(val) ? val.value : val;\n node[bindKey] = triggerValue.value;\n });\n\n const cleanupBind = binNode(node, value => {\n props[`update:${bindKey}`](value);\n });\n\n track.cleanup = () => {\n cleanup?.();\n cleanupBind?.();\n };\n } else if (attr.indexOf('update:') !== 0) {\n const track = this.getNodeTrack(`${key}:${attr}`);\n const val = props[attr];\n const triggerValue = isSignal(val) ? val : useSignal(val);\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(val) ? val.value : val;\n patchAttribute(track, node, attr, triggerValue.value);\n });\n\n track.cleanup = () => {\n cleanup?.();\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 throw new 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\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) {\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\n/**\n * Initializes a reference with a null value of type T or null.\n *\n * @template T - The type of the reference.\n * @return {T & { __is_ref: boolean; current: T | null }} A proxy object allowing custom get and set behavior.\n */\nexport function useRef<T>(): {\n __is_ref: boolean;\n current: T | null;\n} {\n // 初始化 ref 为 null,类型为 T 或 null\n let refValue: T | null = null;\n\n // 使用 Proxy 创建一个代理对象,以便我们可以自定义 get 和 set 行为\n return new Proxy({} as any, {\n get(target, key: string | symbol) {\n // 特殊属性 __is_ref 始终返回 true\n if (key === '__is_ref') {\n return true;\n }\n // 直接返回 refValue\n return refValue;\n },\n set(target, prop: string | symbol, value: any) {\n if (prop === 'current') {\n refValue = value;\n return true;\n }\n refValue = value;\n return true;\n },\n });\n}\n","export const __essor_version = '0.0.5';\n","import { isFunction, isObject } from 'essor-shared';\nimport type { EssorNode } from '../../types';\n\ninterface TemplateMap {\n [key: number]: {\n template: string;\n prop?: Record<string, any>;\n };\n}\n\ntype Props = Record<string, any>;\n\nexport function ssrtmpl(templates: string[] = []): TemplateMap {\n return templates.reduce((acc, template, index) => {\n acc[index + 1] = { template };\n return acc;\n }, {} as TemplateMap);\n}\n\nfunction jsonToAttrs(json: Record<string, any>): string {\n return Object.entries(json)\n .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n .join(' ');\n}\n\nexport function ssr(\n template: TemplateMap | EssorNode | ((props: Props) => string),\n props: Props,\n): string {\n if (isFunction(template)) {\n return template(props);\n }\n\n const childrenMap: Record<string, EssorNode[]> = {};\n const newTemplate: TemplateMap = {};\n if (isObject(template)) {\n Object.entries(template).forEach(([key, tmpl]) => {\n const prop = props[key];\n if (prop) {\n Object.keys(prop).forEach(propKey => {\n if (propKey.startsWith('on') && isFunction(prop[propKey])) {\n delete prop[propKey];\n }\n });\n\n if (prop.children) {\n prop.children.forEach(([child, idx]: [any, number]) => {\n childrenMap[idx] = [...(childrenMap[idx] || []), child];\n });\n delete prop.children;\n }\n }\n\n newTemplate[key] = { template: tmpl.template, prop };\n });\n }\n\n return Object.entries(newTemplate)\n .map(([key, { template: tmpl, prop }]) => {\n let str = tmpl;\n if (prop) {\n str += ` ${jsonToAttrs(prop)}`;\n }\n if (childrenMap[key]) {\n str += childrenMap[key].map(child => ssr(child, prop)).join('');\n }\n\n return str;\n })\n .join('');\n}\n\nexport function renderToString(component: (...args: any[]) => string, props: Props): string {\n return ssr(component, props);\n}\n\nexport function hydrate(\n component: { mount: (root: HTMLElement) => void },\n root: HTMLElement,\n): void {\n root.innerHTML = '';\n component.mount(root);\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -66,8 +66,8 @@ interface NodeTrack {
66
66
  lastNodes?: Map<string, Node | JSX.Element>;
67
67
  }
68
68
 
69
- interface EssorNode<P = any> {
70
- props: P;
69
+ interface EssorNode<T extends Record<string, any> = Record<string, any>> {
70
+ props: T;
71
71
  id?: string;
72
72
  template: EssorComponent | HTMLTemplateElement;
73
73
 
@@ -81,6 +81,12 @@ interface EssorNode<P = any> {
81
81
  unmount(): void;
82
82
  }
83
83
 
84
+ /**
85
+ * Based on JSX types for Surplus and Inferno and adapted for `dom-expressions`.
86
+ *
87
+ * https://github.com/adamhaile/surplus/blob/master/index.d.ts
88
+ * https://github.com/infernojs/inferno/blob/master/packages/inferno/src/core/types.ts
89
+ */
84
90
  type DOMElement = Element;
85
91
  declare const SERIALIZABLE: unique symbol;
86
92
 
@@ -2286,14 +2292,14 @@ declare class ComponentNode$1 implements JSX.Element {
2286
2292
  removeEventListener(): void;
2287
2293
  static ref: ComponentNode$1 | null;
2288
2294
  static context: Record<symbol, Signal<any>>;
2289
- private proxyProps;
2290
- private trackMap;
2291
2295
  id?: string;
2292
- private context;
2293
- private emitter;
2296
+ private proxyProps;
2297
+ context: Record<symbol | string | number, any>;
2298
+ emitter: Set<Function>;
2294
2299
  mounted: boolean;
2295
- private rootNode;
2296
- private hooks;
2300
+ rootNode: TemplateNode | null;
2301
+ hooks: Record<Hook, Set<() => void>>;
2302
+ private trackMap;
2297
2303
  get firstChild(): Node | null;
2298
2304
  get isConnected(): boolean;
2299
2305
  addHook(hook: Hook, cb: () => void): void;
@@ -2332,6 +2338,20 @@ declare function useRef<T>(): {
2332
2338
  current: T | null;
2333
2339
  };
2334
2340
 
2335
- declare const __essor_version = "0.0.5-beta.7";
2341
+ declare const __essor_version = "0.0.5";
2342
+
2343
+ interface TemplateMap {
2344
+ [key: number]: {
2345
+ template: string;
2346
+ prop?: Record<string, any>;
2347
+ };
2348
+ }
2349
+ type Props = Record<string, any>;
2350
+ declare function ssrtmpl(templates?: string[]): TemplateMap;
2351
+ declare function ssr(template: TemplateMap | EssorNode | ((props: Props) => string), props: Props): string;
2352
+ declare function renderToString(component: (...args: any[]) => string, props: Props): string;
2353
+ declare function hydrate(component: {
2354
+ mount: (root: HTMLElement) => void;
2355
+ }, root: HTMLElement): void;
2336
2356
 
2337
- export { ComponentNode$1 as ComponentNode, type EssorComponent, type EssorNode, Fragment, type Hook$1 as Hook, type NodeTrack, type Output, Signal, type StoreActions, TemplateNode, __essor_version, createStore, h, isJsxElement, nextTick, onDestroy, onMount, signalObject, template, useComputed, useEffect, useInject, useProvide, useRef, useSignal };
2357
+ export { ComponentNode$1 as ComponentNode, type EssorComponent, type EssorNode, Fragment, type Hook$1 as Hook, type NodeTrack, type Output, Signal, type StoreActions, TemplateNode, __essor_version, createStore, h, hydrate, isJsxElement, nextTick, onDestroy, onMount, renderToString, signalObject, ssr, ssrtmpl, template, useComputed, useEffect, useInject, useProvide, useRef, useSignal };
package/dist/index.d.ts CHANGED
@@ -66,8 +66,8 @@ interface NodeTrack {
66
66
  lastNodes?: Map<string, Node | JSX.Element>;
67
67
  }
68
68
 
69
- interface EssorNode<P = any> {
70
- props: P;
69
+ interface EssorNode<T extends Record<string, any> = Record<string, any>> {
70
+ props: T;
71
71
  id?: string;
72
72
  template: EssorComponent | HTMLTemplateElement;
73
73
 
@@ -81,6 +81,12 @@ interface EssorNode<P = any> {
81
81
  unmount(): void;
82
82
  }
83
83
 
84
+ /**
85
+ * Based on JSX types for Surplus and Inferno and adapted for `dom-expressions`.
86
+ *
87
+ * https://github.com/adamhaile/surplus/blob/master/index.d.ts
88
+ * https://github.com/infernojs/inferno/blob/master/packages/inferno/src/core/types.ts
89
+ */
84
90
  type DOMElement = Element;
85
91
  declare const SERIALIZABLE: unique symbol;
86
92
 
@@ -2286,14 +2292,14 @@ declare class ComponentNode$1 implements JSX.Element {
2286
2292
  removeEventListener(): void;
2287
2293
  static ref: ComponentNode$1 | null;
2288
2294
  static context: Record<symbol, Signal<any>>;
2289
- private proxyProps;
2290
- private trackMap;
2291
2295
  id?: string;
2292
- private context;
2293
- private emitter;
2296
+ private proxyProps;
2297
+ context: Record<symbol | string | number, any>;
2298
+ emitter: Set<Function>;
2294
2299
  mounted: boolean;
2295
- private rootNode;
2296
- private hooks;
2300
+ rootNode: TemplateNode | null;
2301
+ hooks: Record<Hook, Set<() => void>>;
2302
+ private trackMap;
2297
2303
  get firstChild(): Node | null;
2298
2304
  get isConnected(): boolean;
2299
2305
  addHook(hook: Hook, cb: () => void): void;
@@ -2332,6 +2338,20 @@ declare function useRef<T>(): {
2332
2338
  current: T | null;
2333
2339
  };
2334
2340
 
2335
- declare const __essor_version = "0.0.5-beta.7";
2341
+ declare const __essor_version = "0.0.5";
2342
+
2343
+ interface TemplateMap {
2344
+ [key: number]: {
2345
+ template: string;
2346
+ prop?: Record<string, any>;
2347
+ };
2348
+ }
2349
+ type Props = Record<string, any>;
2350
+ declare function ssrtmpl(templates?: string[]): TemplateMap;
2351
+ declare function ssr(template: TemplateMap | EssorNode | ((props: Props) => string), props: Props): string;
2352
+ declare function renderToString(component: (...args: any[]) => string, props: Props): string;
2353
+ declare function hydrate(component: {
2354
+ mount: (root: HTMLElement) => void;
2355
+ }, root: HTMLElement): void;
2336
2356
 
2337
- export { ComponentNode$1 as ComponentNode, type EssorComponent, type EssorNode, Fragment, type Hook$1 as Hook, type NodeTrack, type Output, Signal, type StoreActions, TemplateNode, __essor_version, createStore, h, isJsxElement, nextTick, onDestroy, onMount, signalObject, template, useComputed, useEffect, useInject, useProvide, useRef, useSignal };
2357
+ export { ComponentNode$1 as ComponentNode, type EssorComponent, type EssorNode, Fragment, type Hook$1 as Hook, type NodeTrack, type Output, Signal, type StoreActions, TemplateNode, __essor_version, createStore, h, hydrate, isJsxElement, nextTick, onDestroy, onMount, renderToString, signalObject, ssr, ssrtmpl, template, useComputed, useEffect, useInject, useProvide, useRef, useSignal };
@@ -234,6 +234,7 @@ function createStore(options) {
234
234
  function coerceArray(data) {
235
235
  return Array.isArray(data) ? data.flat() : [data];
236
236
  }
237
+ var isObject = (val) => val !== null && typeof val === "object";
237
238
  var isArray = Array.isArray;
238
239
  function isNil(x) {
239
240
  return x === null || x === void 0;
@@ -255,7 +256,6 @@ var _ComponentNode = class _ComponentNode {
255
256
  this.props = props;
256
257
  this.key = key;
257
258
  this.proxyProps = {};
258
- this.trackMap = /* @__PURE__ */ new Map();
259
259
  this.context = {};
260
260
  this.emitter = /* @__PURE__ */ new Set();
261
261
  this.mounted = false;
@@ -264,6 +264,7 @@ var _ComponentNode = class _ComponentNode {
264
264
  mounted: /* @__PURE__ */ new Set(),
265
265
  destroy: /* @__PURE__ */ new Set()
266
266
  };
267
+ this.trackMap = /* @__PURE__ */ new Map();
267
268
  this.proxyProps = signalObject(props);
268
269
  }
269
270
  addEventListener() {
@@ -318,7 +319,7 @@ var _ComponentNode = class _ComponentNode {
318
319
  return (_b = (_a = this.rootNode) == null ? void 0 : _a.mount(parent, before)) != null ? _b : [];
319
320
  }
320
321
  _ComponentNode.ref = this;
321
- this.rootNode = this.template(signalToObject(this.proxyProps));
322
+ this.rootNode = this.template(this.proxyProps);
322
323
  _ComponentNode.ref = null;
323
324
  this.mounted = true;
324
325
  const mountedNode = (_d = (_c = this.rootNode) == null ? void 0 : _c.mount(parent, before)) != null ? _d : [];
@@ -339,7 +340,7 @@ var _ComponentNode = class _ComponentNode {
339
340
  return track2;
340
341
  }
341
342
  patchProps(props) {
342
- var _a, _b, _c, _d, _e, _f;
343
+ var _a, _b, _c, _d, _e;
343
344
  for (const [key, prop] of Object.entries(props)) {
344
345
  if (key.indexOf("on") === 0 && ((_a = this.rootNode) == null ? void 0 : _a.nodes)) {
345
346
  const event = key.slice(2).toLowerCase();
@@ -349,17 +350,13 @@ var _ComponentNode = class _ComponentNode {
349
350
  } else if (key.indexOf("bind:") === 0) {
350
351
  this.proxyProps[key] = useSignal(prop);
351
352
  } else if (key === "ref") {
352
- if (isFunction(prop)) {
353
- props[key]((_b = this.rootNode) == null ? void 0 : _b.nodes[0]);
353
+ if (isSignal(prop)) {
354
+ props[key].value = (_b = this.rootNode) == null ? void 0 : _b.nodes[0];
354
355
  } else {
355
- if (isSignal(prop)) {
356
- props[key].value = (_c = this.rootNode) == null ? void 0 : _c.nodes[0];
357
- } else {
358
- props[key] = (_d = this.rootNode) == null ? void 0 : _d.nodes[0];
359
- }
356
+ props[key] = (_c = this.rootNode) == null ? void 0 : _c.nodes[0];
360
357
  }
361
358
  } else {
362
- const newValue = (_f = (_e = this.proxyProps)[key]) != null ? _f : _e[key] = useSignal(prop);
359
+ const newValue = (_e = (_d = this.proxyProps)[key]) != null ? _e : _d[key] = useSignal(prop);
363
360
  const track2 = this.getNodeTrack(key);
364
361
  track2.cleanup = useEffect(() => {
365
362
  newValue.value = prop;
@@ -658,10 +655,10 @@ var TemplateNode = class _TemplateNode {
658
655
  const cloneNode = this.template.content.cloneNode(true);
659
656
  const firstChild = cloneNode.firstChild;
660
657
  if ((_a = firstChild == null ? void 0 : firstChild.hasAttribute) == null ? void 0 : _a.call(firstChild, "_svg_")) {
658
+ firstChild.remove();
661
659
  firstChild == null ? void 0 : firstChild.childNodes.forEach((node) => {
662
660
  cloneNode.append(node);
663
661
  });
664
- firstChild.remove();
665
662
  }
666
663
  this.nodes = Array.from(cloneNode.childNodes);
667
664
  this.mapNodeTree(parent, cloneNode);
@@ -743,8 +740,8 @@ var TemplateNode = class _TemplateNode {
743
740
  });
744
741
  }
745
742
  } else if (attr === "ref") {
746
- if (isFunction(props[attr])) {
747
- props[attr](node);
743
+ if (isSignal(props[attr])) {
744
+ props[attr].value = node;
748
745
  } else {
749
746
  props[attr] = node;
750
747
  }
@@ -759,7 +756,7 @@ var TemplateNode = class _TemplateNode {
759
756
  const track2 = this.getNodeTrack(`${key}:${attr}`);
760
757
  const triggerValue = isSignal(val) ? val : useSignal(val);
761
758
  const cleanup = useEffect(() => {
762
- triggerValue.value = val;
759
+ triggerValue.value = isSignal(val) ? val.value : val;
763
760
  node[bindKey] = triggerValue.value;
764
761
  });
765
762
  const cleanupBind = binNode(node, (value) => {
@@ -774,7 +771,7 @@ var TemplateNode = class _TemplateNode {
774
771
  const val = props[attr];
775
772
  const triggerValue = isSignal(val) ? val : useSignal(val);
776
773
  const cleanup = useEffect(() => {
777
- triggerValue.value = val;
774
+ triggerValue.value = isSignal(val) ? val.value : val;
778
775
  patchAttribute(track2, node, attr, triggerValue.value);
779
776
  });
780
777
  track2.cleanup = () => {
@@ -862,7 +859,61 @@ function useRef() {
862
859
  }
863
860
 
864
861
  // src/version.ts
865
- var __essor_version = "0.0.5-beta.7";
862
+ var __essor_version = "0.0.5";
863
+
864
+ // src/server/index.ts
865
+ function ssrtmpl(templates = []) {
866
+ return templates.reduce((acc, template2, index) => {
867
+ acc[index + 1] = { template: template2 };
868
+ return acc;
869
+ }, {});
870
+ }
871
+ function jsonToAttrs(json) {
872
+ return Object.entries(json).map(([key, value]) => `${key}=${JSON.stringify(value)}`).join(" ");
873
+ }
874
+ function ssr(template2, props) {
875
+ if (isFunction(template2)) {
876
+ return template2(props);
877
+ }
878
+ const childrenMap = {};
879
+ const newTemplate = {};
880
+ if (isObject(template2)) {
881
+ Object.entries(template2).forEach(([key, tmpl]) => {
882
+ const prop = props[key];
883
+ if (prop) {
884
+ Object.keys(prop).forEach((propKey) => {
885
+ if (propKey.startsWith("on") && isFunction(prop[propKey])) {
886
+ delete prop[propKey];
887
+ }
888
+ });
889
+ if (prop.children) {
890
+ prop.children.forEach(([child, idx]) => {
891
+ childrenMap[idx] = [...childrenMap[idx] || [], child];
892
+ });
893
+ delete prop.children;
894
+ }
895
+ }
896
+ newTemplate[key] = { template: tmpl.template, prop };
897
+ });
898
+ }
899
+ return Object.entries(newTemplate).map(([key, { template: tmpl, prop }]) => {
900
+ let str = tmpl;
901
+ if (prop) {
902
+ str += ` ${jsonToAttrs(prop)}`;
903
+ }
904
+ if (childrenMap[key]) {
905
+ str += childrenMap[key].map((child) => ssr(child, prop)).join("");
906
+ }
907
+ return str;
908
+ }).join("");
909
+ }
910
+ function renderToString(component, props) {
911
+ return ssr(component, props);
912
+ }
913
+ function hydrate(component, root) {
914
+ root.innerHTML = "";
915
+ component.mount(root);
916
+ }
866
917
 
867
918
  exports.ComponentNode = ComponentNode;
868
919
  exports.Fragment = Fragment;
@@ -870,11 +921,15 @@ exports.TemplateNode = TemplateNode;
870
921
  exports.__essor_version = __essor_version;
871
922
  exports.createStore = createStore;
872
923
  exports.h = h;
924
+ exports.hydrate = hydrate;
873
925
  exports.isJsxElement = isJsxElement;
874
926
  exports.nextTick = nextTick;
875
927
  exports.onDestroy = onDestroy;
876
928
  exports.onMount = onMount;
929
+ exports.renderToString = renderToString;
877
930
  exports.signalObject = signalObject;
931
+ exports.ssr = ssr;
932
+ exports.ssrtmpl = ssrtmpl;
878
933
  exports.template = template;
879
934
  exports.useComputed = useComputed;
880
935
  exports.useEffect = useEffect;
@@ -232,6 +232,7 @@ function createStore(options) {
232
232
  function coerceArray(data) {
233
233
  return Array.isArray(data) ? data.flat() : [data];
234
234
  }
235
+ var isObject = (val) => val !== null && typeof val === "object";
235
236
  var isArray = Array.isArray;
236
237
  function isNil(x) {
237
238
  return x === null || x === void 0;
@@ -253,7 +254,6 @@ var _ComponentNode = class _ComponentNode {
253
254
  this.props = props;
254
255
  this.key = key;
255
256
  this.proxyProps = {};
256
- this.trackMap = /* @__PURE__ */ new Map();
257
257
  this.context = {};
258
258
  this.emitter = /* @__PURE__ */ new Set();
259
259
  this.mounted = false;
@@ -262,6 +262,7 @@ var _ComponentNode = class _ComponentNode {
262
262
  mounted: /* @__PURE__ */ new Set(),
263
263
  destroy: /* @__PURE__ */ new Set()
264
264
  };
265
+ this.trackMap = /* @__PURE__ */ new Map();
265
266
  this.proxyProps = signalObject(props);
266
267
  }
267
268
  addEventListener() {
@@ -316,7 +317,7 @@ var _ComponentNode = class _ComponentNode {
316
317
  return (_b = (_a = this.rootNode) == null ? void 0 : _a.mount(parent, before)) != null ? _b : [];
317
318
  }
318
319
  _ComponentNode.ref = this;
319
- this.rootNode = this.template(signalToObject(this.proxyProps));
320
+ this.rootNode = this.template(this.proxyProps);
320
321
  _ComponentNode.ref = null;
321
322
  this.mounted = true;
322
323
  const mountedNode = (_d = (_c = this.rootNode) == null ? void 0 : _c.mount(parent, before)) != null ? _d : [];
@@ -337,7 +338,7 @@ var _ComponentNode = class _ComponentNode {
337
338
  return track2;
338
339
  }
339
340
  patchProps(props) {
340
- var _a, _b, _c, _d, _e, _f;
341
+ var _a, _b, _c, _d, _e;
341
342
  for (const [key, prop] of Object.entries(props)) {
342
343
  if (key.indexOf("on") === 0 && ((_a = this.rootNode) == null ? void 0 : _a.nodes)) {
343
344
  const event = key.slice(2).toLowerCase();
@@ -347,17 +348,13 @@ var _ComponentNode = class _ComponentNode {
347
348
  } else if (key.indexOf("bind:") === 0) {
348
349
  this.proxyProps[key] = useSignal(prop);
349
350
  } else if (key === "ref") {
350
- if (isFunction(prop)) {
351
- props[key]((_b = this.rootNode) == null ? void 0 : _b.nodes[0]);
351
+ if (isSignal(prop)) {
352
+ props[key].value = (_b = this.rootNode) == null ? void 0 : _b.nodes[0];
352
353
  } else {
353
- if (isSignal(prop)) {
354
- props[key].value = (_c = this.rootNode) == null ? void 0 : _c.nodes[0];
355
- } else {
356
- props[key] = (_d = this.rootNode) == null ? void 0 : _d.nodes[0];
357
- }
354
+ props[key] = (_c = this.rootNode) == null ? void 0 : _c.nodes[0];
358
355
  }
359
356
  } else {
360
- const newValue = (_f = (_e = this.proxyProps)[key]) != null ? _f : _e[key] = useSignal(prop);
357
+ const newValue = (_e = (_d = this.proxyProps)[key]) != null ? _e : _d[key] = useSignal(prop);
361
358
  const track2 = this.getNodeTrack(key);
362
359
  track2.cleanup = useEffect(() => {
363
360
  newValue.value = prop;
@@ -656,10 +653,10 @@ var TemplateNode = class _TemplateNode {
656
653
  const cloneNode = this.template.content.cloneNode(true);
657
654
  const firstChild = cloneNode.firstChild;
658
655
  if ((_a = firstChild == null ? void 0 : firstChild.hasAttribute) == null ? void 0 : _a.call(firstChild, "_svg_")) {
656
+ firstChild.remove();
659
657
  firstChild == null ? void 0 : firstChild.childNodes.forEach((node) => {
660
658
  cloneNode.append(node);
661
659
  });
662
- firstChild.remove();
663
660
  }
664
661
  this.nodes = Array.from(cloneNode.childNodes);
665
662
  this.mapNodeTree(parent, cloneNode);
@@ -741,8 +738,8 @@ var TemplateNode = class _TemplateNode {
741
738
  });
742
739
  }
743
740
  } else if (attr === "ref") {
744
- if (isFunction(props[attr])) {
745
- props[attr](node);
741
+ if (isSignal(props[attr])) {
742
+ props[attr].value = node;
746
743
  } else {
747
744
  props[attr] = node;
748
745
  }
@@ -757,7 +754,7 @@ var TemplateNode = class _TemplateNode {
757
754
  const track2 = this.getNodeTrack(`${key}:${attr}`);
758
755
  const triggerValue = isSignal(val) ? val : useSignal(val);
759
756
  const cleanup = useEffect(() => {
760
- triggerValue.value = val;
757
+ triggerValue.value = isSignal(val) ? val.value : val;
761
758
  node[bindKey] = triggerValue.value;
762
759
  });
763
760
  const cleanupBind = binNode(node, (value) => {
@@ -772,7 +769,7 @@ var TemplateNode = class _TemplateNode {
772
769
  const val = props[attr];
773
770
  const triggerValue = isSignal(val) ? val : useSignal(val);
774
771
  const cleanup = useEffect(() => {
775
- triggerValue.value = val;
772
+ triggerValue.value = isSignal(val) ? val.value : val;
776
773
  patchAttribute(track2, node, attr, triggerValue.value);
777
774
  });
778
775
  track2.cleanup = () => {
@@ -860,6 +857,60 @@ function useRef() {
860
857
  }
861
858
 
862
859
  // src/version.ts
863
- var __essor_version = "0.0.5-beta.7";
860
+ var __essor_version = "0.0.5";
861
+
862
+ // src/server/index.ts
863
+ function ssrtmpl(templates = []) {
864
+ return templates.reduce((acc, template2, index) => {
865
+ acc[index + 1] = { template: template2 };
866
+ return acc;
867
+ }, {});
868
+ }
869
+ function jsonToAttrs(json) {
870
+ return Object.entries(json).map(([key, value]) => `${key}=${JSON.stringify(value)}`).join(" ");
871
+ }
872
+ function ssr(template2, props) {
873
+ if (isFunction(template2)) {
874
+ return template2(props);
875
+ }
876
+ const childrenMap = {};
877
+ const newTemplate = {};
878
+ if (isObject(template2)) {
879
+ Object.entries(template2).forEach(([key, tmpl]) => {
880
+ const prop = props[key];
881
+ if (prop) {
882
+ Object.keys(prop).forEach((propKey) => {
883
+ if (propKey.startsWith("on") && isFunction(prop[propKey])) {
884
+ delete prop[propKey];
885
+ }
886
+ });
887
+ if (prop.children) {
888
+ prop.children.forEach(([child, idx]) => {
889
+ childrenMap[idx] = [...childrenMap[idx] || [], child];
890
+ });
891
+ delete prop.children;
892
+ }
893
+ }
894
+ newTemplate[key] = { template: tmpl.template, prop };
895
+ });
896
+ }
897
+ return Object.entries(newTemplate).map(([key, { template: tmpl, prop }]) => {
898
+ let str = tmpl;
899
+ if (prop) {
900
+ str += ` ${jsonToAttrs(prop)}`;
901
+ }
902
+ if (childrenMap[key]) {
903
+ str += childrenMap[key].map((child) => ssr(child, prop)).join("");
904
+ }
905
+ return str;
906
+ }).join("");
907
+ }
908
+ function renderToString(component, props) {
909
+ return ssr(component, props);
910
+ }
911
+ function hydrate(component, root) {
912
+ root.innerHTML = "";
913
+ component.mount(root);
914
+ }
864
915
 
865
- export { ComponentNode, Fragment, TemplateNode, __essor_version, createStore, h, isJsxElement, nextTick, onDestroy, onMount, signalObject, template, useComputed, useEffect, useInject, useProvide, useRef, useSignal };
916
+ export { ComponentNode, Fragment, TemplateNode, __essor_version, createStore, h, hydrate, isJsxElement, nextTick, onDestroy, onMount, renderToString, signalObject, ssr, ssrtmpl, template, useComputed, useEffect, useInject, useProvide, useRef, useSignal };
package/dist/index.esm.js CHANGED
@@ -1,6 +1,6 @@
1
- var se=Object.defineProperty;var Z=Object.getOwnPropertySymbols;var ae=Object.prototype.hasOwnProperty,ce=Object.prototype.propertyIsEnumerable;var q=(t,e,n)=>e in t?se(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Q=(t,e)=>{for(var n in e||(e={}))ae.call(e,n)&&q(t,n,e[n]);if(Z)for(var n of Z(e))ce.call(e,n)&&q(t,n,e[n]);return t};var k=null,O=null,K=new Set,F=new WeakMap,H=new Set;function j(t,e){let n=F.get(t);n||(n=new Map,F.set(t,n));let o=n.get(e);o||(o=new Set,n.set(e,o)),k&&o.add(k),O&&K.add(O);}function Y(t,e){K.size>0&&K.forEach(r=>r.run());let n=F.get(t);if(!n)return;let o=n.get(e);o&&o.forEach(r=>H.has(r)&&r());}var $=class{constructor(e){this._value=e;}valueOf(){return j(this,"value"),this._value}toString(){return j(this,"value"),String(this._value)}toJSON(){return this._value}get value(){return j(this,"value"),this._value}set value(e){this._value!==e&&(this._value=e,Y(this,"value"));}peek(){return this._value}update(){Y(this,"value");}};function y(t){return T(t)?t:new $(t)}function T(t){return t instanceof $}var R=class{constructor(e){this.fn=e;let n=O;O=this,j(this,"_value"),this._value=this.fn(),O=n;}peek(){return this._value}run(){let e=this.fn();e!==this._value&&(this._value=e);}get value(){return j(this,"_value"),this._value}};function J(t){return new R(t)}function S(t){function e(){let n=k;k=e,t(),k=n;}return H.add(e),e(),()=>{H.delete(e),k=null;}}function C(t){return Object.entries(t).reduce((n,[o,r])=>(n[o]=T(r)?r:y(r),n),{})}function w(t){return t?T(t)?t.peek():Object.entries(t).reduce((e,[n,o])=>(e[n]=T(o)?o.peek():o,e),{}):{}}var L=0,G=new Map;function le(t){let{state:e,getters:n,actions:o}=t,r=Q({},e!=null?e:{}),i=C(e!=null?e:{}),l=[],p=[],u={patch$(a){Object.assign(i,C(a)),l.forEach(c=>c(w(i))),p.forEach(c=>c(w(i)));},subscribe$(a){l.push(a);},unsubscribe$(a){let c=l.indexOf(a);c!==-1&&l.splice(c,1);},onAction$(a){p.push(a);},reset$(){u.patch$(r);}},s={_id:`store_${L}`};for(let a in n){let c=n[a];c&&(s[a]=J(()=>c.call(i)));}for(let a in o){let c=o[a];c&&(s[a]=c.bind(i));}return G.set(L,y),++L,new Proxy({},{get(a,c){return c==="state"?w(i):c in s?s[c]:c in u?u[c]:i[c].value}})}function ue(t){return function(){return G.has(L)?G.get(L):le(t)}}function I(t){return Array.isArray(t)?t.flat():[t]}var X=Array.isArray;function ee(t){return t==null}var b=t=>typeof t=="function";function V(t){return t===!1||t===null||t===void 0||t===""}var te=t=>t.replaceAll(/[A-Z]+/g,(e,n)=>`${n>0?"-":""}${e.toLocaleLowerCase()}`);var x=class x{constructor(e,n,o){this.template=e;this.props=n;this.key=o;this.proxyProps={};this.trackMap=new Map;this.context={};this.emitter=new Set;this.mounted=!1;this.rootNode=null;this.hooks={mounted:new Set,destroy:new Set};this.proxyProps=C(n);}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 x.context[e]}setContext(e,n){x.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);}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()),x.context={};}mount(e,n){var r,i,l,p;if(!b(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:[];x.ref=this,this.rootNode=this.template(w(this.proxyProps)),x.ref=null,this.mounted=!0;let o=(p=(l=this.rootNode)==null?void 0:l.mount(e,n))!=null?p:[];return this.hooks.mounted.forEach(u=>u()),this.patchProps(this.props),o}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,l,p;for(let[u,s]of Object.entries(e))if(u.indexOf("on")===0&&((n=this.rootNode)!=null&&n.nodes)){let a=u.slice(2).toLowerCase(),c=s,v=h(this.rootNode.nodes[0],a,c);this.emitter.add(v);}else if(u.indexOf("bind:")===0)this.proxyProps[u]=y(s);else if(u==="ref")b(s)?e[u]((o=this.rootNode)==null?void 0:o.nodes[0]):T(s)?e[u].value=(r=this.rootNode)==null?void 0:r.nodes[0]:e[u]=(i=this.rootNode)==null?void 0:i.nodes[0];else {let a=(p=(l=this.proxyProps)[u])!=null?p:l[u]=y(s),c=this.getNodeTrack(u);c.cleanup=S(()=>{a.value=s;});}this.props=e;}};x.ref=null,x.context={};var m=x;function pe(t,e,n){return b(t)?new m(t,e,n):new M(t,e,n)}function g(t){return t instanceof m||t instanceof M}function fe(t){let e=document.createElement("template");return e.innerHTML=t,e}function de(t){return t.children}function D(t){if(g(t)||t instanceof Node)return t;let e=V(t)?"":String(t);return document.createTextNode(e)}function N(t,e,n=null){let o=g(n)?n.firstChild:n;g(e)?e.mount(t,o):o?o.before(e):t.append(e);}function E(t){g(t)?t.unmount():t.parentNode&&t.remove();}function z(t,e,n){N(t,e,n),E(n);}function B(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(te(r),String(o[r]));});}return}V(n)?t.removeAttribute(e):n===!0?t.setAttribute(e,""):t.setAttribute(e,String(n));}function oe(t,e){if(t instanceof HTMLInputElement){if(t.type==="checkbox")return h(t,"change",()=>{e(!!t.checked);});if(t.type==="date")return h(t,"change",()=>{e(t.value?t.value:"");});if(t.type==="file")return h(t,"change",()=>{t.files&&e(t.files);});if(t.type==="number")return h(t,"input",()=>{let n=Number.parseFloat(t.value);e(Number.isNaN(n)?"":String(n));});if(t.type==="radio")return h(t,"change",()=>{e(t.checked?t.value:"");});if(t.type==="text")return h(t,"input",()=>{e(t.value);})}if(t instanceof HTMLSelectElement)return h(t,"change",()=>{e(t.value);});if(t instanceof HTMLTextAreaElement)return h(t,"input",()=>{e(t.value);})}var ne=Promise.resolve();function me(t){return t?ne.then(t):ne}function h(t,e,n){return t.addEventListener(e,n),()=>t.removeEventListener(e,n)}function re(t,e,n,o){let r=new Map,i=e.values(),l=t.childNodes.length;if(e.size>0&&n.length===0){if(l===e.size+(o?1:0)){let s=t;s.innerHTML="",o&&N(t,o);}else {let s=document.createRange(),a=i.next().value,c=g(a)?a.firstChild:a;s.setStartBefore(c),o?s.setEndBefore(o):s.setEndAfter(t),s.deleteContents();}return e.forEach(s=>{g(s)&&s.unmount();}),r}let p=[],u=ge(n);for(let[s,a]of n.entries()){let c=i.next().value,v=_(c,s);for(;c&&!u.has(v);)E(c),e.delete(v),c=i.next().value,v=_(c,s);let A=_(a,s),U=e.get(A);if(U&&(a=he(t,U,a)),c)if(c){let W=document.createComment("");N(t,W,c),p.push([W,a]);}else N(t,a,o);else N(t,a,o);r.set(A,a);}return p.forEach(([s,a])=>z(t,a,s)),e.forEach((s,a)=>{s.isConnected&&!r.has(a)&&E(s);}),r}function he(t,e,n){return e===n?e:g(e)&&g(n)&&e.template===n.template?(n.inheritNode(e),n):e instanceof Text&&n instanceof Text?(e.textContent!==n.textContent&&(e.textContent=n.textContent),e):(z(t,n,e),n)}function ge(t){let e=new Map;for(let[n,o]of t.entries()){let r=_(o,n);e.set(r,o);}return e}function _(t,e){let n=t instanceof Element?t.id:void 0,o=n===""?void 0:n;return o!=null?o:`_$${e}$`}var M=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(){}unmount(){this.trackMap.forEach(e=>{var n,o;(n=e.cleanup)==null||n.call(e),(o=e.lastNodes)==null||o.forEach(r=>{e.isRoot?E(r):r instanceof t&&r.unmount();});}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>E(e)),this.nodes=[],this.mounted=!1;}mount(e,n){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(l=>N(e,l,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==null||r.childNodes.forEach(l=>{o.append(l);}),r.remove()),this.nodes=Array.from(o.childNodes),this.mapNodeTree(e,o),N(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 l=i.firstChild;for(;l;)r(l),l=l.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(X(o.children))o.children.forEach((l,p)=>{var A;if(!l)return;let[u,s]=X(l)?l:[l,null],a=ee(s)?null:(A=this.treeMap.get(s))!=null?A:null,c=`${e}:${i}:${p}`,v=this.getNodeTrack(c,!0,r);ie(v,n,u,a);});else {let l=`${e}:${i}:0`,p=this.getNodeTrack(l,!0,r);ie(p,n,o.children,null);}else if(i==="ref")b(o[i])?o[i](n):o[i]=n;else if(i.indexOf("on")===0){let l=i.slice(2).toLocaleLowerCase(),p=this.getNodeTrack(`${e}:${i}`),u=o[i];p.cleanup=h(n,l,u);}else if(i.indexOf("bind:")===0){let l=i.slice(5).toLocaleLowerCase(),p=o[i],u=this.getNodeTrack(`${e}:${i}`),s=T(p)?p:y(p),a=S(()=>{s.value=p,n[l]=s.value;}),c=oe(n,v=>{o[`update:${l}`](v);});u.cleanup=()=>{a==null||a(),c==null||c();};}else if(i.indexOf("update:")!==0){let l=this.getNodeTrack(`${e}:${i}`),p=o[i],u=T(p)?p:y(p),s=S(()=>{u.value=p,ye(l,n,i,u.value);});l.cleanup=()=>{s==null||s();};}}};function ye(t,e,n,o){let r=e;r.setAttribute&&(b(o)?t.cleanup=S(()=>{B(r,n,o());}):B(r,n,o));}function ie(t,e,n,o){b(n)?t.cleanup=S(()=>{let r=I(n()).map(D);t.lastNodes=re(e,t.lastNodes,r,o);}):I(n).forEach((r,i)=>{let l=D(r);t.lastNodes.set(String(i),l),N(e,l,o);});}function Ne(t){var e;P("onMounted"),(e=m.ref)==null||e.addHook("mounted",t);}function ve(t){var e;P("onDestroy"),(e=m.ref)==null||e.addHook("destroy",t);}function P(t){if(!m.ref)throw new Error(`"${t}" can only be called within the component function body
2
- and cannot be used in asynchronous or deferred calls.`)}function Te(t,e){var n;P("useProvide"),(n=m.ref)==null||n.setContext(t,e);}function be(t,e){var n;return P("useInject"),((n=m.ref)==null?void 0:n.getContext(t))||e}function xe(){let t=null;return new Proxy({},{get(e,n){return n==="__is_ref"?!0:t},set(e,n,o){return t=o,!0}})}var bt="0.0.5-beta.7";
1
+ var ce=Object.defineProperty;var Z=Object.getOwnPropertySymbols;var ue=Object.prototype.hasOwnProperty,le=Object.prototype.propertyIsEnumerable;var q=(t,e,n)=>e in t?ce(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Q=(t,e)=>{for(var n in e||(e={}))ue.call(e,n)&&q(t,n,e[n]);if(Z)for(var n of Z(e))le.call(e,n)&&q(t,n,e[n]);return t};var k=null,j=null,H=new Set,F=new WeakMap,R=new Set;function A(t,e){let n=F.get(t);n||(n=new Map,F.set(t,n));let o=n.get(e);o||(o=new Set,n.set(e,o)),k&&o.add(k),j&&H.add(j);}function Y(t,e){H.size>0&&H.forEach(r=>r.run());let n=F.get(t);if(!n)return;let o=n.get(e);o&&o.forEach(r=>R.has(r)&&r());}var L=class{constructor(e){this._value=e;}valueOf(){return A(this,"value"),this._value}toString(){return A(this,"value"),String(this._value)}toJSON(){return this._value}get value(){return A(this,"value"),this._value}set value(e){this._value!==e&&(this._value=e,Y(this,"value"));}peek(){return this._value}update(){Y(this,"value");}};function N(t){return m(t)?t:new L(t)}function m(t){return t instanceof L}var K=class{constructor(e){this.fn=e;let n=j;j=this,A(this,"_value"),this._value=this.fn(),j=n;}peek(){return this._value}run(){let e=this.fn();e!==this._value&&(this._value=e);}get value(){return A(this,"_value"),this._value}};function J(t){return new K(t)}function x(t){function e(){let n=k;k=e,t(),k=n;}return R.add(e),e(),()=>{R.delete(e),k=null;}}function C(t){return Object.entries(t).reduce((n,[o,r])=>(n[o]=m(r)?r:N(r),n),{})}function $(t){return t?m(t)?t.peek():Object.entries(t).reduce((e,[n,o])=>(e[n]=m(o)?o.peek():o,e),{}):{}}var O=0,G=new Map;function pe(t){let{state:e,getters:n,actions:o}=t,r=Q({},e!=null?e:{}),i=C(e!=null?e:{}),s=[],a=[],p={patch$(c){Object.assign(i,C(c)),s.forEach(u=>u($(i))),a.forEach(u=>u($(i)));},subscribe$(c){s.push(c);},unsubscribe$(c){let u=s.indexOf(c);u!==-1&&s.splice(u,1);},onAction$(c){a.push(c);},reset$(){p.patch$(r);}},l={_id:`store_${O}`};for(let c in n){let u=n[c];u&&(l[c]=J(()=>u.call(i)));}for(let c in o){let u=o[c];u&&(l[c]=u.bind(i));}return G.set(O,N),++O,new Proxy({},{get(c,u){return u==="state"?$(i):u in l?l[u]:u in p?p[u]:i[u].value}})}function fe(t){return function(){return G.has(O)?G.get(O):pe(t)}}function I(t){return Array.isArray(t)?t.flat():[t]}var ee=t=>t!==null&&typeof t=="object";var X=Array.isArray;function te(t){return t==null}var v=t=>typeof t=="function";function V(t){return t===!1||t===null||t===void 0||t===""}var ne=t=>t.replaceAll(/[A-Z]+/g,(e,n)=>`${n>0?"-":""}${e.toLocaleLowerCase()}`);var b=class b{constructor(e,n,o){this.template=e;this.props=n;this.key=o;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=C(n);}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 b.context[e]}setContext(e,n){b.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);}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()),b.context={};}mount(e,n){var r,i,s,a;if(!v(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:[];b.ref=this,this.rootNode=this.template(this.proxyProps),b.ref=null,this.mounted=!0;let o=(a=(s=this.rootNode)==null?void 0:s.mount(e,n))!=null?a:[];return this.hooks.mounted.forEach(p=>p()),this.patchProps(this.props),o}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,s;for(let[a,p]of Object.entries(e))if(a.indexOf("on")===0&&((n=this.rootNode)!=null&&n.nodes)){let l=a.slice(2).toLowerCase(),c=p,u=g(this.rootNode.nodes[0],l,c);this.emitter.add(u);}else if(a.indexOf("bind:")===0)this.proxyProps[a]=N(p);else if(a==="ref")m(p)?e[a].value=(o=this.rootNode)==null?void 0:o.nodes[0]:e[a]=(r=this.rootNode)==null?void 0:r.nodes[0];else {let l=(s=(i=this.proxyProps)[a])!=null?s:i[a]=N(p),c=this.getNodeTrack(a);c.cleanup=x(()=>{l.value=p;});}this.props=e;}};b.ref=null,b.context={};var h=b;function de(t,e,n){return v(t)?new h(t,e,n):new M(t,e,n)}function y(t){return t instanceof h||t instanceof M}function me(t){let e=document.createElement("template");return e.innerHTML=t,e}function he(t){return t.children}function D(t){if(y(t)||t instanceof Node)return t;let e=V(t)?"":String(t);return document.createTextNode(e)}function T(t,e,n=null){let o=y(n)?n.firstChild:n;y(e)?e.mount(t,o):o?o.before(e):t.append(e);}function S(t){y(t)?t.unmount():t.parentNode&&t.remove();}function z(t,e,n){T(t,e,n),S(n);}function B(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(ne(r),String(o[r]));});}return}V(n)?t.removeAttribute(e):n===!0?t.setAttribute(e,""):t.setAttribute(e,String(n));}function re(t,e){if(t instanceof HTMLInputElement){if(t.type==="checkbox")return g(t,"change",()=>{e(!!t.checked);});if(t.type==="date")return g(t,"change",()=>{e(t.value?t.value:"");});if(t.type==="file")return g(t,"change",()=>{t.files&&e(t.files);});if(t.type==="number")return g(t,"input",()=>{let n=Number.parseFloat(t.value);e(Number.isNaN(n)?"":String(n));});if(t.type==="radio")return g(t,"change",()=>{e(t.checked?t.value:"");});if(t.type==="text")return g(t,"input",()=>{e(t.value);})}if(t instanceof HTMLSelectElement)return g(t,"change",()=>{e(t.value);});if(t instanceof HTMLTextAreaElement)return g(t,"input",()=>{e(t.value);})}var oe=Promise.resolve();function ge(t){return t?oe.then(t):oe}function g(t,e,n){return t.addEventListener(e,n),()=>t.removeEventListener(e,n)}function ie(t,e,n,o){let r=new Map,i=e.values(),s=t.childNodes.length;if(e.size>0&&n.length===0){if(s===e.size+(o?1:0)){let l=t;l.innerHTML="",o&&T(t,o);}else {let l=document.createRange(),c=i.next().value,u=y(c)?c.firstChild:c;l.setStartBefore(u),o?l.setEndBefore(o):l.setEndAfter(t),l.deleteContents();}return e.forEach(l=>{y(l)&&l.unmount();}),r}let a=[],p=Ne(n);for(let[l,c]of n.entries()){let u=i.next().value,E=P(u,l);for(;u&&!p.has(E);)S(u),e.delete(E),u=i.next().value,E=P(u,l);let w=P(c,l),U=e.get(w);if(U&&(c=ye(t,U,c)),u)if(u){let W=document.createComment("");T(t,W,u),a.push([W,c]);}else T(t,c,o);else T(t,c,o);r.set(w,c);}return a.forEach(([l,c])=>z(t,c,l)),e.forEach((l,c)=>{l.isConnected&&!r.has(c)&&S(l);}),r}function ye(t,e,n){return e===n?e:y(e)&&y(n)&&e.template===n.template?(n.inheritNode(e),n):e instanceof Text&&n instanceof Text?(e.textContent!==n.textContent&&(e.textContent=n.textContent),e):(z(t,n,e),n)}function Ne(t){let e=new Map;for(let[n,o]of t.entries()){let r=P(o,n);e.set(r,o);}return e}function P(t,e){let n=t instanceof Element?t.id:void 0,o=n===""?void 0:n;return o!=null?o:`_$${e}$`}var M=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(){}unmount(){this.trackMap.forEach(e=>{var n,o;(n=e.cleanup)==null||n.call(e),(o=e.lastNodes)==null||o.forEach(r=>{e.isRoot?S(r):r instanceof t&&r.unmount();});}),this.trackMap.clear(),this.treeMap.clear(),this.nodes.forEach(e=>S(e)),this.nodes=[],this.mounted=!1;}mount(e,n){var i;if(this.parent=e,this.isConnected)return this.nodes.forEach(s=>T(e,s,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(s=>{o.append(s);})),this.nodes=Array.from(o.childNodes),this.mapNodeTree(e,o),T(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 s=i.firstChild;for(;s;)r(s),s=s.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(X(o.children))o.children.forEach((s,a)=>{var w;if(!s)return;let[p,l]=X(s)?s:[s,null],c=te(l)?null:(w=this.treeMap.get(l))!=null?w:null,u=`${e}:${i}:${a}`,E=this.getNodeTrack(u,!0,r);se(E,n,p,c);});else {let s=`${e}:${i}:0`,a=this.getNodeTrack(s,!0,r);se(a,n,o.children,null);}else if(i==="ref")m(o[i])?o[i].value=n:o[i]=n;else if(i.indexOf("on")===0){let s=i.slice(2).toLocaleLowerCase(),a=this.getNodeTrack(`${e}:${i}`),p=o[i];a.cleanup=g(n,s,p);}else if(i.indexOf("bind:")===0){let s=i.slice(5).toLocaleLowerCase(),a=o[i],p=this.getNodeTrack(`${e}:${i}`),l=m(a)?a:N(a),c=x(()=>{l.value=m(a)?a.value:a,n[s]=l.value;}),u=re(n,E=>{o[`update:${s}`](E);});p.cleanup=()=>{c==null||c(),u==null||u();};}else if(i.indexOf("update:")!==0){let s=this.getNodeTrack(`${e}:${i}`),a=o[i],p=m(a)?a:N(a),l=x(()=>{p.value=m(a)?a.value:a,ve(s,n,i,p.value);});s.cleanup=()=>{l==null||l();};}}};function ve(t,e,n,o){let r=e;r.setAttribute&&(v(o)?t.cleanup=x(()=>{B(r,n,o());}):B(r,n,o));}function se(t,e,n,o){v(n)?t.cleanup=x(()=>{let r=I(n()).map(D);t.lastNodes=ie(e,t.lastNodes,r,o);}):I(n).forEach((r,i)=>{let s=D(r);t.lastNodes.set(String(i),s),T(e,s,o);});}function Te(t){var e;_("onMounted"),(e=h.ref)==null||e.addHook("mounted",t);}function be(t){var e;_("onDestroy"),(e=h.ref)==null||e.addHook("destroy",t);}function _(t){if(!h.ref)throw new Error(`"${t}" can only be called within the component function body
2
+ and cannot be used in asynchronous or deferred calls.`)}function xe(t,e){var n;_("useProvide"),(n=h.ref)==null||n.setContext(t,e);}function Ee(t,e){var n;return _("useInject"),((n=h.ref)==null?void 0:n.getContext(t))||e}function Se(){let t=null;return new Proxy({},{get(e,n){return n==="__is_ref"?!0:t},set(e,n,o){return t=o,!0}})}var St="0.0.5";function wt(t=[]){return t.reduce((e,n,o)=>(e[o+1]={template:n},e),{})}function ke(t){return Object.entries(t).map(([e,n])=>`${e}=${JSON.stringify(n)}`).join(" ")}function ae(t,e){if(v(t))return t(e);let n={},o={};return ee(t)&&Object.entries(t).forEach(([r,i])=>{let s=e[r];s&&(Object.keys(s).forEach(a=>{a.startsWith("on")&&v(s[a])&&delete s[a];}),s.children&&(s.children.forEach(([a,p])=>{n[p]=[...n[p]||[],a];}),delete s.children)),o[r]={template:i.template,prop:s};}),Object.entries(o).map(([r,{template:i,prop:s}])=>{let a=i;return s&&(a+=` ${ke(s)}`),n[r]&&(a+=n[r].map(p=>ae(p,s)).join("")),a}).join("")}function jt(t,e){return ae(t,e)}function At(t,e){e.innerHTML="",t.mount(e);}
3
3
 
4
- export { m as ComponentNode, de as Fragment, M as TemplateNode, bt as __essor_version, ue as createStore, pe as h, g as isJsxElement, me as nextTick, ve as onDestroy, Ne as onMount, C as signalObject, fe as template, J as useComputed, S as useEffect, be as useInject, Te as useProvide, xe as useRef, y as useSignal };
4
+ export { h as ComponentNode, he as Fragment, M as TemplateNode, St as __essor_version, fe as createStore, de as h, At as hydrate, y as isJsxElement, ge as nextTick, be as onDestroy, Te as onMount, jt as renderToString, C as signalObject, ae as ssr, wt as ssrtmpl, me as template, J as useComputed, x as useEffect, Ee as useInject, xe as useProvide, Se as useRef, N as useSignal };
5
5
  //# sourceMappingURL=out.js.map
6
6
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signal/signal.ts","../src/signal/store.ts","../../shared/src/comm.ts","../../shared/src/is.ts","../../shared/src/name.ts","../src/template/component-node.ts","../src/template/template.ts","../src/template/utils.ts","../src/template/patch.ts","../src/template/template-node.ts","../src/template/hooks.ts","../src/version.ts"],"names":["activeEffect","activeComputed","computedSet","targetMap","EffectDeps","track","target","key","depsMap","dep","trigger","computedSignal","effect","Signal","value","newValue","useSignal","isSignal","Computed","fn","prev","useComputed","useEffect","effectFn","signalObject","initialValues","acc","signalToObject","signal","_id","StoreMap","createOptionsStore","options","state","getters","actions","initState","__spreadValues","signalState","subscriptions","actionCallbacks","default_actions","payload","callback","index","states","getter","action","_","createStore","coerceArray","data","noop","isArray","isNil","x","isFunction","val","isFalsy","kebabCase","string","match","offset","_ComponentNode","template","props","_a","_b","hook","cb","context","node","handler","set","emitter","parent","before","_c","_d","mountedNode","trackKey","suppressCleanupCall","_e","_f","prop","event","listener","cleanup","addEventListener","ComponentNode","h","TemplateNode","isJsxElement","html","Fragment","coerceNode","text","insertChild","child","beforeNode","removeChild","replaceChild","setAttribute","element","attr","obj","binNode","setter","p","nextTick","eventName","patchChildren","childrenMap","nextChildren","result","children","parentChildNodesLength","parentElement","range","start","replaces","nextChildrenMap","mapKeys","i","currChild","currKey","getKey","origChild","patch","placeholder","next","id","_TemplateNode","cloneNode","firstChild","tree","walk","trackLastNodes","isRoot","item","path","patchChild","bindKey","triggerValue","cleanupBind","patchAttribute","nextNodes","newNode","onMount","throwIfOutsideComponent","onDestroy","useProvide","useInject","defaultValue","useRef","refValue","__essor_version"],"mappings":"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","sourcesContent":["type EffectFn = () => void;\n\nlet activeEffect: EffectFn | null = null;\nlet activeComputed: Computed<unknown> | null = null;\n\nconst computedSet = new Set<Computed<unknown>>();\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<EffectFn>>>();\nconst EffectDeps = new Set<EffectFn>();\n\nfunction track(target, key) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n depsMap = new Map();\n targetMap.set(target, depsMap);\n }\n let dep = depsMap.get(key);\n if (!dep) {\n dep = new Set();\n depsMap.set(key, dep);\n }\n if (activeEffect) dep.add(activeEffect);\n if (activeComputed) {\n computedSet.add(activeComputed);\n }\n}\n\nfunction trigger(target, key) {\n if (computedSet.size > 0) {\n computedSet.forEach(computedSignal => computedSignal.run());\n }\n\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const dep = depsMap.get(key);\n if (dep) {\n dep.forEach(effect => EffectDeps.has(effect) && effect());\n }\n}\n\nexport class Signal<T> {\n private _value: T;\n\n constructor(value: T) {\n this._value = value;\n }\n\n valueOf(): T {\n track(this, 'value');\n return this._value;\n }\n\n toString(): string {\n track(this, 'value');\n return String(this._value);\n }\n\n toJSON(): T {\n return this._value;\n }\n\n get value(): T {\n track(this, 'value');\n return this._value;\n }\n\n set value(newValue: T) {\n if (this._value !== newValue) {\n this._value = newValue;\n trigger(this, 'value');\n }\n }\n\n peek(): T {\n return this._value;\n }\n\n update() {\n trigger(this, 'value');\n }\n}\nexport function useSignal<T>(value?: T): Signal<T> {\n if (isSignal(value)) {\n return value as Signal<T>;\n }\n return new Signal<T>(value as T);\n}\n\nexport function isSignal<T>(value: any): value is Signal<T> {\n return value instanceof Signal;\n}\nexport class Computed<T> {\n private _value: T;\n\n constructor(private readonly fn: () => T) {\n const prev = activeComputed;\n activeComputed = this;\n track(this, '_value');\n this._value = this.fn();\n activeComputed = prev;\n }\n\n peek(): T {\n return this._value;\n }\n\n run() {\n const newValue = this.fn();\n if (newValue !== this._value) {\n this._value = newValue;\n }\n }\n\n get value(): T {\n track(this, '_value');\n return this._value;\n }\n}\n\nexport function useComputed<T>(fn: () => T) {\n return new Computed(fn);\n}\n\nexport function isComputed<T>(value: any): value is Computed<T> {\n return value instanceof Computed;\n}\n\nexport function useEffect(fn: EffectFn): () => void {\n function effectFn() {\n const prev = activeEffect;\n activeEffect = effectFn;\n fn();\n activeEffect = prev;\n }\n\n EffectDeps.add(effectFn);\n effectFn();\n\n return () => {\n EffectDeps.delete(effectFn);\n activeEffect = null;\n };\n}\n\nexport type SignalObject<T> = {\n [K in keyof T]: Signal<T[K]>;\n};\nexport function signalObject<T extends Object>(initialValues: T): SignalObject<T> {\n const signals = Object.entries(initialValues).reduce((acc, [key, value]) => {\n acc[key] = isSignal(value) ? value : useSignal(value);\n return acc;\n }, {} as SignalObject<T>);\n\n return signals;\n}\n\nexport function signalToObject<T>(signal: SignalObject<T> | T | Signal<T>): T {\n if (!signal) return {} as T;\n if (isSignal(signal)) {\n return signal.peek();\n }\n return Object.entries(signal).reduce((acc, [key, value]) => {\n acc[key] = isSignal(value) ? value.peek() : value;\n return acc;\n }, {} as T);\n}\n","import {\n type Signal,\n type SignalObject,\n signalObject,\n signalToObject,\n useComputed,\n useSignal,\n} from './signal';\n\ninterface StoreOptions<S, G, A> {\n state?: S;\n getters?: G;\n actions?: A;\n}\ntype PatchPayload = Record<string, any>;\ntype Callback = (value: any) => void;\nexport interface StoreActions {\n patch$: (payload: PatchPayload) => void;\n subscribe$: (callback: Callback) => void;\n unsubscribe$: (callback: Callback) => void;\n onAction$: (callback: Callback) => void;\n reset$: () => void;\n}\n\nlet _id = 0;\nconst StoreMap = new Map<number, any>();\n\nfunction createOptionsStore<S, G, A>(options: StoreOptions<S, G, A>) {\n const { state, getters, actions } = options as StoreOptions<any, any, any>;\n\n const initState = { ...(state ?? {}) };\n const signalState: SignalObject<S> = signalObject(state ?? {});\n\n const subscriptions: Callback[] = [];\n const actionCallbacks: Callback[] = [];\n const default_actions: StoreActions = {\n patch$(payload: PatchPayload) {\n Object.assign(signalState, signalObject(payload));\n subscriptions.forEach(callback => callback(signalToObject(signalState)));\n actionCallbacks.forEach(callback => callback(signalToObject(signalState)));\n },\n subscribe$(callback: Callback) {\n subscriptions.push(callback);\n },\n unsubscribe$(callback: Callback) {\n const index = subscriptions.indexOf(callback);\n if (index !== -1) {\n subscriptions.splice(index, 1);\n }\n },\n onAction$(callback: Callback) {\n actionCallbacks.push(callback);\n },\n reset$() {\n default_actions.patch$(initState);\n },\n };\n const states = {\n _id: `store_${_id}`,\n };\n for (const key in getters) {\n const getter = getters[key];\n if (getter) {\n states[key] = useComputed(() => {\n return getter.call(signalState);\n });\n }\n }\n\n for (const key in actions) {\n const action = actions[key];\n if (action) {\n states[key] = action.bind(signalState);\n }\n }\n\n StoreMap.set(_id, useSignal);\n ++_id;\n\n return new Proxy(\n {},\n {\n get(_, key) {\n if (key === 'state') {\n return signalToObject(signalState);\n }\n if (key in states) {\n return states[key];\n }\n if (key in default_actions) {\n return default_actions[key];\n }\n return signalState[key].value;\n },\n },\n );\n}\n\ntype Getters<S> = {\n [K in keyof S]: S[K] extends (...args: any[]) => any ? Signal<ReturnType<S[K]>> : Signal<S[K]>;\n};\n\nexport function createStore<S, G, A>(\n options: {\n state: S;\n getters?: G;\n actions?: A;\n } & ThisType<SignalObject<S> & Getters<G> & A>,\n): () => S & Getters<G> & A & StoreActions & { state: S } {\n return function () {\n if (StoreMap.has(_id)) {\n return StoreMap.get(_id)!;\n }\n\n return createOptionsStore<S, G, A>(options);\n };\n}\n","export const _toString = Object.prototype.toString;\nexport const extend = Object.assign;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nexport const hasOwn = (val: object, key: string | symbol): key is keyof typeof val =>\n hasOwnProperty.call(val, key);\n\nexport function coerceArray<T>(data: T | T[]): T[] {\n return Array.isArray(data) ? (data.flat() as T[]) : [data];\n}\nexport function hasChanged(value, oldValue) {\n return !Object.is(value, oldValue);\n}\nexport const noop = Function.prototype as () => void;\n","import { _toString } from './comm';\n\nexport const isObject = (val: unknown): val is Record<any, any> =>\n val !== null && typeof val === 'object';\nexport function isPromise(val: any): boolean {\n return _toString.call(val) === '[object Promise]';\n}\n\nexport const isArray = Array.isArray;\n\nexport function isString(val: unknown): val is string {\n return typeof val === 'string';\n}\n\nexport function isSymbol(val: unknown): val is symbol {\n return typeof val === 'symbol';\n}\nexport function isMap(val: unknown): val is Map<any, any> {\n return _toString.call(val) === '[object Map]';\n}\nexport function isNil(x: any): x is null | undefined {\n return x === null || x === undefined;\n}\n\nexport const isIntegerKey = (key: unknown) =>\n isString(key) && key !== 'NaN' && key[0] !== '-' && `${Number.parseInt(key, 10)}` === key;\nexport function isClass(func) {\n return typeof func === 'function' && /^class\\s/.test(Function.prototype.toString.call(func));\n}\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function';\nexport function isPrimitive(s: any): s is string | number {\n return (\n typeof s === 'string' || typeof s === 'number' || s instanceof String || s instanceof Number\n );\n}\nexport function isFalsy(x: any): x is false | null | undefined {\n return x === false || x === null || x === undefined || x === '';\n}\n","export const kebabCase = (string: string): string => {\n return string.replaceAll(/[A-Z]+/g, (match, offset) => {\n return `${offset > 0 ? '-' : ''}${match.toLocaleLowerCase()}`;\n });\n};\n\nexport const camelCase = (str: string): string => {\n const s = str.replaceAll(/[\\s_-]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''));\n return s[0].toLowerCase() + s.slice(1);\n};\n","import { isFunction } from 'essor-shared';\nimport { signalObject } from '../signal';\nimport { type Signal, useEffect, useSignal } from '../signal';\nimport { type SignalObject, isSignal, signalToObject } from '../signal/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, unknown>,\n public key?: string,\n ) {\n this.proxyProps = signalObject(props);\n }\n addEventListener(): void {}\n removeEventListener(): void {}\n\n static ref: ComponentNode | null = null;\n static context: Record<symbol, Signal<any>> = {};\n\n private proxyProps: SignalObject<any> = {};\n private trackMap = new Map<string, NodeTrack>();\n\n id?: string;\n private context: Record<symbol | string | number, any> = {};\n private emitter = new Set<Function>();\n mounted = false;\n private rootNode: TemplateNode | null = null;\n private hooks: Record<Hook, Set<() => void>> = {\n mounted: new Set(),\n destroy: new Set(),\n };\n get firstChild(): Node | null {\n return this.rootNode?.firstChild ?? null;\n }\n\n get isConnected(): boolean {\n return this.rootNode?.isConnected ?? false;\n }\n\n 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 const props = this.props;\n this.props = node.props;\n\n this.patchProps(props);\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 ComponentNode.context = {};\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(signalToObject(this.proxyProps));\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 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, unknown>) {\n for (const [key, prop] of Object.entries(props)) {\n if (key.indexOf('on') === 0 && 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.indexOf('bind:') === 0) {\n this.proxyProps[key] = useSignal(prop);\n } else if (key === 'ref') {\n if (isFunction(prop)) {\n (props[key] as Function)(this.rootNode?.nodes[0]);\n } else {\n if (isSignal(prop)) {\n (props[key] as any).value = this.rootNode?.nodes[0];\n } else {\n props[key] = this.rootNode?.nodes[0];\n }\n }\n } else {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = prop;\n });\n }\n }\n this.props = props;\n }\n}\n","import { isFunction } from 'essor-shared';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport type { EssorComponent, EssorNode } from '../../types';\n\nexport function h(\n template: EssorComponent | HTMLTemplateElement,\n props: Record<string, any>,\n key?: string,\n): JSX.Element {\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template, props, key);\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 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 'essor-shared';\nimport { isJsxElement } from './template';\n\n// 将任意数据转换为 Node 或 JSX.Element 类型\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\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\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\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n // 先插入新节点,再移除旧节点\n insertChild(parent, node, child);\n removeChild(child);\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 element.setAttribute(attr, String(value));\n }\n}\n\nexport function binNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n // checkbox\n if (node.type === 'checkbox') {\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n }\n\n // date\n if (node.type === 'date') {\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n }\n\n // file\n if (node.type === 'file') {\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n }\n\n // number\n if (node.type === 'number') {\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n }\n\n // radio\n if (node.type === 'radio') {\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n }\n\n // text\n if (node.type === '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}\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 // 添加事件监听器\n addEventListener(type: string, listener: Listener<unknown>): void;\n // 移除事件监听器\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\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","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 = childrenMap.values();\n const parentChildNodesLength = parent.childNodes.length;\n\n if (childrenMap.size > 0 && nextChildren.length === 0) {\n if (parentChildNodesLength === childrenMap.size + (before ? 1 : 0)) {\n const parentElement = parent as Element;\n parentElement.innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children.next().value;\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\n childrenMap.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children.next().value;\n let currKey = getKey(currChild, i);\n\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children.next().value;\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) {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n } else {\n insertChild(parent, child, before);\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\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\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 { coerceArray, isArray, isFunction, isNil } from 'essor-shared';\nimport { useEffect, useSignal } from '../signal';\nimport { isSignal } from '../signal/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 public key?: string,\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\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?.childNodes.forEach(node => {\n (cloneNode as Element).append(node);\n });\n firstChild.remove();\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.forEach((item, index) => {\n if (!item) {\n return;\n }\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 (isFunction(props[attr])) {\n props[attr](node);\n } else {\n props[attr] = node;\n }\n } else if (attr.indexOf('on') === 0) {\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 } else if (attr.indexOf('bind:') === 0) {\n const bindKey = attr.slice(5).toLocaleLowerCase();\n const val = props[attr];\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n const triggerValue = isSignal(val) ? val : useSignal(val);\n const cleanup = useEffect(() => {\n triggerValue.value = val;\n node[bindKey] = triggerValue.value;\n });\n\n const cleanupBind = binNode(node, value => {\n props[`update:${bindKey}`](value);\n });\n\n track.cleanup = () => {\n cleanup?.();\n cleanupBind?.();\n };\n } else if (attr.indexOf('update:') !== 0) {\n const track = this.getNodeTrack(`${key}:${attr}`);\n const val = props[attr];\n const triggerValue = isSignal(val) ? val : useSignal(val);\n const cleanup = useEffect(() => {\n triggerValue.value = val;\n patchAttribute(track, node, attr, triggerValue.value);\n });\n\n track.cleanup = () => {\n cleanup?.();\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 throw new 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\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) {\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\n/**\n * Initializes a reference with a null value of type T or null.\n *\n * @template T - The type of the reference.\n * @return {T & { __is_ref: boolean; current: T | null }} A proxy object allowing custom get and set behavior.\n */\nexport function useRef<T>(): {\n __is_ref: boolean;\n current: T | null;\n} {\n // 初始化 ref 为 null,类型为 T 或 null\n let refValue: T | null = null;\n\n // 使用 Proxy 创建一个代理对象,以便我们可以自定义 get 和 set 行为\n return new Proxy({} as any, {\n get(target, key: string | symbol) {\n // 特殊属性 __is_ref 始终返回 true\n if (key === '__is_ref') {\n return true;\n }\n // 直接返回 refValue\n return refValue;\n },\n set(target, prop: string | symbol, value: any) {\n if (prop === 'current') {\n refValue = value;\n return true;\n }\n refValue = value;\n return true;\n },\n });\n}\n","export const __essor_version = '0.0.5-beta.7';\n"]}
1
+ {"version":3,"sources":["../src/signal/signal.ts","../src/signal/store.ts","../../shared/src/comm.ts","../../shared/src/is.ts","../../shared/src/name.ts","../src/template/component-node.ts","../src/template/template.ts","../src/template/utils.ts","../src/template/patch.ts","../src/template/template-node.ts","../src/template/hooks.ts","../src/version.ts","../src/server/index.ts"],"names":["activeEffect","activeComputed","computedSet","targetMap","EffectDeps","track","target","key","depsMap","dep","trigger","computedSignal","effect","Signal","value","newValue","useSignal","isSignal","Computed","fn","prev","useComputed","useEffect","effectFn","signalObject","initialValues","acc","signalToObject","signal","_id","StoreMap","createOptionsStore","options","state","getters","actions","initState","__spreadValues","signalState","subscriptions","actionCallbacks","default_actions","payload","callback","index","states","getter","action","_","createStore","coerceArray","data","noop","isObject","val","isArray","isNil","x","isFunction","isFalsy","kebabCase","string","match","offset","_ComponentNode","template","props","_a","_b","hook","cb","context","node","handler","set","emitter","parent","before","_c","_d","mountedNode","trackKey","suppressCleanupCall","_e","prop","event","listener","cleanup","addEventListener","ComponentNode","h","TemplateNode","isJsxElement","html","Fragment","coerceNode","text","insertChild","child","beforeNode","removeChild","replaceChild","setAttribute","element","attr","obj","binNode","setter","p","nextTick","eventName","patchChildren","childrenMap","nextChildren","result","children","parentChildNodesLength","parentElement","range","start","replaces","nextChildrenMap","mapKeys","i","currChild","currKey","getKey","origChild","patch","placeholder","next","id","_TemplateNode","cloneNode","firstChild","tree","walk","trackLastNodes","isRoot","item","path","patchChild","bindKey","triggerValue","cleanupBind","patchAttribute","nextNodes","newNode","onMount","throwIfOutsideComponent","onDestroy","useProvide","useInject","defaultValue","useRef","refValue","__essor_version","ssrtmpl","templates","jsonToAttrs","json","ssr","newTemplate","tmpl","propKey","idx","str","renderToString","component","hydrate","root"],"mappings":"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","sourcesContent":["type EffectFn = () => void;\n\nlet activeEffect: EffectFn | null = null;\nlet activeComputed: Computed<unknown> | null = null;\n\nconst computedSet = new Set<Computed<unknown>>();\nconst targetMap = new WeakMap<object, Map<string | symbol, Set<EffectFn>>>();\nconst EffectDeps = new Set<EffectFn>();\n\nfunction track(target, key) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n depsMap = new Map();\n targetMap.set(target, depsMap);\n }\n let dep = depsMap.get(key);\n if (!dep) {\n dep = new Set();\n depsMap.set(key, dep);\n }\n if (activeEffect) dep.add(activeEffect);\n if (activeComputed) {\n computedSet.add(activeComputed);\n }\n}\n\nfunction trigger(target, key) {\n if (computedSet.size > 0) {\n computedSet.forEach(computedSignal => computedSignal.run());\n }\n\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const dep = depsMap.get(key);\n if (dep) {\n dep.forEach(effect => EffectDeps.has(effect) && effect());\n }\n}\n\nexport class Signal<T> {\n private _value: T;\n\n constructor(value: T) {\n this._value = value;\n }\n\n valueOf(): T {\n track(this, 'value');\n return this._value;\n }\n\n toString(): string {\n track(this, 'value');\n return String(this._value);\n }\n\n toJSON(): T {\n return this._value;\n }\n\n get value(): T {\n track(this, 'value');\n return this._value;\n }\n\n set value(newValue: T) {\n if (this._value !== newValue) {\n this._value = newValue;\n trigger(this, 'value');\n }\n }\n\n peek(): T {\n return this._value;\n }\n\n update() {\n trigger(this, 'value');\n }\n}\nexport function useSignal<T>(value?: T): Signal<T> {\n if (isSignal(value)) {\n return value as Signal<T>;\n }\n return new Signal<T>(value as T);\n}\n\nexport function isSignal<T>(value: any): value is Signal<T> {\n return value instanceof Signal;\n}\nexport class Computed<T> {\n private _value: T;\n\n constructor(private readonly fn: () => T) {\n const prev = activeComputed;\n activeComputed = this;\n track(this, '_value');\n this._value = this.fn();\n activeComputed = prev;\n }\n\n peek(): T {\n return this._value;\n }\n\n run() {\n const newValue = this.fn();\n if (newValue !== this._value) {\n this._value = newValue;\n }\n }\n\n get value(): T {\n track(this, '_value');\n return this._value;\n }\n}\n\nexport function useComputed<T>(fn: () => T) {\n return new Computed(fn);\n}\n\nexport function isComputed<T>(value: any): value is Computed<T> {\n return value instanceof Computed;\n}\n\nexport function useEffect(fn: EffectFn): () => void {\n function effectFn() {\n const prev = activeEffect;\n activeEffect = effectFn;\n fn();\n activeEffect = prev;\n }\n\n EffectDeps.add(effectFn);\n effectFn();\n\n return () => {\n EffectDeps.delete(effectFn);\n activeEffect = null;\n };\n}\n\nexport type SignalObject<T> = {\n [K in keyof T]: Signal<T[K]>;\n};\nexport function signalObject<T extends Object>(initialValues: T): SignalObject<T> {\n const signals = Object.entries(initialValues).reduce((acc, [key, value]) => {\n acc[key] = isSignal(value) ? value : useSignal(value);\n return acc;\n }, {} as SignalObject<T>);\n\n return signals;\n}\n\nexport function signalToObject<T>(signal: SignalObject<T> | T | Signal<T>): T {\n if (!signal) return {} as T;\n if (isSignal(signal)) {\n return signal.peek();\n }\n return Object.entries(signal).reduce((acc, [key, value]) => {\n acc[key] = isSignal(value) ? value.peek() : value;\n return acc;\n }, {} as T);\n}\n","import {\n type Signal,\n type SignalObject,\n signalObject,\n signalToObject,\n useComputed,\n useSignal,\n} from './signal';\n\ninterface StoreOptions<S, G, A> {\n state?: S;\n getters?: G;\n actions?: A;\n}\ntype PatchPayload = Record<string, any>;\ntype Callback = (value: any) => void;\nexport interface StoreActions {\n patch$: (payload: PatchPayload) => void;\n subscribe$: (callback: Callback) => void;\n unsubscribe$: (callback: Callback) => void;\n onAction$: (callback: Callback) => void;\n reset$: () => void;\n}\n\nlet _id = 0;\nconst StoreMap = new Map<number, any>();\n\nfunction createOptionsStore<S, G, A>(options: StoreOptions<S, G, A>) {\n const { state, getters, actions } = options as StoreOptions<any, any, any>;\n\n const initState = { ...(state ?? {}) };\n const signalState: SignalObject<S> = signalObject(state ?? {});\n\n const subscriptions: Callback[] = [];\n const actionCallbacks: Callback[] = [];\n const default_actions: StoreActions = {\n patch$(payload: PatchPayload) {\n Object.assign(signalState, signalObject(payload));\n subscriptions.forEach(callback => callback(signalToObject(signalState)));\n actionCallbacks.forEach(callback => callback(signalToObject(signalState)));\n },\n subscribe$(callback: Callback) {\n subscriptions.push(callback);\n },\n unsubscribe$(callback: Callback) {\n const index = subscriptions.indexOf(callback);\n if (index !== -1) {\n subscriptions.splice(index, 1);\n }\n },\n onAction$(callback: Callback) {\n actionCallbacks.push(callback);\n },\n reset$() {\n default_actions.patch$(initState);\n },\n };\n const states = {\n _id: `store_${_id}`,\n };\n for (const key in getters) {\n const getter = getters[key];\n if (getter) {\n states[key] = useComputed(() => {\n return getter.call(signalState);\n });\n }\n }\n\n for (const key in actions) {\n const action = actions[key];\n if (action) {\n states[key] = action.bind(signalState);\n }\n }\n\n StoreMap.set(_id, useSignal);\n ++_id;\n\n return new Proxy(\n {},\n {\n get(_, key) {\n if (key === 'state') {\n return signalToObject(signalState);\n }\n if (key in states) {\n return states[key];\n }\n if (key in default_actions) {\n return default_actions[key];\n }\n return signalState[key].value;\n },\n },\n );\n}\n\ntype Getters<S> = {\n [K in keyof S]: S[K] extends (...args: any[]) => any ? Signal<ReturnType<S[K]>> : Signal<S[K]>;\n};\n\nexport function createStore<S, G, A>(\n options: {\n state: S;\n getters?: G;\n actions?: A;\n } & ThisType<SignalObject<S> & Getters<G> & A>,\n): () => S & Getters<G> & A & StoreActions & { state: S } {\n return function () {\n if (StoreMap.has(_id)) {\n return StoreMap.get(_id)!;\n }\n\n return createOptionsStore<S, G, A>(options);\n };\n}\n","export const _toString = Object.prototype.toString;\nexport const extend = Object.assign;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nexport const hasOwn = (val: object, key: string | symbol): key is keyof typeof val =>\n hasOwnProperty.call(val, key);\n\nexport function coerceArray<T>(data: T | T[]): T[] {\n return Array.isArray(data) ? (data.flat() as T[]) : [data];\n}\nexport function hasChanged(value, oldValue) {\n return !Object.is(value, oldValue);\n}\nexport const noop = Function.prototype as () => void;\n","import { _toString } from './comm';\n\nexport const isObject = (val: unknown): val is Record<any, any> =>\n val !== null && typeof val === 'object';\nexport function isPromise(val: any): boolean {\n return _toString.call(val) === '[object Promise]';\n}\n\nexport const isArray = Array.isArray;\n\nexport function isString(val: unknown): val is string {\n return typeof val === 'string';\n}\n\nexport function isSymbol(val: unknown): val is symbol {\n return typeof val === 'symbol';\n}\nexport function isMap(val: unknown): val is Map<any, any> {\n return _toString.call(val) === '[object Map]';\n}\nexport function isNil(x: any): x is null | undefined {\n return x === null || x === undefined;\n}\n\nexport const isIntegerKey = (key: unknown) =>\n isString(key) && key !== 'NaN' && key[0] !== '-' && `${Number.parseInt(key, 10)}` === key;\nexport function isClass(func) {\n return typeof func === 'function' && /^class\\s/.test(Function.prototype.toString.call(func));\n}\n\nexport const isFunction = (val: unknown): val is Function => typeof val === 'function';\nexport function isPrimitive(s: any): s is string | number {\n return (\n typeof s === 'string' || typeof s === 'number' || s instanceof String || s instanceof Number\n );\n}\nexport function isFalsy(x: any): x is false | null | undefined {\n return x === false || x === null || x === undefined || x === '';\n}\n","export const kebabCase = (string: string): string => {\n return string.replaceAll(/[A-Z]+/g, (match, offset) => {\n return `${offset > 0 ? '-' : ''}${match.toLocaleLowerCase()}`;\n });\n};\n\nexport const camelCase = (str: string): string => {\n const s = str.replaceAll(/[\\s_-]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''));\n return s[0].toLowerCase() + s.slice(1);\n};\n","import { isFunction } from 'essor-shared';\nimport { signalObject } from '../signal';\nimport { type Signal, useEffect, useSignal } from '../signal';\nimport { isSignal } from '../signal/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, unknown>,\n public key?: string,\n ) {\n this.proxyProps = signalObject(props);\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 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 ComponentNode.context = {};\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(this.proxyProps);\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 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, unknown>) {\n for (const [key, prop] of Object.entries(props)) {\n if (key.indexOf('on') === 0 && 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.indexOf('bind:') === 0) {\n this.proxyProps[key] = useSignal(prop);\n } else if (key === 'ref') {\n if (isSignal(prop)) {\n (props[key] as any).value = this.rootNode?.nodes[0];\n } else {\n props[key] = this.rootNode?.nodes[0];\n }\n } else {\n const newValue = (this.proxyProps[key] ??= useSignal(prop));\n const track = this.getNodeTrack(key);\n track.cleanup = useEffect(() => {\n newValue.value = prop;\n });\n }\n }\n this.props = props;\n }\n}\n","import { isFunction } from 'essor-shared';\nimport { ComponentNode } from './component-node';\nimport { TemplateNode } from './template-node';\nimport type { EssorComponent, EssorNode } from '../../types';\n\nexport function h(\n template: EssorComponent | HTMLTemplateElement,\n props: Record<string, any>,\n key?: string,\n): JSX.Element {\n return isFunction(template)\n ? new ComponentNode(template, props, key)\n : new TemplateNode(template, props, key);\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 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 'essor-shared';\nimport { isJsxElement } from './template';\n\n// 将任意数据转换为 Node 或 JSX.Element 类型\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\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\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\nexport function replaceChild(\n parent: Node,\n node: Node | JSX.Element,\n child: Node | JSX.Element,\n): void {\n // 先插入新节点,再移除旧节点\n insertChild(parent, node, child);\n removeChild(child);\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 element.setAttribute(attr, String(value));\n }\n}\n\nexport function binNode(node: Node, setter: (value: any) => void) {\n if (node instanceof HTMLInputElement) {\n // checkbox\n if (node.type === 'checkbox') {\n return addEventListener(node, 'change', () => {\n setter(Boolean(node.checked));\n });\n }\n\n // date\n if (node.type === 'date') {\n return addEventListener(node, 'change', () => {\n setter(node.value ? node.value : '');\n });\n }\n\n // file\n if (node.type === 'file') {\n return addEventListener(node, 'change', () => {\n if (node.files) {\n setter(node.files);\n }\n });\n }\n\n // number\n if (node.type === 'number') {\n return addEventListener(node, 'input', () => {\n const value = Number.parseFloat(node.value);\n setter(Number.isNaN(value) ? '' : String(value));\n });\n }\n\n // radio\n if (node.type === 'radio') {\n return addEventListener(node, 'change', () => {\n setter(node.checked ? node.value : '');\n });\n }\n\n // text\n if (node.type === '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}\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 // 添加事件监听器\n addEventListener(type: string, listener: Listener<unknown>): void;\n // 移除事件监听器\n removeEventListener(type: string, listener: Listener<unknown>): void;\n}\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","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 = childrenMap.values();\n const parentChildNodesLength = parent.childNodes.length;\n\n if (childrenMap.size > 0 && nextChildren.length === 0) {\n if (parentChildNodesLength === childrenMap.size + (before ? 1 : 0)) {\n const parentElement = parent as Element;\n parentElement.innerHTML = '';\n if (before) {\n insertChild(parent, before);\n }\n } else {\n const range = document.createRange();\n const child = children.next().value;\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\n childrenMap.forEach(node => {\n if (isJsxElement(node)) {\n node.unmount();\n }\n });\n\n return result;\n }\n\n const replaces: [Comment, AnyNode][] = [];\n const nextChildrenMap = mapKeys(nextChildren);\n\n for (let [i, child] of nextChildren.entries()) {\n let currChild = children.next().value;\n let currKey = getKey(currChild, i);\n\n while (currChild && !nextChildrenMap.has(currKey)) {\n removeChild(currChild);\n childrenMap.delete(currKey);\n currChild = children.next().value;\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) {\n const placeholder = document.createComment('');\n insertChild(parent, placeholder, currChild);\n replaces.push([placeholder, child]);\n } else {\n insertChild(parent, child, before);\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\nexport function patch(parent: Node, node: AnyNode, next: AnyNode): AnyNode {\n if (node === next) {\n return node;\n }\n if (isJsxElement(node) && isJsxElement(next) && node.template === next.template) {\n next.inheritNode(node);\n return next;\n }\n if (node instanceof Text && next instanceof Text) {\n if (node.textContent !== next.textContent) {\n node.textContent = next.textContent;\n }\n return node;\n }\n replaceChild(parent, next, node);\n return next;\n}\n\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 { coerceArray, isArray, isFunction, isNil } from 'essor-shared';\nimport { useEffect, useSignal } from '../signal';\nimport { isSignal } from '../signal/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 public key?: string,\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.forEach((item, index) => {\n if (!item) {\n return;\n }\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 {\n props[attr] = node;\n }\n } else if (attr.indexOf('on') === 0) {\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 } else if (attr.indexOf('bind:') === 0) {\n const bindKey = attr.slice(5).toLocaleLowerCase();\n const val = props[attr];\n const track = this.getNodeTrack(`${key}:${attr}`);\n\n const triggerValue = isSignal(val) ? val : useSignal(val);\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(val) ? val.value : val;\n node[bindKey] = triggerValue.value;\n });\n\n const cleanupBind = binNode(node, value => {\n props[`update:${bindKey}`](value);\n });\n\n track.cleanup = () => {\n cleanup?.();\n cleanupBind?.();\n };\n } else if (attr.indexOf('update:') !== 0) {\n const track = this.getNodeTrack(`${key}:${attr}`);\n const val = props[attr];\n const triggerValue = isSignal(val) ? val : useSignal(val);\n const cleanup = useEffect(() => {\n triggerValue.value = isSignal(val) ? val.value : val;\n patchAttribute(track, node, attr, triggerValue.value);\n });\n\n track.cleanup = () => {\n cleanup?.();\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 throw new 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\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) {\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\n/**\n * Initializes a reference with a null value of type T or null.\n *\n * @template T - The type of the reference.\n * @return {T & { __is_ref: boolean; current: T | null }} A proxy object allowing custom get and set behavior.\n */\nexport function useRef<T>(): {\n __is_ref: boolean;\n current: T | null;\n} {\n // 初始化 ref 为 null,类型为 T 或 null\n let refValue: T | null = null;\n\n // 使用 Proxy 创建一个代理对象,以便我们可以自定义 get 和 set 行为\n return new Proxy({} as any, {\n get(target, key: string | symbol) {\n // 特殊属性 __is_ref 始终返回 true\n if (key === '__is_ref') {\n return true;\n }\n // 直接返回 refValue\n return refValue;\n },\n set(target, prop: string | symbol, value: any) {\n if (prop === 'current') {\n refValue = value;\n return true;\n }\n refValue = value;\n return true;\n },\n });\n}\n","export const __essor_version = '0.0.5';\n","import { isFunction, isObject } from 'essor-shared';\nimport type { EssorNode } from '../../types';\n\ninterface TemplateMap {\n [key: number]: {\n template: string;\n prop?: Record<string, any>;\n };\n}\n\ntype Props = Record<string, any>;\n\nexport function ssrtmpl(templates: string[] = []): TemplateMap {\n return templates.reduce((acc, template, index) => {\n acc[index + 1] = { template };\n return acc;\n }, {} as TemplateMap);\n}\n\nfunction jsonToAttrs(json: Record<string, any>): string {\n return Object.entries(json)\n .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n .join(' ');\n}\n\nexport function ssr(\n template: TemplateMap | EssorNode | ((props: Props) => string),\n props: Props,\n): string {\n if (isFunction(template)) {\n return template(props);\n }\n\n const childrenMap: Record<string, EssorNode[]> = {};\n const newTemplate: TemplateMap = {};\n if (isObject(template)) {\n Object.entries(template).forEach(([key, tmpl]) => {\n const prop = props[key];\n if (prop) {\n Object.keys(prop).forEach(propKey => {\n if (propKey.startsWith('on') && isFunction(prop[propKey])) {\n delete prop[propKey];\n }\n });\n\n if (prop.children) {\n prop.children.forEach(([child, idx]: [any, number]) => {\n childrenMap[idx] = [...(childrenMap[idx] || []), child];\n });\n delete prop.children;\n }\n }\n\n newTemplate[key] = { template: tmpl.template, prop };\n });\n }\n\n return Object.entries(newTemplate)\n .map(([key, { template: tmpl, prop }]) => {\n let str = tmpl;\n if (prop) {\n str += ` ${jsonToAttrs(prop)}`;\n }\n if (childrenMap[key]) {\n str += childrenMap[key].map(child => ssr(child, prop)).join('');\n }\n\n return str;\n })\n .join('');\n}\n\nexport function renderToString(component: (...args: any[]) => string, props: Props): string {\n return ssr(component, props);\n}\n\nexport function hydrate(\n component: { mount: (root: HTMLElement) => void },\n root: HTMLElement,\n): void {\n root.innerHTML = '';\n component.mount(root);\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "essor",
3
- "version": "0.0.5",
4
- "packageManager": "pnpm@8.15.6",
3
+ "version": "0.0.6-beta.1",
4
+ "packageManager": "pnpm@8.15.8",
5
5
  "description": "",
6
6
  "type": "module",
7
7
  "keywords": [],
@@ -53,7 +53,7 @@
53
53
  "sideEffects": false,
54
54
  "dependencies": {
55
55
  "csstype": "^3.1.3",
56
- "essor-shared": "0.0.5"
56
+ "essor-shared": "0.0.6-beta.1"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "tsup && cross-env NODE_ENV=production tsup --clean=false --treeshake --sourcemap=false",
package/types/jsx.d.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  import type * as csstype from 'csstype';
2
2
  import type { EssorNode } from './node';
3
-
3
+ /**
4
+ * Based on JSX types for Surplus and Inferno and adapted for `dom-expressions`.
5
+ *
6
+ * https://github.com/adamhaile/surplus/blob/master/index.d.ts
7
+ * https://github.com/infernojs/inferno/blob/master/packages/inferno/src/core/types.ts
8
+ */
4
9
  type DOMElement = Element;
5
10
  declare const SERIALIZABLE: unique symbol;
6
11
 
package/types/node.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { EssorComponent } from './component';
2
2
 
3
- export interface EssorNode<P = any> {
4
- props: P;
3
+ export interface EssorNode<T extends Record<string, any> = Record<string, any>> {
4
+ props: T;
5
5
  id?: string;
6
6
  template: EssorComponent | HTMLTemplateElement;
7
7