@tanstack/query-core 4.35.7 → 4.39.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/lib/queryCache.d.ts +14 -4
- package/build/lib/queryClient.d.ts +83 -20
- package/build/lib/tests/queryClient.types.test.d.ts +2 -0
- package/build/lib/tests/utils.d.ts +1 -0
- package/build/lib/types.d.ts +8 -0
- package/package.json +2 -9
- package/src/mutationObserver.ts +3 -1
- package/src/queryCache.ts +37 -6
- package/src/queryClient.ts +202 -37
- package/src/tests/mutations.test.tsx +8 -0
- package/src/tests/queryClient.types.test.tsx +13 -0
- package/src/tests/utils.ts +2 -0
- package/src/types.ts +20 -0
- package/build/lib/focusManager.esm.js +0 -91
- package/build/lib/focusManager.esm.js.map +0 -1
- package/build/lib/focusManager.js +0 -96
- package/build/lib/focusManager.js.map +0 -1
- package/build/lib/focusManager.mjs +0 -91
- package/build/lib/focusManager.mjs.map +0 -1
- package/build/lib/hydration.esm.js +0 -109
- package/build/lib/hydration.esm.js.map +0 -1
- package/build/lib/hydration.js +0 -116
- package/build/lib/hydration.js.map +0 -1
- package/build/lib/hydration.mjs +0 -109
- package/build/lib/hydration.mjs.map +0 -1
- package/build/lib/index.esm.js +0 -15
- package/build/lib/index.esm.js.map +0 -1
- package/build/lib/index.js +0 -48
- package/build/lib/index.js.map +0 -1
- package/build/lib/index.mjs +0 -15
- package/build/lib/index.mjs.map +0 -1
- package/build/lib/infiniteQueryBehavior.esm.js +0 -146
- package/build/lib/infiniteQueryBehavior.esm.js.map +0 -1
- package/build/lib/infiniteQueryBehavior.js +0 -154
- package/build/lib/infiniteQueryBehavior.js.map +0 -1
- package/build/lib/infiniteQueryBehavior.mjs +0 -146
- package/build/lib/infiniteQueryBehavior.mjs.map +0 -1
- package/build/lib/infiniteQueryObserver.esm.js +0 -85
- package/build/lib/infiniteQueryObserver.esm.js.map +0 -1
- package/build/lib/infiniteQueryObserver.js +0 -89
- package/build/lib/infiniteQueryObserver.js.map +0 -1
- package/build/lib/infiniteQueryObserver.mjs +0 -85
- package/build/lib/infiniteQueryObserver.mjs.map +0 -1
- package/build/lib/logger.esm.js +0 -4
- package/build/lib/logger.esm.js.map +0 -1
- package/build/lib/logger.js +0 -8
- package/build/lib/logger.js.map +0 -1
- package/build/lib/logger.mjs +0 -4
- package/build/lib/logger.mjs.map +0 -1
- package/build/lib/logger.native.esm.js +0 -12
- package/build/lib/logger.native.esm.js.map +0 -1
- package/build/lib/logger.native.js +0 -16
- package/build/lib/logger.native.js.map +0 -1
- package/build/lib/logger.native.mjs +0 -12
- package/build/lib/logger.native.mjs.map +0 -1
- package/build/lib/mutation.esm.js +0 -261
- package/build/lib/mutation.esm.js.map +0 -1
- package/build/lib/mutation.js +0 -266
- package/build/lib/mutation.js.map +0 -1
- package/build/lib/mutation.mjs +0 -261
- package/build/lib/mutation.mjs.map +0 -1
- package/build/lib/mutationCache.esm.js +0 -93
- package/build/lib/mutationCache.esm.js.map +0 -1
- package/build/lib/mutationCache.js +0 -97
- package/build/lib/mutationCache.js.map +0 -1
- package/build/lib/mutationCache.mjs +0 -93
- package/build/lib/mutationCache.mjs.map +0 -1
- package/build/lib/mutationObserver.esm.js +0 -132
- package/build/lib/mutationObserver.esm.js.map +0 -1
- package/build/lib/mutationObserver.js +0 -136
- package/build/lib/mutationObserver.js.map +0 -1
- package/build/lib/mutationObserver.mjs +0 -132
- package/build/lib/mutationObserver.mjs.map +0 -1
- package/build/lib/notifyManager.esm.js +0 -99
- package/build/lib/notifyManager.esm.js.map +0 -1
- package/build/lib/notifyManager.js +0 -104
- package/build/lib/notifyManager.js.map +0 -1
- package/build/lib/notifyManager.mjs +0 -99
- package/build/lib/notifyManager.mjs.map +0 -1
- package/build/lib/onlineManager.esm.js +0 -93
- package/build/lib/onlineManager.esm.js.map +0 -1
- package/build/lib/onlineManager.js +0 -98
- package/build/lib/onlineManager.js.map +0 -1
- package/build/lib/onlineManager.mjs +0 -93
- package/build/lib/onlineManager.mjs.map +0 -1
- package/build/lib/queriesObserver.esm.js +0 -168
- package/build/lib/queriesObserver.esm.js.map +0 -1
- package/build/lib/queriesObserver.js +0 -172
- package/build/lib/queriesObserver.js.map +0 -1
- package/build/lib/queriesObserver.mjs +0 -168
- package/build/lib/queriesObserver.mjs.map +0 -1
- package/build/lib/query.esm.js +0 -475
- package/build/lib/query.esm.js.map +0 -1
- package/build/lib/query.js +0 -479
- package/build/lib/query.js.map +0 -1
- package/build/lib/query.mjs +0 -475
- package/build/lib/query.mjs.map +0 -1
- package/build/lib/queryCache.esm.js +0 -127
- package/build/lib/queryCache.esm.js.map +0 -1
- package/build/lib/queryCache.js +0 -131
- package/build/lib/queryCache.js.map +0 -1
- package/build/lib/queryCache.mjs +0 -127
- package/build/lib/queryCache.mjs.map +0 -1
- package/build/lib/queryClient.esm.js +0 -356
- package/build/lib/queryClient.esm.js.map +0 -1
- package/build/lib/queryClient.js +0 -360
- package/build/lib/queryClient.js.map +0 -1
- package/build/lib/queryClient.mjs +0 -356
- package/build/lib/queryClient.mjs.map +0 -1
- package/build/lib/queryObserver.esm.js +0 -580
- package/build/lib/queryObserver.esm.js.map +0 -1
- package/build/lib/queryObserver.js +0 -584
- package/build/lib/queryObserver.js.map +0 -1
- package/build/lib/queryObserver.mjs +0 -580
- package/build/lib/queryObserver.mjs.map +0 -1
- package/build/lib/removable.esm.js +0 -33
- package/build/lib/removable.esm.js.map +0 -1
- package/build/lib/removable.js +0 -37
- package/build/lib/removable.js.map +0 -1
- package/build/lib/removable.mjs +0 -33
- package/build/lib/removable.mjs.map +0 -1
- package/build/lib/retryer.esm.js +0 -167
- package/build/lib/retryer.esm.js.map +0 -1
- package/build/lib/retryer.js +0 -174
- package/build/lib/retryer.js.map +0 -1
- package/build/lib/retryer.mjs +0 -167
- package/build/lib/retryer.mjs.map +0 -1
- package/build/lib/subscribable.esm.js +0 -32
- package/build/lib/subscribable.esm.js.map +0 -1
- package/build/lib/subscribable.js +0 -36
- package/build/lib/subscribable.js.map +0 -1
- package/build/lib/subscribable.mjs +0 -32
- package/build/lib/subscribable.mjs.map +0 -1
- package/build/lib/utils.esm.js +0 -320
- package/build/lib/utils.esm.js.map +0 -1
- package/build/lib/utils.js +0 -350
- package/build/lib/utils.js.map +0 -1
- package/build/lib/utils.mjs +0 -320
- package/build/lib/utils.mjs.map +0 -1
- package/build/umd/index.development.js +0 -3307
- package/build/umd/index.development.js.map +0 -1
- package/build/umd/index.production.js +0 -2
- package/build/umd/index.production.js.map +0 -1
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { difference, replaceAt } from './utils.esm.js';
|
|
2
|
-
import { notifyManager } from './notifyManager.esm.js';
|
|
3
|
-
import { QueryObserver } from './queryObserver.esm.js';
|
|
4
|
-
import { Subscribable } from './subscribable.esm.js';
|
|
5
|
-
|
|
6
|
-
class QueriesObserver extends Subscribable {
|
|
7
|
-
constructor(client, queries) {
|
|
8
|
-
super();
|
|
9
|
-
this.client = client;
|
|
10
|
-
this.queries = [];
|
|
11
|
-
this.result = [];
|
|
12
|
-
this.observers = [];
|
|
13
|
-
this.observersMap = {};
|
|
14
|
-
|
|
15
|
-
if (queries) {
|
|
16
|
-
this.setQueries(queries);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
onSubscribe() {
|
|
21
|
-
if (this.listeners.size === 1) {
|
|
22
|
-
this.observers.forEach(observer => {
|
|
23
|
-
observer.subscribe(result => {
|
|
24
|
-
this.onUpdate(observer, result);
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
onUnsubscribe() {
|
|
31
|
-
if (!this.listeners.size) {
|
|
32
|
-
this.destroy();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
destroy() {
|
|
37
|
-
this.listeners = new Set();
|
|
38
|
-
this.observers.forEach(observer => {
|
|
39
|
-
observer.destroy();
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
setQueries(queries, notifyOptions) {
|
|
44
|
-
this.queries = queries;
|
|
45
|
-
notifyManager.batch(() => {
|
|
46
|
-
const prevObservers = this.observers;
|
|
47
|
-
const newObserverMatches = this.findMatchingObservers(this.queries); // set options for the new observers to notify of changes
|
|
48
|
-
|
|
49
|
-
newObserverMatches.forEach(match => match.observer.setOptions(match.defaultedQueryOptions, notifyOptions));
|
|
50
|
-
const newObservers = newObserverMatches.map(match => match.observer);
|
|
51
|
-
const newObserversMap = Object.fromEntries(newObservers.map(observer => [observer.options.queryHash, observer]));
|
|
52
|
-
const newResult = newObservers.map(observer => observer.getCurrentResult());
|
|
53
|
-
const hasIndexChange = newObservers.some((observer, index) => observer !== prevObservers[index]);
|
|
54
|
-
|
|
55
|
-
if (prevObservers.length === newObservers.length && !hasIndexChange) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
this.observers = newObservers;
|
|
60
|
-
this.observersMap = newObserversMap;
|
|
61
|
-
this.result = newResult;
|
|
62
|
-
|
|
63
|
-
if (!this.hasListeners()) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
difference(prevObservers, newObservers).forEach(observer => {
|
|
68
|
-
observer.destroy();
|
|
69
|
-
});
|
|
70
|
-
difference(newObservers, prevObservers).forEach(observer => {
|
|
71
|
-
observer.subscribe(result => {
|
|
72
|
-
this.onUpdate(observer, result);
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
this.notify();
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
getCurrentResult() {
|
|
80
|
-
return this.result;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
getQueries() {
|
|
84
|
-
return this.observers.map(observer => observer.getCurrentQuery());
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
getObservers() {
|
|
88
|
-
return this.observers;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
getOptimisticResult(queries) {
|
|
92
|
-
return this.findMatchingObservers(queries).map(match => match.observer.getOptimisticResult(match.defaultedQueryOptions));
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
findMatchingObservers(queries) {
|
|
96
|
-
const prevObservers = this.observers;
|
|
97
|
-
const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
|
|
98
|
-
const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));
|
|
99
|
-
const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
|
|
100
|
-
const match = prevObserversMap.get(defaultedOptions.queryHash);
|
|
101
|
-
|
|
102
|
-
if (match != null) {
|
|
103
|
-
return [{
|
|
104
|
-
defaultedQueryOptions: defaultedOptions,
|
|
105
|
-
observer: match
|
|
106
|
-
}];
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return [];
|
|
110
|
-
});
|
|
111
|
-
const matchedQueryHashes = new Set(matchingObservers.map(match => match.defaultedQueryOptions.queryHash));
|
|
112
|
-
const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.has(defaultedOptions.queryHash));
|
|
113
|
-
const matchingObserversSet = new Set(matchingObservers.map(match => match.observer));
|
|
114
|
-
const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObserversSet.has(prevObserver));
|
|
115
|
-
|
|
116
|
-
const getObserver = options => {
|
|
117
|
-
const defaultedOptions = this.client.defaultQueryOptions(options);
|
|
118
|
-
const currentObserver = this.observersMap[defaultedOptions.queryHash];
|
|
119
|
-
return currentObserver != null ? currentObserver : new QueryObserver(this.client, defaultedOptions);
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
const newOrReusedObservers = unmatchedQueries.map((options, index) => {
|
|
123
|
-
if (options.keepPreviousData) {
|
|
124
|
-
// return previous data from one of the observers that no longer match
|
|
125
|
-
const previouslyUsedObserver = unmatchedObservers[index];
|
|
126
|
-
|
|
127
|
-
if (previouslyUsedObserver !== undefined) {
|
|
128
|
-
return {
|
|
129
|
-
defaultedQueryOptions: options,
|
|
130
|
-
observer: previouslyUsedObserver
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
defaultedQueryOptions: options,
|
|
137
|
-
observer: getObserver(options)
|
|
138
|
-
};
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
const sortMatchesByOrderOfQueries = (a, b) => defaultedQueryOptions.indexOf(a.defaultedQueryOptions) - defaultedQueryOptions.indexOf(b.defaultedQueryOptions);
|
|
142
|
-
|
|
143
|
-
return matchingObservers.concat(newOrReusedObservers).sort(sortMatchesByOrderOfQueries);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
onUpdate(observer, result) {
|
|
147
|
-
const index = this.observers.indexOf(observer);
|
|
148
|
-
|
|
149
|
-
if (index !== -1) {
|
|
150
|
-
this.result = replaceAt(this.result, index, result);
|
|
151
|
-
this.notify();
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
notify() {
|
|
156
|
-
notifyManager.batch(() => {
|
|
157
|
-
this.listeners.forEach(({
|
|
158
|
-
listener
|
|
159
|
-
}) => {
|
|
160
|
-
listener(this.result);
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export { QueriesObserver };
|
|
168
|
-
//# sourceMappingURL=queriesObserver.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queriesObserver.esm.js","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\ntype QueriesObserverListener = (result: QueryObserverResult[]) => void\n\nexport class QueriesObserver extends Subscribable<QueriesObserverListener> {\n private client: QueryClient\n private result: QueryObserverResult[]\n private queries: QueryObserverOptions[]\n private observers: QueryObserver[]\n private observersMap: Record<string, QueryObserver>\n\n constructor(client: QueryClient, queries?: QueryObserverOptions[]) {\n super()\n\n this.client = client\n this.queries = []\n this.result = []\n this.observers = []\n this.observersMap = {}\n\n if (queries) {\n this.setQueries(queries)\n }\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: QueryObserverOptions[],\n notifyOptions?: NotifyOptions,\n ): void {\n this.queries = queries\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, notifyOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newObserversMap = Object.fromEntries(\n newObservers.map((observer) => [observer.options.queryHash, observer]),\n )\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n if (prevObservers.length === newObservers.length && !hasIndexChange) {\n return\n }\n\n this.observers = newObservers\n this.observersMap = newObserversMap\n this.result = newResult\n\n if (!this.hasListeners()) {\n return\n }\n\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.onUpdate(observer, result)\n })\n })\n\n this.notify()\n })\n }\n\n getCurrentResult(): 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(queries: QueryObserverOptions[]): QueryObserverResult[] {\n return this.findMatchingObservers(queries).map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n }\n\n private findMatchingObservers(\n queries: QueryObserverOptions[],\n ): QueryObserverMatch[] {\n const prevObservers = this.observers\n const prevObserversMap = new Map(\n prevObservers.map((observer) => [observer.options.queryHash, observer]),\n )\n\n const defaultedQueryOptions = queries.map((options) =>\n this.client.defaultQueryOptions(options),\n )\n\n const matchingObservers: QueryObserverMatch[] =\n defaultedQueryOptions.flatMap((defaultedOptions) => {\n const match = prevObserversMap.get(defaultedOptions.queryHash)\n if (match != null) {\n return [{ defaultedQueryOptions: defaultedOptions, observer: match }]\n }\n return []\n })\n\n const matchedQueryHashes = new Set(\n matchingObservers.map((match) => match.defaultedQueryOptions.queryHash),\n )\n const unmatchedQueries = defaultedQueryOptions.filter(\n (defaultedOptions) => !matchedQueryHashes.has(defaultedOptions.queryHash),\n )\n\n const matchingObserversSet = new Set(\n matchingObservers.map((match) => match.observer),\n )\n const unmatchedObservers = prevObservers.filter(\n (prevObserver) => !matchingObserversSet.has(prevObserver),\n )\n\n const getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.client.defaultQueryOptions(options)\n const currentObserver = this.observersMap[defaultedOptions.queryHash!]\n return currentObserver ?? new QueryObserver(this.client, defaultedOptions)\n }\n\n const newOrReusedObservers: QueryObserverMatch[] = unmatchedQueries.map(\n (options, index) => {\n if (options.keepPreviousData) {\n // return previous data from one of the observers that no longer match\n const previouslyUsedObserver = unmatchedObservers[index]\n if (previouslyUsedObserver !== undefined) {\n return {\n defaultedQueryOptions: options,\n observer: previouslyUsedObserver,\n }\n }\n }\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\n }\n },\n )\n\n const sortMatchesByOrderOfQueries = (\n a: QueryObserverMatch,\n b: QueryObserverMatch,\n ): number =>\n defaultedQueryOptions.indexOf(a.defaultedQueryOptions) -\n defaultedQueryOptions.indexOf(b.defaultedQueryOptions)\n\n return matchingObservers\n .concat(newOrReusedObservers)\n .sort(sortMatchesByOrderOfQueries)\n }\n\n private onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.observers.indexOf(observer)\n if (index !== -1) {\n this.result = replaceAt(this.result, index, result)\n this.notify()\n }\n }\n\n private notify(): void {\n notifyManager.batch(() => {\n this.listeners.forEach(({ listener }) => {\n listener(this.result)\n })\n })\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"names":["QueriesObserver","Subscribable","constructor","client","queries","result","observers","observersMap","setQueries","onSubscribe","listeners","size","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","Set","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","length","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","prevObserversMap","Map","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","get","matchedQueryHashes","unmatchedQueries","filter","has","matchingObserversSet","unmatchedObservers","prevObserver","getObserver","currentObserver","QueryObserver","newOrReusedObservers","keepPreviousData","previouslyUsedObserver","undefined","sortMatchesByOrderOfQueries","a","b","indexOf","concat","sort","replaceAt","listener"],"mappings":"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"}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var utils = require('./utils.js');
|
|
6
|
-
var notifyManager = require('./notifyManager.js');
|
|
7
|
-
var queryObserver = require('./queryObserver.js');
|
|
8
|
-
var subscribable = require('./subscribable.js');
|
|
9
|
-
|
|
10
|
-
class QueriesObserver extends subscribable.Subscribable {
|
|
11
|
-
constructor(client, queries) {
|
|
12
|
-
super();
|
|
13
|
-
this.client = client;
|
|
14
|
-
this.queries = [];
|
|
15
|
-
this.result = [];
|
|
16
|
-
this.observers = [];
|
|
17
|
-
this.observersMap = {};
|
|
18
|
-
|
|
19
|
-
if (queries) {
|
|
20
|
-
this.setQueries(queries);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
onSubscribe() {
|
|
25
|
-
if (this.listeners.size === 1) {
|
|
26
|
-
this.observers.forEach(observer => {
|
|
27
|
-
observer.subscribe(result => {
|
|
28
|
-
this.onUpdate(observer, result);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
onUnsubscribe() {
|
|
35
|
-
if (!this.listeners.size) {
|
|
36
|
-
this.destroy();
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
destroy() {
|
|
41
|
-
this.listeners = new Set();
|
|
42
|
-
this.observers.forEach(observer => {
|
|
43
|
-
observer.destroy();
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
setQueries(queries, notifyOptions) {
|
|
48
|
-
this.queries = queries;
|
|
49
|
-
notifyManager.notifyManager.batch(() => {
|
|
50
|
-
const prevObservers = this.observers;
|
|
51
|
-
const newObserverMatches = this.findMatchingObservers(this.queries); // set options for the new observers to notify of changes
|
|
52
|
-
|
|
53
|
-
newObserverMatches.forEach(match => match.observer.setOptions(match.defaultedQueryOptions, notifyOptions));
|
|
54
|
-
const newObservers = newObserverMatches.map(match => match.observer);
|
|
55
|
-
const newObserversMap = Object.fromEntries(newObservers.map(observer => [observer.options.queryHash, observer]));
|
|
56
|
-
const newResult = newObservers.map(observer => observer.getCurrentResult());
|
|
57
|
-
const hasIndexChange = newObservers.some((observer, index) => observer !== prevObservers[index]);
|
|
58
|
-
|
|
59
|
-
if (prevObservers.length === newObservers.length && !hasIndexChange) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
this.observers = newObservers;
|
|
64
|
-
this.observersMap = newObserversMap;
|
|
65
|
-
this.result = newResult;
|
|
66
|
-
|
|
67
|
-
if (!this.hasListeners()) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
utils.difference(prevObservers, newObservers).forEach(observer => {
|
|
72
|
-
observer.destroy();
|
|
73
|
-
});
|
|
74
|
-
utils.difference(newObservers, prevObservers).forEach(observer => {
|
|
75
|
-
observer.subscribe(result => {
|
|
76
|
-
this.onUpdate(observer, result);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
this.notify();
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
getCurrentResult() {
|
|
84
|
-
return this.result;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
getQueries() {
|
|
88
|
-
return this.observers.map(observer => observer.getCurrentQuery());
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
getObservers() {
|
|
92
|
-
return this.observers;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
getOptimisticResult(queries) {
|
|
96
|
-
return this.findMatchingObservers(queries).map(match => match.observer.getOptimisticResult(match.defaultedQueryOptions));
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
findMatchingObservers(queries) {
|
|
100
|
-
const prevObservers = this.observers;
|
|
101
|
-
const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
|
|
102
|
-
const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));
|
|
103
|
-
const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
|
|
104
|
-
const match = prevObserversMap.get(defaultedOptions.queryHash);
|
|
105
|
-
|
|
106
|
-
if (match != null) {
|
|
107
|
-
return [{
|
|
108
|
-
defaultedQueryOptions: defaultedOptions,
|
|
109
|
-
observer: match
|
|
110
|
-
}];
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return [];
|
|
114
|
-
});
|
|
115
|
-
const matchedQueryHashes = new Set(matchingObservers.map(match => match.defaultedQueryOptions.queryHash));
|
|
116
|
-
const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.has(defaultedOptions.queryHash));
|
|
117
|
-
const matchingObserversSet = new Set(matchingObservers.map(match => match.observer));
|
|
118
|
-
const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObserversSet.has(prevObserver));
|
|
119
|
-
|
|
120
|
-
const getObserver = options => {
|
|
121
|
-
const defaultedOptions = this.client.defaultQueryOptions(options);
|
|
122
|
-
const currentObserver = this.observersMap[defaultedOptions.queryHash];
|
|
123
|
-
return currentObserver != null ? currentObserver : new queryObserver.QueryObserver(this.client, defaultedOptions);
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
const newOrReusedObservers = unmatchedQueries.map((options, index) => {
|
|
127
|
-
if (options.keepPreviousData) {
|
|
128
|
-
// return previous data from one of the observers that no longer match
|
|
129
|
-
const previouslyUsedObserver = unmatchedObservers[index];
|
|
130
|
-
|
|
131
|
-
if (previouslyUsedObserver !== undefined) {
|
|
132
|
-
return {
|
|
133
|
-
defaultedQueryOptions: options,
|
|
134
|
-
observer: previouslyUsedObserver
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
defaultedQueryOptions: options,
|
|
141
|
-
observer: getObserver(options)
|
|
142
|
-
};
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
const sortMatchesByOrderOfQueries = (a, b) => defaultedQueryOptions.indexOf(a.defaultedQueryOptions) - defaultedQueryOptions.indexOf(b.defaultedQueryOptions);
|
|
146
|
-
|
|
147
|
-
return matchingObservers.concat(newOrReusedObservers).sort(sortMatchesByOrderOfQueries);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
onUpdate(observer, result) {
|
|
151
|
-
const index = this.observers.indexOf(observer);
|
|
152
|
-
|
|
153
|
-
if (index !== -1) {
|
|
154
|
-
this.result = utils.replaceAt(this.result, index, result);
|
|
155
|
-
this.notify();
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
notify() {
|
|
160
|
-
notifyManager.notifyManager.batch(() => {
|
|
161
|
-
this.listeners.forEach(({
|
|
162
|
-
listener
|
|
163
|
-
}) => {
|
|
164
|
-
listener(this.result);
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
exports.QueriesObserver = QueriesObserver;
|
|
172
|
-
//# sourceMappingURL=queriesObserver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queriesObserver.js","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\ntype QueriesObserverListener = (result: QueryObserverResult[]) => void\n\nexport class QueriesObserver extends Subscribable<QueriesObserverListener> {\n private client: QueryClient\n private result: QueryObserverResult[]\n private queries: QueryObserverOptions[]\n private observers: QueryObserver[]\n private observersMap: Record<string, QueryObserver>\n\n constructor(client: QueryClient, queries?: QueryObserverOptions[]) {\n super()\n\n this.client = client\n this.queries = []\n this.result = []\n this.observers = []\n this.observersMap = {}\n\n if (queries) {\n this.setQueries(queries)\n }\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: QueryObserverOptions[],\n notifyOptions?: NotifyOptions,\n ): void {\n this.queries = queries\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, notifyOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newObserversMap = Object.fromEntries(\n newObservers.map((observer) => [observer.options.queryHash, observer]),\n )\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n if (prevObservers.length === newObservers.length && !hasIndexChange) {\n return\n }\n\n this.observers = newObservers\n this.observersMap = newObserversMap\n this.result = newResult\n\n if (!this.hasListeners()) {\n return\n }\n\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.onUpdate(observer, result)\n })\n })\n\n this.notify()\n })\n }\n\n getCurrentResult(): 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(queries: QueryObserverOptions[]): QueryObserverResult[] {\n return this.findMatchingObservers(queries).map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n }\n\n private findMatchingObservers(\n queries: QueryObserverOptions[],\n ): QueryObserverMatch[] {\n const prevObservers = this.observers\n const prevObserversMap = new Map(\n prevObservers.map((observer) => [observer.options.queryHash, observer]),\n )\n\n const defaultedQueryOptions = queries.map((options) =>\n this.client.defaultQueryOptions(options),\n )\n\n const matchingObservers: QueryObserverMatch[] =\n defaultedQueryOptions.flatMap((defaultedOptions) => {\n const match = prevObserversMap.get(defaultedOptions.queryHash)\n if (match != null) {\n return [{ defaultedQueryOptions: defaultedOptions, observer: match }]\n }\n return []\n })\n\n const matchedQueryHashes = new Set(\n matchingObservers.map((match) => match.defaultedQueryOptions.queryHash),\n )\n const unmatchedQueries = defaultedQueryOptions.filter(\n (defaultedOptions) => !matchedQueryHashes.has(defaultedOptions.queryHash),\n )\n\n const matchingObserversSet = new Set(\n matchingObservers.map((match) => match.observer),\n )\n const unmatchedObservers = prevObservers.filter(\n (prevObserver) => !matchingObserversSet.has(prevObserver),\n )\n\n const getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.client.defaultQueryOptions(options)\n const currentObserver = this.observersMap[defaultedOptions.queryHash!]\n return currentObserver ?? new QueryObserver(this.client, defaultedOptions)\n }\n\n const newOrReusedObservers: QueryObserverMatch[] = unmatchedQueries.map(\n (options, index) => {\n if (options.keepPreviousData) {\n // return previous data from one of the observers that no longer match\n const previouslyUsedObserver = unmatchedObservers[index]\n if (previouslyUsedObserver !== undefined) {\n return {\n defaultedQueryOptions: options,\n observer: previouslyUsedObserver,\n }\n }\n }\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\n }\n },\n )\n\n const sortMatchesByOrderOfQueries = (\n a: QueryObserverMatch,\n b: QueryObserverMatch,\n ): number =>\n defaultedQueryOptions.indexOf(a.defaultedQueryOptions) -\n defaultedQueryOptions.indexOf(b.defaultedQueryOptions)\n\n return matchingObservers\n .concat(newOrReusedObservers)\n .sort(sortMatchesByOrderOfQueries)\n }\n\n private onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.observers.indexOf(observer)\n if (index !== -1) {\n this.result = replaceAt(this.result, index, result)\n this.notify()\n }\n }\n\n private notify(): void {\n notifyManager.batch(() => {\n this.listeners.forEach(({ listener }) => {\n listener(this.result)\n })\n })\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"names":["QueriesObserver","Subscribable","constructor","client","queries","result","observers","observersMap","setQueries","onSubscribe","listeners","size","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","Set","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","length","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","prevObserversMap","Map","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","get","matchedQueryHashes","unmatchedQueries","filter","has","matchingObserversSet","unmatchedObservers","prevObserver","getObserver","currentObserver","QueryObserver","newOrReusedObservers","keepPreviousData","previouslyUsedObserver","undefined","sortMatchesByOrderOfQueries","a","b","indexOf","concat","sort","replaceAt","listener"],"mappings":"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"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { difference, replaceAt } from './utils.mjs';
|
|
2
|
-
import { notifyManager } from './notifyManager.mjs';
|
|
3
|
-
import { QueryObserver } from './queryObserver.mjs';
|
|
4
|
-
import { Subscribable } from './subscribable.mjs';
|
|
5
|
-
|
|
6
|
-
class QueriesObserver extends Subscribable {
|
|
7
|
-
constructor(client, queries) {
|
|
8
|
-
super();
|
|
9
|
-
this.client = client;
|
|
10
|
-
this.queries = [];
|
|
11
|
-
this.result = [];
|
|
12
|
-
this.observers = [];
|
|
13
|
-
this.observersMap = {};
|
|
14
|
-
|
|
15
|
-
if (queries) {
|
|
16
|
-
this.setQueries(queries);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
onSubscribe() {
|
|
21
|
-
if (this.listeners.size === 1) {
|
|
22
|
-
this.observers.forEach(observer => {
|
|
23
|
-
observer.subscribe(result => {
|
|
24
|
-
this.onUpdate(observer, result);
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
onUnsubscribe() {
|
|
31
|
-
if (!this.listeners.size) {
|
|
32
|
-
this.destroy();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
destroy() {
|
|
37
|
-
this.listeners = new Set();
|
|
38
|
-
this.observers.forEach(observer => {
|
|
39
|
-
observer.destroy();
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
setQueries(queries, notifyOptions) {
|
|
44
|
-
this.queries = queries;
|
|
45
|
-
notifyManager.batch(() => {
|
|
46
|
-
const prevObservers = this.observers;
|
|
47
|
-
const newObserverMatches = this.findMatchingObservers(this.queries); // set options for the new observers to notify of changes
|
|
48
|
-
|
|
49
|
-
newObserverMatches.forEach(match => match.observer.setOptions(match.defaultedQueryOptions, notifyOptions));
|
|
50
|
-
const newObservers = newObserverMatches.map(match => match.observer);
|
|
51
|
-
const newObserversMap = Object.fromEntries(newObservers.map(observer => [observer.options.queryHash, observer]));
|
|
52
|
-
const newResult = newObservers.map(observer => observer.getCurrentResult());
|
|
53
|
-
const hasIndexChange = newObservers.some((observer, index) => observer !== prevObservers[index]);
|
|
54
|
-
|
|
55
|
-
if (prevObservers.length === newObservers.length && !hasIndexChange) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
this.observers = newObservers;
|
|
60
|
-
this.observersMap = newObserversMap;
|
|
61
|
-
this.result = newResult;
|
|
62
|
-
|
|
63
|
-
if (!this.hasListeners()) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
difference(prevObservers, newObservers).forEach(observer => {
|
|
68
|
-
observer.destroy();
|
|
69
|
-
});
|
|
70
|
-
difference(newObservers, prevObservers).forEach(observer => {
|
|
71
|
-
observer.subscribe(result => {
|
|
72
|
-
this.onUpdate(observer, result);
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
this.notify();
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
getCurrentResult() {
|
|
80
|
-
return this.result;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
getQueries() {
|
|
84
|
-
return this.observers.map(observer => observer.getCurrentQuery());
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
getObservers() {
|
|
88
|
-
return this.observers;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
getOptimisticResult(queries) {
|
|
92
|
-
return this.findMatchingObservers(queries).map(match => match.observer.getOptimisticResult(match.defaultedQueryOptions));
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
findMatchingObservers(queries) {
|
|
96
|
-
const prevObservers = this.observers;
|
|
97
|
-
const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
|
|
98
|
-
const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));
|
|
99
|
-
const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
|
|
100
|
-
const match = prevObserversMap.get(defaultedOptions.queryHash);
|
|
101
|
-
|
|
102
|
-
if (match != null) {
|
|
103
|
-
return [{
|
|
104
|
-
defaultedQueryOptions: defaultedOptions,
|
|
105
|
-
observer: match
|
|
106
|
-
}];
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return [];
|
|
110
|
-
});
|
|
111
|
-
const matchedQueryHashes = new Set(matchingObservers.map(match => match.defaultedQueryOptions.queryHash));
|
|
112
|
-
const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.has(defaultedOptions.queryHash));
|
|
113
|
-
const matchingObserversSet = new Set(matchingObservers.map(match => match.observer));
|
|
114
|
-
const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObserversSet.has(prevObserver));
|
|
115
|
-
|
|
116
|
-
const getObserver = options => {
|
|
117
|
-
const defaultedOptions = this.client.defaultQueryOptions(options);
|
|
118
|
-
const currentObserver = this.observersMap[defaultedOptions.queryHash];
|
|
119
|
-
return currentObserver != null ? currentObserver : new QueryObserver(this.client, defaultedOptions);
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
const newOrReusedObservers = unmatchedQueries.map((options, index) => {
|
|
123
|
-
if (options.keepPreviousData) {
|
|
124
|
-
// return previous data from one of the observers that no longer match
|
|
125
|
-
const previouslyUsedObserver = unmatchedObservers[index];
|
|
126
|
-
|
|
127
|
-
if (previouslyUsedObserver !== undefined) {
|
|
128
|
-
return {
|
|
129
|
-
defaultedQueryOptions: options,
|
|
130
|
-
observer: previouslyUsedObserver
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
defaultedQueryOptions: options,
|
|
137
|
-
observer: getObserver(options)
|
|
138
|
-
};
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
const sortMatchesByOrderOfQueries = (a, b) => defaultedQueryOptions.indexOf(a.defaultedQueryOptions) - defaultedQueryOptions.indexOf(b.defaultedQueryOptions);
|
|
142
|
-
|
|
143
|
-
return matchingObservers.concat(newOrReusedObservers).sort(sortMatchesByOrderOfQueries);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
onUpdate(observer, result) {
|
|
147
|
-
const index = this.observers.indexOf(observer);
|
|
148
|
-
|
|
149
|
-
if (index !== -1) {
|
|
150
|
-
this.result = replaceAt(this.result, index, result);
|
|
151
|
-
this.notify();
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
notify() {
|
|
156
|
-
notifyManager.batch(() => {
|
|
157
|
-
this.listeners.forEach(({
|
|
158
|
-
listener
|
|
159
|
-
}) => {
|
|
160
|
-
listener(this.result);
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export { QueriesObserver };
|
|
168
|
-
//# sourceMappingURL=queriesObserver.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queriesObserver.mjs","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\ntype QueriesObserverListener = (result: QueryObserverResult[]) => void\n\nexport class QueriesObserver extends Subscribable<QueriesObserverListener> {\n private client: QueryClient\n private result: QueryObserverResult[]\n private queries: QueryObserverOptions[]\n private observers: QueryObserver[]\n private observersMap: Record<string, QueryObserver>\n\n constructor(client: QueryClient, queries?: QueryObserverOptions[]) {\n super()\n\n this.client = client\n this.queries = []\n this.result = []\n this.observers = []\n this.observersMap = {}\n\n if (queries) {\n this.setQueries(queries)\n }\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: QueryObserverOptions[],\n notifyOptions?: NotifyOptions,\n ): void {\n this.queries = queries\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, notifyOptions),\n )\n\n const newObservers = newObserverMatches.map((match) => match.observer)\n const newObserversMap = Object.fromEntries(\n newObservers.map((observer) => [observer.options.queryHash, observer]),\n )\n const newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n if (prevObservers.length === newObservers.length && !hasIndexChange) {\n return\n }\n\n this.observers = newObservers\n this.observersMap = newObserversMap\n this.result = newResult\n\n if (!this.hasListeners()) {\n return\n }\n\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy()\n })\n\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.onUpdate(observer, result)\n })\n })\n\n this.notify()\n })\n }\n\n getCurrentResult(): 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(queries: QueryObserverOptions[]): QueryObserverResult[] {\n return this.findMatchingObservers(queries).map((match) =>\n match.observer.getOptimisticResult(match.defaultedQueryOptions),\n )\n }\n\n private findMatchingObservers(\n queries: QueryObserverOptions[],\n ): QueryObserverMatch[] {\n const prevObservers = this.observers\n const prevObserversMap = new Map(\n prevObservers.map((observer) => [observer.options.queryHash, observer]),\n )\n\n const defaultedQueryOptions = queries.map((options) =>\n this.client.defaultQueryOptions(options),\n )\n\n const matchingObservers: QueryObserverMatch[] =\n defaultedQueryOptions.flatMap((defaultedOptions) => {\n const match = prevObserversMap.get(defaultedOptions.queryHash)\n if (match != null) {\n return [{ defaultedQueryOptions: defaultedOptions, observer: match }]\n }\n return []\n })\n\n const matchedQueryHashes = new Set(\n matchingObservers.map((match) => match.defaultedQueryOptions.queryHash),\n )\n const unmatchedQueries = defaultedQueryOptions.filter(\n (defaultedOptions) => !matchedQueryHashes.has(defaultedOptions.queryHash),\n )\n\n const matchingObserversSet = new Set(\n matchingObservers.map((match) => match.observer),\n )\n const unmatchedObservers = prevObservers.filter(\n (prevObserver) => !matchingObserversSet.has(prevObserver),\n )\n\n const getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.client.defaultQueryOptions(options)\n const currentObserver = this.observersMap[defaultedOptions.queryHash!]\n return currentObserver ?? new QueryObserver(this.client, defaultedOptions)\n }\n\n const newOrReusedObservers: QueryObserverMatch[] = unmatchedQueries.map(\n (options, index) => {\n if (options.keepPreviousData) {\n // return previous data from one of the observers that no longer match\n const previouslyUsedObserver = unmatchedObservers[index]\n if (previouslyUsedObserver !== undefined) {\n return {\n defaultedQueryOptions: options,\n observer: previouslyUsedObserver,\n }\n }\n }\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\n }\n },\n )\n\n const sortMatchesByOrderOfQueries = (\n a: QueryObserverMatch,\n b: QueryObserverMatch,\n ): number =>\n defaultedQueryOptions.indexOf(a.defaultedQueryOptions) -\n defaultedQueryOptions.indexOf(b.defaultedQueryOptions)\n\n return matchingObservers\n .concat(newOrReusedObservers)\n .sort(sortMatchesByOrderOfQueries)\n }\n\n private onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.observers.indexOf(observer)\n if (index !== -1) {\n this.result = replaceAt(this.result, index, result)\n this.notify()\n }\n }\n\n private notify(): void {\n notifyManager.batch(() => {\n this.listeners.forEach(({ listener }) => {\n listener(this.result)\n })\n })\n }\n}\n\ntype QueryObserverMatch = {\n defaultedQueryOptions: DefaultedQueryObserverOptions\n observer: QueryObserver\n}\n"],"names":["QueriesObserver","Subscribable","constructor","client","queries","result","observers","observersMap","setQueries","onSubscribe","listeners","size","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","Set","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","length","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","prevObserversMap","Map","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","get","matchedQueryHashes","unmatchedQueries","filter","has","matchingObserversSet","unmatchedObservers","prevObserver","getObserver","currentObserver","QueryObserver","newOrReusedObservers","keepPreviousData","previouslyUsedObserver","undefined","sortMatchesByOrderOfQueries","a","b","indexOf","concat","sort","replaceAt","listener"],"mappings":"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"}
|