UNPKG

@sourcebug/amos

Version:

A decentralized state manager for react

3 lines (2 loc) 6.34 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Amos={},e.React)}(this,(function(e,t){"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=r(t);const o=e=>e;const s="function"==typeof Symbol?Symbol.for("AMOS_OBJECT"):"Symbol(AMOS_OBJECT)";function c(e,t){return t.hasOwnProperty(s)||Object.defineProperty(t,s,{value:e}),t}function u(e,t){return!!t&&t[s]===e}function i(e,t){return e===t}function a(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(e[r]!==t[r])return!1;return!0}const f=Array.isArray;function l(e){return Object.assign(this,{options:e})}const d=t.createContext(null),p="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?t.useLayoutEffect:t.useEffect;function y(){const e=t.useContext(d);if(!e)throw new Error("[Amos] you are using hooks without <Provider />.");return e.store}const h={selectors:[],deps:[],snapshots:[],results:[]};function g(e,t){for(const r in e)if(e.hasOwnProperty(r)&&t.hasOwnProperty(r))return!0;return!1}function b(e,t,r,n){if(!e.factory?.deps||!r[n])return!0;const o=e.factory.deps(t.select,...e.args||[]),s=a(r[n]||[],o);return r[n]=o,!s}function m(e,t,r){return e.factory?e.factory.compare(t,r):i(t,r)}function w(e,t,r,n,o){if(!(e&&"function"==typeof e&&r&&e.args&&t.args))return!0;if(!(e===t||t.factory&&t.factory===e.factory))return!0;if(void 0===t.factory?.deps)return!a(e.args,t.args);const s=t.factory.deps(n.select,...t.args);return!a(o||[],s)&&s}e.Box=class{constructor(e,t,r){this.key=e,this.initialState=t,this.preload=r,this.listeners={}}subscribe(e,t){this.listeners["string"==typeof e?e:e.type]=t}mutation(e,t){return(...r)=>({object:"mutation",type:t,box:this,args:r,result:r[0],mutator:e})}},e.Consumer=({children:e})=>n.default.createElement(d.Consumer,null,(t=>{if(!t)throw new Error("[Amos] <Consumer /> should use inside <Provider />.");return e(t.store)})),e.Provider=({store:e,children:r})=>{const[o,s]=t.useState({store:e});return t.useEffect((()=>{o.store!==e&&s({store:e})}),[e]),n.default.createElement(d.Provider,{value:o},r)},e.VERSION="0.2.21",e.action=function(e,t){const r=Object.assign(((...n)=>({object:"action",type:t,args:n,actor:e,options:r.options})),{type:t,options:{},config:l});return r},e.arrayEqual=a,e.createStore=function(e,...t){const r={},n=[],o=new Set,s=new Set,u=t=>{if(r.hasOwnProperty(t.key))return;let o=t.initialState;e?.hasOwnProperty(t.key)&&(o=t.preload(e[t.key],o)),r[t.key]=o,n.push(t)};let i,a=0,l={};function d(){if(0==--a&&Object.keys(l).length>0){const e={...l};i.batchedUpdates((()=>{[...o].forEach((t=>t(e)));[...s].forEach((t=>(s.delete(t),t(e))))}))}}const p=(e,t)=>{(t!==r[e]||l.hasOwnProperty(e))&&(l[e]=t,r[e]=t)},y=e=>{switch(e.object){case"action":return e.actor(i.dispatch,i.select,...e.args);case"mutation":return u(e.box),p(e.box.key,e.mutator(r[e.box.key],...e.args)),e.result;case"signal":for(const t of n){const n=t.listeners[e.type];n&&p(t.key,n(r[t.key],e.data))}return e.data}};let h;return i={snapshot:()=>r,isAutoBatch:!1,subscribe:function(e){return a>0&&s.add(e),o.add(e),()=>{o.delete(e)}},dispatch:c("store.dispatch",(function(e){let t;1==++a&&(l={});try{t=f(e)?e.map(y):y(e)}catch{}return i.isAutoBatch?Promise.resolve().then(d):d(),t})),select:c("store.select",(function(e,t){if("function"!=typeof e)return u(e),h&&(h[e.key]=r[e.key]),r[e.key];if(!t)return e(i.select);if(h)throw new Error("[Amos] recursive snapshot collection is not supported.");h=t;try{return e(i.select)}finally{h=void 0}})),batchedUpdates:e=>e()},i=t.reduce(((e,t)=>t(e)),i),i},e.hoistMethod=function(e,t){const r=r=>{t.hasOwnProperty(r)||Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r))};return Object.getOwnPropertyNames(e).forEach(r),Object.getOwnPropertySymbols?.(e).forEach(r),t},e.identity=o,e.isAmosObject=u,e.kAmosObject=s,e.selector=function(e,t,r=i,n){const o=Object.assign(((...t)=>{if(u("store.select",t[0]))return e(...t);const r=r=>e(r,...t);return r.factory=o,r.args=t,r}),{deps:t,compare:r,type:n});return o},e.shallowEqual=function(e,t){if(e===t)return!0;const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let n=0;n<r.length;n++)if(!t.hasOwnProperty(r[n])||e[r[n]]!==t[r[n]])return!1;return!0},e.signal=function(e,t=o){return Object.assign(((...r)=>({object:"signal",type:e,data:t(...r)})),{type:e})},e.useDispatch=function(){return y().dispatch},e.useSelector=function(...e){const r=y(),[,n]=t.useReducer((e=>e+1),0),o=t.useRef(h),s=t.useRef(),c=t.useRef([]);if(s.current?.store!==r&&(o.current=h),s.current?.error){const e=s.current.error;throw s.current.error=void 0,e}const u=()=>{if(s.current?.updated)return s.current.updated=!1,o.current.results;{o.current===h&&(o.current={selectors:[],deps:[],snapshots:[],results:[]});const{selectors:t,deps:n,snapshots:s,results:c}=o.current;for(let o=0;o<e.length;o++){const u=t[o],i=e[o];if("object"==typeof i)c[o]=r.select(i),t[o]=i;else{const e=w(u,i,s[o],r,n[o]);if(e){s[o]=void 0;const u={};c[o]=r.select(i,u),n[o]=!0===e?void 0:e,s[o]=u,t[o]=i}}}return c.length=e.length,c}};let i=u();return p((()=>{c.current=[...i]})),p((()=>(s.current={store:r,updated:!1,error:void 0,disposer:r.subscribe((e=>{var t,c;let u=0;const{selectors:i,snapshots:a,results:f,deps:l}=o.current,d=i.length;try{for(;u<d;u++){const n=i[u],o=a[u];if("function"==typeof n){if((!o||g(o,e))&&b(n,r,l,u)){const e={},o=r.select(n,e);(t=s.current).updated||(t.updated=!m(n,f[u],o)),a[u]=e,f[u]=o}}else if(e.hasOwnProperty(n.key)){const e=r.select(n);(c=s.current).updated||(c.updated=e!==f[u]),f[u]=e}}s.current.updated&&n()}catch(e){a.length=f.length=u,s.current.error="object"==typeof e&&e&&"message"in e?Object.assign(e,{message:"[Amos] selector throws error: "+e.message}):new Error("[Amos] selector throws falsy error: "+e),n()}}))},a(c.current,u())||n(),()=>s.current?.disposer())),[r]),t.useDebugValue(i,(t=>t.reduce(((t,r,n)=>{const o=e[n];let s="function"==typeof o?o.type??o.factory?.type??o.name:o.key;return s||(s="anonymous"),t.hasOwnProperty(s)&&(s=s+"_"+n),t[s]=r,t}),{}))),i},e.useStore=y,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=amos-alter.umd.js.map