fix(zod): generate z.union([z.instanceof(Blob), z.instanceof(File)]) for binary format#3627
fix(zod): generate z.union([z.instanceof(Blob), z.instanceof(File)]) for binary format#3627j-ibarra wants to merge 6 commits intohey-api:mainfrom
Conversation
|
|
|
Error agent completed without reporting progress |
|
@j-ibarra is attempting to deploy a commit to the Hey API Team on Vercel. A member of the Team first needs to authorize it. |
|
…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 hey-api#3408
- 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 hey-api#3431) - Apply parser fix for contentMediaType → binary format inference (backport from hey-api#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
16be560 to
06fe0ff
Compare
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.
@hey-api/codegen-core
@hey-api/json-schema-ref-parser
@hey-api/nuxt
@hey-api/openapi-ts
@hey-api/shared
@hey-api/types
@hey-api/vite-plugin
commit: |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #3627 +/- ##
==========================================
- Coverage 38.99% 38.98% -0.02%
==========================================
Files 513 513
Lines 18768 18775 +7
Branches 5565 5562 -3
==========================================
Hits 7319 7319
- Misses 9252 9259 +7
Partials 2197 2197
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
@mrlubos can you check this please! |

Summary
Fields with
format: 'binary'(produced e.g. bycontentMediaType: 'application/octet-stream'in OpenAPI 3.1, as emitted by FastAPI ≥ 0.129.1) were generatingz.string()in all three Zod plugin variants (v3, v4, mini) because theformatNodeswitch had no'binary'case.This PR adds the missing case to produce
z.union([z.instanceof(Blob), z.instanceof(File)]), which mirrors what the TypeScript plugin already generates (Blob | File) and correctly validates file upload fields at runtime.Before:
After:
Changes
constants.ts— addinstanceofidentifierv3/toAst/string.ts— add'binary'case toformatNodev4/toAst/string.ts— add'binary'case toformatNodemini/toAst/string.ts— add'binary'case toformatNodeRelated issues
[ZOD] Incorrect schema creation for binary filesbinarystring OpenAPI types usingz.file()in zod v4 #2446 —Export binary string types using z.file() in zod v4. This PR usesz.instanceof(Blob/File)instead ofz.file()because it works uniformly across all three Zod plugin variants (v3, v4, mini). A follow-up could addz.file()specifically for the v4 variant if desired.schema property not generatingBlob | File` for multipart/form-data uploads #3408 —contentMediaType schema property not generating Blob | File. The TypeScript side was fixed by fix: generateBlob | FileforcontentMediaTypeschema property in OpenAPI 3.1 #3431; this PR completes the fix for the Zod plugin side.fix(plugins/zod): fix support for string types in binary format. Similar fix, but this PR is based on the current main, covers all three Zod variants (v3, v4, mini), and includes updated snapshot tests.Test plan
@test/openapi-ts,@test/openapi-ts-zod-v3, and@test/openapi-ts-zod-v4content-binary.json+ zod andcontent-media-type.yaml+ zodz.instanceof(Blob/File)for binary fields