@tanstack/react-query 4.24.9 → 5.0.0-alpha.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 (199) hide show
  1. package/build/lib/HydrationBoundary.d.ts +9 -0
  2. package/build/lib/{Hydrate.esm.js → HydrationBoundary.esm.js} +14 -17
  3. package/build/lib/HydrationBoundary.esm.js.map +1 -0
  4. package/build/lib/{Hydrate.js → HydrationBoundary.js} +17 -24
  5. package/build/lib/HydrationBoundary.js.map +1 -0
  6. package/build/lib/{Hydrate.mjs → HydrationBoundary.mjs} +14 -17
  7. package/build/lib/HydrationBoundary.mjs.map +1 -0
  8. package/build/lib/QueryClientProvider.d.ts +4 -19
  9. package/build/lib/QueryClientProvider.esm.js +11 -46
  10. package/build/lib/QueryClientProvider.esm.js.map +1 -1
  11. package/build/lib/QueryClientProvider.js +14 -52
  12. package/build/lib/QueryClientProvider.js.map +1 -1
  13. package/build/lib/QueryClientProvider.mjs +11 -46
  14. package/build/lib/QueryClientProvider.mjs.map +1 -1
  15. package/build/lib/QueryErrorResetBoundary.esm.js +7 -2
  16. package/build/lib/QueryErrorResetBoundary.esm.js.map +1 -1
  17. package/build/lib/QueryErrorResetBoundary.js +10 -8
  18. package/build/lib/QueryErrorResetBoundary.js.map +1 -1
  19. package/build/lib/QueryErrorResetBoundary.mjs +7 -2
  20. package/build/lib/QueryErrorResetBoundary.mjs.map +1 -1
  21. package/build/lib/__tests__/useQuery.types.test.d.ts +1 -2
  22. package/build/lib/__tests__/utils.d.ts +7 -10
  23. package/build/lib/errorBoundaryUtils.d.ts +3 -3
  24. package/build/lib/errorBoundaryUtils.esm.js +3 -3
  25. package/build/lib/errorBoundaryUtils.esm.js.map +1 -1
  26. package/build/lib/errorBoundaryUtils.js +6 -9
  27. package/build/lib/errorBoundaryUtils.js.map +1 -1
  28. package/build/lib/errorBoundaryUtils.mjs +3 -3
  29. package/build/lib/errorBoundaryUtils.mjs.map +1 -1
  30. package/build/lib/index.d.ts +4 -5
  31. package/build/lib/index.esm.js +3 -4
  32. package/build/lib/index.esm.js.map +1 -1
  33. package/build/lib/index.js +6 -9
  34. package/build/lib/index.js.map +1 -1
  35. package/build/lib/index.mjs +3 -4
  36. package/build/lib/index.mjs.map +1 -1
  37. package/build/lib/isRestoring.esm.js.map +1 -1
  38. package/build/lib/isRestoring.js +3 -6
  39. package/build/lib/isRestoring.js.map +1 -1
  40. package/build/lib/isRestoring.mjs.map +1 -1
  41. package/build/lib/suspense.esm.js +5 -5
  42. package/build/lib/suspense.esm.js.map +1 -1
  43. package/build/lib/suspense.js +5 -7
  44. package/build/lib/suspense.js.map +1 -1
  45. package/build/lib/suspense.mjs +5 -5
  46. package/build/lib/suspense.mjs.map +1 -1
  47. package/build/lib/types.d.ts +14 -22
  48. package/build/lib/useBaseQuery.d.ts +2 -2
  49. package/build/lib/useBaseQuery.esm.js +15 -18
  50. package/build/lib/useBaseQuery.esm.js.map +1 -1
  51. package/build/lib/useBaseQuery.js +18 -24
  52. package/build/lib/useBaseQuery.js.map +1 -1
  53. package/build/lib/useBaseQuery.mjs +15 -18
  54. package/build/lib/useBaseQuery.mjs.map +1 -1
  55. package/build/lib/useInfiniteQuery.d.ts +2 -4
  56. package/build/lib/useInfiniteQuery.esm.js +4 -4
  57. package/build/lib/useInfiniteQuery.esm.js.map +1 -1
  58. package/build/lib/useInfiniteQuery.js +3 -5
  59. package/build/lib/useInfiniteQuery.js.map +1 -1
  60. package/build/lib/useInfiniteQuery.mjs +4 -4
  61. package/build/lib/useInfiniteQuery.mjs.map +1 -1
  62. package/build/lib/useIsFetching.d.ts +2 -7
  63. package/build/lib/useIsFetching.esm.js +5 -9
  64. package/build/lib/useIsFetching.esm.js.map +1 -1
  65. package/build/lib/useIsFetching.js +7 -14
  66. package/build/lib/useIsFetching.js.map +1 -1
  67. package/build/lib/useIsFetching.mjs +5 -9
  68. package/build/lib/useIsFetching.mjs.map +1 -1
  69. package/build/lib/useMutation.d.ts +2 -5
  70. package/build/lib/useMutation.esm.js +12 -14
  71. package/build/lib/useMutation.esm.js.map +1 -1
  72. package/build/lib/useMutation.js +14 -19
  73. package/build/lib/useMutation.js.map +1 -1
  74. package/build/lib/useMutation.mjs +12 -14
  75. package/build/lib/useMutation.mjs.map +1 -1
  76. package/build/lib/useMutationState.d.ts +8 -0
  77. package/build/lib/useMutationState.esm.js +37 -0
  78. package/build/lib/useMutationState.esm.js.map +1 -0
  79. package/build/lib/useMutationState.js +59 -0
  80. package/build/lib/useMutationState.js.map +1 -0
  81. package/build/lib/useMutationState.mjs +37 -0
  82. package/build/lib/useMutationState.mjs.map +1 -0
  83. package/build/lib/useQueries.d.ts +9 -7
  84. package/build/lib/useQueries.esm.js +16 -27
  85. package/build/lib/useQueries.esm.js.map +1 -1
  86. package/build/lib/useQueries.js +19 -33
  87. package/build/lib/useQueries.js.map +1 -1
  88. package/build/lib/useQueries.mjs +16 -27
  89. package/build/lib/useQueries.mjs.map +1 -1
  90. package/build/lib/useQuery.d.ts +9 -21
  91. package/build/lib/useQuery.esm.js +5 -4
  92. package/build/lib/useQuery.esm.js.map +1 -1
  93. package/build/lib/useQuery.js +4 -5
  94. package/build/lib/useQuery.js.map +1 -1
  95. package/build/lib/useQuery.mjs +5 -4
  96. package/build/lib/useQuery.mjs.map +1 -1
  97. package/build/lib/utils.d.ts +1 -1
  98. package/build/lib/utils.esm.js +5 -6
  99. package/build/lib/utils.esm.js.map +1 -1
  100. package/build/lib/utils.js +5 -8
  101. package/build/lib/utils.js.map +1 -1
  102. package/build/lib/utils.mjs +5 -6
  103. package/build/lib/utils.mjs.map +1 -1
  104. package/build/umd/index.development.js +1007 -1826
  105. package/build/umd/index.development.js.map +1 -1
  106. package/build/umd/index.production.js +1 -1
  107. package/build/umd/index.production.js.map +1 -1
  108. package/package.json +6 -18
  109. package/src/{Hydrate.tsx → HydrationBoundary.tsx} +17 -18
  110. package/src/QueryClientProvider.tsx +11 -65
  111. package/src/__tests__/{Hydrate.test.tsx → HydrationBoundary.test.tsx} +89 -77
  112. package/src/__tests__/QueryClientProvider.test.tsx +33 -147
  113. package/src/__tests__/QueryResetErrorBoundary.test.tsx +118 -85
  114. package/src/__tests__/ssr-hydration.test.tsx +27 -33
  115. package/src/__tests__/ssr.test.tsx +23 -9
  116. package/src/__tests__/suspense.test.tsx +194 -171
  117. package/src/__tests__/useInfiniteQuery.test.tsx +249 -494
  118. package/src/__tests__/useInfiniteQuery.type.test.tsx +131 -0
  119. package/src/__tests__/useIsFetching.test.tsx +65 -108
  120. package/src/__tests__/useMutation.test.tsx +200 -268
  121. package/src/__tests__/useMutationState.test.tsx +284 -0
  122. package/src/__tests__/useQueries.test.tsx +43 -347
  123. package/src/__tests__/useQuery.test.tsx +890 -686
  124. package/src/__tests__/useQuery.types.test.tsx +23 -24
  125. package/src/__tests__/utils.tsx +14 -23
  126. package/src/errorBoundaryUtils.ts +5 -10
  127. package/src/index.ts +4 -7
  128. package/src/types.ts +33 -38
  129. package/src/useBaseQuery.ts +7 -7
  130. package/src/useInfiniteQuery.ts +12 -77
  131. package/src/useIsFetching.ts +8 -20
  132. package/src/useMutation.ts +8 -66
  133. package/src/useMutationState.ts +81 -0
  134. package/src/useQueries.ts +29 -21
  135. package/src/useQuery.ts +27 -104
  136. package/src/utils.ts +5 -5
  137. package/build/lib/Hydrate.d.ts +0 -10
  138. package/build/lib/Hydrate.esm.js.map +0 -1
  139. package/build/lib/Hydrate.js.map +0 -1
  140. package/build/lib/Hydrate.mjs.map +0 -1
  141. package/build/lib/reactBatchedUpdates.d.ts +0 -2
  142. package/build/lib/reactBatchedUpdates.esm.js +0 -6
  143. package/build/lib/reactBatchedUpdates.esm.js.map +0 -1
  144. package/build/lib/reactBatchedUpdates.js +0 -30
  145. package/build/lib/reactBatchedUpdates.js.map +0 -1
  146. package/build/lib/reactBatchedUpdates.mjs +0 -6
  147. package/build/lib/reactBatchedUpdates.mjs.map +0 -1
  148. package/build/lib/reactBatchedUpdates.native.d.ts +0 -2
  149. package/build/lib/reactBatchedUpdates.native.esm.js +0 -2
  150. package/build/lib/reactBatchedUpdates.native.esm.js.map +0 -1
  151. package/build/lib/reactBatchedUpdates.native.js +0 -13
  152. package/build/lib/reactBatchedUpdates.native.js.map +0 -1
  153. package/build/lib/reactBatchedUpdates.native.mjs +0 -2
  154. package/build/lib/reactBatchedUpdates.native.mjs.map +0 -1
  155. package/build/lib/setBatchUpdatesFn.esm.js +0 -5
  156. package/build/lib/setBatchUpdatesFn.esm.js.map +0 -1
  157. package/build/lib/setBatchUpdatesFn.js +0 -7
  158. package/build/lib/setBatchUpdatesFn.js.map +0 -1
  159. package/build/lib/setBatchUpdatesFn.mjs +0 -5
  160. package/build/lib/setBatchUpdatesFn.mjs.map +0 -1
  161. package/build/lib/useIsMutating.d.ts +0 -7
  162. package/build/lib/useIsMutating.esm.js +0 -16
  163. package/build/lib/useIsMutating.esm.js.map +0 -1
  164. package/build/lib/useIsMutating.js +0 -40
  165. package/build/lib/useIsMutating.js.map +0 -1
  166. package/build/lib/useIsMutating.mjs +0 -16
  167. package/build/lib/useIsMutating.mjs.map +0 -1
  168. package/build/lib/useSyncExternalStore.d.ts +0 -2
  169. package/build/lib/useSyncExternalStore.esm.js +0 -7
  170. package/build/lib/useSyncExternalStore.esm.js.map +0 -1
  171. package/build/lib/useSyncExternalStore.js +0 -11
  172. package/build/lib/useSyncExternalStore.js.map +0 -1
  173. package/build/lib/useSyncExternalStore.mjs +0 -7
  174. package/build/lib/useSyncExternalStore.mjs.map +0 -1
  175. package/build/lib/useSyncExternalStore.native.d.ts +0 -2
  176. package/build/lib/useSyncExternalStore.native.esm.js +0 -2
  177. package/build/lib/useSyncExternalStore.native.esm.js.map +0 -1
  178. package/build/lib/useSyncExternalStore.native.js +0 -13
  179. package/build/lib/useSyncExternalStore.native.js.map +0 -1
  180. package/build/lib/useSyncExternalStore.native.mjs +0 -2
  181. package/build/lib/useSyncExternalStore.native.mjs.map +0 -1
  182. package/codemods/v4/key-transformation.js +0 -138
  183. package/codemods/v4/replace-import-specifier.js +0 -25
  184. package/codemods/v4/utils/index.js +0 -166
  185. package/codemods/v4/utils/replacers/key-replacer.js +0 -160
  186. package/codemods/v4/utils/transformers/query-cache-transformer.js +0 -115
  187. package/codemods/v4/utils/transformers/query-client-transformer.js +0 -49
  188. package/codemods/v4/utils/transformers/use-query-like-transformer.js +0 -32
  189. package/codemods/v4/utils/unprocessable-key-error.js +0 -8
  190. package/src/__tests__/useIsMutating.test.tsx +0 -259
  191. package/src/reactBatchedUpdates.native.ts +0 -4
  192. package/src/reactBatchedUpdates.ts +0 -2
  193. package/src/setBatchUpdatesFn.ts +0 -4
  194. package/src/useIsMutating.ts +0 -39
  195. package/src/useSyncExternalStore.native.ts +0 -5
  196. package/src/useSyncExternalStore.ts +0 -4
  197. /package/build/lib/__tests__/{Hydrate.test.d.ts → HydrationBoundary.test.d.ts} +0 -0
  198. /package/build/lib/__tests__/{useIsMutating.test.d.ts → useInfiniteQuery.type.test.d.ts} +0 -0
  199. /package/build/lib/{setBatchUpdatesFn.d.ts → __tests__/useMutationState.test.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { fireEvent, waitFor } from '@testing-library/react'
2
2
  import * as React from 'react'
3
3
  import { ErrorBoundary } from 'react-error-boundary'
4
- import type { UseInfiniteQueryResult, UseQueryResult } from '..'
4
+ import type { InfiniteData, UseInfiniteQueryResult, UseQueryResult } from '..'
5
5
  import {
6
6
  QueryCache,
7
7
  QueryErrorResetBoundary,
@@ -28,15 +28,15 @@ describe("useQuery's in Suspense mode", () => {
28
28
 
29
29
  const [stateKey, setStateKey] = React.useState(key)
30
30
 
31
- const state = useQuery(
32
- stateKey,
33
- async () => {
31
+ const state = useQuery({
32
+ queryKey: stateKey,
33
+ queryFn: async () => {
34
34
  count++
35
35
  await sleep(10)
36
36
  return count
37
37
  },
38
- { suspense: true },
39
- )
38
+ suspense: true,
39
+ })
40
40
 
41
41
  states.push(state)
42
42
 
@@ -68,21 +68,20 @@ describe("useQuery's in Suspense mode", () => {
68
68
 
69
69
  it('should return the correct states for a successful infinite query', async () => {
70
70
  const key = queryKey()
71
- const states: UseInfiniteQueryResult<number>[] = []
71
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
72
72
 
73
73
  function Page() {
74
74
  const [multiplier, setMultiplier] = React.useState(1)
75
- const state = useInfiniteQuery(
76
- [`${key}_${multiplier}`],
77
- async ({ pageParam = 1 }) => {
75
+ const state = useInfiniteQuery({
76
+ queryKey: [`${key}_${multiplier}`],
77
+ queryFn: async ({ pageParam }) => {
78
78
  await sleep(10)
79
79
  return Number(pageParam * multiplier)
80
80
  },
81
- {
82
- suspense: true,
83
- getNextPageParam: (lastPage) => lastPage + 1,
84
- },
85
- )
81
+ suspense: true,
82
+ defaultPageParam: 1,
83
+ getNextPageParam: (lastPage) => lastPage + 1,
84
+ })
86
85
  states.push(state)
87
86
  return (
88
87
  <div>
@@ -103,7 +102,7 @@ describe("useQuery's in Suspense mode", () => {
103
102
 
104
103
  expect(states.length).toBe(1)
105
104
  expect(states[0]).toMatchObject({
106
- data: { pages: [1], pageParams: [undefined] },
105
+ data: { pages: [1], pageParams: [1] },
107
106
  status: 'success',
108
107
  })
109
108
 
@@ -112,7 +111,7 @@ describe("useQuery's in Suspense mode", () => {
112
111
 
113
112
  expect(states.length).toBe(2)
114
113
  expect(states[1]).toMatchObject({
115
- data: { pages: [2], pageParams: [undefined] },
114
+ data: { pages: [2], pageParams: [1] },
116
115
  status: 'success',
117
116
  })
118
117
  })
@@ -127,7 +126,7 @@ describe("useQuery's in Suspense mode", () => {
127
126
  })
128
127
 
129
128
  function Page() {
130
- useQuery([key], queryFn, { suspense: true })
129
+ useQuery({ queryKey: [key], queryFn, suspense: true })
131
130
 
132
131
  return <>rendered</>
133
132
  }
@@ -148,14 +147,14 @@ describe("useQuery's in Suspense mode", () => {
148
147
  const key = queryKey()
149
148
 
150
149
  function Page() {
151
- useQuery(
152
- key,
153
- () => {
154
- sleep(50)
150
+ useQuery({
151
+ queryKey: key,
152
+ queryFn: () => {
153
+ sleep(10)
155
154
  return 'data'
156
155
  },
157
- { suspense: true },
158
- )
156
+ suspense: true,
157
+ })
159
158
 
160
159
  return <>rendered</>
161
160
  }
@@ -177,17 +176,17 @@ describe("useQuery's in Suspense mode", () => {
177
176
  const rendered = renderWithClient(queryClient, <App />)
178
177
 
179
178
  expect(rendered.queryByText('rendered')).toBeNull()
180
- expect(queryCache.find(key)).toBeFalsy()
179
+ expect(queryCache.find({ queryKey: key })).toBeFalsy()
181
180
 
182
181
  fireEvent.click(rendered.getByLabelText('toggle'))
183
182
  await waitFor(() => rendered.getByText('rendered'))
184
183
 
185
- expect(queryCache.find(key)?.getObserversCount()).toBe(1)
184
+ expect(queryCache.find({ queryKey: key })?.getObserversCount()).toBe(1)
186
185
 
187
186
  fireEvent.click(rendered.getByLabelText('toggle'))
188
187
 
189
188
  expect(rendered.queryByText('rendered')).toBeNull()
190
- expect(queryCache.find(key)?.getObserversCount()).toBe(0)
189
+ expect(queryCache.find({ queryKey: key })?.getObserversCount()).toBe(0)
191
190
  })
192
191
 
193
192
  it('should call onSuccess on the first successful call', async () => {
@@ -196,18 +195,16 @@ describe("useQuery's in Suspense mode", () => {
196
195
  const successFn = jest.fn()
197
196
 
198
197
  function Page() {
199
- useQuery(
200
- [key],
201
- async () => {
198
+ useQuery({
199
+ queryKey: [key],
200
+ queryFn: async () => {
202
201
  await sleep(10)
203
202
  return key
204
203
  },
205
- {
206
- suspense: true,
207
- select: () => 'selected',
208
- onSuccess: successFn,
209
- },
210
- )
204
+ suspense: true,
205
+ select: () => 'selected',
206
+ onSuccess: successFn,
207
+ })
211
208
 
212
209
  return <>rendered</>
213
210
  }
@@ -232,33 +229,30 @@ describe("useQuery's in Suspense mode", () => {
232
229
  const successFn2 = jest.fn()
233
230
 
234
231
  function FirstComponent() {
235
- useQuery(
236
- key,
237
- () => {
232
+ useQuery({
233
+ queryKey: key,
234
+ queryFn: () => {
238
235
  sleep(10)
239
236
  return 'data'
240
237
  },
241
- {
242
- suspense: true,
243
- onSuccess: successFn1,
244
- },
245
- )
238
+ suspense: true,
239
+ onSuccess: successFn1,
240
+ })
246
241
 
247
242
  return <span>first</span>
248
243
  }
249
244
 
250
245
  function SecondComponent() {
251
- useQuery(
252
- key,
253
- () => {
246
+ useQuery({
247
+ queryKey: key,
248
+ queryFn: () => {
254
249
  sleep(10)
255
250
  return 'data'
256
251
  },
257
- {
258
- suspense: true,
259
- onSuccess: successFn2,
260
- },
261
- )
252
+
253
+ suspense: true,
254
+ onSuccess: successFn2,
255
+ })
262
256
 
263
257
  return <span>second</span>
264
258
  }
@@ -279,14 +273,17 @@ describe("useQuery's in Suspense mode", () => {
279
273
 
280
274
  // https://github.com/tannerlinsley/react-query/issues/468
281
275
  it('should reset error state if new component instances are mounted', async () => {
276
+ const consoleMock = jest
277
+ .spyOn(console, 'error')
278
+ .mockImplementation(() => undefined)
282
279
  const key = queryKey()
283
280
 
284
281
  let succeed = false
285
282
 
286
283
  function Page() {
287
- useQuery(
288
- key,
289
- async () => {
284
+ useQuery({
285
+ queryKey: key,
286
+ queryFn: async () => {
290
287
  await sleep(10)
291
288
 
292
289
  if (!succeed) {
@@ -295,11 +292,9 @@ describe("useQuery's in Suspense mode", () => {
295
292
  return 'data'
296
293
  }
297
294
  },
298
- {
299
- retryDelay: 10,
300
- suspense: true,
301
- },
302
- )
295
+ retryDelay: 10,
296
+ suspense: true,
297
+ })
303
298
 
304
299
  return <div>rendered</div>
305
300
  }
@@ -341,17 +336,26 @@ describe("useQuery's in Suspense mode", () => {
341
336
  fireEvent.click(rendered.getByText('retry'))
342
337
 
343
338
  await waitFor(() => rendered.getByText('rendered'))
339
+
340
+ expect(consoleMock).toHaveBeenCalledWith(
341
+ expect.objectContaining(new Error('Suspense Error Bingo')),
342
+ )
343
+
344
+ consoleMock.mockRestore()
344
345
  })
345
346
 
346
347
  it('should retry fetch if the reset error boundary has been reset', async () => {
348
+ const consoleMock = jest
349
+ .spyOn(console, 'error')
350
+ .mockImplementation(() => undefined)
347
351
  const key = queryKey()
348
352
 
349
353
  let succeed = false
350
354
 
351
355
  function Page() {
352
- useQuery(
353
- key,
354
- async () => {
356
+ useQuery({
357
+ queryKey: key,
358
+ queryFn: async () => {
355
359
  await sleep(10)
356
360
  if (!succeed) {
357
361
  throw new Error('Suspense Error Bingo')
@@ -359,11 +363,9 @@ describe("useQuery's in Suspense mode", () => {
359
363
  return 'data'
360
364
  }
361
365
  },
362
- {
363
- retry: false,
364
- suspense: true,
365
- },
366
- )
366
+ retry: false,
367
+ suspense: true,
368
+ })
367
369
  return <div>rendered</div>
368
370
  }
369
371
 
@@ -403,6 +405,7 @@ describe("useQuery's in Suspense mode", () => {
403
405
  succeed = true
404
406
  fireEvent.click(rendered.getByText('retry'))
405
407
  await waitFor(() => rendered.getByText('rendered'))
408
+ consoleMock.mockRestore()
406
409
  })
407
410
 
408
411
  it('should refetch when re-mounting', async () => {
@@ -410,19 +413,17 @@ describe("useQuery's in Suspense mode", () => {
410
413
  let count = 0
411
414
 
412
415
  function Component() {
413
- const result = useQuery(
414
- key,
415
- async () => {
416
+ const result = useQuery({
417
+ queryKey: key,
418
+ queryFn: async () => {
416
419
  await sleep(100)
417
420
  count++
418
421
  return count
419
422
  },
420
- {
421
- retry: false,
422
- suspense: true,
423
- staleTime: 0,
424
- },
425
- )
423
+ retry: false,
424
+ suspense: true,
425
+ staleTime: 0,
426
+ })
426
427
  return (
427
428
  <div>
428
429
  <span>data: {result.data}</span>
@@ -468,17 +469,16 @@ describe("useQuery's in Suspense mode", () => {
468
469
  const key2 = queryKey()
469
470
 
470
471
  function Component(props: { queryKey: Array<string> }) {
471
- const result = useQuery(
472
- props.queryKey,
473
- async () => {
472
+ const result = useQuery({
473
+ queryKey: props.queryKey,
474
+ queryFn: async () => {
474
475
  await sleep(100)
475
476
  return props.queryKey
476
477
  },
477
- {
478
- retry: false,
479
- suspense: true,
480
- },
481
- )
478
+
479
+ retry: false,
480
+ suspense: true,
481
+ })
482
482
  return <div>data: {result.data}</div>
483
483
  }
484
484
 
@@ -507,21 +507,20 @@ describe("useQuery's in Suspense mode", () => {
507
507
  fireEvent.click(rendered.getByText('switch'))
508
508
  await waitFor(() => rendered.getByText('Loading...'))
509
509
  await waitFor(() => rendered.getByText(`data: ${key2}`))
510
- expect(
511
- // @ts-expect-error
512
- queryClient.getQueryCache().find(key2)!.observers[0].listeners.length,
513
- ).toBe(1)
514
510
  })
515
511
 
516
512
  it('should retry fetch if the reset error boundary has been reset with global hook', async () => {
513
+ const consoleMock = jest
514
+ .spyOn(console, 'error')
515
+ .mockImplementation(() => undefined)
517
516
  const key = queryKey()
518
517
 
519
518
  let succeed = false
520
519
 
521
520
  function Page() {
522
- useQuery(
523
- key,
524
- async () => {
521
+ useQuery({
522
+ queryKey: key,
523
+ queryFn: async () => {
525
524
  await sleep(10)
526
525
  if (!succeed) {
527
526
  throw new Error('Suspense Error Bingo')
@@ -529,11 +528,9 @@ describe("useQuery's in Suspense mode", () => {
529
528
  return 'data'
530
529
  }
531
530
  },
532
- {
533
- retry: false,
534
- suspense: true,
535
- },
536
- )
531
+ retry: false,
532
+ suspense: true,
533
+ })
537
534
  return <div>rendered</div>
538
535
  }
539
536
 
@@ -573,23 +570,25 @@ describe("useQuery's in Suspense mode", () => {
573
570
  succeed = true
574
571
  fireEvent.click(rendered.getByText('retry'))
575
572
  await waitFor(() => rendered.getByText('rendered'))
573
+ consoleMock.mockRestore()
576
574
  })
577
575
 
578
576
  it('should throw errors to the error boundary by default', async () => {
577
+ const consoleMock = jest
578
+ .spyOn(console, 'error')
579
+ .mockImplementation(() => undefined)
579
580
  const key = queryKey()
580
581
 
581
582
  function Page() {
582
- useQuery(
583
- key,
584
- async (): Promise<unknown> => {
583
+ useQuery({
584
+ queryKey: key,
585
+ queryFn: async (): Promise<unknown> => {
585
586
  await sleep(10)
586
587
  throw new Error('Suspense Error a1x')
587
588
  },
588
- {
589
- retry: false,
590
- suspense: true,
591
- },
592
- )
589
+ retry: false,
590
+ suspense: true,
591
+ })
593
592
  return <div>rendered</div>
594
593
  }
595
594
 
@@ -613,24 +612,23 @@ describe("useQuery's in Suspense mode", () => {
613
612
 
614
613
  await waitFor(() => rendered.getByText('Loading...'))
615
614
  await waitFor(() => rendered.getByText('error boundary'))
615
+ consoleMock.mockRestore()
616
616
  })
617
617
 
618
- it('should not throw errors to the error boundary when useErrorBoundary: false', async () => {
618
+ it('should not throw errors to the error boundary when throwErrors: false', async () => {
619
619
  const key = queryKey()
620
620
 
621
621
  function Page() {
622
- useQuery(
623
- key,
624
- async (): Promise<unknown> => {
622
+ useQuery({
623
+ queryKey: key,
624
+ queryFn: async (): Promise<unknown> => {
625
625
  await sleep(10)
626
626
  throw new Error('Suspense Error a2x')
627
627
  },
628
- {
629
- retry: false,
630
- suspense: true,
631
- useErrorBoundary: false,
632
- },
633
- )
628
+ retry: false,
629
+ suspense: true,
630
+ throwErrors: false,
631
+ })
634
632
  return <div>rendered</div>
635
633
  }
636
634
 
@@ -656,22 +654,23 @@ describe("useQuery's in Suspense mode", () => {
656
654
  await waitFor(() => rendered.getByText('rendered'))
657
655
  })
658
656
 
659
- it('should not throw errors to the error boundary when a useErrorBoundary function returns true', async () => {
657
+ it('should throw errors to the error boundary when a throwErrors function returns true', async () => {
658
+ const consoleMock = jest
659
+ .spyOn(console, 'error')
660
+ .mockImplementation(() => undefined)
660
661
  const key = queryKey()
661
662
 
662
663
  function Page() {
663
- useQuery(
664
- key,
665
- async (): Promise<unknown> => {
664
+ useQuery({
665
+ queryKey: key,
666
+ queryFn: async (): Promise<unknown> => {
666
667
  await sleep(10)
667
- return Promise.reject('Remote Error')
668
- },
669
- {
670
- retry: false,
671
- suspense: true,
672
- useErrorBoundary: (err) => err !== 'Local Error',
668
+ return Promise.reject(new Error('Remote Error'))
673
669
  },
674
- )
670
+ retry: false,
671
+ suspense: true,
672
+ throwErrors: (err) => err.message !== 'Local Error',
673
+ })
675
674
  return <div>rendered</div>
676
675
  }
677
676
 
@@ -695,24 +694,23 @@ describe("useQuery's in Suspense mode", () => {
695
694
 
696
695
  await waitFor(() => rendered.getByText('Loading...'))
697
696
  await waitFor(() => rendered.getByText('error boundary'))
697
+ consoleMock.mockRestore()
698
698
  })
699
699
 
700
- it('should not throw errors to the error boundary when a useErrorBoundary function returns false', async () => {
700
+ it('should not throw errors to the error boundary when a throwErrors function returns false', async () => {
701
701
  const key = queryKey()
702
702
 
703
703
  function Page() {
704
- useQuery(
705
- key,
706
- async (): Promise<unknown> => {
704
+ useQuery({
705
+ queryKey: key,
706
+ queryFn: async (): Promise<unknown> => {
707
707
  await sleep(10)
708
- return Promise.reject('Local Error')
708
+ return Promise.reject(new Error('Local Error'))
709
709
  },
710
- {
711
- retry: false,
712
- suspense: true,
713
- useErrorBoundary: (err) => err !== 'Local Error',
714
- },
715
- )
710
+ retry: false,
711
+ suspense: true,
712
+ throwErrors: (err) => err.message !== 'Local Error',
713
+ })
716
714
  return <div>rendered</div>
717
715
  }
718
716
 
@@ -749,7 +747,12 @@ describe("useQuery's in Suspense mode", () => {
749
747
 
750
748
  function Page() {
751
749
  const [enabled, setEnabled] = React.useState(false)
752
- const result = useQuery([key], queryFn, { suspense: true, enabled })
750
+ const result = useQuery({
751
+ queryKey: [key],
752
+ queryFn,
753
+ suspense: true,
754
+ enabled,
755
+ })
753
756
 
754
757
  return (
755
758
  <div>
@@ -778,6 +781,9 @@ describe("useQuery's in Suspense mode", () => {
778
781
  })
779
782
 
780
783
  it('should error catched in error boundary without infinite loop', async () => {
784
+ const consoleMock = jest
785
+ .spyOn(console, 'error')
786
+ .mockImplementation(() => undefined)
781
787
  const key = queryKey()
782
788
 
783
789
  let succeed = true
@@ -785,9 +791,9 @@ describe("useQuery's in Suspense mode", () => {
785
791
  function Page() {
786
792
  const [nonce] = React.useState(0)
787
793
  const queryKeys = [`${key}-${succeed}`]
788
- const result = useQuery(
789
- queryKeys,
790
- async () => {
794
+ const result = useQuery({
795
+ queryKey: queryKeys,
796
+ queryFn: async () => {
791
797
  await sleep(10)
792
798
  if (!succeed) {
793
799
  throw new Error('Suspense Error Bingo')
@@ -795,11 +801,9 @@ describe("useQuery's in Suspense mode", () => {
795
801
  return nonce
796
802
  }
797
803
  },
798
- {
799
- retry: false,
800
- suspense: true,
801
- },
802
- )
804
+ retry: false,
805
+ suspense: true,
806
+ })
803
807
  return (
804
808
  <div>
805
809
  <span>rendered</span> <span>{result.data}</span>
@@ -842,18 +846,26 @@ describe("useQuery's in Suspense mode", () => {
842
846
  fireEvent.click(rendered.getByLabelText('fail'))
843
847
  // render error boundary fallback (error boundary)
844
848
  await waitFor(() => rendered.getByText('error boundary'))
849
+ expect(consoleMock).toHaveBeenCalledWith(
850
+ expect.objectContaining(new Error('Suspense Error Bingo')),
851
+ )
852
+
853
+ consoleMock.mockRestore()
845
854
  })
846
855
 
847
856
  it('should error catched in error boundary without infinite loop when query keys changed', async () => {
857
+ const consoleMock = jest
858
+ .spyOn(console, 'error')
859
+ .mockImplementation(() => undefined)
848
860
  let succeed = true
849
861
 
850
862
  function Page() {
851
863
  const [key, rerender] = React.useReducer((x) => x + 1, 0)
852
864
  const queryKeys = [key, succeed]
853
865
 
854
- const result = useQuery(
855
- queryKeys,
856
- async () => {
866
+ const result = useQuery({
867
+ queryKey: queryKeys,
868
+ queryFn: async () => {
857
869
  await sleep(10)
858
870
  if (!succeed) {
859
871
  throw new Error('Suspense Error Bingo')
@@ -861,11 +873,9 @@ describe("useQuery's in Suspense mode", () => {
861
873
  return 'data'
862
874
  }
863
875
  },
864
- {
865
- retry: false,
866
- suspense: true,
867
- },
868
- )
876
+ retry: false,
877
+ suspense: true,
878
+ })
869
879
  return (
870
880
  <div>
871
881
  <span>rendered</span> <span>{result.data}</span>
@@ -903,25 +913,32 @@ describe("useQuery's in Suspense mode", () => {
903
913
  fireEvent.click(rendered.getByLabelText('fail'))
904
914
  // render error boundary fallback (error boundary)
905
915
  await waitFor(() => rendered.getByText('error boundary'))
916
+ expect(consoleMock).toHaveBeenCalledWith(
917
+ expect.objectContaining(new Error('Suspense Error Bingo')),
918
+ )
919
+
920
+ consoleMock.mockRestore()
906
921
  })
907
922
 
908
923
  it('should error catched in error boundary without infinite loop when enabled changed', async () => {
924
+ const consoleMock = jest
925
+ .spyOn(console, 'error')
926
+ .mockImplementation(() => undefined)
909
927
  function Page() {
910
928
  const queryKeys = '1'
911
929
  const [enabled, setEnabled] = React.useState(false)
912
930
 
913
- const result = useQuery<string>(
914
- [queryKeys],
915
- async () => {
931
+ const result = useQuery<string>({
932
+ queryKey: [queryKeys],
933
+ queryFn: async () => {
916
934
  await sleep(10)
917
935
  throw new Error('Suspense Error Bingo')
918
936
  },
919
- {
920
- retry: false,
921
- suspense: true,
922
- enabled,
923
- },
924
- )
937
+
938
+ retry: false,
939
+ suspense: true,
940
+ enabled,
941
+ })
925
942
  return (
926
943
  <div>
927
944
  <span>rendered</span> <span>{result.data}</span>
@@ -964,9 +981,14 @@ describe("useQuery's in Suspense mode", () => {
964
981
 
965
982
  // render error boundary fallback (error boundary)
966
983
  await waitFor(() => rendered.getByText('error boundary'))
984
+ expect(consoleMock).toHaveBeenCalledWith(
985
+ expect.objectContaining(new Error('Suspense Error Bingo')),
986
+ )
987
+
988
+ consoleMock.mockRestore()
967
989
  })
968
990
 
969
- it('should render the correct amount of times in Suspense mode when cacheTime is set to 0', async () => {
991
+ it('should render the correct amount of times in Suspense mode when gcTime is set to 0', async () => {
970
992
  const key = queryKey()
971
993
  let state: UseQueryResult<number> | null = null
972
994
 
@@ -976,15 +998,16 @@ describe("useQuery's in Suspense mode", () => {
976
998
  function Page() {
977
999
  renders++
978
1000
 
979
- state = useQuery(
980
- key,
981
- async () => {
1001
+ state = useQuery({
1002
+ queryKey: key,
1003
+ queryFn: async () => {
982
1004
  count++
983
1005
  await sleep(10)
984
1006
  return count
985
1007
  },
986
- { suspense: true, cacheTime: 0 },
987
- )
1008
+ suspense: true,
1009
+ gcTime: 0,
1010
+ })
988
1011
 
989
1012
  return (
990
1013
  <div>
@@ -1096,7 +1119,7 @@ describe('useQueries with suspense', () => {
1096
1119
  await sleep(200)
1097
1120
  return '2'
1098
1121
  },
1099
- staleTime: 1000,
1122
+ staleTime: 2000,
1100
1123
  suspense: false,
1101
1124
  },
1102
1125
  ],
@@ -1117,7 +1140,7 @@ describe('useQueries with suspense', () => {
1117
1140
  </React.Suspense>,
1118
1141
  )
1119
1142
  await waitFor(() => rendered.getByText('loading'))
1120
- await waitFor(() => rendered.getByText('status: success,loading'))
1143
+ await waitFor(() => rendered.getByText('status: success,pending'))
1121
1144
  await waitFor(() => rendered.getByText('data: 1,null'))
1122
1145
  await waitFor(() => rendered.getByText('data: 1,2'))
1123
1146