@tanstack/solid-query 5.0.0-alpha.7 → 5.0.0-alpha.70

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 (81) hide show
  1. package/{build/cjs/index.js → dist/cjs/index.cjs} +91 -31
  2. package/dist/cjs/index.cjs.map +1 -0
  3. package/{build → dist}/esm/index.js +91 -33
  4. package/dist/esm/index.js.map +1 -0
  5. package/dist/source/QueryClient.js +6 -0
  6. package/{build → dist}/source/createBaseQuery.js +49 -23
  7. package/{build → dist}/source/createMutation.js +1 -1
  8. package/{build → dist}/source/createQueries.js +13 -7
  9. package/{build → dist}/source/createQuery.js +3 -0
  10. package/{build → dist}/source/index.js +2 -1
  11. package/dist/types/QueryClient.d.ts +29 -0
  12. package/{build → dist}/types/QueryClientProvider.d.ts +3 -3
  13. package/{build → dist}/types/createBaseQuery.d.ts +2 -1
  14. package/{build → dist}/types/createInfiniteQuery.d.ts +2 -1
  15. package/{build → dist}/types/createMutation.d.ts +2 -1
  16. package/{build → dist}/types/createQueries.d.ts +11 -9
  17. package/dist/types/createQuery.d.ts +14 -0
  18. package/{build → dist}/types/index.d.ts +3 -1
  19. package/dist/types/types.d.ts +34 -0
  20. package/{build → dist}/types/useIsFetching.d.ts +2 -1
  21. package/{build → dist}/types/useIsMutating.d.ts +2 -1
  22. package/package.json +22 -26
  23. package/src/QueryClient.ts +84 -0
  24. package/src/QueryClientProvider.tsx +1 -1
  25. package/src/__tests__/QueryClientProvider.test.tsx +2 -3
  26. package/src/__tests__/createInfiniteQuery.test.tsx +83 -19
  27. package/src/__tests__/createMutation.test.tsx +5 -5
  28. package/src/__tests__/createQueries.test.tsx +6 -78
  29. package/src/__tests__/createQuery.test.tsx +66 -334
  30. package/src/__tests__/createQuery.types.test.tsx +21 -1
  31. package/src/__tests__/suspense.test.tsx +7 -90
  32. package/src/__tests__/transition.test.tsx +1 -1
  33. package/src/__tests__/useIsFetching.test.tsx +1 -1
  34. package/src/__tests__/useIsMutating.test.tsx +5 -7
  35. package/src/__tests__/utils.tsx +1 -1
  36. package/src/createBaseQuery.ts +73 -28
  37. package/src/createInfiniteQuery.ts +1 -1
  38. package/src/createMutation.ts +3 -2
  39. package/src/createQueries.ts +32 -14
  40. package/src/createQuery.ts +24 -1
  41. package/src/index.ts +8 -1
  42. package/src/types.ts +4 -2
  43. package/src/useIsFetching.ts +2 -1
  44. package/src/useIsMutating.ts +2 -1
  45. package/build/cjs/index.js.map +0 -1
  46. package/build/esm/index.js.map +0 -1
  47. package/build/source/__tests__/QueryClientProvider.test.jsx +0 -121
  48. package/build/source/__tests__/createInfiniteQuery.test.jsx +0 -1315
  49. package/build/source/__tests__/createMutation.test.jsx +0 -867
  50. package/build/source/__tests__/createQueries.test.jsx +0 -661
  51. package/build/source/__tests__/createQuery.test.jsx +0 -4608
  52. package/build/source/__tests__/createQuery.types.test.jsx +0 -135
  53. package/build/source/__tests__/suspense.test.jsx +0 -721
  54. package/build/source/__tests__/transition.test.jsx +0 -42
  55. package/build/source/__tests__/useIsFetching.test.jsx +0 -190
  56. package/build/source/__tests__/useIsMutating.test.jsx +0 -198
  57. package/build/source/__tests__/utils.jsx +0 -50
  58. package/build/types/__tests__/QueryClientProvider.test.d.ts +0 -1
  59. package/build/types/__tests__/createInfiniteQuery.test.d.ts +0 -1
  60. package/build/types/__tests__/createMutation.test.d.ts +0 -1
  61. package/build/types/__tests__/createQueries.test.d.ts +0 -1
  62. package/build/types/__tests__/createQuery.test.d.ts +0 -1
  63. package/build/types/__tests__/createQuery.types.test.d.ts +0 -2
  64. package/build/types/__tests__/suspense.test.d.ts +0 -1
  65. package/build/types/__tests__/transition.test.d.ts +0 -1
  66. package/build/types/__tests__/useIsFetching.test.d.ts +0 -1
  67. package/build/types/__tests__/useIsMutating.test.d.ts +0 -1
  68. package/build/types/__tests__/utils.d.ts +0 -21
  69. package/build/types/createQuery.d.ts +0 -11
  70. package/build/types/types.d.ts +0 -33
  71. package/build/umd/index.js +0 -2
  72. package/build/umd/index.js.map +0 -1
  73. /package/{build → dist}/source/QueryClientProvider.jsx +0 -0
  74. /package/{build → dist}/source/createInfiniteQuery.js +0 -0
  75. /package/{build → dist}/source/setBatchUpdatesFn.js +0 -0
  76. /package/{build → dist}/source/types.js +0 -0
  77. /package/{build → dist}/source/useIsFetching.js +0 -0
  78. /package/{build → dist}/source/useIsMutating.js +0 -0
  79. /package/{build → dist}/source/utils.js +0 -0
  80. /package/{build → dist}/types/setBatchUpdatesFn.d.ts +0 -0
  81. /package/{build → dist}/types/utils.d.ts +0 -0
