stunk
Version:
Stunk is a lightweight, framework-agnostic state management library for JavaScript and TypeScript. It uses chunk-based state units for efficient updates, reactivity, and performance optimization in React, Vue, Svelte, and Vanilla JS/TS applications.
2 lines • 7.05 kB
JavaScript
var K=Object.defineProperty;var z=(e,n)=>{for(var r in n)K(e,r,{get:n[r],enumerable:true});};function B(e){return e!==null}function W(e){if(!e||typeof e!="object")return false;let n=e;return ["get","set","update","subscribe","derive","reset","destroy"].every(t=>typeof n[t]=="function")}function J(e){let n=false,r;return ()=>(n||(r=e(),n=true),r)}function U(e){let n=Object.keys(e).reduce((c,s)=>(c[s]=null,c),{}),r={loading:Object.keys(e).length>0,error:null,errors:{},data:n},t=p(r);Object.values(e);return Object.entries(e).forEach(([c,s])=>{s.subscribe(i=>{let f=t.get(),a=false,u=null,T={};Object.entries(e).forEach(([w,h])=>{let l=h.get();l.loading&&(a=true),l.error&&(u||(u=l.error),T[w]=l.error);}),t.set({loading:a,error:u,errors:T,data:{...f.data,[c]:i.data}});});}),t}function j(e,n){if(e===null)throw new Error("Value cannot be null.");let r=e,t=0;for(;t<n.length;){let o=n[t],c=typeof o=="function"?o:o.fn,s=typeof o=="function"?`index ${t}`:o.name||`index ${t}`,i=false,f=null;try{c(r,a=>{i=!0,f=a;});}catch(a){let u=a instanceof Error?a.message:String(a);throw new Error(`Middleware "${s}" threw an error: ${u}`)}if(!i)break;if(f===null)throw new Error(`Middleware at index ${t} returned null value.`);r=f,t++;}return r}function E(e,n){if(e===n)return true;if(!e||!n||typeof e!=typeof n)return false;if(Array.isArray(e)&&Array.isArray(n)){if(e.length!==n.length)return false;for(let r=0;r<e.length;r++)if(e[r]!==n[r])return false;return true}if(typeof e=="object"&&typeof n=="object"){let r=Object.keys(e),t=Object.keys(n);if(r.length!==t.length)return false;for(let o of r)if(!Object.prototype.hasOwnProperty.call(n,o)||e[o]!==n[o])return false;return true}return false}function v(e,n,r=""){if(typeof e=="object"&&e!==null&&typeof n=="object"&&n!==null){if(Array.isArray(e)&&Array.isArray(n)){if(e.length>0&&typeof e[0]=="object")for(let t=0;t<n.length;t++)v(e[0],n[t],`${r}[${t}]`);}else if(!Array.isArray(e)&&!Array.isArray(n)){let t=Object.keys(e),o=Object.keys(n),c=o.filter(s=>!t.includes(s));c.length>0&&(console.error(`\u{1F6A8} Stunk: Unknown properties detected at '${r||"root"}': ${c.join(", ")}. This might cause bugs.`),console.error("Expected keys:",t),console.error("Received keys:",o));for(let s of t)v(e[s],n[s],r?`${r}.${s}`:s);}}}var S=false,P=new Set,V=new Map,L=0;function G(e){let n=S;S=true;try{e();}finally{if(!n){S=false;let r=Array.from(P);P.clear(),r.forEach(t=>{let o=V.get(t);o&&o.notify();});}}}function p(e,n=[]){if(e===null)throw new Error("Initial value cannot be null.");let r=e,t=new Set,o=L++,c=()=>{t.forEach(h=>h(r));};V.set(o,{notify:c});let s=()=>{t.size!==0&&(S?P.add(o):c());},i=()=>r,f=h=>{let l;typeof h=="function"?l=h(r):l=h,v(r,l);let y=j(l,n);y!==r&&(r=y,s());},a=h=>{if(typeof h!="function")throw new Error("Callback must be a function.");return t.add(h),h(r),()=>t.delete(h)};return {get:i,set:f,subscribe:a,derive:h=>{if(typeof h!="function")throw new Error("Derive function must be a function.");let l=h(r),y=p(l),m=a(()=>{let D=h(r);y.set(D);}),g=y.destroy;return y.destroy=()=>{m(),g();},y},reset:()=>{r=e,s();},destroy:()=>{t.clear(),r=e,P.delete(o),V.delete(o);}}}function Q(e,n={}){let {initialData:r=null,onError:t,retryCount:o=0,retryDelay:c=1e3,refresh:s={},enabled:i=true}=n,{staleTime:f=0,cacheTime:a=5*60*1e3,refetchInterval:u}=s,T=e.length>0,w={loading:i&&!T,error:null,data:r,lastFetched:void 0},h=d=>T?d===void 0?false:Array.isArray(d)?d.every(x=>x!=null):true:true,l=p(w),y,m=null,g=null,D=()=>{let d=l.get();return d.lastFetched?Date.now()-d.lastFetched>f:true},N=()=>{l.set({...l.get(),data:r,lastFetched:void 0});},q=()=>{g&&clearTimeout(g),a>0&&(g=setTimeout(N,a));},k=async(d,x=o,b=false)=>{if(i){if(d!==void 0&&(y=d),!h(y)){l.set({...l.get(),loading:false});return}if(!(!b&&!D()&&l.get().data!==null&&f>0)){l.set({...l.get(),loading:true,error:null});try{let C=T?await e(...y):await e(),A=Date.now();l.set({loading:!1,error:null,data:C,lastFetched:A}),q();}catch(C){if(x>0)return await new Promise(A=>setTimeout(A,c)),k(d,x-1,b);l.set({loading:false,error:C,data:l.get().data,lastFetched:l.get().lastFetched}),t&&t(C);}}}};u&&u>0&&i&&(m=setInterval(()=>{i&&k(y,0,false);},u)),i&&!T&&k();let M=()=>{m&&(clearInterval(m),m=null),g&&(clearTimeout(g),g=null);};return {...l,reload:async(...d)=>{await k(d.length>0?d:void 0,o,true);},refresh:async(...d)=>{await k(d.length>0?d:void 0,o,false);},mutate:d=>{let x=l.get(),b=d(x.data);l.set({...x,data:b});},reset:()=>{M(),l.set({...w,loading:i}),i&&(k(),u&&u>0&&(m=setInterval(()=>{i&&k(y,0,false);},u)));},cleanup:M,setParams:(...d)=>{y=d,i&&h(d)&&k(d);}}}function X(e,n){let r=e.map(a=>a.get()),t=n(...r),o=p(t),c=o.set,s=false,i=()=>{let a=false;for(let u=0;u<e.length;u++){let T=e[u].get();T!==r[u]&&(r[u]=T,a=true);}if(a){let u=n(...r);u!==t&&(typeof u!="object"||typeof t!="object"||!E(u,t))&&(t=u,c(u)),s=false;}},f=e.map(a=>a.subscribe(()=>{s=true,i();}));return {...o,get:()=>(s&&i(),t),recompute:i,isDirty:()=>s,set:()=>{throw new Error("Cannot set values directly on computed. Modify the source chunk instead.")},reset:()=>(e.forEach(a=>{typeof a.reset=="function"&&a.reset();}),s=true,i(),t),destroy:()=>{f.forEach(a=>a()),o.destroy?.();}}}function O(e,n,r={}){let{useShallowEqual:t=false}=r,o=e.get(),c=n(o),s=p(c),i=()=>{let a=e.get(),u=n(a);o=a,(t?!E(u,c):u!==c)&&(c=u,s.set(u));},f=e.subscribe(i);return {get:()=>s.get(),set:()=>{throw new Error("Cannot set values directly on a selector. Modify the source chunk instead.")},subscribe:s.subscribe,derive:a=>O(s,a,r),reset:()=>{throw new Error("Cannot reset a selector chunk. Reset the source chunk instead.")},destroy:()=>{f(),s.destroy();}}}var $={};z($,{logger:()=>R,nonNegativeValidator:()=>I,withHistory:()=>F,withPersistence:()=>H});var R=(e,n)=>{console.log("Setting value:",e),n(e);};var I=(e,n)=>{if(e<0)throw new Error("Value must be non-negative!");n(e);};function F(e,n={}){let{maxHistory:r=100}=n,t=[e.get()],o=0,c=false,s={...e,set:i=>{if(c){e.set(i);return}let f;if(typeof i=="function"){let a=e.get();f=i(a);}else f=i;if(t.splice(o+1),t.push(f),t.length>r){console.warn("History limit reached. Removing oldest entries.");let a=t.length-r;t.splice(0,a),o=Math.max(0,o-a);}o=t.length-1,e.set(f);},undo:()=>{s.canUndo()&&(c=true,o--,s.set(t[o]),c=false);},redo:()=>{s.canRedo()&&(c=true,o++,s.set(t[o]),c=false);},canUndo:()=>o>0,canRedo:()=>o<t.length-1,getHistory:()=>[...t],clearHistory:()=>{let i=e.get();t.length=0,t.push(i),o=0;},destroy:()=>{t.length=0,e.destroy();}};return s}function H(e,n){let{key:r,storage:t=localStorage,serialize:o=JSON.stringify,deserialize:c=JSON.parse}=n;try{let s=t.getItem(r);if(s){let i=c(s);e.set(i);}}catch(s){console.error("Failed to load persisted state:",s);}return e.subscribe(s=>{try{let i=o(s);t.setItem(r,i);}catch(i){console.log("Failed to persist chunk",i);}}),e}export{Q as asyncChunk,G as batch,p as chunk,U as combineAsyncChunks,X as computed,W as isChunk,B as isValidChunkValue,$ as middleware,J as once,O as select};//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map