Skip to content

Commit b5fcd6e

Browse files
authored
Merge pull request #291 from OpenAPI-Qraft/feat/allow-read-only-objects
feat: allow read-only objects to be passed as query or body parameters
2 parents ba9601a + cae8247 commit b5fcd6e

26 files changed

+319
-93
lines changed

.changeset/silver-beds-float.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@openapi-qraft/tanstack-query-react-plugin': patch
3+
'@openapi-qraft/tanstack-query-react-types': patch
4+
---
5+
6+
Allow read-only objects to be used as query and body parameters in client methods.
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
import { QueryClient } from '@tanstack/query-core';
2+
import { requestFn } from '../index.js';
3+
import { createAPIClient } from './fixtures/api/index.js';
4+
5+
const qraft = createAPIClient({
6+
queryClient: new QueryClient(),
7+
requestFn: requestFn,
8+
baseUrl: 'https://example.com',
9+
});
10+
11+
{
12+
// Normal inline parameters
13+
qraft.files.getFiles.setQueryData(
14+
{
15+
query: { id__in: ['1', '2'] },
16+
header: {
17+
'x-monite-version': 'current',
18+
},
19+
},
20+
{ query: { id__in: ['1'] } }
21+
);
22+
23+
qraft.files.getFiles.getQueryData({
24+
query: { id__in: ['1'] },
25+
header: {
26+
'x-monite-version': 'current',
27+
},
28+
});
29+
}
30+
31+
{
32+
// Const inline parameters
33+
qraft.files.getFiles.setQueryData(
34+
{
35+
query: { id__in: ['1', '2'] },
36+
header: {
37+
'x-monite-version': 'current',
38+
},
39+
} as const,
40+
{ query: { id__in: ['1'] } } as const
41+
);
42+
43+
qraft.files.getFiles.getQueryData({
44+
query: { id__in: ['1'] },
45+
header: {
46+
'x-monite-version': 'current',
47+
},
48+
} as const);
49+
}
50+
51+
{
52+
// External mutable parameters
53+
const parameters = {
54+
query: { id__in: ['1', '2'] },
55+
header: {
56+
'x-monite-version': 'current',
57+
},
58+
};
59+
60+
const data = { query: { id__in: ['1'] } };
61+
62+
qraft.files.getFiles.setQueryData(parameters, data);
63+
qraft.files.getFiles.setInfiniteQueryData(parameters, (pages) => ({
64+
pages: [...(pages?.pages ?? []), data],
65+
pageParams: [...(pages?.pageParams ?? []), {}],
66+
}));
67+
qraft.files.getFiles.getQueryData(parameters);
68+
qraft.files.getFiles.useQuery(parameters);
69+
qraft.files.getFiles.useInfiniteQuery(parameters, {
70+
initialPageParam: {},
71+
getNextPageParam: () => undefined,
72+
});
73+
void qraft.files.getFiles.fetchQuery({ parameters });
74+
void qraft.files.getFiles.fetchInfiniteQuery({
75+
parameters,
76+
initialPageParam: {},
77+
getNextPageParam: () => undefined,
78+
});
79+
void qraft.files.getFiles({ parameters });
80+
}
81+
82+
{
83+
// External const parameters
84+
const parameters = {
85+
query: { id__in: ['1', '2'] },
86+
header: {
87+
'x-monite-version': 'current',
88+
},
89+
} as const;
90+
91+
const data = { query: { id__in: ['1'] } } as const;
92+
93+
qraft.files.getFiles.setQueryData(parameters, data);
94+
qraft.files.getFiles.setInfiniteQueryData(parameters, (pages) => ({
95+
pages: [...(pages?.pages ?? []), data],
96+
pageParams: [...(pages?.pageParams ?? []), {}],
97+
}));
98+
qraft.files.getFiles.getQueryData(parameters);
99+
qraft.files.getFiles.useQuery(parameters);
100+
qraft.files.getFiles.useInfiniteQuery(parameters, {
101+
initialPageParam: {},
102+
getNextPageParam: () => undefined,
103+
});
104+
void qraft.files.getFiles.fetchQuery({ parameters });
105+
void qraft.files.getFiles.fetchInfiniteQuery({
106+
parameters,
107+
initialPageParam: {},
108+
getNextPageParam: () => undefined,
109+
});
110+
void qraft.files.getFiles({ parameters });
111+
}
112+
113+
{
114+
// External const parameters for useMutation
115+
const parameters = { query: { all: true } } as const;
116+
qraft.files.deleteFiles.useMutation(parameters);
117+
void qraft.files.deleteFiles({ parameters });
118+
}
119+
120+
{
121+
// Incorrect usage
122+
qraft.files.getFiles.setQueryData(
123+
{
124+
// @ts-expect-error - OK, incorrect usage
125+
query: { id__in: [1, 2] },
126+
header: {
127+
// @ts-expect-error - OK, incorrect usage
128+
'x-monite-version': true,
129+
},
130+
},
131+
{ query: { id__in: ['1'] } }
132+
);
133+
qraft.files.getFiles.getQueryData({
134+
// @ts-expect-error - OK, incorrect usage
135+
query: { id__in: [1, 2] },
136+
header: {
137+
// @ts-expect-error - OK, incorrect usage
138+
'x-monite-version': true,
139+
},
140+
});
141+
qraft.files.getFiles.setQueryData(
142+
{
143+
query: { id__in: ['1', '2'] },
144+
header: {
145+
'x-monite-version': 'current',
146+
},
147+
} as const,
148+
{
149+
query: {
150+
// @ts-expect-error - OK, incorrect usage
151+
id__in: [1],
152+
},
153+
} as const
154+
);
155+
}

