fix(schema): preserve items schema when metadata.items is already defined #3635
+77
−3
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
fix(schema): preserve items schema when metadata.items is already defined
Fixes transformToArraySchemaProperty overwriting existing items schema from zod-openapi generated classes, ensuring correct OpenAPI schemas.
PR Checklist
Please check if your PR fulfills the following requirements:
PR Type
What kind of change does this PR introduce?
What is the current behavior?
When using
@ApiQuery({ type: SomeClass })whereSomeClassis generated by libraries like@anatine/zod-openapithat pre-defineitemsschema in metadata,transformToArraySchemaPropertywas overwriting the existingitemsschema with{ type: 'array' }instead of preserving it.This occurred because when
typeparameter is the string'array', the function would create new items from the type parameter, ignoring the existingmetadata.itemsthat contained the correct schema definition.Example of incorrect output:
{ "schema": { "type": "array", "items": { "type": "array" } } }Issue Number: #3624
The
transformToArraySchemaPropertymethod now checks ifmetadata.itemsexists first. If it does, it preserves the existing items schema and merges it with moved properties (format, min/max, etc.). This ensures that pre-defined items schemas from zod-openapi and similar libraries are correctly preserved in the OpenAPI output.Example of correct output:
{ "schema": { "type": "array", "items": { "type": "object", "additionalProperties": { "type": "string", "enum": ["asc", "desc"] } } } }The fix is backward compatible - when
metadata.itemsis not defined, it falls back to the original behavior of creating items from thetypeparameter.Does this PR introduce a breaking change?
Other information
Test coverage:
test/services/schema-object-factory.spec.ts: