Skip to content

Commit d53d856

Browse files
authored
fix(tanstack-query): exactOptionalPropertyTypes (#878)
When using `"exactOptionalPropertyTypes": true` in my tsconfig, I get an error saying that `enabled cannot be undefined (as it is marked explicitly as undefined by ORPC, but is optional for tanstack query)`: <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Refactor** * Options objects no longer include an "enabled" field unless explicitly required (e.g., when skipping), resulting in cleaner shapes across React, Solid, Svelte, and core query utilities. * Type definitions updated: `enabled` is now optional (`enabled?: boolean`) in query and infinite option interfaces, improving TypeScript ergonomics without changing runtime behavior. * **Tests** * Assertions updated to verify the absence of the "enabled" property when not needed, aligning tests with the new option shapes. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent 280152f commit d53d856

File tree

13 files changed

+43
-30
lines changed

13 files changed

+43
-30
lines changed

packages/react-query/src/procedure-utils.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ describe('createProcedureUtils', () => {
3333
it('without skipToken', async () => {
3434
const options = utils.queryOptions({ input: { search: '__search__' }, context: { batch: '__batch__' } })
3535

36+
expect('enabled' in options).toBe(false)
3637
expect(options.enabled).toBe(undefined)
3738

3839
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)
@@ -72,6 +73,7 @@ describe('createProcedureUtils', () => {
7273
queryFnOptions: { refetchMode: 'replace' },
7374
})
7475

76+
expect('enabled' in options).toBe(false)
7577
expect(options.enabled).toBe(undefined)
7678

7779
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)
@@ -130,6 +132,7 @@ describe('createProcedureUtils', () => {
130132
initialPageParam: '__initialPageParam__',
131133
})
132134

135+
expect('enabled' in options).toBe(false)
133136
expect(options.enabled).toBe(undefined)
134137

135138
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)

packages/react-query/src/procedure-utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,13 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
8787

8888
return client(optionsIn.input, { signal, context: optionsIn.context })
8989
},
90-
enabled: optionsIn.input === skipToken ? false : undefined,
90+
...optionsIn.input === skipToken ? { enabled: false } : {},
9191
...optionsIn,
9292
}
9393
},
9494

9595
experimental_streamedOptions(...[optionsIn = {} as any]) {
9696
return {
97-
enabled: optionsIn.input === skipToken ? false : undefined,
9897
queryKey: generateOperationKey(options.path, { type: 'streamed', input: optionsIn.input, fnOptions: optionsIn.queryFnOptions }),
9998
queryFn: streamedQuery({
10099
queryFn: async ({ signal }) => {
@@ -112,6 +111,7 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
112111
},
113112
...optionsIn.queryFnOptions,
114113
}),
114+
...optionsIn.input === skipToken ? { enabled: false } : {},
115115
...optionsIn,
116116
}
117117
},
@@ -129,7 +129,7 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
129129

130130
return client(optionsIn.input(pageParam as any), { signal, context: optionsIn.context as any })
131131
},
132-
enabled: optionsIn.input === skipToken ? false : undefined,
132+
...optionsIn.input === skipToken ? { enabled: false } : {},
133133
...(optionsIn as any),
134134
}
135135
},

packages/react-query/src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface QueryOptionsBase<TOutput, TError> {
1212
queryFn(ctx: QueryFunctionContext): Promise<TOutput>
1313
throwOnError?(error: TError): boolean // Help TQ infer TError
1414
retryDelay?: (count: number, error: TError) => number // Help TQ infer TError (suspense hooks)
15-
enabled: boolean | undefined
15+
enabled?: boolean
1616
}
1717

1818
type experimental_StreamedQueryOptions = Omit<Parameters<typeof experimental_streamedQuery>[0], 'queryFn'>
@@ -36,7 +36,7 @@ export interface InfiniteOptionsBase<TOutput, TError, TPageParam> {
3636
queryFn(ctx: QueryFunctionContext<QueryKey, TPageParam>): Promise<TOutput>
3737
throwOnError?(error: TError): boolean // Help TQ infer TError
3838
retryDelay?: (count: number, error: TError) => number // Help TQ infer TError (suspense hooks)
39-
enabled: boolean | undefined
39+
enabled?: boolean
4040
}
4141

4242
export type MutationOptionsIn<TClientContext extends ClientContext, TInput, TOutput, TError, TMutationContext>

