@tanstack/solid-query 4.24.9 → 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 (158) hide show
  1. package/build/cjs/index.js +298 -0
  2. package/build/cjs/index.js.map +1 -0
  3. package/build/esm/index.js +283 -0
  4. package/build/esm/index.js.map +1 -0
  5. package/build/source/QueryClientProvider.jsx +21 -0
  6. package/build/source/__tests__/QueryClientProvider.test.jsx +120 -0
  7. package/build/{solid → source}/__tests__/createInfiniteQuery.test.jsx +228 -372
  8. package/build/{solid → source}/__tests__/createMutation.test.jsx +174 -165
  9. package/build/{solid → source}/__tests__/createQueries.test.jsx +86 -367
  10. package/build/{solid → source}/__tests__/createQuery.test.jsx +991 -943
  11. package/build/{solid → source}/__tests__/createQuery.types.test.jsx +35 -24
  12. package/build/{solid → source}/__tests__/suspense.test.jsx +177 -148
  13. package/build/{solid → source}/__tests__/transition.test.jsx +7 -4
  14. package/build/{solid → source}/__tests__/useIsFetching.test.jsx +68 -85
  15. package/build/{solid → source}/__tests__/useIsMutating.test.jsx +78 -93
  16. package/build/{solid → source}/__tests__/utils.jsx +3 -9
  17. package/build/source/createBaseQuery.js +147 -0
  18. package/build/source/createInfiniteQuery.js +6 -0
  19. package/build/{solid → source}/createMutation.js +7 -9
  20. package/build/source/createQueries.js +32 -0
  21. package/build/source/createQuery.js +6 -0
  22. package/build/{solid → source}/index.js +5 -3
  23. package/build/source/setBatchUpdatesFn.js +3 -0
  24. package/build/source/useIsFetching.js +12 -0
  25. package/build/source/useIsMutating.js +12 -0
  26. package/build/source/utils.js +7 -0
  27. package/build/types/QueryClientProvider.d.ts +9 -0
  28. package/build/{lib → types}/__tests__/utils.d.ts +3 -8
  29. package/build/types/createBaseQuery.d.ts +4 -0
  30. package/build/types/createInfiniteQuery.d.ts +3 -0
  31. package/build/types/createMutation.d.ts +3 -0
  32. package/build/{lib → types}/createQueries.d.ts +10 -8
  33. package/build/types/createQuery.d.ts +11 -0
  34. package/build/{lib → types}/index.d.ts +4 -3
  35. package/build/types/setBatchUpdatesFn.d.ts +1 -0
  36. package/build/types/types.d.ts +33 -0
  37. package/build/types/useIsFetching.d.ts +8 -0
  38. package/build/types/useIsMutating.d.ts +8 -0
  39. package/build/types/utils.d.ts +1 -0
  40. package/build/umd/index.js +2 -0
  41. package/build/umd/index.js.map +1 -0
  42. package/package.json +25 -17
  43. package/src/QueryClientProvider.tsx +17 -86
  44. package/src/__tests__/QueryClientProvider.test.tsx +37 -140
  45. package/src/__tests__/createInfiniteQuery.test.tsx +277 -508
  46. package/src/__tests__/createMutation.test.tsx +177 -225
  47. package/src/__tests__/createQueries.test.tsx +180 -528
  48. package/src/__tests__/createQuery.test.tsx +970 -1200
  49. package/src/__tests__/createQuery.types.test.tsx +30 -25
  50. package/src/__tests__/suspense.test.tsx +141 -178
  51. package/src/__tests__/transition.test.tsx +7 -4
  52. package/src/__tests__/useIsFetching.test.tsx +77 -122
  53. package/src/__tests__/useIsMutating.test.tsx +83 -128
  54. package/src/__tests__/utils.tsx +4 -11
  55. package/src/createBaseQuery.ts +148 -60
  56. package/src/createInfiniteQuery.ts +15 -94
  57. package/src/createMutation.ts +9 -63
  58. package/src/createQueries.ts +44 -55
  59. package/src/createQuery.ts +42 -127
  60. package/src/index.ts +6 -3
  61. package/src/setBatchUpdatesFn.ts +4 -0
  62. package/src/types.ts +81 -75
  63. package/src/useIsFetching.ts +12 -44
  64. package/src/useIsMutating.ts +13 -29
  65. package/src/utils.ts +5 -79
  66. package/build/lib/QueryClientProvider.d.ts +0 -24
  67. package/build/lib/QueryClientProvider.esm.js +0 -74
  68. package/build/lib/QueryClientProvider.esm.js.map +0 -1
  69. package/build/lib/QueryClientProvider.js +0 -80
  70. package/build/lib/QueryClientProvider.js.map +0 -1
  71. package/build/lib/QueryClientProvider.mjs +0 -74
  72. package/build/lib/QueryClientProvider.mjs.map +0 -1
  73. package/build/lib/createBaseQuery.d.ts +0 -4
  74. package/build/lib/createBaseQuery.esm.js +0 -93
  75. package/build/lib/createBaseQuery.esm.js.map +0 -1
  76. package/build/lib/createBaseQuery.js +0 -97
  77. package/build/lib/createBaseQuery.js.map +0 -1
  78. package/build/lib/createBaseQuery.mjs +0 -93
  79. package/build/lib/createBaseQuery.mjs.map +0 -1
  80. package/build/lib/createInfiniteQuery.d.ts +0 -5
  81. package/build/lib/createInfiniteQuery.esm.js +0 -20
  82. package/build/lib/createInfiniteQuery.esm.js.map +0 -1
  83. package/build/lib/createInfiniteQuery.js +0 -24
  84. package/build/lib/createInfiniteQuery.js.map +0 -1
  85. package/build/lib/createInfiniteQuery.mjs +0 -20
  86. package/build/lib/createInfiniteQuery.mjs.map +0 -1
  87. package/build/lib/createMutation.d.ts +0 -6
  88. package/build/lib/createMutation.esm.js +0 -45
  89. package/build/lib/createMutation.esm.js.map +0 -1
  90. package/build/lib/createMutation.js +0 -49
  91. package/build/lib/createMutation.js.map +0 -1
  92. package/build/lib/createMutation.mjs +0 -45
  93. package/build/lib/createMutation.mjs.map +0 -1
  94. package/build/lib/createQueries.esm.js +0 -54
  95. package/build/lib/createQueries.esm.js.map +0 -1
  96. package/build/lib/createQueries.js +0 -58
  97. package/build/lib/createQueries.js.map +0 -1
  98. package/build/lib/createQueries.mjs +0 -54
  99. package/build/lib/createQueries.mjs.map +0 -1
  100. package/build/lib/createQuery.d.ts +0 -23
  101. package/build/lib/createQuery.esm.js +0 -25
  102. package/build/lib/createQuery.esm.js.map +0 -1
  103. package/build/lib/createQuery.js +0 -29
  104. package/build/lib/createQuery.js.map +0 -1
  105. package/build/lib/createQuery.mjs +0 -25
  106. package/build/lib/createQuery.mjs.map +0 -1
  107. package/build/lib/index.esm.js +0 -9
  108. package/build/lib/index.esm.js.map +0 -1
  109. package/build/lib/index.js +0 -31
  110. package/build/lib/index.js.map +0 -1
  111. package/build/lib/index.mjs +0 -9
  112. package/build/lib/index.mjs.map +0 -1
  113. package/build/lib/types.d.ts +0 -47
  114. package/build/lib/useIsFetching.d.ts +0 -7
  115. package/build/lib/useIsFetching.esm.js +0 -29
  116. package/build/lib/useIsFetching.esm.js.map +0 -1
  117. package/build/lib/useIsFetching.js +0 -33
  118. package/build/lib/useIsFetching.js.map +0 -1
  119. package/build/lib/useIsFetching.mjs +0 -29
  120. package/build/lib/useIsFetching.mjs.map +0 -1
  121. package/build/lib/useIsMutating.d.ts +0 -8
  122. package/build/lib/useIsMutating.esm.js +0 -22
  123. package/build/lib/useIsMutating.esm.js.map +0 -1
  124. package/build/lib/useIsMutating.js +0 -26
  125. package/build/lib/useIsMutating.js.map +0 -1
  126. package/build/lib/useIsMutating.mjs +0 -22
  127. package/build/lib/useIsMutating.mjs.map +0 -1
  128. package/build/lib/utils.d.ts +0 -14
  129. package/build/lib/utils.esm.js +0 -63
  130. package/build/lib/utils.esm.js.map +0 -1
  131. package/build/lib/utils.js +0 -72
  132. package/build/lib/utils.js.map +0 -1
  133. package/build/lib/utils.mjs +0 -63
  134. package/build/lib/utils.mjs.map +0 -1
  135. package/build/solid/QueryClientProvider.jsx +0 -49
  136. package/build/solid/__tests__/QueryClientProvider.test.jsx +0 -185
  137. package/build/solid/createBaseQuery.js +0 -81
  138. package/build/solid/createInfiniteQuery.js +0 -16
  139. package/build/solid/createQueries.js +0 -39
  140. package/build/solid/createQuery.js +0 -16
  141. package/build/solid/useIsFetching.js +0 -23
  142. package/build/solid/useIsMutating.js +0 -16
  143. package/build/solid/utils.js +0 -45
  144. package/build/umd/index.development.js +0 -3572
  145. package/build/umd/index.development.js.map +0 -1
  146. package/build/umd/index.production.js +0 -2
  147. package/build/umd/index.production.js.map +0 -1
  148. /package/build/{solid → source}/types.js +0 -0
  149. /package/build/{lib → types}/__tests__/QueryClientProvider.test.d.ts +0 -0
  150. /package/build/{lib → types}/__tests__/createInfiniteQuery.test.d.ts +0 -0
  151. /package/build/{lib → types}/__tests__/createMutation.test.d.ts +0 -0
  152. /package/build/{lib → types}/__tests__/createQueries.test.d.ts +0 -0
  153. /package/build/{lib → types}/__tests__/createQuery.test.d.ts +0 -0
  154. /package/build/{lib → types}/__tests__/createQuery.types.test.d.ts +0 -0
  155. /package/build/{lib → types}/__tests__/suspense.test.d.ts +0 -0
  156. /package/build/{lib → types}/__tests__/transition.test.d.ts +0 -0
  157. /package/build/{lib → types}/__tests__/useIsFetching.test.d.ts +0 -0
  158. /package/build/{lib → types}/__tests__/useIsMutating.test.d.ts +0 -0
