@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.
- package/build/lib/HydrationBoundary.d.ts +9 -0
- package/build/lib/{Hydrate.esm.js → HydrationBoundary.esm.js} +14 -17
- package/build/lib/HydrationBoundary.esm.js.map +1 -0
- package/build/lib/{Hydrate.js → HydrationBoundary.js} +17 -24
- package/build/lib/HydrationBoundary.js.map +1 -0
- package/build/lib/{Hydrate.mjs → HydrationBoundary.mjs} +14 -17
- package/build/lib/HydrationBoundary.mjs.map +1 -0
- package/build/lib/QueryClientProvider.d.ts +4 -19
- package/build/lib/QueryClientProvider.esm.js +11 -46
- package/build/lib/QueryClientProvider.esm.js.map +1 -1
- package/build/lib/QueryClientProvider.js +14 -52
- package/build/lib/QueryClientProvider.js.map +1 -1
- package/build/lib/QueryClientProvider.mjs +11 -46
- package/build/lib/QueryClientProvider.mjs.map +1 -1
- package/build/lib/QueryErrorResetBoundary.esm.js +7 -2
- package/build/lib/QueryErrorResetBoundary.esm.js.map +1 -1
- package/build/lib/QueryErrorResetBoundary.js +10 -8
- package/build/lib/QueryErrorResetBoundary.js.map +1 -1
- package/build/lib/QueryErrorResetBoundary.mjs +7 -2
- package/build/lib/QueryErrorResetBoundary.mjs.map +1 -1
- package/build/lib/__tests__/useQuery.types.test.d.ts +1 -2
- package/build/lib/__tests__/utils.d.ts +7 -10
- package/build/lib/errorBoundaryUtils.d.ts +3 -3
- package/build/lib/errorBoundaryUtils.esm.js +3 -3
- package/build/lib/errorBoundaryUtils.esm.js.map +1 -1
- package/build/lib/errorBoundaryUtils.js +6 -9
- package/build/lib/errorBoundaryUtils.js.map +1 -1
- package/build/lib/errorBoundaryUtils.mjs +3 -3
- package/build/lib/errorBoundaryUtils.mjs.map +1 -1
- package/build/lib/index.d.ts +4 -5
- package/build/lib/index.esm.js +3 -4
- package/build/lib/index.esm.js.map +1 -1
- package/build/lib/index.js +6 -9
- package/build/lib/index.js.map +1 -1
- package/build/lib/index.mjs +3 -4
- package/build/lib/index.mjs.map +1 -1
- package/build/lib/isRestoring.esm.js.map +1 -1
- package/build/lib/isRestoring.js +3 -6
- package/build/lib/isRestoring.js.map +1 -1
- package/build/lib/isRestoring.mjs.map +1 -1
- package/build/lib/suspense.esm.js +5 -5
- package/build/lib/suspense.esm.js.map +1 -1
- package/build/lib/suspense.js +5 -7
- package/build/lib/suspense.js.map +1 -1
- package/build/lib/suspense.mjs +5 -5
- package/build/lib/suspense.mjs.map +1 -1
- package/build/lib/types.d.ts +14 -22
- package/build/lib/useBaseQuery.d.ts +2 -2
- package/build/lib/useBaseQuery.esm.js +15 -18
- package/build/lib/useBaseQuery.esm.js.map +1 -1
- package/build/lib/useBaseQuery.js +18 -24
- package/build/lib/useBaseQuery.js.map +1 -1
- package/build/lib/useBaseQuery.mjs +15 -18
- package/build/lib/useBaseQuery.mjs.map +1 -1
- package/build/lib/useInfiniteQuery.d.ts +2 -4
- package/build/lib/useInfiniteQuery.esm.js +4 -4
- package/build/lib/useInfiniteQuery.esm.js.map +1 -1
- package/build/lib/useInfiniteQuery.js +3 -5
- package/build/lib/useInfiniteQuery.js.map +1 -1
- package/build/lib/useInfiniteQuery.mjs +4 -4
- package/build/lib/useInfiniteQuery.mjs.map +1 -1
- package/build/lib/useIsFetching.d.ts +2 -7
- package/build/lib/useIsFetching.esm.js +5 -9
- package/build/lib/useIsFetching.esm.js.map +1 -1
- package/build/lib/useIsFetching.js +7 -14
- package/build/lib/useIsFetching.js.map +1 -1
- package/build/lib/useIsFetching.mjs +5 -9
- package/build/lib/useIsFetching.mjs.map +1 -1
- package/build/lib/useMutation.d.ts +2 -5
- package/build/lib/useMutation.esm.js +12 -14
- package/build/lib/useMutation.esm.js.map +1 -1
- package/build/lib/useMutation.js +14 -19
- package/build/lib/useMutation.js.map +1 -1
- package/build/lib/useMutation.mjs +12 -14
- package/build/lib/useMutation.mjs.map +1 -1
- package/build/lib/useMutationState.d.ts +8 -0
- package/build/lib/useMutationState.esm.js +37 -0
- package/build/lib/useMutationState.esm.js.map +1 -0
- package/build/lib/useMutationState.js +59 -0
- package/build/lib/useMutationState.js.map +1 -0
- package/build/lib/useMutationState.mjs +37 -0
- package/build/lib/useMutationState.mjs.map +1 -0
- package/build/lib/useQueries.d.ts +9 -7
- package/build/lib/useQueries.esm.js +16 -27
- package/build/lib/useQueries.esm.js.map +1 -1
- package/build/lib/useQueries.js +19 -33
- package/build/lib/useQueries.js.map +1 -1
- package/build/lib/useQueries.mjs +16 -27
- package/build/lib/useQueries.mjs.map +1 -1
- package/build/lib/useQuery.d.ts +9 -21
- package/build/lib/useQuery.esm.js +5 -4
- package/build/lib/useQuery.esm.js.map +1 -1
- package/build/lib/useQuery.js +4 -5
- package/build/lib/useQuery.js.map +1 -1
- package/build/lib/useQuery.mjs +5 -4
- package/build/lib/useQuery.mjs.map +1 -1
- package/build/lib/utils.d.ts +1 -1
- package/build/lib/utils.esm.js +5 -6
- package/build/lib/utils.esm.js.map +1 -1
- package/build/lib/utils.js +5 -8
- package/build/lib/utils.js.map +1 -1
- package/build/lib/utils.mjs +5 -6
- package/build/lib/utils.mjs.map +1 -1
- package/build/umd/index.development.js +1007 -1826
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +6 -18
- package/src/{Hydrate.tsx → HydrationBoundary.tsx} +17 -18
- package/src/QueryClientProvider.tsx +11 -65
- package/src/__tests__/{Hydrate.test.tsx → HydrationBoundary.test.tsx} +89 -77
- package/src/__tests__/QueryClientProvider.test.tsx +33 -147
- package/src/__tests__/QueryResetErrorBoundary.test.tsx +118 -85
- package/src/__tests__/ssr-hydration.test.tsx +27 -33
- package/src/__tests__/ssr.test.tsx +23 -9
- package/src/__tests__/suspense.test.tsx +194 -171
- package/src/__tests__/useInfiniteQuery.test.tsx +249 -494
- package/src/__tests__/useInfiniteQuery.type.test.tsx +131 -0
- package/src/__tests__/useIsFetching.test.tsx +65 -108
- package/src/__tests__/useMutation.test.tsx +200 -268
- package/src/__tests__/useMutationState.test.tsx +284 -0
- package/src/__tests__/useQueries.test.tsx +43 -347
- package/src/__tests__/useQuery.test.tsx +890 -686
- package/src/__tests__/useQuery.types.test.tsx +23 -24
- package/src/__tests__/utils.tsx +14 -23
- package/src/errorBoundaryUtils.ts +5 -10
- package/src/index.ts +4 -7
- package/src/types.ts +33 -38
- package/src/useBaseQuery.ts +7 -7
- package/src/useInfiniteQuery.ts +12 -77
- package/src/useIsFetching.ts +8 -20
- package/src/useMutation.ts +8 -66
- package/src/useMutationState.ts +81 -0
- package/src/useQueries.ts +29 -21
- package/src/useQuery.ts +27 -104
- package/src/utils.ts +5 -5
- package/build/lib/Hydrate.d.ts +0 -10
- package/build/lib/Hydrate.esm.js.map +0 -1
- package/build/lib/Hydrate.js.map +0 -1
- package/build/lib/Hydrate.mjs.map +0 -1
- package/build/lib/reactBatchedUpdates.d.ts +0 -2
- package/build/lib/reactBatchedUpdates.esm.js +0 -6
- package/build/lib/reactBatchedUpdates.esm.js.map +0 -1
- package/build/lib/reactBatchedUpdates.js +0 -30
- package/build/lib/reactBatchedUpdates.js.map +0 -1
- package/build/lib/reactBatchedUpdates.mjs +0 -6
- package/build/lib/reactBatchedUpdates.mjs.map +0 -1
- package/build/lib/reactBatchedUpdates.native.d.ts +0 -2
- 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/useIsMutating.d.ts +0 -7
- package/build/lib/useIsMutating.esm.js +0 -16
- package/build/lib/useIsMutating.esm.js.map +0 -1
- package/build/lib/useIsMutating.js +0 -40
- package/build/lib/useIsMutating.js.map +0 -1
- package/build/lib/useIsMutating.mjs +0 -16
- package/build/lib/useIsMutating.mjs.map +0 -1
- package/build/lib/useSyncExternalStore.d.ts +0 -2
- 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.d.ts +0 -2
- 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/codemods/v4/key-transformation.js +0 -138
- package/codemods/v4/replace-import-specifier.js +0 -25
- package/codemods/v4/utils/index.js +0 -166
- package/codemods/v4/utils/replacers/key-replacer.js +0 -160
- package/codemods/v4/utils/transformers/query-cache-transformer.js +0 -115
- package/codemods/v4/utils/transformers/query-client-transformer.js +0 -49
- package/codemods/v4/utils/transformers/use-query-like-transformer.js +0 -32
- package/codemods/v4/utils/unprocessable-key-error.js +0 -8
- package/src/__tests__/useIsMutating.test.tsx +0 -259
- package/src/reactBatchedUpdates.native.ts +0 -4
- package/src/reactBatchedUpdates.ts +0 -2
- package/src/setBatchUpdatesFn.ts +0 -4
- package/src/useIsMutating.ts +0 -39
- package/src/useSyncExternalStore.native.ts +0 -5
- package/src/useSyncExternalStore.ts +0 -4
- /package/build/lib/__tests__/{Hydrate.test.d.ts → HydrationBoundary.test.d.ts} +0 -0
- /package/build/lib/__tests__/{useIsMutating.test.d.ts → useInfiniteQuery.type.test.d.ts} +0 -0
- /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
|
-
|
|
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
|
|
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
|
-
|
|
83
|
-
|
|
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: [
|
|
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: [
|
|
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,
|
|
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(
|
|
150
|
+
useQuery({
|
|
151
|
+
queryKey: key,
|
|
152
|
+
queryFn: () => {
|
|
153
|
+
sleep(10)
|
|
155
154
|
return 'data'
|
|
156
155
|
},
|
|
157
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
243
|
-
|
|
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
|
-
|
|
259
|
-
|
|
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
|
-
|
|
300
|
-
|
|
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
|
-
|
|
364
|
-
|
|
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
|
-
|
|
422
|
-
|
|
423
|
-
|
|
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
|
-
|
|
479
|
-
|
|
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
|
-
|
|
534
|
-
|
|
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
|
-
|
|
590
|
-
|
|
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
|
|
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
|
-
|
|
630
|
-
|
|
631
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
712
|
-
|
|
713
|
-
|
|
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(
|
|
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
|
-
|
|
800
|
-
|
|
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
|
-
|
|
866
|
-
|
|
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
|
-
|
|
921
|
-
|
|
922
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
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,
|
|
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
|
|