HMR working
This commit is contained in:
parent
9c9717bdec
commit
6a20f5316f
33
app.js
33
app.js
@ -1,6 +1,29 @@
|
|||||||
const state = van.state(7);
|
const CSS = Gale({
|
||||||
van.add(document.body, van.tags.div({onclick()
|
Button:{
|
||||||
{
|
padding: "20px",
|
||||||
state.val++;
|
background: "black",
|
||||||
|
borderRadius: "20px",
|
||||||
|
color: "white",
|
||||||
|
fontWeight: "bolder"
|
||||||
}
|
}
|
||||||
}, state));
|
})
|
||||||
|
|
||||||
|
const state = VanX.reactive({key1:"value1", key2:"value2", count:7}, "THING")
|
||||||
|
console.log(state);
|
||||||
|
|
||||||
|
Van.add
|
||||||
|
(
|
||||||
|
document.body,
|
||||||
|
Van.tags.div
|
||||||
|
(
|
||||||
|
{
|
||||||
|
class:CSS("Button"),
|
||||||
|
onclick()
|
||||||
|
{
|
||||||
|
state.count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, ()=>state.count
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
104
hmr.js
Normal file
104
hmr.js
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
//@ts-check
|
||||||
|
|
||||||
|
const Gateway = globalThis.Gateway = {
|
||||||
|
Time: 0,
|
||||||
|
/** @type {Record<string, string>} */
|
||||||
|
Temp:{},
|
||||||
|
Tick()
|
||||||
|
{
|
||||||
|
for(const k in Gateway.Temp)
|
||||||
|
{
|
||||||
|
localStorage.setItem(k, Gateway.Temp[k]);
|
||||||
|
}
|
||||||
|
Gateway.Temp = {};
|
||||||
|
Gateway.Time = 0;
|
||||||
|
},
|
||||||
|
/** @type {(key:string, value:string)=>void} */
|
||||||
|
Save(key, value)
|
||||||
|
{
|
||||||
|
this.Temp[key] = value;
|
||||||
|
if(!this.Time)
|
||||||
|
{
|
||||||
|
this.Time = setTimeout(this.Tick, 500);
|
||||||
|
}
|
||||||
|
console.log("SAVE", key, value);
|
||||||
|
},
|
||||||
|
/** @type {(key:string)=>string|null} */
|
||||||
|
Load(key)
|
||||||
|
{
|
||||||
|
const value = localStorage.getItem(key);
|
||||||
|
console.log("LOAD", key, value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const context = {
|
||||||
|
/** @type {string|undefined} */
|
||||||
|
_ID: undefined,
|
||||||
|
_index: 0,
|
||||||
|
/** @type {(id:string|undefined = undefined)=>void} */
|
||||||
|
StartID(id)
|
||||||
|
{
|
||||||
|
this._index = 0;
|
||||||
|
this._ID = id;
|
||||||
|
},
|
||||||
|
CurrentID()
|
||||||
|
{
|
||||||
|
return this._ID ? this._ID + "_" + (this._index++) + "_" : "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HMR Wrapper for Van.state
|
||||||
|
* @template T
|
||||||
|
* @param {T} value - initial value
|
||||||
|
* @param {string} key - Storage ID
|
||||||
|
* @returns {Van.State<T>}
|
||||||
|
*/
|
||||||
|
export const State =(value, key="")=>
|
||||||
|
{
|
||||||
|
const type = typeof value;
|
||||||
|
let reader =d=>d;
|
||||||
|
let writer =d=>d.toString();
|
||||||
|
|
||||||
|
if(type === "object")
|
||||||
|
{
|
||||||
|
reader = JSON.parse;
|
||||||
|
writer = JSON.stringify;
|
||||||
|
}
|
||||||
|
else if(type === "number")
|
||||||
|
{
|
||||||
|
reader = parseFloat;
|
||||||
|
}
|
||||||
|
else if(type === "boolean")
|
||||||
|
{
|
||||||
|
reader =(data)=> data === "true";
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
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 = context.CurrentID() + key
|
||||||
|
const stringValue = Gateway.Load(fullKey);
|
||||||
|
const signal = Van.state(/**@type{T}*/(stringValue ? reader(stringValue) : value));
|
||||||
|
Van.derive(()=>Gateway.Save(fullKey, writer(signal.val)));
|
||||||
|
|
||||||
|
return signal;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Reactive =(obj, id)=>
|
||||||
|
{
|
||||||
|
context.StartID(id);
|
||||||
|
VanX.reactive(obj);
|
||||||
|
context.StartID();
|
||||||
|
}
|
144
index.html
144
index.html
@ -7,31 +7,135 @@
|
|||||||
// van:
|
// van:
|
||||||
{let e,t,r,o,n,l,s,i,f,h,w,a,d,u,_,c,S,g,y,b,m,v,j,x,O;s=Object.getPrototypeOf,f={},h=s(i={isConnected:1}),w=s(s),a=(e,t,r,o)=>(e??(setTimeout(r,o),new Set)).add(t),d=(e,t,o)=>{let n=r;r=t;try{return e(o)}catch(e){return console.error(e),o}finally{r=n}},u=e=>e.filter(e=>e.t?.isConnected),_=e=>n=a(n,e,()=>{for(let e of n)e.o=u(e.o),e.l=u(e.l);n=l},1e3),c={get val(){return r?.i?.add(this),this.rawVal},get oldVal(){return r?.i?.add(this),this.h},set val(o){r?.u?.add(this),o!==this.rawVal&&(this.rawVal=o,this.o.length+this.l.length?(t?.add(this),e=a(e,this,x)):this.h=o)}},S=e=>({__proto__:c,rawVal:e,h:e,o:[],l:[]}),g=(e,t)=>{let r={i:new Set,u:new Set},n={f:e},l=o;o=[];let s=d(e,r,t);s=(s??document).nodeType?s:new Text(s);for(let e of r.i)r.u.has(e)||(_(e),e.o.push(n));for(let e of o)e.t=s;return o=l,n.t=s},y=(e,t=S(),r)=>{let n={i:new Set,u:new Set},l={f:e,s:t};l.t=r??o?.push(l)??i,t.val=d(e,n,t.rawVal);for(let e of n.i)n.u.has(e)||(_(e),e.l.push(l));return t},b=(e,...t)=>{for(let r of t.flat(1/0)){let t=s(r??0),o=t===c?g(()=>r.val):t===w?g(r):r;o!=l&&e.append(o)}return e},m=(e,t,...r)=>{let[{is:o,...n},...i]=s(r[0]??0)===h?r:[{},...r],a=e?document.createElementNS(e,t,{is:o}):document.createElement(t,{is:o});for(let[e,r]of Object.entries(n)){let o=t=>t?Object.getOwnPropertyDescriptor(t,e)??o(s(t)):l,n=t+","+e,i=f[n]??=o(s(a))?.set??0,h=e.startsWith("on")?(t,r)=>{let o=e.slice(2);a.removeEventListener(o,r),a.addEventListener(o,t)}:i?i.bind(a):a.setAttribute.bind(a,e),d=s(r??0);e.startsWith("on")||d===w&&(r=y(r),d=c),d===c?g(()=>(h(r.val,r.h),a)):h(r)}return b(a,i)},v=e=>({get:(t,r)=>m.bind(l,e,r)}),j=(e,t)=>t?t!==e&&e.replaceWith(t):e.remove(),x=()=>{let r=0,o=[...e].filter(e=>e.rawVal!==e.h);do{t=new Set;for(let e of new Set(o.flatMap(e=>e.l=u(e.l))))y(e.f,e.s,e.t),e.t=l}while(++r<100&&(o=[...t]).length);let n=[...e].filter(e=>e.rawVal!==e.h);e=l;for(let e of new Set(n.flatMap(e=>e.o=u(e.o))))j(e.t,g(e.f,e.t)),e.t=l;for(let e of n)e.h=e.rawVal},O={tags:new Proxy(e=>new Proxy(m,v(e)),v()),hydrate:(e,t)=>j(e,g(t,e)),add:b,state:S,derive:y},window.van=O;}
|
{let e,t,r,o,n,l,s,i,f,h,w,a,d,u,_,c,S,g,y,b,m,v,j,x,O;s=Object.getPrototypeOf,f={},h=s(i={isConnected:1}),w=s(s),a=(e,t,r,o)=>(e??(setTimeout(r,o),new Set)).add(t),d=(e,t,o)=>{let n=r;r=t;try{return e(o)}catch(e){return console.error(e),o}finally{r=n}},u=e=>e.filter(e=>e.t?.isConnected),_=e=>n=a(n,e,()=>{for(let e of n)e.o=u(e.o),e.l=u(e.l);n=l},1e3),c={get val(){return r?.i?.add(this),this.rawVal},get oldVal(){return r?.i?.add(this),this.h},set val(o){r?.u?.add(this),o!==this.rawVal&&(this.rawVal=o,this.o.length+this.l.length?(t?.add(this),e=a(e,this,x)):this.h=o)}},S=e=>({__proto__:c,rawVal:e,h:e,o:[],l:[]}),g=(e,t)=>{let r={i:new Set,u:new Set},n={f:e},l=o;o=[];let s=d(e,r,t);s=(s??document).nodeType?s:new Text(s);for(let e of r.i)r.u.has(e)||(_(e),e.o.push(n));for(let e of o)e.t=s;return o=l,n.t=s},y=(e,t=S(),r)=>{let n={i:new Set,u:new Set},l={f:e,s:t};l.t=r??o?.push(l)??i,t.val=d(e,n,t.rawVal);for(let e of n.i)n.u.has(e)||(_(e),e.l.push(l));return t},b=(e,...t)=>{for(let r of t.flat(1/0)){let t=s(r??0),o=t===c?g(()=>r.val):t===w?g(r):r;o!=l&&e.append(o)}return e},m=(e,t,...r)=>{let[{is:o,...n},...i]=s(r[0]??0)===h?r:[{},...r],a=e?document.createElementNS(e,t,{is:o}):document.createElement(t,{is:o});for(let[e,r]of Object.entries(n)){let o=t=>t?Object.getOwnPropertyDescriptor(t,e)??o(s(t)):l,n=t+","+e,i=f[n]??=o(s(a))?.set??0,h=e.startsWith("on")?(t,r)=>{let o=e.slice(2);a.removeEventListener(o,r),a.addEventListener(o,t)}:i?i.bind(a):a.setAttribute.bind(a,e),d=s(r??0);e.startsWith("on")||d===w&&(r=y(r),d=c),d===c?g(()=>(h(r.val,r.h),a)):h(r)}return b(a,i)},v=e=>({get:(t,r)=>m.bind(l,e,r)}),j=(e,t)=>t?t!==e&&e.replaceWith(t):e.remove(),x=()=>{let r=0,o=[...e].filter(e=>e.rawVal!==e.h);do{t=new Set;for(let e of new Set(o.flatMap(e=>e.l=u(e.l))))y(e.f,e.s,e.t),e.t=l}while(++r<100&&(o=[...t]).length);let n=[...e].filter(e=>e.rawVal!==e.h);e=l;for(let e of new Set(n.flatMap(e=>e.o=u(e.o))))j(e.t,g(e.f,e.t)),e.t=l;for(let e of n)e.h=e.rawVal},O={tags:new Proxy(e=>new Proxy(m,v(e)),v()),hydrate:(e,t)=>j(e,g(t,e)),add:b,state:S,derive:y},window.van=O;}
|
||||||
|
|
||||||
|
// hmr
|
||||||
|
const Gateway = globalThis.Gateway = {
|
||||||
|
Time: 0,
|
||||||
|
/** @type {Record<string, string>} */
|
||||||
|
Temp:{},
|
||||||
|
Tick()
|
||||||
|
{
|
||||||
|
for(const k in Gateway.Temp)
|
||||||
|
{
|
||||||
|
localStorage.setItem(k, Gateway.Temp[k]);
|
||||||
|
}
|
||||||
|
Gateway.Temp = {};
|
||||||
|
Gateway.Time = 0;
|
||||||
|
},
|
||||||
|
/** @type {(key:string, value:string)=>void} */
|
||||||
|
Save(key, value)
|
||||||
|
{
|
||||||
|
this.Temp[key] = value;
|
||||||
|
if(!this.Time)
|
||||||
|
{
|
||||||
|
this.Time = setTimeout(this.Tick, 500);
|
||||||
|
}
|
||||||
|
console.log("SAVE", key, value);
|
||||||
|
},
|
||||||
|
/** @type {(key:string)=>string|null} */
|
||||||
|
Load(key)
|
||||||
|
{
|
||||||
|
const value = localStorage.getItem(key);
|
||||||
|
console.log("LOAD", key, value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const context = {
|
||||||
|
/** @type {string|undefined} */
|
||||||
|
_ID: undefined,
|
||||||
|
_index: 0,
|
||||||
|
/** @type {(id:string|undefined = undefined)=>void} */
|
||||||
|
StartID(id)
|
||||||
|
{
|
||||||
|
this._index = 0;
|
||||||
|
this._ID = id;
|
||||||
|
},
|
||||||
|
CurrentID()
|
||||||
|
{
|
||||||
|
return this._ID ? this._ID + "_" + (this._index++) + "_" : "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HMR Wrapper for Van.state
|
||||||
|
* @template T
|
||||||
|
* @param {T} value - initial value
|
||||||
|
* @param {string} key - Storage ID
|
||||||
|
* @returns {Van.State<T>}
|
||||||
|
*/
|
||||||
|
const State =(value, key="")=>
|
||||||
|
{
|
||||||
|
const type = typeof value;
|
||||||
|
let reader =d=>d;
|
||||||
|
let writer =d=>d.toString();
|
||||||
|
|
||||||
|
if(type === "object")
|
||||||
|
{
|
||||||
|
reader = JSON.parse;
|
||||||
|
writer = JSON.stringify;
|
||||||
|
}
|
||||||
|
else if(type === "number")
|
||||||
|
{
|
||||||
|
reader = parseFloat;
|
||||||
|
}
|
||||||
|
else if(type === "boolean")
|
||||||
|
{
|
||||||
|
reader =(data)=> data === "true";
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
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 = context.CurrentID() + key
|
||||||
|
const stringValue = Gateway.Load(fullKey);
|
||||||
|
const signal = globalThis.HMRState(/**@type{T}*/(stringValue ? reader(stringValue) : value));
|
||||||
|
van.derive(()=>Gateway.Save(fullKey, writer(signal.val)));
|
||||||
|
|
||||||
|
return signal;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Reactive =(obj, id)=>
|
||||||
|
{
|
||||||
|
context.StartID(id);
|
||||||
|
const state = globalThis.HMRReactive(obj);
|
||||||
|
context.StartID();
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
//bind Van
|
||||||
|
globalThis.HMRState = globalThis.van.state;
|
||||||
|
globalThis.van.state =(...args)=>State(...args);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// vanX:
|
// vanX:
|
||||||
{let e,t,r,{fromEntries:o,entries:l,keys:n,hasOwn:f,getPrototypeOf:a}=Object,{get:i,set:y,deleteProperty:c,ownKeys:s}=Reflect,{state:m,derive:d,add:u}=van,b=1e3,w=Symbol(),A=Symbol(),S=Symbol(),_=Symbol(),g=Symbol(),p=Symbol(),P=e=>(e[A]=1,e),v=e=>e instanceof Object&&!(e instanceof Function)&&!e[p],h=e=>{if(e?.[A]){let t=m();return d(()=>{let r=e();v(t.rawVal)&&v(r)?B(t.rawVal,r):t.val=x(r)}),t}return m(x(e))},F=e=>{let t=Array.isArray(e)?[]:{__proto__:a(e)};for(let[r,o]of l(e))t[r]=h(o);return t[S]=[],t[_]=m(1),t},O={get:(e,t,r)=>t===w?e:f(e,t)?Array.isArray(e)&&"length"===t?(e[_].val,e.length):e[t].val:i(e,t,r),set:(e,o,l,n)=>f(e,o)?Array.isArray(e)&&"length"===o?(l!==e.length&&++e[_].val,e.length=l,1):(e[o].val=x(l),1):o in e?y(e,o,l,n):y(e,o,h(l))&&(++e[_].val,C(e).forEach(E.bind(t,n,o,e[o],r)),1),deleteProperty:(e,t)=>(c(e,t)&&R(e,t),++e[_].val),ownKeys:e=>(e[_].val,s(e))},x=e=>!v(e)||e[w]?e:new Proxy(F(e),O),D=e=>(e[p]=1,e),j=e=>e[w],K=a(m()),N=e=>new Proxy(e,{get:(e,t,r)=>a(e[t]??0)===K?{val:k(e[t].rawVal)}:i(e,t,r)}),k=e=>e?.[w]?new Proxy(N(e[w]),O):e,C=e=>e[S]=e[S].filter(e=>e.t.isConnected),E=(e,t,r,o,{t:l,f:f})=>{let a=Array.isArray(e),i=a?Number(t):t;u(l,()=>l[g][t]=f(r,()=>delete e[t],i)),a&&!o&&i!==e.length-1&&l.insertBefore(l.lastChild,l[g][n(e).find(e=>Number(e)>i)])},R=(e,t)=>{for(let r of C(e)){let e=r.t[g];e[t]?.remove(),delete e[t]}},T=r=>(e??(setTimeout(()=>(e.forEach(C),e=t),b),e=new Set)).add(r),q=(e,t,r)=>{let o={t:e instanceof Function?e():e,f:r},n=t[w];o.t[g]={},n[S].push(o),T(n);for(let[e,r]of l(n))E(t,e,r,1,o);return o.t},z=(e,t)=>{for(let[r,o]of l(t)){let t=e[r];v(t)&&v(o)?z(t,o):e[r]=o}for(let r in e)f(t,r)||delete e[r];let r=n(t),o=Array.isArray(e);if(o||n(e).some((e,t)=>e!==r[t])){let l=e[w];if(o)e.length=t.length;else{++l[_].val;let e={...l};for(let e of r)delete l[e];for(let t of r)l[t]=e[t]}for(let{t:e}of C(l)){let{firstChild:t,[g]:o}=e;for(let l of r)t===o[l]?t=t.nextSibling:e.insertBefore(o[l],t)}}return e},B=(e,n)=>{r=1;try{return z(e,n instanceof Function?Array.isArray(e)?n(e.filter(e=>1)):o(n(l(e))):n)}finally{r=t}},G=e=>Array.isArray(e)?e.filter(e=>1).map(G):v(e)?o(l(e).map(([e,t])=>[e,G(t)])):e;window.vanX={calc:P,reactive:x,noreactive:D,stateFields:j,raw:k,list:q,replace:B,compact:G}}
|
{let e,t,r,{fromEntries:o,entries:l,keys:n,hasOwn:f,getPrototypeOf:a}=Object,{get:i,set:y,deleteProperty:c,ownKeys:s}=Reflect,{state:m,derive:d,add:u}=van,b=1e3,w=Symbol(),A=Symbol(),S=Symbol(),_=Symbol(),g=Symbol(),p=Symbol(),P=e=>(e[A]=1,e),v=e=>e instanceof Object&&!(e instanceof Function)&&!e[p],h=e=>{if(e?.[A]){let t=m();return d(()=>{let r=e();v(t.rawVal)&&v(r)?B(t.rawVal,r):t.val=x(r)}),t}return m(x(e))},F=e=>{let t=Array.isArray(e)?[]:{__proto__:a(e)};for(let[r,o]of l(e))t[r]=h(o);return t[S]=[],t[_]=m(1),t},O={get:(e,t,r)=>t===w?e:f(e,t)?Array.isArray(e)&&"length"===t?(e[_].val,e.length):e[t].val:i(e,t,r),set:(e,o,l,n)=>f(e,o)?Array.isArray(e)&&"length"===o?(l!==e.length&&++e[_].val,e.length=l,1):(e[o].val=x(l),1):o in e?y(e,o,l,n):y(e,o,h(l))&&(++e[_].val,C(e).forEach(E.bind(t,n,o,e[o],r)),1),deleteProperty:(e,t)=>(c(e,t)&&R(e,t),++e[_].val),ownKeys:e=>(e[_].val,s(e))},x=e=>!v(e)||e[w]?e:new Proxy(F(e),O),D=e=>(e[p]=1,e),j=e=>e[w],K=a(m()),N=e=>new Proxy(e,{get:(e,t,r)=>a(e[t]??0)===K?{val:k(e[t].rawVal)}:i(e,t,r)}),k=e=>e?.[w]?new Proxy(N(e[w]),O):e,C=e=>e[S]=e[S].filter(e=>e.t.isConnected),E=(e,t,r,o,{t:l,f:f})=>{let a=Array.isArray(e),i=a?Number(t):t;u(l,()=>l[g][t]=f(r,()=>delete e[t],i)),a&&!o&&i!==e.length-1&&l.insertBefore(l.lastChild,l[g][n(e).find(e=>Number(e)>i)])},R=(e,t)=>{for(let r of C(e)){let e=r.t[g];e[t]?.remove(),delete e[t]}},T=r=>(e??(setTimeout(()=>(e.forEach(C),e=t),b),e=new Set)).add(r),q=(e,t,r)=>{let o={t:e instanceof Function?e():e,f:r},n=t[w];o.t[g]={},n[S].push(o),T(n);for(let[e,r]of l(n))E(t,e,r,1,o);return o.t},z=(e,t)=>{for(let[r,o]of l(t)){let t=e[r];v(t)&&v(o)?z(t,o):e[r]=o}for(let r in e)f(t,r)||delete e[r];let r=n(t),o=Array.isArray(e);if(o||n(e).some((e,t)=>e!==r[t])){let l=e[w];if(o)e.length=t.length;else{++l[_].val;let e={...l};for(let e of r)delete l[e];for(let t of r)l[t]=e[t]}for(let{t:e}of C(l)){let{firstChild:t,[g]:o}=e;for(let l of r)t===o[l]?t=t.nextSibling:e.insertBefore(o[l],t)}}return e},B=(e,n)=>{r=1;try{return z(e,n instanceof Function?Array.isArray(e)?n(e.filter(e=>1)):o(n(l(e))):n)}finally{r=t}},G=e=>Array.isArray(e)?e.filter(e=>1).map(G):v(e)?o(l(e).map(([e,t])=>[e,G(t)])):e;window.vanX={calc:P,reactive:x,noreactive:D,stateFields:j,raw:k,list:q,replace:B,compact:G}}
|
||||||
|
|
||||||
|
//bind VanX
|
||||||
|
globalThis.HMRReactive = globalThis.vanX.reactive;
|
||||||
|
globalThis.vanX.reactive =(...args)=>Reactive(...args);
|
||||||
|
|
||||||
const root = "/";
|
|
||||||
fetch(root + 'deno.json').then(resp=>resp.json()).then(json=>
|
|
||||||
{
|
|
||||||
const s=(type, content)=>{
|
|
||||||
let script = document.createElement('script');
|
|
||||||
script.type = type;
|
|
||||||
script.textContent = content;
|
|
||||||
document.head.appendChild(script);
|
|
||||||
};
|
|
||||||
|
|
||||||
for(let key in json.imports)
|
// scope casing
|
||||||
{
|
globalThis.Van = globalThis.van;
|
||||||
const value = json.imports[key];
|
globalThis.VanX = globalThis.vanX;
|
||||||
if(value.startsWith("./"))
|
|
||||||
{
|
|
||||||
json.imports[key] = root + value.substring(2);
|
|
||||||
}
|
// gale
|
||||||
}
|
{const e=(t,n)=>`${t}{${Object.keys(n).map((t=>{const s=n[t];switch(t[0]){case"@":return e(`@media(max-width:${t.substring(1)})`,s);case":":return e(`&${t}`,s);case".":return e(`${t}`,s);case"^":return e(`&:hover .${t.substring(1)}`,s)}return`${t.replace(/([a-z])([A-Z])/g,"$1-$2")}: ${s};`})).join("\n")}}`;let t=0;globalThis.Gale=n=>{const s=t?"_"+t:"";t++;const r=Object.keys(n).map((t=>e("."+t,n[t]))).join("\n");globalThis.document?.head.insertAdjacentHTML("beforeend",`<style data-sheet="${t}">${r}</style>`);const a=(...e)=>{const t=(e,t)=>{const n=t.lastIndexOf(e)+e.length;return n?t.substring(n):t};return e.map((e=>t("^",t(".",e)))).join(s+" ")+s};return a.css=r,a}};
|
||||||
s("importmap", JSON.stringify({imports:json.imports}))
|
|
||||||
s("module", `import "entry";`);
|
// boot
|
||||||
});
|
((t="/")=>{fetch(t+"deno.json").then((t=>t.json())).then((e=>{const n=(t,e)=>{let n=document.createElement("script");n.type=t,n.textContent=e,document.head.appendChild(n)};for(let n in e.imports){const o=e.imports[n];o.startsWith("./")&&(e.imports[n]=t+o.substring(2))}n("importmap",JSON.stringify({imports:e.imports})),n("module",'import "entry";')}))})();
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
54
van.d.ts
vendored
54
van.d.ts
vendored
@ -1,15 +1,6 @@
|
|||||||
|
export {}
|
||||||
declare global
|
declare global
|
||||||
{
|
{
|
||||||
namespace VanX
|
|
||||||
{
|
|
||||||
type StateOf<T> = { readonly [K in keyof T]: Van.State<T[K]> }
|
|
||||||
type ValueType<T> = T extends (infer V)[] ? V : T[keyof T]
|
|
||||||
type KeyType<T> = T extends unknown[] ? number : string
|
|
||||||
type ReplacementFunc<T> =
|
|
||||||
T extends (infer V)[] ? (items: V[]) => readonly V[] :
|
|
||||||
(items: [string, T[keyof T]][]) => readonly [string, T[keyof T]][]
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Van {
|
namespace Van {
|
||||||
|
|
||||||
interface State<T> {
|
interface State<T> {
|
||||||
@ -48,18 +39,25 @@ declare global
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const van:MembersVan;
|
const Van:{
|
||||||
const vanX:MembersVanX;
|
|
||||||
}
|
|
||||||
|
|
||||||
type MembersVan = {
|
|
||||||
readonly state: <T>(initVal: T)=> Van.State<T>
|
readonly state: <T>(initVal: T)=> Van.State<T>
|
||||||
readonly derive: <T>(f: () => T) => Van.State<T>
|
readonly derive: <T>(f: () => T) => Van.State<T>
|
||||||
readonly add: (dom: Element, ...children: readonly Van.ChildDom[]) => Element
|
readonly add: (dom: Element, ...children: readonly Van.ChildDom[]) => Element
|
||||||
readonly tags: Van.Tags & ((namespaceURI: string) => Readonly<Record<string, Van.TagFunc<Element>>>)
|
readonly tags: Van.Tags & ((namespaceURI: string) => Readonly<Record<string, Van.TagFunc<Element>>>)
|
||||||
readonly hydrate: <T extends Node>(dom: T, f: (dom: T) => T | null | undefined) => T
|
readonly hydrate: <T extends Node>(dom: T, f: (dom: T) => T | null | undefined) => T
|
||||||
}
|
};
|
||||||
type MembersVanX = {
|
|
||||||
|
|
||||||
|
namespace VanX
|
||||||
|
{
|
||||||
|
type StateOf<T> = { readonly [K in keyof T]: Van.State<T[K]> }
|
||||||
|
type ValueType<T> = T extends (infer V)[] ? V : T[keyof T]
|
||||||
|
type KeyType<T> = T extends unknown[] ? number : string
|
||||||
|
type ReplacementFunc<T> =
|
||||||
|
T extends (infer V)[] ? (items: V[]) => readonly V[] :
|
||||||
|
(items: [string, T[keyof T]][]) => readonly [string, T[keyof T]][]
|
||||||
|
}
|
||||||
|
const VanX:{
|
||||||
readonly calc: <R>(f: () => R) => R
|
readonly calc: <R>(f: () => R) => R
|
||||||
readonly reactive: <T extends object>(obj: T) => T
|
readonly reactive: <T extends object>(obj: T) => T
|
||||||
readonly noreactive: <T extends object>(obj: T) => T
|
readonly noreactive: <T extends object>(obj: T) => T
|
||||||
@ -68,7 +66,23 @@ type MembersVanX = {
|
|||||||
readonly list: <T extends object, ElementType extends Element>(container: (() => ElementType) | ElementType, items: T,itemFunc: (v: Van.State<VanX.ValueType<T>>, deleter: () => void, k: VanX.KeyType<T>) => Node) => ElementType
|
readonly list: <T extends object, ElementType extends Element>(container: (() => ElementType) | ElementType, items: T,itemFunc: (v: Van.State<VanX.ValueType<T>>, deleter: () => void, k: VanX.KeyType<T>) => Node) => ElementType
|
||||||
readonly replace: <T extends object>(obj: T, replacement: VanX.ReplacementFunc<T> | T) => T
|
readonly replace: <T extends object>(obj: T, replacement: VanX.ReplacementFunc<T> | T) => T
|
||||||
readonly compact: <T extends object>(obj: T) => T
|
readonly compact: <T extends object>(obj: T) => T
|
||||||
}
|
};
|
||||||
|
|
||||||
export const Van: MembersVan;
|
namespace Gale {
|
||||||
export const VanX: MembersVanX;
|
type KeyQuery = "@";
|
||||||
|
type KeyPseudo = ":";
|
||||||
|
type KeyChild = ".";
|
||||||
|
type KeyGroup = "^";
|
||||||
|
type UserStyles = Partial<CSSStyleDeclaration> & {[key: `${KeyQuery|KeyPseudo|KeyChild|KeyGroup}${string}`]: UserStyles }
|
||||||
|
type UserSheet = Record<string, UserStyles>
|
||||||
|
type CollectKeys<Obj> = {[Key in keyof Obj]: Obj[Key] extends object ? Key | CollectKeys<Obj[Key]> : Key }[keyof Obj]
|
||||||
|
type FilterKeys<Keys> = Keys extends `${KeyChild|KeyGroup}${infer Rest}` ? Keys : never
|
||||||
|
type CrossMultiply<A, B> = A extends string ? B extends string ? `${A}${B}` : never : never
|
||||||
|
type CrossMultiplyRecord<Rec> = keyof Rec | { [K in keyof Rec]: K extends string ? CrossMultiply<K, FilterKeys<CollectKeys<Rec[K]>>> : never }[keyof Rec]
|
||||||
|
type Tier = (selector:string, obj:UserStyles)=>string;
|
||||||
|
type CreateSheet = <T extends UserSheet>(sheet:UserSheet&T)=> ((...args:CrossMultiplyRecord<T>[])=>string)&{css:string}
|
||||||
|
}
|
||||||
|
|
||||||
|
const Gale:Gale.CreateSheet
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user