packages/tanstack-query-react-plugin/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
},
4141
"devDependencies": {
4242
"@openapi-qraft/eslint-config": "workspace:*",
43+
"@openapi-qraft/tanstack-query-react-types": "workspace:*",
4344
"@openapi-qraft/test-fixtures": "workspace:*",
4445
"@openapi-qraft/ts-factory-code-generator": "workspace:*",
4546
"camelcase": "^8.0.0",

packages/tanstack-query-react-plugin/src/__snapshots__/explicit-import-extensions/services/ApprovalPoliciesService.ts.snapshot.ts

Lines changed: 22 additions & 22 deletions
Large diffs are not rendered by default.

packages/tanstack-query-react-plugin/src/__snapshots__/explicit-import-extensions/services/FilesService.ts.snapshot.ts

Lines changed: 39 additions & 39 deletions
Large diffs are not rendered by default.

packages/tanstack-query-react-types/src/service-operation/ServiceOperationGetInfiniteQueryData.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
AreAllOptional,
3+
DeepReadonly,
34
OperationInfiniteData,
45
ServiceOperationInfiniteQueryKey,
56
} from '@openapi-qraft/tanstack-query-react-types';
@@ -12,6 +13,8 @@ export interface ServiceOperationGetInfiniteQueryData<
1213
getInfiniteQueryData(
1314
parameters:
1415
| ServiceOperationInfiniteQueryKey<TSchema, TParams>
15-
| (AreAllOptional<TParams> extends true ? TParams | void : TParams)
16+
| (AreAllOptional<TParams> extends true
17+
? DeepReadonly<TParams> | void
18+
: DeepReadonly<TParams>)
1619
): OperationInfiniteData<TOperationQueryFnData, TParams> | undefined;
1720
}

packages/tanstack-query-react-types/src/service-operation/ServiceOperationGetQueryData.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
AreAllOptional,
3+
DeepReadonly,
34
ServiceOperationQueryKey,
45
} from '@openapi-qraft/tanstack-query-react-types';
56

@@ -11,6 +12,8 @@ export interface ServiceOperationGetQueryData<
1112
getQueryData(
1213
parameters:
1314
| ServiceOperationQueryKey<TSchema, TParams>
14-
| (AreAllOptional<TParams> extends true ? TParams | void : TParams)
15+
| (AreAllOptional<TParams> extends true
16+
? DeepReadonly<TParams> | void
17+
: DeepReadonly<TParams>)
1518
): TOperationQueryFnData | undefined;
1619
}

