@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.
Files changed (146) hide show
  1. package/build/lib/__tests__/queryOptions.types.test.d.ts +2 -0
  2. package/build/lib/__tests__/useSuspenseQueries.types.test.d.ts +6 -0
  3. package/build/lib/__tests__/useSuspenseQuery.types.test.d.ts +2 -0
  4. package/build/lib/__tests__/utils.d.ts +1 -0
  5. package/build/lib/index.d.ts +3 -0
  6. package/build/lib/queryOptions.d.ts +14 -0
  7. package/build/lib/useQueries.d.ts +22 -11
  8. package/build/lib/useQuery.d.ts +21 -14
  9. package/build/lib/useSuspenseQueries.d.ts +66 -0
  10. package/build/lib/useSuspenseQuery.d.ts +8 -0
  11. package/package.json +3 -10
  12. package/src/__tests__/queryOptions.types.test.tsx +270 -0
  13. package/src/__tests__/useQuery.types.test.tsx +1 -2
  14. package/src/__tests__/useSuspenseQueries.types.test.tsx +102 -0
  15. package/src/__tests__/useSuspenseQuery.types.test.tsx +81 -0
  16. package/src/__tests__/utils.tsx +2 -0
  17. package/src/index.ts +3 -0
  18. package/src/queryOptions.ts +86 -0
  19. package/src/useQueries.ts +50 -22
  20. package/src/useQuery.ts +55 -22
  21. package/src/useSuspenseQueries.ts +162 -0
  22. package/src/useSuspenseQuery.ts +58 -0
  23. package/build/lib/Hydrate.esm.js +0 -32
  24. package/build/lib/Hydrate.esm.js.map +0 -1
  25. package/build/lib/Hydrate.js +0 -57
  26. package/build/lib/Hydrate.js.map +0 -1
  27. package/build/lib/Hydrate.mjs +0 -32
  28. package/build/lib/Hydrate.mjs.map +0 -1
  29. package/build/lib/QueryClientProvider.esm.js +0 -66
  30. package/build/lib/QueryClientProvider.esm.js.map +0 -1
  31. package/build/lib/QueryClientProvider.js +0 -92
  32. package/build/lib/QueryClientProvider.js.map +0 -1
  33. package/build/lib/QueryClientProvider.mjs +0 -66
  34. package/build/lib/QueryClientProvider.mjs.map +0 -1
  35. package/build/lib/QueryErrorResetBoundary.esm.js +0 -33
  36. package/build/lib/QueryErrorResetBoundary.esm.js.map +0 -1
  37. package/build/lib/QueryErrorResetBoundary.js +0 -58
  38. package/build/lib/QueryErrorResetBoundary.js.map +0 -1
  39. package/build/lib/QueryErrorResetBoundary.mjs +0 -33
  40. package/build/lib/QueryErrorResetBoundary.mjs.map +0 -1
  41. package/build/lib/errorBoundaryUtils.esm.js +0 -28
  42. package/build/lib/errorBoundaryUtils.esm.js.map +0 -1
  43. package/build/lib/errorBoundaryUtils.js +0 -54
  44. package/build/lib/errorBoundaryUtils.js.map +0 -1
  45. package/build/lib/errorBoundaryUtils.mjs +0 -28
  46. package/build/lib/errorBoundaryUtils.mjs.map +0 -1
  47. package/build/lib/index.esm.js +0 -13
  48. package/build/lib/index.esm.js.map +0 -1
  49. package/build/lib/index.js +0 -41
  50. package/build/lib/index.js.map +0 -1
  51. package/build/lib/index.mjs +0 -13
  52. package/build/lib/index.mjs.map +0 -1
  53. package/build/lib/isRestoring.esm.js +0 -9
  54. package/build/lib/isRestoring.esm.js.map +0 -1
  55. package/build/lib/isRestoring.js +0 -34
  56. package/build/lib/isRestoring.js.map +0 -1
  57. package/build/lib/isRestoring.mjs +0 -9
  58. package/build/lib/isRestoring.mjs.map +0 -1
  59. package/build/lib/reactBatchedUpdates.esm.js +0 -7
  60. package/build/lib/reactBatchedUpdates.esm.js.map +0 -1
  61. package/build/lib/reactBatchedUpdates.js +0 -31
  62. package/build/lib/reactBatchedUpdates.js.map +0 -1
  63. package/build/lib/reactBatchedUpdates.mjs +0 -7
  64. package/build/lib/reactBatchedUpdates.mjs.map +0 -1
  65. package/build/lib/reactBatchedUpdates.native.esm.js +0 -2
  66. package/build/lib/reactBatchedUpdates.native.esm.js.map +0 -1
  67. package/build/lib/reactBatchedUpdates.native.js +0 -13
  68. package/build/lib/reactBatchedUpdates.native.js.map +0 -1
  69. package/build/lib/reactBatchedUpdates.native.mjs +0 -2
  70. package/build/lib/reactBatchedUpdates.native.mjs.map +0 -1
  71. package/build/lib/setBatchUpdatesFn.esm.js +0 -5
  72. package/build/lib/setBatchUpdatesFn.esm.js.map +0 -1
  73. package/build/lib/setBatchUpdatesFn.js +0 -7
  74. package/build/lib/setBatchUpdatesFn.js.map +0 -1
  75. package/build/lib/setBatchUpdatesFn.mjs +0 -5
  76. package/build/lib/setBatchUpdatesFn.mjs.map +0 -1
  77. package/build/lib/suspense.esm.js +0 -24
  78. package/build/lib/suspense.esm.js.map +0 -1
  79. package/build/lib/suspense.js +0 -31
  80. package/build/lib/suspense.js.map +0 -1
  81. package/build/lib/suspense.mjs +0 -24
  82. package/build/lib/suspense.mjs.map +0 -1
  83. package/build/lib/useBaseQuery.esm.js +0 -72
  84. package/build/lib/useBaseQuery.esm.js.map +0 -1
  85. package/build/lib/useBaseQuery.js +0 -96
  86. package/build/lib/useBaseQuery.js.map +0 -1
  87. package/build/lib/useBaseQuery.mjs +0 -72
  88. package/build/lib/useBaseQuery.mjs.map +0 -1
  89. package/build/lib/useInfiniteQuery.esm.js +0 -11
  90. package/build/lib/useInfiniteQuery.esm.js.map +0 -1
  91. package/build/lib/useInfiniteQuery.js +0 -15
  92. package/build/lib/useInfiniteQuery.js.map +0 -1
  93. package/build/lib/useInfiniteQuery.mjs +0 -11
  94. package/build/lib/useInfiniteQuery.mjs.map +0 -1
  95. package/build/lib/useIsFetching.esm.js +0 -17
  96. package/build/lib/useIsFetching.esm.js.map +0 -1
  97. package/build/lib/useIsFetching.js +0 -41
  98. package/build/lib/useIsFetching.js.map +0 -1
  99. package/build/lib/useIsFetching.mjs +0 -17
  100. package/build/lib/useIsFetching.mjs.map +0 -1
  101. package/build/lib/useIsMutating.esm.js +0 -17
  102. package/build/lib/useIsMutating.esm.js.map +0 -1
  103. package/build/lib/useIsMutating.js +0 -41
  104. package/build/lib/useIsMutating.js.map +0 -1
  105. package/build/lib/useIsMutating.mjs +0 -17
  106. package/build/lib/useIsMutating.mjs.map +0 -1
  107. package/build/lib/useMutation.esm.js +0 -35
  108. package/build/lib/useMutation.esm.js.map +0 -1
  109. package/build/lib/useMutation.js +0 -59
  110. package/build/lib/useMutation.js.map +0 -1
  111. package/build/lib/useMutation.mjs +0 -35
  112. package/build/lib/useMutation.mjs.map +0 -1
  113. package/build/lib/useQueries.esm.js +0 -81
  114. package/build/lib/useQueries.esm.js.map +0 -1
  115. package/build/lib/useQueries.js +0 -105
  116. package/build/lib/useQueries.js.map +0 -1
  117. package/build/lib/useQueries.mjs +0 -81
  118. package/build/lib/useQueries.mjs.map +0 -1
  119. package/build/lib/useQuery.esm.js +0 -11
  120. package/build/lib/useQuery.esm.js.map +0 -1
  121. package/build/lib/useQuery.js +0 -15
  122. package/build/lib/useQuery.js.map +0 -1
  123. package/build/lib/useQuery.mjs +0 -11
  124. package/build/lib/useQuery.mjs.map +0 -1
  125. package/build/lib/useSyncExternalStore.esm.js +0 -7
  126. package/build/lib/useSyncExternalStore.esm.js.map +0 -1
  127. package/build/lib/useSyncExternalStore.js +0 -11
  128. package/build/lib/useSyncExternalStore.js.map +0 -1
  129. package/build/lib/useSyncExternalStore.mjs +0 -7
  130. package/build/lib/useSyncExternalStore.mjs.map +0 -1
  131. package/build/lib/useSyncExternalStore.native.esm.js +0 -2
  132. package/build/lib/useSyncExternalStore.native.esm.js.map +0 -1
  133. package/build/lib/useSyncExternalStore.native.js +0 -13
  134. package/build/lib/useSyncExternalStore.native.js.map +0 -1
  135. package/build/lib/useSyncExternalStore.native.mjs +0 -2
  136. package/build/lib/useSyncExternalStore.native.mjs.map +0 -1
  137. package/build/lib/utils.esm.js +0 -11
  138. package/build/lib/utils.esm.js.map +0 -1
  139. package/build/lib/utils.js +0 -15
  140. package/build/lib/utils.js.map +0 -1
  141. package/build/lib/utils.mjs +0 -11
  142. package/build/lib/utils.mjs.map +0 -1
  143. package/build/umd/index.development.js +0 -3961
  144. package/build/umd/index.development.js.map +0 -1
  145. package/build/umd/index.production.js +0 -2
  146. 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
