@sourcebug/amos
Version:
A decentralized state manager for react
3 lines (2 loc) • 6.56 kB
JavaScript
!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 o=r(t);const s=e=>e;const n="function"==typeof Symbol?Symbol.for("AMOS_OBJECT"):"Symbol(AMOS_OBJECT)";function c(e,t){return t.hasOwnProperty(n)||Object.defineProperty(t,n,{value:e}),t}function u(e,t){return!!t&&t[n]===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})}let d=!1;document&&(document.addEventListener("keydown",(()=>d=!0)),document.addEventListener("keyup",(()=>d=!1)));const p=t.createContext(null),y="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?t.useLayoutEffect:t.useEffect;function h(){const e=t.useContext(p);if(!e)throw new Error("[Amos] you are using hooks without <Provider />.");return e.store}const g={selectors:[],deps:[],snapshots:[],results:[]};function b(e,t){for(const r in e)if(e.hasOwnProperty(r)&&t.hasOwnProperty(r))return!0;return!1}function m(e,t,r,o){if(!e.factory?.deps||!r[o])return!0;const s=e.factory.deps(t.select,...e.args||[]),n=a(r[o]||[],s);return r[o]=s,!n}function w(e,t,r){return e.factory?e.factory.compare(t,r):i(t,r)}function O(e,t,r,o,s){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 n=t.factory.deps(o.select,...t.args);return!a(s||[],n)&&n}function j(e){return{...e,updateCount:e.updateCount+1}}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})=>o.default.createElement(p.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[s,n]=t.useState({store:e});return t.useEffect((()=>{s.store!==e&&n({store:e})}),[e]),o.default.createElement(p.Provider,{value:s},r)},e.VERSION="0.2.28",e.action=function(e,t){const r=Object.assign(((...o)=>({object:"action",type:t,args:o,actor:e,options:r.options})),{type:t,options:{},config:l});return r},e.arrayEqual=a,e.createStore=function(e,...t){const r={},o=[],s=new Set,n=new Set,u=t=>{if(r.hasOwnProperty(t.key))return;let s=t.initialState;e?.hasOwnProperty(t.key)&&(s=t.preload(e[t.key],s)),r[t.key]=s,o.push(t)};let i,a=0,l={};function p(){if(0==--a&&Object.keys(l).length>0){const e={...l};i.batchedUpdates((()=>{[...s].forEach((t=>t(e)));[...n].forEach((t=>(n.delete(t),t(e))))}))}}const y=(e,t)=>{(t!==r[e]||l.hasOwnProperty(e))&&(l[e]=t,r[e]=t)},h=e=>{switch(e.object){case"action":return e.actor(i.dispatch,i.select,...e.args);case"mutation":return u(e.box),y(e.box.key,e.mutator(r[e.box.key],...e.args)),e.result;case"signal":for(const t of o){const o=t.listeners[e.type];o&&y(t.key,o(r[t.key],e.data))}return e.data}};let g;return i={snapshot:()=>r,isAutoBatch:!1,subscribe:function(e){return a>0&&n.add(e),s.add(e),()=>{s.delete(e)}},dispatch:c("store.dispatch",(function(e){let t;1==++a&&(l={});try{t=f(e)?e.map(h):h(e)}catch{}return i.isAutoBatch&&!d?Promise.resolve().then(p):p(),t})),select:c("store.select",(function(e,t){if("function"!=typeof e)return u(e),g&&(g[e.key]=r[e.key]),r[e.key];if(!t)return e(i.select);if(g)throw new Error("[Amos] recursive snapshot collection is not supported.");g=t;try{return e(i.select)}finally{g=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=s,e.isAmosObject=u,e.kAmosObject=n,e.selector=function(e,t,r=i,o){const s=Object.assign(((...t)=>{if(u("store.select",t[0]))return e(...t);const r=r=>e(r,...t);return r.factory=s,r.args=t,r}),{deps:t,compare:r,type:o});return s},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 o=0;o<r.length;o++)if(!t.hasOwnProperty(r[o])||e[r[o]]!==t[r[o]])return!1;return!0},e.signal=function(e,t=s){return Object.assign(((...r)=>({object:"signal",type:e,data:t(...r)})),{type:e})},e.useDispatch=function(){return h().dispatch},e.useSelector=function(...e){const r=h(),[o,s]=t.useReducer(j,{selectorRef:g,storeRef:void 0,lastState:[],updateCount:0});if(o.storeRef?.store!==r&&(o.selectorRef=g),o.storeRef?.error){const e=o.storeRef.error;throw o.storeRef.error=void 0,e}const n=()=>{if(o.storeRef?.updated)return o.storeRef.updated=!1,o.selectorRef.results;{o.selectorRef===g&&(o.selectorRef={selectors:[],deps:[],snapshots:[],results:[]});const{selectors:t,deps:s,snapshots:n,results:c}=o.selectorRef;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=O(u,i,n[o],r,s[o]);if(e){n[o]=void 0;const u={};c[o]=r.select(i,u),s[o]=!0===e?void 0:e,n[o]=u,t[o]=i}}}return c.length=e.length,c}};let c=n();return y((()=>{o.lastState=[...c]})),y((()=>(o.storeRef={store:r,updated:!1,error:void 0,disposer:r.subscribe((e=>{var t,n;let c=0;const{selectors:u,snapshots:i,results:a,deps:f}=o.selectorRef,l=u.length;try{for(;c<l;c++){const s=u[c],l=i[c];if("function"==typeof s){if((!l||b(l,e))&&m(s,r,f,c)){const e={},n=r.select(s,e);(t=o.storeRef).updated||(t.updated=!w(s,a[c],n)),i[c]=e,a[c]=n}}else if(e.hasOwnProperty(s.key)){const e=r.select(s);(n=o.storeRef).updated||(n.updated=e!==a[c]),a[c]=e}}o.storeRef.updated&&s()}catch(e){i.length=a.length=c,o.storeRef.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),s()}}))},a(o.lastState,n())||s(),()=>o.storeRef?.disposer())),[r]),t.useDebugValue(c,(t=>t.reduce(((t,r,o)=>{const s=e[o];let n="function"==typeof s?s.type??s.factory?.type??s.name:s.key;return n||(n="anonymous"),t.hasOwnProperty(n)&&(n=n+"_"+o),t[n]=r,t}),{}))),c},e.useStore=h,Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=amos-alter.umd.js.map