storken
Version:
🚀 5KB LLM-native state management for React 18+ with TypeScript, universal API, and plugin system
7 lines (5 loc) • 5.19 kB
JavaScript
import { useRef, useSyncExternalStore, useState, useEffect } from 'react';
var g=l=>{function e(t,...i){let n=useRef(l.bundles?.[t]||l.create(t,...i)).current,o=useSyncExternalStore(u=>n.listen([n.value,u],[n.loading||false,()=>{}],i),()=>n.value,()=>n.opts?.initialValue),[a,r]=useState(n.opts?.loading||false);useEffect(()=>{let u=()=>r(n.loading||false);return n.on("loading",u),()=>{if(n.eventListeners?.loading){let f=n.eventListeners.loading.findIndex(p=>p===u);f>-1&&n.eventListeners.loading.splice(f,1);}}},[n]);let s=[o,n.set.bind(n),n.reset.bind(n),a,n.update.bind(n)];s.value=o,s.set=n.set.bind(n),s.reset=n.reset.bind(n),s.loading=a,s.update=n.update.bind(n);let d=n.loadPlugins(s);return d&&(s.push(d),s.plugins=d),s}return e};var c=class{constructor(e,t){this.listeners=[];this.loadingListeners=[];this.eventListeners={};this.plugins={};this.getted=false;this.on=(e,t)=>{this?.eventListeners||(this.eventListeners={}),this?.eventListeners?.[e]?this.eventListeners[e].push(t):this.eventListeners[e]=[t];};this.dispatchEvent=async(e,...t)=>{if(this?.eventListeners?.[e])for(let i of this.eventListeners[e])await i(...t);};this.loadPlugins=e=>{let{plugins:t}=this;if(t)return Object.keys(t)?.reduce((i,n)=>{let o=t[n];return o=o instanceof Function?o(e):o,i[n]=o,i},{})};this.setFromGetter=async(...e)=>{if(!this.opts?.getter)return;if(this.opts?.disableGetterOnLoading&&this.loading)return Promise.resolve(this.value);this.load(true),this.dispatchEvent("getting",...e);let t=await Promise.resolve(typeof this.opts.getter=="function"?this.opts.getter(this,...e):this.opts.getter);return this.dispatchEvent("getted",t,...e),t&&this.set(t,{force:true,disableSetter:this.opts?.disableSetterOnGetter||true}),this.load(false),t};this.update=this.setFromGetter;this.listen=(e,t,i)=>{let[n,o]=e,[a,r]=t;this.listeners.indexOf(o)===-1&&this.listeners.push(o),this.loadingListeners.indexOf(r)===-1&&this.loadingListeners.push(r),n!==this.value&&o(this.value),a!==this.loading&&r(this.loading||false),(!this.opts?.disableAutoGetter&&!this.getted||!this.opts?.getOnlyOnMount)&&this.setFromGetter(...i),this.dispatchEvent("effect",{state:e,loading:t,args:i});let s=this;return ()=>{delete s.listeners?.[s.listeners.indexOf(o)],delete s.loadingListeners?.[s.loadingListeners.indexOf(r)],s.listeners=s.listeners.filter(Boolean),s.loadingListeners=s.loadingListeners.filter(Boolean),s.opts?.getOnce&&!s.getted&&(s.getted=true),s.dispatchEvent("unmounted");}};this.updateListeners=e=>{for(let t of this.listeners)t&&t(e);};this.updateLoadingListeners=e=>{for(let t of this.loadingListeners)t&&t(e);};this.set=async(e,t={})=>{this.dispatchEvent("willSet",e,t);let i=e instanceof Function?await Promise.resolve(e(this.value)):e;if(this.value===i&&!t?.force)return;let n=o=>{this.value=o,this.updateListeners(o),this.dispatchEvent("set",o,this?.args,t);};typeof this.opts?.setter=="function"&&!t?.disableSetter?(this.load(true),Promise.resolve(this.opts.setter(this,i,...this?.args||[])).then(o=>{n(this.opts?.setWithSetter?o:i),this.load(false);})):n(i);};this.load=async e=>(this.loading=e||false,this.dispatchEvent("loading",this.loading),this.updateLoadingListeners(this.loading),this.loading);this.reset=()=>this.set(this.opts?.initialValue,{force:true});let{key:i,args:n=[],plugins:o,...a}=e;this.id=Date.now(),this.key=i,this.opts=e,this.args=[...n],this.value=a?.initialValue,this.Store=t,this.namespace=a?.namespace||"storken::",o instanceof Object&&(this.plugins=Object.keys(o).reduce((r,s)=>{let[d,...u]=Array.isArray(o[s])?o[s]:[o[s]];return r[s]=d(this,...u),r},{}));}},h=class{constructor(e={}){this.bundles={};this.create=(e,...t)=>(this.bundles[e]=new c({key:e,args:t,plugins:this.config?.plugins,getter:this.config?.getters?.[e],setter:this.config?.setters?.[e],...this.config?.options||{},...this.config?.storkenOptions?.[e]||{},initialValue:this.config?.initialValues&&Object.keys(this.config?.initialValues).includes(e)?this.config?.initialValues?.[e]:this.config?.options?.initialValue},this),this.bundles[e]);this.get=(e,t,i)=>(this.bundles?.[e]?t&&(this.bundles[e].args=t):this.create(e,t),i?this.bundles[e]:this.bundles[e].value);this.getStorken=(e,...t)=>this.get(e,t,true);this.getPlugin=(e,t)=>{let i=this.get(e,void 0,true);return t?i.plugins?.[t]:i.plugins};this.set=(e,t,...i)=>{this.bundles?.[e]?i&&(this.bundles[e].args=i):this.create(e,...i),this.bundles[e].set(t);};this.remove=async(e,t=true)=>{this.bundles?.[e]&&(t&&await this.bundles[e].reset(),delete this.bundles[e]);};this.multiRemove=async(...e)=>{for(let t of e)await this.remove(t);};this.destroy=async(e,t)=>{this.bundles?.[e]&&(this.bundles[e].set(t),await this.remove(e));};this.multiDestroy=async(...e)=>{for(let t of e)await this.destroy(t?.key,t?.value);};this.restore=e=>{if(e)for(let t in e)Object.assign(this.config,{...this.config,initialValues:{...this.config?.initialValues||{},[t]:e[t]}}),this.bundles[t]=this.create(t);};this.dump=()=>Object.assign({},this.bundles);this.config=e;}},S=(l={})=>{let e=new h(l);return [g(e),e.get,e.set,e]};
export { h as Sky, c as Storken, S as create, g as createHook, S as default };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=index.mjs.map