packages/tanstack-query-react-types/src/service-operation/ServiceOperationGetQueryState.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
AreAllOptional,
3+
DeepReadonly,
34
OperationInfiniteData,
45
ServiceOperationInfiniteQueryKey,
56
ServiceOperationQueryKey,
@@ -15,13 +16,20 @@ export interface ServiceOperationGetQueryState<
1516
getQueryState(
1617
parameters:
1718
| ServiceOperationQueryKey<TSchema, TParams>
18-
| (AreAllOptional<TParams> extends true ? TParams | void : TParams)
19+
| (AreAllOptional<TParams> extends true
20+
? DeepReadonly<TParams> | void
21+
: DeepReadonly<TParams>)
1922
): QueryState<TOperationQueryFnData, TError> | undefined;
2023

2124
getInfiniteQueryState(
2225
parameters: AreAllOptional<TParams> extends true
23-
? TParams | ServiceOperationInfiniteQueryKey<TSchema, TParams> | void
24-
: TParams | ServiceOperationInfiniteQueryKey<TSchema, TParams>
26+
?
27+
| DeepReadonly<TParams>
28+
| ServiceOperationInfiniteQueryKey<TSchema, TParams>
29+
| void
30+
:
31+
| DeepReadonly<TParams>
32+
| ServiceOperationInfiniteQueryKey<TSchema, TParams>
2533
):
2634
| QueryState<OperationInfiniteData<TOperationQueryFnData, TParams>, TError>
2735
| undefined;

