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 2ee3cacfe5..fd5a4f3a16 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,22 @@ 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..26ce70a46a --- /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 * as z from 'zod'; + +export const zGetFooData = z.object({ + body: z.never().optional(), + path: z.never().optional(), + query: z.never().optional() +}); + +export const zGetFooResponse = z.string(); + +export const zGetBarData = z.object({ + 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/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..984b27838b --- /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 * as 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: zFileUploadRequest.optional(), + path: z.never().optional(), + query: z.never().optional() +}); + +export const zUploadFileTypedData = z.object({ + 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/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()]))) }); 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() }); 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 be1dda9cc3..2b64ed17f1 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': {