import { Injectable } from '@angular/core'; import { ValidatorFn } from '@angular/forms'; import { ComplexValidatorOptions } from '../../interfaces'; type simpleValidatorFn = (value: string) => boolean; @Injectable() export class ValidatorBuilder { simpleValidator(validator: simpleValidatorFn, errorMessage: string = 'unknown error'): ValidatorFn { return function({value}){ return validator(value) ? null : {error: errorMessage} } } complexValidator(options: ComplexValidatorOptions, errorMessage: string = 'unknown error'): ValidatorFn { const {digits,lowercase,uppercase} = options; return function(control){ const value: string = control.value; const tests = []; const digitReg = new RegExp(/\d/g) const lowercaseReg = new RegExp(/[a-z]/g) const uppercaseReg = new RegExp(/[A-Z]/g) digits.required && tests.push(digitReg.test(value)); digits.min && tests.push((value.match(digitReg) || []).length >= digits.min) digits.max && tests.push((value.match(digitReg) || []).length <= digits.max) lowercase.required && tests.push(lowercaseReg.test(value)); lowercase.min && tests.push((value.match(lowercaseReg) || []).length >= lowercase.min) lowercase.max && tests.push((value.match(lowercaseReg) || []).length <= lowercase.max) uppercase.required && tests.push(uppercaseReg.test(value)); uppercase.min && tests.push((value.match(uppercaseReg) || []).length >= uppercase.min) uppercase.max && tests.push((value.match(uppercaseReg) || []).length <= uppercase.max); console.log(tests); const isPassed = tests.every(result => result); return isPassed ? null : {error: errorMessage}; } } }