@tanstack/react-query 4.14.3 → 4.14.6
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/umd/index.development.js +22 -13
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/useInfiniteQuery.test.tsx +16 -0
- package/src/__tests__/useQuery.test.tsx +58 -69
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/react-query",
|
|
3
|
-
"version": "4.14.
|
|
3
|
+
"version": "4.14.6",
|
|
4
4
|
"description": "Hooks for managing, caching and syncing asynchronous and remote data in React",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"react-error-boundary": "^3.1.4"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@tanstack/query-core": "4.14.
|
|
49
|
+
"@tanstack/query-core": "4.14.5",
|
|
50
50
|
"use-sync-external-store": "^1.2.0"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
@@ -516,24 +516,28 @@ describe('useInfiniteQuery', () => {
|
|
|
516
516
|
data: undefined,
|
|
517
517
|
isFetching: true,
|
|
518
518
|
isFetchingNextPage: false,
|
|
519
|
+
isRefetching: false,
|
|
519
520
|
})
|
|
520
521
|
// Initial fetch done
|
|
521
522
|
expect(states[1]).toMatchObject({
|
|
522
523
|
data: { pages: [10] },
|
|
523
524
|
isFetching: false,
|
|
524
525
|
isFetchingNextPage: false,
|
|
526
|
+
isRefetching: false,
|
|
525
527
|
})
|
|
526
528
|
// Fetch next page
|
|
527
529
|
expect(states[2]).toMatchObject({
|
|
528
530
|
data: { pages: [10] },
|
|
529
531
|
isFetching: true,
|
|
530
532
|
isFetchingNextPage: true,
|
|
533
|
+
isRefetching: false,
|
|
531
534
|
})
|
|
532
535
|
// Fetch next page done
|
|
533
536
|
expect(states[3]).toMatchObject({
|
|
534
537
|
data: { pages: [10, 11] },
|
|
535
538
|
isFetching: false,
|
|
536
539
|
isFetchingNextPage: false,
|
|
540
|
+
isRefetching: false,
|
|
537
541
|
})
|
|
538
542
|
// Fetch previous page
|
|
539
543
|
expect(states[4]).toMatchObject({
|
|
@@ -541,6 +545,7 @@ describe('useInfiniteQuery', () => {
|
|
|
541
545
|
isFetching: true,
|
|
542
546
|
isFetchingNextPage: false,
|
|
543
547
|
isFetchingPreviousPage: true,
|
|
548
|
+
isRefetching: false,
|
|
544
549
|
})
|
|
545
550
|
// Fetch previous page done
|
|
546
551
|
expect(states[5]).toMatchObject({
|
|
@@ -548,6 +553,7 @@ describe('useInfiniteQuery', () => {
|
|
|
548
553
|
isFetching: false,
|
|
549
554
|
isFetchingNextPage: false,
|
|
550
555
|
isFetchingPreviousPage: false,
|
|
556
|
+
isRefetching: false,
|
|
551
557
|
})
|
|
552
558
|
// Refetch
|
|
553
559
|
expect(states[6]).toMatchObject({
|
|
@@ -555,6 +561,7 @@ describe('useInfiniteQuery', () => {
|
|
|
555
561
|
isFetching: true,
|
|
556
562
|
isFetchingNextPage: false,
|
|
557
563
|
isFetchingPreviousPage: false,
|
|
564
|
+
isRefetching: true,
|
|
558
565
|
})
|
|
559
566
|
// Refetch done
|
|
560
567
|
expect(states[7]).toMatchObject({
|
|
@@ -562,6 +569,7 @@ describe('useInfiniteQuery', () => {
|
|
|
562
569
|
isFetching: false,
|
|
563
570
|
isFetchingNextPage: false,
|
|
564
571
|
isFetchingPreviousPage: false,
|
|
572
|
+
isRefetching: false,
|
|
565
573
|
})
|
|
566
574
|
})
|
|
567
575
|
|
|
@@ -618,24 +626,28 @@ describe('useInfiniteQuery', () => {
|
|
|
618
626
|
data: undefined,
|
|
619
627
|
isFetching: true,
|
|
620
628
|
isFetchingNextPage: false,
|
|
629
|
+
isRefetching: false,
|
|
621
630
|
})
|
|
622
631
|
// Initial fetch done
|
|
623
632
|
expect(states[1]).toMatchObject({
|
|
624
633
|
data: { pages: [10] },
|
|
625
634
|
isFetching: false,
|
|
626
635
|
isFetchingNextPage: false,
|
|
636
|
+
isRefetching: false,
|
|
627
637
|
})
|
|
628
638
|
// Fetch next page
|
|
629
639
|
expect(states[2]).toMatchObject({
|
|
630
640
|
data: { pages: [10] },
|
|
631
641
|
isFetching: true,
|
|
632
642
|
isFetchingNextPage: true,
|
|
643
|
+
isRefetching: false,
|
|
633
644
|
})
|
|
634
645
|
// Fetch next page done
|
|
635
646
|
expect(states[3]).toMatchObject({
|
|
636
647
|
data: { pages: [10, 11] },
|
|
637
648
|
isFetching: false,
|
|
638
649
|
isFetchingNextPage: false,
|
|
650
|
+
isRefetching: false,
|
|
639
651
|
})
|
|
640
652
|
// Fetch previous page
|
|
641
653
|
expect(states[4]).toMatchObject({
|
|
@@ -643,6 +655,7 @@ describe('useInfiniteQuery', () => {
|
|
|
643
655
|
isFetching: true,
|
|
644
656
|
isFetchingNextPage: false,
|
|
645
657
|
isFetchingPreviousPage: true,
|
|
658
|
+
isRefetching: false,
|
|
646
659
|
})
|
|
647
660
|
// Fetch previous page done
|
|
648
661
|
expect(states[5]).toMatchObject({
|
|
@@ -650,6 +663,7 @@ describe('useInfiniteQuery', () => {
|
|
|
650
663
|
isFetching: false,
|
|
651
664
|
isFetchingNextPage: false,
|
|
652
665
|
isFetchingPreviousPage: false,
|
|
666
|
+
isRefetching: false,
|
|
653
667
|
})
|
|
654
668
|
// Refetch
|
|
655
669
|
expect(states[6]).toMatchObject({
|
|
@@ -657,6 +671,7 @@ describe('useInfiniteQuery', () => {
|
|
|
657
671
|
isFetching: true,
|
|
658
672
|
isFetchingNextPage: false,
|
|
659
673
|
isFetchingPreviousPage: false,
|
|
674
|
+
isRefetching: true,
|
|
660
675
|
})
|
|
661
676
|
// Refetch done
|
|
662
677
|
expect(states[7]).toMatchObject({
|
|
@@ -664,6 +679,7 @@ describe('useInfiniteQuery', () => {
|
|
|
664
679
|
isFetching: false,
|
|
665
680
|
isFetchingNextPage: false,
|
|
666
681
|
isFetchingPreviousPage: false,
|
|
682
|
+
isRefetching: false,
|
|
667
683
|
})
|
|
668
684
|
})
|
|
669
685
|
|
|
@@ -1022,24 +1022,32 @@ describe('useQuery', () => {
|
|
|
1022
1022
|
|
|
1023
1023
|
states.push(state)
|
|
1024
1024
|
|
|
1025
|
-
|
|
1025
|
+
return (
|
|
1026
|
+
<div>
|
|
1027
|
+
<div>{state.data}</div>
|
|
1028
|
+
<button onClick={() => state.refetch()}>refetch</button>
|
|
1029
|
+
</div>
|
|
1030
|
+
)
|
|
1031
|
+
}
|
|
1026
1032
|
|
|
1027
|
-
|
|
1028
|
-
setActTimeout(() => {
|
|
1029
|
-
refetch()
|
|
1030
|
-
}, 5)
|
|
1031
|
-
}, [refetch])
|
|
1033
|
+
const rendered = renderWithClient(queryClient, <Page />)
|
|
1032
1034
|
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
+
await waitFor(() => {
|
|
1036
|
+
rendered.getByText('test')
|
|
1037
|
+
})
|
|
1035
1038
|
|
|
1036
|
-
|
|
1039
|
+
fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
|
|
1037
1040
|
|
|
1038
|
-
await
|
|
1041
|
+
await waitFor(() => {
|
|
1042
|
+
rendered.getByText('test')
|
|
1043
|
+
})
|
|
1039
1044
|
|
|
1040
|
-
expect(states.length).toBe(2)
|
|
1041
1045
|
expect(states[0]).toMatchObject({ data: undefined })
|
|
1042
1046
|
expect(states[1]).toMatchObject({ data: 'test' })
|
|
1047
|
+
|
|
1048
|
+
// make sure no additional renders happen
|
|
1049
|
+
await sleep(50)
|
|
1050
|
+
expect(states.length).toBe(2)
|
|
1043
1051
|
})
|
|
1044
1052
|
|
|
1045
1053
|
it('should throw an error when a selector throws', async () => {
|
|
@@ -1602,18 +1610,21 @@ describe('useQuery', () => {
|
|
|
1602
1610
|
|
|
1603
1611
|
states.push(state)
|
|
1604
1612
|
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
return null
|
|
1613
|
+
return (
|
|
1614
|
+
<div>
|
|
1615
|
+
<div>data: {state.data}</div>
|
|
1616
|
+
<button onClick={() => setCount(1)}>setCount</button>
|
|
1617
|
+
</div>
|
|
1618
|
+
)
|
|
1612
1619
|
}
|
|
1613
1620
|
|
|
1614
|
-
renderWithClient(queryClient, <Page />)
|
|
1621
|
+
const rendered = renderWithClient(queryClient, <Page />)
|
|
1615
1622
|
|
|
1616
|
-
await waitFor(() =>
|
|
1623
|
+
await waitFor(() => rendered.getByText('data: 0'))
|
|
1624
|
+
|
|
1625
|
+
fireEvent.click(rendered.getByRole('button', { name: 'setCount' }))
|
|
1626
|
+
|
|
1627
|
+
await waitFor(() => rendered.getByText('data: 1'))
|
|
1617
1628
|
|
|
1618
1629
|
// Initial
|
|
1619
1630
|
expect(states[0]).toMatchObject({
|
|
@@ -1636,15 +1647,8 @@ describe('useQuery', () => {
|
|
|
1636
1647
|
isSuccess: true,
|
|
1637
1648
|
isPreviousData: true,
|
|
1638
1649
|
})
|
|
1639
|
-
// Hook state update
|
|
1640
|
-
expect(states[3]).toMatchObject({
|
|
1641
|
-
data: 0,
|
|
1642
|
-
isFetching: true,
|
|
1643
|
-
isSuccess: true,
|
|
1644
|
-
isPreviousData: true,
|
|
1645
|
-
})
|
|
1646
1650
|
// New data
|
|
1647
|
-
expect(states[
|
|
1651
|
+
expect(states[3]).toMatchObject({
|
|
1648
1652
|
data: 1,
|
|
1649
1653
|
isFetching: false,
|
|
1650
1654
|
isSuccess: true,
|
|
@@ -2202,38 +2206,6 @@ describe('useQuery', () => {
|
|
|
2202
2206
|
expect(states[2]).toMatchObject({ isStale: true })
|
|
2203
2207
|
})
|
|
2204
2208
|
|
|
2205
|
-
it('should notify query cache when a query becomes stale', async () => {
|
|
2206
|
-
const key = queryKey()
|
|
2207
|
-
const states: UseQueryResult<string>[] = []
|
|
2208
|
-
const fn = jest.fn()
|
|
2209
|
-
|
|
2210
|
-
const unsubscribe = queryCache.subscribe(fn)
|
|
2211
|
-
|
|
2212
|
-
function Page() {
|
|
2213
|
-
const state = useQuery(key, () => 'test', {
|
|
2214
|
-
staleTime: 10,
|
|
2215
|
-
})
|
|
2216
|
-
states.push(state)
|
|
2217
|
-
return null
|
|
2218
|
-
}
|
|
2219
|
-
|
|
2220
|
-
renderWithClient(queryClient, <Page />)
|
|
2221
|
-
|
|
2222
|
-
await sleep(20)
|
|
2223
|
-
unsubscribe()
|
|
2224
|
-
|
|
2225
|
-
// 1. Query added -> loading
|
|
2226
|
-
// 2. Observer result updated -> loading
|
|
2227
|
-
// 3. Observer added
|
|
2228
|
-
// 4. Query updated -> success
|
|
2229
|
-
// 5. Observer result updated -> success
|
|
2230
|
-
// 6. Query updated -> stale
|
|
2231
|
-
// 7. Observer options updated
|
|
2232
|
-
// 8. Observer result updated -> stale
|
|
2233
|
-
// 9. Observer options updated
|
|
2234
|
-
expect(fn).toHaveBeenCalledTimes(9)
|
|
2235
|
-
})
|
|
2236
|
-
|
|
2237
2209
|
it('should not re-render when it should only re-render on data changes and the data did not change', async () => {
|
|
2238
2210
|
const key = queryKey()
|
|
2239
2211
|
const states: UseQueryResult<string>[] = []
|
|
@@ -3821,18 +3793,35 @@ describe('useQuery', () => {
|
|
|
3821
3793
|
|
|
3822
3794
|
results.push(result)
|
|
3823
3795
|
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3796
|
+
return (
|
|
3797
|
+
<div>
|
|
3798
|
+
<div>{result.data}</div>
|
|
3799
|
+
<div>{shouldFetch ? 'enabled' : 'disabled'}</div>
|
|
3800
|
+
<button
|
|
3801
|
+
onClick={() => {
|
|
3802
|
+
setShouldFetch(false)
|
|
3803
|
+
}}
|
|
3804
|
+
>
|
|
3805
|
+
enable
|
|
3806
|
+
</button>
|
|
3807
|
+
</div>
|
|
3808
|
+
)
|
|
3831
3809
|
}
|
|
3832
3810
|
|
|
3833
|
-
renderWithClient(queryClient, <Page />)
|
|
3811
|
+
const rendered = renderWithClient(queryClient, <Page />)
|
|
3812
|
+
|
|
3813
|
+
await waitFor(() => {
|
|
3814
|
+
rendered.getByText('fetched data')
|
|
3815
|
+
rendered.getByText('enabled')
|
|
3816
|
+
})
|
|
3817
|
+
|
|
3818
|
+
fireEvent.click(rendered.getByRole('button', { name: /enable/i }))
|
|
3819
|
+
|
|
3820
|
+
await waitFor(() => {
|
|
3821
|
+
rendered.getByText('fetched data')
|
|
3822
|
+
rendered.getByText('disabled')
|
|
3823
|
+
})
|
|
3834
3824
|
|
|
3835
|
-
await sleep(50)
|
|
3836
3825
|
expect(results.length).toBe(3)
|
|
3837
3826
|
expect(results[0]).toMatchObject({ data: 'initial', isStale: true })
|
|
3838
3827
|
expect(results[1]).toMatchObject({ data: 'fetched data', isStale: true })
|