{"version":3,"file":"observableQueries.mjs","sources":["../../../src/vanilla/observableQueries.ts"],"sourcesContent":["import {\n  NotifyOptions,\n  ObservableQuery,\n  ObservableQueryOptions,\n  ObservableQueryResult,\n} from './observableQuery'\nimport { QueryClient } from './queryClient'\nimport { createSubscribable } from './subscribable'\nimport { replaceEqualDeep } from './utils'\n\nexport interface ObservableQueriesOptions<\n  TCombinedResult = ObservableQueryResult[]\n> {\n  combine?: (result: ObservableQueryResult[]) => TCombinedResult\n}\n\ntype QueryObserverMatch = {\n  defaultedQueryOptions: ObservableQueryOptions\n  observableQuery: ObservableQuery\n}\n\nexport const createObservableQueries = <TCombinedResult = []>(\n  client: QueryClient,\n  initialQueries: ObservableQueryOptions[],\n  initialOptions?: ObservableQueriesOptions<TCombinedResult>\n) => {\n  let result: ObservableQueryResult[] = []\n  let combinedResult: TCombinedResult\n  let queries: ObservableQueryOptions[] = []\n  let obsQueries: ObservableQuery[] = []\n  let options: ObservableQueriesOptions<TCombinedResult> | undefined\n\n  const setResult = (value: ObservableQueryResult[]) => {\n    result = value\n    combinedResult = combineResult(value)\n  }\n\n  const setQueries = (\n    newQueries: ObservableQueryOptions[],\n    newOptions?: ObservableQueriesOptions<TCombinedResult>,\n    notifyOptions?: NotifyOptions\n  ): void => {\n    queries = newQueries\n    options = newOptions\n\n    const prevObsQueries = obsQueries\n\n    const newObserverMatches = findMatchingObservers(queries)\n\n    // set options for the new obsQueries to notify of changes\n    newObserverMatches.forEach(match =>\n      match.observableQuery.setOptions(\n        match.defaultedQueryOptions,\n        notifyOptions\n      )\n    )\n\n    const newObservers = newObserverMatches.map(match => match.observableQuery)\n    const newResult = newObservers.map(obsQuery => obsQuery.getCurrentResult())\n\n    const hasIndexChange = newObservers.some(\n      (obsQuery, index) => obsQuery !== prevObsQueries[index]\n    )\n    if (prevObsQueries.length === newObservers.length && !hasIndexChange) {\n      return\n    }\n\n    obsQueries = newObservers\n    setResult(newResult)\n\n    if (!hasListeners()) {\n      return\n    }\n\n    difference(prevObsQueries, newObservers).forEach(obsQuery => {\n      obsQuery.destroy()\n    })\n\n    difference(newObservers, prevObsQueries).forEach(obsQuery => {\n      obsQuery.subscribe(result => {\n        onUpdate(obsQuery, result)\n      })\n    })\n\n    notify()\n  }\n\n  const [listeners, subscribe, hasListeners] = createSubscribable<\n    (result: ObservableQueryResult[]) => void\n  >(\n    function onSubscribe() {\n      if (listeners.size === 1) {\n        obsQueries.forEach(obsQuery => {\n          obsQuery.subscribe(result => {\n            onUpdate(obsQuery, result)\n          })\n        })\n      }\n    },\n    function onUnsubscribe() {\n      if (!listeners.size) {\n        destroy()\n      }\n    }\n  )\n\n  const destroy = (): void => {\n    listeners.clear()\n    obsQueries.forEach(obsQuery => {\n      obsQuery.destroy()\n    })\n  }\n\n  const findMatchingObservers = (\n    queries: ObservableQueryOptions[]\n  ): QueryObserverMatch[] => {\n    const prevObsQueries = obsQueries\n    const prevObserversMap = new Map(\n      prevObsQueries.map(obsQuery => [obsQuery.options.queryHash, obsQuery])\n    )\n\n    const defaultedQueryOptions = queries.map(obsQueryOptions =>\n      client.defaultQueryOptions(obsQueryOptions)\n    )\n\n    const matchingObservers: QueryObserverMatch[] =\n      defaultedQueryOptions.flatMap(defaultedOptions => {\n        const match = prevObserversMap.get(defaultedOptions.queryHash)\n        if (match != null) {\n          return [\n            { defaultedQueryOptions: defaultedOptions, observableQuery: match },\n          ]\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 getObservableQuery = (\n      newOptions: ObservableQueryOptions\n    ): ObservableQuery => {\n      const defaultedOptions = client.defaultQueryOptions(newOptions)\n      const currentObsQuery = obsQueries.find(\n        o => o.options.queryHash === defaultedOptions.queryHash\n      )\n      return currentObsQuery ?? client.watchQuery(defaultedOptions)\n    }\n\n    const newOrReusedObsQueries: QueryObserverMatch[] = unmatchedQueries.map(\n      options => {\n        return {\n          defaultedQueryOptions: options,\n          observableQuery: getObservableQuery(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(newOrReusedObsQueries)\n      .sort(sortMatchesByOrderOfQueries)\n  }\n\n  const combineResult = (input: ObservableQueryResult[]): TCombinedResult => {\n    const combine = options?.combine\n    if (combine) {\n      return replaceEqualDeep(combinedResult, combine(input))\n    }\n    return input as any\n  }\n\n  const onUpdate = (\n    obsQuery: ObservableQuery,\n    obsQueryResult: ObservableQueryResult\n  ): void => {\n    const index = obsQueries.indexOf(obsQuery)\n    if (index !== -1) {\n      setResult(replaceAt(result, index, obsQueryResult))\n      notify()\n    }\n  }\n\n  const notify = (): void => {\n    listeners.forEach(listener => {\n      listener(result)\n    })\n  }\n\n  // initialize\n  setResult([])\n  setQueries(initialQueries, initialOptions)\n\n  return {\n    subscribe,\n    destroy,\n    setQueries,\n\n    getCurrentResult: () => combinedResult,\n\n    getQueries: () =>\n      obsQueries.map(obsQuery => obsQuery.getCurrentQueryInfo()),\n\n    getObservableQueries: () => obsQueries,\n\n    getOptimisticResult: (\n      newQueries: ObservableQueryOptions[]\n    ): [\n      rawResult: ObservableQueryResult[],\n      combineResult: (r?: ObservableQueryResult[]) => TCombinedResult,\n      trackResult: () => ObservableQueryResult[]\n    ] => {\n      const matches = findMatchingObservers(newQueries)\n      const result = matches.map(match =>\n        match.observableQuery.getOptimisticResult(match.defaultedQueryOptions)\n      )\n\n      return [\n        result,\n        (r?: ObservableQueryResult[]) => {\n          return combineResult(r ?? result)\n        },\n        () => {\n          return matches.map((match, index) => {\n            const observerResult = result[index]!\n            return match.observableQuery.trackResult(observerResult)\n          })\n        },\n      ]\n    },\n  }\n}\n\nconst difference = <T>(array1: T[], array2: T[]): T[] => {\n  return array1.filter(x => !array2.includes(x))\n}\n\nconst replaceAt = <T>(array: T[], index: number, value: T): T[] => {\n  const copy = array.slice(0)\n  copy[index] = value\n  return copy\n}\n"],"names":["createObservableQueries","client","initialQueries","initialOptions","result","combinedResult","queries","obsQueries","options","setResult","value","combineResult","setQueries","newQueries","newOptions","notifyOptions","prevObsQueries","newObserverMatches","findMatchingObservers","forEach","match","observableQuery","setOptions","defaultedQueryOptions","newObservers","map","newResult","obsQuery","getCurrentResult","hasIndexChange","some","index","length","hasListeners","difference","destroy","subscribe","onUpdate","notify","listeners","createSubscribable","onSubscribe","size","onUnsubscribe","clear","prevObserversMap","Map","queryHash","obsQueryOptions","defaultQueryOptions","matchingObservers","flatMap","defaultedOptions","get","matchedQueryHashes","Set","unmatchedQueries","filter","has","getObservableQuery","currentObsQuery","find","o","watchQuery","newOrReusedObsQueries","sortMatchesByOrderOfQueries","a","b","indexOf","concat","sort","input","_options","combine","replaceEqualDeep","obsQueryResult","replaceAt","listener","getQueries","getCurrentQueryInfo","getObservableQueries","getOptimisticResult","matches","r","observerResult","trackResult","array1","array2","x","includes","array","copy","slice"],"mappings":"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"}