From 9429b3770ec4e31eda65bb0a90ad26b0f9738726 Mon Sep 17 00:00:00 2001 From: jibarra Date: Thu, 19 Mar 2026 00:00:10 -0400 Subject: [PATCH 1/3] fix(zod): generate z.union([z.instanceof(Blob), z.instanceof(File)]) for binary format Fields with format: 'binary' (e.g. from contentMediaType: 'application/octet-stream' in OpenAPI 3.1) were generating z.string() in all three Zod plugin variants (v3, v4, mini). This mirrors what the TypeScript plugin already produces (Blob | File) and correctly validates file upload fields at runtime. Fixes #3408 --- packages/openapi-ts/src/plugins/zod/constants.ts | 1 + .../openapi-ts/src/plugins/zod/mini/toAst/string.ts | 9 +++++++++ .../openapi-ts/src/plugins/zod/v3/toAst/string.ts | 12 +++++++++++- .../openapi-ts/src/plugins/zod/v4/toAst/string.ts | 9 +++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/openapi-ts/src/plugins/zod/constants.ts b/packages/openapi-ts/src/plugins/zod/constants.ts index 940c58f2c7..75e80495fb 100644 --- a/packages/openapi-ts/src/plugins/zod/constants.ts +++ b/packages/openapi-ts/src/plugins/zod/constants.ts @@ -22,6 +22,7 @@ export const identifiers = { gte: 'gte', guid: 'guid', infer: 'infer', + instanceof: 'instanceof', int: 'int', intersection: 'intersection', ip: 'ip', diff --git a/packages/openapi-ts/src/plugins/zod/mini/toAst/string.ts b/packages/openapi-ts/src/plugins/zod/mini/toAst/string.ts index d22e6d11f7..b25ab4d393 100644 --- a/packages/openapi-ts/src/plugins/zod/mini/toAst/string.ts +++ b/packages/openapi-ts/src/plugins/zod/mini/toAst/string.ts @@ -23,6 +23,15 @@ function formatNode(ctx: StringResolverContext): ChainResult { const { z } = symbols; switch (schema.format) { + case 'binary': + return $(z) + .attr(identifiers.union) + .call( + $.array( + $(z).attr(identifiers.instanceof).call($.id('Blob')), + $(z).attr(identifiers.instanceof).call($.id('File')), + ), + ); case 'date': return $(z).attr(identifiers.iso).attr(identifiers.date).call(); case 'date-time': { diff --git a/packages/openapi-ts/src/plugins/zod/v3/toAst/string.ts b/packages/openapi-ts/src/plugins/zod/v3/toAst/string.ts index 45bb2b3c31..8590de0d3b 100644 --- a/packages/openapi-ts/src/plugins/zod/v3/toAst/string.ts +++ b/packages/openapi-ts/src/plugins/zod/v3/toAst/string.ts @@ -19,9 +19,19 @@ function constNode(ctx: StringResolverContext): ChainResult { } function formatNode(ctx: StringResolverContext): ChainResult { - const { chain, plugin, schema } = ctx; + const { chain, plugin, schema, symbols } = ctx; + const { z } = symbols; switch (schema.format) { + case 'binary': + return $(z) + .attr(identifiers.union) + .call( + $.array( + $(z).attr(identifiers.instanceof).call($.id('Blob')), + $(z).attr(identifiers.instanceof).call($.id('File')), + ), + ); case 'date': return chain.current.attr(identifiers.date).call(); case 'date-time': { diff --git a/packages/openapi-ts/src/plugins/zod/v4/toAst/string.ts b/packages/openapi-ts/src/plugins/zod/v4/toAst/string.ts index 5606660549..bcdf720556 100644 --- a/packages/openapi-ts/src/plugins/zod/v4/toAst/string.ts +++ b/packages/openapi-ts/src/plugins/zod/v4/toAst/string.ts @@ -23,6 +23,15 @@ function formatNode(ctx: StringResolverContext): ChainResult { const { z } = symbols; switch (schema.format) { + case 'binary': + return $(z) + .attr(identifiers.union) + .call( + $.array( + $(z).attr(identifiers.instanceof).call($.id('Blob')), + $(z).attr(identifiers.instanceof).call($.id('File')), + ), + ); case 'date': return $(z).attr(identifiers.iso).attr(identifiers.date).call(); case 'date-time': { From 06fe0ff73a656c0a4652d2051e6f535aeca911f0 Mon Sep 17 00:00:00 2001 From: jibarra Date: Thu, 19 Mar 2026 00:06:07 -0400 Subject: [PATCH 2/3] test(zod): add snapshot tests for binary format and contentMediaType MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add two new test scenarios to 3.1.x.test.ts: - content-binary.json + zod: verifies z.instanceof(Blob/File) for format: binary - content-media-type.yaml + zod: verifies z.instanceof(Blob/File) for contentMediaType - Add content-media-type.yaml spec (backport from merged PR #3431) - Apply parser fix for contentMediaType → binary format inference (backport from #3431) - Update string-with-format zod snapshot to reflect corrected binary output Snapshots confirm: z.union([z.instanceof(Blob), z.instanceof(File)]) for all binary fields --- .../openapi-ts-tests/main/test/3.1.x.test.ts | 18 +++++++ .../3.1.x/content-binary-zod/index.ts | 3 ++ .../3.1.x/content-binary-zod/types.gen.ts | 31 ++++++++++++ .../3.1.x/content-binary-zod/zod.gen.ts | 19 ++++++++ .../3.1.x/content-media-type-zod/index.ts | 3 ++ .../3.1.x/content-media-type-zod/types.gen.ts | 47 +++++++++++++++++++ .../3.1.x/content-media-type-zod/zod.gen.ts | 23 +++++++++ .../3.1.x/mini/string-with-format/zod.gen.ts | 2 +- 8 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/zod.gen.ts diff --git a/packages/openapi-ts-tests/main/test/3.1.x.test.ts b/packages/openapi-ts-tests/main/test/3.1.x.test.ts index 3f85bbb8ec..ee838d294f 100644 --- a/packages/openapi-ts-tests/main/test/3.1.x.test.ts +++ b/packages/openapi-ts-tests/main/test/3.1.x.test.ts @@ -199,6 +199,24 @@ describe(`OpenAPI ${version}`, () => { }), description: 'handles contentMediaType schema property for file uploads', }, + { + config: createConfig({ + input: 'content-binary.json', + output: 'content-binary-zod', + plugins: ['@hey-api/typescript', 'zod'], + }), + description: + 'generates z.instanceof(Blob/File) for binary format with zod', + }, + { + config: createConfig({ + input: 'content-media-type.yaml', + output: 'content-media-type-zod', + plugins: ['@hey-api/typescript', 'zod'], + }), + description: + 'generates z.instanceof(Blob/File) for contentMediaType with zod', + }, { config: createConfig({ input: 'content-types.yaml', diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/index.ts new file mode 100644 index 0000000000..79c8f10876 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, GetBarData, GetBarResponse, GetBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/types.gen.ts new file mode 100644 index 0000000000..97bd27233b --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/types.gen.ts @@ -0,0 +1,31 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type GetBarData = { + body?: never; + path?: never; + query?: never; + url: '/bar'; +}; + +export type GetBarResponses = { + 200: Blob | File; +}; + +export type GetBarResponse = GetBarResponses[keyof GetBarResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/zod.gen.ts new file mode 100644 index 0000000000..2ba0c0681a --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/zod.gen.ts @@ -0,0 +1,19 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +export const zGetFooResponse = z.string(); + +export const zGetBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +export const zGetBarResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/index.ts new file mode 100644 index 0000000000..1bfff2876b --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FileUploadRequest, FileUploadRequestTyped, UploadFileData, UploadFileResponses, UploadFileTypedData, UploadFileTypedResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/types.gen.ts new file mode 100644 index 0000000000..c955f20ecf --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/types.gen.ts @@ -0,0 +1,47 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type FileUploadRequest = { + /** + * Binary file content + */ + file: Blob | File; +}; + +export type FileUploadRequestTyped = { + /** + * Binary file content with explicit string type + */ + file: Blob | File; +}; + +export type UploadFileData = { + body?: FileUploadRequest; + path?: never; + query?: never; + url: '/upload'; +}; + +export type UploadFileResponses = { + /** + * OK + */ + 200: unknown; +}; + +export type UploadFileTypedData = { + body?: FileUploadRequestTyped; + path?: never; + query?: never; + url: '/upload-typed'; +}; + +export type UploadFileTypedResponses = { + /** + * OK + */ + 200: unknown; +}; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/zod.gen.ts new file mode 100644 index 0000000000..c9d8aec019 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/zod.gen.ts @@ -0,0 +1,23 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zFileUploadRequest = z.object({ + file: z.union([z.instanceof(Blob), z.instanceof(File)]) +}); + +export const zFileUploadRequestTyped = z.object({ + file: z.union([z.instanceof(Blob), z.instanceof(File)]) +}); + +export const zUploadFileData = z.object({ + body: z.optional(zFileUploadRequest), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +export const zUploadFileTypedData = z.object({ + body: z.optional(zFileUploadRequestTyped), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/string-with-format/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/string-with-format/zod.gen.ts index 86a96fb59c..fc615e7f05 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/string-with-format/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/string-with-format/zod.gen.ts @@ -3,5 +3,5 @@ import * as z from 'zod/mini'; export const zFoo = z.object({ - foo: z.optional(z.array(z.union([z.string(), z.string()]))) + foo: z.optional(z.array(z.union([z.union([z.instanceof(Blob), z.instanceof(File)]), z.string()]))) }); From ea16c046ec624b210996bab989b8cdfe5628cef8 Mon Sep 17 00:00:00 2001 From: jibarra Date: Thu, 19 Mar 2026 14:47:34 -0400 Subject: [PATCH 3/3] fix(zod): update snapshots for binary format after merge with main Regenerate all zod snapshots to reflect binary format fields now producing z.instanceof(Blob/File) and align new test snapshots with current v4-style output. --- .../openapi-ts-tests/main/test/3.1.x.test.ts | 6 ++---- .../3.1.x/content-binary-zod/zod.gen.ts | 14 +++++++------- .../3.1.x/content-media-type-zod/zod.gen.ts | 14 +++++++------- .../__snapshots__/2.0.x/mini/default/zod.gen.ts | 4 ++-- .../v3/__snapshots__/2.0.x/v3/default/zod.gen.ts | 4 ++-- .../v3/__snapshots__/2.0.x/v4/default/zod.gen.ts | 4 ++-- .../__snapshots__/3.0.x/mini/default/zod.gen.ts | 16 ++++++++-------- .../v3/__snapshots__/3.0.x/v3/default/zod.gen.ts | 16 ++++++++-------- .../v3/__snapshots__/3.0.x/v4/default/zod.gen.ts | 16 ++++++++-------- .../__snapshots__/3.1.x/mini/default/zod.gen.ts | 16 ++++++++-------- .../v3/__snapshots__/3.1.x/v3/default/zod.gen.ts | 16 ++++++++-------- .../v3/__snapshots__/3.1.x/v4/default/zod.gen.ts | 16 ++++++++-------- .../__snapshots__/2.0.x/mini/default/zod.gen.ts | 4 ++-- .../v4/__snapshots__/2.0.x/v3/default/zod.gen.ts | 4 ++-- .../v4/__snapshots__/2.0.x/v4/default/zod.gen.ts | 4 ++-- .../__snapshots__/3.0.x/mini/default/zod.gen.ts | 16 ++++++++-------- .../v4/__snapshots__/3.0.x/v3/default/zod.gen.ts | 16 ++++++++-------- .../v4/__snapshots__/3.0.x/v4/default/zod.gen.ts | 16 ++++++++-------- .../__snapshots__/3.1.x/mini/default/zod.gen.ts | 16 ++++++++-------- .../v4/__snapshots__/3.1.x/v3/default/zod.gen.ts | 16 ++++++++-------- .../3.1.x/v3/string-with-format/zod.gen.ts | 2 +- .../v4/__snapshots__/3.1.x/v4/default/zod.gen.ts | 16 ++++++++-------- .../3.1.x/v4/string-with-format/zod.gen.ts | 2 +- 23 files changed, 126 insertions(+), 128 deletions(-) diff --git a/packages/openapi-ts-tests/main/test/3.1.x.test.ts b/packages/openapi-ts-tests/main/test/3.1.x.test.ts index ee838d294f..4f53b134aa 100644 --- a/packages/openapi-ts-tests/main/test/3.1.x.test.ts +++ b/packages/openapi-ts-tests/main/test/3.1.x.test.ts @@ -205,8 +205,7 @@ describe(`OpenAPI ${version}`, () => { output: 'content-binary-zod', plugins: ['@hey-api/typescript', 'zod'], }), - description: - 'generates z.instanceof(Blob/File) for binary format with zod', + description: 'generates z.instanceof(Blob/File) for binary format with zod', }, { config: createConfig({ @@ -214,8 +213,7 @@ describe(`OpenAPI ${version}`, () => { output: 'content-media-type-zod', plugins: ['@hey-api/typescript', 'zod'], }), - description: - 'generates z.instanceof(Blob/File) for contentMediaType with zod', + description: 'generates z.instanceof(Blob/File) for contentMediaType with zod', }, { config: createConfig({ diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/zod.gen.ts index 2ba0c0681a..26ce70a46a 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-binary-zod/zod.gen.ts @@ -1,19 +1,19 @@ // This file is auto-generated by @hey-api/openapi-ts -import { z } from 'zod'; +import * as z from 'zod'; export const zGetFooData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + body: z.never().optional(), + path: z.never().optional(), + query: z.never().optional() }); export const zGetFooResponse = z.string(); export const zGetBarData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + body: z.never().optional(), + path: z.never().optional(), + query: z.never().optional() }); export const zGetBarResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/zod.gen.ts index c9d8aec019..984b27838b 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/content-media-type-zod/zod.gen.ts @@ -1,6 +1,6 @@ // This file is auto-generated by @hey-api/openapi-ts -import { z } from 'zod'; +import * as z from 'zod'; export const zFileUploadRequest = z.object({ file: z.union([z.instanceof(Blob), z.instanceof(File)]) @@ -11,13 +11,13 @@ export const zFileUploadRequestTyped = z.object({ }); export const zUploadFileData = z.object({ - body: z.optional(zFileUploadRequest), - path: z.optional(z.never()), - query: z.optional(z.never()) + body: zFileUploadRequest.optional(), + path: z.never().optional(), + query: z.never().optional() }); export const zUploadFileTypedData = z.object({ - body: z.optional(zFileUploadRequestTyped), - path: z.optional(z.never()), - query: z.optional(z.never()) + body: zFileUploadRequestTyped.optional(), + path: z.never().optional(), + query: z.never().optional() }); diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts index c158420b6a..f349b51316 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts @@ -63,7 +63,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -272,7 +272,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.optional(z.array(zModelWithString)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts index 085bf6077f..1edb369e1e 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts @@ -63,7 +63,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -272,7 +272,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts index 3fc713430a..705abc14d2 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts @@ -63,7 +63,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -272,7 +272,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/default/zod.gen.ts index 91f87b838a..348a42275e 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.optional(z.array(zModelWithString)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.optional(z.array(zModelWithReadOnlyAndWriteOnly)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -1011,7 +1011,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.optional(z.array(zModelWithReadOnlyAndWriteOnlyWritable)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -1472,7 +1472,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.nullable(z.string()) }), @@ -1493,7 +1493,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.optional(z.never()), @@ -1525,7 +1525,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.optional(z.string()), + file: z.optional(z.union([z.instanceof(Blob), z.instanceof(File)])), metadata: z.optional(z.object({ foo: z.optional(z.string()), bar: z.optional(z.string()) @@ -1534,7 +1534,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.optional(z.object({ - content: z.optional(z.string()), + content: z.optional(z.union([z.instanceof(Blob), z.instanceof(File)])), data: z.nullish(zModelWithString) })), path: z.optional(z.never()), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/default/zod.gen.ts index ae765fb53b..f833f2cff6 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnly).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1011,7 +1011,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnlyWritable).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1472,7 +1472,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.string().nullable() }), @@ -1493,7 +1493,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.never().optional(), @@ -1525,7 +1525,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.string().optional(), + file: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), metadata: z.object({ foo: z.string().optional(), bar: z.string().optional() @@ -1534,7 +1534,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.object({ - content: z.string().optional(), + content: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), data: zModelWithString.nullish() }).optional(), path: z.never().optional(), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/default/zod.gen.ts index 9d6fb8aa97..e37d71cec1 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnly).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1011,7 +1011,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnlyWritable).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1472,7 +1472,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.string().nullable() }), @@ -1493,7 +1493,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.never().optional(), @@ -1525,7 +1525,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.string().optional(), + file: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), metadata: z.object({ foo: z.string().optional(), bar: z.string().optional() @@ -1534,7 +1534,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.object({ - content: z.string().optional(), + content: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), data: zModelWithString.nullish() }).optional(), path: z.never().optional(), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/default/zod.gen.ts index 92fc8ee9f1..41bd2dada1 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.optional(z.array(zModelWithString)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.optional(z.array(zModelWithReadOnlyAndWriteOnly)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -1020,7 +1020,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.optional(z.array(zModelWithReadOnlyAndWriteOnlyWritable)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -1490,7 +1490,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.nullable(z.string()) }), @@ -1511,7 +1511,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.optional(z.never()), @@ -1543,7 +1543,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.optional(z.string()), + file: z.optional(z.union([z.instanceof(Blob), z.instanceof(File)])), metadata: z.optional(z.object({ foo: z.optional(z.string()), bar: z.optional(z.string()) @@ -1552,7 +1552,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.optional(z.object({ - content: z.optional(z.string()), + content: z.optional(z.union([z.instanceof(Blob), z.instanceof(File)])), data: z.nullish(zModelWithString) })), path: z.optional(z.never()), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/default/zod.gen.ts index 497cd4c1ba..06fbc37f45 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnly).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1020,7 +1020,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnlyWritable).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1490,7 +1490,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.string().nullable() }), @@ -1511,7 +1511,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.never().optional(), @@ -1543,7 +1543,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.string().optional(), + file: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), metadata: z.object({ foo: z.string().optional(), bar: z.string().optional() @@ -1552,7 +1552,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.object({ - content: z.string().optional(), + content: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), data: zModelWithString.nullish() }).optional(), path: z.never().optional(), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/default/zod.gen.ts index 1aec887d3a..fbbae01df8 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnly).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1020,7 +1020,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnlyWritable).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1490,7 +1490,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.string().nullable() }), @@ -1511,7 +1511,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.never().optional(), @@ -1543,7 +1543,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.string().optional(), + file: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), metadata: z.object({ foo: z.string().optional(), bar: z.string().optional() @@ -1552,7 +1552,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.object({ - content: z.string().optional(), + content: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), data: zModelWithString.nullish() }).optional(), path: z.never().optional(), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts index 1c82095287..8e81c57f77 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts @@ -63,7 +63,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -272,7 +272,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.optional(z.array(zModelWithString)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts index 9a52d13e94..35e8c5e3ae 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts @@ -63,7 +63,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -272,7 +272,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts index c8b413ed94..86bc0b1c4e 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts @@ -63,7 +63,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -272,7 +272,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/default/zod.gen.ts index b035545f74..e8ca647661 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.optional(z.array(zModelWithString)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.optional(z.array(zModelWithReadOnlyAndWriteOnly)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -1011,7 +1011,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.optional(z.array(zModelWithReadOnlyAndWriteOnlyWritable)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -1472,7 +1472,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.nullable(z.string()) }), @@ -1493,7 +1493,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.optional(z.never()), @@ -1525,7 +1525,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.optional(z.string()), + file: z.optional(z.union([z.instanceof(Blob), z.instanceof(File)])), metadata: z.optional(z.object({ foo: z.optional(z.string()), bar: z.optional(z.string()) @@ -1534,7 +1534,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.optional(z.object({ - content: z.optional(z.string()), + content: z.optional(z.union([z.instanceof(Blob), z.instanceof(File)])), data: z.nullish(zModelWithString) })), path: z.optional(z.never()), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/default/zod.gen.ts index d4b71b4c79..2bce7ae5cb 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnly).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1011,7 +1011,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnlyWritable).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1472,7 +1472,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.string().nullable() }), @@ -1493,7 +1493,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.never().optional(), @@ -1525,7 +1525,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.string().optional(), + file: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), metadata: z.object({ foo: z.string().optional(), bar: z.string().optional() @@ -1534,7 +1534,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.object({ - content: z.string().optional(), + content: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), data: zModelWithString.nullish() }).optional(), path: z.never().optional(), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/default/zod.gen.ts index 969175d39b..6e9e04d447 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnly).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1011,7 +1011,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnlyWritable).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1472,7 +1472,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.string().nullable() }), @@ -1493,7 +1493,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.never().optional(), @@ -1525,7 +1525,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.string().optional(), + file: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), metadata: z.object({ foo: z.string().optional(), bar: z.string().optional() @@ -1534,7 +1534,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.object({ - content: z.string().optional(), + content: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), data: zModelWithString.nullish() }).optional(), path: z.never().optional(), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/default/zod.gen.ts index 6343339340..5f28a7d31e 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.optional(z.array(zModelWithString)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.optional(z.array(zModelWithReadOnlyAndWriteOnly)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -1020,7 +1020,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.optional(z.array(zModelWithReadOnlyAndWriteOnlyWritable)), - propWithFile: z.optional(z.array(z.string())), + propWithFile: z.optional(z.array(z.union([z.instanceof(Blob), z.instanceof(File)]))), propWithNumber: z.optional(z.array(z.number())) }); @@ -1490,7 +1490,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.nullable(z.string()) }), @@ -1511,7 +1511,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.optional(z.never()), @@ -1543,7 +1543,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.optional(z.string()), + file: z.optional(z.union([z.instanceof(Blob), z.instanceof(File)])), metadata: z.optional(z.object({ foo: z.optional(z.string()), bar: z.optional(z.string()) @@ -1552,7 +1552,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.optional(z.object({ - content: z.optional(z.string()), + content: z.optional(z.union([z.instanceof(Blob), z.instanceof(File)])), data: z.nullish(zModelWithString) })), path: z.optional(z.never()), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/default/zod.gen.ts index 374d4eedcc..658804e5b0 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnly).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1020,7 +1020,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnlyWritable).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1490,7 +1490,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.string().nullable() }), @@ -1511,7 +1511,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.never().optional(), @@ -1543,7 +1543,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.string().optional(), + file: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), metadata: z.object({ foo: z.string().optional(), bar: z.string().optional() @@ -1552,7 +1552,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.object({ - content: z.string().optional(), + content: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), data: zModelWithString.nullish() }).optional(), path: z.never().optional(), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/string-with-format/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/string-with-format/zod.gen.ts index 812ba4f250..e834e6fec1 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/string-with-format/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/string-with-format/zod.gen.ts @@ -3,5 +3,5 @@ import { z } from 'zod/v3'; export const zFoo = z.object({ - foo: z.array(z.union([z.string(), z.string()])).optional() + foo: z.array(z.union([z.union([z.instanceof(Blob), z.instanceof(File)]), z.string()])).optional() }); diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/default/zod.gen.ts index 217db289ab..f63a9847ed 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/default/zod.gen.ts @@ -76,7 +76,7 @@ export const zNonAsciiStringæøåÆøÅöôêÊ字符串 = z.string(); /** * This is a simple file */ -export const zSimpleFile = z.string(); +export const zSimpleFile = z.union([z.instanceof(Blob), z.instanceof(File)]); /** * This is a simple string @@ -352,7 +352,7 @@ export const zModelWithNestedEnums = z.object({ */ export const zModelWithArray = z.object({ prop: z.array(zModelWithString).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -775,7 +775,7 @@ export const zModelWithReadOnlyAndWriteOnly = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnly = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnly).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1020,7 +1020,7 @@ export const zModelWithReadOnlyAndWriteOnlyWritable = z.object({ */ export const zModelWithArrayReadOnlyAndWriteOnlyWritable = z.object({ prop: z.array(zModelWithReadOnlyAndWriteOnlyWritable).optional(), - propWithFile: z.array(z.string()).optional(), + propWithFile: z.array(z.union([z.instanceof(Blob), z.instanceof(File)])).optional(), propWithNumber: z.array(z.number()).optional() }); @@ -1490,7 +1490,7 @@ export const zTypesResponse = z.union([ ]); export const zUploadFileData = z.object({ - body: z.string(), + body: z.union([z.instanceof(Blob), z.instanceof(File)]), path: z.object({ 'api-version': z.string().nullable() }), @@ -1511,7 +1511,7 @@ export const zFileResponseData = z.object({ /** * Success */ -export const zFileResponseResponse = z.string(); +export const zFileResponseResponse = z.union([z.instanceof(Blob), z.instanceof(File)]); export const zComplexTypesData = z.object({ body: z.never().optional(), @@ -1543,7 +1543,7 @@ export const zMultipartResponseData = z.object({ * OK */ export const zMultipartResponseResponse = z.object({ - file: z.string().optional(), + file: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), metadata: z.object({ foo: z.string().optional(), bar: z.string().optional() @@ -1552,7 +1552,7 @@ export const zMultipartResponseResponse = z.object({ export const zMultipartRequestData = z.object({ body: z.object({ - content: z.string().optional(), + content: z.union([z.instanceof(Blob), z.instanceof(File)]).optional(), data: zModelWithString.nullish() }).optional(), path: z.never().optional(), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/string-with-format/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/string-with-format/zod.gen.ts index e19b0d8561..d16f7fabc8 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/string-with-format/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/string-with-format/zod.gen.ts @@ -3,5 +3,5 @@ import * as z from 'zod'; export const zFoo = z.object({ - foo: z.array(z.union([z.string(), z.string()])).optional() + foo: z.array(z.union([z.union([z.instanceof(Blob), z.instanceof(File)]), z.string()])).optional() });