@tanstack/react-query 5.0.0-alpha.2 → 5.0.0-alpha.21
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/lib/HydrationBoundary.esm.js +1 -0
- package/build/lib/HydrationBoundary.esm.js.map +1 -1
- package/build/lib/HydrationBoundary.js +1 -0
- package/build/lib/HydrationBoundary.js.map +1 -1
- package/build/lib/HydrationBoundary.mjs +1 -0
- package/build/lib/HydrationBoundary.mjs.map +1 -1
- package/build/lib/QueryClientProvider.esm.js +1 -0
- package/build/lib/QueryClientProvider.esm.js.map +1 -1
- package/build/lib/QueryClientProvider.js +1 -0
- package/build/lib/QueryClientProvider.js.map +1 -1
- package/build/lib/QueryClientProvider.mjs +1 -0
- package/build/lib/QueryClientProvider.mjs.map +1 -1
- package/build/lib/QueryErrorResetBoundary.esm.js +1 -0
- package/build/lib/QueryErrorResetBoundary.esm.js.map +1 -1
- package/build/lib/QueryErrorResetBoundary.js +1 -0
- package/build/lib/QueryErrorResetBoundary.js.map +1 -1
- package/build/lib/QueryErrorResetBoundary.mjs +1 -0
- package/build/lib/QueryErrorResetBoundary.mjs.map +1 -1
- package/build/lib/__tests__/ssr.test.d.ts +0 -3
- package/build/lib/__tests__/utils.d.ts +2 -3
- package/build/lib/errorBoundaryUtils.esm.js +1 -0
- package/build/lib/errorBoundaryUtils.esm.js.map +1 -1
- package/build/lib/errorBoundaryUtils.js +1 -0
- package/build/lib/errorBoundaryUtils.js.map +1 -1
- package/build/lib/errorBoundaryUtils.mjs +1 -0
- package/build/lib/errorBoundaryUtils.mjs.map +1 -1
- package/build/lib/isRestoring.esm.js +1 -0
- package/build/lib/isRestoring.esm.js.map +1 -1
- package/build/lib/isRestoring.js +1 -0
- package/build/lib/isRestoring.js.map +1 -1
- package/build/lib/isRestoring.mjs +1 -0
- package/build/lib/isRestoring.mjs.map +1 -1
- package/build/lib/suspense.d.ts +1 -1
- package/build/lib/suspense.esm.js +2 -9
- package/build/lib/suspense.esm.js.map +1 -1
- package/build/lib/suspense.js +2 -9
- package/build/lib/suspense.js.map +1 -1
- package/build/lib/suspense.mjs +1 -8
- package/build/lib/suspense.mjs.map +1 -1
- package/build/lib/useBaseQuery.esm.js +1 -11
- package/build/lib/useBaseQuery.esm.js.map +1 -1
- package/build/lib/useBaseQuery.js +1 -11
- package/build/lib/useBaseQuery.js.map +1 -1
- package/build/lib/useBaseQuery.mjs +1 -11
- package/build/lib/useBaseQuery.mjs.map +1 -1
- package/build/lib/useInfiniteQuery.esm.js +1 -0
- package/build/lib/useInfiniteQuery.esm.js.map +1 -1
- package/build/lib/useInfiniteQuery.js +1 -0
- package/build/lib/useInfiniteQuery.js.map +1 -1
- package/build/lib/useInfiniteQuery.mjs +1 -0
- package/build/lib/useInfiniteQuery.mjs.map +1 -1
- package/build/lib/useIsFetching.esm.js +1 -0
- package/build/lib/useIsFetching.esm.js.map +1 -1
- package/build/lib/useIsFetching.js +1 -0
- package/build/lib/useIsFetching.js.map +1 -1
- package/build/lib/useIsFetching.mjs +1 -0
- package/build/lib/useIsFetching.mjs.map +1 -1
- package/build/lib/useMutation.esm.js +1 -0
- package/build/lib/useMutation.esm.js.map +1 -1
- package/build/lib/useMutation.js +1 -0
- package/build/lib/useMutation.js.map +1 -1
- package/build/lib/useMutation.mjs +1 -0
- package/build/lib/useMutation.mjs.map +1 -1
- package/build/lib/useMutationState.d.ts +3 -3
- package/build/lib/useMutationState.esm.js +1 -0
- package/build/lib/useMutationState.esm.js.map +1 -1
- package/build/lib/useMutationState.js +1 -0
- package/build/lib/useMutationState.js.map +1 -1
- package/build/lib/useMutationState.mjs +1 -0
- package/build/lib/useMutationState.mjs.map +1 -1
- package/build/lib/useQueries.d.ts +2 -3
- package/build/lib/useQueries.esm.js +20 -16
- package/build/lib/useQueries.esm.js.map +1 -1
- package/build/lib/useQueries.js +20 -16
- package/build/lib/useQueries.js.map +1 -1
- package/build/lib/useQueries.mjs +11 -10
- package/build/lib/useQueries.mjs.map +1 -1
- package/build/lib/useQuery.esm.js +1 -0
- package/build/lib/useQuery.esm.js.map +1 -1
- package/build/lib/useQuery.js +1 -0
- package/build/lib/useQuery.js.map +1 -1
- package/build/lib/useQuery.mjs +1 -0
- package/build/lib/useQuery.mjs.map +1 -1
- package/build/umd/index.development.js +108 -138
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/HydrationBoundary.test.tsx +4 -3
- package/src/__tests__/QueryClientProvider.test.tsx +2 -1
- package/src/__tests__/QueryResetErrorBoundary.test.tsx +753 -620
- package/src/__tests__/ssr-hydration.test.tsx +11 -10
- package/src/__tests__/ssr.test.tsx +4 -7
- package/src/__tests__/suspense.test.tsx +11 -92
- package/src/__tests__/useInfiniteQuery.test.tsx +18 -16
- package/src/__tests__/useInfiniteQuery.type.test.tsx +94 -13
- package/src/__tests__/useMutation.test.tsx +21 -20
- package/src/__tests__/useMutationState.test.tsx +24 -58
- package/src/__tests__/useQueries.test.tsx +25 -154
- package/src/__tests__/useQuery.test.tsx +174 -359
- package/src/__tests__/utils.tsx +3 -2
- package/src/errorBoundaryUtils.ts +1 -0
- package/src/suspense.ts +3 -11
- package/src/useBaseQuery.ts +1 -19
- package/src/useInfiniteQuery.ts +1 -0
- package/src/useIsFetching.ts +1 -0
- package/src/useMutation.ts +1 -0
- package/src/useMutationState.ts +4 -3
- package/src/useQueries.ts +19 -18
- package/src/useQuery.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQueries.mjs","sources":["../../src/useQueries.ts"],"sourcesContent":["import * as React from 'react'\n\nimport type {\n QueryKey,\n QueryFunction,\n QueriesPlaceholderDataFunction,\n QueryClient,\n DefaultError,\n} from '@tanstack/query-core'\nimport { notifyManager, QueriesObserver } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type { UseQueryOptions, UseQueryResult } from './types'\nimport { useIsRestoring } from './isRestoring'\nimport { useQueryErrorResetBoundary } from './QueryErrorResetBoundary'\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary,\n} from './errorBoundaryUtils'\nimport {\n ensureStaleTime,\n shouldSuspend,\n fetchOptimistic,\n willFetch,\n} from './suspense'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = Omit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryOptionsForUseQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseQueryOptionsForUseQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? UseQueryResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? UseQueryResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? UseQueryResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? UseQueryResult<TQueryFnData>\n : // Fallback\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 TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>[]\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 ? UseQueryResult[]\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 TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n UseQueryResult<\n unknown extends TData ? TQueryFnData : TData,\n unknown extends TError ? DefaultError : TError\n >[]\n : // Fallback\n UseQueryResult[]\n\nexport function useQueries<T extends any[]>({\n queries,\n queryClient,\n}: {\n queries: readonly [...QueriesOptions<T>]\n queryClient?: QueryClient\n}): QueriesResults<T> {\n const client = useQueryClient(queryClient)\n const isRestoring = useIsRestoring()\n\n const defaultedQueries = React.useMemo(\n () =>\n queries.map((options) => {\n const defaultedOptions = client.defaultQueryOptions(options)\n\n // Make sure the results are already in fetching state before subscribing or updating options\n defaultedOptions._optimisticResults = isRestoring\n ? 'isRestoring'\n : 'optimistic'\n\n return defaultedOptions\n }),\n [queries, client, isRestoring],\n )\n\n const [observer] = React.useState(\n () => new QueriesObserver(client, defaultedQueries),\n )\n\n const optimisticResult = observer.getOptimisticResult(defaultedQueries)\n\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n isRestoring\n ? () => undefined\n : observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer, isRestoring],\n ),\n () => observer.getCurrentResult(),\n () => observer.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 observer.setQueries(defaultedQueries, { listeners: false })\n }, [defaultedQueries, observer])\n\n const errorResetBoundary = useQueryErrorResetBoundary()\n\n defaultedQueries.forEach((query) => {\n ensurePreventErrorBoundaryRetry(query, errorResetBoundary)\n ensureStaleTime(query)\n })\n\n useClearResetErrorBoundary(errorResetBoundary)\n\n const shouldAtLeastOneSuspend = optimisticResult.some((result, index) =>\n shouldSuspend(defaultedQueries[index], result, isRestoring),\n )\n\n const suspensePromises = shouldAtLeastOneSuspend\n ? optimisticResult.flatMap((result, index) => {\n const options = defaultedQueries[index]\n const queryObserver = observer.getObservers()[index]\n\n if (options && queryObserver) {\n if (shouldSuspend(options, result, isRestoring)) {\n return fetchOptimistic(options, queryObserver, errorResetBoundary)\n } else if (willFetch(result, isRestoring)) {\n void fetchOptimistic(options, queryObserver, errorResetBoundary)\n }\n }\n return []\n })\n : []\n\n if (suspensePromises.length > 0) {\n throw Promise.all(suspensePromises)\n }\n\n const firstSingleResultWhichShouldThrow = optimisticResult.find(\n (result, index) =>\n getHasError({\n result,\n errorResetBoundary,\n throwErrors: defaultedQueries[index]?.throwErrors ?? false,\n query: observer.getQueries()[index]!,\n }),\n )\n\n if (firstSingleResultWhichShouldThrow?.error) {\n throw firstSingleResultWhichShouldThrow.error\n }\n\n return optimisticResult as QueriesResults<T>\n}\n"],"names":["useQueries","queries","queryClient","client","useQueryClient","isRestoring","useIsRestoring","defaultedQueries","React","useMemo","map","options","defaultedOptions","defaultQueryOptions","_optimisticResults","observer","useState","QueriesObserver","optimisticResult","getOptimisticResult","useSyncExternalStore","useCallback","onStoreChange","undefined","subscribe","notifyManager","batchCalls","getCurrentResult","useEffect","setQueries","listeners","errorResetBoundary","useQueryErrorResetBoundary","forEach","query","ensurePreventErrorBoundaryRetry","ensureStaleTime","useClearResetErrorBoundary","shouldAtLeastOneSuspend","some","result","index","shouldSuspend","suspensePromises","flatMap","queryObserver","getObservers","fetchOptimistic","willFetch","length","Promise","all","firstSingleResultWhichShouldThrow","find","getHasError","throwErrors","getQueries","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useQueries.mjs","sources":["../../src/useQueries.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport type {\n QueryKey,\n QueryFunction,\n QueriesPlaceholderDataFunction,\n QueryClient,\n DefaultError,\n} from '@tanstack/query-core'\nimport { notifyManager, QueriesObserver } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type { UseQueryOptions, UseQueryResult } from './types'\nimport { useIsRestoring } from './isRestoring'\nimport { useQueryErrorResetBoundary } from './QueryErrorResetBoundary'\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary,\n} from './errorBoundaryUtils'\nimport {\n ensureStaleTime,\n shouldSuspend,\n fetchOptimistic,\n willFetch,\n} from './suspense'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = Omit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryOptionsForUseQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseQueryOptionsForUseQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? UseQueryResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? UseQueryResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? UseQueryResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? UseQueryResult<TQueryFnData>\n : // Fallback\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 TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>[]\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 ? UseQueryResult[]\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 TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n UseQueryResult<\n unknown extends TData ? TQueryFnData : TData,\n unknown extends TError ? DefaultError : TError\n >[]\n : // Fallback\n UseQueryResult[]\n\nexport function useQueries<T extends any[]>(\n {\n queries,\n }: {\n queries: readonly [...QueriesOptions<T>]\n },\n queryClient?: QueryClient,\n): QueriesResults<T> {\n const client = useQueryClient(queryClient)\n const isRestoring = useIsRestoring()\n const errorResetBoundary = useQueryErrorResetBoundary()\n\n const defaultedQueries = React.useMemo(\n () =>\n queries.map((options) => {\n const defaultedOptions = client.defaultQueryOptions(options)\n\n // Make sure the results are already in fetching state before subscribing or updating options\n defaultedOptions._optimisticResults = isRestoring\n ? 'isRestoring'\n : 'optimistic'\n\n return defaultedOptions\n }),\n [queries, client, isRestoring],\n )\n\n defaultedQueries.forEach((query) => {\n ensureStaleTime(query)\n ensurePreventErrorBoundaryRetry(query, errorResetBoundary)\n })\n\n useClearResetErrorBoundary(errorResetBoundary)\n\n const [observer] = React.useState(\n () => new QueriesObserver(client, defaultedQueries),\n )\n\n const optimisticResult = observer.getOptimisticResult(defaultedQueries)\n\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n isRestoring\n ? () => undefined\n : observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer, isRestoring],\n ),\n () => observer.getCurrentResult(),\n () => observer.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 observer.setQueries(defaultedQueries, { listeners: false })\n }, [defaultedQueries, observer])\n\n const shouldAtLeastOneSuspend = optimisticResult.some((result, index) =>\n shouldSuspend(defaultedQueries[index], result, isRestoring),\n )\n\n const suspensePromises = shouldAtLeastOneSuspend\n ? optimisticResult.flatMap((result, index) => {\n const options = defaultedQueries[index]\n const queryObserver = observer.getObservers()[index]\n\n if (options && queryObserver) {\n if (shouldSuspend(options, result, isRestoring)) {\n return fetchOptimistic(options, queryObserver, errorResetBoundary)\n } else if (willFetch(result, isRestoring)) {\n void fetchOptimistic(options, queryObserver, errorResetBoundary)\n }\n }\n return []\n })\n : []\n\n if (suspensePromises.length > 0) {\n throw Promise.all(suspensePromises)\n }\n const observerQueries = observer.getQueries()\n const firstSingleResultWhichShouldThrow = optimisticResult.find(\n (result, index) =>\n getHasError({\n result,\n errorResetBoundary,\n throwErrors: defaultedQueries[index]?.throwErrors ?? false,\n query: observerQueries[index]!,\n }),\n )\n\n if (firstSingleResultWhichShouldThrow?.error) {\n throw firstSingleResultWhichShouldThrow.error\n }\n\n return optimisticResult as QueriesResults<T>\n}\n"],"names":["queries","defaultedOptions","defaultedQueries","ensurePreventErrorBoundaryRetry","observer","listeners"],"mappings":";;;;;;;;;AA2BA;AACA;;AAkIO;AAEHA;AAGF;AAGA;;;AAIA;AAGM;;AAEA;AACAC;AAIA;;AAKNC;;AAEEC;AACF;;AAIA;AAIA;;;AAeE;AACA;AACAC;AAAwCC;AAAiB;AAC3D;;AAMA;AAEM;;;;AAKI;;AAEA;AACF;AACF;AACA;;AAIN;AACE;AACF;AACA;AACA;;;;;AAOI;;;AAKJ;AAEA;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.esm.js","sources":["../../src/useQuery.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"useQuery.esm.js","sources":["../../src/useQuery.ts"],"sourcesContent":["'use client'\nimport type { QueryClient, QueryKey, DefaultError } from '@tanstack/query-core'\nimport { QueryObserver } from '@tanstack/query-core'\nimport type {\n DefinedUseQueryResult,\n UseQueryOptions,\n UseQueryResult,\n} from './types'\nimport { useBaseQuery } from './useBaseQuery'\n\n// HOOK\ntype UndefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData?: undefined\n}\n\ntype DefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData: TQueryFnData | (() => TQueryFnData)\n}\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<TData, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<TData, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n) {\n return useBaseQuery(options, QueryObserver, queryClient)\n}\n"],"names":[],"mappings":";;;;AAUA;;AAuCO;AASL;AACF;;"}
|
package/build/lib/useQuery.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.js","sources":["../../src/useQuery.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"useQuery.js","sources":["../../src/useQuery.ts"],"sourcesContent":["'use client'\nimport type { QueryClient, QueryKey, DefaultError } from '@tanstack/query-core'\nimport { QueryObserver } from '@tanstack/query-core'\nimport type {\n DefinedUseQueryResult,\n UseQueryOptions,\n UseQueryResult,\n} from './types'\nimport { useBaseQuery } from './useBaseQuery'\n\n// HOOK\ntype UndefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData?: undefined\n}\n\ntype DefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData: TQueryFnData | (() => TQueryFnData)\n}\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<TData, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<TData, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n) {\n return useBaseQuery(options, QueryObserver, queryClient)\n}\n"],"names":[],"mappings":";;;;;;AAUA;;AAuCO;AASL;AACF;;"}
|
package/build/lib/useQuery.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.mjs","sources":["../../src/useQuery.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"useQuery.mjs","sources":["../../src/useQuery.ts"],"sourcesContent":["'use client'\nimport type { QueryClient, QueryKey, DefaultError } from '@tanstack/query-core'\nimport { QueryObserver } from '@tanstack/query-core'\nimport type {\n DefinedUseQueryResult,\n UseQueryOptions,\n UseQueryResult,\n} from './types'\nimport { useBaseQuery } from './useBaseQuery'\n\n// HOOK\ntype UndefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData?: undefined\n}\n\ntype DefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData: TQueryFnData | (() => TQueryFnData)\n}\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseQueryResult<TData, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): DefinedUseQueryResult<TData, TError>\n\nexport function useQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n) {\n return useBaseQuery(options, QueryObserver, queryClient)\n}\n"],"names":[],"mappings":";;;;AAUA;;AAuCO;AASL;AACF;;"}
|
|
@@ -1043,7 +1043,7 @@
|
|
|
1043
1043
|
this.state = reducer(this.state);
|
|
1044
1044
|
notifyManager.batch(() => {
|
|
1045
1045
|
this.#observers.forEach(observer => {
|
|
1046
|
-
observer.onQueryUpdate(
|
|
1046
|
+
observer.onQueryUpdate();
|
|
1047
1047
|
});
|
|
1048
1048
|
this.#cache.notify({
|
|
1049
1049
|
query: this,
|
|
@@ -1135,10 +1135,11 @@
|
|
|
1135
1135
|
return [...this.#queries.values()];
|
|
1136
1136
|
}
|
|
1137
1137
|
find(filters) {
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1138
|
+
const defaultedFilters = {
|
|
1139
|
+
exact: true,
|
|
1140
|
+
...filters
|
|
1141
|
+
};
|
|
1142
|
+
return this.getAll().find(query => matchQuery(defaultedFilters, query));
|
|
1142
1143
|
}
|
|
1143
1144
|
findAll(filters = {}) {
|
|
1144
1145
|
const queries = this.getAll();
|
|
@@ -1173,18 +1174,26 @@
|
|
|
1173
1174
|
|
|
1174
1175
|
class Mutation extends Removable {
|
|
1175
1176
|
#observers;
|
|
1177
|
+
#defaultOptions;
|
|
1176
1178
|
#mutationCache;
|
|
1177
1179
|
#retryer;
|
|
1178
1180
|
constructor(config) {
|
|
1179
1181
|
super();
|
|
1180
|
-
this.options = config.options;
|
|
1181
1182
|
this.mutationId = config.mutationId;
|
|
1183
|
+
this.#defaultOptions = config.defaultOptions;
|
|
1182
1184
|
this.#mutationCache = config.mutationCache;
|
|
1183
1185
|
this.#observers = [];
|
|
1184
1186
|
this.state = config.state || getDefaultState();
|
|
1185
|
-
this.
|
|
1187
|
+
this.setOptions(config.options);
|
|
1186
1188
|
this.scheduleGc();
|
|
1187
1189
|
}
|
|
1190
|
+
setOptions(options) {
|
|
1191
|
+
this.options = {
|
|
1192
|
+
...this.#defaultOptions,
|
|
1193
|
+
...options
|
|
1194
|
+
};
|
|
1195
|
+
this.updateGcTime(this.options.gcTime);
|
|
1196
|
+
}
|
|
1188
1197
|
get meta() {
|
|
1189
1198
|
return this.options.meta;
|
|
1190
1199
|
}
|
|
@@ -1436,10 +1445,11 @@
|
|
|
1436
1445
|
return this.#mutations;
|
|
1437
1446
|
}
|
|
1438
1447
|
find(filters) {
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1448
|
+
const defaultedFilters = {
|
|
1449
|
+
exact: true,
|
|
1450
|
+
...filters
|
|
1451
|
+
};
|
|
1452
|
+
return this.#mutations.find(mutation => matchMutation(defaultedFilters, mutation));
|
|
1443
1453
|
}
|
|
1444
1454
|
findAll(filters = {}) {
|
|
1445
1455
|
return this.#mutations.filter(mutation => matchMutation(filters, mutation));
|
|
@@ -1465,12 +1475,15 @@
|
|
|
1465
1475
|
function infiniteQueryBehavior() {
|
|
1466
1476
|
return {
|
|
1467
1477
|
onFetch: context => {
|
|
1468
|
-
context.fetchFn = () => {
|
|
1478
|
+
context.fetchFn = async () => {
|
|
1469
1479
|
const options = context.options;
|
|
1470
1480
|
const direction = context.fetchOptions?.meta?.fetchMore?.direction;
|
|
1471
1481
|
const oldPages = context.state.data?.pages || [];
|
|
1472
1482
|
const oldPageParams = context.state.data?.pageParams || [];
|
|
1473
|
-
|
|
1483
|
+
const empty = {
|
|
1484
|
+
pages: [],
|
|
1485
|
+
pageParams: []
|
|
1486
|
+
};
|
|
1474
1487
|
let cancelled = false;
|
|
1475
1488
|
const addSignalProperty = object => {
|
|
1476
1489
|
Object.defineProperty(object, 'signal', {
|
|
@@ -1490,95 +1503,95 @@
|
|
|
1490
1503
|
|
|
1491
1504
|
// Get query function
|
|
1492
1505
|
const queryFn = context.options.queryFn || (() => Promise.reject(new Error('Missing queryFn')));
|
|
1493
|
-
const buildNewPages = (pages, param, page, previous) => {
|
|
1494
|
-
const {
|
|
1495
|
-
maxPages
|
|
1496
|
-
} = context.options;
|
|
1497
|
-
if (previous) {
|
|
1498
|
-
newPageParams = addToStart(newPageParams, param, maxPages);
|
|
1499
|
-
return addToStart(pages, page, maxPages);
|
|
1500
|
-
}
|
|
1501
|
-
newPageParams = addToEnd(newPageParams, param, maxPages);
|
|
1502
|
-
return addToEnd(pages, page, maxPages);
|
|
1503
|
-
};
|
|
1504
1506
|
|
|
1505
1507
|
// Create function to fetch a page
|
|
1506
|
-
const fetchPage = (
|
|
1508
|
+
const fetchPage = async (data, param, previous) => {
|
|
1507
1509
|
if (cancelled) {
|
|
1508
1510
|
return Promise.reject();
|
|
1509
1511
|
}
|
|
1510
|
-
if (typeof param === 'undefined' && pages.length) {
|
|
1511
|
-
return Promise.resolve(
|
|
1512
|
+
if (typeof param === 'undefined' && data.pages.length) {
|
|
1513
|
+
return Promise.resolve(data);
|
|
1512
1514
|
}
|
|
1513
1515
|
const queryFnContext = {
|
|
1514
1516
|
queryKey: context.queryKey,
|
|
1515
1517
|
pageParam: param,
|
|
1518
|
+
direction: previous ? 'backward' : 'forward',
|
|
1516
1519
|
meta: context.options.meta
|
|
1517
1520
|
};
|
|
1518
1521
|
addSignalProperty(queryFnContext);
|
|
1519
|
-
const
|
|
1520
|
-
const
|
|
1521
|
-
|
|
1522
|
+
const page = await queryFn(queryFnContext);
|
|
1523
|
+
const {
|
|
1524
|
+
maxPages
|
|
1525
|
+
} = context.options;
|
|
1526
|
+
const addTo = previous ? addToStart : addToEnd;
|
|
1527
|
+
return {
|
|
1528
|
+
pages: addTo(data.pages, page, maxPages),
|
|
1529
|
+
pageParams: addTo(data.pageParams, param, maxPages)
|
|
1530
|
+
};
|
|
1522
1531
|
};
|
|
1523
|
-
let
|
|
1532
|
+
let result;
|
|
1524
1533
|
|
|
1525
1534
|
// Fetch first page?
|
|
1526
1535
|
if (!oldPages.length) {
|
|
1527
|
-
|
|
1536
|
+
result = await fetchPage(empty, options.defaultPageParam);
|
|
1528
1537
|
}
|
|
1529
1538
|
|
|
1530
1539
|
// fetch next / previous page?
|
|
1531
1540
|
else if (direction) {
|
|
1532
1541
|
const previous = direction === 'backward';
|
|
1533
|
-
const
|
|
1534
|
-
|
|
1542
|
+
const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
|
|
1543
|
+
const oldData = {
|
|
1544
|
+
pages: oldPages,
|
|
1545
|
+
pageParams: oldPageParams
|
|
1546
|
+
};
|
|
1547
|
+
const param = pageParamFn(options, oldData);
|
|
1548
|
+
result = await fetchPage(oldData, param, previous);
|
|
1535
1549
|
}
|
|
1536
1550
|
|
|
1537
1551
|
// Refetch pages
|
|
1538
1552
|
else {
|
|
1539
|
-
newPageParams = [];
|
|
1540
|
-
|
|
1541
1553
|
// Fetch first page
|
|
1542
|
-
|
|
1554
|
+
result = await fetchPage(empty, oldPageParams[0]);
|
|
1543
1555
|
|
|
1544
1556
|
// Fetch remaining pages
|
|
1545
1557
|
for (let i = 1; i < oldPages.length; i++) {
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
return fetchPage(pages, param);
|
|
1549
|
-
});
|
|
1558
|
+
const param = getNextPageParam(options, result);
|
|
1559
|
+
result = await fetchPage(result, param);
|
|
1550
1560
|
}
|
|
1551
1561
|
}
|
|
1552
|
-
|
|
1553
|
-
pages,
|
|
1554
|
-
pageParams: newPageParams
|
|
1555
|
-
}));
|
|
1556
|
-
return finalPromise;
|
|
1562
|
+
return result;
|
|
1557
1563
|
};
|
|
1558
1564
|
}
|
|
1559
1565
|
};
|
|
1560
1566
|
}
|
|
1561
|
-
function getNextPageParam(options,
|
|
1562
|
-
|
|
1567
|
+
function getNextPageParam(options, {
|
|
1568
|
+
pages,
|
|
1569
|
+
pageParams
|
|
1570
|
+
}) {
|
|
1571
|
+
const lastIndex = pages.length - 1;
|
|
1572
|
+
return options.getNextPageParam(pages[lastIndex], pages, pageParams[lastIndex], pageParams);
|
|
1563
1573
|
}
|
|
1564
|
-
function getPreviousPageParam(options,
|
|
1565
|
-
|
|
1574
|
+
function getPreviousPageParam(options, {
|
|
1575
|
+
pages,
|
|
1576
|
+
pageParams
|
|
1577
|
+
}) {
|
|
1578
|
+
return options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams);
|
|
1566
1579
|
}
|
|
1567
1580
|
|
|
1568
1581
|
/**
|
|
1569
1582
|
* Checks if there is a next page.
|
|
1570
1583
|
*/
|
|
1571
|
-
function hasNextPage(options,
|
|
1572
|
-
if (!
|
|
1573
|
-
return typeof getNextPageParam(options,
|
|
1584
|
+
function hasNextPage(options, data) {
|
|
1585
|
+
if (!data) return false;
|
|
1586
|
+
return typeof getNextPageParam(options, data) !== 'undefined';
|
|
1574
1587
|
}
|
|
1575
1588
|
|
|
1576
1589
|
/**
|
|
1577
1590
|
* Checks if there is a previous page.
|
|
1578
1591
|
*/
|
|
1579
|
-
function hasPreviousPage(options,
|
|
1580
|
-
if (!
|
|
1581
|
-
return typeof getPreviousPageParam(options,
|
|
1592
|
+
function hasPreviousPage(options, data) {
|
|
1593
|
+
if (!data || !options.getPreviousPageParam) return false;
|
|
1594
|
+
return typeof getPreviousPageParam(options, data) !== 'undefined';
|
|
1582
1595
|
}
|
|
1583
1596
|
|
|
1584
1597
|
// CLASS
|
|
@@ -1703,10 +1716,11 @@
|
|
|
1703
1716
|
});
|
|
1704
1717
|
}
|
|
1705
1718
|
cancelQueries(filters = {}, cancelOptions = {}) {
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1719
|
+
const defaultedCancelOptions = {
|
|
1720
|
+
revert: true,
|
|
1721
|
+
...cancelOptions
|
|
1722
|
+
};
|
|
1723
|
+
const promises = notifyManager.batch(() => this.#queryCache.findAll(filters).map(query => query.cancel(defaultedCancelOptions)));
|
|
1710
1724
|
return Promise.all(promises).then(noop$1).catch(noop$1);
|
|
1711
1725
|
}
|
|
1712
1726
|
invalidateQueries(filters = {}, options = {}) {
|
|
@@ -1855,10 +1869,12 @@
|
|
|
1855
1869
|
#currentResult = undefined;
|
|
1856
1870
|
#currentResultState;
|
|
1857
1871
|
#currentResultOptions;
|
|
1858
|
-
#previousQueryResult;
|
|
1859
1872
|
#selectError;
|
|
1860
1873
|
#selectFn;
|
|
1861
1874
|
#selectResult;
|
|
1875
|
+
// This property keeps track of the last defined query data.
|
|
1876
|
+
// It will be used to pass the previous data to the placeholder function between renders.
|
|
1877
|
+
#lastDefinedQueryData;
|
|
1862
1878
|
#staleTimeoutId;
|
|
1863
1879
|
#refetchIntervalId;
|
|
1864
1880
|
#currentRefetchInterval;
|
|
@@ -2053,7 +2069,6 @@
|
|
|
2053
2069
|
const prevResultOptions = this.#currentResultOptions;
|
|
2054
2070
|
const queryChange = query !== prevQuery;
|
|
2055
2071
|
const queryInitialState = queryChange ? query.state : this.#currentQueryInitialState;
|
|
2056
|
-
const prevQueryResult = queryChange ? this.#currentResult : this.#previousQueryResult;
|
|
2057
2072
|
const {
|
|
2058
2073
|
state
|
|
2059
2074
|
} = query;
|
|
@@ -2112,7 +2127,7 @@
|
|
|
2112
2127
|
if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) {
|
|
2113
2128
|
placeholderData = prevResult.data;
|
|
2114
2129
|
} else {
|
|
2115
|
-
placeholderData = typeof options.placeholderData === 'function' ? options.placeholderData(
|
|
2130
|
+
placeholderData = typeof options.placeholderData === 'function' ? options.placeholderData(this.#lastDefinedQueryData) : options.placeholderData;
|
|
2116
2131
|
if (options.select && typeof placeholderData !== 'undefined') {
|
|
2117
2132
|
try {
|
|
2118
2133
|
placeholderData = options.select(placeholderData);
|
|
@@ -2176,6 +2191,9 @@
|
|
|
2176
2191
|
if (shallowEqualObjects(nextResult, prevResult)) {
|
|
2177
2192
|
return;
|
|
2178
2193
|
}
|
|
2194
|
+
if (this.#currentResultState.data !== undefined) {
|
|
2195
|
+
this.#lastDefinedQueryData = this.#currentResultState.data;
|
|
2196
|
+
}
|
|
2179
2197
|
this.#currentResult = nextResult;
|
|
2180
2198
|
|
|
2181
2199
|
// Determine which callbacks to trigger
|
|
@@ -2216,36 +2234,20 @@
|
|
|
2216
2234
|
const prevQuery = this.#currentQuery;
|
|
2217
2235
|
this.#currentQuery = query;
|
|
2218
2236
|
this.#currentQueryInitialState = query.state;
|
|
2219
|
-
this.#previousQueryResult = this.#currentResult;
|
|
2220
2237
|
if (this.hasListeners()) {
|
|
2221
2238
|
prevQuery?.removeObserver(this);
|
|
2222
2239
|
query.addObserver(this);
|
|
2223
2240
|
}
|
|
2224
2241
|
}
|
|
2225
|
-
onQueryUpdate(
|
|
2226
|
-
|
|
2227
|
-
if (action.type === 'success') {
|
|
2228
|
-
notifyOptions.onSuccess = !action.manual;
|
|
2229
|
-
} else if (action.type === 'error' && !isCancelledError(action.error)) {
|
|
2230
|
-
notifyOptions.onError = true;
|
|
2231
|
-
}
|
|
2232
|
-
this.#updateResult(notifyOptions);
|
|
2242
|
+
onQueryUpdate() {
|
|
2243
|
+
this.#updateResult();
|
|
2233
2244
|
if (this.hasListeners()) {
|
|
2234
2245
|
this.#updateTimers();
|
|
2235
2246
|
}
|
|
2236
2247
|
}
|
|
2237
2248
|
#notify(notifyOptions) {
|
|
2238
2249
|
notifyManager.batch(() => {
|
|
2239
|
-
// First trigger the
|
|
2240
|
-
if (notifyOptions.onSuccess) {
|
|
2241
|
-
this.options.onSuccess?.(this.#currentResult.data);
|
|
2242
|
-
this.options.onSettled?.(this.#currentResult.data, null);
|
|
2243
|
-
} else if (notifyOptions.onError) {
|
|
2244
|
-
this.options.onError?.(this.#currentResult.error);
|
|
2245
|
-
this.options.onSettled?.(undefined, this.#currentResult.error);
|
|
2246
|
-
}
|
|
2247
|
-
|
|
2248
|
-
// Then trigger the listeners
|
|
2250
|
+
// First, trigger the listeners
|
|
2249
2251
|
if (notifyOptions.listeners) {
|
|
2250
2252
|
this.listeners.forEach(listener => {
|
|
2251
2253
|
listener(this.#currentResult);
|
|
@@ -2367,9 +2369,10 @@
|
|
|
2367
2369
|
}
|
|
2368
2370
|
#findMatchingObservers(queries) {
|
|
2369
2371
|
const prevObservers = this.#observers;
|
|
2372
|
+
const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));
|
|
2370
2373
|
const defaultedQueryOptions = queries.map(options => this.#client.defaultQueryOptions(options));
|
|
2371
2374
|
const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {
|
|
2372
|
-
const match =
|
|
2375
|
+
const match = prevObserversMap.get(defaultedOptions.queryHash);
|
|
2373
2376
|
if (match != null) {
|
|
2374
2377
|
return [{
|
|
2375
2378
|
defaultedQueryOptions: defaultedOptions,
|
|
@@ -2378,8 +2381,8 @@
|
|
|
2378
2381
|
}
|
|
2379
2382
|
return [];
|
|
2380
2383
|
});
|
|
2381
|
-
const matchedQueryHashes = matchingObservers.map(match => match.defaultedQueryOptions.queryHash);
|
|
2382
|
-
const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.
|
|
2384
|
+
const matchedQueryHashes = new Set(matchingObservers.map(match => match.defaultedQueryOptions.queryHash));
|
|
2385
|
+
const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.has(defaultedOptions.queryHash));
|
|
2383
2386
|
const getObserver = options => {
|
|
2384
2387
|
const defaultedOptions = this.#client.defaultQueryOptions(options);
|
|
2385
2388
|
const currentObserver = this.#observers.find(o => o.options.queryHash === defaultedOptions.queryHash);
|
|
@@ -2436,7 +2439,7 @@
|
|
|
2436
2439
|
options.behavior = infiniteQueryBehavior();
|
|
2437
2440
|
return super.getOptimisticResult(options);
|
|
2438
2441
|
}
|
|
2439
|
-
fetchNextPage(options
|
|
2442
|
+
fetchNextPage(options) {
|
|
2440
2443
|
return this.fetch({
|
|
2441
2444
|
...options,
|
|
2442
2445
|
meta: {
|
|
@@ -2446,9 +2449,7 @@
|
|
|
2446
2449
|
}
|
|
2447
2450
|
});
|
|
2448
2451
|
}
|
|
2449
|
-
fetchPreviousPage({
|
|
2450
|
-
...options
|
|
2451
|
-
} = {}) {
|
|
2452
|
+
fetchPreviousPage(options) {
|
|
2452
2453
|
return this.fetch({
|
|
2453
2454
|
...options,
|
|
2454
2455
|
meta: {
|
|
@@ -2473,8 +2474,8 @@
|
|
|
2473
2474
|
...result,
|
|
2474
2475
|
fetchNextPage: this.fetchNextPage,
|
|
2475
2476
|
fetchPreviousPage: this.fetchPreviousPage,
|
|
2476
|
-
hasNextPage: hasNextPage(options, state.data
|
|
2477
|
-
hasPreviousPage: hasPreviousPage(options, state.data
|
|
2477
|
+
hasNextPage: hasNextPage(options, state.data),
|
|
2478
|
+
hasPreviousPage: hasPreviousPage(options, state.data),
|
|
2478
2479
|
isFetchingNextPage,
|
|
2479
2480
|
isFetchingPreviousPage,
|
|
2480
2481
|
isRefetching: isRefetching && !isFetchingNextPage && !isFetchingPreviousPage
|
|
@@ -2512,6 +2513,7 @@
|
|
|
2512
2513
|
observer: this
|
|
2513
2514
|
});
|
|
2514
2515
|
}
|
|
2516
|
+
this.#currentMutation?.setOptions(this.options);
|
|
2515
2517
|
}
|
|
2516
2518
|
onUnsubscribe() {
|
|
2517
2519
|
if (!this.listeners.length) {
|
|
@@ -2599,24 +2601,10 @@
|
|
|
2599
2601
|
return query.state.status === 'success';
|
|
2600
2602
|
}
|
|
2601
2603
|
function dehydrate(client, options = {}) {
|
|
2602
|
-
const
|
|
2603
|
-
const
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
client.getMutationCache().getAll().forEach(mutation => {
|
|
2607
|
-
if (shouldDehydrateMutation(mutation)) {
|
|
2608
|
-
mutations.push(dehydrateMutation(mutation));
|
|
2609
|
-
}
|
|
2610
|
-
});
|
|
2611
|
-
}
|
|
2612
|
-
if (options.dehydrateQueries !== false) {
|
|
2613
|
-
const shouldDehydrateQuery = options.shouldDehydrateQuery || defaultShouldDehydrateQuery;
|
|
2614
|
-
client.getQueryCache().getAll().forEach(query => {
|
|
2615
|
-
if (shouldDehydrateQuery(query)) {
|
|
2616
|
-
queries.push(dehydrateQuery(query));
|
|
2617
|
-
}
|
|
2618
|
-
});
|
|
2619
|
-
}
|
|
2604
|
+
const filterMutation = options.shouldDehydrateMutation ?? defaultShouldDehydrateMutation;
|
|
2605
|
+
const mutations = client.getMutationCache().getAll().flatMap(mutation => filterMutation(mutation) ? [dehydrateMutation(mutation)] : []);
|
|
2606
|
+
const filterQuery = options.shouldDehydrateQuery ?? defaultShouldDehydrateQuery;
|
|
2607
|
+
const queries = client.getQueryCache().getAll().flatMap(query => filterQuery(query) ? [dehydrateQuery(query)] : []);
|
|
2620
2608
|
return {
|
|
2621
2609
|
mutations,
|
|
2622
2610
|
queries
|
|
@@ -2770,26 +2758,19 @@
|
|
|
2770
2758
|
};
|
|
2771
2759
|
const willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;
|
|
2772
2760
|
const shouldSuspend = (defaultedOptions, result, isRestoring) => defaultedOptions?.suspense && willFetch(result, isRestoring);
|
|
2773
|
-
const fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).
|
|
2774
|
-
data
|
|
2775
|
-
}) => {
|
|
2776
|
-
defaultedOptions.onSuccess?.(data);
|
|
2777
|
-
defaultedOptions.onSettled?.(data, null);
|
|
2778
|
-
}).catch(error => {
|
|
2761
|
+
const fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => {
|
|
2779
2762
|
errorResetBoundary.clearReset();
|
|
2780
|
-
defaultedOptions.onError?.(error);
|
|
2781
|
-
defaultedOptions.onSettled?.(undefined, error);
|
|
2782
2763
|
});
|
|
2783
2764
|
|
|
2784
2765
|
// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
|
|
2785
2766
|
// `placeholderData` function does not have a parameter
|
|
2786
2767
|
|
|
2787
2768
|
function useQueries({
|
|
2788
|
-
queries
|
|
2789
|
-
|
|
2790
|
-
}) {
|
|
2769
|
+
queries
|
|
2770
|
+
}, queryClient) {
|
|
2791
2771
|
const client = useQueryClient(queryClient);
|
|
2792
2772
|
const isRestoring = useIsRestoring();
|
|
2773
|
+
const errorResetBoundary = useQueryErrorResetBoundary();
|
|
2793
2774
|
const defaultedQueries = React__namespace.useMemo(() => queries.map(options => {
|
|
2794
2775
|
const defaultedOptions = client.defaultQueryOptions(options);
|
|
2795
2776
|
|
|
@@ -2797,6 +2778,11 @@
|
|
|
2797
2778
|
defaultedOptions._optimisticResults = isRestoring ? 'isRestoring' : 'optimistic';
|
|
2798
2779
|
return defaultedOptions;
|
|
2799
2780
|
}), [queries, client, isRestoring]);
|
|
2781
|
+
defaultedQueries.forEach(query => {
|
|
2782
|
+
ensureStaleTime(query);
|
|
2783
|
+
ensurePreventErrorBoundaryRetry(query, errorResetBoundary);
|
|
2784
|
+
});
|
|
2785
|
+
useClearResetErrorBoundary(errorResetBoundary);
|
|
2800
2786
|
const [observer] = React__namespace.useState(() => new QueriesObserver(client, defaultedQueries));
|
|
2801
2787
|
const optimisticResult = observer.getOptimisticResult(defaultedQueries);
|
|
2802
2788
|
React__namespace.useSyncExternalStore(React__namespace.useCallback(onStoreChange => isRestoring ? () => undefined : observer.subscribe(notifyManager.batchCalls(onStoreChange)), [observer, isRestoring]), () => observer.getCurrentResult(), () => observer.getCurrentResult());
|
|
@@ -2807,12 +2793,6 @@
|
|
|
2807
2793
|
listeners: false
|
|
2808
2794
|
});
|
|
2809
2795
|
}, [defaultedQueries, observer]);
|
|
2810
|
-
const errorResetBoundary = useQueryErrorResetBoundary();
|
|
2811
|
-
defaultedQueries.forEach(query => {
|
|
2812
|
-
ensurePreventErrorBoundaryRetry(query, errorResetBoundary);
|
|
2813
|
-
ensureStaleTime(query);
|
|
2814
|
-
});
|
|
2815
|
-
useClearResetErrorBoundary(errorResetBoundary);
|
|
2816
2796
|
const shouldAtLeastOneSuspend = optimisticResult.some((result, index) => shouldSuspend(defaultedQueries[index], result, isRestoring));
|
|
2817
2797
|
const suspensePromises = shouldAtLeastOneSuspend ? optimisticResult.flatMap((result, index) => {
|
|
2818
2798
|
const options = defaultedQueries[index];
|
|
@@ -2829,11 +2809,12 @@
|
|
|
2829
2809
|
if (suspensePromises.length > 0) {
|
|
2830
2810
|
throw Promise.all(suspensePromises);
|
|
2831
2811
|
}
|
|
2812
|
+
const observerQueries = observer.getQueries();
|
|
2832
2813
|
const firstSingleResultWhichShouldThrow = optimisticResult.find((result, index) => getHasError({
|
|
2833
2814
|
result,
|
|
2834
2815
|
errorResetBoundary,
|
|
2835
2816
|
throwErrors: defaultedQueries[index]?.throwErrors ?? false,
|
|
2836
|
-
query:
|
|
2817
|
+
query: observerQueries[index]
|
|
2837
2818
|
}));
|
|
2838
2819
|
if (firstSingleResultWhichShouldThrow?.error) {
|
|
2839
2820
|
throw firstSingleResultWhichShouldThrow.error;
|
|
@@ -2849,17 +2830,6 @@
|
|
|
2849
2830
|
|
|
2850
2831
|
// Make sure results are optimistically set in fetching state before subscribing or updating options
|
|
2851
2832
|
defaultedOptions._optimisticResults = isRestoring ? 'isRestoring' : 'optimistic';
|
|
2852
|
-
|
|
2853
|
-
// Include callbacks in batch renders
|
|
2854
|
-
if (defaultedOptions.onError) {
|
|
2855
|
-
defaultedOptions.onError = notifyManager.batchCalls(defaultedOptions.onError);
|
|
2856
|
-
}
|
|
2857
|
-
if (defaultedOptions.onSuccess) {
|
|
2858
|
-
defaultedOptions.onSuccess = notifyManager.batchCalls(defaultedOptions.onSuccess);
|
|
2859
|
-
}
|
|
2860
|
-
if (defaultedOptions.onSettled) {
|
|
2861
|
-
defaultedOptions.onSettled = notifyManager.batchCalls(defaultedOptions.onSettled);
|
|
2862
|
-
}
|
|
2863
2833
|
ensureStaleTime(defaultedOptions);
|
|
2864
2834
|
ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary);
|
|
2865
2835
|
useClearResetErrorBoundary(errorResetBoundary);
|