diff --git a/src/validators/password.validator.ts b/src/validators/password.validator.ts new file mode 100644 index 0000000..4828b60 --- /dev/null +++ b/src/validators/password.validator.ts @@ -0,0 +1,33 @@ +import { + registerDecorator, + ValidationOptions, + ValidatorConstraint, + ValidatorConstraintInterface, +} from 'class-validator'; + +@ValidatorConstraint({ async: false }) +export class IsPasswordStrongConstraint + implements ValidatorConstraintInterface +{ + validate(password: string) { + const regex = + /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/; + return regex.test(password); + } + + defaultMessage() { + return 'password must be at least 8 characters long and include at least one uppercase letter, one lowercase letter, one numeric digit, and one special character.'; + } +} + +export function IsPasswordStrong(validationOptions?: ValidationOptions) { + return function (object: Record, propertyName: string) { + registerDecorator({ + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + constraints: [], + validator: IsPasswordStrongConstraint, + }); + }; +}