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 | 1x 1x 69x 352x 1x 351x 351x 351x 1x 350x 1x 349x | import { FormGroup } from '@angular/forms'; import type { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; /** ValidationError property name for `confirmMatch` Validator. */ export const ERROR_NAME = 'confirmmatch'; /** * Requires that two controls have the same value to validate the FormGroup. * * Usage: * ``` * new FormGroup( * { * password1: new FormControl(null, [ Validators.required, Validators.minLength(num), Validators.maxLength(num) ]), * password2: new FormControl(null, [ Validators.required, Validators.minLength(num), Validators.maxLength(num) ]), * }, * { validators: confirmMatch('password1', 'password2') }, * ); * ``` */ export const confirmMatch = (password1: string, password2: string): ValidatorFn => // control: AbstractControl is required by the type ValidatorFn, but the actual expected type is FormGroup. (formGrp: AbstractControl): ValidationErrors | null => { if (!(formGrp instanceof FormGroup)) { throw new TypeError('Control must be an instance of FormGroup.'); } const control1 = formGrp.get(password1); const control2 = formGrp.get(password2); if (!control1) { throw new Error(`Cannot find FormControl named '${password1}'.`); } if (!control2) { throw new Error(`Cannot find FormControl named '${password2}'.`); } // eslint-disable-next-line unicorn/no-null -- ValidatorFn returns null return control1.value === control2.value ? null : { [ERROR_NAME]: true }; }; |