@@ -16,7 +16,12 @@ import type {
16
16
  InfiniteData,
17
17
  QueryFunctionContext,
18
18
  } from '..'
19
- import { createInfiniteQuery, QueryCache, QueryClientProvider } from '..'
19
+ import {
20
+ createInfiniteQuery,
21
+ QueryCache,
22
+ QueryClientProvider,
23
+ keepPreviousData,
24
+ } from '..'
20
25
  import { Blink, queryKey, setActTimeout } from './utils'
21
26
 
22
27
  interface Result {
@@ -49,16 +54,15 @@ describe('useInfiniteQuery', () => {
49
54
 
50
55
  it('should return the correct states for a successful query', async () => {
51
56
  const key = queryKey()
52
- const states: CreateInfiniteQueryResult<number>[] = []
57
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
53
58
 
54
59
  function Page() {
55
- const state = createInfiniteQuery(
56
- key,
57
- ({ pageParam = 0 }) => Number(pageParam),
58
- {
59
- getNextPageParam: (lastPage) => lastPage + 1,
60
- },
61
- )
60
+ const state = createInfiniteQuery(() => ({
61
+ queryKey: key,
62
+ queryFn: ({ pageParam }) => Number(pageParam),
63
+ getNextPageParam: (lastPage) => lastPage + 1,
64
+ defaultPageParam: 0,
65
+ }))
62
66
  createRenderEffect(() => {
63
67
  states.push({ ...state })
64
68
  })
@@ -84,8 +88,8 @@ describe('useInfiniteQuery', () => {
84
88
  errorUpdateCount: 0,
85
89
  fetchNextPage: expect.any(Function),
86
90
  fetchPreviousPage: expect.any(Function),
87
- hasNextPage: undefined,
88
- hasPreviousPage: undefined,
91
+ hasNextPage: false,
92
+ hasPreviousPage: false,
89
93
  isError: false,
90
94
  isFetched: false,
91
95
  isFetchedAfterMount: false,
@@ -93,23 +97,22 @@ describe('useInfiniteQuery', () => {
93
97
  isPaused: false,
94
98
  isFetchingNextPage: false,
95
99
  isFetchingPreviousPage: false,
100
+ isPending: true,
96
101
  isLoading: true,
97
102
  isInitialLoading: true,
98
103
  isLoadingError: false,
99
104
  isPlaceholderData: false,
100
- isPreviousData: false,
101
105
  isRefetchError: false,
102
106
  isRefetching: false,
103
107
  isStale: true,
104
108
  isSuccess: false,
105
109
  refetch: expect.any(Function),
106
- remove: expect.any(Function),
107
- status: 'loading',
110
+ status: 'pending',
108
111
  fetchStatus: 'fetching',
109
112
  })
110
113
 
111
114
  expect(states[1]).toEqual({
112
- data: { pages: [0], pageParams: [undefined] },
115
+ data: { pages: [0], pageParams: [0] },
113
116
  dataUpdatedAt: expect.any(Number),
114
117
  error: null,
115
118
  errorUpdatedAt: 0,
@@ -119,7 +122,7 @@ describe('useInfiniteQuery', () => {
119
122
  fetchNextPage: expect.any(Function),
120
123
  fetchPreviousPage: expect.any(Function),
121
124
  hasNextPage: true,
122
- hasPreviousPage: undefined,
125
+ hasPreviousPage: false,
123
126
  isError: false,
124
127
  isFetched: true,
125
128
  isFetchedAfterMount: true,
@@ -127,17 +130,16 @@ describe('useInfiniteQuery', () => {
127
130
  isPaused: false,
128
131
  isFetchingNextPage: false,
129
132
  isFetchingPreviousPage: false,
133
+ isPending: false,
130
134
  isLoading: false,
131
135
  isInitialLoading: false,
132
136
  isLoadingError: false,
133
137
  isPlaceholderData: false,
134
- isPreviousData: false,
135
138
  isRefetchError: false,
136
139
  isRefetching: false,
137
140
  isStale: true,
138
141
  isSuccess: true,
139
142
  refetch: expect.any(Function),
140
- remove: expect.any(Function),
141
143
  status: 'success',
142
144
  fetchStatus: 'idle',
143
145
  })
@@ -149,20 +151,20 @@ describe('useInfiniteQuery', () => {
149
151
 
150
152
  function Page() {
151
153
  const start = 1
152
- const state = createInfiniteQuery(
153
- key,
154
- async ({ pageParam = start }) => {
154
+ const state = createInfiniteQuery(() => ({
155
+ queryKey: key,
156
+ queryFn: async ({ pageParam }) => {
155
157
  if (pageParam === 2) {
156
158
  throw new Error('error')
157
159
  }
158
160
  return Number(pageParam)
159
161
  },
160
- {
161
- retry: 1,
162
- retryDelay: 10,
163
- getNextPageParam: (lastPage) => lastPage + 1,
164
- },
165
- )
162
+
163
+ retry: 1,
164
+ retryDelay: 10,
165
+ defaultPageParam: start,
166
+ getNextPageParam: (lastPage) => lastPage + 1,
167
+ }))
166
168
 
167
169
  createEffect(() => {
168
170
  const fetchNextPage = state.fetchNextPage
@@ -187,25 +189,25 @@ describe('useInfiniteQuery', () => {
187
189
  await waitFor(() => expect(noThrow).toBe(true))
188
190
  })
189
191
 
190
- it('should keep the previous data when keepPreviousData is set', async () => {
192
+ it('should keep the previous data when placeholderData is set', async () => {
191
193
  const key = queryKey()
192
- const states: CreateInfiniteQueryResult<string>[] = []
194
+ const states: CreateInfiniteQueryResult<InfiniteData<string>>[] = []
193
195
 
194
196
  function Page() {
195
197
  const [order, setOrder] = createSignal('desc')
196
198
 
197
- const state = createInfiniteQuery(
198
- () => [key(), order()],
199
- async ({ pageParam = 0 }) => {
199
+ const state = createInfiniteQuery(() => ({
200
+ queryKey: [key, order()],
201
+ queryFn: async ({ pageParam }) => {
200
202
  await sleep(10)
201
203
  return `${pageParam}-${order()}`
202
204
  },
203
- {
204
- getNextPageParam: () => 1,
205
- keepPreviousData: true,
206
- notifyOnChangeProps: 'all',
207
- },
208
- )
205
+
206
+ getNextPageParam: () => 1,
207
+ defaultPageParam: 0,
208
+ placeholderData: keepPreviousData,
209
+ notifyOnChangeProps: 'all',
210
+ }))
209
211
 
210
212
  createRenderEffect(() => {
211
213
  states.push({ ...state })
@@ -242,28 +244,28 @@ describe('useInfiniteQuery', () => {
242
244
  isFetching: true,
243
245
  isFetchingNextPage: false,
244
246
  isSuccess: false,
245
- isPreviousData: false,
247
+ isPlaceholderData: false,
246
248
  })
247
249
  expect(states[1]).toMatchObject({
248
250
  data: { pages: ['0-desc'] },
249
251
  isFetching: false,
250
252
  isFetchingNextPage: false,
251
253
  isSuccess: true,
252
- isPreviousData: false,
254
+ isPlaceholderData: false,
253
255
  })
254
256
  expect(states[2]).toMatchObject({
255
257
  data: { pages: ['0-desc'] },
256
258
  isFetching: true,
257
259
  isFetchingNextPage: true,
258
260
  isSuccess: true,
259
- isPreviousData: false,
261
+ isPlaceholderData: false,
260
262
  })
261
263
  expect(states[3]).toMatchObject({
262
264
  data: { pages: ['0-desc', '1-desc'] },
263
265
  isFetching: false,
264
266
  isFetchingNextPage: false,
265
267
  isSuccess: true,
266
- isPreviousData: false,
268
+ isPlaceholderData: false,
267
269
  })
268
270
  // Set state
269
271
  expect(states[4]).toMatchObject({
@@ -271,28 +273,32 @@ describe('useInfiniteQuery', () => {
271
273
  isFetching: true,
272
274
  isFetchingNextPage: false,
273
275
  isSuccess: true,
274
- isPreviousData: true,
276
+ isPlaceholderData: true,
275
277
  })
276
278
  expect(states[5]).toMatchObject({
277
279
  data: { pages: ['0-asc'] },
278
280
  isFetching: false,
279
281
  isFetchingNextPage: false,
280
282
  isSuccess: true,
281
- isPreviousData: false,
283
+ isPlaceholderData: false,
282
284
  })
283
285
  })
284
286
 
285
287
  it('should be able to select a part of the data', async () => {
286
288
  const key = queryKey()
287
- const states: CreateInfiniteQueryResult<string>[] = []
289
+ const states: CreateInfiniteQueryResult<InfiniteData<string>>[] = []
288
290
 
289
291
  function Page() {
290
- const state = createInfiniteQuery(key, () => ({ count: 1 }), {
292
+ const state = createInfiniteQuery(() => ({
293
+ queryKey: key,
294
+ queryFn: () => ({ count: 1 }),
291
295
  select: (data) => ({
292
296
  pages: data.pages.map((x) => `count: ${x.count}`),
293
297
  pageParams: data.pageParams,
294
298
  }),
295
- })
299
+ getNextPageParam: () => undefined,
300
+ defaultPageParam: 0,
301
+ }))
296
302
  createRenderEffect(() => {
297
303
  states.push({ ...state })
298
304
  })
@@ -320,12 +326,15 @@ describe('useInfiniteQuery', () => {
320
326
 
321
327
  it('should be able to select a new result and not cause infinite renders', async () => {
322
328
  const key = queryKey()
323
- const states: CreateInfiniteQueryResult<{ count: number; id: number }>[] =
324
- []
329
+ const states: CreateInfiniteQueryResult<
330
+ InfiniteData<{ count: number; id: number }>
331
+ >[] = []
325
332
  let selectCalled = 0
326
333
 
327
334
  function Page() {
328
- const state = createInfiniteQuery(key, () => ({ count: 1 }), {
335
+ const state = createInfiniteQuery(() => ({
336
+ queryKey: key,
337
+ queryFn: () => ({ count: 1 }),
329
338
  select: (data: InfiniteData<{ count: number }>) => {
330
339
  selectCalled++
331
340
  return {
@@ -333,7 +342,9 @@ describe('useInfiniteQuery', () => {
333
342
  pageParams: data.pageParams,
334
343
  }
335
344
  },
336
- })
345
+ getNextPageParam: () => undefined,
346
+ defaultPageParam: 0,
347
+ }))
337
348
  createRenderEffect(() => {
338
349
  states.push({ ...state })
339
350
  })
@@ -362,23 +373,24 @@ describe('useInfiniteQuery', () => {
362
373
 
363
374
  it('should be able to reverse the data', async () => {
364
375
  const key = queryKey()
365
- const states: CreateInfiniteQueryResult<number>[] = []
376
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
366
377
 
367
378
  function Page() {
368
- const state = createInfiniteQuery(
369
- key,
370
- async ({ pageParam = 0 }) => {
379
+ const state = createInfiniteQuery(() => ({
380
+ queryKey: key,
381
+ queryFn: async ({ pageParam }) => {
371
382
  await sleep(10)
372
383
  return Number(pageParam)
373
384
  },
374
- {
375
- select: (data) => ({
376
- pages: [...data.pages].reverse(),
377
- pageParams: [...data.pageParams].reverse(),
378
- }),
379
- notifyOnChangeProps: 'all',
380
- },
381
- )
385
+
386
+ select: (data) => ({
387
+ pages: [...data.pages].reverse(),
388
+ pageParams: [...data.pageParams].reverse(),
389
+ }),
390
+ notifyOnChangeProps: 'all',
391
+ getNextPageParam: () => 1,
392
+ defaultPageParam: 0,
393
+ }))
382
394
 
383
395
  createRenderEffect(() => {
384
396
  states.push({ ...state })
@@ -386,9 +398,7 @@ describe('useInfiniteQuery', () => {
386
398
 
387
399
  return (
388
400
  <div>
389
- <button onClick={() => state.fetchNextPage({ pageParam: 1 })}>
390
- fetchNextPage
391
- </button>
401
+ <button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
392
402
  <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
393
403
  <div>isFetching: {state.isFetching}</div>
394
404
  </div>
@@ -427,21 +437,21 @@ describe('useInfiniteQuery', () => {
427
437
 
428
438
  it('should be able to fetch a previous page', async () => {
429
439
  const key = queryKey()
430
- const states: CreateInfiniteQueryResult<number>[] = []
440
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
431
441
 
432
442
  function Page() {
433
443
  const start = 10
434
- const state = createInfiniteQuery(
435
- key,
436
- async ({ pageParam = start }) => {
444
+ const state = createInfiniteQuery(() => ({
445
+ queryKey: key,
446
+ queryFn: async ({ pageParam }) => {
437
447
  await sleep(10)
438
448
  return Number(pageParam)
439
449
  },
440
- {
441
- getPreviousPageParam: (firstPage) => firstPage - 1,
442
- notifyOnChangeProps: 'all',
443
- },
444
- )
450
+ getNextPageParam: (lastPage) => lastPage + 1,
451
+ getPreviousPageParam: (firstPage) => firstPage - 1,
452
+ defaultPageParam: start,
453
+ notifyOnChangeProps: 'all',
454
+ }))
445
455
 
446
456
  createRenderEffect(() => {
447
457
  states.push({ ...state })
@@ -468,8 +478,8 @@ describe('useInfiniteQuery', () => {
468
478
  expect(states.length).toBe(4)
469
479
  expect(states[0]).toMatchObject({
470
480
  data: undefined,
471
- hasNextPage: undefined,
472
- hasPreviousPage: undefined,
481
+ hasNextPage: false,
482
+ hasPreviousPage: false,
473
483
  isFetching: true,
474
484
  isFetchingNextPage: false,
475
485
  isFetchingPreviousPage: false,
@@ -477,7 +487,7 @@ describe('useInfiniteQuery', () => {
477
487
  })
478
488
  expect(states[1]).toMatchObject({
479
489
  data: { pages: [10] },
480
- hasNextPage: undefined,
490
+ hasNextPage: true,
481
491
  hasPreviousPage: true,
482
492
  isFetching: false,
483
493
  isFetchingNextPage: false,
@@ -486,7 +496,7 @@ describe('useInfiniteQuery', () => {
486
496
  })
487
497
  expect(states[2]).toMatchObject({
488
498
  data: { pages: [10] },
489
- hasNextPage: undefined,
499
+ hasNextPage: true,
490
500
  hasPreviousPage: true,
491
501
  isFetching: true,
492
502
  isFetchingNextPage: false,
@@ -495,7 +505,7 @@ describe('useInfiniteQuery', () => {
495
505
  })
496
506
  expect(states[3]).toMatchObject({
497
507
  data: { pages: [9, 10] },
498
- hasNextPage: undefined,
508
+ hasNextPage: true,
499
509
  hasPreviousPage: true,
500
510
  isFetching: false,
501
511
  isFetchingNextPage: false,
@@ -504,131 +514,23 @@ describe('useInfiniteQuery', () => {
504
514
  })
505
515
  })
506
516
 
507
- it('should be able to refetch when providing page params manually', async () => {
508
- const key = queryKey()
509
- const states: CreateInfiniteQueryResult<number>[] = []
510
-
511
- function Page() {
512
- const state = createInfiniteQuery(key, async ({ pageParam = 10 }) => {
513
- await sleep(10)
514
- return Number(pageParam)
515
- })
516
-
517
- createRenderEffect(() => {
518
- states.push({ ...state })
519
- })
520
-
521
- return (
522
- <div>
523
- <button onClick={() => state.fetchNextPage({ pageParam: 11 })}>
524
- fetchNextPage
525
- </button>
526
- <button onClick={() => state.fetchPreviousPage({ pageParam: 9 })}>
527
- fetchPreviousPage
528
- </button>
529
- <button onClick={() => state.refetch()}>refetch</button>
530
- <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
531
- <div>isFetching: {String(state.isFetching)}</div>
532
- </div>
533
- )
534
- }
535
-
536
- render(() => (
537
- <QueryClientProvider client={queryClient}>
538
- <Page />
539
- </QueryClientProvider>
540
- ))
541
-
542
- await waitFor(() => screen.getByText('data: 10'))
543
- fireEvent.click(screen.getByRole('button', { name: /fetchNextPage/i }))
544
-
545
- await waitFor(() => screen.getByText('data: 10,11'))
546
- fireEvent.click(screen.getByRole('button', { name: /fetchPreviousPage/i }))
547
- await waitFor(() => screen.getByText('data: 9,10,11'))
548
- fireEvent.click(screen.getByRole('button', { name: /refetch/i }))
549
-
550
- await waitFor(() => screen.getByText('isFetching: false'))
551
- await waitFor(() => expect(states.length).toBe(8))
552
-
553
- // Initial fetch
554
- expect(states[0]).toMatchObject({
555
- data: undefined,
556
- isFetching: true,
557
- isFetchingNextPage: false,
558
- isRefetching: false,
559
- })
560
- // Initial fetch done
561
- expect(states[1]).toMatchObject({
562
- data: { pages: [10] },
563
- isFetching: false,
564
- isFetchingNextPage: false,
565
- isRefetching: false,
566
- })
567
- // Fetch next page
568
- expect(states[2]).toMatchObject({
569
- data: { pages: [10] },
570
- isFetching: true,
571
- isFetchingNextPage: true,
572
- isRefetching: false,
573
- })
574
- // Fetch next page done
575
- expect(states[3]).toMatchObject({
576
- data: { pages: [10, 11] },
577
- isFetching: false,
578
- isFetchingNextPage: false,
579
- isRefetching: false,
580
- })
581
- // Fetch previous page
582
- expect(states[4]).toMatchObject({
583
- data: { pages: [10, 11] },
584
- isFetching: true,
585
- isFetchingNextPage: false,
586
- isFetchingPreviousPage: true,
587
- isRefetching: false,
588
- })
589
- // Fetch previous page done
590
- expect(states[5]).toMatchObject({
591
- data: { pages: [9, 10, 11] },
592
- isFetching: false,
593
- isFetchingNextPage: false,
594
- isFetchingPreviousPage: false,
595
- isRefetching: false,
596
- })
597
- // Refetch
598
- expect(states[6]).toMatchObject({
599
- data: { pages: [9, 10, 11] },
600
- isFetching: true,
601
- isFetchingNextPage: false,
602
- isFetchingPreviousPage: false,
603
- isRefetching: true,
604
- })
605
- // Refetch done
606
- expect(states[7]).toMatchObject({
607
- data: { pages: [9, 10, 11] },
608
- isFetching: false,
609
- isFetchingNextPage: false,
610
- isFetchingPreviousPage: false,
611
- isRefetching: false,
612
- })
613
- })
614
-
615
517
  it('should be able to refetch when providing page params automatically', async () => {
616
518
  const key = queryKey()
617
- const states: CreateInfiniteQueryResult<number>[] = []
519
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
618
520
 
619
521
  function Page() {
620
- const state = createInfiniteQuery(
621
- key,
622
- async ({ pageParam = 10 }) => {
522
+ const state = createInfiniteQuery(() => ({
523
+ queryKey: key,
524
+ queryFn: async ({ pageParam }) => {
623
525
  await sleep(10)
624
526
  return Number(pageParam)
625
527
  },
626
- {
627
- getPreviousPageParam: (firstPage) => firstPage - 1,
628
- getNextPageParam: (lastPage) => lastPage + 1,
629
- notifyOnChangeProps: 'all',
630
- },
631
- )
528
+
529
+ getPreviousPageParam: (firstPage) => firstPage - 1,
530
+ getNextPageParam: (lastPage) => lastPage + 1,
531
+ defaultPageParam: 10,
532
+ notifyOnChangeProps: 'all',
533
+ }))
632
534
 
633
535
  createRenderEffect(() => {
634
536
  states.push({ ...state })
@@ -726,118 +628,23 @@ describe('useInfiniteQuery', () => {
726
628
  })
727
629
  })
728
630
 
729
- it('should be able to refetch only specific pages when refetchPages is provided', async () => {
730
- const key = queryKey()
731
- const states: CreateInfiniteQueryResult<number>[] = []
732
-
733
- function Page() {
734
- let multiplier = 1
735
- const state = createInfiniteQuery(
736
- key,
737
- async ({ pageParam = 10 }) => {
738
- await sleep(10)
739
- return Number(pageParam) * multiplier
740
- },
741
- {
742
- getNextPageParam: (lastPage) => lastPage + 1,
743
- notifyOnChangeProps: 'all',
744
- },
745
- )
746
-
747
- createRenderEffect(() => {
748
- states.push({ ...state })
749
- })
750
-
751
- return (
752
- <div>
753
- <button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
754
- <button
755
- onClick={() => {
756
- multiplier = 2
757
- state.refetch({
758
- refetchPage: (_, index) => index === 0,
759
- })
760
- }}
761
- >
762
- refetchPage
763
- </button>
764
- <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
765
- <div>isFetching: {String(state.isFetching)}</div>
766
- </div>
767
- )
768
- }
769
-
770
- render(() => (
771
- <QueryClientProvider client={queryClient}>
772
- <Page />
773
- </QueryClientProvider>
774
- ))
775
-
776
- await waitFor(() => screen.getByText('data: 10'))
777
- fireEvent.click(screen.getByRole('button', { name: /fetchNextPage/i }))
778
-
779
- await waitFor(() => screen.getByText('data: 10,11'))
780
- fireEvent.click(screen.getByRole('button', { name: /refetchPage/i }))
781
-
782
- await waitFor(() => screen.getByText('data: 20,11'))
783
- await waitFor(() => screen.getByText('isFetching: false'))
784
- await waitFor(() => expect(states.length).toBe(6))
785
-
786
- // Initial fetch
787
- expect(states[0]).toMatchObject({
788
- data: undefined,
789
- isFetching: true,
790
- isFetchingNextPage: false,
791
- })
792
- // Initial fetch done
793
- expect(states[1]).toMatchObject({
794
- data: { pages: [10] },
795
- isFetching: false,
796
- isFetchingNextPage: false,
797
- })
798
- // Fetch next page
799
- expect(states[2]).toMatchObject({
800
- data: { pages: [10] },
801
- isFetching: true,
802
- isFetchingNextPage: true,
803
- })
804
- // Fetch next page done
805
- expect(states[3]).toMatchObject({
806
- data: { pages: [10, 11] },
807
- isFetching: false,
808
- isFetchingNextPage: false,
809
- })
810
- // Refetch
811
- expect(states[4]).toMatchObject({
812
- data: { pages: [10, 11] },
813
- isFetching: true,
814
- isFetchingNextPage: false,
815
- })
816
- // Refetch done, only page one has been refetched and multiplied
817
- expect(states[5]).toMatchObject({
818
- data: { pages: [20, 11] },
819
- isFetching: false,
820
- isFetchingNextPage: false,
821
- })
822
- })
823
-
824
631
  it('should silently cancel any ongoing fetch when fetching more', async () => {
825
632
  const key = queryKey()
826
- const states: CreateInfiniteQueryResult<number>[] = []
633
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
827
634
 
828
635
  function Page() {
829
636
  const start = 10
830
- const state = createInfiniteQuery(
831
- key,
832
- async ({ pageParam = start }) => {
637
+ const state = createInfiniteQuery(() => ({
638
+ queryKey: key,
639
+ queryFn: async ({ pageParam }) => {
833
640
  await sleep(50)
834
641
  return Number(pageParam)
835
642
  },
836
- {
837
- getNextPageParam: (lastPage) => lastPage + 1,
838
- notifyOnChangeProps: 'all',
839
- },
840
- )
643
+
644
+ getNextPageParam: (lastPage) => lastPage + 1,
645
+ defaultPageParam: start,
646
+ notifyOnChangeProps: 'all',
647
+ }))
841
648
 
842
649
  createRenderEffect(() => {
843
650
  states.push({ ...state })
@@ -866,7 +673,7 @@ describe('useInfiniteQuery', () => {
866
673
 
867
674
  expect(states.length).toBe(5)
868
675
  expect(states[0]).toMatchObject({
869
- hasNextPage: undefined,
676
+ hasNextPage: false,
870
677
  data: undefined,
871
678
  isFetching: true,
872
679
  isFetchingNextPage: false,
@@ -909,24 +716,26 @@ describe('useInfiniteQuery', () => {
909
716
  const abortListeners: jest.Mock<any, any>[] = []
910
717
  const fetchPage = jest.fn<
911
718
  Promise<number>,
912
- [QueryFunctionContext<ReturnType<typeof key>, number>]
913
- >(async ({ pageParam = start, signal }) => {
914
- if (signal) {
915
- const onAbort = jest.fn()
916
- const abortListener = jest.fn()
917
- onAborts.push(onAbort)
918
- abortListeners.push(abortListener)
919
- signal.onabort = onAbort
920
- signal.addEventListener('abort', abortListener)
921
- }
719
+ [QueryFunctionContext<typeof key, number>]
720
+ >(async ({ pageParam, signal }) => {
721
+ const onAbort = jest.fn()
722
+ const abortListener = jest.fn()
723
+ onAborts.push(onAbort)
724
+ abortListeners.push(abortListener)
725
+ signal.onabort = onAbort
726
+ signal.addEventListener('abort', abortListener)
727
+
922
728
  await sleep(50)
923
729
  return Number(pageParam)
924
730
  })
925
731
 
926
732
  function Page() {
927
- const state = createInfiniteQuery(key, fetchPage, {
733
+ const state = createInfiniteQuery(() => ({
734
+ queryKey: key,
735
+ queryFn: fetchPage,
928
736
  getNextPageParam: (lastPage) => lastPage + 1,
929
- })
737
+ defaultPageParam: start,
738
+ }))
930
739
 
931
740
  createEffect(() => {
932
741
  const { fetchNextPage } = state
@@ -956,28 +765,28 @@ describe('useInfiniteQuery', () => {
956
765
 
957
766
  let callIndex = 0
958
767
  const firstCtx = fetchPage.mock.calls[callIndex]![0]
959
- expect(firstCtx.pageParam).toBeUndefined()
960
- expect(firstCtx.queryKey).toEqual(key())
768
+ expect(firstCtx.pageParam).toEqual(start)
769
+ expect(firstCtx.queryKey).toEqual(key)
961
770
  expect(firstCtx.signal).toBeInstanceOf(AbortSignal)
962
- expect(firstCtx.signal?.aborted).toBe(false)
771
+ expect(firstCtx.signal.aborted).toBe(false)
963
772
  expect(onAborts[callIndex]).not.toHaveBeenCalled()
964
773
  expect(abortListeners[callIndex]).not.toHaveBeenCalled()
965
774
 
966
775
  callIndex = 1
967
776
  const secondCtx = fetchPage.mock.calls[callIndex]![0]
968
777
  expect(secondCtx.pageParam).toBe(11)
969
- expect(secondCtx.queryKey).toEqual(key())
778
+ expect(secondCtx.queryKey).toEqual(key)
970
779
  expect(secondCtx.signal).toBeInstanceOf(AbortSignal)
971
- expect(secondCtx.signal?.aborted).toBe(true)
780
+ expect(secondCtx.signal.aborted).toBe(true)
972
781
  expect(onAborts[callIndex]).toHaveBeenCalledTimes(1)
973
782
  expect(abortListeners[callIndex]).toHaveBeenCalledTimes(1)
974
783
 
975
784
  callIndex = 2
976
785
  const thirdCtx = fetchPage.mock.calls[callIndex]![0]
977
786
  expect(thirdCtx.pageParam).toBe(11)
978
- expect(thirdCtx.queryKey).toEqual(key())
787
+ expect(thirdCtx.queryKey).toEqual(key)
979
788
  expect(thirdCtx.signal).toBeInstanceOf(AbortSignal)
980
- expect(thirdCtx.signal?.aborted).toBe(false)
789
+ expect(thirdCtx.signal.aborted).toBe(false)
981
790
  expect(onAborts[callIndex]).not.toHaveBeenCalled()
982
791
  expect(abortListeners[callIndex]).not.toHaveBeenCalled()
983
792
  })
@@ -989,24 +798,26 @@ describe('useInfiniteQuery', () => {
989
798
  const abortListeners: jest.Mock<any, any>[] = []
990
799
  const fetchPage = jest.fn<
991
800
  Promise<number>,
992
- [QueryFunctionContext<ReturnType<typeof key>, number>]
993
- >(async ({ pageParam = start, signal }) => {
994
- if (signal) {
995
- const onAbort = jest.fn()
996
- const abortListener = jest.fn()
997
- onAborts.push(onAbort)
998
- abortListeners.push(abortListener)
999
- signal.onabort = onAbort
1000
- signal.addEventListener('abort', abortListener)
1001
- }
801
+ [QueryFunctionContext<typeof key, number>]
802
+ >(async ({ pageParam, signal }) => {
803
+ const onAbort = jest.fn()
804
+ const abortListener = jest.fn()
805
+ onAborts.push(onAbort)
806
+ abortListeners.push(abortListener)
807
+ signal.onabort = onAbort
808
+ signal.addEventListener('abort', abortListener)
809
+
1002
810
  await sleep(50)
1003
811
  return Number(pageParam)
1004
812
  })
1005
813
 
1006
814
  function Page() {
1007
- const state = createInfiniteQuery(key, fetchPage, {
815
+ const state = createInfiniteQuery(() => ({
816
+ queryKey: key,
817
+ queryFn: fetchPage,
1008
818
  getNextPageParam: (lastPage) => lastPage + 1,
1009
- })
819
+ defaultPageParam: start,
820
+ }))
1010
821
 
1011
822
  createEffect(() => {
1012
823
  const { fetchNextPage } = state
@@ -1036,40 +847,40 @@ describe('useInfiniteQuery', () => {
1036
847
 
1037
848
  let callIndex = 0
1038
849
  const firstCtx = fetchPage.mock.calls[callIndex]![0]
1039
- expect(firstCtx.pageParam).toBeUndefined()
1040
- expect(firstCtx.queryKey).toEqual(key())
850
+ expect(firstCtx.pageParam).toEqual(start)
851
+ expect(firstCtx.queryKey).toEqual(key)
1041
852
  expect(firstCtx.signal).toBeInstanceOf(AbortSignal)
1042
- expect(firstCtx.signal?.aborted).toBe(false)
853
+ expect(firstCtx.signal.aborted).toBe(false)
1043
854
  expect(onAborts[callIndex]).not.toHaveBeenCalled()
1044
855
  expect(abortListeners[callIndex]).not.toHaveBeenCalled()
1045
856
 
1046
857
  callIndex = 1
1047
858
  const secondCtx = fetchPage.mock.calls[callIndex]![0]
1048
859
  expect(secondCtx.pageParam).toBe(11)
1049
- expect(secondCtx.queryKey).toEqual(key())
860
+ expect(secondCtx.queryKey).toEqual(key)
1050
861
  expect(secondCtx.signal).toBeInstanceOf(AbortSignal)
1051
- expect(secondCtx.signal?.aborted).toBe(false)
862
+ expect(secondCtx.signal.aborted).toBe(false)
1052
863
  expect(onAborts[callIndex]).not.toHaveBeenCalled()
1053
864
  expect(abortListeners[callIndex]).not.toHaveBeenCalled()
1054
865
  })
1055
866
 
1056
867
  it('should keep fetching first page when not loaded yet and triggering fetch more', async () => {
1057
868
  const key = queryKey()
1058
- const states: CreateInfiniteQueryResult<number>[] = []
869
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
1059
870
 
1060
871
  function Page() {
1061
872
  const start = 10
1062
- const state = createInfiniteQuery(
1063
- key,
1064
- async ({ pageParam = start }) => {
873
+ const state = createInfiniteQuery(() => ({
874
+ queryKey: key,
875
+ queryFn: async ({ pageParam }) => {
1065
876
  await sleep(50)
1066
877
  return Number(pageParam)
1067
878
  },
1068
- {
1069
- getNextPageParam: (lastPage) => lastPage + 1,
1070
- notifyOnChangeProps: 'all',
1071
- },
1072
- )
879
+
880
+ getNextPageParam: (lastPage) => lastPage + 1,
881
+ defaultPageParam: start,
882
+ notifyOnChangeProps: 'all',
883
+ }))
1073
884
 
1074
885
  createRenderEffect(() => {
1075
886
  states.push({ ...state })
@@ -1095,7 +906,7 @@ describe('useInfiniteQuery', () => {
1095
906
 
1096
907
  expect(states.length).toBe(2)
1097
908
  expect(states[0]).toMatchObject({
1098
- hasNextPage: undefined,
909
+ hasNextPage: false,
1099
910
  data: undefined,
1100
911
  isFetching: true,
1101
912
  isFetchingNextPage: false,
@@ -1117,20 +928,20 @@ describe('useInfiniteQuery', () => {
1117
928
  const initialData = { pages: [1, 2, 3, 4], pageParams: [0, 1, 2, 3] }
1118
929
 
1119
930
  function List() {
1120
- createInfiniteQuery(
1121
- key,
1122
- async ({ pageParam = 0, signal: _ }) => {
931
+ createInfiniteQuery(() => ({
932
+ queryKey: key,
933
+ queryFn: async ({ pageParam, signal: _ }) => {
1123
934
  fetches++
1124
935
  await sleep(50)
1125
936
  return Number(pageParam) * 10
1126
937
  },
1127
- {
1128
- initialData,
1129
- getNextPageParam: (_, allPages) => {
1130
- return allPages.length === 4 ? undefined : allPages.length
1131
- },
938
+
939
+ initialData,
940
+ getNextPageParam: (_, allPages) => {
941
+ return allPages.length === 4 ? undefined : allPages.length
1132
942
  },
1133
- )
943
+ defaultPageParam: 0,
944
+ }))
1134
945
 
1135
946
  return null
1136
947
  }
@@ -1156,101 +967,31 @@ describe('useInfiniteQuery', () => {
1156
967
  await sleep(300)
1157
968
 
1158
969
  expect(fetches).toBe(2)
1159
- expect(queryClient.getQueryState(key())).toMatchObject({
970
+ expect(queryClient.getQueryState(key)).toMatchObject({
1160
971
  data: initialData,
1161
972
  status: 'success',
1162
973
  error: null,
1163
974
  })
1164
975
  })
1165
976
 
1166
- it('should be able to override the cursor in the fetchNextPage callback', async () => {
1167
- const key = queryKey()
1168
- const states: CreateInfiniteQueryResult<number>[] = []
1169
-
1170
- function Page() {
1171
- const state = createInfiniteQuery(
1172
- key,
1173
- async ({ pageParam = 0 }) => {
1174
- await sleep(10)
1175
- return Number(pageParam)
1176
- },
1177
- {
1178
- getNextPageParam: (lastPage) => lastPage + 1,
1179
- notifyOnChangeProps: 'all',
1180
- },
1181
- )
1182
-
1183
- createRenderEffect(() => {
1184
- states.push({ ...state })
1185
- })
1186
-
1187
- createEffect(() => {
1188
- const { fetchNextPage } = state
1189
- setActTimeout(() => {
1190
- fetchNextPage({ pageParam: 5 })
1191
- }, 20)
1192
- })
1193
-
1194
- return null
1195
- }
1196
-
1197
- render(() => (
1198
- <QueryClientProvider client={queryClient}>
1199
- <Page />
1200
- </QueryClientProvider>
1201
- ))
1202
-
1203
- await sleep(100)
1204
-
1205
- expect(states.length).toBe(4)
1206
- expect(states[0]).toMatchObject({
1207
- hasNextPage: undefined,
1208
- data: undefined,
1209
- isFetching: true,
1210
- isFetchingNextPage: false,
1211
- isSuccess: false,
1212
- })
1213
- expect(states[1]).toMatchObject({
1214
- hasNextPage: true,
1215
- data: { pages: [0] },
1216
- isFetching: false,
1217
- isFetchingNextPage: false,
1218
- isSuccess: true,
1219
- })
1220
- expect(states[2]).toMatchObject({
1221
- hasNextPage: true,
1222
- data: { pages: [0] },
1223
- isFetching: true,
1224
- isFetchingNextPage: true,
1225
- isSuccess: true,
1226
- })
1227
- expect(states[3]).toMatchObject({
1228
- hasNextPage: true,
1229
- data: { pages: [0, 5] },
1230
- isFetching: false,
1231
- isFetchingNextPage: false,
1232
- isSuccess: true,
1233
- })
1234
- })
1235
-
1236
977
  it('should be able to set new pages with the query client', async () => {
1237
978
  const key = queryKey()
1238
- const states: CreateInfiniteQueryResult<number>[] = []
979
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
1239
980
 
1240
981
  function Page() {
1241
982
  const [firstPage, setFirstPage] = createSignal(0)
1242
983
 
1243
- const state = createInfiniteQuery(
1244
- key,
1245
- async ({ pageParam = firstPage() }) => {
984
+ const state = createInfiniteQuery(() => ({
985
+ queryKey: key,
986
+ queryFn: async ({ pageParam }) => {
1246
987
  await sleep(10)
1247
988
  return Number(pageParam)
1248
989
  },
1249
- {
1250
- getNextPageParam: (lastPage) => lastPage + 1,
1251
- notifyOnChangeProps: 'all',
1252
- },
1253
- )
990
+
991
+ getNextPageParam: (lastPage) => lastPage + 1,
992
+ notifyOnChangeProps: 'all',
993
+ defaultPageParam: firstPage(),
994
+ }))
1254
995
 
1255
996
  createRenderEffect(() => {
1256
997
  states.push({ ...state })
@@ -1259,7 +1000,7 @@ describe('useInfiniteQuery', () => {
1259
1000
  createEffect(() => {
1260
1001
  const { refetch } = state
1261
1002
  setActTimeout(() => {
1262
- queryClient.setQueryData(key(), { pages: [7, 8], pageParams: [7, 8] })
1003
+ queryClient.setQueryData(key, { pages: [7, 8], pageParams: [7, 8] })
1263
1004
  setFirstPage(7)
1264
1005
  }, 20)
1265
1006
 
@@ -1281,7 +1022,7 @@ describe('useInfiniteQuery', () => {
1281
1022
 
1282
1023
  expect(states.length).toBe(5)
1283
1024
  expect(states[0]).toMatchObject({
1284
- hasNextPage: undefined,
1025
+ hasNextPage: false,
1285
1026
  data: undefined,
1286
1027
  isFetching: true,
1287
1028
  isFetchingNextPage: false,
@@ -1323,21 +1064,21 @@ describe('useInfiniteQuery', () => {
1323
1064
 
1324
1065
  it('should only refetch the first page when initialData is provided', async () => {
1325
1066
  const key = queryKey()
1326
- const states: CreateInfiniteQueryResult<number>[] = []
1067
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
1327
1068
 
1328
1069
  function Page() {
1329
- const state = createInfiniteQuery(
1330
- key,
1331
- async ({ pageParam }): Promise<number> => {
1070
+ const state = createInfiniteQuery(() => ({
1071
+ queryKey: key,
1072
+ queryFn: async ({ pageParam }): Promise<number> => {
1332
1073
  await sleep(10)
1333
1074
  return pageParam
1334
1075
  },
1335
- {
1336
- initialData: { pages: [1], pageParams: [1] },
1337
- getNextPageParam: (lastPage) => lastPage + 1,
1338
- notifyOnChangeProps: 'all',
1339
- },
1340
- )
1076
+
1077
+ initialData: { pages: [1], pageParams: [1] },
1078
+ getNextPageParam: (lastPage) => lastPage + 1,
1079
+ defaultPageParam: 0,
1080
+ notifyOnChangeProps: 'all',
1081
+ }))
1341
1082
 
1342
1083
  createRenderEffect(() => {
1343
1084
  states.push({ ...state })
@@ -1394,16 +1135,15 @@ describe('useInfiniteQuery', () => {
1394
1135
 
1395
1136
  it('should set hasNextPage to false if getNextPageParam returns undefined', async () => {
1396
1137
  const key = queryKey()
1397
- const states: CreateInfiniteQueryResult<number>[] = []
1138
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
1398
1139
 
1399
1140
  function Page() {
1400
- const state = createInfiniteQuery(
1401
- key,
1402
- ({ pageParam = 1 }) => Number(pageParam),
1403
- {
1404
- getNextPageParam: () => undefined,
1405
- },
1406
- )
1141
+ const state = createInfiniteQuery(() => ({
1142
+ queryKey: key,
1143
+ queryFn: ({ pageParam }) => Number(pageParam),
1144
+ defaultPageParam: 1,
1145
+ getNextPageParam: () => undefined,
1146
+ }))
1407
1147
 
1408
1148
  createRenderEffect(() => {
1409
1149
  states.push({ ...state })
@@ -1423,7 +1163,7 @@ describe('useInfiniteQuery', () => {
1423
1163
  expect(states.length).toBe(2)
1424
1164
  expect(states[0]).toMatchObject({
1425
1165
  data: undefined,
1426
- hasNextPage: undefined,
1166
+ hasNextPage: false,
1427
1167
  isFetching: true,
1428
1168
  isFetchingNextPage: false,
1429
1169
  isSuccess: false,
@@ -1439,17 +1179,16 @@ describe('useInfiniteQuery', () => {
1439
1179
 
1440
1180
  it('should compute hasNextPage correctly using initialData', async () => {
1441
1181
  const key = queryKey()
1442
- const states: CreateInfiniteQueryResult<number>[] = []
1182
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
1443
1183
 
1444
1184
  function Page() {
1445
- const state = createInfiniteQuery(
1446
- key,
1447
- ({ pageParam = 10 }): number => pageParam,
1448
- {
1449
- initialData: { pages: [10], pageParams: [undefined] },
1450
- getNextPageParam: (lastPage) => (lastPage === 10 ? 11 : undefined),
1451
- },
1452
- )
1185
+ const state = createInfiniteQuery(() => ({
1186
+ queryKey: key,
1187
+ queryFn: ({ pageParam }): number => pageParam,
1188
+ defaultPageParam: 10,
1189
+ initialData: { pages: [10], pageParams: [10] },
1190
+ getNextPageParam: (lastPage) => (lastPage === 10 ? 11 : undefined),
1191
+ }))
1453
1192
 
1454
1193
  createRenderEffect(() => {
1455
1194
  states.push({ ...state })
@@ -1484,17 +1223,16 @@ describe('useInfiniteQuery', () => {
1484
1223
 
1485
1224
  it('should compute hasNextPage correctly for falsy getFetchMore return value using initialData', async () => {
1486
1225
  const key = queryKey()
1487
- const states: CreateInfiniteQueryResult<number>[] = []
1226
+ const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
1488
1227
 
1489
1228
  function Page() {
1490
- const state = createInfiniteQuery(
1491
- key,
1492
- ({ pageParam = 10 }): number => pageParam,
1493
- {
1494
- initialData: { pages: [10], pageParams: [undefined] },
1495
- getNextPageParam: () => undefined,
1496
- },
1497
- )
1229
+ const state = createInfiniteQuery(() => ({
1230
+ queryKey: key,
1231
+ queryFn: ({ pageParam }): number => pageParam,
1232
+ defaultPageParam: 10,
1233
+ initialData: { pages: [10], pageParams: [10] },
1234
+ getNextPageParam: () => undefined,
1235
+ }))
1498
1236
 
1499
1237
  createRenderEffect(() => {
1500
1238
  states.push({ ...state })
@@ -1529,20 +1267,19 @@ describe('useInfiniteQuery', () => {
1529
1267
 
1530
1268
  it('should not use selected data when computing hasNextPage', async () => {
1531
1269
  const key = queryKey()
1532
- const states: CreateInfiniteQueryResult<string>[] = []
1270
+ const states: CreateInfiniteQueryResult<InfiniteData<string>>[] = []
1533
1271
 
1534
1272
  function Page() {
1535
- const state = createInfiniteQuery(
1536
- key,
1537
- ({ pageParam = 1 }) => Number(pageParam),
1538
- {
1539
- getNextPageParam: (lastPage) => (lastPage === 1 ? 2 : false),
1540
- select: (data) => ({
1541
- pages: data.pages.map((x) => x.toString()),
1542
- pageParams: data.pageParams,
1543
- }),
1544
- },
1545
- )
1273
+ const state = createInfiniteQuery(() => ({
1274
+ queryKey: key,
1275
+ queryFn: ({ pageParam }) => Number(pageParam),
1276
+ defaultPageParam: 1,
1277
+ getNextPageParam: (lastPage) => (lastPage === 1 ? 2 : undefined),
1278
+ select: (data) => ({
1279
+ pages: data.pages.map((x) => x.toString()),
1280
+ pageParams: data.pageParams,
1281
+ }),
1282
+ }))
1546
1283
 
1547
1284
  createRenderEffect(() => {
1548
1285
  states.push({ ...state })
@@ -1562,7 +1299,7 @@ describe('useInfiniteQuery', () => {
1562
1299
  expect(states.length).toBe(2)
1563
1300
  expect(states[0]).toMatchObject({
1564
1301
  data: undefined,
1565
- hasNextPage: undefined,
1302
+ hasNextPage: false,
1566
1303
  isFetching: true,
1567
1304
  isFetchingNextPage: false,
1568
1305
  isSuccess: false,
@@ -1595,13 +1332,13 @@ describe('useInfiniteQuery', () => {
1595
1332
 
1596
1333
  function Page() {
1597
1334
  let fetchCountRef = 0
1598
- const state = createInfiniteQuery<Result, Error>(
1599
- key,
1600
- ({ pageParam = 0 }) => fetchItemsWithLimit(pageParam, fetchCountRef++),
1601
- {
1602
- getNextPageParam: (lastPage) => lastPage.nextId,
1603
- },
1604
- )
1335
+ const state = createInfiniteQuery(() => ({
1336
+ queryKey: key,
1337
+ queryFn: ({ pageParam }) =>
1338
+ fetchItemsWithLimit(pageParam, fetchCountRef++),
1339
+ defaultPageParam: 0,
1340
+ getNextPageParam: (lastPage) => lastPage.nextId,
1341
+ }))
1605
1342
 
1606
1343
  return (
1607
1344
  <div>
@@ -1645,7 +1382,7 @@ describe('useInfiniteQuery', () => {
1645
1382
  // makes an actual network request
1646
1383
  // and calls invalidateQueries in an onSuccess
1647
1384
  items.splice(4, 1)
1648
- queryClient.invalidateQueries(key())
1385
+ queryClient.invalidateQueries({ queryKey: key })
1649
1386
  }}
1650
1387
  >
1651
1388
  Remove item
@@ -1657,7 +1394,7 @@ describe('useInfiniteQuery', () => {
1657
1394
  </>
1658
1395
  }
1659
1396
  >
1660
- <Match when={state.status === 'loading'}>Loading...</Match>
1397
+ <Match when={state.status === 'pending'}>Loading...</Match>
1661
1398
  <Match when={state.status === 'error'}>
1662
1399
  <span>Error: {state.error!.message}</span>
1663
1400
  </Match>
@@ -1725,18 +1462,17 @@ describe('useInfiniteQuery', () => {
1725
1462
  let fetchCountRef = 0
1726
1463
  const [isRemovedLastPage, setIsRemovedLastPage] =
1727
1464
  createSignal<boolean>(false)
1728
- const state = createInfiniteQuery<Result, Error>(
1729
- key,
1730
- ({ pageParam = 0 }) =>
1465
+ const state = createInfiniteQuery(() => ({
1466
+ queryKey: key,
1467
+ queryFn: ({ pageParam }) =>
1731
1468
  fetchItems(
1732
1469
  pageParam,
1733
1470
  fetchCountRef++,
1734
1471
  pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage()),
1735
1472
  ),
1736
- {
1737
- getNextPageParam: (lastPage) => lastPage.nextId,
1738
- },
1739
- )
1473
+ defaultPageParam: 0,
1474
+ getNextPageParam: (lastPage) => lastPage.nextId,
1475
+ }))
1740
1476
 
1741
1477
  return (
1742
1478
  <div>
@@ -1785,7 +1521,7 @@ describe('useInfiniteQuery', () => {
1785
1521
  </>
1786
1522
  }
1787
1523
  >
1788
- <Match when={state.status === 'loading'}>Loading...</Match>
1524
+ <Match when={state.status === 'pending'}>Loading...</Match>
1789
1525
  <Match when={state.status === 'error'}>
1790
1526
  <span>Error: {state.error!.message}</span>
1791
1527
  </Match>
@@ -1864,7 +1600,12 @@ describe('useInfiniteQuery', () => {
1864
1600
  }
1865
1601
 
1866
1602
  function Page() {
1867
- const state = createInfiniteQuery(key, queryFn)
1603
+ const state = createInfiniteQuery(() => ({
1604
+ queryKey: key,
1605
+ queryFn,
1606
+ getNextPageParam: () => undefined,
1607
+ defaultPageParam: 0,
1608
+ }))
1868
1609
  return (
1869
1610
  <div>
1870
1611
  <h1>Status: {state.status}</h1>
@@ -1884,4 +1625,32 @@ describe('useInfiniteQuery', () => {
1884
1625
 
1885
1626
  expect(cancelFn).toHaveBeenCalled()
1886
1627
  })
1628
+
1629
+ it('should use provided custom queryClient', async () => {
1630
+ const key = queryKey()
1631
+ const queryFn = () => {
1632
+ return Promise.resolve('custom client')
1633
+ }
1634
+
1635
+ function Page() {
1636
+ const state = createInfiniteQuery(
1637
+ () => ({
1638
+ queryKey: key,
1639
+ queryFn,
1640
+ getNextPageParam: () => undefined,
1641
+ defaultPageParam: 0,
1642
+ }),
1643
+ () => queryClient,
1644
+ )
1645
+ return (
1646
+ <div>
1647
+ <h1>Status: {state.data?.pages[0]}</h1>
1648
+ </div>
1649
+ )
1650
+ }
1651
+
1652
+ render(() => <Page />)
1653
+
1654
+ await waitFor(() => screen.getByText('Status: custom client'))
1655
+ })
1887
1656
  })