packages/solid-query/src/procedure-utils.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ describe('createProcedureUtils', () => {
3333
it('without skipToken', async () => {
3434
const options = utils.queryOptions({ input: { search: '__search__' }, context: { batch: '__batch__' } })
3535

36+
expect('enabled' in options).toBe(false)
3637
expect(options.enabled).toBe(undefined)
3738

3839
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)
@@ -72,6 +73,7 @@ describe('createProcedureUtils', () => {
7273
queryFnOptions: { refetchMode: 'replace' },
7374
})
7475

76+
expect('enabled' in options).toBe(false)
7577
expect(options.enabled).toBe(undefined)
7678

7779
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)
@@ -130,6 +132,7 @@ describe('createProcedureUtils', () => {
130132
initialPageParam: '__initialPageParam__',
131133
})
132134

135+
expect('enabled' in options).toBe(false)
133136
expect(options.enabled).toBe(undefined)
134137

135138
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)

packages/solid-query/src/procedure-utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,13 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
7777

7878
return client(optionsIn.input, { signal, context: optionsIn.context })
7979
},
80-
enabled: optionsIn.input === skipToken ? false : undefined,
80+
...optionsIn.input === skipToken ? { enabled: false } : {},
8181
...optionsIn,
8282
}
8383
},
8484

8585
experimental_streamedOptions(...[optionsIn = {} as any]) {
8686
return {
87-
enabled: optionsIn.input === skipToken ? false : undefined,
8887
queryKey: generateOperationKey(options.path, { type: 'streamed', input: optionsIn.input, fnOptions: optionsIn.queryFnOptions }),
8988
queryFn: experimental_streamedQuery({
9089
queryFn: async ({ signal }) => {
@@ -102,6 +101,7 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
102101
},
103102
...optionsIn.queryFnOptions,
104103
}),
104+
...optionsIn.input === skipToken ? { enabled: false } : {},
105105
...optionsIn,
106106
}
107107
},
@@ -119,7 +119,7 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
119119

120120
return client(optionsIn.input(pageParam as any), { signal, context: optionsIn.context as any })
121121
},
122-
enabled: optionsIn.input === skipToken ? false : undefined,
122+
...optionsIn.input === skipToken ? { enabled: false } : {},
123123
...(optionsIn as any),
124124
}
125125
},

packages/solid-query/src/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ export interface QueryOptionsBase<TOutput, TError> {
2020
queryFn(ctx: QueryFunctionContext): Promise<TOutput>
2121
throwOnError?(error: TError): boolean // Help TQ infer TError
2222
retryDelay?: (count: number, error: TError) => number // Help TQ infer TError (suspense hooks)
23-
enabled: boolean | undefined
23+
enabled?: boolean
2424
}
2525

26-
type experimental_StreamedQueryOptions = Omit<Parameters<typeof streamedQuery>[0]['refetchMode'], 'queryFn'>
26+
type experimental_StreamedQueryOptions = Omit<Parameters<typeof streamedQuery>[0], 'queryFn'>
2727

2828
export type experimental_InferStreamedOutput<TOutput> = TOutput extends AsyncIterable<infer U> ? U[] : never
2929

@@ -44,7 +44,7 @@ export interface InfiniteOptionsBase<TOutput, TError, TPageParam> {
4444
queryFn(ctx: QueryFunctionContext<QueryKey, TPageParam>): Promise<TOutput>
4545
throwOnError?(error: TError): boolean // Help TQ infer TError
4646
retryDelay?: (count: number, error: TError) => number // Help TQ infer TError (suspense hooks)
47-
enabled: boolean | undefined
47+
enabled?: boolean
4848
}
4949

5050
export type MutationOptionsIn<TClientContext extends ClientContext, TInput, TOutput, TError, TMutationContext>

