@tanstack/query-core 4.24.10 → 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 (183) hide show
  1. package/build/lib/focusManager.d.ts +1 -3
  2. package/build/lib/focusManager.esm.js +19 -36
  3. package/build/lib/focusManager.esm.js.map +1 -1
  4. package/build/lib/focusManager.js +19 -38
  5. package/build/lib/focusManager.js.map +1 -1
  6. package/build/lib/focusManager.mjs +19 -36
  7. package/build/lib/focusManager.mjs.map +1 -1
  8. package/build/lib/hydration.esm.js +21 -23
  9. package/build/lib/hydration.esm.js.map +1 -1
  10. package/build/lib/hydration.js +21 -25
  11. package/build/lib/hydration.js.map +1 -1
  12. package/build/lib/hydration.mjs +21 -23
  13. package/build/lib/hydration.mjs.map +1 -1
  14. package/build/lib/index.d.ts +1 -2
  15. package/build/lib/index.esm.js +1 -1
  16. package/build/lib/index.js +2 -8
  17. package/build/lib/index.js.map +1 -1
  18. package/build/lib/index.mjs +1 -1
  19. package/build/lib/infiniteQueryBehavior.d.ts +3 -7
  20. package/build/lib/infiniteQueryBehavior.esm.js +52 -75
  21. package/build/lib/infiniteQueryBehavior.esm.js.map +1 -1
  22. package/build/lib/infiniteQueryBehavior.js +50 -77
  23. package/build/lib/infiniteQueryBehavior.js.map +1 -1
  24. package/build/lib/infiniteQueryBehavior.mjs +52 -75
  25. package/build/lib/infiniteQueryBehavior.mjs.map +1 -1
  26. package/build/lib/infiniteQueryObserver.d.ts +4 -4
  27. package/build/lib/infiniteQueryObserver.esm.js +18 -26
  28. package/build/lib/infiniteQueryObserver.esm.js.map +1 -1
  29. package/build/lib/infiniteQueryObserver.js +18 -28
  30. package/build/lib/infiniteQueryObserver.js.map +1 -1
  31. package/build/lib/infiniteQueryObserver.mjs +18 -26
  32. package/build/lib/infiniteQueryObserver.mjs.map +1 -1
  33. package/build/lib/mutation.d.ts +11 -22
  34. package/build/lib/mutation.esm.js +73 -105
  35. package/build/lib/mutation.esm.js.map +1 -1
  36. package/build/lib/mutation.js +73 -107
  37. package/build/lib/mutation.js.map +1 -1
  38. package/build/lib/mutation.mjs +73 -105
  39. package/build/lib/mutation.mjs.map +1 -1
  40. package/build/lib/mutationCache.d.ts +4 -6
  41. package/build/lib/mutationCache.esm.js +23 -32
  42. package/build/lib/mutationCache.esm.js.map +1 -1
  43. package/build/lib/mutationCache.js +23 -34
  44. package/build/lib/mutationCache.js.map +1 -1
  45. package/build/lib/mutationCache.mjs +23 -32
  46. package/build/lib/mutationCache.mjs.map +1 -1
  47. package/build/lib/mutationObserver.d.ts +4 -9
  48. package/build/lib/mutationObserver.esm.js +43 -72
  49. package/build/lib/mutationObserver.esm.js.map +1 -1
  50. package/build/lib/mutationObserver.js +43 -74
  51. package/build/lib/mutationObserver.js.map +1 -1
  52. package/build/lib/mutationObserver.mjs +43 -72
  53. package/build/lib/mutationObserver.mjs.map +1 -1
  54. package/build/lib/notifyManager.esm.js +7 -17
  55. package/build/lib/notifyManager.esm.js.map +1 -1
  56. package/build/lib/notifyManager.js +7 -19
  57. package/build/lib/notifyManager.js.map +1 -1
  58. package/build/lib/notifyManager.mjs +7 -17
  59. package/build/lib/notifyManager.mjs.map +1 -1
  60. package/build/lib/onlineManager.d.ts +1 -3
  61. package/build/lib/onlineManager.esm.js +16 -30
  62. package/build/lib/onlineManager.esm.js.map +1 -1
  63. package/build/lib/onlineManager.js +16 -32
  64. package/build/lib/onlineManager.js.map +1 -1
  65. package/build/lib/onlineManager.mjs +16 -30
  66. package/build/lib/onlineManager.mjs.map +1 -1
  67. package/build/lib/queriesObserver.d.ts +3 -10
  68. package/build/lib/queriesObserver.esm.js +47 -71
  69. package/build/lib/queriesObserver.esm.js.map +1 -1
  70. package/build/lib/queriesObserver.js +49 -75
  71. package/build/lib/queriesObserver.js.map +1 -1
  72. package/build/lib/queriesObserver.mjs +47 -71
  73. package/build/lib/queriesObserver.mjs.map +1 -1
  74. package/build/lib/query.d.ts +14 -21
  75. package/build/lib/query.esm.js +140 -194
  76. package/build/lib/query.esm.js.map +1 -1
  77. package/build/lib/query.js +139 -195
  78. package/build/lib/query.js.map +1 -1
  79. package/build/lib/query.mjs +140 -194
  80. package/build/lib/query.mjs.map +1 -1
  81. package/build/lib/queryCache.d.ts +12 -7
  82. package/build/lib/queryCache.esm.js +21 -45
  83. package/build/lib/queryCache.esm.js.map +1 -1
  84. package/build/lib/queryCache.js +20 -46
  85. package/build/lib/queryCache.js.map +1 -1
  86. package/build/lib/queryCache.mjs +21 -45
  87. package/build/lib/queryCache.mjs.map +1 -1
  88. package/build/lib/queryClient.d.ts +18 -46
  89. package/build/lib/queryClient.esm.js +137 -216
  90. package/build/lib/queryClient.esm.js.map +1 -1
  91. package/build/lib/queryClient.js +136 -217
  92. package/build/lib/queryClient.js.map +1 -1
  93. package/build/lib/queryClient.mjs +137 -216
  94. package/build/lib/queryClient.mjs.map +1 -1
  95. package/build/lib/queryObserver.d.ts +4 -29
  96. package/build/lib/queryObserver.esm.js +176 -258
  97. package/build/lib/queryObserver.esm.js.map +1 -1
  98. package/build/lib/queryObserver.js +176 -260
  99. package/build/lib/queryObserver.js.map +1 -1
  100. package/build/lib/queryObserver.mjs +176 -258
  101. package/build/lib/queryObserver.mjs.map +1 -1
  102. package/build/lib/removable.d.ts +3 -3
  103. package/build/lib/removable.esm.js +10 -14
  104. package/build/lib/removable.esm.js.map +1 -1
  105. package/build/lib/removable.js +10 -16
  106. package/build/lib/removable.js.map +1 -1
  107. package/build/lib/removable.mjs +10 -14
  108. package/build/lib/removable.mjs.map +1 -1
  109. package/build/lib/retryer.d.ts +5 -5
  110. package/build/lib/retryer.esm.js +27 -44
  111. package/build/lib/retryer.esm.js.map +1 -1
  112. package/build/lib/retryer.js +27 -46
  113. package/build/lib/retryer.js.map +1 -1
  114. package/build/lib/retryer.mjs +27 -44
  115. package/build/lib/retryer.mjs.map +1 -1
  116. package/build/lib/subscribable.esm.js +4 -7
  117. package/build/lib/subscribable.esm.js.map +1 -1
  118. package/build/lib/subscribable.js +4 -9
  119. package/build/lib/subscribable.js.map +1 -1
  120. package/build/lib/subscribable.mjs +4 -7
  121. package/build/lib/subscribable.mjs.map +1 -1
  122. package/build/lib/tests/utils.d.ts +3 -12
  123. package/build/lib/types.d.ts +111 -99
  124. package/build/lib/utils.d.ts +8 -18
  125. package/build/lib/utils.esm.js +39 -132
  126. package/build/lib/utils.esm.js.map +1 -1
  127. package/build/lib/utils.js +42 -144
  128. package/build/lib/utils.js.map +1 -1
  129. package/build/lib/utils.mjs +39 -132
  130. package/build/lib/utils.mjs.map +1 -1
  131. package/build/umd/index.development.js +868 -1398
  132. package/build/umd/index.development.js.map +1 -1
  133. package/build/umd/index.production.js +1 -1
  134. package/build/umd/index.production.js.map +1 -1
  135. package/package.json +1 -1
  136. package/src/focusManager.ts +17 -24
  137. package/src/index.ts +1 -11
  138. package/src/infiniteQueryBehavior.ts +54 -94
  139. package/src/infiniteQueryObserver.ts +10 -12
  140. package/src/mutation.ts +68 -92
  141. package/src/mutationCache.ts +27 -27
  142. package/src/mutationObserver.ts +60 -97
  143. package/src/onlineManager.ts +14 -14
  144. package/src/queriesObserver.ts +50 -54
  145. package/src/query.ts +106 -110
  146. package/src/queryCache.ts +42 -41
  147. package/src/queryClient.ts +155 -434
  148. package/src/queryObserver.ts +155 -192
  149. package/src/removable.ts +13 -13
  150. package/src/retryer.ts +5 -5
  151. package/src/tests/focusManager.test.tsx +25 -25
  152. package/src/tests/hydration.test.tsx +167 -81
  153. package/src/tests/infiniteQueryBehavior.test.tsx +209 -17
  154. package/src/tests/infiniteQueryObserver.test.tsx +6 -2
  155. package/src/tests/mutationCache.test.tsx +127 -127
  156. package/src/tests/mutationObserver.test.tsx +1 -31
  157. package/src/tests/mutations.test.tsx +62 -43
  158. package/src/tests/onlineManager.test.tsx +12 -4
  159. package/src/tests/queriesObserver.test.tsx +41 -77
  160. package/src/tests/query.test.tsx +175 -243
  161. package/src/tests/queryCache.test.tsx +170 -93
  162. package/src/tests/queryClient.test.tsx +229 -378
  163. package/src/tests/queryObserver.test.tsx +23 -147
  164. package/src/tests/utils.test.tsx +84 -29
  165. package/src/tests/utils.ts +9 -18
  166. package/src/types.ts +187 -140
  167. package/src/utils.ts +31 -124
  168. package/build/lib/logger.d.ts +0 -8
  169. package/build/lib/logger.esm.js +0 -4
  170. package/build/lib/logger.esm.js.map +0 -1
  171. package/build/lib/logger.js +0 -8
  172. package/build/lib/logger.js.map +0 -1
  173. package/build/lib/logger.mjs +0 -4
  174. package/build/lib/logger.mjs.map +0 -1
  175. package/build/lib/logger.native.d.ts +0 -6
  176. package/build/lib/logger.native.esm.js +0 -12
  177. package/build/lib/logger.native.esm.js.map +0 -1
  178. package/build/lib/logger.native.js +0 -16
  179. package/build/lib/logger.native.js.map +0 -1
  180. package/build/lib/logger.native.mjs +0 -12
  181. package/build/lib/logger.native.mjs.map +0 -1
  182. package/src/logger.native.ts +0 -11
  183. package/src/logger.ts +0 -9
