@tanstack/query-core 5.17.1 → 5.17.3
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/queriesObserver.cjs +5 -6
- package/build/legacy/queriesObserver.cjs.map +1 -1
- package/build/legacy/queriesObserver.d.cts +3 -2
- package/build/legacy/queriesObserver.d.ts +3 -2
- package/build/legacy/queriesObserver.js +5 -6
- package/build/legacy/queriesObserver.js.map +1 -1
- package/build/modern/queriesObserver.cjs +4 -5
- package/build/modern/queriesObserver.cjs.map +1 -1
- package/build/modern/queriesObserver.d.cts +3 -2
- package/build/modern/queriesObserver.d.ts +3 -2
- package/build/modern/queriesObserver.js +4 -5
- package/build/modern/queriesObserver.js.map +1 -1
- package/package.json +1 -1
- package/src/queriesObserver.ts +12 -5
|
@@ -142,7 +142,7 @@ var QueriesObserver = class extends import_subscribable.Subscribable {
|
|
|
142
142
|
getObservers() {
|
|
143
143
|
return __privateGet(this, _observers);
|
|
144
144
|
}
|
|
145
|
-
getOptimisticResult(queries) {
|
|
145
|
+
getOptimisticResult(queries, combine) {
|
|
146
146
|
const matches = __privateMethod(this, _findMatchingObservers, findMatchingObservers_fn).call(this, queries);
|
|
147
147
|
const result = matches.map(
|
|
148
148
|
(match) => match.observer.getOptimisticResult(match.defaultedQueryOptions)
|
|
@@ -150,7 +150,7 @@ var QueriesObserver = class extends import_subscribable.Subscribable {
|
|
|
150
150
|
return [
|
|
151
151
|
result,
|
|
152
152
|
(r) => {
|
|
153
|
-
return __privateMethod(this, _combineResult, combineResult_fn).call(this, r ?? result);
|
|
153
|
+
return __privateMethod(this, _combineResult, combineResult_fn).call(this, r ?? result, combine);
|
|
154
154
|
},
|
|
155
155
|
() => {
|
|
156
156
|
return matches.map((match, index) => {
|
|
@@ -169,13 +169,12 @@ _options = new WeakMap();
|
|
|
169
169
|
_combinedResult = new WeakMap();
|
|
170
170
|
_setResult = new WeakSet();
|
|
171
171
|
setResult_fn = function(value) {
|
|
172
|
+
var _a;
|
|
172
173
|
__privateSet(this, _result, value);
|
|
173
|
-
__privateSet(this, _combinedResult, __privateMethod(this, _combineResult, combineResult_fn).call(this, value));
|
|
174
|
+
__privateSet(this, _combinedResult, __privateMethod(this, _combineResult, combineResult_fn).call(this, value, (_a = __privateGet(this, _options)) == null ? void 0 : _a.combine));
|
|
174
175
|
};
|
|
175
176
|
_combineResult = new WeakSet();
|
|
176
|
-
combineResult_fn = function(input) {
|
|
177
|
-
var _a;
|
|
178
|
-
const combine = (_a = __privateGet(this, _options)) == null ? void 0 : _a.combine;
|
|
177
|
+
combineResult_fn = function(input, combine) {
|
|
179
178
|
if (combine) {
|
|
180
179
|
return (0, import_utils.replaceEqualDeep)(__privateGet(this, _combinedResult), combine(input));
|
|
181
180
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n return array1.filter((x) => !array2.includes(x))\n}\n\nfunction replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {\n const copy = array.slice(0)\n copy[index] = value\n return copy\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\nexport interface QueriesObserverOptions<\n TCombinedResult = Array<QueryObserverResult>,\n> {\n combine?: (result: Array<QueryObserverResult>) => 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 #observers: Array<QueryObserver>\n #options?: QueriesObserverOptions<TCombinedResult>\n #combinedResult!: TCombinedResult\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#observers = []\n\n this.#setResult([])\n this.setQueries(queries, options)\n }\n\n #setResult(value: Array<QueryObserverResult>) {\n this.#result = value\n this.#combinedResult = this.#combineResult(value)\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 notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n this.#options = options\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 newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n\n if (\n prevObservers.length === newObservers.length &&\n !hasIndexChange &&\n newObservers.length > 0\n ) {\n return\n }\n\n this.#observers = newObservers\n this.#setResult(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(): TCombinedResult {\n return this.#combinedResult\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 ): [\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\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result)\n },\n () => {\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult)\n : observerResult\n })\n },\n ]\n }\n\n #combineResult(input: Array<QueryObserverResult>): TCombinedResult {\n const combine = this.#options?.combine\n if (combine) {\n return replaceEqualDeep(this.#combinedResult, combine(input))\n }\n return input as any\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<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: Array<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 getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: Array<QueryObserverMatch> =\n unmatchedQueries.map((options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\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 #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#setResult(replaceAt(this.#result, index, result))\n this.#notify()\n }\n }\n\n #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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n return array1.filter((x) => !array2.includes(x))\n}\n\nfunction replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {\n const copy = array.slice(0)\n copy[index] = value\n return copy\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 #observers: Array<QueryObserver>\n #options?: QueriesObserverOptions<TCombinedResult>\n #combinedResult!: TCombinedResult\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#observers = []\n\n this.#setResult([])\n this.setQueries(queries, options)\n }\n\n #setResult(value: Array<QueryObserverResult>) {\n this.#result = value\n this.#combinedResult = this.#combineResult(value, this.#options?.combine)\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 notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n this.#options = options\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 newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n\n if (\n prevObservers.length === newObservers.length &&\n !hasIndexChange &&\n newObservers.length > 0\n ) {\n return\n }\n\n this.#observers = newObservers\n this.#setResult(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(): TCombinedResult {\n return this.#combinedResult\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\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result, combine)\n },\n () => {\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult)\n : observerResult\n })\n },\n ]\n }\n\n #combineResult(\n input: Array<QueryObserverResult>,\n combine: CombineFn<TCombinedResult> | undefined,\n ): TCombinedResult {\n if (combine) {\n return replaceEqualDeep(this.#combinedResult, combine(input))\n }\n return input as any\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<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: Array<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 getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: Array<QueryObserverMatch> =\n unmatchedQueries.map((options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\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 #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#setResult(replaceAt(this.#result, index, result))\n this.#notify()\n }\n }\n\n #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"],"mappings":"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","names":[]}
|
|
@@ -3,8 +3,9 @@ import { Subscribable } from './subscribable.cjs';
|
|
|
3
3
|
import './removable.cjs';
|
|
4
4
|
|
|
5
5
|
type QueriesObserverListener = (result: Array<QueryObserverResult>) => void;
|
|
6
|
+
type CombineFn<TCombinedResult> = (result: Array<QueryObserverResult>) => TCombinedResult;
|
|
6
7
|
interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
7
|
-
combine?:
|
|
8
|
+
combine?: CombineFn<TCombinedResult>;
|
|
8
9
|
}
|
|
9
10
|
declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
10
11
|
#private;
|
|
@@ -16,7 +17,7 @@ declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> exte
|
|
|
16
17
|
getCurrentResult(): TCombinedResult;
|
|
17
18
|
getQueries(): Query<unknown, Error, unknown, QueryKey>[];
|
|
18
19
|
getObservers(): QueryObserver<unknown, Error, unknown, unknown, QueryKey>[];
|
|
19
|
-
getOptimisticResult(queries: Array<QueryObserverOptions>): [
|
|
20
|
+
getOptimisticResult(queries: Array<QueryObserverOptions>, combine: CombineFn<TCombinedResult> | undefined): [
|
|
20
21
|
rawResult: Array<QueryObserverResult>,
|
|
21
22
|
combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,
|
|
22
23
|
trackResult: () => Array<QueryObserverResult>
|
|
@@ -3,8 +3,9 @@ import { Subscribable } from './subscribable.js';
|
|
|
3
3
|
import './removable.js';
|
|
4
4
|
|
|
5
5
|
type QueriesObserverListener = (result: Array<QueryObserverResult>) => void;
|
|
6
|
+
type CombineFn<TCombinedResult> = (result: Array<QueryObserverResult>) => TCombinedResult;
|
|
6
7
|
interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
7
|
-
combine?:
|
|
8
|
+
combine?: CombineFn<TCombinedResult>;
|
|
8
9
|
}
|
|
9
10
|
declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
10
11
|
#private;
|
|
@@ -16,7 +17,7 @@ declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> exte
|
|
|
16
17
|
getCurrentResult(): TCombinedResult;
|
|
17
18
|
getQueries(): Query<unknown, Error, unknown, QueryKey>[];
|
|
18
19
|
getObservers(): QueryObserver<unknown, Error, unknown, unknown, QueryKey>[];
|
|
19
|
-
getOptimisticResult(queries: Array<QueryObserverOptions>): [
|
|
20
|
+
getOptimisticResult(queries: Array<QueryObserverOptions>, combine: CombineFn<TCombinedResult> | undefined): [
|
|
20
21
|
rawResult: Array<QueryObserverResult>,
|
|
21
22
|
combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,
|
|
22
23
|
trackResult: () => Array<QueryObserverResult>
|
|
@@ -103,7 +103,7 @@ var QueriesObserver = class extends Subscribable {
|
|
|
103
103
|
getObservers() {
|
|
104
104
|
return __privateGet(this, _observers);
|
|
105
105
|
}
|
|
106
|
-
getOptimisticResult(queries) {
|
|
106
|
+
getOptimisticResult(queries, combine) {
|
|
107
107
|
const matches = __privateMethod(this, _findMatchingObservers, findMatchingObservers_fn).call(this, queries);
|
|
108
108
|
const result = matches.map(
|
|
109
109
|
(match) => match.observer.getOptimisticResult(match.defaultedQueryOptions)
|
|
@@ -111,7 +111,7 @@ var QueriesObserver = class extends Subscribable {
|
|
|
111
111
|
return [
|
|
112
112
|
result,
|
|
113
113
|
(r) => {
|
|
114
|
-
return __privateMethod(this, _combineResult, combineResult_fn).call(this, r ?? result);
|
|
114
|
+
return __privateMethod(this, _combineResult, combineResult_fn).call(this, r ?? result, combine);
|
|
115
115
|
},
|
|
116
116
|
() => {
|
|
117
117
|
return matches.map((match, index) => {
|
|
@@ -130,13 +130,12 @@ _options = new WeakMap();
|
|
|
130
130
|
_combinedResult = new WeakMap();
|
|
131
131
|
_setResult = new WeakSet();
|
|
132
132
|
setResult_fn = function(value) {
|
|
133
|
+
var _a;
|
|
133
134
|
__privateSet(this, _result, value);
|
|
134
|
-
__privateSet(this, _combinedResult, __privateMethod(this, _combineResult, combineResult_fn).call(this, value));
|
|
135
|
+
__privateSet(this, _combinedResult, __privateMethod(this, _combineResult, combineResult_fn).call(this, value, (_a = __privateGet(this, _options)) == null ? void 0 : _a.combine));
|
|
135
136
|
};
|
|
136
137
|
_combineResult = new WeakSet();
|
|
137
|
-
combineResult_fn = function(input) {
|
|
138
|
-
var _a;
|
|
139
|
-
const combine = (_a = __privateGet(this, _options)) == null ? void 0 : _a.combine;
|
|
138
|
+
combineResult_fn = function(input, combine) {
|
|
140
139
|
if (combine) {
|
|
141
140
|
return replaceEqualDeep(__privateGet(this, _combinedResult), combine(input));
|
|
142
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n return array1.filter((x) => !array2.includes(x))\n}\n\nfunction replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {\n const copy = array.slice(0)\n copy[index] = value\n return copy\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\nexport interface QueriesObserverOptions<\n TCombinedResult = Array<QueryObserverResult>,\n> {\n combine?: (result: Array<QueryObserverResult>) => 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 #observers: Array<QueryObserver>\n #options?: QueriesObserverOptions<TCombinedResult>\n #combinedResult!: TCombinedResult\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#observers = []\n\n this.#setResult([])\n this.setQueries(queries, options)\n }\n\n #setResult(value: Array<QueryObserverResult>) {\n this.#result = value\n this.#combinedResult = this.#combineResult(value)\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 notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n this.#options = options\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 newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n\n if (\n prevObservers.length === newObservers.length &&\n !hasIndexChange &&\n newObservers.length > 0\n ) {\n return\n }\n\n this.#observers = newObservers\n this.#setResult(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(): TCombinedResult {\n return this.#combinedResult\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 ): [\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\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result)\n },\n () => {\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult)\n : observerResult\n })\n },\n ]\n }\n\n #combineResult(input: Array<QueryObserverResult>): TCombinedResult {\n const combine = this.#options?.combine\n if (combine) {\n return replaceEqualDeep(this.#combinedResult, combine(input))\n }\n return input as any\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<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: Array<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 getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: Array<QueryObserverMatch> =\n unmatchedQueries.map((options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\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 #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#setResult(replaceAt(this.#result, index, result))\n this.#notify()\n }\n }\n\n #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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n return array1.filter((x) => !array2.includes(x))\n}\n\nfunction replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {\n const copy = array.slice(0)\n copy[index] = value\n return copy\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 #observers: Array<QueryObserver>\n #options?: QueriesObserverOptions<TCombinedResult>\n #combinedResult!: TCombinedResult\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#observers = []\n\n this.#setResult([])\n this.setQueries(queries, options)\n }\n\n #setResult(value: Array<QueryObserverResult>) {\n this.#result = value\n this.#combinedResult = this.#combineResult(value, this.#options?.combine)\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 notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n this.#options = options\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 newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n\n if (\n prevObservers.length === newObservers.length &&\n !hasIndexChange &&\n newObservers.length > 0\n ) {\n return\n }\n\n this.#observers = newObservers\n this.#setResult(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(): TCombinedResult {\n return this.#combinedResult\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\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result, combine)\n },\n () => {\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult)\n : observerResult\n })\n },\n ]\n }\n\n #combineResult(\n input: Array<QueryObserverResult>,\n combine: CombineFn<TCombinedResult> | undefined,\n ): TCombinedResult {\n if (combine) {\n return replaceEqualDeep(this.#combinedResult, combine(input))\n }\n return input as any\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<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: Array<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 getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: Array<QueryObserverMatch> =\n unmatchedQueries.map((options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\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 #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#setResult(replaceAt(this.#result, index, result))\n this.#notify()\n }\n }\n\n #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"],"mappings":";;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AASjC,SAAS,WAAc,QAAkB,QAA4B;AACnE,SAAO,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;AACjD;AAEA,SAAS,UAAa,OAAiB,OAAe,OAAoB;AACxE,QAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,OAAK,KAAK,IAAI;AACd,SAAO;AACT;AApBA;AAkCO,IAAM,kBAAN,cAEG,aAAsC;AAAA,EAQ9C,YACE,QACA,SACA,SACA;AACA,UAAM;AAUR;AA6HA;AAUA;AA0DA;AAQA;AA/NA;AACA;AACA;AACA;AACA;AACA;AASE,uBAAK,SAAU;AACf,uBAAK,UAAW,CAAC;AACjB,uBAAK,YAAa,CAAC;AAEnB,0BAAK,0BAAL,WAAgB,CAAC;AACjB,SAAK,WAAW,SAAS,OAAO;AAAA,EAClC;AAAA,EAOU,cAAoB;AAC5B,QAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,yBAAK,YAAW,QAAQ,CAAC,aAAa;AACpC,iBAAS,UAAU,CAAC,WAAW;AAC7B,gCAAK,wBAAL,WAAe,UAAU;AAAA,QAC3B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEU,gBAAsB;AAC9B,QAAI,CAAC,KAAK,UAAU,MAAM;AACxB,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,YAAY,oBAAI,IAAI;AACzB,uBAAK,YAAW,QAAQ,CAAC,aAAa;AACpC,eAAS,QAAQ;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,WACE,SACA,SACA,eACM;AACN,uBAAK,UAAW;AAChB,uBAAK,UAAW;AAEhB,kBAAc,MAAM,MAAM;AACxB,YAAM,gBAAgB,mBAAK;AAE3B,YAAM,qBAAqB,sBAAK,kDAAL,WAA4B,mBAAK;AAG5D,yBAAmB;AAAA,QAAQ,CAAC,UAC1B,MAAM,SAAS,WAAW,MAAM,uBAAuB,aAAa;AAAA,MACtE;AAEA,YAAM,eAAe,mBAAmB,IAAI,CAAC,UAAU,MAAM,QAAQ;AACrE,YAAM,YAAY,aAAa;AAAA,QAAI,CAAC,aAClC,SAAS,iBAAiB;AAAA,MAC5B;AAEA,YAAM,iBAAiB,aAAa;AAAA,QAClC,CAAC,UAAU,UAAU,aAAa,cAAc,KAAK;AAAA,MACvD;AAEA,UACE,cAAc,WAAW,aAAa,UACtC,CAAC,kBACD,aAAa,SAAS,GACtB;AACA;AAAA,MACF;AAEA,yBAAK,YAAa;AAClB,4BAAK,0BAAL,WAAgB;AAEhB,UAAI,CAAC,KAAK,aAAa,GAAG;AACxB;AAAA,MACF;AAEA,iBAAW,eAAe,YAAY,EAAE,QAAQ,CAAC,aAAa;AAC5D,iBAAS,QAAQ;AAAA,MACnB,CAAC;AAED,iBAAW,cAAc,aAAa,EAAE,QAAQ,CAAC,aAAa;AAC5D,iBAAS,UAAU,CAAC,WAAW;AAC7B,gCAAK,wBAAL,WAAe,UAAU;AAAA,QAC3B,CAAC;AAAA,MACH,CAAC;AAED,4BAAK,oBAAL;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,mBAAoC;AAClC,WAAO,mBAAK;AAAA,EACd;AAAA,EAEA,aAAa;AACX,WAAO,mBAAK,YAAW,IAAI,CAAC,aAAa,SAAS,gBAAgB,CAAC;AAAA,EACrE;AAAA,EAEA,eAAe;AACb,WAAO,mBAAK;AAAA,EACd;AAAA,EAEA,oBACE,SACA,SAKA;AACA,UAAM,UAAU,sBAAK,kDAAL,WAA4B;AAC5C,UAAM,SAAS,QAAQ;AAAA,MAAI,CAAC,UAC1B,MAAM,SAAS,oBAAoB,MAAM,qBAAqB;AAAA,IAChE;AAEA,WAAO;AAAA,MACL;AAAA,MACA,CAAC,MAAmC;AAClC,eAAO,sBAAK,kCAAL,WAAoB,KAAK,QAAQ;AAAA,MAC1C;AAAA,MACA,MAAM;AACJ,eAAO,QAAQ,IAAI,CAAC,OAAO,UAAU;AACnC,gBAAM,iBAAiB,OAAO,KAAK;AACnC,iBAAO,CAAC,MAAM,sBAAsB,sBAChC,MAAM,SAAS,YAAY,cAAc,IACzC;AAAA,QACN,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAqFF;AAtOE;AACA;AACA;AACA;AACA;AACA;AAiBA;AAAA,eAAU,SAAC,OAAmC;AA3DhD;AA4DI,qBAAK,SAAU;AACf,qBAAK,iBAAkB,sBAAK,kCAAL,WAAoB,QAAO,wBAAK,cAAL,mBAAe;AACnE;AA0HA;AAAA,mBAAc,SACZ,OACA,SACiB;AACjB,MAAI,SAAS;AACX,WAAO,iBAAiB,mBAAK,kBAAiB,QAAQ,KAAK,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AAEA;AAAA,2BAAsB,SACpB,SAC2B;AAC3B,QAAM,gBAAgB,mBAAK;AAC3B,QAAM,mBAAmB,IAAI;AAAA,IAC3B,cAAc,IAAI,CAAC,aAAa,CAAC,SAAS,QAAQ,WAAW,QAAQ,CAAC;AAAA,EACxE;AAEA,QAAM,wBAAwB,QAAQ;AAAA,IAAI,CAAC,YACzC,mBAAK,SAAQ,oBAAoB,OAAO;AAAA,EAC1C;AAEA,QAAM,oBACJ,sBAAsB,QAAQ,CAAC,qBAAqB;AAClD,UAAM,QAAQ,iBAAiB,IAAI,iBAAiB,SAAS;AAC7D,QAAI,SAAS,MAAM;AACjB,aAAO,CAAC,EAAE,uBAAuB,kBAAkB,UAAU,MAAM,CAAC;AAAA,IACtE;AACA,WAAO,CAAC;AAAA,EACV,CAAC;AAEH,QAAM,qBAAqB,IAAI;AAAA,IAC7B,kBAAkB,IAAI,CAAC,UAAU,MAAM,sBAAsB,SAAS;AAAA,EACxE;AACA,QAAM,mBAAmB,sBAAsB;AAAA,IAC7C,CAAC,qBAAqB,CAAC,mBAAmB,IAAI,iBAAiB,SAAS;AAAA,EAC1E;AAEA,QAAM,cAAc,CAAC,YAAiD;AACpE,UAAM,mBAAmB,mBAAK,SAAQ,oBAAoB,OAAO;AACjE,UAAM,kBAAkB,mBAAK,YAAW;AAAA,MACtC,CAAC,MAAM,EAAE,QAAQ,cAAc,iBAAiB;AAAA,IAClD;AACA,WACE,mBAAmB,IAAI,cAAc,mBAAK,UAAS,gBAAgB;AAAA,EAEvE;AAEA,QAAM,uBACJ,iBAAiB,IAAI,CAAC,YAAY;AAChC,WAAO;AAAA,MACL,uBAAuB;AAAA,MACvB,UAAU,YAAY,OAAO;AAAA,IAC/B;AAAA,EACF,CAAC;AAEH,QAAM,8BAA8B,CAClC,GACA,MAEA,sBAAsB,QAAQ,EAAE,qBAAqB,IACrD,sBAAsB,QAAQ,EAAE,qBAAqB;AAEvD,SAAO,kBACJ,OAAO,oBAAoB,EAC3B,KAAK,2BAA2B;AACrC;AAEA;AAAA,cAAS,SAAC,UAAyB,QAAmC;AACpE,QAAM,QAAQ,mBAAK,YAAW,QAAQ,QAAQ;AAC9C,MAAI,UAAU,IAAI;AAChB,0BAAK,0BAAL,WAAgB,UAAU,mBAAK,UAAS,OAAO,MAAM;AACrD,0BAAK,oBAAL;AAAA,EACF;AACF;AAEA;AAAA,YAAO,WAAS;AACd,gBAAc,MAAM,MAAM;AACxB,SAAK,UAAU,QAAQ,CAAC,aAAa;AACnC,eAAS,mBAAK,QAAO;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;","names":[]}
|
|
@@ -52,7 +52,7 @@ var QueriesObserver = class extends import_subscribable.Subscribable {
|
|
|
52
52
|
}
|
|
53
53
|
#setResult(value) {
|
|
54
54
|
this.#result = value;
|
|
55
|
-
this.#combinedResult = this.#combineResult(value);
|
|
55
|
+
this.#combinedResult = this.#combineResult(value, this.#options?.combine);
|
|
56
56
|
}
|
|
57
57
|
onSubscribe() {
|
|
58
58
|
if (this.listeners.size === 1) {
|
|
@@ -118,7 +118,7 @@ var QueriesObserver = class extends import_subscribable.Subscribable {
|
|
|
118
118
|
getObservers() {
|
|
119
119
|
return this.#observers;
|
|
120
120
|
}
|
|
121
|
-
getOptimisticResult(queries) {
|
|
121
|
+
getOptimisticResult(queries, combine) {
|
|
122
122
|
const matches = this.#findMatchingObservers(queries);
|
|
123
123
|
const result = matches.map(
|
|
124
124
|
(match) => match.observer.getOptimisticResult(match.defaultedQueryOptions)
|
|
@@ -126,7 +126,7 @@ var QueriesObserver = class extends import_subscribable.Subscribable {
|
|
|
126
126
|
return [
|
|
127
127
|
result,
|
|
128
128
|
(r) => {
|
|
129
|
-
return this.#combineResult(r ?? result);
|
|
129
|
+
return this.#combineResult(r ?? result, combine);
|
|
130
130
|
},
|
|
131
131
|
() => {
|
|
132
132
|
return matches.map((match, index) => {
|
|
@@ -136,8 +136,7 @@ var QueriesObserver = class extends import_subscribable.Subscribable {
|
|
|
136
136
|
}
|
|
137
137
|
];
|
|
138
138
|
}
|
|
139
|
-
#combineResult(input) {
|
|
140
|
-
const combine = this.#options?.combine;
|
|
139
|
+
#combineResult(input, combine) {
|
|
141
140
|
if (combine) {
|
|
142
141
|
return (0, import_utils.replaceEqualDeep)(this.#combinedResult, combine(input));
|
|
143
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n return array1.filter((x) => !array2.includes(x))\n}\n\nfunction replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {\n const copy = array.slice(0)\n copy[index] = value\n return copy\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\nexport interface QueriesObserverOptions<\n TCombinedResult = Array<QueryObserverResult>,\n> {\n combine?: (result: Array<QueryObserverResult>) => 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 #observers: Array<QueryObserver>\n #options?: QueriesObserverOptions<TCombinedResult>\n #combinedResult!: TCombinedResult\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#observers = []\n\n this.#setResult([])\n this.setQueries(queries, options)\n }\n\n #setResult(value: Array<QueryObserverResult>) {\n this.#result = value\n this.#combinedResult = this.#combineResult(value)\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 notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n this.#options = options\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 newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n\n if (\n prevObservers.length === newObservers.length &&\n !hasIndexChange &&\n newObservers.length > 0\n ) {\n return\n }\n\n this.#observers = newObservers\n this.#setResult(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(): TCombinedResult {\n return this.#combinedResult\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 ): [\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\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result)\n },\n () => {\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult)\n : observerResult\n })\n },\n ]\n }\n\n #combineResult(input: Array<QueryObserverResult>): TCombinedResult {\n const combine = this.#options?.combine\n if (combine) {\n return replaceEqualDeep(this.#combinedResult, combine(input))\n }\n return input as any\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<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: Array<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 getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: Array<QueryObserverMatch> =\n unmatchedQueries.map((options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\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 #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#setResult(replaceAt(this.#result, index, result))\n this.#notify()\n }\n }\n\n #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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n return array1.filter((x) => !array2.includes(x))\n}\n\nfunction replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {\n const copy = array.slice(0)\n copy[index] = value\n return copy\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 #observers: Array<QueryObserver>\n #options?: QueriesObserverOptions<TCombinedResult>\n #combinedResult!: TCombinedResult\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#observers = []\n\n this.#setResult([])\n this.setQueries(queries, options)\n }\n\n #setResult(value: Array<QueryObserverResult>) {\n this.#result = value\n this.#combinedResult = this.#combineResult(value, this.#options?.combine)\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 notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n this.#options = options\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 newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n\n if (\n prevObservers.length === newObservers.length &&\n !hasIndexChange &&\n newObservers.length > 0\n ) {\n return\n }\n\n this.#observers = newObservers\n this.#setResult(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(): TCombinedResult {\n return this.#combinedResult\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\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result, combine)\n },\n () => {\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult)\n : observerResult\n })\n },\n ]\n }\n\n #combineResult(\n input: Array<QueryObserverResult>,\n combine: CombineFn<TCombinedResult> | undefined,\n ): TCombinedResult {\n if (combine) {\n return replaceEqualDeep(this.#combinedResult, combine(input))\n }\n return input as any\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<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: Array<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 getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: Array<QueryObserverMatch> =\n unmatchedQueries.map((options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\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 #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#setResult(replaceAt(this.#result, index, result))\n this.#notify()\n }\n }\n\n #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"],"mappings":"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","names":[]}
|
|
@@ -3,8 +3,9 @@ import { Subscribable } from './subscribable.cjs';
|
|
|
3
3
|
import './removable.cjs';
|
|
4
4
|
|
|
5
5
|
type QueriesObserverListener = (result: Array<QueryObserverResult>) => void;
|
|
6
|
+
type CombineFn<TCombinedResult> = (result: Array<QueryObserverResult>) => TCombinedResult;
|
|
6
7
|
interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
7
|
-
combine?:
|
|
8
|
+
combine?: CombineFn<TCombinedResult>;
|
|
8
9
|
}
|
|
9
10
|
declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
10
11
|
#private;
|
|
@@ -16,7 +17,7 @@ declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> exte
|
|
|
16
17
|
getCurrentResult(): TCombinedResult;
|
|
17
18
|
getQueries(): Query<unknown, Error, unknown, QueryKey>[];
|
|
18
19
|
getObservers(): QueryObserver<unknown, Error, unknown, unknown, QueryKey>[];
|
|
19
|
-
getOptimisticResult(queries: Array<QueryObserverOptions>): [
|
|
20
|
+
getOptimisticResult(queries: Array<QueryObserverOptions>, combine: CombineFn<TCombinedResult> | undefined): [
|
|
20
21
|
rawResult: Array<QueryObserverResult>,
|
|
21
22
|
combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,
|
|
22
23
|
trackResult: () => Array<QueryObserverResult>
|
|
@@ -3,8 +3,9 @@ import { Subscribable } from './subscribable.js';
|
|
|
3
3
|
import './removable.js';
|
|
4
4
|
|
|
5
5
|
type QueriesObserverListener = (result: Array<QueryObserverResult>) => void;
|
|
6
|
+
type CombineFn<TCombinedResult> = (result: Array<QueryObserverResult>) => TCombinedResult;
|
|
6
7
|
interface QueriesObserverOptions<TCombinedResult = Array<QueryObserverResult>> {
|
|
7
|
-
combine?:
|
|
8
|
+
combine?: CombineFn<TCombinedResult>;
|
|
8
9
|
}
|
|
9
10
|
declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> extends Subscribable<QueriesObserverListener> {
|
|
10
11
|
#private;
|
|
@@ -16,7 +17,7 @@ declare class QueriesObserver<TCombinedResult = Array<QueryObserverResult>> exte
|
|
|
16
17
|
getCurrentResult(): TCombinedResult;
|
|
17
18
|
getQueries(): Query<unknown, Error, unknown, QueryKey>[];
|
|
18
19
|
getObservers(): QueryObserver<unknown, Error, unknown, unknown, QueryKey>[];
|
|
19
|
-
getOptimisticResult(queries: Array<QueryObserverOptions>): [
|
|
20
|
+
getOptimisticResult(queries: Array<QueryObserverOptions>, combine: CombineFn<TCombinedResult> | undefined): [
|
|
20
21
|
rawResult: Array<QueryObserverResult>,
|
|
21
22
|
combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,
|
|
22
23
|
trackResult: () => Array<QueryObserverResult>
|
|
@@ -28,7 +28,7 @@ var QueriesObserver = class extends Subscribable {
|
|
|
28
28
|
}
|
|
29
29
|
#setResult(value) {
|
|
30
30
|
this.#result = value;
|
|
31
|
-
this.#combinedResult = this.#combineResult(value);
|
|
31
|
+
this.#combinedResult = this.#combineResult(value, this.#options?.combine);
|
|
32
32
|
}
|
|
33
33
|
onSubscribe() {
|
|
34
34
|
if (this.listeners.size === 1) {
|
|
@@ -94,7 +94,7 @@ var QueriesObserver = class extends Subscribable {
|
|
|
94
94
|
getObservers() {
|
|
95
95
|
return this.#observers;
|
|
96
96
|
}
|
|
97
|
-
getOptimisticResult(queries) {
|
|
97
|
+
getOptimisticResult(queries, combine) {
|
|
98
98
|
const matches = this.#findMatchingObservers(queries);
|
|
99
99
|
const result = matches.map(
|
|
100
100
|
(match) => match.observer.getOptimisticResult(match.defaultedQueryOptions)
|
|
@@ -102,7 +102,7 @@ var QueriesObserver = class extends Subscribable {
|
|
|
102
102
|
return [
|
|
103
103
|
result,
|
|
104
104
|
(r) => {
|
|
105
|
-
return this.#combineResult(r ?? result);
|
|
105
|
+
return this.#combineResult(r ?? result, combine);
|
|
106
106
|
},
|
|
107
107
|
() => {
|
|
108
108
|
return matches.map((match, index) => {
|
|
@@ -112,8 +112,7 @@ var QueriesObserver = class extends Subscribable {
|
|
|
112
112
|
}
|
|
113
113
|
];
|
|
114
114
|
}
|
|
115
|
-
#combineResult(input) {
|
|
116
|
-
const combine = this.#options?.combine;
|
|
115
|
+
#combineResult(input, combine) {
|
|
117
116
|
if (combine) {
|
|
118
117
|
return replaceEqualDeep(this.#combinedResult, combine(input));
|
|
119
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n return array1.filter((x) => !array2.includes(x))\n}\n\nfunction replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {\n const copy = array.slice(0)\n copy[index] = value\n return copy\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\nexport interface QueriesObserverOptions<\n TCombinedResult = Array<QueryObserverResult>,\n> {\n combine?: (result: Array<QueryObserverResult>) => 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 #observers: Array<QueryObserver>\n #options?: QueriesObserverOptions<TCombinedResult>\n #combinedResult!: TCombinedResult\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#observers = []\n\n this.#setResult([])\n this.setQueries(queries, options)\n }\n\n #setResult(value: Array<QueryObserverResult>) {\n this.#result = value\n this.#combinedResult = this.#combineResult(value)\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 notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n this.#options = options\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 newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n\n if (\n prevObservers.length === newObservers.length &&\n !hasIndexChange &&\n newObservers.length > 0\n ) {\n return\n }\n\n this.#observers = newObservers\n this.#setResult(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(): TCombinedResult {\n return this.#combinedResult\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 ): [\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\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result)\n },\n () => {\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult)\n : observerResult\n })\n },\n ]\n }\n\n #combineResult(input: Array<QueryObserverResult>): TCombinedResult {\n const combine = this.#options?.combine\n if (combine) {\n return replaceEqualDeep(this.#combinedResult, combine(input))\n }\n return input as any\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<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: Array<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 getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: Array<QueryObserverMatch> =\n unmatchedQueries.map((options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\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 #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#setResult(replaceAt(this.#result, index, result))\n this.#notify()\n }\n }\n\n #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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\nimport type {\n DefaultedQueryObserverOptions,\n QueryObserverOptions,\n QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n return array1.filter((x) => !array2.includes(x))\n}\n\nfunction replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {\n const copy = array.slice(0)\n copy[index] = value\n return copy\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 #observers: Array<QueryObserver>\n #options?: QueriesObserverOptions<TCombinedResult>\n #combinedResult!: TCombinedResult\n\n constructor(\n client: QueryClient,\n queries: Array<QueryObserverOptions>,\n options?: QueriesObserverOptions<TCombinedResult>,\n ) {\n super()\n\n this.#client = client\n this.#queries = []\n this.#observers = []\n\n this.#setResult([])\n this.setQueries(queries, options)\n }\n\n #setResult(value: Array<QueryObserverResult>) {\n this.#result = value\n this.#combinedResult = this.#combineResult(value, this.#options?.combine)\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 notifyOptions?: NotifyOptions,\n ): void {\n this.#queries = queries\n this.#options = options\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 newResult = newObservers.map((observer) =>\n observer.getCurrentResult(),\n )\n\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index],\n )\n\n if (\n prevObservers.length === newObservers.length &&\n !hasIndexChange &&\n newObservers.length > 0\n ) {\n return\n }\n\n this.#observers = newObservers\n this.#setResult(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(): TCombinedResult {\n return this.#combinedResult\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\n return [\n result,\n (r?: Array<QueryObserverResult>) => {\n return this.#combineResult(r ?? result, combine)\n },\n () => {\n return matches.map((match, index) => {\n const observerResult = result[index]!\n return !match.defaultedQueryOptions.notifyOnChangeProps\n ? match.observer.trackResult(observerResult)\n : observerResult\n })\n },\n ]\n }\n\n #combineResult(\n input: Array<QueryObserverResult>,\n combine: CombineFn<TCombinedResult> | undefined,\n ): TCombinedResult {\n if (combine) {\n return replaceEqualDeep(this.#combinedResult, combine(input))\n }\n return input as any\n }\n\n #findMatchingObservers(\n queries: Array<QueryObserverOptions>,\n ): Array<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: Array<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 getObserver = (options: QueryObserverOptions): QueryObserver => {\n const defaultedOptions = this.#client.defaultQueryOptions(options)\n const currentObserver = this.#observers.find(\n (o) => o.options.queryHash === defaultedOptions.queryHash,\n )\n return (\n currentObserver ?? new QueryObserver(this.#client, defaultedOptions)\n )\n }\n\n const newOrReusedObservers: Array<QueryObserverMatch> =\n unmatchedQueries.map((options) => {\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options),\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 #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n const index = this.#observers.indexOf(observer)\n if (index !== -1) {\n this.#setResult(replaceAt(this.#result, index, result))\n this.#notify()\n }\n }\n\n #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"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
package/src/queriesObserver.ts
CHANGED
|
@@ -22,10 +22,14 @@ function replaceAt<T>(array: Array<T>, index: number, value: T): Array<T> {
|
|
|
22
22
|
|
|
23
23
|
type QueriesObserverListener = (result: Array<QueryObserverResult>) => void
|
|
24
24
|
|
|
25
|
+
type CombineFn<TCombinedResult> = (
|
|
26
|
+
result: Array<QueryObserverResult>,
|
|
27
|
+
) => TCombinedResult
|
|
28
|
+
|
|
25
29
|
export interface QueriesObserverOptions<
|
|
26
30
|
TCombinedResult = Array<QueryObserverResult>,
|
|
27
31
|
> {
|
|
28
|
-
combine?:
|
|
32
|
+
combine?: CombineFn<TCombinedResult>
|
|
29
33
|
}
|
|
30
34
|
|
|
31
35
|
export class QueriesObserver<
|
|
@@ -55,7 +59,7 @@ export class QueriesObserver<
|
|
|
55
59
|
|
|
56
60
|
#setResult(value: Array<QueryObserverResult>) {
|
|
57
61
|
this.#result = value
|
|
58
|
-
this.#combinedResult = this.#combineResult(value)
|
|
62
|
+
this.#combinedResult = this.#combineResult(value, this.#options?.combine)
|
|
59
63
|
}
|
|
60
64
|
|
|
61
65
|
protected onSubscribe(): void {
|
|
@@ -151,6 +155,7 @@ export class QueriesObserver<
|
|
|
151
155
|
|
|
152
156
|
getOptimisticResult(
|
|
153
157
|
queries: Array<QueryObserverOptions>,
|
|
158
|
+
combine: CombineFn<TCombinedResult> | undefined,
|
|
154
159
|
): [
|
|
155
160
|
rawResult: Array<QueryObserverResult>,
|
|
156
161
|
combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,
|
|
@@ -164,7 +169,7 @@ export class QueriesObserver<
|
|
|
164
169
|
return [
|
|
165
170
|
result,
|
|
166
171
|
(r?: Array<QueryObserverResult>) => {
|
|
167
|
-
return this.#combineResult(r ?? result)
|
|
172
|
+
return this.#combineResult(r ?? result, combine)
|
|
168
173
|
},
|
|
169
174
|
() => {
|
|
170
175
|
return matches.map((match, index) => {
|
|
@@ -177,8 +182,10 @@ export class QueriesObserver<
|
|
|
177
182
|
]
|
|
178
183
|
}
|
|
179
184
|
|
|
180
|
-
#combineResult(
|
|
181
|
-
|
|
185
|
+
#combineResult(
|
|
186
|
+
input: Array<QueryObserverResult>,
|
|
187
|
+
combine: CombineFn<TCombinedResult> | undefined,
|
|
188
|
+
): TCombinedResult {
|
|
182
189
|
if (combine) {
|
|
183
190
|
return replaceEqualDeep(this.#combinedResult, combine(input))
|
|
184
191
|
}
|