From 04e978cc353b44e73f71811943da6c3e69a4b9c5 Mon Sep 17 00:00:00 2001 From: SethTrowbridge Date: Wed, 16 Jul 2025 16:42:38 -0400 Subject: [PATCH] add hmr.js --- src/hmr.js | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/hmr.js diff --git a/src/hmr.js b/src/hmr.js new file mode 100644 index 0000000..38b93c4 --- /dev/null +++ b/src/hmr.js @@ -0,0 +1,92 @@ +//@ts-check +// hmr +const HMR = globalThis.HMR = { + Time: 0, + /** @type {Record} */ + Temp:{}, + Tick() + { + for(const k in HMR.Temp) + { + sessionStorage.setItem(k, HMR.Temp[k]); + } + HMR.Temp = {}; + HMR.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 = sessionStorage.getItem(key); + console.log("LOAD", key, value); + return value; + }, + + /** @type {string|undefined} */ + _ID: undefined, + _index: 0, + /** @type {(id:string|undefined = undefined)=>void} */ + StartID(id) + { + this._index = 0; + this._ID = id; + }, + NextID() + { + return this._ID ? this._ID + "_" + (this._index++) + "_" : ""; + }, + + BindVan() + { + //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) + { + case "boolean" : + reader =(data)=> data === "true"; break; + case "number" : + reader = parseFloat; break; + case "object" : + reader = JSON.parse; + writer = JSON.stringify; + break; + } + + const fullKey = "HMR_" + HMR.NextID() + key; + const stringValue = HMR.Load(fullKey); + const signal = origninalState((stringValue ? reader(stringValue) : value)); + van.derive(()=>HMR.Save(fullKey, writer(signal.val))); + + return signal; + }; + }, + + BindVanX() + { + //bind VanX + const originalReactive = globalThis.vanX.reactive; + globalThis.vanX.reactive =(obj, id)=> + { + HMR.StartID(id); + const state = originalReactive(obj); + HMR.StartID(); + return state; + } + } + +}