diff --git a/.changeset/green-dancers-pull.md b/.changeset/green-dancers-pull.md new file mode 100644 index 000000000..c8a2a0a62 --- /dev/null +++ b/.changeset/green-dancers-pull.md @@ -0,0 +1,5 @@ +--- +'@hey-api/openapi-ts': patch +--- + +fix: generate correct response for text/plain content type diff --git a/packages/openapi-ts/src/ir/__tests__/mediaType.test.ts b/packages/openapi-ts/src/ir/__tests__/mediaType.test.ts index eabd1d869..de8395ad9 100644 --- a/packages/openapi-ts/src/ir/__tests__/mediaType.test.ts +++ b/packages/openapi-ts/src/ir/__tests__/mediaType.test.ts @@ -52,7 +52,7 @@ describe('isMediaTypeFileLike', () => { mediaType: 'text/javascript; charset=ISO-8859-1', }, { - fileLike: true, + fileLike: false, mediaType: 'text/plain; charset=utf-8', }, { diff --git a/packages/openapi-ts/src/ir/mediaType.ts b/packages/openapi-ts/src/ir/mediaType.ts index bbb4d8ff0..6883cfa38 100644 --- a/packages/openapi-ts/src/ir/mediaType.ts +++ b/packages/openapi-ts/src/ir/mediaType.ts @@ -1,5 +1,5 @@ const fileLikeRegExp = - /^(application\/(pdf|rtf|msword|vnd\.(ms-|openxmlformats-officedocument\.)|zip|x-(7z|tar|rar|zip|iso)|octet-stream|gzip|x-msdownload|json\+download|xml|x-yaml|x-7z-compressed|x-tar)|text\/(plain|yaml|css|javascript)|audio\/(mpeg|wav)|video\/(mp4|x-matroska)|image\/(vnd\.adobe\.photoshop|svg\+xml))(; ?charset=[^;]+)?$/i; + /^(application\/(pdf|rtf|msword|vnd\.(ms-|openxmlformats-officedocument\.)|zip|x-(7z|tar|rar|zip|iso)|octet-stream|gzip|x-msdownload|json\+download|xml|x-yaml|x-7z-compressed|x-tar)|text\/(yaml|css|javascript)|audio\/(mpeg|wav)|video\/(mp4|x-matroska)|image\/(vnd\.adobe\.photoshop|svg\+xml))(; ?charset=[^;]+)?$/i; const jsonMimeRegExp = /^application\/(.*\+)?json(;.*)?$/i; const multipartFormDataMimeRegExp = /^multipart\/form-data(;.*)?$/i; const xWwwFormUrlEncodedMimeRegExp = diff --git a/packages/openapi-ts/test/2.0.x.test.ts b/packages/openapi-ts/test/2.0.x.test.ts index 75de573de..66fedebff 100644 --- a/packages/openapi-ts/test/2.0.x.test.ts +++ b/packages/openapi-ts/test/2.0.x.test.ts @@ -34,6 +34,13 @@ describe(`OpenAPI ${version}`, () => { }); const scenarios = [ + { + config: createConfig({ + input: 'body-response-text-plain.yaml', + output: 'body-response-text-plain', + }), + description: 'handle text/plain content type', + }, { config: createConfig({ input: 'enum-names-values.json', diff --git a/packages/openapi-ts/test/3.0.x.test.ts b/packages/openapi-ts/test/3.0.x.test.ts index 09bc9d866..245525960 100644 --- a/packages/openapi-ts/test/3.0.x.test.ts +++ b/packages/openapi-ts/test/3.0.x.test.ts @@ -63,6 +63,13 @@ describe(`OpenAPI ${version}`, () => { description: 'generates correct array when items are oneOf array with single item', }, + { + config: createConfig({ + input: 'body-response-text-plain.yaml', + output: 'body-response-text-plain', + }), + description: 'handle text/plain content type', + }, { config: createConfig({ input: 'case.json', diff --git a/packages/openapi-ts/test/3.1.x.test.ts b/packages/openapi-ts/test/3.1.x.test.ts index 0f065544e..63adc6454 100644 --- a/packages/openapi-ts/test/3.1.x.test.ts +++ b/packages/openapi-ts/test/3.1.x.test.ts @@ -63,6 +63,13 @@ describe(`OpenAPI ${version}`, () => { description: 'generates correct array when items are oneOf array with single item', }, + { + config: createConfig({ + input: 'body-response-text-plain.yaml', + output: 'body-response-text-plain', + }), + description: 'handle text/plain content type', + }, { config: createConfig({ input: 'case.json', diff --git a/packages/openapi-ts/test/__snapshots__/2.0.x/body-response-text-plain/index.ts b/packages/openapi-ts/test/__snapshots__/2.0.x/body-response-text-plain/index.ts new file mode 100644 index 000000000..56bade120 --- /dev/null +++ b/packages/openapi-ts/test/__snapshots__/2.0.x/body-response-text-plain/index.ts @@ -0,0 +1,2 @@ +// This file is auto-generated by @hey-api/openapi-ts +export * from './types.gen'; \ No newline at end of file diff --git a/packages/openapi-ts/test/__snapshots__/2.0.x/body-response-text-plain/types.gen.ts b/packages/openapi-ts/test/__snapshots__/2.0.x/body-response-text-plain/types.gen.ts new file mode 100644 index 000000000..8f9dbd468 --- /dev/null +++ b/packages/openapi-ts/test/__snapshots__/2.0.x/body-response-text-plain/types.gen.ts @@ -0,0 +1,17 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type PostFooData = { + body: string; + path?: never; + query?: never; + url: '/foo'; +}; + +export type PostFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type PostFooResponse = PostFooResponses[keyof PostFooResponses]; \ No newline at end of file diff --git a/packages/openapi-ts/test/__snapshots__/3.0.x/body-response-text-plain/index.ts b/packages/openapi-ts/test/__snapshots__/3.0.x/body-response-text-plain/index.ts new file mode 100644 index 000000000..56bade120 --- /dev/null +++ b/packages/openapi-ts/test/__snapshots__/3.0.x/body-response-text-plain/index.ts @@ -0,0 +1,2 @@ +// This file is auto-generated by @hey-api/openapi-ts +export * from './types.gen'; \ No newline at end of file diff --git a/packages/openapi-ts/test/__snapshots__/3.0.x/body-response-text-plain/types.gen.ts b/packages/openapi-ts/test/__snapshots__/3.0.x/body-response-text-plain/types.gen.ts new file mode 100644 index 000000000..8f9dbd468 --- /dev/null +++ b/packages/openapi-ts/test/__snapshots__/3.0.x/body-response-text-plain/types.gen.ts @@ -0,0 +1,17 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type PostFooData = { + body: string; + path?: never; + query?: never; + url: '/foo'; +}; + +export type PostFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type PostFooResponse = PostFooResponses[keyof PostFooResponses]; \ No newline at end of file diff --git a/packages/openapi-ts/test/__snapshots__/3.1.x/body-response-text-plain/index.ts b/packages/openapi-ts/test/__snapshots__/3.1.x/body-response-text-plain/index.ts new file mode 100644 index 000000000..56bade120 --- /dev/null +++ b/packages/openapi-ts/test/__snapshots__/3.1.x/body-response-text-plain/index.ts @@ -0,0 +1,2 @@ +// This file is auto-generated by @hey-api/openapi-ts +export * from './types.gen'; \ No newline at end of file diff --git a/packages/openapi-ts/test/__snapshots__/3.1.x/body-response-text-plain/types.gen.ts b/packages/openapi-ts/test/__snapshots__/3.1.x/body-response-text-plain/types.gen.ts new file mode 100644 index 000000000..8f9dbd468 --- /dev/null +++ b/packages/openapi-ts/test/__snapshots__/3.1.x/body-response-text-plain/types.gen.ts @@ -0,0 +1,17 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type PostFooData = { + body: string; + path?: never; + query?: never; + url: '/foo'; +}; + +export type PostFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type PostFooResponse = PostFooResponses[keyof PostFooResponses]; \ No newline at end of file diff --git a/packages/openapi-ts/test/openapi-ts.config.ts b/packages/openapi-ts/test/openapi-ts.config.ts index 185d436b6..f6e68ffd5 100644 --- a/packages/openapi-ts/test/openapi-ts.config.ts +++ b/packages/openapi-ts/test/openapi-ts.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from '../src'; export default defineConfig({ client: { // bundle: true, - name: '@hey-api/client-nuxt', + name: '@hey-api/client-fetch', // name: 'legacy/xhr', }, // experimentalParser: false, @@ -11,7 +11,7 @@ export default defineConfig({ // exclude: '^#/components/schemas/ModelWithCircularReference$', // include: // '^(#/components/schemas/import|#/paths/api/v{api-version}/simple/options)$', - path: './packages/openapi-ts/test/spec/3.1.x/full.json', + path: './packages/openapi-ts/test/spec/2.0.x/body-response-text-plain.yaml', // path: './test/spec/v3-transforms.json', // path: 'https://mongodb-mms-prod-build-server.s3.amazonaws.com/openapi/2caffd88277a4e27c95dcefc7e3b6a63a3b03297-v2-2023-11-15.json', // path: 'https://raw.githubusercontent.com/swagger-api/swagger-petstore/master/src/main/resources/openapi.yaml', @@ -74,7 +74,7 @@ export default defineConfig({ }, // @ts-ignore { - name: 'zod', + // name: 'zod', }, ], // useOptions: false, diff --git a/packages/openapi-ts/test/spec/2.0.x/body-response-text-plain.yaml b/packages/openapi-ts/test/spec/2.0.x/body-response-text-plain.yaml new file mode 100644 index 000000000..b2159dd04 --- /dev/null +++ b/packages/openapi-ts/test/spec/2.0.x/body-response-text-plain.yaml @@ -0,0 +1,22 @@ +swagger: '2.0' +info: + title: OpenAPI 2.0 body response text plain example + version: '1' +paths: + /foo: + post: + consumes: + - text/plain + produces: + - text/plain + parameters: + - name: body + in: body + required: true + schema: + type: string + responses: + '200': + description: OK + schema: + type: string diff --git a/packages/openapi-ts/test/spec/3.0.x/body-response-text-plain.yaml b/packages/openapi-ts/test/spec/3.0.x/body-response-text-plain.yaml new file mode 100644 index 000000000..73ef04a2f --- /dev/null +++ b/packages/openapi-ts/test/spec/3.0.x/body-response-text-plain.yaml @@ -0,0 +1,20 @@ +openapi: 3.0.4 +info: + title: OpenAPI 3.0.4 body response text plain example + version: 1 +paths: + /foo: + post: + requestBody: + content: + 'text/plain': + schema: + type: string + required: true + responses: + '200': + description: OK + content: + text/plain: + schema: + type: string diff --git a/packages/openapi-ts/test/spec/3.1.x/body-response-text-plain.yaml b/packages/openapi-ts/test/spec/3.1.x/body-response-text-plain.yaml new file mode 100644 index 000000000..2a29e8d5b --- /dev/null +++ b/packages/openapi-ts/test/spec/3.1.x/body-response-text-plain.yaml @@ -0,0 +1,20 @@ +openapi: 3.1.1 +info: + title: OpenAPI 3.1.1 body response text plain example + version: 1 +paths: + /foo: + post: + requestBody: + content: + 'text/plain': + schema: + type: string + required: true + responses: + '200': + description: OK + content: + text/plain: + schema: + type: string