@tanstack/query-core 4.0.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 (85) hide show
  1. package/build/cjs/focusManager.js +101 -0
  2. package/build/cjs/focusManager.js.map +1 -0
  3. package/build/cjs/hydration.js +112 -0
  4. package/build/cjs/hydration.js.map +1 -0
  5. package/build/cjs/index.js +51 -0
  6. package/build/cjs/index.js.map +1 -0
  7. package/build/cjs/infiniteQueryBehavior.js +160 -0
  8. package/build/cjs/infiniteQueryBehavior.js.map +1 -0
  9. package/build/cjs/infiniteQueryObserver.js +92 -0
  10. package/build/cjs/infiniteQueryObserver.js.map +1 -0
  11. package/build/cjs/logger.js +18 -0
  12. package/build/cjs/logger.js.map +1 -0
  13. package/build/cjs/mutation.js +258 -0
  14. package/build/cjs/mutation.js.map +1 -0
  15. package/build/cjs/mutationCache.js +99 -0
  16. package/build/cjs/mutationCache.js.map +1 -0
  17. package/build/cjs/mutationObserver.js +130 -0
  18. package/build/cjs/mutationObserver.js.map +1 -0
  19. package/build/cjs/notifyManager.js +114 -0
  20. package/build/cjs/notifyManager.js.map +1 -0
  21. package/build/cjs/onlineManager.js +100 -0
  22. package/build/cjs/onlineManager.js.map +1 -0
  23. package/build/cjs/queriesObserver.js +170 -0
  24. package/build/cjs/queriesObserver.js.map +1 -0
  25. package/build/cjs/query.js +474 -0
  26. package/build/cjs/query.js.map +1 -0
  27. package/build/cjs/queryCache.js +140 -0
  28. package/build/cjs/queryCache.js.map +1 -0
  29. package/build/cjs/queryClient.js +357 -0
  30. package/build/cjs/queryClient.js.map +1 -0
  31. package/build/cjs/queryObserver.js +521 -0
  32. package/build/cjs/queryObserver.js.map +1 -0
  33. package/build/cjs/removable.js +47 -0
  34. package/build/cjs/removable.js.map +1 -0
  35. package/build/cjs/retryer.js +177 -0
  36. package/build/cjs/retryer.js.map +1 -0
  37. package/build/cjs/subscribable.js +43 -0
  38. package/build/cjs/subscribable.js.map +1 -0
  39. package/build/cjs/utils.js +356 -0
  40. package/build/cjs/utils.js.map +1 -0
  41. package/build/esm/index.js +3077 -0
  42. package/build/esm/index.js.map +1 -0
  43. package/build/stats-html.html +2689 -0
  44. package/build/umd/index.development.js +3106 -0
  45. package/build/umd/index.development.js.map +1 -0
  46. package/build/umd/index.production.js +12 -0
  47. package/build/umd/index.production.js.map +1 -0
  48. package/package.json +25 -0
  49. package/src/focusManager.ts +89 -0
  50. package/src/hydration.ts +164 -0
  51. package/src/index.ts +35 -0
  52. package/src/infiniteQueryBehavior.ts +214 -0
  53. package/src/infiniteQueryObserver.ts +159 -0
  54. package/src/logger.native.ts +11 -0
  55. package/src/logger.ts +9 -0
  56. package/src/mutation.ts +349 -0
  57. package/src/mutationCache.ts +157 -0
  58. package/src/mutationObserver.ts +195 -0
  59. package/src/notifyManager.ts +96 -0
  60. package/src/onlineManager.ts +89 -0
  61. package/src/queriesObserver.ts +211 -0
  62. package/src/query.ts +612 -0
  63. package/src/queryCache.ts +206 -0
  64. package/src/queryClient.ts +716 -0
  65. package/src/queryObserver.ts +748 -0
  66. package/src/removable.ts +37 -0
  67. package/src/retryer.ts +215 -0
  68. package/src/subscribable.ts +33 -0
  69. package/src/tests/focusManager.test.tsx +155 -0
  70. package/src/tests/hydration.test.tsx +429 -0
  71. package/src/tests/infiniteQueryBehavior.test.tsx +124 -0
  72. package/src/tests/infiniteQueryObserver.test.tsx +64 -0
  73. package/src/tests/mutationCache.test.tsx +260 -0
  74. package/src/tests/mutationObserver.test.tsx +75 -0
  75. package/src/tests/mutations.test.tsx +363 -0
  76. package/src/tests/notifyManager.test.tsx +51 -0
  77. package/src/tests/onlineManager.test.tsx +148 -0
  78. package/src/tests/queriesObserver.test.tsx +330 -0
  79. package/src/tests/query.test.tsx +888 -0
  80. package/src/tests/queryCache.test.tsx +236 -0
  81. package/src/tests/queryClient.test.tsx +1435 -0
  82. package/src/tests/queryObserver.test.tsx +802 -0
  83. package/src/tests/utils.test.tsx +360 -0
  84. package/src/types.ts +705 -0
  85. package/src/utils.ts +435 -0