packages/svelte-query/src/procedure-utils.test.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ describe('createProcedureUtils', () => {
3333
it('without skipToken', async () => {
3434
const options = utils.queryOptions({ input: { search: '__search__' }, context: { batch: '__batch__' } })
3535

36+
expect('enabled' in options).toBe(false)
3637
expect(options.enabled).toBe(undefined)
3738

3839
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)
@@ -72,6 +73,7 @@ describe('createProcedureUtils', () => {
7273
queryFnOptions: { refetchMode: 'replace' },
7374
})
7475

76+
expect('enabled' in options).toBe(false)
7577
expect(options.enabled).toBe(undefined)
7678

7779
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)
@@ -130,6 +132,7 @@ describe('createProcedureUtils', () => {
130132
initialPageParam: '__initialPageParam__',
131133
})
132134

135+
expect('enabled' in options).toBe(false)
133136
expect(options.enabled).toBe(undefined)
134137

135138
expect(options.queryKey).toBe(generateOperationKeySpy.mock.results[0]!.value)

packages/svelte-query/src/procedure-utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,13 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
7777

7878
return client(optionsIn.input, { signal, context: optionsIn.context })
7979
},
80-
enabled: optionsIn.input === skipToken ? false : undefined,
80+
...optionsIn.input === skipToken ? { enabled: false } : {},
8181
...optionsIn,
8282
}
8383
},
8484

8585
experimental_streamedOptions(...[optionsIn = {} as any]) {
8686
return {
87-
enabled: optionsIn.input === skipToken ? false : undefined,
8887
queryKey: generateOperationKey(options.path, { type: 'streamed', input: optionsIn.input, fnOptions: optionsIn.queryFnOptions }),
8988
queryFn: experimental_streamedQuery({
9089
queryFn: async ({ signal }) => {
@@ -102,6 +101,7 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
102101
},
103102
...optionsIn.queryFnOptions,
104103
}),
104+
...optionsIn.input === skipToken ? { enabled: false } : {},
105105
...optionsIn,
106106
}
107107
},
@@ -119,7 +119,7 @@ export function createProcedureUtils<TClientContext extends ClientContext, TInpu
119119

120120
return client(optionsIn.input(pageParam as any), { signal, context: optionsIn.context as any })
121121
},
122-
enabled: optionsIn.input === skipToken ? false : undefined,
122+
...optionsIn.input === skipToken ? { enabled: false } : {},
123123
...(optionsIn as any),
124124
}
125125
},

packages/svelte-query/src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export interface QueryOptionsBase<TOutput, TError> {
2020
queryFn(ctx: QueryFunctionContext): Promise<TOutput>
2121
throwOnError?(error: TError): boolean // Help TQ infer TError
2222
retryDelay?: (count: number, error: TError) => number // Help TQ infer TError (suspense hooks)
23-
enabled: boolean | undefined
23+
enabled?: boolean
2424
}
2525

2626
type experimental_StreamedQueryOptions = Omit<Parameters<typeof experimental_streamedQuery>[0], 'queryFn'>
@@ -44,7 +44,7 @@ export interface InfiniteOptionsBase<TOutput, TError, TPageParam> {
4444
queryFn(ctx: QueryFunctionContext<QueryKey, TPageParam>): Promise<TOutput>
4545
throwOnError?(error: TError): boolean // Help TQ infer TError
4646
retryDelay?: (count: number, error: TError) => number // Help TQ infer TError (suspense hooks)
47-
enabled: boolean | undefined
47+
enabled?: boolean
4848
}
4949

5050
export type MutationOptionsIn<TClientContext extends ClientContext, TInput, TOutput, TError, TMutationContext>

packages/tanstack-query/src/procedure-utils.test-d.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ describe('ProcedureUtils', () => {
148148
maxPages: number
149149
queryFn: QueryFunction<UtilsOutput>
150150
throwOnError?(error: UtilsError): boolean
151-
enabled: boolean | undefined
151+
enabled?: boolean
152152
}>()
153153
})
154154

@@ -281,7 +281,7 @@ describe('ProcedureUtils', () => {
281281
maxPages: number
282282
queryFn: QueryFunction<UtilsOutput>
283283
throwOnError?(error: UtilsError): boolean
284-
enabled: boolean | undefined
284+
enabled?: boolean
285285
}>()
286286
})
287287

@@ -410,7 +410,7 @@ describe('ProcedureUtils', () => {
410410
maxPages: number
411411
queryFn: QueryFunction<UtilsOutput[number]>
412412
throwOnError?(error: UtilsError): boolean
413-
enabled: boolean | undefined
413+
enabled?: boolean
414414
}>()
415415
})
416416

@@ -661,7 +661,7 @@ describe('ProcedureUtils', () => {
661661
maxPages: number
662662
queryFn: QueryFunction<UtilsOutput>
663663
throwOnError?(error: UtilsError): boolean
664-
enabled: boolean | undefined
664+
enabled?: boolean
665665
}>()
666666
})
667667

0 commit comments

Comments
 (0)