From c95222dd49952a2cff4fdd0ef66040a88e0f1c78 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 30 Mar 2026 14:29:26 +0900 Subject: [PATCH] Add ref zod issue --- .../changepack_log_RFrGmzUhQg013UxX2kc_T.json | 1 + packages/generator/src/generate-zod.ts | 53 ++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 .changepacks/changepack_log_RFrGmzUhQg013UxX2kc_T.json diff --git a/.changepacks/changepack_log_RFrGmzUhQg013UxX2kc_T.json b/.changepacks/changepack_log_RFrGmzUhQg013UxX2kc_T.json new file mode 100644 index 0000000..95cc74d --- /dev/null +++ b/.changepacks/changepack_log_RFrGmzUhQg013UxX2kc_T.json @@ -0,0 +1 @@ +{"changes":{"packages/generator/package.json":"Patch"},"note":"Fix ref zod issue","date":"2026-03-30T05:29:19.021573100Z"} \ No newline at end of file diff --git a/packages/generator/src/generate-zod.ts b/packages/generator/src/generate-zod.ts index a8a0257..59babd1 100644 --- a/packages/generator/src/generate-zod.ts +++ b/packages/generator/src/generate-zod.ts @@ -393,6 +393,8 @@ interface CollectedSchemas { requestSchemas: Record responseSchemas: Record errorSchemas: Record + /** Schemas referenced via $ref within category schemas but not themselves a category schema */ + dependencySchemas: Record pathMappings: Record< 'get' | 'post' | 'put' | 'delete' | 'patch', Record @@ -621,7 +623,45 @@ function generateSchemasForDocument( } } - return { requestSchemas, responseSchemas, errorSchemas, pathMappings } + // Collect all transitively referenced schemas from category schemas + const allCategoryNames = new Set([ + ...requestSchemaNames, + ...responseSchemaNames, + ...errorSchemaNames, + ]) + const allReferencedNames = new Set() + for (const schemaName of allCategoryNames) { + const schemaDef = schema.components?.schemas?.[schemaName] + if (schemaDef) { + collectSchemaNames( + schemaDef as OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject, + allReferencedNames, + { followComponentRefs: true, document: schema }, + ) + } + } + + // Generate dependency schemas (referenced via $ref but need _Name variables) + const dependencySchemas: Record = {} + for (const name of allReferencedNames) { + const schemaDef = schema.components?.schemas?.[name] + if (!schemaDef) continue + const schemaRef = schemaDef as + | OpenAPIV3_1.SchemaObject + | OpenAPIV3_1.ReferenceObject + dependencySchemas[name] = { + code: schemaToZod(schemaRef, schema, schemaRefs), + type: schemaToZodType(schemaRef, schema), + } + } + + return { + requestSchemas, + responseSchemas, + errorSchemas, + dependencySchemas, + pathMappings, + } } // ============================================================================= @@ -657,6 +697,17 @@ export function generateZodSchemas( for (const [serverName, collected] of Object.entries(serverSchemas)) { const safeServerName = serverName.replace(/[^a-zA-Z0-9]/g, '_') + // Dependency schemas (referenced via $ref, need _Name variables for z.lazy) + if (Object.keys(collected.dependencySchemas).length > 0) { + lines.push(`// Shared dependency schemas for ${serverName}`) + for (const [name, schemaInfo] of Object.entries( + collected.dependencySchemas, + )) { + lines.push(`const _${name} = ${schemaInfo.code};`) + } + lines.push('') + } + // Request schemas if (Object.keys(collected.requestSchemas).length > 0) { lines.push(`// Request schemas for ${serverName}`)