@@ -0,0 +1,716 @@
1
+ import {
2
+ QueryFilters,
3
+ Updater,
4
+ hashQueryKey,
5
+ noop,
6
+ parseFilterArgs,
7
+ parseQueryArgs,
8
+ partialMatchKey,
9
+ hashQueryKeyByOptions,
10
+ MutationFilters,
11
+ functionalUpdate,
12
+ } from './utils'
13
+ import type {
14
+ QueryClientConfig,
15
+ DefaultOptions,
16
+ FetchInfiniteQueryOptions,
17
+ FetchQueryOptions,
18
+ InfiniteData,
19
+ InvalidateOptions,
20
+ InvalidateQueryFilters,
21
+ MutationKey,
22
+ MutationObserverOptions,
23
+ MutationOptions,
24
+ QueryFunction,
25
+ QueryKey,
26
+ QueryObserverOptions,
27
+ QueryOptions,
28
+ RefetchOptions,
29
+ RefetchQueryFilters,
30
+ ResetOptions,
31
+ ResetQueryFilters,
32
+ SetDataOptions,
33
+ } from './types'
34
+ import type { QueryState } from './query'
35
+ import { QueryCache } from './queryCache'
36
+ import { MutationCache } from './mutationCache'
37
+ import { focusManager } from './focusManager'
38
+ import { onlineManager } from './onlineManager'
39
+ import { notifyManager } from './notifyManager'
40
+ import { infiniteQueryBehavior } from './infiniteQueryBehavior'
41
+ import { CancelOptions, DefaultedQueryObserverOptions } from './types'
42
+ import { defaultLogger, Logger } from './logger'
43
+
44
+ // TYPES
45
+
46
+ interface QueryDefaults {
47
+ queryKey: QueryKey
48
+ defaultOptions: QueryOptions<any, any, any>
49
+ }
50
+
51
+ interface MutationDefaults {
52
+ mutationKey: MutationKey
53
+ defaultOptions: MutationOptions<any, any, any, any>
54
+ }
55
+
56
+ // CLASS
57
+
58
+ export class QueryClient {
59
+ private queryCache: QueryCache
60
+ private mutationCache: MutationCache
61
+ private logger: Logger
62
+ private defaultOptions: DefaultOptions
63
+ private queryDefaults: QueryDefaults[]
64
+ private mutationDefaults: MutationDefaults[]
65
+ private unsubscribeFocus?: () => void
66
+ private unsubscribeOnline?: () => void
67
+
68
+ constructor(config: QueryClientConfig = {}) {
69
+ this.queryCache = config.queryCache || new QueryCache()
70
+ this.mutationCache = config.mutationCache || new MutationCache()
71
+ this.logger = config.logger || defaultLogger
72
+ this.defaultOptions = config.defaultOptions || {}
73
+ this.queryDefaults = []
74
+ this.mutationDefaults = []
75
+ }
76
+
77
+ mount(): void {
78
+ this.unsubscribeFocus = focusManager.subscribe(() => {
79
+ if (focusManager.isFocused()) {
80
+ this.resumePausedMutations()
81
+ this.queryCache.onFocus()
82
+ }
83
+ })
84
+ this.unsubscribeOnline = onlineManager.subscribe(() => {
85
+ if (onlineManager.isOnline()) {
86
+ this.resumePausedMutations()
87
+ this.queryCache.onOnline()
88
+ }
89
+ })
90
+ }
91
+
92
+ unmount(): void {
93
+ this.unsubscribeFocus?.()
94
+ this.unsubscribeOnline?.()
95
+ }
96
+
97
+ isFetching(filters?: QueryFilters): number
98
+ isFetching(queryKey?: QueryKey, filters?: QueryFilters): number
99
+ isFetching(arg1?: QueryKey | QueryFilters, arg2?: QueryFilters): number {
100
+ const [filters] = parseFilterArgs(arg1, arg2)
101
+ filters.fetchStatus = 'fetching'
102
+ return this.queryCache.findAll(filters).length
103
+ }
104
+
105
+ isMutating(filters?: MutationFilters): number {
106
+ return this.mutationCache.findAll({ ...filters, fetching: true }).length
107
+ }
108
+
109
+ getQueryData<TData = unknown>(
110
+ queryKey: QueryKey,
111
+ filters?: QueryFilters,
112
+ ): TData | undefined {
113
+ return this.queryCache.find<TData>(queryKey, filters)?.state.data
114
+ }
115
+
116
+ getQueriesData<TData = unknown>(queryKey: QueryKey): [QueryKey, TData][]
117
+ getQueriesData<TData = unknown>(filters: QueryFilters): [QueryKey, TData][]
118
+ getQueriesData<TData = unknown>(
119
+ queryKeyOrFilters: QueryKey | QueryFilters,
120
+ ): [QueryKey, TData][] {
121
+ return this.getQueryCache()
122
+ .findAll(queryKeyOrFilters)
123
+ .map(({ queryKey, state }) => {
124
+ const data = state.data as TData
125
+ return [queryKey, data]
126
+ })
127
+ }
128
+
129
+ setQueryData<TData>(
130
+ queryKey: QueryKey,
131
+ updater: Updater<TData | undefined, TData | undefined>,
132
+ options?: SetDataOptions,
133
+ ): TData | undefined {
134
+ const query = this.queryCache.find<TData>(queryKey)
135
+ const prevData = query?.state.data
136
+ const data = functionalUpdate(updater, prevData)
137
+
138
+ if (typeof data === 'undefined') {
139
+ return undefined
140
+ }
141
+
142
+ const parsedOptions = parseQueryArgs(queryKey)
143
+ const defaultedOptions = this.defaultQueryOptions(parsedOptions)
144
+ return this.queryCache
145
+ .build(this, defaultedOptions)
146
+ .setData(data, { ...options, manual: true })
147
+ }
148
+
149
+ setQueriesData<TData>(
150
+ queryKey: QueryKey,
151
+ updater: Updater<TData | undefined, TData | undefined>,
152
+ options?: SetDataOptions,
153
+ ): [QueryKey, TData | undefined][]
154
+
155
+ setQueriesData<TData>(
156
+ filters: QueryFilters,
157
+ updater: Updater<TData | undefined, TData | undefined>,
158
+ options?: SetDataOptions,
159
+ ): [QueryKey, TData | undefined][]
160
+
161
+ setQueriesData<TData>(
162
+ queryKeyOrFilters: QueryKey | QueryFilters,
163
+ updater: Updater<TData | undefined, TData | undefined>,
164
+ options?: SetDataOptions,
165
+ ): [QueryKey, TData | undefined][] {
166
+ return notifyManager.batch(() =>
167
+ this.getQueryCache()
168
+ .findAll(queryKeyOrFilters)
169
+ .map(({ queryKey }) => [
170
+ queryKey,
171
+ this.setQueryData<TData>(queryKey, updater, options),
172
+ ]),
173
+ )
174
+ }
175
+
176
+ getQueryState<TData = unknown, TError = undefined>(
177
+ queryKey: QueryKey,
178
+ filters?: QueryFilters,
179
+ ): QueryState<TData, TError> | undefined {
180
+ return this.queryCache.find<TData, TError>(queryKey, filters)?.state
181
+ }
182
+
183
+ removeQueries(filters?: QueryFilters): void
184
+ removeQueries(queryKey?: QueryKey, filters?: QueryFilters): void
185
+ removeQueries(arg1?: QueryKey | QueryFilters, arg2?: QueryFilters): void {
186
+ const [filters] = parseFilterArgs(arg1, arg2)
187
+ const queryCache = this.queryCache
188
+ notifyManager.batch(() => {
189
+ queryCache.findAll(filters).forEach((query) => {
190
+ queryCache.remove(query)
191
+ })
192
+ })
193
+ }
194
+
195
+ resetQueries<TPageData = unknown>(
196
+ filters?: ResetQueryFilters<TPageData>,
197
+ options?: ResetOptions,
198
+ ): Promise<void>
199
+ resetQueries<TPageData = unknown>(
200
+ queryKey?: QueryKey,
201
+ filters?: ResetQueryFilters<TPageData>,
202
+ options?: ResetOptions,
203
+ ): Promise<void>
204
+ resetQueries(
205
+ arg1?: QueryKey | ResetQueryFilters,
206
+ arg2?: ResetQueryFilters | ResetOptions,
207
+ arg3?: ResetOptions,
208
+ ): Promise<void> {
209
+ const [filters, options] = parseFilterArgs(arg1, arg2, arg3)
210
+ const queryCache = this.queryCache
211
+
212
+ const refetchFilters: RefetchQueryFilters = {
213
+ type: 'active',
214
+ ...filters,
215
+ }
216
+
217
+ return notifyManager.batch(() => {
218
+ queryCache.findAll(filters).forEach((query) => {
219
+ query.reset()
220
+ })
221
+ return this.refetchQueries(refetchFilters, options)
222
+ })
223
+ }
224
+
225
+ cancelQueries(filters?: QueryFilters, options?: CancelOptions): Promise<void>
226
+ cancelQueries(
227
+ queryKey?: QueryKey,
228
+ filters?: QueryFilters,
229
+ options?: CancelOptions,
230
+ ): Promise<void>
231
+ cancelQueries(
232
+ arg1?: QueryKey | QueryFilters,
233
+ arg2?: QueryFilters | CancelOptions,
234
+ arg3?: CancelOptions,
235
+ ): Promise<void> {
236
+ const [filters, cancelOptions = {}] = parseFilterArgs(arg1, arg2, arg3)
237
+
238
+ if (typeof cancelOptions.revert === 'undefined') {
239
+ cancelOptions.revert = true
240
+ }
241
+
242
+ const promises = notifyManager.batch(() =>
243
+ this.queryCache
244
+ .findAll(filters)
245
+ .map((query) => query.cancel(cancelOptions)),
246
+ )
247
+
248
+ return Promise.all(promises).then(noop).catch(noop)
249
+ }
250
+
251
+ invalidateQueries<TPageData = unknown>(
252
+ filters?: InvalidateQueryFilters<TPageData>,
253
+ options?: InvalidateOptions,
254
+ ): Promise<void>
255
+ invalidateQueries<TPageData = unknown>(
256
+ queryKey?: QueryKey,
257
+ filters?: InvalidateQueryFilters<TPageData>,
258
+ options?: InvalidateOptions,
259
+ ): Promise<void>
260
+ invalidateQueries(
261
+ arg1?: QueryKey | InvalidateQueryFilters,
262
+ arg2?: InvalidateQueryFilters | InvalidateOptions,
263
+ arg3?: InvalidateOptions,
264
+ ): Promise<void> {
265
+ const [filters, options] = parseFilterArgs(arg1, arg2, arg3)
266
+
267
+ return notifyManager.batch(() => {
268
+ this.queryCache.findAll(filters).forEach((query) => {
269
+ query.invalidate()
270
+ })
271
+
272
+ if (filters.refetchType === 'none') {
273
+ return Promise.resolve()
274
+ }
275
+ const refetchFilters: RefetchQueryFilters = {
276
+ ...filters,
277
+ type: filters.refetchType ?? filters.type ?? 'active',
278
+ }
279
+ return this.refetchQueries(refetchFilters, options)
280
+ })
281
+ }
282
+
283
+ refetchQueries<TPageData = unknown>(
284
+ filters?: RefetchQueryFilters<TPageData>,
285
+ options?: RefetchOptions,
286
+ ): Promise<void>
287
+ refetchQueries<TPageData = unknown>(
288
+ queryKey?: QueryKey,
289
+ filters?: RefetchQueryFilters<TPageData>,
290
+ options?: RefetchOptions,
291
+ ): Promise<void>
292
+ refetchQueries(
293
+ arg1?: QueryKey | RefetchQueryFilters,
294
+ arg2?: RefetchQueryFilters | RefetchOptions,
295
+ arg3?: RefetchOptions,
296
+ ): Promise<void> {
297
+ const [filters, options] = parseFilterArgs(arg1, arg2, arg3)
298
+
299
+ const promises = notifyManager.batch(() =>
300
+ this.queryCache
301
+ .findAll(filters)
302
+ .filter((query) => !query.isDisabled())
303
+ .map((query) =>
304
+ query.fetch(undefined, {
305
+ ...options,
306
+ cancelRefetch: options?.cancelRefetch ?? true,
307
+ meta: { refetchPage: filters.refetchPage },
308
+ }),
309
+ ),
310
+ )
311
+
312
+ let promise = Promise.all(promises).then(noop)
313
+
314
+ if (!options?.throwOnError) {
315
+ promise = promise.catch(noop)
316
+ }
317
+
318
+ return promise
319
+ }
320
+
321
+ fetchQuery<
322
+ TQueryFnData = unknown,
323
+ TError = unknown,
324
+ TData = TQueryFnData,
325
+ TQueryKey extends QueryKey = QueryKey,
326
+ >(
327
+ options: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
328
+ ): Promise<TData>
329
+ fetchQuery<
330
+ TQueryFnData = unknown,
331
+ TError = unknown,
332
+ TData = TQueryFnData,
333
+ TQueryKey extends QueryKey = QueryKey,
334
+ >(
335
+ queryKey: TQueryKey,
336
+ options?: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
337
+ ): Promise<TData>
338
+ fetchQuery<
339
+ TQueryFnData = unknown,
340
+ TError = unknown,
341
+ TData = TQueryFnData,
342
+ TQueryKey extends QueryKey = QueryKey,
343
+ >(
344
+ queryKey: TQueryKey,
345
+ queryFn: QueryFunction<TQueryFnData, TQueryKey>,
346
+ options?: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
347
+ ): Promise<TData>
348
+ fetchQuery<
349
+ TQueryFnData,
350
+ TError,
351
+ TData = TQueryFnData,
352
+ TQueryKey extends QueryKey = QueryKey,
353
+ >(
354
+ arg1: TQueryKey | FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
355
+ arg2?:
356
+ | QueryFunction<TQueryFnData, TQueryKey>
357
+ | FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
358
+ arg3?: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
359
+ ): Promise<TData> {
360
+ const parsedOptions = parseQueryArgs(arg1, arg2, arg3)
361
+ const defaultedOptions = this.defaultQueryOptions(parsedOptions)
362
+
363
+ // https://github.com/tannerlinsley/react-query/issues/652
364
+ if (typeof defaultedOptions.retry === 'undefined') {
365
+ defaultedOptions.retry = false
366
+ }
367
+
368
+ const query = this.queryCache.build(this, defaultedOptions)
369
+
370
+ return query.isStaleByTime(defaultedOptions.staleTime)
371
+ ? query.fetch(defaultedOptions)
372
+ : Promise.resolve(query.state.data as TData)
373
+ }
374
+
375
+ prefetchQuery<
376
+ TQueryFnData = unknown,
377
+ TError = unknown,
378
+ TData = TQueryFnData,
379
+ TQueryKey extends QueryKey = QueryKey,
380
+ >(
381
+ options: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
382
+ ): Promise<void>
383
+ prefetchQuery<
384
+ TQueryFnData = unknown,
385
+ TError = unknown,
386
+ TData = TQueryFnData,
387
+ TQueryKey extends QueryKey = QueryKey,
388
+ >(
389
+ queryKey: TQueryKey,
390
+ options?: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
391
+ ): Promise<void>
392
+ prefetchQuery<
393
+ TQueryFnData = unknown,
394
+ TError = unknown,
395
+ TData = TQueryFnData,
396
+ TQueryKey extends QueryKey = QueryKey,
397
+ >(
398
+ queryKey: TQueryKey,
399
+ queryFn: QueryFunction<TQueryFnData, TQueryKey>,
400
+ options?: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
401
+ ): Promise<void>
402
+ prefetchQuery<
403
+ TQueryFnData = unknown,
404
+ TError = unknown,
405
+ TData = TQueryFnData,
406
+ TQueryKey extends QueryKey = QueryKey,
407
+ >(
408
+ arg1: TQueryKey | FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
409
+ arg2?:
410
+ | QueryFunction<TQueryFnData, TQueryKey>
411
+ | FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
412
+ arg3?: FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
413
+ ): Promise<void> {
414
+ return this.fetchQuery(arg1 as any, arg2 as any, arg3)
415
+ .then(noop)
416
+ .catch(noop)
417
+ }
418
+
419
+ fetchInfiniteQuery<
420
+ TQueryFnData = unknown,
421
+ TError = unknown,
422
+ TData = TQueryFnData,
423
+ TQueryKey extends QueryKey = QueryKey,
424
+ >(
425
+ options: FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
426
+ ): Promise<InfiniteData<TData>>
427
+ fetchInfiniteQuery<
428
+ TQueryFnData = unknown,
429
+ TError = unknown,
430
+ TData = TQueryFnData,
431
+ TQueryKey extends QueryKey = QueryKey,
432
+ >(
433
+ queryKey: TQueryKey,
434
+ options?: FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
435
+ ): Promise<InfiniteData<TData>>
436
+ fetchInfiniteQuery<
437
+ TQueryFnData = unknown,
438
+ TError = unknown,
439
+ TData = TQueryFnData,
440
+ TQueryKey extends QueryKey = QueryKey,
441
+ >(
442
+ queryKey: TQueryKey,
443
+ queryFn: QueryFunction<TQueryFnData, TQueryKey>,
444
+ options?: FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
445
+ ): Promise<InfiniteData<TData>>
446
+ fetchInfiniteQuery<
447
+ TQueryFnData,
448
+ TError,
449
+ TData = TQueryFnData,
450
+ TQueryKey extends QueryKey = QueryKey,
451
+ >(
452
+ arg1:
453
+ | TQueryKey
454
+ | FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
455
+ arg2?:
456
+ | QueryFunction<TQueryFnData, TQueryKey>
457
+ | FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
458
+ arg3?: FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
459
+ ): Promise<InfiniteData<TData>> {
460
+ const parsedOptions = parseQueryArgs(arg1, arg2, arg3)
461
+ parsedOptions.behavior = infiniteQueryBehavior<
462
+ TQueryFnData,
463
+ TError,
464
+ TData
465
+ >()
466
+ return this.fetchQuery(parsedOptions)
467
+ }
468
+
469
+ prefetchInfiniteQuery<
470
+ TQueryFnData = unknown,
471
+ TError = unknown,
472
+ TData = TQueryFnData,
473
+ TQueryKey extends QueryKey = QueryKey,
474
+ >(
475
+ options: FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
476
+ ): Promise<void>
477
+ prefetchInfiniteQuery<
478
+ TQueryFnData = unknown,
479
+ TError = unknown,
480
+ TData = TQueryFnData,
481
+ TQueryKey extends QueryKey = QueryKey,
482
+ >(
483
+ queryKey: TQueryKey,
484
+ options?: FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
485
+ ): Promise<void>
486
+ prefetchInfiniteQuery<
487
+ TQueryFnData = unknown,
488
+ TError = unknown,
489
+ TData = TQueryFnData,
490
+ TQueryKey extends QueryKey = QueryKey,
491
+ >(
492
+ queryKey: TQueryKey,
493
+ queryFn: QueryFunction<TQueryFnData, TQueryKey>,
494
+ options?: FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
495
+ ): Promise<void>
496
+ prefetchInfiniteQuery<
497
+ TQueryFnData,
498
+ TError,
499
+ TData = TQueryFnData,
500
+ TQueryKey extends QueryKey = QueryKey,
501
+ >(
502
+ arg1:
503
+ | TQueryKey
504
+ | FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
505
+ arg2?:
506
+ | QueryFunction<TQueryFnData, TQueryKey>
507
+ | FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
508
+ arg3?: FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
509
+ ): Promise<void> {
510
+ return this.fetchInfiniteQuery(arg1 as any, arg2 as any, arg3)
511
+ .then(noop)
512
+ .catch(noop)
513
+ }
514
+
515
+ resumePausedMutations(): Promise<void> {
516
+ return this.mutationCache.resumePausedMutations()
517
+ }
518
+
519
+ getQueryCache(): QueryCache {
520
+ return this.queryCache
521
+ }
522
+
523
+ getMutationCache(): MutationCache {
524
+ return this.mutationCache
525
+ }
526
+
527
+ getLogger(): Logger {
528
+ return this.logger
529
+ }
530
+
531
+ getDefaultOptions(): DefaultOptions {
532
+ return this.defaultOptions
533
+ }
534
+
535
+ setDefaultOptions(options: DefaultOptions): void {
536
+ this.defaultOptions = options
537
+ }
538
+
539
+ setQueryDefaults(
540
+ queryKey: QueryKey,
541
+ options: QueryObserverOptions<unknown, any, any, any>,
542
+ ): void {
543
+ const result = this.queryDefaults.find(
544
+ (x) => hashQueryKey(queryKey) === hashQueryKey(x.queryKey),
545
+ )
546
+ if (result) {
547
+ result.defaultOptions = options
548
+ } else {
549
+ this.queryDefaults.push({ queryKey, defaultOptions: options })
550
+ }
551
+ }
552
+
553
+ getQueryDefaults(
554
+ queryKey?: QueryKey,
555
+ ): QueryObserverOptions<any, any, any, any, any> | undefined {
556
+ if (!queryKey) {
557
+ return undefined
558
+ }
559
+
560
+ // Get the first matching defaults
561
+ const firstMatchingDefaults = this.queryDefaults.find((x) =>
562
+ partialMatchKey(queryKey, x.queryKey),
563
+ )
564
+
565
+ // Additional checks and error in dev mode
566
+ if (process.env.NODE_ENV !== 'production') {
567
+ // Retrieve all matching defaults for the given key
568
+ const matchingDefaults = this.queryDefaults.filter((x) =>
569
+ partialMatchKey(queryKey, x.queryKey),
570
+ )
571
+ // It is ok not having defaults, but it is error prone to have more than 1 default for a given key
572
+ if (matchingDefaults.length > 1) {
573
+ if (process.env.NODE_ENV !== 'production') {
574
+ this.logger.error(
575
+ `[QueryClient] Several query defaults match with key '${JSON.stringify(
576
+ queryKey,
577
+ )}'. The first matching query defaults are used. Please check how query defaults are registered. Order does matter here. cf. https://react-query.tanstack.com/reference/QueryClient#queryclientsetquerydefaults.`,
578
+ )
579
+ }
580
+ }
581
+ }
582
+
583
+ return firstMatchingDefaults?.defaultOptions
584
+ }
585
+
586
+ setMutationDefaults(
587
+ mutationKey: MutationKey,
588
+ options: MutationObserverOptions<any, any, any, any>,
589
+ ): void {
590
+ const result = this.mutationDefaults.find(
591
+ (x) => hashQueryKey(mutationKey) === hashQueryKey(x.mutationKey),
592
+ )
593
+ if (result) {
594
+ result.defaultOptions = options
595
+ } else {
596
+ this.mutationDefaults.push({ mutationKey, defaultOptions: options })
597
+ }
598
+ }
599
+
600
+ getMutationDefaults(
601
+ mutationKey?: MutationKey,
602
+ ): MutationObserverOptions<any, any, any, any> | undefined {
603
+ if (!mutationKey) {
604
+ return undefined
605
+ }
606
+
607
+ // Get the first matching defaults
608
+ const firstMatchingDefaults = this.mutationDefaults.find((x) =>
609
+ partialMatchKey(mutationKey, x.mutationKey),
610
+ )
611
+
612
+ // Additional checks and error in dev mode
613
+ if (process.env.NODE_ENV !== 'production') {
614
+ // Retrieve all matching defaults for the given key
615
+ const matchingDefaults = this.mutationDefaults.filter((x) =>
616
+ partialMatchKey(mutationKey, x.mutationKey),
617
+ )
618
+ // It is ok not having defaults, but it is error prone to have more than 1 default for a given key
619
+ if (matchingDefaults.length > 1) {
620
+ if (process.env.NODE_ENV !== 'production') {
621
+ this.logger.error(
622
+ `[QueryClient] Several mutation defaults match with key '${JSON.stringify(
623
+ mutationKey,
624
+ )}'. The first matching mutation defaults are used. Please check how mutation defaults are registered. Order does matter here. cf. https://react-query.tanstack.com/reference/QueryClient#queryclientsetmutationdefaults.`,
625
+ )
626
+ }
627
+ }
628
+ }
629
+
630
+ return firstMatchingDefaults?.defaultOptions
631
+ }
632
+
633
+ defaultQueryOptions<
634
+ TQueryFnData,
635
+ TError,
636
+ TData,
637
+ TQueryData,
638
+ TQueryKey extends QueryKey,
639
+ >(
640
+ options?:
641
+ | QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>
642
+ | DefaultedQueryObserverOptions<
643
+ TQueryFnData,
644
+ TError,
645
+ TData,
646
+ TQueryData,
647
+ TQueryKey
648
+ >,
649
+ ): DefaultedQueryObserverOptions<
650
+ TQueryFnData,
651
+ TError,
652
+ TData,
653
+ TQueryData,
654
+ TQueryKey
655
+ > {
656
+ if (options?._defaulted) {
657
+ return options as DefaultedQueryObserverOptions<
658
+ TQueryFnData,
659
+ TError,
660
+ TData,
661
+ TQueryData,
662
+ TQueryKey
663
+ >
664
+ }
665
+
666
+ const defaultedOptions = {
667
+ ...this.defaultOptions.queries,
668
+ ...this.getQueryDefaults(options?.queryKey),
669
+ ...options,
670
+ _defaulted: true,
671
+ }
672
+
673
+ if (!defaultedOptions.queryHash && defaultedOptions.queryKey) {
674
+ defaultedOptions.queryHash = hashQueryKeyByOptions(
675
+ defaultedOptions.queryKey,
676
+ defaultedOptions,
677
+ )
678
+ }
679
+
680
+ // dependent default values
681
+ if (typeof defaultedOptions.refetchOnReconnect === 'undefined') {
682
+ defaultedOptions.refetchOnReconnect =
683
+ defaultedOptions.networkMode !== 'always'
684
+ }
685
+ if (typeof defaultedOptions.useErrorBoundary === 'undefined') {
686
+ defaultedOptions.useErrorBoundary = !!defaultedOptions.suspense
687
+ }
688
+
689
+ return defaultedOptions as DefaultedQueryObserverOptions<
690
+ TQueryFnData,
691
+ TError,
692
+ TData,
693
+ TQueryData,
694
+ TQueryKey
695
+ >
696
+ }
697
+
698
+ defaultMutationOptions<T extends MutationOptions<any, any, any, any>>(
699
+ options?: T,
700
+ ): T {
701
+ if (options?._defaulted) {
702
+ return options
703
+ }
704
+ return {
705
+ ...this.defaultOptions.mutations,
706
+ ...this.getMutationDefaults(options?.mutationKey),
707
+ ...options,
708
+ _defaulted: true,
709
+ } as T
710
+ }
711
+
712
+ clear(): void {
713
+ this.queryCache.clear()
714
+ this.mutationCache.clear()
715
+ }
716
+ }