All files / src/app/core/validators password-validator.ts

70% Statements 28/40
54.83% Branches 17/31
100% Functions 1/1
100% Lines 27/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64            15x 17x   35x   37x 24x     13x   13x 15x 2x     13x 15x 1x     13x 15x 4x     13x 15x 3x     13x 15x 3x     13x 15x 4x     13x 13x 13x                            
import {
    AbstractControl,
    ValidationErrors,
    ValidatorFn,
  } from '@angular/forms';
  
  export const PasswordValidator: ValidatorFn = (
    control: AbstractControl
  ): ValidationErrors | null => {
    const value = control.value;
 
    if (!value) {
        return null;
    }
 
    let errors: string[] = [];
 
    const hasMinimumLength = value.length >= 8;
    if(!hasMinimumLength) {
        errors.push($localize `:@@error.password.too_short:too short (min 8 characters)`)
    }
 
    const hasMaximumLength = value.length <= 128;
    if(!hasMaximumLength) {
        errors.push($localize `:@@error.password.too_long:too long (max 128 characters)`)
    }
 
    const hasUpperCase = /[A-Z]+/.test(value);
    if(!hasUpperCase) {
        errors.push($localize `:@@error.password.uppercase:needs at least 1 uppercase character`);
    }
 
    const hasLowerCase = /[a-z]+/.test(value);
    if(!hasLowerCase) {
        errors.push($localize `:@@error.password.lowercase:needs at least 1 lowercase character`);
    }
 
    const hasNumeric = /[0-9]+/.test(value);
    if(!hasNumeric) {
        errors.push($localize `:@@error.password.digit:needs at least 1 digit`);
    }
 
    const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value);
    if(!hasSpecialChar) {
        errors.push($localize `:@@error.password.symbol:needs at least 1 symbol (!@#$%^&*(),.?":{}|<>)`);
    }
 
    const valid = hasMinimumLength && hasMaximumLength && hasUpperCase && hasLowerCase && hasNumeric && hasSpecialChar;
    const messages = !valid ? errors.join(', ') : '';
    return valid ? 
        null :
        {
            passwordStrength: {
                minimumLengthError: !hasMinimumLength,
                maximumLengthError: !hasMaximumLength,
                upperCaseError: !hasUpperCase,
                lowerCaseError: !hasLowerCase,
                numericError: !hasNumeric,
                specialCharError: !hasSpecialChar,
                message: messages.charAt(0).toUpperCase() + messages.slice(1)
            }
        }
  };