@tanstack/react-query 4.24.10 → 5.0.0-alpha.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.
- 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 +6 -4
- package/build/lib/useInfiniteQuery.esm.js.map +1 -1
- package/build/lib/useInfiniteQuery.js +5 -5
- package/build/lib/useInfiniteQuery.js.map +1 -1
- package/build/lib/useInfiniteQuery.mjs +6 -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 +1003 -1827
- 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 +13 -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,4 +1,4 @@
|
|
|
1
|
-
import { fireEvent, waitFor } from '@testing-library/react'
|
|
1
|
+
import { fireEvent, render, waitFor } from '@testing-library/react'
|
|
2
2
|
import * as React from 'react'
|
|
3
3
|
import { ErrorBoundary } from 'react-error-boundary'
|
|
4
4
|
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
sleep,
|
|
14
14
|
} from './utils'
|
|
15
15
|
import type {
|
|
16
|
-
QueryClient,
|
|
17
16
|
QueryFunction,
|
|
18
17
|
QueryKey,
|
|
19
18
|
QueryObserverResult,
|
|
@@ -73,251 +72,6 @@ describe('useQueries', () => {
|
|
|
73
72
|
expect(results[2]).toMatchObject([{ data: 1 }, { data: 2 }])
|
|
74
73
|
})
|
|
75
74
|
|
|
76
|
-
it('should keep previous data if amount of queries is the same', async () => {
|
|
77
|
-
const key1 = queryKey()
|
|
78
|
-
const key2 = queryKey()
|
|
79
|
-
const states: UseQueryResult[][] = []
|
|
80
|
-
|
|
81
|
-
function Page() {
|
|
82
|
-
const [count, setCount] = React.useState(1)
|
|
83
|
-
const result = useQueries({
|
|
84
|
-
queries: [
|
|
85
|
-
{
|
|
86
|
-
queryKey: [key1, count],
|
|
87
|
-
keepPreviousData: true,
|
|
88
|
-
queryFn: async () => {
|
|
89
|
-
await sleep(10)
|
|
90
|
-
return count * 2
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
queryKey: [key2, count],
|
|
95
|
-
keepPreviousData: true,
|
|
96
|
-
queryFn: async () => {
|
|
97
|
-
await sleep(35)
|
|
98
|
-
return count * 5
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
],
|
|
102
|
-
})
|
|
103
|
-
states.push(result)
|
|
104
|
-
|
|
105
|
-
const isFetching = result.some((r) => r.isFetching)
|
|
106
|
-
|
|
107
|
-
return (
|
|
108
|
-
<div>
|
|
109
|
-
<div>
|
|
110
|
-
data1: {String(result[0].data ?? 'null')}, data2:{' '}
|
|
111
|
-
{String(result[1].data ?? 'null')}
|
|
112
|
-
</div>
|
|
113
|
-
<div>isFetching: {String(isFetching)}</div>
|
|
114
|
-
<button onClick={() => setCount((prev) => prev + 1)}>inc</button>
|
|
115
|
-
</div>
|
|
116
|
-
)
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const rendered = renderWithClient(queryClient, <Page />)
|
|
120
|
-
|
|
121
|
-
await waitFor(() => rendered.getByText('data1: 2, data2: 5'))
|
|
122
|
-
fireEvent.click(rendered.getByRole('button', { name: /inc/i }))
|
|
123
|
-
|
|
124
|
-
await waitFor(() => rendered.getByText('data1: 4, data2: 10'))
|
|
125
|
-
await waitFor(() => rendered.getByText('isFetching: false'))
|
|
126
|
-
|
|
127
|
-
expect(states[states.length - 1]).toMatchObject([
|
|
128
|
-
{ status: 'success', data: 4, isPreviousData: false, isFetching: false },
|
|
129
|
-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
|
|
130
|
-
])
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
it('should keep previous data for variable amounts of useQueries', async () => {
|
|
134
|
-
const key = queryKey()
|
|
135
|
-
const states: UseQueryResult[][] = []
|
|
136
|
-
|
|
137
|
-
function Page() {
|
|
138
|
-
const [count, setCount] = React.useState(2)
|
|
139
|
-
const result = useQueries({
|
|
140
|
-
queries: Array.from({ length: count }, (_, i) => ({
|
|
141
|
-
queryKey: [key, count, i + 1],
|
|
142
|
-
keepPreviousData: true,
|
|
143
|
-
queryFn: async () => {
|
|
144
|
-
await sleep(35 * (i + 1))
|
|
145
|
-
return (i + 1) * count * 2
|
|
146
|
-
},
|
|
147
|
-
})),
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
states.push(result)
|
|
151
|
-
|
|
152
|
-
const isFetching = result.some((r) => r.isFetching)
|
|
153
|
-
|
|
154
|
-
return (
|
|
155
|
-
<div>
|
|
156
|
-
<div>data: {result.map((it) => it.data).join(',')}</div>
|
|
157
|
-
<div>isFetching: {String(isFetching)}</div>
|
|
158
|
-
<button onClick={() => setCount((prev) => prev + 1)}>inc</button>
|
|
159
|
-
</div>
|
|
160
|
-
)
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const rendered = renderWithClient(queryClient, <Page />)
|
|
164
|
-
|
|
165
|
-
await waitFor(() => rendered.getByText('data: 4,8'))
|
|
166
|
-
fireEvent.click(rendered.getByRole('button', { name: /inc/i }))
|
|
167
|
-
|
|
168
|
-
await waitFor(() => rendered.getByText('data: 6,12,18'))
|
|
169
|
-
await waitFor(() => rendered.getByText('isFetching: false'))
|
|
170
|
-
|
|
171
|
-
expect(states[states.length - 1]).toMatchObject([
|
|
172
|
-
{ status: 'success', data: 6, isPreviousData: false, isFetching: false },
|
|
173
|
-
{ status: 'success', data: 12, isPreviousData: false, isFetching: false },
|
|
174
|
-
{ status: 'success', data: 18, isPreviousData: false, isFetching: false },
|
|
175
|
-
])
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
it('should keep previous data when switching between queries', async () => {
|
|
179
|
-
const key = queryKey()
|
|
180
|
-
const states: UseQueryResult[][] = []
|
|
181
|
-
|
|
182
|
-
function Page() {
|
|
183
|
-
const [series1, setSeries1] = React.useState(1)
|
|
184
|
-
const [series2, setSeries2] = React.useState(2)
|
|
185
|
-
const ids = [series1, series2]
|
|
186
|
-
|
|
187
|
-
const result = useQueries({
|
|
188
|
-
queries: ids.map((id) => {
|
|
189
|
-
return {
|
|
190
|
-
queryKey: [key, id],
|
|
191
|
-
queryFn: async () => {
|
|
192
|
-
await sleep(5)
|
|
193
|
-
return id * 5
|
|
194
|
-
},
|
|
195
|
-
keepPreviousData: true,
|
|
196
|
-
}
|
|
197
|
-
}),
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
states.push(result)
|
|
201
|
-
|
|
202
|
-
const isFetching = result.some((r) => r.isFetching)
|
|
203
|
-
|
|
204
|
-
return (
|
|
205
|
-
<div>
|
|
206
|
-
<div>
|
|
207
|
-
data1: {String(result[0]?.data ?? 'null')}, data2:{' '}
|
|
208
|
-
{String(result[1]?.data ?? 'null')}
|
|
209
|
-
</div>
|
|
210
|
-
<div>isFetching: {String(isFetching)}</div>
|
|
211
|
-
<button onClick={() => setSeries2(3)}>setSeries2</button>
|
|
212
|
-
<button onClick={() => setSeries1(2)}>setSeries1</button>
|
|
213
|
-
</div>
|
|
214
|
-
)
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const rendered = renderWithClient(queryClient, <Page />)
|
|
218
|
-
|
|
219
|
-
await waitFor(() => rendered.getByText('data1: 5, data2: 10'))
|
|
220
|
-
fireEvent.click(rendered.getByRole('button', { name: /setSeries2/i }))
|
|
221
|
-
|
|
222
|
-
await waitFor(() => rendered.getByText('data1: 5, data2: 15'))
|
|
223
|
-
fireEvent.click(rendered.getByRole('button', { name: /setSeries1/i }))
|
|
224
|
-
|
|
225
|
-
await waitFor(() => rendered.getByText('data1: 10, data2: 15'))
|
|
226
|
-
await waitFor(() => rendered.getByText('isFetching: false'))
|
|
227
|
-
|
|
228
|
-
expect(states[states.length - 1]).toMatchObject([
|
|
229
|
-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
|
|
230
|
-
{ status: 'success', data: 15, isPreviousData: false, isFetching: false },
|
|
231
|
-
])
|
|
232
|
-
})
|
|
233
|
-
|
|
234
|
-
it('should not go to infinite render loop with previous data when toggling queries', async () => {
|
|
235
|
-
const key = queryKey()
|
|
236
|
-
const states: UseQueryResult[][] = []
|
|
237
|
-
|
|
238
|
-
function Page() {
|
|
239
|
-
const [enableId1, setEnableId1] = React.useState(true)
|
|
240
|
-
const ids = enableId1 ? [1, 2] : [2]
|
|
241
|
-
|
|
242
|
-
const result = useQueries({
|
|
243
|
-
queries: ids.map((id) => {
|
|
244
|
-
return {
|
|
245
|
-
queryKey: [key, id],
|
|
246
|
-
queryFn: async () => {
|
|
247
|
-
await sleep(5)
|
|
248
|
-
return id * 5
|
|
249
|
-
},
|
|
250
|
-
keepPreviousData: true,
|
|
251
|
-
}
|
|
252
|
-
}),
|
|
253
|
-
})
|
|
254
|
-
|
|
255
|
-
states.push(result)
|
|
256
|
-
|
|
257
|
-
const isFetching = result.some((r) => r.isFetching)
|
|
258
|
-
|
|
259
|
-
return (
|
|
260
|
-
<div>
|
|
261
|
-
<div>
|
|
262
|
-
data1: {String(result[0]?.data ?? 'null')}, data2:{' '}
|
|
263
|
-
{String(result[1]?.data ?? 'null')}
|
|
264
|
-
</div>
|
|
265
|
-
<div>isFetching: {String(isFetching)}</div>
|
|
266
|
-
<button onClick={() => setEnableId1(false)}>set1Disabled</button>
|
|
267
|
-
<button onClick={() => setEnableId1(true)}>set2Enabled</button>
|
|
268
|
-
</div>
|
|
269
|
-
)
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
const rendered = renderWithClient(queryClient, <Page />)
|
|
273
|
-
|
|
274
|
-
await waitFor(() => rendered.getByText('data1: 5, data2: 10'))
|
|
275
|
-
fireEvent.click(rendered.getByRole('button', { name: /set1Disabled/i }))
|
|
276
|
-
|
|
277
|
-
await waitFor(() => rendered.getByText('data1: 10, data2: null'))
|
|
278
|
-
await waitFor(() => rendered.getByText('isFetching: false'))
|
|
279
|
-
fireEvent.click(rendered.getByRole('button', { name: /set2Enabled/i }))
|
|
280
|
-
|
|
281
|
-
await waitFor(() => rendered.getByText('data1: 5, data2: 10'))
|
|
282
|
-
await waitFor(() => rendered.getByText('isFetching: false'))
|
|
283
|
-
|
|
284
|
-
await waitFor(() => expect(states.length).toBe(6))
|
|
285
|
-
|
|
286
|
-
expect(states[0]).toMatchObject([
|
|
287
|
-
{
|
|
288
|
-
status: 'loading',
|
|
289
|
-
data: undefined,
|
|
290
|
-
isPreviousData: false,
|
|
291
|
-
isFetching: true,
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
status: 'loading',
|
|
295
|
-
data: undefined,
|
|
296
|
-
isPreviousData: false,
|
|
297
|
-
isFetching: true,
|
|
298
|
-
},
|
|
299
|
-
])
|
|
300
|
-
expect(states[1]).toMatchObject([
|
|
301
|
-
{ status: 'success', data: 5, isPreviousData: false, isFetching: false },
|
|
302
|
-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
|
|
303
|
-
])
|
|
304
|
-
expect(states[2]).toMatchObject([
|
|
305
|
-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
|
|
306
|
-
])
|
|
307
|
-
expect(states[3]).toMatchObject([
|
|
308
|
-
{ status: 'success', data: 5, isPreviousData: false, isFetching: true },
|
|
309
|
-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
|
|
310
|
-
])
|
|
311
|
-
expect(states[4]).toMatchObject([
|
|
312
|
-
{ status: 'success', data: 5, isPreviousData: false, isFetching: true },
|
|
313
|
-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
|
|
314
|
-
])
|
|
315
|
-
expect(states[5]).toMatchObject([
|
|
316
|
-
{ status: 'success', data: 5, isPreviousData: false, isFetching: false },
|
|
317
|
-
{ status: 'success', data: 10, isPreviousData: false, isFetching: false },
|
|
318
|
-
])
|
|
319
|
-
})
|
|
320
|
-
|
|
321
75
|
it('handles type parameter - tuple of tuples', async () => {
|
|
322
76
|
const key1 = queryKey()
|
|
323
77
|
const key2 = queryKey()
|
|
@@ -1021,98 +775,10 @@ describe('useQueries', () => {
|
|
|
1021
775
|
QueriesObserverSpy.mockRestore()
|
|
1022
776
|
})
|
|
1023
777
|
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
const key1 = queryKey()
|
|
1029
|
-
const key2 = queryKey()
|
|
1030
|
-
const results: UseQueryResult[][] = []
|
|
1031
|
-
|
|
1032
|
-
function Page() {
|
|
1033
|
-
const result = useQueries({
|
|
1034
|
-
context,
|
|
1035
|
-
queries: [
|
|
1036
|
-
{
|
|
1037
|
-
queryKey: key1,
|
|
1038
|
-
queryFn: async () => {
|
|
1039
|
-
await sleep(5)
|
|
1040
|
-
return 1
|
|
1041
|
-
},
|
|
1042
|
-
},
|
|
1043
|
-
{
|
|
1044
|
-
queryKey: key2,
|
|
1045
|
-
queryFn: async () => {
|
|
1046
|
-
await sleep(10)
|
|
1047
|
-
return 2
|
|
1048
|
-
},
|
|
1049
|
-
},
|
|
1050
|
-
],
|
|
1051
|
-
})
|
|
1052
|
-
results.push(result)
|
|
1053
|
-
|
|
1054
|
-
return (
|
|
1055
|
-
<div>
|
|
1056
|
-
<div>data1: {result[0].data}</div>
|
|
1057
|
-
<div>data2: {result[1].data}</div>
|
|
1058
|
-
</div>
|
|
1059
|
-
)
|
|
1060
|
-
}
|
|
1061
|
-
|
|
1062
|
-
const rendered = renderWithClient(queryClient, <Page />, { context })
|
|
1063
|
-
|
|
1064
|
-
await waitFor(() => {
|
|
1065
|
-
rendered.getByText('data1: 1')
|
|
1066
|
-
rendered.getByText('data2: 2')
|
|
1067
|
-
})
|
|
1068
|
-
|
|
1069
|
-
expect(results[0]).toMatchObject([
|
|
1070
|
-
{ data: undefined },
|
|
1071
|
-
{ data: undefined },
|
|
1072
|
-
])
|
|
1073
|
-
expect(results[results.length - 1]).toMatchObject([
|
|
1074
|
-
{ data: 1 },
|
|
1075
|
-
{ data: 2 },
|
|
1076
|
-
])
|
|
1077
|
-
})
|
|
1078
|
-
|
|
1079
|
-
it('should throw if the context is necessary and is not passed to useQueries', async () => {
|
|
1080
|
-
const context = React.createContext<QueryClient | undefined>(undefined)
|
|
1081
|
-
|
|
1082
|
-
const key1 = queryKey()
|
|
1083
|
-
const key2 = queryKey()
|
|
1084
|
-
const results: UseQueryResult[][] = []
|
|
1085
|
-
|
|
1086
|
-
function Page() {
|
|
1087
|
-
const result = useQueries({
|
|
1088
|
-
queries: [
|
|
1089
|
-
{
|
|
1090
|
-
queryKey: key1,
|
|
1091
|
-
queryFn: async () => 1,
|
|
1092
|
-
},
|
|
1093
|
-
{
|
|
1094
|
-
queryKey: key2,
|
|
1095
|
-
queryFn: async () => 2,
|
|
1096
|
-
},
|
|
1097
|
-
],
|
|
1098
|
-
})
|
|
1099
|
-
results.push(result)
|
|
1100
|
-
return null
|
|
1101
|
-
}
|
|
1102
|
-
|
|
1103
|
-
const rendered = renderWithClient(
|
|
1104
|
-
queryClient,
|
|
1105
|
-
<ErrorBoundary fallbackRender={() => <div>error boundary</div>}>
|
|
1106
|
-
<Page />
|
|
1107
|
-
</ErrorBoundary>,
|
|
1108
|
-
{ context },
|
|
1109
|
-
)
|
|
1110
|
-
|
|
1111
|
-
await waitFor(() => rendered.getByText('error boundary'))
|
|
1112
|
-
})
|
|
1113
|
-
})
|
|
1114
|
-
|
|
1115
|
-
it("should throw error if in one of queries' queryFn throws and useErrorBoundary is in use", async () => {
|
|
778
|
+
it("should throw error if in one of queries' queryFn throws and throwErrors is in use", async () => {
|
|
779
|
+
const consoleMock = jest
|
|
780
|
+
.spyOn(console, 'error')
|
|
781
|
+
.mockImplementation(() => undefined)
|
|
1116
782
|
const key1 = queryKey()
|
|
1117
783
|
const key2 = queryKey()
|
|
1118
784
|
const key3 = queryKey()
|
|
@@ -1126,14 +792,14 @@ describe('useQueries', () => {
|
|
|
1126
792
|
queryFn: () =>
|
|
1127
793
|
Promise.reject(
|
|
1128
794
|
new Error(
|
|
1129
|
-
'this should not throw because
|
|
795
|
+
'this should not throw because throwErrors is not set',
|
|
1130
796
|
),
|
|
1131
797
|
),
|
|
1132
798
|
},
|
|
1133
799
|
{
|
|
1134
800
|
queryKey: key2,
|
|
1135
801
|
queryFn: () => Promise.reject(new Error('single query error')),
|
|
1136
|
-
|
|
802
|
+
throwErrors: true,
|
|
1137
803
|
retry: false,
|
|
1138
804
|
},
|
|
1139
805
|
{
|
|
@@ -1146,7 +812,7 @@ describe('useQueries', () => {
|
|
|
1146
812
|
Promise.reject(
|
|
1147
813
|
new Error('this should not throw because query#2 already did'),
|
|
1148
814
|
),
|
|
1149
|
-
|
|
815
|
+
throwErrors: true,
|
|
1150
816
|
retry: false,
|
|
1151
817
|
},
|
|
1152
818
|
],
|
|
@@ -1171,9 +837,13 @@ describe('useQueries', () => {
|
|
|
1171
837
|
|
|
1172
838
|
await waitFor(() => rendered.getByText('error boundary'))
|
|
1173
839
|
await waitFor(() => rendered.getByText('single query error'))
|
|
840
|
+
consoleMock.mockRestore()
|
|
1174
841
|
})
|
|
1175
842
|
|
|
1176
|
-
it("should throw error if in one of queries' queryFn throws and
|
|
843
|
+
it("should throw error if in one of queries' queryFn throws and throwErrors function resolves to true", async () => {
|
|
844
|
+
const consoleMock = jest
|
|
845
|
+
.spyOn(console, 'error')
|
|
846
|
+
.mockImplementation(() => undefined)
|
|
1177
847
|
const key1 = queryKey()
|
|
1178
848
|
const key2 = queryKey()
|
|
1179
849
|
const key3 = queryKey()
|
|
@@ -1187,10 +857,10 @@ describe('useQueries', () => {
|
|
|
1187
857
|
queryFn: () =>
|
|
1188
858
|
Promise.reject(
|
|
1189
859
|
new Error(
|
|
1190
|
-
'this should not throw because
|
|
860
|
+
'this should not throw because throwErrors function resolves to false',
|
|
1191
861
|
),
|
|
1192
862
|
),
|
|
1193
|
-
|
|
863
|
+
throwErrors: () => false,
|
|
1194
864
|
retry: false,
|
|
1195
865
|
},
|
|
1196
866
|
{
|
|
@@ -1200,7 +870,7 @@ describe('useQueries', () => {
|
|
|
1200
870
|
{
|
|
1201
871
|
queryKey: key3,
|
|
1202
872
|
queryFn: () => Promise.reject(new Error('single query error')),
|
|
1203
|
-
|
|
873
|
+
throwErrors: () => true,
|
|
1204
874
|
retry: false,
|
|
1205
875
|
},
|
|
1206
876
|
{
|
|
@@ -1209,7 +879,7 @@ describe('useQueries', () => {
|
|
|
1209
879
|
Promise.reject(
|
|
1210
880
|
new Error('this should not throw because query#3 already did'),
|
|
1211
881
|
),
|
|
1212
|
-
|
|
882
|
+
throwErrors: true,
|
|
1213
883
|
retry: false,
|
|
1214
884
|
},
|
|
1215
885
|
],
|
|
@@ -1234,5 +904,31 @@ describe('useQueries', () => {
|
|
|
1234
904
|
|
|
1235
905
|
await waitFor(() => rendered.getByText('error boundary'))
|
|
1236
906
|
await waitFor(() => rendered.getByText('single query error'))
|
|
907
|
+
consoleMock.mockRestore()
|
|
908
|
+
})
|
|
909
|
+
|
|
910
|
+
it('should use provided custom queryClient', async () => {
|
|
911
|
+
const key = queryKey()
|
|
912
|
+
const queryFn = async () => {
|
|
913
|
+
return Promise.resolve('custom client')
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
function Page() {
|
|
917
|
+
const queries = useQueries({
|
|
918
|
+
queries: [
|
|
919
|
+
{
|
|
920
|
+
queryKey: key,
|
|
921
|
+
queryFn,
|
|
922
|
+
},
|
|
923
|
+
],
|
|
924
|
+
queryClient,
|
|
925
|
+
})
|
|
926
|
+
|
|
927
|
+
return <div>data: {queries[0].data}</div>
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
const rendered = render(<Page></Page>)
|
|
931
|
+
|
|
932
|
+
await waitFor(() => rendered.getByText('data: custom client'))
|
|
1237
933
|
})
|
|
1238
934
|
})
|