Skip to content

Commit dcea71d

Browse files
committed
refactor: simplify things
1 parent 5cce27c commit dcea71d

7 files changed

Lines changed: 58 additions & 85 deletions

File tree

packages/openapi-code-generator/src/typescript/client/client-operation-builder.ts

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {generationLib} from "../../core/generation-lib"
22
import {logger} from "../../core/logger"
33
import type {
44
IROperation,
5-
IRParameter,
65
MaybeIRModel,
76
} from "../../core/openapi-types-normalized"
87
import {extractPlaceholders} from "../../core/openapi-utils"
@@ -12,6 +11,7 @@ import type {TypeBuilder} from "../common/type-builder"
1211
import {
1312
combineParams,
1413
type MethodParameterDefinition,
14+
type RequestBodyAsParameter,
1515
requestBodyAsParameter,
1616
statusStringToType,
1717
} from "../common/typescript-common"
@@ -85,29 +85,26 @@ export class ClientOperationBuilder {
8585

8686
methodParameter(): MethodParameterDefinition | undefined {
8787
const {parameters} = this.operation
88-
const {requestBodyParameter} = this.requestBodyAsParameter()
88+
const requestBody = this.requestBodyAsParameter()
8989

9090
return combineParams(
91-
[...parameters, requestBodyParameter].filter(isDefined).map((it) => ({
91+
[...parameters, requestBody?.parameter].filter(isDefined).map((it) => ({
9292
name: `${camelCase(it.name)}`,
9393
type: this.models.schemaObjectToType(it.schema),
9494
required: it.required,
9595
})),
9696
)
9797
}
9898

99-
requestBodyAsParameter(): {
100-
requestBodyParameter?: IRParameter
101-
requestBodyContentType?: string
102-
} {
99+
requestBodyAsParameter(): RequestBodyAsParameter | undefined {
103100
const result = requestBodyAsParameter(this.operation)
104-
const schema = result.requestBodyParameter?.schema
101+
const schema = result?.parameter?.schema
105102

106103
if (schema && this.models.isEmptyObject(schema)) {
107104
logger.warn(
108105
`[${this.route}]: skipping requestBody parameter that resolves to EmptyObject`,
109106
)
110-
return {}
107+
return undefined
111108
}
112109

113110
return result
@@ -132,16 +129,14 @@ export class ClientOperationBuilder {
132129

133130
const hasAcceptHeader = this.hasHeader("Accept")
134131
const hasContentTypeHeader = this.hasHeader("Content-Type")
135-
const {requestBodyContentType, requestBodyParameter} =
136-
this.requestBodyAsParameter()
132+
const requestBody = this.requestBodyAsParameter()
137133

138134
const result = [
139135
hasAcceptHeader ? undefined : "'Accept': 'application/json'",
140-
// !hasContentTypeHeader &&
141-
requestBodyContentType &&
142-
// omit Content-Type when unsupported (never)
143-
!this.models.isNever(requestBodyParameter?.schema)
144-
? `'Content-Type': '${requestBodyContentType}'`
136+
!hasContentTypeHeader &&
137+
requestBody?.contentType &&
138+
requestBody.isSupported
139+
? `'Content-Type': '${requestBody.contentType}'`
145140
: undefined,
146141
]
147142
.concat(paramHeaders)
@@ -153,12 +148,12 @@ export class ClientOperationBuilder {
153148
hasHeader(name: string): boolean {
154149
const {parameters} = this.operation
155150

156-
return (
157-
parameters.find(
158-
(it) =>
159-
it.in === "header" && it.name.toLowerCase() === name.toLowerCase(),
160-
) !== null
151+
const parameter = parameters.find(
152+
(it) =>
153+
it.in === "header" && it.name.toLowerCase() === name.toLowerCase(),
161154
)
155+
156+
return Boolean(parameter)
162157
}
163158

164159
responseSchemas() {

packages/openapi-code-generator/src/typescript/client/typescript-angular/angular-service-builder.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@ export class AngularServiceBuilder extends AbstractClientBuilder {
1717

1818
protected buildOperation(builder: ClientOperationBuilder): string {
1919
const {operationId, method, hasServers} = builder
20-
const {requestBodyContentType, requestBodyParameter} =
21-
builder.requestBodyAsParameter()
22-
23-
const requestBodyIsSupported = !this.types.isNever(
24-
requestBodyParameter?.schema,
25-
)
20+
const requestBody = builder.requestBodyAsParameter()
2621

2722
const operationParameter = builder.methodParameter()
2823

@@ -43,8 +38,8 @@ export class AngularServiceBuilder extends AbstractClientBuilder {
4338
${[
4439
headers ? `const headers = this._headers(${headers})` : "",
4540
queryString ? `const params = this._queryParams({${queryString}})` : "",
46-
requestBodyParameter && requestBodyIsSupported
47-
? `const body = ${builder.paramName(requestBodyParameter.name)}`
41+
requestBody?.parameter && requestBody.isSupported
42+
? `const body = ${builder.paramName(requestBody.parameter.name)}`
4843
: "",
4944
]
5045
.filter(Boolean)
@@ -56,10 +51,10 @@ return this.httpClient.request<any>(
5651
${[
5752
queryString ? "params" : "",
5853
headers ? "headers" : "",
59-
requestBodyParameter
60-
? requestBodyIsSupported
54+
requestBody?.parameter
55+
? requestBody.isSupported
6156
? "body"
62-
: `// todo: request bodies with content-type '${requestBodyContentType}' not yet supported`
57+
: `// todo: request bodies with content-type '${requestBody.contentType}' not yet supported`
6358
: "",
6459
'observe: "response"',
6560
"reportProgress: false",

packages/openapi-code-generator/src/typescript/client/typescript-axios/typescript-axios-client-builder.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@ export class TypescriptAxiosClientBuilder extends AbstractClientBuilder {
1717

1818
protected buildOperation(builder: ClientOperationBuilder): string {
1919
const {operationId, method, hasServers} = builder
20-
const {requestBodyContentType, requestBodyParameter} =
21-
builder.requestBodyAsParameter()
22-
23-
const requestBodyIsSupported = !this.types.isNever(
24-
requestBodyParameter?.schema,
25-
)
20+
const requestBody = builder.requestBodyAsParameter()
2621

2722
const operationParameter = builder.methodParameter()
2823

@@ -54,10 +49,10 @@ export class TypescriptAxiosClientBuilder extends AbstractClientBuilder {
5449
const axiosFragment = `this._request({${[
5550
`url: url ${queryString ? "+ query" : ""}`,
5651
`method: "${method}"`,
57-
requestBodyParameter
58-
? requestBodyIsSupported
52+
requestBody?.parameter
53+
? requestBody.isSupported
5954
? "data: body"
60-
: `// todo: request bodies with content-type '${requestBodyContentType}' not yet supported`
55+
: `// todo: request bodies with content-type '${requestBody.contentType}' not yet supported`
6156
: "",
6257
hasServers ? "baseURL: basePath" : undefined,
6358
// ensure compatibility with `exactOptionalPropertyTypes` compiler option
@@ -76,7 +71,7 @@ export class TypescriptAxiosClientBuilder extends AbstractClientBuilder {
7671
? `const headers = this._headers(${headers}, opts.headers)`
7772
: "const headers = this._headers({}, opts.headers)",
7873
queryString ? `const query = this._query({ ${queryString} })` : "",
79-
requestBodyParameter && requestBodyIsSupported
74+
requestBody?.parameter && requestBody.isSupported
8075
? "const body = JSON.stringify(p.requestBody)"
8176
: "",
8277
]

packages/openapi-code-generator/src/typescript/client/typescript-fetch/typescript-fetch-client-builder.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,7 @@ export class TypescriptFetchClientBuilder extends AbstractClientBuilder {
3737

3838
protected buildOperation(builder: ClientOperationBuilder): string {
3939
const {operationId, method, hasServers} = builder
40-
const {requestBodyContentType, requestBodyParameter} =
41-
builder.requestBodyAsParameter()
42-
43-
const requestBodyIsSupported = !this.types.isNever(
44-
requestBodyParameter?.schema,
45-
)
40+
const requestBody = builder.requestBodyAsParameter()
4641

4742
const operationParameter = builder.methodParameter()
4843

@@ -63,10 +58,10 @@ export class TypescriptFetchClientBuilder extends AbstractClientBuilder {
6358
const fetchFragment = `this._fetch(url ${queryString ? "+ query" : ""},
6459
{${[
6560
`method: "${method}"`,
66-
requestBodyParameter
67-
? requestBodyIsSupported
61+
requestBody?.parameter
62+
? requestBody.isSupported
6863
? "body"
69-
: `// todo: request bodies with content-type '${requestBodyContentType}' not yet supported`
64+
: `// todo: request bodies with content-type '${requestBody.contentType}' not yet supported`
7065
: "",
7166
"...opts",
7267
"headers",
@@ -81,7 +76,7 @@ export class TypescriptFetchClientBuilder extends AbstractClientBuilder {
8176
? `const headers = this._headers(${headers}, opts.headers)`
8277
: "const headers = this._headers({}, opts.headers)",
8378
queryString ? `const query = this._query({ ${queryString} })` : "",
84-
requestBodyParameter && requestBodyIsSupported
79+
requestBody?.parameter && requestBody.isSupported
8580
? "const body = JSON.stringify(p.requestBody)"
8681
: "",
8782
]

packages/openapi-code-generator/src/typescript/common/type-builder.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -283,14 +283,4 @@ export class TypeBuilder implements ICompilable {
283283
Object.keys(dereferenced.properties).length === 0
284284
)
285285
}
286-
287-
isNever(schemaObject?: MaybeIRModel): boolean {
288-
if (!schemaObject) {
289-
return false
290-
}
291-
292-
const dereferenced = this.input.schema(schemaObject)
293-
294-
return dereferenced.type === "never"
295-
}
296286
}

packages/openapi-code-generator/src/typescript/common/typescript-common.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {logger} from "../../core/logger"
22
import type {
3-
IRMediaType,
43
IROperation,
54
IRParameter,
65
} from "../../core/openapi-types-normalized"
@@ -140,21 +139,24 @@ export function buildExport(args: ExportDefinition) {
140139
}
141140
}
142141

142+
export type RequestBodyAsParameter = {
143+
isSupported: boolean
144+
parameter: IRParameter
145+
contentType: string
146+
}
147+
143148
export function requestBodyAsParameter(
144149
operation: IROperation,
145150
supportedMediaTypes = [
146151
"application/json",
147152
"text/json",
148153
"application/merge-patch+json",
149154
],
150-
): {
151-
requestBodyParameter?: IRParameter
152-
requestBodyContentType?: string
153-
} {
155+
): RequestBodyAsParameter | undefined {
154156
const {requestBody} = operation
155157

156158
if (!requestBody) {
157-
return {}
159+
return undefined
158160
}
159161

160162
const normalized = Object.entries(requestBody.content).map(([key, value]) => {
@@ -175,8 +177,9 @@ export function requestBodyAsParameter(
175177

176178
if (result) {
177179
return {
178-
requestBodyContentType: result.fullContentType,
179-
requestBodyParameter: {
180+
isSupported: true,
181+
contentType: result.fullContentType,
182+
parameter: {
180183
name: "requestBody",
181184
description: requestBody.description,
182185
in: "body",
@@ -196,12 +199,13 @@ export function requestBodyAsParameter(
196199
const first = normalized[0]
197200

198201
if (!first) {
199-
return {}
202+
return undefined
200203
}
201204

202205
return {
203-
requestBodyContentType: first.fullContentType,
204-
requestBodyParameter: {
206+
isSupported: false,
207+
contentType: first.fullContentType,
208+
parameter: {
205209
name: "requestBody",
206210
description: requestBody.description,
207211
in: "body",

packages/openapi-code-generator/src/typescript/server/server-operation-builder.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -267,22 +267,21 @@ export class ServerOperationBuilder {
267267
}
268268

269269
private requestBodyParameter(schemaSymbolName: string): Parameters["body"] {
270-
const {requestBodyContentType, requestBodyParameter} =
271-
requestBodyAsParameter(this.operation)
270+
const requestBody = requestBodyAsParameter(this.operation)
272271

273-
const isRequired = Boolean(requestBodyParameter?.required)
272+
const isRequired = Boolean(requestBody?.parameter?.required)
274273

275-
const schema = requestBodyParameter
274+
const schema = requestBody?.parameter
276275
? this.schemaBuilder.fromModel(
277-
requestBodyParameter.schema,
278-
requestBodyParameter.required,
276+
requestBody.parameter.schema,
277+
requestBody.parameter.required,
279278
true,
280279
)
281280
: undefined
282281

283282
if (
284-
requestBodyParameter &&
285-
this.types.isEmptyObject(requestBodyParameter.schema)
283+
requestBody?.parameter &&
284+
this.types.isEmptyObject(requestBody.parameter.schema)
286285
) {
287286
logger.warn(
288287
`[${this.route}]: skipping requestBody parameter that resolves to EmptyObject`,
@@ -298,19 +297,19 @@ export class ServerOperationBuilder {
298297

299298
let type = "void"
300299

301-
if (schema && requestBodyParameter) {
300+
if (schema && requestBody?.parameter) {
302301
type = this.types.schemaObjectToType(
303302
this.input.loader.addVirtualType(
304303
this.operationId,
305304
upperFirst(schemaSymbolName),
306-
this.input.schema(requestBodyParameter.schema),
305+
this.input.schema(requestBody.parameter.schema),
307306
),
308307
)
309308
}
310309

311310
return {
312-
isSupported: !this.types.isNever(requestBodyParameter?.schema),
313-
contentType: requestBodyContentType,
311+
isSupported: Boolean(requestBody?.isSupported),
312+
contentType: requestBody?.contentType,
314313
schema,
315314
type,
316315
isRequired,

0 commit comments

Comments
 (0)