Skip to content

Commit f5e5fca

Browse files
authored
Merge pull request #1566 from hey-api/fix/sdk-options-override
fix: spread sdk options at the end to allow overriding generated values
2 parents fc7ebbd + 39d558a commit f5e5fca

File tree

78 files changed

+4550
-4541
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+4550
-4541
lines changed

.changeset/old-weeks-cover.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@hey-api/openapi-ts': patch
3+
---
4+
5+
fix: spread sdk options at the end to allow overriding generated values

packages/openapi-ts/src/plugins/@hey-api/sdk/plugin.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ const operationStatements = ({
238238
// }
239239
// }
240240

241-
const requestOptions: ObjectValue[] = [{ spread: 'options' }];
241+
const requestOptions: ObjectValue[] = [];
242242

243243
if (operation.body) {
244244
switch (operation.body.type) {
@@ -265,23 +265,6 @@ const operationStatements = ({
265265
});
266266
break;
267267
}
268-
269-
requestOptions.push({
270-
key: 'headers',
271-
value: [
272-
{
273-
key: 'Content-Type',
274-
// form-data does not need Content-Type header, browser will set it automatically
275-
value:
276-
operation.body.type === 'form-data'
277-
? null
278-
: operation.body.mediaType,
279-
},
280-
{
281-
spread: 'options?.headers',
282-
},
283-
],
284-
});
285268
}
286269

287270
if (context.config.client.name === '@hey-api/client-axios') {
@@ -423,6 +406,27 @@ const operationStatements = ({
423406
value: operation.path,
424407
});
425408

409+
// options must go last to allow overriding parameters above
410+
requestOptions.push({ spread: 'options' });
411+
if (operation.body) {
412+
requestOptions.push({
413+
key: 'headers',
414+
value: [
415+
{
416+
key: 'Content-Type',
417+
// form-data does not need Content-Type header, browser will set it automatically
418+
value:
419+
operation.body.type === 'form-data'
420+
? null
421+
: operation.body.mediaType,
422+
},
423+
{
424+
spread: 'options?.headers',
425+
},
426+
],
427+
});
428+
}
429+
426430
return [
427431
compiler.returnFunctionCall({
428432
args: [

packages/openapi-ts/test/__snapshots__/2.0.x/form-data/sdk.gen.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ export const client = createClient(createConfig());
77

88
export const postV1Foo = <ThrowOnError extends boolean = false>(options: Options<PostV1FooData, ThrowOnError>) => {
99
return (options?.client ?? client).post<PostV1FooResponse, unknown, ThrowOnError>({
10-
...options,
1110
...formDataBodySerializer,
11+
url: '/v1/foo',
12+
...options,
1213
headers: {
1314
'Content-Type': null,
1415
...options?.headers
15-
},
16-
url: '/v1/foo'
16+
}
1717
});
1818
};

packages/openapi-ts/test/__snapshots__/2.0.x/plugins/@hey-api/sdk/default/sdk.gen.ts

Lines changed: 64 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -7,230 +7,230 @@ export const client = createClient(createConfig());
77

88
export const serviceWithEmptyTag = <ThrowOnError extends boolean = false>(options?: Options<ServiceWithEmptyTagData, ThrowOnError>) => {
99
return (options?.client ?? client).get<unknown, unknown, ThrowOnError>({
10-
...options,
11-
url: '/api/v{api-version}/no-tag'
10+
url: '/api/v{api-version}/no-tag',
11+
...options
1212
});
1313
};
1414

1515
export const deleteCallWithoutParametersAndResponse = <ThrowOnError extends boolean = false>(options?: Options<DeleteCallWithoutParametersAndResponseData, ThrowOnError>) => {
1616
return (options?.client ?? client).delete<unknown, unknown, ThrowOnError>({
17-
...options,
18-
url: '/api/v{api-version}/simple'
17+
url: '/api/v{api-version}/simple',
18+
...options
1919
});
2020
};
2121

2222
export const getCallWithoutParametersAndResponse = <ThrowOnError extends boolean = false>(options?: Options<GetCallWithoutParametersAndResponseData, ThrowOnError>) => {
2323
return (options?.client ?? client).get<unknown, unknown, ThrowOnError>({
24-
...options,
25-
url: '/api/v{api-version}/simple'
24+
url: '/api/v{api-version}/simple',
25+
...options
2626
});
2727
};
2828

2929
export const headCallWithoutParametersAndResponse = <ThrowOnError extends boolean = false>(options?: Options<HeadCallWithoutParametersAndResponseData, ThrowOnError>) => {
3030
return (options?.client ?? client).head<unknown, unknown, ThrowOnError>({
31-
...options,
32-
url: '/api/v{api-version}/simple'
31+
url: '/api/v{api-version}/simple',
32+
...options
3333
});
3434
};
3535

3636
export const optionsCallWithoutParametersAndResponse = <ThrowOnError extends boolean = false>(options?: Options<OptionsCallWithoutParametersAndResponseData, ThrowOnError>) => {
3737
return (options?.client ?? client).options<unknown, unknown, ThrowOnError>({
38-
...options,
39-
url: '/api/v{api-version}/simple'
38+
url: '/api/v{api-version}/simple',
39+
...options
4040
});
4141
};
4242

4343
export const patchCallWithoutParametersAndResponse = <ThrowOnError extends boolean = false>(options?: Options<PatchCallWithoutParametersAndResponseData, ThrowOnError>) => {
4444
return (options?.client ?? client).patch<unknown, unknown, ThrowOnError>({
45-
...options,
46-
url: '/api/v{api-version}/simple'
45+
url: '/api/v{api-version}/simple',
46+
...options
4747
});
4848
};
4949

5050
export const postCallWithoutParametersAndResponse = <ThrowOnError extends boolean = false>(options?: Options<PostCallWithoutParametersAndResponseData, ThrowOnError>) => {
5151
return (options?.client ?? client).post<unknown, unknown, ThrowOnError>({
52-
...options,
53-
url: '/api/v{api-version}/simple'
52+
url: '/api/v{api-version}/simple',
53+
...options
5454
});
5555
};
5656

5757
export const putCallWithoutParametersAndResponse = <ThrowOnError extends boolean = false>(options?: Options<PutCallWithoutParametersAndResponseData, ThrowOnError>) => {
5858
return (options?.client ?? client).put<unknown, unknown, ThrowOnError>({
59-
...options,
60-
url: '/api/v{api-version}/simple'
59+
url: '/api/v{api-version}/simple',
60+
...options
6161
});
6262
};
6363

6464
export const callWithDescriptions = <ThrowOnError extends boolean = false>(options?: Options<CallWithDescriptionsData, ThrowOnError>) => {
6565
return (options?.client ?? client).post<unknown, unknown, ThrowOnError>({
66-
...options,
67-
url: '/api/v{api-version}/descriptions/'
66+
url: '/api/v{api-version}/descriptions/',
67+
...options
6868
});
6969
};
7070

7171
export const callWithParameters = <ThrowOnError extends boolean = false>(options: Options<CallWithParametersData, ThrowOnError>) => {
7272
return (options?.client ?? client).post<unknown, unknown, ThrowOnError>({
73-
...options,
74-
url: '/api/v{api-version}/parameters/{parameterPath}'
73+
url: '/api/v{api-version}/parameters/{parameterPath}',
74+
...options
7575
});
7676
};
7777

7878
export const callWithWeirdParameterNames = <ThrowOnError extends boolean = false>(options: Options<CallWithWeirdParameterNamesData, ThrowOnError>) => {
7979
return (options?.client ?? client).post<unknown, unknown, ThrowOnError>({
80-
...options,
81-
url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}'
80+
url: '/api/v{api-version}/parameters/{parameter.path.1}/{parameter-path-2}/{PARAMETER-PATH-3}',
81+
...options
8282
});
8383
};
8484

8585
export const callWithDefaultParameters = <ThrowOnError extends boolean = false>(options: Options<CallWithDefaultParametersData, ThrowOnError>) => {
8686
return (options?.client ?? client).get<unknown, unknown, ThrowOnError>({
87-
...options,
88-
url: '/api/v{api-version}/defaults'
87+
url: '/api/v{api-version}/defaults',
88+
...options
8989
});
9090
};
9191

9292
export const callWithDefaultOptionalParameters = <ThrowOnError extends boolean = false>(options?: Options<CallWithDefaultOptionalParametersData, ThrowOnError>) => {
9393
return (options?.client ?? client).post<unknown, unknown, ThrowOnError>({
94-
...options,
95-
url: '/api/v{api-version}/defaults'
94+
url: '/api/v{api-version}/defaults',
95+
...options
9696
});
9797
};
9898

9999
export const callToTestOrderOfParams = <ThrowOnError extends boolean = false>(options: Options<CallToTestOrderOfParamsData, ThrowOnError>) => {
100100
return (options?.client ?? client).put<unknown, unknown, ThrowOnError>({
101-
...options,
102-
url: '/api/v{api-version}/defaults'
101+
url: '/api/v{api-version}/defaults',
102+
...options
103103
});
104104
};
105105

106106
export const duplicateName = <ThrowOnError extends boolean = false>(options?: Options<DuplicateNameData, ThrowOnError>) => {
107107
return (options?.client ?? client).delete<unknown, unknown, ThrowOnError>({
108-
...options,
109-
url: '/api/v{api-version}/duplicate'
108+
url: '/api/v{api-version}/duplicate',
109+
...options
110110
});
111111
};
112112

113113
export const duplicateName2 = <ThrowOnError extends boolean = false>(options?: Options<DuplicateName2Data, ThrowOnError>) => {
114114
return (options?.client ?? client).get<unknown, unknown, ThrowOnError>({
115-
...options,
116-
url: '/api/v{api-version}/duplicate'
115+
url: '/api/v{api-version}/duplicate',
116+
...options
117117
});
118118
};
119119

120120
export const duplicateName3 = <ThrowOnError extends boolean = false>(options?: Options<DuplicateName3Data, ThrowOnError>) => {
121121
return (options?.client ?? client).post<unknown, unknown, ThrowOnError>({
122-
...options,
123-
url: '/api/v{api-version}/duplicate'
122+
url: '/api/v{api-version}/duplicate',
123+
...options
124124
});
125125
};
126126

127127
export const duplicateName4 = <ThrowOnError extends boolean = false>(options?: Options<DuplicateName4Data, ThrowOnError>) => {
128128
return (options?.client ?? client).put<unknown, unknown, ThrowOnError>({
129-
...options,
130-
url: '/api/v{api-version}/duplicate'
129+
url: '/api/v{api-version}/duplicate',
130+
...options
131131
});
132132
};
133133

134134
export const callWithNoContentResponse = <ThrowOnError extends boolean = false>(options?: Options<CallWithNoContentResponseData, ThrowOnError>) => {
135135
return (options?.client ?? client).get<unknown, unknown, ThrowOnError>({
136-
...options,
137-
url: '/api/v{api-version}/no-content'
136+
url: '/api/v{api-version}/no-content',
137+
...options
138138
});
139139
};
140140

141141
export const callWithResponseAndNoContentResponse = <ThrowOnError extends boolean = false>(options?: Options<CallWithResponseAndNoContentResponseData, ThrowOnError>) => {
142142
return (options?.client ?? client).get<CallWithResponseAndNoContentResponseResponse, unknown, ThrowOnError>({
143-
...options,
144-
url: '/api/v{api-version}/multiple-tags/response-and-no-content'
143+
url: '/api/v{api-version}/multiple-tags/response-and-no-content',
144+
...options
145145
});
146146
};
147147

148148
export const dummyA = <ThrowOnError extends boolean = false>(options?: Options<DummyAData, ThrowOnError>) => {
149149
return (options?.client ?? client).get<unknown, unknown, ThrowOnError>({
150-
...options,
151-
url: '/api/v{api-version}/multiple-tags/a'
150+
url: '/api/v{api-version}/multiple-tags/a',
151+
...options
152152
});
153153
};
154154

155155
export const dummyB = <ThrowOnError extends boolean = false>(options?: Options<DummyBData, ThrowOnError>) => {
156156
return (options?.client ?? client).get<unknown, unknown, ThrowOnError>({
157-
...options,
158-
url: '/api/v{api-version}/multiple-tags/b'
157+
url: '/api/v{api-version}/multiple-tags/b',
158+
...options
159159
});
160160
};
161161

162162
export const callWithResponse = <ThrowOnError extends boolean = false>(options?: Options<CallWithResponseData, ThrowOnError>) => {
163163
return (options?.client ?? client).get<CallWithResponseResponse, unknown, ThrowOnError>({
164-
...options,
165-
url: '/api/v{api-version}/response'
164+
url: '/api/v{api-version}/response',
165+
...options
166166
});
167167
};
168168

169169
export const callWithDuplicateResponses = <ThrowOnError extends boolean = false>(options?: Options<CallWithDuplicateResponsesData, ThrowOnError>) => {
170170
return (options?.client ?? client).post<CallWithDuplicateResponsesResponse, CallWithDuplicateResponsesError, ThrowOnError>({
171-
...options,
172-
url: '/api/v{api-version}/response'
171+
url: '/api/v{api-version}/response',
172+
...options
173173
});
174174
};
175175

176176
export const callWithResponses = <ThrowOnError extends boolean = false>(options?: Options<CallWithResponsesData, ThrowOnError>) => {
177177
return (options?.client ?? client).put<CallWithResponsesResponse, CallWithResponsesError, ThrowOnError>({
178-
...options,
179-
url: '/api/v{api-version}/response'
178+
url: '/api/v{api-version}/response',
179+
...options
180180
});
181181
};
182182

183183
export const collectionFormat = <ThrowOnError extends boolean = false>(options: Options<CollectionFormatData, ThrowOnError>) => {
184184
return (options?.client ?? client).get<unknown, unknown, ThrowOnError>({
185-
...options,
186185
querySerializer: {
187186
array: {
188187
explode: false,
189188
style: 'form'
190189
}
191190
},
192-
url: '/api/v{api-version}/collectionFormat'
191+
url: '/api/v{api-version}/collectionFormat',
192+
...options
193193
});
194194
};
195195

196196
export const types = <ThrowOnError extends boolean = false>(options: Options<TypesData, ThrowOnError>) => {
197197
return (options?.client ?? client).get<TypesResponse, unknown, ThrowOnError>({
198-
...options,
199198
querySerializer: {
200199
array: {
201200
explode: false,
202201
style: 'form'
203202
}
204203
},
205-
url: '/api/v{api-version}/types'
204+
url: '/api/v{api-version}/types',
205+
...options
206206
});
207207
};
208208

209209
export const complexTypes = <ThrowOnError extends boolean = false>(options: Options<ComplexTypesData, ThrowOnError>) => {
210210
return (options?.client ?? client).get<ComplexTypesResponse, unknown, ThrowOnError>({
211-
...options,
212-
url: '/api/v{api-version}/complex'
211+
url: '/api/v{api-version}/complex',
212+
...options
213213
});
214214
};
215215

216216
export const callWithResultFromHeader = <ThrowOnError extends boolean = false>(options?: Options<CallWithResultFromHeaderData, ThrowOnError>) => {
217217
return (options?.client ?? client).post<unknown, unknown, ThrowOnError>({
218-
...options,
219-
url: '/api/v{api-version}/header'
218+
url: '/api/v{api-version}/header',
219+
...options
220220
});
221221
};
222222

223223
export const testErrorCode = <ThrowOnError extends boolean = false>(options: Options<TestErrorCodeData, ThrowOnError>) => {
224224
return (options?.client ?? client).post<unknown, unknown, ThrowOnError>({
225-
...options,
226-
url: '/api/v{api-version}/error'
225+
url: '/api/v{api-version}/error',
226+
...options
227227
});
228228
};
229229

230230
export const nonAsciiæøåÆøÅöôêÊ字符串 = <ThrowOnError extends boolean = false>(options: Options<NonAsciiæøåÆøÅöôêÊ字符串Data, ThrowOnError>) => {
231231
return (options?.client ?? client).post<NonAsciiæøåÆøÅöôêÊ字符串Response, unknown, ThrowOnError>({
232-
...options,
233-
url: '/api/v{api-version}/non-ascii-æøåÆØÅöôêÊ字符串'
232+
url: '/api/v{api-version}/non-ascii-æøåÆØÅöôêÊ字符串',
233+
...options
234234
});
235235
};
236236

@@ -240,11 +240,11 @@ export const nonAsciiæøåÆøÅöôêÊ字符串 = <ThrowOnError extends boole
240240
*/
241241
export const postApiVbyApiVersionBody = <ThrowOnError extends boolean = false>(options: Options<PostApiVbyApiVersionBodyData, ThrowOnError>) => {
242242
return (options?.client ?? client).post<PostApiVbyApiVersionBodyResponse, PostApiVbyApiVersionBodyError, ThrowOnError>({
243+
url: '/api/v{api-version}/body',
243244
...options,
244245
headers: {
245246
'Content-Type': 'application/json',
246247
...options?.headers
247-
},
248-
url: '/api/v{api-version}/body'
248+
}
249249
});
250250
};

0 commit comments

Comments
 (0)