{"version":3,"file":"useQueries.mjs","sources":["../../../src/react/useQueries.ts"],"sourcesContent":["// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\nimport * as React from 'react'\n\nimport { InfiniteData, InfiniteQuery, Query, QueryClient } from '../vanilla'\nimport {\n  ObservableQueriesOptions,\n  createObservableQueries,\n} from '../vanilla/observableQueries'\nimport { useQueryClient } from './QueryClientProvider'\nimport { useQueryErrorResetBoundary } from './QueryErrorResetBoundary'\nimport {\n  ensurePreventErrorBoundaryRetry,\n  getHasError,\n  useClearResetErrorBoundary,\n} from './errorBoundaryUtils'\nimport {\n  ensureStaleTime,\n  fetchOptimistic,\n  shouldSuspend,\n  willFetch,\n} from './suspense'\nimport {\n  UseInfiniteQueryOptions,\n  UseInfiniteQueryResult,\n  UseQueryOptions,\n  UseQueryResult,\n} from './useQuery'\n\ntype QueriesPlaceholderDataFunction<TQueryData> = () => TQueryData | undefined\n\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TData = TFetcherData\n> = Omit<\n  UseQueryOptions<TFetcherData, TVars, TError, TData>,\n  'placeholderData' | 'suspense'\n> & {\n  placeholderData?: TFetcherData | QueriesPlaceholderDataFunction<TFetcherData>\n}\n\ntype UseInfiniteQueryOptionsForUseQueries<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TData = InfiniteData<TFetcherData>\n> = Omit<\n  UseInfiniteQueryOptions<TFetcherData, TVars, TError, TData>,\n  'placeholderData' | 'suspense'\n> & {\n  placeholderData?:\n    | InfiniteData<TFetcherData>\n    | QueriesPlaceholderDataFunction<InfiniteData<TFetcherData>>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> = T extends {\n  query: InfiniteQuery<infer TFetcherData, infer TVars, infer TError>\n  select: (data: any) => infer TData\n}\n  ? UseInfiniteQueryOptionsForUseQueries<TFetcherData, TVars, TError, TData>\n  : T extends {\n      query: InfiniteQuery<infer TFetcherData, infer TVars, infer TError>\n    }\n  ? UseInfiniteQueryOptionsForUseQueries<TFetcherData, TVars, TError>\n  : T extends {\n      query: Query<infer TFetcherData, infer TVars, infer TError>\n      select: (data: any) => infer TData\n    }\n  ? UseQueryOptionsForUseQueries<TFetcherData, TVars, TError, TData>\n  : T extends {\n      query: Query<infer TFetcherData, infer TVars, infer TError>\n    }\n  ? UseQueryOptionsForUseQueries<TFetcherData, TVars, TError, TFetcherData>\n  : UseQueryOptionsForUseQueries\n\ntype GetResults<T> = T extends {\n  query: InfiniteQuery<any, any, infer TError>\n  select: (data: any) => infer TData\n}\n  ? UseInfiniteQueryResult<TData, TError>\n  : T extends {\n      query: InfiniteQuery<infer TFetcherData, any, infer TError>\n    }\n  ? UseInfiniteQueryResult<InfiniteData<TFetcherData>, TError>\n  : T extends {\n      query: Query<any, any, infer TError>\n      select: (data: any) => infer TData\n    }\n  ? UseQueryResult<TData, TError>\n  : T extends {\n      query: Query<infer TFetcherData, any, infer TError>\n    }\n  ? UseQueryResult<TFetcherData, TError>\n  : UseQueryResult\n\n/**\n * QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type QueriesOptions<\n  T extends any[],\n  Result extends any[] = [],\n  Depth extends ReadonlyArray<number> = []\n> = Depth['length'] extends MAXIMUM_DEPTH\n  ? UseQueryOptionsForUseQueries[]\n  : T extends []\n  ? []\n  : T extends [infer Head]\n  ? [...Result, GetOptions<Head>]\n  : T extends [infer Head, ...infer Tail]\n  ? QueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n  : unknown[] extends T\n  ? T\n  : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n  // use this to infer the param types in the case of Array.map() argument\n  T extends UseQueryOptionsForUseQueries<\n      infer TFetcherData,\n      infer TVars,\n      infer TError\n    >[]\n  ? UseQueryOptionsForUseQueries<TFetcherData, TVars, TError>[]\n  : // Fallback\n    UseQueryOptionsForUseQueries[]\n\n/**\n * QueriesResults reducer recursively maps type param to results\n */\nexport type QueriesResults<\n  T extends any[],\n  Result extends any[] = [],\n  Depth extends ReadonlyArray<number> = []\n> = Depth['length'] extends MAXIMUM_DEPTH\n  ? UseQueryOptionsForUseQueries[]\n  : T extends []\n  ? []\n  : T extends [infer Head]\n  ? [...Result, GetResults<Head>]\n  : T extends [infer Head, ...infer Tail]\n  ? QueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n  : T extends UseQueryOptionsForUseQueries<\n      infer TFetcherData,\n      any,\n      infer TError,\n      any\n    >[]\n  ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n    UseQueryResult<TFetcherData, TError>[]\n  : // Fallback\n    UseQueryResult[]\n\nexport function useQueries<\n  T extends any[],\n  TCombinedResult = QueriesResults<T>\n>(\n  {\n    queries,\n    ...options\n  }: {\n    queries: readonly [...QueriesOptions<T>]\n    combine?: (result: QueriesResults<T>) => TCombinedResult\n  },\n  queryClient?: QueryClient\n): TCombinedResult {\n  const client = useQueryClient(queryClient)\n  const errorResetBoundary = useQueryErrorResetBoundary()\n\n  const defaultedQueries = React.useMemo(\n    () =>\n      queries.map(opts => {\n        const defaultedOptions = client.defaultQueryOptions(opts)\n        defaultedOptions._optimisticResults = true\n        return defaultedOptions\n      }),\n    [queries, client]\n  )\n\n  defaultedQueries.forEach(query => {\n    ensureStaleTime(query)\n    ensurePreventErrorBoundaryRetry(query, errorResetBoundary)\n  })\n\n  useClearResetErrorBoundary(errorResetBoundary)\n\n  const [obsQueries] = React.useState(() =>\n    createObservableQueries<TCombinedResult>(\n      client,\n      defaultedQueries,\n      options as ObservableQueriesOptions<TCombinedResult>\n    )\n  )\n\n  const [optimisticResult, getCombinedResult, trackResult] =\n    obsQueries.getOptimisticResult(defaultedQueries)\n\n  React.useSyncExternalStore(\n    React.useCallback(\n      onStoreChange => obsQueries.subscribe(onStoreChange),\n      [obsQueries]\n    ),\n    () => obsQueries.getCurrentResult(),\n    () => obsQueries.getCurrentResult()\n  )\n\n  React.useEffect(() => {\n    // Do not notify on updates because of changes in the options because\n    // these changes should already be reflected in the optimistic result.\n    obsQueries.setQueries(\n      defaultedQueries,\n      options as ObservableQueriesOptions<TCombinedResult>,\n      {\n        listeners: false,\n      }\n    )\n  }, [defaultedQueries, options, obsQueries])\n\n  const shouldAtLeastOneSuspend = optimisticResult.some((result, index) =>\n    shouldSuspend(defaultedQueries[index], result)\n  )\n\n  const suspensePromises = shouldAtLeastOneSuspend\n    ? optimisticResult.flatMap((result, index) => {\n        const opts = defaultedQueries[index]\n        const queryObserver = obsQueries.getObservableQueries()[index]\n\n        if (opts && queryObserver) {\n          if (shouldSuspend(opts, result)) {\n            return fetchOptimistic(opts, queryObserver, errorResetBoundary)\n          } else if (willFetch(result)) {\n            void fetchOptimistic(opts, queryObserver, errorResetBoundary)\n          }\n        }\n        return []\n      })\n    : []\n\n  if (suspensePromises.length > 0) {\n    throw Promise.all(suspensePromises)\n  }\n  const observableQueries = obsQueries.getQueries()\n  const firstSingleResultWhichShouldThrow = optimisticResult.find(\n    (result, index) =>\n      getHasError(\n        result,\n        errorResetBoundary,\n        observableQueries[index]!,\n        defaultedQueries[index]?.throwOnError ?? false\n      )\n  )\n\n  if (firstSingleResultWhichShouldThrow?.error) {\n    throw firstSingleResultWhichShouldThrow.error\n  }\n\n  return getCombinedResult(trackResult())\n}\n"],"names":["useQueries","queries","options","queryClient","client","useQueryClient","errorResetBoundary","useQueryErrorResetBoundary","defaultedQueries","React","useMemo","map","opts","defaultedOptions","defaultQueryOptions","_optimisticResults","forEach","query","ensureStaleTime","ensurePreventErrorBoundaryRetry","useClearResetErrorBoundary","obsQueries","useState","createObservableQueries","optimisticResult","getCombinedResult","trackResult","getOptimisticResult","useSyncExternalStore","useCallback","onStoreChange","subscribe","getCurrentResult","useEffect","setQueries","listeners","shouldAtLeastOneSuspend","some","result","index","shouldSuspend","suspensePromises","flatMap","queryObserver","getObservableQueries","fetchOptimistic","willFetch","length","Promise","all","observableQueries","getQueries","firstSingleResultWhichShouldThrow","find","_defaultedQueries$ind","_defaultedQueries$ind2","getHasError","throwOnError","error"],"mappings":"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"}