Skip to content

Commit b886889

Browse files
authored
fix(react-query): correct type for onSuccess of useQuery (#9242)
* fix(react-query): correct type for `onSuccess` of `useQuery` * chore: update * chore: update * ci: revert * refactor(react-query): remove unused onSuccess, onError, and onSettled options from useSuspenseQuery * chore: update * refactor(react-query): reorganize tests for onSuccess and initialData in useQuery
1 parent e210ca1 commit b886889

File tree

9 files changed

+273
-135
lines changed

9 files changed

+273
-135
lines changed

.github/workflows/pr.yml

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ env:
1515

1616
jobs:
1717
main:
18-
name: Nx Cloud
18+
name: Nx Cloud - Main Job
1919
runs-on: ubuntu-latest
2020
steps:
2121
- name: Checkout
@@ -31,15 +31,46 @@ jobs:
3131
cache: pnpm
3232
cache-dependency-path: pnpm-lock.yaml
3333
- name: Install dependencies
34-
run: pnpm install --frozen-lockfile
35-
- name: Get base and head commits for `nx affected`
36-
uses: nrwl/nx-set-shas@v4.3.0
34+
run: pnpm --filter "./packages/**" --filter query --prefer-offline install
35+
- name: Get appropriate base and head commits for `nx affected` commands
36+
uses: nrwl/nx-set-shas@v3
3737
with:
38-
main-branch-name: main
38+
main-branch-name: 'main'
39+
- run: |
40+
echo "BASE: ${{ env.NX_BASE }}"
41+
echo "HEAD: ${{ env.NX_HEAD }}"
42+
- name: Start CI Orchestrator
43+
run: npx nx-cloud start-ci-run
3944
- name: Run Tests
4045
run: pnpm run test:pr
46+
- name: Stop Agents
47+
run: npx nx-cloud stop-all-agents
4148
- name: Upload coverage to Codecov
4249
uses: codecov/codecov-action@v3
50+
agents:
51+
name: Nx Cloud - Agents
52+
runs-on: ubuntu-latest
53+
timeout-minutes: 10
54+
strategy:
55+
matrix:
56+
agent: [1, 2, 3]
57+
steps:
58+
- name: Checkout
59+
uses: actions/[email protected]
60+
with:
61+
fetch-depth: 0
62+
- name: Setup pnpm
63+
uses: pnpm/[email protected]
64+
- name: Setup Node
65+
uses: actions/setup-node@v3
66+
with:
67+
node-version-file: .nvmrc
68+
cache: pnpm
69+
cache-dependency-path: pnpm-lock.yaml
70+
- name: Install dependencies
71+
run: pnpm --filter "./packages/**" --filter query --prefer-offline install
72+
- name: Start Nx Agent ${{ matrix.agent }}
73+
run: npx nx-cloud start-agent
4374
format:
4475
name: Format
4576
runs-on: ubuntu-latest
@@ -57,7 +88,7 @@ jobs:
5788
cache: pnpm
5889
cache-dependency-path: pnpm-lock.yaml
5990
- name: Install dependencies
60-
run: pnpm install --frozen-lockfile
91+
run: pnpm --filter "./packages/**" --filter query --prefer-offline install
6192
- name: Run prettier
6293
run: pnpm run test:format
6394
test-react-17:
@@ -78,17 +109,15 @@ jobs:
78109
cache: pnpm
79110
cache-dependency-path: pnpm-lock.yaml
80111
- name: Install dependencies
81-
run: pnpm install --frozen-lockfile
82-
- name: Get base and head commits for `nx affected`
83-
uses: nrwl/[email protected]
84-
with:
85-
main-branch-name: main
112+
run: pnpm --filter "./packages/**" --filter query --prefer-offline install
113+
- name: Derive appropriate SHAs for base and head for `nx affected` commands
114+
uses: nrwl/nx-set-shas@v2
86115
- name: Run Tests
87116
uses: nick-fields/[email protected]
88117
with:
89118
timeout_minutes: 5
90119
max_attempts: 3
91-
command: pnpm nx affected --targets=test:lib
120+
command: npx nx affected --targets=test:lib --base=${{ github.event.pull_request.base.sha }}
92121
env:
93122
NX_CLOUD_DISTRIBUTED_EXECUTION: false
94123
REACTJS_VERSION: 17

packages/query-core/src/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import type { Logger } from './logger'
1010

1111
export type NonUndefinedGuard<T> = T extends undefined ? never : T
1212

13+
export type DistributiveOmit<
14+
TObject,
15+
TKey extends keyof TObject,
16+
> = TObject extends any ? Omit<TObject, TKey> : never
17+
1318
export type OmitKeyof<
1419
TObject,
1520
TKey extends TStrictly extends 'safely'

packages/react-query/src/__tests__/useQuery.types.test.tsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { expectTypeOf } from 'expect-type'
12
import { useQuery } from '../useQuery'
23
import { doNotExecute } from './utils'
4+
import type { DefinedUseQueryResult, UseQueryResult } from '../types'
35

46
export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
57
T,
@@ -9,6 +11,39 @@ export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
911

1012
export type Expect<T extends true> = T
1113

14+
describe('onSuccess', () => {
15+
it('should be typed correctly', () => {
16+
doNotExecute(() => {
17+
expectTypeOf(
18+
useQuery({
19+
queryKey: ['posts'],
20+
queryFn: async () => ({ id: 1 }),
21+
onSuccess: (data) =>
22+
expectTypeOf(data).toEqualTypeOf<{ id: number }>(),
23+
}),
24+
).toEqualTypeOf<UseQueryResult<{ id: number }, unknown>>()
25+
expectTypeOf(
26+
useQuery({
27+
queryKey: ['posts'],
28+
queryFn: async () => ({ id: 1 }),
29+
initialData: { id: 1 },
30+
onSuccess: (data) =>
31+
expectTypeOf(data).toEqualTypeOf<{ id: number }>(),
32+
}),
33+
).toEqualTypeOf<DefinedUseQueryResult<{ id: number }, unknown>>()
34+
expectTypeOf(
35+
useQuery({
36+
queryKey: ['posts'],
37+
queryFn: async () => ({ id: 1 }),
38+
initialData: { id: 1 },
39+
select: (data) => data.id,
40+
onSuccess: (data) => expectTypeOf(data).toEqualTypeOf<number>(),
41+
}),
42+
).toEqualTypeOf<DefinedUseQueryResult<number, unknown>>()
43+
})
44+
})
45+
})
46+
1247
describe('initialData', () => {
1348
describe('Config object overload', () => {
1449
it('TData should always be defined when initialData is provided as an object', () => {

packages/react-query/src/queryOptions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type ProhibitedQueryOptionsKeyInV5 = keyof Pick<
2222
'useErrorBoundary' | 'suspense' | 'getNextPageParam' | 'getPreviousPageParam'
2323
>
2424

25-
export type UndefinedInitialDataOptions<
25+
type UndefinedInitialDataOptions<
2626
TQueryFnData = unknown,
2727
TError = unknown,
2828
TData = TQueryFnData,
@@ -34,7 +34,7 @@ export type UndefinedInitialDataOptions<
3434
| NonUndefinedGuard<TQueryFnData>
3535
}
3636

37-
export type DefinedInitialDataOptions<
37+
type DefinedInitialDataOptions<
3838
TQueryFnData = unknown,
3939
TError = unknown,
4040
TData = TQueryFnData,

packages/react-query/src/useQuery.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
'use client'
22
import { QueryObserver, parseQueryArgs } from '@tanstack/query-core'
33
import { useBaseQuery } from './useBaseQuery'
4-
import type {
5-
DefinedInitialDataOptions,
6-
UndefinedInitialDataOptions,
7-
} from './queryOptions'
84
import type {
95
InitialDataFunction,
106
NonUndefinedGuard,
@@ -19,14 +15,6 @@ import type {
1915
} from './types'
2016

2117
// HOOK
22-
export function useQuery<
23-
TQueryFnData = unknown,
24-
TError = unknown,
25-
TData = TQueryFnData,
26-
TQueryKey extends QueryKey = QueryKey,
27-
>(
28-
options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
29-
): DefinedUseQueryResult<TData, TError>
3018
export function useQuery<
3119
TQueryFnData = unknown,
3220
TError = unknown,
@@ -42,14 +30,6 @@ export function useQuery<
4230
| (() => NonUndefinedGuard<TQueryFnData>)
4331
},
4432
): DefinedUseQueryResult<TData, TError>
45-
export function useQuery<
46-
TQueryFnData = unknown,
47-
TError = unknown,
48-
TData = TQueryFnData,
49-
TQueryKey extends QueryKey = QueryKey,
50-
>(
51-
options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
52-
): UseQueryResult<TData, TError>
5333
export function useQuery<
5434
TQueryFnData = unknown,
5535
TError = unknown,

packages/react-query/src/useSuspenseQuery.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@ import { QueryObserver } from '@tanstack/query-core'
22
import { useBaseQuery } from './useBaseQuery'
33
import type {
44
DefinedQueryObserverResult,
5+
DistributiveOmit,
56
OmitKeyof,
67
QueryKey,
78
} from '@tanstack/query-core'
89
import type { UseQueryOptions } from './types'
910

10-
type DistributiveOmit<TObject, TKey extends keyof TObject> = TObject extends any
11-
? Omit<TObject, TKey>
12-
: never
13-
1411
export type UseSuspenseQueryResult<
1512
TData = unknown,
1613
TError = unknown,

packages/vue-query/src/types.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,3 @@ export type VueInfiniteQueryObserverOptions<
136136
>[Property]
137137
>
138138
}
139-
140-
export type DistributiveOmit<T, K extends keyof any> = T extends any
141-
? Omit<T, K>
142-
: never

packages/vue-query/src/useMutation.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,15 @@ import {
1818
import { useQueryClient } from './useQueryClient'
1919
import type { ToRefs } from 'vue-demi'
2020
import type {
21+
DistributiveOmit,
2122
MutateFunction,
2223
MutateOptions,
2324
MutationFunction,
2425
MutationKey,
2526
MutationObserverOptions,
2627
MutationObserverResult,
2728
} from '@tanstack/query-core'
28-
import type {
29-
DistributiveOmit,
30-
MaybeRef,
31-
MaybeRefDeep,
32-
WithQueryClientKey,
33-
} from './types'
29+
import type { MaybeRef, MaybeRefDeep, WithQueryClientKey } from './types'
3430

3531
type MutationResult<TData, TError, TVariables, TContext> = DistributiveOmit<
3632
MutationObserverResult<TData, TError, TVariables, TContext>,

0 commit comments

Comments
 (0)