From 1ef6606416a46e25feb90bb386617149ea98f65f Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 13 Dec 2023 08:37:34 -0800 Subject: [PATCH 1/3] OpenAPI3 multipart conflict --- packages/openapi3/src/schema-emitter.ts | 2 +- packages/openapi3/test/multipart.test.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/openapi3/src/schema-emitter.ts b/packages/openapi3/src/schema-emitter.ts index 7e553e8d81..8010591d54 100644 --- a/packages/openapi3/src/schema-emitter.ts +++ b/packages/openapi3/src/schema-emitter.ts @@ -125,7 +125,7 @@ export class OpenAPI3SchemaEmitter extends TypeEmitter< const contentType = this.#getContentType(); if (contentType === "application/json") { - delete patch.contentType; + patch.contentType = undefined; } return patch; diff --git a/packages/openapi3/test/multipart.test.ts b/packages/openapi3/test/multipart.test.ts index aaf66a0c88..ddbcedd1a3 100644 --- a/packages/openapi3/test/multipart.test.ts +++ b/packages/openapi3/test/multipart.test.ts @@ -102,4 +102,21 @@ describe("typespec-autorest: multipart", () => { } ); }); + + it("enum used in both a json payload and multipart part shouldn't create 2 models", async () => { + const res = await openApiFor( + ` + enum FilePurpose { + fineTune, + fineTuneResults, + } + + interface Files { + @get listFiles(purpose: FilePurpose): string; + @post uploadFile(@header contentType: "multipart/form-data", purpose: FilePurpose): string; + } + ` + ); + deepStrictEqual(res.components.schemas.FilePurpose, {}); + }); }); From 4f741b8b64d312c1663e2583d43ab44257272fe7 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 13 Dec 2023 08:39:04 -0800 Subject: [PATCH 2/3] Changelog --- ...x-openapi3-multipart-conflict_2023-12-13-16-39.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@typespec/openapi3/hotfix-openapi3-multipart-conflict_2023-12-13-16-39.json diff --git a/common/changes/@typespec/openapi3/hotfix-openapi3-multipart-conflict_2023-12-13-16-39.json b/common/changes/@typespec/openapi3/hotfix-openapi3-multipart-conflict_2023-12-13-16-39.json new file mode 100644 index 0000000000..29dd0a23e5 --- /dev/null +++ b/common/changes/@typespec/openapi3/hotfix-openapi3-multipart-conflict_2023-12-13-16-39.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/openapi3", + "comment": "Fix: OpenAPI3 creating conflicting type declaration when type was used in multipart implicit body and json body", + "type": "none" + } + ], + "packageName": "@typespec/openapi3" +} \ No newline at end of file From b0e834ccd22cd5881911b53d478b7b508da3b84f Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 13 Dec 2023 08:39:56 -0800 Subject: [PATCH 3/3] Fix test --- packages/openapi3/test/multipart.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/openapi3/test/multipart.test.ts b/packages/openapi3/test/multipart.test.ts index ddbcedd1a3..e64ddc9f2f 100644 --- a/packages/openapi3/test/multipart.test.ts +++ b/packages/openapi3/test/multipart.test.ts @@ -107,8 +107,8 @@ describe("typespec-autorest: multipart", () => { const res = await openApiFor( ` enum FilePurpose { - fineTune, - fineTuneResults, + one, + two, } interface Files { @@ -117,6 +117,6 @@ describe("typespec-autorest: multipart", () => { } ` ); - deepStrictEqual(res.components.schemas.FilePurpose, {}); + deepStrictEqual(res.components.schemas.FilePurpose, { type: "string", enum: ["one", "two"] }); }); });