@tanstack/query-core 5.0.0-alpha.3 → 5.0.0-alpha.6

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 (103) hide show
  1. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js +13 -0
  2. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js.map +1 -0
  3. package/build/lib/_virtual/_rollupPluginBabelHelpers.js +16 -0
  4. package/build/lib/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  5. package/build/lib/focusManager.esm.js +31 -15
  6. package/build/lib/focusManager.esm.js.map +1 -1
  7. package/build/lib/focusManager.js +31 -15
  8. package/build/lib/focusManager.js.map +1 -1
  9. package/build/lib/hydration.esm.js +4 -2
  10. package/build/lib/hydration.esm.js.map +1 -1
  11. package/build/lib/hydration.js +4 -2
  12. package/build/lib/hydration.js.map +1 -1
  13. package/build/lib/infiniteQueryBehavior.d.ts +2 -2
  14. package/build/lib/infiniteQueryBehavior.esm.js +52 -48
  15. package/build/lib/infiniteQueryBehavior.esm.js.map +1 -1
  16. package/build/lib/infiniteQueryBehavior.js +52 -48
  17. package/build/lib/infiniteQueryBehavior.js.map +1 -1
  18. package/build/lib/infiniteQueryBehavior.mjs +48 -45
  19. package/build/lib/infiniteQueryBehavior.mjs.map +1 -1
  20. package/build/lib/infiniteQueryObserver.d.ts +6 -6
  21. package/build/lib/infiniteQueryObserver.esm.js +7 -8
  22. package/build/lib/infiniteQueryObserver.esm.js.map +1 -1
  23. package/build/lib/infiniteQueryObserver.js +7 -8
  24. package/build/lib/infiniteQueryObserver.js.map +1 -1
  25. package/build/lib/infiniteQueryObserver.mjs +4 -6
  26. package/build/lib/infiniteQueryObserver.mjs.map +1 -1
  27. package/build/lib/mutation.esm.js +127 -102
  28. package/build/lib/mutation.esm.js.map +1 -1
  29. package/build/lib/mutation.js +127 -102
  30. package/build/lib/mutation.js.map +1 -1
  31. package/build/lib/mutationCache.esm.js +30 -17
  32. package/build/lib/mutationCache.esm.js.map +1 -1
  33. package/build/lib/mutationCache.js +30 -17
  34. package/build/lib/mutationCache.js.map +1 -1
  35. package/build/lib/mutationObserver.esm.js +81 -51
  36. package/build/lib/mutationObserver.esm.js.map +1 -1
  37. package/build/lib/mutationObserver.js +81 -51
  38. package/build/lib/mutationObserver.js.map +1 -1
  39. package/build/lib/onlineManager.esm.js +29 -14
  40. package/build/lib/onlineManager.esm.js.map +1 -1
  41. package/build/lib/onlineManager.js +29 -14
  42. package/build/lib/onlineManager.js.map +1 -1
  43. package/build/lib/queriesObserver.esm.js +94 -65
  44. package/build/lib/queriesObserver.esm.js.map +1 -1
  45. package/build/lib/queriesObserver.js +94 -65
  46. package/build/lib/queriesObserver.js.map +1 -1
  47. package/build/lib/query.d.ts +4 -3
  48. package/build/lib/query.esm.js +210 -161
  49. package/build/lib/query.esm.js.map +1 -1
  50. package/build/lib/query.js +210 -161
  51. package/build/lib/query.js.map +1 -1
  52. package/build/lib/query.mjs.map +1 -1
  53. package/build/lib/queryCache.esm.js +16 -9
  54. package/build/lib/queryCache.esm.js.map +1 -1
  55. package/build/lib/queryCache.js +16 -9
  56. package/build/lib/queryCache.js.map +1 -1
  57. package/build/lib/queryClient.esm.js +103 -63
  58. package/build/lib/queryClient.esm.js.map +1 -1
  59. package/build/lib/queryClient.js +103 -63
  60. package/build/lib/queryClient.js.map +1 -1
  61. package/build/lib/queryObserver.esm.js +308 -207
  62. package/build/lib/queryObserver.esm.js.map +1 -1
  63. package/build/lib/queryObserver.js +307 -206
  64. package/build/lib/queryObserver.js.map +1 -1
  65. package/build/lib/removable.esm.js +13 -6
  66. package/build/lib/removable.esm.js.map +1 -1
  67. package/build/lib/removable.js +13 -6
  68. package/build/lib/removable.js.map +1 -1
  69. package/build/lib/retryer.esm.js +15 -14
  70. package/build/lib/retryer.esm.js.map +1 -1
  71. package/build/lib/retryer.js +15 -14
  72. package/build/lib/retryer.js.map +1 -1
  73. package/build/lib/tests/utils.d.ts +4 -5
  74. package/build/lib/types.d.ts +5 -3
  75. package/build/lib/utils.esm.js +1 -1
  76. package/build/lib/utils.esm.js.map +1 -1
  77. package/build/lib/utils.js +1 -1
  78. package/build/lib/utils.js.map +1 -1
  79. package/build/umd/index.development.js +52 -51
  80. package/build/umd/index.development.js.map +1 -1
  81. package/build/umd/index.production.js +1 -1
  82. package/build/umd/index.production.js.map +1 -1
  83. package/package.json +2 -2
  84. package/src/infiniteQueryBehavior.ts +52 -60
  85. package/src/infiniteQueryObserver.ts +15 -10
  86. package/src/query.ts +6 -4
  87. package/src/tests/focusManager.test.tsx +12 -14
  88. package/src/tests/hydration.test.tsx +15 -14
  89. package/src/tests/infiniteQueryBehavior.test.tsx +16 -9
  90. package/src/tests/infiniteQueryObserver.test.tsx +62 -1
  91. package/src/tests/mutationCache.test.tsx +11 -10
  92. package/src/tests/mutationObserver.test.tsx +3 -2
  93. package/src/tests/mutations.test.tsx +11 -10
  94. package/src/tests/notifyManager.test.tsx +7 -6
  95. package/src/tests/onlineManager.test.tsx +12 -17
  96. package/src/tests/queriesObserver.test.tsx +18 -17
  97. package/src/tests/query.test.tsx +18 -17
  98. package/src/tests/queryCache.test.tsx +14 -13
  99. package/src/tests/queryClient.test.tsx +49 -48
  100. package/src/tests/queryObserver.test.tsx +10 -9
  101. package/src/tests/utils.test.tsx +2 -1
  102. package/src/tests/utils.ts +5 -4
  103. package/src/types.ts +9 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/query-core",
