@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.
- package/build/cjs/index.js +298 -0
- package/build/cjs/index.js.map +1 -0
- package/build/esm/index.js +283 -0
- package/build/esm/index.js.map +1 -0
- package/build/source/QueryClientProvider.jsx +21 -0
- package/build/source/__tests__/QueryClientProvider.test.jsx +120 -0
- package/build/{solid → source}/__tests__/createInfiniteQuery.test.jsx +228 -372
- package/build/{solid → source}/__tests__/createMutation.test.jsx +174 -165
- package/build/{solid → source}/__tests__/createQueries.test.jsx +86 -367
- package/build/{solid → source}/__tests__/createQuery.test.jsx +991 -943
- package/build/{solid → source}/__tests__/createQuery.types.test.jsx +35 -24
- package/build/{solid → source}/__tests__/suspense.test.jsx +177 -148
- package/build/{solid → source}/__tests__/transition.test.jsx +7 -4
- package/build/{solid → source}/__tests__/useIsFetching.test.jsx +68 -85
- package/build/{solid → source}/__tests__/useIsMutating.test.jsx +78 -93
- package/build/{solid → source}/__tests__/utils.jsx +3 -9
- package/build/source/createBaseQuery.js +147 -0
- package/build/source/createInfiniteQuery.js +6 -0
- package/build/{solid → source}/createMutation.js +7 -9
- package/build/source/createQueries.js +32 -0
- package/build/source/createQuery.js +6 -0
- package/build/{solid → source}/index.js +5 -3
- package/build/source/setBatchUpdatesFn.js +3 -0
- package/build/source/useIsFetching.js +12 -0
- package/build/source/useIsMutating.js +12 -0
- package/build/source/utils.js +7 -0
- package/build/types/QueryClientProvider.d.ts +9 -0
- package/build/{lib → types}/__tests__/utils.d.ts +3 -8
- package/build/types/createBaseQuery.d.ts +4 -0
- package/build/types/createInfiniteQuery.d.ts +3 -0
- package/build/types/createMutation.d.ts +3 -0
- package/build/{lib → types}/createQueries.d.ts +10 -8
- package/build/types/createQuery.d.ts +11 -0
- package/build/{lib → types}/index.d.ts +4 -3
- package/build/types/setBatchUpdatesFn.d.ts +1 -0
- package/build/types/types.d.ts +33 -0
- package/build/types/useIsFetching.d.ts +8 -0
- package/build/types/useIsMutating.d.ts +8 -0
- package/build/types/utils.d.ts +1 -0
- package/build/umd/index.js +2 -0
- package/build/umd/index.js.map +1 -0
- package/package.json +25 -17
- package/src/QueryClientProvider.tsx +17 -86
- package/src/__tests__/QueryClientProvider.test.tsx +37 -140
- package/src/__tests__/createInfiniteQuery.test.tsx +277 -508
- package/src/__tests__/createMutation.test.tsx +177 -225
- package/src/__tests__/createQueries.test.tsx +180 -528
- package/src/__tests__/createQuery.test.tsx +970 -1200
- package/src/__tests__/createQuery.types.test.tsx +30 -25
- package/src/__tests__/suspense.test.tsx +141 -178
- package/src/__tests__/transition.test.tsx +7 -4
- package/src/__tests__/useIsFetching.test.tsx +77 -122
- package/src/__tests__/useIsMutating.test.tsx +83 -128
- package/src/__tests__/utils.tsx +4 -11
- package/src/createBaseQuery.ts +148 -60
- package/src/createInfiniteQuery.ts +15 -94
- package/src/createMutation.ts +9 -63
- package/src/createQueries.ts +44 -55
- package/src/createQuery.ts +42 -127
- package/src/index.ts +6 -3
- package/src/setBatchUpdatesFn.ts +4 -0
- package/src/types.ts +81 -75
- package/src/useIsFetching.ts +12 -44
- package/src/useIsMutating.ts +13 -29
- package/src/utils.ts +5 -79
- package/build/lib/QueryClientProvider.d.ts +0 -24
- package/build/lib/QueryClientProvider.esm.js +0 -74
- package/build/lib/QueryClientProvider.esm.js.map +0 -1
- package/build/lib/QueryClientProvider.js +0 -80
- package/build/lib/QueryClientProvider.js.map +0 -1
- package/build/lib/QueryClientProvider.mjs +0 -74
- package/build/lib/QueryClientProvider.mjs.map +0 -1
- package/build/lib/createBaseQuery.d.ts +0 -4
- package/build/lib/createBaseQuery.esm.js +0 -93
- package/build/lib/createBaseQuery.esm.js.map +0 -1
- package/build/lib/createBaseQuery.js +0 -97
- package/build/lib/createBaseQuery.js.map +0 -1
- package/build/lib/createBaseQuery.mjs +0 -93
- package/build/lib/createBaseQuery.mjs.map +0 -1
- package/build/lib/createInfiniteQuery.d.ts +0 -5
- package/build/lib/createInfiniteQuery.esm.js +0 -20
- package/build/lib/createInfiniteQuery.esm.js.map +0 -1
- package/build/lib/createInfiniteQuery.js +0 -24
- package/build/lib/createInfiniteQuery.js.map +0 -1
- package/build/lib/createInfiniteQuery.mjs +0 -20
- package/build/lib/createInfiniteQuery.mjs.map +0 -1
- package/build/lib/createMutation.d.ts +0 -6
- package/build/lib/createMutation.esm.js +0 -45
- package/build/lib/createMutation.esm.js.map +0 -1
- package/build/lib/createMutation.js +0 -49
- package/build/lib/createMutation.js.map +0 -1
- package/build/lib/createMutation.mjs +0 -45
- package/build/lib/createMutation.mjs.map +0 -1
- package/build/lib/createQueries.esm.js +0 -54
- package/build/lib/createQueries.esm.js.map +0 -1
- package/build/lib/createQueries.js +0 -58
- package/build/lib/createQueries.js.map +0 -1
- package/build/lib/createQueries.mjs +0 -54
- package/build/lib/createQueries.mjs.map +0 -1
- package/build/lib/createQuery.d.ts +0 -23
- package/build/lib/createQuery.esm.js +0 -25
- package/build/lib/createQuery.esm.js.map +0 -1
- package/build/lib/createQuery.js +0 -29
- package/build/lib/createQuery.js.map +0 -1
- package/build/lib/createQuery.mjs +0 -25
- package/build/lib/createQuery.mjs.map +0 -1
- package/build/lib/index.esm.js +0 -9
- package/build/lib/index.esm.js.map +0 -1
- package/build/lib/index.js +0 -31
- package/build/lib/index.js.map +0 -1
- package/build/lib/index.mjs +0 -9
- package/build/lib/index.mjs.map +0 -1
- package/build/lib/types.d.ts +0 -47
- package/build/lib/useIsFetching.d.ts +0 -7
- package/build/lib/useIsFetching.esm.js +0 -29
- package/build/lib/useIsFetching.esm.js.map +0 -1
- package/build/lib/useIsFetching.js +0 -33
- package/build/lib/useIsFetching.js.map +0 -1
- package/build/lib/useIsFetching.mjs +0 -29
- package/build/lib/useIsFetching.mjs.map +0 -1
- package/build/lib/useIsMutating.d.ts +0 -8
- package/build/lib/useIsMutating.esm.js +0 -22
- package/build/lib/useIsMutating.esm.js.map +0 -1
- package/build/lib/useIsMutating.js +0 -26
- package/build/lib/useIsMutating.js.map +0 -1
- package/build/lib/useIsMutating.mjs +0 -22
- package/build/lib/useIsMutating.mjs.map +0 -1
- package/build/lib/utils.d.ts +0 -14
- package/build/lib/utils.esm.js +0 -63
- package/build/lib/utils.esm.js.map +0 -1
- package/build/lib/utils.js +0 -72
- package/build/lib/utils.js.map +0 -1
- package/build/lib/utils.mjs +0 -63
- package/build/lib/utils.mjs.map +0 -1
- package/build/solid/QueryClientProvider.jsx +0 -49
- package/build/solid/__tests__/QueryClientProvider.test.jsx +0 -185
- package/build/solid/createBaseQuery.js +0 -81
- package/build/solid/createInfiniteQuery.js +0 -16
- package/build/solid/createQueries.js +0 -39
- package/build/solid/createQuery.js +0 -16
- package/build/solid/useIsFetching.js +0 -23
- package/build/solid/useIsMutating.js +0 -16
- package/build/solid/utils.js +0 -45
- package/build/umd/index.development.js +0 -3572
- package/build/umd/index.development.js.map +0 -1
- package/build/umd/index.production.js +0 -2
- package/build/umd/index.production.js.map +0 -1
- /package/build/{solid → source}/types.js +0 -0
- /package/build/{lib → types}/__tests__/QueryClientProvider.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createInfiniteQuery.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createMutation.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createQueries.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createQuery.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/createQuery.types.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/suspense.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/transition.test.d.ts +0 -0
- /package/build/{lib → types}/__tests__/useIsFetching.test.d.ts +0 -0
- /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 {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
486
|
+
queryKey: ['key1'],
|
|
708
487
|
queryFn: () => 'string',
|
|
709
488
|
},
|
|
710
489
|
{
|
|
711
|
-
queryKey:
|
|
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:
|
|
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:
|
|
578
|
+
queryKey: getQueryKeyA(),
|
|
804
579
|
queryFn: getQueryFunctionA(),
|
|
805
580
|
},
|
|
806
581
|
{
|
|
807
|
-
queryKey:
|
|
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:
|
|
592
|
+
queryKey: getQueryKeyA(),
|
|
818
593
|
queryFn: getQueryFunctionA(),
|
|
819
594
|
select: getSelectorA(),
|
|
820
595
|
},
|
|
821
596
|
{
|
|
822
|
-
queryKey:
|
|
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:
|
|
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
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
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
|
});
|