@tanstack/query-core 5.103.2 → 5.104.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/legacy/{classPrivateFieldSet2-CV7wyte-.js → classPrivateFieldSet2-CukOTU3U.js} +5 -5
- package/build/legacy/{classPrivateFieldSet2-Bo0ZyOIv.cjs → classPrivateFieldSet2-CvCEk6bM.cjs} +5 -5
- package/build/legacy/{classPrivateMethodInitSpec-CBwa_Y7C.js → classPrivateMethodInitSpec-CgB-WYk3.js} +2 -2
- package/build/legacy/{classPrivateMethodInitSpec-DVhcLejn.cjs → classPrivateMethodInitSpec-Nr6mgZRs.cjs} +2 -2
- package/build/legacy/environmentManager.d.cts +3 -4
- package/build/legacy/environmentManager.d.cts.map +1 -1
- package/build/legacy/environmentManager.d.ts +3 -4
- package/build/legacy/environmentManager.d.ts.map +1 -1
- package/build/legacy/focusManager.cjs +1 -1
- package/build/legacy/focusManager.d.cts +3 -4
- package/build/legacy/focusManager.d.cts.map +1 -1
- package/build/legacy/focusManager.d.ts +3 -4
- package/build/legacy/focusManager.d.ts.map +1 -1
- package/build/legacy/focusManager.js +1 -1
- package/build/legacy/{hydration-Bp57N3SP.d.ts → hydration-B9t5w6NC.d.ts} +11 -4
- package/build/legacy/hydration-B9t5w6NC.d.ts.map +1 -0
- package/build/{modern/hydration-DRcloXEn.d.cts → legacy/hydration-Br9VIGXa.d.cts} +11 -4
- package/build/legacy/hydration-Br9VIGXa.d.cts.map +1 -0
- package/build/legacy/hydration.d.cts +1 -1
- package/build/legacy/hydration.d.ts +1 -1
- package/build/legacy/index.d.cts +1 -1
- package/build/legacy/index.d.ts +1 -1
- package/build/legacy/infiniteQueryBehavior.d.cts +4 -5
- package/build/legacy/infiniteQueryBehavior.d.cts.map +1 -1
- package/build/legacy/infiniteQueryBehavior.d.ts +4 -5
- package/build/legacy/infiniteQueryBehavior.d.ts.map +1 -1
- package/build/legacy/infiniteQueryObserver.d.cts +3 -4
- package/build/legacy/infiniteQueryObserver.d.cts.map +1 -1
- package/build/legacy/infiniteQueryObserver.d.ts +3 -4
- package/build/legacy/infiniteQueryObserver.d.ts.map +1 -1
- package/build/legacy/mutation.cjs +2 -2
- package/build/legacy/mutation.d.cts +1 -1
- package/build/legacy/mutation.d.ts +1 -1
- package/build/legacy/mutation.js +2 -2
- package/build/legacy/mutationCache.cjs +1 -1
- package/build/legacy/mutationCache.d.cts +1 -1
- package/build/legacy/mutationCache.d.ts +1 -1
- package/build/legacy/mutationCache.js +1 -1
- package/build/legacy/mutationObserver.cjs +2 -2
- package/build/legacy/mutationObserver.d.cts +1 -1
- package/build/legacy/mutationObserver.d.ts +1 -1
- package/build/legacy/mutationObserver.js +2 -2
- package/build/legacy/notifyManager.d.cts +3 -4
- package/build/legacy/notifyManager.d.cts.map +1 -1
- package/build/legacy/notifyManager.d.ts +3 -4
- package/build/legacy/notifyManager.d.ts.map +1 -1
- package/build/legacy/onlineManager.cjs +1 -1
- package/build/legacy/onlineManager.d.cts +3 -4
- package/build/legacy/onlineManager.d.cts.map +1 -1
- package/build/legacy/onlineManager.d.ts +3 -4
- package/build/legacy/onlineManager.d.ts.map +1 -1
- package/build/legacy/onlineManager.js +1 -1
- package/build/legacy/queriesObserver.cjs +2 -2
- package/build/legacy/queriesObserver.d.cts +4 -5
- package/build/legacy/queriesObserver.d.cts.map +1 -1
- package/build/legacy/queriesObserver.d.ts +4 -5
- package/build/legacy/queriesObserver.d.ts.map +1 -1
- package/build/legacy/queriesObserver.js +2 -2
- package/build/legacy/query.cjs +2 -2
- package/build/legacy/query.cjs.map +1 -1
- package/build/legacy/query.d.cts +1 -1
- package/build/legacy/query.d.ts +1 -1
- package/build/legacy/query.js +2 -2
- package/build/legacy/query.js.map +1 -1
- package/build/legacy/queryCache.cjs +1 -1
- package/build/legacy/queryCache.cjs.map +1 -1
- package/build/legacy/queryCache.d.cts +1 -1
- package/build/legacy/queryCache.d.ts +1 -1
- package/build/legacy/queryCache.js +1 -1
- package/build/legacy/queryCache.js.map +1 -1
- package/build/legacy/queryClient.cjs +8 -1
- package/build/legacy/queryClient.cjs.map +1 -1
- package/build/legacy/queryClient.d.cts +1 -1
- package/build/legacy/queryClient.d.ts +1 -1
- package/build/legacy/queryClient.js +8 -1
- package/build/legacy/queryClient.js.map +1 -1
- package/build/legacy/queryObserver.cjs +2 -2
- package/build/legacy/queryObserver.cjs.map +1 -1
- package/build/legacy/queryObserver.d.cts +1 -1
- package/build/legacy/queryObserver.d.ts +1 -1
- package/build/legacy/queryObserver.js +2 -2
- package/build/legacy/queryObserver.js.map +1 -1
- package/build/legacy/removable-0GzhW1PK.d.cts +22 -0
- package/build/legacy/removable-0GzhW1PK.d.cts.map +1 -0
- package/build/legacy/removable-0GzhW1PK.d.ts +22 -0
- package/build/legacy/removable-0GzhW1PK.d.ts.map +1 -0
- package/build/legacy/removable.cjs +10 -1
- package/build/legacy/removable.cjs.map +1 -1
- package/build/legacy/removable.d.cts +1 -1
- package/build/legacy/removable.d.ts +1 -1
- package/build/legacy/removable.js +10 -1
- package/build/legacy/removable.js.map +1 -1
- package/build/legacy/retryer.d.cts +1 -1
- package/build/legacy/retryer.d.ts +1 -1
- package/build/legacy/streamedQuery.cjs +0 -7
- package/build/legacy/streamedQuery.cjs.map +1 -1
- package/build/legacy/streamedQuery.d.cts +2 -10
- package/build/legacy/streamedQuery.d.cts.map +1 -1
- package/build/legacy/streamedQuery.d.ts +2 -10
- package/build/legacy/streamedQuery.d.ts.map +1 -1
- package/build/legacy/streamedQuery.js +0 -7
- package/build/legacy/streamedQuery.js.map +1 -1
- package/build/legacy/subscribable-CysQ0tne.d.cts +34 -0
- package/build/legacy/subscribable-CysQ0tne.d.cts.map +1 -0
- package/build/legacy/subscribable-CysQ0tne.d.ts +34 -0
- package/build/legacy/subscribable-CysQ0tne.d.ts.map +1 -0
- package/build/legacy/subscribable.cjs +22 -0
- package/build/legacy/subscribable.cjs.map +1 -1
- package/build/legacy/subscribable.d.cts +1 -1
- package/build/legacy/subscribable.d.ts +1 -1
- package/build/legacy/subscribable.js +22 -0
- package/build/legacy/subscribable.js.map +1 -1
- package/build/legacy/timeoutManager.cjs +1 -1
- package/build/legacy/timeoutManager.d.cts +7 -8
- package/build/legacy/timeoutManager.d.cts.map +1 -1
- package/build/legacy/timeoutManager.d.ts +7 -8
- package/build/legacy/timeoutManager.d.ts.map +1 -1
- package/build/legacy/timeoutManager.js +1 -1
- package/build/legacy/types.cjs.map +1 -1
- package/build/legacy/types.d.cts +1 -1
- package/build/legacy/types.d.ts +1 -1
- package/build/legacy/types.js.map +1 -1
- package/build/legacy/utils.d.cts +1 -1
- package/build/legacy/utils.d.ts +1 -1
- package/build/modern/environmentManager.d.cts +3 -4
- package/build/modern/environmentManager.d.cts.map +1 -1
- package/build/modern/environmentManager.d.ts +3 -4
- package/build/modern/environmentManager.d.ts.map +1 -1
- package/build/modern/focusManager.cjs.map +1 -1
- package/build/modern/focusManager.d.cts +3 -4
- package/build/modern/focusManager.d.cts.map +1 -1
- package/build/modern/focusManager.d.ts +3 -4
- package/build/modern/focusManager.d.ts.map +1 -1
- package/build/modern/focusManager.js.map +1 -1
- package/build/{legacy/hydration-DRcloXEn.d.cts → modern/hydration-B9t5w6NC.d.ts} +11 -4
- package/build/modern/hydration-B9t5w6NC.d.ts.map +1 -0
- package/build/modern/{hydration-Bp57N3SP.d.ts → hydration-Br9VIGXa.d.cts} +11 -4
- package/build/modern/hydration-Br9VIGXa.d.cts.map +1 -0
- package/build/modern/hydration.d.cts +1 -1
- package/build/modern/hydration.d.ts +1 -1
- package/build/modern/index.d.cts +1 -1
- package/build/modern/index.d.ts +1 -1
- package/build/modern/infiniteQueryBehavior.d.cts +4 -5
- package/build/modern/infiniteQueryBehavior.d.cts.map +1 -1
- package/build/modern/infiniteQueryBehavior.d.ts +4 -5
- package/build/modern/infiniteQueryBehavior.d.ts.map +1 -1
- package/build/modern/infiniteQueryObserver.d.cts +3 -4
- package/build/modern/infiniteQueryObserver.d.cts.map +1 -1
- package/build/modern/infiniteQueryObserver.d.ts +3 -4
- package/build/modern/infiniteQueryObserver.d.ts.map +1 -1
- package/build/modern/mutation.cjs.map +1 -1
- package/build/modern/mutation.d.cts +1 -1
- package/build/modern/mutation.d.ts +1 -1
- package/build/modern/mutation.js.map +1 -1
- package/build/modern/mutationCache.cjs.map +1 -1
- package/build/modern/mutationCache.d.cts +1 -1
- package/build/modern/mutationCache.d.ts +1 -1
- package/build/modern/mutationCache.js.map +1 -1
- package/build/modern/mutationObserver.cjs.map +1 -1
- package/build/modern/mutationObserver.d.cts +1 -1
- package/build/modern/mutationObserver.d.ts +1 -1
- package/build/modern/mutationObserver.js.map +1 -1
- package/build/modern/notifyManager.d.cts +3 -4
- package/build/modern/notifyManager.d.cts.map +1 -1
- package/build/modern/notifyManager.d.ts +3 -4
- package/build/modern/notifyManager.d.ts.map +1 -1
- package/build/modern/onlineManager.cjs.map +1 -1
- package/build/modern/onlineManager.d.cts +3 -4
- package/build/modern/onlineManager.d.cts.map +1 -1
- package/build/modern/onlineManager.d.ts +3 -4
- package/build/modern/onlineManager.d.ts.map +1 -1
- package/build/modern/onlineManager.js.map +1 -1
- package/build/modern/queriesObserver.cjs.map +1 -1
- package/build/modern/queriesObserver.d.cts +4 -5
- package/build/modern/queriesObserver.d.cts.map +1 -1
- package/build/modern/queriesObserver.d.ts +4 -5
- package/build/modern/queriesObserver.d.ts.map +1 -1
- package/build/modern/queriesObserver.js.map +1 -1
- package/build/modern/query.cjs.map +1 -1
- package/build/modern/query.d.cts +1 -1
- package/build/modern/query.d.ts +1 -1
- package/build/modern/query.js.map +1 -1
- package/build/modern/queryCache.cjs.map +1 -1
- package/build/modern/queryCache.d.cts +1 -1
- package/build/modern/queryCache.d.ts +1 -1
- package/build/modern/queryCache.js.map +1 -1
- package/build/modern/queryClient.cjs +7 -0
- package/build/modern/queryClient.cjs.map +1 -1
- package/build/modern/queryClient.d.cts +1 -1
- package/build/modern/queryClient.d.ts +1 -1
- package/build/modern/queryClient.js +7 -0
- package/build/modern/queryClient.js.map +1 -1
- package/build/modern/queryObserver.cjs.map +1 -1
- package/build/modern/queryObserver.d.cts +1 -1
- package/build/modern/queryObserver.d.ts +1 -1
- package/build/modern/queryObserver.js.map +1 -1
- package/build/modern/removable-0GzhW1PK.d.cts +22 -0
- package/build/modern/removable-0GzhW1PK.d.cts.map +1 -0
- package/build/modern/removable-0GzhW1PK.d.ts +22 -0
- package/build/modern/removable-0GzhW1PK.d.ts.map +1 -0
- package/build/modern/removable.cjs +9 -0
- package/build/modern/removable.cjs.map +1 -1
- package/build/modern/removable.d.cts +1 -1
- package/build/modern/removable.d.ts +1 -1
- package/build/modern/removable.js +9 -0
- package/build/modern/removable.js.map +1 -1
- package/build/modern/retryer.d.cts +1 -1
- package/build/modern/retryer.d.ts +1 -1
- package/build/modern/streamedQuery.cjs +0 -7
- package/build/modern/streamedQuery.cjs.map +1 -1
- package/build/modern/streamedQuery.d.cts +2 -10
- package/build/modern/streamedQuery.d.cts.map +1 -1
- package/build/modern/streamedQuery.d.ts +2 -10
- package/build/modern/streamedQuery.d.ts.map +1 -1
- package/build/modern/streamedQuery.js +0 -7
- package/build/modern/streamedQuery.js.map +1 -1
- package/build/modern/subscribable-CysQ0tne.d.cts +34 -0
- package/build/modern/subscribable-CysQ0tne.d.cts.map +1 -0
- package/build/modern/subscribable-CysQ0tne.d.ts +34 -0
- package/build/modern/subscribable-CysQ0tne.d.ts.map +1 -0
- package/build/modern/subscribable.cjs +22 -0
- package/build/modern/subscribable.cjs.map +1 -1
- package/build/modern/subscribable.d.cts +1 -1
- package/build/modern/subscribable.d.ts +1 -1
- package/build/modern/subscribable.js +22 -0
- package/build/modern/subscribable.js.map +1 -1
- package/build/modern/timeoutManager.cjs.map +1 -1
- package/build/modern/timeoutManager.d.cts +7 -8
- package/build/modern/timeoutManager.d.cts.map +1 -1
- package/build/modern/timeoutManager.d.ts +7 -8
- package/build/modern/timeoutManager.d.ts.map +1 -1
- package/build/modern/timeoutManager.js.map +1 -1
- package/build/modern/types.cjs.map +1 -1
- package/build/modern/types.d.cts +1 -1
- package/build/modern/types.d.ts +1 -1
- package/build/modern/types.js.map +1 -1
- package/build/modern/utils.d.cts +1 -1
- package/build/modern/utils.d.ts +1 -1
- package/package.json +3 -3
- package/src/query.ts +1 -2
- package/src/queryCache.ts +1 -2
- package/src/queryClient.ts +7 -0
- package/src/queryObserver.ts +4 -8
- package/src/removable.ts +9 -0
- package/src/streamedQuery.ts +1 -7
- package/src/subscribable.ts +22 -0
- package/src/types.ts +9 -15
- package/build/legacy/hydration-Bp57N3SP.d.ts.map +0 -1
- package/build/legacy/hydration-DRcloXEn.d.cts.map +0 -1
- package/build/legacy/removable-DeMjhW5M.d.cts +0 -13
- package/build/legacy/removable-DeMjhW5M.d.cts.map +0 -1
- package/build/legacy/removable-DeMjhW5M.d.ts +0 -13
- package/build/legacy/removable-DeMjhW5M.d.ts.map +0 -1
- package/build/legacy/subscribable-CbifVTKz.d.cts +0 -12
- package/build/legacy/subscribable-CbifVTKz.d.cts.map +0 -1
- package/build/legacy/subscribable-CbifVTKz.d.ts +0 -12
- package/build/legacy/subscribable-CbifVTKz.d.ts.map +0 -1
- package/build/modern/hydration-Bp57N3SP.d.ts.map +0 -1
- package/build/modern/hydration-DRcloXEn.d.cts.map +0 -1
- package/build/modern/removable-DeMjhW5M.d.cts +0 -13
- package/build/modern/removable-DeMjhW5M.d.cts.map +0 -1
- package/build/modern/removable-DeMjhW5M.d.ts +0 -13
- package/build/modern/removable-DeMjhW5M.d.ts.map +0 -1
- package/build/modern/subscribable-CbifVTKz.d.cts +0 -12
- package/build/modern/subscribable-CbifVTKz.d.cts.map +0 -1
- package/build/modern/subscribable-CbifVTKz.d.ts +0 -12
- package/build/modern/subscribable-CbifVTKz.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineManager.cjs","names":["Subscribable"
|
|
1
|
+
{"version":3,"file":"onlineManager.cjs","names":["Subscribable"],"sources":["../../src/onlineManager.ts"],"sourcesContent":["import { Subscribable } from './subscribable'\n\ntype Listener = (online: boolean) => void\ntype SetupFn = (setOnline: Listener) => (() => void) | undefined\n\n/**\n * The `OnlineManager` manages the online state within TanStack Query. It can\n * be used to change the default event listeners or to manually change the\n * online state.\n *\n * By default, the `onlineManager` assumes an active network connection, and\n * listens to the `online` and `offline` events on the `window` object to\n * detect changes.\n */\nexport class OnlineManager extends Subscribable<Listener> {\n #online = true\n #cleanup?: () => void\n\n #setup: SetupFn\n\n constructor() {\n super()\n this.#setup = (onOnline) => {\n // addEventListener does not exist in React Native, but window does\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof window !== 'undefined' && window.addEventListener) {\n const onlineListener = () => onOnline(true)\n const offlineListener = () => onOnline(false)\n // Listen to online\n window.addEventListener('online', onlineListener, false)\n window.addEventListener('offline', offlineListener, false)\n\n return () => {\n // Be sure to unsubscribe if a new handler is set\n window.removeEventListener('online', onlineListener)\n window.removeEventListener('offline', offlineListener)\n }\n }\n\n return\n }\n }\n\n protected onSubscribe(): void {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup)\n }\n }\n\n protected onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.()\n this.#cleanup = undefined\n }\n }\n\n /**\n * `setEventListener` can be used to set a custom event listener that will\n * be used to determine the online state. The provided `setup` function\n * receives a `setOnline` callback that should be called with a `boolean`\n * whenever the online state changes.\n *\n * @example\n * ```ts\n * import NetInfo from '@react-native-community/netinfo'\n * import { onlineManager } from '@tanstack/query-core'\n *\n * onlineManager.setEventListener((setOnline) => {\n * return NetInfo.addEventListener((state) => {\n * setOnline(!!state.isConnected)\n * })\n * })\n * ```\n */\n setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup(this.setOnline.bind(this))\n }\n\n /**\n * `setOnline` can be used to manually set the online state.\n *\n * @example\n * ```ts\n * import { onlineManager } from '@tanstack/query-core'\n *\n * // Set to online\n * onlineManager.setOnline(true)\n *\n * // Set to offline\n * onlineManager.setOnline(false)\n * ```\n */\n setOnline(online: boolean): void {\n const changed = this.#online !== online\n\n if (changed) {\n this.#online = online\n this.listeners.forEach((listener) => {\n listener(online)\n })\n }\n }\n\n /**\n * `isOnline` can be used to get the current online state.\n */\n isOnline(): boolean {\n return this.#online\n }\n}\n\n/**\n * Singleton instance of {@link OnlineManager}, used to manage and observe the online state within TanStack Query.\n */\nexport const onlineManager = new OnlineManager()\n"],"mappings":";;;;;;;;;;;;AAcA,IAAa,gBAAb,cAAmCA,qBAAAA,aAAuB;CACxD,UAAU;CACV;CAEA;CAEA,cAAc;EACZ,MAAM;EACN,KAAK,UAAU,aAAa;GAG1B,IAAI,OAAO,WAAW,eAAe,OAAO,kBAAkB;IAC5D,MAAM,uBAAuB,SAAS,IAAI;IAC1C,MAAM,wBAAwB,SAAS,KAAK;IAE5C,OAAO,iBAAiB,UAAU,gBAAgB,KAAK;IACvD,OAAO,iBAAiB,WAAW,iBAAiB,KAAK;IAEzD,aAAa;KAEX,OAAO,oBAAoB,UAAU,cAAc;KACnD,OAAO,oBAAoB,WAAW,eAAe;IACvD;GACF;EAGF;CACF;CAEA,cAA8B;EAC5B,IAAI,CAAC,KAAK,UACR,KAAK,iBAAiB,KAAK,MAAM;CAErC;CAEA,gBAA0B;EACxB,IAAI,CAAC,KAAK,aAAa,GAAG;GACxB,KAAK,WAAW;GAChB,KAAK,WAAW,KAAA;EAClB;CACF;;;;;;;;;;;;;;;;;;;CAoBA,iBAAiB,OAAsB;EACrC,KAAK,SAAS;EACd,KAAK,WAAW;EAChB,KAAK,WAAW,MAAM,KAAK,UAAU,KAAK,IAAI,CAAC;CACjD;;;;;;;;;;;;;;;CAgBA,UAAU,QAAuB;EAG/B,IAFgB,KAAK,YAAY,QAEpB;GACX,KAAK,UAAU;GACf,KAAK,UAAU,SAAS,aAAa;IACnC,SAAS,MAAM;GACjB,CAAC;EACH;CACF;;;;CAKA,WAAoB;EAClB,OAAO,KAAK;CACd;AACF;;;;AAKA,MAAa,gBAAgB,IAAI,cAAc"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Subscribable } from "./subscribable-
|
|
1
|
+
import { t as Subscribable } from "./subscribable-CysQ0tne.cjs";
|
|
2
2
|
//#region src/onlineManager.d.ts
|
|
3
3
|
type Listener = (online: boolean) => void;
|
|
4
4
|
type SetupFn = (setOnline: Listener) => (() => void) | undefined;
|
|
@@ -11,7 +11,7 @@ type SetupFn = (setOnline: Listener) => (() => void) | undefined;
|
|
|
11
11
|
* listens to the `online` and `offline` events on the `window` object to
|
|
12
12
|
* detect changes.
|
|
13
13
|
*/
|
|
14
|
-
declare class OnlineManager extends Subscribable<Listener> {
|
|
14
|
+
export declare class OnlineManager extends Subscribable<Listener> {
|
|
15
15
|
#private;
|
|
16
16
|
constructor();
|
|
17
17
|
protected onSubscribe(): void;
|
|
@@ -58,7 +58,6 @@ declare class OnlineManager extends Subscribable<Listener> {
|
|
|
58
58
|
/**
|
|
59
59
|
* Singleton instance of {@link OnlineManager}, used to manage and observe the online state within TanStack Query.
|
|
60
60
|
*/
|
|
61
|
-
declare const onlineManager: OnlineManager;
|
|
61
|
+
export declare const onlineManager: OnlineManager;
|
|
62
62
|
//#endregion
|
|
63
|
-
export { OnlineManager, onlineManager };
|
|
64
63
|
//# sourceMappingURL=onlineManager.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineManager.d.cts","names":[],"sources":["../../src/onlineManager.ts"],"mappings":";;KAEK,YAAY;KACZ,WAAW,WAAW;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"onlineManager.d.cts","names":[],"sources":["../../src/onlineManager.ts"],"mappings":";;KAEK,YAAY;KACZ,WAAW,WAAW;;;;;;;;;;qBAWd,sBAAsB,aAAa;;;YA6BpC;YAMA;;;;;;;;;;;;;;;;;;;EAyBV,iBAAiB,OAAO;;;;;;;;;;;;;;;EAoBxB,UAAU;;;;EAcV;;;;;qBAQW,eAAa"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Subscribable } from "./subscribable-
|
|
1
|
+
import { t as Subscribable } from "./subscribable-CysQ0tne.js";
|
|
2
2
|
//#region src/onlineManager.d.ts
|
|
3
3
|
type Listener = (online: boolean) => void;
|
|
4
4
|
type SetupFn = (setOnline: Listener) => (() => void) | undefined;
|
|
@@ -11,7 +11,7 @@ type SetupFn = (setOnline: Listener) => (() => void) | undefined;
|
|
|
11
11
|
* listens to the `online` and `offline` events on the `window` object to
|
|
12
12
|
* detect changes.
|
|
13
13
|
*/
|
|
14
|
-
declare class OnlineManager extends Subscribable<Listener> {
|
|
14
|
+
export declare class OnlineManager extends Subscribable<Listener> {
|
|
15
15
|
#private;
|
|
16
16
|
constructor();
|
|
17
17
|
protected onSubscribe(): void;
|
|
@@ -58,7 +58,6 @@ declare class OnlineManager extends Subscribable<Listener> {
|
|
|
58
58
|
/**
|
|
59
59
|
* Singleton instance of {@link OnlineManager}, used to manage and observe the online state within TanStack Query.
|
|
60
60
|
*/
|
|
61
|
-
declare const onlineManager: OnlineManager;
|
|
61
|
+
export declare const onlineManager: OnlineManager;
|
|
62
62
|
//#endregion
|
|
63
|
-
export { OnlineManager, onlineManager };
|
|
64
63
|
//# sourceMappingURL=onlineManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineManager.d.ts","names":[],"sources":["../../src/onlineManager.ts"],"mappings":";;KAEK,YAAY;KACZ,WAAW,WAAW;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"onlineManager.d.ts","names":[],"sources":["../../src/onlineManager.ts"],"mappings":";;KAEK,YAAY;KACZ,WAAW,WAAW;;;;;;;;;;qBAWd,sBAAsB,aAAa;;;YA6BpC;YAMA;;;;;;;;;;;;;;;;;;;EAyBV,iBAAiB,OAAO;;;;;;;;;;;;;;;EAoBxB,UAAU;;;;EAcV;;;;;qBAQW,eAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineManager.js","names":[
|
|
1
|
+
{"version":3,"file":"onlineManager.js","names":[],"sources":["../../src/onlineManager.ts"],"sourcesContent":["import { Subscribable } from './subscribable'\n\ntype Listener = (online: boolean) => void\ntype SetupFn = (setOnline: Listener) => (() => void) | undefined\n\n/**\n * The `OnlineManager` manages the online state within TanStack Query. It can\n * be used to change the default event listeners or to manually change the\n * online state.\n *\n * By default, the `onlineManager` assumes an active network connection, and\n * listens to the `online` and `offline` events on the `window` object to\n * detect changes.\n */\nexport class OnlineManager extends Subscribable<Listener> {\n #online = true\n #cleanup?: () => void\n\n #setup: SetupFn\n\n constructor() {\n super()\n this.#setup = (onOnline) => {\n // addEventListener does not exist in React Native, but window does\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof window !== 'undefined' && window.addEventListener) {\n const onlineListener = () => onOnline(true)\n const offlineListener = () => onOnline(false)\n // Listen to online\n window.addEventListener('online', onlineListener, false)\n window.addEventListener('offline', offlineListener, false)\n\n return () => {\n // Be sure to unsubscribe if a new handler is set\n window.removeEventListener('online', onlineListener)\n window.removeEventListener('offline', offlineListener)\n }\n }\n\n return\n }\n }\n\n protected onSubscribe(): void {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup)\n }\n }\n\n protected onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.()\n this.#cleanup = undefined\n }\n }\n\n /**\n * `setEventListener` can be used to set a custom event listener that will\n * be used to determine the online state. The provided `setup` function\n * receives a `setOnline` callback that should be called with a `boolean`\n * whenever the online state changes.\n *\n * @example\n * ```ts\n * import NetInfo from '@react-native-community/netinfo'\n * import { onlineManager } from '@tanstack/query-core'\n *\n * onlineManager.setEventListener((setOnline) => {\n * return NetInfo.addEventListener((state) => {\n * setOnline(!!state.isConnected)\n * })\n * })\n * ```\n */\n setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup(this.setOnline.bind(this))\n }\n\n /**\n * `setOnline` can be used to manually set the online state.\n *\n * @example\n * ```ts\n * import { onlineManager } from '@tanstack/query-core'\n *\n * // Set to online\n * onlineManager.setOnline(true)\n *\n * // Set to offline\n * onlineManager.setOnline(false)\n * ```\n */\n setOnline(online: boolean): void {\n const changed = this.#online !== online\n\n if (changed) {\n this.#online = online\n this.listeners.forEach((listener) => {\n listener(online)\n })\n }\n }\n\n /**\n * `isOnline` can be used to get the current online state.\n */\n isOnline(): boolean {\n return this.#online\n }\n}\n\n/**\n * Singleton instance of {@link OnlineManager}, used to manage and observe the online state within TanStack Query.\n */\nexport const onlineManager = new OnlineManager()\n"],"mappings":";;;;;;;;;;;AAcA,IAAa,gBAAb,cAAmC,aAAuB;CACxD,UAAU;CACV;CAEA;CAEA,cAAc;EACZ,MAAM;EACN,KAAK,UAAU,aAAa;GAG1B,IAAI,OAAO,WAAW,eAAe,OAAO,kBAAkB;IAC5D,MAAM,uBAAuB,SAAS,IAAI;IAC1C,MAAM,wBAAwB,SAAS,KAAK;IAE5C,OAAO,iBAAiB,UAAU,gBAAgB,KAAK;IACvD,OAAO,iBAAiB,WAAW,iBAAiB,KAAK;IAEzD,aAAa;KAEX,OAAO,oBAAoB,UAAU,cAAc;KACnD,OAAO,oBAAoB,WAAW,eAAe;IACvD;GACF;EAGF;CACF;CAEA,cAA8B;EAC5B,IAAI,CAAC,KAAK,UACR,KAAK,iBAAiB,KAAK,MAAM;CAErC;CAEA,gBAA0B;EACxB,IAAI,CAAC,KAAK,aAAa,GAAG;GACxB,KAAK,WAAW;GAChB,KAAK,WAAW,KAAA;EAClB;CACF;;;;;;;;;;;;;;;;;;;CAoBA,iBAAiB,OAAsB;EACrC,KAAK,SAAS;EACd,KAAK,WAAW;EAChB,KAAK,WAAW,MAAM,KAAK,UAAU,KAAK,IAAI,CAAC;CACjD;;;;;;;;;;;;;;;CAgBA,UAAU,QAAuB;EAG/B,IAFgB,KAAK,YAAY,QAEpB;GACX,KAAK,UAAU;GACf,KAAK,UAAU,SAAS,aAAa;IACnC,SAAS,MAAM;GACjB,CAAC;EACH;CACF;;;;CAKA,WAAoB;EAClB,OAAO,KAAK;CACd;AACF;;;;AAKA,MAAa,gBAAgB,IAAI,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queriesObserver.cjs","names":["Subscribable","#client","#options","#queries","#observers","#result","#onUpdate","#findMatchingObservers","shallowEqualObjects","#observerMatches","#notify","#combineResult","#trackResult","#lastQueryHashes","#lastResult","#lastCombine","#combinedResult","replaceEqualDeep","QueryObserver","#shouldSkipCombine"],"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep, shallowEqualObjects } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n const excludeSet = new Set(array2)\n return array1.filter((x) => !excludeSet.has(x))\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\ntype CombineFn<TCombinedResult> = (\n result: Array<QueryObserverResult>,\n) => TCombinedResult\n\nexport interface QueriesObserverOptions<\n TCombinedResult = Array<QueryObserverResult>,\n> {\n /**\n * A function that combines the array of `QueryObserverResult`s (one per\n * observed query) into a single value. The combined value is memoized and\n * only recomputed when one of the underlying results, the query hashes, or\n * the `combine` function itself changes.\n *\n * Defaults to returning the array of `QueryObserverResult`s unchanged.\n */\n combine?: CombineFn<TCombinedResult>\n}\n\n/**\n * A `QueriesObserver` watches an array of queries at once, exposing them as\n * a single array of `QueryObserverResult`s (or, when a `combine` option is\n * given, as a combined value derived from that array). It manages one\n * internal `QueryObserver` per query, and is the primitive that framework\n * adapters (e.g. `useQueries`) build their hooks on top of.\n *\n * @example\n * ```ts\n * const observer = new QueriesObserver(queryClient, [\n * { queryKey: ['post', 1], queryFn: fetchPost },\n * { queryKey: ['post', 2], queryFn: fetchPost },\n * ])\n *\n * const unsubscribe = observer.subscribe((result) => {\n * console.log(result)\n * })\n * ```\n */\nexport class QueriesObserver<\n TCombinedResult = Array<QueryObserverResult>,\n> extends Subscribable<QueriesObserverListener> {\n #client: QueryClient\n #result!: Array<QueryObserverResult>\n #queries: Array<QueryObserverOptions>\n #options?: QueriesObserverOptions<TCombinedResult>\n #observers: Array<QueryObserver>\n #combinedResult!: TCombinedResult\n #lastCombine?: CombineFn<TCombinedResult>\n #lastResult?: Array<QueryObserverResult>\n #lastQueryHashes?: Array<string>\n #observerMatches: Array<QueryObserverMatch> = []\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions<any, any, any, any, any>>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#options = options\n this.#queries = []\n this.#observers = []\n this.#result = []\n\n this.setQueries(queries)\n }\n\n protected onSubscribe(): void {\n if (this.listeners.size === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.listeners.size) {\n this.destroy()\n }\n }\n\n /**\n * Stops observing all queries: clears all listeners and destroys every\n * underlying `QueryObserver` this observer manages.\n */\n destroy(): void {\n this.listeners = new Set()\n this.#observers.forEach((observer) => {\n observer.destroy()\n })\n }\n\n /**\n * Replaces the set of queries being observed. Existing `QueryObserver`s\n * are reused for queries that match an already-observed query hash;\n * observers for queries that are no longer present are destroyed, and new\n * observers are created and subscribed to for newly added queries.\n *\n * @example\n * ```ts\n * observer.setQueries([\n * { queryKey: ['post', 1], queryFn: fetchPost },\n * { queryKey: ['post', 3], queryFn: fetchPost },\n * ])\n * ```\n */\n setQueries(\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ): void {\n this.#queries = queries\n this.#options = options\n\n if (process.env.NODE_ENV !== 'production') {\n const queryHashes = queries.map(\n (query) => this.#client.defaultQueryOptions(query).queryHash,\n )\n if (new Set(queryHashes).size !== queryHashes.length) {\n console.warn(\n '[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.',\n )\n }\n }\n\n notifyManager.batch(() => {\n const prevObservers = this.#observers\n\n const newObserverMatches = this.#findMatchingObservers(this.#queries)\n\n // set options for the new observers to notify of changes\n newObserverMatches.forEach((match) =>\n match.observer.setOptions(match.defaultedQueryOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasLengthChange = prevObservers.length !== newObservers.length\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n const hasStructuralChange = hasLengthChange || hasIndexChange\n\n const hasResultChange = hasStructuralChange\n ? true\n : newResult.some((result, index) => {\n const prev = this.#result[index]\n return !prev || !shallowEqualObjects(result, prev)\n })\n\n if (!hasStructuralChange && !hasResultChange) return\n\n if (hasStructuralChange) {\n this.#observerMatches = newObserverMatches\n this.#observers = newObservers\n }\n\n this.#result = newResult\n\n if (!this.hasListeners()) return\n\n if (hasStructuralChange) {\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n\n this.#notify()\n })\n }\n\n /**\n * Returns the most recently computed array of `QueryObserverResult`s, one\n * per observed query, in the same order as the queries passed to the\n * constructor or `setQueries`.\n *\n * @example\n * ```ts\n * const results = observer.getCurrentResult()\n * const data = results.map((result) => result.data)\n * ```\n */\n getCurrentResult(): Array<QueryObserverResult> {\n return this.#result\n }\n\n /**\n * Returns the underlying `Query` instances currently being observed, in\n * the same order as the queries passed to the constructor or `setQueries`.\n */\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery())\n }\n\n /**\n * Returns the underlying `QueryObserver` instances this observer manages,\n * in the same order as the queries passed to the constructor or\n * `setQueries`.\n */\n getObservers() {\n return this.#observers\n }\n\n /**\n * The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes\n * the result for the given (already-defaulted) queries right now, synchronously. Called by\n * framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw\n * per-query results, a function to compute the combined result from them, and a function to\n * wrap the results for property-access tracking.\n */\n getOptimisticResult(\n queries: Array<QueryObserverOptions>,\n combine: CombineFn<TCombinedResult> | undefined,\n ): [\n rawResult: Array<QueryObserverResult>,\n combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,\n trackResult: () => Array<QueryObserverResult>,\n ] {\n const matches = this.#findMatchingObservers(queries)\n const result = matches.map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n const queryHashes = matches.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result, combine, queryHashes)\n },\n () => {\n return this.#trackResult(result, matches)\n },\n ]\n }\n\n #trackResult(\n result: Array<QueryObserverResult>,\n matches: Array<QueryObserverMatch>,\n ) {\n const trackedProps = new Set<keyof QueryObserverResult>()\n\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult, (accessedProp) => {\n // track property on all observers to ensure proper (synchronized) tracking (#7000)\n if (!trackedProps.has(accessedProp)) {\n trackedProps.add(accessedProp)\n matches.forEach((m) => {\n m.observer.trackProp(accessedProp)\n })\n }\n })\n : observerResult\n })\n }\n\n #combineResult(\n input: Array<QueryObserverResult>,\n combine: CombineFn<TCombinedResult> | undefined,\n queryHashes?: Array<string>,\n ): TCombinedResult {\n if (combine) {\n const lastHashes = this.#lastQueryHashes\n const queryHashesChanged =\n queryHashes !== undefined &&\n lastHashes !== undefined &&\n (lastHashes.length !== queryHashes.length ||\n queryHashes.some((hash, i) => hash !== lastHashes[i]))\n\n if (\n this.#result !== this.#lastResult ||\n queryHashesChanged ||\n combine !== this.#lastCombine\n ) {\n this.#lastCombine = combine\n this.#lastResult = this.#result\n\n if (queryHashes !== undefined) {\n this.#lastQueryHashes = queryHashes\n }\n this.#combinedResult = replaceEqualDeep(\n this.#combinedResult,\n combine(input),\n )\n }\n\n return this.#combinedResult\n }\n return input as any\n }\n\n #shouldSkipCombine(): boolean {\n return (\n !this.#options?.combine ||\n this.#observers.some((observer, index) => {\n return (\n observer.options.suspense && this.#result[index]?.data === undefined\n )\n })\n )\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<QueryObserverMatch> {\n const prevObserversMap = new Map<string, Array<QueryObserver>>()\n\n this.#observers.forEach((observer) => {\n const key = observer.options.queryHash\n if (!key) return\n\n const previousObservers = prevObserversMap.get(key)\n\n if (previousObservers) {\n previousObservers.push(observer)\n } else {\n prevObserversMap.set(key, [observer])\n }\n })\n\n const observers: Array<QueryObserverMatch> = []\n\n queries.forEach((options) => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift()\n const observer =\n match ?? new QueryObserver(this.#client, defaultedOptions)\n\n observers.push({\n defaultedQueryOptions: defaultedOptions,\n observer,\n })\n })\n\n return observers\n }\n\n #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#result = this.#result.slice()\n this.#result[index] = result\n this.#notify()\n }\n }\n\n #notify(): void {\n if (this.hasListeners()) {\n const shouldSkipCombine = this.#shouldSkipCombine()\n const previousResult = this.#combinedResult\n const newResult = shouldSkipCombine\n ? previousResult\n : this.#combineResult(\n this.#trackResult(this.#result, this.#observerMatches),\n this.#options?.combine,\n )\n\n if (shouldSkipCombine || previousResult !== newResult) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result)\n })\n })\n }\n }\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queriesObserver.cjs","names":["Subscribable","shallowEqualObjects","replaceEqualDeep","QueryObserver"],"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep, shallowEqualObjects } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n const excludeSet = new Set(array2)\n return array1.filter((x) => !excludeSet.has(x))\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\ntype CombineFn<TCombinedResult> = (\n result: Array<QueryObserverResult>,\n) => TCombinedResult\n\nexport interface QueriesObserverOptions<\n TCombinedResult = Array<QueryObserverResult>,\n> {\n /**\n * A function that combines the array of `QueryObserverResult`s (one per\n * observed query) into a single value. The combined value is memoized and\n * only recomputed when one of the underlying results, the query hashes, or\n * the `combine` function itself changes.\n *\n * Defaults to returning the array of `QueryObserverResult`s unchanged.\n */\n combine?: CombineFn<TCombinedResult>\n}\n\n/**\n * A `QueriesObserver` watches an array of queries at once, exposing them as\n * a single array of `QueryObserverResult`s (or, when a `combine` option is\n * given, as a combined value derived from that array). It manages one\n * internal `QueryObserver` per query, and is the primitive that framework\n * adapters (e.g. `useQueries`) build their hooks on top of.\n *\n * @example\n * ```ts\n * const observer = new QueriesObserver(queryClient, [\n * { queryKey: ['post', 1], queryFn: fetchPost },\n * { queryKey: ['post', 2], queryFn: fetchPost },\n * ])\n *\n * const unsubscribe = observer.subscribe((result) => {\n * console.log(result)\n * })\n * ```\n */\nexport class QueriesObserver<\n TCombinedResult = Array<QueryObserverResult>,\n> extends Subscribable<QueriesObserverListener> {\n #client: QueryClient\n #result!: Array<QueryObserverResult>\n #queries: Array<QueryObserverOptions>\n #options?: QueriesObserverOptions<TCombinedResult>\n #observers: Array<QueryObserver>\n #combinedResult!: TCombinedResult\n #lastCombine?: CombineFn<TCombinedResult>\n #lastResult?: Array<QueryObserverResult>\n #lastQueryHashes?: Array<string>\n #observerMatches: Array<QueryObserverMatch> = []\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions<any, any, any, any, any>>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#options = options\n this.#queries = []\n this.#observers = []\n this.#result = []\n\n this.setQueries(queries)\n }\n\n protected onSubscribe(): void {\n if (this.listeners.size === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.listeners.size) {\n this.destroy()\n }\n }\n\n /**\n * Stops observing all queries: clears all listeners and destroys every\n * underlying `QueryObserver` this observer manages.\n */\n destroy(): void {\n this.listeners = new Set()\n this.#observers.forEach((observer) => {\n observer.destroy()\n })\n }\n\n /**\n * Replaces the set of queries being observed. Existing `QueryObserver`s\n * are reused for queries that match an already-observed query hash;\n * observers for queries that are no longer present are destroyed, and new\n * observers are created and subscribed to for newly added queries.\n *\n * @example\n * ```ts\n * observer.setQueries([\n * { queryKey: ['post', 1], queryFn: fetchPost },\n * { queryKey: ['post', 3], queryFn: fetchPost },\n * ])\n * ```\n */\n setQueries(\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ): void {\n this.#queries = queries\n this.#options = options\n\n if (process.env.NODE_ENV !== 'production') {\n const queryHashes = queries.map(\n (query) => this.#client.defaultQueryOptions(query).queryHash,\n )\n if (new Set(queryHashes).size !== queryHashes.length) {\n console.warn(\n '[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.',\n )\n }\n }\n\n notifyManager.batch(() => {\n const prevObservers = this.#observers\n\n const newObserverMatches = this.#findMatchingObservers(this.#queries)\n\n // set options for the new observers to notify of changes\n newObserverMatches.forEach((match) =>\n match.observer.setOptions(match.defaultedQueryOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasLengthChange = prevObservers.length !== newObservers.length\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n const hasStructuralChange = hasLengthChange || hasIndexChange\n\n const hasResultChange = hasStructuralChange\n ? true\n : newResult.some((result, index) => {\n const prev = this.#result[index]\n return !prev || !shallowEqualObjects(result, prev)\n })\n\n if (!hasStructuralChange && !hasResultChange) return\n\n if (hasStructuralChange) {\n this.#observerMatches = newObserverMatches\n this.#observers = newObservers\n }\n\n this.#result = newResult\n\n if (!this.hasListeners()) return\n\n if (hasStructuralChange) {\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n\n this.#notify()\n })\n }\n\n /**\n * Returns the most recently computed array of `QueryObserverResult`s, one\n * per observed query, in the same order as the queries passed to the\n * constructor or `setQueries`.\n *\n * @example\n * ```ts\n * const results = observer.getCurrentResult()\n * const data = results.map((result) => result.data)\n * ```\n */\n getCurrentResult(): Array<QueryObserverResult> {\n return this.#result\n }\n\n /**\n * Returns the underlying `Query` instances currently being observed, in\n * the same order as the queries passed to the constructor or `setQueries`.\n */\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery())\n }\n\n /**\n * Returns the underlying `QueryObserver` instances this observer manages,\n * in the same order as the queries passed to the constructor or\n * `setQueries`.\n */\n getObservers() {\n return this.#observers\n }\n\n /**\n * The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes\n * the result for the given (already-defaulted) queries right now, synchronously. Called by\n * framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw\n * per-query results, a function to compute the combined result from them, and a function to\n * wrap the results for property-access tracking.\n */\n getOptimisticResult(\n queries: Array<QueryObserverOptions>,\n combine: CombineFn<TCombinedResult> | undefined,\n ): [\n rawResult: Array<QueryObserverResult>,\n combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,\n trackResult: () => Array<QueryObserverResult>,\n ] {\n const matches = this.#findMatchingObservers(queries)\n const result = matches.map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n const queryHashes = matches.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result, combine, queryHashes)\n },\n () => {\n return this.#trackResult(result, matches)\n },\n ]\n }\n\n #trackResult(\n result: Array<QueryObserverResult>,\n matches: Array<QueryObserverMatch>,\n ) {\n const trackedProps = new Set<keyof QueryObserverResult>()\n\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult, (accessedProp) => {\n // track property on all observers to ensure proper (synchronized) tracking (#7000)\n if (!trackedProps.has(accessedProp)) {\n trackedProps.add(accessedProp)\n matches.forEach((m) => {\n m.observer.trackProp(accessedProp)\n })\n }\n })\n : observerResult\n })\n }\n\n #combineResult(\n input: Array<QueryObserverResult>,\n combine: CombineFn<TCombinedResult> | undefined,\n queryHashes?: Array<string>,\n ): TCombinedResult {\n if (combine) {\n const lastHashes = this.#lastQueryHashes\n const queryHashesChanged =\n queryHashes !== undefined &&\n lastHashes !== undefined &&\n (lastHashes.length !== queryHashes.length ||\n queryHashes.some((hash, i) => hash !== lastHashes[i]))\n\n if (\n this.#result !== this.#lastResult ||\n queryHashesChanged ||\n combine !== this.#lastCombine\n ) {\n this.#lastCombine = combine\n this.#lastResult = this.#result\n\n if (queryHashes !== undefined) {\n this.#lastQueryHashes = queryHashes\n }\n this.#combinedResult = replaceEqualDeep(\n this.#combinedResult,\n combine(input),\n )\n }\n\n return this.#combinedResult\n }\n return input as any\n }\n\n #shouldSkipCombine(): boolean {\n return (\n !this.#options?.combine ||\n this.#observers.some((observer, index) => {\n return (\n observer.options.suspense && this.#result[index]?.data === undefined\n )\n })\n )\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<QueryObserverMatch> {\n const prevObserversMap = new Map<string, Array<QueryObserver>>()\n\n this.#observers.forEach((observer) => {\n const key = observer.options.queryHash\n if (!key) return\n\n const previousObservers = prevObserversMap.get(key)\n\n if (previousObservers) {\n previousObservers.push(observer)\n } else {\n prevObserversMap.set(key, [observer])\n }\n })\n\n const observers: Array<QueryObserverMatch> = []\n\n queries.forEach((options) => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift()\n const observer =\n match ?? new QueryObserver(this.#client, defaultedOptions)\n\n observers.push({\n defaultedQueryOptions: defaultedOptions,\n observer,\n })\n })\n\n return observers\n }\n\n #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#result = this.#result.slice()\n this.#result[index] = result\n this.#notify()\n }\n }\n\n #notify(): void {\n if (this.hasListeners()) {\n const shouldSkipCombine = this.#shouldSkipCombine()\n const previousResult = this.#combinedResult\n const newResult = shouldSkipCombine\n ? previousResult\n : this.#combineResult(\n this.#trackResult(this.#result, this.#observerMatches),\n this.#options?.combine,\n )\n\n if (shouldSkipCombine || previousResult !== newResult) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result)\n })\n })\n }\n }\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { t as Subscribable } from "./subscribable-
|
|
2
|
-
import { $n as Query, At as QueryObserverOptions, Pt as QueryObserverResult, on as QueryClient, rr as QueryObserver } from "./hydration-
|
|
1
|
+
import { t as Subscribable } from "./subscribable-CysQ0tne.cjs";
|
|
2
|
+
import { $n as Query, At as QueryObserverOptions, Pt as QueryObserverResult, on as QueryClient, rr as QueryObserver } from "./hydration-Br9VIGXa.cjs";
|
|
3
3
|
//#region src/queriesObserver.d.ts
|
|
4
4
|
type QueriesObserverListener = (result: Array<QueryObserverResult>) => void;
|
|
5
5
|
type CombineFn<TCombinedResult> = (result: Array<QueryObserverResult>) => TCombinedResult;
|
|
6
|
-
interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
6
|
+
export interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
7
7
|
/**
|
|
8
8
|
* A function that combines the array of `QueryObserverResult`s (one per
|
|
9
9
|
* observed query) into a single value. The combined value is memoized and
|
|
@@ -33,7 +33,7 @@ interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
|
33
33
|
* })
|
|
34
34
|
* ```
|
|
35
35
|
*/
|
|
36
|
-
declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
36
|
+
export declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
37
37
|
#private;
|
|
38
38
|
constructor(client: QueryClient, queries: Array<QueryObserverOptions<any, any, any, any, any>>, options?: QueriesObserverOptions<TCombinedResult>);
|
|
39
39
|
protected onSubscribe(): void;
|
|
@@ -91,5 +91,4 @@ declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> exte
|
|
|
91
91
|
getOptimisticResult(queries: Array<QueryObserverOptions>, combine: CombineFn<TCombinedResult> | undefined): [rawResult: Array<QueryObserverResult>, combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult, trackResult: () => Array<QueryObserverResult>];
|
|
92
92
|
}
|
|
93
93
|
//#endregion
|
|
94
|
-
export { QueriesObserver, QueriesObserverOptions };
|
|
95
94
|
//# sourceMappingURL=queriesObserver.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queriesObserver.d.cts","names":[],"sources":["../../src/queriesObserver.ts"],"mappings":";;;KAgBK,2BAA2B,QAAQ,MAAM;KAEzC,UAAU,oBACb,QAAQ,MAAM,yBACX;
|
|
1
|
+
{"version":3,"file":"queriesObserver.d.cts","names":["_$__query0.Query"],"sources":["../../src/queriesObserver.ts"],"mappings":";;;KAgBK,2BAA2B,QAAQ,MAAM;KAEzC,UAAU,oBACb,QAAQ,MAAM,yBACX;iBAEY,uBACf,kBAAkB,MAAM;;;;;;;;;EAUxB,UAAU,UAAU;;;;;;;;;;;;;;;;;;;;;qBAsBT,gBACX,kBAAkB,MAAM,8BAChB,aAAa;;EAanB,YAAA,QAAQ,aACR,SAAS,MAAM,gDACf,UAAU,uBAAuB;YAazB;YAUA;;;;;EAUV;;;;;;;;;;;;;;;EAqBA,WACE,SAAS,MAAM,uBACf,UAAU,uBAAuB;;;;;;;;;;;;EAiFnC,oBAAoB,MAAM;;;;;EAQ1B,cAAUA,eAAA;;;;;;EASV,gBAAY,uBAAA;;;;;;;;EAWZ,oBACE,SAAS,MAAM,uBACf,SAAS,UAAU,gCAEnB,WAAW,MAAM,sBACjB,gBAAgB,IAAI,MAAM,yBAAyB,iBACnD,mBAAmB,MAAM"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { t as Subscribable } from "./subscribable-
|
|
2
|
-
import { $n as Query, At as QueryObserverOptions, Pt as QueryObserverResult, on as QueryClient, rr as QueryObserver } from "./hydration-
|
|
1
|
+
import { t as Subscribable } from "./subscribable-CysQ0tne.js";
|
|
2
|
+
import { $n as Query, At as QueryObserverOptions, Pt as QueryObserverResult, on as QueryClient, rr as QueryObserver } from "./hydration-B9t5w6NC.js";
|
|
3
3
|
//#region src/queriesObserver.d.ts
|
|
4
4
|
type QueriesObserverListener = (result: Array<QueryObserverResult>) => void;
|
|
5
5
|
type CombineFn<TCombinedResult> = (result: Array<QueryObserverResult>) => TCombinedResult;
|
|
6
|
-
interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
6
|
+
export interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
7
7
|
/**
|
|
8
8
|
* A function that combines the array of `QueryObserverResult`s (one per
|
|
9
9
|
* observed query) into a single value. The combined value is memoized and
|
|
@@ -33,7 +33,7 @@ interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
|
33
33
|
* })
|
|
34
34
|
* ```
|
|
35
35
|
*/
|
|
36
|
-
declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
36
|
+
export declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
37
37
|
#private;
|
|
38
38
|
constructor(client: QueryClient, queries: Array<QueryObserverOptions<any, any, any, any, any>>, options?: QueriesObserverOptions<TCombinedResult>);
|
|
39
39
|
protected onSubscribe(): void;
|
|
@@ -91,5 +91,4 @@ declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> exte
|
|
|
91
91
|
getOptimisticResult(queries: Array<QueryObserverOptions>, combine: CombineFn<TCombinedResult> | undefined): [rawResult: Array<QueryObserverResult>, combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult, trackResult: () => Array<QueryObserverResult>];
|
|
92
92
|
}
|
|
93
93
|
//#endregion
|
|
94
|
-
export { QueriesObserver, QueriesObserverOptions };
|
|
95
94
|
//# sourceMappingURL=queriesObserver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queriesObserver.d.ts","names":[],"sources":["../../src/queriesObserver.ts"],"mappings":";;;KAgBK,2BAA2B,QAAQ,MAAM;KAEzC,UAAU,oBACb,QAAQ,MAAM,yBACX;
|
|
1
|
+
{"version":3,"file":"queriesObserver.d.ts","names":["_$__query0.Query"],"sources":["../../src/queriesObserver.ts"],"mappings":";;;KAgBK,2BAA2B,QAAQ,MAAM;KAEzC,UAAU,oBACb,QAAQ,MAAM,yBACX;iBAEY,uBACf,kBAAkB,MAAM;;;;;;;;;EAUxB,UAAU,UAAU;;;;;;;;;;;;;;;;;;;;;qBAsBT,gBACX,kBAAkB,MAAM,8BAChB,aAAa;;EAanB,YAAA,QAAQ,aACR,SAAS,MAAM,gDACf,UAAU,uBAAuB;YAazB;YAUA;;;;;EAUV;;;;;;;;;;;;;;;EAqBA,WACE,SAAS,MAAM,uBACf,UAAU,uBAAuB;;;;;;;;;;;;EAiFnC,oBAAoB,MAAM;;;;;EAQ1B,cAAUA,eAAA;;;;;;EASV,gBAAY,uBAAA;;;;;;;;EAWZ,oBACE,SAAS,MAAM,uBACf,SAAS,UAAU,gCAEnB,WAAW,MAAM,sBACjB,gBAAgB,IAAI,MAAM,yBAAyB,iBACnD,mBAAmB,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queriesObserver.js","names":["#client","#options","#queries","#observers","#result","#onUpdate","#findMatchingObservers","#observerMatches","#notify","#combineResult","#trackResult","#lastQueryHashes","#lastResult","#lastCombine","#combinedResult","#shouldSkipCombine"],"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep, shallowEqualObjects } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n const excludeSet = new Set(array2)\n return array1.filter((x) => !excludeSet.has(x))\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\ntype CombineFn<TCombinedResult> = (\n result: Array<QueryObserverResult>,\n) => TCombinedResult\n\nexport interface QueriesObserverOptions<\n TCombinedResult = Array<QueryObserverResult>,\n> {\n /**\n * A function that combines the array of `QueryObserverResult`s (one per\n * observed query) into a single value. The combined value is memoized and\n * only recomputed when one of the underlying results, the query hashes, or\n * the `combine` function itself changes.\n *\n * Defaults to returning the array of `QueryObserverResult`s unchanged.\n */\n combine?: CombineFn<TCombinedResult>\n}\n\n/**\n * A `QueriesObserver` watches an array of queries at once, exposing them as\n * a single array of `QueryObserverResult`s (or, when a `combine` option is\n * given, as a combined value derived from that array). It manages one\n * internal `QueryObserver` per query, and is the primitive that framework\n * adapters (e.g. `useQueries`) build their hooks on top of.\n *\n * @example\n * ```ts\n * const observer = new QueriesObserver(queryClient, [\n * { queryKey: ['post', 1], queryFn: fetchPost },\n * { queryKey: ['post', 2], queryFn: fetchPost },\n * ])\n *\n * const unsubscribe = observer.subscribe((result) => {\n * console.log(result)\n * })\n * ```\n */\nexport class QueriesObserver<\n TCombinedResult = Array<QueryObserverResult>,\n> extends Subscribable<QueriesObserverListener> {\n #client: QueryClient\n #result!: Array<QueryObserverResult>\n #queries: Array<QueryObserverOptions>\n #options?: QueriesObserverOptions<TCombinedResult>\n #observers: Array<QueryObserver>\n #combinedResult!: TCombinedResult\n #lastCombine?: CombineFn<TCombinedResult>\n #lastResult?: Array<QueryObserverResult>\n #lastQueryHashes?: Array<string>\n #observerMatches: Array<QueryObserverMatch> = []\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions<any, any, any, any, any>>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#options = options\n this.#queries = []\n this.#observers = []\n this.#result = []\n\n this.setQueries(queries)\n }\n\n protected onSubscribe(): void {\n if (this.listeners.size === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.listeners.size) {\n this.destroy()\n }\n }\n\n /**\n * Stops observing all queries: clears all listeners and destroys every\n * underlying `QueryObserver` this observer manages.\n */\n destroy(): void {\n this.listeners = new Set()\n this.#observers.forEach((observer) => {\n observer.destroy()\n })\n }\n\n /**\n * Replaces the set of queries being observed. Existing `QueryObserver`s\n * are reused for queries that match an already-observed query hash;\n * observers for queries that are no longer present are destroyed, and new\n * observers are created and subscribed to for newly added queries.\n *\n * @example\n * ```ts\n * observer.setQueries([\n * { queryKey: ['post', 1], queryFn: fetchPost },\n * { queryKey: ['post', 3], queryFn: fetchPost },\n * ])\n * ```\n */\n setQueries(\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ): void {\n this.#queries = queries\n this.#options = options\n\n if (process.env.NODE_ENV !== 'production') {\n const queryHashes = queries.map(\n (query) => this.#client.defaultQueryOptions(query).queryHash,\n )\n if (new Set(queryHashes).size !== queryHashes.length) {\n console.warn(\n '[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.',\n )\n }\n }\n\n notifyManager.batch(() => {\n const prevObservers = this.#observers\n\n const newObserverMatches = this.#findMatchingObservers(this.#queries)\n\n // set options for the new observers to notify of changes\n newObserverMatches.forEach((match) =>\n match.observer.setOptions(match.defaultedQueryOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasLengthChange = prevObservers.length !== newObservers.length\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n const hasStructuralChange = hasLengthChange || hasIndexChange\n\n const hasResultChange = hasStructuralChange\n ? true\n : newResult.some((result, index) => {\n const prev = this.#result[index]\n return !prev || !shallowEqualObjects(result, prev)\n })\n\n if (!hasStructuralChange && !hasResultChange) return\n\n if (hasStructuralChange) {\n this.#observerMatches = newObserverMatches\n this.#observers = newObservers\n }\n\n this.#result = newResult\n\n if (!this.hasListeners()) return\n\n if (hasStructuralChange) {\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n\n this.#notify()\n })\n }\n\n /**\n * Returns the most recently computed array of `QueryObserverResult`s, one\n * per observed query, in the same order as the queries passed to the\n * constructor or `setQueries`.\n *\n * @example\n * ```ts\n * const results = observer.getCurrentResult()\n * const data = results.map((result) => result.data)\n * ```\n */\n getCurrentResult(): Array<QueryObserverResult> {\n return this.#result\n }\n\n /**\n * Returns the underlying `Query` instances currently being observed, in\n * the same order as the queries passed to the constructor or `setQueries`.\n */\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery())\n }\n\n /**\n * Returns the underlying `QueryObserver` instances this observer manages,\n * in the same order as the queries passed to the constructor or\n * `setQueries`.\n */\n getObservers() {\n return this.#observers\n }\n\n /**\n * The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes\n * the result for the given (already-defaulted) queries right now, synchronously. Called by\n * framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw\n * per-query results, a function to compute the combined result from them, and a function to\n * wrap the results for property-access tracking.\n */\n getOptimisticResult(\n queries: Array<QueryObserverOptions>,\n combine: CombineFn<TCombinedResult> | undefined,\n ): [\n rawResult: Array<QueryObserverResult>,\n combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,\n trackResult: () => Array<QueryObserverResult>,\n ] {\n const matches = this.#findMatchingObservers(queries)\n const result = matches.map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n const queryHashes = matches.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result, combine, queryHashes)\n },\n () => {\n return this.#trackResult(result, matches)\n },\n ]\n }\n\n #trackResult(\n result: Array<QueryObserverResult>,\n matches: Array<QueryObserverMatch>,\n ) {\n const trackedProps = new Set<keyof QueryObserverResult>()\n\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult, (accessedProp) => {\n // track property on all observers to ensure proper (synchronized) tracking (#7000)\n if (!trackedProps.has(accessedProp)) {\n trackedProps.add(accessedProp)\n matches.forEach((m) => {\n m.observer.trackProp(accessedProp)\n })\n }\n })\n : observerResult\n })\n }\n\n #combineResult(\n input: Array<QueryObserverResult>,\n combine: CombineFn<TCombinedResult> | undefined,\n queryHashes?: Array<string>,\n ): TCombinedResult {\n if (combine) {\n const lastHashes = this.#lastQueryHashes\n const queryHashesChanged =\n queryHashes !== undefined &&\n lastHashes !== undefined &&\n (lastHashes.length !== queryHashes.length ||\n queryHashes.some((hash, i) => hash !== lastHashes[i]))\n\n if (\n this.#result !== this.#lastResult ||\n queryHashesChanged ||\n combine !== this.#lastCombine\n ) {\n this.#lastCombine = combine\n this.#lastResult = this.#result\n\n if (queryHashes !== undefined) {\n this.#lastQueryHashes = queryHashes\n }\n this.#combinedResult = replaceEqualDeep(\n this.#combinedResult,\n combine(input),\n )\n }\n\n return this.#combinedResult\n }\n return input as any\n }\n\n #shouldSkipCombine(): boolean {\n return (\n !this.#options?.combine ||\n this.#observers.some((observer, index) => {\n return (\n observer.options.suspense && this.#result[index]?.data === undefined\n )\n })\n )\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<QueryObserverMatch> {\n const prevObserversMap = new Map<string, Array<QueryObserver>>()\n\n this.#observers.forEach((observer) => {\n const key = observer.options.queryHash\n if (!key) return\n\n const previousObservers = prevObserversMap.get(key)\n\n if (previousObservers) {\n previousObservers.push(observer)\n } else {\n prevObserversMap.set(key, [observer])\n }\n })\n\n const observers: Array<QueryObserverMatch> = []\n\n queries.forEach((options) => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift()\n const observer =\n match ?? new QueryObserver(this.#client, defaultedOptions)\n\n observers.push({\n defaultedQueryOptions: defaultedOptions,\n observer,\n })\n })\n\n return observers\n }\n\n #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#result = this.#result.slice()\n this.#result[index] = result\n this.#notify()\n }\n }\n\n #notify(): void {\n if (this.hasListeners()) {\n const shouldSkipCombine = this.#shouldSkipCombine()\n const previousResult = this.#combinedResult\n const newResult = shouldSkipCombine\n ? previousResult\n : this.#combineResult(\n this.#trackResult(this.#result, this.#observerMatches),\n this.#options?.combine,\n )\n\n if (shouldSkipCombine || previousResult !== newResult) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result)\n })\n })\n }\n }\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"mappings":";;;;;AAWA,SAAS,WAAc,QAAkB,QAA4B;CACnE,MAAM,aAAa,IAAI,IAAI,MAAM;CACjC,OAAO,OAAO,QAAQ,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;AAChD;;;;;;;;;;;;;;;;;;;;AAyCA,IAAa,kBAAb,cAEU,aAAsC;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,mBAA8C,CAAC;CAE/C,YACE,QACA,SACA,SACA;EACA,MAAM;EAEN,KAAKA,UAAU;EACf,KAAKC,WAAW;EAChB,KAAKC,WAAW,CAAC;EACjB,KAAKC,aAAa,CAAC;EACnB,KAAKC,UAAU,CAAC;EAEhB,KAAK,WAAW,OAAO;CACzB;CAEA,cAA8B;EAC5B,IAAI,KAAK,UAAU,SAAS,GAC1B,KAAKD,WAAW,SAAS,aAAa;GACpC,SAAS,WAAW,WAAW;IAC7B,KAAKE,UAAU,UAAU,MAAM;GACjC,CAAC;EACH,CAAC;CAEL;CAEA,gBAAgC;EAC9B,IAAI,CAAC,KAAK,UAAU,MAClB,KAAK,QAAQ;CAEjB;;;;;CAMA,UAAgB;EACd,KAAK,4BAAY,IAAI,IAAI;EACzB,KAAKF,WAAW,SAAS,aAAa;GACpC,SAAS,QAAQ;EACnB,CAAC;CACH;;;;;;;;;;;;;;;CAgBA,WACE,SACA,SACM;EACN,KAAKD,WAAW;EAChB,KAAKD,WAAW;EAEhB,IAAI,QAAQ,IAAI,aAAa,cAAc;GACzC,MAAM,cAAc,QAAQ,KACzB,UAAU,KAAKD,QAAQ,oBAAoB,KAAK,CAAC,CAAC,SACrD;GACA,IAAI,IAAI,IAAI,WAAW,CAAC,CAAC,SAAS,YAAY,QAC5C,QAAQ,KACN,uFACF;EAEJ;EAEA,cAAc,YAAY;GACxB,MAAM,gBAAgB,KAAKG;GAE3B,MAAM,qBAAqB,KAAKG,uBAAuB,KAAKJ,QAAQ;GAGpE,mBAAmB,SAAS,UAC1B,MAAM,SAAS,WAAW,MAAM,qBAAqB,CACvD;GAEA,MAAM,eAAe,mBAAmB,KAAK,UAAU,MAAM,QAAQ;GACrE,MAAM,YAAY,aAAa,KAAK,aAClC,SAAS,iBAAiB,CAC5B;GAEA,MAAM,kBAAkB,cAAc,WAAW,aAAa;GAC9D,MAAM,iBAAiB,aAAa,MACjC,UAAU,UAAU,aAAa,cAAc,MAClD;GACA,MAAM,sBAAsB,mBAAmB;GAE/C,MAAM,kBAAkB,sBACpB,OACA,UAAU,MAAM,QAAQ,UAAU;IAChC,MAAM,OAAO,KAAKE,QAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,QAAQ,IAAI;GACnD,CAAC;GAEL,IAAI,CAAC,uBAAuB,CAAC,iBAAiB;GAE9C,IAAI,qBAAqB;IACvB,KAAKG,mBAAmB;IACxB,KAAKJ,aAAa;GACpB;GAEA,KAAKC,UAAU;GAEf,IAAI,CAAC,KAAK,aAAa,GAAG;GAE1B,IAAI,qBAAqB;IACvB,WAAW,eAAe,YAAY,CAAC,CAAC,SAAS,aAAa;KAC5D,SAAS,QAAQ;IACnB,CAAC;IACD,WAAW,cAAc,aAAa,CAAC,CAAC,SAAS,aAAa;KAC5D,SAAS,WAAW,WAAW;MAC7B,KAAKC,UAAU,UAAU,MAAM;KACjC,CAAC;IACH,CAAC;GACH;GAEA,KAAKG,QAAQ;EACf,CAAC;CACH;;;;;;;;;;;;CAaA,mBAA+C;EAC7C,OAAO,KAAKJ;CACd;;;;;CAMA,aAAa;EACX,OAAO,KAAKD,WAAW,KAAK,aAAa,SAAS,gBAAgB,CAAC;CACrE;;;;;;CAOA,eAAe;EACb,OAAO,KAAKA;CACd;;;;;;;;CASA,oBACE,SACA,SAKA;EACA,MAAM,UAAU,KAAKG,uBAAuB,OAAO;EACnD,MAAM,SAAS,QAAQ,KAAK,UAC1B,MAAM,SAAS,oBAAoB,MAAM,qBAAqB,CAChE;EACA,MAAM,cAAc,QAAQ,KACzB,UAAU,MAAM,sBAAsB,SACzC;EAEA,OAAO;GACL;IACC,MAAmC;IAClC,OAAO,KAAKG,eAAe,KAAK,QAAQ,SAAS,WAAW;GAC9D;SACM;IACJ,OAAO,KAAKC,aAAa,QAAQ,OAAO;GAC1C;EACF;CACF;CAEA,aACE,QACA,SACA;EACA,MAAM,+BAAe,IAAI,IAA+B;EAExD,OAAO,QAAQ,KAAK,OAAO,UAAU;GACnC,MAAM,iBAAiB,OAAO;GAC9B,OAAO,CAAC,MAAM,sBAAsB,sBAChC,MAAM,SAAS,YAAY,iBAAiB,iBAAiB;IAE3D,IAAI,CAAC,aAAa,IAAI,YAAY,GAAG;KACnC,aAAa,IAAI,YAAY;KAC7B,QAAQ,SAAS,MAAM;MACrB,EAAE,SAAS,UAAU,YAAY;KACnC,CAAC;IACH;GACF,CAAC,IACD;EACN,CAAC;CACH;CAEA,eACE,OACA,SACA,aACiB;EACjB,IAAI,SAAS;GACX,MAAM,aAAa,KAAKC;GACxB,MAAM,qBACJ,gBAAgB,KAAA,KAChB,eAAe,KAAA,MACd,WAAW,WAAW,YAAY,UACjC,YAAY,MAAM,MAAM,MAAM,SAAS,WAAW,EAAE;GAExD,IACE,KAAKP,YAAY,KAAKQ,eACtB,sBACA,YAAY,KAAKC,cACjB;IACA,KAAKA,eAAe;IACpB,KAAKD,cAAc,KAAKR;IAExB,IAAI,gBAAgB,KAAA,GAClB,KAAKO,mBAAmB;IAE1B,KAAKG,kBAAkB,iBACrB,KAAKA,iBACL,QAAQ,KAAK,CACf;GACF;GAEA,OAAO,KAAKA;EACd;EACA,OAAO;CACT;CAEA,qBAA8B;EAC5B,OACE,CAAC,KAAKb,UAAU,WAChB,KAAKE,WAAW,MAAM,UAAU,UAAU;GACxC,OACE,SAAS,QAAQ,YAAY,KAAKC,QAAQ,MAAM,EAAE,SAAS,KAAA;EAE/D,CAAC;CAEL;CAEA,uBACE,SAC2B;EAC3B,MAAM,mCAAmB,IAAI,IAAkC;EAE/D,KAAKD,WAAW,SAAS,aAAa;GACpC,MAAM,MAAM,SAAS,QAAQ;GAC7B,IAAI,CAAC,KAAK;GAEV,MAAM,oBAAoB,iBAAiB,IAAI,GAAG;GAElD,IAAI,mBACF,kBAAkB,KAAK,QAAQ;QAE/B,iBAAiB,IAAI,KAAK,CAAC,QAAQ,CAAC;EAExC,CAAC;EAED,MAAM,YAAuC,CAAC;EAE9C,QAAQ,SAAS,YAAY;GAC3B,MAAM,mBAAmB,KAAKH,QAAQ,oBAAoB,OAAO;GAEjE,MAAM,WADQ,iBAAiB,IAAI,iBAAiB,SAAS,CAAC,EAAE,MAAM,KAE3D,IAAI,cAAc,KAAKA,SAAS,gBAAgB;GAE3D,UAAU,KAAK;IACb,uBAAuB;IACvB;GACF,CAAC;EACH,CAAC;EAED,OAAO;CACT;CAEA,UAAU,UAAyB,QAAmC;EACpE,MAAM,QAAQ,KAAKG,WAAW,QAAQ,QAAQ;EAC9C,IAAI,UAAU,IAAI;GAChB,KAAKC,UAAU,KAAKA,QAAQ,MAAM;GAClC,KAAKA,QAAQ,SAAS;GACtB,KAAKI,QAAQ;EACf;CACF;CAEA,UAAgB;EACd,IAAI,KAAK,aAAa,GAAG;GACvB,MAAM,oBAAoB,KAAKO,mBAAmB;GAClD,MAAM,iBAAiB,KAAKD;GAC5B,MAAM,YAAY,oBACd,iBACA,KAAKL,eACH,KAAKC,aAAa,KAAKN,SAAS,KAAKG,gBAAgB,GACrD,KAAKN,UAAU,OACjB;GAEJ,IAAI,qBAAqB,mBAAmB,WAC1C,cAAc,YAAY;IACxB,KAAK,UAAU,SAAS,aAAa;KACnC,SAAS,KAAKG,OAAO;IACvB,CAAC;GACH,CAAC;EAEL;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"queriesObserver.js","names":[],"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep, shallowEqualObjects } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n const excludeSet = new Set(array2)\n return array1.filter((x) => !excludeSet.has(x))\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\ntype CombineFn<TCombinedResult> = (\n result: Array<QueryObserverResult>,\n) => TCombinedResult\n\nexport interface QueriesObserverOptions<\n TCombinedResult = Array<QueryObserverResult>,\n> {\n /**\n * A function that combines the array of `QueryObserverResult`s (one per\n * observed query) into a single value. The combined value is memoized and\n * only recomputed when one of the underlying results, the query hashes, or\n * the `combine` function itself changes.\n *\n * Defaults to returning the array of `QueryObserverResult`s unchanged.\n */\n combine?: CombineFn<TCombinedResult>\n}\n\n/**\n * A `QueriesObserver` watches an array of queries at once, exposing them as\n * a single array of `QueryObserverResult`s (or, when a `combine` option is\n * given, as a combined value derived from that array). It manages one\n * internal `QueryObserver` per query, and is the primitive that framework\n * adapters (e.g. `useQueries`) build their hooks on top of.\n *\n * @example\n * ```ts\n * const observer = new QueriesObserver(queryClient, [\n * { queryKey: ['post', 1], queryFn: fetchPost },\n * { queryKey: ['post', 2], queryFn: fetchPost },\n * ])\n *\n * const unsubscribe = observer.subscribe((result) => {\n * console.log(result)\n * })\n * ```\n */\nexport class QueriesObserver<\n TCombinedResult = Array<QueryObserverResult>,\n> extends Subscribable<QueriesObserverListener> {\n #client: QueryClient\n #result!: Array<QueryObserverResult>\n #queries: Array<QueryObserverOptions>\n #options?: QueriesObserverOptions<TCombinedResult>\n #observers: Array<QueryObserver>\n #combinedResult!: TCombinedResult\n #lastCombine?: CombineFn<TCombinedResult>\n #lastResult?: Array<QueryObserverResult>\n #lastQueryHashes?: Array<string>\n #observerMatches: Array<QueryObserverMatch> = []\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions<any, any, any, any, any>>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#options = options\n this.#queries = []\n this.#observers = []\n this.#result = []\n\n this.setQueries(queries)\n }\n\n protected onSubscribe(): void {\n if (this.listeners.size === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n }\n\n protected onUnsubscribe(): void {\n if (!this.listeners.size) {\n this.destroy()\n }\n }\n\n /**\n * Stops observing all queries: clears all listeners and destroys every\n * underlying `QueryObserver` this observer manages.\n */\n destroy(): void {\n this.listeners = new Set()\n this.#observers.forEach((observer) => {\n observer.destroy()\n })\n }\n\n /**\n * Replaces the set of queries being observed. Existing `QueryObserver`s\n * are reused for queries that match an already-observed query hash;\n * observers for queries that are no longer present are destroyed, and new\n * observers are created and subscribed to for newly added queries.\n *\n * @example\n * ```ts\n * observer.setQueries([\n * { queryKey: ['post', 1], queryFn: fetchPost },\n * { queryKey: ['post', 3], queryFn: fetchPost },\n * ])\n * ```\n */\n setQueries(\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ): void {\n this.#queries = queries\n this.#options = options\n\n if (process.env.NODE_ENV !== 'production') {\n const queryHashes = queries.map(\n (query) => this.#client.defaultQueryOptions(query).queryHash,\n )\n if (new Set(queryHashes).size !== queryHashes.length) {\n console.warn(\n '[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.',\n )\n }\n }\n\n notifyManager.batch(() => {\n const prevObservers = this.#observers\n\n const newObserverMatches = this.#findMatchingObservers(this.#queries)\n\n // set options for the new observers to notify of changes\n newObserverMatches.forEach((match) =>\n match.observer.setOptions(match.defaultedQueryOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasLengthChange = prevObservers.length !== newObservers.length\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n const hasStructuralChange = hasLengthChange || hasIndexChange\n\n const hasResultChange = hasStructuralChange\n ? true\n : newResult.some((result, index) => {\n const prev = this.#result[index]\n return !prev || !shallowEqualObjects(result, prev)\n })\n\n if (!hasStructuralChange && !hasResultChange) return\n\n if (hasStructuralChange) {\n this.#observerMatches = newObserverMatches\n this.#observers = newObservers\n }\n\n this.#result = newResult\n\n if (!this.hasListeners()) return\n\n if (hasStructuralChange) {\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result)\n })\n })\n }\n\n this.#notify()\n })\n }\n\n /**\n * Returns the most recently computed array of `QueryObserverResult`s, one\n * per observed query, in the same order as the queries passed to the\n * constructor or `setQueries`.\n *\n * @example\n * ```ts\n * const results = observer.getCurrentResult()\n * const data = results.map((result) => result.data)\n * ```\n */\n getCurrentResult(): Array<QueryObserverResult> {\n return this.#result\n }\n\n /**\n * Returns the underlying `Query` instances currently being observed, in\n * the same order as the queries passed to the constructor or `setQueries`.\n */\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery())\n }\n\n /**\n * Returns the underlying `QueryObserver` instances this observer manages,\n * in the same order as the queries passed to the constructor or\n * `setQueries`.\n */\n getObservers() {\n return this.#observers\n }\n\n /**\n * The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes\n * the result for the given (already-defaulted) queries right now, synchronously. Called by\n * framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw\n * per-query results, a function to compute the combined result from them, and a function to\n * wrap the results for property-access tracking.\n */\n getOptimisticResult(\n queries: Array<QueryObserverOptions>,\n combine: CombineFn<TCombinedResult> | undefined,\n ): [\n rawResult: Array<QueryObserverResult>,\n combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,\n trackResult: () => Array<QueryObserverResult>,\n ] {\n const matches = this.#findMatchingObservers(queries)\n const result = matches.map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n const queryHashes = matches.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result, combine, queryHashes)\n },\n () => {\n return this.#trackResult(result, matches)\n },\n ]\n }\n\n #trackResult(\n result: Array<QueryObserverResult>,\n matches: Array<QueryObserverMatch>,\n ) {\n const trackedProps = new Set<keyof QueryObserverResult>()\n\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult, (accessedProp) => {\n // track property on all observers to ensure proper (synchronized) tracking (#7000)\n if (!trackedProps.has(accessedProp)) {\n trackedProps.add(accessedProp)\n matches.forEach((m) => {\n m.observer.trackProp(accessedProp)\n })\n }\n })\n : observerResult\n })\n }\n\n #combineResult(\n input: Array<QueryObserverResult>,\n combine: CombineFn<TCombinedResult> | undefined,\n queryHashes?: Array<string>,\n ): TCombinedResult {\n if (combine) {\n const lastHashes = this.#lastQueryHashes\n const queryHashesChanged =\n queryHashes !== undefined &&\n lastHashes !== undefined &&\n (lastHashes.length !== queryHashes.length ||\n queryHashes.some((hash, i) => hash !== lastHashes[i]))\n\n if (\n this.#result !== this.#lastResult ||\n queryHashesChanged ||\n combine !== this.#lastCombine\n ) {\n this.#lastCombine = combine\n this.#lastResult = this.#result\n\n if (queryHashes !== undefined) {\n this.#lastQueryHashes = queryHashes\n }\n this.#combinedResult = replaceEqualDeep(\n this.#combinedResult,\n combine(input),\n )\n }\n\n return this.#combinedResult\n }\n return input as any\n }\n\n #shouldSkipCombine(): boolean {\n return (\n !this.#options?.combine ||\n this.#observers.some((observer, index) => {\n return (\n observer.options.suspense && this.#result[index]?.data === undefined\n )\n })\n )\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<QueryObserverMatch> {\n const prevObserversMap = new Map<string, Array<QueryObserver>>()\n\n this.#observers.forEach((observer) => {\n const key = observer.options.queryHash\n if (!key) return\n\n const previousObservers = prevObserversMap.get(key)\n\n if (previousObservers) {\n previousObservers.push(observer)\n } else {\n prevObserversMap.set(key, [observer])\n }\n })\n\n const observers: Array<QueryObserverMatch> = []\n\n queries.forEach((options) => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift()\n const observer =\n match ?? new QueryObserver(this.#client, defaultedOptions)\n\n observers.push({\n defaultedQueryOptions: defaultedOptions,\n observer,\n })\n })\n\n return observers\n }\n\n #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#result = this.#result.slice()\n this.#result[index] = result\n this.#notify()\n }\n }\n\n #notify(): void {\n if (this.hasListeners()) {\n const shouldSkipCombine = this.#shouldSkipCombine()\n const previousResult = this.#combinedResult\n const newResult = shouldSkipCombine\n ? previousResult\n : this.#combineResult(\n this.#trackResult(this.#result, this.#observerMatches),\n this.#options?.combine,\n )\n\n if (shouldSkipCombine || previousResult !== newResult) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result)\n })\n })\n }\n }\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.cjs","names":["Removable","#abortSignalConsumed","#defaultOptions","#client","#cache","#initialState","#queryType","#retryer","replaceData","#dispatch","noop","resolveQueryValue","skipToken","timeUntilStale","ensureQueryFn","infiniteQueryBehavior","#revertState","createRetryer","CancelledError","canFetch"],"sources":["../../src/query.ts"],"sourcesContent":["import {\n ensureQueryFn,\n noop,\n replaceData,\n resolveQueryValue,\n skipToken,\n timeUntilStale,\n} from './utils'\nimport { notifyManager } from './notifyManager'\nimport { CancelledError, canFetch, createRetryer } from './retryer'\nimport { Removable } from './removable'\nimport { infiniteQueryBehavior } from './infiniteQueryBehavior'\nimport type { QueryCache } from './queryCache'\nimport type { QueryClient } from './queryClient'\nimport type {\n CancelOptions,\n DefaultError,\n FetchStatus,\n InitialDataFunction,\n OmitKeyof,\n QueryFunctionContext,\n QueryKey,\n QueryMeta,\n QueryOptions,\n QueryStatus,\n SetDataOptions,\n StaleTime,\n} from './types'\nimport type { QueryObserver } from './queryObserver'\nimport type { Retryer } from './retryer'\n\n// TYPES\n\ninterface QueryConfig<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n client: QueryClient\n queryKey: TQueryKey\n queryHash: string\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n state?: QueryState<TData, TError>\n}\n\n/**\n * The raw state stored on a `Query` instance. This is the underlying state\n * that observer results (e.g. `QueryObserverResult`) are derived from.\n */\nexport interface QueryState<TData = unknown, TError = DefaultError> {\n /**\n * The last successfully resolved data for the query.\n */\n data: TData | undefined\n /**\n * The number of times the query has successfully resolved.\n */\n dataUpdateCount: number\n /**\n * The timestamp for when the query most recently returned the `status` as `\"success\"`.\n */\n dataUpdatedAt: number\n /**\n * The error object for the query, if the last attempt resulted in an error.\n * - Defaults to `null`.\n */\n error: TError | null\n /**\n * The sum of all errors, incremented every time the query resolves with an error.\n */\n errorUpdateCount: number\n /**\n * The timestamp for when the query most recently returned the `status` as `\"error\"`.\n */\n errorUpdatedAt: number\n /**\n * The failure count for the current fetch.\n * - Incremented every time the fetch fails.\n * - Reset to `0` when the fetch succeeds.\n */\n fetchFailureCount: number\n /**\n * The reason the current fetch failed, as reported by the retryer.\n * - Reset to `null` when the fetch succeeds.\n */\n fetchFailureReason: TError | null\n /**\n * Metadata passed to the currently in-flight (or most recent) fetch, e.g. the\n * `fetchMore` direction for infinite queries.\n */\n fetchMeta: FetchMeta | null\n /**\n * Whether the query has been marked as invalidated via `invalidate()`.\n * - Reset to `false` whenever the query resolves successfully.\n */\n isInvalidated: boolean\n /**\n * The status of the query.\n * - `pending` if there's no cached data and no attempt was finished yet.\n * - `error` if the last attempt resulted in an error.\n * - `success` if the query has data.\n */\n status: QueryStatus\n /**\n * The fetch status of the query.\n * - `fetching`: the `queryFn` is currently executing.\n * - `paused`: a fetch wanted to run but has been paused (see network mode).\n * - `idle`: the query is not fetching.\n */\n fetchStatus: FetchStatus\n}\n\nexport interface FetchContext<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n fetchFn: () => unknown | Promise<unknown>\n fetchOptions?: FetchOptions\n signal: AbortSignal\n options: QueryOptions<TQueryFnData, TError, TData, any>\n client: QueryClient\n queryKey: TQueryKey\n state: QueryState<TData, TError>\n}\n\nexport interface QueryBehavior<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n onFetch: (\n context: FetchContext<TQueryFnData, TError, TData, TQueryKey>,\n query: Query,\n ) => void\n}\n\nexport type FetchDirection = 'forward' | 'backward'\n\nexport interface FetchMeta {\n fetchMore?: { direction: FetchDirection }\n}\n\nexport interface FetchOptions<TData = unknown> {\n cancelRefetch?: boolean\n meta?: FetchMeta\n initialPromise?: Promise<TData>\n}\n\ninterface FailedAction<TError> {\n type: 'failed'\n failureCount: number\n error: TError\n}\n\ninterface FetchAction {\n type: 'fetch'\n meta?: FetchMeta\n}\n\ninterface SuccessAction<TData> {\n data: TData | undefined\n type: 'success'\n dataUpdatedAt?: number\n manual?: boolean\n}\n\ninterface ErrorAction<TError> {\n type: 'error'\n error: TError\n}\n\ninterface InvalidateAction {\n type: 'invalidate'\n}\n\ninterface PauseAction {\n type: 'pause'\n}\n\ninterface ContinueAction {\n type: 'continue'\n}\n\ninterface SetStateAction<TData, TError> {\n type: 'setState'\n state: Partial<QueryState<TData, TError>>\n}\n\nexport type Action<TData, TError> =\n | ContinueAction\n | ErrorAction<TError>\n | FailedAction<TError>\n | FetchAction\n | InvalidateAction\n | PauseAction\n | SetStateAction<TData, TError>\n | SuccessAction<TData>\n\n// CLASS\n\n/**\n * Represents a single cached query. A `Query` holds the query's key, options,\n * state (data/error/status), and the observers currently subscribed to it.\n *\n * Instances are created and managed internally by `QueryCache`; application\n * code typically interacts with queries indirectly through `QueryClient` or\n * a framework hook like `useQuery`. Direct access to a `Query` instance is\n * possible via `queryCache.find()`/`findAll()` for inspecting cache state.\n *\n * @example\n * ```ts\n * const queryCache = queryClient.getQueryCache()\n * const query = queryCache.find({ queryKey: ['posts'] })\n *\n * if (query) {\n * console.log(query.state.dataUpdatedAt)\n * }\n * ```\n */\nexport class Query<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> extends Removable {\n queryKey: TQueryKey\n queryHash: string\n options!: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n state: QueryState<TData, TError>\n #queryType?: 'infinite'\n\n #initialState: QueryState<TData, TError>\n #revertState?: QueryState<TData, TError>\n #cache: QueryCache\n #client: QueryClient\n #retryer?: Retryer<TData>\n observers: Array<QueryObserver<any, any, any, any, any>>\n #defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n #abortSignalConsumed: boolean\n\n constructor(config: QueryConfig<TQueryFnData, TError, TData, TQueryKey>) {\n super()\n\n this.#abortSignalConsumed = false\n this.#defaultOptions = config.defaultOptions\n this.setOptions(config.options)\n this.observers = []\n this.#client = config.client\n this.#cache = this.#client.getQueryCache()\n this.queryKey = config.queryKey\n this.queryHash = config.queryHash\n this.#initialState = getDefaultState(this.options)\n this.state = config.state ?? this.#initialState\n this.scheduleGc()\n }\n /**\n * The `meta` object passed in the query's options, if any.\n */\n get meta(): QueryMeta | undefined {\n return this.options.meta\n }\n\n /** @internal */\n get queryType() {\n return this.#queryType\n }\n\n /**\n * The promise for the currently in-flight fetch, if the query is fetching.\n * `undefined` when the query is not fetching.\n */\n get promise(): Promise<TData> | undefined {\n return this.#retryer?.promise\n }\n\n /** @internal */\n setOptions(\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n ): void {\n this.options = { ...this.#defaultOptions, ...options }\n\n if (options?._type) {\n this.#queryType = options._type\n }\n\n this.updateGcTime(this.options.gcTime)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state && this.state.data === undefined) {\n const defaultState = getDefaultState(this.options)\n if (defaultState.data !== undefined) {\n this.setState(\n successState(defaultState.data, defaultState.dataUpdatedAt),\n )\n this.#initialState = defaultState\n }\n }\n }\n\n protected optionalRemove() {\n if (!this.observers.length && this.state.fetchStatus === 'idle') {\n this.#cache.remove(this)\n }\n }\n\n /** @internal */\n setData(\n newData: TData,\n options?: SetDataOptions & { manual: boolean },\n ): TData {\n const data = replaceData(this.state.data, newData, this.options)\n\n // Set data and mark it as cached\n this.#dispatch({\n data,\n type: 'success',\n dataUpdatedAt: options?.updatedAt,\n manual: options?.manual,\n })\n\n return data\n }\n\n /**\n * Merges the given partial state directly into this query's state, notifying observers. Used\n * by persistence and broadcast plugins to restore a state snapshot, and by devtools to let a\n * user manually trigger a loading/error state or edit the cached data.\n */\n setState(state: Partial<QueryState<TData, TError>>): void {\n this.#dispatch({ type: 'setState', state })\n }\n\n /**\n * Cancels the query's currently in-flight fetch, if any.\n * - Returns a promise that resolves once the cancellation has settled.\n * - If no fetch is in progress, resolves immediately.\n *\n * @example\n * ```ts\n * await query.cancel()\n * ```\n */\n cancel(options?: CancelOptions): Promise<void> {\n const promise = this.#retryer?.promise\n this.#retryer?.cancel(options)\n return promise ? promise.then(noop).catch(noop) : Promise.resolve()\n }\n\n /**\n * Clears the query's garbage collection timeout and silently cancels any\n * in-flight fetch. Called by `QueryCache` when the query is removed from\n * the cache.\n *\n * @see {@link Query#cancel}\n */\n destroy(): void {\n super.destroy()\n\n this.cancel({ silent: true })\n }\n\n /** @internal */\n get resetState(): QueryState<TData, TError> {\n return this.#initialState\n }\n\n /**\n * Resets the query back to its initial state (the state it had when it was\n * first created, e.g. any `initialData`), destroying it first to cancel any\n * in-flight fetch.\n */\n reset(): void {\n this.destroy()\n this.setState(this.resetState)\n }\n\n /**\n * Returns `true` if the query has at least one observer for which `enabled`\n * does not resolve to `false`.\n */\n isActive(): boolean {\n return this.observers.some(\n (observer) => resolveQueryValue(observer.options.enabled, this) !== false,\n )\n }\n\n /**\n * Returns `true` if the query is disabled, meaning it will not fetch\n * automatically.\n * - If the query has observers, it is disabled when none of them are active\n * (see `isActive`).\n * - If the query has no observers, it is disabled when its `queryFn` is\n * `skipToken` or it has never been fetched.\n */\n isDisabled(): boolean {\n if (this.getObserversCount() > 0) {\n return !this.isActive()\n }\n // if a query has no observers, it should still be considered disabled if it never attempted a fetch\n return this.options.queryFn === skipToken || !this.isFetched()\n }\n\n /**\n * Returns `true` if the query has been fetched, i.e. it has resolved with\n * either data or an error at least once.\n */\n isFetched() {\n return this.state.dataUpdateCount + this.state.errorUpdateCount > 0\n }\n\n /**\n * Returns `true` if the query has at least one observer configured with\n * `staleTime: 'static'`, meaning it is treated as never stale.\n */\n isStatic(): boolean {\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) =>\n resolveQueryValue(observer.options.staleTime, this) === 'static',\n )\n }\n\n return false\n }\n\n /**\n * Returns `true` if the query is stale.\n * - If the query has observers, defers to whether any observer's current\n * result reports `isStale` (which accounts for each observer's own\n * `staleTime` and `enabled` state).\n * - If the query has no observers, it is considered stale when it has no\n * data or has been invalidated.\n *\n * @see {@link Query#isStaleByTime}\n * @example\n * ```ts\n * if (query.isStale()) {\n * // refetch or otherwise treat the cached data as outdated\n * }\n * ```\n */\n isStale(): boolean {\n // check observers first, their `isStale` has the source of truth\n // calculated with `isStaleByTime` and it takes `enabled` into account\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) => observer.getCurrentResult().isStale,\n )\n }\n\n return this.state.data === undefined || this.state.isInvalidated\n }\n\n /**\n * Returns `true` if the query's data is stale relative to the given\n * `staleTime` (defaults to `0`).\n * - A query with no data is always stale.\n * - `staleTime: 'static'` is never stale.\n * - An invalidated query is always stale.\n * - Otherwise, staleness is based on elapsed time since `dataUpdatedAt`.\n *\n * @see {@link Query#isStale}\n * @example\n * ```ts\n * const isStale = query.isStaleByTime(1000 * 60)\n * ```\n */\n isStaleByTime(staleTime: StaleTime = 0): boolean {\n // no data is always stale\n if (this.state.data === undefined) {\n return true\n }\n // static is never stale\n if (staleTime === 'static') {\n return false\n }\n // if the query is invalidated, it is stale\n if (this.state.isInvalidated) {\n return true\n }\n\n return !timeUntilStale(this.state.dataUpdatedAt, staleTime)\n }\n\n /** @internal */\n onFocus(): void {\n const observer = this.observers.find((x) => x.shouldFetchOnWindowFocus())\n\n observer?.refetch({ cancelRefetch: false })\n\n // Continue fetch if currently paused\n this.#retryer?.continue()\n }\n\n /** @internal */\n onOnline(): void {\n const observer = this.observers.find((x) => x.shouldFetchOnReconnect())\n\n observer?.refetch({ cancelRefetch: false })\n\n // Continue fetch if currently paused\n this.#retryer?.continue()\n }\n\n /** @internal */\n addObserver(observer: QueryObserver<any, any, any, any, any>): void {\n if (!this.observers.includes(observer)) {\n this.observers.push(observer)\n\n // Stop the query from being garbage collected\n this.clearGcTimeout()\n\n this.#cache.notify({ type: 'observerAdded', query: this, observer })\n }\n }\n\n /** @internal */\n removeObserver(observer: QueryObserver<any, any, any, any, any>): void {\n const index = this.observers.indexOf(observer)\n if (index !== -1) {\n this.observers.splice(index, 1)\n\n if (!this.observers.length) {\n // If the transport layer does not support cancellation\n // we'll let the query continue so the result can be cached\n if (this.#retryer) {\n if (\n this.#abortSignalConsumed ||\n (this.state.fetchStatus === 'paused' &&\n this.state.status === 'pending')\n ) {\n this.#retryer.cancel({ revert: true })\n } else {\n this.#retryer.cancelRetry()\n }\n }\n\n this.scheduleGc()\n }\n\n this.#cache.notify({ type: 'observerRemoved', query: this, observer })\n }\n }\n\n /**\n * Returns the number of observers currently subscribed to this query.\n *\n * @example\n * ```ts\n * if (query.getObserversCount() === 0) {\n * // no component is currently watching this query\n * }\n * ```\n */\n getObserversCount(): number {\n return this.observers.length\n }\n\n /**\n * Marks the query as invalidated, unless it is already invalidated. This\n * updates `state.isInvalidated` and notifies observers, but does not by\n * itself trigger a refetch.\n *\n * @example\n * ```ts\n * query.invalidate()\n * ```\n */\n invalidate(): void {\n if (!this.state.isInvalidated) {\n this.#dispatch({ type: 'invalidate' })\n }\n }\n\n /**\n * Fetches the query, i.e. runs its `queryFn` (through any configured\n * retryer/behavior) and updates the query's state with the result.\n * - If a fetch is already in flight, returns its promise instead of\n * starting a new one, unless `fetchOptions.cancelRefetch` is set and the\n * query already has data, in which case the current fetch is silently\n * cancelled first.\n * - If `options` is passed, it replaces the query's current options\n * before fetching.\n */\n async fetch(\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n fetchOptions?: FetchOptions<TQueryFnData>,\n ): Promise<TData> {\n if (\n this.state.fetchStatus !== 'idle' &&\n // If the promise in the retryer is already rejected, we have to definitely\n // re-start the fetch; there is a chance that the query is still in a\n // pending state when that happens\n this.#retryer?.status() !== 'rejected'\n ) {\n if (this.state.data !== undefined && fetchOptions?.cancelRefetch) {\n // Silently cancel current fetch if the user wants to cancel refetch\n this.cancel({ silent: true })\n } else if (this.#retryer) {\n // make sure that retries that were potentially cancelled due to unmounts can continue\n this.#retryer.continueRetry()\n // Return current promise if we are already fetching\n return this.#retryer.promise\n }\n }\n\n // Update config if passed, otherwise the config from the last execution is used\n if (options) {\n this.setOptions(options)\n }\n\n // Use the options from the first observer with a query function if no function is found.\n // This can happen when the query is hydrated or created with setQueryData.\n if (!this.options.queryFn) {\n const observer = this.observers.find((x) => x.options.queryFn)\n if (observer) {\n this.setOptions(observer.options)\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!Array.isArray(this.options.queryKey)) {\n console.error(\n `As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`,\n )\n }\n }\n\n const abortController = new AbortController()\n\n // Adds an enumerable signal property to the object that\n // which sets abortSignalConsumed to true when the signal\n // is read.\n const addSignalProperty = (object: unknown) => {\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n this.#abortSignalConsumed = true\n return abortController.signal\n },\n })\n }\n\n // Create fetch function\n const fetchFn = () => {\n const queryFn = ensureQueryFn(this.options, fetchOptions)\n\n // Create query function context\n const createQueryFnContext = (): QueryFunctionContext<TQueryKey> => {\n const queryFnContext: OmitKeyof<\n QueryFunctionContext<TQueryKey>,\n 'signal'\n > = {\n client: this.#client,\n queryKey: this.queryKey,\n meta: this.meta,\n }\n addSignalProperty(queryFnContext)\n return queryFnContext as QueryFunctionContext<TQueryKey>\n }\n\n const queryFnContext = createQueryFnContext()\n\n this.#abortSignalConsumed = false\n if (this.options.persister) {\n return this.options.persister(\n queryFn,\n queryFnContext,\n this as unknown as Query,\n )\n }\n\n return queryFn(queryFnContext)\n }\n\n // Trigger behavior hook\n const createFetchContext = (): FetchContext<\n TQueryFnData,\n TError,\n TData,\n TQueryKey\n > => {\n const context: OmitKeyof<\n FetchContext<TQueryFnData, TError, TData, TQueryKey>,\n 'signal'\n > = {\n fetchOptions,\n options: this.options,\n queryKey: this.queryKey,\n client: this.#client,\n state: this.state,\n fetchFn,\n }\n\n addSignalProperty(context)\n return context as FetchContext<TQueryFnData, TError, TData, TQueryKey>\n }\n\n const context = createFetchContext()\n\n const behavior =\n this.#queryType === 'infinite'\n ? (infiniteQueryBehavior(\n (this.options as { pages?: number }).pages,\n ) as QueryBehavior<TQueryFnData, TError, TData, TQueryKey>)\n : this.options.behavior\n behavior?.onFetch(context, this as unknown as Query)\n\n // Store state in case the current fetch needs to be reverted\n this.#revertState = this.state\n\n // Set to fetching state if not already in it\n if (\n this.state.fetchStatus === 'idle' ||\n this.state.fetchMeta !== context.fetchOptions?.meta\n ) {\n this.#dispatch({ type: 'fetch', meta: context.fetchOptions?.meta })\n }\n\n // Try to fetch the data\n const retryer = (this.#retryer = createRetryer({\n initialPromise: fetchOptions?.initialPromise as\n | Promise<TData>\n | undefined,\n fn: context.fetchFn as () => Promise<TData>,\n onCancel: (error) => {\n if (error instanceof CancelledError && error.revert) {\n this.setState({\n ...this.#revertState,\n fetchStatus: 'idle' as const,\n })\n }\n abortController.abort()\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: 'failed', failureCount, error })\n },\n onPause: () => {\n this.#dispatch({ type: 'pause' })\n },\n onContinue: () => {\n this.#dispatch({ type: 'continue' })\n },\n retry: context.options.retry,\n retryDelay: context.options.retryDelay,\n networkMode: context.options.networkMode,\n canRun: () => true,\n }))\n\n try {\n const data = await retryer.start()\n // this is more of a runtime guard\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (data === undefined) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`,\n )\n }\n throw new Error(`${this.queryHash} data is undefined`)\n }\n\n this.setData(data)\n\n // Notify cache callback\n this.#cache.config.onSuccess?.(data, this as Query<any, any, any, any>)\n this.#cache.config.onSettled?.(\n data,\n this.state.error as any,\n this as Query<any, any, any, any>,\n )\n return data\n } catch (error) {\n if (error instanceof CancelledError) {\n if (error.silent) {\n // silent cancellation implies a new fetch is going to be started,\n // so we piggyback onto that promise\n return this.#retryer.promise\n } else if (error.revert) {\n // transform error into reverted state data\n // if the initial fetch was cancelled, we have no data, so we have\n // to get reject with a CancelledError\n if (this.state.data === undefined) {\n throw error\n }\n return this.state.data\n }\n }\n this.#dispatch({\n type: 'error',\n error: error as TError,\n })\n\n // Notify cache callback\n this.#cache.config.onError?.(\n error as any,\n this as Query<any, any, any, any>,\n )\n this.#cache.config.onSettled?.(\n this.state.data,\n error as any,\n this as Query<any, any, any, any>,\n )\n\n throw error // rethrow the error for further handling\n } finally {\n // The settled retryer's promise would otherwise pin this fetch's raw\n // result (a second copy after structural sharing) for the query's lifetime\n if (this.#retryer === retryer) {\n this.#retryer = undefined\n }\n // Schedule query gc after fetching\n this.scheduleGc()\n }\n }\n\n #dispatch(action: Action<TData, TError>): void {\n const reducer = (\n state: QueryState<TData, TError>,\n ): QueryState<TData, TError> => {\n switch (action.type) {\n case 'failed':\n return {\n ...state,\n fetchFailureCount: action.failureCount,\n fetchFailureReason: action.error,\n }\n case 'pause':\n return {\n ...state,\n fetchStatus: 'paused',\n }\n case 'continue':\n return {\n ...state,\n fetchStatus: 'fetching',\n }\n case 'fetch':\n return {\n ...state,\n ...fetchState(state.data, this.options),\n fetchMeta: action.meta ?? null,\n }\n case 'success':\n const newState = {\n ...state,\n ...successState(action.data, action.dataUpdatedAt),\n dataUpdateCount: state.dataUpdateCount + 1,\n ...(!action.manual && {\n fetchStatus: 'idle' as const,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n }),\n }\n // If fetching ends successfully, we don't need revertState as a fallback anymore.\n // For manual updates, capture the state to revert to it in case of a cancellation.\n this.#revertState = action.manual ? newState : undefined\n\n return newState\n case 'error':\n const error = action.error\n return {\n ...state,\n error,\n errorUpdateCount: state.errorUpdateCount + 1,\n errorUpdatedAt: Date.now(),\n fetchFailureCount: state.fetchFailureCount + 1,\n fetchFailureReason: error,\n fetchStatus: 'idle',\n status: 'error',\n // flag existing data as invalidated if we get a background error\n // note that \"no data\" always means stale so we can set unconditionally here\n isInvalidated: true,\n }\n case 'invalidate':\n return {\n ...state,\n isInvalidated: true,\n }\n case 'setState':\n return {\n ...state,\n ...action.state,\n }\n }\n }\n\n this.state = reducer(this.state)\n\n notifyManager.batch(() => {\n // Keep the current iteration stable if an observer unsubscribes\n // synchronously while it is being notified.\n this.observers.slice().forEach((observer) => {\n observer.onQueryUpdate()\n })\n\n this.#cache.notify({ query: this, type: 'updated', action })\n })\n }\n}\n\nexport function fetchState<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey,\n>(\n data: TData | undefined,\n options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n) {\n return {\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchStatus: canFetch(options.networkMode) ? 'fetching' : 'paused',\n ...(data === undefined &&\n ({\n error: null,\n status: 'pending',\n } as const)),\n } as const\n}\n\nfunction successState<TData>(data: TData | undefined, dataUpdatedAt?: number) {\n return {\n data,\n dataUpdatedAt: dataUpdatedAt ?? Date.now(),\n error: null,\n isInvalidated: false,\n status: 'success' as const,\n }\n}\n\nfunction getDefaultState<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey,\n>(\n options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryState<TData, TError> {\n const data =\n typeof options.initialData === 'function'\n ? (options.initialData as InitialDataFunction<TData>)()\n : options.initialData\n\n const hasData = data !== undefined\n\n const initialDataUpdatedAt = hasData\n ? typeof options.initialDataUpdatedAt === 'function'\n ? options.initialDataUpdatedAt()\n : options.initialDataUpdatedAt\n : 0\n\n return {\n data,\n dataUpdateCount: 0,\n dataUpdatedAt: hasData ? (initialDataUpdatedAt ?? Date.now()) : 0,\n error: null,\n errorUpdateCount: 0,\n errorUpdatedAt: 0,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchMeta: null,\n isInvalidated: false,\n status: hasData ? 'success' : 'pending',\n fetchStatus: 'idle',\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query.cjs","names":["Removable","replaceData","noop","resolveQueryValue","skipToken","timeUntilStale","ensureQueryFn","infiniteQueryBehavior","createRetryer","CancelledError","canFetch"],"sources":["../../src/query.ts"],"sourcesContent":["import {\n ensureQueryFn,\n noop,\n replaceData,\n resolveQueryValue,\n skipToken,\n timeUntilStale,\n} from './utils'\nimport { notifyManager } from './notifyManager'\nimport { CancelledError, canFetch, createRetryer } from './retryer'\nimport { Removable } from './removable'\nimport { infiniteQueryBehavior } from './infiniteQueryBehavior'\nimport type { QueryCache } from './queryCache'\nimport type { QueryClient } from './queryClient'\nimport type {\n CancelOptions,\n DefaultError,\n FetchStatus,\n InitialDataFunction,\n OmitKeyof,\n QueryFunctionContext,\n QueryKey,\n QueryMeta,\n QueryOptions,\n QueryStatus,\n SetDataOptions,\n StaleTime,\n} from './types'\nimport type { QueryObserver } from './queryObserver'\nimport type { Retryer } from './retryer'\n\n// TYPES\n\ninterface QueryConfig<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n client: QueryClient\n queryKey: TQueryKey\n queryHash: string\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n state?: QueryState<TData, TError>\n}\n\n/**\n * The raw state stored on a `Query` instance. This is the underlying state\n * that observer results (e.g. `QueryObserverResult`) are derived from.\n */\nexport interface QueryState<TData = unknown, TError = DefaultError> {\n /**\n * The last successfully resolved data for the query.\n */\n data: TData | undefined\n /**\n * The number of times the query has successfully resolved.\n */\n dataUpdateCount: number\n /**\n * The timestamp for when the query most recently returned the `status` as `\"success\"`.\n */\n dataUpdatedAt: number\n /**\n * The error object for the query, if the last attempt resulted in an error.\n * - Defaults to `null`.\n */\n error: TError | null\n /**\n * The sum of all errors, incremented every time the query resolves with an error.\n */\n errorUpdateCount: number\n /**\n * The timestamp for when the query most recently returned the `status` as `\"error\"`.\n */\n errorUpdatedAt: number\n /**\n * The failure count for the current fetch.\n * - Incremented every time the fetch fails.\n * - Reset to `0` when the fetch succeeds.\n */\n fetchFailureCount: number\n /**\n * The reason the current fetch failed, as reported by the retryer.\n * - Reset to `null` when the fetch succeeds.\n */\n fetchFailureReason: TError | null\n /**\n * Metadata passed to the currently in-flight (or most recent) fetch, e.g. the\n * `fetchMore` direction for infinite queries.\n */\n fetchMeta: FetchMeta | null\n /**\n * Whether the query has been marked as invalidated via `invalidate()`.\n * - Reset to `false` whenever the query resolves successfully.\n */\n isInvalidated: boolean\n /**\n * The status of the query.\n * - `pending` if there's no cached data and no attempt was finished yet.\n * - `error` if the last attempt resulted in an error.\n * - `success` if the query has data.\n */\n status: QueryStatus\n /**\n * The fetch status of the query.\n * - `fetching`: the `queryFn` is currently executing.\n * - `paused`: a fetch wanted to run but has been paused (see network mode).\n * - `idle`: the query is not fetching.\n */\n fetchStatus: FetchStatus\n}\n\nexport interface FetchContext<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n fetchFn: () => unknown | Promise<unknown>\n fetchOptions?: FetchOptions\n signal: AbortSignal\n options: QueryOptions<TQueryFnData, TError, TData, any>\n client: QueryClient\n queryKey: TQueryKey\n state: QueryState<TData, TError>\n}\n\nexport interface QueryBehavior<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> {\n onFetch: (\n context: FetchContext<TQueryFnData, TError, TData, TQueryKey>,\n query: Query,\n ) => void\n}\n\nexport type FetchDirection = 'forward' | 'backward'\n\nexport interface FetchMeta {\n fetchMore?: { direction: FetchDirection }\n}\n\nexport interface FetchOptions<TData = unknown> {\n cancelRefetch?: boolean\n meta?: FetchMeta\n initialPromise?: Promise<TData>\n}\n\ninterface FailedAction<TError> {\n type: 'failed'\n failureCount: number\n error: TError\n}\n\ninterface FetchAction {\n type: 'fetch'\n meta?: FetchMeta\n}\n\ninterface SuccessAction<TData> {\n data: TData | undefined\n type: 'success'\n dataUpdatedAt?: number\n manual?: boolean\n}\n\ninterface ErrorAction<TError> {\n type: 'error'\n error: TError\n}\n\ninterface InvalidateAction {\n type: 'invalidate'\n}\n\ninterface PauseAction {\n type: 'pause'\n}\n\ninterface ContinueAction {\n type: 'continue'\n}\n\ninterface SetStateAction<TData, TError> {\n type: 'setState'\n state: Partial<QueryState<TData, TError>>\n}\n\nexport type Action<TData, TError> =\n | ContinueAction\n | ErrorAction<TError>\n | FailedAction<TError>\n | FetchAction\n | InvalidateAction\n | PauseAction\n | SetStateAction<TData, TError>\n | SuccessAction<TData>\n\n// CLASS\n\n/**\n * Represents a single cached query. A `Query` holds the query's key, options,\n * state (data/error/status), and the observers currently subscribed to it.\n *\n * Instances are created and managed internally by `QueryCache`; application\n * code typically interacts with queries indirectly through `QueryClient` or\n * a framework hook like `useQuery`. Direct access to a `Query` instance is\n * possible via `queryCache.find()`/`findAll()` for inspecting cache state.\n *\n * @example\n * ```ts\n * const queryCache = queryClient.getQueryCache()\n * const query = queryCache.find({ queryKey: ['posts'] })\n *\n * if (query) {\n * console.log(query.state.dataUpdatedAt)\n * }\n * ```\n */\nexport class Query<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> extends Removable {\n queryKey: TQueryKey\n queryHash: string\n options!: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n state: QueryState<TData, TError>\n #queryType?: 'infinite'\n\n #initialState: QueryState<TData, TError>\n #revertState?: QueryState<TData, TError>\n #cache: QueryCache\n #client: QueryClient\n #retryer?: Retryer<TData>\n observers: Array<QueryObserver<any, any, any, any, any>>\n #defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>\n #abortSignalConsumed: boolean\n\n constructor(config: QueryConfig<TQueryFnData, TError, TData, TQueryKey>) {\n super()\n\n this.#abortSignalConsumed = false\n this.#defaultOptions = config.defaultOptions\n this.setOptions(config.options)\n this.observers = []\n this.#client = config.client\n this.#cache = this.#client.getQueryCache()\n this.queryKey = config.queryKey\n this.queryHash = config.queryHash\n this.#initialState = getDefaultState(this.options)\n this.state = config.state ?? this.#initialState\n this.scheduleGc()\n }\n /**\n * The `meta` object passed in the query's options, if any.\n */\n get meta(): QueryMeta | undefined {\n return this.options.meta\n }\n\n /** @internal */\n get queryType() {\n return this.#queryType\n }\n\n /**\n * The promise for the currently in-flight fetch, if the query is fetching.\n * `undefined` when the query is not fetching.\n */\n get promise(): Promise<TData> | undefined {\n return this.#retryer?.promise\n }\n\n /** @internal */\n setOptions(\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n ): void {\n this.options = { ...this.#defaultOptions, ...options }\n\n if (options?._type) {\n this.#queryType = options._type\n }\n\n this.updateGcTime(this.options.gcTime)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state && this.state.data === undefined) {\n const defaultState = getDefaultState(this.options)\n if (defaultState.data !== undefined) {\n this.setState(\n successState(defaultState.data, defaultState.dataUpdatedAt),\n )\n this.#initialState = defaultState\n }\n }\n }\n\n protected optionalRemove() {\n if (!this.observers.length && this.state.fetchStatus === 'idle') {\n this.#cache.remove(this)\n }\n }\n\n /** @internal */\n setData(\n newData: TData,\n options?: SetDataOptions & { manual: boolean },\n ): TData {\n const data = replaceData(this.state.data, newData, this.options)\n\n // Set data and mark it as cached\n this.#dispatch({\n data,\n type: 'success',\n dataUpdatedAt: options?.updatedAt,\n manual: options?.manual,\n })\n\n return data\n }\n\n /**\n * Merges the given partial state directly into this query's state, notifying observers. Used\n * by persistence and broadcast plugins to restore a state snapshot, and by devtools to let a\n * user manually trigger a loading/error state or edit the cached data.\n */\n setState(state: Partial<QueryState<TData, TError>>): void {\n this.#dispatch({ type: 'setState', state })\n }\n\n /**\n * Cancels the query's currently in-flight fetch, if any.\n * - Returns a promise that resolves once the cancellation has settled.\n * - If no fetch is in progress, resolves immediately.\n *\n * @example\n * ```ts\n * await query.cancel()\n * ```\n */\n cancel(options?: CancelOptions): Promise<void> {\n const promise = this.#retryer?.promise\n this.#retryer?.cancel(options)\n return promise ? promise.then(noop).catch(noop) : Promise.resolve()\n }\n\n /**\n * Clears the query's garbage collection timeout and silently cancels any\n * in-flight fetch. Called by `QueryCache` when the query is removed from\n * the cache.\n *\n * @see {@link Query#cancel}\n */\n destroy(): void {\n super.destroy()\n\n this.cancel({ silent: true })\n }\n\n /** @internal */\n get resetState(): QueryState<TData, TError> {\n return this.#initialState\n }\n\n /**\n * Resets the query back to its initial state (the state it had when it was\n * first created, e.g. any `initialData`), destroying it first to cancel any\n * in-flight fetch.\n */\n reset(): void {\n this.destroy()\n this.setState(this.resetState)\n }\n\n /**\n * Returns `true` if the query has at least one observer for which `enabled`\n * does not resolve to `false`.\n */\n isActive(): boolean {\n return this.observers.some(\n (observer) => resolveQueryValue(observer.options.enabled, this) !== false,\n )\n }\n\n /**\n * Returns `true` if the query is disabled, meaning it will not fetch\n * automatically.\n * - If the query has observers, it is disabled when none of them are active\n * (see `isActive`).\n * - If the query has no observers, it is disabled when its `queryFn` is\n * `skipToken` or it has never been fetched.\n */\n isDisabled(): boolean {\n if (this.getObserversCount() > 0) {\n return !this.isActive()\n }\n // if a query has no observers, it should still be considered disabled if it never attempted a fetch\n return this.options.queryFn === skipToken || !this.isFetched()\n }\n\n /**\n * Returns `true` if the query has been fetched, i.e. it has resolved with\n * either data or an error at least once.\n */\n isFetched() {\n return this.state.dataUpdateCount + this.state.errorUpdateCount > 0\n }\n\n /**\n * Returns `true` if the query has at least one observer configured with\n * `staleTime: 'static'`, meaning it is treated as never stale.\n */\n isStatic(): boolean {\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) =>\n resolveQueryValue(observer.options.staleTime, this) === 'static',\n )\n }\n\n return false\n }\n\n /**\n * Returns `true` if the query is stale.\n * - If the query has observers, defers to whether any observer's current\n * result reports `isStale` (which accounts for each observer's own\n * `staleTime` and `enabled` state).\n * - If the query has no observers, it is considered stale when it has no\n * data or has been invalidated.\n *\n * @see {@link Query#isStaleByTime}\n * @example\n * ```ts\n * if (query.isStale()) {\n * // refetch or otherwise treat the cached data as outdated\n * }\n * ```\n */\n isStale(): boolean {\n // check observers first, their `isStale` has the source of truth\n // calculated with `isStaleByTime` and it takes `enabled` into account\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) => observer.getCurrentResult().isStale,\n )\n }\n\n return this.state.data === undefined || this.state.isInvalidated\n }\n\n /**\n * Returns `true` if the query's data is stale relative to the given\n * `staleTime` (defaults to `0`).\n * - A query with no data is always stale.\n * - `staleTime: 'static'` is never stale.\n * - An invalidated query is always stale.\n * - Otherwise, staleness is based on elapsed time since `dataUpdatedAt`.\n *\n * @see {@link Query#isStale}\n * @example\n * ```ts\n * const isStale = query.isStaleByTime(1000 * 60)\n * ```\n */\n isStaleByTime(staleTime: StaleTime = 0): boolean {\n // no data is always stale\n if (this.state.data === undefined) {\n return true\n }\n // static is never stale\n if (staleTime === 'static') {\n return false\n }\n // if the query is invalidated, it is stale\n if (this.state.isInvalidated) {\n return true\n }\n\n return !timeUntilStale(this.state.dataUpdatedAt, staleTime)\n }\n\n /** @internal */\n onFocus(): void {\n const observer = this.observers.find((x) => x.shouldFetchOnWindowFocus())\n\n observer?.refetch({ cancelRefetch: false })\n\n // Continue fetch if currently paused\n this.#retryer?.continue()\n }\n\n /** @internal */\n onOnline(): void {\n const observer = this.observers.find((x) => x.shouldFetchOnReconnect())\n\n observer?.refetch({ cancelRefetch: false })\n\n // Continue fetch if currently paused\n this.#retryer?.continue()\n }\n\n /** @internal */\n addObserver(observer: QueryObserver<any, any, any, any, any>): void {\n if (!this.observers.includes(observer)) {\n this.observers.push(observer)\n\n // Stop the query from being garbage collected\n this.clearGcTimeout()\n\n this.#cache.notify({ type: 'observerAdded', query: this, observer })\n }\n }\n\n /** @internal */\n removeObserver(observer: QueryObserver<any, any, any, any, any>): void {\n const index = this.observers.indexOf(observer)\n if (index !== -1) {\n this.observers.splice(index, 1)\n\n if (!this.observers.length) {\n // If the transport layer does not support cancellation\n // we'll let the query continue so the result can be cached\n if (this.#retryer) {\n if (\n this.#abortSignalConsumed ||\n (this.state.fetchStatus === 'paused' &&\n this.state.status === 'pending')\n ) {\n this.#retryer.cancel({ revert: true })\n } else {\n this.#retryer.cancelRetry()\n }\n }\n\n this.scheduleGc()\n }\n\n this.#cache.notify({ type: 'observerRemoved', query: this, observer })\n }\n }\n\n /**\n * Returns the number of observers currently subscribed to this query.\n *\n * @example\n * ```ts\n * if (query.getObserversCount() === 0) {\n * // no component is currently watching this query\n * }\n * ```\n */\n getObserversCount(): number {\n return this.observers.length\n }\n\n /**\n * Marks the query as invalidated, unless it is already invalidated. This\n * updates `state.isInvalidated` and notifies observers, but does not by\n * itself trigger a refetch.\n *\n * @example\n * ```ts\n * query.invalidate()\n * ```\n */\n invalidate(): void {\n if (!this.state.isInvalidated) {\n this.#dispatch({ type: 'invalidate' })\n }\n }\n\n /**\n * Fetches the query, i.e. runs its `queryFn` (through any configured\n * retryer/behavior) and updates the query's state with the result.\n * - If a fetch is already in flight, returns its promise instead of\n * starting a new one, unless `fetchOptions.cancelRefetch` is set and the\n * query already has data, in which case the current fetch is silently\n * cancelled first.\n * - If `options` is passed, it replaces the query's current options\n * before fetching.\n */\n async fetch(\n options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n fetchOptions?: FetchOptions<TQueryFnData>,\n ): Promise<TData> {\n if (\n this.state.fetchStatus !== 'idle' &&\n // If the promise in the retryer is already rejected, we have to definitely\n // re-start the fetch; there is a chance that the query is still in a\n // pending state when that happens\n this.#retryer?.status() !== 'rejected'\n ) {\n if (this.state.data !== undefined && fetchOptions?.cancelRefetch) {\n // Silently cancel current fetch if the user wants to cancel refetch\n this.cancel({ silent: true })\n } else if (this.#retryer) {\n // make sure that retries that were potentially cancelled due to unmounts can continue\n this.#retryer.continueRetry()\n // Return current promise if we are already fetching\n return this.#retryer.promise\n }\n }\n\n // Update config if passed, otherwise the config from the last execution is used\n if (options) {\n this.setOptions(options)\n }\n\n // Use the options from the first observer with a query function if no function is found.\n // This can happen when the query is hydrated or created with setQueryData.\n if (!this.options.queryFn) {\n const observer = this.observers.find((x) => x.options.queryFn)\n if (observer) {\n this.setOptions(observer.options)\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!Array.isArray(this.options.queryKey)) {\n console.error(\n `As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`,\n )\n }\n }\n\n const abortController = new AbortController()\n\n // Adds an enumerable signal property to the object that\n // which sets abortSignalConsumed to true when the signal\n // is read.\n const addSignalProperty = (object: unknown) => {\n Object.defineProperty(object, 'signal', {\n enumerable: true,\n get: () => {\n this.#abortSignalConsumed = true\n return abortController.signal\n },\n })\n }\n\n // Create fetch function\n const fetchFn = () => {\n const queryFn = ensureQueryFn(this.options, fetchOptions)\n\n // Create query function context\n const createQueryFnContext = (): QueryFunctionContext<TQueryKey> => {\n const queryFnContext: OmitKeyof<\n QueryFunctionContext<TQueryKey>,\n 'signal'\n > = {\n client: this.#client,\n queryKey: this.queryKey,\n meta: this.meta,\n }\n addSignalProperty(queryFnContext)\n return queryFnContext as QueryFunctionContext<TQueryKey>\n }\n\n const queryFnContext = createQueryFnContext()\n\n this.#abortSignalConsumed = false\n if (this.options.persister) {\n return this.options.persister(\n queryFn,\n queryFnContext,\n this as unknown as Query,\n )\n }\n\n return queryFn(queryFnContext)\n }\n\n // Trigger behavior hook\n const createFetchContext = (): FetchContext<\n TQueryFnData,\n TError,\n TData,\n TQueryKey\n > => {\n const context: OmitKeyof<\n FetchContext<TQueryFnData, TError, TData, TQueryKey>,\n 'signal'\n > = {\n fetchOptions,\n options: this.options,\n queryKey: this.queryKey,\n client: this.#client,\n state: this.state,\n fetchFn,\n }\n\n addSignalProperty(context)\n return context as FetchContext<TQueryFnData, TError, TData, TQueryKey>\n }\n\n const context = createFetchContext()\n\n const behavior =\n this.#queryType === 'infinite'\n ? (infiniteQueryBehavior(\n (this.options as { pages?: number }).pages,\n ) as QueryBehavior<TQueryFnData, TError, TData, TQueryKey>)\n : this.options.behavior\n behavior?.onFetch(context, this as unknown as Query)\n\n // Store state in case the current fetch needs to be reverted\n this.#revertState = this.state\n\n // Set to fetching state if not already in it\n if (\n this.state.fetchStatus === 'idle' ||\n this.state.fetchMeta !== context.fetchOptions?.meta\n ) {\n this.#dispatch({ type: 'fetch', meta: context.fetchOptions?.meta })\n }\n\n // Try to fetch the data\n const retryer = (this.#retryer = createRetryer({\n initialPromise: fetchOptions?.initialPromise as\n Promise<TData> | undefined,\n fn: context.fetchFn as () => Promise<TData>,\n onCancel: (error) => {\n if (error instanceof CancelledError && error.revert) {\n this.setState({\n ...this.#revertState,\n fetchStatus: 'idle' as const,\n })\n }\n abortController.abort()\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: 'failed', failureCount, error })\n },\n onPause: () => {\n this.#dispatch({ type: 'pause' })\n },\n onContinue: () => {\n this.#dispatch({ type: 'continue' })\n },\n retry: context.options.retry,\n retryDelay: context.options.retryDelay,\n networkMode: context.options.networkMode,\n canRun: () => true,\n }))\n\n try {\n const data = await retryer.start()\n // this is more of a runtime guard\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (data === undefined) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`,\n )\n }\n throw new Error(`${this.queryHash} data is undefined`)\n }\n\n this.setData(data)\n\n // Notify cache callback\n this.#cache.config.onSuccess?.(data, this as Query<any, any, any, any>)\n this.#cache.config.onSettled?.(\n data,\n this.state.error as any,\n this as Query<any, any, any, any>,\n )\n return data\n } catch (error) {\n if (error instanceof CancelledError) {\n if (error.silent) {\n // silent cancellation implies a new fetch is going to be started,\n // so we piggyback onto that promise\n return this.#retryer.promise\n } else if (error.revert) {\n // transform error into reverted state data\n // if the initial fetch was cancelled, we have no data, so we have\n // to get reject with a CancelledError\n if (this.state.data === undefined) {\n throw error\n }\n return this.state.data\n }\n }\n this.#dispatch({\n type: 'error',\n error: error as TError,\n })\n\n // Notify cache callback\n this.#cache.config.onError?.(\n error as any,\n this as Query<any, any, any, any>,\n )\n this.#cache.config.onSettled?.(\n this.state.data,\n error as any,\n this as Query<any, any, any, any>,\n )\n\n throw error // rethrow the error for further handling\n } finally {\n // The settled retryer's promise would otherwise pin this fetch's raw\n // result (a second copy after structural sharing) for the query's lifetime\n if (this.#retryer === retryer) {\n this.#retryer = undefined\n }\n // Schedule query gc after fetching\n this.scheduleGc()\n }\n }\n\n #dispatch(action: Action<TData, TError>): void {\n const reducer = (\n state: QueryState<TData, TError>,\n ): QueryState<TData, TError> => {\n switch (action.type) {\n case 'failed':\n return {\n ...state,\n fetchFailureCount: action.failureCount,\n fetchFailureReason: action.error,\n }\n case 'pause':\n return {\n ...state,\n fetchStatus: 'paused',\n }\n case 'continue':\n return {\n ...state,\n fetchStatus: 'fetching',\n }\n case 'fetch':\n return {\n ...state,\n ...fetchState(state.data, this.options),\n fetchMeta: action.meta ?? null,\n }\n case 'success':\n const newState = {\n ...state,\n ...successState(action.data, action.dataUpdatedAt),\n dataUpdateCount: state.dataUpdateCount + 1,\n ...(!action.manual && {\n fetchStatus: 'idle' as const,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n }),\n }\n // If fetching ends successfully, we don't need revertState as a fallback anymore.\n // For manual updates, capture the state to revert to it in case of a cancellation.\n this.#revertState = action.manual ? newState : undefined\n\n return newState\n case 'error':\n const error = action.error\n return {\n ...state,\n error,\n errorUpdateCount: state.errorUpdateCount + 1,\n errorUpdatedAt: Date.now(),\n fetchFailureCount: state.fetchFailureCount + 1,\n fetchFailureReason: error,\n fetchStatus: 'idle',\n status: 'error',\n // flag existing data as invalidated if we get a background error\n // note that \"no data\" always means stale so we can set unconditionally here\n isInvalidated: true,\n }\n case 'invalidate':\n return {\n ...state,\n isInvalidated: true,\n }\n case 'setState':\n return {\n ...state,\n ...action.state,\n }\n }\n }\n\n this.state = reducer(this.state)\n\n notifyManager.batch(() => {\n // Keep the current iteration stable if an observer unsubscribes\n // synchronously while it is being notified.\n this.observers.slice().forEach((observer) => {\n observer.onQueryUpdate()\n })\n\n this.#cache.notify({ query: this, type: 'updated', action })\n })\n }\n}\n\nexport function fetchState<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey,\n>(\n data: TData | undefined,\n options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n) {\n return {\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchStatus: canFetch(options.networkMode) ? 'fetching' : 'paused',\n ...(data === undefined &&\n ({\n error: null,\n status: 'pending',\n } as const)),\n } as const\n}\n\nfunction successState<TData>(data: TData | undefined, dataUpdatedAt?: number) {\n return {\n data,\n dataUpdatedAt: dataUpdatedAt ?? Date.now(),\n error: null,\n isInvalidated: false,\n status: 'success' as const,\n }\n}\n\nfunction getDefaultState<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends QueryKey,\n>(\n options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryState<TData, TError> {\n const data =\n typeof options.initialData === 'function'\n ? (options.initialData as InitialDataFunction<TData>)()\n : options.initialData\n\n const hasData = data !== undefined\n\n const initialDataUpdatedAt = hasData\n ? typeof options.initialDataUpdatedAt === 'function'\n ? options.initialDataUpdatedAt()\n : options.initialDataUpdatedAt\n : 0\n\n return {\n data,\n dataUpdateCount: 0,\n dataUpdatedAt: hasData ? (initialDataUpdatedAt ?? Date.now()) : 0,\n error: null,\n errorUpdateCount: 0,\n errorUpdatedAt: 0,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchMeta: null,\n isInvalidated: false,\n status: hasData ? 'success' : 'pending',\n fetchStatus: 'idle',\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAgOA,IAAa,QAAb,cAKUA,kBAAAA,UAAU;CAKlB;CAEA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA,YAAY,QAA6D;EACvE,MAAM;EAEN,KAAK,uBAAuB;EAC5B,KAAK,kBAAkB,OAAO;EAC9B,KAAK,WAAW,OAAO,OAAO;EAC9B,KAAK,YAAY,CAAC;EAClB,KAAK,UAAU,OAAO;EACtB,KAAK,SAAS,KAAK,QAAQ,cAAc;EACzC,KAAK,WAAW,OAAO;EACvB,KAAK,YAAY,OAAO;EACxB,KAAK,gBAAgB,gBAAgB,KAAK,OAAO;EACjD,KAAK,QAAQ,OAAO,SAAS,KAAK;EAClC,KAAK,WAAW;CAClB;;;;CAIA,IAAI,OAA8B;EAChC,OAAO,KAAK,QAAQ;CACtB;;CAGA,IAAI,YAAY;EACd,OAAO,KAAK;CACd;;;;;CAMA,IAAI,UAAsC;EACxC,OAAO,KAAK,UAAU;CACxB;;CAGA,WACE,SACM;EACN,KAAK,UAAU;GAAE,GAAG,KAAK;GAAiB,GAAG;EAAQ;EAErD,IAAI,SAAS,OACX,KAAK,aAAa,QAAQ;EAG5B,KAAK,aAAa,KAAK,QAAQ,MAAM;EAGrC,IAAI,KAAK,SAAS,KAAK,MAAM,SAAS,KAAA,GAAW;GAC/C,MAAM,eAAe,gBAAgB,KAAK,OAAO;GACjD,IAAI,aAAa,SAAS,KAAA,GAAW;IACnC,KAAK,SACH,aAAa,aAAa,MAAM,aAAa,aAAa,CAC5D;IACA,KAAK,gBAAgB;GACvB;EACF;CACF;CAEA,iBAA2B;EACzB,IAAI,CAAC,KAAK,UAAU,UAAU,KAAK,MAAM,gBAAgB,QACvD,KAAK,OAAO,OAAO,IAAI;CAE3B;;CAGA,QACE,SACA,SACO;EACP,MAAM,OAAOC,cAAAA,YAAY,KAAK,MAAM,MAAM,SAAS,KAAK,OAAO;EAG/D,KAAK,UAAU;GACb;GACA,MAAM;GACN,eAAe,SAAS;GACxB,QAAQ,SAAS;EACnB,CAAC;EAED,OAAO;CACT;;;;;;CAOA,SAAS,OAAiD;EACxD,KAAK,UAAU;GAAE,MAAM;GAAY;EAAM,CAAC;CAC5C;;;;;;;;;;;CAYA,OAAO,SAAwC;EAC7C,MAAM,UAAU,KAAK,UAAU;EAC/B,KAAK,UAAU,OAAO,OAAO;EAC7B,OAAO,UAAU,QAAQ,KAAKC,cAAAA,IAAI,CAAC,CAAC,MAAMA,cAAAA,IAAI,IAAI,QAAQ,QAAQ;CACpE;;;;;;;;CASA,UAAgB;EACd,MAAM,QAAQ;EAEd,KAAK,OAAO,EAAE,QAAQ,KAAK,CAAC;CAC9B;;CAGA,IAAI,aAAwC;EAC1C,OAAO,KAAK;CACd;;;;;;CAOA,QAAc;EACZ,KAAK,QAAQ;EACb,KAAK,SAAS,KAAK,UAAU;CAC/B;;;;;CAMA,WAAoB;EAClB,OAAO,KAAK,UAAU,MACnB,aAAaC,cAAAA,kBAAkB,SAAS,QAAQ,SAAS,IAAI,MAAM,KACtE;CACF;;;;;;;;;CAUA,aAAsB;EACpB,IAAI,KAAK,kBAAkB,IAAI,GAC7B,OAAO,CAAC,KAAK,SAAS;EAGxB,OAAO,KAAK,QAAQ,YAAYC,cAAAA,aAAa,CAAC,KAAK,UAAU;CAC/D;;;;;CAMA,YAAY;EACV,OAAO,KAAK,MAAM,kBAAkB,KAAK,MAAM,mBAAmB;CACpE;;;;;CAMA,WAAoB;EAClB,IAAI,KAAK,kBAAkB,IAAI,GAC7B,OAAO,KAAK,UAAU,MACnB,aACCD,cAAAA,kBAAkB,SAAS,QAAQ,WAAW,IAAI,MAAM,QAC5D;EAGF,OAAO;CACT;;;;;;;;;;;;;;;;;CAkBA,UAAmB;EAGjB,IAAI,KAAK,kBAAkB,IAAI,GAC7B,OAAO,KAAK,UAAU,MACnB,aAAa,SAAS,iBAAiB,CAAC,CAAC,OAC5C;EAGF,OAAO,KAAK,MAAM,SAAS,KAAA,KAAa,KAAK,MAAM;CACrD;;;;;;;;;;;;;;;CAgBA,cAAc,YAAuB,GAAY;EAE/C,IAAI,KAAK,MAAM,SAAS,KAAA,GACtB,OAAO;EAGT,IAAI,cAAc,UAChB,OAAO;EAGT,IAAI,KAAK,MAAM,eACb,OAAO;EAGT,OAAO,CAACE,cAAAA,eAAe,KAAK,MAAM,eAAe,SAAS;CAC5D;;CAGA,UAAgB;EAGd,KAFsB,UAAU,MAAM,MAAM,EAAE,yBAAyB,CAEhE,CAAC,EAAE,QAAQ,EAAE,eAAe,MAAM,CAAC;EAG1C,KAAK,UAAU,SAAS;CAC1B;;CAGA,WAAiB;EAGf,KAFsB,UAAU,MAAM,MAAM,EAAE,uBAAuB,CAE9D,CAAC,EAAE,QAAQ,EAAE,eAAe,MAAM,CAAC;EAG1C,KAAK,UAAU,SAAS;CAC1B;;CAGA,YAAY,UAAwD;EAClE,IAAI,CAAC,KAAK,UAAU,SAAS,QAAQ,GAAG;GACtC,KAAK,UAAU,KAAK,QAAQ;GAG5B,KAAK,eAAe;GAEpB,KAAK,OAAO,OAAO;IAAE,MAAM;IAAiB,OAAO;IAAM;GAAS,CAAC;EACrE;CACF;;CAGA,eAAe,UAAwD;EACrE,MAAM,QAAQ,KAAK,UAAU,QAAQ,QAAQ;EAC7C,IAAI,UAAU,IAAI;GAChB,KAAK,UAAU,OAAO,OAAO,CAAC;GAE9B,IAAI,CAAC,KAAK,UAAU,QAAQ;IAG1B,IAAI,KAAK,UAAU;KACjB,IACE,KAAK,wBACJ,KAAK,MAAM,gBAAgB,YAC1B,KAAK,MAAM,WAAW,WAExB,KAAK,SAAS,OAAO,EAAE,QAAQ,KAAK,CAAC;UAErC,KAAK,SAAS,YAAY;IAE9B;IAEA,KAAK,WAAW;GAClB;GAEA,KAAK,OAAO,OAAO;IAAE,MAAM;IAAmB,OAAO;IAAM;GAAS,CAAC;EACvE;CACF;;;;;;;;;;;CAYA,oBAA4B;EAC1B,OAAO,KAAK,UAAU;CACxB;;;;;;;;;;;CAYA,aAAmB;EACjB,IAAI,CAAC,KAAK,MAAM,eACd,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;CAEzC;;;;;;;;;;;CAYA,MAAM,MACJ,SACA,cACgB;EAChB,IACE,KAAK,MAAM,gBAAgB,UAI3B,KAAK,UAAU,OAAO,MAAM,YAC5B;GACA,IAAI,KAAK,MAAM,SAAS,KAAA,KAAa,cAAc,eAEjD,KAAK,OAAO,EAAE,QAAQ,KAAK,CAAC;QACvB,IAAI,KAAK,UAAU;IAExB,KAAK,SAAS,cAAc;IAE5B,OAAO,KAAK,SAAS;GACvB;EACF;EAGA,IAAI,SACF,KAAK,WAAW,OAAO;EAKzB,IAAI,CAAC,KAAK,QAAQ,SAAS;GACzB,MAAM,WAAW,KAAK,UAAU,MAAM,MAAM,EAAE,QAAQ,OAAO;GAC7D,IAAI,UACF,KAAK,WAAW,SAAS,OAAO;EAEpC;EAEA,IAAI,QAAQ,IAAI,aAAa,cACvB;OAAA,CAAC,MAAM,QAAQ,KAAK,QAAQ,QAAQ,GACtC,QAAQ,MACN,qIACF;EAAA;EAIJ,MAAM,kBAAkB,IAAI,gBAAgB;EAK5C,MAAM,qBAAqB,WAAoB;GAC7C,OAAO,eAAe,QAAQ,UAAU;IACtC,YAAY;IACZ,WAAW;KACT,KAAK,uBAAuB;KAC5B,OAAO,gBAAgB;IACzB;GACF,CAAC;EACH;EAGA,MAAM,gBAAgB;GACpB,MAAM,UAAUC,cAAAA,cAAc,KAAK,SAAS,YAAY;GAGxD,MAAM,6BAA8D;IAClE,MAAM,iBAGF;KACF,QAAQ,KAAK;KACb,UAAU,KAAK;KACf,MAAM,KAAK;IACb;IACA,kBAAkB,cAAc;IAChC,OAAO;GACT;GAEA,MAAM,iBAAiB,qBAAqB;GAE5C,KAAK,uBAAuB;GAC5B,IAAI,KAAK,QAAQ,WACf,OAAO,KAAK,QAAQ,UAClB,SACA,gBACA,IACF;GAGF,OAAO,QAAQ,cAAc;EAC/B;EAGA,MAAM,2BAKD;GACH,MAAM,UAGF;IACF;IACA,SAAS,KAAK;IACd,UAAU,KAAK;IACf,QAAQ,KAAK;IACb,OAAO,KAAK;IACZ;GACF;GAEA,kBAAkB,OAAO;GACzB,OAAO;EACT;EAEA,MAAM,UAAU,mBAAmB;EAQnC,CALE,KAAK,eAAe,aACfC,8BAAAA,sBACE,KAAK,QAA+B,KACvC,IACA,KAAK,QAAQ,SAAA,EACT,QAAQ,SAAS,IAAwB;EAGnD,KAAK,eAAe,KAAK;EAGzB,IACE,KAAK,MAAM,gBAAgB,UAC3B,KAAK,MAAM,cAAc,QAAQ,cAAc,MAE/C,KAAK,UAAU;GAAE,MAAM;GAAS,MAAM,QAAQ,cAAc;EAAK,CAAC;EAIpE,MAAM,UAAW,KAAK,WAAWC,gBAAAA,cAAc;GAC7C,gBAAgB,cAAc;GAE9B,IAAI,QAAQ;GACZ,WAAW,UAAU;IACnB,IAAI,iBAAiBC,gBAAAA,kBAAkB,MAAM,QAC3C,KAAK,SAAS;KACZ,GAAG,KAAK;KACR,aAAa;IACf,CAAC;IAEH,gBAAgB,MAAM;GACxB;GACA,SAAS,cAAc,UAAU;IAC/B,KAAK,UAAU;KAAE,MAAM;KAAU;KAAc;IAAM,CAAC;GACxD;GACA,eAAe;IACb,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;GAClC;GACA,kBAAkB;IAChB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;GACrC;GACA,OAAO,QAAQ,QAAQ;GACvB,YAAY,QAAQ,QAAQ;GAC5B,aAAa,QAAQ,QAAQ;GAC7B,cAAc;EAChB,CAAC;EAED,IAAI;GACF,MAAM,OAAO,MAAM,QAAQ,MAAM;GAGjC,IAAI,SAAS,KAAA,GAAW;IACtB,IAAI,QAAQ,IAAI,aAAa,cAC3B,QAAQ,MACN,yIAAyI,KAAK,WAChJ;IAEF,MAAM,IAAI,MAAM,GAAG,KAAK,UAAU,mBAAmB;GACvD;GAEA,KAAK,QAAQ,IAAI;GAGjB,KAAK,OAAO,OAAO,YAAY,MAAM,IAAiC;GACtE,KAAK,OAAO,OAAO,YACjB,MACA,KAAK,MAAM,OACX,IACF;GACA,OAAO;EACT,SAAS,OAAO;GACd,IAAI,iBAAiBA,gBAAAA,gBAAgB;IACnC,IAAI,MAAM,QAGR,OAAO,KAAK,SAAS;SAChB,IAAI,MAAM,QAAQ;KAIvB,IAAI,KAAK,MAAM,SAAS,KAAA,GACtB,MAAM;KAER,OAAO,KAAK,MAAM;IACpB;GACF;GACA,KAAK,UAAU;IACb,MAAM;IACC;GACT,CAAC;GAGD,KAAK,OAAO,OAAO,UACjB,OACA,IACF;GACA,KAAK,OAAO,OAAO,YACjB,KAAK,MAAM,MACX,OACA,IACF;GAEA,MAAM;EACR,UAAU;GAGR,IAAI,KAAK,aAAa,SACpB,KAAK,WAAW,KAAA;GAGlB,KAAK,WAAW;EAClB;CACF;CAEA,UAAU,QAAqC;EAC7C,MAAM,WACJ,UAC8B;GAC9B,QAAQ,OAAO,MAAf;IACE,KAAK,UACH,OAAO;KACL,GAAG;KACH,mBAAmB,OAAO;KAC1B,oBAAoB,OAAO;IAC7B;IACF,KAAK,SACH,OAAO;KACL,GAAG;KACH,aAAa;IACf;IACF,KAAK,YACH,OAAO;KACL,GAAG;KACH,aAAa;IACf;IACF,KAAK,SACH,OAAO;KACL,GAAG;KACH,GAAG,WAAW,MAAM,MAAM,KAAK,OAAO;KACtC,WAAW,OAAO,QAAQ;IAC5B;IACF,KAAK;KACH,MAAM,WAAW;MACf,GAAG;MACH,GAAG,aAAa,OAAO,MAAM,OAAO,aAAa;MACjD,iBAAiB,MAAM,kBAAkB;MACzC,GAAI,CAAC,OAAO,UAAU;OACpB,aAAa;OACb,mBAAmB;OACnB,oBAAoB;MACtB;KACF;KAGA,KAAK,eAAe,OAAO,SAAS,WAAW,KAAA;KAE/C,OAAO;IACT,KAAK;KACH,MAAM,QAAQ,OAAO;KACrB,OAAO;MACL,GAAG;MACH;MACA,kBAAkB,MAAM,mBAAmB;MAC3C,gBAAgB,KAAK,IAAI;MACzB,mBAAmB,MAAM,oBAAoB;MAC7C,oBAAoB;MACpB,aAAa;MACb,QAAQ;MAGR,eAAe;KACjB;IACF,KAAK,cACH,OAAO;KACL,GAAG;KACH,eAAe;IACjB;IACF,KAAK,YACH,OAAO;KACL,GAAG;KACH,GAAG,OAAO;IACZ;GACJ;EACF;EAEA,KAAK,QAAQ,QAAQ,KAAK,KAAK;EAE/B,sBAAA,cAAc,YAAY;GAGxB,KAAK,UAAU,MAAM,CAAC,CAAC,SAAS,aAAa;IAC3C,SAAS,cAAc;GACzB,CAAC;GAED,KAAK,OAAO,OAAO;IAAE,OAAO;IAAM,MAAM;IAAW;GAAO,CAAC;EAC7D,CAAC;CACH;AACF;AAEA,SAAgB,WAMd,MACA,SACA;CACA,OAAO;EACL,mBAAmB;EACnB,oBAAoB;EACpB,aAAaC,gBAAAA,SAAS,QAAQ,WAAW,IAAI,aAAa;EAC1D,GAAI,SAAS,KAAA,KACV;GACC,OAAO;GACP,QAAQ;EACV;CACJ;AACF;AAEA,SAAS,aAAoB,MAAyB,eAAwB;CAC5E,OAAO;EACL;EACA,eAAe,iBAAiB,KAAK,IAAI;EACzC,OAAO;EACP,eAAe;EACf,QAAQ;CACV;AACF;AAEA,SAAS,gBAMP,SAC2B;CAC3B,MAAM,OACJ,OAAO,QAAQ,gBAAgB,aAC1B,QAAQ,YAA2C,IACpD,QAAQ;CAEd,MAAM,UAAU,SAAS,KAAA;CAEzB,MAAM,uBAAuB,UACzB,OAAO,QAAQ,yBAAyB,aACtC,QAAQ,qBAAqB,IAC7B,QAAQ,uBACV;CAEJ,OAAO;EACL;EACA,iBAAiB;EACjB,eAAe,UAAW,wBAAwB,KAAK,IAAI,IAAK;EAChE,OAAO;EACP,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;EACnB,oBAAoB;EACpB,WAAW;EACX,eAAe;EACf,QAAQ,UAAU,YAAY;EAC9B,aAAa;CACf;AACF"}
|
package/build/modern/query.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $n as Query, Jn as Action, Qn as FetchOptions, Xn as FetchDirection, Yn as FetchContext, Zn as FetchMeta, er as QueryBehavior, nr as fetchState, tr as QueryState } from "./hydration-
|
|
1
|
+
import { $n as Query, Jn as Action, Qn as FetchOptions, Xn as FetchDirection, Yn as FetchContext, Zn as FetchMeta, er as QueryBehavior, nr as fetchState, tr as QueryState } from "./hydration-Br9VIGXa.cjs";
|
|
2
2
|
export { Action, FetchContext, FetchDirection, FetchMeta, FetchOptions, Query, QueryBehavior, QueryState, fetchState };
|
package/build/modern/query.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $n as Query, Jn as Action, Qn as FetchOptions, Xn as FetchDirection, Yn as FetchContext, Zn as FetchMeta, er as QueryBehavior, nr as fetchState, tr as QueryState } from "./hydration-
|
|
1
|
+
import { $n as Query, Jn as Action, Qn as FetchOptions, Xn as FetchDirection, Yn as FetchContext, Zn as FetchMeta, er as QueryBehavior, nr as fetchState, tr as QueryState } from "./hydration-B9t5w6NC.js";
|
|
2
2
|
export { Action, FetchContext, FetchDirection, FetchMeta, FetchOptions, Query, QueryBehavior, QueryState, fetchState };
|