3
- "version": "5.0.0-alpha.3",
3
+ "version": "5.0.0-alpha.6",
4
4
  "description": "The framework agnostic core that powers TanStack Query",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -31,7 +31,7 @@
31
31
  "clean": "rimraf ./build",
32
32
  "test:eslint": "eslint --ext .ts,.tsx ./src",
33
33
  "test:types": "tsc",
34
- "test:lib": "jest --config ./jest.config.ts",
34
+ "test:lib": "vitest run --coverage",
35
35
  "test:lib:dev": "pnpm run test:lib --watch",
36
36
  "build:types": "tsc --build"
37
37
  }
@@ -14,12 +14,12 @@ export function infiniteQueryBehavior<
14
14
  >(): QueryBehavior<TQueryFnData, TError, InfiniteData<TData>> {
15
15
  return {
16
16
  onFetch: (context) => {
17
- context.fetchFn = () => {
17
+ context.fetchFn = async () => {
18
18
  const options = context.options as InfiniteQueryPageParamsOptions<TData>
19
19
  const direction = context.fetchOptions?.meta?.fetchMore?.direction
20
20
  const oldPages = context.state.data?.pages || []
21
21
  const oldPageParams = context.state.data?.pageParams || []
22
- let newPageParams = oldPageParams
22
+ const empty = { pages: [], pageParams: [] }
23
23
  let cancelled = false
24
24
 
25
25
  const addSignalProperty = (object: unknown) => {
@@ -43,35 +43,18 @@ export function infiniteQueryBehavior<
43
43
  context.options.queryFn ||
44
44
  (() => Promise.reject(new Error('Missing queryFn')))
45
45
 
46
- const buildNewPages = (
47
- pages: unknown[],
48
- param: unknown,
49
- page: unknown,
50
- previous?: boolean,
51
- ) => {
52
- const { maxPages } = context.options
53
-
54
- if (previous) {
55
- newPageParams = addToStart(newPageParams, param, maxPages)
56
- return addToStart(pages, page, maxPages)
57
- }
58
-
59
- newPageParams = addToEnd(newPageParams, param, maxPages)
60
- return addToEnd(pages, page, maxPages)
61
- }
62
-
63
46
  // Create function to fetch a page
64
- const fetchPage = (
65
- pages: unknown[],
47
+ const fetchPage = async (
48
+ data: InfiniteData<unknown>,
66
49
  param: unknown,
67
50
  previous?: boolean,
68
- ): Promise<unknown[]> => {
51
+ ): Promise<InfiniteData<unknown>> => {
69
52
  if (cancelled) {
70
53
  return Promise.reject()
71
54
  }
72
55
 
73
- if (typeof param === 'undefined' && pages.length) {
74
- return Promise.resolve(pages)
56
+ if (typeof param === 'undefined' && data.pages.length) {
57
+ return Promise.resolve(data)
75
58
  }
76
59
 
77
60
  const queryFnContext: Omit<
@@ -80,60 +63,58 @@ export function infiniteQueryBehavior<
80
63
  > = {
81
64
  queryKey: context.queryKey,
82
65
  pageParam: param,
66
+ direction: previous ? 'backward' : 'forward',
83
67
  meta: context.options.meta,
84
68
  }
85
69
 
86
70
  addSignalProperty(queryFnContext)
87
71
 
88
- const queryFnResult = queryFn(
72
+ const page = await queryFn(
89
73
  queryFnContext as QueryFunctionContext<QueryKey, unknown>,
90
74
  )
91
75
 
92
- const promise = Promise.resolve(queryFnResult).then((page) =>
93
- buildNewPages(pages, param, page, previous),
94
- )
76
+ const { maxPages } = context.options
77
+ const addTo = previous ? addToStart : addToEnd
95
78
 
96
- return promise
79
+ return {
80
+ pages: addTo(data.pages, page, maxPages),
81
+ pageParams: addTo(data.pageParams, param, maxPages),
82
+ }
97
83
  }
98
84
 
99
- let promise: Promise<unknown[]>
85
+ let result: InfiniteData<unknown>
100
86
 
101
87
  // Fetch first page?
102
88
  if (!oldPages.length) {
103
- promise = fetchPage([], options.defaultPageParam)
89
+ result = await fetchPage(empty, options.defaultPageParam)
104
90
  }
105
91
 
106
92
  // fetch next / previous page?
107
93
  else if (direction) {
108
94
  const previous = direction === 'backward'
109
- const param = previous
110
- ? getPreviousPageParam(options, oldPages)
111
- : getNextPageParam(options, oldPages)
112
- promise = fetchPage(oldPages, param, previous)
95
+ const pageParamFn = previous ? getPreviousPageParam : getNextPageParam
96
+ const oldData = {
97
+ pages: oldPages,
98
+ pageParams: oldPageParams,
99
+ }
100
+ const param = pageParamFn(options, oldData)
101
+
102
+ result = await fetchPage(oldData, param, previous)
113
103
  }
114
104
 
115
105
  // Refetch pages
116
106
  else {
117
- newPageParams = []
118
-
119
107
  // Fetch first page
120
- promise = fetchPage([], oldPageParams[0])
108
+ result = await fetchPage(empty, oldPageParams[0])
121
109
 
122
110
  // Fetch remaining pages
123
111
  for (let i = 1; i < oldPages.length; i++) {
124
- promise = promise.then((pages) => {
125
- const param = getNextPageParam(options, pages)
126
- return fetchPage(pages, param)
127
- })
112
+ const param = getNextPageParam(options, result)
113
+ result = await fetchPage(result, param)
128
114
  }
129
115
  }
130
116
 
131
- const finalPromise = promise.then((pages) => ({
132
- pages,
133
- pageParams: newPageParams,
134
- }))
135
-
136
- return finalPromise
117
+ return result
137
118
  }
138
119
  },
139
120
  }
@@ -141,36 +122,47 @@ export function infiniteQueryBehavior<
141
122
 
142
123
  function getNextPageParam(
143
124
  options: InfiniteQueryPageParamsOptions<any>,
144
- pages: unknown[],
125
+ { pages, pageParams }: InfiniteData<unknown>,
145
126
  ): unknown | undefined {
146
- return options.getNextPageParam(pages[pages.length - 1], pages)
127
+ const lastIndex = pages.length - 1
128
+ return options.getNextPageParam(
129
+ pages[lastIndex],
130
+ pages,
131
+ pageParams[lastIndex],
132
+ pageParams,
133
+ )
147
134
  }
148
135
 
149
136
  function getPreviousPageParam(
150
137
  options: InfiniteQueryPageParamsOptions<any>,
151
- pages: unknown[],
138
+ { pages, pageParams }: InfiniteData<unknown>,
152
139
  ): unknown | undefined {
153
- return options.getPreviousPageParam?.(pages[0], pages)
140
+ return options.getPreviousPageParam?.(
141
+ pages[0],
142
+ pages,
143
+ pageParams[0],
144
+ pageParams,
145
+ )
154
146
  }
155
147
 
156
148
  /**
157
149
  * Checks if there is a next page.
158
150
  */
159
151
  export function hasNextPage(
160
- options: InfiniteQueryPageParamsOptions<any>,
161
- pages?: unknown[],
152
+ options: InfiniteQueryPageParamsOptions<any, any>,
153
+ data?: InfiniteData<unknown>,
162
154
  ): boolean {
163
- if (!pages) return false
164
- return typeof getNextPageParam(options, pages) !== 'undefined'
155
+ if (!data) return false
156
+ return typeof getNextPageParam(options, data) !== 'undefined'
165
157
  }
166
158
 
167
159
  /**
168
160
  * Checks if there is a previous page.
169
161
  */
170
162
  export function hasPreviousPage(
171
- options: InfiniteQueryPageParamsOptions<any>,
172
- pages?: unknown[],
163
+ options: InfiniteQueryPageParamsOptions<any, any>,
164
+ data?: InfiniteData<unknown>,
173
165
  ): boolean {
174
- if (!pages || !options.getPreviousPageParam) return false
175
- return typeof getPreviousPageParam(options, pages) !== 'undefined'
166
+ if (!data || !options.getPreviousPageParam) return false
167
+ return typeof getPreviousPageParam(options, data) !== 'undefined'
176
168
  }
@@ -28,6 +28,7 @@ export class InfiniteQueryObserver<
28
28
  TData = InfiniteData<TQueryFnData>,
29
29
  TQueryData = TQueryFnData,
30
30
  TQueryKey extends QueryKey = QueryKey,
31
+ TPageParam = unknown,
31
32
  > extends QueryObserver<
32
33
  TQueryFnData,
33
34
  TError,
@@ -56,7 +57,8 @@ export class InfiniteQueryObserver<
56
57
  TError,
57
58
  TData,
58
59
  TQueryData,
59
- TQueryKey
60
+ TQueryKey,
61
+ TPageParam
60
62
  >,
61
63
  ) {
62
64
  super(client, options)
@@ -74,7 +76,8 @@ export class InfiniteQueryObserver<
74
76
  TError,
75
77
  TData,
76
78
  TQueryData,
77
- TQueryKey
79
+ TQueryKey,
80
+ TPageParam
78
81
  >,
79
82
  notifyOptions?: NotifyOptions,
80
83
  ): void {
@@ -93,7 +96,8 @@ export class InfiniteQueryObserver<
93
96
  TError,
94
97
  TData,
95
98
  TQueryData,
96
- TQueryKey
99
+ TQueryKey,
100
+ TPageParam
97
101
  >,
98
102
  ): InfiniteQueryObserverResult<TData, TError> {
99
103
  options.behavior = infiniteQueryBehavior()
@@ -104,7 +108,7 @@ export class InfiniteQueryObserver<
104
108
  }
105
109
 
106
110
  fetchNextPage(
107
- options: FetchNextPageOptions = {},
111
+ options?: FetchNextPageOptions,
108
112
  ): Promise<InfiniteQueryObserverResult<TData, TError>> {
109
113
  return this.fetch({
110
114
  ...options,
@@ -114,9 +118,9 @@ export class InfiniteQueryObserver<
114
118
  })
115
119
  }
116
120
 
117
- fetchPreviousPage({ ...options }: FetchPreviousPageOptions = {}): Promise<
118
- InfiniteQueryObserverResult<TData, TError>
119
- > {
121
+ fetchPreviousPage(
122
+ options?: FetchPreviousPageOptions,
123
+ ): Promise<InfiniteQueryObserverResult<TData, TError>> {
120
124
  return this.fetch({
121
125
  ...options,
122
126
  meta: {
@@ -132,7 +136,8 @@ export class InfiniteQueryObserver<
132
136
  TError,
133
137
  TData,
134
138
  TQueryData,
135
- TQueryKey
139
+ TQueryKey,
140
+ TPageParam
136
141
  >,
137
142
  ): InfiniteQueryObserverResult<TData, TError> {
138
143
  const { state } = query
@@ -150,8 +155,8 @@ export class InfiniteQueryObserver<
150
155
  ...result,
151
156
  fetchNextPage: this.fetchNextPage,
152
157
  fetchPreviousPage: this.fetchPreviousPage,
153
- hasNextPage: hasNextPage(options, state.data?.pages),
154
- hasPreviousPage: hasPreviousPage(options, state.data?.pages),
158
+ hasNextPage: hasNextPage(options, state.data),
159
+ hasPreviousPage: hasPreviousPage(options, state.data),
155
160
  isFetchingNextPage,
156
161
  isFetchingPreviousPage,
157
162
  isRefetching:
package/src/query.ts CHANGED
@@ -74,8 +74,10 @@ export interface QueryBehavior<
74
74
  ) => void
75
75
  }
76
76
 
77
+ export type FetchDirection = 'forward' | 'backward'
78
+
77
79
  export interface FetchMeta {
78
- fetchMore?: { direction: 'forward' | 'backward' }
80
+ fetchMore?: { direction: FetchDirection }
79
81
  }
80
82
 
81
83
  export interface FetchOptions {
@@ -120,7 +122,7 @@ interface ContinueAction {
120
122
 
121
123
  interface SetStateAction<TData, TError> {
122
124
  type: 'setState'
123
- state: QueryState<TData, TError>
125
+ state: Partial<QueryState<TData, TError>>
124
126
  setStateOptions?: SetStateOptions
125
127
  }
126
128
 
@@ -211,7 +213,7 @@ export class Query<
211
213
  }
212
214
 
213
215
  setState(
214
- state: QueryState<TData, TError>,
216
+ state: Partial<QueryState<TData, TError>>,
215
217
  setStateOptions?: SetStateOptions,
216
218
  ): void {
217
219
  this.#dispatch({ type: 'setState', state, setStateOptions })
@@ -453,7 +455,7 @@ export class Query<
453
455
 
454
456
  // Try to fetch the data
455
457
  this.#retryer = createRetryer({
456
- fn: context.fetchFn as () => TData,
458
+ fn: context.fetchFn as () => Promise<TData>,
457
459
  abort: abortController.abort.bind(abortController),
458
460
  onSuccess: (data) => {
459
461
  if (typeof data === 'undefined') {
@@ -1,17 +1,18 @@
1
1
  import { sleep } from '../utils'
2
2
  import { FocusManager } from '../focusManager'
3
3
  import { setIsServer } from './utils'
4
+ import { vi } from 'vitest'
4
5
 
5
6
  describe('focusManager', () => {
6
7
  let focusManager: FocusManager
7
8
  beforeEach(() => {
8
- jest.resetModules()
9
+ vi.resetModules()
9
10
  focusManager = new FocusManager()
10
11
  })
11
12
 
12
13
  it('should call previous remove handler when replacing an event listener', () => {
13
- const remove1Spy = jest.fn()
14
- const remove2Spy = jest.fn()
14
+ const remove1Spy = vi.fn()
15
+ const remove2Spy = vi.fn()
15
16
 
16
17
  focusManager.setEventListener(() => remove1Spy)
17
18
  focusManager.setEventListener(() => remove2Spy)
@@ -39,7 +40,7 @@ describe('focusManager', () => {
39
40
  })
40
41
 
41
42
  it('should not notify listeners on focus if already focused', async () => {
42
- const subscriptionSpy = jest.fn()
43
+ const subscriptionSpy = vi.fn()
43
44
  const unsubscribe = focusManager.subscribe(subscriptionSpy)
44
45
 
45
46
  focusManager.setFocused(true)
@@ -66,7 +67,7 @@ describe('focusManager', () => {
66
67
  test('cleanup (removeEventListener) should not be called if window is not defined', async () => {
67
68
  const restoreIsServer = setIsServer(true)
68
69
 
69
- const removeEventListenerSpy = jest.spyOn(globalThis, 'removeEventListener')
70
+ const removeEventListenerSpy = vi.spyOn(globalThis, 'removeEventListener')
70
71
 
71
72
  const unsubscribe = focusManager.subscribe(() => undefined)
72
73
 
@@ -83,7 +84,7 @@ describe('focusManager', () => {
83
84
  // @ts-expect-error
84
85
  globalThis.window.addEventListener = undefined
85
86
 
86
- const removeEventListenerSpy = jest.spyOn(globalThis, 'removeEventListener')
87
+ const removeEventListenerSpy = vi.spyOn(globalThis, 'removeEventListener')
87
88
 
88
89
  const unsubscribe = focusManager.subscribe(() => undefined)
89
90
 
@@ -95,8 +96,8 @@ describe('focusManager', () => {
95
96
  })
96
97
 
97
98
  it('should replace default window listener when a new event listener is set', async () => {
98
- const unsubscribeSpy = jest.fn().mockImplementation(() => undefined)
99
- const handlerSpy = jest.fn().mockImplementation(() => unsubscribeSpy)
99
+ const unsubscribeSpy = vi.fn().mockImplementation(() => undefined)
100
+ const handlerSpy = vi.fn().mockImplementation(() => unsubscribeSpy)
100
101
 
101
102
  focusManager.setEventListener(() => handlerSpy())
102
103
 
@@ -115,12 +116,9 @@ describe('focusManager', () => {
115
116
  })
116
117
 
117
118
  test('should call removeEventListener when last listener unsubscribes', () => {
118
- const addEventListenerSpy = jest.spyOn(
119
- globalThis.window,
120
- 'addEventListener',
121
- )
119
+ const addEventListenerSpy = vi.spyOn(globalThis.window, 'addEventListener')
122
120
 
123
- const removeEventListenerSpy = jest.spyOn(
121
+ const removeEventListenerSpy = vi.spyOn(
124
122
  globalThis.window,
125
123
  'removeEventListener',
126
124
  )
@@ -136,7 +134,7 @@ describe('focusManager', () => {
136
134
  })
137
135
 
138
136
  test('should keep setup function even if last listener unsubscribes', () => {
139
- const setupSpy = jest.fn().mockImplementation(() => () => undefined)
137
+ const setupSpy = vi.fn().mockImplementation(() => () => undefined)
140
138
 
141
139
  focusManager.setEventListener(setupSpy)
142
140
 
@@ -6,6 +6,7 @@ import {
6
6
  } from './utils'
7
7
  import { QueryCache } from '../queryCache'
8
8
  import { dehydrate, hydrate } from '../hydration'
9
+ import { vi } from 'vitest'
9
10
 
10
11
  async function fetchData<TData>(value: TData, ms?: number): Promise<TData> {
11
12
  await sleep(ms || 0)
@@ -67,7 +68,7 @@ describe('dehydration and rehydration', () => {
67
68
  key: [{ nestedKey: 1 }],
68
69
  })
69
70
 
70
- const fetchDataAfterHydration = jest.fn<unknown, unknown[]>()
71
+ const fetchDataAfterHydration = vi.fn<unknown[], unknown>()
71
72
  await hydrationClient.prefetchQuery({
72
73
  queryKey: ['string'],
73
74
  queryFn: fetchDataAfterHydration,
@@ -192,7 +193,7 @@ describe('dehydration and rehydration', () => {
192
193
  })?.state.data,
193
194
  ).toBe('string')
194
195
 
195
- const fetchDataAfterHydration = jest.fn<unknown, unknown[]>()
196
+ const fetchDataAfterHydration = vi.fn<unknown[], unknown>()
196
197
  await hydrationClient.prefetchQuery({
197
198
  queryKey: ['string', { key: ['string'], key2: 0 }],
198
199
  queryFn: fetchDataAfterHydration,
@@ -205,7 +206,7 @@ describe('dehydration and rehydration', () => {
205
206
  })
206
207
 
207
208
  test('should only hydrate successful queries by default', async () => {
208
- const consoleMock = jest.spyOn(console, 'error')
209
+ const consoleMock = vi.spyOn(console, 'error')
209
210
  consoleMock.mockImplementation(() => undefined)
210
211
 
211
212
  const queryCache = new QueryCache()
@@ -341,18 +342,18 @@ describe('dehydration and rehydration', () => {
341
342
  })
342
343
 
343
344
  test('should be able to dehydrate mutations and continue on hydration', async () => {
344
- const consoleMock = jest.spyOn(console, 'error')
345
+ const consoleMock = vi.spyOn(console, 'error')
345
346
  consoleMock.mockImplementation(() => undefined)
346
347
  const onlineMock = mockNavigatorOnLine(false)
347
348
 
348
- const serverAddTodo = jest
349
+ const serverAddTodo = vi
349
350
  .fn()
350
351
  .mockImplementation(() => Promise.reject(new Error('offline')))
351
- const serverOnMutate = jest.fn().mockImplementation((variables) => {
352
+ const serverOnMutate = vi.fn().mockImplementation((variables) => {
352
353
  const optimisticTodo = { id: 1, text: variables.text }
353
354
  return { optimisticTodo }
354
355
  })
355
- const serverOnSuccess = jest.fn()
356
+ const serverOnSuccess = vi.fn()
356
357
 
357
358
  const serverClient = createQueryClient()
358
359
 
@@ -386,14 +387,14 @@ describe('dehydration and rehydration', () => {
386
387
  const parsed = JSON.parse(stringified)
387
388
  const client = createQueryClient()
388
389
 
389
- const clientAddTodo = jest.fn().mockImplementation((variables) => {
390
+ const clientAddTodo = vi.fn().mockImplementation((variables) => {
390
391
  return { id: 2, text: variables.text }
391
392
  })
392
- const clientOnMutate = jest.fn().mockImplementation((variables) => {
393
+ const clientOnMutate = vi.fn().mockImplementation((variables) => {
393
394
  const optimisticTodo = { id: 1, text: variables.text }
394
395
  return { optimisticTodo }
395
396
  })
396
- const clientOnSuccess = jest.fn()
397
+ const clientOnSuccess = vi.fn()
397
398
 
398
399
  client.setMutationDefaults(['addTodo'], {
399
400
  mutationFn: clientAddTodo,
@@ -422,10 +423,10 @@ describe('dehydration and rehydration', () => {
422
423
  })
423
424
 
424
425
  test('should not dehydrate mutations if dehydrateMutations is set to false', async () => {
425
- const consoleMock = jest.spyOn(console, 'error')
426
+ const consoleMock = vi.spyOn(console, 'error')
426
427
  consoleMock.mockImplementation(() => undefined)
427
428
 
428
- const serverAddTodo = jest
429
+ const serverAddTodo = vi
429
430
  .fn()
430
431
  .mockImplementation(() => Promise.reject(new Error('offline')))
431
432
 
@@ -454,10 +455,10 @@ describe('dehydration and rehydration', () => {
454
455
  })
455
456
 
456
457
  test('should not dehydrate mutation if mutation state is set to pause', async () => {
457
- const consoleMock = jest.spyOn(console, 'error')
458
+ const consoleMock = vi.spyOn(console, 'error')
458
459
  consoleMock.mockImplementation(() => undefined)
459
460
 
460
- const serverAddTodo = jest
461
+ const serverAddTodo = vi
461
462
  .fn()
462
463
  .mockImplementation(() => Promise.reject(new Error('offline')))
463
464
 
@@ -1,10 +1,8 @@
1
1
  import { waitFor } from '@testing-library/react'
2
- import type {
3
- QueryClient,
4
- InfiniteQueryObserverResult,
5
- } from '@tanstack/query-core'
6
- import { InfiniteQueryObserver, CancelledError } from '@tanstack/query-core'
2
+ import type { QueryClient, InfiniteQueryObserverResult } from '..'
3
+ import { InfiniteQueryObserver, CancelledError } from '..'
7
4
  import { createQueryClient, queryKey, sleep } from './utils'
5
+ import { vi } from 'vitest'
8
6
 
9
7
  describe('InfiniteQueryBehavior', () => {
10
8
  let queryClient: QueryClient
@@ -50,7 +48,7 @@ describe('InfiniteQueryBehavior', () => {
50
48
  const key = queryKey()
51
49
  let abortSignal: AbortSignal | null = null
52
50
 
53
- const queryFnSpy = jest.fn().mockImplementation(({ pageParam, signal }) => {
51
+ const queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => {
54
52
  abortSignal = signal
55
53
  return pageParam
56
54
  })
@@ -84,6 +82,7 @@ describe('InfiniteQueryBehavior', () => {
84
82
  queryKey: key,
85
83
  pageParam: 1,
86
84
  meta: undefined,
85
+ direction: 'forward',
87
86
  signal: abortSignal,
88
87
  })
89
88
 
@@ -95,6 +94,7 @@ describe('InfiniteQueryBehavior', () => {
95
94
  expect(queryFnSpy).toHaveBeenNthCalledWith(1, {
96
95
  queryKey: key,
97
96
  pageParam: 2,
97
+ direction: 'forward',
98
98
  meta: undefined,
99
99
  signal: abortSignal,
100
100
  })
@@ -112,6 +112,7 @@ describe('InfiniteQueryBehavior', () => {
112
112
  expect(queryFnSpy).toHaveBeenNthCalledWith(1, {
113
113
  queryKey: key,
114
114
  pageParam: 0,
115
+ direction: 'backward',
115
116
  meta: undefined,
116
117
  signal: abortSignal,
117
118
  })
@@ -131,6 +132,7 @@ describe('InfiniteQueryBehavior', () => {
131
132
  queryKey: key,
132
133
  pageParam: -1,
133
134
  meta: undefined,
135
+ direction: 'backward',
134
136
  signal: abortSignal,
135
137
  })
136
138
 
@@ -148,6 +150,7 @@ describe('InfiniteQueryBehavior', () => {
148
150
  queryKey: key,
149
151
  pageParam: 1,
150
152
  meta: undefined,
153
+ direction: 'forward',
151
154
  signal: abortSignal,
152
155
  })
153
156
 
@@ -168,6 +171,7 @@ describe('InfiniteQueryBehavior', () => {
168
171
  queryKey: key,
169
172
  pageParam: 0,
170
173
  meta: undefined,
174
+ direction: 'forward',
171
175
  signal: abortSignal,
172
176
  })
173
177
 
@@ -175,6 +179,7 @@ describe('InfiniteQueryBehavior', () => {
175
179
  queryKey: key,
176
180
  pageParam: 1,
177
181
  meta: undefined,
182
+ direction: 'forward',
178
183
  signal: abortSignal,
179
184
  })
180
185
 
@@ -185,7 +190,7 @@ describe('InfiniteQueryBehavior', () => {
185
190
  const key = queryKey()
186
191
  let abortSignal: AbortSignal | null = null
187
192
 
188
- const queryFnSpy = jest.fn().mockImplementation(({ pageParam, signal }) => {
193
+ const queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => {
189
194
  abortSignal = signal
190
195
  sleep(10)
191
196
  return pageParam
@@ -226,6 +231,7 @@ describe('InfiniteQueryBehavior', () => {
226
231
  queryKey: key,
227
232
  pageParam: 1,
228
233
  meta: undefined,
234
+ direction: 'forward',
229
235
  signal: abortSignal,
230
236
  })
231
237
 
@@ -236,7 +242,7 @@ describe('InfiniteQueryBehavior', () => {
236
242
  const key = queryKey()
237
243
  let abortSignal: AbortSignal | null = null
238
244
 
239
- let queryFnSpy = jest.fn().mockImplementation(({ pageParam, signal }) => {
245
+ let queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => {
240
246
  abortSignal = signal
241
247
  return pageParam
242
248
  })
@@ -281,10 +287,11 @@ describe('InfiniteQueryBehavior', () => {
281
287
  queryKey: key,
282
288
  pageParam: 2,
283
289
  meta: undefined,
290
+ direction: 'forward',
284
291
  signal: abortSignal,
285
292
  })
286
293
 
287
- queryFnSpy = jest.fn().mockImplementation(({ pageParam = 1, signal }) => {
294
+ queryFnSpy = vi.fn().mockImplementation(({ pageParam = 1, signal }) => {
288
295
  abortSignal = signal
289
296
  sleep(10)
290
297
  return pageParam