From 8aee3fc9c3b60537129299ea02033200f44c2c61 Mon Sep 17 00:00:00 2001 From: unnoq Date: Mon, 10 Mar 2025 19:55:22 +0700 Subject: [PATCH] fix(zod): apply` propertyNames` to string schemas in JSON Schema generation --- packages/zod/src/converter.test.ts | 5 +++++ packages/zod/src/converter.ts | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/zod/src/converter.test.ts b/packages/zod/src/converter.test.ts index a10707051..51a414266 100644 --- a/packages/zod/src/converter.test.ts +++ b/packages/zod/src/converter.test.ts @@ -405,6 +405,11 @@ const edgeCases: SchemaTestCase[] = [ input: [true, { type: 'object', additionalProperties: { type: 'string' }, propertyNames: { type: 'number' } }], ignoreZodToJsonSchema: true, }, + { + schema: z.record(z.string().date(), z.string()), + input: [true, { type: 'object', additionalProperties: { type: 'string' }, propertyNames: { type: 'string', format: 'date' } }], + ignoreZodToJsonSchema: true, + }, ] describe.each([ diff --git a/packages/zod/src/converter.ts b/packages/zod/src/converter.ts index f8b72cbd4..f63d99d43 100644 --- a/packages/zod/src/converter.ts +++ b/packages/zod/src/converter.ts @@ -413,10 +413,9 @@ export class ZodToJsonSchemaConverter implements ConditionalSchemaConverter { const json: JSONSchema = { type: 'object' } - const keyTypeName = this.#getZodTypeName(schema_._def.keyType._def) + const [__, keyJson] = this.convert(schema_._def.keyType, options, lazyDepth, false, false) - if (keyTypeName !== ZodFirstPartyTypeKind.ZodString) { - const [_, keyJson] = this.convert(schema_._def.keyType, options, lazyDepth, false, false) + if (Object.entries(keyJson).some(([k, v]) => k !== 'type' || v !== 'string')) { json.propertyNames = keyJson }