{"version":3,"file":"queriesObserver.cjs","names":["Subscribable","shallowEqualObjects","replaceEqualDeep","QueryObserver"],"sources":["../../src/queriesObserver.ts"],"sourcesContent":["import { notifyManager } from './notifyManager'\nimport { QueryObserver } from './queryObserver'\nimport { Subscribable } from './subscribable'\nimport { replaceEqualDeep, shallowEqualObjects } from './utils'\nimport type {\n  DefaultedQueryObserverOptions,\n  QueryObserverOptions,\n  QueryObserverResult,\n} from './types'\nimport type { QueryClient } from './queryClient'\n\nfunction difference<T>(array1: Array<T>, array2: Array<T>): Array<T> {\n  const excludeSet = new Set(array2)\n  return array1.filter((x) => !excludeSet.has(x))\n}\n\ntype QueriesObserverListener = (result: Array<QueryObserverResult>) => void\n\ntype CombineFn<TCombinedResult> = (\n  result: Array<QueryObserverResult>,\n) => TCombinedResult\n\nexport interface QueriesObserverOptions<\n  TCombinedResult = Array<QueryObserverResult>,\n> {\n  combine?: CombineFn<TCombinedResult>\n}\n\nexport class QueriesObserver<\n  TCombinedResult = Array<QueryObserverResult>,\n> extends Subscribable<QueriesObserverListener> {\n  #client: QueryClient\n  #result!: Array<QueryObserverResult>\n  #queries: Array<QueryObserverOptions>\n  #options?: QueriesObserverOptions<TCombinedResult>\n  #observers: Array<QueryObserver>\n  #combinedResult!: TCombinedResult\n  #lastCombine?: CombineFn<TCombinedResult>\n  #lastResult?: Array<QueryObserverResult>\n  #lastQueryHashes?: Array<string>\n  #observerMatches: Array<QueryObserverMatch> = []\n\n  constructor(\n    client: QueryClient,\n    queries: Array<QueryObserverOptions<any, any, any, any, any>>,\n    options?: QueriesObserverOptions<TCombinedResult>,\n  ) {\n    super()\n\n    this.#client = client\n    this.#options = options\n    this.#queries = []\n    this.#observers = []\n    this.#result = []\n\n    this.setQueries(queries)\n  }\n\n  protected onSubscribe(): void {\n    if (this.listeners.size === 1) {\n      this.#observers.forEach((observer) => {\n        observer.subscribe((result) => {\n          this.#onUpdate(observer, result)\n        })\n      })\n    }\n  }\n\n  protected onUnsubscribe(): void {\n    if (!this.listeners.size) {\n      this.destroy()\n    }\n  }\n\n  destroy(): void {\n    this.listeners = new Set()\n    this.#observers.forEach((observer) => {\n      observer.destroy()\n    })\n  }\n\n  setQueries(\n    queries: Array<QueryObserverOptions>,\n    options?: QueriesObserverOptions<TCombinedResult>,\n  ): void {\n    this.#queries = queries\n    this.#options = options\n\n    if (process.env.NODE_ENV !== 'production') {\n      const queryHashes = queries.map(\n        (query) => this.#client.defaultQueryOptions(query).queryHash,\n      )\n      if (new Set(queryHashes).size !== queryHashes.length) {\n        console.warn(\n          '[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.',\n        )\n      }\n    }\n\n    notifyManager.batch(() => {\n      const prevObservers = this.#observers\n\n      const newObserverMatches = this.#findMatchingObservers(this.#queries)\n\n      // set options for the new observers to notify of changes\n      newObserverMatches.forEach((match) =>\n        match.observer.setOptions(match.defaultedQueryOptions),\n      )\n\n      const newObservers = newObserverMatches.map((match) => match.observer)\n      const newResult = newObservers.map((observer) =>\n        observer.getCurrentResult(),\n      )\n\n      const hasLengthChange = prevObservers.length !== newObservers.length\n      const hasIndexChange = newObservers.some(\n        (observer, index) => observer !== prevObservers[index],\n      )\n      const hasStructuralChange = hasLengthChange || hasIndexChange\n\n      const hasResultChange = hasStructuralChange\n        ? true\n        : newResult.some((result, index) => {\n            const prev = this.#result[index]\n            return !prev || !shallowEqualObjects(result, prev)\n          })\n\n      if (!hasStructuralChange && !hasResultChange) return\n\n      if (hasStructuralChange) {\n        this.#observerMatches = newObserverMatches\n        this.#observers = newObservers\n      }\n\n      this.#result = newResult\n\n      if (!this.hasListeners()) return\n\n      if (hasStructuralChange) {\n        difference(prevObservers, newObservers).forEach((observer) => {\n          observer.destroy()\n        })\n        difference(newObservers, prevObservers).forEach((observer) => {\n          observer.subscribe((result) => {\n            this.#onUpdate(observer, result)\n          })\n        })\n      }\n\n      this.#notify()\n    })\n  }\n\n  getCurrentResult(): Array<QueryObserverResult> {\n    return this.#result\n  }\n\n  getQueries() {\n    return this.#observers.map((observer) => observer.getCurrentQuery())\n  }\n\n  getObservers() {\n    return this.#observers\n  }\n\n  getOptimisticResult(\n    queries: Array<QueryObserverOptions>,\n    combine: CombineFn<TCombinedResult> | undefined,\n  ): [\n    rawResult: Array<QueryObserverResult>,\n    combineResult: (r?: Array<QueryObserverResult>) => TCombinedResult,\n    trackResult: () => Array<QueryObserverResult>,\n  ] {\n    const matches = this.#findMatchingObservers(queries)\n    const result = matches.map((match) =>\n      match.observer.getOptimisticResult(match.defaultedQueryOptions),\n    )\n    const queryHashes = matches.map(\n      (match) => match.defaultedQueryOptions.queryHash,\n    )\n\n    return [\n      result,\n      (r?: Array<QueryObserverResult>) => {\n        return this.#combineResult(r ?? result, combine, queryHashes)\n      },\n      () => {\n        return this.#trackResult(result, matches)\n      },\n    ]\n  }\n\n  #trackResult(\n    result: Array<QueryObserverResult>,\n    matches: Array<QueryObserverMatch>,\n  ) {\n    const trackedProps = new Set<keyof QueryObserverResult>()\n\n    return matches.map((match, index) => {\n      const observerResult = result[index]!\n      return !match.defaultedQueryOptions.notifyOnChangeProps\n        ? match.observer.trackResult(observerResult, (accessedProp) => {\n            // track property on all observers to ensure proper (synchronized) tracking (#7000)\n            if (!trackedProps.has(accessedProp)) {\n              trackedProps.add(accessedProp)\n              matches.forEach((m) => {\n                m.observer.trackProp(accessedProp)\n              })\n            }\n          })\n        : observerResult\n    })\n  }\n\n  #combineResult(\n    input: Array<QueryObserverResult>,\n    combine: CombineFn<TCombinedResult> | undefined,\n    queryHashes?: Array<string>,\n  ): TCombinedResult {\n    if (combine) {\n      const lastHashes = this.#lastQueryHashes\n      const queryHashesChanged =\n        queryHashes !== undefined &&\n        lastHashes !== undefined &&\n        (lastHashes.length !== queryHashes.length ||\n          queryHashes.some((hash, i) => hash !== lastHashes[i]))\n\n      if (\n        this.#result !== this.#lastResult ||\n        queryHashesChanged ||\n        combine !== this.#lastCombine\n      ) {\n        this.#lastCombine = combine\n        this.#lastResult = this.#result\n\n        if (queryHashes !== undefined) {\n          this.#lastQueryHashes = queryHashes\n        }\n        this.#combinedResult = replaceEqualDeep(\n          this.#combinedResult,\n          combine(input),\n        )\n      }\n\n      return this.#combinedResult\n    }\n    return input as any\n  }\n\n  #shouldSkipCombine(): boolean {\n    return (\n      !this.#options?.combine ||\n      this.#observers.some((observer, index) => {\n        return (\n          observer.options.suspense && this.#result[index]?.data === undefined\n        )\n      })\n    )\n  }\n\n  #findMatchingObservers(\n    queries: Array<QueryObserverOptions>,\n  ): Array<QueryObserverMatch> {\n    const prevObserversMap = new Map<string, Array<QueryObserver>>()\n\n    this.#observers.forEach((observer) => {\n      const key = observer.options.queryHash\n      if (!key) return\n\n      const previousObservers = prevObserversMap.get(key)\n\n      if (previousObservers) {\n        previousObservers.push(observer)\n      } else {\n        prevObserversMap.set(key, [observer])\n      }\n    })\n\n    const observers: Array<QueryObserverMatch> = []\n\n    queries.forEach((options) => {\n      const defaultedOptions = this.#client.defaultQueryOptions(options)\n      const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift()\n      const observer =\n        match ?? new QueryObserver(this.#client, defaultedOptions)\n\n      observers.push({\n        defaultedQueryOptions: defaultedOptions,\n        observer,\n      })\n    })\n\n    return observers\n  }\n\n  #onUpdate(observer: QueryObserver, result: QueryObserverResult): void {\n    const index = this.#observers.indexOf(observer)\n    if (index !== -1) {\n      this.#result = this.#result.slice()\n      this.#result[index] = result\n      this.#notify()\n    }\n  }\n\n  #notify(): void {\n    if (this.hasListeners()) {\n      const shouldSkipCombine = this.#shouldSkipCombine()\n      const previousResult = this.#combinedResult\n      const newResult = shouldSkipCombine\n        ? previousResult\n        : this.#combineResult(\n            this.#trackResult(this.#result, this.#observerMatches),\n            this.#options?.combine,\n          )\n\n      if (shouldSkipCombine || previousResult !== newResult) {\n        notifyManager.batch(() => {\n          this.listeners.forEach((listener) => {\n            listener(this.#result)\n          })\n        })\n      }\n    }\n  }\n}\n\ntype QueryObserverMatch = {\n  defaultedQueryOptions: DefaultedQueryObserverOptions\n  observer: QueryObserver\n}\n"],"mappings":"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"}