packages/tanstack-query-react-types/src/service-operation/ServiceOperationSetInfiniteQueryData.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import type {
2+
AreAllOptional,
3+
DeepReadonly,
24
OperationInfiniteData,
35
ServiceOperationInfiniteQueryKey,
46
} from '@openapi-qraft/tanstack-query-react-types';
@@ -7,14 +9,21 @@ import type { NoInfer, SetDataOptions, Updater } from '@tanstack/query-core';
79
export interface ServiceOperationSetInfiniteQueryData<
810
TSchema extends { url: string; method: string },
911
TOperationQueryFnData,
10-
TParams = {},
12+
TParams,
1113
> {
1214
setInfiniteQueryData(
13-
parameters: TParams | ServiceOperationInfiniteQueryKey<TSchema, TParams>,
15+
parameters:
16+
| (AreAllOptional<TParams> extends true
17+
? DeepReadonly<TParams> | undefined
18+
: DeepReadonly<TParams>)
19+
| ServiceOperationInfiniteQueryKey<TSchema, TParams>,
1420
updater: Updater<
1521
| NoInfer<OperationInfiniteData<TOperationQueryFnData, TParams>>
1622
| undefined,
17-
NoInfer<OperationInfiniteData<TOperationQueryFnData, TParams>> | undefined
23+
| NoInfer<
24+
DeepReadonly<OperationInfiniteData<TOperationQueryFnData, TParams>>
25+
>
26+
| undefined
1827
>,
1928
options?: SetDataOptions
2029
): OperationInfiniteData<TOperationQueryFnData, TParams> | undefined;

packages/tanstack-query-react-types/src/service-operation/ServiceOperationSetQueryData.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
AreAllOptional,
3+
DeepReadonly,
34
ServiceOperationQueryKey,
45
} from '@openapi-qraft/tanstack-query-react-types';
56
import type { NoInfer, SetDataOptions, Updater } from '@tanstack/query-core';
@@ -11,11 +12,13 @@ export interface ServiceOperationSetQueryData<
1112
> {
1213
setQueryData(
1314
parameters:
14-
| (AreAllOptional<TParams> extends true ? TParams | undefined : TParams)
15+
| (AreAllOptional<TParams> extends true
16+
? DeepReadonly<TParams> | undefined
17+
: DeepReadonly<TParams>)
1518
| ServiceOperationQueryKey<TSchema, TParams>,
1619
updater: Updater<
1720
NoInfer<TOperationQueryFnData> | undefined,
18-
NoInfer<TOperationQueryFnData> | undefined
21+
NoInfer<DeepReadonly<TOperationQueryFnData>> | undefined
1922
>,
2023
options?: SetDataOptions
2124
): TOperationQueryFnData | undefined;

packages/tanstack-query-react-types/src/service-operation/ServiceOperationUseInfiniteQuery.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
AreAllOptional,
3+
DeepReadonly,
34
OperationInfiniteData,
45
PartialParameters,
56
ServiceOperationInfiniteQueryKey,
@@ -19,7 +20,9 @@ export interface ServiceOperationUseInfiniteQuery<
1920
TError,
2021
> {
2122
getInfiniteQueryKey(
22-
parameters: AreAllOptional<TParams> extends true ? TParams | void : TParams
23+
parameters: AreAllOptional<TParams> extends true
24+
? DeepReadonly<TParams> | void
25+
: DeepReadonly<TParams>
2326
): ServiceOperationInfiniteQueryKey<TSchema, TParams>;
2427

2528
useInfiniteQuery<
@@ -29,7 +32,9 @@ export interface ServiceOperationUseInfiniteQuery<
2932
>(
3033
parameters:
3134
| ServiceOperationInfiniteQueryKey<TSchema, TParams>
32-
| (AreAllOptional<TParams> extends true ? TParams | void : TParams),
35+
| (AreAllOptional<TParams> extends true
36+
? DeepReadonly<TParams> | void
37+
: DeepReadonly<TParams>),
3338
options: Omit<
3439
UndefinedInitialDataInfiniteOptions<
3540
TQueryFnData,
@@ -56,7 +61,9 @@ export interface ServiceOperationUseInfiniteQuery<
5661
>(
5762
parameters:
5863
| ServiceOperationInfiniteQueryKey<TSchema, TParams>
59-
| (AreAllOptional<TParams> extends true ? TParams | void : TParams),
64+
| (AreAllOptional<TParams> extends true
65+
? DeepReadonly<TParams> | void
66+
: DeepReadonly<TParams>),
6067
options: Omit<
6168
DefinedInitialDataInfiniteOptions<
6269
TQueryFnData,

packages/tanstack-query-react-types/src/service-operation/ServiceOperationUseMutation.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
AreAllOptional,
3+
DeepReadonly,
34
MutationVariables,
45
ServiceOperationMutationKey,
56
ServiceOperationUseMutationOptions,
@@ -14,11 +15,11 @@ export interface ServiceOperationUseMutation<
1415
TError,
1516
> {
1617
getMutationKey(
17-
parameters: TParams | void
18+
parameters: DeepReadonly<TParams> | void
1819
): ServiceOperationMutationKey<TSchema, TParams>;
1920

2021
useMutation<TVariables extends TBody, TContext = unknown>(
21-
parameters: TParams,
22+
parameters: DeepReadonly<TParams>,
2223
options?: ServiceOperationUseMutationOptions<
2324
TSchema,
2425
TMutationData,

packages/tanstack-query-react-types/src/service-operation/ServiceOperationUseQuery.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
AreAllOptional,
3+
DeepReadonly,
34
ServiceOperationQueryKey,
45
} from '@openapi-qraft/tanstack-query-react-types';
56
import type {
@@ -16,13 +17,17 @@ export interface ServiceOperationUseQuery<
1617
TError,
1718
> {
1819
getQueryKey(
19-
parameters: AreAllOptional<TParams> extends true ? TParams | void : TParams
20+
parameters: AreAllOptional<TParams> extends true
21+
? DeepReadonly<TParams> | void
22+
: DeepReadonly<TParams>
2023
): ServiceOperationQueryKey<TSchema, TParams>;
2124

2225
useQuery<TData = TOperationQueryFnData>(
2326
parameters:
2427
| ServiceOperationQueryKey<TSchema, TParams>
25-
| (AreAllOptional<TParams> extends true ? TParams | void : TParams),
28+
| (AreAllOptional<TParams> extends true
29+
? DeepReadonly<TParams> | void
30+
: DeepReadonly<TParams>),
2631
options?: Omit<
2732
UndefinedInitialDataOptions<
2833
TOperationQueryFnData,
@@ -37,7 +42,9 @@ export interface ServiceOperationUseQuery<
3742
useQuery<TData = TOperationQueryFnData>(
3843
parameters:
3944
| ServiceOperationQueryKey<TSchema, TParams>
40-
| (AreAllOptional<TParams> extends true ? TParams | void : TParams),
45+
| (AreAllOptional<TParams> extends true
46+
? DeepReadonly<TParams> | void
47+
: DeepReadonly<TParams>),
4148
options: Omit<
4249
DefinedInitialDataOptions<
4350
TOperationQueryFnData,

0 commit comments

Comments
 (0)