+ })
@@ -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 { UseQueryOptions, UseQueryResult } from './types'
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
- > = Omit<UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'context'>
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
- type GetResults<T> =
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
- ? UseQueryResult<TData, TError>
97
+ ? GetDefinedOrUndefinedQueryResult<T, TData, TError>
74
98
  : T extends { queryFnData: infer TQueryFnData; error?: infer TError }
75
- ? UseQueryResult<TQueryFnData, TError>
99
+ ? GetDefinedOrUndefinedQueryResult<T, TQueryFnData, TError>
76
100
  : T extends { data: infer TData; error?: infer TError }
77
- ? UseQueryResult<TData, TError>
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
- ? UseQueryResult<TData, TError>
104
+ ? GetDefinedOrUndefinedQueryResult<T, TData, TError>
81
105
  : T extends [infer TQueryFnData, infer TError]
82
- ? UseQueryResult<TQueryFnData, TError>
106
+ ? GetDefinedOrUndefinedQueryResult<T, TQueryFnData, TError>
83
107
  : T extends [infer TQueryFnData]
84
- ? UseQueryResult<TQueryFnData>
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
- ? UseQueryResult<TData>
114
+ ? GetDefinedOrUndefinedQueryResult<T, TData>
91
115
  : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }
92
- ? UseQueryResult<TQueryFnData>
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
- Result extends any[] = [],
102
- Depth extends ReadonlyArray<number> = [],
103
- > = Depth['length'] extends MAXIMUM_DEPTH
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
- ? [...Result, GetOptions<Head>]
132
+ ? [...TResult, GetOptions<Head>]
109
133
  : T extends [infer Head, ...infer Tail]
110
- ? QueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>
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
- Result extends any[] = [],
131
- Depth extends ReadonlyArray<number> = [],
132
- > = Depth['length'] extends MAXIMUM_DEPTH
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
- ? [...Result, GetResults<Head>]
161
+ ? [...TResults, GetUseQueryResult<Head>]
138
162
  : T extends [infer Head, ...infer Tail]
139
- ? QueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>
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 { QueryFunction, QueryKey } from '@tanstack/query-core'
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: Omit<
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
- > & { initialData?: () => undefined },
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: Omit<
59
+ options: OmitKeyof<
32
60
  UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
33
61
  'initialData'
34
- > & { initialData: TQueryFnData | (() => TQueryFnData) },
35
- ): DefinedUseQueryResult<TData, TError>
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?: Omit<
86
+ options?: OmitKeyof<
54
87
  UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
55
88
  'queryKey' | 'initialData'
56
- > & { initialData?: () => undefined },
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?: Omit<
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?: Omit<
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?: Omit<
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?: Omit<
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?: Omit<
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,