UNPKG

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 5.05 kB
import {useState,useEffect,useCallback,useRef,useMemo}from'react';var E=new Set,D=new Map,P=0;function y(e,r=[]){if(e===null)throw new Error("Initial value cannot be null.");let t=e,n=new Set,o=P++,a=()=>{n.forEach(d=>d(t));};D.set(o,{notify:a});let s=()=>{n.size!==0&&(a());},f=()=>t,c=d=>{let l;typeof d=="function"?l=d(t):l=d,b(t,l);let p=V(l,r);p!==t&&(t=p,s());},u=d=>{if(typeof d!="function")throw new Error("Callback must be a function.");return n.add(d),d(t),()=>n.delete(d)};return {get:f,set:c,subscribe:u,derive:d=>{if(typeof d!="function")throw new Error("Derive function must be a function.");let l=d(t),p=y(l),S=u(()=>{let M=d(t);p.set(M);}),j=p.destroy;return p.destroy=()=>{S(),j();},p},reset:()=>{t=e,s();},destroy:()=>{n.clear(),t=e,E.delete(o),D.delete(o);}}}function V(e,r){if(e===null)throw new Error("Value cannot be null.");let t=e,n=0;for(;n<r.length;){let o=r[n],a=typeof o=="function"?o:o.fn,s=typeof o=="function"?`index ${n}`:o.name||`index ${n}`,f=false,c=null;try{a(t,u=>{f=!0,c=u;});}catch(u){let i=u instanceof Error?u.message:String(u);throw new Error(`Middleware "${s}" threw an error: ${i}`)}if(!f)break;if(c===null)throw new Error(`Middleware at index ${n} returned null value.`);t=c,n++;}return t}function k(e,r){if(e===r)return true;if(!e||!r||typeof e!=typeof r)return false;if(Array.isArray(e)&&Array.isArray(r)){if(e.length!==r.length)return false;for(let t=0;t<e.length;t++)if(e[t]!==r[t])return false;return true}if(typeof e=="object"&&typeof r=="object"){let t=Object.keys(e),n=Object.keys(r);if(t.length!==n.length)return false;for(let o of t)if(!Object.prototype.hasOwnProperty.call(r,o)||e[o]!==r[o])return false;return true}return false}function b(e,r,t=""){if(typeof e=="object"&&e!==null&&typeof r=="object"&&r!==null){if(Array.isArray(e)&&Array.isArray(r)){if(e.length>0&&typeof e[0]=="object")for(let n=0;n<r.length;n++)b(e[0],r[n],`${t}[${n}]`);}else if(!Array.isArray(e)&&!Array.isArray(r)){let n=Object.keys(e),o=Object.keys(r),a=o.filter(s=>!n.includes(s));a.length>0&&(console.error(`\u{1F6A8} Stunk: Unknown properties detected at '${t||"root"}': ${a.join(", ")}. This might cause bugs.`),console.error("Expected keys:",n),console.error("Received keys:",o));for(let s of n)b(e[s],r[s],t?`${t}.${s}`:s);}}}function w(e,r,t={}){let{useShallowEqual:n=false}=t,o=e.get(),a=r(o),s=y(a),f=()=>{let u=e.get(),i=r(u);o=u,(n?!k(i,a):i!==a)&&(a=i,s.set(i));},c=e.subscribe(f);return {get:()=>s.get(),set:()=>{throw new Error("Cannot set values directly on a selector. Modify the source chunk instead.")},subscribe:s.subscribe,derive:u=>w(s,u,t),reset:()=>{throw new Error("Cannot reset a selector chunk. Reset the source chunk instead.")},destroy:()=>{c(),s.destroy();}}}function m(e,r){let t=r?w(e,r):e,[n,o]=useState(()=>t.get());useEffect(()=>{let c=t.subscribe(u=>{o(()=>u);});return ()=>c()},[t]);let a=useCallback(c=>{e.set(c);},[e]),s=useCallback(()=>{e.reset();},[e]),f=useCallback(()=>{e.destroy();},[e]);return [n,a,s,f]}function N(e,r){let t=useRef(r);useEffect(()=>{t.current=r;},[r]);let n=useMemo(()=>e.derive(a=>t.current(a)),[e]),[o]=m(n);return o}function A(e,r){let t=e.map(u=>u.get()),n=r(...t),o=y(n),a=o.set,s=false,f=()=>{let u=false;for(let i=0;i<e.length;i++){let T=e[i].get();T!==t[i]&&(t[i]=T,u=true);}if(u){let i=r(...t);i!==n&&(typeof i!="object"||typeof n!="object"||!k(i,n))&&(n=i,a(i)),s=false;}},c=e.map(u=>u.subscribe(()=>{s=true,f();}));return {...o,get:()=>(s&&f(),n),recompute:f,isDirty:()=>s,set:()=>{throw new Error("Cannot set values directly on computed. Modify the source chunk instead.")},reset:()=>(e.forEach(u=>{typeof u.reset=="function"&&u.reset();}),s=true,f(),n),destroy:()=>{c.forEach(u=>u()),o.destroy?.();}}}function z(e,r){let t=useMemo(()=>A(e,r),[...e]),[n,o]=useState(()=>t.get());return useEffect(()=>{let a=t.subscribe(s=>{o(s);});return ()=>{a();}},[t]),n}function C(e,r){let[t]=m(e,r);return t}function G(e,r){let t=useMemo(()=>n=>n[r],[r]);return C(e,t)}function Q(e){let[r,t]=useState(()=>e.map(n=>n.get()));return useEffect(()=>{let n=e.map((o,a)=>o.subscribe(s=>{t(f=>{let c=[...f];return c[a]=s,c});}));return ()=>{n.forEach(o=>o());}},[e]),r}function X(e,r){let[t,n]=useState(()=>e.get());useEffect(()=>{let l=e.subscribe(p=>{n(p);});return ()=>{l();}},[e]),useEffect(()=>{r&&"setParams"in e&&e.setParams(...r);},[e,...r||[]]),useEffect(()=>()=>{e.cleanup();},[e]);let o=useCallback((...l)=>"setParams"in e&&l.length>0?e.reload(...l):e.reload(),[e]),a=useCallback((...l)=>"setParams"in e&&l.length>0?e.refresh(...l):e.refresh(),[e]),s=useCallback(l=>e.mutate(l),[e]),f=useCallback(()=>e.reset(),[e]),c=useCallback((...l)=>{"setParams"in e&&e.setParams(...l);},[e]),{data:u,loading:i,error:T,lastFetched:g}=t,d={data:u,loading:i,error:T,lastFetched:g,reload:o,refresh:a,mutate:s,reset:f};return "setParams"in e&&(d.setParams=c),d}export{X as useAsyncChunk,m as useChunk,G as useChunkProperty,C as useChunkValue,Q as useChunkValues,z as useComputed,N as useDerive};//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map