@tanstack/react-query 4.36.1 → 4.39.1

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 (94) 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/index.esm.js +3 -0
  7. package/build/lib/index.esm.js.map +1 -1
  8. package/build/lib/index.js +6 -0
  9. package/build/lib/index.js.map +1 -1
  10. package/build/lib/index.mjs +3 -0
  11. package/build/lib/index.mjs.map +1 -1
  12. package/build/lib/queryOptions.d.ts +14 -0
  13. package/build/lib/queryOptions.esm.js +6 -0
  14. package/build/lib/queryOptions.esm.js.map +1 -0
  15. package/build/lib/queryOptions.js +10 -0
  16. package/build/lib/queryOptions.js.map +1 -0
  17. package/build/lib/queryOptions.mjs +6 -0
  18. package/build/lib/queryOptions.mjs.map +1 -0
  19. package/build/lib/useQueries.d.ts +22 -11
  20. package/build/lib/useQueries.esm.js.map +1 -1
  21. package/build/lib/useQueries.js.map +1 -1
  22. package/build/lib/useQueries.mjs.map +1 -1
  23. package/build/lib/useQuery.d.ts +21 -14
  24. package/build/lib/useQuery.esm.js +1 -0
  25. package/build/lib/useQuery.esm.js.map +1 -1
  26. package/build/lib/useQuery.js +1 -0
  27. package/build/lib/useQuery.js.map +1 -1
  28. package/build/lib/useQuery.mjs +1 -0
  29. package/build/lib/useQuery.mjs.map +1 -1
  30. package/build/lib/useSuspenseQueries.d.ts +66 -0
  31. package/build/lib/useSuspenseQueries.esm.js +20 -0
  32. package/build/lib/useSuspenseQueries.esm.js.map +1 -0
  33. package/build/lib/useSuspenseQueries.js +24 -0
  34. package/build/lib/useSuspenseQueries.js.map +1 -0
  35. package/build/lib/useSuspenseQueries.mjs +20 -0
  36. package/build/lib/useSuspenseQueries.mjs.map +1 -0
  37. package/build/lib/useSuspenseQuery.d.ts +8 -0
  38. package/build/lib/useSuspenseQuery.esm.js +15 -0
  39. package/build/lib/useSuspenseQuery.esm.js.map +1 -0
  40. package/build/lib/useSuspenseQuery.js +19 -0
  41. package/build/lib/useSuspenseQuery.js.map +1 -0
  42. package/build/lib/useSuspenseQuery.mjs +15 -0
  43. package/build/lib/useSuspenseQuery.mjs.map +1 -0
  44. package/build/umd/index.development.js +90 -2
  45. package/build/umd/index.development.js.map +1 -1
  46. package/build/umd/index.production.js +1 -1
  47. package/build/umd/index.production.js.map +1 -1
  48. package/package.json +3 -10
  49. package/src/__tests__/queryOptions.types.test.tsx +270 -0
  50. package/src/__tests__/useQuery.types.test.tsx +1 -2
  51. package/src/__tests__/useSuspenseQueries.types.test.tsx +102 -0
  52. package/src/__tests__/useSuspenseQuery.types.test.tsx +81 -0
  53. package/src/__tests__/utils.tsx +2 -0
  54. package/src/index.ts +3 -0
  55. package/src/queryOptions.ts +86 -0
  56. package/src/useQueries.ts +50 -22
  57. package/src/useQuery.ts +55 -22
  58. package/src/useSuspenseQueries.ts +162 -0
  59. package/src/useSuspenseQuery.ts +58 -0
  60. package/build/lib/Hydrate.d.ts.map +0 -1
  61. package/build/lib/QueryClientProvider.d.ts.map +0 -1
  62. package/build/lib/QueryErrorResetBoundary.d.ts.map +0 -1
  63. package/build/lib/__tests__/Hydrate.test.d.ts.map +0 -1
  64. package/build/lib/__tests__/QueryClientProvider.test.d.ts.map +0 -1
  65. package/build/lib/__tests__/QueryResetErrorBoundary.test.d.ts.map +0 -1
  66. package/build/lib/__tests__/ssr-hydration.test.d.ts.map +0 -1
  67. package/build/lib/__tests__/ssr.test.d.ts.map +0 -1
  68. package/build/lib/__tests__/suspense.test.d.ts.map +0 -1
  69. package/build/lib/__tests__/useInfiniteQuery.test.d.ts.map +0 -1
  70. package/build/lib/__tests__/useIsFetching.test.d.ts.map +0 -1
  71. package/build/lib/__tests__/useIsMutating.test.d.ts.map +0 -1
  72. package/build/lib/__tests__/useMutation.test.d.ts.map +0 -1
  73. package/build/lib/__tests__/useQueries.test.d.ts.map +0 -1
  74. package/build/lib/__tests__/useQuery.test.d.ts.map +0 -1
  75. package/build/lib/__tests__/useQuery.types.test.d.ts.map +0 -1
  76. package/build/lib/__tests__/utils.d.ts.map +0 -1
  77. package/build/lib/errorBoundaryUtils.d.ts.map +0 -1
  78. package/build/lib/index.d.ts.map +0 -1
  79. package/build/lib/isRestoring.d.ts.map +0 -1
  80. package/build/lib/reactBatchedUpdates.d.ts.map +0 -1
  81. package/build/lib/reactBatchedUpdates.native.d.ts.map +0 -1
  82. package/build/lib/setBatchUpdatesFn.d.ts.map +0 -1
  83. package/build/lib/suspense.d.ts.map +0 -1
  84. package/build/lib/types.d.ts.map +0 -1
  85. package/build/lib/useBaseQuery.d.ts.map +0 -1
  86. package/build/lib/useInfiniteQuery.d.ts.map +0 -1
  87. package/build/lib/useIsFetching.d.ts.map +0 -1
  88. package/build/lib/useIsMutating.d.ts.map +0 -1
  89. package/build/lib/useMutation.d.ts.map +0 -1
  90. package/build/lib/useQueries.d.ts.map +0 -1
  91. package/build/lib/useQuery.d.ts.map +0 -1
  92. package/build/lib/useSyncExternalStore.d.ts.map +0 -1
  93. package/build/lib/useSyncExternalStore.native.d.ts.map +0 -1
  94. package/build/lib/utils.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-query",
