@tanstack/query-core 5.102.7 → 5.103.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/environmentManager.cjs +15 -1
- package/build/legacy/environmentManager.cjs.map +1 -1
- package/build/legacy/environmentManager.d.cts +15 -1
- package/build/legacy/environmentManager.d.cts.map +1 -1
- package/build/legacy/environmentManager.d.ts +15 -1
- package/build/legacy/environmentManager.d.ts.map +1 -1
- package/build/legacy/environmentManager.js +15 -1
- package/build/legacy/environmentManager.js.map +1 -1
- package/build/legacy/focusManager.cjs +57 -0
- package/build/legacy/focusManager.cjs.map +1 -1
- package/build/legacy/focusManager.d.cts +57 -0
- package/build/legacy/focusManager.d.cts.map +1 -1
- package/build/legacy/focusManager.d.ts +57 -0
- package/build/legacy/focusManager.d.ts.map +1 -1
- package/build/legacy/focusManager.js +57 -0
- package/build/legacy/focusManager.js.map +1 -1
- package/build/legacy/{hydration-Bjs0MSgg.d.ts → hydration-Cq7QYAzB.d.ts} +1424 -7
- package/build/legacy/hydration-Cq7QYAzB.d.ts.map +1 -0
- package/build/legacy/{hydration-DWGr3cFC.d.cts → hydration-DwR10Hi-.d.cts} +1424 -7
- package/build/legacy/hydration-DwR10Hi-.d.cts.map +1 -0
- package/build/legacy/hydration.cjs +57 -4
- package/build/legacy/hydration.cjs.map +1 -1
- package/build/legacy/hydration.d.cts +1 -1
- package/build/legacy/hydration.d.ts +1 -1
- package/build/legacy/hydration.js +57 -4
- package/build/legacy/hydration.js.map +1 -1
- package/build/legacy/index.cjs.map +1 -1
- package/build/legacy/index.d.cts +5 -5
- package/build/legacy/index.d.ts +5 -5
- package/build/legacy/index.js.map +1 -1
- package/build/legacy/infiniteQueryBehavior.d.cts +1 -1
- package/build/legacy/infiniteQueryBehavior.d.ts +1 -1
- package/build/legacy/infiniteQueryObserver.cjs +67 -0
- package/build/legacy/infiniteQueryObserver.cjs.map +1 -1
- package/build/legacy/infiniteQueryObserver.d.cts +68 -1
- package/build/legacy/infiniteQueryObserver.d.cts.map +1 -1
- package/build/legacy/infiniteQueryObserver.d.ts +68 -1
- package/build/legacy/infiniteQueryObserver.d.ts.map +1 -1
- package/build/legacy/infiniteQueryObserver.js +67 -0
- package/build/legacy/infiniteQueryObserver.js.map +1 -1
- package/build/legacy/mutation.cjs +74 -0
- package/build/legacy/mutation.cjs.map +1 -1
- package/build/legacy/mutation.d.cts +1 -1
- package/build/legacy/mutation.d.ts +1 -1
- package/build/legacy/mutation.js +74 -0
- package/build/legacy/mutation.js.map +1 -1
- package/build/legacy/mutationCache.cjs +74 -0
- package/build/legacy/mutationCache.cjs.map +1 -1
- package/build/legacy/mutationCache.d.cts +1 -1
- package/build/legacy/mutationCache.d.ts +1 -1
- package/build/legacy/mutationCache.js +74 -0
- package/build/legacy/mutationCache.js.map +1 -1
- package/build/legacy/mutationObserver.cjs +71 -0
- package/build/legacy/mutationObserver.cjs.map +1 -1
- package/build/legacy/mutationObserver.d.cts +1 -1
- package/build/legacy/mutationObserver.d.ts +1 -1
- package/build/legacy/mutationObserver.js +71 -0
- package/build/legacy/mutationObserver.js.map +1 -1
- package/build/legacy/notifyManager.cjs +45 -1
- package/build/legacy/notifyManager.cjs.map +1 -1
- package/build/legacy/notifyManager.d.cts +83 -2
- package/build/legacy/notifyManager.d.cts.map +1 -1
- package/build/legacy/notifyManager.d.ts +83 -2
- package/build/legacy/notifyManager.d.ts.map +1 -1
- package/build/legacy/notifyManager.js +45 -1
- package/build/legacy/notifyManager.js.map +1 -1
- package/build/legacy/onlineManager.cjs +47 -0
- package/build/legacy/onlineManager.cjs.map +1 -1
- package/build/legacy/onlineManager.d.cts +47 -0
- package/build/legacy/onlineManager.d.cts.map +1 -1
- package/build/legacy/onlineManager.d.ts +47 -0
- package/build/legacy/onlineManager.d.ts.map +1 -1
- package/build/legacy/onlineManager.js +47 -0
- package/build/legacy/onlineManager.js.map +1 -1
- package/build/legacy/queriesObserver.cjs +64 -0
- package/build/legacy/queriesObserver.cjs.map +1 -1
- package/build/legacy/queriesObserver.d.cts +73 -1
- package/build/legacy/queriesObserver.d.cts.map +1 -1
- package/build/legacy/queriesObserver.d.ts +73 -1
- package/build/legacy/queriesObserver.d.ts.map +1 -1
- package/build/legacy/queriesObserver.js +64 -0
- package/build/legacy/queriesObserver.js.map +1 -1
- package/build/legacy/query.cjs +141 -0
- 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 +141 -0
- package/build/legacy/query.js.map +1 -1
- package/build/legacy/queryCache.cjs +120 -0
- 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 +120 -0
- package/build/legacy/queryCache.js.map +1 -1
- package/build/legacy/queryClient.cjs +363 -0
- 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 +363 -0
- package/build/legacy/queryClient.js.map +1 -1
- package/build/legacy/queryObserver.cjs +116 -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 +116 -2
- package/build/legacy/queryObserver.js.map +1 -1
- package/build/legacy/retryer.cjs +18 -0
- package/build/legacy/retryer.cjs.map +1 -1
- package/build/legacy/retryer.d.cts +1 -1
- package/build/legacy/retryer.d.ts +1 -1
- package/build/legacy/retryer.js +18 -0
- package/build/legacy/retryer.js.map +1 -1
- package/build/legacy/streamedQuery.cjs +10 -1
- package/build/legacy/streamedQuery.cjs.map +1 -1
- package/build/legacy/streamedQuery.d.cts +26 -2
- package/build/legacy/streamedQuery.d.cts.map +1 -1
- package/build/legacy/streamedQuery.d.ts +26 -2
- package/build/legacy/streamedQuery.d.ts.map +1 -1
- package/build/legacy/streamedQuery.js +10 -1
- package/build/legacy/streamedQuery.js.map +1 -1
- package/build/legacy/timeoutManager.cjs +99 -0
- package/build/legacy/timeoutManager.cjs.map +1 -1
- package/build/legacy/timeoutManager.d.cts +105 -0
- package/build/legacy/timeoutManager.d.cts.map +1 -1
- package/build/legacy/timeoutManager.d.ts +105 -0
- package/build/legacy/timeoutManager.d.ts.map +1 -1
- package/build/legacy/timeoutManager.js +99 -0
- package/build/legacy/timeoutManager.js.map +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.cjs +76 -0
- package/build/legacy/utils.cjs.map +1 -1
- package/build/legacy/utils.d.cts +1 -1
- package/build/legacy/utils.d.ts +1 -1
- package/build/legacy/utils.js +76 -0
- package/build/legacy/utils.js.map +1 -1
- package/build/modern/environmentManager.cjs +15 -1
- package/build/modern/environmentManager.cjs.map +1 -1
- package/build/modern/environmentManager.d.cts +15 -1
- package/build/modern/environmentManager.d.cts.map +1 -1
- package/build/modern/environmentManager.d.ts +15 -1
- package/build/modern/environmentManager.d.ts.map +1 -1
- package/build/modern/environmentManager.js +15 -1
- package/build/modern/environmentManager.js.map +1 -1
- package/build/modern/focusManager.cjs +57 -0
- package/build/modern/focusManager.cjs.map +1 -1
- package/build/modern/focusManager.d.cts +57 -0
- package/build/modern/focusManager.d.cts.map +1 -1
- package/build/modern/focusManager.d.ts +57 -0
- package/build/modern/focusManager.d.ts.map +1 -1
- package/build/modern/focusManager.js +57 -0
- package/build/modern/focusManager.js.map +1 -1
- package/build/modern/{hydration-Bjs0MSgg.d.ts → hydration-Cq7QYAzB.d.ts} +1424 -7
- package/build/modern/hydration-Cq7QYAzB.d.ts.map +1 -0
- package/build/modern/{hydration-DWGr3cFC.d.cts → hydration-DwR10Hi-.d.cts} +1424 -7
- package/build/modern/hydration-DwR10Hi-.d.cts.map +1 -0
- package/build/modern/hydration.cjs +57 -4
- package/build/modern/hydration.cjs.map +1 -1
- package/build/modern/hydration.d.cts +1 -1
- package/build/modern/hydration.d.ts +1 -1
- package/build/modern/hydration.js +57 -4
- package/build/modern/hydration.js.map +1 -1
- package/build/modern/index.cjs.map +1 -1
- package/build/modern/index.d.cts +5 -5
- package/build/modern/index.d.ts +5 -5
- package/build/modern/index.js.map +1 -1
- package/build/modern/infiniteQueryBehavior.d.cts +1 -1
- package/build/modern/infiniteQueryBehavior.d.ts +1 -1
- package/build/modern/infiniteQueryObserver.cjs +67 -0
- package/build/modern/infiniteQueryObserver.cjs.map +1 -1
- package/build/modern/infiniteQueryObserver.d.cts +68 -1
- package/build/modern/infiniteQueryObserver.d.cts.map +1 -1
- package/build/modern/infiniteQueryObserver.d.ts +68 -1
- package/build/modern/infiniteQueryObserver.d.ts.map +1 -1
- package/build/modern/infiniteQueryObserver.js +67 -0
- package/build/modern/infiniteQueryObserver.js.map +1 -1
- package/build/modern/mutation.cjs +74 -0
- 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 +74 -0
- package/build/modern/mutation.js.map +1 -1
- package/build/modern/mutationCache.cjs +74 -0
- 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 +74 -0
- package/build/modern/mutationCache.js.map +1 -1
- package/build/modern/mutationObserver.cjs +71 -0
- 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 +71 -0
- package/build/modern/mutationObserver.js.map +1 -1
- package/build/modern/notifyManager.cjs +45 -1
- package/build/modern/notifyManager.cjs.map +1 -1
- package/build/modern/notifyManager.d.cts +83 -2
- package/build/modern/notifyManager.d.cts.map +1 -1
- package/build/modern/notifyManager.d.ts +83 -2
- package/build/modern/notifyManager.d.ts.map +1 -1
- package/build/modern/notifyManager.js +45 -1
- package/build/modern/notifyManager.js.map +1 -1
- package/build/modern/onlineManager.cjs +47 -0
- package/build/modern/onlineManager.cjs.map +1 -1
- package/build/modern/onlineManager.d.cts +47 -0
- package/build/modern/onlineManager.d.cts.map +1 -1
- package/build/modern/onlineManager.d.ts +47 -0
- package/build/modern/onlineManager.d.ts.map +1 -1
- package/build/modern/onlineManager.js +47 -0
- package/build/modern/onlineManager.js.map +1 -1
- package/build/modern/queriesObserver.cjs +64 -0
- package/build/modern/queriesObserver.cjs.map +1 -1
- package/build/modern/queriesObserver.d.cts +73 -1
- package/build/modern/queriesObserver.d.cts.map +1 -1
- package/build/modern/queriesObserver.d.ts +73 -1
- package/build/modern/queriesObserver.d.ts.map +1 -1
- package/build/modern/queriesObserver.js +64 -0
- package/build/modern/queriesObserver.js.map +1 -1
- package/build/modern/query.cjs +141 -0
- 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 +141 -0
- package/build/modern/query.js.map +1 -1
- package/build/modern/queryCache.cjs +120 -0
- 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 +120 -0
- package/build/modern/queryCache.js.map +1 -1
- package/build/modern/queryClient.cjs +363 -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 +363 -0
- package/build/modern/queryClient.js.map +1 -1
- package/build/modern/queryObserver.cjs +116 -2
- 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 +116 -2
- package/build/modern/queryObserver.js.map +1 -1
- package/build/modern/retryer.cjs +18 -0
- package/build/modern/retryer.cjs.map +1 -1
- package/build/modern/retryer.d.cts +1 -1
- package/build/modern/retryer.d.ts +1 -1
- package/build/modern/retryer.js +18 -0
- package/build/modern/retryer.js.map +1 -1
- package/build/modern/streamedQuery.cjs +10 -1
- package/build/modern/streamedQuery.cjs.map +1 -1
- package/build/modern/streamedQuery.d.cts +26 -2
- package/build/modern/streamedQuery.d.cts.map +1 -1
- package/build/modern/streamedQuery.d.ts +26 -2
- package/build/modern/streamedQuery.d.ts.map +1 -1
- package/build/modern/streamedQuery.js +10 -1
- package/build/modern/streamedQuery.js.map +1 -1
- package/build/modern/timeoutManager.cjs +99 -0
- package/build/modern/timeoutManager.cjs.map +1 -1
- package/build/modern/timeoutManager.d.cts +105 -0
- package/build/modern/timeoutManager.d.cts.map +1 -1
- package/build/modern/timeoutManager.d.ts +105 -0
- package/build/modern/timeoutManager.d.ts.map +1 -1
- package/build/modern/timeoutManager.js +99 -0
- 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.cjs +76 -0
- package/build/modern/utils.cjs.map +1 -1
- package/build/modern/utils.d.cts +1 -1
- package/build/modern/utils.d.ts +1 -1
- package/build/modern/utils.js +76 -0
- package/build/modern/utils.js.map +1 -1
- package/package.json +9 -9
- package/src/environmentManager.ts +15 -1
- package/src/focusManager.ts +57 -0
- package/src/hydration.ts +82 -16
- package/src/index.ts +3 -0
- package/src/infiniteQueryObserver.ts +67 -0
- package/src/mutation.ts +108 -0
- package/src/mutationCache.ts +91 -0
- package/src/mutationObserver.ts +71 -0
- package/src/notifyManager.ts +46 -1
- package/src/onlineManager.ts +47 -0
- package/src/queriesObserver.ts +72 -0
- package/src/query.ts +193 -0
- package/src/queryCache.ts +134 -0
- package/src/queryClient.ts +369 -0
- package/src/queryObserver.ts +117 -4
- package/src/retryer.ts +18 -0
- package/src/streamedQuery.ts +25 -1
- package/src/timeoutManager.ts +105 -0
- package/src/types.ts +147 -5
- package/src/utils.ts +107 -0
- package/build/legacy/hydration-Bjs0MSgg.d.ts.map +0 -1
- package/build/legacy/hydration-DWGr3cFC.d.cts.map +0 -1
- package/build/modern/hydration-Bjs0MSgg.d.ts.map +0 -1
- package/build/modern/hydration-DWGr3cFC.d.cts.map +0 -1
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { Subscribable } from "./subscribable.js";
|
|
2
2
|
//#region src/onlineManager.ts
|
|
3
|
+
/**
|
|
4
|
+
* The `OnlineManager` manages the online state within TanStack Query. It can
|
|
5
|
+
* be used to change the default event listeners or to manually change the
|
|
6
|
+
* online state.
|
|
7
|
+
*
|
|
8
|
+
* By default, the `onlineManager` assumes an active network connection, and
|
|
9
|
+
* listens to the `online` and `offline` events on the `window` object to
|
|
10
|
+
* detect changes.
|
|
11
|
+
*/
|
|
3
12
|
var OnlineManager = class extends Subscribable {
|
|
4
13
|
#online = true;
|
|
5
14
|
#cleanup;
|
|
@@ -28,11 +37,43 @@ var OnlineManager = class extends Subscribable {
|
|
|
28
37
|
this.#cleanup = void 0;
|
|
29
38
|
}
|
|
30
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* `setEventListener` can be used to set a custom event listener that will
|
|
42
|
+
* be used to determine the online state. The provided `setup` function
|
|
43
|
+
* receives a `setOnline` callback that should be called with a `boolean`
|
|
44
|
+
* whenever the online state changes.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* import NetInfo from '@react-native-community/netinfo'
|
|
49
|
+
* import { onlineManager } from '@tanstack/query-core'
|
|
50
|
+
*
|
|
51
|
+
* onlineManager.setEventListener((setOnline) => {
|
|
52
|
+
* return NetInfo.addEventListener((state) => {
|
|
53
|
+
* setOnline(!!state.isConnected)
|
|
54
|
+
* })
|
|
55
|
+
* })
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
31
58
|
setEventListener(setup) {
|
|
32
59
|
this.#setup = setup;
|
|
33
60
|
this.#cleanup?.();
|
|
34
61
|
this.#cleanup = setup(this.setOnline.bind(this));
|
|
35
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* `setOnline` can be used to manually set the online state.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { onlineManager } from '@tanstack/query-core'
|
|
69
|
+
*
|
|
70
|
+
* // Set to online
|
|
71
|
+
* onlineManager.setOnline(true)
|
|
72
|
+
*
|
|
73
|
+
* // Set to offline
|
|
74
|
+
* onlineManager.setOnline(false)
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
36
77
|
setOnline(online) {
|
|
37
78
|
if (this.#online !== online) {
|
|
38
79
|
this.#online = online;
|
|
@@ -41,10 +82,16 @@ var OnlineManager = class extends Subscribable {
|
|
|
41
82
|
});
|
|
42
83
|
}
|
|
43
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* `isOnline` can be used to get the current online state.
|
|
87
|
+
*/
|
|
44
88
|
isOnline() {
|
|
45
89
|
return this.#online;
|
|
46
90
|
}
|
|
47
91
|
};
|
|
92
|
+
/**
|
|
93
|
+
* Singleton instance of {@link OnlineManager}, used to manage and observe the online state within TanStack Query.
|
|
94
|
+
*/
|
|
48
95
|
const onlineManager = new OnlineManager();
|
|
49
96
|
//#endregion
|
|
50
97
|
export { OnlineManager, onlineManager };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineManager.js","names":["#setup","#cleanup","#online"],"sources":["../../src/onlineManager.ts"],"sourcesContent":["import { Subscribable } from './subscribable'\n\ntype Listener = (online: boolean) => void\ntype SetupFn = (setOnline: Listener) => (() => void) | undefined\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 setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup(this.setOnline.bind(this))\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 isOnline(): boolean {\n return this.#online\n }\n}\n\nexport const onlineManager = new OnlineManager()\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"onlineManager.js","names":["#setup","#cleanup","#online"],"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,KAAKA,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,KAAKC,UACR,KAAK,iBAAiB,KAAKD,MAAM;CAErC;CAEA,gBAA0B;EACxB,IAAI,CAAC,KAAK,aAAa,GAAG;GACxB,KAAKC,WAAW;GAChB,KAAKA,WAAW,KAAA;EAClB;CACF;;;;;;;;;;;;;;;;;;;CAoBA,iBAAiB,OAAsB;EACrC,KAAKD,SAAS;EACd,KAAKC,WAAW;EAChB,KAAKA,WAAW,MAAM,KAAK,UAAU,KAAK,IAAI,CAAC;CACjD;;;;;;;;;;;;;;;CAgBA,UAAU,QAAuB;EAG/B,IAFgB,KAAKC,YAAY,QAEpB;GACX,KAAKA,UAAU;GACf,KAAK,UAAU,SAAS,aAAa;IACnC,SAAS,MAAM;GACjB,CAAC;EACH;CACF;;;;CAKA,WAAoB;EAClB,OAAO,KAAKA;CACd;AACF;;;;AAKA,MAAa,gBAAgB,IAAI,cAAc"}
|
|
@@ -8,6 +8,25 @@ function difference(array1, array2) {
|
|
|
8
8
|
const excludeSet = new Set(array2);
|
|
9
9
|
return array1.filter((x) => !excludeSet.has(x));
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* A `QueriesObserver` watches an array of queries at once, exposing them as
|
|
13
|
+
* a single array of `QueryObserverResult`s (or, when a `combine` option is
|
|
14
|
+
* given, as a combined value derived from that array). It manages one
|
|
15
|
+
* internal `QueryObserver` per query, and is the primitive that framework
|
|
16
|
+
* adapters (e.g. `useQueries`) build their hooks on top of.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const observer = new QueriesObserver(queryClient, [
|
|
21
|
+
* { queryKey: ['post', 1], queryFn: fetchPost },
|
|
22
|
+
* { queryKey: ['post', 2], queryFn: fetchPost },
|
|
23
|
+
* ])
|
|
24
|
+
*
|
|
25
|
+
* const unsubscribe = observer.subscribe((result) => {
|
|
26
|
+
* console.log(result)
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
11
30
|
var QueriesObserver = class extends require_subscribable.Subscribable {
|
|
12
31
|
#client;
|
|
13
32
|
#result;
|
|
@@ -38,12 +57,30 @@ var QueriesObserver = class extends require_subscribable.Subscribable {
|
|
|
38
57
|
onUnsubscribe() {
|
|
39
58
|
if (!this.listeners.size) this.destroy();
|
|
40
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Stops observing all queries: clears all listeners and destroys every
|
|
62
|
+
* underlying `QueryObserver` this observer manages.
|
|
63
|
+
*/
|
|
41
64
|
destroy() {
|
|
42
65
|
this.listeners = /* @__PURE__ */ new Set();
|
|
43
66
|
this.#observers.forEach((observer) => {
|
|
44
67
|
observer.destroy();
|
|
45
68
|
});
|
|
46
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Replaces the set of queries being observed. Existing `QueryObserver`s
|
|
72
|
+
* are reused for queries that match an already-observed query hash;
|
|
73
|
+
* observers for queries that are no longer present are destroyed, and new
|
|
74
|
+
* observers are created and subscribed to for newly added queries.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* observer.setQueries([
|
|
79
|
+
* { queryKey: ['post', 1], queryFn: fetchPost },
|
|
80
|
+
* { queryKey: ['post', 3], queryFn: fetchPost },
|
|
81
|
+
* ])
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
47
84
|
setQueries(queries, options) {
|
|
48
85
|
this.#queries = queries;
|
|
49
86
|
this.#options = options;
|
|
@@ -84,15 +121,42 @@ var QueriesObserver = class extends require_subscribable.Subscribable {
|
|
|
84
121
|
this.#notify();
|
|
85
122
|
});
|
|
86
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Returns the most recently computed array of `QueryObserverResult`s, one
|
|
126
|
+
* per observed query, in the same order as the queries passed to the
|
|
127
|
+
* constructor or `setQueries`.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```ts
|
|
131
|
+
* const results = observer.getCurrentResult()
|
|
132
|
+
* const data = results.map((result) => result.data)
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
87
135
|
getCurrentResult() {
|
|
88
136
|
return this.#result;
|
|
89
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Returns the underlying `Query` instances currently being observed, in
|
|
140
|
+
* the same order as the queries passed to the constructor or `setQueries`.
|
|
141
|
+
*/
|
|
90
142
|
getQueries() {
|
|
91
143
|
return this.#observers.map((observer) => observer.getCurrentQuery());
|
|
92
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Returns the underlying `QueryObserver` instances this observer manages,
|
|
147
|
+
* in the same order as the queries passed to the constructor or
|
|
148
|
+
* `setQueries`.
|
|
149
|
+
*/
|
|
93
150
|
getObservers() {
|
|
94
151
|
return this.#observers;
|
|
95
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes
|
|
155
|
+
* the result for the given (already-defaulted) queries right now, synchronously. Called by
|
|
156
|
+
* framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw
|
|
157
|
+
* per-query results, a function to compute the combined result from them, and a function to
|
|
158
|
+
* wrap the results for property-access tracking.
|
|
159
|
+
*/
|
|
96
160
|
getOptimisticResult(queries, combine) {
|
|
97
161
|
const matches = this.#findMatchingObservers(queries);
|
|
98
162
|
const result = matches.map((match) => match.observer.getOptimisticResult(match.defaultedQueryOptions));
|
|
@@ -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 combine?: CombineFn<TCombinedResult>\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 destroy(): void {\n this.listeners = new Set()\n this.#observers.forEach((observer) => {\n observer.destroy()\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 getCurrentResult(): Array<QueryObserverResult> {\n return this.#result\n }\n\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery())\n }\n\n getObservers() {\n return this.#observers\n }\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","#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,21 +1,93 @@
|
|
|
1
1
|
import { t as Subscribable } from "./subscribable-CbifVTKz.cjs";
|
|
2
|
-
import { $n as Query, At as QueryObserverOptions, Pt as QueryObserverResult, on as QueryClient, rr as QueryObserver } from "./hydration-
|
|
2
|
+
import { $n as Query, At as QueryObserverOptions, Pt as QueryObserverResult, on as QueryClient, rr as QueryObserver } from "./hydration-DwR10Hi-.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
6
|
interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
7
|
+
/**
|
|
8
|
+
* A function that combines the array of `QueryObserverResult`s (one per
|
|
9
|
+
* observed query) into a single value. The combined value is memoized and
|
|
10
|
+
* only recomputed when one of the underlying results, the query hashes, or
|
|
11
|
+
* the `combine` function itself changes.
|
|
12
|
+
*
|
|
13
|
+
* Defaults to returning the array of `QueryObserverResult`s unchanged.
|
|
14
|
+
*/
|
|
7
15
|
combine?: CombineFn<TCombinedResult>;
|
|
8
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* A `QueriesObserver` watches an array of queries at once, exposing them as
|
|
19
|
+
* a single array of `QueryObserverResult`s (or, when a `combine` option is
|
|
20
|
+
* given, as a combined value derived from that array). It manages one
|
|
21
|
+
* internal `QueryObserver` per query, and is the primitive that framework
|
|
22
|
+
* adapters (e.g. `useQueries`) build their hooks on top of.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const observer = new QueriesObserver(queryClient, [
|
|
27
|
+
* { queryKey: ['post', 1], queryFn: fetchPost },
|
|
28
|
+
* { queryKey: ['post', 2], queryFn: fetchPost },
|
|
29
|
+
* ])
|
|
30
|
+
*
|
|
31
|
+
* const unsubscribe = observer.subscribe((result) => {
|
|
32
|
+
* console.log(result)
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
9
36
|
declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
10
37
|
#private;
|
|
11
38
|
constructor(client: QueryClient, queries: Array<QueryObserverOptions<any, any, any, any, any>>, options?: QueriesObserverOptions<TCombinedResult>);
|
|
12
39
|
protected onSubscribe(): void;
|
|
13
40
|
protected onUnsubscribe(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Stops observing all queries: clears all listeners and destroys every
|
|
43
|
+
* underlying `QueryObserver` this observer manages.
|
|
44
|
+
*/
|
|
14
45
|
destroy(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Replaces the set of queries being observed. Existing `QueryObserver`s
|
|
48
|
+
* are reused for queries that match an already-observed query hash;
|
|
49
|
+
* observers for queries that are no longer present are destroyed, and new
|
|
50
|
+
* observers are created and subscribed to for newly added queries.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* observer.setQueries([
|
|
55
|
+
* { queryKey: ['post', 1], queryFn: fetchPost },
|
|
56
|
+
* { queryKey: ['post', 3], queryFn: fetchPost },
|
|
57
|
+
* ])
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
15
60
|
setQueries(queries: Array<QueryObserverOptions>, options?: QueriesObserverOptions<TCombinedResult>): void;
|
|
61
|
+
/**
|
|
62
|
+
* Returns the most recently computed array of `QueryObserverResult`s, one
|
|
63
|
+
* per observed query, in the same order as the queries passed to the
|
|
64
|
+
* constructor or `setQueries`.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* const results = observer.getCurrentResult()
|
|
69
|
+
* const data = results.map((result) => result.data)
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
16
72
|
getCurrentResult(): Array<QueryObserverResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Returns the underlying `Query` instances currently being observed, in
|
|
75
|
+
* the same order as the queries passed to the constructor or `setQueries`.
|
|
76
|
+
*/
|
|
17
77
|
getQueries(): Query<unknown, Error, unknown, readonly unknown[]>[];
|
|
78
|
+
/**
|
|
79
|
+
* Returns the underlying `QueryObserver` instances this observer manages,
|
|
80
|
+
* in the same order as the queries passed to the constructor or
|
|
81
|
+
* `setQueries`.
|
|
82
|
+
*/
|
|
18
83
|
getObservers(): QueryObserver<unknown, Error, unknown, unknown, readonly unknown[]>[];
|
|
84
|
+
/**
|
|
85
|
+
* The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes
|
|
86
|
+
* the result for the given (already-defaulted) queries right now, synchronously. Called by
|
|
87
|
+
* framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw
|
|
88
|
+
* per-query results, a function to compute the combined result from them, and a function to
|
|
89
|
+
* wrap the results for property-access tracking.
|
|
90
|
+
*/
|
|
19
91
|
getOptimisticResult(queries: Array<QueryObserverOptions>, combine: CombineFn<TCombinedResult> | undefined): [rawResult: Array<QueryObserverResult>, combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult, trackResult: () => Array<QueryObserverResult>];
|
|
20
92
|
}
|
|
21
93
|
//#endregion
|
|
@@ -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;UAEY,uBACf,kBAAkB,MAAM
|
|
1
|
+
{"version":3,"file":"queriesObserver.d.cts","names":[],"sources":["../../src/queriesObserver.ts"],"mappings":";;;KAgBK,2BAA2B,QAAQ,MAAM;KAEzC,UAAU,oBACb,QAAQ,MAAM,yBACX;UAEY,uBACf,kBAAkB,MAAM;;;;;;;;;EAUxB,UAAU,UAAU;;;;;;;;;;;;;;;;;;;;;cAsBT,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,cAAU,eAAA;;;;;;EASV,gBAAY,uBAAA;;;;;;;;EAWZ,oBACE,SAAS,MAAM,uBACf,SAAS,UAAU,gCAEnB,WAAW,MAAM,sBACjB,gBAAgB,IAAI,MAAM,yBAAyB,iBACnD,mBAAmB,MAAM"}
|
|
@@ -1,21 +1,93 @@
|
|
|
1
1
|
import { t as Subscribable } from "./subscribable-CbifVTKz.js";
|
|
2
|
-
import { $n as Query, At as QueryObserverOptions, Pt as QueryObserverResult, on as QueryClient, rr as QueryObserver } from "./hydration-
|
|
2
|
+
import { $n as Query, At as QueryObserverOptions, Pt as QueryObserverResult, on as QueryClient, rr as QueryObserver } from "./hydration-Cq7QYAzB.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
6
|
interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
7
|
+
/**
|
|
8
|
+
* A function that combines the array of `QueryObserverResult`s (one per
|
|
9
|
+
* observed query) into a single value. The combined value is memoized and
|
|
10
|
+
* only recomputed when one of the underlying results, the query hashes, or
|
|
11
|
+
* the `combine` function itself changes.
|
|
12
|
+
*
|
|
13
|
+
* Defaults to returning the array of `QueryObserverResult`s unchanged.
|
|
14
|
+
*/
|
|
7
15
|
combine?: CombineFn<TCombinedResult>;
|
|
8
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* A `QueriesObserver` watches an array of queries at once, exposing them as
|
|
19
|
+
* a single array of `QueryObserverResult`s (or, when a `combine` option is
|
|
20
|
+
* given, as a combined value derived from that array). It manages one
|
|
21
|
+
* internal `QueryObserver` per query, and is the primitive that framework
|
|
22
|
+
* adapters (e.g. `useQueries`) build their hooks on top of.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const observer = new QueriesObserver(queryClient, [
|
|
27
|
+
* { queryKey: ['post', 1], queryFn: fetchPost },
|
|
28
|
+
* { queryKey: ['post', 2], queryFn: fetchPost },
|
|
29
|
+
* ])
|
|
30
|
+
*
|
|
31
|
+
* const unsubscribe = observer.subscribe((result) => {
|
|
32
|
+
* console.log(result)
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
9
36
|
declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
10
37
|
#private;
|
|
11
38
|
constructor(client: QueryClient, queries: Array<QueryObserverOptions<any, any, any, any, any>>, options?: QueriesObserverOptions<TCombinedResult>);
|
|
12
39
|
protected onSubscribe(): void;
|
|
13
40
|
protected onUnsubscribe(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Stops observing all queries: clears all listeners and destroys every
|
|
43
|
+
* underlying `QueryObserver` this observer manages.
|
|
44
|
+
*/
|
|
14
45
|
destroy(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Replaces the set of queries being observed. Existing `QueryObserver`s
|
|
48
|
+
* are reused for queries that match an already-observed query hash;
|
|
49
|
+
* observers for queries that are no longer present are destroyed, and new
|
|
50
|
+
* observers are created and subscribed to for newly added queries.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* observer.setQueries([
|
|
55
|
+
* { queryKey: ['post', 1], queryFn: fetchPost },
|
|
56
|
+
* { queryKey: ['post', 3], queryFn: fetchPost },
|
|
57
|
+
* ])
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
15
60
|
setQueries(queries: Array<QueryObserverOptions>, options?: QueriesObserverOptions<TCombinedResult>): void;
|
|
61
|
+
/**
|
|
62
|
+
* Returns the most recently computed array of `QueryObserverResult`s, one
|
|
63
|
+
* per observed query, in the same order as the queries passed to the
|
|
64
|
+
* constructor or `setQueries`.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* const results = observer.getCurrentResult()
|
|
69
|
+
* const data = results.map((result) => result.data)
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
16
72
|
getCurrentResult(): Array<QueryObserverResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Returns the underlying `Query` instances currently being observed, in
|
|
75
|
+
* the same order as the queries passed to the constructor or `setQueries`.
|
|
76
|
+
*/
|
|
17
77
|
getQueries(): Query<unknown, Error, unknown, readonly unknown[]>[];
|
|
78
|
+
/**
|
|
79
|
+
* Returns the underlying `QueryObserver` instances this observer manages,
|
|
80
|
+
* in the same order as the queries passed to the constructor or
|
|
81
|
+
* `setQueries`.
|
|
82
|
+
*/
|
|
18
83
|
getObservers(): QueryObserver<unknown, Error, unknown, unknown, readonly unknown[]>[];
|
|
84
|
+
/**
|
|
85
|
+
* The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes
|
|
86
|
+
* the result for the given (already-defaulted) queries right now, synchronously. Called by
|
|
87
|
+
* framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw
|
|
88
|
+
* per-query results, a function to compute the combined result from them, and a function to
|
|
89
|
+
* wrap the results for property-access tracking.
|
|
90
|
+
*/
|
|
19
91
|
getOptimisticResult(queries: Array<QueryObserverOptions>, combine: CombineFn<TCombinedResult> | undefined): [rawResult: Array<QueryObserverResult>, combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult, trackResult: () => Array<QueryObserverResult>];
|
|
20
92
|
}
|
|
21
93
|
//#endregion
|
|
@@ -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;UAEY,uBACf,kBAAkB,MAAM
|
|
1
|
+
{"version":3,"file":"queriesObserver.d.ts","names":[],"sources":["../../src/queriesObserver.ts"],"mappings":";;;KAgBK,2BAA2B,QAAQ,MAAM;KAEzC,UAAU,oBACb,QAAQ,MAAM,yBACX;UAEY,uBACf,kBAAkB,MAAM;;;;;;;;;EAUxB,UAAU,UAAU;;;;;;;;;;;;;;;;;;;;;cAsBT,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,cAAU,eAAA;;;;;;EASV,gBAAY,uBAAA;;;;;;;;EAWZ,oBACE,SAAS,MAAM,uBACf,SAAS,UAAU,gCAEnB,WAAW,MAAM,sBACjB,gBAAgB,IAAI,MAAM,yBAAyB,iBACnD,mBAAmB,MAAM"}
|
|
@@ -7,6 +7,25 @@ function difference(array1, array2) {
|
|
|
7
7
|
const excludeSet = new Set(array2);
|
|
8
8
|
return array1.filter((x) => !excludeSet.has(x));
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* A `QueriesObserver` watches an array of queries at once, exposing them as
|
|
12
|
+
* a single array of `QueryObserverResult`s (or, when a `combine` option is
|
|
13
|
+
* given, as a combined value derived from that array). It manages one
|
|
14
|
+
* internal `QueryObserver` per query, and is the primitive that framework
|
|
15
|
+
* adapters (e.g. `useQueries`) build their hooks on top of.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const observer = new QueriesObserver(queryClient, [
|
|
20
|
+
* { queryKey: ['post', 1], queryFn: fetchPost },
|
|
21
|
+
* { queryKey: ['post', 2], queryFn: fetchPost },
|
|
22
|
+
* ])
|
|
23
|
+
*
|
|
24
|
+
* const unsubscribe = observer.subscribe((result) => {
|
|
25
|
+
* console.log(result)
|
|
26
|
+
* })
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
10
29
|
var QueriesObserver = class extends Subscribable {
|
|
11
30
|
#client;
|
|
12
31
|
#result;
|
|
@@ -37,12 +56,30 @@ var QueriesObserver = class extends Subscribable {
|
|
|
37
56
|
onUnsubscribe() {
|
|
38
57
|
if (!this.listeners.size) this.destroy();
|
|
39
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Stops observing all queries: clears all listeners and destroys every
|
|
61
|
+
* underlying `QueryObserver` this observer manages.
|
|
62
|
+
*/
|
|
40
63
|
destroy() {
|
|
41
64
|
this.listeners = /* @__PURE__ */ new Set();
|
|
42
65
|
this.#observers.forEach((observer) => {
|
|
43
66
|
observer.destroy();
|
|
44
67
|
});
|
|
45
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Replaces the set of queries being observed. Existing `QueryObserver`s
|
|
71
|
+
* are reused for queries that match an already-observed query hash;
|
|
72
|
+
* observers for queries that are no longer present are destroyed, and new
|
|
73
|
+
* observers are created and subscribed to for newly added queries.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* observer.setQueries([
|
|
78
|
+
* { queryKey: ['post', 1], queryFn: fetchPost },
|
|
79
|
+
* { queryKey: ['post', 3], queryFn: fetchPost },
|
|
80
|
+
* ])
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
46
83
|
setQueries(queries, options) {
|
|
47
84
|
this.#queries = queries;
|
|
48
85
|
this.#options = options;
|
|
@@ -83,15 +120,42 @@ var QueriesObserver = class extends Subscribable {
|
|
|
83
120
|
this.#notify();
|
|
84
121
|
});
|
|
85
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Returns the most recently computed array of `QueryObserverResult`s, one
|
|
125
|
+
* per observed query, in the same order as the queries passed to the
|
|
126
|
+
* constructor or `setQueries`.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```ts
|
|
130
|
+
* const results = observer.getCurrentResult()
|
|
131
|
+
* const data = results.map((result) => result.data)
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
86
134
|
getCurrentResult() {
|
|
87
135
|
return this.#result;
|
|
88
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Returns the underlying `Query` instances currently being observed, in
|
|
139
|
+
* the same order as the queries passed to the constructor or `setQueries`.
|
|
140
|
+
*/
|
|
89
141
|
getQueries() {
|
|
90
142
|
return this.#observers.map((observer) => observer.getCurrentQuery());
|
|
91
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Returns the underlying `QueryObserver` instances this observer manages,
|
|
146
|
+
* in the same order as the queries passed to the constructor or
|
|
147
|
+
* `setQueries`.
|
|
148
|
+
*/
|
|
92
149
|
getObservers() {
|
|
93
150
|
return this.#observers;
|
|
94
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes
|
|
154
|
+
* the result for the given (already-defaulted) queries right now, synchronously. Called by
|
|
155
|
+
* framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw
|
|
156
|
+
* per-query results, a function to compute the combined result from them, and a function to
|
|
157
|
+
* wrap the results for property-access tracking.
|
|
158
|
+
*/
|
|
95
159
|
getOptimisticResult(queries, combine) {
|
|
96
160
|
const matches = this.#findMatchingObservers(queries);
|
|
97
161
|
const result = matches.map((match) => match.observer.getOptimisticResult(match.defaultedQueryOptions));
|
|
@@ -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 combine?: CombineFn<TCombinedResult>\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 destroy(): void {\n this.listeners = new Set()\n this.#observers.forEach((observer) => {\n observer.destroy()\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 getCurrentResult(): Array<QueryObserverResult> {\n return this.#result\n }\n\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery())\n }\n\n getObservers() {\n return this.#observers\n }\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.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":"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"}
|