@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-query",
3
- "version": "4.14.3",
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.3",
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
- const { refetch } = state
1025
+ return (
1026
+ <div>
1027
+ <div>{state.data}</div>
1028
+ <button onClick={() => state.refetch()}>refetch</button>
1029
+ </div>
1030
+ )
1031
+ }
1026
1032
 
1027
- React.useEffect(() => {
1028
- setActTimeout(() => {
1029
- refetch()
1030
- }, 5)
1031
- }, [refetch])
1033
+ const rendered = renderWithClient(queryClient, <Page />)
1032
1034
 
1033
- return null
1034
- }
1035
+ await waitFor(() => {
1036
+ rendered.getByText('test')
1037
+ })
1035
1038
 
1036
- renderWithClient(queryClient, <Page />)
1039
+ fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
1037
1040
 
1038
- await sleep(10)
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
- React.useEffect(() => {
1606
- setActTimeout(() => {
1607
- setCount(1)
1608
- }, 20)
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(() => expect(states.length).toBe(5))
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[4]).toMatchObject({
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
- React.useEffect(() => {
3825
- setActTimeout(() => {
3826
- setShouldFetch(false)
3827
- }, 5)
3828
- }, [])
3829
-
3830
- return null
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 })