@tanstack/query-core 4.27.0 → 4.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -94,9 +94,10 @@ class QueriesObserver extends Subscribable {
94
94
 
95
95
  findMatchingObservers(queries) {
96
96
  const prevObservers = this.observers;
97
+ const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
97
98
  const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));
98
99
  const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
99
- const match = prevObservers.find(observer => observer.options.queryHash === defaultedOptions.queryHash);
100
+ const match = prevObserversMap.get(defaultedOptions.queryHash);
100
101
 
101
102
  if (match != null) {
102
103
  return [{
@@ -107,9 +108,10 @@ class QueriesObserver extends Subscribable {
107
108
 
108
109
  return [];
109
110
  });
110
- const matchedQueryHashes = matchingObservers.map(match => match.defaultedQueryOptions.queryHash);
111
- const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.includes(defaultedOptions.queryHash));
112
- const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObservers.some(match => match.observer === prevObserver));
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));
113
115
 
114
116
  const getObserver = options => {
115
117
  const defaultedOptions = this.client.defaultQueryOptions(options);
@@ -1 +1 @@
1
- {"version":3,"file":"queriesObserver.esm.js","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport type {\n QueryObserverOptions,\n QueryObserverResult,\n DefaultedQueryObserverOptions,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\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.length === 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.length) {\n this.destroy()\n }\n }\n\n destroy(): void {\n this.listeners = []\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 defaultedQueryOptions = queries.map((options) =>\n this.client.defaultQueryOptions(options),\n )\n\n const matchingObservers: QueryObserverMatch[] =\n defaultedQueryOptions.flatMap((defaultedOptions) => {\n const match = prevObservers.find(\n (observer) =>\n observer.options.queryHash === defaultedOptions.queryHash,\n )\n if (match != null) {\n return [{ defaultedQueryOptions: defaultedOptions, observer: match }]\n }\n return []\n })\n\n const matchedQueryHashes = matchingObservers.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n const unmatchedQueries = defaultedQueryOptions.filter(\n (defaultedOptions) =>\n !matchedQueryHashes.includes(defaultedOptions.queryHash),\n )\n\n const unmatchedObservers = prevObservers.filter(\n (prevObserver) =>\n !matchingObservers.some((match) => match.observer === 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","length","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","find","matchedQueryHashes","unmatchedQueries","filter","includes","unmatchedObservers","prevObserver","getObserver","currentObserver","QueryObserver","newOrReusedObservers","keepPreviousData","previouslyUsedObserver","undefined","sortMatchesByOrderOfQueries","a","b","indexOf","concat","sort","replaceAt","listener"],"mappings":"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"}
1
+ {"version":3,"file":"queriesObserver.esm.js","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport type {\n QueryObserverOptions,\n QueryObserverResult,\n DefaultedQueryObserverOptions,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\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.length === 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.length) {\n this.destroy()\n }\n }\n\n destroy(): void {\n this.listeners = []\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","length","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","prevObserversMap","Map","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","get","matchedQueryHashes","Set","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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"}
@@ -98,9 +98,10 @@ class QueriesObserver extends subscribable.Subscribable {
98
98
 
99
99
  findMatchingObservers(queries) {
100
100
  const prevObservers = this.observers;
101
+ const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
101
102
  const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));
102
103
  const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
103
- const match = prevObservers.find(observer => observer.options.queryHash === defaultedOptions.queryHash);
104
+ const match = prevObserversMap.get(defaultedOptions.queryHash);
104
105
 
105
106
  if (match != null) {
106
107
  return [{
@@ -111,9 +112,10 @@ class QueriesObserver extends subscribable.Subscribable {
111
112
 
112
113
  return [];
113
114
  });
114
- const matchedQueryHashes = matchingObservers.map(match => match.defaultedQueryOptions.queryHash);
115
- const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.includes(defaultedOptions.queryHash));
116
- const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObservers.some(match => match.observer === prevObserver));
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));
117
119
 
118
120
  const getObserver = options => {
119
121
  const defaultedOptions = this.client.defaultQueryOptions(options);
@@ -1 +1 @@
1
- {"version":3,"file":"queriesObserver.js","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport type {\n QueryObserverOptions,\n QueryObserverResult,\n DefaultedQueryObserverOptions,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\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.length === 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.length) {\n this.destroy()\n }\n }\n\n destroy(): void {\n this.listeners = []\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 defaultedQueryOptions = queries.map((options) =>\n this.client.defaultQueryOptions(options),\n )\n\n const matchingObservers: QueryObserverMatch[] =\n defaultedQueryOptions.flatMap((defaultedOptions) => {\n const match = prevObservers.find(\n (observer) =>\n observer.options.queryHash === defaultedOptions.queryHash,\n )\n if (match != null) {\n return [{ defaultedQueryOptions: defaultedOptions, observer: match }]\n }\n return []\n })\n\n const matchedQueryHashes = matchingObservers.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n const unmatchedQueries = defaultedQueryOptions.filter(\n (defaultedOptions) =>\n !matchedQueryHashes.includes(defaultedOptions.queryHash),\n )\n\n const unmatchedObservers = prevObservers.filter(\n (prevObserver) =>\n !matchingObservers.some((match) => match.observer === 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","length","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","find","matchedQueryHashes","unmatchedQueries","filter","includes","unmatchedObservers","prevObserver","getObserver","currentObserver","QueryObserver","newOrReusedObservers","keepPreviousData","previouslyUsedObserver","undefined","sortMatchesByOrderOfQueries","a","b","indexOf","concat","sort","replaceAt","listener"],"mappings":"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"}
1
+ {"version":3,"file":"queriesObserver.js","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport type {\n QueryObserverOptions,\n QueryObserverResult,\n DefaultedQueryObserverOptions,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\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.length === 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.length) {\n this.destroy()\n }\n }\n\n destroy(): void {\n this.listeners = []\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","length","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","prevObserversMap","Map","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","get","matchedQueryHashes","Set","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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"}
@@ -94,9 +94,10 @@ class QueriesObserver extends Subscribable {
94
94
 
95
95
  findMatchingObservers(queries) {
96
96
  const prevObservers = this.observers;
97
+ const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
97
98
  const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));
