import { ValidationOptions } from '../ValidationOptions'; import { ValidationMetadataArgs } from '../../metadata/ValidationMetadataArgs'; import { ValidationTypes } from '../../validation/ValidationTypes'; import { ValidationMetadata } from '../../metadata/ValidationMetadata'; import { getMetadataStorage } from '../../metadata/MetadataStorage'; /** * Objects / object arrays marked with this decorator will also be validated. */ export function ValidateNested(validationOptions?: ValidationOptions): PropertyDecorator { const opts: ValidationOptions = { ...validationOptions }; const eachPrefix = opts.each ? 'each value in ' : ''; opts.message = opts.message || eachPrefix + 'nested property $property must be either object or array'; return function (object: object, propertyName: string): void { const args: ValidationMetadataArgs = { type: ValidationTypes.NESTED_VALIDATION, target: object.constructor, propertyName: propertyName, validationOptions: opts, }; getMetadataStorage().addValidationMetadata(new ValidationMetadata(args)); }; }