@tanstack/react-query 4.0.5
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/cjs/query-core/build/esm/index.js +3110 -0
- package/build/cjs/query-core/build/esm/index.js.map +1 -0
- package/build/cjs/react-query/src/Hydrate.js +66 -0
- package/build/cjs/react-query/src/Hydrate.js.map +1 -0
- package/build/cjs/react-query/src/QueryClientProvider.js +96 -0
- package/build/cjs/react-query/src/QueryClientProvider.js.map +1 -0
- package/build/cjs/react-query/src/QueryErrorResetBoundary.js +67 -0
- package/build/cjs/react-query/src/QueryErrorResetBoundary.js.map +1 -0
- package/build/cjs/react-query/src/index.js +64 -0
- package/build/cjs/react-query/src/index.js.map +1 -0
- package/build/cjs/react-query/src/isRestoring.js +43 -0
- package/build/cjs/react-query/src/isRestoring.js.map +1 -0
- package/build/cjs/react-query/src/useBaseQuery.js +117 -0
- package/build/cjs/react-query/src/useBaseQuery.js.map +1 -0
- package/build/cjs/react-query/src/useInfiniteQuery.js +24 -0
- package/build/cjs/react-query/src/useInfiniteQuery.js.map +1 -0
- package/build/cjs/react-query/src/useIsFetching.js +50 -0
- package/build/cjs/react-query/src/useIsFetching.js.map +1 -0
- package/build/cjs/react-query/src/useIsMutating.js +50 -0
- package/build/cjs/react-query/src/useIsMutating.js.map +1 -0
- package/build/cjs/react-query/src/useMutation.js +68 -0
- package/build/cjs/react-query/src/useMutation.js.map +1 -0
- package/build/cjs/react-query/src/useQueries.js +71 -0
- package/build/cjs/react-query/src/useQueries.js.map +1 -0
- package/build/cjs/react-query/src/useQuery.js +24 -0
- package/build/cjs/react-query/src/useQuery.js.map +1 -0
- package/build/cjs/react-query/src/utils.js +25 -0
- package/build/cjs/react-query/src/utils.js.map +1 -0
- package/build/esm/index.js +3368 -0
- package/build/esm/index.js.map +1 -0
- package/build/stats-html.html +2689 -0
- package/build/stats.json +666 -0
- package/build/types/packages/query-core/src/focusManager.d.ts +16 -0
- package/build/types/packages/query-core/src/hydration.d.ts +34 -0
- package/build/types/packages/query-core/src/index.d.ts +20 -0
- package/build/types/packages/query-core/src/infiniteQueryBehavior.d.ts +15 -0
- package/build/types/packages/query-core/src/infiniteQueryObserver.d.ts +18 -0
- package/build/types/packages/query-core/src/logger.d.ts +8 -0
- package/build/types/packages/query-core/src/mutation.d.ts +70 -0
- package/build/types/packages/query-core/src/mutationCache.d.ts +52 -0
- package/build/types/packages/query-core/src/mutationObserver.d.ts +23 -0
- package/build/types/packages/query-core/src/notifyManager.d.ts +18 -0
- package/build/types/packages/query-core/src/onlineManager.d.ts +16 -0
- package/build/types/packages/query-core/src/queriesObserver.d.ts +23 -0
- package/build/types/packages/query-core/src/query.d.ts +119 -0
- package/build/types/packages/query-core/src/queryCache.d.ts +59 -0
- package/build/types/packages/query-core/src/queryClient.d.ts +65 -0
- package/build/types/packages/query-core/src/queryObserver.d.ts +61 -0
- package/build/types/packages/query-core/src/removable.d.ts +9 -0
- package/build/types/packages/query-core/src/retryer.d.ts +33 -0
- package/build/types/packages/query-core/src/subscribable.d.ts +10 -0
- package/build/types/packages/query-core/src/types.d.ts +417 -0
- package/build/types/packages/query-core/src/utils.d.ts +99 -0
- package/build/types/packages/react-query/src/Hydrate.d.ts +10 -0
- package/build/types/packages/react-query/src/QueryClientProvider.d.ts +24 -0
- package/build/types/packages/react-query/src/QueryErrorResetBoundary.d.ts +12 -0
- package/build/types/packages/react-query/src/__tests__/Hydrate.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/QueryClientProvider.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.d.ts +6 -0
- package/build/types/packages/react-query/src/__tests__/ssr-hydration.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/ssr.test.d.ts +4 -0
- package/build/types/packages/react-query/src/__tests__/suspense.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useInfiniteQuery.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useIsFetching.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useIsMutating.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useMutation.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useQueries.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useQuery.test.d.ts +1 -0
- package/build/types/packages/react-query/src/__tests__/useQuery.types.test.d.ts +2 -0
- package/build/types/packages/react-query/src/__tests__/utils.d.ts +8 -0
- package/build/types/packages/react-query/src/index.d.ts +17 -0
- package/build/types/packages/react-query/src/isRestoring.d.ts +3 -0
- package/build/types/packages/react-query/src/reactBatchedUpdates.d.ts +2 -0
- package/build/types/packages/react-query/src/reactBatchedUpdates.native.d.ts +2 -0
- package/build/types/packages/react-query/src/setBatchUpdatesFn.d.ts +1 -0
- package/build/types/packages/react-query/src/types.d.ts +35 -0
- package/build/types/packages/react-query/src/useBaseQuery.d.ts +3 -0
- package/build/types/packages/react-query/src/useInfiniteQuery.d.ts +5 -0
- package/build/types/packages/react-query/src/useIsFetching.d.ts +7 -0
- package/build/types/packages/react-query/src/useIsMutating.d.ts +7 -0
- package/build/types/packages/react-query/src/useMutation.d.ts +6 -0
- package/build/types/packages/react-query/src/useQueries.d.ts +49 -0
- package/build/types/packages/react-query/src/useQuery.d.ts +20 -0
- package/build/types/packages/react-query/src/utils.d.ts +1 -0
- package/build/types/tests/utils.d.ts +24 -0
- package/build/umd/index.development.js +3429 -0
- package/build/umd/index.development.js.map +1 -0
- package/build/umd/index.production.js +22 -0
- package/build/umd/index.production.js.map +1 -0
- package/codemods/v4/key-transformation.js +138 -0
- package/codemods/v4/replace-import-specifier.js +25 -0
- package/codemods/v4/utils/index.js +166 -0
- package/codemods/v4/utils/replacers/key-replacer.js +160 -0
- package/codemods/v4/utils/transformers/query-cache-transformer.js +115 -0
- package/codemods/v4/utils/transformers/query-client-transformer.js +49 -0
- package/codemods/v4/utils/transformers/use-query-like-transformer.js +32 -0
- package/codemods/v4/utils/unprocessable-key-error.js +8 -0
- package/package.json +63 -0
- package/src/Hydrate.tsx +36 -0
- package/src/QueryClientProvider.tsx +90 -0
- package/src/QueryErrorResetBoundary.tsx +52 -0
- package/src/__tests__/Hydrate.test.tsx +247 -0
- package/src/__tests__/QueryClientProvider.test.tsx +275 -0
- package/src/__tests__/QueryResetErrorBoundary.test.tsx +630 -0
- package/src/__tests__/ssr-hydration.test.tsx +274 -0
- package/src/__tests__/ssr.test.tsx +151 -0
- package/src/__tests__/suspense.test.tsx +1015 -0
- package/src/__tests__/useInfiniteQuery.test.tsx +1773 -0
- package/src/__tests__/useIsFetching.test.tsx +274 -0
- package/src/__tests__/useIsMutating.test.tsx +260 -0
- package/src/__tests__/useMutation.test.tsx +1099 -0
- package/src/__tests__/useQueries.test.tsx +1107 -0
- package/src/__tests__/useQuery.test.tsx +5746 -0
- package/src/__tests__/useQuery.types.test.tsx +157 -0
- package/src/__tests__/utils.tsx +45 -0
- package/src/index.ts +29 -0
- package/src/isRestoring.tsx +6 -0
- package/src/reactBatchedUpdates.native.ts +4 -0
- package/src/reactBatchedUpdates.ts +2 -0
- package/src/setBatchUpdatesFn.ts +4 -0
- package/src/types.ts +122 -0
- package/src/useBaseQuery.ts +140 -0
- package/src/useInfiniteQuery.ts +101 -0
- package/src/useIsFetching.ts +39 -0
- package/src/useIsMutating.ts +43 -0
- package/src/useMutation.ts +126 -0
- package/src/useQueries.ts +192 -0
- package/src/useQuery.ts +104 -0
- package/src/utils.ts +11 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import ReactDOM from 'react-dom'
|
|
3
|
+
import ReactDOMTestUtils from 'react-dom/test-utils'
|
|
4
|
+
import ReactDOMServer from 'react-dom/server'
|
|
5
|
+
// eslint-disable-next-line import/no-unresolved -- types only for module augmentation
|
|
6
|
+
import type {} from 'react-dom/next'
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
useQuery,
|
|
10
|
+
QueryClientProvider,
|
|
11
|
+
QueryCache,
|
|
12
|
+
dehydrate,
|
|
13
|
+
hydrate,
|
|
14
|
+
} from '..'
|
|
15
|
+
import {
|
|
16
|
+
createQueryClient,
|
|
17
|
+
mockLogger,
|
|
18
|
+
setIsServer,
|
|
19
|
+
sleep,
|
|
20
|
+
} from '../../../../tests/utils'
|
|
21
|
+
|
|
22
|
+
const isReact18 = () => (process.env.REACTJS_VERSION || '18') === '18'
|
|
23
|
+
|
|
24
|
+
const ReactHydrate = (element: React.ReactElement, container: Element) => {
|
|
25
|
+
if (isReact18()) {
|
|
26
|
+
let root: any
|
|
27
|
+
ReactDOMTestUtils.act(() => {
|
|
28
|
+
// @ts-expect-error
|
|
29
|
+
root = ReactDOM.hydrateRoot(container, element)
|
|
30
|
+
})
|
|
31
|
+
return () => {
|
|
32
|
+
root.unmount()
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ReactDOM.hydrate(element, container)
|
|
37
|
+
return () => {
|
|
38
|
+
ReactDOM.unmountComponentAtNode(container)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function fetchData<TData>(value: TData, ms?: number): Promise<TData> {
|
|
43
|
+
await sleep(ms || 1)
|
|
44
|
+
return value
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function PrintStateComponent({ componentName, result }: any): any {
|
|
48
|
+
return `${componentName} - status:${result.status} fetching:${result.isFetching} data:${result.data}`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
describe('Server side rendering with de/rehydration', () => {
|
|
52
|
+
let previousIsReactActEnvironment: unknown
|
|
53
|
+
beforeAll(() => {
|
|
54
|
+
// @ts-expect-error we expect IS_REACT_ACT_ENVIRONMENT to exist
|
|
55
|
+
previousIsReactActEnvironment = globalThis.IS_REACT_ACT_ENVIRONMENT = true
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
afterAll(() => {
|
|
59
|
+
// @ts-expect-error we expect IS_REACT_ACT_ENVIRONMENT to exist
|
|
60
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = previousIsReactActEnvironment
|
|
61
|
+
})
|
|
62
|
+
it('should not mismatch on success', async () => {
|
|
63
|
+
if (!isReact18()) {
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
const fetchDataSuccess = jest.fn<
|
|
67
|
+
ReturnType<typeof fetchData>,
|
|
68
|
+
Parameters<typeof fetchData>
|
|
69
|
+
>(fetchData)
|
|
70
|
+
|
|
71
|
+
// -- Shared part --
|
|
72
|
+
function SuccessComponent() {
|
|
73
|
+
const result = useQuery(['success'], () => fetchDataSuccess('success!'))
|
|
74
|
+
return (
|
|
75
|
+
<PrintStateComponent componentName="SuccessComponent" result={result} />
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// -- Server part --
|
|
80
|
+
setIsServer(true)
|
|
81
|
+
|
|
82
|
+
const prefetchCache = new QueryCache()
|
|
83
|
+
const prefetchClient = createQueryClient({
|
|
84
|
+
queryCache: prefetchCache,
|
|
85
|
+
})
|
|
86
|
+
await prefetchClient.prefetchQuery(['success'], () =>
|
|
87
|
+
fetchDataSuccess('success'),
|
|
88
|
+
)
|
|
89
|
+
const dehydratedStateServer = dehydrate(prefetchClient)
|
|
90
|
+
const renderCache = new QueryCache()
|
|
91
|
+
const renderClient = createQueryClient({
|
|
92
|
+
queryCache: renderCache,
|
|
93
|
+
})
|
|
94
|
+
hydrate(renderClient, dehydratedStateServer)
|
|
95
|
+
const markup = ReactDOMServer.renderToString(
|
|
96
|
+
<QueryClientProvider client={renderClient}>
|
|
97
|
+
<SuccessComponent />
|
|
98
|
+
</QueryClientProvider>,
|
|
99
|
+
)
|
|
100
|
+
const stringifiedState = JSON.stringify(dehydratedStateServer)
|
|
101
|
+
renderClient.clear()
|
|
102
|
+
setIsServer(false)
|
|
103
|
+
|
|
104
|
+
const expectedMarkup =
|
|
105
|
+
'SuccessComponent - status:success fetching:true data:success'
|
|
106
|
+
|
|
107
|
+
expect(markup).toBe(expectedMarkup)
|
|
108
|
+
expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
|
|
109
|
+
|
|
110
|
+
// -- Client part --
|
|
111
|
+
const el = document.createElement('div')
|
|
112
|
+
el.innerHTML = markup
|
|
113
|
+
|
|
114
|
+
const queryCache = new QueryCache()
|
|
115
|
+
const queryClient = createQueryClient({ queryCache })
|
|
116
|
+
hydrate(queryClient, JSON.parse(stringifiedState))
|
|
117
|
+
|
|
118
|
+
const unmount = ReactHydrate(
|
|
119
|
+
<QueryClientProvider client={queryClient}>
|
|
120
|
+
<SuccessComponent />
|
|
121
|
+
</QueryClientProvider>,
|
|
122
|
+
el,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
// Check that we have no React hydration mismatches
|
|
126
|
+
expect(mockLogger.error).not.toHaveBeenCalled()
|
|
127
|
+
expect(fetchDataSuccess).toHaveBeenCalledTimes(2)
|
|
128
|
+
expect(el.innerHTML).toBe(expectedMarkup)
|
|
129
|
+
|
|
130
|
+
unmount()
|
|
131
|
+
queryClient.clear()
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
it('should not mismatch on error', async () => {
|
|
135
|
+
if (!isReact18()) {
|
|
136
|
+
return
|
|
137
|
+
}
|
|
138
|
+
const fetchDataError = jest.fn(() => {
|
|
139
|
+
throw new Error('fetchDataError')
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
// -- Shared part --
|
|
143
|
+
function ErrorComponent() {
|
|
144
|
+
const result = useQuery(['error'], () => fetchDataError(), {
|
|
145
|
+
retry: false,
|
|
146
|
+
})
|
|
147
|
+
return (
|
|
148
|
+
<PrintStateComponent componentName="ErrorComponent" result={result} />
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// -- Server part --
|
|
153
|
+
setIsServer(true)
|
|
154
|
+
const prefetchCache = new QueryCache()
|
|
155
|
+
const prefetchClient = createQueryClient({
|
|
156
|
+
queryCache: prefetchCache,
|
|
157
|
+
})
|
|
158
|
+
await prefetchClient.prefetchQuery(['error'], () => fetchDataError())
|
|
159
|
+
const dehydratedStateServer = dehydrate(prefetchClient)
|
|
160
|
+
const renderCache = new QueryCache()
|
|
161
|
+
const renderClient = createQueryClient({
|
|
162
|
+
queryCache: renderCache,
|
|
163
|
+
})
|
|
164
|
+
hydrate(renderClient, dehydratedStateServer)
|
|
165
|
+
const markup = ReactDOMServer.renderToString(
|
|
166
|
+
<QueryClientProvider client={renderClient}>
|
|
167
|
+
<ErrorComponent />
|
|
168
|
+
</QueryClientProvider>,
|
|
169
|
+
)
|
|
170
|
+
const stringifiedState = JSON.stringify(dehydratedStateServer)
|
|
171
|
+
renderClient.clear()
|
|
172
|
+
setIsServer(false)
|
|
173
|
+
|
|
174
|
+
const expectedMarkup =
|
|
175
|
+
'ErrorComponent - status:loading fetching:true data:undefined'
|
|
176
|
+
|
|
177
|
+
expect(markup).toBe(expectedMarkup)
|
|
178
|
+
|
|
179
|
+
// -- Client part --
|
|
180
|
+
const el = document.createElement('div')
|
|
181
|
+
el.innerHTML = markup
|
|
182
|
+
|
|
183
|
+
const queryCache = new QueryCache()
|
|
184
|
+
const queryClient = createQueryClient({ queryCache })
|
|
185
|
+
hydrate(queryClient, JSON.parse(stringifiedState))
|
|
186
|
+
|
|
187
|
+
const unmount = ReactHydrate(
|
|
188
|
+
<QueryClientProvider client={queryClient}>
|
|
189
|
+
<ErrorComponent />
|
|
190
|
+
</QueryClientProvider>,
|
|
191
|
+
el,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
// We expect exactly one console.error here, which is from the
|
|
195
|
+
expect(mockLogger.error).toHaveBeenCalledTimes(1)
|
|
196
|
+
expect(fetchDataError).toHaveBeenCalledTimes(2)
|
|
197
|
+
expect(el.innerHTML).toBe(expectedMarkup)
|
|
198
|
+
await sleep(50)
|
|
199
|
+
expect(fetchDataError).toHaveBeenCalledTimes(2)
|
|
200
|
+
expect(el.innerHTML).toBe(
|
|
201
|
+
'ErrorComponent - status:error fetching:false data:undefined',
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
unmount()
|
|
205
|
+
queryClient.clear()
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
it('should not mismatch on queries that were not prefetched', async () => {
|
|
209
|
+
if (!isReact18()) {
|
|
210
|
+
return
|
|
211
|
+
}
|
|
212
|
+
const fetchDataSuccess = jest.fn<
|
|
213
|
+
ReturnType<typeof fetchData>,
|
|
214
|
+
Parameters<typeof fetchData>
|
|
215
|
+
>(fetchData)
|
|
216
|
+
|
|
217
|
+
// -- Shared part --
|
|
218
|
+
function SuccessComponent() {
|
|
219
|
+
const result = useQuery(['success'], () => fetchDataSuccess('success!'))
|
|
220
|
+
return (
|
|
221
|
+
<PrintStateComponent componentName="SuccessComponent" result={result} />
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// -- Server part --
|
|
226
|
+
setIsServer(true)
|
|
227
|
+
|
|
228
|
+
const prefetchClient = createQueryClient()
|
|
229
|
+
const dehydratedStateServer = dehydrate(prefetchClient)
|
|
230
|
+
const renderClient = createQueryClient()
|
|
231
|
+
hydrate(renderClient, dehydratedStateServer)
|
|
232
|
+
const markup = ReactDOMServer.renderToString(
|
|
233
|
+
<QueryClientProvider client={renderClient}>
|
|
234
|
+
<SuccessComponent />
|
|
235
|
+
</QueryClientProvider>,
|
|
236
|
+
)
|
|
237
|
+
const stringifiedState = JSON.stringify(dehydratedStateServer)
|
|
238
|
+
renderClient.clear()
|
|
239
|
+
setIsServer(false)
|
|
240
|
+
|
|
241
|
+
const expectedMarkup =
|
|
242
|
+
'SuccessComponent - status:loading fetching:true data:undefined'
|
|
243
|
+
|
|
244
|
+
expect(markup).toBe(expectedMarkup)
|
|
245
|
+
|
|
246
|
+
// -- Client part --
|
|
247
|
+
const el = document.createElement('div')
|
|
248
|
+
el.innerHTML = markup
|
|
249
|
+
|
|
250
|
+
const queryCache = new QueryCache()
|
|
251
|
+
const queryClient = createQueryClient({ queryCache })
|
|
252
|
+
hydrate(queryClient, JSON.parse(stringifiedState))
|
|
253
|
+
|
|
254
|
+
const unmount = ReactHydrate(
|
|
255
|
+
<QueryClientProvider client={queryClient}>
|
|
256
|
+
<SuccessComponent />
|
|
257
|
+
</QueryClientProvider>,
|
|
258
|
+
el,
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
// Check that we have no React hydration mismatches
|
|
262
|
+
expect(mockLogger.error).not.toHaveBeenCalled()
|
|
263
|
+
expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
|
|
264
|
+
expect(el.innerHTML).toBe(expectedMarkup)
|
|
265
|
+
await sleep(50)
|
|
266
|
+
expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
|
|
267
|
+
expect(el.innerHTML).toBe(
|
|
268
|
+
'SuccessComponent - status:success fetching:false data:success!',
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
unmount()
|
|
272
|
+
queryClient.clear()
|
|
273
|
+
})
|
|
274
|
+
})
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment node
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as React from 'react'
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
import { renderToString } from 'react-dom/server'
|
|
8
|
+
|
|
9
|
+
import { sleep, queryKey, createQueryClient } from '../../../../tests/utils'
|
|
10
|
+
import { useQuery, QueryClientProvider, QueryCache, useInfiniteQuery } from '..'
|
|
11
|
+
|
|
12
|
+
describe('Server Side Rendering', () => {
|
|
13
|
+
it('should not trigger fetch', () => {
|
|
14
|
+
const queryCache = new QueryCache()
|
|
15
|
+
const queryClient = createQueryClient({ queryCache })
|
|
16
|
+
const key = queryKey()
|
|
17
|
+
const queryFn = jest.fn<string, unknown[]>().mockReturnValue('data')
|
|
18
|
+
|
|
19
|
+
function Page() {
|
|
20
|
+
const query = useQuery(key, queryFn)
|
|
21
|
+
|
|
22
|
+
const content = `status ${query.status}`
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div>
|
|
26
|
+
<div>{content}</div>
|
|
27
|
+
</div>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const markup = renderToString(
|
|
32
|
+
<QueryClientProvider client={queryClient}>
|
|
33
|
+
<Page />
|
|
34
|
+
</QueryClientProvider>,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
expect(markup).toContain('status loading')
|
|
38
|
+
expect(queryFn).toHaveBeenCalledTimes(0)
|
|
39
|
+
queryCache.clear()
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('should add prefetched data to cache', async () => {
|
|
43
|
+
const queryCache = new QueryCache()
|
|
44
|
+
const queryClient = createQueryClient({ queryCache })
|
|
45
|
+
const key = queryKey()
|
|
46
|
+
const fetchFn = () => Promise.resolve('data')
|
|
47
|
+
const data = await queryClient.fetchQuery(key, fetchFn)
|
|
48
|
+
expect(data).toBe('data')
|
|
49
|
+
expect(queryCache.find(key)?.state.data).toBe('data')
|
|
50
|
+
queryCache.clear()
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('should return existing data from the cache', async () => {
|
|
54
|
+
const queryCache = new QueryCache()
|
|
55
|
+
const queryClient = createQueryClient({ queryCache })
|
|
56
|
+
const key = queryKey()
|
|
57
|
+
const queryFn = jest.fn(() => {
|
|
58
|
+
sleep(10)
|
|
59
|
+
return 'data'
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
function Page() {
|
|
63
|
+
const query = useQuery(key, queryFn)
|
|
64
|
+
|
|
65
|
+
const content = `status ${query.status}`
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div>
|
|
69
|
+
<div>{content}</div>
|
|
70
|
+
</div>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
await queryClient.prefetchQuery(key, queryFn)
|
|
75
|
+
|
|
76
|
+
const markup = renderToString(
|
|
77
|
+
<QueryClientProvider client={queryClient}>
|
|
78
|
+
<Page />
|
|
79
|
+
</QueryClientProvider>,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
expect(markup).toContain('status success')
|
|
83
|
+
expect(queryFn).toHaveBeenCalledTimes(1)
|
|
84
|
+
queryCache.clear()
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('should add initialData to the cache', () => {
|
|
88
|
+
const key = queryKey()
|
|
89
|
+
|
|
90
|
+
const queryCache = new QueryCache()
|
|
91
|
+
const queryClient = createQueryClient({ queryCache })
|
|
92
|
+
|
|
93
|
+
function Page() {
|
|
94
|
+
const [page, setPage] = React.useState(1)
|
|
95
|
+
const { data } = useQuery([key, page], async () => page, {
|
|
96
|
+
initialData: 1,
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<div>
|
|
101
|
+
<h1 data-testid="title">{data}</h1>
|
|
102
|
+
<button onClick={() => setPage(page + 1)}>next</button>
|
|
103
|
+
</div>
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
renderToString(
|
|
108
|
+
<QueryClientProvider client={queryClient}>
|
|
109
|
+
<Page />
|
|
110
|
+
</QueryClientProvider>,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
const keys = queryCache.getAll().map((query) => query.queryKey)
|
|
114
|
+
|
|
115
|
+
expect(keys).toEqual([[key, 1]])
|
|
116
|
+
queryCache.clear()
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('useInfiniteQuery should return the correct state', async () => {
|
|
120
|
+
const queryCache = new QueryCache()
|
|
121
|
+
const queryClient = createQueryClient({ queryCache })
|
|
122
|
+
const key = queryKey()
|
|
123
|
+
const queryFn = jest.fn(async () => {
|
|
124
|
+
await sleep(5)
|
|
125
|
+
return 'page 1'
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
function Page() {
|
|
129
|
+
const query = useInfiniteQuery(key, queryFn)
|
|
130
|
+
return (
|
|
131
|
+
<ul>
|
|
132
|
+
{query.data?.pages.map((page) => (
|
|
133
|
+
<li key={page}>{page}</li>
|
|
134
|
+
))}
|
|
135
|
+
</ul>
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
await queryClient.prefetchInfiniteQuery(key, queryFn)
|
|
140
|
+
|
|
141
|
+
const markup = renderToString(
|
|
142
|
+
<QueryClientProvider client={queryClient}>
|
|
143
|
+
<Page />
|
|
144
|
+
</QueryClientProvider>,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
expect(markup).toContain('page 1')
|
|
148
|
+
expect(queryFn).toHaveBeenCalledTimes(1)
|
|
149
|
+
queryCache.clear()
|
|
150
|
+
})
|
|
151
|
+
})
|