amateras 0.13.1 → 0.13.3

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/build/core.js CHANGED
@@ -1 +1 @@
1
- import{_null as t,forEach as s,_Object_assign as e,map as o,_Array_from as i,_Object_entries as r,isUndefined as n,isNull as l,toArray as h,_instanceof as a,isString as d,isFunction as p,isArray as u}from"@amateras/utils";const c=window,f=document,m=t=>!t||t(),g=t=>!1,b=/* @__PURE__ */Symbol("ProtoType"),y=/* @__PURE__ */Symbol("Statement"),P=/* @__PURE__ */Symbol("Signal");class w{static disposers=/* @__PURE__ */new Set;promises=/* @__PURE__ */new Set;root;constructor(t){this.root=t,t.ondispose(()=>this.dispose())}dispose(){this.promises.clear(),this.root=t,s(w.disposers,t=>t(this))}static assign(t){e(w.prototype,t)}asyncTask(t){this.promises.add(t),t.finally(()=>this.promises.delete(t))}}class S{static proto=t;static[b]="Proto";static[y]=!1;static disposer=[];disposers=t;layout;parent=t;global=S.proto?.global??new w(this);sibling=t;firstProto=t;lastProto=t;builded=!1;listeners=t;constructor(s){this.layout=s??t}dispose(){s(S.disposer,t=>t(this)),s(this.disposers,t=>t()),s(this.protos,t=>t.dispose()),this.global=t,this.sibling=t,this.firstProto=t,this.lastProto=t,this.disposers=t,this.parent=t,this.layout=t}get children(){return o(this.protos,t=>t.constructor[y]?t.children:t).flat()}get protos(){let t=/* @__PURE__ */new Set,s=this.firstProto;if(s){let e=s;for(;e;)t.add(e),e=e.sibling}return t}append(...e){s(e,s=>{if(s.parent!==this&&s.parent?.removeProtos(s),this.lastProto){if(this.lastProto===s)return;this.firstProto===s&&(this.firstProto=s.sibling),s.sibling=t,this.lastProto.sibling=s,this.lastProto=s}else this.firstProto=s,this.lastProto=s;s.parent=this,s.global=this.global})}replaceProtos(...t){this.clear(),this.processProtos(...t)}insert(t,s=-1){if(0===s)this.firstProto&&(t.sibling=this.firstProto),this.firstProto=t;else{let e=i(this.protos),o=s<0?e.length+s+1:s;e.splice(o,0,t),this.processProtos(...e)}t.parent=this,t.global=this.global}removeProtos(...t){let e=this.protos;s(t,t=>{t.parent=null,t.sibling=null,e.delete(t)}),this.processProtos(...e)}processProtos(...e){let o=null;e.length?s(e,(t,s)=>{0===s&&(this.firstProto=t),o&&(o.sibling=t),o=t,t.parent=this}):this.firstProto=t,this.lastProto=o}build(t=!0){return this.clear(!0),$.context(S,this,()=>this.layout?.(this)),this.builded=!0,t&&s(this.protos,t=>{t.build()}),this.dispatch("builded",this),this}toString(){return o(this.protos,t=>`${t}`).join("")}toDOM(t=!0){return t?o(this.protos,s=>s.toDOM(t)).flat():[]}ondispose(t){this.disposers=this.disposers??[],this.disposers.push(t)}removeNode(){s(this.protos,t=>t.removeNode())}clear(t=!1){let e=this.protos;this.removeProtos(...e),t&&s(e,t=>t.dispose())}findAbove(s){let e=this.parent;return e?s(e)?e:e.findAbove(s):t}findBelow(s){for(let t of this.protos){if(s(t))return t;let e=t.findBelow(s);if(e)return e}return t}findBelowAll(t){let s=[];for(let e of this.protos)t(e)&&s.push(e),s.push(...e.findBelowAll(t));return s}mutate(){}get text(){return this.children.map(t=>t.text).join("")}dispatch(t,e,o){o?.bubbles&&this.parent?.dispatch(t,e,o);let i=this.listeners?.[t];s(i,t=>t(e))}listen(t,s){let e=this.listeners??{};this.listeners=e;let o=e[t]??/* @__PURE__ */new Set;this.listeners[t]=o,o.add(s)}}class M extends S{node=t;modifiers=t;constructor(t){super(t)}ondom(t){this.modifiers=this.modifiers??[],this.modifiers.push(t)}dispose(){super.dispose(),this.node=t,this.modifiers=t}inDOM(){return!!m()&&document.contains(this.node)}removeNode(){this.node?.remove()}}const _=["img","hr","br","input","link","meta"];class v extends M{tagname;#t={};#s="";__props__;constructor(t,s,e){super(()=>e?.(this)),this.tagname=t,this.__props__=s}dispose(){super.dispose(),this.layout=null}build(s){return this.__props__&&(this.props(this.__props__),this.__props__=t),super.build(s),this}props({...t}){let{class:s,...e}=t;s&&this.addClass(...s.split(" ")),this.attrProcess(e)}on(t,s,e){let o=o=>{o.addEventListener(t,s,e),this.ondispose(()=>this.node?.removeEventListener(t,s))};this.node?o(this.node):this.ondom(o)}toString(){return this.parseHTML()}parseHTML(t){let s=this.tagname,e=t?.children??(this.#s||o(this.protos,t=>`${t}`).join("")),i=t?.attr??o(r(this.#t),([t,s])=>s.length?`${t}="${s}"`:t).join(" "),n=i.length?" "+i:"";return _.includes(s)?`<${s}${n} />`:`<${s}${n}>${e}</${s}>`}toDOM(t=!0){if(this.node)return[this.node];let e=document.createElement(this.tagname);return this.node=e,this.#s?this.node.innerHTML=this.#s:t&&e.append(...o(this.protos,s=>s.toDOM(t)).flat()),s(r(this.#t),([t,s])=>e.setAttribute(t,s)),s(this.modifiers,t=>t(e)),[e]}attrProcess(t){s(r(t),([t,s])=>{for(let e of $.process.attr){let o=e(t,s,this);if(!n(o))return}this.attr(t,s)})}innerHTML(t){this.#s=t,this.node&&(this.node.innerHTML=t)}attr(s,e){return arguments.length?n(e)?this.#t[s]??t:(l(e)?(delete this.#t[s],this.node?.removeAttribute(s)):(this.#t[s]=e,this.node?.setAttribute(s,e)),this):this.#t}addClass(...t){this.token("add","class",...t),this.node?.classList.add(...t)}removeClass(...t){this.token("delete","class",...t),this.node?.classList.remove(...t)}style(t){let s=()=>this.node&&e(this.node.style,t);s(),this.node||this.ondom(s)}token(t,e,...o){let r=this.#t[e],n=new Set(r?.split(" ")??[]);s(o,s=>n[t](s)),this.#t[e]=i(n).join(" ")}}class T extends M{#e;constructor(t){super(),this.#e=t}get content(){return this.#e}set content(t){this.#e=t,this.node&&(this.node.textContent=t)}toString(){return this.#e}toDOM(){if(this.node)return[this.node];let t=new Text(this.#e);return this.node=t,s(this.modifiers,s=>s(t)),[t]}get text(){return this.#e}}class x extends M{constructor(t){super(t),m()&&(this.node=new Text)}toDOM(){return[this.node,...super.toDOM()]}removeNode(){super.removeNode(),s(this.protos,t=>t.removeNode())}}function L(e,...o){const i=S.proto,r=[],l=t=>{e&&i?.append(t),r.push(t)};for(let t of H.process.craft){let s=t(...o);if(!n(s))return s}const[h,c,f]=o;if(a(h,S))return l(h),h;if(d(h)){let t=p(c)?[,c]:[c,f],s=new v(h,...t);return l(s),s}if(p(h)){let t=new h(...p(c)?[{},c]:[c,f]);if(a(t,S))return l(t),t}if(u(h)){let e=s=>{for(let t of H.process.text){let e=t(s);if(!n(e))return l(e)}let e=n(s)?t:new T(`${s}`);e&&l(e)},[i,...h]=o;return i.raw?s(i,(s,o)=>{let i=s.length?new T(s):t,r=h[o];i&&l(i),e(r)}):s(i,t=>e(t)),r}}function H(...t){return L(!0,...t)}var D;(D=H||(H={})).process={craft:/* @__PURE__ */new Set,text:/* @__PURE__ */new Set,attr:/* @__PURE__ */new Set},D.craft=(...t)=>L(!1,...t),D.dispose=t=>{S.proto?.ondispose(t)},D.render=(t,s)=>{let e=D(t).build().toDOM();document.querySelector(s)?.replaceChildren(...e)},D.context=(t,s,e)=>{let o=t.proto;t.proto=s,e(),t.proto=o},D.call=t=>t(),D.match=(t,s)=>{var e=/* @__PURE__ */new Map,o=/* @__PURE__ */Symbol("default"),i={case:(t,s)=>(e.set(t,s),i),default:t=>(e.set(o,t),i)};return s(i),e.get(t)?.()??e.get(o)?.()},D.async=t=>{S.proto?.global.asyncTask(t())},D.stylesheet=m()?new CSSStyleSheet:t,D.styleMap=/* @__PURE__ */new Map,D.style=(t,e)=>{let o=h(e);if(t){let e=D.styleMap.get(t)??/* @__PURE__ */new Set;s(o,t=>e.add(t)),D.styleMap.set(t,e)}D.stylesheet&&s(o,t=>D.stylesheet.insertRule(t))},D.stylesheet&&document.adoptedStyleSheets.push(D.stylesheet),m()&&document.querySelector("style#__ssr__")?.remove(),globalThis.$=H;export{H as $,v as ElementProto,w as GlobalState,M as NodeProto,S as Proto,x as ProxyProto,T as TextProto,f as _document,c as _window,m as onclient,g as onserver,b as symbol_ProtoType,P as symbol_Signal,y as symbol_Statement};
1
+ import{_null as t,forEach as s,_Object_assign as e,map as o,_Array_from as i,_Object_entries as r,isUndefined as n,isNull as l,toArray as h,_instanceof as a,isString as d,isFunction as p,isArray as u}from"@amateras/utils";const c=window,f=document,m=t=>!t||t(),g=t=>!1,b=/* @__PURE__ */Symbol("ProtoType"),y=/* @__PURE__ */Symbol("Statement"),P=/* @__PURE__ */Symbol("Signal");class w{static disposers=/* @__PURE__ */new Set;promises=/* @__PURE__ */new Set;root;constructor(t){this.root=t,t.ondispose(()=>this.dispose())}dispose(){this.promises.clear(),this.root=t,s(w.disposers,t=>t(this))}static assign(t){e(w.prototype,t)}asyncTask(t){this.promises.add(t),t.finally(()=>this.promises.delete(t))}}class S{static proto=t;static[b]="Proto";static[y]=!1;static disposer=[];disposers=t;layout;parent=t;global=S.proto?.global??new w(this);sibling=t;firstProto=t;lastProto=t;builded=!1;listeners=t;constructor(s){this.layout=s??t}dispose(){s(S.disposer,t=>t(this)),s(this.disposers,t=>t()),s(this.protos,t=>t.dispose()),this.global=t,this.sibling=t,this.firstProto=t,this.lastProto=t,this.disposers=t,this.parent=t,this.layout=t}get children(){return o(this.protos,t=>t.constructor[y]?t.children:t).flat()}get protos(){let t=/* @__PURE__ */new Set,s=this.firstProto;if(s){let e=s;for(;e;)t.add(e),e=e.sibling}return t}append(...e){s(e,s=>{if(s.parent!==this&&s.parent?.removeProtos(s),this.lastProto){if(this.lastProto===s)return;this.firstProto===s&&(this.firstProto=s.sibling),s.sibling=t,this.lastProto.sibling=s,this.lastProto=s}else this.firstProto=s,this.lastProto=s;s.parent=this,s.global=this.global})}replaceProtos(...t){this.clear(),this.processProtos(...t)}insert(t,s=-1){if(0===s)this.firstProto&&(t.sibling=this.firstProto),this.firstProto=t;else{let e=i(this.protos),o=s<0?e.length+s+1:s;e.splice(o,0,t),this.processProtos(...e)}t.parent=this,t.global=this.global}removeProtos(...t){let e=this.protos;s(t,t=>{t.parent=null,t.sibling=null,e.delete(t)}),this.processProtos(...e)}processProtos(...e){let o=null;e.length?s(e,(t,s)=>{0===s&&(this.firstProto=t),o&&(o.sibling=t),o=t,t.parent=this}):this.firstProto=t,this.lastProto=o}build(t=!0){return this.clear(!0),$.context(S,this,()=>this.layout?.(this)),this.builded=!0,t&&s(this.protos,t=>{t.build()}),this.dispatch("builded",this),this}toString(){return o(this.protos,t=>`${t}`).join("")}toDOM(t=!0){return t?o(this.protos,s=>s.toDOM(t)).flat():[]}ondispose(t){this.disposers=this.disposers??[],this.disposers.push(t)}removeNode(){s(this.protos,t=>t.removeNode())}clear(t=!1){let e=this.protos;this.removeProtos(...e),t&&s(e,t=>t.dispose())}findAbove(s){let e=this.parent;return e?s(e)?e:e.findAbove(s):t}findBelow(s){for(let t of this.protos){if(s(t))return t;let e=t.findBelow(s);if(e)return e}return t}findBelowAll(t){let s=[];for(let e of this.protos)t(e)&&s.push(e),s.push(...e.findBelowAll(t));return s}mutate(){}get text(){return this.children.map(t=>t.text).join("")}dispatch(t,e,o){o?.bubbles&&this.parent?.dispatch(t,e,o);let i=this.listeners?.[t];s(i,t=>t(e))}listen(t,s){let e=this.listeners??{};this.listeners=e;let o=e[t]??/* @__PURE__ */new Set;this.listeners[t]=o,o.add(s)}}class M extends S{node=t;modifiers=t;constructor(t){super(t)}ondom(t){this.modifiers=this.modifiers??[],this.modifiers.push(t)}dispose(){super.dispose(),this.node=t,this.modifiers=t}inDOM(){return!!m()&&document.contains(this.node)}removeNode(){this.node?.remove()}}const _=["img","hr","br","input","link","meta"];class v extends M{tagname;#t={};#s="";__props__;constructor(t,s,e){super(()=>e?.(this)),this.tagname=t,this.__props__=s}dispose(){super.dispose(),this.layout=null}build(s){return this.__props__&&(this.props(this.__props__),this.__props__=t),super.build(s),this}props({...t}){let{class:s,...e}=t;s&&this.addClass(...s.split(" ")),this.attrProcess(e)}on(t,s,e){let o=o=>{o.addEventListener(t,s,e),this.ondispose(()=>this.node?.removeEventListener(t,s))};this.node?o(this.node):this.ondom(o)}toString(){return this.parseHTML()}parseHTML(t){let s=this.tagname,e=t?.children??(this.#s||o(this.protos,t=>`${t}`).join("")),i=t?.attr??o(r(this.#t),([t,s])=>s.length?`${t}="${s}"`:t).join(" "),n=i.length?" "+i:"";return _.includes(s)?`<${s}${n} />`:`<${s}${n}>${e}</${s}>`}toDOM(t=!0){if(this.node)return[this.node];let e=document.createElement(this.tagname);return this.node=e,this.#s?this.node.innerHTML=this.#s:t&&e.append(...o(this.protos,s=>s.toDOM(t)).flat()),s(r(this.#t),([t,s])=>e.setAttribute(t,s)),s(this.modifiers,t=>t(e)),[e]}attrProcess(t){s(r(t),([t,s])=>{for(let e of $.process.attr){let o=e(t,s,this);if(!n(o))return}this.attr(t,s)})}innerHTML(t){this.#s=t,this.node&&(this.node.innerHTML=t)}attr(s,e){return arguments.length?n(e)?this.#t[s]??t:(l(e)?(delete this.#t[s],this.node?.removeAttribute(s)):(this.#t[s]=e,this.node?.setAttribute(s,e)),this):this.#t}addClass(...t){this.token("add","class",...t),this.node?.classList.add(...t)}removeClass(...t){this.token("delete","class",...t),this.node?.classList.remove(...t)}style(t){let s=()=>this.node&&e(this.node.style,t);s(),this.node||this.ondom(s)}token(t,e,...o){let r=this.#t[e],n=new Set(r?.split(" ")??[]);s(o,s=>n[t](s)),this.#t[e]=i(n).join(" ")}}class T extends M{#e;constructor(t){super(),this.#e=t}get content(){return this.#e}set content(t){this.#e=t,this.node&&(this.node.textContent=t)}toString(){return this.#e}toDOM(){if(this.node)return[this.node];let t=new Text(this.#e);return this.node=t,s(this.modifiers,s=>s(t)),[t]}get text(){return this.#e}}class x extends M{constructor(t){super(t),m()&&(this.node=new Text)}toDOM(){return[this.node,...super.toDOM()]}removeNode(){super.removeNode(),s(this.protos,t=>t.removeNode())}}function L(e,...o){const i=S.proto,r=[],l=t=>{e&&i?.append(t),r.push(t)};for(let t of H.process.craft){let s=t(...o);if(!n(s))return l(s),s}const[h,c,f]=o;if(a(h,S))return l(h),h;if(d(h)){let t=p(c)?[,c]:[c,f],s=new v(h,...t);return l(s),s}if(p(h)){let t=new h(...p(c)?[{},c]:[c,f]);if(a(t,S))return l(t),t}if(u(h)){let e=s=>{for(let t of H.process.text){let e=t(s);if(!n(e))return l(e)}let e=n(s)?t:new T(`${s}`);e&&l(e)},[i,...h]=o;return i.raw?s(i,(s,o)=>{let i=s.length?new T(s):t,r=h[o];i&&l(i),e(r)}):s(i,t=>e(t)),r}}function H(...t){return L(!0,...t)}var D;(D=H||(H={})).process={craft:/* @__PURE__ */new Set,text:/* @__PURE__ */new Set,attr:/* @__PURE__ */new Set},D.craft=(...t)=>L(!1,...t),D.dispose=t=>{S.proto?.ondispose(t)},D.render=(t,s)=>{let e=D(t).build().toDOM();document.querySelector(s)?.replaceChildren(...e)},D.context=(t,s,e)=>{let o=t.proto;t.proto=s,e(),t.proto=o},D.call=t=>t(),D.match=(t,s)=>{var e=/* @__PURE__ */new Map,o=/* @__PURE__ */Symbol("default"),i={case:(t,s)=>(e.set(t,s),i),default:t=>(e.set(o,t),i)};return s(i),e.get(t)?.()??e.get(o)?.()},D.async=t=>{S.proto?.global.asyncTask(t())},D.stylesheet=m()?new CSSStyleSheet:t,D.styleMap=/* @__PURE__ */new Map,D.style=(t,e)=>{let o=h(e);if(t){let e=D.styleMap.get(t)??/* @__PURE__ */new Set;s(o,t=>e.add(t)),D.styleMap.set(t,e)}D.stylesheet&&s(o,t=>D.stylesheet.insertRule(t))},D.stylesheet&&document.adoptedStyleSheets.push(D.stylesheet),m()&&document.querySelector("style#__ssr__")?.remove(),globalThis.$=H;export{H as $,v as ElementProto,w as GlobalState,M as NodeProto,S as Proto,x as ProxyProto,T as TextProto,f as _document,c as _window,m as onclient,g as onserver,b as symbol_ProtoType,P as symbol_Signal,y as symbol_Statement};
package/build/for.js CHANGED
@@ -1 +1 @@
1
- import{ProxyProto as t,symbol_Statement as e,Proto as s}from"@amateras/core";import{forEach as i,_Array_from as o,_null as r}from"@amateras/utils";class a extends t{static[e]=!0;#t;list$;#e=/* @__PURE__ */new Map;constructor(t,e){super(),this.list$=t,this.#t=e;let s=()=>{const t=this.exec();i(this.protos,t=>t.builded||t.build()),i(t,t=>t.removeNode());let e=this.node,s=e?.parentNode;if(e&&s){let t=this.toDOM(),a=o(s.childNodes).indexOf(e);i(t,t=>{if(t!==e){if(s.childNodes[a]!==t){let e=s.childNodes[a+1]??r;s.insertBefore(t,e)}}a++})}this.parent?.mutate()};this.list$.subscribe(s),this.ondispose(()=>this.list$.unsubscribe(s))}build(){return this.#e=/* @__PURE__ */new Map,this.exec(),this.protos.forEach(t=>t.builded||t.build()),this}exec(){let t=this.protos,e=/* @__PURE__ */new Set;return i(this.list$.value,(i,o)=>{$.context(s,this,()=>{let s=this.#t,r=this.#e.get(i)??new l(()=>s(i,o));this.#e.set(i,r),t.delete(r),e.add(r)})}),this.replaceProtos(...e),t}removeNode(){this.node?.remove(),i(this.protos,t=>t.removeNode())}dispose(){super.dispose(),i(this.#e.values(),t=>t.dispose()),this.#e.clear()}}class l extends s{static[e]=!0}globalThis.For=a,$.process.craft.add((t,e,i)=>{if(t===a){let t=new a(e,i);return s.proto?.append(t),t}});export{a as For,l as ForItem};
1
+ import{ProxyProto as t,symbol_Statement as e,Proto as s}from"@amateras/core";import{forEach as i,_Array_from as o,_null as r}from"@amateras/utils";class a extends t{static[e]=!0;#t;list$;#e=/* @__PURE__ */new Map;constructor(t,e){super(),this.list$=t,this.#t=e;let s=()=>{const t=this.exec();i(this.protos,t=>t.builded||t.build()),i(t,t=>t.removeNode());let e=this.node,s=e?.parentNode;if(e&&s){let t=this.toDOM(),a=o(s.childNodes).indexOf(e);i(t,t=>{if(t!==e){if(s.childNodes[a]!==t){let e=s.childNodes[a+1]??r;s.insertBefore(t,e)}}a++})}this.parent?.mutate()};this.list$.subscribe(s),this.ondispose(()=>this.list$.unsubscribe(s))}build(){return this.#e=/* @__PURE__ */new Map,this.exec(),this.protos.forEach(t=>t.builded||t.build()),this}exec(){let t=this.protos,e=/* @__PURE__ */new Set;return i(this.list$.value,(i,o)=>{$.context(s,this,()=>{let s=this.#t,r=this.#e.get(i)??new l(()=>s(i,o));this.#e.set(i,r),t.delete(r),e.add(r)})}),this.replaceProtos(...e),t}removeNode(){this.node?.remove(),i(this.protos,t=>t.removeNode())}dispose(){super.dispose(),i(this.#e.values(),t=>t.dispose()),this.#e.clear()}}class l extends s{static[e]=!0}globalThis.For=a,$.process.craft.add((t,e,s)=>{if(t===a)return new a(e,s)});export{a as For,l as ForItem};
package/build/if.js CHANGED
@@ -1 +1 @@
1
- import{Proto as t,symbol_Statement as e,ProxyProto as s}from"@amateras/core";import{_null as i,forEach as a,_instanceof as l,isIncluded as r}from"@amateras/utils";import{Signal as n}from"@amateras/signal";class o extends t{static[e]=!0;exp$;constructor(t,e){super(()=>e(this.exp$)),this.exp$=t}dispose(){super.dispose(),this.exp$=i}validate(){return!this.exp$||!!this.exp$.value}}class p extends o{}class d extends o{}class h extends o{}class m extends s{static[e]=!0;statements=i;statement=i;build(){super.build(!1),this.validate()?.build();let t=()=>{let t=this.validate();t?.builded||t?.build(),this.statement!==t&&(this.statement=t??i,a(this.statements,e=>e!==t&&e.removeNode()),this.node?.replaceWith(...this.toDOM()),this.parent?.mutate())};return a(this.statements,e=>{e.exp$?.subscribe(t),e.ondispose(()=>{e.exp$?.unsubscribe(t)})}),this}dispose(){super.dispose(),a(this.statements,t=>t.dispose()),this.statement=i,this.statements=i}validate(){if(this.clear(),this.statements)for(let t of this.statements)if(t.validate())return this.append(t),t}}globalThis.If=h,globalThis.Else=p,globalThis.ElseIf=d;let u=null;$.process.craft.add((e,s,a)=>{let o=t.proto;if(e===h&&(u=new m,o?.append(u)),l(u,m)){if(r(e,[h,p,d])){{let t=new e(...l(s,n)?[s,a]:[i,s]);u.statements=u.statements??[],u.statements?.push(t)}return u}u=i}else if(r(e,[p,d]))throw"ElseIf/Else must be after If or ElseIf"});
1
+ import{Proto as t,symbol_Statement as s,ProxyProto as e}from"@amateras/core";import{_null as i,forEach as a,_instanceof as l,isIncluded as r}from"@amateras/utils";import{Signal as n}from"@amateras/signal";class h extends t{static[s]=!0;exp$;constructor(t,s){super(()=>s(this.exp$)),this.exp$=t}dispose(){super.dispose(),this.exp$=i}validate(){return!this.exp$||!!this.exp$.value}}class o extends h{}class d extends h{}class p extends h{}class m extends e{static[s]=!0;statements=i;statement=i;build(){super.build(!1),this.validate()?.build();let t=()=>{let t=this.validate();t?.builded||t?.build(),this.statement!==t&&(this.statement=t??i,a(this.statements,s=>s!==t&&s.removeNode()),this.node?.replaceWith(...this.toDOM()),this.parent?.mutate())};return a(this.statements,s=>{s.exp$?.subscribe(t),s.ondispose(()=>{s.exp$?.unsubscribe(t)})}),this}dispose(){super.dispose(),a(this.statements,t=>t.dispose()),this.statement=i,this.statements=i}validate(){if(this.clear(),this.statements)for(let t of this.statements)if(t.validate())return this.append(t),t}}globalThis.If=p,globalThis.Else=o,globalThis.ElseIf=d;let u=null;$.process.craft.add((t,s,e)=>{if(t===p&&(u=new m),l(u,m)){if(r(t,[p,o,d])){{let a=new t(...l(s,n)?[s,e]:[i,s]);u.statements=u.statements??[],u.statements?.push(a)}return u}u=i}else if(r(t,[o,d]))throw"ElseIf/Else must be after If or ElseIf"});
@@ -1 +1 @@
1
- const t=`https://unpkg.com/amateras@${"0.13.1"}/build`,e={...{amateras:`${t}/core.js`},...Object.fromEntries(["core","utils","signal","for","if","match","css","i18n","idb","meta","prefetch","router","widget"].map(e=>{const r=`amateras/${e}`,s=`${t}/${e}.js`;return[[r,s],[`@${r}`,s]]}).flat())},r=document.querySelector('script[type="importmap"]');if(r){const t=JSON.parse(r.innerHTML);t.imports={...t.imports,...e},r.innerHTML=JSON.stringify(t,null,"\t")}else{const t=document.createElement("script");t.setAttribute("type","importmap"),t.innerHTML=JSON.stringify({imports:e},null,"\t"),document.head.prepend(t)}
1
+ const e=`https://unpkg.com/amateras@${"0.13.3"}/build`,t={amateras:`${e}/core.js`},n=[{name:"core",description:"Core module"},{name:"widget",description:"Component module"},{name:"signal",description:"Reactive data module"},{name:"store",description:"Access data between widgets"},{name:"css",description:"CSS-in-JS module"},{name:"for",description:"For loop control-flow"},{name:"if",description:"If/Else/ElseIf control-flow"},{name:"match",description:"Match/Case/Default control-flow"},{name:"router",description:"Router module"},{name:"i18n",description:"Translation module"},{name:"idb",description:"IndexedDB module"},{name:"markdown",description:"Markdown to HTML module",codeInsert:'import { Markdown } from "amateras/markdown"; new Markdown();'},{name:"prefetch",description:"SSR data prefetch"},{name:"meta",description:"SSR `meta` tag manager"},{name:"ui",description:"UI components"},{name:"utils",description:"Utilities module",codeInsert:'import * as utils from "amateras/utils";'}].map(e=>e.name),o={...t,...Object.fromEntries(n.map(t=>{const n=`amateras/${t}`,o=`${e}/${t}.js`;return[[n,o],[`@${n}`,o]]}).flat())},r=document.querySelector('script[type="importmap"]');if(r){const e=JSON.parse(r.innerHTML);e.imports={...e.imports,...o},r.innerHTML=JSON.stringify(e,null,"\t")}else{const e=document.createElement("script");e.setAttribute("type","importmap"),e.innerHTML=JSON.stringify({imports:o},null,"\t"),document.head.prepend(e)}
package/build/match.js CHANGED
@@ -1 +1 @@
1
- import{Proto as t,symbol_Statement as e,ProxyProto as s}from"@amateras/core";import{isArray as i,_null as a,forEach as d,is as r}from"@amateras/utils";class h extends t{static[e]=!0;condition;constructor(t,e){super(e),this.condition=i(t)?t:[t]}}class l extends t{static[e]=!0;constructor(t){super(t)}}class o extends s{static[e]=!0;exp$;cases=/* @__PURE__ */new Set;matched=a;#t=a;constructor(t,e){super(()=>{e((t,e,s)=>{$(t,e,s)})}),this.exp$=t}dispose(){d(this.cases,t=>t.dispose()),this.#t?.dispose(),this.matched=a,this.#t=a,this.cases.clear()}build(){super.build(!1),this.validate();let t=()=>{let t=this.matched,e=this.validate();t!==e&&(d(this.cases,t=>t!==e&&t.removeNode()),e!==this.#t&&this.#t?.removeNode(),this.node?.replaceWith(...this.toDOM()),this.parent?.mutate())};return d(this.cases,e=>{this.exp$.subscribe(t),e.ondispose(()=>this.exp$.unsubscribe(t))}),this}case(t,e){let s=new h(t,e);return this.cases.add(s),s}default(t){let e=new l(t);return this.#t=e,e}validate(){this.clear();for(let t of this.cases)if(t.condition.includes(this.exp$.value))return this.append(t),t.builded||t.build(),this.matched=t;if(this.#t)return this.append(this.#t),this.#t.builded||this.#t.build(),this.matched=this.#t}}globalThis.Match=o,globalThis.Case=h,globalThis.Default=l,$.process.craft.add((e,s,i)=>{if(e===o){let e=new o(s,i);return t.proto?.append(e),e}return e===h?r(t.proto,o)?.case(s,i):e===l?r(t.proto,o)?.default(s):void 0});
1
+ import{Proto as t,symbol_Statement as e,ProxyProto as s}from"@amateras/core";import{isArray as i,_null as a,forEach as d,is as h}from"@amateras/utils";class l extends t{static[e]=!0;condition;constructor(t,e){super(e),this.condition=i(t)?t:[t]}}class r extends t{static[e]=!0;constructor(t){super(t)}}class c extends s{static[e]=!0;exp$;cases=/* @__PURE__ */new Set;matched=a;#t=a;constructor(t,e){super(()=>{e((t,e,s)=>{$(t,e,s)})}),this.exp$=t}dispose(){d(this.cases,t=>t.dispose()),this.#t?.dispose(),this.matched=a,this.#t=a,this.cases.clear()}build(){super.build(!1),this.validate();let t=()=>{let t=this.matched,e=this.validate();t!==e&&(d(this.cases,t=>t!==e&&t.removeNode()),e!==this.#t&&this.#t?.removeNode(),this.node?.replaceWith(...this.toDOM()),this.parent?.mutate())};return d(this.cases,e=>{this.exp$.subscribe(t),e.ondispose(()=>this.exp$.unsubscribe(t))}),this}case(t,e){let s=new l(t,e);return this.cases.add(s),s}default(t){let e=new r(t);return this.#t=e,e}validate(){this.clear();for(let t of this.cases)if(t.condition.includes(this.exp$.value))return this.append(t),t.builded||t.build(),this.matched=t;if(this.#t)return this.append(this.#t),this.#t.builded||this.#t.build(),this.matched=this.#t}}globalThis.Match=c,globalThis.Case=l,globalThis.Default=r,$.process.craft.add((e,s,i)=>e===c?new c(s,i):e===l?h(t.proto,c)?.case(s,i):e===r?h(t.proto,c)?.default(s):void 0);
package/build/router.js CHANGED
@@ -1 +1 @@
1
- import{ElementProto as t,ProxyProto as e,onclient as s,Proto as r,symbol_ProtoType as o,GlobalState as i}from"@amateras/core";import{_undefined as l,toURL as a,_null as n,is as h,_instanceof as c,isUndefined as u,isFunction as p,map as d,isArray as f,forEach as w,_JSON_parse as v,_Object_entries as g,_JSON_stringify as y,_Object_assign as m}from"@amateras/utils";class b extends t{constructor(t,e){super("a",t,e),this.on("click",t=>{if(t.shiftKey||t.ctrlKey)return;t.preventDefault();let e=this.attr("target"),s=this.attr("href");s&&("_replace"===e?$.replace(s):$.open(s,e??l))})}}class k extends e{page=n;constructor(){super()}switch(t){if(this.page!==t&&(this.clear(),this.layout=()=>$(t),this.append(t),this.page!==t&&this.page?.removeNode(),this.page=t,t.builded||t.build(),t.updateTitle(),s())){let t=this.toDOM();this.node?.replaceWith(...t)}}}class x extends r{slot=new k;route;title=n;constructor(t,e,s){super(()=>e({params:s,slot:this.slot})),this.route=t}updateTitle(){let t=this.title??this.findAbove(t=>h(t,x)?.title)?.title??n,e=t=>{s()&&(document.title=t),this.global.title=t};t&&(c(t,Promise)?t.then(t=>{this.title=t,e(t)}):e(t))}}class P{routes=/* @__PURE__ */new Map;path;paths=/* @__PURE__ */new Map;validPaths=[];constructor(t){this.path=t,this.paths.set(t,l)}routing(t){let e=t.split("/"),s={},r="";t:for(let[i,l]of this.paths){s={};let t=i.split("/"),o=[];for(let s=0;s<Math.max(e.length,t.length);s++)o.push([t[s],e[s]]);e:for(let[e,i]of o){let t=()=>{r=""},o=()=>{r+=("/"!==r?"/":"")+i};if(u(e))break e;if(u(i)){t();continue t}if(e?.includes(":")){let[r,l]=e.split(":");if(!i.startsWith(r)){t();continue t}s[l]=i.replace(r,""),o();continue e}if(e!==i){t();continue t}o()}if(r){s={...s,...p(l)?l():l};break t}}if(!r)return;let o=P.resolvePath(this.path,s);return this.validPaths=d(this.paths,t=>P.resolvePath(t[0],s)),[o,r,s]}static resolvePath(t,e){return t.replaceAll(/:([^/]+)/g,(t,s)=>`${e[s]}`)}alias(t,e){this.paths.set(t,e)}}class S extends P{constructor(t){super(t)}async resolve(t,e,s){let r=this.routing(t);if(!r)return;let[,o,i]=r;s={...s,...i};let l=t.replace(o,"");for(let[a,n]of this.routes){let t=await n.resolve(l||"/",e,s);if(t)return[this,...t]}return[this]}}class T extends P{pages=/* @__PURE__ */new Map;page=n;#t;constructor(t,e){super(t),this.#t=e}async resolve(t,e,s){let r=this.routing(t);if(!r)return;let[o,i,l]=r;s={...s,...l};let a=await this.usePage(o,s,e),n=t.replace(i,"");for(let[h,c]of this.routes){let t=await c.resolve(n||"/",a.slot,s);if(t)return[this,...t]}return n?void 0:[this]}async usePage(t,e,s){let i=this.pages.get(t);if(!i){let l,a=this.#t;if(f(a)){let t=await a[0]().then(t=>t.default);l=()=>$(t,e,()=>$(i.slot))}else l="Widget"===this.#t[o]?()=>$(this.#t,e,()=>$(i.slot)):this.#t;$.context(r,s,()=>{i=new x(this,l,e)}),this.pages.set(t,i)}return this.page=i,s.switch(i),i}}let R=0;const[_,E]=[1,2],[L,M]=["forward","back"],A="__scroll_history__",D=s()?sessionStorage:n,N=s()?window.addEventListener:n,H=s()?window.removeEventListener:n;s()&&(history.scrollRestoration="manual");const W=t=>{const e=I.scrollHistory;if(t){let s=t.target;"#document"===s.nodeName?e[R]={[s.nodeName]:{x:window.scrollX,y:window.scrollY}}:""!==s.id&&(e[R]={[s.id]:{x:s.scrollLeft,y:s.scrollTop}})}else w(g(e),([t])=>+t>=R&&delete e[+t]);D?.setItem(A,y(e))};class I extends r{direction=L;prev=n;routes=/* @__PURE__ */new Map;slot=new k;static routers=/* @__PURE__ */new Set;constructor(){super(()=>$(this.slot)),s()&&I.routers.add(this)}set href(t){this.global.router.href=t}build(){if(s()){const t=()=>{const t=history.state?.index??0;R>t&&(this.direction=M),R<t&&(this.direction=L),R=t,this.prev=this.href,this.href=a(location.href),this.resolve(location.href)};t(),N?.("popstate",t),N?.("scroll",W,{capture:!0,passive:!1}),this.ondispose(()=>{H?.("popstate",t),H?.("scroll",W,{capture:!0})})}return super.build()}async resolve(t){if(!t)return;let e=a(t);for(let[,s]of this.routes){let t=await s.resolve(e.pathname,this.slot,{});if(t){this.global.router.routes=t;let e=[""],s=[];w(t,t=>(e=d(t.validPaths,t=>d(e,e=>e+t)).flat(),s.push(...e),e)),this.global.router.matchPaths=s;break}}w(this.global.router.navlinks,t=>t.checkActive()),I.dispatchEvent(),I.scrollRestoration()}static open(t,e="_self"){a(t).origin!==origin?open(t,e):I.writeState(t,_,e)}static forward(){history.forward()}static back(){history.back()}static replace(t){I.writeState(t,E)}static get scrollData(){return this.scrollHistory[R]??{}}static get scrollHistory(){return v(D?.getItem(A)??"{}")}static scrollRestoration(){if(s()){let t=I.scrollData??{x:0,y:0},e=g(t);e.length?w(e,([t,{x:e,y:s}])=>{"#document"===t?window.scrollTo(e,s):document.querySelector(`#${t}`)?.scrollTo(e,s)}):window.scrollTo(0,0)}}static writeState(t,e,r){if(!t)return;let o=a(t);if(!s()||o.href!==location.href){if(r&&"_self"!==r)return open(o,r);e===_&&R++,s()&&W(),w(this.routers,r=>{r.direction=L,s()&&(r.prev=a(location.href),history[e===_?"pushState":"replaceState"]({index:R},"",o)),r.href=o,r.resolve(t)}),I.dispatchEvent()}}static dispatchEvent(){s()&&window.dispatchEvent(new Event("pathchange"))}}const K=t=>class extends I{static[o]="Router";constructor(){super(),t(this)}};let q={route(t,e,s){let r=new T(t,e);return this.routes.set(t,r),s?.(r),this},group(t,e){let s=new S(t);return this.routes.set(t,s),e?.(s),this},notfound(){}};m(P.prototype,q),m(I.prototype,q),m(i.prototype,{router:{routers:/* @__PURE__ */new Set,resolve(t){return d(this.routers,e=>e.resolve(t))},href:new URL("http://localhost"),routes:[],matchPaths:[],navlinks:/* @__PURE__ */new Set}}),i.disposers.add(({router:t})=>{t.routers.clear(),t.routes=[],t.matchPaths=[],t.navlinks.clear()}),m($,{router:t=>K(t),open:I.open,replace:I.replace,back:I.back,forward:I.forward,scrollRestoration:I.scrollRestoration,title(t){let e=r.proto?.findAbove(t=>h(t,x));e&&(e.title=t,e.updateTitle())}}),globalThis.Link=b,globalThis.NavLink=class extends b{constructor(t,e){super(t,e),this.global.router.navlinks.add(this)}checkActive(){let t=this.attr("href");if(t){for(let e of this.global.router.matchPaths)if(a(e).href===a(t).href)return this.attr("active","");this.attr("active",n)}}},$.process.craft.add(t=>{if(p(t)&&"Router"===t[o]){let e=r.proto,s=new t;return e?.global.router.routers.add(s),e?.append(s),s}});export{b as Link,x as Page,P as Route,S as RouteGroup,T as RouteNode,k as RouteSlot,I as RouterProto};
1
+ import{ElementProto as t,ProxyProto as e,onclient as s,Proto as r,symbol_ProtoType as o,GlobalState as i}from"@amateras/core";import{_undefined as l,toURL as a,_null as n,is as h,_instanceof as c,isUndefined as u,isFunction as p,map as d,isArray as f,forEach as w,_JSON_parse as v,_Object_entries as g,_JSON_stringify as y,_Object_assign as m}from"@amateras/utils";class b extends t{constructor(t,e){super("a",t,e),this.on("click",t=>{if(t.shiftKey||t.ctrlKey)return;t.preventDefault();let e=this.attr("target"),s=this.attr("href");s&&("_replace"===e?$.replace(s):$.open(s,e??l))})}}class k extends e{page=n;constructor(){super()}switch(t){if(this.page!==t&&(this.clear(),this.layout=()=>$(t),this.append(t),this.page!==t&&this.page?.removeNode(),this.page=t,t.builded||t.build(),t.updateTitle(),s())){let t=this.toDOM();this.node?.replaceWith(...t)}}}class x extends r{slot=new k;route;title=n;constructor(t,e,s){super(()=>e({params:s,slot:this.slot})),this.route=t}updateTitle(){let t=this.title??this.findAbove(t=>h(t,x)?.title)?.title??n,e=t=>{s()&&(document.title=t),this.global.title=t};t&&(c(t,Promise)?t.then(t=>{this.title=t,e(t)}):e(t))}}class P{routes=/* @__PURE__ */new Map;path;paths=/* @__PURE__ */new Map;validPaths=[];constructor(t){this.path=t,this.paths.set(t,l)}routing(t){let e=t.split("/"),s={},r="";t:for(let[i,l]of this.paths){s={};let t=i.split("/"),o=[];for(let s=0;s<Math.max(e.length,t.length);s++)o.push([t[s],e[s]]);e:for(let[e,i]of o){let t=()=>{r=""},o=()=>{r+=("/"!==r?"/":"")+i};if(u(e))break e;if(u(i)){t();continue t}if(e?.includes(":")){let[r,l]=e.split(":");if(!i.startsWith(r)){t();continue t}s[l]=i.replace(r,""),o();continue e}if(e!==i){t();continue t}o()}if(r){s={...s,...p(l)?l():l};break t}}if(!r)return;let o=P.resolvePath(this.path,s);return this.validPaths=d(this.paths,t=>P.resolvePath(t[0],s)),[o,r,s]}static resolvePath(t,e){return t.replaceAll(/:([^/]+)/g,(t,s)=>`${e[s]}`)}alias(t,e){this.paths.set(t,e)}}class S extends P{constructor(t){super(t)}async resolve(t,e,s){let r=this.routing(t);if(!r)return;let[,o,i]=r;s={...s,...i};let l=t.replace(o,"");for(let[a,n]of this.routes){let t=await n.resolve(l||"/",e,s);if(t)return[this,...t]}return[this]}}class T extends P{pages=/* @__PURE__ */new Map;page=n;#t;constructor(t,e){super(t),this.#t=e}async resolve(t,e,s){let r=this.routing(t);if(!r)return;let[o,i,l]=r;s={...s,...l};let a=await this.usePage(o,s,e),n=t.replace(i,"");for(let[h,c]of this.routes){let t=await c.resolve(n||"/",a.slot,s);if(t)return[this,...t]}return n?void 0:[this]}async usePage(t,e,s){let i=this.pages.get(t);if(!i){let l,a=this.#t;if(f(a)){let t=await a[0]().then(t=>t.default);l=()=>$(t,e,()=>$(i.slot))}else l="Widget"===this.#t[o]?()=>$(this.#t,e,()=>$(i.slot)):this.#t;$.context(r,s,()=>{i=new x(this,l,e)}),this.pages.set(t,i)}return this.page=i,s.switch(i),i}}let R=0;const[_,E]=[1,2],[L,M]=["forward","back"],A="__scroll_history__",D=s()?sessionStorage:n,N=s()?window.addEventListener:n,H=s()?window.removeEventListener:n;s()&&(history.scrollRestoration="manual");const W=t=>{const e=I.scrollHistory;if(t){let s=t.target;"#document"===s.nodeName?e[R]={[s.nodeName]:{x:window.scrollX,y:window.scrollY}}:""!==s.id&&(e[R]={[s.id]:{x:s.scrollLeft,y:s.scrollTop}})}else w(g(e),([t])=>+t>=R&&delete e[+t]);D?.setItem(A,y(e))};class I extends r{direction=L;prev=n;routes=/* @__PURE__ */new Map;slot=new k;static routers=/* @__PURE__ */new Set;constructor(){super(()=>$(this.slot)),s()&&I.routers.add(this)}set href(t){this.global.router.href=t}build(){if(s()){const t=()=>{const t=history.state?.index??0;R>t&&(this.direction=M),R<t&&(this.direction=L),R=t,this.prev=this.href,this.href=a(location.href),this.resolve(location.href)};t(),N?.("popstate",t),N?.("scroll",W,{capture:!0,passive:!1}),this.ondispose(()=>{H?.("popstate",t),H?.("scroll",W,{capture:!0})})}return super.build()}async resolve(t){if(!t)return;let e=a(t);for(let[,s]of this.routes){let t=await s.resolve(e.pathname,this.slot,{});if(t){this.global.router.routes=t;let e=[""],s=[];w(t,t=>(e=d(t.validPaths,t=>d(e,e=>e+t)).flat(),s.push(...e),e)),this.global.router.matchPaths=s;break}}w(this.global.router.navlinks,t=>t.checkActive()),I.dispatchEvent(),I.scrollRestoration()}static open(t,e="_self"){a(t).origin!==origin?open(t,e):I.writeState(t,_,e)}static forward(){history.forward()}static back(){history.back()}static replace(t){I.writeState(t,E)}static get scrollData(){return this.scrollHistory[R]??{}}static get scrollHistory(){return v(D?.getItem(A)??"{}")}static scrollRestoration(){if(s()){let t=I.scrollData??{x:0,y:0},e=g(t);e.length?w(e,([t,{x:e,y:s}])=>{"#document"===t?window.scrollTo(e,s):document.querySelector(`#${t}`)?.scrollTo(e,s)}):window.scrollTo(0,0)}}static writeState(t,e,r){if(!t)return;let o=a(t);if(!s()||o.href!==location.href){if(r&&"_self"!==r)return open(o,r);e===_&&R++,s()&&W(),w(this.routers,r=>{r.direction=L,s()&&(r.prev=a(location.href),history[e===_?"pushState":"replaceState"]({index:R},"",o)),r.href=o,r.resolve(t)}),I.dispatchEvent()}}static dispatchEvent(){s()&&window.dispatchEvent(new Event("pathchange"))}}const K=t=>class extends I{static[o]="Router";constructor(){super(),t(this)}};let q={route(t,e,s){let r=new T(t,e);return this.routes.set(t,r),s?.(r),this},group(t,e){let s=new S(t);return this.routes.set(t,s),e?.(s),this},notfound(){}};m(P.prototype,q),m(I.prototype,q),m(i.prototype,{router:{routers:/* @__PURE__ */new Set,resolve(t){return d(this.routers,e=>e.resolve(t))},href:new URL("http://localhost"),routes:[],matchPaths:[],navlinks:/* @__PURE__ */new Set}}),i.disposers.add(({router:t})=>{t.routers.clear(),t.routes=[],t.matchPaths=[],t.navlinks.clear()}),m($,{router:t=>K(t),open:I.open,replace:I.replace,back:I.back,forward:I.forward,scrollRestoration:I.scrollRestoration,title(t){let e=r.proto?.findAbove(t=>h(t,x));e&&(e.title=t,e.updateTitle())}}),globalThis.Link=b,globalThis.NavLink=class extends b{constructor(t,e){super(t,e),this.global.router.navlinks.add(this)}checkActive(){let t=this.attr("href");if(t){for(let e of this.global.router.matchPaths)if(a(e).href===a(t).href)return this.attr("active","");this.attr("active",n)}}},$.process.craft.add(t=>{if(p(t)&&"Router"===t[o]){let e=r.proto,s=new t;return e?.global.router.routers.add(s),s}});export{b as Link,x as Page,P as Route,S as RouteGroup,T as RouteNode,k as RouteSlot,I as RouterProto};
package/build/signal.js CHANGED
@@ -1 +1 @@
1
- import{_null as e,isSymbol as s,isString as t,forEach as i,_Object_entries as r,isFunction as a,isUndefined as u,_Object_assign as l,_instanceof as n,isIncluded as h,isBoolean as c}from"@amateras/utils";import{symbol_Signal as o,Proto as p,GlobalState as d,TextProto as m}from"@amateras/core";let b=!1,v=/* @__PURE__ */new Set,f=e=>{b=!1;let s=e();return b=!0,s},g=e=>{b=!0;let s=e(f);return b=!1,s},k=new FinalizationRegistry(({signal:e,ref:s})=>{e.computes?.delete(s)});class x extends Function{[o]=!0;linked=e;_value;subs=e;map=e;exec=e;computes=e;constructor(e){return super(),p.proto?.global.signals.add(this),this._value=e,new Proxy(this,{apply:()=>this._exec(),get:(e,i)=>{if(s(i)||t(i)&&!i.endsWith("$"))return this[i];const r=this.value[i.slice(0,-1)];this.map||(this.map={});const a=this.map[i]??new x(r);return this.map[i]=a,a}})}_exec(){return b&&v.add(this),this.value}get value(){return this.linked?this.linked.value:this._value}dispose(){this.subs=e,this.linked=e,i(this.computes,e=>e.deref()?.dispose()),this.computes=e,this.exec=e,this._value=e,this.map&&i(r(this.map),([e,s])=>s.dispose()),this.map=e}set(e){this.linked?this.linked.set(e):a(e)?this.set(e(this.value)):this.value!==e&&(this._value=e,this.emit())}modify(e){e(this.value),this.emit()}emit(){i(this.subs,e=>e(this.value)),i(this.computes,e=>{let s=e.deref();s||this.computes?.delete(e),s?.exec?.()})}subscribe(e){this.subs=this.subs??[],this.subs.push(e)}unsubscribe(e){let s=this.subs?.indexOf(e);u(s)||-1===s||this.subs?.splice(s,1)}link(e){if(this===e)throw"Signal.link(): cannot link self";this.linked=e,this.emit(),e.subscribe(()=>this.emit())}is(e){return e(this)}toString(){return`${this.value}`}}d.assign({signals:/* @__PURE__ */new Set}),d.disposers.add(e=>{i(e.signals,e=>e.dispose()),e.signals.clear()}),l($,{signal:e=>new x(e),effect(e){g(e),i(v,s=>s.subscribe(s=>e(f))),v.clear()},compute(e){let s=g(e),t=$.signal(s);return t.exec=()=>t.set(e(f)),i(v,e=>{e.computes=e.computes??/* @__PURE__ */new Set;let s=new WeakRef(t);e.computes.add(s),k.register(t,{signal:e,ref:s})}),v.clear(),t},optional:s=>s.value?s:e,resolve:(e,s)=>n(e,x)?(s&&(e.subscribe(s),s(e)),e.value):(s?.(e),e)});let w=e=>{if(n(e,x)){let s=new m(`${e}`),t=e=>s.content=`${e}`;return e.subscribe(t),s.ondispose(()=>e.unsubscribe(t)),t(e.value),s}};$.process.text.add(w),$.process.craft.add(w),$.process.attr.add((e,s,t)=>{if(n(s,x)){if("input"===t.tagname){if(h(e,["value","checked"])){t.on("input",t=>s.set(t.currentTarget[e]));let i=s.value;c(i)?i&&t.attr(e,""):t.attr(e,`${i}`)}}else{let i=()=>t.attr(e,s.value);s.subscribe(i),i(),t.ondispose(()=>s.unsubscribe(i))}return!0}});export{x as Signal};
1
+ import{_null as e,isSymbol as s,isString as t,forEach as i,_Object_entries as r,isFunction as u,isUndefined as a,_Object_assign as l,_instanceof as n,isIncluded as h,isBoolean as c}from"@amateras/utils";import{symbol_Signal as o,Proto as p,GlobalState as d,TextProto as m}from"@amateras/core";let b=!1,v=/* @__PURE__ */new Set,f=e=>{b=!1;let s=e();return b=!0,s},g=e=>{b=!0;let s=e(f);return b=!1,s},k=new FinalizationRegistry(({signal:e,ref:s})=>{e.computes?.delete(s)});class x extends Function{[o]=!0;linked=e;_value;subs=e;map=e;exec=e;computes=e;constructor(e){return super(),p.proto?.global.signals.add(this),this._value=e,new Proxy(this,{apply:()=>this._exec(),get:(e,i)=>{if(s(i)||t(i)&&!i.endsWith("$"))return this[i];const r=this.value[i.slice(0,-1)];this.map||(this.map={});const u=this.map[i]??new x(r);return this.map[i]=u,this.subscribe(()=>u.set(this.value[i.slice(0,-1)])),u}})}_exec(){return b&&v.add(this),this.value}get value(){return this.linked?this.linked.value:this._value}dispose(){this.subs=e,this.linked=e,i(this.computes,e=>e.deref()?.dispose()),this.computes=e,this.exec=e,this._value=e,this.map&&i(r(this.map),([e,s])=>s.dispose()),this.map=e}set(e){this.linked?this.linked.set(e):u(e)?this.set(e(this.value)):this.value!==e&&(this._value=e,this.emit())}modify(e){e(this.value),this.emit()}emit(){i(this.subs,e=>e(this.value)),i(this.computes,e=>{let s=e.deref();s||this.computes?.delete(e),s?.exec?.()})}subscribe(e){this.subs=this.subs??[],this.subs.push(e)}unsubscribe(e){let s=this.subs?.indexOf(e);a(s)||-1===s||this.subs?.splice(s,1)}link(e){if(this===e)throw"Signal.link(): cannot link self";this.linked=e,this.emit(),e.subscribe(()=>this.emit())}is(e){return e(this)}toString(){return`${this.value}`}}d.assign({signals:/* @__PURE__ */new Set}),d.disposers.add(e=>{i(e.signals,e=>e.dispose()),e.signals.clear()}),l($,{signal:e=>new x(e),effect(e){g(e),i(v,s=>s.subscribe(s=>e(f))),v.clear()},compute(e){let s=g(e),t=$.signal(s);return t.exec=()=>t.set(e(f)),i(v,e=>{e.computes=e.computes??/* @__PURE__ */new Set;let s=new WeakRef(t);e.computes.add(s),k.register(t,{signal:e,ref:s})}),v.clear(),t},optional:s=>s.value?s:e,resolve:(e,s)=>n(e,x)?(s&&(e.subscribe(s),s(e)),e.value):(s?.(e),e)});let w=e=>{if(n(e,x)){let s=new m(`${e}`),t=e=>s.content=`${e}`;return e.subscribe(t),s.ondispose(()=>e.unsubscribe(t)),t(e.value),s}};$.process.text.add(w),$.process.craft.add(w),$.process.attr.add((e,s,t)=>{if(n(s,x)){if("input"===t.tagname){if(h(e,["value","checked"])){t.on("input",t=>s.set(t.currentTarget[e]));let i=s.value;c(i)?i&&t.attr(e,""):t.attr(e,`${i}`)}}else{let i=()=>t.attr(e,s.value);s.subscribe(i),i(),t.ondispose(()=>s.unsubscribe(i))}return!0}});export{x as Signal};
package/build/utils.js CHANGED
@@ -1 +1 @@
1
- const e=null,t=void 0,r=Object,n=r.fromEntries,o=r.entries,s=r.assign,a=r.values,i=r.defineProperty,c=r.getOwnPropertyDescriptors,l=Array,u=l.from,p=async(e,t)=>{if(!e)return;let r=0;return v(t)?(async()=>{for(let n of e)await t(n,r,e),r++})():(()=>{for(let n of e)t(n,r,e),r++})()},f=(e,t)=>u(e).map(t),g=(e,t)=>typeof e===t,y=(e,t)=>t.includes(e),m=e=>g(e,"string"),d=e=>g(e,"boolean"),h=e=>g(e,"number"),w=e=>g(e,"object"),b=e=>g(e,"function"),j=e=>g(e,"symbol"),v=e=>U(e,(async()=>0).constructor),O=e=>void 0===e,P=t=>t===e,T=l.isArray,U=(e,...t)=>!!t.find(t=>e instanceof t),A=(t,r)=>U(t,r)?t:e,E=JSON.stringify,M=JSON.parse,S=(e,...t)=>!!t.find(t=>e.startsWith(t)),$=(e,t,r)=>e.slice(t,r),x=(e,t)=>e.bind(t),C=Promise,J=()=>{let e;return(t,r)=>{e&&clearTimeout(e),e=setTimeout(t,r)}},L="abcdefghijklmnopqrstuvwxyz",N=L.toUpperCase(),R=e=>{const t="any"===(e={length:5,lettercase:"any",...e}).lettercase?L+N:"lower"===e.lettercase?L:N;return u({length:e.length},(e,r)=>t[Math.round(Math.random()*t.length)]).join("")},k=async e=>new C(t=>setTimeout(t,e)),q=e=>U(e,Array)?e:[e],z=t=>{try{return[t(),e]}catch(r){return[e,U(r,Error)?r:new Error(E(r))]}},D=(e,t,r)=>`${$(e,0,t)}${$(e,t,r).toUpperCase()}${r?$(e,r):""}`,I=URL,W=e=>U(e,I)?e:new URL(e,globalThis.origin??"http://localhost"),B=(e,t,r)=>{for(let[n,s]of o(e))if((!r||r.includes(n))&&t[n]!==s)return!1;return!0};class F{static map=/* @__PURE__ */new Map;static generate(e,t){const r=F.map.get(e)??/* @__PURE__ */new Set,n=R(t);return r.has(n)?F.generate(e):n}static persistInProto(e,t,r){const n=F.generate(t,r);return e.ondispose(()=>F.map.get(t)?.delete(n)),n}}export{F as UID,u as _Array_from,M as _JSON_parse,E as _JSON_stringify,s as _Object_assign,i as _Object_defineProperty,o as _Object_entries,n as _Object_fromEntries,c as _Object_getOwnPropertyDescriptors,a as _Object_values,C as _Promise,x as _bind,U as _instanceof,e as _null,g as _typeof,t as _undefined,J as debounce,p as forEach,A as is,T as isArray,v as isAsyncFunction,d as isBoolean,B as isEqual,b as isFunction,y as isIncluded,P as isNull,h as isNumber,w as isObject,m as isString,j as isSymbol,O as isUndefined,f as map,R as randomId,k as sleep,$ as slice,S as startsWith,q as toArray,W as toURL,z as trycatch,D as uppercase};
1
+ const e=null,t=void 0,r=Object,n=r.fromEntries,s=r.entries,o=r.assign,a=r.values,i=r.defineProperty,c=r.getOwnPropertyDescriptors,l=Array,u=l.from,f=async(e,t)=>{if(!e)return;let r=0;return O(t)?(async()=>{for(let n of e)await t(n,r,e),r++})():(()=>{for(let n of e)t(n,r,e),r++})()},p=(e,t)=>u(e).map(t),g=(e,...t)=>e.filter(e=>!t.includes(e)),y=(e,t)=>typeof e===t,d=(e,t)=>t.includes(e),m=e=>y(e,"string"),h=e=>y(e,"boolean"),w=e=>y(e,"number"),b=e=>y(e,"object"),j=e=>y(e,"function"),v=e=>y(e,"symbol"),O=e=>A(e,(async()=>0).constructor),P=e=>void 0===e,T=t=>t===e,U=l.isArray,A=(e,...t)=>!!t.find(t=>e instanceof t),E=(t,r)=>A(t,r)?t:e,M=JSON.stringify,S=JSON.parse,$=(e,...t)=>!!t.find(t=>e.startsWith(t)),x=(e,t,r)=>e.slice(t,r),C=(e,t)=>e.bind(t),J=Promise,L=()=>{let e;return(t,r)=>{e&&clearTimeout(e),e=setTimeout(t,r)}},N="abcdefghijklmnopqrstuvwxyz",R=N.toUpperCase(),k=e=>{const t="any"===(e={length:5,lettercase:"any",...e}).lettercase?N+R:"lower"===e.lettercase?N:R;return u({length:e.length},(e,r)=>t[Math.round(Math.random()*t.length)]).join("")},q=async e=>new J(t=>setTimeout(t,e)),z=e=>A(e,Array)?e:[e],D=t=>{try{return[t(),e]}catch(r){return[e,A(r,Error)?r:new Error(M(r))]}},I=(e,t,r)=>`${x(e,0,t)}${x(e,t,r).toUpperCase()}${r?x(e,r):""}`,W=URL,B=e=>A(e,W)?e:new URL(e,globalThis.origin??"http://localhost"),F=(e,t,r)=>{for(let[n,o]of s(e))if((!r||r.includes(n))&&t[n]!==o)return!1;return!0};class G{static map=/* @__PURE__ */new Map;static generate(e,t){const r=G.map.get(e)??/* @__PURE__ */new Set,n=k(t);return r.has(n)?G.generate(e):n}static persistInProto(e,t,r){const n=G.generate(t,r);return e.ondispose(()=>G.map.get(t)?.delete(n)),n}}export{G as UID,u as _Array_from,S as _JSON_parse,M as _JSON_stringify,o as _Object_assign,i as _Object_defineProperty,s as _Object_entries,n as _Object_fromEntries,c as _Object_getOwnPropertyDescriptors,a as _Object_values,J as _Promise,C as _bind,A as _instanceof,e as _null,y as _typeof,t as _undefined,L as debounce,g as filterValue,f as forEach,E as is,U as isArray,O as isAsyncFunction,h as isBoolean,F as isEqual,j as isFunction,d as isIncluded,T as isNull,w as isNumber,b as isObject,m as isString,v as isSymbol,P as isUndefined,p as map,k as randomId,q as sleep,x as slice,$ as startsWith,z as toArray,B as toURL,D as trycatch,I as uppercase};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amateras",
3
- "version": "0.13.1",
3
+ "version": "0.13.3",
4
4
  "description": "Amateras is a JavaScript library for building user interface.",
5
5
  "module": "index.ts",
6
6
  "type": "module",
@@ -17,7 +17,8 @@
17
17
  "unpkg": "./build/import-map.js",
18
18
  "scripts": {
19
19
  "build": "bun ./scripts/build.ts",
20
- "size": "bun ./scripts/vite-bundler-size.ts"
20
+ "size": "bun ./scripts/vite-bundler-size.ts",
21
+ "publish": "bun ./scripts/publish.ts"
21
22
  },
22
23
  "exports": {
23
24
  ".": {
@@ -14,7 +14,10 @@ function createProto(insert: boolean, ...args: any) {
14
14
  }
15
15
  for (let process of $.process.craft) {
16
16
  let result = process(...args);
17
- if (!isUndefined(result)) return result;
17
+ if (!isUndefined(result)) {
18
+ addProtoToParent(result);
19
+ return result;
20
+ }
18
21
  }
19
22
  const [arg1, arg2, arg3] = args;
20
23
 
@@ -1,14 +1,11 @@
1
1
  import { For } from "#structure/For";
2
- import { Proto } from '@amateras/core';
3
2
  import './global';
4
3
 
5
4
  globalThis.For = For;
6
5
 
7
6
  $.process.craft.add((value, list, layout) => {
8
7
  if (value === For) {
9
- let forProto = new For(list, layout);
10
- Proto.proto?.append(forProto);
11
- return forProto;
8
+ return new For(list, layout);
12
9
  }
13
10
  })
14
11
 
@@ -1,6 +1,5 @@
1
1
  import './global';
2
2
  import { If } from "#structure/If";
3
- import { Proto } from "@amateras/core";
4
3
  import { _instanceof, _null, isIncluded } from "@amateras/utils";
5
4
  import { Signal, type SignalObject, type SignalTypes } from '@amateras/signal';
6
5
  import { ElseIf } from '#structure/ElseIf';
@@ -25,11 +24,9 @@ export type IfLayout<T> = (value: T extends SignalTypes<infer V>
25
24
  let condition: Condition | null = null;
26
25
  // add condition statement craft function
27
26
  $.process.craft.add((value, arg1, arg2) => {
28
- let parentProto = Proto.proto;
29
27
  // when value equal If, mean this is a new start of condition statement
30
28
  if (value === If) {
31
29
  condition = new Condition();
32
- parentProto?.append(condition);
33
30
  }
34
31
 
35
32
  // if condition is null, mean this is not a condition statement code
@@ -20,9 +20,7 @@ $.process.craft.add((value, arg1, arg2) => {
20
20
  }
21
21
  }
22
22
  if (value === Match) {
23
- let proto = new Match(arg1, arg2);
24
- Proto.proto?.append(proto);
25
- return proto
23
+ return new Match(arg1, arg2);
26
24
  }
27
25
  if (value === Case) {
28
26
  return is(Proto.proto, Match)?.case(arg1, arg2)
@@ -94,7 +94,6 @@ $.process.craft.add((value) => {
94
94
  let proto = Proto.proto;
95
95
  let router = new value() as RouterProto;
96
96
  proto?.global.router.routers.add(router);
97
- proto?.append(router);
98
97
  return router;
99
98
  }
100
99
  })
@@ -27,6 +27,7 @@ export class Signal<T = any> extends Function {
27
27
  if (!this.map) this.map = {};
28
28
  const signal = this.map[propName] ?? new Signal(value);
29
29
  this.map[propName] = signal;
30
+ this.subscribe(() => signal.set(this.value[propName.slice(0, -1) as keyof T]))
30
31
  return signal;
31
32
  }
32
33
  });
@@ -48,6 +48,8 @@ interface map {
48
48
  }
49
49
  export const map: map = (arr: any, fn: any) => _Array_from(arr).map(fn);
50
50
 
51
+ export const filterValue = <T, V>(arr: Array<T>, ...values: V[]): Array<Exclude<T, V>> => arr.filter(item => !values.includes(item as any)) as any;
52
+
51
53
  // type check
52
54
  export const _typeof = (target: any, type: 'string' | 'number' | 'object' | 'boolean' | 'function' | 'bigint' | 'symbol' | 'undefined') => typeof target === type;
53
55
  export const isIncluded = <T, V>(target: T, args: V[]): target is V & T => args.includes(target as any);