UNPKG

@captaincodeman/rdx

Version:

Small state library. Like Redux, but smaller

2 lines (1 loc) 1.25 kB
import{combineReducers as o}from"./combineReducers.js";import{stateEvent as t}from"./const.js";import{Store as n}from"./store.js";const e=(o,t)=>t.indexOf("/")>-1?t:o+"/"+t,s=(o,t,n)=>{const s=e(t,n);return o.dispatch[t][n]=t=>{const n={type:s,...void 0!==t&&{payload:t}};return o.dispatch(n)},s},c={},r=[],i={dispatchPlugin:{onModel(o,t,n){o.dispatch[t]={};for(const e in n.reducers)s(o,t,e)}},effectsPlugin:{onModel(o,t,n){if(!n.effects)return;const e=n.effects({getDispatch:()=>o.dispatch,getState:()=>o.state});for(const n in e){const i=s(o,t,n),d=e[n];c[i]?c[i].push(d):c[i]=[d],"init"===n&&r.push(d)}},onStore(o){o.addEventListener(t,o=>{const{action:t}=o.detail,n=c[t.type];n&&queueMicrotask(()=>n.forEach(o=>o(t.payload)))}),queueMicrotask(()=>r.forEach(o=>o()))}}},d=t=>{const s={...t.models},c={...i,...t.plugins};for(const o in c){const t=c[o];t.model&&(s[o]=t.model)}const r={};for(const o in s){const t=s[o],n={};for(const s in t.reducers)n[e(o,s)]=t.reducers[s];r[o]=(o=t.state,e)=>{const s=n[e.type];return s?s(o,e.payload):o}}const d=o(r),a=t&&t.state,f=new n(a,d);for(const o in c){const t=c[o];if(t.onModel)for(const o in s)t.onModel(f,o,s[o])}for(const o in c){const t=c[o];t.onStore&&t.onStore(f)}return f};export{d as createStore};