@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
@@ -1,7 +1,7 @@
1
1
  import { fireEvent, render, screen, waitFor } from 'solid-testing-library';
2
2
  import { createQueryClient, sleep } from './utils';
3
3
  import { createEffect, createRenderEffect, createSignal, For, Index, Match, Switch, } from 'solid-js';
4
- import { createInfiniteQuery, QueryCache, QueryClientProvider } from '..';
4
+ import { createInfiniteQuery, QueryCache, QueryClientProvider, keepPreviousData, } from '..';
5
5
  import { Blink, queryKey, setActTimeout } from './utils';
6
6
  const pageSize = 10;
7
7
  const fetchItems = async (page, ts, noNext, noPrev) => {
@@ -20,9 +20,12 @@ describe('useInfiniteQuery', () => {
20
20
  const key = queryKey();
21
21
  const states = [];
22
22
  function Page() {
23
- const state = createInfiniteQuery(key, ({ pageParam = 0 }) => Number(pageParam), {
23
+ const state = createInfiniteQuery(() => ({
24
+ queryKey: key,
25
+ queryFn: ({ pageParam }) => Number(pageParam),
24
26
  getNextPageParam: (lastPage) => lastPage + 1,
25
- });
27
+ defaultPageParam: 0,
28
+ }));
26
29
  createRenderEffect(() => {
27
30
  states.push({ ...state });
28
31
  });
@@ -43,8 +46,8 @@ describe('useInfiniteQuery', () => {
43
46
  errorUpdateCount: 0,
44
47
  fetchNextPage: expect.any(Function),
45
48
  fetchPreviousPage: expect.any(Function),
46
- hasNextPage: undefined,
47
- hasPreviousPage: undefined,
49
+ hasNextPage: false,
50
+ hasPreviousPage: false,
48
51
  isError: false,
49
52
  isFetched: false,
50
53
  isFetchedAfterMount: false,
@@ -52,22 +55,21 @@ describe('useInfiniteQuery', () => {
52
55
  isPaused: false,
53
56
  isFetchingNextPage: false,
54
57
  isFetchingPreviousPage: false,
58
+ isPending: true,
55
59
  isLoading: true,
56
60
  isInitialLoading: true,
57
61
  isLoadingError: false,
58
62
  isPlaceholderData: false,
59
- isPreviousData: false,
60
63
  isRefetchError: false,
61
64
  isRefetching: false,
62
65
  isStale: true,
63
66
  isSuccess: false,
64
67
  refetch: expect.any(Function),
65
- remove: expect.any(Function),
66
- status: 'loading',
68
+ status: 'pending',
67
69
  fetchStatus: 'fetching',
68
70
  });
69
71
  expect(states[1]).toEqual({
70
- data: { pages: [0], pageParams: [undefined] },
72
+ data: { pages: [0], pageParams: [0] },
71
73
  dataUpdatedAt: expect.any(Number),
72
74
  error: null,
73
75
  errorUpdatedAt: 0,
@@ -77,7 +79,7 @@ describe('useInfiniteQuery', () => {
77
79
  fetchNextPage: expect.any(Function),
78
80
  fetchPreviousPage: expect.any(Function),
79
81
  hasNextPage: true,
80
- hasPreviousPage: undefined,
82
+ hasPreviousPage: false,
81
83
  isError: false,
82
84
  isFetched: true,
83
85
  isFetchedAfterMount: true,
@@ -85,17 +87,16 @@ describe('useInfiniteQuery', () => {
85
87
  isPaused: false,
86
88
  isFetchingNextPage: false,
87
89
  isFetchingPreviousPage: false,
90
+ isPending: false,
88
91
  isLoading: false,
89
92
  isInitialLoading: false,
90
93
  isLoadingError: false,
91
94
  isPlaceholderData: false,
92
- isPreviousData: false,
93
95
  isRefetchError: false,
94
96
  isRefetching: false,
95
97
  isStale: true,
96
98
  isSuccess: true,
97
99
  refetch: expect.any(Function),
98
- remove: expect.any(Function),
99
100
  status: 'success',
100
101
  fetchStatus: 'idle',
101
102
  });
@@ -105,16 +106,19 @@ describe('useInfiniteQuery', () => {
105
106
  let noThrow;
106
107
  function Page() {
107
108
  const start = 1;
108
- const state = createInfiniteQuery(key, async ({ pageParam = start }) => {
109
- if (pageParam === 2) {
110
- throw new Error('error');
111
- }
112
- return Number(pageParam);
113
- }, {
109
+ const state = createInfiniteQuery(() => ({
110
+ queryKey: key,
111
+ queryFn: async ({ pageParam }) => {
112
+ if (pageParam === 2) {
113
+ throw new Error('error');
114
+ }
115
+ return Number(pageParam);
116
+ },
114
117
  retry: 1,
115
118
  retryDelay: 10,
119
+ defaultPageParam: start,
116
120
  getNextPageParam: (lastPage) => lastPage + 1,
117
- });
121
+ }));
118
122
  createEffect(() => {
119
123
  const fetchNextPage = state.fetchNextPage;
120
124
  setActTimeout(() => {
@@ -132,19 +136,22 @@ describe('useInfiniteQuery', () => {
132
136
  </QueryClientProvider>));
133
137
  await waitFor(() => expect(noThrow).toBe(true));
134
138
  });
135
- it('should keep the previous data when keepPreviousData is set', async () => {
139
+ it('should keep the previous data when placeholderData is set', async () => {
136
140
  const key = queryKey();
137
141
  const states = [];
138
142
  function Page() {
139
143
  const [order, setOrder] = createSignal('desc');
140
- const state = createInfiniteQuery(() => [key(), order()], async ({ pageParam = 0 }) => {
141
- await sleep(10);
142
- return `${pageParam}-${order()}`;
143
- }, {
144
+ const state = createInfiniteQuery(() => ({
145
+ queryKey: [key, order()],
146
+ queryFn: async ({ pageParam }) => {
147
+ await sleep(10);
148
+ return `${pageParam}-${order()}`;
149
+ },
144
150
  getNextPageParam: () => 1,
145
- keepPreviousData: true,
151
+ defaultPageParam: 0,
152
+ placeholderData: keepPreviousData,
146
153
  notifyOnChangeProps: 'all',
147
- });
154
+ }));
148
155
  createRenderEffect(() => {
149
156
  states.push({ ...state });
150
157
  });
@@ -170,28 +177,28 @@ describe('useInfiniteQuery', () => {
170
177
  isFetching: true,
171
178
  isFetchingNextPage: false,
172
179
  isSuccess: false,
173
- isPreviousData: false,
180
+ isPlaceholderData: false,
174
181
  });
175
182
  expect(states[1]).toMatchObject({
176
183
  data: { pages: ['0-desc'] },
177
184
  isFetching: false,
178
185
  isFetchingNextPage: false,
179
186
  isSuccess: true,
180
- isPreviousData: false,
187
+ isPlaceholderData: false,
181
188
  });
182
189
  expect(states[2]).toMatchObject({
183
190
  data: { pages: ['0-desc'] },
184
191
  isFetching: true,
185
192
  isFetchingNextPage: true,
186
193
  isSuccess: true,
187
- isPreviousData: false,
194
+ isPlaceholderData: false,
188
195
  });
189
196
  expect(states[3]).toMatchObject({
190
197
  data: { pages: ['0-desc', '1-desc'] },
191
198
  isFetching: false,
192
199
  isFetchingNextPage: false,
193
200
  isSuccess: true,
194
- isPreviousData: false,
201
+ isPlaceholderData: false,
195
202
  });
196
203
  // Set state
197
204
  expect(states[4]).toMatchObject({
@@ -199,26 +206,30 @@ describe('useInfiniteQuery', () => {
199
206
  isFetching: true,
200
207
  isFetchingNextPage: false,
201
208
  isSuccess: true,
202
- isPreviousData: true,
209
+ isPlaceholderData: true,
203
210
  });
204
211
  expect(states[5]).toMatchObject({
205
212
  data: { pages: ['0-asc'] },
206
213
  isFetching: false,
207
214
  isFetchingNextPage: false,
208
215
  isSuccess: true,
209
- isPreviousData: false,
216
+ isPlaceholderData: false,
210
217
  });
211
218
  });
212
219
  it('should be able to select a part of the data', async () => {
213
220
  const key = queryKey();
214
221
  const states = [];
215
222
  function Page() {
216
- const state = createInfiniteQuery(key, () => ({ count: 1 }), {
223
+ const state = createInfiniteQuery(() => ({
224
+ queryKey: key,
225
+ queryFn: () => ({ count: 1 }),
217
226
  select: (data) => ({
218
227
  pages: data.pages.map((x) => `count: ${x.count}`),
219
228
  pageParams: data.pageParams,
220
229
  }),
221
- });
230
+ getNextPageParam: () => undefined,
231
+ defaultPageParam: 0,
232
+ }));
222
233
  createRenderEffect(() => {
223
234
  states.push({ ...state });
224
235
  });
@@ -243,7 +254,9 @@ describe('useInfiniteQuery', () => {
243
254
  const states = [];
244
255
  let selectCalled = 0;
245
256
  function Page() {
246
- const state = createInfiniteQuery(key, () => ({ count: 1 }), {
257
+ const state = createInfiniteQuery(() => ({
258
+ queryKey: key,
259
+ queryFn: () => ({ count: 1 }),
247
260
  select: (data) => {
248
261
  selectCalled++;
249
262
  return {
@@ -251,7 +264,9 @@ describe('useInfiniteQuery', () => {
251
264
  pageParams: data.pageParams,
252
265
  };
253
266
  },
254
- });
267
+ getNextPageParam: () => undefined,
268
+ defaultPageParam: 0,
269
+ }));
255
270
  createRenderEffect(() => {
256
271
  states.push({ ...state });
257
272
  });
@@ -276,23 +291,25 @@ describe('useInfiniteQuery', () => {
276
291
  const key = queryKey();
277
292
  const states = [];
278
293
  function Page() {
279
- const state = createInfiniteQuery(key, async ({ pageParam = 0 }) => {
280
- await sleep(10);
281
- return Number(pageParam);
282
- }, {
294
+ const state = createInfiniteQuery(() => ({
295
+ queryKey: key,
296
+ queryFn: async ({ pageParam }) => {
297
+ await sleep(10);
298
+ return Number(pageParam);
299
+ },
283
300
  select: (data) => ({
284
301
  pages: [...data.pages].reverse(),
285
302
  pageParams: [...data.pageParams].reverse(),
286
303
  }),
287
304
  notifyOnChangeProps: 'all',
288
- });
305
+ getNextPageParam: () => 1,
306
+ defaultPageParam: 0,
307
+ }));
289
308
  createRenderEffect(() => {
290
309
  states.push({ ...state });
291
310
  });
292
311
  return (<div>
293
- <button onClick={() => state.fetchNextPage({ pageParam: 1 })}>
294
- fetchNextPage
295
- </button>
312
+ <button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
296
313
  <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
297
314
  <div>isFetching: {state.isFetching}</div>
298
315
  </div>);
@@ -326,13 +343,17 @@ describe('useInfiniteQuery', () => {
326
343
  const states = [];
327
344
  function Page() {
328
345
  const start = 10;
329
- const state = createInfiniteQuery(key, async ({ pageParam = start }) => {
330
- await sleep(10);
331
- return Number(pageParam);
332
- }, {
346
+ const state = createInfiniteQuery(() => ({
347
+ queryKey: key,
348
+ queryFn: async ({ pageParam }) => {
349
+ await sleep(10);
350
+ return Number(pageParam);
351
+ },
352
+ getNextPageParam: (lastPage) => lastPage + 1,
333
353
  getPreviousPageParam: (firstPage) => firstPage - 1,
354
+ defaultPageParam: start,
334
355
  notifyOnChangeProps: 'all',
335
- });
356
+ }));
336
357
  createRenderEffect(() => {
337
358
  states.push({ ...state });
338
359
  });
@@ -351,8 +372,8 @@ describe('useInfiniteQuery', () => {
351
372
  expect(states.length).toBe(4);
352
373
  expect(states[0]).toMatchObject({
353
374
  data: undefined,
354
- hasNextPage: undefined,
355
- hasPreviousPage: undefined,
375
+ hasNextPage: false,
376
+ hasPreviousPage: false,
356
377
  isFetching: true,
357
378
  isFetchingNextPage: false,
358
379
  isFetchingPreviousPage: false,
@@ -360,7 +381,7 @@ describe('useInfiniteQuery', () => {
360
381
  });
361
382
  expect(states[1]).toMatchObject({
362
383
  data: { pages: [10] },
363
- hasNextPage: undefined,
384
+ hasNextPage: true,
364
385
  hasPreviousPage: true,
365
386
  isFetching: false,
366
387
  isFetchingNextPage: false,
@@ -369,7 +390,7 @@ describe('useInfiniteQuery', () => {
369
390
  });
370
391
  expect(states[2]).toMatchObject({
371
392
  data: { pages: [10] },
372
- hasNextPage: undefined,
393
+ hasNextPage: true,
373
394
  hasPreviousPage: true,
374
395
  isFetching: true,
375
396
  isFetchingNextPage: false,
@@ -378,7 +399,7 @@ describe('useInfiniteQuery', () => {
378
399
  });
379
400
  expect(states[3]).toMatchObject({
380
401
  data: { pages: [9, 10] },
381
- hasNextPage: undefined,
402
+ hasNextPage: true,
382
403
  hasPreviousPage: true,
383
404
  isFetching: false,
384
405
  isFetchingNextPage: false,
@@ -386,113 +407,21 @@ describe('useInfiniteQuery', () => {
386
407
  isSuccess: true,
387
408
  });
388
409
  });
389
- it('should be able to refetch when providing page params manually', async () => {
390
- const key = queryKey();
391
- const states = [];
392
- function Page() {
393
- const state = createInfiniteQuery(key, async ({ pageParam = 10 }) => {
394
- await sleep(10);
395
- return Number(pageParam);
396
- });
397
- createRenderEffect(() => {
398
- states.push({ ...state });
399
- });
400
- return (<div>
401
- <button onClick={() => state.fetchNextPage({ pageParam: 11 })}>
402
- fetchNextPage
403
- </button>
404
- <button onClick={() => state.fetchPreviousPage({ pageParam: 9 })}>
405
- fetchPreviousPage
406
- </button>
407
- <button onClick={() => state.refetch()}>refetch</button>
408
- <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
409
- <div>isFetching: {String(state.isFetching)}</div>
410
- </div>);
411
- }
412
- render(() => (<QueryClientProvider client={queryClient}>
413
- <Page />
414
- </QueryClientProvider>));
415
- await waitFor(() => screen.getByText('data: 10'));
416
- fireEvent.click(screen.getByRole('button', { name: /fetchNextPage/i }));
417
- await waitFor(() => screen.getByText('data: 10,11'));
418
- fireEvent.click(screen.getByRole('button', { name: /fetchPreviousPage/i }));
419
- await waitFor(() => screen.getByText('data: 9,10,11'));
420
- fireEvent.click(screen.getByRole('button', { name: /refetch/i }));
421
- await waitFor(() => screen.getByText('isFetching: false'));
422
- await waitFor(() => expect(states.length).toBe(8));
423
- // Initial fetch
424
- expect(states[0]).toMatchObject({
425
- data: undefined,
426
- isFetching: true,
427
- isFetchingNextPage: false,
428
- isRefetching: false,
429
- });
430
- // Initial fetch done
431
- expect(states[1]).toMatchObject({
432
- data: { pages: [10] },
433
- isFetching: false,
434
- isFetchingNextPage: false,
435
- isRefetching: false,
436
- });
437
- // Fetch next page
438
- expect(states[2]).toMatchObject({
439
- data: { pages: [10] },
440
- isFetching: true,
441
- isFetchingNextPage: true,
442
- isRefetching: false,
443
- });
444
- // Fetch next page done
445
- expect(states[3]).toMatchObject({
446
- data: { pages: [10, 11] },
447
- isFetching: false,
448
- isFetchingNextPage: false,
449
- isRefetching: false,
450
- });
451
- // Fetch previous page
452
- expect(states[4]).toMatchObject({
453
- data: { pages: [10, 11] },
454
- isFetching: true,
455
- isFetchingNextPage: false,
456
- isFetchingPreviousPage: true,
457
- isRefetching: false,
458
- });
459
- // Fetch previous page done
460
- expect(states[5]).toMatchObject({
461
- data: { pages: [9, 10, 11] },
462
- isFetching: false,
463
- isFetchingNextPage: false,
464
- isFetchingPreviousPage: false,
465
- isRefetching: false,
466
- });
467
- // Refetch
468
- expect(states[6]).toMatchObject({
469
- data: { pages: [9, 10, 11] },
470
- isFetching: true,
471
- isFetchingNextPage: false,
472
- isFetchingPreviousPage: false,
473
- isRefetching: true,
474
- });
475
- // Refetch done
476
- expect(states[7]).toMatchObject({
477
- data: { pages: [9, 10, 11] },
478
- isFetching: false,
479
- isFetchingNextPage: false,
480
- isFetchingPreviousPage: false,
481
- isRefetching: false,
482
- });
483
- });
484
410
  it('should be able to refetch when providing page params automatically', async () => {
485
411
  const key = queryKey();
486
412
  const states = [];
487
413
  function Page() {
488
- const state = createInfiniteQuery(key, async ({ pageParam = 10 }) => {
489
- await sleep(10);
490
- return Number(pageParam);
491
- }, {
414
+ const state = createInfiniteQuery(() => ({
415
+ queryKey: key,
416
+ queryFn: async ({ pageParam }) => {
417
+ await sleep(10);
418
+ return Number(pageParam);
419
+ },
492
420
  getPreviousPageParam: (firstPage) => firstPage - 1,
493
421
  getNextPageParam: (lastPage) => lastPage + 1,
422
+ defaultPageParam: 10,
494
423
  notifyOnChangeProps: 'all',
495
- });
424
+ }));
496
425
  createRenderEffect(() => {
497
426
  states.push({ ...state });
498
427
  });
@@ -578,94 +507,21 @@ describe('useInfiniteQuery', () => {
578
507
  isRefetching: false,
579
508
  });
580
509
  });
581
- it('should be able to refetch only specific pages when refetchPages is provided', async () => {
582
- const key = queryKey();
583
- const states = [];
584
- function Page() {
585
- let multiplier = 1;
586
- const state = createInfiniteQuery(key, async ({ pageParam = 10 }) => {
587
- await sleep(10);
588
- return Number(pageParam) * multiplier;
589
- }, {
590
- getNextPageParam: (lastPage) => lastPage + 1,
591
- notifyOnChangeProps: 'all',
592
- });
593
- createRenderEffect(() => {
594
- states.push({ ...state });
595
- });
596
- return (<div>
597
- <button onClick={() => state.fetchNextPage()}>fetchNextPage</button>
598
- <button onClick={() => {
599
- multiplier = 2;
600
- state.refetch({
601
- refetchPage: (_, index) => index === 0,
602
- });
603
- }}>
604
- refetchPage
605
- </button>
606
- <div>data: {state.data?.pages.join(',') ?? 'null'}</div>
607
- <div>isFetching: {String(state.isFetching)}</div>
608
- </div>);
609
- }
610
- render(() => (<QueryClientProvider client={queryClient}>
611
- <Page />
612
- </QueryClientProvider>));
613
- await waitFor(() => screen.getByText('data: 10'));
614
- fireEvent.click(screen.getByRole('button', { name: /fetchNextPage/i }));
615
- await waitFor(() => screen.getByText('data: 10,11'));
616
- fireEvent.click(screen.getByRole('button', { name: /refetchPage/i }));
617
- await waitFor(() => screen.getByText('data: 20,11'));
618
- await waitFor(() => screen.getByText('isFetching: false'));
619
- await waitFor(() => expect(states.length).toBe(6));
620
- // Initial fetch
621
- expect(states[0]).toMatchObject({
622
- data: undefined,
623
- isFetching: true,
624
- isFetchingNextPage: false,
625
- });
626
- // Initial fetch done
627
- expect(states[1]).toMatchObject({
628
- data: { pages: [10] },
629
- isFetching: false,
630
- isFetchingNextPage: false,
631
- });
632
- // Fetch next page
633
- expect(states[2]).toMatchObject({
634
- data: { pages: [10] },
635
- isFetching: true,
636
- isFetchingNextPage: true,
637
- });
638
- // Fetch next page done
639
- expect(states[3]).toMatchObject({
640
- data: { pages: [10, 11] },
641
- isFetching: false,
642
- isFetchingNextPage: false,
643
- });
644
- // Refetch
645
- expect(states[4]).toMatchObject({
646
- data: { pages: [10, 11] },
647
- isFetching: true,
648
- isFetchingNextPage: false,
649
- });
650
- // Refetch done, only page one has been refetched and multiplied
651
- expect(states[5]).toMatchObject({
652
- data: { pages: [20, 11] },
653
- isFetching: false,
654
- isFetchingNextPage: false,
655
- });
656
- });
657
510
  it('should silently cancel any ongoing fetch when fetching more', async () => {
658
511
  const key = queryKey();
659
512
  const states = [];
660
513
  function Page() {
661
514
  const start = 10;
662
- const state = createInfiniteQuery(key, async ({ pageParam = start }) => {
663
- await sleep(50);
664
- return Number(pageParam);
665
- }, {
515
+ const state = createInfiniteQuery(() => ({
516
+ queryKey: key,
517
+ queryFn: async ({ pageParam }) => {
518
+ await sleep(50);
519
+ return Number(pageParam);
520
+ },
666
521
  getNextPageParam: (lastPage) => lastPage + 1,
522
+ defaultPageParam: start,
667
523
  notifyOnChangeProps: 'all',
668
- });
524
+ }));
669
525
  createRenderEffect(() => {
670
526
  states.push({ ...state });
671
527
  });
@@ -686,7 +542,7 @@ describe('useInfiniteQuery', () => {
686
542
  await sleep(300);
687
543
  expect(states.length).toBe(5);
688
544
  expect(states[0]).toMatchObject({
689
- hasNextPage: undefined,
545
+ hasNextPage: false,
690
546
  data: undefined,
691
547
  isFetching: true,
692
548
  isFetchingNextPage: false,
@@ -726,22 +582,23 @@ describe('useInfiniteQuery', () => {
726
582
  const start = 10;
727
583
  const onAborts = [];
728
584
  const abortListeners = [];
729
- const fetchPage = jest.fn(async ({ pageParam = start, signal }) => {
730
- if (signal) {
731
- const onAbort = jest.fn();
732
- const abortListener = jest.fn();
733
- onAborts.push(onAbort);
734
- abortListeners.push(abortListener);
735
- signal.onabort = onAbort;
736
- signal.addEventListener('abort', abortListener);
737
- }
585
+ const fetchPage = jest.fn(async ({ pageParam, signal }) => {
586
+ const onAbort = jest.fn();
587
+ const abortListener = jest.fn();
588
+ onAborts.push(onAbort);
589
+ abortListeners.push(abortListener);
590
+ signal.onabort = onAbort;
591
+ signal.addEventListener('abort', abortListener);
738
592
  await sleep(50);
739
593
  return Number(pageParam);
740
594
  });
741
595
  function Page() {
742
- const state = createInfiniteQuery(key, fetchPage, {
596
+ const state = createInfiniteQuery(() => ({
597
+ queryKey: key,
598
+ queryFn: fetchPage,
743
599
  getNextPageParam: (lastPage) => lastPage + 1,
744
- });
600
+ defaultPageParam: start,
601
+ }));
745
602
  createEffect(() => {
746
603
  const { fetchNextPage } = state;
747
604
  setActTimeout(() => {
@@ -763,26 +620,26 @@ describe('useInfiniteQuery', () => {
763
620
  expect(abortListeners).toHaveLength(expectedCallCount);
764
621
  let callIndex = 0;
765
622
  const firstCtx = fetchPage.mock.calls[callIndex][0];
766
- expect(firstCtx.pageParam).toBeUndefined();
767
- expect(firstCtx.queryKey).toEqual(key());
623
+ expect(firstCtx.pageParam).toEqual(start);
624
+ expect(firstCtx.queryKey).toEqual(key);
768
625
  expect(firstCtx.signal).toBeInstanceOf(AbortSignal);
769
- expect(firstCtx.signal?.aborted).toBe(false);
626
+ expect(firstCtx.signal.aborted).toBe(false);
770
627
  expect(onAborts[callIndex]).not.toHaveBeenCalled();
771
628
  expect(abortListeners[callIndex]).not.toHaveBeenCalled();
772
629
  callIndex = 1;
773
630
  const secondCtx = fetchPage.mock.calls[callIndex][0];
774
631
  expect(secondCtx.pageParam).toBe(11);
775
- expect(secondCtx.queryKey).toEqual(key());
632
+ expect(secondCtx.queryKey).toEqual(key);
776
633
  expect(secondCtx.signal).toBeInstanceOf(AbortSignal);
777
- expect(secondCtx.signal?.aborted).toBe(true);
634
+ expect(secondCtx.signal.aborted).toBe(true);
778
635
  expect(onAborts[callIndex]).toHaveBeenCalledTimes(1);
779
636
  expect(abortListeners[callIndex]).toHaveBeenCalledTimes(1);
780
637
  callIndex = 2;
781
638
  const thirdCtx = fetchPage.mock.calls[callIndex][0];
782
639
  expect(thirdCtx.pageParam).toBe(11);
783
- expect(thirdCtx.queryKey).toEqual(key());
640
+ expect(thirdCtx.queryKey).toEqual(key);
784
641
  expect(thirdCtx.signal).toBeInstanceOf(AbortSignal);
785
- expect(thirdCtx.signal?.aborted).toBe(false);
642
+ expect(thirdCtx.signal.aborted).toBe(false);
786
643
  expect(onAborts[callIndex]).not.toHaveBeenCalled();
787
644
  expect(abortListeners[callIndex]).not.toHaveBeenCalled();
788
645
  });
@@ -791,22 +648,23 @@ describe('useInfiniteQuery', () => {
791
648
  const start = 10;
792
649
  const onAborts = [];
793
650
  const abortListeners = [];
794
- const fetchPage = jest.fn(async ({ pageParam = start, signal }) => {
795
- if (signal) {
796
- const onAbort = jest.fn();
797
- const abortListener = jest.fn();
798
- onAborts.push(onAbort);
799
- abortListeners.push(abortListener);
800
- signal.onabort = onAbort;
801
- signal.addEventListener('abort', abortListener);
802
- }
651
+ const fetchPage = jest.fn(async ({ pageParam, signal }) => {
652
+ const onAbort = jest.fn();
653
+ const abortListener = jest.fn();
654
+ onAborts.push(onAbort);
655
+ abortListeners.push(abortListener);
656
+ signal.onabort = onAbort;
657
+ signal.addEventListener('abort', abortListener);
803
658
  await sleep(50);
804
659
  return Number(pageParam);
805
660
  });
806
661
  function Page() {
807
- const state = createInfiniteQuery(key, fetchPage, {
662
+ const state = createInfiniteQuery(() => ({
663
+ queryKey: key,
664
+ queryFn: fetchPage,
808
665
  getNextPageParam: (lastPage) => lastPage + 1,
809
- });
666
+ defaultPageParam: start,
667
+ }));
810
668
  createEffect(() => {
811
669
  const { fetchNextPage } = state;
812
670
  setActTimeout(() => {
@@ -828,18 +686,18 @@ describe('useInfiniteQuery', () => {
828
686
  expect(abortListeners).toHaveLength(expectedCallCount);
829
687
  let callIndex = 0;
830
688
  const firstCtx = fetchPage.mock.calls[callIndex][0];
831
- expect(firstCtx.pageParam).toBeUndefined();
832
- expect(firstCtx.queryKey).toEqual(key());
689
+ expect(firstCtx.pageParam).toEqual(start);
690
+ expect(firstCtx.queryKey).toEqual(key);
833
691
  expect(firstCtx.signal).toBeInstanceOf(AbortSignal);
834
- expect(firstCtx.signal?.aborted).toBe(false);
692
+ expect(firstCtx.signal.aborted).toBe(false);
835
693
  expect(onAborts[callIndex]).not.toHaveBeenCalled();
836
694
  expect(abortListeners[callIndex]).not.toHaveBeenCalled();
837
695
  callIndex = 1;
838
696
  const secondCtx = fetchPage.mock.calls[callIndex][0];
839
697
  expect(secondCtx.pageParam).toBe(11);
840
- expect(secondCtx.queryKey).toEqual(key());
698
+ expect(secondCtx.queryKey).toEqual(key);
841
699
  expect(secondCtx.signal).toBeInstanceOf(AbortSignal);
842
- expect(secondCtx.signal?.aborted).toBe(false);
700
+ expect(secondCtx.signal.aborted).toBe(false);
843
701
  expect(onAborts[callIndex]).not.toHaveBeenCalled();
844
702
  expect(abortListeners[callIndex]).not.toHaveBeenCalled();
845
703
  });
@@ -848,13 +706,16 @@ describe('useInfiniteQuery', () => {
848
706
  const states = [];
849
707
  function Page() {
850
708
  const start = 10;
851
- const state = createInfiniteQuery(key, async ({ pageParam = start }) => {
852
- await sleep(50);
853
- return Number(pageParam);
854
- }, {
709
+ const state = createInfiniteQuery(() => ({
710
+ queryKey: key,
711
+ queryFn: async ({ pageParam }) => {
712
+ await sleep(50);
713
+ return Number(pageParam);
714
+ },
855
715
  getNextPageParam: (lastPage) => lastPage + 1,
716
+ defaultPageParam: start,
856
717
  notifyOnChangeProps: 'all',
857
- });
718
+ }));
858
719
  createRenderEffect(() => {
859
720
  states.push({ ...state });
860
721
  });
@@ -872,7 +733,7 @@ describe('useInfiniteQuery', () => {
872
733
  await sleep(100);
873
734
  expect(states.length).toBe(2);
874
735
  expect(states[0]).toMatchObject({
875
- hasNextPage: undefined,
736
+ hasNextPage: false,
876
737
  data: undefined,
877
738
  isFetching: true,
878
739
  isFetchingNextPage: false,
@@ -891,16 +752,19 @@ describe('useInfiniteQuery', () => {
891
752
  let fetches = 0;
892
753
  const initialData = { pages: [1, 2, 3, 4], pageParams: [0, 1, 2, 3] };
893
754
  function List() {
894
- createInfiniteQuery(key, async ({ pageParam = 0, signal: _ }) => {
895
- fetches++;
896
- await sleep(50);
897
- return Number(pageParam) * 10;
898
- }, {
755
+ createInfiniteQuery(() => ({
756
+ queryKey: key,
757
+ queryFn: async ({ pageParam, signal: _ }) => {
758
+ fetches++;
759
+ await sleep(50);
760
+ return Number(pageParam) * 10;
761
+ },
899
762
  initialData,
900
763
  getNextPageParam: (_, allPages) => {
901
764
  return allPages.length === 4 ? undefined : allPages.length;
902
765
  },
903
- });
766
+ defaultPageParam: 0,
767
+ }));
904
768
  return null;
905
769
  }
906
770
  function Page() {
@@ -917,87 +781,34 @@ describe('useInfiniteQuery', () => {
917
781
  </QueryClientProvider>));
918
782
  await sleep(300);
919
783
  expect(fetches).toBe(2);
920
- expect(queryClient.getQueryState(key())).toMatchObject({
784
+ expect(queryClient.getQueryState(key)).toMatchObject({
921
785
  data: initialData,
922
786
  status: 'success',
923
787
  error: null,
924
788
  });
925
789
  });
926
- it('should be able to override the cursor in the fetchNextPage callback', async () => {
927
- const key = queryKey();
928
- const states = [];
929
- function Page() {
930
- const state = createInfiniteQuery(key, async ({ pageParam = 0 }) => {
931
- await sleep(10);
932
- return Number(pageParam);
933
- }, {
934
- getNextPageParam: (lastPage) => lastPage + 1,
935
- notifyOnChangeProps: 'all',
936
- });
937
- createRenderEffect(() => {
938
- states.push({ ...state });
939
- });
940
- createEffect(() => {
941
- const { fetchNextPage } = state;
942
- setActTimeout(() => {
943
- fetchNextPage({ pageParam: 5 });
944
- }, 20);
945
- });
946
- return null;
947
- }
948
- render(() => (<QueryClientProvider client={queryClient}>
949
- <Page />
950
- </QueryClientProvider>));
951
- await sleep(100);
952
- expect(states.length).toBe(4);
953
- expect(states[0]).toMatchObject({
954
- hasNextPage: undefined,
955
- data: undefined,
956
- isFetching: true,
957
- isFetchingNextPage: false,
958
- isSuccess: false,
959
- });
960
- expect(states[1]).toMatchObject({
961
- hasNextPage: true,
962
- data: { pages: [0] },
963
- isFetching: false,
964
- isFetchingNextPage: false,
965
- isSuccess: true,
966
- });
967
- expect(states[2]).toMatchObject({
968
- hasNextPage: true,
969
- data: { pages: [0] },
970
- isFetching: true,
971
- isFetchingNextPage: true,
972
- isSuccess: true,
973
- });
974
- expect(states[3]).toMatchObject({
975
- hasNextPage: true,
976
- data: { pages: [0, 5] },
977
- isFetching: false,
978
- isFetchingNextPage: false,
979
- isSuccess: true,
980
- });
981
- });
982
790
  it('should be able to set new pages with the query client', async () => {
983
791
  const key = queryKey();
984
792
  const states = [];
985
793
  function Page() {
986
794
  const [firstPage, setFirstPage] = createSignal(0);
987
- const state = createInfiniteQuery(key, async ({ pageParam = firstPage() }) => {
988
- await sleep(10);
989
- return Number(pageParam);
990
- }, {
795
+ const state = createInfiniteQuery(() => ({
796
+ queryKey: key,
797
+ queryFn: async ({ pageParam }) => {
798
+ await sleep(10);
799
+ return Number(pageParam);
800
+ },
991
801
  getNextPageParam: (lastPage) => lastPage + 1,
992
802
  notifyOnChangeProps: 'all',
993
- });
803
+ defaultPageParam: firstPage(),
804
+ }));
994
805
  createRenderEffect(() => {
995
806
  states.push({ ...state });
996
807
  });
997
808
  createEffect(() => {
998
809
  const { refetch } = state;
999
810
  setActTimeout(() => {
1000
- queryClient.setQueryData(key(), { pages: [7, 8], pageParams: [7, 8] });
811
+ queryClient.setQueryData(key, { pages: [7, 8], pageParams: [7, 8] });
1001
812
  setFirstPage(7);
1002
813
  }, 20);
1003
814
  setActTimeout(() => {
@@ -1012,7 +823,7 @@ describe('useInfiniteQuery', () => {
1012
823
  await sleep(100);
1013
824
  expect(states.length).toBe(5);
1014
825
  expect(states[0]).toMatchObject({
1015
- hasNextPage: undefined,
826
+ hasNextPage: false,
1016
827
  data: undefined,
1017
828
  isFetching: true,
1018
829
  isFetchingNextPage: false,
@@ -1055,14 +866,17 @@ describe('useInfiniteQuery', () => {
1055
866
  const key = queryKey();
1056
867
  const states = [];
1057
868
  function Page() {
1058
- const state = createInfiniteQuery(key, async ({ pageParam }) => {
1059
- await sleep(10);
1060
- return pageParam;
1061
- }, {
869
+ const state = createInfiniteQuery(() => ({
870
+ queryKey: key,
871
+ queryFn: async ({ pageParam }) => {
872
+ await sleep(10);
873
+ return pageParam;
874
+ },
1062
875
  initialData: { pages: [1], pageParams: [1] },
1063
876
  getNextPageParam: (lastPage) => lastPage + 1,
877
+ defaultPageParam: 0,
1064
878
  notifyOnChangeProps: 'all',
1065
- });
879
+ }));
1066
880
  createRenderEffect(() => {
1067
881
  states.push({ ...state });
1068
882
  });
@@ -1112,9 +926,12 @@ describe('useInfiniteQuery', () => {
1112
926
  const key = queryKey();
1113
927
  const states = [];
1114
928
  function Page() {
1115
- const state = createInfiniteQuery(key, ({ pageParam = 1 }) => Number(pageParam), {
929
+ const state = createInfiniteQuery(() => ({
930
+ queryKey: key,
931
+ queryFn: ({ pageParam }) => Number(pageParam),
932
+ defaultPageParam: 1,
1116
933
  getNextPageParam: () => undefined,
1117
- });
934
+ }));
1118
935
  createRenderEffect(() => {
1119
936
  states.push({ ...state });
1120
937
  });
@@ -1127,7 +944,7 @@ describe('useInfiniteQuery', () => {
1127
944
  expect(states.length).toBe(2);
1128
945
  expect(states[0]).toMatchObject({
1129
946
  data: undefined,
1130
- hasNextPage: undefined,
947
+ hasNextPage: false,
1131
948
  isFetching: true,
1132
949
  isFetchingNextPage: false,
1133
950
  isSuccess: false,
@@ -1144,10 +961,13 @@ describe('useInfiniteQuery', () => {
1144
961
  const key = queryKey();
1145
962
  const states = [];
1146
963
  function Page() {
1147
- const state = createInfiniteQuery(key, ({ pageParam = 10 }) => pageParam, {
1148
- initialData: { pages: [10], pageParams: [undefined] },
964
+ const state = createInfiniteQuery(() => ({
965
+ queryKey: key,
966
+ queryFn: ({ pageParam }) => pageParam,
967
+ defaultPageParam: 10,
968
+ initialData: { pages: [10], pageParams: [10] },
1149
969
  getNextPageParam: (lastPage) => (lastPage === 10 ? 11 : undefined),
1150
- });
970
+ }));
1151
971
  createRenderEffect(() => {
1152
972
  states.push({ ...state });
1153
973
  });
@@ -1177,10 +997,13 @@ describe('useInfiniteQuery', () => {
1177
997
  const key = queryKey();
1178
998
  const states = [];
1179
999
  function Page() {
1180
- const state = createInfiniteQuery(key, ({ pageParam = 10 }) => pageParam, {
1181
- initialData: { pages: [10], pageParams: [undefined] },
1000
+ const state = createInfiniteQuery(() => ({
1001
+ queryKey: key,
1002
+ queryFn: ({ pageParam }) => pageParam,
1003
+ defaultPageParam: 10,
1004
+ initialData: { pages: [10], pageParams: [10] },
1182
1005
  getNextPageParam: () => undefined,
1183
- });
1006
+ }));
1184
1007
  createRenderEffect(() => {
1185
1008
  states.push({ ...state });
1186
1009
  });
@@ -1210,13 +1033,16 @@ describe('useInfiniteQuery', () => {
1210
1033
  const key = queryKey();
1211
1034
  const states = [];
1212
1035
  function Page() {
1213
- const state = createInfiniteQuery(key, ({ pageParam = 1 }) => Number(pageParam), {
1214
- getNextPageParam: (lastPage) => (lastPage === 1 ? 2 : false),
1036
+ const state = createInfiniteQuery(() => ({
1037
+ queryKey: key,
1038
+ queryFn: ({ pageParam }) => Number(pageParam),
1039
+ defaultPageParam: 1,
1040
+ getNextPageParam: (lastPage) => (lastPage === 1 ? 2 : undefined),
1215
1041
  select: (data) => ({
1216
1042
  pages: data.pages.map((x) => x.toString()),
1217
1043
  pageParams: data.pageParams,
1218
1044
  }),
1219
- });
1045
+ }));
1220
1046
  createRenderEffect(() => {
1221
1047
  states.push({ ...state });
1222
1048
  });
@@ -1229,7 +1055,7 @@ describe('useInfiniteQuery', () => {
1229
1055
  expect(states.length).toBe(2);
1230
1056
  expect(states[0]).toMatchObject({
1231
1057
  data: undefined,
1232
- hasNextPage: undefined,
1058
+ hasNextPage: false,
1233
1059
  isFetching: true,
1234
1060
  isFetchingNextPage: false,
1235
1061
  isSuccess: false,
@@ -1257,9 +1083,12 @@ describe('useInfiniteQuery', () => {
1257
1083
  };
1258
1084
  function Page() {
1259
1085
  let fetchCountRef = 0;
1260
- const state = createInfiniteQuery(key, ({ pageParam = 0 }) => fetchItemsWithLimit(pageParam, fetchCountRef++), {
1086
+ const state = createInfiniteQuery(() => ({
1087
+ queryKey: key,
1088
+ queryFn: ({ pageParam }) => fetchItemsWithLimit(pageParam, fetchCountRef++),
1089
+ defaultPageParam: 0,
1261
1090
  getNextPageParam: (lastPage) => lastPage.nextId,
1262
- });
1091
+ }));
1263
1092
  return (<div>
1264
1093
  <h1>Pagination</h1>
1265
1094
  <Switch fallback={<>
@@ -1291,7 +1120,7 @@ describe('useInfiniteQuery', () => {
1291
1120
  // makes an actual network request
1292
1121
  // and calls invalidateQueries in an onSuccess
1293
1122
  items.splice(4, 1);
1294
- queryClient.invalidateQueries(key());
1123
+ queryClient.invalidateQueries({ queryKey: key });
1295
1124
  }}>
1296
1125
  Remove item
1297
1126
  </button>
@@ -1300,7 +1129,7 @@ describe('useInfiniteQuery', () => {
1300
1129
  {!state.isFetchingNextPage ? 'Background Updating...' : null}
1301
1130
  </div>
1302
1131
  </>}>
1303
- <Match when={state.status === 'loading'}>Loading...</Match>
1132
+ <Match when={state.status === 'pending'}>Loading...</Match>
1304
1133
  <Match when={state.status === 'error'}>
1305
1134
  <span>Error: {state.error.message}</span>
1306
1135
  </Match>
@@ -1349,9 +1178,12 @@ describe('useInfiniteQuery', () => {
1349
1178
  function Page() {
1350
1179
  let fetchCountRef = 0;
1351
1180
  const [isRemovedLastPage, setIsRemovedLastPage] = createSignal(false);
1352
- const state = createInfiniteQuery(key, ({ pageParam = 0 }) => fetchItems(pageParam, fetchCountRef++, pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage())), {
1181
+ const state = createInfiniteQuery(() => ({
1182
+ queryKey: key,
1183
+ queryFn: ({ pageParam }) => fetchItems(pageParam, fetchCountRef++, pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage())),
1184
+ defaultPageParam: 0,
1353
1185
  getNextPageParam: (lastPage) => lastPage.nextId,
1354
- });
1186
+ }));
1355
1187
  return (<div>
1356
1188
  <h1>Pagination</h1>
1357
1189
  <Switch fallback={<>
@@ -1387,7 +1219,7 @@ describe('useInfiniteQuery', () => {
1387
1219
  : null}
1388
1220
  </div>
1389
1221
  </>}>
1390
- <Match when={state.status === 'loading'}>Loading...</Match>
1222
+ <Match when={state.status === 'pending'}>Loading...</Match>
1391
1223
  <Match when={state.status === 'error'}>
1392
1224
  <span>Error: {state.error.message}</span>
1393
1225
  </Match>
@@ -1442,7 +1274,12 @@ describe('useInfiniteQuery', () => {
1442
1274
  return promise;
1443
1275
  };
1444
1276
  function Page() {
1445
- const state = createInfiniteQuery(key, queryFn);
1277
+ const state = createInfiniteQuery(() => ({
1278
+ queryKey: key,
1279
+ queryFn,
1280
+ getNextPageParam: () => undefined,
1281
+ defaultPageParam: 0,
1282
+ }));
1446
1283
  return (<div>
1447
1284
  <h1>Status: {state.status}</h1>
1448
1285
  </div>);
@@ -1455,4 +1292,23 @@ describe('useInfiniteQuery', () => {
1455
1292
  await waitFor(() => screen.getByText('off'));
1456
1293
  expect(cancelFn).toHaveBeenCalled();
1457
1294
  });
1295
+ it('should use provided custom queryClient', async () => {
1296
+ const key = queryKey();
1297
+ const queryFn = () => {
1298
+ return Promise.resolve('custom client');
1299
+ };
1300
+ function Page() {
1301
+ const state = createInfiniteQuery(() => ({
1302
+ queryKey: key,
1303
+ queryFn,
1304
+ getNextPageParam: () => undefined,
1305
+ defaultPageParam: 0,
1306
+ }), () => queryClient);
1307
+ return (<div>
1308
+ <h1>Status: {state.data?.pages[0]}</h1>
1309
+ </div>);
1310
+ }
1311
+ render(() => <Page />);
1312
+ await waitFor(() => screen.getByText('Status: custom client'));
1313
+ });
1458
1314
  });