reactjrx 1.124.0 → 1.126.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +14 -14
- package/dist/index.js +605 -615
- package/dist/index.js.map +1 -1
- package/dist/lib/utils/index.d.ts +8 -8
- package/package.json +6 -7
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var ee=Object.defineProperty;var te=(e,t,r)=>t in e?ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var w=(e,t,r)=>te(e,typeof t!="symbol"?t+"":t,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),n=require("rxjs"),v=require("rxjs/operators"),K=require("react/jsx-runtime"),I=require("@tanstack/react-query");function P(e){return e instanceof Promise||e&&typeof e=="object"&&"then"in e&&typeof e.then=="function"&&"catch"in e&&e.catch==="function"}function O(e){if(n.isObservable(e))return()=>e;if(P(e))return()=>n.from(e);if(typeof e!="function")return()=>n.of(e);const t=e;return r=>n.defer(()=>{const s=t(r);return P(s)?n.from(s):n.isObservable(s)?s:n.of(s)})}const p=e=>{const t=l.useRef(e);return l.useMemo(()=>{t.current=e},[e]),t};function k(e,t,r){const s=t!=null&&!Array.isArray(t)?t:{defaultValue:void 0,unsubscribeOnUnmount:!0,compareFn:void 0},a=!r&&Array.isArray(t)?t:typeof e=="function"?r??[]:[e],o=l.useRef("getValue"in e&&typeof e.getValue=="function"?e.getValue():s.defaultValue),c=p(e),f=p(s),u=l.useCallback(()=>o.current,[]),i=l.useCallback(m=>{const d=c.current,h=O(d)().pipe(f.current.defaultValue?n.startWith(f.current.defaultValue):n.identity,n.distinctUntilChanged((S,g)=>f.current.compareFn?S===void 0||g===void 0?!1:f.current.compareFn(S,g):!1),n.tap(S=>{o.current=S}),n.catchError(S=>(console.error(S),n.EMPTY))).subscribe(m);return()=>{f.current.unsubscribeOnUnmount!==!1&&h.unsubscribe()}},[...a]);return l.useSyncExternalStore(i,u,u)}function H(e,t=[]){const r=p(e);l.useEffect(()=>{const s=O(r.current)().pipe(n.catchError(a=>(console.error(a),n.EMPTY))).subscribe();return()=>{s.unsubscribe()}},[...t,r])}const q=e=>{const t=l.useRef(void 0);return t.current||(t.current=e()),l.useEffect(()=>{process.env.NODE_ENV},[]),t},M=e=>q(e).current,re=e=>{const t=M(()=>new n.BehaviorSubject(e)),r=p(t),s=l.useCallback(a=>{t.next(a)},[t]);return[r.current,s,t.getValue()]},$=e=>{const t=M(()=>new n.BehaviorSubject(e));return l.useEffect(()=>{t.next(e)},[e,t]),t};function ne(e,t,r=[]){const s=t!=null&&!Array.isArray(t)?t:{},a=s.retry??!0,o=p(s.onError??(u=>{console.error(u)})),c=l.useCallback(()=>O(e)(),r),f=l.useCallback(()=>c().pipe(n.catchError(u=>{throw o.current(u),u}),a?n.retry():n.identity),[c,a,o]);H(f,r)}const Y=Symbol("SIGNAL_RESET");class A extends n.BehaviorSubject{constructor(r){super(r.default);w(this,"update",r=>{if(r===Y)super.next(this.config.default);else if(typeof r=="function"){const s=r;super.next(s(this.value))}else super.next(r)});w(this,"setValue",this.update.bind(this));this.config=r}get subject(){return this}get key(){return this.config.key}}class x{constructor(t){this.config=t}}function se(e={}){return new A({key:void 0,...e,default:e.default??void 0})}function ue(e){return new x(e)}const ae=()=>{const e=q(()=>new n.ReplaySubject(1)),[t,r]=l.useState(!1);return t&&(e.current=new n.ReplaySubject(1),r(!1)),l.useEffect(()=>()=>{e.current.next(void 0),r(!0)},[e]),e.current},z=e=>{l.useEffect(e,[])},ce=e=>{z(()=>{e()})};function J(e,t){return Math.min(e,t)}function U(e,t){return 2**e*t}function oe(e){const{retry:t,retryDelay:r,retryAfterDelay:s,retryAfter:a=()=>n.of(!0)}=e,o=typeof t!="function"?t===!1?0:t===!0?Number.POSITIVE_INFINITY:t??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,c=typeof t=="function"?t:()=>!0,f=typeof r=="number"?r:100,u={...e},{maxInterval:i=Number.POSITIVE_INFINITY,resetOnSuccess:y=!1,backoffDelay:m=U}=u;return d=>n.defer(()=>{let h=0;const S=(g,b)=>g<o?c(g,b):!1;return d.pipe(v.catchError(g=>{var E;if(h++,!S(h-1,g))throw g;const b=(E=e.caughtError)==null?void 0:E.call(e,h,g);if(!b)throw g;return b.pipe(v.mergeMap(V=>n.merge(n.of(V),n.throwError(()=>g))))}),v.retryWhen(g=>g.pipe(v.concatMap(b=>{const E=h-1;return a().pipe(v.first(),v.mergeMap(()=>S(E,b)?n.timer(J(m(E,f),i)).pipe(v.mergeMap(V=>s&&!s(E,b)?n.throwError(()=>b):n.of(V))):n.throwError(()=>b)))}))),v.catchError(g=>{if(e.catchError)return e.catchError(h,g);throw g}),v.tap(()=>{y&&(h=0)}))})}function ie(e){return e!=null}const le=(e,t)=>e.length===t.length&&e.every((r,s)=>r===t[s]),fe=typeof window>"u"||"Deno"in window;class N{constructor(){w(this,"signals",new n.BehaviorSubject(new Map));w(this,"isDestroyed",!1)}getOrCreateSignal(t){const r=this.signals.value.get(t);if(r)return r;const s=new A({...t.config,key:void 0});return this.signals.value.set(t,s),this.signals.next(this.signals.value),s}destroy(){this.signals.value.forEach(t=>{t.complete()}),this.signals.value.clear(),this.signals.complete(),this.isDestroyed=!0}}const Q=l.createContext(new N),ye=l.memo(({children:e})=>{const t=q(()=>new N),r=t.current,[s,a]=l.useState(!1);s&&(t.current=new N,a(!1));const o=r;return l.useEffect(()=>()=>{var c;(c=t.current)==null||c.destroy(),a(!0)},[t]),K.jsx(Q.Provider,{value:o,children:e})}),D=()=>l.useContext(Q),G=e=>{const t=D();return e?t.getOrCreateSignal(e):void 0};function T(e){const t=D();if(e instanceof x&&!t)throw new Error("useSignalValue must be used within a SignalContextProvider");return G(e instanceof x?e:void 0)??e}function j(e,t){const r=p(t),s=T(e);return k(()=>{const a=r.current??(c=>c);return s.pipe(n.map(a),n.distinctUntilChanged())},{defaultValue:t?t==null?void 0:t(s.value):s.value},[s])}function B(e){return T(e).update}function de(e){const t=T(e),r=j(e),s=B(e);return[r,s,t]}const me=e=>{const t=M(e);return[j(t),t]},ge=e=>({getItem:async t=>{const r=await e.getItem(t);if(r)return JSON.parse(r)},setItem:async(t,r)=>{await e.setItem(t,JSON.stringify(r))},removeItem:async t=>{},clear:async()=>{}}),R=e=>{if(!(!e||typeof e!="object"))return e},Se=({adapter:e,key:t})=>({clear:async()=>await e.removeItem(t),removeItem:async r=>{const s=await e.getItem(t),{[r]:a,...o}=R(s)??{};await e.setItem(t,o)},getItem:async r=>{const s=await e.getItem(t),a=R(s)??{};if(r in a)return a[r]},setItem:async(r,s)=>{const a=await e.getItem(t),o=R(a)??{};await e.setItem(t,{...o,[r]:s})}}),W=({key:e}={})=>e?Se({adapter:W(),key:e}):{clear:async()=>{localStorage.clear()},removeItem:async t=>{localStorage.removeItem(t)},getItem:async t=>{const r=localStorage.getItem(t);if(r)return JSON.parse(r)},setItem:async(t,r)=>{localStorage.setItem(t,JSON.stringify(r))}};function he(e,t){if(e==null||t===void 0||typeof e!="object"||typeof t!="object")return e===t;if(e.constructor!==(t==null?void 0:t.constructor))return!1;const r=Object.keys(e),s=Object.keys(t);if(r.length!==s.length)return!1;for(const a of r)if(!t.hasOwnProperty(a)||e[a]!==t[a])return!1;return!0}const C="__reactjrx",be=e=>{if(typeof e=="object"&&e!==null&&C in e&&e[C]===C)return e},ve=({adapter:e,config:t})=>{const{signal:r,version:s}=t,o={value:r.getValue(),[C]:C,migrationVersion:s};return process.env.NODE_ENV==="development"&&console.log("[reactjrx][state][persistance]:","Persist value",o,`for signal ${r.config.key}`),n.from(e.setItem(r.config.key,o)).pipe(n.catchError(c=>(console.error(c),n.of(null))))};function pe({adapter:e,config:t}){const{hydrate:r=({value:o})=>o,signal:s,version:a}=t;return n.from(e.getItem(s.config.key)).pipe(n.switchMap(o=>{const c=be(o);if(!c)return n.of(o);const f=typeof c.migrationVersion!="number",u=c.migrationVersion!==void 0&&a>c.migrationVersion;if(f||u||c.value===void 0)return n.of(o);const i=c.value;return process.env.NODE_ENV==="development"&&console.log("[reactjrx][state][persistance]:","Hydrate value",c,`for signal ${s.config.key}`),s.setValue(r({value:i,version:a})),n.of(o)}))}function Ee({entries:e=[],onHydrated:t,adapter:r}){const a=(e.length===0?n.of([]):n.zip(...e.map(c=>pe({adapter:r,config:c})))).pipe(n.tap(t),n.catchError(c=>(console.error("Unable to hydrate",c),n.EMPTY)),n.share()),o=a.pipe(n.switchMap(()=>n.merge(...e.map(c=>c.signal.pipe(n.throttleTime(500,n.asyncScheduler,{trailing:!0}),n.switchMap(()=>n.from(ve({adapter:r,config:c}))))))));return n.merge(a.pipe(n.map(()=>({type:"hydrated"}))),o.pipe(n.map(()=>({type:"persisted"}))))}function we({entries:e=[],onHydrated:t,adapter:r}){const s=p(t),a=$(r),o=$(e);return k(()=>a.pipe(n.switchMap(f=>f?n.merge(n.of({type:"reset"}),o.pipe(n.concatMap(u=>Ee({adapter:f,entries:u,onHydrated:()=>{var i;(i=s.current)==null||i.call(s)}})))):n.of({type:"reset"}))).pipe(n.scan((f,u)=>u.type==="reset"?{isHydrated:!1}:u.type==="hydrated"?{isHydrated:!0}:f,{isHydrated:!1})),{defaultValue:{isHydrated:!1},compareFn:he},[a,o])}class X{constructor(){w(this,"queryMap",new Map)}getQuery(t){return this.queryMap.get(t)}setQuery(t,r,s){const a=I.hashKey(t),o=r.pipe(n.takeUntil(n.fromEvent(s,"abort")),n.share()),c={query$:o,signal:s,sub:void 0,isCompleted:!1,lastData:void 0};this.queryMap.set(a,c);const f=o.subscribe({next:u=>{const i=this.queryMap.get(a);i&&(i.lastData={value:u})},complete:()=>{this.deleteQuery(a)}});return c.sub=f,c}deleteQuery(t){const r=this.queryMap.get(t);r&&(r.sub&&(r.sub.unsubscribe(),r.sub=void 0),r.isCompleted=!0,this.queryMap.delete(t))}destroy(){this.queryMap.forEach((t,r)=>{this.deleteQuery(r)})}}const _=l.createContext(void 0),Ie=l.memo(({children:e,client:t})=>{const[r]=l.useState(()=>t??new X);return l.useEffect(()=>()=>{r.destroy()},[r]),K.jsx(_.Provider,{value:r,children:e})}),Z=()=>{const e=l.useContext(_);if(!e)throw new Error("useReactJrxQueryClient must be used within a ReactJrxQueryProvider");return e};function Ce(e,t){const r=I.useQueryClient(t),s=Z(),a=c=>new Promise((f,u)=>{const i=()=>n.defer(()=>typeof e.queryFn=="function"?e.queryFn(c):e.queryFn),y=I.hashKey(c.queryKey),m=s.getQuery(y),d=m??s.setQuery(c.queryKey,i(),c.signal),h=()=>{(d==null?void 0:d.isCompleted)===!1&&setTimeout(()=>{r==null||r.refetchQueries({queryKey:c.queryKey,exact:!0})})};if(!m&&d.lastData!==void 0){f(d.lastData.value),h();return}d.query$.pipe(n.take(1),n.delay(1)).subscribe({error:g=>u(g),complete:()=>{if((d==null?void 0:d.lastData)===void 0)return d.signal.aborted||(console.log(`cancelled due to stream completing without data for query ${y}`,d==null?void 0:d.lastData),r.cancelQueries({queryKey:c.queryKey,exact:!0})),f(void 0);f(d.lastData.value),h()}})});return I.useQuery({...e,queryFn:a},t)}function L(e,t){const r=M(()=>new n.BehaviorSubject({status:"idle",isPending:!1,isError:!1,isSuccess:!1,isIdle:!0})),s=I.useMutation({...e,mutationFn:i=>{let y;return new Promise((m,d)=>{(typeof e.mutationFn=="function"?e.mutationFn(i):e.mutationFn).pipe(n.take(1)).subscribe({next:S=>{y={value:S}},error:S=>{d(S)},complete:()=>{if(y===void 0)return d(new Error("Stream completed without any data"));m(y.value)}})})}},t),{status:a,isPending:o,isError:c,isSuccess:f,isIdle:u}=s;return l.useEffect(()=>{r.next({status:a,isPending:o,isError:c,isSuccess:f,isIdle:u})},[a,o,c,f,u,r]),{...s,state$:r}}class F extends Error{constructor(t="Mutation canceled"){super(t),this.name="SwitchMutationCancelError"}}function Me(e,t){const r=l.useRef(new AbortController),{mutate:s,mutateAsync:a,...o}=L({...e,mutationFn:({variables:u,abort:i})=>{if(i.aborted)throw new F;const y=typeof e.mutationFn=="function"?e.mutationFn(u):e.mutationFn;return n.merge(y,n.fromEvent(i,"abort").pipe(n.tap(()=>{throw new F}),n.ignoreElements())).pipe(n.first(),n.defaultIfEmpty(null))},onMutate:({variables:u})=>{var i;return(i=e.onMutate)==null?void 0:i.call(e,u)},onSuccess:(u,{variables:i},y)=>{var m;return(m=e.onSuccess)==null?void 0:m.call(e,u,i,y)},onError:(u,{variables:i},...y)=>{var m;return(m=e.onError)==null?void 0:m.call(e,u,i,...y)},onSettled:(u,i,{variables:y},m)=>{var d;return(d=e.onSettled)==null?void 0:d.call(e,u,i,y,m)}},t),c=l.useCallback(u=>(r.current.abort(),r.current=new AbortController,s({variables:u,abort:r.current.signal})),[s]),f=l.useCallback(u=>(r.current.abort(),r.current=new AbortController,a({variables:u,abort:r.current.signal})),[a]);return{...o,mutate:c,mutateAsync:f}}function xe(e,t){const r=I.useQueryClient(t),s=e.mutationKey,{mutateAsync:a,...o}=L({...e,onMutate({variables:u}){var i;return(i=e.onMutate)==null?void 0:i.call(e,u)},onSuccess(u,i,y){var m;return(m=e.onSuccess)==null?void 0:m.call(e,u,i.variables,y)},onError(u,i,y){var m;return(m=e.onError)==null?void 0:m.call(e,u,i.variables,y)},onSettled(u,i,y,m){var d;return(d=e.onSettled)==null?void 0:d.call(e,u,i,y.variables,m)},mutationFn:({ready$:u,variables:i})=>{const y=typeof e.mutationFn=="function"?e.mutationFn(i):e.mutationFn;return u.pipe(n.filter(m=>m),n.first(),n.switchMap(()=>y))}},t),c=l.useCallback(async u=>{const i=r.getMutationCache().findAll({mutationKey:s,exact:!0}),y=new n.BehaviorSubject(!1),m=a({variables:u,ready$:y});return await Promise.all(i.map(d=>d.continue().catch(n.noop))),y.next(!0),await m.finally(()=>{y.complete()})},[a,r,s]),f=l.useCallback(u=>{c(u).catch(n.noop)},[c]);return{...o,mutate:f,mutateAsync:c}}exports.Context=_;exports.QueryClient$=X;exports.QueryClientProvider$=Ie;exports.SIGNAL_RESET=Y;exports.Signal=A;exports.SignalContextProvider=ye;exports.SignalReactContext=Q;exports.SwitchMutationCancelError=F;exports.VirtualSignal=x;exports.arrayEqual=le;exports.createLocalStorageAdapter=W;exports.createLocalforageAdapter=ge;exports.exponentialBackoffDelay=U;exports.getDelay=J;exports.isDefined=ie;exports.isPromiseLike=P;exports.isServer=fe;exports.retryBackoff=oe;exports.signal=se;exports.useConstant=M;exports.useContactMutation$=xe;exports.useEffectOnce=z;exports.useLiveBehaviorSubject=$;exports.useLiveRef=p;exports.useMakeOrRetrieveSignal=G;exports.useMount=ce;exports.useMutation$=L;exports.useObservableState=re;exports.useObserve=k;exports.usePersistSignals=we;exports.useQuery$=Ce;exports.useQueryClient$=Z;exports.useSetSignal=B;exports.useSignal=de;exports.useSignalContext=D;exports.useSignalState=me;exports.useSignalValue=j;exports.useSubscribe=H;exports.useSubscribeEffect=ne;exports.useSwitchMutation$=Me;exports.useUnmountObservable=ae;exports.virtualSignal=ue;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react"),n=require("rxjs"),_=require("react/jsx-runtime"),E=require("@tanstack/react-query"),h=require("rxjs/operators"),P=e=>{const t=i.useRef(void 0);return t.current||(t.current=e()),i.useEffect(()=>{process.env.NODE_ENV},[]),t},I=e=>P(e).current,R=e=>{const t=I(()=>new n.BehaviorSubject(e));return i.useEffect(()=>{t.next(e)},[e,t]),t},v=e=>{const t=i.useRef(e);return i.useMemo(()=>{t.current=e},[e]),t},Z=e=>{const t=I(()=>new n.BehaviorSubject(e)),r=v(t),s=i.useCallback(a=>{t.next(a)},[t]);return[r.current,s,t.getValue()]};function q(e){return e instanceof Promise||e&&typeof e=="object"&&"then"in e&&typeof e.then=="function"&&"catch"in e&&e.catch==="function"}function N(e){if(n.isObservable(e))return()=>e;if(q(e))return()=>n.from(e);if(typeof e!="function")return()=>n.of(e);const t=e;return r=>n.defer(()=>{const s=t(r);return q(s)?n.from(s):n.isObservable(s)?s:n.of(s)})}function F(e,t,r){const s=t!=null&&!Array.isArray(t)?t:{defaultValue:void 0,unsubscribeOnUnmount:!0,compareFn:void 0},a=!r&&Array.isArray(t)?t:typeof e=="function"?r??[]:[e],c=i.useRef(void 0),o=v(e),l=v(s),u=i.useMemo(()=>({observable:N(o.current)().pipe(n.shareReplay({refCount:!0,bufferSize:1})),subscribed:!1,snapshotSub:void 0}),[...a]),f=i.useCallback(()=>{if(!u.subscribed){u.subscribed=!0;const d=u.observable.subscribe(b=>{c.current={value:b}});u.snapshotSub=d}return c.current===void 0?l.current.defaultValue:c.current?.value},[u,l]),y=i.useCallback(d=>{u.subscribed=!0;const b=u.observable.pipe(l.current.defaultValue?n.startWith(l.current.defaultValue):n.identity,n.distinctUntilChanged((S,p)=>l.current.compareFn?S===void 0||p===void 0?!1:l.current.compareFn(S,p):!1),n.tap(S=>{c.current={value:S}}),n.catchError(S=>(console.error(S),n.EMPTY))).subscribe(d);return u.snapshotSub?.unsubscribe(),()=>{l.current.unsubscribeOnUnmount!==!1&&b.unsubscribe()}},[u]);return i.useSyncExternalStore(y,f,f)}function L(e,t=[]){const r=v(e);i.useEffect(()=>{const s=N(r.current)().pipe(n.catchError(a=>(console.error(a),n.EMPTY))).subscribe();return()=>{s.unsubscribe()}},[...t,r])}function ee(e,t,r=[]){const s=t!=null&&!Array.isArray(t)?t:{},a=s.retry??!0,c=v(s.onError??(u=>{console.error(u)})),o=i.useCallback(()=>N(e)(),r),l=i.useCallback(()=>o().pipe(n.catchError(u=>{throw c.current(u),u}),a?n.retry():n.identity),[o,a,c]);L(l,r)}class H{queryMap=new Map;getQuery(t){return this.queryMap.get(t)}setQuery(t,r,s){const a=E.hashKey(t),c=r.pipe(n.takeUntil(n.fromEvent(s,"abort")),n.share()),o={query$:c,signal:s,sub:void 0,isCompleted:!1,lastData:void 0};this.queryMap.set(a,o);const l=c.subscribe({next:u=>{const f=this.queryMap.get(a);f&&(f.lastData={value:u})},complete:()=>{this.deleteQuery(a)}});return o.sub=l,o}deleteQuery(t){const r=this.queryMap.get(t);r&&(r.sub&&(r.sub.unsubscribe(),r.sub=void 0),r.isCompleted=!0,this.queryMap.delete(t))}destroy(){this.queryMap.forEach((t,r)=>{this.deleteQuery(r)})}}const O=i.createContext(void 0),te=i.memo(({children:e,client:t})=>{const[r]=i.useState(()=>t??new H);return i.useEffect(()=>()=>{r.destroy()},[r]),_.jsx(O.Provider,{value:r,children:e})}),K=()=>{const e=i.useContext(O);if(!e)throw new Error("useReactJrxQueryClient must be used within a ReactJrxQueryProvider");return e};function k(e,t){const r=I(()=>new n.BehaviorSubject({status:"idle",isPending:!1,isError:!1,isSuccess:!1,isIdle:!0})),s=E.useMutation({...e,mutationFn:f=>{let y;return new Promise((m,d)=>{(typeof e.mutationFn=="function"?e.mutationFn(f):e.mutationFn).pipe(n.take(1)).subscribe({next:S=>{y={value:S}},error:S=>{d(S)},complete:()=>{if(y===void 0)return d(new Error("Stream completed without any data"));m(y.value)}})})}},t),{status:a,isPending:c,isError:o,isSuccess:l,isIdle:u}=s;return i.useEffect(()=>{r.next({status:a,isPending:c,isError:o,isSuccess:l,isIdle:u})},[a,c,o,l,u,r]),{...s,state$:r}}function re(e,t){const r=E.useQueryClient(t),s=e.mutationKey,{mutateAsync:a,...c}=k({...e,onMutate({variables:u}){return e.onMutate?.(u)},onSuccess(u,f,y){return e.onSuccess?.(u,f.variables,y)},onError(u,f,y){return e.onError?.(u,f.variables,y)},onSettled(u,f,y,m){return e.onSettled?.(u,f,y.variables,m)},mutationFn:({ready$:u,variables:f})=>{const y=typeof e.mutationFn=="function"?e.mutationFn(f):e.mutationFn;return u.pipe(n.filter(m=>m),n.first(),n.switchMap(()=>y))}},t),o=i.useCallback(async u=>{const f=r.getMutationCache().findAll({mutationKey:s,exact:!0}),y=new n.BehaviorSubject(!1),m=a({variables:u,ready$:y});return await Promise.all(f.map(d=>d.continue().catch(n.noop))),y.next(!0),await m.finally(()=>{y.complete()})},[a,r,s]),l=i.useCallback(u=>{o(u).catch(n.noop)},[o]);return{...c,mutate:l,mutateAsync:o}}function ne(e,t){const r=E.useQueryClient(t),s=K(),a=o=>new Promise((l,u)=>{const f=()=>n.defer(()=>typeof e.queryFn=="function"?e.queryFn(o):e.queryFn),y=E.hashKey(o.queryKey),m=s.getQuery(y),d=m??s.setQuery(o.queryKey,f(),o.signal),b=()=>{d?.isCompleted===!1&&setTimeout(()=>{r?.refetchQueries({queryKey:o.queryKey,exact:!0})})};if(!m&&d.lastData!==void 0){l(d.lastData.value),b();return}d.query$.pipe(n.take(1),n.delay(1)).subscribe({error:p=>u(p),complete:()=>{if(d?.lastData===void 0)return d.signal.aborted||(console.log(`cancelled due to stream completing without data for query ${y}`,d?.lastData),r.cancelQueries({queryKey:o.queryKey,exact:!0})),l(void 0);l(d.lastData.value),b()}})});return E.useQuery({...e,queryFn:a},t)}class V extends Error{constructor(t="Mutation canceled"){super(t),this.name="SwitchMutationCancelError"}}function se(e,t){const r=i.useRef(new AbortController),{mutate:s,mutateAsync:a,...c}=k({...e,mutationFn:({variables:u,abort:f})=>{if(f.aborted)throw new V;const y=typeof e.mutationFn=="function"?e.mutationFn(u):e.mutationFn;return n.merge(y,n.fromEvent(f,"abort").pipe(n.tap(()=>{throw new V}),n.ignoreElements())).pipe(n.first(),n.defaultIfEmpty(null))},onMutate:({variables:u})=>e.onMutate?.(u),onSuccess:(u,{variables:f},y)=>e.onSuccess?.(u,f,y),onError:(u,{variables:f},...y)=>e.onError?.(u,f,...y),onSettled:(u,f,{variables:y},m)=>e.onSettled?.(u,f,y,m)},t),o=i.useCallback(u=>(r.current.abort(),r.current=new AbortController,s({variables:u,abort:r.current.signal})),[s]),l=i.useCallback(u=>(r.current.abort(),r.current=new AbortController,a({variables:u,abort:r.current.signal})),[a]);return{...c,mutate:o,mutateAsync:l}}const z=Symbol("SIGNAL_RESET"),ue=e=>({getItem:async t=>{const r=await e.getItem(t);if(r)return JSON.parse(r)},setItem:async(t,r)=>{await e.setItem(t,JSON.stringify(r))},removeItem:async t=>{},clear:async()=>{}}),x=e=>{if(!(!e||typeof e!="object"))return e},ae=({adapter:e,key:t})=>({clear:async()=>await e.removeItem(t),removeItem:async r=>{const s=await e.getItem(t),{[r]:a,...c}=x(s)??{};await e.setItem(t,c)},getItem:async r=>{const s=await e.getItem(t),a=x(s)??{};if(r in a)return a[r]},setItem:async(r,s)=>{const a=await e.getItem(t),c=x(a)??{};await e.setItem(t,{...c,[r]:s})}}),Y=({key:e}={})=>e?ae({adapter:Y(),key:e}):{clear:async()=>{localStorage.clear()},removeItem:async t=>{localStorage.removeItem(t)},getItem:async t=>{const r=localStorage.getItem(t);if(r)return JSON.parse(r)},setItem:async(t,r)=>{localStorage.setItem(t,JSON.stringify(r))}};class A extends n.BehaviorSubject{constructor(t){super(t.default),this.config=t}update=t=>{if(t===z)super.next(this.config.default);else if(typeof t=="function"){const r=t;super.next(r(this.value))}else super.next(t)};setValue=this.update.bind(this);get subject(){return this}get key(){return this.config.key}}class M{constructor(t){this.config=t}}function oe(e={}){return new A({key:void 0,...e,default:e.default??void 0})}function ce(e){return new M(e)}class ${signals=new n.BehaviorSubject(new Map);isDestroyed=!1;getOrCreateSignal(t){const r=this.signals.value.get(t);if(r)return r;const s=new A({...t.config,key:void 0});return this.signals.value.set(t,s),this.signals.next(this.signals.value),s}destroy(){this.signals.value.forEach(t=>{t.complete()}),this.signals.value.clear(),this.signals.complete(),this.isDestroyed=!0}}const Q=i.createContext(new $),ie=i.memo(({children:e})=>{const t=P(()=>new $),r=t.current,[s,a]=i.useState(!1);s&&(t.current=new $,a(!1));const c=r;return i.useEffect(()=>()=>{t.current?.destroy(),a(!0)},[t]),_.jsx(Q.Provider,{value:c,children:e})}),D=()=>i.useContext(Q),B=e=>{const t=D();return e?t.getOrCreateSignal(e):void 0};function le(e,t){if(e==null||t===void 0||typeof e!="object"||typeof t!="object")return e===t;if(e.constructor!==t?.constructor)return!1;const r=Object.keys(e),s=Object.keys(t);if(r.length!==s.length)return!1;for(const a of r)if(!t.hasOwnProperty(a)||e[a]!==t[a])return!1;return!0}const C="__reactjrx",fe=e=>{if(typeof e=="object"&&e!==null&&C in e&&e[C]===C)return e},ye=({adapter:e,config:t})=>{const{signal:r,version:s}=t,c={value:r.getValue(),[C]:C,migrationVersion:s};return process.env.NODE_ENV==="development"&&console.log("[reactjrx][state][persistance]:","Persist value",c,`for signal ${r.config.key}`),n.from(e.setItem(r.config.key,c)).pipe(n.catchError(o=>(console.error(o),n.of(null))))};function de({adapter:e,config:t}){const{hydrate:r=({value:c})=>c,signal:s,version:a}=t;return n.from(e.getItem(s.config.key)).pipe(n.switchMap(c=>{const o=fe(c);if(!o)return n.of(c);const l=typeof o.migrationVersion!="number",u=o.migrationVersion!==void 0&&a>o.migrationVersion;if(l||u||o.value===void 0)return n.of(c);const f=o.value;return process.env.NODE_ENV==="development"&&console.log("[reactjrx][state][persistance]:","Hydrate value",o,`for signal ${s.config.key}`),s.setValue(r({value:f,version:a})),n.of(c)}))}function pe({entries:e=[],onHydrated:t,adapter:r}){const a=(e.length===0?n.of([]):n.zip(...e.map(o=>de({adapter:r,config:o})))).pipe(n.tap(t),n.catchError(o=>(console.error("Unable to hydrate",o),n.EMPTY)),n.share()),c=a.pipe(n.switchMap(()=>n.merge(...e.map(o=>o.signal.pipe(n.throttleTime(500,n.asyncScheduler,{trailing:!0}),n.switchMap(()=>n.from(ye({adapter:r,config:o}))))))));return n.merge(a.pipe(n.map(()=>({type:"hydrated"}))),c.pipe(n.map(()=>({type:"persisted"}))))}function me({entries:e=[],onHydrated:t,adapter:r}){const s=v(t),a=R(r),c=R(e);return F(()=>a.pipe(n.switchMap(l=>l?n.merge(n.of({type:"reset"}),c.pipe(n.concatMap(u=>pe({adapter:l,entries:u,onHydrated:()=>{s.current?.()}})))):n.of({type:"reset"}))).pipe(n.scan((l,u)=>u.type==="reset"?{isHydrated:!1}:u.type==="hydrated"?{isHydrated:!0}:l,{isHydrated:!1})),{defaultValue:{isHydrated:!1},compareFn:le},[a,c])}function T(e){const t=D();if(e instanceof M&&!t)throw new Error("useSignalValue must be used within a SignalContextProvider");return B(e instanceof M?e:void 0)??e}function J(e){return T(e).update}const be=(e,t)=>e.length===t.length&&e.every((r,s)=>r===t[s]);function Se(e){return e!=null}const ge=typeof window>"u"||"Deno"in window;function U(e,t){return Math.min(e,t)}function G(e,t){return 2**e*t}function he(e){const{retry:t,retryDelay:r,retryAfterDelay:s,retryAfter:a=()=>n.of(!0)}=e,c=typeof t!="function"?t===!1?0:t===!0?Number.POSITIVE_INFINITY:t??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,o=typeof t=="function"?t:()=>!0,l=typeof r=="number"?r:100,u={...e},{maxInterval:f=Number.POSITIVE_INFINITY,resetOnSuccess:y=!1,backoffDelay:m=G}=u;return d=>n.defer(()=>{let b=0;const S=(p,g)=>p<c?o(p,g):!1;return d.pipe(h.catchError(p=>{if(b++,!S(b-1,p))throw p;const g=e.caughtError?.(b,p);if(!g)throw p;return g.pipe(h.mergeMap(w=>n.merge(n.of(w),n.throwError(()=>p))))}),h.retryWhen(p=>p.pipe(h.concatMap(g=>{const w=b-1;return a().pipe(h.first(),h.mergeMap(()=>S(w,g)?n.timer(U(m(w,l),f)).pipe(h.mergeMap(X=>s&&!s(w,g)?n.throwError(()=>g):n.of(X))):n.throwError(()=>g)))}))),h.catchError(p=>{if(e.catchError)return e.catchError(b,p);throw p}),h.tap(()=>{y&&(b=0)}))})}const W=e=>{i.useEffect(e,[])},ve=e=>{W(()=>{e()})},Ee=()=>{const e=P(()=>new n.ReplaySubject(1)),[t,r]=i.useState(!1);return t&&(e.current=new n.ReplaySubject(1),r(!1)),i.useEffect(()=>()=>{e.current.next(void 0),r(!0)},[e]),e.current};function j(e,t){const r=v(t),s=T(e);return F(()=>{const a=r.current??(o=>o);return s.pipe(n.map(a),n.distinctUntilChanged())},{defaultValue:t?t?.(s.value):s.value},[s])}function we(e){const t=T(e),r=j(e),s=J(e);return[r,s,t]}const Ce=e=>{const t=I(e);return[j(t),t]};exports.Context=O;exports.QueryClient$=H;exports.QueryClientProvider$=te;exports.SIGNAL_RESET=z;exports.Signal=A;exports.SignalContextProvider=ie;exports.SignalReactContext=Q;exports.SwitchMutationCancelError=V;exports.VirtualSignal=M;exports.arrayEqual=be;exports.createLocalStorageAdapter=Y;exports.createLocalforageAdapter=ue;exports.exponentialBackoffDelay=G;exports.getDelay=U;exports.isDefined=Se;exports.isPromiseLike=q;exports.isServer=ge;exports.retryBackoff=he;exports.signal=oe;exports.useConstant=I;exports.useContactMutation$=re;exports.useEffectOnce=W;exports.useLiveBehaviorSubject=R;exports.useLiveRef=v;exports.useMakeOrRetrieveSignal=B;exports.useMount=ve;exports.useMutation$=k;exports.useObservableState=Z;exports.useObserve=F;exports.usePersistSignals=me;exports.useQuery$=ne;exports.useQueryClient$=K;exports.useSetSignal=J;exports.useSignal=we;exports.useSignalContext=D;exports.useSignalState=Ce;exports.useSignalValue=j;exports.useSubscribe=L;exports.useSubscribeEffect=ee;exports.useSwitchMutation$=se;exports.useUnmountObservable=Ee;exports.virtualSignal=ce;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/lib/utils/isPromiseLike.ts","../src/lib/utils/makeObservable.ts","../src/lib/utils/react/useLiveRef.ts","../src/lib/binding/useObserve.ts","../src/lib/binding/useSubscribe.ts","../src/lib/utils/react/useRefOnce.ts","../src/lib/utils/react/useConstant.ts","../src/lib/binding/useObservableState.ts","../src/lib/binding/useLiveBehaviorSubject.ts","../src/lib/binding/useSubscribeEffect.ts","../src/lib/state/constants.ts","../src/lib/state/Signal.ts","../src/lib/utils/react/useUnmountObservable.ts","../src/lib/utils/react/useEffectOnce.ts","../src/lib/utils/react/useMount.ts","../src/lib/utils/operators/retryBackoff.ts","../src/lib/utils/isDefined.ts","../src/lib/utils/arrayEqual.ts","../src/lib/utils/isServer.ts","../src/lib/state/SignalContext.ts","../src/lib/state/react/SignalContextProvider.tsx","../src/lib/state/react/useSignalReference.ts","../src/lib/state/react/useSignalValue.ts","../src/lib/state/react/useSetSignal.ts","../src/lib/state/react/useSignal.ts","../src/lib/state/react/useSignalState.ts","../src/lib/state/persistance/adapters/createLocalforageAdapter.ts","../src/lib/state/persistance/adapters/createLocalStorageAdapter.ts","../src/lib/utils/shallowEqual.ts","../src/lib/state/persistance/constants.ts","../src/lib/state/persistance/helpers.ts","../src/lib/state/persistance/persistSignals.ts","../src/lib/state/react/usePersistSignals.tsx","../src/lib/queries/QueryClientProvider$.tsx","../src/lib/queries/useQuery$.ts","../src/lib/queries/useMutation$.ts","../src/lib/queries/useSwitchMutation$.ts","../src/lib/queries/useConcatMutation$.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport function isPromiseLike<T>(value: T): value is T & Promise<any> {\n return (\n value instanceof Promise ||\n (value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n typeof value.then === \"function\" &&\n \"catch\" in value &&\n value.catch === \"function\")\n )\n}\n","import { type Observable, defer, from, isObservable, of } from \"rxjs\"\nimport { isPromiseLike } from \"./isPromiseLike\"\n\ntype FnReturnToObservable<T> = T extends Observable<infer ObservedData>\n ? ObservedData\n : T extends Promise<infer ThenData>\n ? ThenData\n : T\n\nexport function makeObservable<Data>(\n fn: Observable<Data>,\n): () => Observable<Data>\n\nexport function makeObservable<Data>(fn: Promise<Data>): () => Observable<Data>\n\nexport function makeObservable<Data>(\n fn: Promise<Data> | Observable<Data>,\n): () => Observable<Data>\n\nexport function makeObservable<Data>(\n fn: () => Promise<Data> | Observable<Data>,\n): () => Observable<Data>\n\n/**\n * Generic factory\n */\nexport function makeObservable<Data>(\n fn: () => Promise<Data> | Observable<Data> | Data,\n): () => Observable<Data>\n\n/**\n * Generic factory\n */\nexport function makeObservable<Data, Params>(\n fn: (params: Params) => Data,\n): (params: Params) => Observable<FnReturnToObservable<Data>>\n\n/**\n * Generic factory OR Observable\n */\nexport function makeObservable<Data, Return>(\n fn: Observable<Data> | (() => Return),\n): () => Observable<Data | FnReturnToObservable<Return>>\n\nexport function makeObservable<Data>(fn: Data): () => Observable<Data>\n\n/**\n * Convert the input into an observable.\n *\n * - Observable: return the same observable\n * - Promise: return an observable from the promise\n * - Data: return an observable from the data\n * - Function: Execute the function and return an observable from the result\n */\nexport function makeObservable<Data, Params>(\n something:\n | ((params: Params) => Observable<Data>)\n | Promise<Data>\n | Observable<Data>\n | ((params: Params) => Promise<Data>)\n | ((params: Params) => Data)\n | Data,\n): (params: Params) => Observable<Data> {\n if (isObservable(something)) return () => something\n\n if (isPromiseLike(something)) return () => from(something)\n\n if (typeof something !== \"function\") return () => of(something)\n\n const somethingAsFunction = something as\n | ((params: Params) => Observable<Data>)\n | ((params: Params) => Promise<Data>)\n | ((params: Params) => Data)\n\n return (params: Params) =>\n defer(() => {\n const result = somethingAsFunction(params)\n\n if (isPromiseLike(result)) {\n return from(result)\n }\n\n if (isObservable(result)) {\n return result\n }\n\n return of(result)\n })\n}\n","import { useMemo, useRef } from \"react\"\n\nexport const useLiveRef = <T>(value: T) => {\n const ref = useRef(value)\n\n /**\n * We don't update the value on render because of potential\n * bug related to react concurrency mode.\n * We don't update the value in a useEffect because effects run after\n * render and we could maybe? have situation where the ref\n * is being called after render but before effect?\n * I am not sure of that one.\n *\n * `useMemo` is a good compromise since it runs during render but before\n * repaint. It prevents the concurrency mode issue.\n */\n useMemo(() => {\n ref.current = value\n }, [value])\n\n return ref\n}\n","import {\n type DependencyList,\n useCallback,\n useRef,\n useSyncExternalStore,\n} from \"react\"\nimport {\n type BehaviorSubject,\n EMPTY,\n type Observable,\n catchError,\n distinctUntilChanged,\n identity,\n startWith,\n tap,\n} from \"rxjs\"\nimport { makeObservable } from \"../utils/makeObservable\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\n\ninterface Option<R = undefined> {\n defaultValue: R\n unsubscribeOnUnmount?: boolean\n compareFn?: (a: R, b: R) => boolean\n}\n\nexport function useObserve<T>(source: BehaviorSubject<T>): T\n\nexport function useObserve<T>(source: Observable<T>): T | undefined\n\nexport function useObserve<T>(\n source: () => Observable<T>,\n deps: DependencyList,\n): T | undefined\n\nexport function useObserve<T>(\n source: () => Observable<T> | undefined,\n deps: DependencyList,\n): T | undefined\n\nexport function useObserve<T>(source: Observable<T>, options: Option<T>): T\n\nexport function useObserve<T>(\n source: () => Observable<T>,\n options: Option<T>,\n deps: DependencyList,\n): T\n\nexport function useObserve<T>(\n source$: Observable<T> | (() => Observable<T> | undefined),\n optionsOrDeps?: Option<T> | DependencyList,\n maybeDeps?: DependencyList,\n): T {\n const options =\n optionsOrDeps != null && !Array.isArray(optionsOrDeps)\n ? (optionsOrDeps as Option<T>)\n : ({\n defaultValue: undefined,\n unsubscribeOnUnmount: true,\n compareFn: undefined,\n } satisfies Option<undefined>)\n const deps =\n !maybeDeps && Array.isArray(optionsOrDeps)\n ? optionsOrDeps\n : typeof source$ === \"function\"\n ? (maybeDeps ?? [])\n : [source$]\n const valueRef = useRef(\n \"getValue\" in source$ && typeof source$.getValue === \"function\"\n ? source$.getValue()\n : options.defaultValue,\n )\n const sourceRef = useLiveRef(source$)\n const optionsRef = useLiveRef(options)\n\n const getSnapshot = useCallback(() => {\n return valueRef.current\n }, [])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>\n const subscribe = useCallback(\n (next: () => void) => {\n const source = sourceRef.current\n\n const sub = makeObservable(source)()\n .pipe(\n optionsRef.current.defaultValue\n ? startWith(optionsRef.current.defaultValue)\n : identity,\n /**\n * @important there is already a Object.is comparison in place from react\n * so we only add a custom compareFn if provided\n */\n distinctUntilChanged((a, b) => {\n if (optionsRef.current.compareFn) {\n if (a === undefined || b === undefined) return false\n\n return optionsRef.current.compareFn(a, b)\n }\n\n return false\n }),\n tap((value) => {\n valueRef.current = value\n }),\n catchError((error) => {\n console.error(error)\n\n return EMPTY\n }),\n )\n .subscribe(next)\n\n return () => {\n if (optionsRef.current.unsubscribeOnUnmount === false) return\n\n sub.unsubscribe()\n }\n },\n [...deps],\n )\n\n const result = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return result as T\n}\n","import { type DependencyList, useEffect } from \"react\"\nimport { EMPTY, catchError } from \"rxjs\"\nimport { makeObservable } from \"../utils/makeObservable\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\nimport type { SubscribeSource } from \"./types\"\n\nexport function useSubscribe<T>(\n source: SubscribeSource<T> | (() => T),\n deps: DependencyList = [],\n) {\n const sourceRef = useLiveRef(source)\n\n useEffect(() => {\n const sub = makeObservable(sourceRef.current)()\n .pipe(\n catchError((error) => {\n console.error(error)\n\n return EMPTY\n }),\n )\n .subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }, [...deps, sourceRef])\n}\n","import { useEffect, useRef } from \"react\"\n\nexport const useRefOnce = <T>(fn: () => T) => {\n const ref = useRef<T>(undefined)\n\n if (!ref.current) {\n ref.current = fn()\n }\n\n useEffect(() => {\n /**\n * Because strict mode keep reference to the same ref when the component\n * is re-mounted we force a rewrite here to prevent weird behavior.\n * I don't know why react does that since it is I believe technically\n * wrong. useRef should persist across re-render, not re-mount.\n *\n * @important\n * The downside is that during dev the factory will be called again every\n * mount.\n */\n if (process.env.NODE_ENV === \"development\") {\n // ref.current = fn();\n }\n }, [])\n\n return ref as { current: T }\n}\n","import { useRefOnce } from \"./useRefOnce\"\n\nexport const useConstant = <T>(fn: () => T) => {\n const ref = useRefOnce(fn)\n\n return ref.current\n}\n","import { useCallback } from \"react\"\nimport { BehaviorSubject, type Observable } from \"rxjs\"\nimport { useConstant } from \"../utils/react/useConstant\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\n\n/**\n * If you need to represent some piece of state as an observable and also want the ability to change\n * this state during the lifetime of the component, useObservableState\n * is for you. It acts like React.useState(), only that\n * it returns an observable representing changes to the\n * value instead of the value itself. The callback/setter\n * returned acts like a the regular callback you\n * would otherwise get from React.useState. This is useful when you want\n * to compose the state change together with other observables.\n *\n * @important\n * The last array value is the value itself in case\n * you need a direct reference to the value\n */\nexport const useObservableState = <T>(\n defaultValue: T,\n): [Observable<T>, (value: T) => void, T] => {\n const subject = useConstant(() => new BehaviorSubject(defaultValue))\n\n const subject$ = useLiveRef(subject)\n\n const setState = useCallback(\n (value: T) => {\n subject.next(value)\n },\n [subject],\n )\n\n return [subject$.current, setState, subject.getValue()]\n}\n","import { useEffect } from \"react\"\nimport { BehaviorSubject } from \"rxjs\"\nimport { useConstant } from \"../utils/react/useConstant\"\n\nexport const useLiveBehaviorSubject = <S>(state: S) => {\n const subject = useConstant(() => new BehaviorSubject(state))\n\n useEffect(() => {\n subject.next(state)\n }, [state, subject])\n\n return subject\n}\n","import { type DependencyList, useCallback } from \"react\"\nimport { catchError, identity, retry } from \"rxjs\"\nimport { makeObservable } from \"../utils/makeObservable\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\nimport type { SubscribeSource } from \"./types\"\nimport { useSubscribe } from \"./useSubscribe\"\n\ninterface Option {\n retry?: boolean\n onError?: (error: unknown) => void\n}\n\nexport function useSubscribeEffect<T>(source: SubscribeSource<T>): void\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n options: Option,\n): void\n\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n deps: DependencyList,\n): void\n\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n options: Option,\n deps: DependencyList,\n): void\n\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n unsafeOptions?: Option | DependencyList,\n deps: DependencyList = [],\n) {\n const options =\n unsafeOptions != null && !Array.isArray(unsafeOptions)\n ? (unsafeOptions as Option)\n : ({} satisfies Option)\n const retryOption = options.retry ?? true\n const onErrorRef = useLiveRef(\n options.onError ??\n ((error: unknown) => {\n console.error(error)\n }),\n )\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: <explanation>\n const sourceAsObservable = useCallback(() => makeObservable(source)(), deps)\n\n const enhancerMakeObservable = useCallback(\n () =>\n sourceAsObservable().pipe(\n catchError((error) => {\n onErrorRef.current(error)\n\n throw error\n }),\n retryOption ? retry() : identity,\n ),\n [sourceAsObservable, retryOption, onErrorRef],\n )\n\n useSubscribe(enhancerMakeObservable, deps)\n}\n","export const SIGNAL_RESET = Symbol(\"SIGNAL_RESET\")\n","import { BehaviorSubject } from \"rxjs\"\nimport { SIGNAL_RESET } from \"./constants\"\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport type SignalValue<T extends Signal<any, any>> = T[\"value\"]\n\nexport type SignalWithKey<T> = Signal<T> & {\n key: string\n}\n\nexport class Signal<\n T,\n K extends string | undefined = undefined,\n> extends BehaviorSubject<T> {\n constructor(\n public config: {\n default: T\n key: K\n },\n ) {\n super(config.default)\n }\n\n update = (\n valueOrUpdater:\n | ((prev: T) => T)\n // biome-ignore lint/complexity/noBannedTypes: <explanation>\n | (T extends Function ? never : T)\n | typeof SIGNAL_RESET,\n ): void => {\n if (valueOrUpdater === SIGNAL_RESET) {\n super.next(this.config.default)\n } else if (typeof valueOrUpdater === \"function\") {\n const updater = valueOrUpdater as (prev: T) => T\n\n super.next(updater(this.value))\n } else {\n super.next(valueOrUpdater as T)\n }\n }\n\n /**\n * @deprecated Use `next` instead\n */\n setValue = this.update.bind(this)\n\n /**\n * @deprecated Use `this` instead\n */\n get subject() {\n return this\n }\n\n get key() {\n return this.config.key\n }\n}\n\nexport class VirtualSignal<T> {\n constructor(public config: { default: T }) {}\n}\n// biome-ignore lint/complexity/noBannedTypes: <explanation>\nexport function signal(config: {}): Signal<undefined, undefined>\n\nexport function signal<T = undefined, K extends string = string>(config: {\n key: K\n}): Signal<T | undefined, K>\n\nexport function signal<T, K extends string = string>(config: {\n key: K\n default: T\n}): Signal<T, K>\n\nexport function signal<T>(config: {\n key?: undefined\n}): Signal<T | undefined, undefined>\n\nexport function signal<T>(config: {\n key?: undefined\n default: T\n}): Signal<T, undefined>\n\nexport function signal<K extends string>(config: {\n key: K\n default?: undefined\n}): Signal<undefined, K>\n\nexport function signal<T, K extends string | undefined = undefined>(\n config: { default?: T; key?: K } = {},\n) {\n return new Signal({\n key: undefined,\n ...config,\n default: config.default ?? undefined,\n })\n}\n\nexport function virtualSignal<T>(config: {\n default: T\n key?: string\n}): VirtualSignal<T> {\n return new VirtualSignal(config)\n}\n","import { useEffect, useState } from \"react\"\nimport { ReplaySubject } from \"rxjs\"\nimport { useRefOnce } from \"./useRefOnce\"\n\nexport const useUnmountObservable = () => {\n const replaySubject = useRefOnce(() => new ReplaySubject(1))\n const [completed, setCompleted] = useState(false)\n\n if (completed) {\n replaySubject.current = new ReplaySubject(1)\n setCompleted(false)\n }\n\n useEffect(() => {\n return () => {\n replaySubject.current.next(undefined)\n setCompleted(true)\n }\n }, [replaySubject])\n\n return replaySubject.current\n}\n","import { type EffectCallback, useEffect } from \"react\"\n\nexport const useEffectOnce = (effect: EffectCallback) => {\n useEffect(effect, [])\n}\n","import { useEffectOnce } from \"./useEffectOnce\"\n\nexport const useMount = (fn: () => void) => {\n useEffectOnce(() => {\n fn()\n })\n}\n","import { type Observable, defer, merge, of, throwError, timer } from \"rxjs\"\nimport {\n catchError,\n concatMap,\n first,\n mergeMap,\n retryWhen,\n tap,\n} from \"rxjs/operators\"\n\nexport interface RetryBackoffConfig<T, TError> {\n // Initial interval. It will eventually go as high as maxInterval.\n initialInterval?: number\n // Maximum delay between retries.\n maxInterval?: number\n // When set to `true` every successful emission will reset the delay and the\n // error count.\n resetOnSuccess?: boolean\n retry?: (attempt: number, error: TError) => boolean\n retryAfterDelay?: (attempt: number, error: TError) => boolean\n // Can be used to delay the retry (outside of backoff process)\n // for example if you want to pause retry due to connectivity issue\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n retryAfter?: () => Observable<any>\n retryDelay?: number | ((attempt: number, error: TError) => number)\n // Conditional retry.\n // shouldRetry?: (attempt: number, error: any) => Observable<boolean>\n backoffDelay?: (iteration: number, initialInterval: number) => number\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n caughtError?: (attempt: number, error: any) => undefined | Observable<T>\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n catchError?: (attempt: number, error: any) => Observable<T>\n}\n\n/** Calculates the actual delay which can be limited by maxInterval */\nexport function getDelay(backoffDelay: number, maxInterval: number) {\n return Math.min(backoffDelay, maxInterval)\n}\n\n/** Exponential backoff delay */\nexport function exponentialBackoffDelay(\n iteration: number,\n initialInterval: number,\n) {\n return 2 ** iteration * initialInterval\n}\n\n/**\n * Returns an Observable that mirrors the source Observable with the exception\n * of an error. If the source Observable calls error, rather than propagating\n * the error call this method will resubscribe to the source Observable with\n * exponentially increasing interval and up to a maximum of count\n * re-subscriptions (if provided). Retrying can be cancelled at any point if\n * shouldRetry returns false.\n */\nexport function retryBackoff<T, TError>(config: RetryBackoffConfig<T, TError>) {\n const {\n retry,\n retryDelay,\n retryAfterDelay,\n retryAfter = () => of(true),\n } = config\n\n const maxRetries =\n typeof retry !== \"function\"\n ? retry === false\n ? 0\n : retry === true\n ? Number.POSITIVE_INFINITY\n : (retry ?? Number.POSITIVE_INFINITY)\n : Number.POSITIVE_INFINITY\n\n const shouldRetry =\n typeof retry === \"function\"\n ? // ? (attempt: number, error: TError) => of(retry(attempt, error))\n retry\n : () => true\n\n const initialInterval = typeof retryDelay === \"number\" ? retryDelay : 100\n\n const normalizedConfig = {\n shouldRetry,\n ...config,\n }\n\n const {\n maxInterval = Number.POSITIVE_INFINITY,\n resetOnSuccess = false,\n backoffDelay = exponentialBackoffDelay,\n } = normalizedConfig\n\n return <T>(source: Observable<T>) =>\n defer(() => {\n let caughtErrors = 0\n\n const shouldRetryFn = (attempt: number, error: TError) =>\n attempt < maxRetries ? shouldRetry(attempt, error) : false\n\n return source.pipe(\n catchError<T, Observable<T>>((error) => {\n caughtErrors++\n\n if (!shouldRetryFn(caughtErrors - 1, error)) throw error\n\n const caughtErrorResult$ = config.caughtError?.(caughtErrors, error)\n\n if (!caughtErrorResult$) throw error\n\n return caughtErrorResult$.pipe(\n mergeMap((source) =>\n merge(\n of(source) as unknown as Observable<T>,\n throwError(() => error),\n ),\n ),\n )\n }),\n retryWhen<T>((errors) => {\n return errors.pipe(\n concatMap((error) => {\n const attempt = caughtErrors - 1\n\n return retryAfter().pipe(\n first(),\n mergeMap(() =>\n shouldRetryFn(attempt, error)\n ? timer(\n getDelay(\n backoffDelay(attempt, initialInterval),\n maxInterval,\n ),\n ).pipe(\n mergeMap((timer) => {\n if (\n retryAfterDelay &&\n !retryAfterDelay(attempt, error)\n )\n return throwError(() => error)\n\n return of(timer)\n }),\n )\n : throwError(() => error),\n ),\n )\n }),\n )\n }),\n catchError((e) => {\n if (config.catchError) {\n return config.catchError(caughtErrors, e)\n }\n\n throw e\n }),\n tap(() => {\n if (resetOnSuccess) {\n caughtErrors = 0\n }\n }),\n )\n })\n}\n","export function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n","// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport const arrayEqual = <A extends any[], B extends any[]>(a: A, b: B) =>\n a.length === b.length && a.every((v, i) => v === b[i])\n","export const isServer = typeof window === \"undefined\" || \"Deno\" in window\n","import { BehaviorSubject } from \"rxjs\"\nimport { Signal, type VirtualSignal } from \"./Signal\"\n\nexport class SignalContext {\n /**\n * items only get added as they are created. The only time we should cleanup\n * are on context destroy. This is to ensure later re-use of virtual signals\n * return the same persisted state.\n */\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n signals = new BehaviorSubject(new Map<VirtualSignal<unknown>, Signal<any>>())\n\n public isDestroyed = false\n\n getOrCreateSignal<T>(virtualSignal: VirtualSignal<T>): Signal<T> {\n const existingSignal = this.signals.value.get(virtualSignal)\n\n if (existingSignal) {\n return existingSignal as Signal<T>\n }\n\n const newSignal = new Signal<T>({ ...virtualSignal.config, key: undefined })\n\n this.signals.value.set(virtualSignal, newSignal)\n this.signals.next(this.signals.value)\n\n return newSignal\n }\n\n destroy() {\n this.signals.value.forEach((signal) => {\n signal.complete()\n })\n this.signals.value.clear()\n this.signals.complete()\n this.isDestroyed = true\n }\n}\n","import { createContext, memo, useContext, useEffect, useState } from \"react\"\nimport { useRefOnce } from \"../../utils/react/useRefOnce\"\nimport type { VirtualSignal } from \"../Signal\"\nimport { SignalContext } from \"../SignalContext\"\n\nexport type SignalContextType = SignalContext\n\nexport const SignalReactContext = createContext<SignalContextType>(\n new SignalContext(),\n)\n\nexport const SignalContextProvider = memo(\n ({ children }: { children: React.ReactNode }) => {\n const signalContextRef = useRefOnce<SignalContextType>(\n () => new SignalContext(),\n )\n const signalContext = signalContextRef.current\n const [isDestroyed, setIsDestroyed] = useState(false)\n\n if (isDestroyed) {\n signalContextRef.current = new SignalContext()\n setIsDestroyed(false)\n }\n\n const value = signalContext\n\n useEffect(() => {\n return () => {\n signalContextRef.current?.destroy()\n // force re-render\n setIsDestroyed(true)\n }\n }, [signalContextRef])\n\n return (\n <SignalReactContext.Provider value={value}>\n {children}\n </SignalReactContext.Provider>\n )\n },\n)\n\nexport const useSignalContext = () => {\n const value = useContext(SignalReactContext)\n\n return value\n}\n\nexport const useMakeOrRetrieveSignal = (\n virtualSignal?: VirtualSignal<unknown>,\n) => {\n const signalContext = useSignalContext()\n\n const signal = virtualSignal\n ? signalContext.getOrCreateSignal(virtualSignal)\n : undefined\n\n return signal\n}\n","import { type Signal, VirtualSignal } from \"../Signal\"\nimport {\n useMakeOrRetrieveSignal,\n useSignalContext,\n} from \"./SignalContextProvider\"\n\nexport function useSignalReference<T>(\n signal: Signal<T> | VirtualSignal<T>,\n): Signal<T> {\n const signalContext = useSignalContext()\n\n if (signal instanceof VirtualSignal && !signalContext) {\n throw new Error(\n \"useSignalValue must be used within a SignalContextProvider\",\n )\n }\n\n return (useMakeOrRetrieveSignal(\n signal instanceof VirtualSignal ? signal : undefined,\n ) ?? signal) as Signal<T>\n}\n","import { distinctUntilChanged, map } from \"rxjs\"\nimport { useObserve } from \"../../binding/useObserve\"\nimport { useLiveRef } from \"../../utils\"\nimport type { Signal, VirtualSignal } from \"../Signal\"\nimport { useSignalReference } from \"./useSignalReference\"\n\nexport function useSignalValue<T>(signal: VirtualSignal<T>): T\n\nexport function useSignalValue<T, SelectValue>(\n signal: VirtualSignal<T>,\n selector: (value: T) => SelectValue,\n): SelectValue\n\nexport function useSignalValue<T>(signal: Signal<T>): T\n\nexport function useSignalValue<T, SelectValue>(\n signal: Signal<T>,\n selector: (value: T) => SelectValue,\n): SelectValue\n\nexport function useSignalValue<T, SelectValue>(\n signal: Signal<T>,\n selector: (value: T) => SelectValue,\n): SelectValue | undefined\n\nexport function useSignalValue(\n signal: Signal<unknown> | VirtualSignal<unknown>,\n selector?: (value: unknown) => unknown,\n) {\n const selectorRef = useLiveRef(selector)\n\n const finalSignal = useSignalReference(signal)\n\n return useObserve(\n () => {\n const defaultSelector = selectorRef.current ?? ((value: unknown) => value)\n\n const observed$ = finalSignal.pipe(\n map(defaultSelector),\n distinctUntilChanged(),\n )\n\n return observed$\n },\n {\n defaultValue: selector\n ? selector?.(finalSignal.value)\n : finalSignal.value,\n },\n [finalSignal],\n )\n}\n","import type { Signal, VirtualSignal } from \"../Signal\"\nimport { useSignalReference } from \"./useSignalReference\"\n\nexport function useSetSignal<T>(signal: Signal<T>): Signal<T>[\"update\"]\nexport function useSetSignal<T>(signal: VirtualSignal<T>): Signal<T>[\"update\"]\nexport function useSetSignal<T>(signal: Signal<T> | VirtualSignal<T>) {\n const finalSignal = useSignalReference(signal)\n\n return finalSignal.update\n}\n","import type { Signal, VirtualSignal } from \"../Signal\"\nimport { useSetSignal } from \"./useSetSignal\"\nimport { useSignalReference } from \"./useSignalReference\"\nimport { useSignalValue } from \"./useSignalValue\"\n\nexport function useSignal<T>(\n signal: VirtualSignal<T>,\n): [T, Signal<T>[\"update\"], Signal<T>]\n\nexport function useSignal<T>(\n signal: Signal<T>,\n): [T, Signal<T>[\"update\"], Signal<T>]\n\nexport function useSignal<T>(\n signal: Signal<T>,\n): [T | undefined, Signal<T>[\"update\"], Signal<T>]\n\nexport function useSignal<T>(signal: Signal<T> | VirtualSignal<T>) {\n const finalSignal = useSignalReference(signal)\n const value = useSignalValue(signal)\n const setValue = useSetSignal(signal)\n\n return [value, setValue, finalSignal] as const\n}\n","import { useConstant } from \"../../utils\"\nimport type { Signal } from \"../Signal\"\nimport { useSignalValue } from \"./useSignalValue\"\n\n// biome-ignore lint/suspicious/noExplicitAny: <explanation>\nexport const useSignalState = <S extends Signal<any, any>>(\n fn: () => S,\n): [S[\"value\"], S] => {\n const signal = useConstant(fn)\n const value = useSignalValue(signal)\n\n return [value, signal] as const\n}\n","import type { Adapter } from \"./Adapter\"\n\nexport const createLocalforageAdapter = (forage: {\n getItem: (key: string) => Promise<string | null>\n setItem: (key: string, value: string) => Promise<string>\n}): Adapter => ({\n getItem: async (key: string) => {\n const serializedValue = await forage.getItem(key)\n\n if (!serializedValue) return undefined\n\n return JSON.parse(serializedValue)\n },\n\n setItem: async (key: string, value: unknown) => {\n await forage.setItem(key, JSON.stringify(value))\n },\n\n removeItem: async (_: string) => {},\n\n clear: async () => {},\n})\n","import type { Adapter } from \"./Adapter\"\n\nconst normalizeStore = (store: unknown) => {\n if (!store || typeof store !== \"object\") {\n return undefined\n }\n\n return store\n}\n\n/**\n * Create an adapter which use one unique store entry to store all\n * state. When using many signals it can help with maintenance to keep things\n * tidy.\n */\nconst createSharedStoreAdapter = ({\n adapter,\n key,\n}: {\n adapter: Adapter\n key: string\n}): Adapter => ({\n clear: async () => {\n return await adapter.removeItem(key)\n },\n\n removeItem: async (keyToDelete) => {\n const unsafeStore = await adapter.getItem(key)\n const { [keyToDelete]: toRemove, ...rest } =\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n normalizeStore(unsafeStore) ?? ({} as any)\n\n await adapter.setItem(key, rest)\n },\n\n getItem: async (itemKey: string) => {\n const unsafeStore = await adapter.getItem(key)\n const store = normalizeStore(unsafeStore) ?? {}\n\n if (itemKey in store) {\n return store[itemKey as keyof typeof store]\n }\n\n return undefined\n },\n\n setItem: async (itemKey: string, value: unknown) => {\n const unsafeStore = await adapter.getItem(key)\n const store = normalizeStore(unsafeStore) ?? {}\n\n await adapter.setItem(key, { ...store, [itemKey]: value })\n },\n})\n\nexport const createLocalStorageAdapter = ({\n key,\n}: { key?: string } = {}): Adapter => {\n if (key) {\n return createSharedStoreAdapter({\n adapter: createLocalStorageAdapter(),\n key,\n })\n }\n\n return {\n clear: async () => {\n localStorage.clear()\n },\n\n removeItem: async (key) => {\n localStorage.removeItem(key)\n },\n\n getItem: async (key) => {\n const serializedValue = localStorage.getItem(key)\n\n if (!serializedValue) return undefined\n\n return JSON.parse(serializedValue)\n },\n\n setItem: async (key, value) => {\n localStorage.setItem(key, JSON.stringify(value))\n },\n }\n}\n","export function isShallowEqual<A, B>(objA: A, objB: B): boolean {\n // Check if both objects are null or undefined\n if (objA === null || objA === undefined || objB === undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n return (objA as any) === (objB as any)\n }\n\n // Check if both objects are primitives\n if (typeof objA !== \"object\" || typeof objB !== \"object\") {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n return (objA as any) === (objB as any)\n }\n\n // Check if both objects have the same prototype\n if (objA.constructor !== objB?.constructor) {\n return false\n }\n\n // Check if both objects have the same keys\n const keysA = Object.keys(objA) as Array<keyof A>\n const keysB = Object.keys(objB) as Array<keyof A>\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n // Check if the values of the keys are equal\n for (const key of keysA) {\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n if (!objB.hasOwnProperty(key) || objA[key] !== (objB as any)[key]) {\n return false\n }\n }\n\n // If all checks pass, the objects are considered shallowly equal\n return true\n}\n","export const IDENTIFIER_PERSISTANCE_KEY = \"__reactjrx\"\n","import { catchError, from, of, switchMap } from \"rxjs\"\nimport type { Adapter } from \"./adapters/Adapter\"\nimport { IDENTIFIER_PERSISTANCE_KEY } from \"./constants\"\nimport type { PersistanceEntry, SignalPersistenceConfig } from \"./types\"\n\nexport const getNormalizedPersistanceValue = (unknownValue: unknown) => {\n if (\n typeof unknownValue === \"object\" &&\n unknownValue !== null &&\n IDENTIFIER_PERSISTANCE_KEY in unknownValue &&\n unknownValue[IDENTIFIER_PERSISTANCE_KEY] === IDENTIFIER_PERSISTANCE_KEY\n ) {\n return unknownValue as PersistanceEntry\n }\n\n return undefined\n}\n\nexport const persistValue = ({\n adapter,\n config,\n}: {\n adapter: Adapter\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n config: SignalPersistenceConfig<any>\n}) => {\n const { signal, version } = config\n const state = signal.getValue()\n\n const value = {\n value: state,\n [IDENTIFIER_PERSISTANCE_KEY]: IDENTIFIER_PERSISTANCE_KEY,\n migrationVersion: version,\n } satisfies PersistanceEntry\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n \"[reactjrx][state][persistance]:\",\n \"Persist value\",\n value,\n `for signal ${signal.config.key}`,\n )\n }\n\n return from(adapter.setItem(signal.config.key, value)).pipe(\n catchError((e) => {\n console.error(e)\n\n return of(null)\n }),\n )\n}\n\nexport function hydrateValueToSignal({\n adapter,\n config,\n}: {\n adapter: Adapter\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n config: SignalPersistenceConfig<any>\n}) {\n const { hydrate = ({ value }) => value, signal, version } = config\n\n return from(adapter.getItem(signal.config.key)).pipe(\n switchMap((value) => {\n const normalizedValue = getNormalizedPersistanceValue(value)\n\n if (!normalizedValue) return of(value)\n\n const storedVersionIsInvalid =\n typeof normalizedValue.migrationVersion !== \"number\"\n\n const signalVersionIsSuperior =\n normalizedValue.migrationVersion !== undefined &&\n version > normalizedValue.migrationVersion\n\n if (\n storedVersionIsInvalid ||\n signalVersionIsSuperior ||\n normalizedValue.value === undefined\n ) {\n return of(value)\n }\n\n const correctVersionValue = normalizedValue.value\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n \"[reactjrx][state][persistance]:\",\n \"Hydrate value\",\n normalizedValue,\n `for signal ${signal.config.key}`,\n )\n }\n\n signal.setValue(hydrate({ value: correctVersionValue, version }))\n\n return of(value)\n }),\n )\n}\n","import {\n EMPTY,\n asyncScheduler,\n catchError,\n from,\n map,\n merge,\n of,\n share,\n switchMap,\n tap,\n throttleTime,\n zip,\n} from \"rxjs\"\nimport type { Signal } from \"../Signal\"\nimport type { Adapter } from \"./adapters/Adapter\"\nimport { hydrateValueToSignal, persistValue } from \"./helpers\"\nimport type { SignalPersistenceConfig } from \"./types\"\n\nexport function persistSignals({\n entries = [],\n onHydrated,\n adapter,\n}: {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n entries: Array<SignalPersistenceConfig<Signal<any, string>>>\n /**\n * Triggered after first successful hydrate\n */\n onHydrated?: () => void\n /**\n * Requires a stable instance otherwise the hydration\n * process will start again. This is useful when you\n * need to change adapter during runtime.\n */\n adapter: Adapter\n}) {\n const signalsHydrated$ =\n entries.length === 0\n ? of([])\n : zip(\n ...entries.map((config) =>\n hydrateValueToSignal({\n adapter,\n config,\n }),\n ),\n )\n\n const isHydrated$ = signalsHydrated$.pipe(\n tap(onHydrated),\n catchError((error) => {\n console.error(\"Unable to hydrate\", error)\n\n return EMPTY\n }),\n share(),\n )\n\n /**\n * Start persisting to the current adapter\n * as soon as signals are hydrated. Will stop\n * whenever hydration process starts again\n */\n const persisted$ = isHydrated$.pipe(\n switchMap(() =>\n merge(\n ...entries.map((config) =>\n config.signal.pipe(\n throttleTime(500, asyncScheduler, {\n trailing: true,\n }),\n switchMap(() =>\n from(\n persistValue({\n adapter,\n config,\n }),\n ),\n ),\n ),\n ),\n ),\n ),\n )\n\n return merge(\n isHydrated$.pipe(\n map(() => ({\n type: \"hydrated\" as const,\n })),\n ),\n persisted$.pipe(\n map(() => ({\n type: \"persisted\" as const,\n })),\n ),\n )\n}\n","import { concatMap, merge, of, scan, switchMap } from \"rxjs\"\nimport { useLiveBehaviorSubject } from \"../../binding/useLiveBehaviorSubject\"\nimport { useObserve } from \"../../binding/useObserve\"\nimport { useLiveRef } from \"../../utils/react/useLiveRef\"\nimport { isShallowEqual } from \"../../utils/shallowEqual\"\nimport type { Adapter } from \"../persistance/adapters/Adapter\"\nimport { persistSignals } from \"../persistance/persistSignals\"\nimport type { SignalPersistenceConfig } from \"../persistance/types\"\n\n/**\n * Make sure to pass stable reference of entries and adapter if you don't\n * intentionally want to start over the process.\n *\n * `isHydrated` will be `true` after the first successful hydration. This value\n * will be reset as soon as the adapter reference changes.\n */\nexport function usePersistSignals({\n entries = [],\n onHydrated,\n adapter,\n}: {\n /**\n * Passing a new list of entries will start over the process\n * once the current one is finished. Use a stable reference to avoid\n * inifite loop.\n */\n\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n entries?: Array<SignalPersistenceConfig<any>>\n /**\n * Triggered after first successful hydrate\n */\n onHydrated?: () => void\n /**\n * Passing a new adapter reference will start over the process\n * once the current one is finished. Use a stable reference to avoid\n * inifite loop.\n */\n adapter?: Adapter\n}): { isHydrated: boolean } {\n const onHydratedRef = useLiveRef(onHydrated)\n const adapterSubject = useLiveBehaviorSubject(adapter)\n const entriesSubject = useLiveBehaviorSubject(entries)\n\n return useObserve(\n () => {\n const persistence$ = adapterSubject.pipe(\n switchMap((adapter) => {\n if (!adapter) return of({ type: \"reset\" })\n\n return merge(\n of({ type: \"reset\" }),\n entriesSubject.pipe(\n concatMap((entries) =>\n persistSignals({\n adapter,\n entries,\n onHydrated: () => {\n onHydratedRef.current?.()\n },\n }),\n ),\n ),\n )\n }),\n )\n\n return persistence$.pipe(\n scan(\n (acc, event) => {\n if (event.type === \"reset\") return { isHydrated: false }\n if (event.type === \"hydrated\") return { isHydrated: true }\n\n return acc\n },\n { isHydrated: false as boolean },\n ),\n )\n },\n { defaultValue: { isHydrated: false }, compareFn: isShallowEqual },\n [adapterSubject, entriesSubject],\n )\n}\n","import { type QueryKey, hashKey } from \"@tanstack/react-query\"\nimport { createContext, memo, useContext, useEffect, useState } from \"react\"\nimport {\n type Observable,\n type Subscription,\n fromEvent,\n share,\n takeUntil,\n} from \"rxjs\"\n\ntype CacheEntry = {\n query$: Observable<unknown>\n signal: AbortSignal\n sub: Subscription | undefined\n isCompleted: boolean\n lastData: { value: unknown } | undefined\n}\n\nexport class QueryClient$ {\n public readonly queryMap: Map<string, CacheEntry> = new Map()\n\n getQuery(queryHash: string) {\n return this.queryMap.get(queryHash)\n }\n\n setQuery(\n queryKey: QueryKey,\n query$: Observable<unknown>,\n signal: AbortSignal,\n ) {\n const queryHash = hashKey(queryKey)\n\n const sharedQuery$ = query$.pipe(\n /**\n * abort signal is triggered on:\n * - manual cancellation from user\n * - unmounting the component\n * @see https://tanstack.com/query/latest/docs/framework/react/guides/query-cancellation\n */\n takeUntil(fromEvent(signal, \"abort\")),\n share(),\n )\n\n const cacheEntry: CacheEntry = {\n query$: sharedQuery$,\n signal,\n sub: undefined,\n isCompleted: false,\n lastData: undefined,\n }\n\n this.queryMap.set(queryHash, cacheEntry)\n\n const sub = sharedQuery$.subscribe({\n next: (data) => {\n const entry = this.queryMap.get(queryHash)\n\n if (entry) {\n entry.lastData = { value: data }\n }\n },\n complete: () => {\n this.deleteQuery(queryHash)\n },\n })\n\n cacheEntry.sub = sub\n\n return cacheEntry\n }\n\n deleteQuery(queryHash: string) {\n const entry = this.queryMap.get(queryHash)\n\n if (!entry) return\n\n if (entry.sub) {\n entry.sub.unsubscribe()\n entry.sub = undefined\n }\n\n entry.isCompleted = true\n\n this.queryMap.delete(queryHash)\n }\n\n destroy() {\n this.queryMap.forEach((_, key) => {\n this.deleteQuery(key)\n })\n }\n}\n\nexport const Context = createContext<QueryClient$ | undefined>(undefined)\n\nexport const QueryClientProvider$ = memo(\n ({\n children,\n client: _client,\n }: {\n children: React.ReactNode\n client?: QueryClient$\n }) => {\n const [client] = useState(() => _client ?? new QueryClient$())\n\n useEffect(() => {\n return () => {\n client.destroy()\n }\n }, [client])\n\n return <Context.Provider value={client}>{children}</Context.Provider>\n },\n)\n\nexport const useQueryClient$ = () => {\n const client = useContext(Context)\n\n if (!client) {\n throw new Error(\n \"useReactJrxQueryClient must be used within a ReactJrxQueryProvider\",\n )\n }\n\n return client\n}\n","import {\n type DefaultError,\n type QueryClient,\n type QueryFunctionContext,\n type QueryKey,\n type UseQueryOptions,\n hashKey,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\"\nimport { type Observable, defer, delay, take } from \"rxjs\"\nimport { useQueryClient$ } from \"./QueryClientProvider$\"\n\nexport function useQuery$<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: Omit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n \"queryFn\"\n > & {\n queryFn:\n | ((context: QueryFunctionContext<TQueryKey>) => Observable<TQueryFnData>)\n | Observable<TQueryFnData>\n },\n queryClient?: QueryClient,\n) {\n const _queryClient = useQueryClient(queryClient)\n const queryClient$ = useQueryClient$()\n\n const queryFnAsync = (context: QueryFunctionContext<TQueryKey>) => {\n return new Promise<TQueryFnData>((resolve, reject) => {\n const getSource = () =>\n defer(() =>\n typeof options.queryFn === \"function\"\n ? options.queryFn(context)\n : options.queryFn,\n )\n\n const queryHash = hashKey(context.queryKey)\n\n const queryAlreadyInCache = queryClient$.getQuery(queryHash)\n\n const queryCacheEntry =\n queryAlreadyInCache ??\n queryClient$.setQuery(context.queryKey, getSource(), context.signal)\n\n const refetchIfNeeded = () => {\n if (queryCacheEntry?.isCompleted === false) {\n setTimeout(() => {\n _queryClient?.refetchQueries({\n queryKey: context.queryKey,\n exact: true,\n })\n })\n }\n }\n\n // if the observable returns results synchronously\n if (!queryAlreadyInCache && queryCacheEntry.lastData !== undefined) {\n resolve(queryCacheEntry.lastData.value as TQueryFnData)\n\n refetchIfNeeded()\n\n return\n }\n\n const query$ = queryCacheEntry.query$\n\n query$\n .pipe(\n take(1),\n /**\n * If several values are emitted during this delay, we will only\n * keep the last value. This is unfortunate but it's the best we can do\n * for now.\n */\n delay(1),\n )\n .subscribe({\n error: (error) => {\n return reject(error)\n },\n complete: () => {\n if (queryCacheEntry?.lastData === undefined) {\n if (queryCacheEntry.signal.aborted) {\n return resolve(undefined as TQueryFnData)\n }\n\n console.log(\n `cancelled due to stream completing without data for query ${queryHash}`,\n queryCacheEntry?.lastData,\n )\n\n _queryClient.cancelQueries({\n queryKey: context.queryKey,\n exact: true,\n })\n\n return resolve(undefined as TQueryFnData)\n }\n\n resolve(queryCacheEntry.lastData.value as TQueryFnData)\n\n refetchIfNeeded()\n },\n })\n })\n }\n\n const result = useQuery<TQueryFnData, TError, TData, TQueryKey>(\n {\n ...options,\n queryFn: queryFnAsync,\n },\n queryClient,\n )\n\n return result\n}\n","import {\n type DefaultError,\n type QueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n useMutation,\n} from \"@tanstack/react-query\"\nimport { useEffect } from \"react\"\nimport { BehaviorSubject, type Observable, take } from \"rxjs\"\nimport { useConstant } from \"../utils/react/useConstant\"\n\nexport type UseMutation$Options<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n> = Omit<\n UseMutationOptions<TData, TError, TVariables, TContext>,\n \"mutationFn\"\n> & {\n mutationFn: ((variables: TVariables) => Observable<TData>) | Observable<TData>\n}\n\nexport function useMutation$<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n>(\n options: UseMutation$Options<TData, TError, TVariables, TContext>,\n queryClient?: QueryClient,\n) {\n const stateSubject = useConstant(\n () =>\n new BehaviorSubject<\n Pick<\n UseMutationResult<TData, TError, TVariables, TContext>,\n \"status\" | \"isPending\" | \"isError\" | \"isSuccess\" | \"isIdle\"\n >\n >({\n status: \"idle\",\n isPending: false,\n isError: false,\n isSuccess: false,\n isIdle: true,\n }),\n )\n\n const result = useMutation<TData, TError, TVariables, TContext>(\n {\n ...options,\n mutationFn: (variables: TVariables) => {\n let lastData: { value: TData } | undefined\n\n return new Promise<TData>((resolve, reject) => {\n const source =\n typeof options.mutationFn === \"function\"\n ? options.mutationFn(variables)\n : options.mutationFn\n\n source.pipe(take(1)).subscribe({\n next: (data) => {\n lastData = { value: data }\n },\n error: (error) => {\n reject(error)\n },\n complete: () => {\n if (lastData === undefined)\n return reject(new Error(\"Stream completed without any data\"))\n\n resolve(lastData.value)\n },\n })\n })\n },\n },\n queryClient,\n )\n\n const { status, isPending, isError, isSuccess, isIdle } = result\n\n useEffect(() => {\n stateSubject.next({\n status,\n isPending,\n isError,\n isSuccess,\n isIdle,\n })\n }, [status, isPending, isError, isSuccess, isIdle, stateSubject])\n\n return { ...result, state$: stateSubject }\n}\n","import type { DefaultError, QueryClient } from \"@tanstack/react-query\"\nimport { useCallback, useRef } from \"react\"\nimport {\n defaultIfEmpty,\n first,\n fromEvent,\n ignoreElements,\n merge,\n tap,\n} from \"rxjs\"\nimport { type UseMutation$Options, useMutation$ } from \"./useMutation$\"\n\nexport class SwitchMutationCancelError extends Error {\n constructor(message = \"Mutation canceled\") {\n super(message)\n this.name = \"SwitchMutationCancelError\"\n }\n}\n\nexport function useSwitchMutation$<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n>(\n options: UseMutation$Options<TData | null, TError, TVariables, TContext>,\n queryClient?: QueryClient,\n) {\n const previousMutationCancelRef = useRef(new AbortController())\n type TDataOrNull = TData | null\n\n const { mutate, mutateAsync, ...rest } = useMutation$<\n TDataOrNull,\n TError,\n { variables: TVariables; abort: AbortSignal },\n TContext\n >(\n {\n ...options,\n mutationFn: ({ variables, abort }) => {\n if (abort.aborted) {\n throw new SwitchMutationCancelError()\n }\n\n const source =\n typeof options.mutationFn === \"function\"\n ? options.mutationFn(variables)\n : options.mutationFn\n\n return merge(\n source,\n fromEvent(abort, \"abort\").pipe(\n tap(() => {\n throw new SwitchMutationCancelError()\n }),\n ignoreElements(),\n ),\n ).pipe(first(), defaultIfEmpty(null))\n },\n onMutate: ({ variables }) => {\n return options.onMutate?.(variables)\n },\n onSuccess: (data, { variables }, context) => {\n return options.onSuccess?.(data, variables, context)\n },\n onError: (error, { variables }, ...rest) => {\n return options.onError?.(error, variables, ...rest)\n },\n onSettled: (data, error, { variables }, context) => {\n return options.onSettled?.(data, error, variables, context)\n },\n },\n queryClient,\n )\n\n const mutateSwitch = useCallback(\n (variables: TVariables) => {\n previousMutationCancelRef.current.abort()\n previousMutationCancelRef.current = new AbortController()\n\n return mutate({\n variables,\n abort: previousMutationCancelRef.current.signal,\n })\n },\n [mutate],\n )\n\n const mutateAsyncSwitch = useCallback(\n (variables: TVariables) => {\n previousMutationCancelRef.current.abort()\n previousMutationCancelRef.current = new AbortController()\n\n return mutateAsync({\n variables,\n abort: previousMutationCancelRef.current.signal,\n })\n },\n [mutateAsync],\n )\n\n return { ...rest, mutate: mutateSwitch, mutateAsync: mutateAsyncSwitch }\n}\n","import {\n type DefaultError,\n type MutationKey,\n type QueryClient,\n useQueryClient,\n} from \"@tanstack/react-query\"\nimport { useCallback } from \"react\"\nimport {\n BehaviorSubject,\n type Subject,\n filter,\n first,\n noop,\n switchMap,\n} from \"rxjs\"\nimport { type UseMutation$Options, useMutation$ } from \"./useMutation$\"\n\nexport function useContactMutation$<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n>(\n options: UseMutation$Options<TData | null, TError, TVariables, TContext> & {\n mutationKey: MutationKey\n },\n queryClient?: QueryClient,\n) {\n const client = useQueryClient(queryClient)\n type TDataOrNull = TData | null\n const mutationKey = options.mutationKey\n\n const { mutateAsync, ...rest } = useMutation$<\n TDataOrNull,\n TError,\n { variables: TVariables; ready$: Subject<boolean> },\n TContext\n >(\n {\n ...options,\n onMutate({ variables }) {\n return options.onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n return options.onSuccess?.(data, variables.variables, context)\n },\n onError(error, variables, context) {\n return options.onError?.(error, variables.variables, context)\n },\n onSettled(data, error, variables, context) {\n return options.onSettled?.(data, error, variables.variables, context)\n },\n mutationFn: ({ ready$, variables }) => {\n const source =\n typeof options.mutationFn === \"function\"\n ? options.mutationFn(variables)\n : options.mutationFn\n\n return ready$.pipe(\n filter((isReady) => isReady),\n first(),\n switchMap(() => source),\n )\n },\n },\n queryClient,\n )\n\n const mutateAsyncConcat = useCallback(\n async (variables: TVariables) => {\n const mutations = client.getMutationCache().findAll({\n mutationKey,\n exact: true,\n })\n\n const subject = new BehaviorSubject(false)\n\n const result = mutateAsync({ variables, ready$: subject })\n\n await Promise.all(\n mutations.map((mutation) => mutation.continue().catch(noop)),\n )\n\n subject.next(true)\n\n return await result.finally(() => {\n subject.complete()\n })\n },\n [mutateAsync, client, mutationKey],\n )\n\n const mutateConcat = useCallback(\n (variables: TVariables) => {\n mutateAsyncConcat(variables).catch(noop)\n },\n [mutateAsyncConcat],\n )\n\n return { ...rest, mutate: mutateConcat, mutateAsync: mutateAsyncConcat }\n}\n"],"names":["isPromiseLike","value","makeObservable","something","isObservable","from","of","somethingAsFunction","params","defer","result","useLiveRef","ref","useRef","useMemo","useObserve","source$","optionsOrDeps","maybeDeps","options","deps","valueRef","sourceRef","optionsRef","getSnapshot","useCallback","subscribe","next","source","sub","startWith","identity","distinctUntilChanged","a","b","tap","catchError","error","EMPTY","useSyncExternalStore","useSubscribe","useEffect","useRefOnce","fn","useConstant","useObservableState","defaultValue","subject","BehaviorSubject","subject$","setState","useLiveBehaviorSubject","state","useSubscribeEffect","unsafeOptions","retryOption","onErrorRef","sourceAsObservable","enhancerMakeObservable","retry","SIGNAL_RESET","Signal","config","__publicField","valueOrUpdater","updater","VirtualSignal","signal","virtualSignal","useUnmountObservable","replaySubject","ReplaySubject","completed","setCompleted","useState","useEffectOnce","effect","useMount","getDelay","backoffDelay","maxInterval","exponentialBackoffDelay","iteration","initialInterval","retryBackoff","retryDelay","retryAfterDelay","retryAfter","maxRetries","shouldRetry","normalizedConfig","resetOnSuccess","caughtErrors","shouldRetryFn","attempt","caughtErrorResult$","_a","mergeMap","merge","throwError","retryWhen","errors","concatMap","first","timer","e","isDefined","arg","arrayEqual","v","i","isServer","SignalContext","existingSignal","newSignal","SignalReactContext","createContext","SignalContextProvider","memo","children","signalContextRef","signalContext","isDestroyed","setIsDestroyed","jsx","useSignalContext","useContext","useMakeOrRetrieveSignal","useSignalReference","useSignalValue","selector","selectorRef","finalSignal","defaultSelector","map","useSetSignal","useSignal","setValue","useSignalState","createLocalforageAdapter","forage","key","serializedValue","_","normalizeStore","store","createSharedStoreAdapter","adapter","keyToDelete","unsafeStore","toRemove","rest","itemKey","createLocalStorageAdapter","isShallowEqual","objA","objB","keysA","keysB","IDENTIFIER_PERSISTANCE_KEY","getNormalizedPersistanceValue","unknownValue","persistValue","version","hydrateValueToSignal","hydrate","switchMap","normalizedValue","storedVersionIsInvalid","signalVersionIsSuperior","correctVersionValue","persistSignals","entries","onHydrated","isHydrated$","zip","share","persisted$","throttleTime","asyncScheduler","usePersistSignals","onHydratedRef","adapterSubject","entriesSubject","scan","acc","event","QueryClient$","queryHash","queryKey","query$","hashKey","sharedQuery$","takeUntil","fromEvent","cacheEntry","data","entry","Context","QueryClientProvider$","_client","client","useQueryClient$","useQuery$","queryClient","_queryClient","useQueryClient","queryClient$","queryFnAsync","context","resolve","reject","getSource","queryAlreadyInCache","queryCacheEntry","refetchIfNeeded","take","delay","useQuery","useMutation$","stateSubject","useMutation","variables","lastData","status","isPending","isError","isSuccess","isIdle","SwitchMutationCancelError","message","useSwitchMutation$","previousMutationCancelRef","mutate","mutateAsync","abort","ignoreElements","defaultIfEmpty","mutateSwitch","mutateAsyncSwitch","useContactMutation$","mutationKey","ready$","filter","isReady","mutateAsyncConcat","mutations","mutation","noop","mutateConcat"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/lib/utils/react/useRefOnce.ts","../src/lib/utils/react/useConstant.ts","../src/lib/binding/useLiveBehaviorSubject.ts","../src/lib/utils/react/useLiveRef.ts","../src/lib/binding/useObservableState.ts","../src/lib/utils/isPromiseLike.ts","../src/lib/utils/makeObservable.ts","../src/lib/binding/useObserve.ts","../src/lib/binding/useSubscribe.ts","../src/lib/binding/useSubscribeEffect.ts","../src/lib/queries/QueryClientProvider$.tsx","../src/lib/queries/useMutation$.ts","../src/lib/queries/useConcatMutation$.ts","../src/lib/queries/useQuery$.ts","../src/lib/queries/useSwitchMutation$.ts","../src/lib/state/constants.ts","../src/lib/state/persistance/adapters/createLocalforageAdapter.ts","../src/lib/state/persistance/adapters/createLocalStorageAdapter.ts","../src/lib/state/Signal.ts","../src/lib/state/SignalContext.ts","../src/lib/state/react/SignalContextProvider.tsx","../src/lib/utils/shallowEqual.ts","../src/lib/state/persistance/constants.ts","../src/lib/state/persistance/helpers.ts","../src/lib/state/persistance/persistSignals.ts","../src/lib/state/react/usePersistSignals.tsx","../src/lib/state/react/useSignalReference.ts","../src/lib/state/react/useSetSignal.ts","../src/lib/utils/arrayEqual.ts","../src/lib/utils/isDefined.ts","../src/lib/utils/isServer.ts","../src/lib/utils/operators/retryBackoff.ts","../src/lib/utils/react/useEffectOnce.ts","../src/lib/utils/react/useMount.ts","../src/lib/utils/react/useUnmountObservable.ts","../src/lib/state/react/useSignalValue.ts","../src/lib/state/react/useSignal.ts","../src/lib/state/react/useSignalState.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\"\n\nexport const useRefOnce = <T>(fn: () => T) => {\n const ref = useRef<T>(undefined)\n\n if (!ref.current) {\n ref.current = fn()\n }\n\n useEffect(() => {\n /**\n * Because strict mode keep reference to the same ref when the component\n * is re-mounted we force a rewrite here to prevent weird behavior.\n * I don't know why react does that since it is I believe technically\n * wrong. useRef should persist across re-render, not re-mount.\n *\n * @important\n * The downside is that during dev the factory will be called again every\n * mount.\n */\n if (process.env.NODE_ENV === \"development\") {\n // ref.current = fn();\n }\n }, [])\n\n return ref as { current: T }\n}\n","import { useRefOnce } from \"./useRefOnce\"\n\nexport const useConstant = <T>(fn: () => T) => {\n const ref = useRefOnce(fn)\n\n return ref.current\n}\n","import { useEffect } from \"react\"\nimport { BehaviorSubject } from \"rxjs\"\nimport { useConstant } from \"../utils/react/useConstant\"\n\nexport const useLiveBehaviorSubject = <S>(state: S) => {\n const subject = useConstant(() => new BehaviorSubject(state))\n\n useEffect(() => {\n subject.next(state)\n }, [state, subject])\n\n return subject\n}\n","import { useMemo, useRef } from \"react\"\n\nexport const useLiveRef = <T>(value: T) => {\n const ref = useRef(value)\n\n /**\n * We don't update the value on render because of potential\n * bug related to react concurrency mode.\n * We don't update the value in a useEffect because effects run after\n * render and we could maybe? have situation where the ref\n * is being called after render but before effect?\n * I am not sure of that one.\n *\n * `useMemo` is a good compromise since it runs during render but before\n * repaint. It prevents the concurrency mode issue.\n */\n useMemo(() => {\n ref.current = value\n }, [value])\n\n return ref\n}\n","import { useCallback } from \"react\"\nimport { BehaviorSubject, type Observable } from \"rxjs\"\nimport { useConstant } from \"../utils/react/useConstant\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\n\n/**\n * If you need to represent some piece of state as an observable and also want the ability to change\n * this state during the lifetime of the component, useObservableState\n * is for you. It acts like React.useState(), only that\n * it returns an observable representing changes to the\n * value instead of the value itself. The callback/setter\n * returned acts like a the regular callback you\n * would otherwise get from React.useState. This is useful when you want\n * to compose the state change together with other observables.\n *\n * @important\n * The last array value is the value itself in case\n * you need a direct reference to the value\n */\nexport const useObservableState = <T>(\n defaultValue: T,\n): [Observable<T>, (value: T) => void, T] => {\n const subject = useConstant(() => new BehaviorSubject(defaultValue))\n\n const subject$ = useLiveRef(subject)\n\n const setState = useCallback(\n (value: T) => {\n subject.next(value)\n },\n [subject],\n )\n\n return [subject$.current, setState, subject.getValue()]\n}\n","// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport function isPromiseLike<T>(value: T): value is T & Promise<any> {\n return (\n value instanceof Promise ||\n (value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n typeof value.then === \"function\" &&\n \"catch\" in value &&\n value.catch === \"function\")\n )\n}\n","import { defer, from, isObservable, type Observable, of } from \"rxjs\"\nimport { isPromiseLike } from \"./isPromiseLike\"\n\ntype FnReturnToObservable<T> = T extends Observable<infer ObservedData>\n ? ObservedData\n : T extends Promise<infer ThenData>\n ? ThenData\n : T\n\nexport function makeObservable<Data>(\n fn: Observable<Data>,\n): () => Observable<Data>\n\nexport function makeObservable<Data>(fn: Promise<Data>): () => Observable<Data>\n\nexport function makeObservable<Data>(\n fn: Promise<Data> | Observable<Data>,\n): () => Observable<Data>\n\nexport function makeObservable<Data>(\n fn: () => Promise<Data> | Observable<Data>,\n): () => Observable<Data>\n\n/**\n * Generic factory\n */\nexport function makeObservable<Data>(\n fn: () => Promise<Data> | Observable<Data> | Data,\n): () => Observable<Data>\n\n/**\n * Generic factory\n */\nexport function makeObservable<Data, Params>(\n fn: (params: Params) => Data,\n): (params: Params) => Observable<FnReturnToObservable<Data>>\n\n/**\n * Generic factory OR Observable\n */\nexport function makeObservable<Data, Return>(\n fn: Observable<Data> | (() => Return),\n): () => Observable<Data | FnReturnToObservable<Return>>\n\nexport function makeObservable<Data>(fn: Data): () => Observable<Data>\n\n/**\n * Convert the input into an observable.\n *\n * - Observable: return the same observable\n * - Promise: return an observable from the promise\n * - Data: return an observable from the data\n * - Function: Execute the function and return an observable from the result\n */\nexport function makeObservable<Data, Params>(\n something:\n | ((params: Params) => Observable<Data>)\n | Promise<Data>\n | Observable<Data>\n | ((params: Params) => Promise<Data>)\n | ((params: Params) => Data)\n | Data,\n): (params: Params) => Observable<Data> {\n if (isObservable(something)) return () => something\n\n if (isPromiseLike(something)) return () => from(something)\n\n if (typeof something !== \"function\") return () => of(something)\n\n const somethingAsFunction = something as\n | ((params: Params) => Observable<Data>)\n | ((params: Params) => Promise<Data>)\n | ((params: Params) => Data)\n\n return (params: Params) =>\n defer(() => {\n const result = somethingAsFunction(params)\n\n if (isPromiseLike(result)) {\n return from(result)\n }\n\n if (isObservable(result)) {\n return result\n }\n\n return of(result)\n })\n}\n","import {\n type DependencyList,\n useCallback,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\"\nimport {\n type BehaviorSubject,\n catchError,\n distinctUntilChanged,\n EMPTY,\n identity,\n type Observable,\n type Subscription,\n shareReplay,\n startWith,\n tap,\n} from \"rxjs\"\nimport { makeObservable } from \"../utils/makeObservable\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\n\ninterface Option<R = undefined> {\n defaultValue: R\n unsubscribeOnUnmount?: boolean\n compareFn?: (a: R, b: R) => boolean\n}\n\nexport function useObserve<T>(source: BehaviorSubject<T>): T\n\nexport function useObserve<T>(source: Observable<T>): T | undefined\n\nexport function useObserve<T>(\n source: () => Observable<T>,\n deps: DependencyList,\n): T | undefined\n\nexport function useObserve<T>(\n source: () => Observable<T> | undefined,\n deps: DependencyList,\n): T | undefined\n\nexport function useObserve<T>(source: Observable<T>, options: Option<T>): T\n\nexport function useObserve<T>(\n source: () => Observable<T>,\n options: Option<T>,\n deps: DependencyList,\n): T\n\nexport function useObserve<T>(\n source$: Observable<T> | (() => Observable<T> | undefined),\n optionsOrDeps?: Option<T> | DependencyList,\n maybeDeps?: DependencyList,\n): T {\n const options =\n optionsOrDeps != null && !Array.isArray(optionsOrDeps)\n ? (optionsOrDeps as Option<T>)\n : ({\n defaultValue: undefined,\n unsubscribeOnUnmount: true,\n compareFn: undefined,\n } satisfies Option<undefined>)\n const deps =\n !maybeDeps && Array.isArray(optionsOrDeps)\n ? optionsOrDeps\n : typeof source$ === \"function\"\n ? (maybeDeps ?? [])\n : [source$]\n const valueRef = useRef<{ value: T | undefined } | undefined>(undefined)\n const sourceRef = useLiveRef(source$)\n const optionsRef = useLiveRef(options)\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: TODO\n const observable = useMemo(\n () => ({\n observable: makeObservable(sourceRef.current)().pipe(\n shareReplay({ refCount: true, bufferSize: 1 }),\n ),\n subscribed: false,\n snapshotSub: undefined as Subscription | undefined,\n }),\n [...deps],\n )\n\n const getSnapshot = useCallback(() => {\n /**\n * If getting a snapshot before the observable has been subscribed, we will subscribe to it to get a chance\n * to retrieve the actual value if the observable is synchronous.\n * This is to avoid re-rendering the hook in the situation where we can actually have a value already.\n */\n if (!observable.subscribed) {\n observable.subscribed = true\n\n const sub = observable.observable.subscribe((v) => {\n valueRef.current = { value: v }\n })\n\n observable.snapshotSub = sub\n }\n\n if (valueRef.current === undefined) return optionsRef.current.defaultValue\n\n return valueRef.current?.value\n }, [observable, optionsRef])\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: TODO\n const subscribe = useCallback(\n (next: () => void) => {\n observable.subscribed = true\n\n const sub = observable.observable\n .pipe(\n optionsRef.current.defaultValue\n ? startWith(optionsRef.current.defaultValue)\n : identity,\n /**\n * @important there is already a Object.is comparison in place from react\n * so we only add a custom compareFn if provided\n */\n distinctUntilChanged((a, b) => {\n if (optionsRef.current.compareFn) {\n if (a === undefined || b === undefined) return false\n\n return optionsRef.current.compareFn(a, b)\n }\n\n return false\n }),\n tap((value) => {\n valueRef.current = { value }\n }),\n catchError((error) => {\n console.error(error)\n\n return EMPTY\n }),\n )\n .subscribe(next)\n\n /**\n * Unsubscribe from early snapshot subscription to avoid re-running the original observable.\n * From this point onward we have an active subscription to the observable.\n */\n observable.snapshotSub?.unsubscribe()\n\n return () => {\n if (optionsRef.current.unsubscribeOnUnmount === false) return\n\n sub.unsubscribe()\n }\n },\n [observable],\n )\n\n const result = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return result as T\n}\n","import { type DependencyList, useEffect } from \"react\"\nimport { catchError, EMPTY } from \"rxjs\"\nimport { makeObservable } from \"../utils/makeObservable\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\nimport type { SubscribeSource } from \"./types\"\n\nexport function useSubscribe<T>(\n source: SubscribeSource<T> | (() => T),\n deps: DependencyList = [],\n) {\n const sourceRef = useLiveRef(source)\n\n useEffect(() => {\n const sub = makeObservable(sourceRef.current)()\n .pipe(\n catchError((error) => {\n console.error(error)\n\n return EMPTY\n }),\n )\n .subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }, [...deps, sourceRef])\n}\n","import { type DependencyList, useCallback } from \"react\"\nimport { catchError, identity, retry } from \"rxjs\"\nimport { makeObservable } from \"../utils/makeObservable\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\nimport type { SubscribeSource } from \"./types\"\nimport { useSubscribe } from \"./useSubscribe\"\n\ninterface Option {\n retry?: boolean\n onError?: (error: unknown) => void\n}\n\nexport function useSubscribeEffect<T>(source: SubscribeSource<T>): void\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n options: Option,\n): void\n\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n deps: DependencyList,\n): void\n\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n options: Option,\n deps: DependencyList,\n): void\n\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n unsafeOptions?: Option | DependencyList,\n deps: DependencyList = [],\n) {\n const options =\n unsafeOptions != null && !Array.isArray(unsafeOptions)\n ? (unsafeOptions as Option)\n : ({} satisfies Option)\n const retryOption = options.retry ?? true\n const onErrorRef = useLiveRef(\n options.onError ??\n ((error: unknown) => {\n console.error(error)\n }),\n )\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: TODO\n const sourceAsObservable = useCallback(() => makeObservable(source)(), deps)\n\n const enhancerMakeObservable = useCallback(\n () =>\n sourceAsObservable().pipe(\n catchError((error) => {\n onErrorRef.current(error)\n\n throw error\n }),\n retryOption ? retry() : identity,\n ),\n [sourceAsObservable, retryOption, onErrorRef],\n )\n\n useSubscribe(enhancerMakeObservable, deps)\n}\n","import { hashKey, type QueryKey } from \"@tanstack/react-query\"\nimport { createContext, memo, useContext, useEffect, useState } from \"react\"\nimport {\n fromEvent,\n type Observable,\n type Subscription,\n share,\n takeUntil,\n} from \"rxjs\"\n\ntype CacheEntry = {\n query$: Observable<unknown>\n signal: AbortSignal\n sub: Subscription | undefined\n isCompleted: boolean\n lastData: { value: unknown } | undefined\n}\n\nexport class QueryClient$ {\n public readonly queryMap: Map<string, CacheEntry> = new Map()\n\n getQuery(queryHash: string) {\n return this.queryMap.get(queryHash)\n }\n\n setQuery(\n queryKey: QueryKey,\n query$: Observable<unknown>,\n signal: AbortSignal,\n ) {\n const queryHash = hashKey(queryKey)\n\n const sharedQuery$ = query$.pipe(\n /**\n * abort signal is triggered on:\n * - manual cancellation from user\n * - unmounting the component\n * @see https://tanstack.com/query/latest/docs/framework/react/guides/query-cancellation\n */\n takeUntil(fromEvent(signal, \"abort\")),\n share(),\n )\n\n const cacheEntry: CacheEntry = {\n query$: sharedQuery$,\n signal,\n sub: undefined,\n isCompleted: false,\n lastData: undefined,\n }\n\n this.queryMap.set(queryHash, cacheEntry)\n\n const sub = sharedQuery$.subscribe({\n next: (data) => {\n const entry = this.queryMap.get(queryHash)\n\n if (entry) {\n entry.lastData = { value: data }\n }\n },\n complete: () => {\n this.deleteQuery(queryHash)\n },\n })\n\n cacheEntry.sub = sub\n\n return cacheEntry\n }\n\n deleteQuery(queryHash: string) {\n const entry = this.queryMap.get(queryHash)\n\n if (!entry) return\n\n if (entry.sub) {\n entry.sub.unsubscribe()\n entry.sub = undefined\n }\n\n entry.isCompleted = true\n\n this.queryMap.delete(queryHash)\n }\n\n destroy() {\n this.queryMap.forEach((_, key) => {\n this.deleteQuery(key)\n })\n }\n}\n\nexport const Context = createContext<QueryClient$ | undefined>(undefined)\n\nexport const QueryClientProvider$ = memo(\n ({\n children,\n client: _client,\n }: {\n children: React.ReactNode\n client?: QueryClient$\n }) => {\n const [client] = useState(() => _client ?? new QueryClient$())\n\n useEffect(() => {\n return () => {\n client.destroy()\n }\n }, [client])\n\n return <Context.Provider value={client}>{children}</Context.Provider>\n },\n)\n\nexport const useQueryClient$ = () => {\n const client = useContext(Context)\n\n if (!client) {\n throw new Error(\n \"useReactJrxQueryClient must be used within a ReactJrxQueryProvider\",\n )\n }\n\n return client\n}\n","import {\n type DefaultError,\n type QueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n useMutation,\n} from \"@tanstack/react-query\"\nimport { useEffect } from \"react\"\nimport { BehaviorSubject, type Observable, take } from \"rxjs\"\nimport { useConstant } from \"../utils/react/useConstant\"\n\nexport type UseMutation$Options<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n> = Omit<\n UseMutationOptions<TData, TError, TVariables, TContext>,\n \"mutationFn\"\n> & {\n mutationFn: ((variables: TVariables) => Observable<TData>) | Observable<TData>\n}\n\nexport function useMutation$<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n>(\n options: UseMutation$Options<TData, TError, TVariables, TContext>,\n queryClient?: QueryClient,\n) {\n const stateSubject = useConstant(\n () =>\n new BehaviorSubject<\n Pick<\n UseMutationResult<TData, TError, TVariables, TContext>,\n \"status\" | \"isPending\" | \"isError\" | \"isSuccess\" | \"isIdle\"\n >\n >({\n status: \"idle\",\n isPending: false,\n isError: false,\n isSuccess: false,\n isIdle: true,\n }),\n )\n\n const result = useMutation<TData, TError, TVariables, TContext>(\n {\n ...options,\n mutationFn: (variables: TVariables) => {\n let lastData: { value: TData } | undefined\n\n return new Promise<TData>((resolve, reject) => {\n const source =\n typeof options.mutationFn === \"function\"\n ? options.mutationFn(variables)\n : options.mutationFn\n\n source.pipe(take(1)).subscribe({\n next: (data) => {\n lastData = { value: data }\n },\n error: (error) => {\n reject(error)\n },\n complete: () => {\n if (lastData === undefined)\n return reject(new Error(\"Stream completed without any data\"))\n\n resolve(lastData.value)\n },\n })\n })\n },\n },\n queryClient,\n )\n\n const { status, isPending, isError, isSuccess, isIdle } = result\n\n useEffect(() => {\n stateSubject.next({\n status,\n isPending,\n isError,\n isSuccess,\n isIdle,\n })\n }, [status, isPending, isError, isSuccess, isIdle, stateSubject])\n\n return { ...result, state$: stateSubject }\n}\n","import {\n type DefaultError,\n type MutationKey,\n type QueryClient,\n useQueryClient,\n} from \"@tanstack/react-query\"\nimport { useCallback } from \"react\"\nimport {\n BehaviorSubject,\n filter,\n first,\n noop,\n type Subject,\n switchMap,\n} from \"rxjs\"\nimport { type UseMutation$Options, useMutation$ } from \"./useMutation$\"\n\nexport function useContactMutation$<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n>(\n options: UseMutation$Options<TData | null, TError, TVariables, TContext> & {\n mutationKey: MutationKey\n },\n queryClient?: QueryClient,\n) {\n const client = useQueryClient(queryClient)\n type TDataOrNull = TData | null\n const mutationKey = options.mutationKey\n\n const { mutateAsync, ...rest } = useMutation$<\n TDataOrNull,\n TError,\n { variables: TVariables; ready$: Subject<boolean> },\n TContext\n >(\n {\n ...options,\n onMutate({ variables }) {\n return options.onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n return options.onSuccess?.(data, variables.variables, context)\n },\n onError(error, variables, context) {\n return options.onError?.(error, variables.variables, context)\n },\n onSettled(data, error, variables, context) {\n return options.onSettled?.(data, error, variables.variables, context)\n },\n mutationFn: ({ ready$, variables }) => {\n const source =\n typeof options.mutationFn === \"function\"\n ? options.mutationFn(variables)\n : options.mutationFn\n\n return ready$.pipe(\n filter((isReady) => isReady),\n first(),\n switchMap(() => source),\n )\n },\n },\n queryClient,\n )\n\n const mutateAsyncConcat = useCallback(\n async (variables: TVariables) => {\n const mutations = client.getMutationCache().findAll({\n mutationKey,\n exact: true,\n })\n\n const subject = new BehaviorSubject(false)\n\n const result = mutateAsync({ variables, ready$: subject })\n\n await Promise.all(\n mutations.map((mutation) => mutation.continue().catch(noop)),\n )\n\n subject.next(true)\n\n return await result.finally(() => {\n subject.complete()\n })\n },\n [mutateAsync, client, mutationKey],\n )\n\n const mutateConcat = useCallback(\n (variables: TVariables) => {\n mutateAsyncConcat(variables).catch(noop)\n },\n [mutateAsyncConcat],\n )\n\n return { ...rest, mutate: mutateConcat, mutateAsync: mutateAsyncConcat }\n}\n","import {\n type DefaultError,\n hashKey,\n type QueryClient,\n type QueryFunctionContext,\n type QueryKey,\n type UseQueryOptions,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\"\nimport { defer, delay, type Observable, take } from \"rxjs\"\nimport { useQueryClient$ } from \"./QueryClientProvider$\"\n\nexport function useQuery$<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: Omit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n \"queryFn\"\n > & {\n queryFn:\n | ((context: QueryFunctionContext<TQueryKey>) => Observable<TQueryFnData>)\n | Observable<TQueryFnData>\n },\n queryClient?: QueryClient,\n) {\n const _queryClient = useQueryClient(queryClient)\n const queryClient$ = useQueryClient$()\n\n const queryFnAsync = (context: QueryFunctionContext<TQueryKey>) => {\n return new Promise<TQueryFnData>((resolve, reject) => {\n const getSource = () =>\n defer(() =>\n typeof options.queryFn === \"function\"\n ? options.queryFn(context)\n : options.queryFn,\n )\n\n const queryHash = hashKey(context.queryKey)\n\n const queryAlreadyInCache = queryClient$.getQuery(queryHash)\n\n const queryCacheEntry =\n queryAlreadyInCache ??\n queryClient$.setQuery(context.queryKey, getSource(), context.signal)\n\n const refetchIfNeeded = () => {\n if (queryCacheEntry?.isCompleted === false) {\n setTimeout(() => {\n _queryClient?.refetchQueries({\n queryKey: context.queryKey,\n exact: true,\n })\n })\n }\n }\n\n // if the observable returns results synchronously\n if (!queryAlreadyInCache && queryCacheEntry.lastData !== undefined) {\n resolve(queryCacheEntry.lastData.value as TQueryFnData)\n\n refetchIfNeeded()\n\n return\n }\n\n const query$ = queryCacheEntry.query$\n\n query$\n .pipe(\n take(1),\n /**\n * If several values are emitted during this delay, we will only\n * keep the last value. This is unfortunate but it's the best we can do\n * for now.\n */\n delay(1),\n )\n .subscribe({\n error: (error) => {\n return reject(error)\n },\n complete: () => {\n if (queryCacheEntry?.lastData === undefined) {\n if (queryCacheEntry.signal.aborted) {\n return resolve(undefined as TQueryFnData)\n }\n\n console.log(\n `cancelled due to stream completing without data for query ${queryHash}`,\n queryCacheEntry?.lastData,\n )\n\n _queryClient.cancelQueries({\n queryKey: context.queryKey,\n exact: true,\n })\n\n return resolve(undefined as TQueryFnData)\n }\n\n resolve(queryCacheEntry.lastData.value as TQueryFnData)\n\n refetchIfNeeded()\n },\n })\n })\n }\n\n const result = useQuery<TQueryFnData, TError, TData, TQueryKey>(\n {\n ...options,\n queryFn: queryFnAsync,\n },\n queryClient,\n )\n\n return result\n}\n","import type { DefaultError, QueryClient } from \"@tanstack/react-query\"\nimport { useCallback, useRef } from \"react\"\nimport {\n defaultIfEmpty,\n first,\n fromEvent,\n ignoreElements,\n merge,\n tap,\n} from \"rxjs\"\nimport { type UseMutation$Options, useMutation$ } from \"./useMutation$\"\n\nexport class SwitchMutationCancelError extends Error {\n constructor(message = \"Mutation canceled\") {\n super(message)\n this.name = \"SwitchMutationCancelError\"\n }\n}\n\nexport function useSwitchMutation$<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n>(\n options: UseMutation$Options<TData | null, TError, TVariables, TContext>,\n queryClient?: QueryClient,\n) {\n const previousMutationCancelRef = useRef(new AbortController())\n type TDataOrNull = TData | null\n\n const { mutate, mutateAsync, ...rest } = useMutation$<\n TDataOrNull,\n TError,\n { variables: TVariables; abort: AbortSignal },\n TContext\n >(\n {\n ...options,\n mutationFn: ({ variables, abort }) => {\n if (abort.aborted) {\n throw new SwitchMutationCancelError()\n }\n\n const source =\n typeof options.mutationFn === \"function\"\n ? options.mutationFn(variables)\n : options.mutationFn\n\n return merge(\n source,\n fromEvent(abort, \"abort\").pipe(\n tap(() => {\n throw new SwitchMutationCancelError()\n }),\n ignoreElements(),\n ),\n ).pipe(first(), defaultIfEmpty(null))\n },\n onMutate: ({ variables }) => {\n return options.onMutate?.(variables)\n },\n onSuccess: (data, { variables }, context) => {\n return options.onSuccess?.(data, variables, context)\n },\n onError: (error, { variables }, ...rest) => {\n return options.onError?.(error, variables, ...rest)\n },\n onSettled: (data, error, { variables }, context) => {\n return options.onSettled?.(data, error, variables, context)\n },\n },\n queryClient,\n )\n\n const mutateSwitch = useCallback(\n (variables: TVariables) => {\n previousMutationCancelRef.current.abort()\n previousMutationCancelRef.current = new AbortController()\n\n return mutate({\n variables,\n abort: previousMutationCancelRef.current.signal,\n })\n },\n [mutate],\n )\n\n const mutateAsyncSwitch = useCallback(\n (variables: TVariables) => {\n previousMutationCancelRef.current.abort()\n previousMutationCancelRef.current = new AbortController()\n\n return mutateAsync({\n variables,\n abort: previousMutationCancelRef.current.signal,\n })\n },\n [mutateAsync],\n )\n\n return { ...rest, mutate: mutateSwitch, mutateAsync: mutateAsyncSwitch }\n}\n","export const SIGNAL_RESET = Symbol(\"SIGNAL_RESET\")\n","import type { Adapter } from \"./Adapter\"\n\nexport const createLocalforageAdapter = (forage: {\n getItem: (key: string) => Promise<string | null>\n setItem: (key: string, value: string) => Promise<string>\n}): Adapter => ({\n getItem: async (key: string) => {\n const serializedValue = await forage.getItem(key)\n\n if (!serializedValue) return undefined\n\n return JSON.parse(serializedValue)\n },\n\n setItem: async (key: string, value: unknown) => {\n await forage.setItem(key, JSON.stringify(value))\n },\n\n removeItem: async (_: string) => {},\n\n clear: async () => {},\n})\n","import type { Adapter } from \"./Adapter\"\n\nconst normalizeStore = (store: unknown) => {\n if (!store || typeof store !== \"object\") {\n return undefined\n }\n\n return store\n}\n\n/**\n * Create an adapter which use one unique store entry to store all\n * state. When using many signals it can help with maintenance to keep things\n * tidy.\n */\nconst createSharedStoreAdapter = ({\n adapter,\n key,\n}: {\n adapter: Adapter\n key: string\n}): Adapter => ({\n clear: async () => {\n return await adapter.removeItem(key)\n },\n\n removeItem: async (keyToDelete) => {\n const unsafeStore = await adapter.getItem(key)\n // biome-ignore lint/correctness/noUnusedVariables: TODO\n const { [keyToDelete]: toRemove, ...rest } =\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n normalizeStore(unsafeStore) ?? ({} as any)\n\n await adapter.setItem(key, rest)\n },\n\n getItem: async (itemKey: string) => {\n const unsafeStore = await adapter.getItem(key)\n const store = normalizeStore(unsafeStore) ?? {}\n\n if (itemKey in store) {\n return store[itemKey as keyof typeof store]\n }\n\n return undefined\n },\n\n setItem: async (itemKey: string, value: unknown) => {\n const unsafeStore = await adapter.getItem(key)\n const store = normalizeStore(unsafeStore) ?? {}\n\n await adapter.setItem(key, { ...store, [itemKey]: value })\n },\n})\n\nexport const createLocalStorageAdapter = ({\n key,\n}: {\n key?: string\n} = {}): Adapter => {\n if (key) {\n return createSharedStoreAdapter({\n adapter: createLocalStorageAdapter(),\n key,\n })\n }\n\n return {\n clear: async () => {\n localStorage.clear()\n },\n\n removeItem: async (key) => {\n localStorage.removeItem(key)\n },\n\n getItem: async (key) => {\n const serializedValue = localStorage.getItem(key)\n\n if (!serializedValue) return undefined\n\n return JSON.parse(serializedValue)\n },\n\n setItem: async (key, value) => {\n localStorage.setItem(key, JSON.stringify(value))\n },\n }\n}\n","import { BehaviorSubject } from \"rxjs\"\nimport { SIGNAL_RESET } from \"./constants\"\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport type SignalValue<T extends Signal<any, any>> = T[\"value\"]\n\nexport type SignalWithKey<T> = Signal<T> & {\n key: string\n}\n\nexport class Signal<\n T,\n K extends string | undefined = undefined,\n> extends BehaviorSubject<T> {\n constructor(\n public config: {\n default: T\n key: K\n },\n ) {\n super(config.default)\n }\n\n update = (\n valueOrUpdater:\n | ((prev: T) => T)\n // biome-ignore lint/complexity/noBannedTypes: TODO\n | (T extends Function ? never : T)\n | typeof SIGNAL_RESET,\n ): void => {\n if (valueOrUpdater === SIGNAL_RESET) {\n super.next(this.config.default)\n } else if (typeof valueOrUpdater === \"function\") {\n const updater = valueOrUpdater as (prev: T) => T\n\n super.next(updater(this.value))\n } else {\n super.next(valueOrUpdater as T)\n }\n }\n\n /**\n * @deprecated Use `next` instead\n */\n setValue = this.update.bind(this)\n\n /**\n * @deprecated Use `this` instead\n */\n get subject() {\n return this\n }\n\n get key() {\n return this.config.key\n }\n}\n\nexport class VirtualSignal<T> {\n constructor(public config: { default: T }) {}\n}\n// biome-ignore lint/complexity/noBannedTypes: TODO\nexport function signal(config: {}): Signal<undefined, undefined>\n\nexport function signal<T = undefined, K extends string = string>(config: {\n key: K\n}): Signal<T | undefined, K>\n\nexport function signal<T, K extends string = string>(config: {\n key: K\n default: T\n}): Signal<T, K>\n\nexport function signal<T>(config: {\n key?: undefined\n}): Signal<T | undefined, undefined>\n\nexport function signal<T>(config: {\n key?: undefined\n default: T\n}): Signal<T, undefined>\n\nexport function signal<K extends string>(config: {\n key: K\n default?: undefined\n}): Signal<undefined, K>\n\nexport function signal<T, K extends string | undefined = undefined>(\n config: { default?: T; key?: K } = {},\n) {\n return new Signal({\n key: undefined,\n ...config,\n default: config.default ?? undefined,\n })\n}\n\nexport function virtualSignal<T>(config: {\n default: T\n key?: string\n}): VirtualSignal<T> {\n return new VirtualSignal(config)\n}\n","import { BehaviorSubject } from \"rxjs\"\nimport { Signal, type VirtualSignal } from \"./Signal\"\n\nexport class SignalContext {\n /**\n * items only get added as they are created. The only time we should cleanup\n * are on context destroy. This is to ensure later re-use of virtual signals\n * return the same persisted state.\n */\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n signals = new BehaviorSubject(new Map<VirtualSignal<unknown>, Signal<any>>())\n\n public isDestroyed = false\n\n getOrCreateSignal<T>(virtualSignal: VirtualSignal<T>): Signal<T> {\n const existingSignal = this.signals.value.get(virtualSignal)\n\n if (existingSignal) {\n return existingSignal as Signal<T>\n }\n\n const newSignal = new Signal<T>({ ...virtualSignal.config, key: undefined })\n\n this.signals.value.set(virtualSignal, newSignal)\n this.signals.next(this.signals.value)\n\n return newSignal\n }\n\n destroy() {\n this.signals.value.forEach((signal) => {\n signal.complete()\n })\n this.signals.value.clear()\n this.signals.complete()\n this.isDestroyed = true\n }\n}\n","import { createContext, memo, useContext, useEffect, useState } from \"react\"\nimport { useRefOnce } from \"../../utils/react/useRefOnce\"\nimport type { VirtualSignal } from \"../Signal\"\nimport { SignalContext } from \"../SignalContext\"\n\nexport type SignalContextType = SignalContext\n\nexport const SignalReactContext = createContext<SignalContextType>(\n new SignalContext(),\n)\n\nexport const SignalContextProvider = memo(\n ({ children }: { children: React.ReactNode }) => {\n const signalContextRef = useRefOnce<SignalContextType>(\n () => new SignalContext(),\n )\n const signalContext = signalContextRef.current\n const [isDestroyed, setIsDestroyed] = useState(false)\n\n if (isDestroyed) {\n signalContextRef.current = new SignalContext()\n setIsDestroyed(false)\n }\n\n const value = signalContext\n\n useEffect(() => {\n return () => {\n signalContextRef.current?.destroy()\n // force re-render\n setIsDestroyed(true)\n }\n }, [signalContextRef])\n\n return (\n <SignalReactContext.Provider value={value}>\n {children}\n </SignalReactContext.Provider>\n )\n },\n)\n\nexport const useSignalContext = () => {\n const value = useContext(SignalReactContext)\n\n return value\n}\n\nexport const useMakeOrRetrieveSignal = (\n virtualSignal?: VirtualSignal<unknown>,\n) => {\n const signalContext = useSignalContext()\n\n const signal = virtualSignal\n ? signalContext.getOrCreateSignal(virtualSignal)\n : undefined\n\n return signal\n}\n","export function isShallowEqual<A, B>(objA: A, objB: B): boolean {\n // Check if both objects are null or undefined\n if (objA === null || objA === undefined || objB === undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n return (objA as any) === (objB as any)\n }\n\n // Check if both objects are primitives\n if (typeof objA !== \"object\" || typeof objB !== \"object\") {\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n return (objA as any) === (objB as any)\n }\n\n // Check if both objects have the same prototype\n if (objA.constructor !== objB?.constructor) {\n return false\n }\n\n // Check if both objects have the same keys\n const keysA = Object.keys(objA) as Array<keyof A>\n const keysB = Object.keys(objB) as Array<keyof A>\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n // Check if the values of the keys are equal\n for (const key of keysA) {\n // biome-ignore lint/suspicious/noPrototypeBuiltins: TODO\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n if (!objB.hasOwnProperty(key) || objA[key] !== (objB as any)[key]) {\n return false\n }\n }\n\n // If all checks pass, the objects are considered shallowly equal\n return true\n}\n","export const IDENTIFIER_PERSISTANCE_KEY = \"__reactjrx\"\n","import { catchError, from, of, switchMap } from \"rxjs\"\nimport type { Adapter } from \"./adapters/Adapter\"\nimport { IDENTIFIER_PERSISTANCE_KEY } from \"./constants\"\nimport type { PersistanceEntry, SignalPersistenceConfig } from \"./types\"\n\nexport const getNormalizedPersistanceValue = (unknownValue: unknown) => {\n if (\n typeof unknownValue === \"object\" &&\n unknownValue !== null &&\n IDENTIFIER_PERSISTANCE_KEY in unknownValue &&\n unknownValue[IDENTIFIER_PERSISTANCE_KEY] === IDENTIFIER_PERSISTANCE_KEY\n ) {\n return unknownValue as PersistanceEntry\n }\n\n return undefined\n}\n\nexport const persistValue = ({\n adapter,\n config,\n}: {\n adapter: Adapter\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n config: SignalPersistenceConfig<any>\n}) => {\n const { signal, version } = config\n const state = signal.getValue()\n\n const value = {\n value: state,\n [IDENTIFIER_PERSISTANCE_KEY]: IDENTIFIER_PERSISTANCE_KEY,\n migrationVersion: version,\n } satisfies PersistanceEntry\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n \"[reactjrx][state][persistance]:\",\n \"Persist value\",\n value,\n `for signal ${signal.config.key}`,\n )\n }\n\n return from(adapter.setItem(signal.config.key, value)).pipe(\n catchError((e) => {\n console.error(e)\n\n return of(null)\n }),\n )\n}\n\nexport function hydrateValueToSignal({\n adapter,\n config,\n}: {\n adapter: Adapter\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n config: SignalPersistenceConfig<any>\n}) {\n const { hydrate = ({ value }) => value, signal, version } = config\n\n return from(adapter.getItem(signal.config.key)).pipe(\n switchMap((value) => {\n const normalizedValue = getNormalizedPersistanceValue(value)\n\n if (!normalizedValue) return of(value)\n\n const storedVersionIsInvalid =\n typeof normalizedValue.migrationVersion !== \"number\"\n\n const signalVersionIsSuperior =\n normalizedValue.migrationVersion !== undefined &&\n version > normalizedValue.migrationVersion\n\n if (\n storedVersionIsInvalid ||\n signalVersionIsSuperior ||\n normalizedValue.value === undefined\n ) {\n return of(value)\n }\n\n const correctVersionValue = normalizedValue.value\n\n if (process.env.NODE_ENV === \"development\") {\n console.log(\n \"[reactjrx][state][persistance]:\",\n \"Hydrate value\",\n normalizedValue,\n `for signal ${signal.config.key}`,\n )\n }\n\n signal.setValue(hydrate({ value: correctVersionValue, version }))\n\n return of(value)\n }),\n )\n}\n","import {\n asyncScheduler,\n catchError,\n EMPTY,\n from,\n map,\n merge,\n of,\n share,\n switchMap,\n tap,\n throttleTime,\n zip,\n} from \"rxjs\"\nimport type { Signal } from \"../Signal\"\nimport type { Adapter } from \"./adapters/Adapter\"\nimport { hydrateValueToSignal, persistValue } from \"./helpers\"\nimport type { SignalPersistenceConfig } from \"./types\"\n\nexport function persistSignals({\n entries = [],\n onHydrated,\n adapter,\n}: {\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n entries: Array<SignalPersistenceConfig<Signal<any, string>>>\n /**\n * Triggered after first successful hydrate\n */\n onHydrated?: () => void\n /**\n * Requires a stable instance otherwise the hydration\n * process will start again. This is useful when you\n * need to change adapter during runtime.\n */\n adapter: Adapter\n}) {\n const signalsHydrated$ =\n entries.length === 0\n ? of([])\n : zip(\n ...entries.map((config) =>\n hydrateValueToSignal({\n adapter,\n config,\n }),\n ),\n )\n\n const isHydrated$ = signalsHydrated$.pipe(\n tap(onHydrated),\n catchError((error) => {\n console.error(\"Unable to hydrate\", error)\n\n return EMPTY\n }),\n share(),\n )\n\n /**\n * Start persisting to the current adapter\n * as soon as signals are hydrated. Will stop\n * whenever hydration process starts again\n */\n const persisted$ = isHydrated$.pipe(\n switchMap(() =>\n merge(\n ...entries.map((config) =>\n config.signal.pipe(\n throttleTime(500, asyncScheduler, {\n trailing: true,\n }),\n switchMap(() =>\n from(\n persistValue({\n adapter,\n config,\n }),\n ),\n ),\n ),\n ),\n ),\n ),\n )\n\n return merge(\n isHydrated$.pipe(\n map(() => ({\n type: \"hydrated\" as const,\n })),\n ),\n persisted$.pipe(\n map(() => ({\n type: \"persisted\" as const,\n })),\n ),\n )\n}\n","import { concatMap, merge, of, scan, switchMap } from \"rxjs\"\nimport { useLiveBehaviorSubject } from \"../../binding/useLiveBehaviorSubject\"\nimport { useObserve } from \"../../binding/useObserve\"\nimport { useLiveRef } from \"../../utils/react/useLiveRef\"\nimport { isShallowEqual } from \"../../utils/shallowEqual\"\nimport type { Adapter } from \"../persistance/adapters/Adapter\"\nimport { persistSignals } from \"../persistance/persistSignals\"\nimport type { SignalPersistenceConfig } from \"../persistance/types\"\n\n/**\n * Make sure to pass stable reference of entries and adapter if you don't\n * intentionally want to start over the process.\n *\n * `isHydrated` will be `true` after the first successful hydration. This value\n * will be reset as soon as the adapter reference changes.\n */\nexport function usePersistSignals({\n entries = [],\n onHydrated,\n adapter,\n}: {\n /**\n * Passing a new list of entries will start over the process\n * once the current one is finished. Use a stable reference to avoid\n * inifite loop.\n */\n\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n entries?: Array<SignalPersistenceConfig<any>>\n /**\n * Triggered after first successful hydrate\n */\n onHydrated?: () => void\n /**\n * Passing a new adapter reference will start over the process\n * once the current one is finished. Use a stable reference to avoid\n * inifite loop.\n */\n adapter?: Adapter\n}): { isHydrated: boolean } {\n const onHydratedRef = useLiveRef(onHydrated)\n const adapterSubject = useLiveBehaviorSubject(adapter)\n const entriesSubject = useLiveBehaviorSubject(entries)\n\n return useObserve(\n () => {\n const persistence$ = adapterSubject.pipe(\n switchMap((adapter) => {\n if (!adapter) return of({ type: \"reset\" })\n\n return merge(\n of({ type: \"reset\" }),\n entriesSubject.pipe(\n concatMap((entries) =>\n persistSignals({\n adapter,\n entries,\n onHydrated: () => {\n onHydratedRef.current?.()\n },\n }),\n ),\n ),\n )\n }),\n )\n\n return persistence$.pipe(\n scan(\n (acc, event) => {\n if (event.type === \"reset\") return { isHydrated: false }\n if (event.type === \"hydrated\") return { isHydrated: true }\n\n return acc\n },\n { isHydrated: false as boolean },\n ),\n )\n },\n { defaultValue: { isHydrated: false }, compareFn: isShallowEqual },\n [adapterSubject, entriesSubject],\n )\n}\n","import { type Signal, VirtualSignal } from \"../Signal\"\nimport {\n useMakeOrRetrieveSignal,\n useSignalContext,\n} from \"./SignalContextProvider\"\n\nexport function useSignalReference<T>(\n signal: Signal<T> | VirtualSignal<T>,\n): Signal<T> {\n const signalContext = useSignalContext()\n\n if (signal instanceof VirtualSignal && !signalContext) {\n throw new Error(\n \"useSignalValue must be used within a SignalContextProvider\",\n )\n }\n\n return (useMakeOrRetrieveSignal(\n signal instanceof VirtualSignal ? signal : undefined,\n ) ?? signal) as Signal<T>\n}\n","import type { Signal, VirtualSignal } from \"../Signal\"\nimport { useSignalReference } from \"./useSignalReference\"\n\nexport function useSetSignal<T>(signal: Signal<T>): Signal<T>[\"update\"]\nexport function useSetSignal<T>(signal: VirtualSignal<T>): Signal<T>[\"update\"]\nexport function useSetSignal<T>(signal: Signal<T> | VirtualSignal<T>) {\n const finalSignal = useSignalReference(signal)\n\n return finalSignal.update\n}\n","// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport const arrayEqual = <A extends any[], B extends any[]>(a: A, b: B) =>\n a.length === b.length && a.every((v, i) => v === b[i])\n","export function isDefined<T>(\n arg: T | null | undefined,\n): arg is T extends null | undefined ? never : T {\n return arg !== null && arg !== undefined\n}\n","export const isServer = typeof window === \"undefined\" || \"Deno\" in window\n","import { defer, merge, type Observable, of, throwError, timer } from \"rxjs\"\nimport {\n catchError,\n concatMap,\n first,\n mergeMap,\n retryWhen,\n tap,\n} from \"rxjs/operators\"\n\nexport interface RetryBackoffConfig<T, TError> {\n // Initial interval. It will eventually go as high as maxInterval.\n initialInterval?: number\n // Maximum delay between retries.\n maxInterval?: number\n // When set to `true` every successful emission will reset the delay and the\n // error count.\n resetOnSuccess?: boolean\n retry?: (attempt: number, error: TError) => boolean\n retryAfterDelay?: (attempt: number, error: TError) => boolean\n // Can be used to delay the retry (outside of backoff process)\n // for example if you want to pause retry due to connectivity issue\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n retryAfter?: () => Observable<any>\n retryDelay?: number | ((attempt: number, error: TError) => number)\n // Conditional retry.\n // shouldRetry?: (attempt: number, error: any) => Observable<boolean>\n backoffDelay?: (iteration: number, initialInterval: number) => number\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n caughtError?: (attempt: number, error: any) => undefined | Observable<T>\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n catchError?: (attempt: number, error: any) => Observable<T>\n}\n\n/** Calculates the actual delay which can be limited by maxInterval */\nexport function getDelay(backoffDelay: number, maxInterval: number) {\n return Math.min(backoffDelay, maxInterval)\n}\n\n/** Exponential backoff delay */\nexport function exponentialBackoffDelay(\n iteration: number,\n initialInterval: number,\n) {\n return 2 ** iteration * initialInterval\n}\n\n/**\n * Returns an Observable that mirrors the source Observable with the exception\n * of an error. If the source Observable calls error, rather than propagating\n * the error call this method will resubscribe to the source Observable with\n * exponentially increasing interval and up to a maximum of count\n * re-subscriptions (if provided). Retrying can be cancelled at any point if\n * shouldRetry returns false.\n */\nexport function retryBackoff<T, TError>(config: RetryBackoffConfig<T, TError>) {\n const {\n retry,\n retryDelay,\n retryAfterDelay,\n retryAfter = () => of(true),\n } = config\n\n const maxRetries =\n typeof retry !== \"function\"\n ? retry === false\n ? 0\n : retry === true\n ? Number.POSITIVE_INFINITY\n : (retry ?? Number.POSITIVE_INFINITY)\n : Number.POSITIVE_INFINITY\n\n const shouldRetry =\n typeof retry === \"function\"\n ? // ? (attempt: number, error: TError) => of(retry(attempt, error))\n retry\n : () => true\n\n const initialInterval = typeof retryDelay === \"number\" ? retryDelay : 100\n\n const normalizedConfig = {\n shouldRetry,\n ...config,\n }\n\n const {\n maxInterval = Number.POSITIVE_INFINITY,\n resetOnSuccess = false,\n backoffDelay = exponentialBackoffDelay,\n } = normalizedConfig\n\n return <T>(source: Observable<T>) =>\n defer(() => {\n let caughtErrors = 0\n\n const shouldRetryFn = (attempt: number, error: TError) =>\n attempt < maxRetries ? shouldRetry(attempt, error) : false\n\n return source.pipe(\n catchError<T, Observable<T>>((error) => {\n caughtErrors++\n\n if (!shouldRetryFn(caughtErrors - 1, error)) throw error\n\n const caughtErrorResult$ = config.caughtError?.(caughtErrors, error)\n\n if (!caughtErrorResult$) throw error\n\n return caughtErrorResult$.pipe(\n mergeMap((source) =>\n merge(\n of(source) as unknown as Observable<T>,\n throwError(() => error),\n ),\n ),\n )\n }),\n retryWhen<T>((errors) => {\n return errors.pipe(\n concatMap((error) => {\n const attempt = caughtErrors - 1\n\n return retryAfter().pipe(\n first(),\n mergeMap(() =>\n shouldRetryFn(attempt, error)\n ? timer(\n getDelay(\n backoffDelay(attempt, initialInterval),\n maxInterval,\n ),\n ).pipe(\n mergeMap((timer) => {\n if (\n retryAfterDelay &&\n !retryAfterDelay(attempt, error)\n )\n return throwError(() => error)\n\n return of(timer)\n }),\n )\n : throwError(() => error),\n ),\n )\n }),\n )\n }),\n catchError((e) => {\n if (config.catchError) {\n return config.catchError(caughtErrors, e)\n }\n\n throw e\n }),\n tap(() => {\n if (resetOnSuccess) {\n caughtErrors = 0\n }\n }),\n )\n })\n}\n","import { type EffectCallback, useEffect } from \"react\"\n\nexport const useEffectOnce = (effect: EffectCallback) => {\n useEffect(effect, [])\n}\n","import { useEffectOnce } from \"./useEffectOnce\"\n\nexport const useMount = (fn: () => void) => {\n useEffectOnce(() => {\n fn()\n })\n}\n","import { useEffect, useState } from \"react\"\nimport { ReplaySubject } from \"rxjs\"\nimport { useRefOnce } from \"./useRefOnce\"\n\nexport const useUnmountObservable = () => {\n const replaySubject = useRefOnce(() => new ReplaySubject(1))\n const [completed, setCompleted] = useState(false)\n\n if (completed) {\n replaySubject.current = new ReplaySubject(1)\n setCompleted(false)\n }\n\n useEffect(() => {\n return () => {\n replaySubject.current.next(undefined)\n setCompleted(true)\n }\n }, [replaySubject])\n\n return replaySubject.current\n}\n","import { distinctUntilChanged, map } from \"rxjs\"\nimport { useObserve } from \"../../binding/useObserve\"\nimport { useLiveRef } from \"../../utils\"\nimport type { Signal, VirtualSignal } from \"../Signal\"\nimport { useSignalReference } from \"./useSignalReference\"\n\nexport function useSignalValue<T>(signal: VirtualSignal<T>): T\n\nexport function useSignalValue<T, SelectValue>(\n signal: VirtualSignal<T>,\n selector: (value: T) => SelectValue,\n): SelectValue\n\nexport function useSignalValue<T>(signal: Signal<T>): T\n\nexport function useSignalValue<T, SelectValue>(\n signal: Signal<T>,\n selector: (value: T) => SelectValue,\n): SelectValue\n\nexport function useSignalValue<T, SelectValue>(\n signal: Signal<T>,\n selector: (value: T) => SelectValue,\n): SelectValue | undefined\n\nexport function useSignalValue(\n signal: Signal<unknown> | VirtualSignal<unknown>,\n selector?: (value: unknown) => unknown,\n) {\n const selectorRef = useLiveRef(selector)\n\n const finalSignal = useSignalReference(signal)\n\n return useObserve(\n () => {\n const defaultSelector = selectorRef.current ?? ((value: unknown) => value)\n\n const observed$ = finalSignal.pipe(\n map(defaultSelector),\n distinctUntilChanged(),\n )\n\n return observed$\n },\n {\n defaultValue: selector\n ? selector?.(finalSignal.value)\n : finalSignal.value,\n },\n [finalSignal],\n )\n}\n","import type { Signal, VirtualSignal } from \"../Signal\"\nimport { useSetSignal } from \"./useSetSignal\"\nimport { useSignalReference } from \"./useSignalReference\"\nimport { useSignalValue } from \"./useSignalValue\"\n\nexport function useSignal<T>(\n signal: VirtualSignal<T>,\n): [T, Signal<T>[\"update\"], Signal<T>]\n\nexport function useSignal<T>(\n signal: Signal<T>,\n): [T, Signal<T>[\"update\"], Signal<T>]\n\nexport function useSignal<T>(\n signal: Signal<T>,\n): [T | undefined, Signal<T>[\"update\"], Signal<T>]\n\nexport function useSignal<T>(signal: Signal<T> | VirtualSignal<T>) {\n const finalSignal = useSignalReference(signal)\n const value = useSignalValue(signal)\n const setValue = useSetSignal(signal)\n\n return [value, setValue, finalSignal] as const\n}\n","import { useConstant } from \"../../utils\"\nimport type { Signal } from \"../Signal\"\nimport { useSignalValue } from \"./useSignalValue\"\n\n// biome-ignore lint/suspicious/noExplicitAny: TODO\nexport const useSignalState = <S extends Signal<any, any>>(\n fn: () => S,\n): [S[\"value\"], S] => {\n const signal = useConstant(fn)\n const value = useSignalValue(signal)\n\n return [value, signal] as const\n}\n"],"names":["useRefOnce","fn","ref","useRef","useEffect","useConstant","useLiveBehaviorSubject","state","subject","BehaviorSubject","useLiveRef","value","useMemo","useObservableState","defaultValue","subject$","setState","useCallback","isPromiseLike","makeObservable","something","isObservable","from","of","somethingAsFunction","params","defer","result","useObserve","source$","optionsOrDeps","maybeDeps","options","deps","valueRef","sourceRef","optionsRef","observable","shareReplay","getSnapshot","sub","v","subscribe","next","startWith","identity","distinctUntilChanged","a","b","tap","catchError","error","EMPTY","useSyncExternalStore","useSubscribe","source","useSubscribeEffect","unsafeOptions","retryOption","onErrorRef","sourceAsObservable","enhancerMakeObservable","retry","QueryClient$","queryHash","queryKey","query$","signal","hashKey","sharedQuery$","takeUntil","fromEvent","share","cacheEntry","data","entry","_","key","Context","createContext","QueryClientProvider$","memo","children","_client","client","useState","useQueryClient$","useContext","useMutation$","queryClient","stateSubject","useMutation","variables","lastData","resolve","reject","take","status","isPending","isError","isSuccess","isIdle","useContactMutation$","useQueryClient","mutationKey","mutateAsync","rest","context","ready$","filter","isReady","first","switchMap","mutateAsyncConcat","mutations","mutation","noop","mutateConcat","useQuery$","_queryClient","queryClient$","queryFnAsync","getSource","queryAlreadyInCache","queryCacheEntry","refetchIfNeeded","delay","useQuery","SwitchMutationCancelError","message","useSwitchMutation$","previousMutationCancelRef","mutate","abort","merge","ignoreElements","defaultIfEmpty","mutateSwitch","mutateAsyncSwitch","SIGNAL_RESET","createLocalforageAdapter","forage","serializedValue","normalizeStore","store","createSharedStoreAdapter","adapter","keyToDelete","unsafeStore","toRemove","itemKey","createLocalStorageAdapter","Signal","config","valueOrUpdater","updater","VirtualSignal","virtualSignal","SignalContext","existingSignal","newSignal","SignalReactContext","SignalContextProvider","signalContextRef","signalContext","isDestroyed","setIsDestroyed","jsx","useSignalContext","useMakeOrRetrieveSignal","isShallowEqual","objA","objB","keysA","keysB","IDENTIFIER_PERSISTANCE_KEY","getNormalizedPersistanceValue","unknownValue","persistValue","version","e","hydrateValueToSignal","hydrate","normalizedValue","storedVersionIsInvalid","signalVersionIsSuperior","correctVersionValue","persistSignals","entries","onHydrated","isHydrated$","zip","persisted$","throttleTime","asyncScheduler","map","usePersistSignals","onHydratedRef","adapterSubject","entriesSubject","concatMap","scan","acc","event","useSignalReference","useSetSignal","arrayEqual","i","isDefined","arg","isServer","getDelay","backoffDelay","maxInterval","exponentialBackoffDelay","iteration","initialInterval","retryBackoff","retryDelay","retryAfterDelay","retryAfter","maxRetries","shouldRetry","normalizedConfig","resetOnSuccess","caughtErrors","shouldRetryFn","attempt","caughtErrorResult$","mergeMap","throwError","retryWhen","errors","timer","useEffectOnce","effect","useMount","useUnmountObservable","replaySubject","ReplaySubject","completed","setCompleted","useSignalValue","selector","selectorRef","finalSignal","defaultSelector","useSignal","setValue","useSignalState"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
+
export * from './lib/binding/useLiveBehaviorSubject';
|
|
2
|
+
export * from './lib/binding/useObservableState';
|
|
1
3
|
export * from './lib/binding/useObserve';
|
|
2
4
|
export * from './lib/binding/useSubscribe';
|
|
3
|
-
export * from './lib/binding/useObservableState';
|
|
4
|
-
export * from './lib/binding/useLiveBehaviorSubject';
|
|
5
5
|
export * from './lib/binding/useSubscribeEffect';
|
|
6
|
-
export * from './lib/
|
|
7
|
-
export * from './lib/
|
|
8
|
-
export * from './lib/
|
|
9
|
-
export * from './lib/
|
|
10
|
-
export * from './lib/
|
|
11
|
-
export * from './lib/state/react/SignalContextProvider';
|
|
6
|
+
export * from './lib/queries/QueryClientProvider$';
|
|
7
|
+
export * from './lib/queries/useConcatMutation$';
|
|
8
|
+
export * from './lib/queries/useMutation$';
|
|
9
|
+
export * from './lib/queries/useQuery$';
|
|
10
|
+
export * from './lib/queries/useSwitchMutation$';
|
|
12
11
|
export * from './lib/state/constants';
|
|
13
12
|
export * from './lib/state/persistance/adapters/createLocalforageAdapter';
|
|
14
13
|
export * from './lib/state/persistance/adapters/createLocalStorageAdapter';
|
|
15
|
-
export * from './lib/state/react/usePersistSignals';
|
|
16
14
|
export type { SignalPersistenceConfig } from './lib/state/persistance/types';
|
|
15
|
+
export * from './lib/state/react/SignalContextProvider';
|
|
16
|
+
export * from './lib/state/react/usePersistSignals';
|
|
17
|
+
export * from './lib/state/react/useSetSignal';
|
|
18
|
+
export * from './lib/state/react/useSignal';
|
|
19
|
+
export * from './lib/state/react/useSignalState';
|
|
20
|
+
export * from './lib/state/react/useSignalValue';
|
|
21
|
+
export * from './lib/state/Signal';
|
|
17
22
|
export * from './lib/utils';
|
|
18
|
-
export * from './lib/queries/useQuery$';
|
|
19
|
-
export * from './lib/queries/useMutation$';
|
|
20
|
-
export * from './lib/queries/useSwitchMutation$';
|
|
21
|
-
export * from './lib/queries/useConcatMutation$';
|
|
22
|
-
export * from './lib/queries/QueryClientProvider$';
|