@tanstack/react-query 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 (199) hide show
  1. package/build/lib/HydrationBoundary.d.ts +9 -0
  2. package/build/lib/{Hydrate.esm.js → HydrationBoundary.esm.js} +14 -17
  3. package/build/lib/HydrationBoundary.esm.js.map +1 -0
  4. package/build/lib/{Hydrate.js → HydrationBoundary.js} +17 -24
  5. package/build/lib/HydrationBoundary.js.map +1 -0
  6. package/build/lib/{Hydrate.mjs → HydrationBoundary.mjs} +14 -17
  7. package/build/lib/HydrationBoundary.mjs.map +1 -0
  8. package/build/lib/QueryClientProvider.d.ts +4 -19
  9. package/build/lib/QueryClientProvider.esm.js +11 -46
  10. package/build/lib/QueryClientProvider.esm.js.map +1 -1
  11. package/build/lib/QueryClientProvider.js +14 -52
  12. package/build/lib/QueryClientProvider.js.map +1 -1
  13. package/build/lib/QueryClientProvider.mjs +11 -46
  14. package/build/lib/QueryClientProvider.mjs.map +1 -1
  15. package/build/lib/QueryErrorResetBoundary.esm.js +7 -2
  16. package/build/lib/QueryErrorResetBoundary.esm.js.map +1 -1
  17. package/build/lib/QueryErrorResetBoundary.js +10 -8
  18. package/build/lib/QueryErrorResetBoundary.js.map +1 -1
  19. package/build/lib/QueryErrorResetBoundary.mjs +7 -2
  20. package/build/lib/QueryErrorResetBoundary.mjs.map +1 -1
  21. package/build/lib/__tests__/useQuery.types.test.d.ts +1 -2
  22. package/build/lib/__tests__/utils.d.ts +7 -10
  23. package/build/lib/errorBoundaryUtils.d.ts +3 -3
  24. package/build/lib/errorBoundaryUtils.esm.js +3 -3
  25. package/build/lib/errorBoundaryUtils.esm.js.map +1 -1
  26. package/build/lib/errorBoundaryUtils.js +6 -9
  27. package/build/lib/errorBoundaryUtils.js.map +1 -1
  28. package/build/lib/errorBoundaryUtils.mjs +3 -3
  29. package/build/lib/errorBoundaryUtils.mjs.map +1 -1
  30. package/build/lib/index.d.ts +4 -5
  31. package/build/lib/index.esm.js +3 -4
  32. package/build/lib/index.esm.js.map +1 -1
  33. package/build/lib/index.js +6 -9
  34. package/build/lib/index.js.map +1 -1
  35. package/build/lib/index.mjs +3 -4
  36. package/build/lib/index.mjs.map +1 -1
  37. package/build/lib/isRestoring.esm.js.map +1 -1
  38. package/build/lib/isRestoring.js +3 -6
  39. package/build/lib/isRestoring.js.map +1 -1
  40. package/build/lib/isRestoring.mjs.map +1 -1
  41. package/build/lib/suspense.esm.js +5 -5
  42. package/build/lib/suspense.esm.js.map +1 -1
  43. package/build/lib/suspense.js +5 -7
  44. package/build/lib/suspense.js.map +1 -1
  45. package/build/lib/suspense.mjs +5 -5
  46. package/build/lib/suspense.mjs.map +1 -1
  47. package/build/lib/types.d.ts +14 -22
  48. package/build/lib/useBaseQuery.d.ts +2 -2
  49. package/build/lib/useBaseQuery.esm.js +15 -18
  50. package/build/lib/useBaseQuery.esm.js.map +1 -1
  51. package/build/lib/useBaseQuery.js +18 -24
  52. package/build/lib/useBaseQuery.js.map +1 -1
  53. package/build/lib/useBaseQuery.mjs +15 -18
  54. package/build/lib/useBaseQuery.mjs.map +1 -1
  55. package/build/lib/useInfiniteQuery.d.ts +2 -4
  56. package/build/lib/useInfiniteQuery.esm.js +4 -4
  57. package/build/lib/useInfiniteQuery.esm.js.map +1 -1
  58. package/build/lib/useInfiniteQuery.js +3 -5
  59. package/build/lib/useInfiniteQuery.js.map +1 -1
  60. package/build/lib/useInfiniteQuery.mjs +4 -4
  61. package/build/lib/useInfiniteQuery.mjs.map +1 -1
  62. package/build/lib/useIsFetching.d.ts +2 -7
  63. package/build/lib/useIsFetching.esm.js +5 -9
  64. package/build/lib/useIsFetching.esm.js.map +1 -1
  65. package/build/lib/useIsFetching.js +7 -14
  66. package/build/lib/useIsFetching.js.map +1 -1
  67. package/build/lib/useIsFetching.mjs +5 -9
  68. package/build/lib/useIsFetching.mjs.map +1 -1
  69. package/build/lib/useMutation.d.ts +2 -5
  70. package/build/lib/useMutation.esm.js +12 -14
  71. package/build/lib/useMutation.esm.js.map +1 -1
  72. package/build/lib/useMutation.js +14 -19
  73. package/build/lib/useMutation.js.map +1 -1
  74. package/build/lib/useMutation.mjs +12 -14
  75. package/build/lib/useMutation.mjs.map +1 -1
  76. package/build/lib/useMutationState.d.ts +8 -0
  77. package/build/lib/useMutationState.esm.js +37 -0
  78. package/build/lib/useMutationState.esm.js.map +1 -0
  79. package/build/lib/useMutationState.js +59 -0
  80. package/build/lib/useMutationState.js.map +1 -0
  81. package/build/lib/useMutationState.mjs +37 -0
  82. package/build/lib/useMutationState.mjs.map +1 -0
  83. package/build/lib/useQueries.d.ts +9 -7
  84. package/build/lib/useQueries.esm.js +16 -27
  85. package/build/lib/useQueries.esm.js.map +1 -1
  86. package/build/lib/useQueries.js +19 -33
  87. package/build/lib/useQueries.js.map +1 -1
  88. package/build/lib/useQueries.mjs +16 -27
  89. package/build/lib/useQueries.mjs.map +1 -1
  90. package/build/lib/useQuery.d.ts +9 -21
  91. package/build/lib/useQuery.esm.js +5 -4
  92. package/build/lib/useQuery.esm.js.map +1 -1
  93. package/build/lib/useQuery.js +4 -5
  94. package/build/lib/useQuery.js.map +1 -1
  95. package/build/lib/useQuery.mjs +5 -4
  96. package/build/lib/useQuery.mjs.map +1 -1
  97. package/build/lib/utils.d.ts +1 -1
  98. package/build/lib/utils.esm.js +5 -6
  99. package/build/lib/utils.esm.js.map +1 -1
  100. package/build/lib/utils.js +5 -8
  101. package/build/lib/utils.js.map +1 -1
  102. package/build/lib/utils.mjs +5 -6
  103. package/build/lib/utils.mjs.map +1 -1
  104. package/build/umd/index.development.js +1003 -1827
  105. package/build/umd/index.development.js.map +1 -1
  106. package/build/umd/index.production.js +1 -1
  107. package/build/umd/index.production.js.map +1 -1
  108. package/package.json +6 -18
  109. package/src/{Hydrate.tsx → HydrationBoundary.tsx} +17 -18
  110. package/src/QueryClientProvider.tsx +11 -65
  111. package/src/__tests__/{Hydrate.test.tsx → HydrationBoundary.test.tsx} +89 -77
  112. package/src/__tests__/QueryClientProvider.test.tsx +33 -147
  113. package/src/__tests__/QueryResetErrorBoundary.test.tsx +118 -85
  114. package/src/__tests__/ssr-hydration.test.tsx +27 -33
  115. package/src/__tests__/ssr.test.tsx +23 -9
  116. package/src/__tests__/suspense.test.tsx +194 -171
  117. package/src/__tests__/useInfiniteQuery.test.tsx +249 -494
  118. package/src/__tests__/useInfiniteQuery.type.test.tsx +131 -0
  119. package/src/__tests__/useIsFetching.test.tsx +65 -108
  120. package/src/__tests__/useMutation.test.tsx +200 -268
  121. package/src/__tests__/useMutationState.test.tsx +284 -0
  122. package/src/__tests__/useQueries.test.tsx +43 -347
  123. package/src/__tests__/useQuery.test.tsx +890 -686
  124. package/src/__tests__/useQuery.types.test.tsx +23 -24
  125. package/src/__tests__/utils.tsx +14 -23
  126. package/src/errorBoundaryUtils.ts +5 -10
  127. package/src/index.ts +4 -7
  128. package/src/types.ts +33 -38
  129. package/src/useBaseQuery.ts +7 -7
  130. package/src/useInfiniteQuery.ts +12 -77
  131. package/src/useIsFetching.ts +8 -20
  132. package/src/useMutation.ts +8 -66
  133. package/src/useMutationState.ts +81 -0
  134. package/src/useQueries.ts +29 -21
  135. package/src/useQuery.ts +27 -104
  136. package/src/utils.ts +5 -5
  137. package/build/lib/Hydrate.d.ts +0 -10
  138. package/build/lib/Hydrate.esm.js.map +0 -1
  139. package/build/lib/Hydrate.js.map +0 -1
  140. package/build/lib/Hydrate.mjs.map +0 -1
  141. package/build/lib/reactBatchedUpdates.d.ts +0 -2
  142. package/build/lib/reactBatchedUpdates.esm.js +0 -6
  143. package/build/lib/reactBatchedUpdates.esm.js.map +0 -1
  144. package/build/lib/reactBatchedUpdates.js +0 -30
  145. package/build/lib/reactBatchedUpdates.js.map +0 -1
  146. package/build/lib/reactBatchedUpdates.mjs +0 -6
  147. package/build/lib/reactBatchedUpdates.mjs.map +0 -1
  148. package/build/lib/reactBatchedUpdates.native.d.ts +0 -2
  149. package/build/lib/reactBatchedUpdates.native.esm.js +0 -2
  150. package/build/lib/reactBatchedUpdates.native.esm.js.map +0 -1
  151. package/build/lib/reactBatchedUpdates.native.js +0 -13
  152. package/build/lib/reactBatchedUpdates.native.js.map +0 -1
  153. package/build/lib/reactBatchedUpdates.native.mjs +0 -2
  154. package/build/lib/reactBatchedUpdates.native.mjs.map +0 -1
  155. package/build/lib/setBatchUpdatesFn.esm.js +0 -5
  156. package/build/lib/setBatchUpdatesFn.esm.js.map +0 -1
  157. package/build/lib/setBatchUpdatesFn.js +0 -7
  158. package/build/lib/setBatchUpdatesFn.js.map +0 -1
  159. package/build/lib/setBatchUpdatesFn.mjs +0 -5
  160. package/build/lib/setBatchUpdatesFn.mjs.map +0 -1
  161. package/build/lib/useIsMutating.d.ts +0 -7
  162. package/build/lib/useIsMutating.esm.js +0 -16
  163. package/build/lib/useIsMutating.esm.js.map +0 -1
  164. package/build/lib/useIsMutating.js +0 -40
  165. package/build/lib/useIsMutating.js.map +0 -1
  166. package/build/lib/useIsMutating.mjs +0 -16
  167. package/build/lib/useIsMutating.mjs.map +0 -1
  168. package/build/lib/useSyncExternalStore.d.ts +0 -2
  169. package/build/lib/useSyncExternalStore.esm.js +0 -7
  170. package/build/lib/useSyncExternalStore.esm.js.map +0 -1
  171. package/build/lib/useSyncExternalStore.js +0 -11
  172. package/build/lib/useSyncExternalStore.js.map +0 -1
  173. package/build/lib/useSyncExternalStore.mjs +0 -7
  174. package/build/lib/useSyncExternalStore.mjs.map +0 -1
  175. package/build/lib/useSyncExternalStore.native.d.ts +0 -2
  176. package/build/lib/useSyncExternalStore.native.esm.js +0 -2
  177. package/build/lib/useSyncExternalStore.native.esm.js.map +0 -1
  178. package/build/lib/useSyncExternalStore.native.js +0 -13
  179. package/build/lib/useSyncExternalStore.native.js.map +0 -1
  180. package/build/lib/useSyncExternalStore.native.mjs +0 -2
  181. package/build/lib/useSyncExternalStore.native.mjs.map +0 -1
  182. package/codemods/v4/key-transformation.js +0 -138
  183. package/codemods/v4/replace-import-specifier.js +0 -25
  184. package/codemods/v4/utils/index.js +0 -166
  185. package/codemods/v4/utils/replacers/key-replacer.js +0 -160
  186. package/codemods/v4/utils/transformers/query-cache-transformer.js +0 -115
  187. package/codemods/v4/utils/transformers/query-client-transformer.js +0 -49
  188. package/codemods/v4/utils/transformers/use-query-like-transformer.js +0 -32
  189. package/codemods/v4/utils/unprocessable-key-error.js +0 -8
  190. package/src/__tests__/useIsMutating.test.tsx +0 -259
  191. package/src/reactBatchedUpdates.native.ts +0 -4
  192. package/src/reactBatchedUpdates.ts +0 -2
  193. package/src/setBatchUpdatesFn.ts +0 -4
  194. package/src/useIsMutating.ts +0 -39
  195. package/src/useSyncExternalStore.native.ts +0 -5
  196. package/src/useSyncExternalStore.ts +0 -4
  197. /package/build/lib/__tests__/{Hydrate.test.d.ts → HydrationBoundary.test.d.ts} +0 -0
  198. /package/build/lib/__tests__/{useIsMutating.test.d.ts → useInfiniteQuery.type.test.d.ts} +0 -0
  199. /package/build/lib/{setBatchUpdatesFn.d.ts → __tests__/useMutationState.test.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { fireEvent, waitFor } from '@testing-library/react'
1
+ import { fireEvent, render, waitFor } from '@testing-library/react'
2
2
  import * as React from 'react'
3
3
 
4
4
  import {
@@ -13,7 +13,7 @@ import type {
13
13
  QueryFunctionContext,
14
14
  UseInfiniteQueryResult,
15
15
  } from '..'
16
- import { QueryCache, useInfiniteQuery } from '..'
16
+ import { QueryCache, useInfiniteQuery, keepPreviousData } from '..'
17
17
 
18
18
  interface Result {
19
19
  items: number[]
@@ -45,16 +45,15 @@ describe('useInfiniteQuery', () => {
45
45
 
46
46
  it('should return the correct states for a successful query', async () => {
47
47
  const key = queryKey()
48
- const states: UseInfiniteQueryResult<number>[] = []
48
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
49
49
 
50
50
  function Page() {
51
- const state = useInfiniteQuery(
52
- key,
53
- ({ pageParam = 0 }) => Number(pageParam),
54
- {
55
- getNextPageParam: (lastPage) => lastPage + 1,
56
- },
57
- )
51
+ const state = useInfiniteQuery({
52
+ queryKey: key,
53
+ queryFn: ({ pageParam }) => Number(pageParam),
54
+ getNextPageParam: (lastPage) => lastPage + 1,
55
+ defaultPageParam: 0,
56
+ })
58
57
  states.push(state)
59
58
  return null
60
59
  }
@@ -74,8 +73,8 @@ describe('useInfiniteQuery', () => {
74
73
  errorUpdateCount: 0,
75
74
  fetchNextPage: expect.any(Function),
76
75
  fetchPreviousPage: expect.any(Function),
77
- hasNextPage: undefined,
78
- hasPreviousPage: undefined,
76
+ hasNextPage: false,
77
+ hasPreviousPage: false,
79
78
  isError: false,
80
79
  isFetched: false,
81
80
  isFetchedAfterMount: false,
@@ -84,22 +83,21 @@ describe('useInfiniteQuery', () => {
84
83
  isFetchingNextPage: false,
85
84
  isFetchingPreviousPage: false,
86
85
  isLoading: true,
86
+ isPending: true,
87
87
  isInitialLoading: true,
88
88
  isLoadingError: false,
89
89
  isPlaceholderData: false,
90
- isPreviousData: false,
91
90
  isRefetchError: false,
92
91
  isRefetching: false,
93
92
  isStale: true,
94
93
  isSuccess: false,
95
94
  refetch: expect.any(Function),
96
- remove: expect.any(Function),
97
- status: 'loading',
95
+ status: 'pending',
98
96
  fetchStatus: 'fetching',
99
97
  })
100
98
 
101
99
  expect(states[1]).toEqual({
102
- data: { pages: [0], pageParams: [undefined] },
100
+ data: { pages: [0], pageParams: [0] },
103
101
  dataUpdatedAt: expect.any(Number),
104
102
  error: null,
105
103
  errorUpdatedAt: 0,
@@ -109,7 +107,7 @@ describe('useInfiniteQuery', () => {
109
107
  fetchNextPage: expect.any(Function),
110
108
  fetchPreviousPage: expect.any(Function),
111
109
  hasNextPage: true,
112
- hasPreviousPage: undefined,
110
+ hasPreviousPage: false,
113
111
  isError: false,
114
112
  isFetched: true,
115
113
  isFetchedAfterMount: true,
@@ -118,16 +116,15 @@ describe('useInfiniteQuery', () => {
118
116
  isFetchingNextPage: false,
119
117
  isFetchingPreviousPage: false,
120
118
  isLoading: false,
119
+ isPending: false,
121
120
  isInitialLoading: false,
122
121
  isLoadingError: false,
123
122
  isPlaceholderData: false,
124
- isPreviousData: false,
125
123
  isRefetchError: false,
126
124
  isRefetching: false,
127
125
  isStale: true,
128
126
  isSuccess: true,
129
127
  refetch: expect.any(Function),
130
- remove: expect.any(Function),
131
128
  status: 'success',
132
129
  fetchStatus: 'idle',
133
130
  })
@@ -139,20 +136,19 @@ describe('useInfiniteQuery', () => {
139
136
 
140
137
  function Page() {
141
138
  const start = 1
142
- const state = useInfiniteQuery(
143
- key,
144
- async ({ pageParam = start }) => {
139
+ const state = useInfiniteQuery({
140
+ queryKey: key,
141
+ queryFn: async ({ pageParam }) => {
145
142
  if (pageParam === 2) {
146
143
  throw new Error('error')
147
144
  }
148
145
  return Number(pageParam)
149
146
  },
150
- {
151
- retry: 1,
152
- retryDelay: 10,
153
- getNextPageParam: (lastPage) => lastPage + 1,
154
- },
155
- )
147
+ retry: 1,
148
+ retryDelay: 10,
149
+ getNextPageParam: (lastPage) => lastPage + 1,
150
+ defaultPageParam: start,
151
+ })
156
152
 
157
153
  const { fetchNextPage } = state
158
154
 
@@ -174,25 +170,24 @@ describe('useInfiniteQuery', () => {
174
170
  await waitFor(() => expect(noThrow).toBe(true))
175
171
  })
176
172
 
177
- it('should keep the previous data when keepPreviousData is set', async () => {
173
+ it('should keep the previous data when placeholderData is set', async () => {
178
174
  const key = queryKey()
179
- const states: UseInfiniteQueryResult<string>[] = []
175
+ const states: UseInfiniteQueryResult<InfiniteData<string>>[] = []
180
176
 
181
177
  function Page() {
182
178
  const [order, setOrder] = React.useState('desc')
183
179
 
184
- const state = useInfiniteQuery(
185
- [key, order],
186
- async ({ pageParam = 0 }) => {
180
+ const state = useInfiniteQuery({
181
+ queryKey: [key, order],
182
+ queryFn: async ({ pageParam }) => {
187
183
  await sleep(10)
188
184
  return `${pageParam}-${order}`
189
185
  },
190
- {
191
- getNextPageParam: () => 1,
192
- keepPreviousData: true,
193
- notifyOnChangeProps: 'all',
194
- },
195
- )
186
+ getNextPageParam: () => 1,
187
+ defaultPageParam: 0,
188
+ placeholderData: keepPreviousData,
189
+ notifyOnChangeProps: 'all',
190
+ })
196
191
 
197
192
  states.push(state)
198
193
 
@@ -223,28 +218,28 @@ describe('useInfiniteQuery', () => {
223
218
  isFetching: true,
224
219
  isFetchingNextPage: false,
225
220
  isSuccess: false,
226
- isPreviousData: false,
221
+ isPlaceholderData: false,
227
222
  })
228
223
  expect(states[1]).toMatchObject({
229
224
  data: { pages: ['0-desc'] },
230
225
  isFetching: false,
231
226
  isFetchingNextPage: false,
232
227
  isSuccess: true,
233
- isPreviousData: false,
228
+ isPlaceholderData: false,
234
229
  })
235
230
  expect(states[2]).toMatchObject({
236
231
  data: { pages: ['0-desc'] },
237
232
  isFetching: true,
238
233
  isFetchingNextPage: true,
239
234
  isSuccess: true,
240
- isPreviousData: false,
235
+ isPlaceholderData: false,
241
236
  })
242
237
  expect(states[3]).toMatchObject({
243
238
  data: { pages: ['0-desc', '1-desc'] },
244
239
  isFetching: false,
245
240
  isFetchingNextPage: false,
246
241
  isSuccess: true,
247
- isPreviousData: false,
242
+ isPlaceholderData: false,
248
243
  })
249
244
  // Set state
250
245
  expect(states[4]).toMatchObject({
@@ -252,7 +247,7 @@ describe('useInfiniteQuery', () => {
252
247
  isFetching: true,
253
248
  isFetchingNextPage: false,
254
249
  isSuccess: true,
255
- isPreviousData: true,
250
+ isPlaceholderData: true,
256
251
  })
257
252
  // Hook state update
258
253
  expect(states[5]).toMatchObject({
@@ -260,27 +255,31 @@ describe('useInfiniteQuery', () => {
260
255
  isFetching: true,
261
256
  isFetchingNextPage: false,
262
257
  isSuccess: true,
263
- isPreviousData: true,
258
+ isPlaceholderData: true,
264
259
  })
265
260
  expect(states[6]).toMatchObject({
266
261
  data: { pages: ['0-asc'] },
267
262
  isFetching: false,
268
263
  isFetchingNextPage: false,
269
264
  isSuccess: true,
270
- isPreviousData: false,
265
+ isPlaceholderData: false,
271
266
  })
272
267
  })
273
268
 
274
269
  it('should be able to select a part of the data', async () => {
275
270
  const key = queryKey()
276
- const states: UseInfiniteQueryResult<string>[] = []
271
+ const states: UseInfiniteQueryResult<InfiniteData<string>>[] = []
277
272
 
278
273
  function Page() {
279
- const state = useInfiniteQuery(key, () => ({ count: 1 }), {
274
+ const state = useInfiniteQuery({
275
+ queryKey: key,
276
+ queryFn: () => ({ count: 1 }),
280
277
  select: (data) => ({
281
278
  pages: data.pages.map((x) => `count: ${x.count}`),
282
279
  pageParams: data.pageParams,
283
280
  }),
281
+ getNextPageParam: () => undefined,
282
+ defaultPageParam: 0,
284
283
  })
285
284
  states.push(state)
286
285
 
@@ -306,11 +305,15 @@ describe('useInfiniteQuery', () => {
306
305
 
307
306
  it('should be able to select a new result and not cause infinite renders', async () => {
308
307
  const key = queryKey()
309
- const states: UseInfiniteQueryResult<{ count: number; id: number }>[] = []
308
+ const states: UseInfiniteQueryResult<
309
+ InfiniteData<{ count: number; id: number }>
310
+ >[] = []
310
311
  let selectCalled = 0
311
312
 
312
313
  function Page() {
313
- const state = useInfiniteQuery(key, () => ({ count: 1 }), {
314
+ const state = useInfiniteQuery({
315
+ queryKey: key,
316
+ queryFn: () => ({ count: 1 }),
314
317
  select: React.useCallback((data: InfiniteData<{ count: number }>) => {
315
318
  selectCalled++
316
319
  return {
@@ -318,6 +321,8 @@ describe('useInfiniteQuery', () => {
318
321
  pageParams: data.pageParams,
319
322
  }
320
323
  }, []),
324
+ getNextPageParam: () => undefined,
325
+ defaultPageParam: 0,
321
326
  })
322
327
  states.push(state)
323
328
 
@@ -350,31 +355,29 @@ describe('useInfiniteQuery', () => {
350
355
 
351
356
  it('should be able to reverse the data', async () => {
352
357
  const key = queryKey()
353
- const states: UseInfiniteQueryResult<number>[] = []
358
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
354
359
 
355
360
  function Page() {
356
- const state = useInfiniteQuery(
357
- key,
358
- async ({ pageParam = 0 }) => {
361
+ const state = useInfiniteQuery({
362
+ queryKey: key,
363
+ queryFn: async ({ pageParam }) => {
359
364
  await sleep(10)
360
365
  return Number(pageParam)
361
366
  },
362
- {
363
- select: (data) => ({
364
- pages: [...data.pages].reverse(),
365
- pageParams: [...data.pageParams].reverse(),
366
- }),
367
- notifyOnChangeProps: 'all',
368
- },
369
- )
367
+ select: (data) => ({
368
+ pages: [...data.pages].reverse(),
369
+ pageParams: [...data.pageParams].reverse(),
370
+ }),
371
+ notifyOnChangeProps: 'all',
372
+ getNextPageParam: () => 1,
373
+ defaultPageParam: 0,
374
+ })
370
375
 
371
376
  states.push(state)
372
377
 
373
378
  return (
374
379
  <div>
375
- <button onClick={() => state.fetchNextPage({ pageParam: 1 })}>
376
- fetchNextPage
377
- </button>
380
+ <button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
378
381
  <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
379
382
  <div>isFetching: {state.isFetching}</div>
380
383
  </div>
@@ -409,21 +412,21 @@ describe('useInfiniteQuery', () => {
409
412
 
410
413
  it('should be able to fetch a previous page', async () => {
411
414
  const key = queryKey()
412
- const states: UseInfiniteQueryResult<number>[] = []
415
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
413
416
 
414
417
  function Page() {
415
418
  const start = 10
416
- const state = useInfiniteQuery(
417
- key,
418
- async ({ pageParam = start }) => {
419
+ const state = useInfiniteQuery({
420
+ queryKey: key,
421
+ queryFn: async ({ pageParam }) => {
419
422
  await sleep(10)
420
423
  return Number(pageParam)
421
424
  },
422
- {
423
- getPreviousPageParam: (firstPage) => firstPage - 1,
424
- notifyOnChangeProps: 'all',
425
- },
426
- )
425
+ defaultPageParam: start,
426
+ getNextPageParam: (lastPage) => lastPage + 1,
427
+ getPreviousPageParam: (firstPage) => firstPage - 1,
428
+ notifyOnChangeProps: 'all',
429
+ })
427
430
 
428
431
  states.push(state)
429
432
 
@@ -454,8 +457,8 @@ describe('useInfiniteQuery', () => {
454
457
  expect(states.length).toBe(4)
455
458
  expect(states[0]).toMatchObject({
456
459
  data: undefined,
457
- hasNextPage: undefined,
458
- hasPreviousPage: undefined,
460
+ hasNextPage: false,
461
+ hasPreviousPage: false,
459
462
  isFetching: true,
460
463
  isFetchingNextPage: false,
461
464
  isFetchingPreviousPage: false,
@@ -463,7 +466,7 @@ describe('useInfiniteQuery', () => {
463
466
  })
464
467
  expect(states[1]).toMatchObject({
465
468
  data: { pages: [10] },
466
- hasNextPage: undefined,
469
+ hasNextPage: true,
467
470
  hasPreviousPage: true,
468
471
  isFetching: false,
469
472
  isFetchingNextPage: false,
@@ -472,7 +475,7 @@ describe('useInfiniteQuery', () => {
472
475
  })
473
476
  expect(states[2]).toMatchObject({
474
477
  data: { pages: [10] },
475
- hasNextPage: undefined,
478
+ hasNextPage: true,
476
479
  hasPreviousPage: true,
477
480
  isFetching: true,
478
481
  isFetchingNextPage: false,
@@ -481,7 +484,7 @@ describe('useInfiniteQuery', () => {
481
484
  })
482
485
  expect(states[3]).toMatchObject({
483
486
  data: { pages: [9, 10] },
484
- hasNextPage: undefined,
487
+ hasNextPage: true,
485
488
  hasPreviousPage: true,
486
489
  isFetching: false,
487
490
  isFetchingNextPage: false,
@@ -490,127 +493,22 @@ describe('useInfiniteQuery', () => {
490
493
  })
491
494
  })
492
495
 
493
- it('should be able to refetch when providing page params manually', async () => {
494
- const key = queryKey()
495
- const states: UseInfiniteQueryResult<number>[] = []
496
-
497
- function Page() {
498
- const state = useInfiniteQuery(key, async ({ pageParam = 10 }) => {
499
- await sleep(10)
500
- return Number(pageParam)
501
- })
502
-
503
- states.push(state)
504
-
505
- return (
506
- <div>
507
- <button onClick={() => state.fetchNextPage({ pageParam: 11 })}>
508
- fetchNextPage
509
- </button>
510
- <button onClick={() => state.fetchPreviousPage({ pageParam: 9 })}>
511
- fetchPreviousPage
512
- </button>
513
- <button onClick={() => state.refetch()}>refetch</button>
514
- <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
515
- <div>isFetching: {String(state.isFetching)}</div>
516
- </div>
517
- )
518
- }
519
-
520
- const rendered = renderWithClient(queryClient, <Page />)
521
-
522
- await waitFor(() => rendered.getByText('data: 10'))
523
- fireEvent.click(rendered.getByRole('button', { name: /fetchNextPage/i }))
524
-
525
- await waitFor(() => rendered.getByText('data: 10,11'))
526
- fireEvent.click(
527
- rendered.getByRole('button', { name: /fetchPreviousPage/i }),
528
- )
529
- await waitFor(() => rendered.getByText('data: 9,10,11'))
530
- fireEvent.click(rendered.getByRole('button', { name: /refetch/i }))
531
-
532
- await waitFor(() => rendered.getByText('isFetching: false'))
533
- await waitFor(() => expect(states.length).toBe(8))
534
-
535
- // Initial fetch
536
- expect(states[0]).toMatchObject({
537
- data: undefined,
538
- isFetching: true,
539
- isFetchingNextPage: false,
540
- isRefetching: false,
541
- })
542
- // Initial fetch done
543
- expect(states[1]).toMatchObject({
544
- data: { pages: [10] },
545
- isFetching: false,
546
- isFetchingNextPage: false,
547
- isRefetching: false,
548
- })
549
- // Fetch next page
550
- expect(states[2]).toMatchObject({
551
- data: { pages: [10] },
552
- isFetching: true,
553
- isFetchingNextPage: true,
554
- isRefetching: false,
555
- })
556
- // Fetch next page done
557
- expect(states[3]).toMatchObject({
558
- data: { pages: [10, 11] },
559
- isFetching: false,
560
- isFetchingNextPage: false,
561
- isRefetching: false,
562
- })
563
- // Fetch previous page
564
- expect(states[4]).toMatchObject({
565
- data: { pages: [10, 11] },
566
- isFetching: true,
567
- isFetchingNextPage: false,
568
- isFetchingPreviousPage: true,
569
- isRefetching: false,
570
- })
571
- // Fetch previous page done
572
- expect(states[5]).toMatchObject({
573
- data: { pages: [9, 10, 11] },
574
- isFetching: false,
575
- isFetchingNextPage: false,
576
- isFetchingPreviousPage: false,
577
- isRefetching: false,
578
- })
579
- // Refetch
580
- expect(states[6]).toMatchObject({
581
- data: { pages: [9, 10, 11] },
582
- isFetching: true,
583
- isFetchingNextPage: false,
584
- isFetchingPreviousPage: false,
585
- isRefetching: true,
586
- })
587
- // Refetch done
588
- expect(states[7]).toMatchObject({
589
- data: { pages: [9, 10, 11] },
590
- isFetching: false,
591
- isFetchingNextPage: false,
592
- isFetchingPreviousPage: false,
593
- isRefetching: false,
594
- })
595
- })
596
-
597
496
  it('should be able to refetch when providing page params automatically', async () => {
598
497
  const key = queryKey()
599
- const states: UseInfiniteQueryResult<number>[] = []
498
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
600
499
 
601
500
  function Page() {
602
- const state = useInfiniteQuery(
603
- key,
604
- async ({ pageParam = 10 }) => {
501
+ const state = useInfiniteQuery({
502
+ queryKey: key,
503
+ queryFn: async ({ pageParam }) => {
605
504
  await sleep(10)
606
505
  return Number(pageParam)
607
506
  },
608
- {
609
- getPreviousPageParam: (firstPage) => firstPage - 1,
610
- getNextPageParam: (lastPage) => lastPage + 1,
611
- notifyOnChangeProps: 'all',
612
- },
613
- )
507
+ defaultPageParam: 10,
508
+ getPreviousPageParam: (firstPage) => firstPage - 1,
509
+ getNextPageParam: (lastPage) => lastPage + 1,
510
+ notifyOnChangeProps: 'all',
511
+ })
614
512
 
615
513
  states.push(state)
616
514
 
@@ -704,112 +602,22 @@ describe('useInfiniteQuery', () => {
704
602
  })
705
603
  })
706
604
 
707
- it('should be able to refetch only specific pages when refetchPages is provided', async () => {
708
- const key = queryKey()
709
- const states: UseInfiniteQueryResult<number>[] = []
710
-
711
- function Page() {
712
- const multiplier = React.useRef(1)
713
- const state = useInfiniteQuery(
714
- key,
715
- async ({ pageParam = 10 }) => {
716
- await sleep(10)
717
- return Number(pageParam) * multiplier.current
718
- },
719
- {
720
- getNextPageParam: (lastPage) => lastPage + 1,
721
- notifyOnChangeProps: 'all',
722
- },
723
- )
724
-
725
- states.push(state)
726
-
727
- return (
728
- <div>
729
- <button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
730
- <button
731
- onClick={() => {
732
- multiplier.current = 2
733
- state.refetch({
734
- refetchPage: (_, index) => index === 0,
735
- })
736
- }}
737
- >
738
- refetchPage
739
- </button>
740
- <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
741
- <div>isFetching: {String(state.isFetching)}</div>
742
- </div>
743
- )
744
- }
745
-
746
- const rendered = renderWithClient(queryClient, <Page />)
747
-
748
- await waitFor(() => rendered.getByText('data: 10'))
749
- fireEvent.click(rendered.getByRole('button', { name: /fetchNextPage/i }))
750
-
751
- await waitFor(() => rendered.getByText('data: 10,11'))
752
- fireEvent.click(rendered.getByRole('button', { name: /refetchPage/i }))
753
-
754
- await waitFor(() => rendered.getByText('data: 20,11'))
755
- await waitFor(() => rendered.getByText('isFetching: false'))
756
- await waitFor(() => expect(states.length).toBe(6))
757
-
758
- // Initial fetch
759
- expect(states[0]).toMatchObject({
760
- data: undefined,
761
- isFetching: true,
762
- isFetchingNextPage: false,
763
- })
764
- // Initial fetch done
765
- expect(states[1]).toMatchObject({
766
- data: { pages: [10] },
767
- isFetching: false,
768
- isFetchingNextPage: false,
769
- })
770
- // Fetch next page
771
- expect(states[2]).toMatchObject({
772
- data: { pages: [10] },
773
- isFetching: true,
774
- isFetchingNextPage: true,
775
- })
776
- // Fetch next page done
777
- expect(states[3]).toMatchObject({
778
- data: { pages: [10, 11] },
779
- isFetching: false,
780
- isFetchingNextPage: false,
781
- })
782
- // Refetch
783
- expect(states[4]).toMatchObject({
784
- data: { pages: [10, 11] },
785
- isFetching: true,
786
- isFetchingNextPage: false,
787
- })
788
- // Refetch done, only page one has been refetched and multiplied
789
- expect(states[5]).toMatchObject({
790
- data: { pages: [20, 11] },
791
- isFetching: false,
792
- isFetchingNextPage: false,
793
- })
794
- })
795
-
796
605
  it('should silently cancel any ongoing fetch when fetching more', async () => {
797
606
  const key = queryKey()
798
- const states: UseInfiniteQueryResult<number>[] = []
607
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
799
608
 
800
609
  function Page() {
801
610
  const start = 10
802
- const state = useInfiniteQuery(
803
- key,
804
- async ({ pageParam = start }) => {
611
+ const state = useInfiniteQuery({
612
+ queryKey: key,
613
+ queryFn: async ({ pageParam }) => {
805
614
  await sleep(50)
806
615
  return Number(pageParam)
807
616
  },
808
- {
809
- getNextPageParam: (lastPage) => lastPage + 1,
810
- notifyOnChangeProps: 'all',
811
- },
812
- )
617
+ defaultPageParam: start,
618
+ getNextPageParam: (lastPage) => lastPage + 1,
619
+ notifyOnChangeProps: 'all',
620
+ })
813
621
 
814
622
  states.push(state)
815
623
 
@@ -833,7 +641,7 @@ describe('useInfiniteQuery', () => {
833
641
 
834
642
  expect(states.length).toBe(5)
835
643
  expect(states[0]).toMatchObject({
836
- hasNextPage: undefined,
644
+ hasNextPage: false,
837
645
  data: undefined,
838
646
  isFetching: true,
839
647
  isFetchingNextPage: false,
@@ -877,21 +685,22 @@ describe('useInfiniteQuery', () => {
877
685
  const fetchPage = jest.fn<
878
686
  Promise<number>,
879
687
  [QueryFunctionContext<typeof key, number>]
880
- >(async ({ pageParam = start, signal }) => {
881
- if (signal) {
882
- const onAbort = jest.fn()
883
- const abortListener = jest.fn()
884
- onAborts.push(onAbort)
885
- abortListeners.push(abortListener)
886
- signal.onabort = onAbort
887
- signal.addEventListener('abort', abortListener)
888
- }
688
+ >(async ({ pageParam, signal }) => {
689
+ const onAbort = jest.fn()
690
+ const abortListener = jest.fn()
691
+ onAborts.push(onAbort)
692
+ abortListeners.push(abortListener)
693
+ signal.onabort = onAbort
694
+ signal.addEventListener('abort', abortListener)
889
695
  await sleep(50)
890
696
  return Number(pageParam)
891
697
  })
892
698
 
893
699
  function Page() {
894
- const { fetchNextPage } = useInfiniteQuery(key, fetchPage, {
700
+ const { fetchNextPage } = useInfiniteQuery({
701
+ queryKey: key,
702
+ queryFn: fetchPage,
703
+ defaultPageParam: start,
895
704
  getNextPageParam: (lastPage) => lastPage + 1,
896
705
  })
897
706
 
@@ -918,10 +727,10 @@ describe('useInfiniteQuery', () => {
918
727
 
919
728
  let callIndex = 0
920
729
  const firstCtx = fetchPage.mock.calls[callIndex]![0]
921
- expect(firstCtx.pageParam).toBeUndefined()
730
+ expect(firstCtx.pageParam).toEqual(start)
922
731
  expect(firstCtx.queryKey).toEqual(key)
923
732
  expect(firstCtx.signal).toBeInstanceOf(AbortSignal)
924
- expect(firstCtx.signal?.aborted).toBe(false)
733
+ expect(firstCtx.signal.aborted).toBe(false)
925
734
  expect(onAborts[callIndex]).not.toHaveBeenCalled()
926
735
  expect(abortListeners[callIndex]).not.toHaveBeenCalled()
927
736
 
@@ -930,7 +739,7 @@ describe('useInfiniteQuery', () => {
930
739
  expect(secondCtx.pageParam).toBe(11)
931
740
  expect(secondCtx.queryKey).toEqual(key)
932
741
  expect(secondCtx.signal).toBeInstanceOf(AbortSignal)
933
- expect(secondCtx.signal?.aborted).toBe(true)
742
+ expect(secondCtx.signal.aborted).toBe(true)
934
743
  expect(onAborts[callIndex]).toHaveBeenCalledTimes(1)
935
744
  expect(abortListeners[callIndex]).toHaveBeenCalledTimes(1)
936
745
 
@@ -939,7 +748,7 @@ describe('useInfiniteQuery', () => {
939
748
  expect(thirdCtx.pageParam).toBe(11)
940
749
  expect(thirdCtx.queryKey).toEqual(key)
941
750
  expect(thirdCtx.signal).toBeInstanceOf(AbortSignal)
942
- expect(thirdCtx.signal?.aborted).toBe(false)
751
+ expect(thirdCtx.signal.aborted).toBe(false)
943
752
  expect(onAborts[callIndex]).not.toHaveBeenCalled()
944
753
  expect(abortListeners[callIndex]).not.toHaveBeenCalled()
945
754
  })
@@ -952,21 +761,23 @@ describe('useInfiniteQuery', () => {
952
761
  const fetchPage = jest.fn<
953
762
  Promise<number>,
954
763
  [QueryFunctionContext<typeof key, number>]
955
- >(async ({ pageParam = start, signal }) => {
956
- if (signal) {
957
- const onAbort = jest.fn()
958
- const abortListener = jest.fn()
959
- onAborts.push(onAbort)
960
- abortListeners.push(abortListener)
961
- signal.onabort = onAbort
962
- signal.addEventListener('abort', abortListener)
963
- }
764
+ >(async ({ pageParam, signal }) => {
765
+ const onAbort = jest.fn()
766
+ const abortListener = jest.fn()
767
+ onAborts.push(onAbort)
768
+ abortListeners.push(abortListener)
769
+ signal.onabort = onAbort
770
+ signal.addEventListener('abort', abortListener)
771
+
964
772
  await sleep(50)
965
773
  return Number(pageParam)
966
774
  })
967
775
 
968
776
  function Page() {
969
- const { fetchNextPage } = useInfiniteQuery(key, fetchPage, {
777
+ const { fetchNextPage } = useInfiniteQuery({
778
+ queryKey: key,
779
+ queryFn: fetchPage,
780
+ defaultPageParam: start,
970
781
  getNextPageParam: (lastPage) => lastPage + 1,
971
782
  })
972
783
 
@@ -993,10 +804,10 @@ describe('useInfiniteQuery', () => {
993
804
 
994
805
  let callIndex = 0
995
806
  const firstCtx = fetchPage.mock.calls[callIndex]![0]
996
- expect(firstCtx.pageParam).toBeUndefined()
807
+ expect(firstCtx.pageParam).toEqual(start)
997
808
  expect(firstCtx.queryKey).toEqual(key)
998
809
  expect(firstCtx.signal).toBeInstanceOf(AbortSignal)
999
- expect(firstCtx.signal?.aborted).toBe(false)
810
+ expect(firstCtx.signal.aborted).toBe(false)
1000
811
  expect(onAborts[callIndex]).not.toHaveBeenCalled()
1001
812
  expect(abortListeners[callIndex]).not.toHaveBeenCalled()
1002
813
 
@@ -1005,28 +816,27 @@ describe('useInfiniteQuery', () => {
1005
816
  expect(secondCtx.pageParam).toBe(11)
1006
817
  expect(secondCtx.queryKey).toEqual(key)
1007
818
  expect(secondCtx.signal).toBeInstanceOf(AbortSignal)
1008
- expect(secondCtx.signal?.aborted).toBe(false)
819
+ expect(secondCtx.signal.aborted).toBe(false)
1009
820
  expect(onAborts[callIndex]).not.toHaveBeenCalled()
1010
821
  expect(abortListeners[callIndex]).not.toHaveBeenCalled()
1011
822
  })
1012
823
 
1013
824
  it('should keep fetching first page when not loaded yet and triggering fetch more', async () => {
1014
825
  const key = queryKey()
1015
- const states: UseInfiniteQueryResult<number>[] = []
826
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
1016
827
 
1017
828
  function Page() {
1018
829
  const start = 10
1019
- const state = useInfiniteQuery(
1020
- key,
1021
- async ({ pageParam = start }) => {
830
+ const state = useInfiniteQuery({
831
+ queryKey: key,
832
+ queryFn: async ({ pageParam }) => {
1022
833
  await sleep(50)
1023
834
  return Number(pageParam)
1024
835
  },
1025
- {
1026
- getNextPageParam: (lastPage) => lastPage + 1,
1027
- notifyOnChangeProps: 'all',
1028
- },
1029
- )
836
+ defaultPageParam: start,
837
+ getNextPageParam: (lastPage) => lastPage + 1,
838
+ notifyOnChangeProps: 'all',
839
+ })
1030
840
 
1031
841
  states.push(state)
1032
842
 
@@ -1047,7 +857,7 @@ describe('useInfiniteQuery', () => {
1047
857
 
1048
858
  expect(states.length).toBe(2)
1049
859
  expect(states[0]).toMatchObject({
1050
- hasNextPage: undefined,
860
+ hasNextPage: false,
1051
861
  data: undefined,
1052
862
  isFetching: true,
1053
863
  isFetchingNextPage: false,
@@ -1069,20 +879,19 @@ describe('useInfiniteQuery', () => {
1069
879
  const initialData = { pages: [1, 2, 3, 4], pageParams: [0, 1, 2, 3] }
1070
880
 
1071
881
  function List() {
1072
- useInfiniteQuery(
1073
- key,
1074
- async ({ pageParam = 0, signal: _ }) => {
882
+ useInfiniteQuery({
883
+ queryKey: key,
884
+ queryFn: async ({ pageParam, signal: _ }) => {
1075
885
  fetches++
1076
886
  await sleep(50)
1077
887
  return Number(pageParam) * 10
1078
888
  },
1079
- {
1080
- initialData,
1081
- getNextPageParam: (_, allPages) => {
1082
- return allPages.length === 4 ? undefined : allPages.length
1083
- },
889
+ initialData,
890
+ defaultPageParam: 0,
891
+ getNextPageParam: (_, allPages) => {
892
+ return allPages.length === 4 ? undefined : allPages.length
1084
893
  },
1085
- )
894
+ })
1086
895
 
1087
896
  return null
1088
897
  }
@@ -1111,100 +920,23 @@ describe('useInfiniteQuery', () => {
1111
920
  })
1112
921
  })
1113
922
 
1114
- it('should be able to override the cursor in the fetchNextPage callback', async () => {
1115
- const key = queryKey()
1116
- const states: UseInfiniteQueryResult<number>[] = []
1117
-
1118
- function Page() {
1119
- const state = useInfiniteQuery(
1120
- key,
1121
- async ({ pageParam = 0 }) => {
1122
- await sleep(10)
1123
- return Number(pageParam)
1124
- },
1125
- {
1126
- getNextPageParam: (lastPage) => lastPage + 1,
1127
- notifyOnChangeProps: 'all',
1128
- },
1129
- )
1130
-
1131
- states.push(state)
1132
-
1133
- return (
1134
- <div>
1135
- <div>page0: {state.data?.pages[0]}</div>
1136
- <div>page1: {state.data?.pages[1]}</div>
1137
- <button onClick={() => state.fetchNextPage({ pageParam: 5 })}>
1138
- Fetch next page
1139
- </button>
1140
- </div>
1141
- )
1142
- }
1143
-
1144
- const rendered = renderWithClient(queryClient, <Page />)
1145
-
1146
- await waitFor(() => {
1147
- rendered.getByText('page0: 0')
1148
- })
1149
-
1150
- fireEvent.click(rendered.getByRole('button', { name: 'Fetch next page' }))
1151
-
1152
- await waitFor(() => {
1153
- rendered.getByText('page1: 5')
1154
- })
1155
-
1156
- // make sure no additional renders are happening after fetching next page
1157
- await sleep(20)
1158
-
1159
- expect(states.length).toBe(4)
1160
- expect(states[0]).toMatchObject({
1161
- hasNextPage: undefined,
1162
- data: undefined,
1163
- isFetching: true,
1164
- isFetchingNextPage: false,
1165
- isSuccess: false,
1166
- })
1167
- expect(states[1]).toMatchObject({
1168
- hasNextPage: true,
1169
- data: { pages: [0] },
1170
- isFetching: false,
1171
- isFetchingNextPage: false,
1172
- isSuccess: true,
1173
- })
1174
- expect(states[2]).toMatchObject({
1175
- hasNextPage: true,
1176
- data: { pages: [0] },
1177
- isFetching: true,
1178
- isFetchingNextPage: true,
1179
- isSuccess: true,
1180
- })
1181
- expect(states[3]).toMatchObject({
1182
- hasNextPage: true,
1183
- data: { pages: [0, 5] },
1184
- isFetching: false,
1185
- isFetchingNextPage: false,
1186
- isSuccess: true,
1187
- })
1188
- })
1189
-
1190
923
  it('should be able to set new pages with the query client', async () => {
1191
924
  const key = queryKey()
1192
- const states: UseInfiniteQueryResult<number>[] = []
925
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
1193
926
 
1194
927
  function Page() {
1195
928
  const [firstPage, setFirstPage] = React.useState(0)
1196
929
 
1197
- const state = useInfiniteQuery(
1198
- key,
1199
- async ({ pageParam = firstPage }) => {
930
+ const state = useInfiniteQuery({
931
+ queryKey: key,
932
+ queryFn: async ({ pageParam }) => {
1200
933
  await sleep(10)
1201
934
  return Number(pageParam)
1202
935
  },
1203
- {
1204
- getNextPageParam: (lastPage) => lastPage + 1,
1205
- notifyOnChangeProps: 'all',
1206
- },
1207
- )
936
+ getNextPageParam: (lastPage) => lastPage + 1,
937
+ defaultPageParam: firstPage,
938
+ notifyOnChangeProps: 'all',
939
+ })
1208
940
 
1209
941
  states.push(state)
1210
942
 
@@ -1230,7 +962,7 @@ describe('useInfiniteQuery', () => {
1230
962
 
1231
963
  expect(states.length).toBe(5)
1232
964
  expect(states[0]).toMatchObject({
1233
- hasNextPage: undefined,
965
+ hasNextPage: false,
1234
966
  data: undefined,
1235
967
  isFetching: true,
1236
968
  isFetchingNextPage: false,
@@ -1272,21 +1004,20 @@ describe('useInfiniteQuery', () => {
1272
1004
 
1273
1005
  it('should only refetch the first page when initialData is provided', async () => {
1274
1006
  const key = queryKey()
1275
- const states: UseInfiniteQueryResult<number>[] = []
1007
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
1276
1008
 
1277
1009
  function Page() {
1278
- const state = useInfiniteQuery(
1279
- key,
1280
- async ({ pageParam }): Promise<number> => {
1010
+ const state = useInfiniteQuery({
1011
+ queryKey: key,
1012
+ queryFn: async ({ pageParam }): Promise<number> => {
1281
1013
  await sleep(10)
1282
1014
  return pageParam
1283
1015
  },
1284
- {
1285
- initialData: { pages: [1], pageParams: [1] },
1286
- getNextPageParam: (lastPage) => lastPage + 1,
1287
- notifyOnChangeProps: 'all',
1288
- },
1289
- )
1016
+ initialData: { pages: [1], pageParams: [1] },
1017
+ getNextPageParam: (lastPage) => lastPage + 1,
1018
+ defaultPageParam: 0,
1019
+ notifyOnChangeProps: 'all',
1020
+ })
1290
1021
 
1291
1022
  states.push(state)
1292
1023
 
@@ -1338,16 +1069,15 @@ describe('useInfiniteQuery', () => {
1338
1069
 
1339
1070
  it('should set hasNextPage to false if getNextPageParam returns undefined', async () => {
1340
1071
  const key = queryKey()
1341
- const states: UseInfiniteQueryResult<number>[] = []
1072
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
1342
1073
 
1343
1074
  function Page() {
1344
- const state = useInfiniteQuery(
1345
- key,
1346
- ({ pageParam = 1 }) => Number(pageParam),
1347
- {
1348
- getNextPageParam: () => undefined,
1349
- },
1350
- )
1075
+ const state = useInfiniteQuery({
1076
+ queryKey: key,
1077
+ queryFn: ({ pageParam }) => Number(pageParam),
1078
+ getNextPageParam: () => undefined,
1079
+ defaultPageParam: 1,
1080
+ })
1351
1081
 
1352
1082
  states.push(state)
1353
1083
 
@@ -1361,7 +1091,7 @@ describe('useInfiniteQuery', () => {
1361
1091
  expect(states.length).toBe(2)
1362
1092
  expect(states[0]).toMatchObject({
1363
1093
  data: undefined,
1364
- hasNextPage: undefined,
1094
+ hasNextPage: false,
1365
1095
  isFetching: true,
1366
1096
  isFetchingNextPage: false,
1367
1097
  isSuccess: false,
@@ -1377,17 +1107,16 @@ describe('useInfiniteQuery', () => {
1377
1107
 
1378
1108
  it('should compute hasNextPage correctly using initialData', async () => {
1379
1109
  const key = queryKey()
1380
- const states: UseInfiniteQueryResult<number>[] = []
1110
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
1381
1111
 
1382
1112
  function Page() {
1383
- const state = useInfiniteQuery(
1384
- key,
1385
- ({ pageParam = 10 }): number => pageParam,
1386
- {
1387
- initialData: { pages: [10], pageParams: [undefined] },
1388
- getNextPageParam: (lastPage) => (lastPage === 10 ? 11 : undefined),
1389
- },
1390
- )
1113
+ const state = useInfiniteQuery({
1114
+ queryKey: key,
1115
+ queryFn: ({ pageParam }): number => pageParam,
1116
+ initialData: { pages: [10], pageParams: [10] },
1117
+ getNextPageParam: (lastPage) => (lastPage === 10 ? 11 : undefined),
1118
+ defaultPageParam: 10,
1119
+ })
1391
1120
 
1392
1121
  states.push(state)
1393
1122
 
@@ -1417,17 +1146,16 @@ describe('useInfiniteQuery', () => {
1417
1146
 
1418
1147
  it('should compute hasNextPage correctly for falsy getFetchMore return value using initialData', async () => {
1419
1148
  const key = queryKey()
1420
- const states: UseInfiniteQueryResult<number>[] = []
1149
+ const states: UseInfiniteQueryResult<InfiniteData<number>>[] = []
1421
1150
 
1422
1151
  function Page() {
1423
- const state = useInfiniteQuery(
1424
- key,
1425
- ({ pageParam = 10 }): number => pageParam,
1426
- {
1427
- initialData: { pages: [10], pageParams: [undefined] },
1428
- getNextPageParam: () => undefined,
1429
- },
1430
- )
1152
+ const state = useInfiniteQuery({
1153
+ queryKey: key,
1154
+ queryFn: ({ pageParam }): number => pageParam,
1155
+ defaultPageParam: 10,
1156
+ initialData: { pages: [10], pageParams: [10] },
1157
+ getNextPageParam: () => undefined,
1158
+ })
1431
1159
 
1432
1160
  states.push(state)
1433
1161
 
@@ -1457,20 +1185,19 @@ describe('useInfiniteQuery', () => {
1457
1185
 
1458
1186
  it('should not use selected data when computing hasNextPage', async () => {
1459
1187
  const key = queryKey()
1460
- const states: UseInfiniteQueryResult<string>[] = []
1188
+ const states: UseInfiniteQueryResult<InfiniteData<string>>[] = []
1461
1189
 
1462
1190
  function Page() {
1463
- const state = useInfiniteQuery(
1464
- key,
1465
- ({ pageParam = 1 }) => Number(pageParam),
1466
- {
1467
- getNextPageParam: (lastPage) => (lastPage === 1 ? 2 : false),
1468
- select: (data) => ({
1469
- pages: data.pages.map((x) => x.toString()),
1470
- pageParams: data.pageParams,
1471
- }),
1472
- },
1473
- )
1191
+ const state = useInfiniteQuery({
1192
+ queryKey: key,
1193
+ queryFn: ({ pageParam }) => Number(pageParam),
1194
+ getNextPageParam: (lastPage) => (lastPage === 1 ? 2 : undefined),
1195
+ select: (data) => ({
1196
+ pages: data.pages.map((x) => x.toString()),
1197
+ pageParams: data.pageParams,
1198
+ }),
1199
+ defaultPageParam: 1,
1200
+ })
1474
1201
 
1475
1202
  states.push(state)
1476
1203
 
@@ -1484,7 +1211,7 @@ describe('useInfiniteQuery', () => {
1484
1211
  expect(states.length).toBe(2)
1485
1212
  expect(states[0]).toMatchObject({
1486
1213
  data: undefined,
1487
- hasNextPage: undefined,
1214
+ hasNextPage: false,
1488
1215
  isFetching: true,
1489
1216
  isFetchingNextPage: false,
1490
1217
  isSuccess: false,
@@ -1525,19 +1252,18 @@ describe('useInfiniteQuery', () => {
1525
1252
  fetchNextPage,
1526
1253
  hasNextPage,
1527
1254
  refetch,
1528
- } = useInfiniteQuery<Result, Error>(
1529
- key,
1530
- ({ pageParam = 0 }) =>
1255
+ } = useInfiniteQuery({
1256
+ queryKey: key,
1257
+ queryFn: ({ pageParam }) =>
1531
1258
  fetchItemsWithLimit(pageParam, fetchCountRef.current++),
1532
- {
1533
- getNextPageParam: (lastPage) => lastPage.nextId,
1534
- },
1535
- )
1259
+ defaultPageParam: 0,
1260
+ getNextPageParam: (lastPage) => lastPage.nextId,
1261
+ })
1536
1262
 
1537
1263
  return (
1538
1264
  <div>
1539
1265
  <h1>Pagination</h1>
1540
- {status === 'loading' ? (
1266
+ {status === 'pending' ? (
1541
1267
  'Loading...'
1542
1268
  ) : status === 'error' ? (
1543
1269
  <span>Error: {error.message}</span>
@@ -1559,7 +1285,7 @@ describe('useInfiniteQuery', () => {
1559
1285
  <div>
1560
1286
  <button
1561
1287
  onClick={() => fetchNextPage()}
1562
- disabled={!hasNextPage || Boolean(isFetchingNextPage)}
1288
+ disabled={!hasNextPage || isFetchingNextPage}
1563
1289
  >
1564
1290
  {isFetchingNextPage
1565
1291
  ? 'Loading more...'
@@ -1574,7 +1300,7 @@ describe('useInfiniteQuery', () => {
1574
1300
  // makes an actual network request
1575
1301
  // and calls invalidateQueries in an onSuccess
1576
1302
  items.splice(4, 1)
1577
- queryClient.invalidateQueries(key)
1303
+ queryClient.invalidateQueries({ queryKey: key })
1578
1304
  }}
1579
1305
  >
1580
1306
  Remove item
@@ -1651,23 +1377,22 @@ describe('useInfiniteQuery', () => {
1651
1377
  fetchNextPage,
1652
1378
  hasNextPage,
1653
1379
  refetch,
1654
- } = useInfiniteQuery<Result, Error>(
1655
- key,
1656
- ({ pageParam = 0 }) =>
1380
+ } = useInfiniteQuery({
1381
+ queryKey: key,
1382
+ queryFn: ({ pageParam }) =>
1657
1383
  fetchItems(
1658
1384
  pageParam,
1659
1385
  fetchCountRef.current++,
1660
1386
  pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage),
1661
1387
  ),
1662
- {
1663
- getNextPageParam: (lastPage) => lastPage.nextId,
1664
- },
1665
- )
1388
+ getNextPageParam: (lastPage) => lastPage.nextId,
1389
+ defaultPageParam: 0,
1390
+ })
1666
1391
 
1667
1392
  return (
1668
1393
  <div>
1669
1394
  <h1>Pagination</h1>
1670
- {status === 'loading' ? (
1395
+ {status === 'pending' ? (
1671
1396
  'Loading...'
1672
1397
  ) : status === 'error' ? (
1673
1398
  <span>Error: {error.message}</span>
@@ -1689,7 +1414,7 @@ describe('useInfiniteQuery', () => {
1689
1414
  <div>
1690
1415
  <button
1691
1416
  onClick={() => fetchNextPage()}
1692
- disabled={!hasNextPage || Boolean(isFetchingNextPage)}
1417
+ disabled={!hasNextPage || isFetchingNextPage}
1693
1418
  >
1694
1419
  {isFetchingNextPage
1695
1420
  ? 'Loading more...'
@@ -1779,7 +1504,12 @@ describe('useInfiniteQuery', () => {
1779
1504
  }
1780
1505
 
1781
1506
  function Inner() {
1782
- const state = useInfiniteQuery(key, queryFn)
1507
+ const state = useInfiniteQuery({
1508
+ queryKey: key,
1509
+ queryFn,
1510
+ getNextPageParam: () => undefined,
1511
+ defaultPageParam: 0,
1512
+ })
1783
1513
  return (
1784
1514
  <div>
1785
1515
  <h1>Status: {state.status}</h1>
@@ -1809,4 +1539,29 @@ describe('useInfiniteQuery', () => {
1809
1539
 
1810
1540
  expect(cancelFn).toHaveBeenCalled()
1811
1541
  })
1542
+
1543
+ it('should use provided custom queryClient', async () => {
1544
+ const key = queryKey()
1545
+ const queryFn = async () => {
1546
+ return Promise.resolve('custom client')
1547
+ }
1548
+
1549
+ function Page() {
1550
+ const { data } = useInfiniteQuery(
1551
+ {
1552
+ queryKey: key,
1553
+ queryFn,
1554
+ getNextPageParam: () => undefined,
1555
+ defaultPageParam: 0,
1556
+ },
1557
+ queryClient,
1558
+ )
1559
+
1560
+ return <div>data: {data?.pages[0]}</div>
1561
+ }
1562
+
1563
+ const rendered = render(<Page></Page>)
1564
+
1565
+ await waitFor(() => rendered.getByText('data: custom client'))
1566
+ })
1812
1567
  })