@@ -1,661 +0,0 @@
1
- import { fireEvent, render, screen, waitFor } from 'solid-testing-library';
2
- import * as QueriesObserverModule from '../../../query-core/src/queriesObserver';
3
- import { createRenderEffect, createSignal } from 'solid-js';
4
- import { createQueries, QueriesObserver, QueryCache, QueryClientProvider, } from '..';
5
- import { createQueryClient, expectType, expectTypeNotAny, queryKey, sleep, } from './utils';
6
- import { vi } from 'vitest';
7
- describe('useQueries', () => {
8
- const queryCache = new QueryCache();
9
- const queryClient = createQueryClient({ queryCache });
10
- it('should return the correct states', async () => {
11
- const key1 = queryKey();
12
- const key2 = queryKey();
13
- const results = [];
14
- function Page() {
15
- const result = createQueries(() => ({
16
- queries: [
17
- {
18
- queryKey: key1,
19
- queryFn: async () => {
20
- await sleep(10);
21
- return 1;
22
- },
23
- },
24
- {
25
- queryKey: key2,
26
- queryFn: async () => {
27
- await sleep(100);
28
- return 2;
29
- },
30
- },
31
- ],
32
- }));
33
- createRenderEffect(() => {
34
- results.push([...result]);
35
- });
36
- return (<div>
37
- <div>
38
- data1: {String(result[0].data ?? 'null')}, data2:{' '}
39
- {String(result[1].data ?? 'null')}
40
- </div>
41
- </div>);
42
- }
43
- render(() => (<QueryClientProvider client={queryClient}>
44
- <Page />
45
- </QueryClientProvider>));
46
- await waitFor(() => screen.getByText('data1: 1, data2: 2'));
47
- expect(results.length).toBe(3);
48
- expect(results[0]).toMatchObject([{ data: undefined }, { data: undefined }]);
49
- expect(results[1]).toMatchObject([{ data: 1 }, { data: undefined }]);
50
- expect(results[2]).toMatchObject([{ data: 1 }, { data: 2 }]);
51
- });
52
- it('handles type parameter - tuple of tuples', async () => {
53
- const key1 = queryKey();
54
- const key2 = queryKey();
55
- const key3 = queryKey();
56
- // @ts-expect-error (Page component is not rendered)
57
- // eslint-disable-next-line
58
- function Page() {
59
- const result1 = createQueries(() => ({
60
- queries: [
61
- {
62
- queryKey: key1,
63
- queryFn: () => 1,
64
- },
65
- {
66
- queryKey: key2,
67
- queryFn: () => 'string',
68
- },
69
- {
70
- queryKey: key3,
71
- queryFn: () => ['string[]'],
72
- },
73
- ],
74
- }));
75
- expectType(result1[0]);
76
- expectType(result1[1]);
77
- expectType(result1[2]);
78
- expectType(result1[0].data);
79
- expectType(result1[1].data);
80
- expectType(result1[2].data);
81
- expectType(result1[2].error);
82
- // TData (3rd element) takes precedence over TQueryFnData (1st element)
83
- const result2 = createQueries(() => ({
84
- queries: [
85
- {
86
- queryKey: key1,
87
- queryFn: () => 'string',
88
- select: (a) => {
89
- expectType(a);
90
- expectTypeNotAny(a);
91
- return a.toLowerCase();
92
- },
93
- },
94
- {
95
- queryKey: key2,
96
- queryFn: () => 'string',
97
- select: (a) => {
98
- expectType(a);
99
- expectTypeNotAny(a);
100
- return parseInt(a);
101
- },
102
- },
103
- ],
104
- }));
105
- expectType(result2[0]);
106
- expectType(result2[1]);
107
- expectType(result2[0].data);
108
- expectType(result2[1].data);
109
- // types should be enforced
110
- createQueries(() => ({
111
- queries: [
112
- {
113
- queryKey: key1,
114
- queryFn: () => 'string',
115
- select: (a) => {
116
- expectType(a);
117
- expectTypeNotAny(a);
118
- return a.toLowerCase();
119
- },
120
- onSuccess: (a) => {
121
- expectType(a);
122
- expectTypeNotAny(a);
123
- },
124
- placeholderData: 'string',
125
- // @ts-expect-error (initialData: string)
126
- initialData: 123,
127
- },
128
- {
129
- queryKey: key2,
130
- queryFn: () => 'string',
131
- select: (a) => {
132
- expectType(a);
133
- expectTypeNotAny(a);
134
- return parseInt(a);
135
- },
136
- onSuccess: (a) => {
137
- expectType(a);
138
- expectTypeNotAny(a);
139
- },
140
- onError: (e) => {
141
- expectType(e);
142
- expectTypeNotAny(e);
143
- },
144
- placeholderData: 'string',
145
- // @ts-expect-error (initialData: string)
146
- initialData: 123,
147
- },
148
- ],
149
- }));
150
- // field names should be enforced
151
- createQueries(() => ({
152
- queries: [
153
- {
154
- queryKey: key1,
155
- queryFn: () => 'string',
156
- },
157
- ],
158
- }));
159
- }
160
- });
161
- it('handles type parameter - tuple of objects', async () => {
162
- const key1 = queryKey();
163
- const key2 = queryKey();
164
- const key3 = queryKey();
165
- // @ts-expect-error (Page component is not rendered)
166
- // eslint-disable-next-line
167
- function Page() {
168
- const result1 = createQueries(() => ({
169
- queries: [
170
- {
171
- queryKey: key1,
172
- queryFn: () => 1,
173
- },
174
- {
175
- queryKey: key2,
176
- queryFn: () => 'string',
177
- },
178
- {
179
- queryKey: key3,
180
- queryFn: () => ['string[]'],
181
- },
182
- ],
183
- }));
184
- expectType(result1[0]);
185
- expectType(result1[1]);
186
- expectType(result1[2]);
187
- expectType(result1[0].data);
188
- expectType(result1[1].data);
189
- expectType(result1[2].data);
190
- expectType(result1[2].error);
191
- // TData (data prop) takes precedence over TQueryFnData (queryFnData prop)
192
- const result2 = createQueries(() => ({
193
- queries: [
194
- {
195
- queryKey: key1,
196
- queryFn: () => 'string',
197
- select: (a) => {
198
- expectType(a);
199
- expectTypeNotAny(a);
200
- return a.toLowerCase();
201
- },
202
- },
203
- {
204
- queryKey: key2,
205
- queryFn: () => 'string',
206
- select: (a) => {
207
- expectType(a);
208
- expectTypeNotAny(a);
209
- return parseInt(a);
210
- },
211
- },
212
- ],
213
- }));
214
- expectType(result2[0]);
215
- expectType(result2[1]);
216
- expectType(result2[0].data);
217
- expectType(result2[1].data);
218
- // can pass only TData (data prop) although TQueryFnData will be left unknown
219
- const result3 = createQueries(() => ({
220
- queries: [
221
- {
222
- queryKey: key1,
223
- queryFn: () => 'string',
224
- select: (a) => {
225
- expectType(a);
226
- expectTypeNotAny(a);
227
- return a;
228
- },
229
- },
230
- {
231
- queryKey: key2,
232
- queryFn: () => 'string',
233
- select: (a) => {
234
- expectType(a);
235
- expectTypeNotAny(a);
236
- return a;
237
- },
238
- },
239
- ],
240
- }));
241
- expectType(result3[0]);
242
- expectType(result3[1]);
243
- expectType(result3[0].data);
244
- expectType(result3[1].data);
245
- // types should be enforced
246
- createQueries(() => ({
247
- queries: [
248
- {
249
- queryKey: key1,
250
- queryFn: () => 'string',
251
- select: (a) => {
252
- expectType(a);
253
- expectTypeNotAny(a);
254
- return a.toLowerCase();
255
- },
256
- onSuccess: (a) => {
257
- expectType(a);
258
- expectTypeNotAny(a);
259
- },
260
- placeholderData: 'string',
261
- // @ts-expect-error (initialData: string)
262
- initialData: 123,
263
- },
264
- {
265
- queryKey: key2,
266
- queryFn: () => 'string',
267
- select: (a) => {
268
- expectType(a);
269
- expectTypeNotAny(a);
270
- return parseInt(a);
271
- },
272
- onSuccess: (a) => {
273
- expectType(a);
274
- expectTypeNotAny(a);
275
- },
276
- onError: (e) => {
277
- expectType(e);
278
- expectTypeNotAny(e);
279
- },
280
- placeholderData: 'string',
281
- // @ts-expect-error (initialData: string)
282
- initialData: 123,
283
- },
284
- ],
285
- }));
286
- // field names should be enforced
287
- createQueries(() => ({
288
- queries: [
289
- {
290
- queryKey: key1,
291
- queryFn: () => 'string',
292
- },
293
- ],
294
- }));
295
- }
296
- });
297
- it('handles array literal without type parameter to infer result type', async () => {
298
- const key1 = queryKey();
299
- const key2 = queryKey();
300
- const key3 = queryKey();
301
- const key4 = queryKey();
302
- // @ts-expect-error (Page component is not rendered)
303
- // eslint-disable-next-line
304
- function Page() {
305
- // Array.map preserves TQueryFnData
306
- const result1 = createQueries(() => ({
307
- queries: Array(50).map((_, i) => ({
308
- queryKey: ['key', i],
309
- queryFn: () => i + 10,
310
- })),
311
- }));
312
- expectType(result1);
313
- expectType(result1[0]?.data);
314
- // Array.map preserves TData
315
- const result2 = createQueries(() => ({
316
- queries: Array(50).map((_, i) => ({
317
- queryKey: ['key', i],
318
- queryFn: () => i + 10,
319
- select: (data) => data.toString(),
320
- })),
321
- }));
322
- expectType(result2);
323
- const result3 = createQueries(() => ({
324
- queries: [
325
- {
326
- queryKey: key1,
327
- queryFn: () => 1,
328
- },
329
- {
330
- queryKey: key2,
331
- queryFn: () => 'string',
332
- },
333
- {
334
- queryKey: key3,
335
- queryFn: () => ['string[]'],
336
- select: () => 123,
337
- },
338
- ],
339
- }));
340
- expectType(result3[0]);
341
- expectType(result3[1]);
342
- expectType(result3[2]);
343
- expectType(result3[0].data);
344
- expectType(result3[1].data);
345
- // select takes precedence over queryFn
346
- expectType(result3[2].data);
347
- // initialData/placeholderData are enforced
348
- createQueries(() => ({
349
- queries: [
350
- {
351
- queryKey: key1,
352
- queryFn: () => 'string',
353
- placeholderData: 'string',
354
- // @ts-expect-error (initialData: string)
355
- initialData: 123,
356
- },
357
- {
358
- queryKey: key2,
359
- queryFn: () => 123,
360
- // @ts-expect-error (placeholderData: number)
361
- placeholderData: 'string',
362
- initialData: 123,
363
- },
364
- ],
365
- }));
366
- // select / onSuccess / onSettled params are "indirectly" enforced
367
- createQueries(() => ({
368
- queries: [
369
- // unfortunately TS will not suggest the type for you
370
- {
371
- queryKey: key1,
372
- queryFn: () => 'string',
373
- // @ts-expect-error (noImplicitAny)
374
- onSuccess: (a) => null,
375
- // @ts-expect-error (noImplicitAny)
376
- onSettled: (a) => null,
377
- },
378
- // however you can add a type to the callback
379
- {
380
- queryKey: key2,
381
- queryFn: () => 'string',
382
- onSuccess: (a) => {
383
- expectType(a);
384
- expectTypeNotAny(a);
385
- },
386
- onSettled: (a) => {
387
- expectType(a);
388
- expectTypeNotAny(a);
389
- },
390
- },
391
- // the type you do pass is enforced
392
- {
393
- queryKey: key3,
394
- queryFn: () => 'string',
395
- // @ts-expect-error (only accepts string)
396
- onSuccess: (a) => null,
397
- },
398
- {
399
- queryKey: key4,
400
- queryFn: () => 'string',
401
- select: (a) => parseInt(a),
402
- // @ts-expect-error (select is defined => only accepts number)
403
- onSuccess: (a) => null,
404
- onSettled: (a) => {
405
- expectType(a);
406
- expectTypeNotAny(a);
407
- },
408
- },
409
- ],
410
- }));
411
- // callbacks are also indirectly enforced with Array.map
412
- createQueries(() => ({
413
- // @ts-expect-error (onSuccess only accepts string)
414
- queries: Array(50).map((_, i) => ({
415
- queryKey: ['key', i],
416
- queryFn: () => i + 10,
417
- select: (data) => data.toString(),
418
- onSuccess: (_data) => null,
419
- })),
420
- }));
421
- createQueries(() => ({
422
- queries: Array(50).map((_, i) => ({
423
- queryKey: ['key', i],
424
- queryFn: () => i + 10,
425
- select: (data) => data.toString(),
426
- onSuccess: (_data) => null,
427
- })),
428
- }));
429
- // results inference works when all the handlers are defined
430
- const result4 = createQueries(() => ({
431
- queries: [
432
- {
433
- queryKey: key1,
434
- queryFn: () => 'string',
435
- // @ts-expect-error (noImplicitAny)
436
- onSuccess: (a) => null,
437
- // @ts-expect-error (noImplicitAny)
438
- onSettled: (a) => null,
439
- },
440
- {
441
- queryKey: key2,
442
- queryFn: () => 'string',
443
- onSuccess: (a) => {
444
- expectType(a);
445
- expectTypeNotAny(a);
446
- },
447
- onSettled: (a) => {
448
- expectType(a);
449
- expectTypeNotAny(a);
450
- },
451
- },
452
- {
453
- queryKey: key4,
454
- queryFn: () => 'string',
455
- select: (a) => parseInt(a),
456
- onSuccess: (_a) => null,
457
- onSettled: (a) => {
458
- expectType(a);
459
- expectTypeNotAny(a);
460
- },
461
- },
462
- ],
463
- }));
464
- expectType(result4[0]);
465
- expectType(result4[1]);
466
- expectType(result4[2]);
467
- // handles when queryFn returns a Promise
468
- const result5 = createQueries(() => ({
469
- queries: [
470
- {
471
- queryKey: key1,
472
- queryFn: () => Promise.resolve('string'),
473
- onSuccess: (a) => {
474
- expectType(a);
475
- expectTypeNotAny(a);
476
- },
477
- // @ts-expect-error (refuses to accept a Promise)
478
- onSettled: (a) => null,
479
- },
480
- ],
481
- }));
482
- expectType(result5[0]);
483
- // Array as const does not throw error
484
- const result6 = createQueries(() => ({
485
- queries: [
486
- {
487
- queryKey: ['key1'],
488
- queryFn: () => 'string',
489
- },
490
- {
491
- queryKey: ['key1'],
492
- queryFn: () => 123,
493
- },
494
- ],
495
- }));
496
- expectType(result6[0]);
497
- expectType(result6[1]);
498
- // field names should be enforced - array literal
499
- createQueries(() => ({
500
- queries: [
501
- {
502
- queryKey: key1,
503
- queryFn: () => 'string',
504
- },
505
- ],
506
- }));
507
- // field names should be enforced - Array.map() result
508
- createQueries(() => ({
509
- // @ts-expect-error (invalidField)
510
- queries: Array(10).map(() => ({
511
- someInvalidField: '',
512
- })),
513
- }));
514
- // field names should be enforced - array literal
515
- createQueries(() => ({
516
- queries: [
517
- {
518
- queryKey: key1,
519
- queryFn: () => 'string',
520
- },
521
- ],
522
- }));
523
- // supports queryFn using fetch() to return Promise<any> - Array.map() result
524
- createQueries(() => ({
525
- queries: Array(50).map((_, i) => ({
526
- queryKey: ['key', i],
527
- queryFn: () => fetch('return Promise<any>').then((resp) => resp.json()),
528
- })),
529
- }));
530
- // supports queryFn using fetch() to return Promise<any> - array literal
531
- createQueries(() => ({
532
- queries: [
533
- {
534
- queryKey: key1,
535
- queryFn: () => fetch('return Promise<any>').then((resp) => resp.json()),
536
- },
537
- ],
538
- }));
539
- }
540
- });
541
- it('handles strongly typed queryFn factories and useQueries wrappers', () => {
542
- const getQueryKeyA = () => ['queryA'];
543
- const getQueryFunctionA = () => async () => {
544
- return 1;
545
- };
546
- const getSelectorA = () => (data) => [data, data.toString()];
547
- const getQueryKeyB = (id) => ['queryB', id];
548
- const getQueryFunctionB = () => async () => {
549
- return '1';
550
- };
551
- const getSelectorB = () => (data) => [data, +data];
552
- // Wrapper with strongly typed array-parameter
553
- function useWrappedQueries(queries) {
554
- return createQueries(() => ({
555
- queries: queries.map(
556
- // no need to type the mapped query
557
- (query) => {
558
- const { queryFn: fn, queryKey: key, onError: err } = query;
559
- expectType(fn);
560
- return {
561
- queryKey: key,
562
- onError: err,
563
- queryFn: fn
564
- ? (ctx) => {
565
- expectType(ctx.queryKey);
566
- return fn.call({}, ctx);
567
- }
568
- : undefined,
569
- };
570
- }),
571
- }));
572
- }
573
- // @ts-expect-error (Page component is not rendered)
574
- // eslint-disable-next-line
575
- function Page() {
576
- const result = createQueries(() => ({
577
- queries: [
578
- {
579
- queryKey: getQueryKeyA(),
580
- queryFn: getQueryFunctionA(),
581
- },
582
- {
583
- queryKey: getQueryKeyB('id'),
584
- queryFn: getQueryFunctionB(),
585
- },
586
- ],
587
- }));
588
- expectType(result[0]);
589
- expectType(result[1]);
590
- const withSelector = createQueries(() => ({
591
- queries: [
592
- {
593
- queryKey: getQueryKeyA(),
594
- queryFn: getQueryFunctionA(),
595
- select: getSelectorA(),
596
- },
597
- {
598
- queryKey: getQueryKeyB('id'),
599
- queryFn: getQueryFunctionB(),
600
- select: getSelectorB(),
601
- },
602
- ],
603
- }));
604
- expectType(withSelector[0]);
605
- expectType(withSelector[1]);
606
- const withWrappedQueries = useWrappedQueries(Array(10).map(() => ({
607
- queryKey: getQueryKeyA(),
608
- queryFn: getQueryFunctionA(),
609
- select: getSelectorA(),
610
- })));
611
- expectType(withWrappedQueries);
612
- }
613
- });
614
- it('should not change state if unmounted', async () => {
615
- const key1 = queryKey();
616
- // We have to mock the QueriesObserver to not unsubscribe
617
- // the listener when the component is unmounted
618
- class QueriesObserverMock extends QueriesObserver {
619
- subscribe(listener) {
620
- super.subscribe(listener);
621
- return () => void 0;
622
- }
623
- }
624
- const QueriesObserverSpy = vi
625
- .spyOn(QueriesObserverModule, 'QueriesObserver')
626
- .mockImplementation((fn) => {
627
- return new QueriesObserverMock(fn);
628
- });
629
- function Queries() {
630
- createQueries(() => ({
631
- queries: [
632
- {
633
- queryKey: key1,
634
- queryFn: async () => {
635
- await sleep(10);
636
- return 1;
637
- },
638
- },
639
- ],
640
- }));
641
- return (<div>
642
- <span>queries</span>
643
- </div>);
644
- }
645
- function Page() {
646
- const [mounted, setMounted] = createSignal(true);
647
- return (<div>
648
- <button onClick={() => setMounted(false)}>unmount</button>
649
- {mounted() && <Queries />}
650
- </div>);
651
- }
652
- render(() => (<QueryClientProvider client={queryClient}>
653
- <Page />
654
- </QueryClientProvider>));
655
- fireEvent.click(screen.getByText('unmount'));
656
- // Should not display the console error
657
- // "Warning: Can't perform a React state update on an unmounted component"
658
- await sleep(20);
659
- QueriesObserverSpy.mockRestore();
660
- });
661
- });