From 0be2a7fed9765f0431ce595778a7bab9792a4e4d Mon Sep 17 00:00:00 2001 From: Hampus Date: Sat, 15 Aug 2026 21:01:43 +0200 Subject: [PATCH] feat(openapi): recognise the modern Zod integer formats (#1649) --- packages/openapi/src/converters/ZodInternals.ts | 2 ++ .../openapi/src/converters/ZodToOpenAPIIntrospection.ts | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/packages/openapi/src/converters/ZodInternals.ts b/packages/openapi/src/converters/ZodInternals.ts index 0552f1c64..607b798e9 100644 --- a/packages/openapi/src/converters/ZodInternals.ts +++ b/packages/openapi/src/converters/ZodInternals.ts @@ -74,6 +74,8 @@ interface ZodInternalDefinition { getter?: () => ZodTypeAny; pattern?: RegExp; transform?: (input: unknown) => unknown; + check?: string; + format?: string; } interface ZodInternalSchema { diff --git a/packages/openapi/src/converters/ZodToOpenAPIIntrospection.ts b/packages/openapi/src/converters/ZodToOpenAPIIntrospection.ts index ea3be86ac..586a5bc4f 100644 --- a/packages/openapi/src/converters/ZodToOpenAPIIntrospection.ts +++ b/packages/openapi/src/converters/ZodToOpenAPIIntrospection.ts @@ -258,6 +258,7 @@ export function extractStringConstraints(schema: ZodTypeAny): { if (stringProperties._regex != null) result.pattern = stringProperties._regex.source; return result; } +const INTEGER_NUMBER_FORMATS = new Set(['safeint', 'int32', 'uint32']); export function extractNumberConstraints(schema: ZodTypeAny): { minimum?: number; maximum?: number; @@ -277,6 +278,13 @@ export function extractNumberConstraints(schema: ZodTypeAny): { if (check.isInt === true) result.isInt = true; if (check.format != null) result.format = check.format; } + const definition = getZodDefinition(schema); + if (definition.check === 'number_format' && definition.format != null) { + result.format = definition.format; + if (INTEGER_NUMBER_FORMATS.has(definition.format)) { + result.isInt = true; + } + } return result; } export function getDefaultValue(schema: ZodTypeAny): unknown {