98
99
  const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
99
- const match = prevObservers.find(observer => observer.options.queryHash === defaultedOptions.queryHash);
100
+ const match = prevObserversMap.get(defaultedOptions.queryHash);
100
101
 
101
102
  if (match != null) {
102
103
  return [{
@@ -107,9 +108,10 @@ class QueriesObserver extends Subscribable {
107
108
 
108
109
  return [];
109
110
  });
110
- const matchedQueryHashes = matchingObservers.map(match => match.defaultedQueryOptions.queryHash);
111
- const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.includes(defaultedOptions.queryHash));
112
- const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObservers.some(match => match.observer === prevObserver));
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));
113
115
 
114
116
  const getObserver = options => {
115
117
  const defaultedOptions = this.client.defaultQueryOptions(options);
@@ -1 +1 @@
1
- {"version":3,"file":"queriesObserver.mjs","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport type {\n QueryObserverOptions,\n QueryObserverResult,\n DefaultedQueryObserverOptions,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\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.length === 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.length) {\n this.destroy()\n }\n }\n\n destroy(): void {\n this.listeners = []\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 defaultedQueryOptions = queries.map((options) =>\n this.client.defaultQueryOptions(options),\n )\n\n const matchingObservers: QueryObserverMatch[] =\n defaultedQueryOptions.flatMap((defaultedOptions) => {\n const match = prevObservers.find(\n (observer) =>\n observer.options.queryHash === defaultedOptions.queryHash,\n )\n if (match != null) {\n return [{ defaultedQueryOptions: defaultedOptions, observer: match }]\n }\n return []\n })\n\n const matchedQueryHashes = matchingObservers.map(\n (match) => match.defaultedQueryOptions.queryHash,\n )\n const unmatchedQueries = defaultedQueryOptions.filter(\n (defaultedOptions) =>\n !matchedQueryHashes.includes(defaultedOptions.queryHash),\n )\n\n const unmatchedObservers = prevObservers.filter(\n (prevObserver) =>\n !matchingObservers.some((match) => match.observer === 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","length","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","find","matchedQueryHashes","unmatchedQueries","filter","includes","unmatchedObservers","prevObserver","getObserver","currentObserver","QueryObserver","newOrReusedObservers","keepPreviousData","previouslyUsedObserver","undefined","sortMatchesByOrderOfQueries","a","b","indexOf","concat","sort","replaceAt","listener"],"mappings":"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"}
1
+ {"version":3,"file":"queriesObserver.mjs","sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { difference, replaceAt } from './utils'\nimport { notifyManager } from './notifyManager'\nimport type {\n QueryObserverOptions,\n QueryObserverResult,\n DefaultedQueryObserverOptions,\n} from './types'\nimport type { QueryClient } from './queryClient'\nimport type { NotifyOptions } from './queryObserver'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\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.length === 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.length) {\n this.destroy()\n }\n }\n\n destroy(): void {\n this.listeners = []\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","length","forEach","observer","subscribe","onUpdate","onUnsubscribe","destroy","notifyOptions","notifyManager","batch","prevObservers","newObserverMatches","findMatchingObservers","match","setOptions","defaultedQueryOptions","newObservers","map","newObserversMap","Object","fromEntries","options","queryHash","newResult","getCurrentResult","hasIndexChange","some","index","hasListeners","difference","notify","getQueries","getCurrentQuery","getObservers","getOptimisticResult","prevObserversMap","Map","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","get","matchedQueryHashes","Set","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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"}
@@ -2817,9 +2817,10 @@
2817
2817
 
2818
2818
  findMatchingObservers(queries) {
2819
2819
  const prevObservers = this.observers;
2820
+ const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
2820
2821
  const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));
2821
2822
  const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
2822
- const match = prevObservers.find(observer => observer.options.queryHash === defaultedOptions.queryHash);
2823
+ const match = prevObserversMap.get(defaultedOptions.queryHash);
2823
2824
 
2824
2825
  if (match != null) {
2825
2826
  return [{
@@ -2830,9 +2831,10 @@
2830
2831
 
2831
2832
  return [];
2832
2833
  });
2833
- const matchedQueryHashes = matchingObservers.map(match => match.defaultedQueryOptions.queryHash);
2834
- const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.includes(defaultedOptions.queryHash));
2835
- const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObservers.some(match => match.observer === prevObserver));
2834
+ const matchedQueryHashes = new Set(matchingObservers.map(match => match.defaultedQueryOptions.queryHash));
2835
+ const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.has(defaultedOptions.queryHash));
2836
+ const matchingObserversSet = new Set(matchingObservers.map(match => match.observer));
2837
+ const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObserversSet.has(prevObserver));
2836
2838
 
2837
2839
  const getObserver = options => {
2838
2840
  const defaultedOptions = this.client.defaultQueryOptions(options);