diff --git a/lib/services/schema-object-factory.ts b/lib/services/schema-object-factory.ts index eac18bf57..3b94b61d8 100644 --- a/lib/services/schema-object-factory.ts +++ b/lib/services/schema-object-factory.ts @@ -547,9 +547,11 @@ export class SchemaObjectFactory { ...omit(metadata, [...keysToRemove, ...keysToMove]), name: metadata.name || key, type: 'array', - items: isString(type) - ? { type, ...movedProperties } - : { ...type, ...movedProperties } + items: metadata.items + ? { ...(metadata.items as Record), ...movedProperties } + : isString(type) + ? { type, ...movedProperties } + : { ...type, ...movedProperties } }; schemaHost.items = omitBy(schemaHost.items, isUndefined); diff --git a/test/services/schema-object-factory.spec.ts b/test/services/schema-object-factory.spec.ts index f3ab1e63a..371a8713d 100644 --- a/test/services/schema-object-factory.spec.ts +++ b/test/services/schema-object-factory.spec.ts @@ -747,4 +747,76 @@ describe('SchemaObjectFactory', () => { }); }); }); + + describe('transformToArraySchemaProperty', () => { + it('should preserve items schema when metadata.items is already defined and type is string', () => { + const metadata = { + type: 'array', + isArray: true, + items: { + type: 'object', + additionalProperties: { + type: 'string', + enum: ['asc', 'desc'] + } + }, + example: [{ created_on: 'desc' }], + required: false + }; + + const result = schemaObjectFactory.transformToArraySchemaProperty( + metadata as any, + 'sort', + 'array' + ); + + expect(result.items).toEqual({ + type: 'object', + additionalProperties: { + type: 'string', + enum: ['asc', 'desc'] + } + }); + expect(result.type).toBe('array'); + expect(result.example).toEqual([{ created_on: 'desc' }]); + }); + + it('should use type parameter when metadata.items is not defined', () => { + const metadata = { + type: 'array', + isArray: true, + required: false + }; + + const result = schemaObjectFactory.transformToArraySchemaProperty( + metadata as any, + 'items', + 'string' + ); + + expect(result.items).toEqual({ type: 'string' }); + expect(result.type).toBe('array'); + }); + + it('should use type object when provided', () => { + const metadata = { + type: 'array', + isArray: true, + required: false + }; + + const result = schemaObjectFactory.transformToArraySchemaProperty( + metadata as any, + 'items', + { type: 'object', properties: { name: { type: 'string' } } } + ); + + expect(result.items).toEqual({ + type: 'object', + properties: { name: { type: 'string' } } + }); + expect(result.type).toBe('array'); + }); + }); }); +