3
- "version": "4.36.1",
3
+ "version": "4.39.1",
4
4
  "description": "Hooks for managing, caching and syncing asynchronous and remote data in React",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  "dependencies": {
53
53
  "use-sync-external-store": "^1.2.0",
54
- "@tanstack/query-core": "4.36.1"
54
+ "@tanstack/query-core": "4.39.1"
55
55
  },
56
56
  "peerDependencies": {
57
57
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
@@ -66,12 +66,5 @@
66
66
  "optional": true
67
67
  }
68
68
  },
69
- "scripts": {
70
- "clean": "rimraf ./build",
71
- "test:eslint": "eslint --ext .ts,.tsx ./src",
72
- "test:types": "tsc",
73
- "test:lib": "jest --config ./jest.config.ts",
74
- "test:lib:dev": "pnpm run test:lib --watch",
75
- "build:types": "tsc --build"
76
- }
69
+ "scripts": {}
77
70
  }
@@ -0,0 +1,270 @@
1
+ import { expectTypeOf } from 'expect-type'
2
+ import {
3
+ QueryCache,
4
+ type UseQueryResult,
5
+ useQueries,
6
+ useQuery,
7
+ useQueryClient,
8
+ } from '@tanstack/react-query'
9
+ import { queryOptions } from '..'
10
+ import { useSuspenseQueries, useSuspenseQuery } from '..'
11
+ import { type UseSuspenseQueryResult } from '../useSuspenseQuery'
12
+ import { doNotExecute } from './utils'
13
+ import type { DefinedUseQueryResult } from '@tanstack/react-query'
14
+
15
+ const queryKey = ['key'] as const
16
+ const queryFn = () => Promise.resolve({ field: 'success' })
17
+
18
+ describe('queryOptions', () => {
19
+ it('should be used with useQuery', () => {
20
+ doNotExecute(() => {
21
+ const dd = useQuery(
22
+ queryOptions({
23
+ queryKey,
24
+ queryFn,
25
+ }),
26
+ )
27
+ expectTypeOf(dd).toEqualTypeOf<UseQueryResult<{ field: string }>>()
28
+ expectTypeOf(
29
+ useQuery({
30
+ ...queryOptions({
31
+ queryKey,
32
+ queryFn,
33
+ }),
34
+ select: (data) => data.field,
35
+ }),
36
+ ).toEqualTypeOf<UseQueryResult<string>>()
37
+ expectTypeOf(
38
+ useQuery({
39
+ ...queryOptions({
40
+ queryKey,
41
+ queryFn,
42
+ select: (data) => data.field,
43
+ }),
44
+ }),
45
+ ).toEqualTypeOf<UseQueryResult<string>>()
46
+ expectTypeOf(
47
+ useQuery({
48
+ ...queryOptions({
49
+ queryKey,
50
+ queryFn,
51
+ }),
52
+ initialData: { field: 'success' },
53
+ }),
54
+ ).toEqualTypeOf<DefinedUseQueryResult<{ field: string }>>()
55
+ expectTypeOf(
56
+ useQuery({
57
+ ...queryOptions({
58
+ queryKey,
59
+ queryFn,
60
+ }),
61
+ initialData: { field: 'success' },
62
+ select: (data) => data.field,
63
+ }),
64
+ ).toEqualTypeOf<DefinedUseQueryResult<string>>()
65
+ expectTypeOf(
66
+ useQuery({
67
+ ...queryOptions({
68
+ queryKey,
69
+ queryFn,
70
+ }),
71
+ initialData: undefined,
72
+ select: (data) => data.field,
73
+ }),
74
+ ).toEqualTypeOf<UseQueryResult<string>>()
75
+ expectTypeOf(
76
+ useQuery({
77
+ ...queryOptions({
78
+ queryKey,
79
+ queryFn,
80
+ }),
81
+ initialData: () => undefined,
82
+ select: (data) => data.field,
83
+ }),
84
+ ).toEqualTypeOf<UseQueryResult<string>>()
85
+ expectTypeOf(
86
+ useQuery({
87
+ ...queryOptions({
88
+ queryKey,
89
+ queryFn,
90
+ select: (data) => data.field,
91
+ }),
92
+ refetchInterval: 1000,
93
+ }),
94
+ ).toEqualTypeOf<UseQueryResult<string>>()
95
+ })
96
+ })
97
+ it('should be used with useSuspenseQuery', () => {
98
+ doNotExecute(() => {
99
+ expectTypeOf(
100
+ useSuspenseQuery(
101
+ queryOptions({
102
+ queryKey,
103
+ queryFn,
104
+ }),
105
+ ),
106
+ ).toEqualTypeOf<UseSuspenseQueryResult<{ field: string }>>()
107
+
108
+ expectTypeOf(
109
+ useSuspenseQuery({
110
+ ...queryOptions({
111
+ queryKey,
112
+ queryFn,
113
+ }),
114
+ select: (data) => data.field,
115
+ }),
116
+ ).toEqualTypeOf<UseSuspenseQueryResult<string>>()
117
+ expectTypeOf(
118
+ useSuspenseQuery({
119
+ ...queryOptions({
120
+ queryKey,
121
+ queryFn,
122
+ }),
123
+ initialData: { field: 'success' },
124
+ }),
125
+ ).toEqualTypeOf<UseSuspenseQueryResult<{ field: string }>>()
126
+ expectTypeOf(
127
+ useSuspenseQuery({
128
+ ...queryOptions({
129
+ queryKey,
130
+ queryFn,
131
+ }),
132
+ initialData: undefined,
133
+ select: (data) => data.field,
134
+ }),
135
+ ).toEqualTypeOf<UseSuspenseQueryResult<string>>()
136
+ expectTypeOf(
137
+ useSuspenseQuery({
138
+ ...queryOptions({
139
+ queryKey,
140
+ queryFn,
141
+ }),
142
+ initialData: { field: 'success' },
143
+ select: (data) => data.field,
144
+ }),
145
+ ).toEqualTypeOf<UseSuspenseQueryResult<string>>()
146
+ expectTypeOf(
147
+ useSuspenseQuery({
148
+ ...queryOptions({
149
+ queryKey,
150
+ queryFn,
151
+ select: (data) => data.field,
152
+ }),
153
+ refetchInterval: 1000,
154
+ }),
155
+ ).toEqualTypeOf<UseSuspenseQueryResult<string>>()
156
+ })
157
+ })
158
+ it('should be used with useQueries', () => {
159
+ doNotExecute(() => {
160
+ const [query1, query2, query3, query4] = useQueries({
161
+ queries: [
162
+ queryOptions({
163
+ queryKey,
164
+ queryFn,
165
+ }),
166
+ queryOptions({
167
+ queryKey,
168
+ queryFn,
169
+ initialData: { field: 'success' },
170
+ }),
171
+ {
172
+ ...queryOptions({
173
+ queryKey,
174
+ queryFn,
175
+ }),
176
+ initialData: { field: 'success' },
177
+ },
178
+ {
179
+ ...queryOptions({
180
+ queryKey,
181
+ queryFn,
182
+ }),
183
+ initialData: undefined,
184
+ },
185
+ ],
186
+ })
187
+ expectTypeOf(query1).toEqualTypeOf<UseQueryResult<{ field: string }>>()
188
+ expectTypeOf(query2).toEqualTypeOf<
189
+ DefinedUseQueryResult<{ field: string }>
190
+ >()
191
+ expectTypeOf(query3).toEqualTypeOf<
192
+ DefinedUseQueryResult<{ field: string }>
193
+ >()
194
+ expectTypeOf(query4).toEqualTypeOf<UseQueryResult<{ field: string }>>()
195
+ })
196
+ })
197
+ it('should be used with useSuspenseQueries', () => {
198
+ doNotExecute(() => {
199
+ const [query1, query2, query3, query4, query5] = useSuspenseQueries({
200
+ queries: [
201
+ queryOptions({
202
+ queryKey,
203
+ queryFn,
204
+ }),
205
+ queryOptions({
206
+ queryKey,
207
+ queryFn,
208
+ initialData: { field: 'success' },
209
+ }),
210
+ {
211
+ ...queryOptions({
212
+ queryKey,
213
+ queryFn,
214
+ }),
215
+ initialData: { field: 'success' },
216
+ },
217
+ {
218
+ ...queryOptions({
219
+ queryKey,
220
+ queryFn,
221
+ }),
222
+ initialData: undefined,
223
+ },
224
+ {
225
+ ...queryOptions({
226
+ queryKey,
227
+ queryFn,
228
+ select: (data) => data.field,
229
+ }),
230
+ },
231
+ ],
232
+ })
233
+ expectTypeOf(query1).toEqualTypeOf<
234
+ UseSuspenseQueryResult<{ field: string }>
235
+ >()
236
+ expectTypeOf(query2).toEqualTypeOf<
237
+ UseSuspenseQueryResult<{ field: string }>
238
+ >()
239
+ expectTypeOf(query3).toEqualTypeOf<
240
+ UseSuspenseQueryResult<{ field: string }>
241
+ >()
242
+ expectTypeOf(query4).toEqualTypeOf<
243
+ UseSuspenseQueryResult<{ field: string }>
244
+ >()
245
+ expectTypeOf(query5).toEqualTypeOf<UseSuspenseQueryResult<string>>()
246
+ })
247
+ })
248
+ it('should be used with useQueryClient', () => {
249
+ doNotExecute(async () => {
250
+ const queryClient = useQueryClient()
251
+ queryClient.invalidateQueries(queryOptions({ queryKey, queryFn }))
252
+ queryClient.resetQueries(queryOptions({ queryKey, queryFn }))
253
+ queryClient.removeQueries(queryOptions({ queryKey, queryFn }))
254
+ queryClient.cancelQueries(queryOptions({ queryKey, queryFn }))
255
+ queryClient.prefetchQuery(queryOptions({ queryKey, queryFn }))
256
+ queryClient.refetchQueries(queryOptions({ queryKey, queryFn }))
257
+ expectTypeOf(
258
+ await queryClient.fetchQuery(queryOptions({ queryKey, queryFn })),
259
+ ).toEqualTypeOf<{ field: string }>()
260
+ })
261
+ })
262
+ it('should be used with queryCache', () => {
263
+ doNotExecute(() => {
264
+ const queryCache = new QueryCache()
265
+ queryCache.find({ queryKey: [] })
266
+ queryCache.find(queryOptions({ queryKey, queryFn }))
267
+ queryCache.find(queryKey)
268
+ })
269
+ })
270
+ })
@@ -1,4 +1,5 @@
1
1
  import { useQuery } from '../useQuery'
2
+ import { doNotExecute } from './utils'
2
3
 
3
4
  export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
4
5
  T,
@@ -8,8 +9,6 @@ export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
8
9
 
9
10
  export type Expect<T extends true> = T
10
11
 
11
- const doNotExecute = (_func: () => void) => true
12
-
13
12
  describe('initialData', () => {
14
13
  describe('Config object overload', () => {
15
14
  it('TData should always be defined when initialData is provided as an object', () => {
@@ -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
+ }