Skip to content

Commit 64fed1f

Browse files
committed
fix: skip request bodies with empty schemas
1 parent 958c88b commit 64fed1f

3 files changed

Lines changed: 42 additions & 6 deletions

File tree

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {generationLib} from "../../core/generation-lib"
2+
import {logger} from "../../core/logger"
23
import type {
34
IROperation,
45
IRParameter,
@@ -99,7 +100,17 @@ export class ClientOperationBuilder {
99100
requestBodyParameter?: IRParameter
100101
requestBodyContentType?: string
101102
} {
102-
return requestBodyAsParameter(this.operation)
103+
const result = requestBodyAsParameter(this.operation)
104+
const schema = result.requestBodyParameter?.schema
105+
106+
if (schema && this.models.isEmptyObject(schema)) {
107+
logger.warn(
108+
`[${this.route}]: skipping requestBody parameter that resolves to EmptyObject`,
109+
)
110+
return {}
111+
}
112+
113+
return result
103114
}
104115

105116
queryString(): string {

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

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -233,11 +233,9 @@ export class TypeBuilder implements ICompilable {
233233
? `[key: string]: ${union(additionalPropertiesType, "undefined")}`
234234
: ""
235235

236-
const emptyObject =
237-
schemaObject.additionalProperties === false &&
238-
properties.length === 0
239-
? this.addStaticType("EmptyObject")
240-
: ""
236+
const emptyObject = this.isEmptyObject(schemaObject)
237+
? this.addStaticType("EmptyObject")
238+
: ""
241239

242240
properties.push(additionalProperties)
243241

@@ -263,4 +261,17 @@ export class TypeBuilder implements ICompilable {
263261
toCompilationUnit(): CompilationUnit {
264262
return new CompilationUnit(this.filename, this.imports, this.toString())
265263
}
264+
265+
isEmptyObject(schemaObject: MaybeIRModel) {
266+
const dereferenced = this.input.schema(schemaObject)
267+
268+
return (
269+
dereferenced.type === "object" &&
270+
dereferenced.allOf.length === 0 &&
271+
dereferenced.anyOf.length === 0 &&
272+
dereferenced.oneOf.length === 0 &&
273+
dereferenced.additionalProperties === false &&
274+
Object.keys(dereferenced.properties).length === 0
275+
)
276+
}
266277
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {Input} from "../../core/input"
2+
import {logger} from "../../core/logger"
23
import type {
34
IRModelObject,
45
IROperation,
@@ -265,14 +266,27 @@ export class ServerOperationBuilder {
265266

266267
private requestBodyParameter(schemaSymbolName: string): Parameters["body"] {
267268
const {requestBodyParameter} = requestBodyAsParameter(this.operation)
269+
268270
const isRequired = Boolean(requestBodyParameter?.required)
271+
269272
const schema = requestBodyParameter
270273
? this.schemaBuilder.fromModel(
271274
requestBodyParameter.schema,
272275
requestBodyParameter.required,
273276
true,
274277
)
275278
: undefined
279+
280+
if (
281+
requestBodyParameter &&
282+
this.types.isEmptyObject(requestBodyParameter.schema)
283+
) {
284+
logger.warn(
285+
`[${this.route}]: skipping requestBody parameter that resolves to EmptyObject`,
286+
)
287+
return {type: "void", schema: undefined, isRequired: false}
288+
}
289+
276290
let type = "void"
277291

278292
if (schema && requestBodyParameter) {

0 commit comments

Comments
 (0)