import { registerDecorator, ValidationArguments, ValidationOptions, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator'; export function IsEmailOrEmptyCustom(validationOptions?: ValidationOptions) { return (object: any, propertyName: string) => { registerDecorator({ target: object.constructor, propertyName, options: validationOptions, // constraints: [], validator: IsEmailOrEmptyCustomConstraint, }); }; } @ValidatorConstraint({ name: 'IsEmailOrEmptyCustom' }) export class IsEmailOrEmptyCustomConstraint implements ValidatorConstraintInterface { validate(value: any, validationArguments?: ValidationArguments) { // #?!@$%^&*+-._ if (typeof value === "string" && value.match(/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i) !== null) { return true } else if (value == undefined || value === "" || value == null) { return true } else { return false } } defaultMessage(validationArguments?: ValidationArguments): string { // console.log(validationArguments) return "validation.INVALID_EMAIL" } }