From 836c4bcea82c539b18ce4ad48118bab2ec2b9984 Mon Sep 17 00:00:00 2001 From: Seth Trowbridge Date: Sun, 3 Aug 2025 22:03:10 -0400 Subject: [PATCH] improved typing --- deno.lock | 4 +- dist/bundle_entry.js | 3 + dist/core.d.ts | 103 ---------------------------- dist/core.js | 3 - dist/hmr-NY37ZYM7.js | 1 + scripts/assemble_files.ts | 3 +- scripts/bundle_entry.ts | 27 ++++++-- scripts/bundle_subprocess.ts | 8 ++- src/boot.js | 13 ---- src/hmr.js | 129 +++++++++++++++++------------------ types.d.ts | 45 ++++++++++++ 11 files changed, 147 insertions(+), 192 deletions(-) create mode 100644 dist/bundle_entry.js delete mode 100644 dist/core.d.ts delete mode 100644 dist/core.js create mode 100644 dist/hmr-NY37ZYM7.js delete mode 100644 src/boot.js create mode 100644 types.d.ts diff --git a/deno.lock b/deno.lock index 15e2ab1..9b82683 100644 --- a/deno.lock +++ b/deno.lock @@ -104,6 +104,8 @@ "https://deno.land/std@0.224.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", "https://deno.land/std@0.224.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972", "https://deno.land/std@0.224.0/path/windows/to_file_url.ts": "40e560ee4854fe5a3d4d12976cef2f4e8914125c81b11f1108e127934ced502e", - "https://deno.land/std@0.224.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c" + "https://deno.land/std@0.224.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", + "https://vanjs.org/code/van-1.5.5.nomodule.min.js": "32403d4dd6203a46513f000fd64b18e4eaef0823bf757ca0092e70130d059aa3", + "https://vanjs.org/code/van-x-0.6.3.nomodule.min.js": "e4b7de89bf2f84c22669ce7bcef592fb398d9dcf8b8a36f4562b8ac6354b1f2f" } } diff --git a/dist/bundle_entry.js b/dist/bundle_entry.js new file mode 100644 index 0000000..f88e866 --- /dev/null +++ b/dist/bundle_entry.js @@ -0,0 +1,3 @@ +var pe=Object.defineProperty;var _e=(e,t)=>{for(var r in t)pe(e,r,{get:t[r],enumerable:!0})};var p=Object.getPrototypeOf,A,M,S,b,Q={isConnected:1},me=1e3,O,we={},Se=p(Q),U=p(p),_,Z=(e,t,r,l)=>(e??(setTimeout(r,l),new Set)).add(t),q=(e,t,r)=>{let l=S;S=t;try{return e(r)}catch(n){return console.error(n),r}finally{S=l}},D=e=>e.filter(t=>t._dom?.isConnected),Y=e=>O=Z(O,e,()=>{for(let t of O)t._bindings=D(t._bindings),t._listeners=D(t._listeners);O=_},me),$={get val(){return S?._getters?.add(this),this.rawVal},get oldVal(){return S?._getters?.add(this),this._oldVal},set val(e){S?._setters?.add(this),e!==this.rawVal&&(this.rawVal=e,this._bindings.length+this._listeners.length?(M?.add(this),A=Z(A,this,ve)):this._oldVal=e)}},j=e=>({__proto__:$,rawVal:e,_oldVal:e,_bindings:[],_listeners:[]}),V=(e,t)=>{let r={_getters:new Set,_setters:new Set},l={f:e},n=b;b=[];let a=q(e,r,t);a=(a??document).nodeType?a:new Text(a);for(let o of r._getters)r._setters.has(o)||(Y(o),o._bindings.push(l));for(let o of b)o._dom=a;return b=n,l._dom=a},k=(e,t=j(),r)=>{let l={_getters:new Set,_setters:new Set},n={f:e,s:t};n._dom=r??b?.push(n)??Q,t.val=q(e,l,t.rawVal);for(let a of l._getters)l._setters.has(a)||(Y(a),a._listeners.push(n));return t},ee=(e,...t)=>{for(let r of t.flat(1/0)){let l=p(r??0),n=l===$?V(()=>r.val):l===U?V(r):r;n!=_&&e.append(n)}return e},te=(e,t,...r)=>{let[{is:l,...n},...a]=p(r[0]??0)===Se?r:[{},...r],o=e?document.createElementNS(e,t,{is:l}):document.createElement(t,{is:l});for(let[d,h]of Object.entries(n)){let y=u=>u?Object.getOwnPropertyDescriptor(u,d)??y(p(u)):_,T=t+","+d,c=we[T]??=y(p(o))?.set??0,i=d.startsWith("on")?(u,g)=>{let f=d.slice(2);o.removeEventListener(f,g),o.addEventListener(f,u)}:c?c.bind(o):o.setAttribute.bind(o,d),s=p(h??0);d.startsWith("on")||s===U&&(h=k(h),s=$),s===$?V(()=>(i(h.val,h._oldVal),o)):i(h)}return ee(o,a)},z=e=>({get:(t,r)=>te.bind(_,e,r)}),re=(e,t)=>t?t!==e&&e.replaceWith(t):e.remove(),ve=()=>{let e=0,t=[...A].filter(l=>l.rawVal!==l._oldVal);do{M=new Set;for(let l of new Set(t.flatMap(n=>n._listeners=D(n._listeners))))k(l.f,l.s,l._dom),l._dom=_}while(++e<100&&(t=[...M]).length);let r=[...A].filter(l=>l.rawVal!==l._oldVal);A=_;for(let l of new Set(r.flatMap(n=>n._bindings=D(n._bindings))))re(l._dom,V(l.f,l._dom)),l._dom=_;for(let l of r)l._oldVal=l.rawVal},x={tags:new Proxy(e=>new Proxy(te,z(e)),z()),hydrate:(e,t)=>re(e,V(t,e)),add:ee,state:j,derive:k};var H={};_e(H,{calc:()=>De,compact:()=>B,list:()=>Fe,noreactive:()=>xe,raw:()=>ce,reactive:()=>E,replace:()=>ge,stateFields:()=>Ke});var{fromEntries:ne,entries:P,keys:L,hasOwn:X,getPrototypeOf:I,create:be,assign:Ae}=Object,{get:oe,set:le,deleteProperty:Ve,ownKeys:Ce}=Reflect,{state:N,derive:Pe,add:Te}=x,K,Oe=1e3,J,W,w=Symbol(),ae=Symbol(),G=Symbol(),m=Symbol(),C=Symbol(),ie=Symbol(),De=e=>(e[ae]=1,e),v=e=>e instanceof Object&&!(e instanceof Function)&&!e[ie],se=e=>{if(e?.[ae]){let t=N();return Pe(()=>{let r=e();v(t.rawVal)&&v(r)?ge(t.rawVal,r):t.val=E(r)}),t}else return N(E(e))},$e=e=>{let t=Array.isArray(e)?[]:{__proto__:I(e)};for(let[r,l]of P(e))t[r]=se(l);return t[G]=[],t[m]=N(1),t},de={get:(e,t,r)=>t===w?e:X(e,t)?Array.isArray(e)&&t==="length"?(e[m].val,e.length):e[t].val:oe(e,t,r),set:(e,t,r,l)=>X(e,t)?Array.isArray(e)&&t==="length"?(r!==e.length&&++e[m].val,e.length=r,1):(e[t].val=E(r),1):t in e?le(e,t,r,l):le(e,t,se(r))&&(++e[m].val,F(e).forEach(fe.bind(J,l,t,e[t],W)),1),deleteProperty:(e,t)=>(Ve(e,t)&&Ee(e,t),++e[m].val),ownKeys:e=>(e[m].val,Ce(e))},E=e=>!v(e)||e[w]?e:new Proxy($e(e),de),xe=e=>(e[ie]=1,e),Ke=e=>e[w],Ne=I(N()),Ge=e=>new Proxy(e,{get:(t,r,l)=>I(t[r]??0)===Ne?{val:ce(t[r].rawVal)}:oe(t,r,l)}),ce=e=>e?.[w]?new Proxy(Ge(e[w]),de):e,F=e=>e[G]=e[G].filter(t=>t._containerDom.isConnected),fe=(e,t,r,l,{_containerDom:n,f:a})=>{let o=Array.isArray(e),d=o?Number(t):t;Te(n,()=>n[C][t]=a(r,()=>delete e[t],d)),o&&!l&&d!==e.length-1&&n.insertBefore(n.lastChild,n[C][L(e).find(h=>Number(h)>d)])},Ee=(e,t)=>{for(let r of F(e)){let l=r._containerDom[C];l[t]?.remove(),delete l[t]}},Ie=e=>(K??(K=(setTimeout(()=>(K.forEach(F),K=J),Oe),new Set))).add(e),Fe=(e,t,r)=>{let l={_containerDom:e instanceof Function?e():e,f:r},n=t[w];l._containerDom[C]={},n[G].push(l),Ie(n);for(let[a,o]of P(n))fe(t,a,o,1,l);return l._containerDom},he=(e,t)=>{for(let[n,a]of P(t)){let o=e[n];v(o)&&v(a)?he(o,a):e[n]=a}for(let n in e)X(t,n)||delete e[n];let r=L(t),l=Array.isArray(e);if(l||L(e).some((n,a)=>n!==r[a])){let n=e[w];if(l)e.length=t.length;else{++n[m].val;let a={...n};for(let o of r)delete n[o];for(let o of r)n[o]=a[o]}for(let{_containerDom:a}of F(n)){let{firstChild:o,[C]:d}=a;for(let h of r)o===d[h]?o=o.nextSibling:a.insertBefore(d[h],o)}}return e},ge=(e,t)=>{W=1;try{return he(e,t instanceof Function?Array.isArray(e)?t(e.filter(r=>1)):ne(t(P(e))):t)}finally{W=J}},B=e=>Array.isArray(e)?e.filter(t=>1).map(B):v(e)?Ae(be(I(e)),ne(P(e).map(([t,r])=>[t,B(r)]))):e;var ye=(e,t="")=>{let r="@",l=":",n=".",a="^",o=(c,i,s)=>{let u=Object.keys(i).map(g=>{let f=i[g];switch(g[0]){case r:return o(`@media(max-width:${g.substring(r.length)})`,f,s);case l:return o(`&${g}`,f,s);case n:return o(`${g}${s}`,f,s);case a:return o(`&:hover .${g.substring(a.length)}${s}`,f,s)}return`${g.replace(/([a-z])([A-Z])/g,"$1-$2")}: ${f};`});return`${c}{${u.join(` +`)}}`},d=(c,i)=>{let s=i.lastIndexOf(c)+c.length;return s?i.substring(s):i},h=c=>{let i=van.tags[c],s=[],u=new Proxy((...g)=>{let f=i(...g);return f.className=s.join(y+" ")+y+" "+f.className,s=[],f},{get(g,f){return s.push(f.substring(f.lastIndexOf(".")+1)),u}});return u},y=t?"_"+t:"",T=Object.keys(e).map(c=>o("."+c+y,e[c],y)).join(` +`);return globalThis.document?.head.insertAdjacentHTML("beforeend",``),{Tag(...c){return c.map(i=>d(a,d(n,i))).join(y+" ")+y},CSS:T,DOM:new Proxy({},{get(c,i){return h(i)}}),Div:new Proxy({},{get(c,i){return h("div")[i]}})}};globalThis.van=x;globalThis.vanX=H;globalThis.Gale=ye;var R=new URL(import.meta.url).searchParams;vanX.Store=(e,t)=>{let r=localStorage.getItem(t),l=vanX.reactive(r?JSON.parse(r):e);return van.derive(()=>localStorage.setItem(t,JSON.stringify(vanX.compact(l)))),l};R.has("hmr")&&await import("./hmr-NY37ZYM7.js");var ue=R.get("root")||"/";fetch(ue+"deno.json").then(e=>e.json()).then(e=>{let t=(l,n)=>{let a=document.createElement("script");return a.type=l,a.textContent=n,document.head.appendChild(a),a},r=e.imports;for(let l in r){let n=r[l];n.startsWith("./")&&(r[l]=ue+n.substring(2))}R.has("map")&&t("importmap",JSON.stringify({imports:r})),t("module").src=r.entry}); diff --git a/dist/core.d.ts b/dist/core.d.ts deleted file mode 100644 index ddadce9..0000000 --- a/dist/core.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -export {} -declare global -{ - namespace Van { - - interface State { - val: T - readonly oldVal: T - readonly rawVal: T - } - - // Defining readonly view of State for covariance. - // Basically we want StateView to implement StateView - type StateView = Readonly> - - type Val = State | T - - type Primitive = string | number | boolean | bigint - - // deno-lint-ignore no-explicit-any - type PropValue = Primitive | ((e: any) => void) | null - - type PropValueOrDerived = PropValue | StateView | (() => PropValue) - - type Props = Record & { class?: PropValueOrDerived; is?: string } - - type PropsWithKnownKeys = Partial<{[K in keyof ElementType]: PropValueOrDerived}> - - type ValidChildDomValue = Primitive | Node | null | undefined - - type BindingFunc = ((dom?: Node) => ValidChildDomValue) | ((dom?: Element) => Element) - - type ChildDom = ValidChildDomValue | StateView | BindingFunc | readonly ChildDom[] - - type TagFunc = (first?: Props & PropsWithKnownKeys | ChildDom, ...rest: readonly ChildDom[]) => Result - - type Tags = Readonly>> & { - [K in keyof HTMLElementTagNameMap]: TagFunc - } - } - const van:{ - readonly state: (initVal: T, HMRKey?:string)=> Van.State - readonly derive: (f: () => T) => Van.State - readonly add: (dom: Element, ...children: readonly Van.ChildDom[]) => Element - readonly tags: Van.Tags & ((namespaceURI: string) => Readonly>>) - readonly hydrate: (dom: T, f: (dom: T) => T | null | undefined) => T - }; - - - namespace VanX - { - type StateOf = { readonly [K in keyof T]: Van.State } - type ValueType = T extends (infer V)[] ? V : T[keyof T] - type KeyType = T extends unknown[] ? number : string - type ReplacementFunc = - T extends (infer V)[] ? (items: V[]) => readonly V[] : - (items: [string, T[keyof T]][]) => readonly [string, T[keyof T]][] - } - const vanX:{ - readonly calc: (f: () => R) => R - readonly reactive: (obj: T, HMRKey?:string) => T - readonly noreactive: (obj: T) => T - readonly stateFields: (obj: T) => VanX.StateOf - readonly raw: (obj: T) => T - readonly list: ( - container: (() => ElementType) | ElementType, - items: T,itemFunc: (v: Van.State>, deleter: () => void, k: VanX.KeyType) => Node - ) => ElementType - readonly replace: (obj: T, replacement: VanX.ReplacementFunc | T) => T - readonly compact: (obj: T) => T - // my addition - readonly Store: (obj:T, key:string)=>T - }; - - namespace Gale { - type KeyQuery = "@"; - type KeyState = ":"; - type KeyChild = "."; - type KeyGroup = "^"; - type UserStyles = Partial & {[key: `${KeyQuery|KeyState|KeyChild|KeyGroup}${string}`]: UserStyles } - type UserSheet = Record - type CollectKeys = {[Key in keyof Obj]: Obj[Key] extends object ? Key | CollectKeys : Key }[keyof Obj] - type FilterKeys = Keys extends `${KeyChild|KeyGroup}${infer Rest}` ? Keys : never - type CrossMultiply = A extends string ? B extends string ? `${A}${B}` : never : never - type CrossMultiplyRecord = keyof Rec | { [K in keyof Rec]: K extends string ? CrossMultiply>> : never }[keyof Rec] - type Tier = (selector:string, obj:UserStyles, suffix:string)=>string; - type CreateSheet = (sheet:UserSheet&T, hash?:string)=>{ - Tag:(...args:CrossMultiplyRecord[])=>string, - CSS:string, - DOM:Elemental>, - Div:Circular, Van.TagFunc> - } - - - type Elemental = {[K in keyof HTMLElementTagNameMap]: Van.TagFunc&Circular>} - - type Circular = { - [K in Keys]: Circular&Func - }; - - } - const Gale:Gale.CreateSheet -} \ No newline at end of file diff --git a/dist/core.js b/dist/core.js deleted file mode 100644 index 52127cf..0000000 --- a/dist/core.js +++ /dev/null @@ -1,3 +0,0 @@ -var we=Object.defineProperty;var be=(e,t)=>{for(var r in t)we(e,r,{get:t[r],enumerable:!0})};var _=Object.getPrototypeOf,A,F,w,T,q={isConnected:1},Te=1e3,D,Ae={},Ve=_(q),U=_(_),S,Y=(e,t,r,l)=>(e??(setTimeout(r,l),new Set)).add(t),j=(e,t,r)=>{let l=w;w=t;try{return e(r)}catch(n){return console.error(n),r}finally{w=l}},P=e=>e.filter(t=>t._dom?.isConnected),ee=e=>D=Y(D,e,()=>{for(let t of D)t._bindings=P(t._bindings),t._listeners=P(t._listeners);D=S},Te),I={get val(){return w?._getters?.add(this),this.rawVal},get oldVal(){return w?._getters?.add(this),this._oldVal},set val(e){w?._setters?.add(this),e!==this.rawVal&&(this.rawVal=e,this._bindings.length+this._listeners.length?(F?.add(this),A=Y(A,this,Oe)):this._oldVal=e)}},te=e=>({__proto__:I,rawVal:e,_oldVal:e,_bindings:[],_listeners:[]}),V=(e,t)=>{let r={_getters:new Set,_setters:new Set},l={f:e},n=T;T=[];let a=j(e,r,t);a=(a??document).nodeType?a:new Text(a);for(let o of r._getters)r._setters.has(o)||(ee(o),o._bindings.push(l));for(let o of T)o._dom=a;return T=n,l._dom=a},J=(e,t=te(),r)=>{let l={_getters:new Set,_setters:new Set},n={f:e,s:t};n._dom=r??T?.push(n)??q,t.val=j(e,l,t.rawVal);for(let a of l._getters)l._setters.has(a)||(ee(a),a._listeners.push(n));return t},re=(e,...t)=>{for(let r of t.flat(1/0)){let l=_(r??0),n=l===I?V(()=>r.val):l===U?V(r):r;n!=S&&e.append(n)}return e},le=(e,t,...r)=>{let[{is:l,...n},...a]=_(r[0]??0)===Ve?r:[{},...r],o=e?document.createElementNS(e,t,{is:l}):document.createElement(t,{is:l});for(let[i,s]of Object.entries(n)){let u=y=>y?Object.getOwnPropertyDescriptor(y,i)??u(_(y)):S,p=t+","+i,f=Ae[p]??=u(_(o))?.set??0,d=i.startsWith("on")?(y,h)=>{let g=i.slice(2);o.removeEventListener(g,h),o.addEventListener(g,y)}:f?f.bind(o):o.setAttribute.bind(o,i),c=_(s??0);i.startsWith("on")||c===U&&(s=J(s),c=I),c===I?V(()=>(d(s.val,s._oldVal),o)):d(s)}return re(o,a)},Z=e=>({get:(t,r)=>le.bind(S,e,r)}),ne=(e,t)=>t?t!==e&&e.replaceWith(t):e.remove(),Oe=()=>{let e=0,t=[...A].filter(l=>l.rawVal!==l._oldVal);do{F=new Set;for(let l of new Set(t.flatMap(n=>n._listeners=P(n._listeners))))J(l.f,l.s,l._dom),l._dom=S}while(++e<100&&(t=[...F]).length);let r=[...A].filter(l=>l.rawVal!==l._oldVal);A=S;for(let l of new Set(r.flatMap(n=>n._bindings=P(n._bindings))))ne(l._dom,V(l.f,l._dom)),l._dom=S;for(let l of r)l._oldVal=l.rawVal},x={tags:new Proxy(e=>new Proxy(le,Z(e)),Z()),hydrate:(e,t)=>ne(e,V(t,e)),add:re,state:te,derive:J};var R={};be(R,{calc:()=>Ke,compact:()=>W,list:()=>Xe,noreactive:()=>Ee,raw:()=>ge,reactive:()=>k,replace:()=>pe,stateFields:()=>Ge});var{fromEntries:ae,entries:C,keys:L,hasOwn:X,getPrototypeOf:E,create:Ce,assign:De}=Object,{get:ie,set:oe,deleteProperty:Pe,ownKeys:Ie}=Reflect,{state:$,derive:xe,add:Ne}=x,N,$e=1e3,H,B,v=Symbol(),se=Symbol(),K=Symbol(),m=Symbol(),O=Symbol(),de=Symbol(),Ke=e=>(e[se]=1,e),b=e=>e instanceof Object&&!(e instanceof Function)&&!e[de],ce=e=>{if(e?.[se]){let t=$();return xe(()=>{let r=e();b(t.rawVal)&&b(r)?pe(t.rawVal,r):t.val=k(r)}),t}else return $(k(e))},ke=e=>{let t=Array.isArray(e)?[]:{__proto__:E(e)};for(let[r,l]of C(e))t[r]=ce(l);return t[K]=[],t[m]=$(1),t},fe={get:(e,t,r)=>t===v?e:X(e,t)?Array.isArray(e)&&t==="length"?(e[m].val,e.length):e[t].val:ie(e,t,r),set:(e,t,r,l)=>X(e,t)?Array.isArray(e)&&t==="length"?(r!==e.length&&++e[m].val,e.length=r,1):(e[t].val=k(r),1):t in e?oe(e,t,r,l):oe(e,t,ce(r))&&(++e[m].val,G(e).forEach(ue.bind(H,l,t,e[t],B)),1),deleteProperty:(e,t)=>(Pe(e,t)&&Je(e,t),++e[m].val),ownKeys:e=>(e[m].val,Ie(e))},k=e=>!b(e)||e[v]?e:new Proxy(ke(e),fe),Ee=e=>(e[de]=1,e),Ge=e=>e[v],Me=E($()),Fe=e=>new Proxy(e,{get:(t,r,l)=>E(t[r]??0)===Me?{val:ge(t[r].rawVal)}:ie(t,r,l)}),ge=e=>e?.[v]?new Proxy(Fe(e[v]),fe):e,G=e=>e[K]=e[K].filter(t=>t._containerDom.isConnected),ue=(e,t,r,l,{_containerDom:n,f:a})=>{let o=Array.isArray(e),i=o?Number(t):t;Ne(n,()=>n[O][t]=a(r,()=>delete e[t],i)),o&&!l&&i!==e.length-1&&n.insertBefore(n.lastChild,n[O][L(e).find(s=>Number(s)>i)])},Je=(e,t)=>{for(let r of G(e)){let l=r._containerDom[O];l[t]?.remove(),delete l[t]}},Le=e=>(N??(N=(setTimeout(()=>(N.forEach(G),N=H),$e),new Set))).add(e),Xe=(e,t,r)=>{let l={_containerDom:e instanceof Function?e():e,f:r},n=t[v];l._containerDom[O]={},n[K].push(l),Le(n);for(let[a,o]of C(n))ue(t,a,o,1,l);return l._containerDom},he=(e,t)=>{for(let[n,a]of C(t)){let o=e[n];b(o)&&b(a)?he(o,a):e[n]=a}for(let n in e)X(t,n)||delete e[n];let r=L(t),l=Array.isArray(e);if(l||L(e).some((n,a)=>n!==r[a])){let n=e[v];if(l)e.length=t.length;else{++n[m].val;let a={...n};for(let o of r)delete n[o];for(let o of r)n[o]=a[o]}for(let{_containerDom:a}of G(n)){let{firstChild:o,[O]:i}=a;for(let s of r)o===i[s]?o=o.nextSibling:a.insertBefore(i[s],o)}}return e},pe=(e,t)=>{B=1;try{return he(e,t instanceof Function?Array.isArray(e)?t(e.filter(r=>1)):ae(t(C(e))):t)}finally{B=H}},W=e=>Array.isArray(e)?e.filter(t=>1).map(W):b(e)?De(Ce(E(e)),ae(C(e).map(([t,r])=>[t,W(r)]))):e;var ye=(e,t="")=>{let r="@",l=":",n=".",a="^",o=(f,d,c)=>{let y=Object.keys(d).map(h=>{let g=d[h];switch(h[0]){case r:return o(`@media(max-width:${h.substring(r.length)})`,g,c);case l:return o(`&${h}`,g,c);case n:return o(`${h}${c}`,g,c);case a:return o(`&:hover .${h.substring(a.length)}${c}`,g,c)}return`${h.replace(/([a-z])([A-Z])/g,"$1-$2")}: ${g};`});return`${f}{${y.join(` -`)}}`},i=(f,d)=>{let c=d.lastIndexOf(f)+f.length;return c?d.substring(c):d},s=f=>{let d=van.tags[f],c=[],y=new Proxy((...h)=>{let g=d(...h);return g.className=c.join(u+" ")+u+" "+g.className,c=[],g},{get(h,g){return c.push(g.substring(g.lastIndexOf(".")+1)),y}});return y},u=t?"_"+t:"",p=Object.keys(e).map(f=>o("."+f+u,e[f],u)).join(` -`);return globalThis.document?.head.insertAdjacentHTML("beforeend",``),{Tag(...f){return f.map(d=>i(a,i(n,d))).join(u+" ")+u},CSS:p,DOM:new Proxy({},{get(f,d){return s(d)}}),Div:new Proxy({},{get(f,d){return s("div")[d]}})}};var z=0,M={};function Be(){for(let e in M)sessionStorage.setItem(e,M[e]);M={},z=0}function We(e,t){M[e]=t,z||(z=setTimeout(Be,500)),console.log("SAVE",e,t)}function He(e){let t=sessionStorage.getItem(e);return console.log("LOAD",e,t),t}var Q,Se=0;function _e(e){Se=0,Q=e}function Re(){return Q?Q+"_"+Se+++"_":""}var me=()=>{let e=globalThis.van.state;globalThis.van.state=(r,l="")=>{let n=typeof r,a=p=>p,o=p=>p?.toString()||null;switch(n){case"boolean":a=p=>p==="true";break;case"number":a=parseFloat;break;case"object":a=JSON.parse,o=JSON.stringify;break}let i="HMR_"+Re()+l,s=He(i),u=e(s?a(s):r);return van.derive(()=>We(i,o(u.val))),u};let t=globalThis.vanX.reactive;globalThis.vanX.reactive=(r,l)=>{_e(l);let n=t(r);return _e(),n},new WebSocket("ws://"+window.location.host+"/ws").addEventListener("message",r=>r.data==="reload"&&window.location.reload()),vanX.Store=(r,l)=>{let n=JSON.stringify(r),a=localStorage.getItem(l+"check");localStorage.setItem(l+"check",n);let o;if(n==a){let s=localStorage.getItem(l);try{o=JSON.parse(s)||r}catch{o=r}}else o=r;let i=vanX.reactive(o);return van.derive(()=>localStorage.setItem(l,JSON.stringify(vanX.compact(i)))),i}};var ve=(e="/")=>fetch(e+"deno.json").then(t=>t.json()).then(t=>{let r=(n,a)=>{let o=document.createElement("script");o.type=n,o.textContent=a,document.head.appendChild(o)},l=t.imports;for(let n in l){let a=l[n];a.startsWith("./")&&(l[n]=e+a.substring(2))}r("importmap",JSON.stringify({imports:l})),r("module",'import "entry"; ')});globalThis.van=x;globalThis.vanX=R;globalThis.Gale=ye;me();ve(); diff --git a/dist/hmr-NY37ZYM7.js b/dist/hmr-NY37ZYM7.js new file mode 100644 index 0000000..972dda6 --- /dev/null +++ b/dist/hmr-NY37ZYM7.js @@ -0,0 +1 @@ +var g=0,c={};function d(){for(let e in c)sessionStorage.setItem(e,c[e]);c={},g=0}function f(e,t){c[e]=t,g||(g=setTimeout(d,500)),console.log("SAVE",e,t)}function m(e){let t=sessionStorage.getItem(e);return console.log("LOAD",e,t),t}var S,u=0;function v(e){u=0,S=e}function h(){return S?S+"_"+u+++"_":""}var I=globalThis.van.state;globalThis.van.state=(e,t="")=>{let n=typeof e,o=l=>l,a=l=>l?.toString()||null;switch(n){case"boolean":o=l=>l==="true";break;case"number":o=parseFloat;break;case"object":o=JSON.parse,a=JSON.stringify;break}let r="HMR_"+h()+t,s=m(r),i=I(s?o(s):e);return van.derive(()=>f(r,a(i.val))),i};var w=globalThis.vanX.reactive;globalThis.vanX.reactive=(e,t)=>{v(t);let n=w(e);return v(),n};new WebSocket("ws://"+window.location.host+"/ws").addEventListener("message",e=>e.data==="reload"&&window.location.reload());vanX.Store=(e,t)=>{let n=JSON.stringify(e),o=localStorage.getItem(t+"check");localStorage.setItem(t+"check",n);let a;if(n==o){let s=localStorage.getItem(t);try{a=JSON.parse(s)||e}catch{a=e}}else a=e;let r=vanX.reactive(a);return van.derive(()=>localStorage.setItem(t,JSON.stringify(vanX.compact(r)))),r}; diff --git a/scripts/assemble_files.ts b/scripts/assemble_files.ts index 97e93f6..9cade63 100644 --- a/scripts/assemble_files.ts +++ b/scripts/assemble_files.ts @@ -1,6 +1,5 @@ -const bundle = await fetch(import.meta.resolve("../dist/core.js")).then(r=>r.text()); const index = await fetch(import.meta.resolve("../dist/index.html")).then(r=>r.text()); -export const HTML = index.replace(``, ``); +export const HTML = index.replace(``, ``); export const Root = import.meta.resolve("../"); export const Load =async(file:string)=> await fetch(Root + file).then(resp=>resp.text()); export const Save =async(text:string, name:string)=> await Deno.writeTextFile(name, text); \ No newline at end of file diff --git a/scripts/bundle_entry.ts b/scripts/bundle_entry.ts index d2ecbb2..5f5c4a7 100644 --- a/scripts/bundle_entry.ts +++ b/scripts/bundle_entry.ts @@ -7,8 +7,27 @@ globalThis.vanX = VanX; import Gale from "../src/gale.js"; globalThis.Gale = Gale; -import BindHMR from "../src/hmr.js"; -BindHMR(); +const args = new URL(import.meta.url).searchParams; -import Boot from "../src/boot.js"; -Boot(); \ No newline at end of file +//Store +vanX.Store=(e,t)=>{const a=localStorage.getItem(t),r=vanX.reactive(a?JSON.parse(a):e);return van.derive((()=>localStorage.setItem(t,JSON.stringify(vanX.compact(r))))),r}; + +if(args.has("hmr")) +{ + await import("../src/hmr.js"); +} + +const root = args.get("root")||"/"; +fetch(root+"deno.json") +.then(text=>text.json()) +.then(json=>{ + const Script=(t,e)=>{let n=document.createElement("script"); n.type=t; n.textContent=e; document.head.appendChild(n); return n;}; + const imports = json.imports; + for(let n in imports) + { + const path=imports[n]; + path.startsWith("./")&&(imports[n]=root+path.substring(2)) + } + args.has("map") && Script("importmap",JSON.stringify({imports})); + Script("module").src=imports.entry; +}); \ No newline at end of file diff --git a/scripts/bundle_subprocess.ts b/scripts/bundle_subprocess.ts index 2baf808..a49177e 100644 --- a/scripts/bundle_subprocess.ts +++ b/scripts/bundle_subprocess.ts @@ -5,8 +5,14 @@ const command = new Deno.Command("deno", { "--platform=browser", "--inline-imports=true", "--output=dist/core.js", + "--outdir=dist", "--minify", + "--code-splitting", "scripts/bundle_entry.ts" ] }); -command.outputSync(); \ No newline at end of file +const result = command.outputSync(); + +const textDecoder = new TextDecoder(); +console.log("stdout:", textDecoder.decode(result.stdout)); +console.log("stderr:", textDecoder.decode(result.stderr)); \ No newline at end of file diff --git a/src/boot.js b/src/boot.js deleted file mode 100644 index b0b0318..0000000 --- a/src/boot.js +++ /dev/null @@ -1,13 +0,0 @@ -export default (root="/")=>fetch(root+"deno.json") -.then(text=>text.json()) -.then(json=>{ - const n=(t,e)=>{let n=document.createElement("script");n.type=t,n.textContent=e,document.head.appendChild(n)}; - const imports = json.imports; - for(let n in imports) - { - const path=imports[n]; - path.startsWith("./")&&(imports[n]=root+path.substring(2)) - } - n("importmap",JSON.stringify({imports})), - n("module",'import "entry"; ') -}) \ No newline at end of file diff --git a/src/hmr.js b/src/hmr.js index 3e3cf34..2402368 100644 --- a/src/hmr.js +++ b/src/hmr.js @@ -47,75 +47,74 @@ function NextID() return _ID ? _ID + "_" + (_index++) + "_" : ""; } -export default()=>{ - //bind Van - const origninalState = globalThis.van.state; - globalThis.van.state =(value, key="")=> + +//bind Van +const origninalState = globalThis.van.state; +globalThis.van.state =(value, key="")=> +{ + const type = typeof value; + let reader =d=>d; + let writer =d=>d?.toString() || null; + + switch(type) { - const type = typeof value; - let reader =d=>d; - let writer =d=>d?.toString() || null; - - switch(type) - { - case "boolean" : - reader =(data)=> data === "true"; break; - case "number" : - reader = parseFloat; break; - case "object" : - reader = JSON.parse; - writer = JSON.stringify; - break; - } - - const fullKey = "HMR_" + NextID() + key; - const stringValue = Load(fullKey); - const signal = origninalState((stringValue ? reader(stringValue) : value)); - van.derive(()=>Save(fullKey, writer(signal.val))); - - return signal; - }; - - //bind VanX - const originalReactive = globalThis.vanX.reactive; - globalThis.vanX.reactive =(obj, id)=> - { - StartID(id); - const state = originalReactive(obj); - StartID(); - return state; + case "boolean" : + reader =(data)=> data === "true"; break; + case "number" : + reader = parseFloat; break; + case "object" : + reader = JSON.parse; + writer = JSON.stringify; + break; } - // added in devmode to index.html - new WebSocket('ws://'+window.location.host+'/ws').addEventListener('message',e=>e.data==='reload'&&window.location.reload()); + const fullKey = "HMR_" + NextID() + key; + const stringValue = Load(fullKey); + const signal = origninalState((stringValue ? reader(stringValue) : value)); + van.derive(()=>Save(fullKey, writer(signal.val))); - vanX.Store =(obj, key)=> + return signal; +}; + +//bind VanX +const originalReactive = globalThis.vanX.reactive; +globalThis.vanX.reactive =(obj, id)=> +{ + StartID(id); + const state = originalReactive(obj); + StartID(); + return state; +} + +// added in devmode to index.html +new WebSocket('ws://'+window.location.host+'/ws').addEventListener('message',e=>e.data==='reload'&&window.location.reload()); + +vanX.Store =(obj, key)=> +{ + let checkInit = JSON.stringify(obj); + let checkStore = localStorage.getItem(key+"check"); + localStorage.setItem(key+"check", checkInit); + + let recallJSON; + if(checkInit == checkStore) + { + let recallText = localStorage.getItem(key); + try + { + recallJSON = JSON.parse(recallText) || obj; + } + catch(e) + { + recallJSON = obj; + } + } + else { - let checkInit = JSON.stringify(obj); - let checkStore = localStorage.getItem(key+"check"); - localStorage.setItem(key+"check", checkInit); - let recallJSON; - if(checkInit == checkStore) - { - let recallText = localStorage.getItem(key); - try - { - recallJSON = JSON.parse(recallText) || obj; - } - catch(e) - { - recallJSON = obj; - } - } - else - { - - recallJSON = obj; - } + recallJSON = obj; + } - const store = vanX.reactive( recallJSON ); - van.derive(() => localStorage.setItem(key, JSON.stringify(vanX.compact(store)))); - return store; - } -} \ No newline at end of file + const store = vanX.reactive( recallJSON ); + van.derive(() => localStorage.setItem(key, JSON.stringify(vanX.compact(store)))); + return store; +} diff --git a/types.d.ts b/types.d.ts new file mode 100644 index 0000000..30164f1 --- /dev/null +++ b/types.d.ts @@ -0,0 +1,45 @@ +import type * as VAN from "https://vanjs.org/code/van-1.5.5.d.ts"; +import type * as VANX from "https://vanjs.org/code/van-x-0.6.3.d.ts"; +type Replace = Omit & { readonly [P in K]: R }; +declare module "vanjs-core" { export type State = VAN.State } +declare global +{ + namespace Van { export type * from "https://vanjs.org/code/van-1.5.5.d.ts"; } + namespace VanX { export type * from "https://vanjs.org/code/van-x-0.6.3.d.ts"; } + const van: Replace(arg:T, HMRKey?:string)=>VAN.State> + const vanX: Replace(obj: T, HMRKey?:string) => T> & {Store:(obj:T, key:string)=>T} +} + +declare global { + + namespace Gale { + type KeyQuery = "@"; + type KeyState = ":"; + type KeyChild = "."; + type KeyGroup = "^"; + type UserStyles = Partial & {[key: `${KeyQuery|KeyState|KeyChild|KeyGroup}${string}`]: UserStyles } + type UserSheet = Record + type CollectKeys = {[Key in keyof Obj]: Obj[Key] extends object ? Key | CollectKeys : Key }[keyof Obj] + type FilterKeys = Keys extends `${KeyChild|KeyGroup}${infer Rest}` ? Keys : never + type CrossMultiply = A extends string ? B extends string ? `${A}${B}` : never : never + type CrossMultiplyRecord = keyof Rec | { [K in keyof Rec]: K extends string ? CrossMultiply>> : never }[keyof Rec] + type Tier = (selector:string, obj:UserStyles, suffix:string)=>string; + type CreateSheet = (sheet:UserSheet&T, hash?:string)=>{ + Tag:(...args:CrossMultiplyRecord[])=>string, + CSS:string, + DOM:Elemental>, + Div:Circular, Van.TagFunc> + } + + + type Elemental = {[K in keyof HTMLElementTagNameMap]: Van.TagFunc&Circular>} + + type Circular = { + [K in Keys]: Circular&Func + }; + } + + const Gale:Gale.CreateSheet + +} +