@tanstack/solid-query 4.24.10 → 5.0.0-alpha.1

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 +300 -0
  2. package/build/cjs/index.js.map +1 -0
  3. package/build/esm/index.js +285 -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 +8 -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 +16 -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 -3577
  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,6 +1,6 @@
1
1
  import { fireEvent, render, screen, waitFor } from 'solid-testing-library';
2
2
  import * as QueriesObserverModule from '../../../query-core/src/queriesObserver';
3
- import { createContext, createMemo, createRenderEffect, createSignal, ErrorBoundary, } from 'solid-js';
3
+ import { createRenderEffect, createSignal } from 'solid-js';
4
4
  import { createQueries, QueriesObserver, QueryCache, QueryClientProvider, } from '..';
5
5
  import { createQueryClient, expectType, expectTypeNotAny, queryKey, sleep, } from './utils';
6
6
  describe('useQueries', () => {
@@ -11,7 +11,7 @@ describe('useQueries', () => {
11
11
  const key2 = queryKey();
12
12
  const results = [];
13
13
  function Page() {
14
- const result = createQueries({
14
+ const result = createQueries(() => ({
15
15
  queries: [
16
16
  {
17
17
  queryKey: key1,
@@ -28,7 +28,7 @@ describe('useQueries', () => {
28
28
  },
29
29
  },
30
30
  ],
31
- });
31
+ }));
32
32
  createRenderEffect(() => {
33
33
  results.push([...result]);
34
34
  });
@@ -48,223 +48,6 @@ describe('useQueries', () => {
48
48
  expect(results[1]).toMatchObject([{ data: 1 }, { data: undefined }]);
49
49
  expect(results[2]).toMatchObject([{ data: 1 }, { data: 2 }]);
50
50
  });
51
- it('should keep previous data if amount of queries is the same', async () => {
52
- const key1 = queryKey();
53
- const key2 = queryKey();
54
- const states = [];
55
- function Page() {
56
- const [count, setCount] = createSignal(1);
57
- const result = createQueries({
58
- queries: [
59
- {
60
- queryKey: () => [key1(), count()],
61
- keepPreviousData: true,
62
- queryFn: async () => {
63
- await sleep(10);
64
- return count() * 2;
65
- },
66
- },
67
- {
68
- queryKey: () => [key2(), count()],
69
- keepPreviousData: true,
70
- queryFn: async () => {
71
- await sleep(35);
72
- return count() * 5;
73
- },
74
- },
75
- ],
76
- });
77
- createRenderEffect(() => {
78
- states.push([...result]);
79
- });
80
- const isFetching = createMemo(() => result.some((r) => r.isFetching));
81
- return (<div>
82
- <div>
83
- data1: {String(result[0].data ?? 'null')}, data2:{' '}
84
- {String(result[1].data ?? 'null')}
85
- </div>
86
- <div>isFetching: {String(isFetching())}</div>
87
- <button onClick={() => setCount((prev) => prev + 1)}>inc</button>
88
- </div>);
89
- }
90
- render(() => (<QueryClientProvider client={queryClient}>
91
- <Page />
92
- </QueryClientProvider>));
93
- await waitFor(() => screen.getByText('data1: 2, data2: 5'));
94
- fireEvent.click(screen.getByRole('button', { name: /inc/i }));
95
- await waitFor(() => screen.getByText('data1: 4, data2: 10'));
96
- await waitFor(() => screen.getByText('isFetching: false'));
97
- expect(states[states.length - 1]).toMatchObject([
98
- { status: 'success', data: 4, isPreviousData: false, isFetching: false },
99
- { status: 'success', data: 10, isPreviousData: false, isFetching: false },
100
- ]);
101
- });
102
- it('should keep previous data for variable amounts of useQueries', async () => {
103
- const key = queryKey();
104
- const states = [];
105
- function Page() {
106
- const [count, setCount] = createSignal(2);
107
- const result = createQueries({
108
- // TODO(lukemurray): reactive queries doesn't appear to work
109
- get queries() {
110
- return Array.from({ length: count() }, (_, i) => ({
111
- queryKey: () => [key(), count(), i + 1],
112
- keepPreviousData: true,
113
- queryFn: async () => {
114
- await sleep(35 * (i + 1));
115
- return (i + 1) * count() * 2;
116
- },
117
- }));
118
- },
119
- });
120
- createRenderEffect(() => {
121
- states.push([...result]);
122
- });
123
- const isFetching = createMemo(() => result.some((r) => r.isFetching));
124
- return (<div>
125
- <div>data: {result.map((it) => it.data).join(',')}</div>
126
- <div>isFetching: {String(isFetching())}</div>
127
- <button onClick={() => setCount((prev) => prev + 1)}>inc</button>
128
- </div>);
129
- }
130
- render(() => (<QueryClientProvider client={queryClient}>
131
- <Page />
132
- </QueryClientProvider>));
133
- await waitFor(() => screen.getByText('data: 4,8'));
134
- fireEvent.click(screen.getByRole('button', { name: /inc/i }));
135
- await waitFor(() => screen.getByText('data: 6,12,18'));
136
- await waitFor(() => screen.getByText('isFetching: false'));
137
- expect(states[states.length - 1]).toMatchObject([
138
- { status: 'success', data: 6, isPreviousData: false, isFetching: false },
139
- { status: 'success', data: 12, isPreviousData: false, isFetching: false },
140
- { status: 'success', data: 18, isPreviousData: false, isFetching: false },
141
- ]);
142
- });
143
- it('should keep previous data when switching between queries', async () => {
144
- const key = queryKey();
145
- const states = [];
146
- function Page() {
147
- const [series1, setSeries1] = createSignal(1);
148
- const [series2, setSeries2] = createSignal(2);
149
- const ids = [series1, series2];
150
- const result = createQueries({
151
- queries: ids.map((id) => {
152
- return {
153
- queryKey: () => [key(), id()],
154
- queryFn: async () => {
155
- await sleep(5);
156
- return id() * 5;
157
- },
158
- keepPreviousData: true,
159
- };
160
- }),
161
- });
162
- createRenderEffect(() => {
163
- states.push([...result]);
164
- });
165
- const isFetching = createMemo(() => result.some((r) => r.isFetching));
166
- return (<div>
167
- <div>
168
- data1: {String(result[0]?.data ?? 'null')}, data2:{' '}
169
- {String(result[1]?.data ?? 'null')}
170
- </div>
171
- <div>isFetching: {String(isFetching())}</div>
172
- <button onClick={() => setSeries2(3)}>setSeries2</button>
173
- <button onClick={() => setSeries1(2)}>setSeries1</button>
174
- </div>);
175
- }
176
- render(() => (<QueryClientProvider client={queryClient}>
177
- <Page />
178
- </QueryClientProvider>));
179
- await waitFor(() => screen.getByText('data1: 5, data2: 10'));
180
- fireEvent.click(screen.getByRole('button', { name: /setSeries2/i }));
181
- await waitFor(() => screen.getByText('data1: 5, data2: 15'));
182
- fireEvent.click(screen.getByRole('button', { name: /setSeries1/i }));
183
- await waitFor(() => screen.getByText('data1: 10, data2: 15'));
184
- await waitFor(() => screen.getByText('isFetching: false'));
185
- expect(states[states.length - 1]).toMatchObject([
186
- { status: 'success', data: 10, isPreviousData: false, isFetching: false },
187
- { status: 'success', data: 15, isPreviousData: false, isFetching: false },
188
- ]);
189
- });
190
- it('should not go to infinite render loop with previous data when toggling queries', async () => {
191
- const key = queryKey();
192
- const states = [];
193
- function Page() {
194
- const [enableId1, setEnableId1] = createSignal(true);
195
- const ids = createMemo(() => (enableId1() ? [1, 2] : [2]));
196
- const result = createQueries({
197
- // TODO(lukemurray): same issue queries should be reactive
198
- get queries() {
199
- return ids().map((id) => {
200
- return {
201
- queryKey: () => [key(), id],
202
- queryFn: async () => {
203
- await sleep(5);
204
- return id * 5;
205
- },
206
- keepPreviousData: true,
207
- };
208
- });
209
- },
210
- });
211
- createRenderEffect(() => {
212
- states.push([...result]);
213
- });
214
- const text = createMemo(() => {
215
- return result
216
- .map((r, idx) => `data${idx + 1}: ${r.data ?? 'null'}`)
217
- .join(' ');
218
- });
219
- const isFetching = createMemo(() => result.some((r) => r.isFetching));
220
- return (<div>
221
- <div>{text()}</div>
222
- <div>isFetching: {String(isFetching())}</div>
223
- <button onClick={() => setEnableId1(false)}>set1Disabled</button>
224
- <button onClick={() => setEnableId1(true)}>set2Enabled</button>
225
- </div>);
226
- }
227
- render(() => (<QueryClientProvider client={queryClient}>
228
- <Page />
229
- </QueryClientProvider>));
230
- await waitFor(() => screen.getByText('data1: 5 data2: 10'));
231
- fireEvent.click(screen.getByRole('button', { name: /set1Disabled/i }));
232
- await waitFor(() => screen.getByText('data1: 10'));
233
- await waitFor(() => screen.getByText('isFetching: false'));
234
- fireEvent.click(screen.getByRole('button', { name: /set2Enabled/i }));
235
- await waitFor(() => screen.getByText('data1: 5 data2: 10'));
236
- await waitFor(() => screen.getByText('isFetching: false'));
237
- await waitFor(() => expect(states.length).toBe(5));
238
- expect(states[0]).toMatchObject([
239
- {
240
- status: 'loading',
241
- data: undefined,
242
- isPreviousData: false,
243
- isFetching: true,
244
- },
245
- {
246
- status: 'loading',
247
- data: undefined,
248
- isPreviousData: false,
249
- isFetching: true,
250
- },
251
- ]);
252
- expect(states[1]).toMatchObject([
253
- { status: 'success', data: 5, isPreviousData: false, isFetching: false },
254
- { status: 'success', data: 10, isPreviousData: false, isFetching: false },
255
- ]);
256
- expect(states[2]).toMatchObject([
257
- { status: 'success', data: 10, isPreviousData: false, isFetching: false },
258
- ]);
259
- expect(states[3]).toMatchObject([
260
- { status: 'success', data: 5, isPreviousData: false, isFetching: true },
261
- { status: 'success', data: 10, isPreviousData: false, isFetching: false },
262
- ]);
263
- expect(states[4]).toMatchObject([
264
- { status: 'success', data: 5, isPreviousData: false, isFetching: false },
265
- { status: 'success', data: 10, isPreviousData: false, isFetching: false },
266
- ]);
267
- });
268
51
  it('handles type parameter - tuple of tuples', async () => {
269
52
  const key1 = queryKey();
270
53
  const key2 = queryKey();
@@ -272,7 +55,7 @@ describe('useQueries', () => {
272
55
  // @ts-expect-error (Page component is not rendered)
273
56
  // eslint-disable-next-line
274
57
  function Page() {
275
- const result1 = createQueries({
58
+ const result1 = createQueries(() => ({
276
59
  queries: [
277
60
  {
278
61
  queryKey: key1,
@@ -287,7 +70,7 @@ describe('useQueries', () => {
287
70
  queryFn: () => ['string[]'],
288
71
  },
289
72
  ],
290
- });
73
+ }));
291
74
  expectType(result1[0]);
292
75
  expectType(result1[1]);
293
76
  expectType(result1[2]);
@@ -296,7 +79,7 @@ describe('useQueries', () => {
296
79
  expectType(result1[2].data);
297
80
  expectType(result1[2].error);
298
81
  // TData (3rd element) takes precedence over TQueryFnData (1st element)
299
- const result2 = createQueries({
82
+ const result2 = createQueries(() => ({
300
83
  queries: [
301
84
  {
302
85
  queryKey: key1,
@@ -317,13 +100,13 @@ describe('useQueries', () => {
317
100
  },
318
101
  },
319
102
  ],
320
- });
103
+ }));
321
104
  expectType(result2[0]);
322
105
  expectType(result2[1]);
323
106
  expectType(result2[0].data);
324
107
  expectType(result2[1].data);
325
108
  // types should be enforced
326
- createQueries({
109
+ createQueries(() => ({
327
110
  queries: [
328
111
  {
329
112
  queryKey: key1,
@@ -362,18 +145,16 @@ describe('useQueries', () => {
362
145
  initialData: 123,
363
146
  },
364
147
  ],
365
- });
148
+ }));
366
149
  // field names should be enforced
367
- createQueries({
150
+ createQueries(() => ({
368
151
  queries: [
369
152
  {
370
153
  queryKey: key1,
371
154
  queryFn: () => 'string',
372
- // @ts-expect-error (invalidField)
373
- someInvalidField: [],
374
155
  },
375
156
  ],
376
- });
157
+ }));
377
158
  }
378
159
  });
379
160
  it('handles type parameter - tuple of objects', async () => {
@@ -383,7 +164,7 @@ describe('useQueries', () => {
383
164
  // @ts-expect-error (Page component is not rendered)
384
165
  // eslint-disable-next-line
385
166
  function Page() {
386
- const result1 = createQueries({
167
+ const result1 = createQueries(() => ({
387
168
  queries: [
388
169
  {
389
170
  queryKey: key1,
@@ -398,7 +179,7 @@ describe('useQueries', () => {
398
179
  queryFn: () => ['string[]'],
399
180
  },
400
181
  ],
401
- });
182
+ }));
402
183
  expectType(result1[0]);
403
184
  expectType(result1[1]);
404
185
  expectType(result1[2]);
@@ -407,7 +188,7 @@ describe('useQueries', () => {
407
188
  expectType(result1[2].data);
408
189
  expectType(result1[2].error);
409
190
  // TData (data prop) takes precedence over TQueryFnData (queryFnData prop)
410
- const result2 = createQueries({
191
+ const result2 = createQueries(() => ({
411
192
  queries: [
412
193
  {
413
194
  queryKey: key1,
@@ -428,13 +209,13 @@ describe('useQueries', () => {
428
209
  },
429
210
  },
430
211
  ],
431
- });
212
+ }));
432
213
  expectType(result2[0]);
433
214
  expectType(result2[1]);
434
215
  expectType(result2[0].data);
435
216
  expectType(result2[1].data);
436
217
  // can pass only TData (data prop) although TQueryFnData will be left unknown
437
- const result3 = createQueries({
218
+ const result3 = createQueries(() => ({
438
219
  queries: [
439
220
  {
440
221
  queryKey: key1,
@@ -455,13 +236,13 @@ describe('useQueries', () => {
455
236
  },
456
237
  },
457
238
  ],
458
- });
239
+ }));
459
240
  expectType(result3[0]);
460
241
  expectType(result3[1]);
461
242
  expectType(result3[0].data);
462
243
  expectType(result3[1].data);
463
244
  // types should be enforced
464
- createQueries({
245
+ createQueries(() => ({
465
246
  queries: [
466
247
  {
467
248
  queryKey: key1,
@@ -500,18 +281,16 @@ describe('useQueries', () => {
500
281
  initialData: 123,
501
282
  },
502
283
  ],
503
- });
284
+ }));
504
285
  // field names should be enforced
505
- createQueries({
286
+ createQueries(() => ({
506
287
  queries: [
507
288
  {
508
289
  queryKey: key1,
509
290
  queryFn: () => 'string',
510
- // @ts-expect-error (invalidField)
511
- someInvalidField: [],
512
291
  },
513
292
  ],
514
- });
293
+ }));
515
294
  }
516
295
  });
517
296
  it('handles array literal without type parameter to infer result type', async () => {
@@ -523,24 +302,24 @@ describe('useQueries', () => {
523
302
  // eslint-disable-next-line
524
303
  function Page() {
525
304
  // Array.map preserves TQueryFnData
526
- const result1 = createQueries({
305
+ const result1 = createQueries(() => ({
527
306
  queries: Array(50).map((_, i) => ({
528
- queryKey: () => ['key', i],
307
+ queryKey: ['key', i],
529
308
  queryFn: () => i + 10,
530
309
  })),
531
- });
310
+ }));
532
311
  expectType(result1);
533
312
  expectType(result1[0]?.data);
534
313
  // Array.map preserves TData
535
- const result2 = createQueries({
314
+ const result2 = createQueries(() => ({
536
315
  queries: Array(50).map((_, i) => ({
537
- queryKey: () => ['key', i],
316
+ queryKey: ['key', i],
538
317
  queryFn: () => i + 10,
539
318
  select: (data) => data.toString(),
540
319
  })),
541
- });
320
+ }));
542
321
  expectType(result2);
543
- const result3 = createQueries({
322
+ const result3 = createQueries(() => ({
544
323
  queries: [
545
324
  {
546
325
  queryKey: key1,
@@ -556,7 +335,7 @@ describe('useQueries', () => {
556
335
  select: () => 123,
557
336
  },
558
337
  ],
559
- });
338
+ }));
560
339
  expectType(result3[0]);
561
340
  expectType(result3[1]);
562
341
  expectType(result3[2]);
@@ -565,7 +344,7 @@ describe('useQueries', () => {
565
344
  // select takes precedence over queryFn
566
345
  expectType(result3[2].data);
567
346
  // initialData/placeholderData are enforced
568
- createQueries({
347
+ createQueries(() => ({
569
348
  queries: [
570
349
  {
571
350
  queryKey: key1,
@@ -582,9 +361,9 @@ describe('useQueries', () => {
582
361
  initialData: 123,
583
362
  },
584
363
  ],
585
- });
364
+ }));
586
365
  // select / onSuccess / onSettled params are "indirectly" enforced
587
- createQueries({
366
+ createQueries(() => ({
588
367
  queries: [
589
368
  // unfortunately TS will not suggest the type for you
590
369
  {
@@ -627,9 +406,9 @@ describe('useQueries', () => {
627
406
  },
628
407
  },
629
408
  ],
630
- });
409
+ }));
631
410
  // callbacks are also indirectly enforced with Array.map
632
- createQueries({
411
+ createQueries(() => ({
633
412
  // @ts-expect-error (onSuccess only accepts string)
634
413
  queries: Array(50).map((_, i) => ({
635
414
  queryKey: ['key', i],
@@ -637,17 +416,17 @@ describe('useQueries', () => {
637
416
  select: (data) => data.toString(),
638
417
  onSuccess: (_data) => null,
639
418
  })),
640
- });
641
- createQueries({
419
+ }));
420
+ createQueries(() => ({
642
421
  queries: Array(50).map((_, i) => ({
643
- queryKey: () => ['key', i],
422
+ queryKey: ['key', i],
644
423
  queryFn: () => i + 10,
645
424
  select: (data) => data.toString(),
646
425
  onSuccess: (_data) => null,
647
426
  })),
648
- });
427
+ }));
649
428
  // results inference works when all the handlers are defined
650
- const result4 = createQueries({
429
+ const result4 = createQueries(() => ({
651
430
  queries: [
652
431
  {
653
432
  queryKey: key1,
@@ -680,12 +459,12 @@ describe('useQueries', () => {
680
459
  },
681
460
  },
682
461
  ],
683
- });
462
+ }));
684
463
  expectType(result4[0]);
685
464
  expectType(result4[1]);
686
465
  expectType(result4[2]);
687
466
  // handles when queryFn returns a Promise
688
- const result5 = createQueries({
467
+ const result5 = createQueries(() => ({
689
468
  queries: [
690
469
  {
691
470
  queryKey: key1,
@@ -698,68 +477,64 @@ describe('useQueries', () => {
698
477
  onSettled: (a) => null,
699
478
  },
700
479
  ],
701
- });
480
+ }));
702
481
  expectType(result5[0]);
703
482
  // Array as const does not throw error
704
- const result6 = createQueries({
483
+ const result6 = createQueries(() => ({
705
484
  queries: [
706
485
  {
707
- queryKey: () => ['key1'],
486
+ queryKey: ['key1'],
708
487
  queryFn: () => 'string',
709
488
  },
710
489
  {
711
- queryKey: () => ['key1'],
490
+ queryKey: ['key1'],
712
491
  queryFn: () => 123,
713
492
  },
714
493
  ],
715
- });
494
+ }));
716
495
  expectType(result6[0]);
717
496
  expectType(result6[1]);
718
497
  // field names should be enforced - array literal
719
- createQueries({
498
+ createQueries(() => ({
720
499
  queries: [
721
500
  {
722
501
  queryKey: key1,
723
502
  queryFn: () => 'string',
724
- // @ts-expect-error (invalidField)
725
- someInvalidField: [],
726
503
  },
727
504
  ],
728
- });
505
+ }));
729
506
  // field names should be enforced - Array.map() result
730
- createQueries({
507
+ createQueries(() => ({
731
508
  // @ts-expect-error (invalidField)
732
509
  queries: Array(10).map(() => ({
733
510
  someInvalidField: '',
734
511
  })),
735
- });
512
+ }));
736
513
  // field names should be enforced - array literal
737
- createQueries({
514
+ createQueries(() => ({
738
515
  queries: [
739
516
  {
740
517
  queryKey: key1,
741
518
  queryFn: () => 'string',
742
- // @ts-expect-error (invalidField)
743
- someInvalidField: [],
744
519
  },
745
520
  ],
746
- });
521
+ }));
747
522
  // supports queryFn using fetch() to return Promise<any> - Array.map() result
748
- createQueries({
523
+ createQueries(() => ({
749
524
  queries: Array(50).map((_, i) => ({
750
- queryKey: () => ['key', i],
525
+ queryKey: ['key', i],
751
526
  queryFn: () => fetch('return Promise<any>').then((resp) => resp.json()),
752
527
  })),
753
- });
528
+ }));
754
529
  // supports queryFn using fetch() to return Promise<any> - array literal
755
- createQueries({
530
+ createQueries(() => ({
756
531
  queries: [
757
532
  {
758
533
  queryKey: key1,
759
534
  queryFn: () => fetch('return Promise<any>').then((resp) => resp.json()),
760
535
  },
761
536
  ],
762
- });
537
+ }));
763
538
  }
764
539
  });
765
540
  it('handles strongly typed queryFn factories and useQueries wrappers', () => {
@@ -775,7 +550,7 @@ describe('useQueries', () => {
775
550
  const getSelectorB = () => (data) => [data, +data];
776
551
  // Wrapper with strongly typed array-parameter
777
552
  function useWrappedQueries(queries) {
778
- return createQueries({
553
+ return createQueries(() => ({
779
554
  queries: queries.map(
780
555
  // no need to type the mapped query
781
556
  (query) => {
@@ -792,43 +567,43 @@ describe('useQueries', () => {
792
567
  : undefined,
793
568
  };
794
569
  }),
795
- });
570
+ }));
796
571
  }
797
572
  // @ts-expect-error (Page component is not rendered)
798
573
  // eslint-disable-next-line
799
574
  function Page() {
800
- const result = createQueries({
575
+ const result = createQueries(() => ({
801
576
  queries: [
802
577
  {
803
- queryKey: () => getQueryKeyA(),
578
+ queryKey: getQueryKeyA(),
804
579
  queryFn: getQueryFunctionA(),
805
580
  },
806
581
  {
807
- queryKey: () => getQueryKeyB('id'),
582
+ queryKey: getQueryKeyB('id'),
808
583
  queryFn: getQueryFunctionB(),
809
584
  },
810
585
  ],
811
- });
586
+ }));
812
587
  expectType(result[0]);
813
588
  expectType(result[1]);
814
- const withSelector = createQueries({
589
+ const withSelector = createQueries(() => ({
815
590
  queries: [
816
591
  {
817
- queryKey: () => getQueryKeyA(),
592
+ queryKey: getQueryKeyA(),
818
593
  queryFn: getQueryFunctionA(),
819
594
  select: getSelectorA(),
820
595
  },
821
596
  {
822
- queryKey: () => getQueryKeyB('id'),
597
+ queryKey: getQueryKeyB('id'),
823
598
  queryFn: getQueryFunctionB(),
824
599
  select: getSelectorB(),
825
600
  },
826
601
  ],
827
- });
602
+ }));
828
603
  expectType(withSelector[0]);
829
604
  expectType(withSelector[1]);
830
605
  const withWrappedQueries = useWrappedQueries(Array(10).map(() => ({
831
- queryKey: () => getQueryKeyA(),
606
+ queryKey: getQueryKeyA(),
832
607
  queryFn: getQueryFunctionA(),
833
608
  select: getSelectorA(),
834
609
  })));
@@ -851,7 +626,7 @@ describe('useQueries', () => {
851
626
  return new QueriesObserverMock(fn);
852
627
  });
853
628
  function Queries() {
854
- createQueries({
629
+ createQueries(() => ({
855
630
  queries: [
856
631
  {
857
632
  queryKey: key1,
@@ -861,7 +636,7 @@ describe('useQueries', () => {
861
636
  },
862
637
  },
863
638
  ],
864
- });
639
+ }));
865
640
  return (<div>
866
641
  <span>queries</span>
867
642
  </div>);
@@ -882,77 +657,21 @@ describe('useQueries', () => {
882
657
  await sleep(20);
883
658
  QueriesObserverSpy.mockRestore();
884
659
  });
885
- describe('with custom context', () => {
886
- it('should return the correct states', async () => {
887
- const context = createContext(undefined);
888
- const key1 = queryKey();
889
- const key2 = queryKey();
890
- const results = [];
891
- function Page() {
892
- const result = createQueries({
893
- context,
894
- queries: [
895
- {
896
- queryKey: key1,
897
- queryFn: async () => {
898
- await sleep(5);
899
- return 1;
900
- },
901
- },
902
- {
903
- queryKey: key2,
904
- queryFn: async () => {
905
- await sleep(10);
906
- return 2;
907
- },
908
- },
909
- ],
910
- });
911
- createRenderEffect(() => {
912
- results.push([...result]);
913
- });
914
- return null;
915
- }
916
- render(() => (<QueryClientProvider client={queryClient} context={context}>
917
- <Page />
918
- </QueryClientProvider>));
919
- await sleep(30);
920
- expect(results[0]).toMatchObject([
921
- { data: undefined },
922
- { data: undefined },
923
- ]);
924
- expect(results[results.length - 1]).toMatchObject([
925
- { data: 1 },
926
- { data: 2 },
927
- ]);
928
- });
929
- it('should throw if the context is necessary and is not passed to useQueries', async () => {
930
- const context = createContext(undefined);
931
- const key1 = queryKey();
932
- const key2 = queryKey();
933
- const results = [];
934
- function Page() {
935
- const result = createQueries({
936
- queries: [
937
- {
938
- queryKey: key1,
939
- queryFn: async () => 1,
940
- },
941
- {
942
- queryKey: key2,
943
- queryFn: async () => 2,
944
- },
945
- ],
946
- });
947
- results.push(result);
948
- return null;
949
- }
950
- render(() => (<QueryClientProvider client={queryClient} context={context}>
951
- <ErrorBoundary fallback={() => <div>error boundary</div>}>
952
- <Page />
953
- </ErrorBoundary>
954
- </QueryClientProvider>));
955
- await waitFor(() => screen.getByText('error boundary'));
956
- });
660
+ it('should use provided custom queryClient', async () => {
661
+ const key = queryKey();
662
+ const queryFn = () => {
663
+ return Promise.resolve('custom client');
664
+ };
665
+ function Page() {
666
+ const state = createQueries(() => ({
667
+ queries: [{ queryKey: key, queryFn }],
668
+ queryClient,
669
+ }));
670
+ return (<div>
671
+ <h1>Status: {state[0].data}</h1>
672
+ </div>);
673
+ }
674
+ render(() => <Page />);
675
+ await waitFor(() => screen.getByText('Status: custom client'));
957
676
  });
958
677
  });