From dde937a7ed58f09c91b562aa76e938882af45cfd Mon Sep 17 00:00:00 2001 From: Nikita Gusakov Date: Mon, 15 Jul 2024 14:40:04 +0200 Subject: [PATCH] fix: schema.content might be omitted references #369 --- .changeset/rich-olives-scream.md | 5 +++++ .../src/transform/header-object.ts | 2 +- .../src/transform/request-body-object.ts | 2 +- .../src/transform/response-object.ts | 2 +- .../test/transform/request-body-object.test.ts | 11 +++++++++++ .../test/transform/response-object.test.ts | 12 ++++++++++++ 6 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 .changeset/rich-olives-scream.md diff --git a/.changeset/rich-olives-scream.md b/.changeset/rich-olives-scream.md new file mode 100644 index 000000000..50225ff5b --- /dev/null +++ b/.changeset/rich-olives-scream.md @@ -0,0 +1,5 @@ +--- +"openapi-typescript": patch +--- + +fix: schema.content might be omitted diff --git a/packages/openapi-typescript/src/transform/header-object.ts b/packages/openapi-typescript/src/transform/header-object.ts index e4d3b3e73..cb3654e5b 100644 --- a/packages/openapi-typescript/src/transform/header-object.ts +++ b/packages/openapi-typescript/src/transform/header-object.ts @@ -17,7 +17,7 @@ export default function transformHeaderObject(headerObject: HeaderObject, option if (headerObject.content) { const type: ts.TypeElement[] = []; - for (const [contentType, mediaTypeObject] of getEntries(headerObject.content, options.ctx)) { + for (const [contentType, mediaTypeObject] of getEntries(headerObject.content ?? {}, options.ctx)) { const nextPath = `${options.path ?? "#"}/${escapePointer(contentType)}`; const mediaType = "$ref" in mediaTypeObject diff --git a/packages/openapi-typescript/src/transform/request-body-object.ts b/packages/openapi-typescript/src/transform/request-body-object.ts index beeeef915..a89e5475d 100644 --- a/packages/openapi-typescript/src/transform/request-body-object.ts +++ b/packages/openapi-typescript/src/transform/request-body-object.ts @@ -14,7 +14,7 @@ export default function transformRequestBodyObject( options: TransformNodeOptions, ): ts.TypeNode { const type: ts.TypeElement[] = []; - for (const [contentType, mediaTypeObject] of getEntries(requestBodyObject.content, options.ctx)) { + for (const [contentType, mediaTypeObject] of getEntries(requestBodyObject.content ?? {}, options.ctx)) { const nextPath = createRef([options.path, contentType]); const mediaType = "$ref" in mediaTypeObject diff --git a/packages/openapi-typescript/src/transform/response-object.ts b/packages/openapi-typescript/src/transform/response-object.ts index 37b6398fa..a23aa686d 100644 --- a/packages/openapi-typescript/src/transform/response-object.ts +++ b/packages/openapi-typescript/src/transform/response-object.ts @@ -74,7 +74,7 @@ export default function transformResponseObject( // content const contentObject: ts.TypeElement[] = []; if (responseObject.content) { - for (const [contentType, mediaTypeObject] of getEntries(responseObject.content, options.ctx)) { + for (const [contentType, mediaTypeObject] of getEntries(responseObject.content ?? {}, options.ctx)) { const property = ts.factory.createPropertySignature( /* modifiers */ tsModifiers({ readonly: options.ctx.immutable }), /* name */ tsPropertyIndex(contentType), diff --git a/packages/openapi-typescript/test/transform/request-body-object.test.ts b/packages/openapi-typescript/test/transform/request-body-object.test.ts index 4f8965350..10bf4f8a0 100644 --- a/packages/openapi-typescript/test/transform/request-body-object.test.ts +++ b/packages/openapi-typescript/test/transform/request-body-object.test.ts @@ -47,6 +47,17 @@ describe("transformRequestBodyObject", () => { content: { "*/*"?: never; }; +}`, + }, + ], + [ + "no-content", + { + given: {}, + want: `{ + content: { + "*/*"?: never; + }; }`, }, ], diff --git a/packages/openapi-typescript/test/transform/response-object.test.ts b/packages/openapi-typescript/test/transform/response-object.test.ts index f370aab08..685810be5 100644 --- a/packages/openapi-typescript/test/transform/response-object.test.ts +++ b/packages/openapi-typescript/test/transform/response-object.test.ts @@ -70,6 +70,18 @@ describe("transformResponseObject", () => { // options: DEFAULT_OPTIONS, }, ], + [ + "no-content", + { + given: {}, + want: `{ + headers: { + [name: string]: unknown; + }; + content?: never; +}`, + }, + ], ]; for (const [testName, { given, want, options = DEFAULT_OPTIONS, ci }] of tests) {