Skip to content

Commit d4e76c4

Browse files
authored
Merge branch 'main' into chore/consistent-file-name
2 parents 232c0c7 + b8ea29e commit d4e76c4

File tree

11 files changed

+102
-91
lines changed

11 files changed

+102
-91
lines changed

docs/framework/react/guides/advanced-ssr.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ export default function Posts() {
530530

531531
Now, your `getPosts` function can return e.g. `Temporal` datetime objects and the data will be serialized and deserialized on the client, assuming your transformer can serialize and deserialize those data types.
532532

533-
For more information, check out the [Next.js App with Prefetching Example](../examples/react/nextjs-app-prefetching).
533+
For more information, check out the [Next.js App with Prefetching Example](../examples/nextjs-app-prefetching).
534534

535535
## Experimental streaming without prefetching in Next.js
536536

@@ -597,7 +597,7 @@ export function Providers(props: { children: React.ReactNode }) {
597597
}
598598
```
599599

600-
For more information, check out the [NextJs Suspense Streaming Example](../examples/react/nextjs-suspense-streaming).
600+
For more information, check out the [NextJs Suspense Streaming Example](../examples/nextjs-suspense-streaming).
601601

602602
The big upside is that you no longer need to prefetch queries manually to have SSR work, and it even still streams in the result! This gives you phenomenal DX and lower code complexity.
603603

docs/framework/react/guides/mutations.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ export default function App() {
386386

387387
[//]: # 'Example11'
388388

389-
We also have an extensive [offline example](../examples/react/offline) that covers both queries and mutations.
389+
We also have an extensive [offline example](../examples/offline) that covers both queries and mutations.
390390

391391
## Mutation Scopes
392392

docs/framework/react/guides/prefetching.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ const articleRoute = new Route({
412412
})
413413
```
414414

415-
Integration with other routers is also possible, see the [React Router example](../examples/react/react-router) for another demonstration.
415+
Integration with other routers is also possible, see the [React Router example](../examples/react-router) for another demonstration.
416416

417417
[//]: # 'Router'
418418

docs/framework/react/guides/suspense.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ React Query can also be used with React's Suspense for Data Fetching APIs. For t
1010
- [useSuspenseQueries](../reference/useSuspenseQueries.md)
1111
- Additionally, you can use the `useQuery().promise` and `React.use()` (Experimental)
1212

13-
When using suspense mode, `status` states and `error` objects are not needed and are then replaced by usage of the `React.Suspense` component (including the use of the `fallback` prop and React error boundaries for catching errors). Please read the [Resetting Error Boundaries](#resetting-error-boundaries) and look at the [Suspense Example](../examples/react/suspense) for more information on how to set up suspense mode.
13+
When using suspense mode, `status` states and `error` objects are not needed and are then replaced by usage of the `React.Suspense` component (including the use of the `fallback` prop and React error boundaries for catching errors). Please read the [Resetting Error Boundaries](#resetting-error-boundaries) and look at the [Suspense Example](../examples/suspense) for more information on how to set up suspense mode.
1414

1515
If you want mutations to propagate errors to the nearest error boundary (similar to queries), you can set the `throwOnError` option to `true` as well.
1616

@@ -172,7 +172,7 @@ export function Providers(props: { children: React.ReactNode }) {
172172
}
173173
```
174174

175-
For more information, check out the [NextJs Suspense Streaming Example](../examples/react/nextjs-suspense-streaming) and the [Advanced Rendering & Hydration](./advanced-ssr.md) guide.
175+
For more information, check out the [NextJs Suspense Streaming Example](../examples/nextjs-suspense-streaming) and the [Advanced Rendering & Hydration](./advanced-ssr.md) guide.
176176

177177
## Using `useQuery().promise` and `React.use()` (Experimental)
178178

docs/reference/streamedQuery.md

+6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ title: streamedQuery
55

66
`streamedQuery` is a helper function to create a query function that streams data from an [AsyncIterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncIterator). Data will be an Array of all the chunks received. The query will be in a `pending` state until the first chunk of data is received, but will go to `success` after that. The query will stay in fetchStatus `fetching` until the stream ends.
77

8+
To see `streamedQuery` in action, take a look at our [chat example](../framework/react/examples/chat).
9+
810
```tsx
11+
import { experimental_streamedQuery as streamedQuery } from '@tanstack/react-query'
12+
913
const query = queryOptions({
1014
queryKey: ['data'],
1115
queryFn: streamedQuery({
@@ -14,6 +18,8 @@ const query = queryOptions({
1418
})
1519
```
1620

21+
> Note: `streamedQuery` is currently marked as `experimental` because we want to gather feedback from the community. If you've tried out the API and have feedback for us, please provide it in this [GitHub discussion](https://github.com/TanStack/query/discussions/9065).
22+
1723
**Options**
1824

1925
- `queryFn: (context: QueryFunctionContext) => Promise<AsyncIterable<TData>>`

packages/query-persist-client-core/src/__tests__/createPersister.test.ts

+15-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { describe, expect, test, vi } from 'vitest'
1+
import { afterAll, beforeAll, describe, expect, test, vi } from 'vitest'
22
import { Query, QueryClient, hashKey } from '@tanstack/query-core'
33
import {
44
PERSISTER_KEY_PREFIX,
55
experimental_createPersister,
66
} from '../createPersister'
7-
import { sleep } from './utils'
87
import type { QueryFunctionContext, QueryKey } from '@tanstack/query-core'
98
import type { StoragePersisterOptions } from '../createPersister'
109

@@ -60,6 +59,14 @@ function setupPersister(
6059
}
6160

6261
describe('createPersister', () => {
62+
beforeAll(() => {
63+
vi.useFakeTimers()
64+
})
65+
66+
afterAll(() => {
67+
vi.useRealTimers()
68+
})
69+
6370
test('should fetch if storage is not provided', async () => {
6471
const { context, persisterFn, query, queryFn } = setupPersister(['foo'], {
6572
storage: undefined,
@@ -215,7 +222,7 @@ describe('createPersister', () => {
215222
query.fetch = vi.fn()
216223
expect(query.state.dataUpdatedAt).toEqual(0)
217224

218-
await sleep(0)
225+
await vi.advanceTimersByTimeAsync(0)
219226

220227
expect(queryFn).toHaveBeenCalledTimes(0)
221228
expect(query.fetch).toHaveBeenCalledTimes(0)
@@ -243,7 +250,7 @@ describe('createPersister', () => {
243250
query.state.isInvalidated = true
244251
query.fetch = vi.fn()
245252

246-
await sleep(0)
253+
await vi.advanceTimersByTimeAsync(0)
247254

248255
expect(queryFn).toHaveBeenCalledTimes(0)
249256
expect(query.fetch).toHaveBeenCalledTimes(1)
@@ -266,7 +273,7 @@ describe('createPersister', () => {
266273
await persisterFn(queryFn, context, query)
267274
query.setData('baz')
268275

269-
await sleep(0)
276+
await vi.advanceTimersByTimeAsync(0)
270277

271278
expect(queryFn).toHaveBeenCalledOnce()
272279
expect(queryFn).toHaveBeenCalledWith(context)
@@ -308,7 +315,7 @@ describe('createPersister', () => {
308315
await persisterFn(queryFn, context, query)
309316
query.fetch = vi.fn()
310317

311-
await sleep(0)
318+
await vi.advanceTimersByTimeAsync(0)
312319

313320
expect(queryFn).toHaveBeenCalledTimes(1)
314321
expect(query.fetch).toHaveBeenCalledTimes(0)
@@ -337,7 +344,7 @@ describe('createPersister', () => {
337344
query.state.isInvalidated = true
338345
query.fetch = vi.fn()
339346

340-
await sleep(0)
347+
await vi.advanceTimersByTimeAsync(0)
341348

342349
expect(queryFn).toHaveBeenCalledTimes(0)
343350
expect(query.fetch).toHaveBeenCalledTimes(1)
@@ -362,7 +369,7 @@ describe('createPersister', () => {
362369
await persisterFn(queryFn, context, query)
363370
query.setData('baz')
364371

365-
await sleep(0)
372+
await vi.advanceTimersByTimeAsync(0)
366373

367374
expect(queryFn).toHaveBeenCalledOnce()
368375
expect(queryFn).toHaveBeenCalledWith(context)

packages/query-persist-client-core/src/__tests__/utils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export function createQueryClient(config?: QueryClientConfig): QueryClient {
77
return new QueryClient(config)
88
}
99

10-
export function sleep(timeout: number): Promise<void> {
10+
function sleep(timeout: number): Promise<void> {
1111
return new Promise((resolve, _reject) => {
1212
setTimeout(resolve, timeout)
1313
})

packages/react-query/src/__tests__/QueryClientProvider.test.tsx

+18-22
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1-
import { describe, expect, test, vi } from 'vitest'
2-
import { render, waitFor } from '@testing-library/react'
1+
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
2+
import { render } from '@testing-library/react'
33
import { QueryCache, QueryClientProvider, useQuery, useQueryClient } from '..'
44
import { createQueryClient, queryKey, sleep } from './utils'
55

66
describe('QueryClientProvider', () => {
7+
beforeEach(() => {
8+
vi.useFakeTimers()
9+
})
10+
11+
afterEach(() => {
12+
vi.useRealTimers()
13+
})
14+
715
test('sets a specific cache for all queries to use', async () => {
816
const key = queryKey()
917

@@ -13,10 +21,7 @@ describe('QueryClientProvider', () => {
1321
function Page() {
1422
const { data } = useQuery({
1523
queryKey: key,
16-
queryFn: async () => {
17-
await sleep(10)
18-
return 'test'
19-
},
24+
queryFn: () => sleep(10).then(() => 'test'),
2025
})
2126

2227
return (
@@ -32,7 +37,7 @@ describe('QueryClientProvider', () => {
3237
</QueryClientProvider>,
3338
)
3439

35-
await waitFor(() => rendered.getByText('test'))
40+
await vi.waitFor(() => rendered.getByText('test'))
3641

3742
expect(queryCache.find({ queryKey: key })).toBeDefined()
3843
})
@@ -50,10 +55,7 @@ describe('QueryClientProvider', () => {
5055
function Page1() {
5156
const { data } = useQuery({
5257
queryKey: key1,
53-
queryFn: async () => {
54-
await sleep(10)
55-
return 'test1'
56-
},
58+
queryFn: () => sleep(10).then(() => 'test1'),
5759
})
5860

5961
return (
@@ -65,10 +67,7 @@ describe('QueryClientProvider', () => {
6567
function Page2() {
6668
const { data } = useQuery({
6769
queryKey: key2,
68-
queryFn: async () => {
69-
await sleep(10)
70-
return 'test2'
71-
},
70+
queryFn: () => sleep(10).then(() => 'test2'),
7271
})
7372

7473
return (
@@ -89,8 +88,8 @@ describe('QueryClientProvider', () => {
8988
</>,
9089
)
9190

92-
await waitFor(() => rendered.getByText('test1'))
93-
await waitFor(() => rendered.getByText('test2'))
91+
await vi.waitFor(() => rendered.getByText('test1'))
92+
await vi.waitFor(() => rendered.getByText('test2'))
9493

9594
expect(queryCache1.find({ queryKey: key1 })).toBeDefined()
9695
expect(queryCache1.find({ queryKey: key2 })).not.toBeDefined()
@@ -114,10 +113,7 @@ describe('QueryClientProvider', () => {
114113
function Page() {
115114
const { data } = useQuery({
116115
queryKey: key,
117-
queryFn: async () => {
118-
await sleep(10)
119-
return 'test'
120-
},
116+
queryFn: () => sleep(10).then(() => 'test'),
121117
})
122118

123119
return (
@@ -133,7 +129,7 @@ describe('QueryClientProvider', () => {
133129
</QueryClientProvider>,
134130
)
135131

136-
await waitFor(() => rendered.getByText('test'))
132+
await vi.waitFor(() => rendered.getByText('test'))
137133

138134
expect(queryCache.find({ queryKey: key })).toBeDefined()
139135
expect(queryCache.find({ queryKey: key })?.options.gcTime).toBe(Infinity)

packages/react-query/src/__tests__/fine-grained-persister.test.tsx

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { describe, expect, it, vi } from 'vitest'
2-
import { waitFor } from '@testing-library/react'
1+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
32
import * as React from 'react'
43
import { QueryCache, hashKey } from '@tanstack/query-core'
54
import {
@@ -10,6 +9,14 @@ import { useQuery } from '..'
109
import { createQueryClient, queryKey, renderWithClient, sleep } from './utils'
1110

1211
describe('fine grained persister', () => {
12+
beforeEach(() => {
13+
vi.useFakeTimers()
14+
})
15+
16+
afterEach(() => {
17+
vi.useRealTimers()
18+
})
19+
1320
const queryCache = new QueryCache()
1421
const queryClient = createQueryClient({ queryCache })
1522

@@ -61,7 +68,7 @@ describe('fine grained persister', () => {
6168

6269
const rendered = renderWithClient(queryClient, <Test />)
6370

64-
await waitFor(() => rendered.getByText('Works from persister'))
71+
await vi.waitFor(() => rendered.getByText('Works from persister'))
6572
expect(spy).not.toHaveBeenCalled()
6673
})
6774

@@ -116,8 +123,8 @@ describe('fine grained persister', () => {
116123

117124
const rendered = renderWithClient(queryClient, <Test />)
118125

119-
await waitFor(() => rendered.getByText('Works from persister'))
120-
await waitFor(() => rendered.getByText('Works from queryFn'))
126+
await vi.waitFor(() => rendered.getByText('Works from persister'))
127+
await vi.waitFor(() => rendered.getByText('Works from queryFn'))
121128
expect(spy).toHaveBeenCalledTimes(1)
122129
})
123130

@@ -155,7 +162,7 @@ describe('fine grained persister', () => {
155162

156163
const rendered = renderWithClient(queryClient, <Test />)
157164

158-
await waitFor(() => rendered.getByText('Works from queryFn'))
165+
await vi.waitFor(() => rendered.getByText('Works from queryFn'))
159166
expect(spy).toHaveBeenCalledTimes(1)
160167

161168
const storedItem = await storage.getItem(`${PERSISTER_KEY_PREFIX}-${hash}`)

packages/react-query/src/__tests__/ssr-hydration.test.tsx

+7-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
hydrate,
1111
useQuery,
1212
} from '..'
13-
import { createQueryClient, setIsServer, sleep } from './utils'
13+
import { createQueryClient, setIsServer } from './utils'
1414

1515
const ReactHydrate = (element: React.ReactElement, container: Element) => {
1616
let root: any
@@ -23,7 +23,7 @@ const ReactHydrate = (element: React.ReactElement, container: Element) => {
2323
}
2424

2525
async function fetchData<TData>(value: TData, ms?: number): Promise<TData> {
26-
await sleep(ms || 1)
26+
await vi.advanceTimersByTimeAsync(ms || 1)
2727
return value
2828
}
2929

@@ -36,12 +36,15 @@ describe('Server side rendering with de/rehydration', () => {
3636
beforeAll(() => {
3737
// @ts-expect-error we expect IS_REACT_ACT_ENVIRONMENT to exist
3838
previousIsReactActEnvironment = globalThis.IS_REACT_ACT_ENVIRONMENT = true
39+
vi.useFakeTimers()
3940
})
4041

4142
afterAll(() => {
4243
// @ts-expect-error we expect IS_REACT_ACT_ENVIRONMENT to exist
4344
globalThis.IS_REACT_ACT_ENVIRONMENT = previousIsReactActEnvironment
45+
vi.useRealTimers()
4446
})
47+
4548
it('should not mismatch on success', async () => {
4649
const consoleMock = vi.spyOn(console, 'error')
4750
consoleMock.mockImplementation(() => undefined)
@@ -185,7 +188,7 @@ describe('Server side rendering with de/rehydration', () => {
185188
expect(consoleMock).toHaveBeenCalledTimes(0)
186189
expect(fetchDataError).toHaveBeenCalledTimes(2)
187190
expect(el.innerHTML).toBe(expectedMarkup)
188-
await sleep(50)
191+
await vi.advanceTimersByTimeAsync(50)
189192
expect(fetchDataError).toHaveBeenCalledTimes(2)
190193
expect(el.innerHTML).toBe(
191194
'ErrorComponent - status:error fetching:false data:undefined',
@@ -253,7 +256,7 @@ describe('Server side rendering with de/rehydration', () => {
253256
expect(consoleMock).toHaveBeenCalledTimes(0)
254257
expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
255258
expect(el.innerHTML).toBe(expectedMarkup)
256-
await sleep(50)
259+
await vi.advanceTimersByTimeAsync(50)
257260
expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
258261
expect(el.innerHTML).toBe(
259262
'SuccessComponent - status:success fetching:false data:success!',

0 commit comments

Comments
 (0)