@tanstack/react-query 4.13.0 → 4.13.5

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.13.0",
3
+ "version": "4.13.5",
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.13.0",
49
+ "@tanstack/query-core": "4.13.4",
50
50
  "use-sync-external-store": "^1.2.0"
51
51
  },
52
52
  "peerDependencies": {
@@ -401,30 +401,33 @@ describe('useQuery', () => {
401
401
 
402
402
  it('should set isFetchedAfterMount to true after a query has been fetched', async () => {
403
403
  const key = queryKey()
404
- const states: UseQueryResult<string>[] = []
405
404
 
406
405
  await queryClient.prefetchQuery(key, () => 'prefetched')
407
406
 
408
407
  function Page() {
409
- const state = useQuery(key, () => 'data')
410
- states.push(state)
411
- return null
408
+ const result = useQuery(key, () => 'new data')
409
+
410
+ return (
411
+ <>
412
+ <div>data: {result.data}</div>
413
+ <div>isFetched: {result.isFetched ? 'true' : 'false'}</div>
414
+ <div>
415
+ isFetchedAfterMount: {result.isFetchedAfterMount ? 'true' : 'false'}
416
+ </div>
417
+ </>
418
+ )
412
419
  }
413
420
 
414
- renderWithClient(queryClient, <Page />)
421
+ const rendered = renderWithClient(queryClient, <Page />)
415
422
 
416
- await sleep(10)
417
- expect(states.length).toBe(2)
423
+ rendered.getByText('data: prefetched')
424
+ rendered.getByText('isFetched: true')
425
+ rendered.getByText('isFetchedAfterMount: false')
418
426
 
419
- expect(states[0]).toMatchObject({
420
- data: 'prefetched',
421
- isFetched: true,
422
- isFetchedAfterMount: false,
423
- })
424
- expect(states[1]).toMatchObject({
425
- data: 'data',
426
- isFetched: true,
427
- isFetchedAfterMount: true,
427
+ await waitFor(() => {
428
+ rendered.getByText('data: new data')
429
+ rendered.getByText('isFetched: true')
430
+ rendered.getByText('isFetchedAfterMount: true')
428
431
  })
429
432
  })
430
433
 
@@ -601,7 +604,8 @@ describe('useQuery', () => {
601
604
 
602
605
  const rendered = renderWithClient(queryClient, <Page />)
603
606
 
604
- await sleep(5)
607
+ rendered.getByText('status: loading, fetchStatus: fetching')
608
+
605
609
  await queryClient.cancelQueries(key)
606
610
  // query cancellation will reset the query to it's initial state
607
611
  await waitFor(() =>
@@ -869,20 +873,35 @@ describe('useQuery', () => {
869
873
 
870
874
  states.push(state)
871
875
 
872
- const { remove } = state
873
-
874
- React.useEffect(() => {
875
- setActTimeout(() => {
876
- remove()
877
- rerender({})
878
- }, 20)
879
- }, [remove])
876
+ return (
877
+ <>
878
+ <div>{state.data}</div>
880
879
 
881
- return null
880
+ <button
881
+ onClick={() => {
882
+ state.remove()
883
+ rerender({})
884
+ }}
885
+ >
886
+ remove
887
+ </button>
888
+ </>
889
+ )
882
890
  }
883
891
 
884
- renderWithClient(queryClient, <Page />)
892
+ const rendered = renderWithClient(queryClient, <Page />)
885
893
 
894
+ await waitFor(() => {
895
+ rendered.getByText('data')
896
+ })
897
+
898
+ fireEvent.click(rendered.getByRole('button', { name: 'remove' }))
899
+
900
+ await waitFor(() => {
901
+ rendered.getByText('data')
902
+ })
903
+
904
+ // required to make sure no additional renders are happening after data is successfully fetched for the second time
886
905
  await sleep(100)
887
906
 
888
907
  expect(states.length).toBe(5)
@@ -1514,17 +1533,27 @@ describe('useQuery', () => {
1514
1533
 
1515
1534
  states.push(state)
1516
1535
 
1517
- React.useEffect(() => {
1518
- setActTimeout(() => {
1519
- setCount(1)
1520
- }, 10)
1521
- }, [])
1522
-
1523
- return null
1536
+ return (
1537
+ <div>
1538
+ <button onClick={() => setCount(1)}>increment</button>
1539
+ <div>data: {state.data ?? 'undefined'}</div>
1540
+ <div>count: {count}</div>
1541
+ </div>
1542
+ )
1524
1543
  }
1525
1544
 
1526
- renderWithClient(queryClient, <Page />)
1545
+ const rendered = renderWithClient(queryClient, <Page />)
1546
+
1547
+ await waitFor(() => rendered.getByText('data: 0'))
1548
+
1549
+ fireEvent.click(rendered.getByRole('button', { name: /increment/i }))
1527
1550
 
1551
+ await waitFor(() => {
1552
+ rendered.getByText('count: 1')
1553
+ rendered.getByText('data: undefined')
1554
+ })
1555
+
1556
+ // making sure no additional fetches are triggered
1528
1557
  await sleep(50)
1529
1558
 
1530
1559
  expect(states.length).toBe(3)
@@ -1808,26 +1837,41 @@ describe('useQuery', () => {
1808
1837
 
1809
1838
  states.push(state)
1810
1839
 
1811
- const { refetch } = state
1840
+ return (
1841
+ <div>
1842
+ <button onClick={() => state.refetch()}>refetch</button>
1843
+ <button onClick={() => setCount(1)}>setCount</button>
1844
+ <div>data: {state.data ?? 'undefined'}</div>
1845
+ </div>
1846
+ )
1847
+ }
1812
1848
 
1813
- React.useEffect(() => {
1814
- refetch()
1849
+ const rendered = renderWithClient(queryClient, <Page />)
1815
1850
 
1816
- setActTimeout(() => {
1817
- setCount(1)
1818
- }, 20)
1851
+ await waitFor(() => {
1852
+ rendered.getByText('data: undefined')
1853
+ })
1819
1854
 
1820
- setActTimeout(() => {
1821
- refetch()
1822
- }, 30)
1823
- }, [refetch])
1855
+ fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
1824
1856
 
1825
- return null
1826
- }
1857
+ await waitFor(() => {
1858
+ rendered.getByText('data: 0')
1859
+ })
1827
1860
 
1828
- renderWithClient(queryClient, <Page />)
1861
+ fireEvent.click(rendered.getByRole('button', { name: 'setCount' }))
1829
1862
 
1830
- await sleep(100)
1863
+ await waitFor(() => {
1864
+ rendered.getByText('data: 0')
1865
+ })
1866
+
1867
+ fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
1868
+
1869
+ await waitFor(() => {
1870
+ rendered.getByText('data: 1')
1871
+ })
1872
+
1873
+ // making sure no additional renders are triggered
1874
+ await sleep(20)
1831
1875
 
1832
1876
  expect(states.length).toBe(6)
1833
1877
 
@@ -2190,19 +2234,31 @@ describe('useQuery', () => {
2190
2234
 
2191
2235
  states.push(state)
2192
2236
 
2193
- const { refetch } = state
2237
+ return (
2238
+ <>
2239
+ <button
2240
+ onClick={async () => {
2241
+ await state.refetch()
2242
+ }}
2243
+ >
2244
+ refetch
2245
+ </button>
2194
2246
 
2195
- React.useEffect(() => {
2196
- setActTimeout(() => {
2197
- refetch()
2198
- }, 10)
2199
- }, [refetch])
2200
- return null
2247
+ <div>{state.data}</div>
2248
+ </>
2249
+ )
2201
2250
  }
2202
2251
 
2203
- renderWithClient(queryClient, <Page />)
2252
+ const rendered = renderWithClient(queryClient, <Page />)
2204
2253
 
2205
- await sleep(30)
2254
+ await waitFor(() => {
2255
+ rendered.getByText('test')
2256
+ })
2257
+
2258
+ fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
2259
+
2260
+ // sleep is required to make sure no additional renders happen after click
2261
+ await sleep(20)
2206
2262
 
2207
2263
  expect(states.length).toBe(2)
2208
2264
  expect(states[0]).toMatchObject({
@@ -2286,15 +2342,22 @@ describe('useQuery', () => {
2286
2342
  }
2287
2343
 
2288
2344
  function Page() {
2289
- useQuery(key, queryFn)
2290
- useQuery(key, queryFn)
2345
+ const query1 = useQuery(key, queryFn)
2346
+ const query2 = useQuery(key, queryFn)
2291
2347
  renders++
2292
- return null
2348
+
2349
+ return (
2350
+ <div>
2351
+ {query1.data} {query2.data}
2352
+ </div>
2353
+ )
2293
2354
  }
2294
2355
 
2295
- renderWithClient(queryClient, <Page />)
2356
+ const rendered = renderWithClient(queryClient, <Page />)
2296
2357
 
2297
- await sleep(20)
2358
+ await waitFor(() => {
2359
+ rendered.getByText('data data')
2360
+ })
2298
2361
 
2299
2362
  // Should be 2 instead of 3
2300
2363
  expect(renders).toBe(2)