UNPKG

react-async-states

Version:

A low-level multi paradigm state management library

2 lines (1 loc) 11.1 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("async-states")):"function"==typeof define&&define.amd?define(["exports","react","async-states"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ReactAsyncStates={},e.React,e.AsyncStates)}(this,(function(e,t,n){"use strict";function r(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var u=r(t);const i=!1;function o(e){return"function"==typeof e}const c=[];let s,a=Object.assign,l=Object.freeze,f=Array.isArray,d=u.createContext(null),g="undefined"!=typeof window?window:void 0,p=void 0===g||"Deno"in g;function b(e){s=e}function y(e,t,r){let u=e.inst,{config:i,fn:o,key:c}=u,s=a({},i,{context:t}),l=n.createSource(c,o,s),f=l.inst;if(!0===r){let t=e.inst;f.state=t.state,f.cache=t.cache,f.latestRun=t.latestRun,f.lastSuccess=t.lastSuccess}return f.global=!0,l}function x(e,t,r){let u,i,o;switch(w(e,t),typeof t){case"object":{if(n.isSource(t)){if(p){i=y(t,e.ctx).inst}else i=t.inst;o=a({},r,s),o.source=t;break}let c=t;if(c.source&&n.isSource(c.source)){let t=c.source;if(p){t=y(t,e.ctx,c.useServerState)}let n=t.getLane(c.lane);i=n.inst,o=a({},c,r,s),o.source=n;break}let l=e;if(u=c.context?n.createContext(c.context):l||n.requestContext(null),o=a({},t,r,s),o.context=u.ctx,!u)throw new Error("Exec context not defined, this is a bug");i=h(u,o);break}case"string":{o=a({},r,s),o.key=t;let c=e;u=c||n.requestContext(null),o.context=u.ctx,i=v(u,o);break}case"function":o=a({},r,s),o.producer=t,o.context=e?.ctx??null,i=m(o);break;default:{o=a({},r,s);let t=e;u=t||n.requestContext(null),o.context=u.ctx,i=h(u,o)}}return{instance:i,config:o}}function h(e,t){let{key:r,producer:u}=t;r||(S(),r=n.nextKey(),t.storeInContext=!1);let i=e.get(r);return i?i.actions.getLane(t.lane).inst:n.createSource(r,u,t).getLane(t.lane).inst}function v(e,t){let r=t.key,u=e.get(r);return u||n.createSource(r,null,t).inst}function m(e){S();let t=n.nextKey();return e.storeInContext=!1,n.createSource(t,e.producer,e).inst}function w(e,t){if(!p||"object"!=typeof t)return;if(e)return;if(!t.context)throw new Error("A Provider is mandatory in the server")}function S(){if(p)throw new Error("A key is required in the server")}let E="$$as-";function $(e){let t=e.name,n=t||"__$$";window[t?`${t}_H`:"__$$_H"]=function(){let t=window[n];t&&e&&Object.entries(t).forEach((([n,r])=>{let u=e.get(n);if(!u||!r)return;let[i,o,c]=r;u.version+=1,u.state=i;let s=u.promise;"success"===i.status?(u.lastSuccess=i,s&&(s.value=i.data,s.status="fulfilled"),u.res?.res(i.data)):"error"===i.status&&s&&(s.status="rejected",s.reason=i.data,u.res?.rej(i.data)),u.payload=c,u.latestRun=o;let a=u.subscriptions;a&&Object.values(a).forEach((e=>e.props.cb(i))),delete t[n]}))}}function j({context:e,exclude:t}){let n=e.getAll().filter((n=>e.payload[n.key]!==n.version&&(!o(t)||!t(n.key,n.state)))).map((e=>e.actions));return u.createElement(O,{useReactId:!1,context:e,target:n})}function C({target:e}){let t=u.useContext(d);return p?u.createElement(O,{context:t,target:e}):u.createElement(P,{target:e})}function O({context:e,target:t,useReactId:n}){let r=u.useId(),i=k(t,e);if(!i)return null;let o=!1===n?void 0:`${E}${r}`;return u.createElement("script",{id:o,dangerouslySetInnerHTML:{__html:i}})}function P(e){let t=u.useId(),n=`${E}${t}`,r=u.useMemo((()=>({current:{html:null,init:!1}})),[]);if(!r.current.init){let e=document.getElementById(n),t=e?.innerHTML??null;r.current={init:!0,html:t}}let i=r.current.html;return i?u.createElement("script",{id:n,dangerouslySetInnerHTML:{__html:i}}):null}function k(e,t){if(!e.length)return null;let n=null,r=null;for(let u of e){let e=u.key,i=t.get(e);if(!i)throw new Error("Cannot leak server global source");let{state:o,latestRun:c,payload:s,version:a}=i;t.payload[e]!==a&&(t.payload[e]=a,i.global?(n||(n={}),n[e]=[o,c,s]):(r||(r={}),r[e]=[o,c,s]))}if(!n&&!r)return null;let u=["var win=window;"];if(n){let e=JSON.stringify(n);u.push(_("__$$",e))}if(r){let e=t.name;if(!e)throw new Error("Hydrating context without name, this is a bug");let n=JSON.stringify(r);u.push(_(e,n))}return u.join("")}function _(e,t){return`win["${e}"]=Object.assign(win["${e}"]||{},${t});win["${e}_H"]&&win["${e}_H"]();`}function A(e,t){return H(e,t)}function I(e,t){let{state:n,lastSuccess:r,cache:u}=e;return t?t(n,r,u):n}function H(e,t){let n=e.instance,r=n.state,i=n.lastSuccess,o=I(n,t.selector),c="pending"===r.status?r.prev:r,s=r.status,a=e.instance.actions;return l({source:a,state:o,dataProps:i.props,isError:"error"===s,isInitial:"initial"===s,isPending:"pending"===s,isSuccess:"success"===s,data:i.data??null,error:"error"===c.status?c.data:null,onChange:e.onChange,onSubscribe:e.onSubscribe,read:e.read.bind(null,t),Hydrate:()=>u.createElement(C,{target:[a]})})}function R(e){return e}let q=!1;function M(){let e=q;return q=!0,e}function L(e,t){let{instance:n,alternate:r}=e,u=r?.config||t,{lazy:i,condition:o,autoRunArgs:s}=u;return z(n.state,n.actions.getPayload(),i,o,s||c)}function z(e,t,n,r,u){if(!1===n){if(void 0===r||!0===r)return!0;if(o(r))return r(e,u,t)}return!1}function K(e,t){let n=e.actions,r=T(t);n.patchConfig(r),t.payload&&n.mergePayload(t.payload);let u=e.fn,i=t.producer;void 0!==i&&i!==u&&n.replaceProducer(i)}function T(e){let{lazy:t,events:n,source:r,payload:u,concurrent:i,autoRunArgs:o,subscriptionKey:c,...s}=e;return s}function D(e){return e+1}let J=null;function N(e,t,n){let[,r]=u.useState(0);return u.useMemo((()=>B(e,r,t,n)),[e])}function B(e,t,n,r){let u=null,i=null,c={deps:r,update:t,instance:e,cb:null,initial:!0,config:n,version:e.version,onChange:function(e){if(o(e)){let t=e(u);t&&(u=t)}else e&&(u=e)},onSubscribe:function(e){if(o(e)){let t=e(i);t&&(i=t)}else e&&(i=e)},alternate:null,get changeEvents(){return u},get subscribeEvents(){return i},at:J};return c.read=F.bind(null,c),c.return=A(c,n),c}let G=new WeakMap;function W(e,t){if(e&&"pending"!==e.status){G.get(e)===t&&G.delete(e)}}function F(e,t,n,r){let u=e.alternate,i=u?.config||t;if(n&&(e.initial||e.config!==i)){let t=e.instance,n=t.promise,r=!!n&&G.has(n);if(L(e,i)&&!r){K(t,i);let r=i.autoRunArgs||[],u=M();t.actions.run.apply(null,r),q=u,n=t.promise,n||null===t.currentAbort||Q(e)}if(n&&(G.set(n,e),"pending"===n.status))throw n}let o=u?u.return:e.return;if(r&&o.isError)throw o.error;return o.state}function Q(e){let{instance:t,cb:n}=e,{subscriptions:r}=t,u=[];if(r)for(let e of Object.values(r)){let t=e.props.cb;t!==n&&u.push(t)}u.length&&queueMicrotask((()=>{u.forEach((e=>e(t.state)))}))}function U(e){return`${e.config.subscriptionKey||e.at||void 0}-${(e.instance.subsIndex||0)+1}`}function V(e,t){Object.assign(e,t),e.initial=!1,e.alternate===t&&(e.alternate=null);let n=e.version,r=e.instance;W(r.promise,e),K(r,e.config),n===r.version||e.update(D)}function X(e){let t=e.config,n=e.instance,r=n.actions,u=n.state,o=Y,c=e.config.subscriptionKey??i?U(e):void 0,s=o.bind(null,e,u);e.cb=s;let a=[r.subscribe({cb:s,key:c})],l=t.events?.subscribe;if(l){let e=te(n,l);e&&(a=a.concat(e))}let f=e.subscribeEvents;if(f){let e=te(n,f);e&&(a=a.concat(e))}if(!t.concurrent&&L(e,t)){let e=t.autoRunArgs||[],r=n.actions.run.apply(null,e);a.push(r)}return function(){for(let e of a)e&&e()}}function Y(e,t,n){if(q)return;let r=e.return,u=e.config,i=e.instance,o=u.events?.change;o&&ee(i,o);let c=e.changeEvents;c&&ee(i,c);let s=i.version;if(Z(n,r))return void e.update(D);if(t===n)return;let a=u.areEqual||Object.is,l=u.selector||R,{cache:f,lastSuccess:d}=i,g=l(n,d,f);a(r.state,g)?e.version=s:e.update(D)}function Z(e,t){switch(e.status){case"initial":return!t.isInitial;case"pending":return!t.isPending;case"success":return!t.isSuccess;case"error":return!t.isError;default:return!1}}function ee(e,t){let n=e.state;const r=f(t)?t:[t],u={state:n,source:e.actions};r.forEach((e=>{if("object"==typeof e){const{handler:t,status:r}=e;r&&n.status!==r||t(u)}else e(u)}))}function te(e,t){if(!t||!e)return null;let n=e.actions;return(f(t)?t:[t]).map((e=>e(n)))}function ne(e,t,n){let r=e.instance;if(t===e.config&&e.version===r.version)return re(e),null;let u={deps:n,instance:r,config:t,return:e.return,update:e.update,version:e.version};if(e.alternate=u,u.version!==r.version)return u.version=r.version,u.return=A(e,t),re(e),u;let i=t.selector||R;if(i!==e.config.selector){let{cache:n,state:o,lastSuccess:c}=r,s=t.areEqual||Object.is,a=i(o,c,n);s(e.return.state,a)||(u.return=A(e,t))}return re(e),u}function re(e){let{alternate:t}=e,n=t||e,r=n.return,u=n.config;u.concurrent&&(r.read(!0,!!u.throwError),e.instance.version!==n.version&&(n.return=A(e,u)))}function ue(e,t,n){let r=u.useContext(d),i=t.concat(r),{instance:o,config:c}=u.useMemo((()=>x(r,e,n)),i),s=N(o,c,i),a=ne(s,c,i);return u.useLayoutEffect((()=>V(s,a)),[a]),u.useEffect((()=>X(s)),i),(a??s).return}let ie={concurrent:!0,throwError:!0};function oe(e,t,n){try{return b(ie),ue(e,t,n)}finally{b(null)}}function ce(e,t=c){return ue(e,t)}let se=null;ce.auto=function(e,t=c){return se||(se={lazy:!1}),ue(e,t,se)};const ae=l(ce),le=ae;function fe(e,t){let n={};return new Proxy(n,{get(r,u){let i=u,o=n[u];if(o)return o;let c=de(e,i,t);return n[i]=c,c}})}function de(e,t,r){let u=null;function i(){return o()}function o(){if(!u){let n=`app.${String(e)}.${String(t)}`;throw new Error(`Call ${n}.define(producer, config?) before using ${n}`)}return u}return i.define=function(o,c){if(u)u.replaceProducer(o),u.patchConfig(c);else{let i=`${String(e)}_${String(t)}`,s=c;null!==r&&(s=a({},s,{context:r})),u=n.createSource(i,o,s)}return i},i.useData=ge.bind(null,o),i.useAsync=pe.bind(null,o),Object.defineProperty(i,"source",{get:()=>o()}),i}function ge(e,t,n){return oe(e(),n||c,t)}function pe(e,t,n){return ue(e(),n||c,t)}Object.defineProperty(e,"createContext",{enumerable:!0,get:function(){return n.createContext}}),Object.defineProperty(e,"createSource",{enumerable:!0,get:function(){return n.createSource}}),Object.defineProperty(e,"getSource",{enumerable:!0,get:function(){return n.getSource}}),Object.defineProperty(e,"requestContext",{enumerable:!0,get:function(){return n.requestContext}}),Object.defineProperty(e,"terminateContext",{enumerable:!0,get:function(){return n.terminateContext}}),e.Hydration=C,e.Provider=function({exclude:e,children:t,context:r,serverInsertedHtmlHook:i}){let c=u.useId(),s=u.useContext(d),a=u.useMemo((()=>{if(!r&&null!==r){if(s)return s;let e=n.createContext({});return e.name=`__$$${c}`,e}let e=n.createContext(r);if(null!==r)e.name=`__$$${c}`;else if(p)throw new Error("Global context cannot be used server");return e}),[c,r]);return o(i)&&i((()=>u.createElement(j,{exclude:e,context:a}))),u.useEffect((()=>$(a)),[a]),u.createElement(d.Provider,{value:a},t)},e.createApplication=function(e,t){let r={};return new Proxy(r,{get(e,u){let i=u,o=r[i];if(o)return o;t&&n.createContext(t);let c=fe(i,t);return r[i]=c,c}})},e.useAsync=ae,e.useAsyncState=le,e.useData=function(e,t=c){return oe(e,t)}}));