@vegajs/vortex
Version:
🌀 A next-gen, lightweight state management library for JavaScript and TypeScript.
1 lines • 2.54 kB
JavaScript
import*as t from"../../constants.mjs";import*as e from"../../utils/index.mjs";import*as s from"../reactive/index.mjs";import*as i from"./devtools-connection.mjs";class r{listeners=new Map;listenerCounter=0;state;reactiveUnits;prevState;stateKeys=[];name;isPersist=!1;constructor(r,n={}){let{plugins:a=[],name:h=`unknown_${Date.now()}`}=n;this.name=h,this.state=r({reactive:s.reactive,computed:s.computed,effect:s.effect,query:this.createQuery.bind(this),mutation:this.createMutation.bind(this),batch:s.batch});let o=(0,e.toObjectKeys)(this.state);for(let s of(this.stateKeys=o,this.reactiveUnits=o.filter(t=>(0,e.isReactiveUnit)(this.state[t])||(0,e.isMutation)(this.state[t])),this.prevState=this.getSnapshot(),this.cleanupAll=this.observeReactivity(),a))s(this.getStore()),s.pluginName===t.PERSIST_NAME&&(this.isPersist=!0);Promise.resolve().then(()=>{(0,i.initDevtoolsStore)(this.name,this.prevState)})}createQuery(t,e){return new s.QueryHandler(t,e)}createMutation(t,e){return new s.MutationHandler(t,e)}getSnapshot(){let t={};for(let s=0;s<this.stateKeys.length;s++){let i=this.stateKeys[s],r=this.state[i];t[i]=(0,e.isReactiveUnit)(r)?r.value:r,(0,e.isMutation)(r)&&(t[i]={...r.state,runSync:r.runSync,runAsync:r.runAsync,reset:r.reset})}return t}triggerWatchers(t,e){this.listeners.forEach(s=>s(t,e)),Promise.resolve().then(()=>(0,i.observeStore)(t,e,this.name))}isBatchScheduled=!1;observeReactivity(){let t=[],s=null,i=()=>{this.isBatchScheduled||(this.isBatchScheduled=!0,Promise.resolve().then(()=>{s&&(this.triggerWatchers(s,this.prevState),this.prevState=s,s=null),this.isBatchScheduled=!1}))};for(let r=0;r<this.reactiveUnits.length;r++){let n=this.reactiveUnits[r],a=this.state[n].subscribe(t=>{s||(s={...this.prevState}),(0,e.isMutation)(this.state[n])?s[n]={...t||{},runSync:this.state[n].runSync,runAsync:this.state[n].runAsync,reset:this.state[n].reset}:s[n]=t,i()});t.push(a)}return()=>{for(let e=0;e<t.length;e++)t[e]()}}action(t){t(this.state)}subscribe(t){let e=this.listenerCounter++;return this.listeners.set(e,t),()=>{this.listeners.delete(e)}}cleanupAll(){this.listenerCounter=0,this.listeners.clear()}getStore(){return{state:this.state,getSnapshot:this.getSnapshot.bind(this),action:this.action.bind(this),subscribe:this.subscribe.bind(this),cleanupAll:this.cleanupAll.bind(this)}}}function n(t,e){return new r(t,e).getStore()}function a(t,e){var s;let i,n;return s=()=>e?.singleton?(i||(i=new r(t,e).getStore()),i):new r(t,e).getStore(),n=null,()=>(null===n&&(n=s()),n)}export{a as defineLazyStore,n as defineStore};