Skip to content

Commit b3260f0

Browse files
authored
feat(react-query): backport usePrefetchQuery, usePrefetchInfiniteQuery (#10075)
* feat(react-query): backport usePrefetchQuery, usePrefetchInfiniteQuery * chore: add changeset for backporting usePrefetchQuery and usePrefetchInfiniteQuery * test(react-query): wrap usePrefetchQuery and usePrefetchInfiniteQuery tests in doNotExecute utility to prevent execution * chore: update changeset configuration to include fixed packages for @TanStack libraries * chore: refactor changeset configuration to group fixed packages for @TanStack libraries
1 parent 7674c97 commit b3260f0

7 files changed

Lines changed: 170 additions & 1 deletion

File tree

.changeset/config.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,22 @@
55
"access": "public",
66
"baseBranch": "v4",
77
"updateInternalDependencies": "patch",
8-
"fixed": [],
8+
"fixed": [
9+
[
10+
"@tanstack/eslint-plugin-query",
11+
"@tanstack/query-async-storage-persister",
12+
"@tanstack/query-broadcast-client-experimental",
13+
"@tanstack/query-core",
14+
"@tanstack/query-persist-client-core",
15+
"@tanstack/query-sync-storage-persister",
16+
"@tanstack/react-query",
17+
"@tanstack/react-query-devtools",
18+
"@tanstack/react-query-persist-client",
19+
"@tanstack/solid-query",
20+
"@tanstack/svelte-query",
21+
"@tanstack/vue-query"
22+
]
23+
],
924
"linked": [],
1025
"ignore": [],
1126
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {

.changeset/fast-snails-clap.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@tanstack/react-query': minor
3+
---
4+
5+
feat(react-query): backport usePrefetchQuery, usePrefetchInfiniteQuery
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { expectTypeOf } from 'expect-type'
2+
import { usePrefetchInfiniteQuery } from '../usePrefetchInfiniteQuery'
3+
import { doNotExecute } from './utils'
4+
5+
describe('usePrefetchInfiniteQuery', () => {
6+
it('should return nothing', () => {
7+
doNotExecute(() => {
8+
const result = usePrefetchInfiniteQuery({
9+
queryKey: ['key'],
10+
queryFn: () => Promise.resolve(5),
11+
getNextPageParam: () => 1,
12+
})
13+
14+
expectTypeOf(result).toEqualTypeOf<void>()
15+
})
16+
})
17+
18+
it('should not allow refetchInterval, enabled or throwOnError options', () => {
19+
doNotExecute(() => {
20+
usePrefetchInfiniteQuery({
21+
queryKey: ['key'],
22+
queryFn: () => Promise.resolve(5),
23+
getNextPageParam: () => 1,
24+
// @ts-expect-error TS2353
25+
refetchInterval: 1000,
26+
})
27+
28+
usePrefetchInfiniteQuery({
29+
queryKey: ['key'],
30+
queryFn: () => Promise.resolve(5),
31+
getNextPageParam: () => 1,
32+
// @ts-expect-error TS2353
33+
enabled: true,
34+
})
35+
36+
usePrefetchInfiniteQuery({
37+
queryKey: ['key'],
38+
queryFn: () => Promise.resolve(5),
39+
getNextPageParam: () => 1,
40+
// @ts-expect-error TS2353
41+
throwOnError: true,
42+
})
43+
})
44+
})
45+
})
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { expectTypeOf } from 'expect-type'
2+
import { usePrefetchQuery } from '..'
3+
import { doNotExecute } from './utils'
4+
5+
describe('usePrefetchQuery', () => {
6+
it('should return nothing', () => {
7+
doNotExecute(() => {
8+
const result = usePrefetchQuery({
9+
queryKey: ['key'],
10+
queryFn: () => Promise.resolve(5),
11+
})
12+
13+
expectTypeOf(result).toEqualTypeOf<void>()
14+
})
15+
})
16+
17+
it('should not allow refetchInterval, enabled or throwOnError options', () => {
18+
doNotExecute(() => {
19+
usePrefetchQuery({
20+
queryKey: ['key'],
21+
queryFn: () => Promise.resolve(5),
22+
// @ts-expect-error TS2345
23+
refetchInterval: 1000,
24+
})
25+
26+
usePrefetchQuery({
27+
queryKey: ['key'],
28+
queryFn: () => Promise.resolve(5),
29+
// @ts-expect-error TS2345
30+
enabled: true,
31+
})
32+
33+
usePrefetchQuery({
34+
queryKey: ['key'],
35+
queryFn: () => Promise.resolve(5),
36+
// @ts-expect-error TS2345
37+
throwOnError: true,
38+
})
39+
})
40+
})
41+
42+
it('should not allow skipToken in queryFn', () => {
43+
doNotExecute(() => {
44+
usePrefetchQuery({
45+
queryKey: ['key'],
46+
// @ts-expect-error
47+
queryFn: skipToken,
48+
})
49+
usePrefetchQuery({
50+
queryKey: ['key'],
51+
// @ts-expect-error
52+
queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5),
53+
})
54+
})
55+
})
56+
})

packages/react-query/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@ export { useIsMutating } from './useIsMutating'
4646
export { useMutation } from './useMutation'
4747
export { useInfiniteQuery } from './useInfiniteQuery'
4848
export { useIsRestoring, IsRestoringProvider } from './isRestoring'
49+
export { usePrefetchQuery } from './usePrefetchQuery'
50+
export { usePrefetchInfiniteQuery } from './usePrefetchInfiniteQuery'
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { useQueryClient } from './QueryClientProvider'
2+
import type {
3+
FetchInfiniteQueryOptions,
4+
QueryKey,
5+
WithRequired,
6+
} from '@tanstack/query-core'
7+
8+
export function usePrefetchInfiniteQuery<
9+
TQueryFnData = unknown,
10+
TError = unknown,
11+
TData = TQueryFnData,
12+
TQueryKey extends QueryKey = QueryKey,
13+
>(
14+
options: WithRequired<
15+
FetchInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
16+
'queryKey'
17+
>,
18+
) {
19+
const client = useQueryClient()
20+
if (!client.getQueryState(options.queryKey)) {
21+
client.prefetchInfiniteQuery(options)
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { useQueryClient } from './QueryClientProvider'
2+
import type {
3+
FetchQueryOptions,
4+
QueryKey,
5+
WithRequired,
6+
} from '@tanstack/query-core'
7+
8+
export function usePrefetchQuery<
9+
TQueryFnData = unknown,
10+
TError = unknown,
11+
TData = TQueryFnData,
12+
TQueryKey extends QueryKey = QueryKey,
13+
>(
14+
options: WithRequired<
15+
FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
16+
'queryKey'
17+
>,
18+
) {
19+
const client = useQueryClient()
20+
if (!client.getQueryState(options.queryKey)) {
21+
client.prefetchQuery(options)
22+
}
23+
}

0 commit comments

Comments
 (0)