@@ -2,7 +2,6 @@ import {
2
2
  sleep,
3
3
  queryKey,
4
4
  mockVisibilityState,
5
- mockLogger,
6
5
  createQueryClient,
7
6
  } from './utils'
8
7
  import type {
@@ -11,7 +10,7 @@ import type {
11
10
  QueryFunctionContext,
12
11
  QueryObserverResult,
13
12
  } from '..'
14
- import { QueryObserver, isCancelledError, isError, onlineManager } from '..'
13
+ import { QueryObserver, isCancelledError, onlineManager } from '..'
15
14
  import { waitFor } from '@testing-library/react'
16
15
 
17
16
  describe('query', () => {
@@ -28,19 +27,25 @@ describe('query', () => {
28
27
  queryClient.clear()
29
28
  })
30
29
 
31
- test('should use the longest cache time it has seen', async () => {
30
+ test('should use the longest garbage collection time it has seen', async () => {
32
31
  const key = queryKey()
33
- await queryClient.prefetchQuery(key, () => 'data', {
34
- cacheTime: 100,
32
+ await queryClient.prefetchQuery({
33
+ queryKey: key,
34
+ queryFn: () => 'data',
35
+ gcTime: 100,
35
36
  })
36
- await queryClient.prefetchQuery(key, () => 'data', {
37
- cacheTime: 200,
37
+ await queryClient.prefetchQuery({
38
+ queryKey: key,
39
+ queryFn: () => 'data',
40
+ gcTime: 200,
38
41
  })
39
- await queryClient.prefetchQuery(key, () => 'data', {
40
- cacheTime: 10,
42
+ await queryClient.prefetchQuery({
43
+ queryKey: key,
44
+ queryFn: () => 'data',
45
+ gcTime: 10,
41
46
  })
42
- const query = queryCache.find(key)!
43
- expect(query.cacheTime).toBe(200)
47
+ const query = queryCache.find({ queryKey: key })!
48
+ expect(query.gcTime).toBe(200)
44
49
  })
45
50
 
46
51
  it('should continue retry after focus regain and resolve all promises', async () => {
@@ -52,9 +57,9 @@ describe('query', () => {
52
57
  let count = 0
53
58
  let result
54
59
 
55
- const promise = queryClient.fetchQuery(
56
- key,
57
- async () => {
60
+ const promise = queryClient.fetchQuery({
61
+ queryKey: key,
62
+ queryFn: async () => {
58
63
  count++
59
64
 
60
65
  if (count === 3) {
@@ -63,11 +68,9 @@ describe('query', () => {
63
68
 
64
69
  throw new Error(`error${count}`)
65
70
  },
66
- {
67
- retry: 3,
68
- retryDelay: 1,
69
- },
70
- )
71
+ retry: 3,
72
+ retryDelay: 1,
73
+ })
71
74
 
72
75
  promise.then((data) => {
73
76
  result = data
@@ -82,7 +85,7 @@ describe('query', () => {
82
85
 
83
86
  // Reset visibilityState to original value
84
87
  visibilityMock.mockRestore()
85
- window.dispatchEvent(new FocusEvent('focus'))
88
+ window.dispatchEvent(new Event('visibilitychange'))
86
89
 
87
90
  // There should not be a result yet
88
91
  expect(result).toBeUndefined()
@@ -100,9 +103,9 @@ describe('query', () => {
100
103
  let count = 0
101
104
  let result
102
105
 
103
- const promise = queryClient.fetchQuery(
104
- key,
105
- async () => {
106
+ const promise = queryClient.fetchQuery({
107
+ queryKey: key,
108
+ queryFn: async () => {
106
109
  count++
107
110
 
108
111
  if (count === 3) {
@@ -111,11 +114,9 @@ describe('query', () => {
111
114
 
112
115
  throw new Error(`error${count}`)
113
116
  },
114
- {
115
- retry: 3,
116
- retryDelay: 1,
117
- },
118
- )
117
+ retry: 3,
118
+ retryDelay: 1,
119
+ })
119
120
 
120
121
  promise.then((data) => {
121
122
  result = data
@@ -148,23 +149,21 @@ describe('query', () => {
148
149
  let count = 0
149
150
  let result
150
151
 
151
- const promise = queryClient.fetchQuery(
152
- key,
153
- async (): Promise<unknown> => {
152
+ const promise = queryClient.fetchQuery({
153
+ queryKey: key,
154
+ queryFn: async (): Promise<unknown> => {
154
155
  count++
155
156
  throw new Error(`error${count}`)
156
157
  },
157
- {
158
- retry: 3,
159
- retryDelay: 1,
160
- },
161
- )
158
+ retry: 3,
159
+ retryDelay: 1,
160
+ })
162
161
 
163
162
  promise.catch((data) => {
164
163
  result = data
165
164
  })
166
165
 
167
- const query = queryCache.find(key)!
166
+ const query = queryCache.find({ queryKey: key })!
168
167
 
169
168
  // Check if the query is really paused
170
169
  await sleep(50)
@@ -181,7 +180,6 @@ describe('query', () => {
181
180
  } finally {
182
181
  // Reset visibilityState to original value
183
182
  visibilityMock.mockRestore()
184
- window.dispatchEvent(new FocusEvent('focus'))
185
183
  }
186
184
  })
187
185
 
@@ -195,13 +193,14 @@ describe('query', () => {
195
193
  >()
196
194
  .mockResolvedValue('data')
197
195
 
198
- queryClient.prefetchQuery(key, queryFn)
196
+ queryClient.prefetchQuery({ queryKey: key, queryFn })
199
197
 
200
198
  await sleep(10)
201
199
 
202
200
  expect(queryFn).toHaveBeenCalledTimes(1)
203
201
  const args = queryFn.mock.calls[0]![0]
204
202
  expect(args).toBeDefined()
203
+ // @ts-expect-error page param should be undefined
205
204
  expect(args.pageParam).toBeUndefined()
206
205
  expect(args.queryKey).toEqual(key)
207
206
  expect(args.signal).toBeInstanceOf(AbortSignal)
@@ -210,9 +209,12 @@ describe('query', () => {
210
209
  test('should continue if cancellation is not supported and signal is not consumed', async () => {
211
210
  const key = queryKey()
212
211
 
213
- queryClient.prefetchQuery(key, async () => {
214
- await sleep(100)
215
- return 'data'
212
+ queryClient.prefetchQuery({
213
+ queryKey: key,
214
+ queryFn: async () => {
215
+ await sleep(100)
216
+ return 'data'
217
+ },
216
218
  })
217
219
 
218
220
  await sleep(10)
@@ -227,7 +229,7 @@ describe('query', () => {
227
229
 
228
230
  await sleep(100)
229
231
 
230
- const query = queryCache.find(key)!
232
+ const query = queryCache.find({ queryKey: key })!
231
233
 
232
234
  expect(query.state).toMatchObject({
233
235
  data: 'data',
@@ -239,9 +241,12 @@ describe('query', () => {
239
241
  test('should not continue when last observer unsubscribed if the signal was consumed', async () => {
240
242
  const key = queryKey()
241
243
 
242
- queryClient.prefetchQuery(key, async ({ signal }) => {
243
- await sleep(100)
244
- return signal?.aborted ? 'aborted' : 'data'
244
+ queryClient.prefetchQuery({
245
+ queryKey: key,
246
+ queryFn: async ({ signal }) => {
247
+ await sleep(100)
248
+ return signal.aborted ? 'aborted' : 'data'
249
+ },
245
250
  })
246
251
 
247
252
  await sleep(10)
@@ -256,11 +261,11 @@ describe('query', () => {
256
261
 
257
262
  await sleep(100)
258
263
 
259
- const query = queryCache.find(key)!
264
+ const query = queryCache.find({ queryKey: key })!
260
265
 
261
266
  expect(query.state).toMatchObject({
262
267
  data: undefined,
263
- status: 'loading',
268
+ status: 'pending',
264
269
  fetchStatus: 'idle',
265
270
  })
266
271
  })
@@ -277,19 +282,17 @@ describe('query', () => {
277
282
  let error
278
283
 
279
284
  queryFn.mockImplementation(async ({ signal }) => {
280
- if (signal) {
281
- signal.onabort = onAbort
282
- signal.addEventListener('abort', abortListener)
283
- }
285
+ signal.onabort = onAbort
286
+ signal.addEventListener('abort', abortListener)
284
287
  await sleep(10)
285
- if (signal) {
286
- signal.onabort = null
287
- signal.removeEventListener('abort', abortListener)
288
- }
288
+ signal.onabort = null
289
+ signal.removeEventListener('abort', abortListener)
289
290
  throw new Error()
290
291
  })
291
292
 
292
- const promise = queryClient.fetchQuery(key, queryFn, {
293
+ const promise = queryClient.fetchQuery({
294
+ queryKey: key,
295
+ queryFn,
293
296
  retry: 3,
294
297
  retryDelay: 10,
295
298
  })
@@ -298,12 +301,12 @@ describe('query', () => {
298
301
  error = e
299
302
  })
300
303
 
301
- const query = queryCache.find(key)!
304
+ const query = queryCache.find({ queryKey: key })!
302
305
 
303
306
  expect(queryFn).toHaveBeenCalledTimes(1)
304
307
 
305
308
  const signal = queryFn.mock.calls[0]![0].signal
306
- expect(signal?.aborted).toBe(false)
309
+ expect(signal.aborted).toBe(false)
307
310
  expect(onAbort).not.toHaveBeenCalled()
308
311
  expect(abortListener).not.toHaveBeenCalled()
309
312
 
@@ -311,7 +314,7 @@ describe('query', () => {
311
314
 
312
315
  await sleep(100)
313
316
 
314
- expect(signal?.aborted).toBe(true)
317
+ expect(signal.aborted).toBe(true)
315
318
  expect(onAbort).toHaveBeenCalledTimes(1)
316
319
  expect(abortListener).toHaveBeenCalledTimes(1)
317
320
  expect(isCancelledError(error)).toBe(true)
@@ -329,7 +332,9 @@ describe('query', () => {
329
332
 
330
333
  let error
331
334
 
332
- const promise = queryClient.fetchQuery(key, queryFn, {
335
+ const promise = queryClient.fetchQuery({
336
+ queryKey: key,
337
+ queryFn,
333
338
  retry: 3,
334
339
  retryDelay: 10,
335
340
  })
@@ -338,7 +343,7 @@ describe('query', () => {
338
343
  error = e
339
344
  })
340
345
 
341
- const query = queryCache.find(key)!
346
+ const query = queryCache.find({ queryKey: key })!
342
347
  query.cancel()
343
348
 
344
349
  await sleep(100)
@@ -347,7 +352,7 @@ describe('query', () => {
347
352
  expect(isCancelledError(error)).toBe(true)
348
353
  })
349
354
 
350
- test('should not error if reset while loading', async () => {
355
+ test('should not error if reset while pending', async () => {
351
356
  const key = queryKey()
352
357
 
353
358
  const queryFn = jest.fn<unknown, unknown[]>()
@@ -357,16 +362,13 @@ describe('query', () => {
357
362
  throw new Error()
358
363
  })
359
364
 
360
- queryClient.fetchQuery(key, queryFn, {
361
- retry: 3,
362
- retryDelay: 10,
363
- })
365
+ queryClient.fetchQuery({ queryKey: key, queryFn, retry: 3, retryDelay: 10 })
364
366
 
365
- // Ensure the query is loading
366
- const query = queryCache.find(key)!
367
- expect(query.state.status).toBe('loading')
367
+ // Ensure the query is pending
368
+ const query = queryCache.find({ queryKey: key })!
369
+ expect(query.state.status).toBe('pending')
368
370
 
369
- // Reset the query while it is loading
371
+ // Reset the query while it is pending
370
372
  query.reset()
371
373
 
372
374
  await sleep(100)
@@ -387,8 +389,8 @@ describe('query', () => {
387
389
  return 'data'
388
390
  })
389
391
 
390
- queryClient.prefetchQuery(key, queryFn)
391
- const query = queryCache.find(key)!
392
+ queryClient.prefetchQuery({ queryKey: key, queryFn })
393
+ const query = queryCache.find({ queryKey: key })!
392
394
  await sleep(10)
393
395
  query.cancel()
394
396
  await sleep(100)
@@ -403,8 +405,11 @@ describe('query', () => {
403
405
 
404
406
  test('cancelling a resolved query should not have any effect', async () => {
405
407
  const key = queryKey()
406
- await queryClient.prefetchQuery(key, async () => 'data')
407
- const query = queryCache.find(key)!
408
+ await queryClient.prefetchQuery({
409
+ queryKey: key,
410
+ queryFn: async () => 'data',
411
+ })
412
+ const query = queryCache.find({ queryKey: key })!
408
413
  query.cancel()
409
414
  await sleep(10)
410
415
  expect(query.state.data).toBe('data')
@@ -412,49 +417,51 @@ describe('query', () => {
412
417
 
413
418
  test('cancelling a rejected query should not have any effect', async () => {
414
419
  const key = queryKey()
420
+ const error = new Error('error')
415
421
 
416
- await queryClient.prefetchQuery(key, async (): Promise<unknown> => {
417
- throw new Error('error')
422
+ await queryClient.prefetchQuery({
423
+ queryKey: key,
424
+ queryFn: async (): Promise<unknown> => {
425
+ throw error
426
+ },
418
427
  })
419
- const query = queryCache.find(key)!
428
+ const query = queryCache.find({ queryKey: key })!
420
429
  query.cancel()
421
430
  await sleep(10)
422
431
 
423
- expect(isError(query.state.error)).toBe(true)
432
+ expect(query.state.error).toBe(error)
424
433
  expect(isCancelledError(query.state.error)).toBe(false)
425
434
  })
426
435
 
427
436
  test('the previous query status should be kept when refetching', async () => {
428
437
  const key = queryKey()
429
438
 
430
- await queryClient.prefetchQuery(key, () => 'data')
431
- const query = queryCache.find(key)!
439
+ await queryClient.prefetchQuery({ queryKey: key, queryFn: () => 'data' })
440
+ const query = queryCache.find({ queryKey: key })!
432
441
  expect(query.state.status).toBe('success')
433
442
 
434
- await queryClient.prefetchQuery(
435
- key,
436
- () => Promise.reject<string>('reject'),
437
- {
438
- retry: false,
439
- },
440
- )
443
+ await queryClient.prefetchQuery({
444
+ queryKey: key,
445
+ queryFn: () => Promise.reject<string>('reject'),
446
+ retry: false,
447
+ })
441
448
  expect(query.state.status).toBe('error')
442
449
 
443
- queryClient.prefetchQuery(
444
- key,
445
- async () => {
450
+ queryClient.prefetchQuery({
451
+ queryKey: key,
452
+ queryFn: async () => {
446
453
  await sleep(10)
447
454
  return Promise.reject<unknown>('reject')
448
455
  },
449
- { retry: false },
450
- )
456
+ retry: false,
457
+ })
451
458
  expect(query.state.status).toBe('error')
452
459
 
453
460
  await sleep(100)
454
461
  expect(query.state.status).toBe('error')
455
462
  })
456
463
 
457
- test('queries with cacheTime 0 should be removed immediately after unsubscribing', async () => {
464
+ test('queries with gcTime 0 should be removed immediately after unsubscribing', async () => {
458
465
  const key = queryKey()
459
466
  let count = 0
460
467
  const observer = new QueryObserver(queryClient, {
@@ -463,16 +470,20 @@ describe('query', () => {
463
470
  count++
464
471
  return 'data'
465
472
  },
466
- cacheTime: 0,
473
+ gcTime: 0,
467
474
  staleTime: Infinity,
468
475
  })
469
476
  const unsubscribe1 = observer.subscribe(() => undefined)
470
477
  unsubscribe1()
471
- await waitFor(() => expect(queryCache.find(key)).toBeUndefined())
478
+ await waitFor(() =>
479
+ expect(queryCache.find({ queryKey: key })).toBeUndefined(),
480
+ )
472
481
  const unsubscribe2 = observer.subscribe(() => undefined)
473
482
  unsubscribe2()
474
483
 
475
- await waitFor(() => expect(queryCache.find(key)).toBeUndefined())
484
+ await waitFor(() =>
485
+ expect(queryCache.find({ queryKey: key })).toBeUndefined(),
486
+ )
476
487
  expect(count).toBe(1)
477
488
  })
478
489
 
@@ -481,13 +492,15 @@ describe('query', () => {
481
492
  const observer = new QueryObserver(queryClient, {
482
493
  queryKey: key,
483
494
  queryFn: async () => 'data',
484
- cacheTime: 0,
495
+ gcTime: 0,
485
496
  })
486
- expect(queryCache.find(key)).toBeDefined()
497
+ expect(queryCache.find({ queryKey: key })).toBeDefined()
487
498
  const unsubscribe = observer.subscribe(() => undefined)
488
- expect(queryCache.find(key)).toBeDefined()
499
+ expect(queryCache.find({ queryKey: key })).toBeDefined()
489
500
  unsubscribe()
490
- await waitFor(() => expect(queryCache.find(key)).toBeUndefined())
501
+ await waitFor(() =>
502
+ expect(queryCache.find({ queryKey: key })).toBeUndefined(),
503
+ )
491
504
  })
492
505
 
493
506
  test('should be garbage collected later when unsubscribed and query is fetching', async () => {
@@ -498,19 +511,21 @@ describe('query', () => {
498
511
  await sleep(20)
499
512
  return 'data'
500
513
  },
501
- cacheTime: 10,
514
+ gcTime: 10,
502
515
  })
503
516
  const unsubscribe = observer.subscribe(() => undefined)
504
517
  await sleep(20)
505
- expect(queryCache.find(key)).toBeDefined()
518
+ expect(queryCache.find({ queryKey: key })).toBeDefined()
506
519
  observer.refetch()
507
520
  unsubscribe()
508
521
  await sleep(10)
509
- // unsubscribe should not remove even though cacheTime has elapsed b/c query is still fetching
510
- expect(queryCache.find(key)).toBeDefined()
522
+ // unsubscribe should not remove even though gcTime has elapsed b/c query is still fetching
523
+ expect(queryCache.find({ queryKey: key })).toBeDefined()
511
524
  await sleep(10)
512
525
  // should be removed after an additional staleTime wait
513
- await waitFor(() => expect(queryCache.find(key)).toBeUndefined())
526
+ await waitFor(() =>
527
+ expect(queryCache.find({ queryKey: key })).toBeUndefined(),
528
+ )
514
529
  })
515
530
 
516
531
  test('should not be garbage collected unless there are no subscribers', async () => {
@@ -518,18 +533,18 @@ describe('query', () => {
518
533
  const observer = new QueryObserver(queryClient, {
519
534
  queryKey: key,
520
535
  queryFn: async () => 'data',
521
- cacheTime: 0,
536
+ gcTime: 0,
522
537
  })
523
- expect(queryCache.find(key)).toBeDefined()
538
+ expect(queryCache.find({ queryKey: key })).toBeDefined()
524
539
  const unsubscribe = observer.subscribe(() => undefined)
525
540
  await sleep(100)
526
- expect(queryCache.find(key)).toBeDefined()
541
+ expect(queryCache.find({ queryKey: key })).toBeDefined()
527
542
  unsubscribe()
528
543
  await sleep(100)
529
- expect(queryCache.find(key)).toBeUndefined()
544
+ expect(queryCache.find({ queryKey: key })).toBeUndefined()
530
545
  queryClient.setQueryData(key, 'data')
531
546
  await sleep(100)
532
- expect(queryCache.find(key)).toBeDefined()
547
+ expect(queryCache.find({ queryKey: key })).toBeDefined()
533
548
  })
534
549
 
535
550
  test('should return proper count of observers', async () => {
@@ -538,7 +553,7 @@ describe('query', () => {
538
553
  const observer = new QueryObserver(queryClient, options)
539
554
  const observer2 = new QueryObserver(queryClient, options)
540
555
  const observer3 = new QueryObserver(queryClient, options)
541
- const query = queryCache.find(key)
556
+ const query = queryCache.find({ queryKey: key })
542
557
 
543
558
  expect(query?.getObserversCount()).toEqual(0)
544
559
 
@@ -564,11 +579,13 @@ describe('query', () => {
564
579
 
565
580
  const key = queryKey()
566
581
 
567
- await queryClient.prefetchQuery(key, () => 'data', {
582
+ await queryClient.prefetchQuery({
583
+ queryKey: key,
584
+ queryFn: () => 'data',
568
585
  meta,
569
586
  })
570
587
 
571
- const query = queryCache.find(key)!
588
+ const query = queryCache.find({ queryKey: key })!
572
589
 
573
590
  expect(query.meta).toBe(meta)
574
591
  expect(query.options.meta).toBe(meta)
@@ -582,15 +599,11 @@ describe('query', () => {
582
599
  const key = queryKey()
583
600
  const queryFn = () => 'data'
584
601
 
585
- await queryClient.prefetchQuery(key, queryFn, {
586
- meta,
587
- })
602
+ await queryClient.prefetchQuery({ queryKey: key, queryFn, meta })
588
603
 
589
- await queryClient.prefetchQuery(key, queryFn, {
590
- meta: undefined,
591
- })
604
+ await queryClient.prefetchQuery({ queryKey: key, queryFn, meta: undefined })
592
605
 
593
- const query = queryCache.find(key)!
606
+ const query = queryCache.find({ queryKey: key })!
594
607
 
595
608
  expect(query.meta).toBeUndefined()
596
609
  expect(query.options.meta).toBeUndefined()
@@ -606,9 +619,9 @@ describe('query', () => {
606
619
 
607
620
  queryClient.setQueryDefaults(key, { meta })
608
621
 
609
- await queryClient.prefetchQuery(key, queryFn)
622
+ await queryClient.prefetchQuery({ queryKey: key, queryFn })
610
623
 
611
- const query = queryCache.find(key)!
624
+ const query = queryCache.find({ queryKey: key })!
612
625
 
613
626
  expect(query.meta).toBe(meta)
614
627
  })
@@ -622,9 +635,7 @@ describe('query', () => {
622
635
 
623
636
  const key = queryKey()
624
637
 
625
- await queryClient.prefetchQuery(key, queryFn, {
626
- meta,
627
- })
638
+ await queryClient.prefetchQuery({ queryKey: key, queryFn, meta })
628
639
 
629
640
  expect(queryFn).toBeCalledWith(
630
641
  expect.objectContaining({
@@ -655,8 +666,8 @@ describe('query', () => {
655
666
  test('should not add an existing observer', async () => {
656
667
  const key = queryKey()
657
668
 
658
- await queryClient.prefetchQuery(key, () => 'data')
659
- const query = queryCache.find(key)!
669
+ await queryClient.prefetchQuery({ queryKey: key, queryFn: () => 'data' })
670
+ const query = queryCache.find({ queryKey: key })!
660
671
  expect(query.getObserversCount()).toEqual(0)
661
672
 
662
673
  const observer = new QueryObserver(queryClient, {
@@ -674,8 +685,8 @@ describe('query', () => {
674
685
  test('should not try to remove an observer that does not exist', async () => {
675
686
  const key = queryKey()
676
687
 
677
- await queryClient.prefetchQuery(key, () => 'data')
678
- const query = queryCache.find(key)!
688
+ await queryClient.prefetchQuery({ queryKey: key, queryFn: () => 'data' })
689
+ const query = queryCache.find({ queryKey: key })!
679
690
  const observer = new QueryObserver(queryClient, {
680
691
  queryKey: key,
681
692
  })
@@ -688,28 +699,23 @@ describe('query', () => {
688
699
  notifySpy.mockRestore()
689
700
  })
690
701
 
691
- test('should not dispatch "invalidate" on invalidate() if already invalidated', async () => {
702
+ test('should not change state on invalidate() if already invalidated', async () => {
692
703
  const key = queryKey()
693
704
 
694
- await queryClient.prefetchQuery(key, () => 'data')
695
- const query = queryCache.find(key)!
705
+ await queryClient.prefetchQuery({ queryKey: key, queryFn: () => 'data' })
706
+ const query = queryCache.find({ queryKey: key })!
696
707
 
697
708
  query.invalidate()
698
709
  expect(query.state.isInvalidated).toBeTruthy()
699
710
 
700
- const dispatchOriginal = query['dispatch']
701
- const dispatchSpy = jest.fn()
702
- query['dispatch'] = dispatchSpy
711
+ const previousState = query.state
703
712
 
704
713
  query.invalidate()
705
714
 
706
- expect(query.state.isInvalidated).toBeTruthy()
707
- expect(dispatchSpy).not.toHaveBeenCalled()
708
-
709
- query['dispatch'] = dispatchOriginal
715
+ expect(query.state).toBe(previousState)
710
716
  })
711
717
 
712
- test('fetch should not dispatch "fetch" if state meta and fetchOptions meta are the same object', async () => {
718
+ test('fetch should not dispatch "fetch" query is already fetching', async () => {
713
719
  const key = queryKey()
714
720
 
715
721
  const queryFn = async () => {
@@ -717,71 +723,31 @@ describe('query', () => {
717
723
  return 'data'
718
724
  }
719
725
 
720
- await queryClient.prefetchQuery(key, queryFn)
721
- const query = queryCache.find(key)!
722
-
723
- const meta = { meta1: '1' }
724
-
725
- // This first fetch will set the state.meta value
726
- query.fetch(
727
- {
728
- queryKey: key,
729
- queryFn,
730
- },
731
- {
732
- meta,
733
- },
734
- )
735
-
736
- // Spy on private dispatch method
737
- const dispatchOriginal = query['dispatch']
738
- const dispatchSpy = jest.fn()
739
- query['dispatch'] = dispatchSpy
726
+ const updates: Array<string> = []
740
727
 
741
- // Second fetch in parallel with the same meta
742
- query.fetch(
743
- {
744
- queryKey: key,
745
- queryFn,
746
- },
747
- {
748
- meta,
749
- // cancelRefetch must be set to true to enter in the case to test
750
- // where isFetching is true
751
- cancelRefetch: true,
752
- },
753
- )
728
+ await queryClient.prefetchQuery({ queryKey: key, queryFn })
729
+ const query = queryCache.find({ queryKey: key })!
754
730
 
755
- // Should not call dispatch with type set to fetch
756
- expect(dispatchSpy).not.toHaveBeenCalledWith({
757
- meta,
758
- type: 'fetch',
731
+ const unsubscribe = queryClient.getQueryCache().subscribe((event) => {
732
+ updates.push(event.type)
759
733
  })
760
734
 
761
- // Clean-up
762
- await sleep(20)
763
- query['dispatch'] = dispatchOriginal
764
- })
765
-
766
- test('fetch should not set the signal in the queryFnContext if AbortController is undefined', async () => {
767
- const key = queryKey()
768
-
769
- // Mock the AbortController to be undefined
770
- const AbortControllerOriginal = globalThis['AbortController']
771
- //@ts-expect-error
772
- globalThis['AbortController'] = undefined
735
+ void query.fetch({
736
+ queryKey: key,
737
+ queryFn,
738
+ })
773
739
 
774
- let signalTest: any
775
- await queryClient.prefetchQuery(key, ({ signal }) => {
776
- signalTest = signal
777
- return 'data'
740
+ await query.fetch({
741
+ queryKey: key,
742
+ queryFn,
778
743
  })
779
744
 
780
- expect(signalTest).toBeUndefined()
745
+ expect(updates).toEqual([
746
+ 'updated', // type: 'fetch'
747
+ 'updated', // type: 'success'
748
+ ])
781
749
 
782
- // Clean-up
783
- //@ts-ignore
784
- globalThis['AbortController'] = AbortControllerOriginal
750
+ unsubscribe()
785
751
  })
786
752
 
787
753
  test('fetch should throw an error if the queryFn is not defined', async () => {
@@ -795,12 +761,16 @@ describe('query', () => {
795
761
 
796
762
  const unsubscribe = observer.subscribe(() => undefined)
797
763
  await sleep(10)
798
- expect(mockLogger.error).toHaveBeenCalledWith('Missing queryFn')
799
-
764
+ expect(observer.getCurrentResult()).toMatchObject({
765
+ status: 'error',
766
+ error: new Error('Missing queryFn'),
767
+ })
800
768
  unsubscribe()
801
769
  })
802
770
 
803
771
  test('fetch should dispatch an error if the queryFn returns undefined', async () => {
772
+ const consoleMock = jest.spyOn(console, 'error')
773
+ consoleMock.mockImplementation(() => undefined)
804
774
  const key = queryKey()
805
775
 
806
776
  const observer = new QueryObserver(queryClient, {
@@ -824,49 +794,11 @@ describe('query', () => {
824
794
  error,
825
795
  })
826
796
 
827
- expect(mockLogger.error).toHaveBeenCalledWith(error)
797
+ expect(consoleMock).toHaveBeenCalledWith(
798
+ `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ["${key}"]`,
799
+ )
828
800
  unsubscribe()
829
- })
830
-
831
- test('fetch should dispatch fetch if is fetching and current promise is undefined', async () => {
832
- const key = queryKey()
833
-
834
- const queryFn = async () => {
835
- await sleep(10)
836
- return 'data'
837
- }
838
-
839
- await queryClient.prefetchQuery(key, queryFn)
840
- const query = queryCache.find(key)!
841
-
842
- query.fetch({
843
- queryKey: key,
844
- queryFn,
845
- })
846
-
847
- // Force promise to undefined
848
- // because no use case have been identified
849
- query['promise'] = undefined
850
-
851
- // Spy on private dispatch method
852
- const dispatchOriginal = query['dispatch']
853
- const dispatchSpy = jest.fn()
854
- query['dispatch'] = dispatchSpy
855
-
856
- query.fetch({
857
- queryKey: key,
858
- queryFn,
859
- })
860
-
861
- // Should call dispatch with type set to fetch
862
- expect(dispatchSpy).toHaveBeenCalledWith({
863
- meta: undefined,
864
- type: 'fetch',
865
- })
866
-
867
- // Clean-up
868
- await sleep(20)
869
- query['dispatch'] = dispatchOriginal
801
+ consoleMock.mockRestore()
870
802
  })
871
803
 
872
804
  test('constructor should call initialDataUpdatedAt if defined as a function', async () => {
@@ -887,7 +819,7 @@ describe('query', () => {
887
819
  test('queries should be garbage collected even if they never fetched', async () => {
888
820
  const key = queryKey()
889
821
 
890
- queryClient.setQueryDefaults(key, { cacheTime: 10 })
822
+ queryClient.setQueryDefaults(key, { gcTime: 10 })
891
823
 
892
824
  const fn = jest.fn()
893
825