@tanstack/react-query 5.39.0 → 5.40.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-query",
3
- "version": "5.39.0",
3
+ "version": "5.40.0",
4
4
  "description": "Hooks for managing, caching and syncing asynchronous and remote data in React",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -41,7 +41,7 @@
41
41
  "!build/codemods/**/__tests__"
42
42
  ],
43
43
  "dependencies": {
44
- "@tanstack/query-core": "5.38.0"
44
+ "@tanstack/query-core": "5.40.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/react": "npm:types-react@rc",
@@ -2,7 +2,7 @@ import { describe, expect, expectTypeOf, it, test, vi } from 'vitest'
2
2
  import { act, fireEvent, render, waitFor } from '@testing-library/react'
3
3
  import * as React from 'react'
4
4
  import { ErrorBoundary } from 'react-error-boundary'
5
- import { skipToken } from '@tanstack/query-core'
5
+ import { dehydrate, hydrate, skipToken } from '@tanstack/query-core'
6
6
  import { QueryCache, keepPreviousData, useQuery } from '..'
7
7
  import {
8
8
  Blink,
@@ -6476,4 +6476,117 @@ describe('useQuery', () => {
6476
6476
  })
6477
6477
  expect(results[3]?.errorUpdatedAt).toBeGreaterThan(0)
6478
6478
  })
6479
+
6480
+ it('should pick up an initialPromise', async () => {
6481
+ const key = queryKey()
6482
+
6483
+ const serverQueryClient = createQueryClient({
6484
+ defaultOptions: { dehydrate: { shouldDehydrateQuery: () => true } },
6485
+ })
6486
+
6487
+ void serverQueryClient.prefetchQuery({
6488
+ queryKey: key,
6489
+ queryFn: async () => {
6490
+ await sleep(10)
6491
+ return Promise.resolve('server')
6492
+ },
6493
+ })
6494
+
6495
+ const dehydrated = dehydrate(serverQueryClient)
6496
+
6497
+ let count = 0
6498
+
6499
+ function Page() {
6500
+ const query = useQuery({
6501
+ queryKey: key,
6502
+ queryFn: async () => {
6503
+ count++
6504
+ await sleep(10)
6505
+ return Promise.resolve('client')
6506
+ },
6507
+ })
6508
+
6509
+ return (
6510
+ <div>
6511
+ <div>data: {query.data}</div>
6512
+ <button onClick={() => query.refetch()}>refetch</button>
6513
+ </div>
6514
+ )
6515
+ }
6516
+
6517
+ const clientQueryClient = createQueryClient()
6518
+ hydrate(clientQueryClient, dehydrated)
6519
+
6520
+ const rendered = renderWithClient(clientQueryClient, <Page />)
6521
+
6522
+ await waitFor(() => rendered.getByText('data: server'))
6523
+ expect(count).toBe(0)
6524
+
6525
+ fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
6526
+
6527
+ await waitFor(() => rendered.getByText('data: client'))
6528
+ expect(count).toBe(1)
6529
+ })
6530
+
6531
+ it('should retry failed initialPromise on the client', async () => {
6532
+ const consoleMock = vi
6533
+ .spyOn(console, 'error')
6534
+ .mockImplementation(() => undefined)
6535
+ const key = queryKey()
6536
+
6537
+ const serverQueryClient = createQueryClient({
6538
+ defaultOptions: {
6539
+ dehydrate: { shouldDehydrateQuery: () => true },
6540
+ },
6541
+ })
6542
+
6543
+ void serverQueryClient.prefetchQuery({
6544
+ queryKey: key,
6545
+ queryFn: async () => {
6546
+ await sleep(10)
6547
+ return Promise.reject(new Error('server error'))
6548
+ },
6549
+ })
6550
+
6551
+ const dehydrated = dehydrate(serverQueryClient)
6552
+
6553
+ let count = 0
6554
+
6555
+ function Page() {
6556
+ const query = useQuery({
6557
+ queryKey: key,
6558
+ queryFn: async () => {
6559
+ count++
6560
+ await sleep(10)
6561
+ return Promise.resolve('client')
6562
+ },
6563
+ })
6564
+
6565
+ return (
6566
+ <div>
6567
+ <div>failure: {query.failureReason?.message}</div>
6568
+ <div>data: {query.data}</div>
6569
+ </div>
6570
+ )
6571
+ }
6572
+
6573
+ const clientQueryClient = createQueryClient({
6574
+ defaultOptions: { hydrate: { queries: { retry: 1, retryDelay: 10 } } },
6575
+ })
6576
+ hydrate(clientQueryClient, dehydrated)
6577
+
6578
+ const rendered = renderWithClient(clientQueryClient, <Page />)
6579
+ await waitFor(() => rendered.getByText('failure: redacted'))
6580
+ await waitFor(() => rendered.getByText('data: client'))
6581
+ expect(count).toBe(1)
6582
+
6583
+ const query = clientQueryClient.getQueryCache().find({ queryKey: key })
6584
+
6585
+ expect(consoleMock).toHaveBeenCalledTimes(1)
6586
+ expect(consoleMock).toHaveBeenCalledWith(
6587
+ `A query that was dehydrated as pending ended up rejecting. [${query?.queryHash}]: Error: server error; The error will be redacted in production builds`,
6588
+ )
6589
+
6590
+ consoleMock.mockRestore()
6591
+ })
6479
6592
  })