@tanstack/solid-query 4.24.10 → 5.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -3577
- 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
|
@@ -11,16 +11,19 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
11
11
|
let count = 0;
|
|
12
12
|
let renders = 0;
|
|
13
13
|
function Page() {
|
|
14
|
-
const [stateKey, setStateKey] = createSignal(key
|
|
15
|
-
const state = createQuery(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
const [stateKey, setStateKey] = createSignal(key);
|
|
15
|
+
const state = createQuery(() => ({
|
|
16
|
+
queryKey: stateKey(),
|
|
17
|
+
queryFn: async () => {
|
|
18
|
+
count++;
|
|
19
|
+
await sleep(10);
|
|
20
|
+
return count;
|
|
21
|
+
},
|
|
22
|
+
}));
|
|
20
23
|
createRenderEffect(() => {
|
|
21
24
|
states.push({ ...state });
|
|
22
25
|
});
|
|
23
|
-
createRenderEffect(on([() => ({ ...state }), key], () => {
|
|
26
|
+
createRenderEffect(on([() => ({ ...state }), () => key], () => {
|
|
24
27
|
renders++;
|
|
25
28
|
}));
|
|
26
29
|
return (<div>
|
|
@@ -37,9 +40,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
37
40
|
fireEvent.click(screen.getByLabelText('toggle'));
|
|
38
41
|
await waitFor(() => screen.getByText('data: 2'));
|
|
39
42
|
expect(renders).toBe(4);
|
|
40
|
-
// TODO(lukemurray): verify that this expectation is valid. this is 2 in
|
|
41
|
-
// react, but 4 in solid, because in solid suspense is triggered on read and
|
|
42
|
-
// the component needs to render in order to trigger suspense.
|
|
43
43
|
expect(states.length).toBe(4);
|
|
44
44
|
expect(states[1]).toMatchObject({ data: 1, status: 'success' });
|
|
45
45
|
expect(states[3]).toMatchObject({ data: 2, status: 'success' });
|
|
@@ -49,13 +49,16 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
49
49
|
const states = [];
|
|
50
50
|
function Page() {
|
|
51
51
|
const [multiplier, setMultiplier] = createSignal(1);
|
|
52
|
-
const state = createInfiniteQuery(() =>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
const state = createInfiniteQuery(() => ({
|
|
53
|
+
queryKey: [`${key}_${multiplier()}`],
|
|
54
|
+
queryFn: async ({ pageParam }) => {
|
|
55
|
+
await sleep(10);
|
|
56
|
+
return Number(pageParam * multiplier());
|
|
57
|
+
},
|
|
58
|
+
defaultPageParam: 1,
|
|
56
59
|
suspense: true,
|
|
57
60
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
58
|
-
});
|
|
61
|
+
}));
|
|
59
62
|
createRenderEffect(() => {
|
|
60
63
|
states.push({ ...state });
|
|
61
64
|
});
|
|
@@ -74,7 +77,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
74
77
|
// occurs on read.
|
|
75
78
|
expect(states.length).toBe(2);
|
|
76
79
|
expect(states[1]).toMatchObject({
|
|
77
|
-
data: { pages: [1], pageParams: [
|
|
80
|
+
data: { pages: [1], pageParams: [1] },
|
|
78
81
|
status: 'success',
|
|
79
82
|
});
|
|
80
83
|
fireEvent.click(screen.getByText('next'));
|
|
@@ -82,7 +85,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
82
85
|
// TODO(lukemurray): in react this is 2 and in solid it is 4
|
|
83
86
|
expect(states.length).toBe(4);
|
|
84
87
|
expect(states[3]).toMatchObject({
|
|
85
|
-
data: { pages: [2], pageParams: [
|
|
88
|
+
data: { pages: [2], pageParams: [1] },
|
|
86
89
|
status: 'success',
|
|
87
90
|
});
|
|
88
91
|
});
|
|
@@ -94,7 +97,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
94
97
|
return 'data';
|
|
95
98
|
});
|
|
96
99
|
function Page() {
|
|
97
|
-
createQuery(() => [key
|
|
100
|
+
createQuery(() => ({ queryKey: [key], queryFn, suspense: true }));
|
|
98
101
|
return <>rendered</>;
|
|
99
102
|
}
|
|
100
103
|
render(() => (<QueryClientProvider client={queryClient}>
|
|
@@ -108,10 +111,13 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
108
111
|
it('should remove query instance when component unmounted', async () => {
|
|
109
112
|
const key = queryKey();
|
|
110
113
|
function Page() {
|
|
111
|
-
createQuery(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
114
|
+
createQuery(() => ({
|
|
115
|
+
queryKey: key,
|
|
116
|
+
queryFn: () => {
|
|
117
|
+
sleep(10);
|
|
118
|
+
return 'data';
|
|
119
|
+
},
|
|
120
|
+
}));
|
|
115
121
|
return <>rendered</>;
|
|
116
122
|
}
|
|
117
123
|
function App() {
|
|
@@ -125,26 +131,28 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
125
131
|
<App />
|
|
126
132
|
</QueryClientProvider>));
|
|
127
133
|
expect(screen.queryByText('rendered')).toBeNull();
|
|
128
|
-
expect(queryCache.find(key
|
|
134
|
+
expect(queryCache.find({ queryKey: key })).toBeFalsy();
|
|
129
135
|
fireEvent.click(screen.getByLabelText('toggle'));
|
|
130
136
|
await waitFor(() => screen.getByText('rendered'));
|
|
131
|
-
expect(queryCache.find(key
|
|
137
|
+
expect(queryCache.find({ queryKey: key })?.getObserversCount()).toBe(1);
|
|
132
138
|
fireEvent.click(screen.getByLabelText('toggle'));
|
|
133
139
|
expect(screen.queryByText('rendered')).toBeNull();
|
|
134
|
-
expect(queryCache.find(key
|
|
140
|
+
expect(queryCache.find({ queryKey: key })?.getObserversCount()).toBe(0);
|
|
135
141
|
});
|
|
136
142
|
it('should call onSuccess on the first successful call', async () => {
|
|
137
143
|
const key = queryKey();
|
|
138
144
|
const successFn = jest.fn();
|
|
139
145
|
function Page() {
|
|
140
|
-
createQuery(() =>
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
146
|
+
createQuery(() => ({
|
|
147
|
+
queryKey: [key],
|
|
148
|
+
queryFn: async () => {
|
|
149
|
+
await sleep(10);
|
|
150
|
+
return key;
|
|
151
|
+
},
|
|
144
152
|
suspense: true,
|
|
145
153
|
select: () => 'selected',
|
|
146
154
|
onSuccess: successFn,
|
|
147
|
-
});
|
|
155
|
+
}));
|
|
148
156
|
return <>rendered</>;
|
|
149
157
|
}
|
|
150
158
|
render(() => (<QueryClientProvider client={queryClient}>
|
|
@@ -161,23 +169,25 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
161
169
|
const successFn1 = jest.fn();
|
|
162
170
|
const successFn2 = jest.fn();
|
|
163
171
|
function FirstComponent() {
|
|
164
|
-
createQuery(
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
172
|
+
createQuery(() => ({
|
|
173
|
+
queryKey: key,
|
|
174
|
+
queryFn: () => {
|
|
175
|
+
sleep(10);
|
|
176
|
+
return 'data';
|
|
177
|
+
},
|
|
169
178
|
onSuccess: successFn1,
|
|
170
|
-
});
|
|
179
|
+
}));
|
|
171
180
|
return <span>first</span>;
|
|
172
181
|
}
|
|
173
182
|
function SecondComponent() {
|
|
174
|
-
createQuery(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
183
|
+
createQuery(() => ({
|
|
184
|
+
queryKey: key,
|
|
185
|
+
queryFn: () => {
|
|
186
|
+
sleep(10);
|
|
187
|
+
return 'data';
|
|
188
|
+
},
|
|
179
189
|
onSuccess: successFn2,
|
|
180
|
-
});
|
|
190
|
+
}));
|
|
181
191
|
return <span>second</span>;
|
|
182
192
|
}
|
|
183
193
|
render(() => (<QueryClientProvider client={queryClient}>
|
|
@@ -196,18 +206,20 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
196
206
|
const key = queryKey();
|
|
197
207
|
let succeed = false;
|
|
198
208
|
function Page() {
|
|
199
|
-
const state = createQuery(
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
209
|
+
const state = createQuery(() => ({
|
|
210
|
+
queryKey: key,
|
|
211
|
+
queryFn: async () => {
|
|
212
|
+
await sleep(10);
|
|
213
|
+
if (!succeed) {
|
|
214
|
+
throw new Error('Suspense Error Bingo');
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
return 'data';
|
|
218
|
+
}
|
|
219
|
+
},
|
|
208
220
|
retryDelay: 10,
|
|
209
221
|
suspense: true,
|
|
210
|
-
});
|
|
222
|
+
}));
|
|
211
223
|
// Suspense only triggers if used in JSX
|
|
212
224
|
return (<Show when={state.data}>
|
|
213
225
|
<div>rendered</div>
|
|
@@ -238,18 +250,20 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
238
250
|
const key = queryKey();
|
|
239
251
|
let succeed = false;
|
|
240
252
|
function Page() {
|
|
241
|
-
const state = createQuery(
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
253
|
+
const state = createQuery(() => ({
|
|
254
|
+
queryKey: key,
|
|
255
|
+
queryFn: async () => {
|
|
256
|
+
await sleep(10);
|
|
257
|
+
if (!succeed) {
|
|
258
|
+
throw new Error('Suspense Error Bingo');
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
return 'data';
|
|
262
|
+
}
|
|
263
|
+
},
|
|
250
264
|
retry: false,
|
|
251
265
|
suspense: true,
|
|
252
|
-
});
|
|
266
|
+
}));
|
|
253
267
|
// Suspense only triggers if used in JSX
|
|
254
268
|
return (<Show when={state.data}>
|
|
255
269
|
<div>rendered</div>
|
|
@@ -283,15 +297,17 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
283
297
|
const key = queryKey();
|
|
284
298
|
let count = 0;
|
|
285
299
|
function Component() {
|
|
286
|
-
const result = createQuery(
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
300
|
+
const result = createQuery(() => ({
|
|
301
|
+
queryKey: key,
|
|
302
|
+
queryFn: async () => {
|
|
303
|
+
await sleep(100);
|
|
304
|
+
count++;
|
|
305
|
+
return count;
|
|
306
|
+
},
|
|
291
307
|
retry: false,
|
|
292
308
|
suspense: true,
|
|
293
309
|
staleTime: 0,
|
|
294
|
-
});
|
|
310
|
+
}));
|
|
295
311
|
return (<div>
|
|
296
312
|
<span>data: {result.data}</span>
|
|
297
313
|
<span>fetching: {result.isFetching ? 'true' : 'false'}</span>
|
|
@@ -326,20 +342,22 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
326
342
|
const key1 = queryKey();
|
|
327
343
|
const key2 = queryKey();
|
|
328
344
|
function Component(props) {
|
|
329
|
-
const result = createQuery(() =>
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
345
|
+
const result = createQuery(() => ({
|
|
346
|
+
queryKey: props.queryKey,
|
|
347
|
+
queryFn: async () => {
|
|
348
|
+
await sleep(100);
|
|
349
|
+
return props.queryKey;
|
|
350
|
+
},
|
|
333
351
|
retry: false,
|
|
334
352
|
suspense: true,
|
|
335
|
-
});
|
|
353
|
+
}));
|
|
336
354
|
return <div>data: {result.data}</div>;
|
|
337
355
|
}
|
|
338
356
|
function Page() {
|
|
339
|
-
const [key, setKey] = createSignal(key1
|
|
357
|
+
const [key, setKey] = createSignal(key1);
|
|
340
358
|
return (<div>
|
|
341
359
|
<button onClick={() => {
|
|
342
|
-
setKey(key2
|
|
360
|
+
setKey(key2);
|
|
343
361
|
}}>
|
|
344
362
|
switch
|
|
345
363
|
</button>
|
|
@@ -352,24 +370,23 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
352
370
|
<Page />
|
|
353
371
|
</QueryClientProvider>));
|
|
354
372
|
await waitFor(() => screen.getByText('Loading...'));
|
|
355
|
-
await waitFor(() => screen.getByText(`data: ${key1
|
|
373
|
+
await waitFor(() => screen.getByText(`data: ${key1}`));
|
|
356
374
|
fireEvent.click(screen.getByText('switch'));
|
|
357
375
|
await waitFor(() => screen.getByText('Loading...'));
|
|
358
|
-
await waitFor(() => screen.getByText(`data: ${key2
|
|
359
|
-
expect(
|
|
360
|
-
// @ts-expect-error
|
|
361
|
-
queryClient.getQueryCache().find(key2()).observers[0].listeners.length).toBe(1);
|
|
376
|
+
await waitFor(() => screen.getByText(`data: ${key2}`));
|
|
362
377
|
});
|
|
363
378
|
it('should throw errors to the error boundary by default', async () => {
|
|
364
379
|
const key = queryKey();
|
|
365
380
|
function Page() {
|
|
366
|
-
const state = createQuery(
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
381
|
+
const state = createQuery(() => ({
|
|
382
|
+
queryKey: key,
|
|
383
|
+
queryFn: async () => {
|
|
384
|
+
await sleep(10);
|
|
385
|
+
throw new Error('Suspense Error a1x');
|
|
386
|
+
},
|
|
370
387
|
retry: false,
|
|
371
388
|
suspense: true,
|
|
372
|
-
});
|
|
389
|
+
}));
|
|
373
390
|
// read state.data to trigger suspense.
|
|
374
391
|
createRenderEffect(() => {
|
|
375
392
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- trigger suspense
|
|
@@ -392,17 +409,18 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
392
409
|
await waitFor(() => screen.getByText('Loading...'));
|
|
393
410
|
await waitFor(() => screen.getByText('error boundary'));
|
|
394
411
|
});
|
|
395
|
-
it('should not throw errors to the error boundary when
|
|
412
|
+
it('should not throw errors to the error boundary when throwErrors: false', async () => {
|
|
396
413
|
const key = queryKey();
|
|
397
414
|
function Page() {
|
|
398
|
-
const state = createQuery(
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
415
|
+
const state = createQuery(() => ({
|
|
416
|
+
queryKey: key,
|
|
417
|
+
queryFn: async () => {
|
|
418
|
+
await sleep(10);
|
|
419
|
+
throw new Error('Suspense Error a2x');
|
|
420
|
+
},
|
|
402
421
|
retry: false,
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
});
|
|
422
|
+
throwErrors: false,
|
|
423
|
+
}));
|
|
406
424
|
// read state.data to trigger suspense.
|
|
407
425
|
createRenderEffect(() => {
|
|
408
426
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- trigger suspense
|
|
@@ -425,17 +443,18 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
425
443
|
await waitFor(() => screen.getByText('Loading...'));
|
|
426
444
|
await waitFor(() => screen.getByText('rendered'));
|
|
427
445
|
});
|
|
428
|
-
it('should
|
|
446
|
+
it('should throw errors to the error boundary when a throwErrors function returns true', async () => {
|
|
429
447
|
const key = queryKey();
|
|
430
448
|
function Page() {
|
|
431
|
-
const state = createQuery(
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
449
|
+
const state = createQuery(() => ({
|
|
450
|
+
queryKey: key,
|
|
451
|
+
queryFn: async () => {
|
|
452
|
+
await sleep(10);
|
|
453
|
+
return Promise.reject(new Error('Remote Error'));
|
|
454
|
+
},
|
|
435
455
|
retry: false,
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
});
|
|
456
|
+
throwErrors: (err) => err.message !== 'Local Error',
|
|
457
|
+
}));
|
|
439
458
|
// read state.data to trigger suspense.
|
|
440
459
|
createRenderEffect(() => {
|
|
441
460
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- trigger suspense
|
|
@@ -458,17 +477,19 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
458
477
|
await waitFor(() => screen.getByText('Loading...'));
|
|
459
478
|
await waitFor(() => screen.getByText('error boundary'));
|
|
460
479
|
});
|
|
461
|
-
it('should not throw errors to the error boundary when a
|
|
480
|
+
it('should not throw errors to the error boundary when a throwErrors function returns false', async () => {
|
|
462
481
|
const key = queryKey();
|
|
463
482
|
function Page() {
|
|
464
|
-
const state = createQuery(
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
483
|
+
const state = createQuery(() => ({
|
|
484
|
+
queryKey: key,
|
|
485
|
+
queryFn: async () => {
|
|
486
|
+
await sleep(10);
|
|
487
|
+
return Promise.reject(new Error('Local Error'));
|
|
488
|
+
},
|
|
468
489
|
retry: false,
|
|
469
490
|
suspense: true,
|
|
470
|
-
|
|
471
|
-
});
|
|
491
|
+
throwErrors: (err) => err.message !== 'Local Error',
|
|
492
|
+
}));
|
|
472
493
|
// read state.data to trigger suspense.
|
|
473
494
|
createRenderEffect(() => {
|
|
474
495
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- trigger suspense
|
|
@@ -500,12 +521,12 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
500
521
|
});
|
|
501
522
|
function Page() {
|
|
502
523
|
const [enabled, setEnabled] = createSignal(false);
|
|
503
|
-
const result = createQuery(() =>
|
|
524
|
+
const result = createQuery(() => ({
|
|
525
|
+
queryKey: [key],
|
|
526
|
+
queryFn,
|
|
504
527
|
suspense: true,
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
},
|
|
508
|
-
});
|
|
528
|
+
enabled: enabled(),
|
|
529
|
+
}));
|
|
509
530
|
return (<div>
|
|
510
531
|
<button onClick={() => setEnabled(true)}>fire</button>
|
|
511
532
|
<h1>{result.data}</h1>
|
|
@@ -529,19 +550,21 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
529
550
|
let succeed = true;
|
|
530
551
|
function Page() {
|
|
531
552
|
const [nonce] = createSignal(0);
|
|
532
|
-
const queryKeys =
|
|
533
|
-
const result = createQuery(
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
553
|
+
const queryKeys = [`${key}-${succeed}`];
|
|
554
|
+
const result = createQuery(() => ({
|
|
555
|
+
queryKey: queryKeys,
|
|
556
|
+
queryFn: async () => {
|
|
557
|
+
await sleep(10);
|
|
558
|
+
if (!succeed) {
|
|
559
|
+
throw new Error('Suspense Error Bingo');
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
return nonce();
|
|
563
|
+
}
|
|
564
|
+
},
|
|
542
565
|
retry: false,
|
|
543
566
|
suspense: true,
|
|
544
|
-
});
|
|
567
|
+
}));
|
|
545
568
|
return (<div>
|
|
546
569
|
<span>rendered</span> <span>{result.data}</span>
|
|
547
570
|
<button aria-label="fail" onClick={async () => {
|
|
@@ -576,18 +599,20 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
576
599
|
let succeed = true;
|
|
577
600
|
function Page() {
|
|
578
601
|
const [key, setKey] = createSignal(0);
|
|
579
|
-
const result = createQuery(() =>
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
602
|
+
const result = createQuery(() => ({
|
|
603
|
+
queryKey: [`${key()}-${succeed}`],
|
|
604
|
+
queryFn: async () => {
|
|
605
|
+
await sleep(10);
|
|
606
|
+
if (!succeed) {
|
|
607
|
+
throw new Error('Suspense Error Bingo');
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
return 'data';
|
|
611
|
+
}
|
|
612
|
+
},
|
|
588
613
|
retry: false,
|
|
589
614
|
suspense: true,
|
|
590
|
-
});
|
|
615
|
+
}));
|
|
591
616
|
return (<div>
|
|
592
617
|
<span>rendered</span> <span>{result.data}</span>
|
|
593
618
|
<button aria-label="fail" onClick={() => setKey((k) => k + 1)}>
|
|
@@ -620,16 +645,16 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
620
645
|
function Page() {
|
|
621
646
|
const queryKeys = '1';
|
|
622
647
|
const [enabled, setEnabled] = createSignal(false);
|
|
623
|
-
const result = createQuery(() =>
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
648
|
+
const result = createQuery(() => ({
|
|
649
|
+
queryKey: [queryKeys],
|
|
650
|
+
queryFn: async () => {
|
|
651
|
+
await sleep(10);
|
|
652
|
+
throw new Error('Suspense Error Bingo');
|
|
653
|
+
},
|
|
627
654
|
retry: false,
|
|
628
655
|
suspense: true,
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
},
|
|
632
|
-
});
|
|
656
|
+
enabled: enabled(),
|
|
657
|
+
}));
|
|
633
658
|
return (<div>
|
|
634
659
|
<span>rendered</span> <span>{result.data}</span>
|
|
635
660
|
<button aria-label="fail" onClick={() => {
|
|
@@ -658,17 +683,21 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
658
683
|
// render error boundary fallback (error boundary)
|
|
659
684
|
await waitFor(() => screen.getByText('error boundary'));
|
|
660
685
|
});
|
|
661
|
-
it('should render the correct amount of times in Suspense mode when
|
|
686
|
+
it('should render the correct amount of times in Suspense mode when gcTime is set to 0', async () => {
|
|
662
687
|
const key = queryKey();
|
|
663
688
|
let state = null;
|
|
664
689
|
let count = 0;
|
|
665
690
|
let renders = 0;
|
|
666
691
|
function Page() {
|
|
667
|
-
state = createQuery(
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
692
|
+
state = createQuery(() => ({
|
|
693
|
+
queryKey: key,
|
|
694
|
+
queryFn: async () => {
|
|
695
|
+
count++;
|
|
696
|
+
await sleep(10);
|
|
697
|
+
return count;
|
|
698
|
+
},
|
|
699
|
+
gcTime: 0,
|
|
700
|
+
}));
|
|
672
701
|
createRenderEffect(on([() => ({ ...state })], () => {
|
|
673
702
|
renders++;
|
|
674
703
|
}));
|
|
@@ -8,10 +8,13 @@ describe("useQuery's in Suspense mode with transitions", () => {
|
|
|
8
8
|
it('should render the content when the transition is done', async () => {
|
|
9
9
|
const key = queryKey();
|
|
10
10
|
function Suspended() {
|
|
11
|
-
const state = createQuery(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
const state = createQuery(() => ({
|
|
12
|
+
queryKey: key,
|
|
13
|
+
queryFn: async () => {
|
|
14
|
+
await sleep(10);
|
|
15
|
+
return true;
|
|
16
|
+
},
|
|
17
|
+
}));
|
|
15
18
|
return <Show when={state.data}>Message</Show>;
|
|
16
19
|
}
|
|
17
20
|
function Page() {
|