reactjrx 2.0.3 → 2.1.1

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_c","valueOrUpdater","_c","updaterFn","catchError","retry","first","tap","_c","_c","_c","deps","_c","error","lastData","_c","_temp","variables","_c","_temp","_temp2","_c","_temp","transformedQueries","_c","variables","_c","_c","signal","adapter","_c","_c","_c","_c","c","createContext","memo","useCallback","useContext","useEffect","useMemo","useRef","useState","useSyncExternalStore","BehaviorSubject","EMPTY","NEVER","Observable","Subscription","asyncScheduler","catchError","defaultIfEmpty","defer","distinctUntilChanged","filter","finalize","first","from","fromEvent","ignoreElements","isObservable","map","merge","noop","of","retry","scan","share","skip","switchMap","take","tap","throttleTime","throwError","timer","catchError$1","first$1","mergeMap","retry$1","tap$1","CancelledError","skipToken","useMutation","useQueries","useQuery","useQueryClient","jsx","UNSET_SYMBOL","Symbol","useRefOnce","fn","ref","current","useConstant","useLiveBehaviorSubject","state","$","t0","subject","t1","t2","Object","is","getValue","next","useObservableState","defaultValue","valueOrUpdater","newValue","valueOrUpdater_0","setState","onChange","sub","pipe","subscribe","unsubscribe","t3","value","t4","arrayEqual","a","b","length","every","v","i","isDefined","arg","isPromiseLike","Promise","then","catch","isServer","window","getDelay","backoffDelay","maxInterval","Math","min","exponentialBackoffDelay","iteration","initialInterval","retryBackoff","config","shouldRetry","retryAfterDelay","retryAfter","Number","POSITIVE_INFINITY","resetOnSuccess","source","caughtErrors","error","caughtErrorResult$","caughtError","delay","attempt","e","useEffectOnce","effect","for","useUnmount","fnRef","useDebounced","func","wait","options","cancelOnUnmount","timeout","callback","clearTimeout","setTimeout","useLiveRef","useMemoCompare","compare","lastValue","useMount","ObservableStore","source$","constructor","miscSource$","compareFn","hasNoDefinedSource","this","data","status","observableState","complete","getSnapshot","useObserve","optionsOrDeps","maybeDeps","Array","isArray","store","deps","optionsRef","storeRef","useStore","makeObservable","something","somethingAsFunction","params","result","useSubscribe","defaultRetryDelay","useSubscribeEffect","onError","error_0","retryCount","retryOption","retryDelay","resolveMutationFnSource","mutationFn","variables","adaptCallbacksToWrappedVariables","onMutate","onSuccess","onSettled","rest","useMutation$","queryClient","stateSubject","_temp$3","lastData","resolve","reject","Error","isPending","isError","isSuccess","isIdle","state$","useConcatMutation$","client","mutationKey","ready$","_temp$2","mutateAsync","async","variables_0","mutations","getMutationCache","findAll","exact","all","_temp2$1","finally","mutateAsyncConcat","t5","variables_1","mutateConcat","t6","mutate","mutation","continue","isReady","streams","WeakMap","createObservableQueryFn","queryFn","context","queryCache","getQueryCache","query","getAll","find","queryKey","settle","signal","subscription","addEventListener","once","settleWithFirstValue","running","get","fetch","isFollow","isStartingFollow","stream","stop","isComplete","last","phase","takeOver","isStopped","uncommitted","invalidate","unsubscribeFromCache","delete","fail","onCommit","setData","manual","getObserversCount","event","type","action","set","add","JSON","stringify","console","warn","startStream","queueMicrotask","watchAbort","useQueries$","queries","_temp$1","combine","subscribed","useQuery$","SwitchMutationCancelError","message","super","name","useSwitchMutation$","previousMutationCancelRef","_temp","abort","aborted","_temp2","AbortController","mutateSwitch","t7","mutateAsyncSwitch","t8","SIGNAL_RESET","createLocalforageAdapter","forage","getItem","key","serializedValue","parse","setItem","removeItem","_","clear","normalizeStore","createLocalStorageAdapter","adapter","keyToDelete","unsafeStore","toRemove","itemKey","createSharedStoreAdapter","localStorage","Signal","default","update","updater","setValue","bind","VirtualSignal","virtualSignal","SignalContext","signals","Map","isDestroyed","getOrCreateSignal","existingSignal","newSignal","destroy","forEach","SignalReactContext","SignalContextProvider","children","signalContextRef","signalContext","setIsDestroyed","Provider","useSignalContext","useMakeOrRetrieveSignal","isShallowEqual","objA","objB","keysA","keys","keysB","hasOwnProperty","IDENTIFIER_PERSISTENCE_KEY","hydrateAndPersistEntry","entry","resetToDefault","onHydrated","lastPersistedValue","persist","version","migrationVersion","process","env","NODE_ENV","log","persistValue","hydrate","withoutStoredValue","normalizedValue","unknownValue","getNormalizedPersistanceValue","storedVersionIsInvalid","signalVersionIsSuperior","correctVersionValue","hydrateValueToSignal","trailing","usePersistSignals","entries","onHydratedRef","adapterSubject","entriesSubject","previous","adapter_0","firstAdapter","replacesAnother","adapter_1","entries$","subscriber","hydrating","Set","isUpdatingEntries","isHydrated","notifyIfHydrated","size","start","entriesSubscription","has","persistSignals","useSignalReference","useSetSignal","defaultEqualityFn","useSignalValue","selector","equalityFn","finalSignal","hasValue","sourceValue","cacheRef","cached","useSignal","useSignalState"],"sources":["../src/lib/utils/react/useRefOnce.ts","../src/lib/utils/react/useConstant.ts","../src/lib/binding/useLiveBehaviorSubject.ts","../src/lib/binding/useObservableState.ts","../src/lib/utils/arrayEqual.ts","../src/lib/utils/isDefined.ts","../src/lib/utils/isPromiseLike.ts","../src/lib/utils/isServer.ts","../src/lib/utils/operators/retryBackoff.ts","../src/lib/utils/react/useEffectOnce.ts","../src/lib/utils/react/useUnmount.ts","../src/lib/utils/react/useDebounced.ts","../src/lib/utils/react/useLiveRef.ts","../src/lib/utils/react/useMemoCompare.ts","../src/lib/utils/react/useMount.ts","../src/lib/binding/useObserve/store.ts","../src/lib/binding/useObserve/useStore.ts","../src/lib/binding/useObserve/useObserve.ts","../src/lib/utils/makeObservable.ts","../src/lib/binding/useSubscribe/useSubscribe.ts","../src/lib/binding/useSubscribeEffect.ts","../src/lib/queries/mutationOptions.ts","../src/lib/queries/useMutation$.ts","../src/lib/queries/useConcatMutation$.ts","../src/lib/queries/createObservableQueryFn.ts","../src/lib/queries/useQueries$.ts","../src/lib/queries/useQuery$.ts","../src/lib/queries/useSwitchMutation$.ts","../src/lib/state/constants.ts","../src/lib/state/persistence/adapters/createLocalforageAdapter.ts","../src/lib/state/persistence/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/persistence/constants.ts","../src/lib/state/persistence/helpers.ts","../src/lib/state/persistence/persistSignals.ts","../src/lib/state/react/usePersistSignals.tsx","../src/lib/state/react/useSignalReference.ts","../src/lib/state/react/useSetSignal.ts","../src/lib/state/react/useSignalValue.ts","../src/lib/state/react/useSignal.ts","../src/lib/state/react/useSignalState.ts"],"sourcesContent":["import { useRef } from \"react\"\n\nconst UNSET_SYMBOL = Symbol(\"UNSET\")\n\nexport const useRefOnce = <T>(fn: () => T) => {\n const ref = useRef<T | typeof UNSET_SYMBOL>(UNSET_SYMBOL)\n\n if (ref.current === UNSET_SYMBOL) {\n ref.current = fn()\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 /**\n * The subject already holds the initial state, so the mount effect must not\n * emit it a second time.\n */\n if (!Object.is(subject.getValue(), state)) {\n subject.next(state)\n }\n }, [state, subject])\n\n return subject\n}\n","import {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useSyncExternalStore,\n} from \"react\"\nimport { BehaviorSubject, skip } from \"rxjs\"\nimport { useConstant } from \"../utils/react/useConstant\"\n\nexport const useObservableState = <T>(\n defaultValue: T,\n): [T, Dispatch<SetStateAction<T>>, BehaviorSubject<T>] => {\n const subject = useConstant(() => new BehaviorSubject(defaultValue))\n\n const setState = useCallback(\n (valueOrUpdater: SetStateAction<T>) => {\n const getNewValue = (valueOrUpdater: SetStateAction<T>) => {\n if (typeof valueOrUpdater === \"function\") {\n const updaterFn = valueOrUpdater as (prev: T) => T\n return updaterFn(subject.getValue())\n }\n\n return valueOrUpdater\n }\n\n const newValue = getNewValue(valueOrUpdater)\n\n if (newValue === subject.getValue()) {\n return\n }\n\n subject.next(newValue)\n },\n [subject],\n )\n\n const subscribe = useCallback(\n (onChange: () => void) => {\n /**\n * `BehaviorSubject` synchronously replays its current value to new\n * subscribers while `useSyncExternalStore` reads the initial value\n * through `getSnapshot`, so the first emission is skipped to only\n * notify React about actual changes.\n */\n const sub = subject.pipe(skip(1)).subscribe(onChange)\n\n return () => {\n sub.unsubscribe()\n }\n },\n [subject],\n )\n\n const getSnapshot = useCallback(() => subject.getValue(), [subject])\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return [value, setState, subject]\n}\n","export const arrayEqual = <A, B>(a: readonly A[], b: readonly B[]) =>\n a.length === b.length && a.every((v, i) => (v as unknown) === 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","// 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 typeof value.catch === \"function\")\n )\n}\n","export const isServer = typeof window === \"undefined\" || \"Deno\" in window\n","import { defer, merge, type Observable, of, throwError, timer } from \"rxjs\"\nimport { catchError, first, mergeMap, retry, tap } from \"rxjs/operators\"\n\nexport interface RetryBackoffConfig<T, TError> {\n // Base delay of the backoff (default 100 ms), passed to backoffDelay. With\n // the default exponential backoff, retry n waits 2^n * initialInterval, up\n // to 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 // Computes the delay before retry `iteration` (0-based) from\n // initialInterval. Defaults to exponentialBackoffDelay.\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 this operator resubscribes to the source Observable after a\n * backoff delay (exponentially increasing by default). Retrying stops as soon\n * as `retry` returns false.\n */\nexport function retryBackoff<T, TError>(config: RetryBackoffConfig<T, TError>) {\n const {\n retry: shouldRetry = () => true,\n retryAfterDelay,\n retryAfter = () => of(true),\n initialInterval = 100,\n maxInterval = Number.POSITIVE_INFINITY,\n resetOnSuccess = false,\n backoffDelay = exponentialBackoffDelay,\n } = config\n\n return <T>(source: Observable<T>) =>\n defer(() => {\n let caughtErrors = 0\n\n return source.pipe(\n catchError<T, Observable<T>>((error) => {\n caughtErrors++\n\n if (!shouldRetry(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 retry({\n delay: (error) => {\n const attempt = caughtErrors - 1\n\n return retryAfter().pipe(\n first(),\n mergeMap(() =>\n shouldRetry(attempt, error)\n ? timer(\n getDelay(\n backoffDelay(attempt, initialInterval),\n maxInterval,\n ),\n ).pipe(\n mergeMap((timer) => {\n if (retryAfterDelay && !retryAfterDelay(attempt, error))\n return throwError(() => error)\n\n return of(timer)\n }),\n )\n : throwError(() => error),\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 // biome-ignore lint/correctness/useExhaustiveDependencies: we want to run the effect only once\n useEffect(effect, [])\n}\n","import { useRef } from \"react\"\nimport { useEffectOnce } from \"./useEffectOnce\"\n\n// biome-ignore lint/suspicious/noExplicitAny: Expected any\nexport const useUnmount = (fn: () => any): void => {\n const fnRef = useRef(fn)\n\n // update the ref each render so if it change the newest callback will be invoked\n fnRef.current = fn\n\n useEffectOnce(() => () => fnRef.current())\n}\n","import { useCallback, useRef } from \"react\"\nimport { useUnmount } from \"./useUnmount\"\n\n/**\n * @param func Function to be debounced\n * @param wait time in ms to debounce function, default to 300\n * @returns the debounced callback function\n */\nexport const useDebounced = <T>(\n func: ((arg: T) => void) | (() => void),\n wait: number,\n options: {\n cancelOnUnmount?: boolean\n } = {},\n) => {\n const { cancelOnUnmount = false } = options\n const timeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const callback = useCallback(\n (arg: T) => {\n timeout.current !== null && clearTimeout(timeout.current)\n timeout.current = setTimeout(() => func(arg), wait)\n },\n [func, wait],\n )\n\n useUnmount(() => {\n if (cancelOnUnmount) {\n timeout.current && clearTimeout(timeout.current)\n }\n })\n\n return callback\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 { useMemo, useRef } from \"react\"\n\nexport const useMemoCompare = <T>(\n value: T,\n compare: (a: T, b: T) => boolean,\n) => {\n const lastValue = useRef<{ value: T }>({ value })\n\n return useMemo(() => {\n if (compare(value, lastValue.current.value)) {\n return lastValue.current.value\n }\n\n lastValue.current = { value }\n\n return value\n }, [value, compare])\n}\n","import { useEffectOnce } from \"./useEffectOnce\"\n\nexport const useMount = (fn: () => void) => {\n useEffectOnce(() => {\n fn()\n })\n}\n","import {\n BehaviorSubject,\n distinctUntilChanged,\n NEVER,\n type Observable,\n Subscription,\n share,\n tap,\n} from \"rxjs\"\n\nexport type State<T, DefaultValue, Error = unknown> = {\n data: T | DefaultValue\n status: \"pending\" | \"success\" | \"error\"\n observableState: \"complete\" | \"error\" | \"live\"\n error: Error | undefined\n}\n\nexport interface ObservableStoreOptions<T, DefaultValue> {\n defaultValue: DefaultValue\n compareFn: ((a: T, b: T) => boolean) | undefined\n}\n\nexport class ObservableStore<T, DefaultValue, Error = unknown> {\n state: State<T, DefaultValue, Error>\n source$: Observable<T | undefined>\n sub: Subscription\n\n constructor({\n source$: miscSource$,\n defaultValue,\n compareFn,\n }: {\n source$: Observable<T> | undefined | (() => Observable<T> | undefined)\n } & ObservableStoreOptions<T, DefaultValue>) {\n const source$ =\n typeof miscSource$ === \"function\" ? miscSource$() : miscSource$\n\n const hasNoDefinedSource = source$ === undefined\n\n this.state = {\n data: source$ instanceof BehaviorSubject ? source$.value : defaultValue,\n status: hasNoDefinedSource ? \"success\" : \"pending\",\n observableState: hasNoDefinedSource ? \"complete\" : \"live\",\n error: undefined,\n }\n\n /**\n * There is nothing to observe without a source. The state above is already\n * final (`complete`), which makes `subscribe` a no-op and therefore makes\n * `source$` unreachable. We skip building the pipe chain and opening a\n * subscription for a stream that can never emit.\n */\n if (hasNoDefinedSource) {\n this.source$ = NEVER\n this.sub = Subscription.EMPTY\n\n return\n }\n\n this.source$ = source$.pipe(\n distinctUntilChanged(compareFn),\n tap({\n complete: () => {\n this.state = {\n ...this.state,\n status: \"success\",\n observableState: \"complete\",\n }\n },\n error: (error) => {\n this.state = {\n ...this.state,\n observableState: \"error\",\n status: \"error\",\n error,\n }\n },\n next: (data) => {\n this.state = { ...this.state, data }\n },\n }),\n share(),\n )\n\n /**\n * @important This eager subscription will optimistically update the state.\n * Any observable that is non async (behavior, of(x), etc) will have in fact their state completed\n * by the first render cycle.\n * Although we only correctly type sync state for `BehaviorSubject` we can in fact get the value in sync\n * for more than them.\n * Technically the whole pipe chain runs \"synchronously\".\n *\n * This is not a guarantee, just that in best case scenario there will be only one render.\n *\n * An error is returned in the state, so it is handled here rather than\n * reported to RxJS as unhandled.\n */\n this.sub = this.source$.subscribe({ error: () => {} })\n }\n\n subscribe = (next: () => void) => {\n /**\n * The stream may already have completed or errored by the time React\n * subscribes. It won't emit again, and subscribing to the shared source\n * would only run it a second time.\n */\n if (this.state.observableState !== \"live\") {\n return () => {}\n }\n\n const sub = this.source$.subscribe({\n complete: next,\n error: next,\n next: next,\n })\n\n return () => {\n sub.unsubscribe()\n }\n }\n\n getSnapshot = () => {\n return this.state\n }\n}\n","import { type DependencyList, useEffect, useRef } from \"react\"\nimport type { Observable } from \"rxjs\"\nimport { arrayEqual, useLiveRef } from \"../../utils\"\nimport { ObservableStore } from \"./store\"\nimport type { UseObserveOptions } from \"./types\"\n\ntype StoreReference<T, DefaultValue> = {\n deps: DependencyList\n store: ObservableStore<T, DefaultValue | undefined>\n}\n\n/**\n * Mechanism to initialize / retrieve an existing observable store.\n *\n * - We cannot use `useMemo` because it is theoretically not stable. We need stability,\n * not performance optimization.\n * - Using `useState` would make the API not sync (or optimistically return the wrong value).\n * We want the returned value of a render cycle to be derived from the given arguments. `useState`\n * would force us to update the store asynchronously in a useEffect. Losing at least one render cycle.\n * - We are left with using refs to hold the latest references. We use comparison with given deps as well.\n * We are re-creating store during render cycles which is normally not recommended.\n * However this is \"okay\" since it is to be used inside a useSyncExternalStore and not directly in a render.\n */\nexport const useStore = <T, DefaultValue>(\n source$: Observable<T> | undefined | (() => Observable<T> | undefined),\n options: UseObserveOptions<T, DefaultValue>,\n deps: DependencyList,\n): ObservableStore<T, DefaultValue | undefined> => {\n const optionsRef = useLiveRef(options)\n const storeRef = useRef<StoreReference<T, DefaultValue> | undefined>(\n undefined,\n )\n\n if (!storeRef.current || !arrayEqual(deps, storeRef.current.deps)) {\n storeRef.current = {\n deps,\n store: new ObservableStore({\n source$,\n defaultValue: optionsRef.current.defaultValue,\n compareFn: (a, b) => optionsRef.current?.compareFn?.(a, b) ?? a === b,\n }),\n }\n }\n\n const store = storeRef.current.store\n\n useEffect(\n () => () => {\n store.sub.unsubscribe()\n },\n [store],\n )\n\n return store\n}\n","import { type DependencyList, useSyncExternalStore } from \"react\"\nimport type { BehaviorSubject, Observable } from \"rxjs\"\nimport type { UseObserveResult } from \"./types\"\nimport { useStore } from \"./useStore\"\n\nexport type { UseObserveOptions, UseObserveResult } from \"./types\"\n\ninterface Option<T, R = undefined> {\n defaultValue: R\n compareFn?: (a: T, b: T) => boolean\n}\n\n/**\n * The source can be `undefined` (directly or returned from a factory). This is\n * useful when the observable is not available yet (lazily created, coming from\n * a state, a prop, etc). In that case the hook returns the default value with a\n * `complete` observable state and will start observing as soon as an actual\n * source is given.\n */\nexport function useObserve(\n source: undefined,\n): UseObserveResult<never, undefined>\n\nexport function useObserve<DefaultValue>(\n source: undefined,\n options: Option<unknown, DefaultValue>,\n): UseObserveResult<never, DefaultValue>\n\nexport function useObserve<T>(\n source: BehaviorSubject<T>,\n): UseObserveResult<T, T>\n\nexport function useObserve<T>(\n source: BehaviorSubject<T>,\n options: Omit<Option<T>, \"defaultValue\">,\n): UseObserveResult<T, T>\n\nexport function useObserve<T>(\n source: Observable<T> | undefined,\n): UseObserveResult<T, undefined>\n\nexport function useObserve<T>(\n source: () => Observable<T>,\n deps: DependencyList,\n): UseObserveResult<T, undefined>\n\nexport function useObserve<T>(\n source: () => Observable<T> | undefined,\n deps: DependencyList,\n): UseObserveResult<T, undefined>\n\nexport function useObserve<T, DefaultValue>(\n source: Observable<T> | undefined,\n options: Option<T, DefaultValue>,\n): UseObserveResult<T, DefaultValue>\n\nexport function useObserve<T>(\n source: Observable<T> | undefined,\n options: Omit<Option<T>, \"defaultValue\">,\n): UseObserveResult<T, undefined>\n\nexport function useObserve<T, DefaultValue>(\n source: () => Observable<T>,\n options: Option<T, DefaultValue>,\n deps: DependencyList,\n): UseObserveResult<T, DefaultValue>\n\nexport function useObserve<T, DefaultValue>(\n source: () => Observable<T> | undefined,\n options: Option<T, DefaultValue>,\n deps: DependencyList,\n): UseObserveResult<T, DefaultValue>\n\nexport function useObserve<T, DefaultValue = T>(\n source$: Observable<T> | undefined | (() => Observable<T> | undefined),\n optionsOrDeps?: Partial<Option<T, DefaultValue>> | DependencyList,\n maybeDeps?: DependencyList,\n): UseObserveResult<T, DefaultValue | undefined> {\n const options =\n optionsOrDeps != null && !Array.isArray(optionsOrDeps)\n ? (optionsOrDeps as Partial<Option<T, DefaultValue>>)\n : ({\n defaultValue: undefined,\n compareFn: undefined,\n } satisfies Partial<Option<T, DefaultValue>>)\n const deps =\n !maybeDeps && Array.isArray(optionsOrDeps)\n ? optionsOrDeps\n : typeof source$ === \"function\"\n ? (maybeDeps ?? [])\n : [source$]\n\n const store = useStore<T, DefaultValue | undefined>(source$, options, deps)\n\n const result = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n )\n\n return result\n}\n","import { defer, from, isObservable, type Observable, of } from \"rxjs\"\nimport { isPromiseLike } from \"./isPromiseLike\"\n\ntype FnReturnToObservable<T> =\n 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 { useEffect } from \"react\"\nimport { makeObservable } from \"../../utils/makeObservable\"\nimport type { SubscribeSource } from \"./types\"\n\nexport function useSubscribe<T>(source: SubscribeSource<T>) {\n useEffect(() => {\n const sub = makeObservable(source)().subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }, [source])\n}\n","import { useCallback } from \"react\"\nimport { retry, tap, throwError, timer } from \"rxjs\"\nimport { makeObservable } from \"../utils/makeObservable\"\nimport {\n exponentialBackoffDelay,\n getDelay,\n} from \"../utils/operators/retryBackoff\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\nimport type { SubscribeSource } from \"./useSubscribe/types\"\nimport { useSubscribe } from \"./useSubscribe/useSubscribe\"\n\nexport interface UseSubscribeEffectOptions {\n /**\n * Called on every error of the source, including the ones that are\n * retried.\n */\n onError?: (error: unknown) => void\n /**\n * Whether to subscribe to the source again after an error:\n * - `false` (default): the error ends the subscription;\n * - `true`: retry without limit;\n * - a number: retry at most that many times in a row;\n * - a function: given the attempt (0 for the first retry) and the error,\n * returns whether to retry.\n *\n * The attempt count goes back to 0 once the source emits again.\n */\n retry?: boolean | number | ((attempt: number, error: unknown) => boolean)\n /**\n * Time to wait before each retry, in milliseconds, or a function of the\n * attempt and the error. Retries always wait for a timer, so they never\n * run synchronously, even with `0`. Defaults to an exponential backoff:\n * 1 s, 2 s, 4 s… up to 30 s.\n */\n retryDelay?: number | ((attempt: number, error: unknown) => number)\n}\n\nconst defaultRetryDelay = (attempt: number) =>\n getDelay(exponentialBackoffDelay(attempt, 1000), 30_000)\n\nconst shouldRetry = (\n retryOption: UseSubscribeEffectOptions[\"retry\"],\n attempt: number,\n error: unknown,\n) => {\n if (typeof retryOption === \"function\") return retryOption(attempt, error)\n\n if (typeof retryOption === \"number\") return attempt < retryOption\n\n return retryOption === true\n}\n\n/**\n * Subscribes to `source` while the component is mounted. Options are read\n * at each error, so changing them never subscribes again.\n */\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n options?: UseSubscribeEffectOptions,\n) {\n const optionsRef = useLiveRef(options)\n\n const enhancerMakeObservable = useCallback(() => {\n const source$ = makeObservable(source)()\n\n return source$.pipe(\n tap({\n error: (error) => {\n optionsRef.current?.onError?.(error)\n },\n }),\n retry({\n resetOnSuccess: true,\n delay: (error, retryCount) => {\n const attempt = retryCount - 1\n const { retry: retryOption, retryDelay = defaultRetryDelay } =\n optionsRef.current ?? {}\n\n if (!shouldRetry(retryOption, attempt, error)) {\n return throwError(() => error)\n }\n\n return timer(\n typeof retryDelay === \"function\"\n ? retryDelay(attempt, error)\n : retryDelay,\n )\n },\n }),\n )\n }, [source, optionsRef])\n\n useSubscribe(enhancerMakeObservable)\n}\n","import type { UseMutationOptions } from \"@tanstack/react-query\"\nimport type { Observable } from \"rxjs\"\n\n/**\n * Resolves the public `mutationFn` option — an Observable or a function\n * returning one — to its source Observable for the given variables.\n */\nexport function resolveMutationFnSource<TData, TVariables>(\n mutationFn:\n | ((variables: TVariables) => Observable<TData>)\n | Observable<TData>,\n variables: TVariables,\n) {\n return typeof mutationFn === \"function\" ? mutationFn(variables) : mutationFn\n}\n\ntype MutationCallbacks<TData, TError, TVariables, TOnMutateResult> = Pick<\n UseMutationOptions<TData, TError, TVariables, TOnMutateResult>,\n \"onMutate\" | \"onSuccess\" | \"onError\" | \"onSettled\"\n>\n\n/**\n * Same callbacks, but keyed as required so that spreading the adapted\n * callbacks after `...options` overrides (rather than unions with) the\n * raw-variables callbacks still present in `options`.\n */\ntype AdaptedMutationCallbacks<TData, TError, TVariables, TOnMutateResult> = {\n [K in \"onMutate\" | \"onSuccess\" | \"onError\" | \"onSettled\"]:\n | MutationCallbacks<\n TData,\n TError,\n { variables: TVariables },\n TOnMutateResult\n >[K]\n | undefined\n}\n\n/**\n * Hooks built on top of `useMutation$` (`useSwitchMutation$`,\n * `useConcatMutation$`) run their inner mutation with the user variables\n * wrapped in an envelope (`{ variables, ... }`). This adapts the user-facing\n * callbacks, which expect the raw variables, to that envelope.\n */\nexport function adaptCallbacksToWrappedVariables<\n TData,\n TError,\n TVariables,\n TOnMutateResult,\n>({\n onMutate,\n onSuccess,\n onError,\n onSettled,\n}: MutationCallbacks<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n>): AdaptedMutationCallbacks<TData, TError, TVariables, TOnMutateResult> {\n return {\n onMutate: onMutate\n ? ({ variables }, ...rest) => onMutate(variables, ...rest)\n : undefined,\n onSuccess: (data, { variables }, ...rest) =>\n onSuccess?.(data, variables, ...rest),\n onError: (error, { variables }, ...rest) =>\n onError?.(error, variables, ...rest),\n onSettled: (data, error, { variables }, ...rest) =>\n onSettled?.(data, error, variables, ...rest),\n }\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\"\nimport { resolveMutationFnSource } from \"./mutationOptions\"\n\nexport type UseMutation$Options<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n> = Omit<\n UseMutationOptions<TData, TError, TVariables, TOnMutateResult>,\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 TOnMutateResult = unknown,\n>(\n options: UseMutation$Options<TData, TError, TVariables, TOnMutateResult>,\n queryClient?: QueryClient,\n) {\n const stateSubject = useConstant(\n () =>\n new BehaviorSubject<\n Pick<\n UseMutationResult<TData, TError, TVariables, TOnMutateResult>,\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, TOnMutateResult>(\n {\n ...options,\n mutationFn: (variables: TVariables) => {\n let lastData: { value: TData } | undefined\n\n return new Promise<TData>((resolve, reject) => {\n const source = resolveMutationFnSource(options.mutationFn, variables)\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 {\n adaptCallbacksToWrappedVariables,\n resolveMutationFnSource,\n} from \"./mutationOptions\"\nimport { type UseMutation$Options, useMutation$ } from \"./useMutation$\"\n\nexport function useConcatMutation$<\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 ...adaptCallbacksToWrappedVariables(options),\n mutationFn: ({ ready$, variables }) => {\n const source = resolveMutationFnSource(options.mutationFn, variables)\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 CancelledError,\n type Query,\n type QueryCache,\n type QueryFunctionContext,\n type QueryKey,\n skipToken,\n} from \"@tanstack/react-query\"\nimport { defer, type Observable, Subscription, take } from \"rxjs\"\n\nexport type ObservableQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n> =\n | ((context: QueryFunctionContext<TQueryKey>) => Observable<TQueryFnData>)\n | typeof skipToken\n | Observable<TQueryFnData>\n\n/**\n * A fetch of the query whose stream it settles: either a fetch TanStack\n * started, which ends with the stream's first value, or the fetch that\n * follows the stream while it runs.\n */\ntype StreamFetch = {\n isFollow: boolean\n resolve: (value: unknown) => void\n reject: (error: unknown) => void\n}\n\n/**\n * A query's stream while it runs. It outlives the fetches it settles, so a\n * refetch takes it over instead of subscribing to the source again.\n */\ntype Stream = {\n /**\n * - loading: the fetch that owns the stream waits for its first value,\n * which it resolves with.\n * - resolved: that fetch resolved, but TanStack has not stored its value\n * yet. That commit overwrites the values written after it with the one\n * the fetch resolved with, so the latest is kept in `uncommitted` and\n * written again right after it.\n * - live: the fetch that follows the stream owns it.\n */\n phase: \"loading\" | \"resolved\" | \"live\"\n last: { value: unknown } | undefined\n uncommitted: { value: unknown } | undefined\n error: { value: unknown } | undefined\n isComplete: boolean\n fetch: StreamFetch | undefined\n /** Set while the bridge starts the fetch that follows the stream. */\n isStartingFollow: boolean\n stop: (options?: { invalidate?: boolean }) => void\n}\n\nconst streams = new WeakMap<Query, Stream>()\n\n/**\n * Bridges an Observable-based `queryFn` to the Promise-based `queryFn`\n * expected by TanStack Query. Shared by `useQuery$` and `useQueries$`.\n *\n * Every value is written into the query as soon as the stream emits it. A\n * fetch TanStack starts (mount, `refetch()`, `invalidateQueries()`...) ends\n * once the stream has a value in the cache, like a regular query, so awaiting\n * it settles. Right after it, the bridge starts a fetch that follows the\n * stream: it keeps the query `fetching` while the stream runs and ends when\n * the stream completes or errors. A refetch takes over a running stream and\n * settles with its current value. Cancelling the fetch in progress (the last\n * observer unmounting, `cancelQueries`, the query leaving the cache) stops\n * the stream.\n */\nexport function createObservableQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n>(queryFn: ObservableQueryFn<TQueryFnData, TQueryKey> | undefined) {\n if (queryFn === skipToken || queryFn === undefined) {\n return queryFn\n }\n\n return (context: QueryFunctionContext<TQueryKey>) =>\n new Promise<TQueryFnData>((resolve, reject) => {\n const queryCache = context.client.getQueryCache()\n /**\n * Matched by identity: `context.queryKey` is the very array the query\n * holds, so nothing is hashed and the query is found whatever its\n * `queryKeyHashFn`.\n */\n const query = queryCache\n .getAll()\n .find((query) => query.queryKey === context.queryKey)\n const source$: Observable<unknown> = defer(() =>\n typeof queryFn === \"function\" ? queryFn(context) : queryFn,\n )\n const settle = {\n resolve: resolve as (value: unknown) => void,\n reject,\n }\n\n if (!query) {\n // The query left the cache while an observer still fetches it, so\n // nothing holds later values: the fetch takes the first one.\n settleWithFirstValue(source$, context.signal, settle)\n\n return\n }\n\n const running = streams.get(query)\n const fetch: StreamFetch = {\n isFollow: running?.isStartingFollow ?? false,\n ...settle,\n }\n\n if (running) {\n running.isStartingFollow = false\n takeOver(running, fetch)\n } else {\n startStream(query, queryCache, source$, fetch)\n }\n\n const stream = streams.get(query)\n\n if (stream?.fetch === fetch) watchAbort(stream, fetch, context.signal)\n })\n}\n\nfunction settleWithFirstValue(\n source$: Observable<unknown>,\n signal: AbortSignal,\n { resolve, reject }: Pick<StreamFetch, \"resolve\" | \"reject\">,\n) {\n const subscription = source$.pipe(take(1)).subscribe({\n next: resolve,\n error: reject,\n complete: () => reject(new CancelledError()),\n })\n\n signal.addEventListener(\n \"abort\",\n () => {\n subscription.unsubscribe()\n reject(new CancelledError())\n },\n { once: true },\n )\n}\n\nfunction takeOver(stream: Stream, fetch: StreamFetch) {\n stream.fetch = fetch\n\n if (stream.error) {\n fetch.reject(stream.error.value)\n stream.stop()\n } else if (fetch.isFollow) {\n if (stream.isComplete) {\n fetch.resolve(stream.last?.value)\n stream.stop()\n }\n } else if (stream.last) {\n // A refetch of a running stream settles with its current value.\n stream.phase = \"resolved\"\n fetch.resolve(stream.last.value)\n } else {\n stream.phase = \"loading\"\n }\n}\n\n/**\n * TanStack aborts the signal when it cancels the fetch. A refetch cancels the\n * fetch in progress and starts its own right away, which takes the stream\n * over. Anything else that cancels it (the last observer leaving,\n * `cancelQueries`, the query leaving the cache) stops the stream. The values\n * it wrote stay in the cache but no longer follow it, so the query is marked\n * stale: the next observer that needs it refetches, whatever its `staleTime`.\n */\nfunction watchAbort(stream: Stream, fetch: StreamFetch, signal: AbortSignal) {\n signal.addEventListener(\n \"abort\",\n () => {\n if (stream.fetch !== fetch) return\n\n stream.fetch = undefined\n fetch.reject(new CancelledError())\n\n queueMicrotask(() => {\n if (!stream.fetch && !stream.isStartingFollow) {\n stream.stop({ invalidate: true })\n }\n })\n },\n { once: true },\n )\n}\n\nfunction startStream(\n query: Query,\n queryCache: QueryCache,\n source$: Observable<unknown>,\n fetch: StreamFetch,\n) {\n const subscription = new Subscription()\n let isStopped = false\n\n const stream: Stream = {\n phase: \"loading\",\n last: undefined,\n uncommitted: undefined,\n error: undefined,\n isComplete: false,\n fetch,\n isStartingFollow: false,\n stop: ({ invalidate = false } = {}) => {\n if (isStopped) return\n\n isStopped = true\n subscription.unsubscribe()\n unsubscribeFromCache()\n\n if (streams.get(query) === stream) streams.delete(query)\n\n if (invalidate && stream.last) query.invalidate()\n },\n }\n\n const fail = (error: unknown) => {\n subscription.unsubscribe()\n stream.error = { value: error }\n\n // A resolved fetch can no longer fail: the fetch that follows reports it.\n if (stream.phase === \"resolved\" || stream.isStartingFollow) return\n\n stream.fetch?.reject(error)\n stream.stop()\n }\n\n const onCommit = () => {\n stream.phase = \"live\"\n stream.fetch = undefined\n\n if (stream.uncommitted) {\n query.setData(stream.uncommitted.value, { manual: true })\n stream.uncommitted = undefined\n }\n\n if (stream.isComplete && !stream.error) {\n stream.stop()\n } else if (!stream.error && query.getObserversCount() === 0) {\n // Nothing observes the query (a refetch of an inactive one, say), so\n // nothing would ever cancel the fetch that follows the stream.\n stream.stop({ invalidate: true })\n } else {\n stream.isStartingFollow = true\n query.fetch().catch(() => {})\n }\n }\n\n const unsubscribeFromCache = queryCache.subscribe((event) => {\n if (event.query !== query) return\n\n if (\n event.type === \"updated\" &&\n stream.phase === \"resolved\" &&\n event.action.type === \"success\" &&\n !event.action.manual\n ) {\n onCommit()\n }\n\n /**\n * A follow fetch that has not run yet (paused while offline, say) has no\n * signal TanStack could abort, so stop the stream here instead.\n */\n if (\n (event.type === \"observerRemoved\" &&\n !stream.fetch &&\n query.getObserversCount() === 0) ||\n event.type === \"removed\"\n ) {\n stream.stop({ invalidate: event.type === \"observerRemoved\" })\n }\n })\n\n streams.set(query, stream)\n\n subscription.add(\n source$.subscribe({\n next: (value) => {\n if (value === undefined) {\n // `undefined` is not valid query data, as for any fetch result.\n fail(new Error(`${JSON.stringify(query.queryKey)} data is undefined`))\n\n return\n }\n\n stream.last = { value }\n\n // Cancelled: a refetch that takes the stream over settles with it.\n if (!stream.fetch && !stream.isStartingFollow) return\n\n if (stream.phase === \"loading\") {\n // TanStack stores it as the value the fetch resolves with.\n stream.phase = \"resolved\"\n stream.fetch?.resolve(value)\n\n return\n }\n\n query.setData(value, { manual: true })\n\n if (stream.phase === \"resolved\") stream.uncommitted = { value }\n },\n error: fail,\n complete: () => {\n stream.isComplete = true\n\n // Settled when TanStack stores the resolved value, or by the follow.\n if (stream.phase === \"resolved\" || stream.isStartingFollow) return\n\n if (stream.last) {\n stream.fetch?.resolve(stream.last.value)\n } else {\n console.warn(\n `cancelled due to stream completing without data for query ${JSON.stringify(query.queryKey)}`,\n )\n\n /**\n * A stream that completes without data is considered cancelled.\n * This is the expected behavior if someone for example adds a takeUntil().\n * This also allow the query to be retried automatically instead of\n * resolving as success with `undefined` (which is no-op for react-query)\n * or erroring with arbitrary value.\n */\n stream.fetch?.reject(new CancelledError())\n }\n\n stream.stop()\n },\n }),\n )\n}\n","import {\n type DefaultError,\n type QueriesPlaceholderDataFunction,\n type QueryClient,\n type QueryKey,\n type UseQueryOptions,\n type UseQueryResult,\n useQueries,\n} from \"@tanstack/react-query\"\nimport {\n createObservableQueryFn,\n type ObservableQueryFn,\n} from \"./createObservableQueryFn\"\n\ntype MAXIMUM_DEPTH = 20\n\ntype UseQuery$OptionsForUseQueries<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = Omit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n \"queryFn\" | \"placeholderData\"\n> & {\n queryFn?: ObservableQueryFn<TQueryFnData, TQueryKey>\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\ntype GetUseQuery$Options<T> = T extends {\n queryFn?: ObservableQueryFn<infer TQueryFnData, infer TQueryKey>\n // biome-ignore lint/suspicious/noExplicitAny: select can narrow from any source shape\n select?: (data: any) => infer TData\n}\n ? UseQuery$OptionsForUseQueries<\n TQueryFnData,\n DefaultError,\n unknown extends TData ? TQueryFnData : TData,\n TQueryKey extends QueryKey ? TQueryKey : QueryKey\n >\n : UseQuery$OptionsForUseQueries\n\ntype GetUseQuery$Result<T> = T extends {\n // biome-ignore lint/suspicious/noExplicitAny: queryFnData is inferred from the source shape\n queryFn?: ObservableQueryFn<infer TQueryFnData, any>\n // biome-ignore lint/suspicious/noExplicitAny: select can narrow from any source shape\n select?: (data: any) => infer TData\n}\n ? UseQueryResult<unknown extends TData ? TQueryFnData : TData, DefaultError>\n : UseQueryResult\n\n/**\n * Mirrors TanStack's `QueriesOptions`, but each query takes an Observable-based\n * `queryFn` (see {@link ObservableQueryFn}) instead of a Promise-based one. The\n * recursion preserves per-element tuple inference at the call site.\n */\nexport type QueriesOptions$<\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's QueriesOptions constraint\n T extends Array<any>,\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's QueriesOptions constraint\n TResults extends Array<any> = [],\n TDepth extends ReadonlyArray<number> = [],\n> = TDepth[\"length\"] extends MAXIMUM_DEPTH\n ? Array<UseQuery$OptionsForUseQueries>\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...TResults, GetUseQuery$Options<Head>]\n : T extends [infer Head, ...infer Tails]\n ? QueriesOptions$<\n [...Tails],\n [...TResults, GetUseQuery$Options<Head>],\n [...TDepth, 1]\n >\n : ReadonlyArray<unknown> extends T\n ? T\n : Array<UseQuery$OptionsForUseQueries>\n\n/**\n * Mirrors TanStack's `QueriesResults`, mapping each Observable-based query\n * option to its `UseQueryResult`.\n */\nexport type QueriesResults$<\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's QueriesResults constraint\n T extends Array<any>,\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's QueriesResults constraint\n TResults extends Array<any> = [],\n TDepth extends ReadonlyArray<number> = [],\n> = TDepth[\"length\"] extends MAXIMUM_DEPTH\n ? Array<UseQueryResult>\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...TResults, GetUseQuery$Result<Head>]\n : T extends [infer Head, ...infer Tails]\n ? QueriesResults$<\n [...Tails],\n [...TResults, GetUseQuery$Result<Head>],\n [...TDepth, 1]\n >\n : { [K in keyof T]: GetUseQuery$Result<T[K]> }\n\nexport function useQueries$<\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's useQueries constraint\n T extends Array<any>,\n TCombinedResult = QueriesResults$<T>,\n>(\n {\n queries,\n ...options\n }: {\n queries: readonly [...QueriesOptions$<T>]\n combine?: (result: QueriesResults$<T>) => TCombinedResult\n subscribed?: boolean\n },\n queryClient?: QueryClient,\n): TCombinedResult {\n const transformedQueries = queries.map((query) => ({\n ...query,\n queryFn: createObservableQueryFn(query.queryFn),\n }))\n\n return useQueries(\n {\n /**\n * The Observable `queryFn` has been bridged to a Promise `queryFn`, so\n * `transformedQueries` matches TanStack's expected shape at runtime, but\n * the mapped tuple type is widened by `Array.prototype.map` and can't be\n * re-narrowed without the cast.\n */\n queries: transformedQueries as Parameters<\n typeof useQueries<T, TCombinedResult>\n >[0][\"queries\"],\n combine: options.combine as\n | ((result: unknown) => TCombinedResult)\n | undefined,\n subscribed: options.subscribed,\n },\n queryClient,\n )\n}\n","import {\n type DefaultError,\n type QueryClient,\n type QueryKey,\n type UseQueryOptions,\n useQuery,\n} from \"@tanstack/react-query\"\nimport {\n createObservableQueryFn,\n type ObservableQueryFn,\n} from \"./createObservableQueryFn\"\n\nexport function useQuery$<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n {\n queryFn,\n ...options\n }: Omit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n \"queryFn\"\n > & {\n queryFn: ObservableQueryFn<TQueryFnData, TQueryKey>\n },\n queryClient?: QueryClient,\n) {\n const result = useQuery<TQueryFnData, TError, TData, TQueryKey>(\n {\n ...options,\n queryFn: createObservableQueryFn(queryFn),\n },\n queryClient,\n )\n\n return result\n}\n","import type { DefaultError, QueryClient } from \"@tanstack/react-query\"\nimport { useCallback } from \"react\"\nimport {\n defaultIfEmpty,\n first,\n fromEvent,\n ignoreElements,\n merge,\n tap,\n} from \"rxjs\"\nimport { useRefOnce } from \"../utils\"\nimport {\n adaptCallbacksToWrappedVariables,\n resolveMutationFnSource,\n} from \"./mutationOptions\"\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 TOnMutateResult = unknown,\n>(\n {\n mutationFn,\n ...options\n }: UseMutation$Options<TData | null, TError, TVariables, TOnMutateResult>,\n queryClient?: QueryClient,\n) {\n const previousMutationCancelRef = useRefOnce(() => new AbortController())\n type TDataOrNull = TData | null\n\n const { mutate, mutateAsync, ...rest } = useMutation$<\n TDataOrNull,\n TError,\n { variables: TVariables; abort: AbortSignal },\n TOnMutateResult\n >(\n {\n ...options,\n mutationFn: useCallback(\n ({\n variables,\n abort,\n }: {\n variables: TVariables\n abort: AbortSignal\n }) => {\n if (abort.aborted) {\n throw new SwitchMutationCancelError()\n }\n\n const source = resolveMutationFnSource(mutationFn, variables)\n\n /**\n * `defaultIfEmpty` must sit on the source itself: the abort stream\n * never completes, so the merged stream never completes either and\n * a `defaultIfEmpty` placed after it would never fire — an empty\n * source would leave the mutation pending forever.\n */\n return merge(\n source.pipe(defaultIfEmpty(null)),\n fromEvent(abort, \"abort\").pipe(\n tap(() => {\n throw new SwitchMutationCancelError()\n }),\n ignoreElements(),\n ),\n ).pipe(first())\n },\n [mutationFn],\n ),\n ...adaptCallbacksToWrappedVariables(options),\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, previousMutationCancelRef],\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, previousMutationCancelRef],\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 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/**\n * Distributive helper to validate the shape of the updater function\n * and prevent covariance. Distributes over both T and U so union state\n * types work (updater can return any member of the union).\n */\n// biome-ignore lint/suspicious/noExplicitAny: distributive conditional over U and T for union support\ntype ValidateShape<T, U> = U extends any\n ? // biome-ignore lint/suspicious/noExplicitAny: distributive over T\n T extends any\n ? U extends T\n ? U extends object\n ? { [K in keyof U]: K extends keyof T ? T[K] : never }\n : U\n : never\n : never\n : never\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 = <U>(\n valueOrUpdater:\n | ((prev: T) => U & ValidateShape<T, U>)\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_PERSISTENCE_KEY = \"__reactjrx\"\n","import { catchError, from, of, switchMap } from \"rxjs\"\nimport { SIGNAL_RESET } from \"../constants\"\nimport type { Adapter } from \"./adapters/Adapter\"\nimport { IDENTIFIER_PERSISTENCE_KEY } from \"./constants\"\nimport type { PersistenceEntry, SignalPersistenceConfig } from \"./types\"\n\nconst getNormalizedPersistanceValue = (unknownValue: unknown) => {\n if (\n typeof unknownValue === \"object\" &&\n unknownValue !== null &&\n IDENTIFIER_PERSISTENCE_KEY in unknownValue &&\n unknownValue[IDENTIFIER_PERSISTENCE_KEY] === IDENTIFIER_PERSISTENCE_KEY\n ) {\n return unknownValue as PersistenceEntry\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_PERSISTENCE_KEY]: IDENTIFIER_PERSISTENCE_KEY,\n migrationVersion: version,\n } satisfies PersistenceEntry\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 resetToDefault = false,\n}: {\n adapter: Adapter\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n config: SignalPersistenceConfig<any>\n /**\n * When nothing usable is stored, reset the signal to its default instead of\n * leaving its current value in place.\n */\n resetToDefault?: boolean\n}) {\n const { hydrate = ({ value }) => value, signal, version } = config\n\n const withoutStoredValue = (value: unknown) => {\n if (resetToDefault) signal.update(SIGNAL_RESET)\n\n return of(value)\n }\n\n return from(adapter.getItem(signal.config.key)).pipe(\n switchMap((value) => {\n const normalizedValue = getNormalizedPersistanceValue(value)\n\n if (!normalizedValue) return withoutStoredValue(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 withoutStoredValue(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 finalize,\n Observable,\n Subscription,\n switchMap,\n tap,\n throttleTime,\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\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype AnySignal = Signal<any, string>\ntype Entry = SignalPersistenceConfig<AnySignal>\n\n/**\n * Hydrates one signal from the adapter, then persists its updates (at most\n * every 500 ms) until unsubscribed. On unsubscribe, a value still held by the\n * throttle is saved right away instead of being dropped.\n *\n * `entry.config` is read at every write, so a changed config (e.g. a new\n * `version`) applies to the next write.\n */\nconst hydrateAndPersistEntry = ({\n adapter,\n entry,\n resetToDefault,\n onHydrated,\n}: {\n adapter: Adapter\n entry: { config: Entry }\n resetToDefault: boolean\n onHydrated: () => void\n}) => {\n const { signal } = entry.config\n let lastPersistedValue: unknown\n\n const persist = () => {\n lastPersistedValue = signal.getValue()\n\n return persistValue({ adapter, config: entry.config })\n }\n\n return hydrateValueToSignal({\n adapter,\n config: entry.config,\n resetToDefault,\n }).pipe(\n catchError((error) => {\n console.error(`Unable to hydrate signal ${signal.config.key}`, error)\n\n return EMPTY\n }),\n tap(onHydrated),\n switchMap(() =>\n signal.pipe(\n throttleTime(500, asyncScheduler, {\n trailing: true,\n }),\n switchMap(() => persist()),\n finalize(() => {\n if (signal.getValue() !== lastPersistedValue) {\n persist().subscribe()\n }\n }),\n ),\n ),\n )\n}\n\n/**\n * Hydrates the signals of the latest `entries$` list from the adapter, then\n * persists their updates to it. Entries are matched by signal, so a new array\n * holding the same signals changes nothing:\n * - an added signal is hydrated, then persisted;\n * - a signal still in the list keeps running untouched;\n * - a removed signal stops being persisted, after its pending value is saved.\n *\n * Emits `{ type: \"hydrated\" }` once, the first time every entry added so far\n * has been hydrated (right away for an empty list). An entry that fails to\n * hydrate is logged and never persisted, and holds back that emission until\n * it is removed.\n */\nexport function persistSignals({\n entries$,\n onHydrated,\n adapter,\n resetToDefault = false,\n}: {\n entries$: Observable<Entry[]>\n /**\n * Called when `{ type: \"hydrated\" }` is emitted.\n */\n onHydrated?: () => void\n adapter: Adapter\n /**\n * When true, an entry with nothing usable stored goes back to its default\n * instead of keeping its current value.\n */\n resetToDefault?: boolean\n}) {\n return new Observable<{ type: \"hydrated\" }>((subscriber) => {\n const running = new Map<\n AnySignal,\n { config: Entry; subscription: Subscription }\n >()\n const hydrating = new Set<AnySignal>()\n let isUpdatingEntries = false\n let isHydrated = false\n\n const notifyIfHydrated = () => {\n if (isHydrated || isUpdatingEntries || hydrating.size > 0) return\n\n isHydrated = true\n onHydrated?.()\n subscriber.next({ type: \"hydrated\" })\n }\n\n const start = (config: Entry) => {\n const entry = { config, subscription: new Subscription() }\n\n running.set(config.signal, entry)\n hydrating.add(config.signal)\n\n entry.subscription.add(\n hydrateAndPersistEntry({\n adapter,\n entry,\n resetToDefault,\n onHydrated: () => {\n hydrating.delete(config.signal)\n notifyIfHydrated()\n },\n }).subscribe(),\n )\n }\n\n const stop = (signal: AnySignal) => {\n const entry = running.get(signal)\n\n if (!entry) return\n\n running.delete(signal)\n hydrating.delete(signal)\n entry.subscription.unsubscribe()\n }\n\n const entriesSubscription = entries$.subscribe({\n next: (entries) => {\n isUpdatingEntries = true\n\n const signals = new Set(entries.map(({ signal }) => signal))\n\n for (const signal of [...running.keys()]) {\n if (!signals.has(signal)) stop(signal)\n }\n\n for (const config of entries) {\n const entry = running.get(config.signal)\n\n if (entry) {\n entry.config = config\n } else {\n start(config)\n }\n }\n\n isUpdatingEntries = false\n notifyIfHydrated()\n },\n error: (error) => subscriber.error(error),\n })\n\n return () => {\n entriesSubscription.unsubscribe()\n\n for (const signal of [...running.keys()]) {\n stop(signal)\n }\n }\n })\n}\n","import { map, merge, of, scan, switchMap } from \"rxjs\"\nimport { useLiveBehaviorSubject } from \"../../binding/useLiveBehaviorSubject\"\nimport { useObserve } from \"../../binding/useObserve/useObserve\"\nimport { useLiveRef } from \"../../utils/react/useLiveRef\"\nimport { isShallowEqual } from \"../../utils/shallowEqual\"\nimport type { Adapter } from \"../persistence/adapters/Adapter\"\nimport { persistSignals } from \"../persistence/persistSignals\"\nimport type { SignalPersistenceConfig } from \"../persistence/types\"\n\n/**\n * Hydrates the signals of `entries` from `adapter`, then persists their\n * updates to it.\n *\n * `isHydrated` becomes `true` once the entries have been hydrated for the\n * first time. Entries added later do not change it. It is reset when the\n * adapter changes.\n */\nexport function usePersistSignals({\n entries = [],\n onHydrated,\n adapter,\n}: {\n /**\n * Entries are matched by signal, so the array does not need a stable\n * reference. A signal is hydrated when it is added, then persisted while it\n * stays in the list. When it is removed, its pending value is saved and it\n * stops being persisted.\n */\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n entries?: Array<SignalPersistenceConfig<any>>\n /**\n * Called once per adapter, when `isHydrated` becomes `true`.\n */\n onHydrated?: () => void\n /**\n * Passing a new adapter reference starts over: pending values are saved to\n * the previous adapter, then every entry takes the value stored in the new\n * one. When nothing is stored, or only an older version, the entry goes\n * back to its default once the hook has had two different adapters, so it\n * never carries another adapter's value over (another profile's, for\n * example). Before that, including when the same adapter comes back after\n * a gap without adapter, it keeps its current value. Adapters are compared\n * by reference: a new object for the same storage counts as a different\n * adapter. Use a stable reference to avoid infinite 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 const result = useObserve(\n () =>\n adapterSubject.pipe(\n /**\n * Becomes true once a second, different adapter is passed, and stays\n * true: from then on, a value in memory may come from another adapter\n * than the current one. The same adapter coming back after a gap\n * without adapter (a sign-out, for example) is not a different one.\n */\n scan(\n (previous, adapter) => {\n const firstAdapter = previous.firstAdapter ?? adapter\n\n return {\n adapter,\n firstAdapter,\n replacesAnother:\n previous.replacesAnother ||\n (!!adapter && adapter !== firstAdapter),\n }\n },\n {\n adapter: undefined as Adapter | undefined,\n firstAdapter: undefined as Adapter | undefined,\n replacesAnother: false,\n },\n ),\n switchMap(({ adapter, replacesAnother }) => {\n if (!adapter) return of({ type: \"reset\" as const })\n\n return merge(\n of({ type: \"reset\" as const }),\n persistSignals({\n adapter,\n entries$: entriesSubject,\n resetToDefault: replacesAnother,\n onHydrated: () => {\n onHydratedRef.current?.()\n },\n }),\n )\n }),\n map((event) => ({ isHydrated: event.type === \"hydrated\" })),\n ),\n { defaultValue: { isHydrated: false }, compareFn: isShallowEqual },\n [adapterSubject, entriesSubject],\n )\n\n return result.data\n}\n","import { type Signal, VirtualSignal } from \"../Signal\"\nimport { useSignalContext } 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 (\n signal instanceof VirtualSignal\n ? signalContext.getOrCreateSignal(signal)\n : signal\n ) 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","import { useCallback, useRef, useSyncExternalStore } from \"react\"\nimport { skip } from \"rxjs\"\nimport type { Signal, VirtualSignal } from \"../Signal\"\nimport { useSignalReference } from \"./useSignalReference\"\n\nexport type EqualityFn<T> = (a: T, b: T) => boolean\n\nconst defaultEqualityFn: EqualityFn<unknown> = Object.is\n\n/**\n * Subscribe to a signal's current value, with optional projection and equality.\n *\n * - On every render the returned value is `selector(signal.value)` (or\n * `signal.value` when no selector is provided), recomputed only when the\n * signal value, the selector identity, or the signal itself has changed.\n * - The component re-renders whenever the signal emits a value that the\n * `equalityFn` considers different from the previous one.\n * - The hook caches its last result. When the new selector output is\n * considered equal to the previous one (per `equalityFn`), the previous\n * reference is returned, so downstream `useEffect`/`useMemo` dependencies\n * stay stable.\n *\n * @param signal The signal (or `VirtualSignal` resolved through context) to read.\n * @param selector Optional projection of the signal value.\n * @param equalityFn Optional equality function. Defaults to `Object.is`.\n * Pass `isShallowEqual` (or any custom comparator) to opt into reference\n * stability for derived objects.\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 equalityFn?: EqualityFn<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 equalityFn?: EqualityFn<SelectValue>,\n): SelectValue\n\nexport function useSignalValue(\n signal: Signal<unknown> | VirtualSignal<unknown>,\n selector?: (value: unknown) => unknown,\n equalityFn: EqualityFn<unknown> = defaultEqualityFn,\n) {\n const finalSignal = useSignalReference(signal)\n const cacheRef = useRef<{\n hasValue: boolean\n signal: Signal<unknown> | undefined\n selector: ((value: unknown) => unknown) | undefined\n sourceValue: unknown\n value: unknown\n }>({\n hasValue: false,\n signal: undefined,\n selector: undefined,\n sourceValue: undefined,\n value: undefined,\n })\n\n const subscribe = useCallback(\n (onChange: () => void) => {\n /**\n * `Signal` is a `BehaviorSubject` and synchronously emits its current\n * value to new subscribers. `useSyncExternalStore`'s subscribe contract,\n * however, expects `onChange` to fire only on *changes* — the initial\n * value is read separately via `getSnapshot`. Skipping the first\n * emission keeps the contract clean and avoids a redundant\n * post-subscribe snapshot read by React.\n */\n const sub = finalSignal.pipe(skip(1)).subscribe(() => {\n onChange()\n })\n\n return () => {\n sub.unsubscribe()\n }\n },\n [finalSignal],\n )\n\n const getSnapshot = () => {\n const cached = cacheRef.current\n const sourceValue = finalSignal.value\n\n /**\n * Fast path: nothing relevant changed since last call, so we can skip\n * running the selector entirely and return the previously computed value.\n */\n if (\n cached.hasValue &&\n cached.signal === finalSignal &&\n cached.selector === selector &&\n cached.sourceValue === sourceValue\n ) {\n return cached.value\n }\n\n const next = selector ? selector(sourceValue) : sourceValue\n\n /**\n * Reference-stability path: selector ran (because something changed) but\n * its output is considered equal (per `equalityFn`) to the previous one,\n * so we keep the previous reference to avoid spurious re-renders\n * downstream. With the default `Object.is` this rarely kicks in; when the\n * caller opts into a structural comparator (e.g. `isShallowEqual`) this\n * provides referential stability for derived objects.\n */\n if (\n cached.hasValue &&\n cached.signal === finalSignal &&\n equalityFn(cached.value, next)\n ) {\n cacheRef.current = {\n hasValue: true,\n signal: finalSignal,\n selector,\n sourceValue,\n value: cached.value,\n }\n\n return cached.value\n }\n\n cacheRef.current = {\n hasValue: true,\n signal: finalSignal,\n selector,\n sourceValue,\n value: next,\n }\n\n return next\n }\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\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(finalSignal)\n const setValue = useSetSignal(finalSignal)\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_c","valueOrUpdater","_c","updaterFn","catchError","retry","first","tap","_c","_c","_c","deps","_c","error","lastData","_c","_temp","variables","_c","_temp","_temp2","_c","_temp","transformedQueries","_c","variables","_c","_c","signal","adapter","_c","_c","_c","_c","c","createContext","memo","useCallback","useContext","useEffect","useMemo","useRef","useState","useSyncExternalStore","BehaviorSubject","EMPTY","NEVER","Observable","Subscription","asyncScheduler","catchError","defaultIfEmpty","defer","distinctUntilChanged","filter","finalize","first","from","fromEvent","ignoreElements","isObservable","map","merge","noop","of","retry","scan","share","skip","switchMap","take","tap","throttleTime","throwError","timer","catchError$1","first$1","mergeMap","retry$1","tap$1","CancelledError","skipToken","useMutation","useQueries","useQuery","useQueryClient","jsx","UNSET_SYMBOL","Symbol","useRefOnce","fn","ref","current","useConstant","useLiveBehaviorSubject","state","$","t0","subject","t1","t2","Object","is","getValue","next","useObservableState","defaultValue","valueOrUpdater","newValue","valueOrUpdater_0","setState","onChange","sub","pipe","subscribe","unsubscribe","t3","value","t4","arrayEqual","a","b","length","every","v","i","isDefined","arg","isPromiseLike","Promise","then","catch","isServer","window","getDelay","backoffDelay","maxInterval","Math","min","exponentialBackoffDelay","iteration","initialInterval","retryBackoff","config","shouldRetry","retryAfterDelay","retryAfter","Number","POSITIVE_INFINITY","resetOnSuccess","source","caughtErrors","error","caughtErrorResult$","caughtError","delay","attempt","e","useEffectOnce","effect","for","useUnmount","fnRef","useDebounced","func","wait","options","cancelOnUnmount","timeout","callback","clearTimeout","setTimeout","useLiveRef","useMemoCompare","compare","lastValue","useMount","isShallowEqual","objA","objB","constructor","keysA","keys","keysB","key","hasOwnProperty","ObservableStore","source$","miscSource$","compareFn","hasNoDefinedSource","this","data","status","observableState","complete","getSnapshot","useObserve","optionsOrDeps","maybeDeps","Array","isArray","store","deps","optionsRef","storeRef","useStore","makeObservable","something","somethingAsFunction","params","result","useSubscribe","defaultRetryDelay","useSubscribeEffect","onError","error_0","retryCount","retryOption","retryDelay","resolveMutationFnSource","mutationFn","variables","adaptCallbacksToWrappedVariables","onMutate","onSuccess","onSettled","rest","useMutation$","queryClient","stateSubject","_temp$3","lastData","resolve","reject","Error","isPending","isError","isSuccess","isIdle","state$","useConcatMutation$","client","mutationKey","ready$","_temp$2","mutateAsync","async","variables_0","mutations","getMutationCache","findAll","exact","all","_temp2$1","finally","mutateAsyncConcat","t5","variables_1","mutateConcat","t6","mutate","mutation","continue","isReady","streams","WeakMap","createObservableQueryFn","queryFn","context","queryCache","getQueryCache","query","getAll","find","queryKey","settle","signal","subscription","addEventListener","once","settleWithFirstValue","running","get","fetch","isFollow","isStartingFollow","stream","stop","isComplete","last","phase","takeOver","isStopped","uncommitted","invalidate","unsubscribeFromCache","delete","fail","onCommit","setData","manual","isActive","event","type","action","getObserversCount","cancel","revert","set","add","JSON","stringify","console","warn","startStream","queueMicrotask","watchAbort","useQueries$","queries","_temp$1","combine","subscribed","useQuery$","SwitchMutationCancelError","message","super","name","useSwitchMutation$","previousMutationCancelRef","_temp","abort","aborted","_temp2","AbortController","mutateSwitch","t7","mutateAsyncSwitch","t8","SIGNAL_RESET","createLocalforageAdapter","forage","getItem","serializedValue","parse","setItem","removeItem","_","clear","normalizeStore","createLocalStorageAdapter","adapter","keyToDelete","unsafeStore","toRemove","itemKey","createSharedStoreAdapter","localStorage","Signal","default","update","updater","setValue","bind","VirtualSignal","virtualSignal","SignalContext","signals","Map","isDestroyed","getOrCreateSignal","existingSignal","newSignal","destroy","forEach","SignalReactContext","SignalContextProvider","children","signalContextRef","signalContext","setIsDestroyed","Provider","useSignalContext","useMakeOrRetrieveSignal","IDENTIFIER_PERSISTENCE_KEY","hydrateAndPersistEntry","entry","resetToDefault","onHydrated","lastPersistedValue","persist","version","migrationVersion","process","env","NODE_ENV","log","persistValue","hydrate","withoutStoredValue","normalizedValue","unknownValue","getNormalizedPersistanceValue","storedVersionIsInvalid","signalVersionIsSuperior","correctVersionValue","hydrateValueToSignal","trailing","usePersistSignals","entries","onHydratedRef","adapterSubject","entriesSubject","previous","adapter_0","firstAdapter","replacesAnother","adapter_1","entries$","subscriber","hydrating","Set","isUpdatingEntries","isHydrated","notifyIfHydrated","size","start","entriesSubscription","has","persistSignals","useSignalReference","useSetSignal","defaultEqualityFn","useSignalValue","selector","equalityFn","finalSignal","hasValue","sourceValue","cacheRef","cached","useSignal","useSignalState"],"sources":["../src/lib/utils/react/useRefOnce.ts","../src/lib/utils/react/useConstant.ts","../src/lib/binding/useLiveBehaviorSubject.ts","../src/lib/binding/useObservableState.ts","../src/lib/utils/arrayEqual.ts","../src/lib/utils/isDefined.ts","../src/lib/utils/isPromiseLike.ts","../src/lib/utils/isServer.ts","../src/lib/utils/operators/retryBackoff.ts","../src/lib/utils/react/useEffectOnce.ts","../src/lib/utils/react/useUnmount.ts","../src/lib/utils/react/useDebounced.ts","../src/lib/utils/react/useLiveRef.ts","../src/lib/utils/react/useMemoCompare.ts","../src/lib/utils/react/useMount.ts","../src/lib/utils/shallowEqual.ts","../src/lib/binding/useObserve/store.ts","../src/lib/binding/useObserve/useStore.ts","../src/lib/binding/useObserve/useObserve.ts","../src/lib/utils/makeObservable.ts","../src/lib/binding/useSubscribe/useSubscribe.ts","../src/lib/binding/useSubscribeEffect.ts","../src/lib/queries/mutationOptions.ts","../src/lib/queries/useMutation$.ts","../src/lib/queries/useConcatMutation$.ts","../src/lib/queries/createObservableQueryFn.ts","../src/lib/queries/useQueries$.ts","../src/lib/queries/useQuery$.ts","../src/lib/queries/useSwitchMutation$.ts","../src/lib/state/constants.ts","../src/lib/state/persistence/adapters/createLocalforageAdapter.ts","../src/lib/state/persistence/adapters/createLocalStorageAdapter.ts","../src/lib/state/Signal.ts","../src/lib/state/SignalContext.ts","../src/lib/state/react/SignalContextProvider.tsx","../src/lib/state/persistence/constants.ts","../src/lib/state/persistence/helpers.ts","../src/lib/state/persistence/persistSignals.ts","../src/lib/state/react/usePersistSignals.tsx","../src/lib/state/react/useSignalReference.ts","../src/lib/state/react/useSetSignal.ts","../src/lib/state/react/useSignalValue.ts","../src/lib/state/react/useSignal.ts","../src/lib/state/react/useSignalState.ts"],"sourcesContent":["import { useRef } from \"react\"\n\nconst UNSET_SYMBOL = Symbol(\"UNSET\")\n\nexport const useRefOnce = <T>(fn: () => T) => {\n const ref = useRef<T | typeof UNSET_SYMBOL>(UNSET_SYMBOL)\n\n if (ref.current === UNSET_SYMBOL) {\n ref.current = fn()\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 /**\n * The subject already holds the initial state, so the mount effect must not\n * emit it a second time.\n */\n if (!Object.is(subject.getValue(), state)) {\n subject.next(state)\n }\n }, [state, subject])\n\n return subject\n}\n","import {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useSyncExternalStore,\n} from \"react\"\nimport { BehaviorSubject, skip } from \"rxjs\"\nimport { useConstant } from \"../utils/react/useConstant\"\n\nexport const useObservableState = <T>(\n defaultValue: T,\n): [T, Dispatch<SetStateAction<T>>, BehaviorSubject<T>] => {\n const subject = useConstant(() => new BehaviorSubject(defaultValue))\n\n const setState = useCallback(\n (valueOrUpdater: SetStateAction<T>) => {\n const getNewValue = (valueOrUpdater: SetStateAction<T>) => {\n if (typeof valueOrUpdater === \"function\") {\n const updaterFn = valueOrUpdater as (prev: T) => T\n return updaterFn(subject.getValue())\n }\n\n return valueOrUpdater\n }\n\n const newValue = getNewValue(valueOrUpdater)\n\n if (newValue === subject.getValue()) {\n return\n }\n\n subject.next(newValue)\n },\n [subject],\n )\n\n const subscribe = useCallback(\n (onChange: () => void) => {\n /**\n * `BehaviorSubject` synchronously replays its current value to new\n * subscribers while `useSyncExternalStore` reads the initial value\n * through `getSnapshot`, so the first emission is skipped to only\n * notify React about actual changes.\n */\n const sub = subject.pipe(skip(1)).subscribe(onChange)\n\n return () => {\n sub.unsubscribe()\n }\n },\n [subject],\n )\n\n const getSnapshot = useCallback(() => subject.getValue(), [subject])\n\n const value = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return [value, setState, subject]\n}\n","export const arrayEqual = <A, B>(a: readonly A[], b: readonly B[]) =>\n a.length === b.length && a.every((v, i) => (v as unknown) === 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","// 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 typeof value.catch === \"function\")\n )\n}\n","export const isServer = typeof window === \"undefined\" || \"Deno\" in window\n","import { defer, merge, type Observable, of, throwError, timer } from \"rxjs\"\nimport { catchError, first, mergeMap, retry, tap } from \"rxjs/operators\"\n\nexport interface RetryBackoffConfig<T, TError> {\n // Base delay of the backoff (default 100 ms), passed to backoffDelay. With\n // the default exponential backoff, retry n waits 2^n * initialInterval, up\n // to 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 // Computes the delay before retry `iteration` (0-based) from\n // initialInterval. Defaults to exponentialBackoffDelay.\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 this operator resubscribes to the source Observable after a\n * backoff delay (exponentially increasing by default). Retrying stops as soon\n * as `retry` returns false.\n */\nexport function retryBackoff<T, TError>(config: RetryBackoffConfig<T, TError>) {\n const {\n retry: shouldRetry = () => true,\n retryAfterDelay,\n retryAfter = () => of(true),\n initialInterval = 100,\n maxInterval = Number.POSITIVE_INFINITY,\n resetOnSuccess = false,\n backoffDelay = exponentialBackoffDelay,\n } = config\n\n return <T>(source: Observable<T>) =>\n defer(() => {\n let caughtErrors = 0\n\n return source.pipe(\n catchError<T, Observable<T>>((error) => {\n caughtErrors++\n\n if (!shouldRetry(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 retry({\n delay: (error) => {\n const attempt = caughtErrors - 1\n\n return retryAfter().pipe(\n first(),\n mergeMap(() =>\n shouldRetry(attempt, error)\n ? timer(\n getDelay(\n backoffDelay(attempt, initialInterval),\n maxInterval,\n ),\n ).pipe(\n mergeMap((timer) => {\n if (retryAfterDelay && !retryAfterDelay(attempt, error))\n return throwError(() => error)\n\n return of(timer)\n }),\n )\n : throwError(() => error),\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 // biome-ignore lint/correctness/useExhaustiveDependencies: we want to run the effect only once\n useEffect(effect, [])\n}\n","import { useRef } from \"react\"\nimport { useEffectOnce } from \"./useEffectOnce\"\n\n// biome-ignore lint/suspicious/noExplicitAny: Expected any\nexport const useUnmount = (fn: () => any): void => {\n const fnRef = useRef(fn)\n\n // update the ref each render so if it change the newest callback will be invoked\n fnRef.current = fn\n\n useEffectOnce(() => () => fnRef.current())\n}\n","import { useCallback, useRef } from \"react\"\nimport { useUnmount } from \"./useUnmount\"\n\n/**\n * @param func Function to be debounced\n * @param wait time in ms to debounce function, default to 300\n * @returns the debounced callback function\n */\nexport const useDebounced = <T>(\n func: ((arg: T) => void) | (() => void),\n wait: number,\n options: {\n cancelOnUnmount?: boolean\n } = {},\n) => {\n const { cancelOnUnmount = false } = options\n const timeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const callback = useCallback(\n (arg: T) => {\n timeout.current !== null && clearTimeout(timeout.current)\n timeout.current = setTimeout(() => func(arg), wait)\n },\n [func, wait],\n )\n\n useUnmount(() => {\n if (cancelOnUnmount) {\n timeout.current && clearTimeout(timeout.current)\n }\n })\n\n return callback\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 { useMemo, useRef } from \"react\"\n\nexport const useMemoCompare = <T>(\n value: T,\n compare: (a: T, b: T) => boolean,\n) => {\n const lastValue = useRef<{ value: T }>({ value })\n\n return useMemo(() => {\n if (compare(value, lastValue.current.value)) {\n return lastValue.current.value\n }\n\n lastValue.current = { value }\n\n return value\n }, [value, compare])\n}\n","import { useEffectOnce } from \"./useEffectOnce\"\n\nexport const useMount = (fn: () => void) => {\n useEffectOnce(() => {\n fn()\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: 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","import {\n BehaviorSubject,\n distinctUntilChanged,\n NEVER,\n type Observable,\n Subscription,\n share,\n tap,\n} from \"rxjs\"\n\nexport type State<T, DefaultValue, Error = unknown> = {\n data: T | DefaultValue\n status: \"pending\" | \"success\" | \"error\"\n observableState: \"complete\" | \"error\" | \"live\"\n error: Error | undefined\n}\n\nexport interface ObservableStoreOptions<T, DefaultValue> {\n defaultValue: DefaultValue\n compareFn: ((a: T, b: T) => boolean) | undefined\n}\n\nexport class ObservableStore<T, DefaultValue, Error = unknown> {\n state: State<T, DefaultValue, Error>\n source$: Observable<T | undefined>\n sub: Subscription\n\n constructor({\n source$: miscSource$,\n defaultValue,\n compareFn,\n }: {\n source$: Observable<T> | undefined | (() => Observable<T> | undefined)\n } & ObservableStoreOptions<T, DefaultValue>) {\n const source$ =\n typeof miscSource$ === \"function\" ? miscSource$() : miscSource$\n\n const hasNoDefinedSource = source$ === undefined\n\n this.state = {\n data: source$ instanceof BehaviorSubject ? source$.value : defaultValue,\n status: hasNoDefinedSource ? \"success\" : \"pending\",\n observableState: hasNoDefinedSource ? \"complete\" : \"live\",\n error: undefined,\n }\n\n /**\n * There is nothing to observe without a source. The state above is already\n * final (`complete`), which makes `subscribe` a no-op and therefore makes\n * `source$` unreachable. We skip building the pipe chain and opening a\n * subscription for a stream that can never emit.\n */\n if (hasNoDefinedSource) {\n this.source$ = NEVER\n this.sub = Subscription.EMPTY\n\n return\n }\n\n this.source$ = source$.pipe(\n distinctUntilChanged(compareFn),\n tap({\n complete: () => {\n this.state = {\n ...this.state,\n status: \"success\",\n observableState: \"complete\",\n }\n },\n error: (error) => {\n this.state = {\n ...this.state,\n observableState: \"error\",\n status: \"error\",\n error,\n }\n },\n next: (data) => {\n this.state = { ...this.state, data }\n },\n }),\n share(),\n )\n\n /**\n * @important This eager subscription will optimistically update the state.\n * Any observable that is non async (behavior, of(x), etc) will have in fact their state completed\n * by the first render cycle.\n * Although we only correctly type sync state for `BehaviorSubject` we can in fact get the value in sync\n * for more than them.\n * Technically the whole pipe chain runs \"synchronously\".\n *\n * This is not a guarantee, just that in best case scenario there will be only one render.\n *\n * An error is returned in the state, so it is handled here rather than\n * reported to RxJS as unhandled.\n */\n this.sub = this.source$.subscribe({ error: () => {} })\n }\n\n subscribe = (next: () => void) => {\n /**\n * The stream may already have completed or errored by the time React\n * subscribes. It won't emit again, and subscribing to the shared source\n * would only run it a second time.\n */\n if (this.state.observableState !== \"live\") {\n return () => {}\n }\n\n const sub = this.source$.subscribe({\n complete: next,\n error: next,\n next: next,\n })\n\n return () => {\n sub.unsubscribe()\n }\n }\n\n getSnapshot = () => {\n return this.state\n }\n}\n","import { type DependencyList, useEffect, useRef } from \"react\"\nimport type { Observable } from \"rxjs\"\nimport { arrayEqual, useLiveRef } from \"../../utils\"\nimport { ObservableStore } from \"./store\"\nimport type { UseObserveOptions } from \"./types\"\n\ntype StoreReference<T, DefaultValue> = {\n deps: DependencyList\n store: ObservableStore<T, DefaultValue | undefined>\n}\n\n/**\n * Mechanism to initialize / retrieve an existing observable store.\n *\n * - We cannot use `useMemo` because it is theoretically not stable. We need stability,\n * not performance optimization.\n * - Using `useState` would make the API not sync (or optimistically return the wrong value).\n * We want the returned value of a render cycle to be derived from the given arguments. `useState`\n * would force us to update the store asynchronously in a useEffect. Losing at least one render cycle.\n * - We are left with using refs to hold the latest references. We use comparison with given deps as well.\n * We are re-creating store during render cycles which is normally not recommended.\n * However this is \"okay\" since it is to be used inside a useSyncExternalStore and not directly in a render.\n */\nexport const useStore = <T, DefaultValue>(\n source$: Observable<T> | undefined | (() => Observable<T> | undefined),\n options: UseObserveOptions<T, DefaultValue>,\n deps: DependencyList,\n): ObservableStore<T, DefaultValue | undefined> => {\n const optionsRef = useLiveRef(options)\n const storeRef = useRef<StoreReference<T, DefaultValue> | undefined>(\n undefined,\n )\n\n if (!storeRef.current || !arrayEqual(deps, storeRef.current.deps)) {\n storeRef.current = {\n deps,\n store: new ObservableStore({\n source$,\n defaultValue: optionsRef.current.defaultValue,\n compareFn: (a, b) => optionsRef.current?.compareFn?.(a, b) ?? a === b,\n }),\n }\n }\n\n const store = storeRef.current.store\n\n useEffect(\n () => () => {\n store.sub.unsubscribe()\n },\n [store],\n )\n\n return store\n}\n","import { type DependencyList, useSyncExternalStore } from \"react\"\nimport type { BehaviorSubject, Observable } from \"rxjs\"\nimport type { UseObserveResult } from \"./types\"\nimport { useStore } from \"./useStore\"\n\nexport type { UseObserveOptions, UseObserveResult } from \"./types\"\n\ninterface Option<T, R = undefined> {\n defaultValue: R\n compareFn?: (a: T, b: T) => boolean\n}\n\n/**\n * The source can be `undefined` (directly or returned from a factory). This is\n * useful when the observable is not available yet (lazily created, coming from\n * a state, a prop, etc). In that case the hook returns the default value with a\n * `complete` observable state and will start observing as soon as an actual\n * source is given.\n */\nexport function useObserve(\n source: undefined,\n): UseObserveResult<never, undefined>\n\nexport function useObserve<DefaultValue>(\n source: undefined,\n options: Option<unknown, DefaultValue>,\n): UseObserveResult<never, DefaultValue>\n\nexport function useObserve<T>(\n source: BehaviorSubject<T>,\n): UseObserveResult<T, T>\n\nexport function useObserve<T>(\n source: BehaviorSubject<T>,\n options: Omit<Option<T>, \"defaultValue\">,\n): UseObserveResult<T, T>\n\nexport function useObserve<T>(\n source: Observable<T> | undefined,\n): UseObserveResult<T, undefined>\n\nexport function useObserve<T>(\n source: () => Observable<T>,\n deps: DependencyList,\n): UseObserveResult<T, undefined>\n\nexport function useObserve<T>(\n source: () => Observable<T> | undefined,\n deps: DependencyList,\n): UseObserveResult<T, undefined>\n\nexport function useObserve<T, DefaultValue>(\n source: Observable<T> | undefined,\n options: Option<T, DefaultValue>,\n): UseObserveResult<T, DefaultValue>\n\nexport function useObserve<T>(\n source: Observable<T> | undefined,\n options: Omit<Option<T>, \"defaultValue\">,\n): UseObserveResult<T, undefined>\n\nexport function useObserve<T, DefaultValue>(\n source: () => Observable<T>,\n options: Option<T, DefaultValue>,\n deps: DependencyList,\n): UseObserveResult<T, DefaultValue>\n\nexport function useObserve<T, DefaultValue>(\n source: () => Observable<T> | undefined,\n options: Option<T, DefaultValue>,\n deps: DependencyList,\n): UseObserveResult<T, DefaultValue>\n\nexport function useObserve<T, DefaultValue = T>(\n source$: Observable<T> | undefined | (() => Observable<T> | undefined),\n optionsOrDeps?: Partial<Option<T, DefaultValue>> | DependencyList,\n maybeDeps?: DependencyList,\n): UseObserveResult<T, DefaultValue | undefined> {\n const options =\n optionsOrDeps != null && !Array.isArray(optionsOrDeps)\n ? (optionsOrDeps as Partial<Option<T, DefaultValue>>)\n : ({\n defaultValue: undefined,\n compareFn: undefined,\n } satisfies Partial<Option<T, DefaultValue>>)\n const deps =\n !maybeDeps && Array.isArray(optionsOrDeps)\n ? optionsOrDeps\n : typeof source$ === \"function\"\n ? (maybeDeps ?? [])\n : [source$]\n\n const store = useStore<T, DefaultValue | undefined>(source$, options, deps)\n\n const result = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n )\n\n return result\n}\n","import { defer, from, isObservable, type Observable, of } from \"rxjs\"\nimport { isPromiseLike } from \"./isPromiseLike\"\n\ntype FnReturnToObservable<T> =\n 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 { useEffect } from \"react\"\nimport { makeObservable } from \"../../utils/makeObservable\"\nimport type { SubscribeSource } from \"./types\"\n\nexport function useSubscribe<T>(source: SubscribeSource<T>) {\n useEffect(() => {\n const sub = makeObservable(source)().subscribe()\n\n return () => {\n sub.unsubscribe()\n }\n }, [source])\n}\n","import { useCallback } from \"react\"\nimport { retry, tap, throwError, timer } from \"rxjs\"\nimport { makeObservable } from \"../utils/makeObservable\"\nimport {\n exponentialBackoffDelay,\n getDelay,\n} from \"../utils/operators/retryBackoff\"\nimport { useLiveRef } from \"../utils/react/useLiveRef\"\nimport type { SubscribeSource } from \"./useSubscribe/types\"\nimport { useSubscribe } from \"./useSubscribe/useSubscribe\"\n\nexport interface UseSubscribeEffectOptions {\n /**\n * Called on every error of the source, including the ones that are\n * retried.\n */\n onError?: (error: unknown) => void\n /**\n * Whether to subscribe to the source again after an error:\n * - `false` (default): the error ends the subscription;\n * - `true`: retry without limit;\n * - a number: retry at most that many times in a row;\n * - a function: given the attempt (0 for the first retry) and the error,\n * returns whether to retry.\n *\n * The attempt count goes back to 0 once the source emits again.\n */\n retry?: boolean | number | ((attempt: number, error: unknown) => boolean)\n /**\n * Time to wait before each retry, in milliseconds, or a function of the\n * attempt and the error. Retries always wait for a timer, so they never\n * run synchronously, even with `0`. Defaults to an exponential backoff:\n * 1 s, 2 s, 4 s… up to 30 s.\n */\n retryDelay?: number | ((attempt: number, error: unknown) => number)\n}\n\nconst defaultRetryDelay = (attempt: number) =>\n getDelay(exponentialBackoffDelay(attempt, 1000), 30_000)\n\nconst shouldRetry = (\n retryOption: UseSubscribeEffectOptions[\"retry\"],\n attempt: number,\n error: unknown,\n) => {\n if (typeof retryOption === \"function\") return retryOption(attempt, error)\n\n if (typeof retryOption === \"number\") return attempt < retryOption\n\n return retryOption === true\n}\n\n/**\n * Subscribes to `source` while the component is mounted. Options are read\n * at each error, so changing them never subscribes again.\n */\nexport function useSubscribeEffect<T>(\n source: SubscribeSource<T>,\n options?: UseSubscribeEffectOptions,\n) {\n const optionsRef = useLiveRef(options)\n\n const enhancerMakeObservable = useCallback(() => {\n const source$ = makeObservable(source)()\n\n return source$.pipe(\n tap({\n error: (error) => {\n optionsRef.current?.onError?.(error)\n },\n }),\n retry({\n resetOnSuccess: true,\n delay: (error, retryCount) => {\n const attempt = retryCount - 1\n const { retry: retryOption, retryDelay = defaultRetryDelay } =\n optionsRef.current ?? {}\n\n if (!shouldRetry(retryOption, attempt, error)) {\n return throwError(() => error)\n }\n\n return timer(\n typeof retryDelay === \"function\"\n ? retryDelay(attempt, error)\n : retryDelay,\n )\n },\n }),\n )\n }, [source, optionsRef])\n\n useSubscribe(enhancerMakeObservable)\n}\n","import type { UseMutationOptions } from \"@tanstack/react-query\"\nimport type { Observable } from \"rxjs\"\n\n/**\n * Resolves the public `mutationFn` option — an Observable or a function\n * returning one — to its source Observable for the given variables.\n */\nexport function resolveMutationFnSource<TData, TVariables>(\n mutationFn:\n | ((variables: TVariables) => Observable<TData>)\n | Observable<TData>,\n variables: TVariables,\n) {\n return typeof mutationFn === \"function\" ? mutationFn(variables) : mutationFn\n}\n\ntype MutationCallbacks<TData, TError, TVariables, TOnMutateResult> = Pick<\n UseMutationOptions<TData, TError, TVariables, TOnMutateResult>,\n \"onMutate\" | \"onSuccess\" | \"onError\" | \"onSettled\"\n>\n\n/**\n * Same callbacks, but keyed as required so that spreading the adapted\n * callbacks after `...options` overrides (rather than unions with) the\n * raw-variables callbacks still present in `options`.\n */\ntype AdaptedMutationCallbacks<TData, TError, TVariables, TOnMutateResult> = {\n [K in \"onMutate\" | \"onSuccess\" | \"onError\" | \"onSettled\"]:\n | MutationCallbacks<\n TData,\n TError,\n { variables: TVariables },\n TOnMutateResult\n >[K]\n | undefined\n}\n\n/**\n * Hooks built on top of `useMutation$` (`useSwitchMutation$`,\n * `useConcatMutation$`) run their inner mutation with the user variables\n * wrapped in an envelope (`{ variables, ... }`). This adapts the user-facing\n * callbacks, which expect the raw variables, to that envelope.\n */\nexport function adaptCallbacksToWrappedVariables<\n TData,\n TError,\n TVariables,\n TOnMutateResult,\n>({\n onMutate,\n onSuccess,\n onError,\n onSettled,\n}: MutationCallbacks<\n TData,\n TError,\n TVariables,\n TOnMutateResult\n>): AdaptedMutationCallbacks<TData, TError, TVariables, TOnMutateResult> {\n return {\n onMutate: onMutate\n ? ({ variables }, ...rest) => onMutate(variables, ...rest)\n : undefined,\n onSuccess: (data, { variables }, ...rest) =>\n onSuccess?.(data, variables, ...rest),\n onError: (error, { variables }, ...rest) =>\n onError?.(error, variables, ...rest),\n onSettled: (data, error, { variables }, ...rest) =>\n onSettled?.(data, error, variables, ...rest),\n }\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\"\nimport { resolveMutationFnSource } from \"./mutationOptions\"\n\nexport type UseMutation$Options<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TOnMutateResult = unknown,\n> = Omit<\n UseMutationOptions<TData, TError, TVariables, TOnMutateResult>,\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 TOnMutateResult = unknown,\n>(\n options: UseMutation$Options<TData, TError, TVariables, TOnMutateResult>,\n queryClient?: QueryClient,\n) {\n const stateSubject = useConstant(\n () =>\n new BehaviorSubject<\n Pick<\n UseMutationResult<TData, TError, TVariables, TOnMutateResult>,\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, TOnMutateResult>(\n {\n ...options,\n mutationFn: (variables: TVariables) => {\n let lastData: { value: TData } | undefined\n\n return new Promise<TData>((resolve, reject) => {\n const source = resolveMutationFnSource(options.mutationFn, variables)\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 {\n adaptCallbacksToWrappedVariables,\n resolveMutationFnSource,\n} from \"./mutationOptions\"\nimport { type UseMutation$Options, useMutation$ } from \"./useMutation$\"\n\nexport function useConcatMutation$<\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 ...adaptCallbacksToWrappedVariables(options),\n mutationFn: ({ ready$, variables }) => {\n const source = resolveMutationFnSource(options.mutationFn, variables)\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 CancelledError,\n type Query,\n type QueryCache,\n type QueryFunctionContext,\n type QueryKey,\n skipToken,\n} from \"@tanstack/react-query\"\nimport { defer, type Observable, Subscription, take } from \"rxjs\"\n\nexport type ObservableQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n> =\n | ((context: QueryFunctionContext<TQueryKey>) => Observable<TQueryFnData>)\n | typeof skipToken\n | Observable<TQueryFnData>\n\n/**\n * A fetch of the query whose stream it settles: either a fetch TanStack\n * started, which ends with the stream's first value, or the fetch that\n * follows the stream while it runs.\n */\ntype StreamFetch = {\n isFollow: boolean\n resolve: (value: unknown) => void\n reject: (error: unknown) => void\n}\n\n/**\n * A query's stream while it runs. It outlives the fetches it settles, so a\n * refetch takes it over instead of subscribing to the source again.\n */\ntype Stream = {\n /**\n * - loading: the fetch that owns the stream waits for its first value,\n * which it resolves with.\n * - resolved: that fetch resolved, but TanStack has not stored its value\n * yet. That commit overwrites the values written after it with the one\n * the fetch resolved with, so the latest is kept in `uncommitted` and\n * written again right after it.\n * - live: the fetch that follows the stream owns it.\n */\n phase: \"loading\" | \"resolved\" | \"live\"\n last: { value: unknown } | undefined\n uncommitted: { value: unknown } | undefined\n error: { value: unknown } | undefined\n isComplete: boolean\n fetch: StreamFetch | undefined\n /** Set while the bridge starts the fetch that follows the stream. */\n isStartingFollow: boolean\n stop: (options?: { invalidate?: boolean }) => void\n}\n\nconst streams = new WeakMap<Query, Stream>()\n\n/**\n * Bridges an Observable-based `queryFn` to the Promise-based `queryFn`\n * expected by TanStack Query. Shared by `useQuery$` and `useQueries$`.\n *\n * Every value is written into the query as soon as the stream emits it. A\n * fetch TanStack starts (mount, `refetch()`, `invalidateQueries()`...) ends\n * once the stream has a value in the cache, like a regular query, so awaiting\n * it settles. Right after it, the bridge starts a fetch that follows the\n * stream: it keeps the query `fetching` while the stream runs and ends when\n * the stream completes or errors. A refetch takes over a running stream and\n * settles with its current value. Cancelling the fetch in progress (the last\n * observer unmounting, `cancelQueries`, the query leaving the cache) stops\n * the stream.\n */\nexport function createObservableQueryFn<\n TQueryFnData = unknown,\n TQueryKey extends QueryKey = QueryKey,\n>(queryFn: ObservableQueryFn<TQueryFnData, TQueryKey> | undefined) {\n if (queryFn === skipToken || queryFn === undefined) {\n return queryFn\n }\n\n return (context: QueryFunctionContext<TQueryKey>) =>\n new Promise<TQueryFnData>((resolve, reject) => {\n const queryCache = context.client.getQueryCache()\n /**\n * Matched by identity: `context.queryKey` is the very array the query\n * holds, so nothing is hashed and the query is found whatever its\n * `queryKeyHashFn`.\n */\n const query = queryCache\n .getAll()\n .find((query) => query.queryKey === context.queryKey)\n const source$: Observable<unknown> = defer(() =>\n typeof queryFn === \"function\" ? queryFn(context) : queryFn,\n )\n const settle = {\n resolve: resolve as (value: unknown) => void,\n reject,\n }\n\n if (!query) {\n // The query left the cache while an observer still fetches it, so\n // nothing holds later values: the fetch takes the first one.\n settleWithFirstValue(source$, context.signal, settle)\n\n return\n }\n\n const running = streams.get(query)\n const fetch: StreamFetch = {\n isFollow: running?.isStartingFollow ?? false,\n ...settle,\n }\n\n if (running) {\n running.isStartingFollow = false\n takeOver(running, fetch)\n } else {\n startStream(query, queryCache, source$, fetch)\n }\n\n const stream = streams.get(query)\n\n if (stream?.fetch === fetch) watchAbort(stream, fetch, context.signal)\n })\n}\n\nfunction settleWithFirstValue(\n source$: Observable<unknown>,\n signal: AbortSignal,\n { resolve, reject }: Pick<StreamFetch, \"resolve\" | \"reject\">,\n) {\n const subscription = source$.pipe(take(1)).subscribe({\n next: resolve,\n error: reject,\n complete: () => reject(new CancelledError()),\n })\n\n signal.addEventListener(\n \"abort\",\n () => {\n subscription.unsubscribe()\n reject(new CancelledError())\n },\n { once: true },\n )\n}\n\nfunction takeOver(stream: Stream, fetch: StreamFetch) {\n stream.fetch = fetch\n\n if (stream.error) {\n fetch.reject(stream.error.value)\n stream.stop()\n } else if (fetch.isFollow) {\n if (stream.isComplete) {\n fetch.resolve(stream.last?.value)\n stream.stop()\n }\n } else if (stream.last) {\n // A refetch of a running stream settles with its current value.\n stream.phase = \"resolved\"\n fetch.resolve(stream.last.value)\n } else {\n stream.phase = \"loading\"\n }\n}\n\n/**\n * TanStack aborts the signal when it cancels the fetch. A refetch cancels the\n * fetch in progress and starts its own right away, which takes the stream\n * over. Anything else that cancels it (the last observer leaving,\n * `cancelQueries`, the query leaving the cache) stops the stream. The values\n * it wrote stay in the cache but no longer follow it, so the query is marked\n * stale: the next observer that needs it refetches, whatever its `staleTime`.\n */\nfunction watchAbort(stream: Stream, fetch: StreamFetch, signal: AbortSignal) {\n signal.addEventListener(\n \"abort\",\n () => {\n if (stream.fetch !== fetch) return\n\n stream.fetch = undefined\n fetch.reject(new CancelledError())\n\n queueMicrotask(() => {\n if (!stream.fetch && !stream.isStartingFollow) {\n stream.stop({ invalidate: true })\n }\n })\n },\n { once: true },\n )\n}\n\nfunction startStream(\n query: Query,\n queryCache: QueryCache,\n source$: Observable<unknown>,\n fetch: StreamFetch,\n) {\n const subscription = new Subscription()\n let isStopped = false\n\n const stream: Stream = {\n phase: \"loading\",\n last: undefined,\n uncommitted: undefined,\n error: undefined,\n isComplete: false,\n fetch,\n isStartingFollow: false,\n stop: ({ invalidate = false } = {}) => {\n if (isStopped) return\n\n isStopped = true\n subscription.unsubscribe()\n unsubscribeFromCache()\n\n if (streams.get(query) === stream) streams.delete(query)\n\n if (invalidate && stream.last) query.invalidate()\n },\n }\n\n const fail = (error: unknown) => {\n subscription.unsubscribe()\n stream.error = { value: error }\n\n // A resolved fetch can no longer fail: the fetch that follows reports it.\n if (stream.phase === \"resolved\" || stream.isStartingFollow) return\n\n stream.fetch?.reject(error)\n stream.stop()\n }\n\n const onCommit = () => {\n stream.phase = \"live\"\n stream.fetch = undefined\n\n if (stream.uncommitted) {\n query.setData(stream.uncommitted.value, { manual: true })\n stream.uncommitted = undefined\n }\n\n if (stream.isComplete && !stream.error) {\n stream.stop()\n } else if (!stream.error && !query.isActive()) {\n /**\n * No observer has the query enabled: none observes it (a refetch of an\n * inactive one, say), or they all disabled it while this fetch was in\n * progress. The fetch finished, as TanStack lets it, but the stream\n * does not go on.\n */\n stream.stop({ invalidate: true })\n } else {\n stream.isStartingFollow = true\n query.fetch().catch(() => {})\n }\n }\n\n const unsubscribeFromCache = queryCache.subscribe((event) => {\n if (event.query !== query) return\n\n if (\n event.type === \"updated\" &&\n stream.phase === \"resolved\" &&\n event.action.type === \"success\" &&\n !event.action.manual\n ) {\n onCommit()\n }\n\n /**\n * The fetch that follows the stream never finishes on its own, so once no\n * observer has the query enabled, it is cancelled rather than let finish.\n * The values stay in the cache, as for `cancelQueries`.\n */\n if (\n (event.type === \"observerOptionsUpdated\" ||\n event.type === \"observerRemoved\") &&\n stream.phase === \"live\" &&\n query.getObserversCount() > 0 &&\n !query.isActive()\n ) {\n query.cancel({ revert: true })\n stream.stop({ invalidate: true })\n }\n\n /**\n * A follow fetch that has not run yet (paused while offline, say) has no\n * signal TanStack could abort, so stop the stream here instead.\n */\n if (\n (event.type === \"observerRemoved\" &&\n !stream.fetch &&\n query.getObserversCount() === 0) ||\n event.type === \"removed\"\n ) {\n stream.stop({ invalidate: event.type === \"observerRemoved\" })\n }\n })\n\n streams.set(query, stream)\n\n subscription.add(\n source$.subscribe({\n next: (value) => {\n if (value === undefined) {\n // `undefined` is not valid query data, as for any fetch result.\n fail(new Error(`${JSON.stringify(query.queryKey)} data is undefined`))\n\n return\n }\n\n stream.last = { value }\n\n // Cancelled: a refetch that takes the stream over settles with it.\n if (!stream.fetch && !stream.isStartingFollow) return\n\n if (stream.phase === \"loading\") {\n // TanStack stores it as the value the fetch resolves with.\n stream.phase = \"resolved\"\n stream.fetch?.resolve(value)\n\n return\n }\n\n query.setData(value, { manual: true })\n\n if (stream.phase === \"resolved\") stream.uncommitted = { value }\n },\n error: fail,\n complete: () => {\n stream.isComplete = true\n\n // Settled when TanStack stores the resolved value, or by the follow.\n if (stream.phase === \"resolved\" || stream.isStartingFollow) return\n\n if (stream.last) {\n stream.fetch?.resolve(stream.last.value)\n } else {\n console.warn(\n `cancelled due to stream completing without data for query ${JSON.stringify(query.queryKey)}`,\n )\n\n /**\n * A stream that completes without data is considered cancelled.\n * This is the expected behavior if someone for example adds a takeUntil().\n * This also allow the query to be retried automatically instead of\n * resolving as success with `undefined` (which is no-op for react-query)\n * or erroring with arbitrary value.\n */\n stream.fetch?.reject(new CancelledError())\n }\n\n stream.stop()\n },\n }),\n )\n}\n","import {\n type DefaultError,\n type QueriesPlaceholderDataFunction,\n type QueryClient,\n type QueryKey,\n type UseQueryOptions,\n type UseQueryResult,\n useQueries,\n} from \"@tanstack/react-query\"\nimport {\n createObservableQueryFn,\n type ObservableQueryFn,\n} from \"./createObservableQueryFn\"\n\ntype MAXIMUM_DEPTH = 20\n\ntype UseQuery$OptionsForUseQueries<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = Omit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n \"queryFn\" | \"placeholderData\"\n> & {\n queryFn?: ObservableQueryFn<TQueryFnData, TQueryKey>\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\ntype GetUseQuery$Options<T> = T extends {\n queryFn?: ObservableQueryFn<infer TQueryFnData, infer TQueryKey>\n // biome-ignore lint/suspicious/noExplicitAny: select can narrow from any source shape\n select?: (data: any) => infer TData\n}\n ? UseQuery$OptionsForUseQueries<\n TQueryFnData,\n DefaultError,\n unknown extends TData ? TQueryFnData : TData,\n TQueryKey extends QueryKey ? TQueryKey : QueryKey\n >\n : UseQuery$OptionsForUseQueries\n\ntype GetUseQuery$Result<T> = T extends {\n // biome-ignore lint/suspicious/noExplicitAny: queryFnData is inferred from the source shape\n queryFn?: ObservableQueryFn<infer TQueryFnData, any>\n // biome-ignore lint/suspicious/noExplicitAny: select can narrow from any source shape\n select?: (data: any) => infer TData\n}\n ? UseQueryResult<unknown extends TData ? TQueryFnData : TData, DefaultError>\n : UseQueryResult\n\n/**\n * Mirrors TanStack's `QueriesOptions`, but each query takes an Observable-based\n * `queryFn` (see {@link ObservableQueryFn}) instead of a Promise-based one. The\n * recursion preserves per-element tuple inference at the call site.\n */\nexport type QueriesOptions$<\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's QueriesOptions constraint\n T extends Array<any>,\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's QueriesOptions constraint\n TResults extends Array<any> = [],\n TDepth extends ReadonlyArray<number> = [],\n> = TDepth[\"length\"] extends MAXIMUM_DEPTH\n ? Array<UseQuery$OptionsForUseQueries>\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...TResults, GetUseQuery$Options<Head>]\n : T extends [infer Head, ...infer Tails]\n ? QueriesOptions$<\n [...Tails],\n [...TResults, GetUseQuery$Options<Head>],\n [...TDepth, 1]\n >\n : ReadonlyArray<unknown> extends T\n ? T\n : Array<UseQuery$OptionsForUseQueries>\n\n/**\n * Mirrors TanStack's `QueriesResults`, mapping each Observable-based query\n * option to its `UseQueryResult`.\n */\nexport type QueriesResults$<\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's QueriesResults constraint\n T extends Array<any>,\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's QueriesResults constraint\n TResults extends Array<any> = [],\n TDepth extends ReadonlyArray<number> = [],\n> = TDepth[\"length\"] extends MAXIMUM_DEPTH\n ? Array<UseQueryResult>\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...TResults, GetUseQuery$Result<Head>]\n : T extends [infer Head, ...infer Tails]\n ? QueriesResults$<\n [...Tails],\n [...TResults, GetUseQuery$Result<Head>],\n [...TDepth, 1]\n >\n : { [K in keyof T]: GetUseQuery$Result<T[K]> }\n\nexport function useQueries$<\n // biome-ignore lint/suspicious/noExplicitAny: mirrors TanStack's useQueries constraint\n T extends Array<any>,\n TCombinedResult = QueriesResults$<T>,\n>(\n {\n queries,\n ...options\n }: {\n queries: readonly [...QueriesOptions$<T>]\n combine?: (result: QueriesResults$<T>) => TCombinedResult\n subscribed?: boolean\n },\n queryClient?: QueryClient,\n): TCombinedResult {\n const transformedQueries = queries.map((query) => ({\n ...query,\n queryFn: createObservableQueryFn(query.queryFn),\n }))\n\n return useQueries(\n {\n /**\n * The Observable `queryFn` has been bridged to a Promise `queryFn`, so\n * `transformedQueries` matches TanStack's expected shape at runtime, but\n * the mapped tuple type is widened by `Array.prototype.map` and can't be\n * re-narrowed without the cast.\n */\n queries: transformedQueries as Parameters<\n typeof useQueries<T, TCombinedResult>\n >[0][\"queries\"],\n combine: options.combine as\n | ((result: unknown) => TCombinedResult)\n | undefined,\n subscribed: options.subscribed,\n },\n queryClient,\n )\n}\n","import {\n type DefaultError,\n type QueryClient,\n type QueryKey,\n type UseQueryOptions,\n useQuery,\n} from \"@tanstack/react-query\"\nimport {\n createObservableQueryFn,\n type ObservableQueryFn,\n} from \"./createObservableQueryFn\"\n\nexport function useQuery$<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n {\n queryFn,\n ...options\n }: Omit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n \"queryFn\"\n > & {\n queryFn: ObservableQueryFn<TQueryFnData, TQueryKey>\n },\n queryClient?: QueryClient,\n) {\n const result = useQuery<TQueryFnData, TError, TData, TQueryKey>(\n {\n ...options,\n queryFn: createObservableQueryFn(queryFn),\n },\n queryClient,\n )\n\n return result\n}\n","import type { DefaultError, QueryClient } from \"@tanstack/react-query\"\nimport { useCallback } from \"react\"\nimport {\n defaultIfEmpty,\n first,\n fromEvent,\n ignoreElements,\n merge,\n tap,\n} from \"rxjs\"\nimport { useRefOnce } from \"../utils\"\nimport {\n adaptCallbacksToWrappedVariables,\n resolveMutationFnSource,\n} from \"./mutationOptions\"\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 TOnMutateResult = unknown,\n>(\n {\n mutationFn,\n ...options\n }: UseMutation$Options<TData | null, TError, TVariables, TOnMutateResult>,\n queryClient?: QueryClient,\n) {\n const previousMutationCancelRef = useRefOnce(() => new AbortController())\n type TDataOrNull = TData | null\n\n const { mutate, mutateAsync, ...rest } = useMutation$<\n TDataOrNull,\n TError,\n { variables: TVariables; abort: AbortSignal },\n TOnMutateResult\n >(\n {\n ...options,\n mutationFn: useCallback(\n ({\n variables,\n abort,\n }: {\n variables: TVariables\n abort: AbortSignal\n }) => {\n if (abort.aborted) {\n throw new SwitchMutationCancelError()\n }\n\n const source = resolveMutationFnSource(mutationFn, variables)\n\n /**\n * `defaultIfEmpty` must sit on the source itself: the abort stream\n * never completes, so the merged stream never completes either and\n * a `defaultIfEmpty` placed after it would never fire — an empty\n * source would leave the mutation pending forever.\n */\n return merge(\n source.pipe(defaultIfEmpty(null)),\n fromEvent(abort, \"abort\").pipe(\n tap(() => {\n throw new SwitchMutationCancelError()\n }),\n ignoreElements(),\n ),\n ).pipe(first())\n },\n [mutationFn],\n ),\n ...adaptCallbacksToWrappedVariables(options),\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, previousMutationCancelRef],\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, previousMutationCancelRef],\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 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/**\n * Distributive helper to validate the shape of the updater function\n * and prevent covariance. Distributes over both T and U so union state\n * types work (updater can return any member of the union).\n */\n// biome-ignore lint/suspicious/noExplicitAny: distributive conditional over U and T for union support\ntype ValidateShape<T, U> = U extends any\n ? // biome-ignore lint/suspicious/noExplicitAny: distributive over T\n T extends any\n ? U extends T\n ? U extends object\n ? { [K in keyof U]: K extends keyof T ? T[K] : never }\n : U\n : never\n : never\n : never\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 = <U>(\n valueOrUpdater:\n | ((prev: T) => U & ValidateShape<T, U>)\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 const IDENTIFIER_PERSISTENCE_KEY = \"__reactjrx\"\n","import { catchError, from, of, switchMap } from \"rxjs\"\nimport { SIGNAL_RESET } from \"../constants\"\nimport type { Adapter } from \"./adapters/Adapter\"\nimport { IDENTIFIER_PERSISTENCE_KEY } from \"./constants\"\nimport type { PersistenceEntry, SignalPersistenceConfig } from \"./types\"\n\nconst getNormalizedPersistanceValue = (unknownValue: unknown) => {\n if (\n typeof unknownValue === \"object\" &&\n unknownValue !== null &&\n IDENTIFIER_PERSISTENCE_KEY in unknownValue &&\n unknownValue[IDENTIFIER_PERSISTENCE_KEY] === IDENTIFIER_PERSISTENCE_KEY\n ) {\n return unknownValue as PersistenceEntry\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_PERSISTENCE_KEY]: IDENTIFIER_PERSISTENCE_KEY,\n migrationVersion: version,\n } satisfies PersistenceEntry\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 resetToDefault = false,\n}: {\n adapter: Adapter\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n config: SignalPersistenceConfig<any>\n /**\n * When nothing usable is stored, reset the signal to its default instead of\n * leaving its current value in place.\n */\n resetToDefault?: boolean\n}) {\n const { hydrate = ({ value }) => value, signal, version } = config\n\n const withoutStoredValue = (value: unknown) => {\n if (resetToDefault) signal.update(SIGNAL_RESET)\n\n return of(value)\n }\n\n return from(adapter.getItem(signal.config.key)).pipe(\n switchMap((value) => {\n const normalizedValue = getNormalizedPersistanceValue(value)\n\n if (!normalizedValue) return withoutStoredValue(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 withoutStoredValue(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 finalize,\n Observable,\n Subscription,\n switchMap,\n tap,\n throttleTime,\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\n// biome-ignore lint/suspicious/noExplicitAny: TODO\ntype AnySignal = Signal<any, string>\ntype Entry = SignalPersistenceConfig<AnySignal>\n\n/**\n * Hydrates one signal from the adapter, then persists its updates (at most\n * every 500 ms) until unsubscribed. On unsubscribe, a value still held by the\n * throttle is saved right away instead of being dropped.\n *\n * `entry.config` is read at every write, so a changed config (e.g. a new\n * `version`) applies to the next write.\n */\nconst hydrateAndPersistEntry = ({\n adapter,\n entry,\n resetToDefault,\n onHydrated,\n}: {\n adapter: Adapter\n entry: { config: Entry }\n resetToDefault: boolean\n onHydrated: () => void\n}) => {\n const { signal } = entry.config\n let lastPersistedValue: unknown\n\n const persist = () => {\n lastPersistedValue = signal.getValue()\n\n return persistValue({ adapter, config: entry.config })\n }\n\n return hydrateValueToSignal({\n adapter,\n config: entry.config,\n resetToDefault,\n }).pipe(\n catchError((error) => {\n console.error(`Unable to hydrate signal ${signal.config.key}`, error)\n\n return EMPTY\n }),\n tap(onHydrated),\n switchMap(() =>\n signal.pipe(\n throttleTime(500, asyncScheduler, {\n trailing: true,\n }),\n switchMap(() => persist()),\n finalize(() => {\n if (signal.getValue() !== lastPersistedValue) {\n persist().subscribe()\n }\n }),\n ),\n ),\n )\n}\n\n/**\n * Hydrates the signals of the latest `entries$` list from the adapter, then\n * persists their updates to it. Entries are matched by signal, so a new array\n * holding the same signals changes nothing:\n * - an added signal is hydrated, then persisted;\n * - a signal still in the list keeps running untouched;\n * - a removed signal stops being persisted, after its pending value is saved.\n *\n * Emits `{ type: \"hydrated\" }` once, the first time every entry added so far\n * has been hydrated (right away for an empty list). An entry that fails to\n * hydrate is logged and never persisted, and holds back that emission until\n * it is removed.\n */\nexport function persistSignals({\n entries$,\n onHydrated,\n adapter,\n resetToDefault = false,\n}: {\n entries$: Observable<Entry[]>\n /**\n * Called when `{ type: \"hydrated\" }` is emitted.\n */\n onHydrated?: () => void\n adapter: Adapter\n /**\n * When true, an entry with nothing usable stored goes back to its default\n * instead of keeping its current value.\n */\n resetToDefault?: boolean\n}) {\n return new Observable<{ type: \"hydrated\" }>((subscriber) => {\n const running = new Map<\n AnySignal,\n { config: Entry; subscription: Subscription }\n >()\n const hydrating = new Set<AnySignal>()\n let isUpdatingEntries = false\n let isHydrated = false\n\n const notifyIfHydrated = () => {\n if (isHydrated || isUpdatingEntries || hydrating.size > 0) return\n\n isHydrated = true\n onHydrated?.()\n subscriber.next({ type: \"hydrated\" })\n }\n\n const start = (config: Entry) => {\n const entry = { config, subscription: new Subscription() }\n\n running.set(config.signal, entry)\n hydrating.add(config.signal)\n\n entry.subscription.add(\n hydrateAndPersistEntry({\n adapter,\n entry,\n resetToDefault,\n onHydrated: () => {\n hydrating.delete(config.signal)\n notifyIfHydrated()\n },\n }).subscribe(),\n )\n }\n\n const stop = (signal: AnySignal) => {\n const entry = running.get(signal)\n\n if (!entry) return\n\n running.delete(signal)\n hydrating.delete(signal)\n entry.subscription.unsubscribe()\n }\n\n const entriesSubscription = entries$.subscribe({\n next: (entries) => {\n isUpdatingEntries = true\n\n const signals = new Set(entries.map(({ signal }) => signal))\n\n for (const signal of [...running.keys()]) {\n if (!signals.has(signal)) stop(signal)\n }\n\n for (const config of entries) {\n const entry = running.get(config.signal)\n\n if (entry) {\n entry.config = config\n } else {\n start(config)\n }\n }\n\n isUpdatingEntries = false\n notifyIfHydrated()\n },\n error: (error) => subscriber.error(error),\n })\n\n return () => {\n entriesSubscription.unsubscribe()\n\n for (const signal of [...running.keys()]) {\n stop(signal)\n }\n }\n })\n}\n","import { map, merge, of, scan, switchMap } from \"rxjs\"\nimport { useLiveBehaviorSubject } from \"../../binding/useLiveBehaviorSubject\"\nimport { useObserve } from \"../../binding/useObserve/useObserve\"\nimport { useLiveRef } from \"../../utils/react/useLiveRef\"\nimport { isShallowEqual } from \"../../utils/shallowEqual\"\nimport type { Adapter } from \"../persistence/adapters/Adapter\"\nimport { persistSignals } from \"../persistence/persistSignals\"\nimport type { SignalPersistenceConfig } from \"../persistence/types\"\n\n/**\n * Hydrates the signals of `entries` from `adapter`, then persists their\n * updates to it.\n *\n * `isHydrated` becomes `true` once the entries have been hydrated for the\n * first time. Entries added later do not change it. It is reset when the\n * adapter changes.\n */\nexport function usePersistSignals({\n entries = [],\n onHydrated,\n adapter,\n}: {\n /**\n * Entries are matched by signal, so the array does not need a stable\n * reference. A signal is hydrated when it is added, then persisted while it\n * stays in the list. When it is removed, its pending value is saved and it\n * stops being persisted.\n */\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n entries?: Array<SignalPersistenceConfig<any>>\n /**\n * Called once per adapter, when `isHydrated` becomes `true`.\n */\n onHydrated?: () => void\n /**\n * Passing a new adapter reference starts over: pending values are saved to\n * the previous adapter, then every entry takes the value stored in the new\n * one. When nothing is stored, or only an older version, the entry goes\n * back to its default once the hook has had two different adapters, so it\n * never carries another adapter's value over (another profile's, for\n * example). Before that, including when the same adapter comes back after\n * a gap without adapter, it keeps its current value. Adapters are compared\n * by reference: a new object for the same storage counts as a different\n * adapter. Use a stable reference to avoid infinite 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 const result = useObserve(\n () =>\n adapterSubject.pipe(\n /**\n * Becomes true once a second, different adapter is passed, and stays\n * true: from then on, a value in memory may come from another adapter\n * than the current one. The same adapter coming back after a gap\n * without adapter (a sign-out, for example) is not a different one.\n */\n scan(\n (previous, adapter) => {\n const firstAdapter = previous.firstAdapter ?? adapter\n\n return {\n adapter,\n firstAdapter,\n replacesAnother:\n previous.replacesAnother ||\n (!!adapter && adapter !== firstAdapter),\n }\n },\n {\n adapter: undefined as Adapter | undefined,\n firstAdapter: undefined as Adapter | undefined,\n replacesAnother: false,\n },\n ),\n switchMap(({ adapter, replacesAnother }) => {\n if (!adapter) return of({ type: \"reset\" as const })\n\n return merge(\n of({ type: \"reset\" as const }),\n persistSignals({\n adapter,\n entries$: entriesSubject,\n resetToDefault: replacesAnother,\n onHydrated: () => {\n onHydratedRef.current?.()\n },\n }),\n )\n }),\n map((event) => ({ isHydrated: event.type === \"hydrated\" })),\n ),\n { defaultValue: { isHydrated: false }, compareFn: isShallowEqual },\n [adapterSubject, entriesSubject],\n )\n\n return result.data\n}\n","import { type Signal, VirtualSignal } from \"../Signal\"\nimport { useSignalContext } 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 (\n signal instanceof VirtualSignal\n ? signalContext.getOrCreateSignal(signal)\n : signal\n ) 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","import { useCallback, useRef, useSyncExternalStore } from \"react\"\nimport { skip } from \"rxjs\"\nimport type { Signal, VirtualSignal } from \"../Signal\"\nimport { useSignalReference } from \"./useSignalReference\"\n\nexport type EqualityFn<T> = (a: T, b: T) => boolean\n\nconst defaultEqualityFn: EqualityFn<unknown> = Object.is\n\n/**\n * Subscribe to a signal's current value, with optional projection and equality.\n *\n * - On every render the returned value is `selector(signal.value)` (or\n * `signal.value` when no selector is provided), recomputed only when the\n * signal value, the selector identity, or the signal itself has changed.\n * - The component re-renders whenever the signal emits a value that the\n * `equalityFn` considers different from the previous one.\n * - The hook caches its last result. When the new selector output is\n * considered equal to the previous one (per `equalityFn`), the previous\n * reference is returned, so downstream `useEffect`/`useMemo` dependencies\n * stay stable.\n *\n * @param signal The signal (or `VirtualSignal` resolved through context) to read.\n * @param selector Optional projection of the signal value.\n * @param equalityFn Optional equality function. Defaults to `Object.is`.\n * Pass `isShallowEqual` (or any custom comparator) to opt into reference\n * stability for derived objects.\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 equalityFn?: EqualityFn<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 equalityFn?: EqualityFn<SelectValue>,\n): SelectValue\n\nexport function useSignalValue(\n signal: Signal<unknown> | VirtualSignal<unknown>,\n selector?: (value: unknown) => unknown,\n equalityFn: EqualityFn<unknown> = defaultEqualityFn,\n) {\n const finalSignal = useSignalReference(signal)\n const cacheRef = useRef<{\n hasValue: boolean\n signal: Signal<unknown> | undefined\n selector: ((value: unknown) => unknown) | undefined\n sourceValue: unknown\n value: unknown\n }>({\n hasValue: false,\n signal: undefined,\n selector: undefined,\n sourceValue: undefined,\n value: undefined,\n })\n\n const subscribe = useCallback(\n (onChange: () => void) => {\n /**\n * `Signal` is a `BehaviorSubject` and synchronously emits its current\n * value to new subscribers. `useSyncExternalStore`'s subscribe contract,\n * however, expects `onChange` to fire only on *changes* — the initial\n * value is read separately via `getSnapshot`. Skipping the first\n * emission keeps the contract clean and avoids a redundant\n * post-subscribe snapshot read by React.\n */\n const sub = finalSignal.pipe(skip(1)).subscribe(() => {\n onChange()\n })\n\n return () => {\n sub.unsubscribe()\n }\n },\n [finalSignal],\n )\n\n const getSnapshot = () => {\n const cached = cacheRef.current\n const sourceValue = finalSignal.value\n\n /**\n * Fast path: nothing relevant changed since last call, so we can skip\n * running the selector entirely and return the previously computed value.\n */\n if (\n cached.hasValue &&\n cached.signal === finalSignal &&\n cached.selector === selector &&\n cached.sourceValue === sourceValue\n ) {\n return cached.value\n }\n\n const next = selector ? selector(sourceValue) : sourceValue\n\n /**\n * Reference-stability path: selector ran (because something changed) but\n * its output is considered equal (per `equalityFn`) to the previous one,\n * so we keep the previous reference to avoid spurious re-renders\n * downstream. With the default `Object.is` this rarely kicks in; when the\n * caller opts into a structural comparator (e.g. `isShallowEqual`) this\n * provides referential stability for derived objects.\n */\n if (\n cached.hasValue &&\n cached.signal === finalSignal &&\n equalityFn(cached.value, next)\n ) {\n cacheRef.current = {\n hasValue: true,\n signal: finalSignal,\n selector,\n sourceValue,\n value: cached.value,\n }\n\n return cached.value\n }\n\n cacheRef.current = {\n hasValue: true,\n signal: finalSignal,\n selector,\n sourceValue,\n value: next,\n }\n\n return next\n }\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\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(finalSignal)\n const setValue = useSetSignal(finalSignal)\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"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};