@tanstack/react-query 4.35.7 → 4.39.0
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/__tests__/queryOptions.types.test.d.ts +2 -0
- package/build/lib/__tests__/useSuspenseQueries.types.test.d.ts +6 -0
- package/build/lib/__tests__/useSuspenseQuery.types.test.d.ts +2 -0
- package/build/lib/__tests__/utils.d.ts +1 -0
- package/build/lib/index.d.ts +3 -0
- package/build/lib/queryOptions.d.ts +14 -0
- package/build/lib/useQueries.d.ts +22 -11
- package/build/lib/useQuery.d.ts +21 -14
- package/build/lib/useSuspenseQueries.d.ts +66 -0
- package/build/lib/useSuspenseQuery.d.ts +8 -0
- package/package.json +3 -10
- package/src/__tests__/queryOptions.types.test.tsx +270 -0
- package/src/__tests__/useQuery.types.test.tsx +1 -2
- package/src/__tests__/useSuspenseQueries.types.test.tsx +102 -0
- package/src/__tests__/useSuspenseQuery.types.test.tsx +81 -0
- package/src/__tests__/utils.tsx +2 -0
- package/src/index.ts +3 -0
- package/src/queryOptions.ts +86 -0
- package/src/useQueries.ts +50 -22
- package/src/useQuery.ts +55 -22
- package/src/useSuspenseQueries.ts +162 -0
- package/src/useSuspenseQuery.ts +58 -0
- package/build/lib/Hydrate.esm.js +0 -32
- package/build/lib/Hydrate.esm.js.map +0 -1
- package/build/lib/Hydrate.js +0 -57
- package/build/lib/Hydrate.js.map +0 -1
- package/build/lib/Hydrate.mjs +0 -32
- package/build/lib/Hydrate.mjs.map +0 -1
- package/build/lib/QueryClientProvider.esm.js +0 -66
- package/build/lib/QueryClientProvider.esm.js.map +0 -1
- package/build/lib/QueryClientProvider.js +0 -92
- package/build/lib/QueryClientProvider.js.map +0 -1
- package/build/lib/QueryClientProvider.mjs +0 -66
- package/build/lib/QueryClientProvider.mjs.map +0 -1
- package/build/lib/QueryErrorResetBoundary.esm.js +0 -33
- package/build/lib/QueryErrorResetBoundary.esm.js.map +0 -1
- package/build/lib/QueryErrorResetBoundary.js +0 -58
- package/build/lib/QueryErrorResetBoundary.js.map +0 -1
- package/build/lib/QueryErrorResetBoundary.mjs +0 -33
- package/build/lib/QueryErrorResetBoundary.mjs.map +0 -1
- package/build/lib/errorBoundaryUtils.esm.js +0 -28
- package/build/lib/errorBoundaryUtils.esm.js.map +0 -1
- package/build/lib/errorBoundaryUtils.js +0 -54
- package/build/lib/errorBoundaryUtils.js.map +0 -1
- package/build/lib/errorBoundaryUtils.mjs +0 -28
- package/build/lib/errorBoundaryUtils.mjs.map +0 -1
- package/build/lib/index.esm.js +0 -13
- package/build/lib/index.esm.js.map +0 -1
- package/build/lib/index.js +0 -41
- package/build/lib/index.js.map +0 -1
- package/build/lib/index.mjs +0 -13
- package/build/lib/index.mjs.map +0 -1
- package/build/lib/isRestoring.esm.js +0 -9
- package/build/lib/isRestoring.esm.js.map +0 -1
- package/build/lib/isRestoring.js +0 -34
- package/build/lib/isRestoring.js.map +0 -1
- package/build/lib/isRestoring.mjs +0 -9
- package/build/lib/isRestoring.mjs.map +0 -1
- package/build/lib/reactBatchedUpdates.esm.js +0 -7
- package/build/lib/reactBatchedUpdates.esm.js.map +0 -1
- package/build/lib/reactBatchedUpdates.js +0 -31
- package/build/lib/reactBatchedUpdates.js.map +0 -1
- package/build/lib/reactBatchedUpdates.mjs +0 -7
- package/build/lib/reactBatchedUpdates.mjs.map +0 -1
- package/build/lib/reactBatchedUpdates.native.esm.js +0 -2
- package/build/lib/reactBatchedUpdates.native.esm.js.map +0 -1
- package/build/lib/reactBatchedUpdates.native.js +0 -13
- package/build/lib/reactBatchedUpdates.native.js.map +0 -1
- package/build/lib/reactBatchedUpdates.native.mjs +0 -2
- package/build/lib/reactBatchedUpdates.native.mjs.map +0 -1
- package/build/lib/setBatchUpdatesFn.esm.js +0 -5
- package/build/lib/setBatchUpdatesFn.esm.js.map +0 -1
- package/build/lib/setBatchUpdatesFn.js +0 -7
- package/build/lib/setBatchUpdatesFn.js.map +0 -1
- package/build/lib/setBatchUpdatesFn.mjs +0 -5
- package/build/lib/setBatchUpdatesFn.mjs.map +0 -1
- package/build/lib/suspense.esm.js +0 -24
- package/build/lib/suspense.esm.js.map +0 -1
- package/build/lib/suspense.js +0 -31
- package/build/lib/suspense.js.map +0 -1
- package/build/lib/suspense.mjs +0 -24
- package/build/lib/suspense.mjs.map +0 -1
- package/build/lib/useBaseQuery.esm.js +0 -72
- package/build/lib/useBaseQuery.esm.js.map +0 -1
- package/build/lib/useBaseQuery.js +0 -96
- package/build/lib/useBaseQuery.js.map +0 -1
- package/build/lib/useBaseQuery.mjs +0 -72
- package/build/lib/useBaseQuery.mjs.map +0 -1
- package/build/lib/useInfiniteQuery.esm.js +0 -11
- package/build/lib/useInfiniteQuery.esm.js.map +0 -1
- package/build/lib/useInfiniteQuery.js +0 -15
- package/build/lib/useInfiniteQuery.js.map +0 -1
- package/build/lib/useInfiniteQuery.mjs +0 -11
- package/build/lib/useInfiniteQuery.mjs.map +0 -1
- package/build/lib/useIsFetching.esm.js +0 -17
- package/build/lib/useIsFetching.esm.js.map +0 -1
- package/build/lib/useIsFetching.js +0 -41
- package/build/lib/useIsFetching.js.map +0 -1
- package/build/lib/useIsFetching.mjs +0 -17
- package/build/lib/useIsFetching.mjs.map +0 -1
- package/build/lib/useIsMutating.esm.js +0 -17
- package/build/lib/useIsMutating.esm.js.map +0 -1
- package/build/lib/useIsMutating.js +0 -41
- package/build/lib/useIsMutating.js.map +0 -1
- package/build/lib/useIsMutating.mjs +0 -17
- package/build/lib/useIsMutating.mjs.map +0 -1
- package/build/lib/useMutation.esm.js +0 -35
- package/build/lib/useMutation.esm.js.map +0 -1
- package/build/lib/useMutation.js +0 -59
- package/build/lib/useMutation.js.map +0 -1
- package/build/lib/useMutation.mjs +0 -35
- package/build/lib/useMutation.mjs.map +0 -1
- package/build/lib/useQueries.esm.js +0 -81
- package/build/lib/useQueries.esm.js.map +0 -1
- package/build/lib/useQueries.js +0 -105
- package/build/lib/useQueries.js.map +0 -1
- package/build/lib/useQueries.mjs +0 -81
- package/build/lib/useQueries.mjs.map +0 -1
- package/build/lib/useQuery.esm.js +0 -11
- package/build/lib/useQuery.esm.js.map +0 -1
- package/build/lib/useQuery.js +0 -15
- package/build/lib/useQuery.js.map +0 -1
- package/build/lib/useQuery.mjs +0 -11
- package/build/lib/useQuery.mjs.map +0 -1
- package/build/lib/useSyncExternalStore.esm.js +0 -7
- package/build/lib/useSyncExternalStore.esm.js.map +0 -1
- package/build/lib/useSyncExternalStore.js +0 -11
- package/build/lib/useSyncExternalStore.js.map +0 -1
- package/build/lib/useSyncExternalStore.mjs +0 -7
- package/build/lib/useSyncExternalStore.mjs.map +0 -1
- package/build/lib/useSyncExternalStore.native.esm.js +0 -2
- package/build/lib/useSyncExternalStore.native.esm.js.map +0 -1
- package/build/lib/useSyncExternalStore.native.js +0 -13
- package/build/lib/useSyncExternalStore.native.js.map +0 -1
- package/build/lib/useSyncExternalStore.native.mjs +0 -2
- package/build/lib/useSyncExternalStore.native.mjs.map +0 -1
- package/build/lib/utils.esm.js +0 -11
- package/build/lib/utils.esm.js.map +0 -1
- package/build/lib/utils.js +0 -15
- package/build/lib/utils.js.map +0 -1
- package/build/lib/utils.mjs +0 -11
- package/build/lib/utils.mjs.map +0 -1
- package/build/umd/index.development.js +0 -3961
- package/build/umd/index.development.js.map +0 -1
- package/build/umd/index.production.js +0 -2
- package/build/umd/index.production.js.map +0 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { expectTypeOf } from 'expect-type'
|
|
2
|
+
import { queryOptions } from '..'
|
|
3
|
+
import { useSuspenseQueries } from '..'
|
|
4
|
+
import { doNotExecute } from './utils'
|
|
5
|
+
import type { UseSuspenseQueryResult } from '../useSuspenseQuery'
|
|
6
|
+
|
|
7
|
+
export const queryKey = ['key'] as const
|
|
8
|
+
const sleep = (ms: number) =>
|
|
9
|
+
new Promise<undefined>((resolve) => setTimeout(() => resolve(undefined), ms))
|
|
10
|
+
export const queryFn = () => sleep(10).then(() => ({ text: 'response' }))
|
|
11
|
+
export const select = (data: Awaited<ReturnType<typeof queryFn>>) => data.text
|
|
12
|
+
|
|
13
|
+
describe('useSuspenseQueries', () => {
|
|
14
|
+
it('type check', () => {
|
|
15
|
+
doNotExecute(() => {
|
|
16
|
+
useSuspenseQueries({
|
|
17
|
+
queries: [
|
|
18
|
+
{
|
|
19
|
+
queryKey: [...queryKey, 1] as const,
|
|
20
|
+
queryFn,
|
|
21
|
+
// @ts-expect-error no suspense
|
|
22
|
+
suspense: false,
|
|
23
|
+
},
|
|
24
|
+
] as const,
|
|
25
|
+
})
|
|
26
|
+
useSuspenseQueries({
|
|
27
|
+
queries: [
|
|
28
|
+
{
|
|
29
|
+
queryKey: [...queryKey, 2] as const,
|
|
30
|
+
queryFn,
|
|
31
|
+
select,
|
|
32
|
+
// @ts-expect-error no suspense
|
|
33
|
+
suspense: true,
|
|
34
|
+
},
|
|
35
|
+
] as const,
|
|
36
|
+
})
|
|
37
|
+
useSuspenseQueries({
|
|
38
|
+
queries: [
|
|
39
|
+
{
|
|
40
|
+
queryKey: [...queryKey, 3] as const,
|
|
41
|
+
queryFn,
|
|
42
|
+
// @ts-expect-error no enabled
|
|
43
|
+
enabled: true,
|
|
44
|
+
},
|
|
45
|
+
] as const,
|
|
46
|
+
})
|
|
47
|
+
useSuspenseQueries({
|
|
48
|
+
queries: [
|
|
49
|
+
{
|
|
50
|
+
queryKey: [...queryKey, 4] as const,
|
|
51
|
+
queryFn,
|
|
52
|
+
// @ts-expect-error no enabled
|
|
53
|
+
enabled: true,
|
|
54
|
+
select,
|
|
55
|
+
},
|
|
56
|
+
] as const,
|
|
57
|
+
})
|
|
58
|
+
useSuspenseQueries({
|
|
59
|
+
queries: [
|
|
60
|
+
{
|
|
61
|
+
queryKey: [...queryKey, 4] as const,
|
|
62
|
+
queryFn,
|
|
63
|
+
// @ts-expect-error no networkMode
|
|
64
|
+
networkMode: 'always',
|
|
65
|
+
select,
|
|
66
|
+
},
|
|
67
|
+
] as const,
|
|
68
|
+
})
|
|
69
|
+
useSuspenseQueries({
|
|
70
|
+
queries: [
|
|
71
|
+
queryOptions({
|
|
72
|
+
queryKey: [...queryKey, 4] as const,
|
|
73
|
+
queryFn: () => Promise.resolve({ field: 'success' }),
|
|
74
|
+
select: (data) => data.field,
|
|
75
|
+
}),
|
|
76
|
+
] as const,
|
|
77
|
+
})
|
|
78
|
+
// @ts-expect-error if no items
|
|
79
|
+
useSuspenseQueries({})
|
|
80
|
+
// @ts-expect-error if no items
|
|
81
|
+
useSuspenseQueries()
|
|
82
|
+
|
|
83
|
+
const [query1, query2, query3] = useSuspenseQueries({
|
|
84
|
+
queries: [
|
|
85
|
+
{ queryKey: [...queryKey, 5] as const, queryFn },
|
|
86
|
+
{ queryKey: [...queryKey, 6] as const, queryFn, select },
|
|
87
|
+
queryOptions({
|
|
88
|
+
queryKey: [...queryKey, 4] as const,
|
|
89
|
+
queryFn: () => Promise.resolve({ field: 'success' }),
|
|
90
|
+
select: (data) => data.field,
|
|
91
|
+
}),
|
|
92
|
+
] as const,
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
expectTypeOf(query1).toEqualTypeOf<
|
|
96
|
+
UseSuspenseQueryResult<{ text: string }>
|
|
97
|
+
>()
|
|
98
|
+
expectTypeOf(query2).toEqualTypeOf<UseSuspenseQueryResult<string>>()
|
|
99
|
+
expectTypeOf(query3).toEqualTypeOf<UseSuspenseQueryResult<string>>()
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
})
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { expectTypeOf } from 'expect-type'
|
|
2
|
+
import {
|
|
3
|
+
type UseSuspenseQueryResult,
|
|
4
|
+
useSuspenseQuery,
|
|
5
|
+
} from '../useSuspenseQuery'
|
|
6
|
+
import { queryOptions } from '..'
|
|
7
|
+
import { doNotExecute } from './utils'
|
|
8
|
+
|
|
9
|
+
const queryKey = ['key'] as const
|
|
10
|
+
const sleep = (ms: number) =>
|
|
11
|
+
new Promise<undefined>((resolve) => setTimeout(() => resolve(undefined), ms))
|
|
12
|
+
const queryFn = () => sleep(10).then(() => ({ text: 'response' }))
|
|
13
|
+
|
|
14
|
+
describe('useSuspenseQuery', () => {
|
|
15
|
+
it('type check', () => {
|
|
16
|
+
doNotExecute(() => {
|
|
17
|
+
//@ts-expect-error no arg
|
|
18
|
+
useSuspenseQuery()
|
|
19
|
+
useSuspenseQuery({
|
|
20
|
+
queryKey,
|
|
21
|
+
queryFn,
|
|
22
|
+
//@ts-expect-error no suspense
|
|
23
|
+
suspense: boolean,
|
|
24
|
+
})
|
|
25
|
+
useSuspenseQuery({
|
|
26
|
+
queryKey,
|
|
27
|
+
queryFn,
|
|
28
|
+
//@ts-expect-error no useErrorBoundary
|
|
29
|
+
useErrorBoundary: boolean,
|
|
30
|
+
})
|
|
31
|
+
useSuspenseQuery({
|
|
32
|
+
queryKey,
|
|
33
|
+
queryFn,
|
|
34
|
+
//@ts-expect-error no enabled
|
|
35
|
+
enabled: boolean,
|
|
36
|
+
})
|
|
37
|
+
useSuspenseQuery({
|
|
38
|
+
queryKey,
|
|
39
|
+
queryFn,
|
|
40
|
+
//@ts-expect-error no placeholderData
|
|
41
|
+
placeholderData: 'placeholder',
|
|
42
|
+
})
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
44
|
+
useSuspenseQuery({
|
|
45
|
+
queryKey,
|
|
46
|
+
queryFn,
|
|
47
|
+
//@ts-expect-error no isPlaceholderData
|
|
48
|
+
}).isPlaceholderData
|
|
49
|
+
useSuspenseQuery({
|
|
50
|
+
queryKey,
|
|
51
|
+
queryFn,
|
|
52
|
+
//@ts-expect-error no networkMode
|
|
53
|
+
networkMode: 'always',
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
expectTypeOf(useSuspenseQuery({ queryKey, queryFn })).toEqualTypeOf<
|
|
57
|
+
UseSuspenseQueryResult<{ text: string }>
|
|
58
|
+
>()
|
|
59
|
+
expectTypeOf(
|
|
60
|
+
useSuspenseQuery({
|
|
61
|
+
queryKey,
|
|
62
|
+
queryFn,
|
|
63
|
+
select: (data) => data.text,
|
|
64
|
+
}),
|
|
65
|
+
).toEqualTypeOf<UseSuspenseQueryResult<string>>()
|
|
66
|
+
const options = queryOptions({
|
|
67
|
+
queryKey,
|
|
68
|
+
queryFn,
|
|
69
|
+
})
|
|
70
|
+
expectTypeOf(useSuspenseQuery(options)).toEqualTypeOf<
|
|
71
|
+
UseSuspenseQueryResult<{ text: string }>
|
|
72
|
+
>()
|
|
73
|
+
expectTypeOf(
|
|
74
|
+
useSuspenseQuery({
|
|
75
|
+
...options,
|
|
76
|
+
select: (data) => data.text,
|
|
77
|
+
}),
|
|
78
|
+
).toEqualTypeOf<UseSuspenseQueryResult<string>>()
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
})
|
package/src/__tests__/utils.tsx
CHANGED
|
@@ -4,6 +4,8 @@ import * as utils from '@tanstack/query-core'
|
|
|
4
4
|
import { QueryClient, QueryClientProvider } from '..'
|
|
5
5
|
import type { ContextOptions, MutationOptions, QueryClientConfig } from '..'
|
|
6
6
|
|
|
7
|
+
export const doNotExecute = (_func: () => void) => true
|
|
8
|
+
|
|
7
9
|
export function renderWithClient(
|
|
8
10
|
client: QueryClient,
|
|
9
11
|
ui: React.ReactElement,
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,8 @@ export * from './types'
|
|
|
11
11
|
export { useQueries } from './useQueries'
|
|
12
12
|
export type { QueriesResults, QueriesOptions } from './useQueries'
|
|
13
13
|
export { useQuery } from './useQuery'
|
|
14
|
+
export { useSuspenseQuery } from './useSuspenseQuery'
|
|
15
|
+
export { useSuspenseQueries } from './useSuspenseQueries'
|
|
14
16
|
export {
|
|
15
17
|
defaultContext,
|
|
16
18
|
QueryClientProvider,
|
|
@@ -29,3 +31,4 @@ export { useIsMutating } from './useIsMutating'
|
|
|
29
31
|
export { useMutation } from './useMutation'
|
|
30
32
|
export { useInfiniteQuery } from './useInfiniteQuery'
|
|
31
33
|
export { useIsRestoring, IsRestoringProvider } from './isRestoring'
|
|
34
|
+
export { queryOptions } from './queryOptions'
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
InitialDataFunction,
|
|
3
|
+
NonUndefinedGuard,
|
|
4
|
+
OmitKeyof,
|
|
5
|
+
QueryKey,
|
|
6
|
+
WithRequired,
|
|
7
|
+
} from '@tanstack/query-core'
|
|
8
|
+
import type { UseQueryOptions } from './types'
|
|
9
|
+
|
|
10
|
+
type UseQueryOptionsOmitted<
|
|
11
|
+
TQueryFnData = unknown,
|
|
12
|
+
TError = unknown,
|
|
13
|
+
TData = TQueryFnData,
|
|
14
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
15
|
+
> = OmitKeyof<
|
|
16
|
+
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
17
|
+
'onSuccess' | 'onError' | 'onSettled' | 'refetchInterval'
|
|
18
|
+
>
|
|
19
|
+
|
|
20
|
+
type ProhibitedQueryOptionsKeyInV5 = keyof Pick<
|
|
21
|
+
UseQueryOptionsOmitted,
|
|
22
|
+
'useErrorBoundary' | 'suspense' | 'getNextPageParam' | 'getPreviousPageParam'
|
|
23
|
+
>
|
|
24
|
+
|
|
25
|
+
export type UndefinedInitialDataOptions<
|
|
26
|
+
TQueryFnData = unknown,
|
|
27
|
+
TError = unknown,
|
|
28
|
+
TData = TQueryFnData,
|
|
29
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
30
|
+
> = UseQueryOptionsOmitted<TQueryFnData, TError, TData, TQueryKey> & {
|
|
31
|
+
initialData?:
|
|
32
|
+
| undefined
|
|
33
|
+
| InitialDataFunction<NonUndefinedGuard<TQueryFnData>>
|
|
34
|
+
| NonUndefinedGuard<TQueryFnData>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type DefinedInitialDataOptions<
|
|
38
|
+
TQueryFnData = unknown,
|
|
39
|
+
TError = unknown,
|
|
40
|
+
TData = TQueryFnData,
|
|
41
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
42
|
+
> = UseQueryOptionsOmitted<TQueryFnData, TError, TData, TQueryKey> & {
|
|
43
|
+
initialData:
|
|
44
|
+
| NonUndefinedGuard<TQueryFnData>
|
|
45
|
+
| (() => NonUndefinedGuard<TQueryFnData>)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function queryOptions<
|
|
49
|
+
TQueryFnData = unknown,
|
|
50
|
+
TError = unknown,
|
|
51
|
+
TData = TQueryFnData,
|
|
52
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
53
|
+
>(
|
|
54
|
+
options: WithRequired<
|
|
55
|
+
OmitKeyof<
|
|
56
|
+
DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
57
|
+
ProhibitedQueryOptionsKeyInV5
|
|
58
|
+
>,
|
|
59
|
+
'queryKey'
|
|
60
|
+
>,
|
|
61
|
+
): WithRequired<
|
|
62
|
+
DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
63
|
+
'queryKey'
|
|
64
|
+
>
|
|
65
|
+
|
|
66
|
+
export function queryOptions<
|
|
67
|
+
TQueryFnData = unknown,
|
|
68
|
+
TError = unknown,
|
|
69
|
+
TData = TQueryFnData,
|
|
70
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
71
|
+
>(
|
|
72
|
+
options: WithRequired<
|
|
73
|
+
OmitKeyof<
|
|
74
|
+
UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
75
|
+
ProhibitedQueryOptionsKeyInV5
|
|
76
|
+
>,
|
|
77
|
+
'queryKey'
|
|
78
|
+
>,
|
|
79
|
+
): WithRequired<
|
|
80
|
+
UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
81
|
+
'queryKey'
|
|
82
|
+
>
|
|
83
|
+
|
|
84
|
+
export function queryOptions(options: unknown) {
|
|
85
|
+
return options
|
|
86
|
+
}
|
package/src/useQueries.ts
CHANGED
|
@@ -17,8 +17,12 @@ import {
|
|
|
17
17
|
shouldSuspend,
|
|
18
18
|
willFetch,
|
|
19
19
|
} from './suspense'
|
|
20
|
-
import type { QueryFunction, QueryKey } from '@tanstack/query-core'
|
|
21
|
-
import type {
|
|
20
|
+
import type { OmitKeyof, QueryFunction, QueryKey } from '@tanstack/query-core'
|
|
21
|
+
import type {
|
|
22
|
+
DefinedUseQueryResult,
|
|
23
|
+
UseQueryOptions,
|
|
24
|
+
UseQueryResult,
|
|
25
|
+
} from './types'
|
|
22
26
|
|
|
23
27
|
// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
|
|
24
28
|
// - `context` is omitted as it is passed as a root-level option to `useQueries` instead.
|
|
@@ -27,7 +31,10 @@ type UseQueryOptionsForUseQueries<
|
|
|
27
31
|
TError = unknown,
|
|
28
32
|
TData = TQueryFnData,
|
|
29
33
|
TQueryKey extends QueryKey = QueryKey,
|
|
30
|
-
> =
|
|
34
|
+
> = OmitKeyof<
|
|
35
|
+
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
36
|
+
'context'
|
|
37
|
+
>
|
|
31
38
|
|
|
32
39
|
// Avoid TS depth-limit error in case of large array literal
|
|
33
40
|
type MAXIMUM_DEPTH = 20
|
|
@@ -67,29 +74,46 @@ type GetOptions<T> =
|
|
|
67
74
|
: // Fallback
|
|
68
75
|
UseQueryOptionsForUseQueries
|
|
69
76
|
|
|
70
|
-
|
|
77
|
+
// A defined initialData setting should return a DefinedUseQueryResult rather than UseQueryResult
|
|
78
|
+
type GetDefinedOrUndefinedQueryResult<T, TData, TError = unknown> = T extends {
|
|
79
|
+
initialData?: infer TInitialData
|
|
80
|
+
}
|
|
81
|
+
? unknown extends TInitialData
|
|
82
|
+
? UseQueryResult<TData, TError>
|
|
83
|
+
: TInitialData extends TData
|
|
84
|
+
? DefinedUseQueryResult<TData, TError>
|
|
85
|
+
: TInitialData extends () => infer TInitialDataResult
|
|
86
|
+
? unknown extends TInitialDataResult
|
|
87
|
+
? UseQueryResult<TData, TError>
|
|
88
|
+
: TInitialDataResult extends TData
|
|
89
|
+
? DefinedUseQueryResult<TData, TError>
|
|
90
|
+
: UseQueryResult<TData, TError>
|
|
91
|
+
: UseQueryResult<TData, TError>
|
|
92
|
+
: UseQueryResult<TData, TError>
|
|
93
|
+
|
|
94
|
+
type GetUseQueryResult<T> =
|
|
71
95
|
// Part 1: responsible for mapping explicit type parameter to function result, if object
|
|
72
96
|
T extends { queryFnData: any; error?: infer TError; data: infer TData }
|
|
73
|
-
?
|
|
97
|
+
? GetDefinedOrUndefinedQueryResult<T, TData, TError>
|
|
74
98
|
: T extends { queryFnData: infer TQueryFnData; error?: infer TError }
|
|
75
|
-
?
|
|
99
|
+
? GetDefinedOrUndefinedQueryResult<T, TQueryFnData, TError>
|
|
76
100
|
: T extends { data: infer TData; error?: infer TError }
|
|
77
|
-
?
|
|
101
|
+
? GetDefinedOrUndefinedQueryResult<T, TData, TError>
|
|
78
102
|
: // Part 2: responsible for mapping explicit type parameter to function result, if tuple
|
|
79
103
|
T extends [any, infer TError, infer TData]
|
|
80
|
-
?
|
|
104
|
+
? GetDefinedOrUndefinedQueryResult<T, TData, TError>
|
|
81
105
|
: T extends [infer TQueryFnData, infer TError]
|
|
82
|
-
?
|
|
106
|
+
? GetDefinedOrUndefinedQueryResult<T, TQueryFnData, TError>
|
|
83
107
|
: T extends [infer TQueryFnData]
|
|
84
|
-
?
|
|
108
|
+
? GetDefinedOrUndefinedQueryResult<T, TQueryFnData>
|
|
85
109
|
: // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided
|
|
86
110
|
T extends {
|
|
87
111
|
queryFn?: QueryFunction<unknown, any>
|
|
88
112
|
select: (data: any) => infer TData
|
|
89
113
|
}
|
|
90
|
-
?
|
|
114
|
+
? GetDefinedOrUndefinedQueryResult<T, TData>
|
|
91
115
|
: T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }
|
|
92
|
-
?
|
|
116
|
+
? GetDefinedOrUndefinedQueryResult<T, TQueryFnData>
|
|
93
117
|
: // Fallback
|
|
94
118
|
UseQueryResult
|
|
95
119
|
|
|
@@ -98,16 +122,16 @@ type GetResults<T> =
|
|
|
98
122
|
*/
|
|
99
123
|
export type QueriesOptions<
|
|
100
124
|
T extends any[],
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
> =
|
|
125
|
+
TResult extends any[] = [],
|
|
126
|
+
TDepth extends ReadonlyArray<number> = [],
|
|
127
|
+
> = TDepth['length'] extends MAXIMUM_DEPTH
|
|
104
128
|
? UseQueryOptionsForUseQueries[]
|
|
105
129
|
: T extends []
|
|
106
130
|
? []
|
|
107
131
|
: T extends [infer Head]
|
|
108
|
-
? [...
|
|
132
|
+
? [...TResult, GetOptions<Head>]
|
|
109
133
|
: T extends [infer Head, ...infer Tail]
|
|
110
|
-
? QueriesOptions<[...Tail], [...
|
|
134
|
+
? QueriesOptions<[...Tail], [...TResult, GetOptions<Head>], [...TDepth, 1]>
|
|
111
135
|
: unknown[] extends T
|
|
112
136
|
? T
|
|
113
137
|
: // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!
|
|
@@ -127,16 +151,20 @@ export type QueriesOptions<
|
|
|
127
151
|
*/
|
|
128
152
|
export type QueriesResults<
|
|
129
153
|
T extends any[],
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
> =
|
|
154
|
+
TResults extends any[] = [],
|
|
155
|
+
TDepth extends ReadonlyArray<number> = [],
|
|
156
|
+
> = TDepth['length'] extends MAXIMUM_DEPTH
|
|
133
157
|
? UseQueryResult[]
|
|
134
158
|
: T extends []
|
|
135
159
|
? []
|
|
136
160
|
: T extends [infer Head]
|
|
137
|
-
? [...
|
|
161
|
+
? [...TResults, GetUseQueryResult<Head>]
|
|
138
162
|
: T extends [infer Head, ...infer Tail]
|
|
139
|
-
? QueriesResults<
|
|
163
|
+
? QueriesResults<
|
|
164
|
+
[...Tail],
|
|
165
|
+
[...TResults, GetUseQueryResult<Head>],
|
|
166
|
+
[...TDepth, 1]
|
|
167
|
+
>
|
|
140
168
|
: T extends UseQueryOptionsForUseQueries<
|
|
141
169
|
infer TQueryFnData,
|
|
142
170
|
infer TError,
|
package/src/useQuery.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import { QueryObserver, parseQueryArgs } from '@tanstack/query-core'
|
|
3
3
|
import { useBaseQuery } from './useBaseQuery'
|
|
4
|
-
import type {
|
|
4
|
+
import type {
|
|
5
|
+
DefinedInitialDataOptions,
|
|
6
|
+
UndefinedInitialDataOptions,
|
|
7
|
+
} from './queryOptions'
|
|
8
|
+
import type {
|
|
9
|
+
InitialDataFunction,
|
|
10
|
+
NonUndefinedGuard,
|
|
11
|
+
OmitKeyof,
|
|
12
|
+
QueryFunction,
|
|
13
|
+
QueryKey,
|
|
14
|
+
} from '@tanstack/query-core'
|
|
5
15
|
import type {
|
|
6
16
|
DefinedUseQueryResult,
|
|
7
17
|
UseQueryOptions,
|
|
@@ -9,31 +19,53 @@ import type {
|
|
|
9
19
|
} from './types'
|
|
10
20
|
|
|
11
21
|
// HOOK
|
|
12
|
-
|
|
13
22
|
export function useQuery<
|
|
14
23
|
TQueryFnData = unknown,
|
|
15
24
|
TError = unknown,
|
|
16
25
|
TData = TQueryFnData,
|
|
17
26
|
TQueryKey extends QueryKey = QueryKey,
|
|
18
27
|
>(
|
|
19
|
-
options:
|
|
28
|
+
options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
29
|
+
): DefinedUseQueryResult<TData, TError>
|
|
30
|
+
export function useQuery<
|
|
31
|
+
TQueryFnData = unknown,
|
|
32
|
+
TError = unknown,
|
|
33
|
+
TData = TQueryFnData,
|
|
34
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
35
|
+
>(
|
|
36
|
+
options: OmitKeyof<
|
|
20
37
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
21
38
|
'initialData'
|
|
22
|
-
> & {
|
|
39
|
+
> & {
|
|
40
|
+
initialData:
|
|
41
|
+
| NonUndefinedGuard<TQueryFnData>
|
|
42
|
+
| (() => NonUndefinedGuard<TQueryFnData>)
|
|
43
|
+
},
|
|
44
|
+
): DefinedUseQueryResult<TData, TError>
|
|
45
|
+
export function useQuery<
|
|
46
|
+
TQueryFnData = unknown,
|
|
47
|
+
TError = unknown,
|
|
48
|
+
TData = TQueryFnData,
|
|
49
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
50
|
+
>(
|
|
51
|
+
options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
23
52
|
): UseQueryResult<TData, TError>
|
|
24
|
-
|
|
25
53
|
export function useQuery<
|
|
26
54
|
TQueryFnData = unknown,
|
|
27
55
|
TError = unknown,
|
|
28
56
|
TData = TQueryFnData,
|
|
29
57
|
TQueryKey extends QueryKey = QueryKey,
|
|
30
58
|
>(
|
|
31
|
-
options:
|
|
59
|
+
options: OmitKeyof<
|
|
32
60
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
33
61
|
'initialData'
|
|
34
|
-
> & {
|
|
35
|
-
|
|
36
|
-
|
|
62
|
+
> & {
|
|
63
|
+
initialData?:
|
|
64
|
+
| undefined
|
|
65
|
+
| InitialDataFunction<NonUndefinedGuard<TQueryFnData>>
|
|
66
|
+
| NonUndefinedGuard<TQueryFnData>
|
|
67
|
+
},
|
|
68
|
+
): UseQueryResult<TData, TError>
|
|
37
69
|
export function useQuery<
|
|
38
70
|
TQueryFnData = unknown,
|
|
39
71
|
TError = unknown,
|
|
@@ -43,6 +75,7 @@ export function useQuery<
|
|
|
43
75
|
options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
44
76
|
): UseQueryResult<TData, TError>
|
|
45
77
|
|
|
78
|
+
/** @deprecated */
|
|
46
79
|
export function useQuery<
|
|
47
80
|
TQueryFnData = unknown,
|
|
48
81
|
TError = unknown,
|
|
@@ -50,12 +83,12 @@ export function useQuery<
|
|
|
50
83
|
TQueryKey extends QueryKey = QueryKey,
|
|
51
84
|
>(
|
|
52
85
|
queryKey: TQueryKey,
|
|
53
|
-
options?:
|
|
86
|
+
options?: OmitKeyof<
|
|
54
87
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
55
88
|
'queryKey' | 'initialData'
|
|
56
|
-
|
|
89
|
+
>,
|
|
57
90
|
): UseQueryResult<TData, TError>
|
|
58
|
-
|
|
91
|
+
/** @deprecated */
|
|
59
92
|
export function useQuery<
|
|
60
93
|
TQueryFnData = unknown,
|
|
61
94
|
TError = unknown,
|
|
@@ -63,12 +96,12 @@ export function useQuery<
|
|
|
63
96
|
TQueryKey extends QueryKey = QueryKey,
|
|
64
97
|
>(
|
|
65
98
|
queryKey: TQueryKey,
|
|
66
|
-
options?:
|
|
99
|
+
options?: OmitKeyof<
|
|
67
100
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
68
101
|
'queryKey' | 'initialData'
|
|
69
102
|
> & { initialData: TQueryFnData | (() => TQueryFnData) },
|
|
70
103
|
): DefinedUseQueryResult<TData, TError>
|
|
71
|
-
|
|
104
|
+
/** @deprecated */
|
|
72
105
|
export function useQuery<
|
|
73
106
|
TQueryFnData = unknown,
|
|
74
107
|
TError = unknown,
|
|
@@ -76,12 +109,12 @@ export function useQuery<
|
|
|
76
109
|
TQueryKey extends QueryKey = QueryKey,
|
|
77
110
|
>(
|
|
78
111
|
queryKey: TQueryKey,
|
|
79
|
-
options?:
|
|
112
|
+
options?: OmitKeyof<
|
|
80
113
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
81
114
|
'queryKey'
|
|
82
115
|
>,
|
|
83
116
|
): UseQueryResult<TData, TError>
|
|
84
|
-
|
|
117
|
+
/** @deprecated */
|
|
85
118
|
export function useQuery<
|
|
86
119
|
TQueryFnData = unknown,
|
|
87
120
|
TError = unknown,
|
|
@@ -90,12 +123,12 @@ export function useQuery<
|
|
|
90
123
|
>(
|
|
91
124
|
queryKey: TQueryKey,
|
|
92
125
|
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
|
|
93
|
-
options?:
|
|
126
|
+
options?: OmitKeyof<
|
|
94
127
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
95
128
|
'queryKey' | 'queryFn' | 'initialData'
|
|
96
129
|
> & { initialData?: () => undefined },
|
|
97
130
|
): UseQueryResult<TData, TError>
|
|
98
|
-
|
|
131
|
+
/** @deprecated */
|
|
99
132
|
export function useQuery<
|
|
100
133
|
TQueryFnData = unknown,
|
|
101
134
|
TError = unknown,
|
|
@@ -104,12 +137,12 @@ export function useQuery<
|
|
|
104
137
|
>(
|
|
105
138
|
queryKey: TQueryKey,
|
|
106
139
|
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
|
|
107
|
-
options?:
|
|
140
|
+
options?: OmitKeyof<
|
|
108
141
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
109
142
|
'queryKey' | 'queryFn' | 'initialData'
|
|
110
143
|
> & { initialData: TQueryFnData | (() => TQueryFnData) },
|
|
111
144
|
): DefinedUseQueryResult<TData, TError>
|
|
112
|
-
|
|
145
|
+
/** @deprecated */
|
|
113
146
|
export function useQuery<
|
|
114
147
|
TQueryFnData = unknown,
|
|
115
148
|
TError = unknown,
|
|
@@ -118,12 +151,12 @@ export function useQuery<
|
|
|
118
151
|
>(
|
|
119
152
|
queryKey: TQueryKey,
|
|
120
153
|
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
|
|
121
|
-
options?:
|
|
154
|
+
options?: OmitKeyof<
|
|
122
155
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
123
156
|
'queryKey' | 'queryFn'
|
|
124
157
|
>,
|
|
125
158
|
): UseQueryResult<TData, TError>
|
|
126
|
-
|
|
159
|
+
/** @deprecated */
|
|
127
160
|
export function useQuery<
|
|
128
161
|
TQueryFnData,
|
|
129
162
|
TError,
|