@spider-baby/utils-forms 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spider-baby-utils-forms-validators.mjs","sources":["../tmp-esm2022/validators/lib/numeric-validators.js","../tmp-esm2022/validators/lib/password-validators.js","../tmp-esm2022/validators/lib/pwd-regexes.js","../tmp-esm2022/validators/lib/phone-validators.js","../tmp-esm2022/validators/spider-baby-utils-forms-validators.js"],"sourcesContent":["//##########################//\nexport class NumericValidation {\n // Custom validator for password confirmation\n static lessThanValidator(minControlName, maxControlName, strictlyLessThan = true, errorMessage) {\n return (control) => {\n const minControl = control.get(minControlName);\n const maxControl = control.get(maxControlName);\n if (!minControl || !maxControl)\n return null;\n const minValue = Number(minControl.value);\n const maxValue = Number(maxControl.value);\n if (isNaN(minValue) || isNaN(maxValue))\n return null;\n if (minValue < maxValue)\n return null;\n if (!strictlyLessThan && minValue == maxValue)\n return null;\n return {\n minMaxError: {\n message: errorMessage ?? `${minControlName} must be less ${!strictlyLessThan ? 'or equal to' : ''} than ${maxControlName}`,\n code: 'minMaxError',\n minControlName,\n maxControlName\n }\n };\n };\n }\n} //Cls\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy12YWxpZGF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy91dGlscy9mb3Jtcy92YWxpZGF0b3JzL3NyYy9saWIvbnVtZXJpYy12YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSw4QkFBOEI7QUFFOUIsTUFBTSxPQUFPLGlCQUFpQjtJQUUxQiw2Q0FBNkM7SUFDN0MsTUFBTSxDQUFDLGlCQUFpQixDQUNwQixjQUFzQixFQUN0QixjQUFzQixFQUN0QixtQkFBNEIsSUFBSSxFQUNoQyxZQUFxQjtRQUVyQixPQUFPLENBQUMsT0FBd0IsRUFBaUMsRUFBRTtZQUMvRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVU7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDO1lBRWhCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUcxQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUNsQyxPQUFPLElBQUksQ0FBQztZQUVoQixJQUFJLFFBQVEsR0FBRyxRQUFRO2dCQUNuQixPQUFPLElBQUksQ0FBQztZQUVoQixJQUFJLENBQUMsZ0JBQWdCLElBQUksUUFBUSxJQUFJLFFBQVE7Z0JBQ3pDLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLE9BQU87Z0JBQ0gsV0FBVyxFQUFFO29CQUNULE9BQU8sRUFBRSxZQUFZLElBQUksR0FBRyxjQUFjLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUEsQ0FBQyxDQUFDLEVBQUUsVUFBVSxjQUFjLEVBQUU7b0JBQzFILElBQUksRUFBRSxhQUFhO29CQUNuQixjQUFjO29CQUNkLGNBQWM7aUJBQ2pCO2FBQ0osQ0FBQTtRQUNMLENBQUMsQ0FBQTtJQUVMLENBQUM7Q0FFSixDQUFDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWJzdHJhY3RDb250cm9sLFxyXG4gICAgVmFsaWRhdG9yRm5cclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5cclxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vXHJcblxyXG5cclxuaW50ZXJmYWNlIE1pbk1heFZhbGlkYXRpb25SZXN1bHQge1xyXG4gIG1pbk1heEVycm9yPzoge1xyXG4gICAgbWVzc2FnZTogc3RyaW5nO1xyXG4gICAgY29kZT86IHN0cmluZztcclxuICAgIG1pbkNvbnRyb2xOYW1lPzogc3RyaW5nO1xyXG4gICAgbWF4Q29udHJvbE5hbWU/OiBzdHJpbmc7XHJcbiAgfTtcclxufVxyXG5cclxuXHJcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMvL1xyXG5cclxuZXhwb3J0IGNsYXNzIE51bWVyaWNWYWxpZGF0aW9uIHtcclxuXHJcbiAgICAvLyBDdXN0b20gdmFsaWRhdG9yIGZvciBwYXNzd29yZCBjb25maXJtYXRpb25cclxuICAgIHN0YXRpYyBsZXNzVGhhblZhbGlkYXRvcihcclxuICAgICAgICBtaW5Db250cm9sTmFtZTogc3RyaW5nLFxyXG4gICAgICAgIG1heENvbnRyb2xOYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgc3RyaWN0bHlMZXNzVGhhbjogYm9vbGVhbiA9IHRydWUsXHJcbiAgICAgICAgZXJyb3JNZXNzYWdlPzogc3RyaW5nICk6IFZhbGlkYXRvckZuIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBNaW5NYXhWYWxpZGF0aW9uUmVzdWx0IHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbkNvbnRyb2wgPSBjb250cm9sLmdldChtaW5Db250cm9sTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heENvbnRyb2wgPSBjb250cm9sLmdldChtYXhDb250cm9sTmFtZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1pbkNvbnRyb2wgfHwgIW1heENvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKG1pbkNvbnRyb2wudmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IE51bWJlcihtYXhDb250cm9sLnZhbHVlKTtcclxuICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICBpZiAoaXNOYU4obWluVmFsdWUpIHx8IGlzTmFOKG1heFZhbHVlKSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1pblZhbHVlIDwgbWF4VmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICghc3RyaWN0bHlMZXNzVGhhbiAmJiBtaW5WYWx1ZSA9PSBtYXhWYWx1ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgbWluTWF4RXJyb3I6IHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UgPz8gYCR7bWluQ29udHJvbE5hbWV9IG11c3QgYmUgbGVzcyAkeyFzdHJpY3RseUxlc3NUaGFuID8gJ29yIGVxdWFsIHRvJzogJyd9ICB0aGFuICR7bWF4Q29udHJvbE5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnbWluTWF4RXJyb3InLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbkNvbnRyb2xOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heENvbnRyb2xOYW1lXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxufSAvL0Nsc1xyXG4iXX0=","import { Validators, } from '@angular/forms';\n//##########################//\nexport class PasswordValidation {\n static validationArray = (minLength = 6) => [\n Validators.required,\n Validators.minLength(minLength),\n PasswordValidation.hasLowercaseValidator(),\n PasswordValidation.hasUppercaseValidator(),\n PasswordValidation.hasNumberValidator(),\n PasswordValidation.hasNonAlphaNumericValidator(),\n ];\n //----------------------------//\n // Custom validator for password confirmation\n static matchValidator(passwordControlName = 'password', confirmPasswordControlName = 'confirmPassword', errorMessage = \"Passwords don't match\") {\n return (control) => {\n const password = control.get(passwordControlName);\n const confirmPassword = control.get(confirmPasswordControlName);\n if (!password || !confirmPassword)\n return null;\n return password.value === confirmPassword.value\n ? null\n : { passwordMismatch: errorMessage ?? \"Passwords don't match\" };\n };\n }\n //----------------------------//\n static patternValidator(regex, error) {\n return (control) => {\n // if control is empty return no error\n if (!control.value)\n return null;\n // test the value of the control against the regexp supplied\n const valid = regex.test(control.value);\n // if true, return no error (no error), else return error passed in the second parameter\n return valid ? null : error;\n };\n }\n //----------------------------//\n static hasUppercaseValidator() {\n return PasswordValidation.patternValidator(/[A-Z]/, {\n hasUpper: 'Password must contain at least 1 uppercase letter',\n });\n }\n //----------------------------//\n static hasLowercaseValidator() {\n return PasswordValidation.patternValidator(/[a-z]/, {\n hasLower: 'Password must contain at least 1 lowercase letter',\n });\n }\n //----------------------------//\n static hasNumberValidator() {\n return PasswordValidation.patternValidator(/\\d/, {\n hasNumber: 'Password must contain at least 1 number',\n });\n }\n //----------------------------//\n static hasNonAlphaNumericValidator() {\n return PasswordValidation.patternValidator(/\\W/, {\n hasNonAlpahaNumeric: 'Password must contain at least 1 non-alphanumeric character',\n });\n }\n} //Cls\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdXRpbHMvZm9ybXMvdmFsaWRhdG9ycy9zcmMvbGliL3Bhc3N3b3JkLXZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlILFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBV3hCLDhCQUE4QjtBQUU5QixNQUFNLE9BQU8sa0JBQWtCO0lBRTNCLE1BQU0sQ0FBQyxlQUFlLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QyxVQUFVLENBQUMsUUFBUTtRQUNuQixVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUMvQixrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRTtRQUMxQyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFBRTtRQUMxQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRTtRQUN2QyxrQkFBa0IsQ0FBQywyQkFBMkIsRUFBRTtLQUNuRCxDQUFBO0lBR0QsZ0NBQWdDO0lBR2hDLDZDQUE2QztJQUM3QyxNQUFNLENBQUMsY0FBYyxDQUNqQixzQkFBOEIsVUFBVSxFQUN4Qyw2QkFBcUMsaUJBQWlCLEVBQ3RELGVBQXVCLHVCQUF1QjtRQUU5QyxPQUFPLENBQUMsT0FBd0IsRUFBbUMsRUFBRTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbEQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBRWhFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxlQUFlO2dCQUM3QixPQUFPLElBQUksQ0FBQztZQUVoQixPQUFPLFFBQVEsQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLEtBQUs7Z0JBQzNDLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLFlBQVksSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQ3hFLENBQUMsQ0FBQTtJQUVMLENBQUM7SUFFRCxnQ0FBZ0M7SUFFaEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxLQUF1QjtRQUMxRCxPQUFPLENBQUMsT0FBd0IsRUFBaUMsRUFBRTtZQUMvRCxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRWhDLDREQUE0RDtZQUM1RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV4Qyx3RkFBd0Y7WUFDeEYsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxnQ0FBZ0M7SUFFaEMsTUFBTSxDQUFDLHFCQUFxQjtRQUN4QixPQUFPLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtZQUNoRCxRQUFRLEVBQUUsbURBQW1EO1NBQ2hFLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxnQ0FBZ0M7SUFFaEMsTUFBTSxDQUFDLHFCQUFxQjtRQUN4QixPQUFPLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtZQUNoRCxRQUFRLEVBQUUsbURBQW1EO1NBQ2hFLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxnQ0FBZ0M7SUFFaEMsTUFBTSxDQUFDLGtCQUFrQjtRQUNyQixPQUFPLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRTtZQUM3QyxTQUFTLEVBQUUseUNBQXlDO1NBQ3ZELENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxnQ0FBZ0M7SUFFaEMsTUFBTSxDQUFDLDJCQUEyQjtRQUM5QixPQUFPLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRTtZQUM3QyxtQkFBbUIsRUFDZiw2REFBNkQ7U0FDcEUsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztFQUdILEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgVmFsaWRhdG9yRm4sXHJcbiAgICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gICAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5cclxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vXHJcblxyXG5cclxuaW50ZXJmYWNlIFB3ZE1hdGNoVmFsaWRhdGlvblJlc3VsdCB7XHJcbiAgICBwYXNzd29yZE1pc21hdGNoPzogc3RyaW5nO1xyXG59XHJcblxyXG5cclxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vXHJcblxyXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRWYWxpZGF0aW9uIHtcclxuXHJcbiAgICBzdGF0aWMgdmFsaWRhdGlvbkFycmF5ID0gKG1pbkxlbmd0aCA9IDYpID0+IFtcclxuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoKG1pbkxlbmd0aCksXHJcbiAgICAgICAgUGFzc3dvcmRWYWxpZGF0aW9uLmhhc0xvd2VyY2FzZVZhbGlkYXRvcigpLFxyXG4gICAgICAgIFBhc3N3b3JkVmFsaWRhdGlvbi5oYXNVcHBlcmNhc2VWYWxpZGF0b3IoKSxcclxuICAgICAgICBQYXNzd29yZFZhbGlkYXRpb24uaGFzTnVtYmVyVmFsaWRhdG9yKCksXHJcbiAgICAgICAgUGFzc3dvcmRWYWxpZGF0aW9uLmhhc05vbkFscGhhTnVtZXJpY1ZhbGlkYXRvcigpLFxyXG4gICAgXVxyXG5cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xyXG5cclxuXHJcbiAgICAvLyBDdXN0b20gdmFsaWRhdG9yIGZvciBwYXNzd29yZCBjb25maXJtYXRpb25cclxuICAgIHN0YXRpYyBtYXRjaFZhbGlkYXRvcihcclxuICAgICAgICBwYXNzd29yZENvbnRyb2xOYW1lOiBzdHJpbmcgPSAncGFzc3dvcmQnLFxyXG4gICAgICAgIGNvbmZpcm1QYXNzd29yZENvbnRyb2xOYW1lOiBzdHJpbmcgPSAnY29uZmlybVBhc3N3b3JkJyxcclxuICAgICAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiUGFzc3dvcmRzIGRvbid0IG1hdGNoXCIpOiBWYWxpZGF0b3JGbiB7XHJcblxyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogUHdkTWF0Y2hWYWxpZGF0aW9uUmVzdWx0IHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gY29udHJvbC5nZXQocGFzc3dvcmRDb250cm9sTmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1QYXNzd29yZCA9IGNvbnRyb2wuZ2V0KGNvbmZpcm1QYXNzd29yZENvbnRyb2xOYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcGFzc3dvcmQgfHwgIWNvbmZpcm1QYXNzd29yZClcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHBhc3N3b3JkLnZhbHVlID09PSBjb25maXJtUGFzc3dvcmQudmFsdWVcclxuICAgICAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICAgICAgOiB7IHBhc3N3b3JkTWlzbWF0Y2g6IGVycm9yTWVzc2FnZSA/PyBcIlBhc3N3b3JkcyBkb24ndCBtYXRjaFwiIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xyXG5cclxuICAgIHN0YXRpYyBwYXR0ZXJuVmFsaWRhdG9yKHJlZ2V4OiBSZWdFeHAsIGVycm9yOiBWYWxpZGF0aW9uRXJyb3JzKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICAvLyBpZiBjb250cm9sIGlzIGVtcHR5IHJldHVybiBubyBlcnJvclxyXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgYWdhaW5zdCB0aGUgcmVnZXhwIHN1cHBsaWVkXHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gcmVnZXgudGVzdChjb250cm9sLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRydWUsIHJldHVybiBubyBlcnJvciAobm8gZXJyb3IpLCBlbHNlIHJldHVybiBlcnJvciBwYXNzZWQgaW4gdGhlIHNlY29uZCBwYXJhbWV0ZXJcclxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkID8gbnVsbCA6IGVycm9yO1xyXG4gICAgICAgIH07IFxyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXHJcblxyXG4gICAgc3RhdGljIGhhc1VwcGVyY2FzZVZhbGlkYXRvcigpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICAgICAgcmV0dXJuIFBhc3N3b3JkVmFsaWRhdGlvbi5wYXR0ZXJuVmFsaWRhdG9yKC9bQS1aXS8sIHtcclxuICAgICAgICAgICAgaGFzVXBwZXI6ICdQYXNzd29yZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSB1cHBlcmNhc2UgbGV0dGVyJyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xyXG5cclxuICAgIHN0YXRpYyBoYXNMb3dlcmNhc2VWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIHJldHVybiBQYXNzd29yZFZhbGlkYXRpb24ucGF0dGVyblZhbGlkYXRvcigvW2Etel0vLCB7XHJcbiAgICAgICAgICAgIGhhc0xvd2VyOiAnUGFzc3dvcmQgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgbG93ZXJjYXNlIGxldHRlcicsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cclxuXHJcbiAgICBzdGF0aWMgaGFzTnVtYmVyVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICAgICAgICByZXR1cm4gUGFzc3dvcmRWYWxpZGF0aW9uLnBhdHRlcm5WYWxpZGF0b3IoL1xcZC8sIHtcclxuICAgICAgICAgICAgaGFzTnVtYmVyOiAnUGFzc3dvcmQgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgbnVtYmVyJyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xyXG5cclxuICAgIHN0YXRpYyBoYXNOb25BbHBoYU51bWVyaWNWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIHJldHVybiBQYXNzd29yZFZhbGlkYXRpb24ucGF0dGVyblZhbGlkYXRvcigvXFxXLywge1xyXG4gICAgICAgICAgICBoYXNOb25BbHBhaGFOdW1lcmljOlxyXG4gICAgICAgICAgICAgICAgJ1Bhc3N3b3JkIG11c3QgY29udGFpbiBhdCBsZWFzdCAxIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyJyxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59IC8vQ2xzXHJcbiJdfQ==","export const StrongPassword6Regx = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d).{6,}$/;\nexport const StrongPassword6WithSpecialRegx = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]).{6,}$/;\nexport const StrongPassword8Regx = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d).{8,}$/;\nexport const StrongPassword8WithSpecialRegx = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]).{8,}$/;\nexport const StrongPassword10Regx = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d).{10,}$/;\nexport const StrongPassword10WithSpecialRegx = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]).{10,}$/;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHdkLXJlZ2V4ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3V0aWxzL2Zvcm1zL3ZhbGlkYXRvcnMvc3JjL2xpYi9wd2QtcmVnZXhlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FDOUIsa0RBQWtELENBQUE7QUFFcEQsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQ3pDLDJGQUEyRixDQUFBO0FBRTdGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUM5QixrREFBa0QsQ0FBQTtBQUVwRCxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FDekMsMkZBQTJGLENBQUE7QUFFN0YsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQy9CLG1EQUFtRCxDQUFBO0FBRXJELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUMxQyw0RkFBNEYsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBTdHJvbmdQYXNzd29yZDZSZWd4OiBSZWdFeHAgPVxyXG4gIC9eKD89W15BLVpdKltBLVpdKSg/PVteYS16XSpbYS16XSkoPz1cXEQqXFxkKS57Nix9JC9cclxuXHJcbmV4cG9ydCBjb25zdCBTdHJvbmdQYXNzd29yZDZXaXRoU3BlY2lhbFJlZ3g6IFJlZ0V4cCA9XHJcbiAgL14oPz1bXkEtWl0qW0EtWl0pKD89W15hLXpdKlthLXpdKSg/PVxcRCpcXGQpKD89LipbIUAjJCVeJiooKV8rXFwtPVtcXF17fTsnOlwiXFxcXHwsLjw+Lz9dKS57Nix9JC9cclxuXHJcbmV4cG9ydCBjb25zdCBTdHJvbmdQYXNzd29yZDhSZWd4OiBSZWdFeHAgPVxyXG4gIC9eKD89W15BLVpdKltBLVpdKSg/PVteYS16XSpbYS16XSkoPz1cXEQqXFxkKS57OCx9JC9cclxuXHJcbmV4cG9ydCBjb25zdCBTdHJvbmdQYXNzd29yZDhXaXRoU3BlY2lhbFJlZ3g6IFJlZ0V4cCA9XHJcbiAgL14oPz1bXkEtWl0qW0EtWl0pKD89W15hLXpdKlthLXpdKSg/PVxcRCpcXGQpKD89LipbIUAjJCVeJiooKV8rXFwtPVtcXF17fTsnOlwiXFxcXHwsLjw+Lz9dKS57OCx9JC9cclxuXHJcbmV4cG9ydCBjb25zdCBTdHJvbmdQYXNzd29yZDEwUmVneDogUmVnRXhwID1cclxuICAvXig/PVteQS1aXSpbQS1aXSkoPz1bXmEtel0qW2Etel0pKD89XFxEKlxcZCkuezEwLH0kL1xyXG5cclxuZXhwb3J0IGNvbnN0IFN0cm9uZ1Bhc3N3b3JkMTBXaXRoU3BlY2lhbFJlZ3g6IFJlZ0V4cCA9XHJcbiAgL14oPz1bXkEtWl0qW0EtWl0pKD89W15hLXpdKlthLXpdKSg/PVxcRCpcXGQpKD89LipbIUAjJCVeJiooKV8rXFwtPVtcXF17fTsnOlwiXFxcXHwsLjw+Lz9dKS57MTAsfSQvXHJcblxyXG4iXX0=","import { ParseError, validatePhoneNumberLength } from 'libphonenumber-js';\n//##########################//\nexport class PhoneValidation {\n // Custom validator for password confirmation\n static validator(defaultCountry = 'IE') {\n return (control) => {\n const value = control.value;\n if (!value)\n return null;\n try {\n const result = validatePhoneNumberLength(value, defaultCountry);\n if (!result)\n return null; // valid length\n let reason = '';\n reason = ` : ${result}`;\n return {\n phoneNumber: {\n message: `Invalid phone number. Reason: ${reason}`,\n }\n };\n // return null; // valid\n }\n catch (error) {\n let reason = '';\n if (error instanceof ParseError)\n reason = ` : ${error.message}`;\n return {\n phoneNumber: {\n message: `Invalid phone number. Reason: ${reason}`,\n }\n };\n }\n };\n }\n} //Cls\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdXRpbHMvZm9ybXMvdmFsaWRhdG9ycy9zcmMvbGliL3Bob25lLXZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFlLFVBQVUsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBWXZGLDhCQUE4QjtBQUU5QixNQUFNLE9BQU8sZUFBZTtJQUV4Qiw2Q0FBNkM7SUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBOEIsSUFBSTtRQUMvQyxPQUFPLENBQUMsT0FBd0IsRUFBZ0MsRUFBRTtZQUM5RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxLQUFLO2dCQUNOLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLElBQUksQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBRWhFLElBQUksQ0FBQyxNQUFNO29CQUNQLE9BQU8sSUFBSSxDQUFDLENBQUMsZUFBZTtnQkFDaEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixNQUFNLEdBQUcsTUFBTSxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsT0FBTztvQkFDSCxXQUFXLEVBQUU7d0JBQ1QsT0FBTyxFQUFFLGlDQUFpQyxNQUFNLEVBQUU7cUJBQ3JEO2lCQUNKLENBQUM7Z0JBRUYsd0JBQXdCO1lBQzVCLENBQUM7WUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksS0FBSyxZQUFZLFVBQVU7b0JBQzNCLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsT0FBTztvQkFDSCxXQUFXLEVBQUU7d0JBQ1QsT0FBTyxFQUFFLGlDQUFpQyxNQUFNLEVBQUU7cUJBQ3JEO2lCQUNKLENBQUM7WUFDTixDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztDQUVKLENBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGRldkNvbnNvbGUgfSBmcm9tICdAc3BpZGVyLWJhYnkvZGV2LWNvbnNvbGUnO1xyXG5pbXBvcnQgeyBDb3VudHJ5Q29kZSwgUGFyc2VFcnJvciwgdmFsaWRhdGVQaG9uZU51bWJlckxlbmd0aCB9IGZyb20gJ2xpYnBob25lbnVtYmVyLWpzJztcclxuXHJcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMvL1xyXG5cclxuXHJcbmludGVyZmFjZSBQaG9uZVZhbGlkYXRpb25SZXN1bHQge1xyXG4gICAgcGhvbmVOdW1iZXI/OiB7XHJcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vXHJcblxyXG5leHBvcnQgY2xhc3MgUGhvbmVWYWxpZGF0aW9uIHtcclxuXHJcbiAgICAvLyBDdXN0b20gdmFsaWRhdG9yIGZvciBwYXNzd29yZCBjb25maXJtYXRpb25cclxuICAgIHN0YXRpYyB2YWxpZGF0b3IoZGVmYXVsdENvdW50cnk6IENvdW50cnlDb2RlID0gJ0lFJyk6IFZhbGlkYXRvckZuIHtcclxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFBob25lVmFsaWRhdGlvblJlc3VsdCB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XHJcbiAgICAgICAgICAgIGlmICghdmFsdWUpIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZVBob25lTnVtYmVyTGVuZ3RoKHZhbHVlLCBkZWZhdWx0Q291bnRyeSk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyB2YWxpZCBsZW5ndGhcclxuICAgICAgICAgICAgICAgIGxldCByZWFzb24gPSAnJztcclxuICAgICAgICAgICAgICAgIHJlYXNvbiA9IGAgOiAke3Jlc3VsdH1gO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCBwaG9uZSBudW1iZXIuIFJlYXNvbjogJHtyZWFzb259YCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHJldHVybiBudWxsOyAvLyB2YWxpZFxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlYXNvbiA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUGFyc2VFcnJvcilcclxuICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBgIDogJHtlcnJvci5tZXNzYWdlfWA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBJbnZhbGlkIHBob25lIG51bWJlci4gUmVhc29uOiAke3JlYXNvbn1gLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufSAvL0Nsc1xyXG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpZGVyLWJhYnktdXRpbHMtZm9ybXMtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdXRpbHMvZm9ybXMvdmFsaWRhdG9ycy9zcmMvc3BpZGVyLWJhYnktdXRpbHMtZm9ybXMtdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"spider-baby-utils-forms-validators.mjs","sources":["../../../../../libs/utils/forms/validators/src/lib/numeric-validators.ts","../../../../../libs/utils/forms/validators/src/lib/password-validators.ts","../../../../../libs/utils/forms/validators/src/lib/pwd-regexes.ts","../../../../../libs/utils/forms/validators/src/lib/phone-validators.ts","../../../../../libs/utils/forms/validators/src/spider-baby-utils-forms-validators.ts"],"sourcesContent":["import {\r\n AbstractControl,\r\n ValidatorFn\r\n} from '@angular/forms';\r\n\r\n\r\n//##########################//\r\n\r\n\r\ninterface MinMaxValidationResult {\r\n minMaxError?: {\r\n message: string;\r\n code?: string;\r\n minControlName?: string;\r\n maxControlName?: string;\r\n };\r\n}\r\n\r\n\r\n//##########################//\r\n\r\nexport class NumericValidation {\r\n\r\n // Custom validator for password confirmation\r\n static lessThanValidator(\r\n minControlName: string,\r\n maxControlName: string,\r\n strictlyLessThan: boolean = true,\r\n errorMessage?: string ): ValidatorFn {\r\n\r\n return (control: AbstractControl): MinMaxValidationResult | null => {\r\n const minControl = control.get(minControlName);\r\n const maxControl = control.get(maxControlName);\r\n\r\n if (!minControl || !maxControl)\r\n return null;\r\n\r\n const minValue = Number(minControl.value);\r\n const maxValue = Number(maxControl.value);\r\n \r\n\r\n if (isNaN(minValue) || isNaN(maxValue))\r\n return null;\r\n\r\n if (minValue < maxValue)\r\n return null;\r\n\r\n if (!strictlyLessThan && minValue == maxValue)\r\n return null;\r\n return {\r\n minMaxError: {\r\n message: errorMessage ?? `${minControlName} must be less ${!strictlyLessThan ? 'or equal to': ''} than ${maxControlName}`,\r\n code: 'minMaxError',\r\n minControlName,\r\n maxControlName\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n} //Cls\r\n","import {\r\n ValidatorFn,\r\n AbstractControl,\r\n ValidationErrors,\r\n Validators,\r\n} from '@angular/forms';\r\n\r\n\r\n//##########################//\r\n\r\n\r\ninterface PwdMatchValidationResult {\r\n passwordMismatch?: string;\r\n}\r\n\r\n\r\n//##########################//\r\n\r\nexport class PasswordValidation {\r\n\r\n static validationArray = (minLength = 6) => [\r\n Validators.required,\r\n Validators.minLength(minLength),\r\n PasswordValidation.hasLowercaseValidator(),\r\n PasswordValidation.hasUppercaseValidator(),\r\n PasswordValidation.hasNumberValidator(),\r\n PasswordValidation.hasNonAlphaNumericValidator(),\r\n ]\r\n\r\n\r\n //----------------------------//\r\n\r\n\r\n // Custom validator for password confirmation\r\n static matchValidator(\r\n passwordControlName: string = 'password',\r\n confirmPasswordControlName: string = 'confirmPassword',\r\n errorMessage: string = \"Passwords don't match\"): ValidatorFn {\r\n\r\n return (control: AbstractControl): PwdMatchValidationResult | null => {\r\n const password = control.get(passwordControlName);\r\n const confirmPassword = control.get(confirmPasswordControlName);\r\n\r\n if (!password || !confirmPassword)\r\n return null;\r\n\r\n return password.value === confirmPassword.value\r\n ? null\r\n : { passwordMismatch: errorMessage ?? \"Passwords don't match\" };\r\n }\r\n\r\n }\r\n\r\n //----------------------------//\r\n\r\n static patternValidator(regex: RegExp, error: ValidationErrors): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n // if control is empty return no error\r\n if (!control.value) return null;\r\n\r\n // test the value of the control against the regexp supplied\r\n const valid = regex.test(control.value);\r\n\r\n // if true, return no error (no error), else return error passed in the second parameter\r\n return valid ? null : error;\r\n }; \r\n }\r\n\r\n //----------------------------//\r\n\r\n static hasUppercaseValidator(): ValidatorFn {\r\n return PasswordValidation.patternValidator(/[A-Z]/, {\r\n hasUpper: 'Password must contain at least 1 uppercase letter',\r\n });\r\n }\r\n\r\n //----------------------------//\r\n\r\n static hasLowercaseValidator(): ValidatorFn {\r\n return PasswordValidation.patternValidator(/[a-z]/, {\r\n hasLower: 'Password must contain at least 1 lowercase letter',\r\n });\r\n }\r\n\r\n //----------------------------//\r\n\r\n static hasNumberValidator(): ValidatorFn {\r\n return PasswordValidation.patternValidator(/\\d/, {\r\n hasNumber: 'Password must contain at least 1 number',\r\n });\r\n }\r\n\r\n //----------------------------//\r\n\r\n static hasNonAlphaNumericValidator(): ValidatorFn {\r\n return PasswordValidation.patternValidator(/\\W/, {\r\n hasNonAlpahaNumeric:\r\n 'Password must contain at least 1 non-alphanumeric character',\r\n });\r\n }\r\n\r\n\r\n} //Cls\r\n","export const StrongPassword6Regx: RegExp =\r\n /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d).{6,}$/\r\n\r\nexport const StrongPassword6WithSpecialRegx: RegExp =\r\n /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]).{6,}$/\r\n\r\nexport const StrongPassword8Regx: RegExp =\r\n /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d).{8,}$/\r\n\r\nexport const StrongPassword8WithSpecialRegx: RegExp =\r\n /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]).{8,}$/\r\n\r\nexport const StrongPassword10Regx: RegExp =\r\n /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d).{10,}$/\r\n\r\nexport const StrongPassword10WithSpecialRegx: RegExp =\r\n /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]).{10,}$/\r\n\r\n","import { AbstractControl, ValidatorFn } from '@angular/forms';\r\nimport { devConsole } from '@spider-baby/dev-console';\r\nimport { CountryCode, ParseError, validatePhoneNumberLength } from 'libphonenumber-js';\r\n\r\n//##########################//\r\n\r\n\r\ninterface PhoneValidationResult {\r\n phoneNumber?: {\r\n message: string;\r\n }\r\n}\r\n\r\n\r\n//##########################//\r\n\r\nexport class PhoneValidation {\r\n\r\n // Custom validator for password confirmation\r\n static validator(defaultCountry: CountryCode = 'IE'): ValidatorFn {\r\n return (control: AbstractControl): PhoneValidationResult | null => {\r\n const value = control.value;\r\n if (!value) \r\n return null;\r\n try {\r\n const result = validatePhoneNumberLength(value, defaultCountry);\r\n \r\n if (!result)\r\n return null; // valid length\r\n let reason = '';\r\n reason = ` : ${result}`;\r\n return {\r\n phoneNumber: {\r\n message: `Invalid phone number. Reason: ${reason}`,\r\n }\r\n };\r\n\r\n // return null; // valid\r\n } catch (error: unknown) {\r\n let reason = '';\r\n if (error instanceof ParseError)\r\n reason = ` : ${error.message}`;\r\n return {\r\n phoneNumber: {\r\n message: `Invalid phone number. Reason: ${reason}`,\r\n }\r\n };\r\n }\r\n };\r\n }\r\n\r\n} //Cls\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { NgTemplateOutlet, isPlatformBrowser } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { input, Component, inject, PLATFORM_ID, Renderer2, ElementRef, Input, Directive, Injectable } from '@angular/core';
|
|
4
|
+
import * as i1 from '@angular/material/form-field';
|
|
5
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
4
6
|
import '@angular/forms';
|
|
5
7
|
import { filter } from 'rxjs';
|
|
6
8
|
import { startWith, map } from 'rxjs/operators';
|
|
@@ -8,8 +10,8 @@ import { startWith, map } from 'rxjs/operators';
|
|
|
8
10
|
class FirstErrorComponent {
|
|
9
11
|
control = input.required(...(ngDevMode ? [{ debugName: "control" }] : []));
|
|
10
12
|
customErrorTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "customErrorTemplate" }] : []));
|
|
11
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
12
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
13
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FirstErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
14
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: FirstErrorComponent, isStandalone: true, selector: "sb-first-error", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, customErrorTemplate: { classPropertyName: "customErrorTemplate", publicName: "customErrorTemplate", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
13
15
|
@if(control().errors?.['firstError']; as err) {
|
|
14
16
|
@if(customErrorTemplate(); as template){
|
|
15
17
|
<ng-container
|
|
@@ -25,7 +27,7 @@ class FirstErrorComponent {
|
|
|
25
27
|
}
|
|
26
28
|
`, isInline: true, styles: [":host{display:block;--error-color: var(--mat-sys-error, #d9534f)}.error{color:var(--error-color, #d9534f );font-size:.875rem;margin-top:.25rem;display:block;animation:fadeIn .3s ease-in}@keyframes fadeIn{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
27
29
|
}
|
|
28
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FirstErrorComponent, decorators: [{
|
|
29
31
|
type: Component,
|
|
30
32
|
args: [{ selector: 'sb-first-error', standalone: true, imports: [NgTemplateOutlet], template: `
|
|
31
33
|
@if(control().errors?.['firstError']; as err) {
|
|
@@ -42,7 +44,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
|
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
46
|
`, styles: [":host{display:block;--error-color: var(--mat-sys-error, #d9534f)}.error{color:var(--error-color, #d9534f );font-size:.875rem;margin-top:.25rem;display:block;animation:fadeIn .3s ease-in}@keyframes fadeIn{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}\n"] }]
|
|
45
|
-
}] });
|
|
47
|
+
}], propDecorators: { control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: true }] }], customErrorTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "customErrorTemplate", required: false }] }] } });
|
|
48
|
+
|
|
49
|
+
class FirstErrorMatComponent {
|
|
50
|
+
control = input.required(...(ngDevMode ? [{ debugName: "control" }] : []));
|
|
51
|
+
customErrorTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "customErrorTemplate" }] : []));
|
|
52
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FirstErrorMatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
53
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: FirstErrorMatComponent, isStandalone: true, selector: "sb-first-error-mat", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, customErrorTemplate: { classPropertyName: "customErrorTemplate", publicName: "customErrorTemplate", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
54
|
+
@if(control().errors?.['firstError']; as err) {
|
|
55
|
+
@if(customErrorTemplate(); as template){
|
|
56
|
+
<ng-container
|
|
57
|
+
[ngTemplateOutlet]="template"
|
|
58
|
+
[ngTemplateOutletContext]="{errorMessage: err}"/>
|
|
59
|
+
}@else {
|
|
60
|
+
<mat-error>{{err}}</mat-error>
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }] });
|
|
64
|
+
}
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FirstErrorMatComponent, decorators: [{
|
|
66
|
+
type: Component,
|
|
67
|
+
args: [{ selector: 'sb-first-error-mat', standalone: true, imports: [NgTemplateOutlet, MatFormFieldModule], template: `
|
|
68
|
+
@if(control().errors?.['firstError']; as err) {
|
|
69
|
+
@if(customErrorTemplate(); as template){
|
|
70
|
+
<ng-container
|
|
71
|
+
[ngTemplateOutlet]="template"
|
|
72
|
+
[ngTemplateOutletContext]="{errorMessage: err}"/>
|
|
73
|
+
}@else {
|
|
74
|
+
<mat-error>{{err}}</mat-error>
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
`, styles: [":host{display:block}\n"] }]
|
|
78
|
+
}], propDecorators: { control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: true }] }], customErrorTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "customErrorTemplate", required: false }] }] } });
|
|
46
79
|
|
|
47
80
|
const errorMessageMap = new Map([
|
|
48
81
|
['required', (fieldName) => `${fieldName} is required.`],
|
|
@@ -181,7 +214,9 @@ class FormUtility {
|
|
|
181
214
|
return null;
|
|
182
215
|
}
|
|
183
216
|
//----------------------------//
|
|
184
|
-
static firstErrorKey = (control) => Object.keys(control.errors || {}).length > 0
|
|
217
|
+
static firstErrorKey = (control) => Object.keys(control.errors || {}).length > 0
|
|
218
|
+
? Object.keys(control.errors || {})[0]
|
|
219
|
+
: null;
|
|
185
220
|
} //Cls
|
|
186
221
|
|
|
187
222
|
/**
|
|
@@ -276,10 +311,10 @@ class FirstErrorDirective {
|
|
|
276
311
|
}
|
|
277
312
|
});
|
|
278
313
|
}
|
|
279
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
280
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
314
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FirstErrorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
315
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.6", type: FirstErrorDirective, isStandalone: true, selector: "[sbFormControlFirstError]", inputs: { sbFormControlFirstError: "sbFormControlFirstError", customErrorMessages: "customErrorMessages", showUntouched: "showUntouched" }, ngImport: i0 });
|
|
281
316
|
} //Cls
|
|
282
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
317
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: FirstErrorDirective, decorators: [{
|
|
283
318
|
type: Directive,
|
|
284
319
|
args: [{
|
|
285
320
|
selector: '[sbFormControlFirstError]',
|
|
@@ -296,10 +331,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
|
|
|
296
331
|
|
|
297
332
|
class RemoveNullsService {
|
|
298
333
|
remove = (obj) => RemoveNulls(obj, true);
|
|
299
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
300
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
334
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: RemoveNullsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
335
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: RemoveNullsService, providedIn: 'root' });
|
|
301
336
|
}
|
|
302
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: RemoveNullsService, decorators: [{
|
|
303
338
|
type: Injectable,
|
|
304
339
|
args: [{
|
|
305
340
|
providedIn: 'root',
|
|
@@ -332,5 +367,5 @@ function RemoveNulls(obj, iterate = true) {
|
|
|
332
367
|
* Generated bundle index. Do not edit.
|
|
333
368
|
*/
|
|
334
369
|
|
|
335
|
-
export { FirstErrorComponent, FirstErrorDirective, FormErrors, FormUtility, RemoveNulls, RemoveNullsService };
|
|
370
|
+
export { FirstErrorComponent, FirstErrorDirective, FirstErrorMatComponent, FormErrors, FormUtility, RemoveNulls, RemoveNullsService };
|
|
336
371
|
//# sourceMappingURL=spider-baby-utils-forms.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spider-baby-utils-forms.mjs","sources":["../tmp-esm2022/lib/first-error.component.js","../tmp-esm2022/lib/form-errors.js","../tmp-esm2022/lib/form-utility.js","../tmp-esm2022/lib/first-error.directive.js","../tmp-esm2022/lib/remove-nulls.service.js","../tmp-esm2022/spider-baby-utils-forms.js"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { Component, input } from \"@angular/core\";\nimport * as i0 from \"@angular/core\";\nexport class FirstErrorComponent {\n control = input.required(...(ngDevMode ? [{ debugName: \"control\" }] : []));\n customErrorTemplate = input(undefined, ...(ngDevMode ? [{ debugName: \"customErrorTemplate\" }] : []));\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: FirstErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });\n static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.1.2\", type: FirstErrorComponent, isStandalone: true, selector: \"sb-first-error\", inputs: { control: { classPropertyName: \"control\", publicName: \"control\", isSignal: true, isRequired: true, transformFunction: null }, customErrorTemplate: { classPropertyName: \"customErrorTemplate\", publicName: \"customErrorTemplate\", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `\r\n @if(control().errors?.['firstError']; as err) {\r\n @if(customErrorTemplate(); as template){\r\n <ng-container \r\n [ngTemplateOutlet]=\"template\" \r\n [ngTemplateOutletContext]=\"{errorMessage: err}\"/>\r\n }@else {\r\n <span class=\"error\" \r\n [attr.aria-live]=\"'polite'\"\r\n [attr.role]=\"'alert'\">\r\n {{err}}\r\n </span>\r\n }\r\n }\r\n `, isInline: true, styles: [\":host{display:block;--error-color: var(--mat-sys-error, #d9534f)}.error{color:var(--error-color, #d9534f );font-size:.875rem;margin-top:.25rem;display:block;animation:fadeIn .3s ease-in}@keyframes fadeIn{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}\\n\"], dependencies: [{ kind: \"directive\", type: NgTemplateOutlet, selector: \"[ngTemplateOutlet]\", inputs: [\"ngTemplateOutletContext\", \"ngTemplateOutlet\", \"ngTemplateOutletInjector\"] }] });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: FirstErrorComponent, decorators: [{\n type: Component,\n args: [{ selector: 'sb-first-error', standalone: true, imports: [NgTemplateOutlet], template: `\r\n @if(control().errors?.['firstError']; as err) {\r\n @if(customErrorTemplate(); as template){\r\n <ng-container \r\n [ngTemplateOutlet]=\"template\" \r\n [ngTemplateOutletContext]=\"{errorMessage: err}\"/>\r\n }@else {\r\n <span class=\"error\" \r\n [attr.aria-live]=\"'polite'\"\r\n [attr.role]=\"'alert'\">\r\n {{err}}\r\n </span>\r\n }\r\n }\r\n `, styles: [\":host{display:block;--error-color: var(--mat-sys-error, #d9534f)}.error{color:var(--error-color, #d9534f );font-size:.875rem;margin-top:.25rem;display:block;animation:fadeIn .3s ease-in}@keyframes fadeIn{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}\\n\"] }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyc3QtZXJyb3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy91dGlscy9mb3Jtcy9zcmMvbGliL2ZpcnN0LWVycm9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBZSxNQUFNLGVBQWUsQ0FBQzs7QUF5QzlELE1BQU0sT0FBTyxtQkFBbUI7SUFFOUIsT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLGtEQUFtQixDQUFDO0lBQzVDLG1CQUFtQixHQUFHLEtBQUssQ0FBbUMsU0FBUywrREFBQyxDQUFBO3VHQUg3RCxtQkFBbUI7MkZBQW5CLG1CQUFtQixxWEFsQ3BCOzs7Ozs7Ozs7Ozs7OztHQWNULHNXQWZTLGdCQUFnQjs7MkZBbUNmLG1CQUFtQjtrQkF0Qy9CLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsZ0JBQWdCLENBQUMsWUFDakI7Ozs7Ozs7Ozs7Ozs7O0dBY1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ItZmlyc3QtZXJyb3InLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW05nVGVtcGxhdGVPdXRsZXRdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICBAaWYoY29udHJvbCgpLmVycm9ycz8uWydmaXJzdEVycm9yJ107IGFzIGVycikge1xyXG4gICAgICAgQGlmKGN1c3RvbUVycm9yVGVtcGxhdGUoKTsgYXMgdGVtcGxhdGUpe1xyXG4gICAgICAgICA8bmctY29udGFpbmVyIFxyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIiBcclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ZXJyb3JNZXNzYWdlOiBlcnJ9XCIvPlxyXG4gICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxpdmVdPVwiJ3BvbGl0ZSdcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInYWxlcnQnXCI+XHJcbiAgICAgICAgICAgIHt7ZXJyfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgICA6aG9zdCB7XHJcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgIC0tZXJyb3ItY29sb3I6IHZhcigtLW1hdC1zeXMtZXJyb3IsICNkOTUzNGYpO1xyXG4gICAgfVxyXG4gICAgLmVycm9yIHtcclxuICAgICAgY29sb3I6IHZhcigtLWVycm9yLWNvbG9yLCAjZDk1MzRmICk7XHJcbiAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XHJcbiAgICAgIG1hcmdpbi10b3A6IDAuMjVyZW07XHJcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICBhbmltYXRpb246IGZhZGVJbiAwLjNzIGVhc2UtaW47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIEBrZXlmcmFtZXMgZmFkZUluIHtcclxuICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTsgfVxyXG4gICAgICB0byB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4gICAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaXJzdEVycm9yQ29tcG9uZW50IHtcclxuXHJcbiAgY29udHJvbCA9IGlucHV0LnJlcXVpcmVkPEFic3RyYWN0Q29udHJvbD4oKTtcclxuICBjdXN0b21FcnJvclRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcclxuXHJcbn0iXX0=","const errorMessageMap = new Map([\n ['required', (fieldName) => `${fieldName} is required.`],\n ['email', () => 'Please enter a valid email address.'],\n ['minlength', (fieldName, errorValue) => !errorValue ? 'Value is too short' : `${fieldName} must be at least ${errorValue?.requiredLength} characters.`],\n ['maxlength', (fieldName, errorValue) => !errorValue ? 'Value is too long' : `${fieldName} must be no more than ${errorValue?.requiredLength} characters.`],\n ['pattern', (fieldName) => `${fieldName} format is invalid.`],\n ['min', (fieldName, errorValue) => !errorValue ? 'Value is too small' : `${fieldName} must be at least ${errorValue?.min}.`],\n ['max', (fieldName, errorValue) => !errorValue ? 'Value is too large' : `${fieldName} must be no more than ${errorValue?.max}.`],\n ['passwordMismatch', () => 'Passwords do not match.'],\n ['mustMatch', () => 'Fields do not match.'],\n ['whitespace', (fieldName) => `${fieldName} cannot contain only whitespace.`],\n ['forbiddenValue', (fieldName, errorValue) => !errorValue ? 'This value is not allowed' : `${fieldName} cannot be \"${errorValue?.value}\".`],\n ['asyncValidation', (fieldName) => `${fieldName} validation is pending...`],\n ['invalidDate', () => 'Please enter a valid date.'],\n ['futureDate', () => 'Date must be in the future.'],\n ['pastDate', () => 'Date must be in the past.'],\n ['strongPassword', () => 'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character.'],\n ['phoneNumber', (fieldName, errorValue) => !errorValue.message ? 'Please enter a valid phone number.' : errorValue.message],\n ['url', () => 'Please enter a valid URL.'],\n ['unique', (fieldName) => `This ${fieldName.toLowerCase()} is already taken.`],\n ['fileSize', (fieldName, errorValue) => !errorValue ? 'File is too large' : `File size must be less than ${errorValue?.maxSize}.`],\n ['fileType', (fieldName, errorValue) => !errorValue ? 'Invalid file type' : `Only ${errorValue?.allowedTypes?.join(', ')} files are allowed.`]\n]);\n//##########################//\nexport class FormErrors {\n static setFirstErrors(form, customErrorMessages) {\n const controls = form.controls;\n for (const name in controls) {\n const control = controls[name];\n if (control.invalid)\n this.setFirstErrorMessage(name, control, customErrorMessages);\n }\n }\n //----------------------------// \n static setFirstErrorMessage(name, control, customErrorMessages) {\n const currentErrors = control.errors;\n const firstErrorMessage = FormErrors.getFirstErrorMessage(name, control, customErrorMessages);\n if (firstErrorMessage)\n control.setErrors({ ...currentErrors, firstError: firstErrorMessage }, { emitEvent: false } // This prevents statusChanges emission\n );\n }\n //----------------------------// \n static getFirstErrorMessage(name, control, customErrorMessages) {\n const errorKey = this.firstErrorKey(control);\n if (!errorKey)\n return null;\n const errorValue = control.errors?.[errorKey];\n const fieldName = this.toTitleCase(name);\n // Handle string error values (custom error messages)\n if (typeof errorValue === 'string')\n return errorValue;\n const errorMessageFn = customErrorMessages?.get(errorKey) ?? errorMessageMap.get(errorKey);\n // Get error message function and call it\n if (errorMessageFn)\n return errorMessageFn(fieldName, errorValue);\n // Fallback for unknown error types\n return `Invalid value for ${fieldName}.`;\n }\n //----------------------------//\n static firstErrorKey = (control) => Object.keys(control.errors || {}).length > 0 ? Object.keys(control.errors || {})[0] : null;\n //----------------------------//\n static toTitleCase(s) {\n const result = s.replace(/([A-Z])/g, ' $1');\n return result.charAt(0).toUpperCase() + result.slice(1);\n }\n} //Cls\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3V0aWxzL2Zvcm1zL3NyYy9saWIvZm9ybS1lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsTUFBTSxlQUFlLEdBQTBCLElBQUksR0FBRyxDQUErQjtJQUNqRixDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLGVBQWUsQ0FBQztJQUN4RCxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQztJQUN0RCxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLHFCQUFxQixVQUFVLEVBQUUsY0FBYyxjQUFjLENBQUM7SUFDeEosQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyx5QkFBeUIsVUFBVSxFQUFFLGNBQWMsY0FBYyxDQUFDO0lBQzNKLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMscUJBQXFCLENBQUM7SUFDN0QsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxxQkFBcUIsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQzVILENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMs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QUFXLENBQUMsQ0FBUztRQUNoQyxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0VBRUosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcblxyXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjLy9cclxuXHJcbmV4cG9ydCB0eXBlIEVycm9yTWVzc2FnZUZ1bmN0aW9uID0gKGZpZWxkTmFtZTogc3RyaW5nLCBlcnJvclZhbHVlOiBhbnkpID0+IHN0cmluZztcclxuZXhwb3J0IHR5cGUgQ3VzdG9tRXJyb3JNZXNzYWdlTWFwID0gTWFwPHN0cmluZywgRXJyb3JNZXNzYWdlRnVuY3Rpb24+O1xyXG5cclxuXHJcbmNvbnN0IGVycm9yTWVzc2FnZU1hcDogQ3VzdG9tRXJyb3JNZXNzYWdlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEVycm9yTWVzc2FnZUZ1bmN0aW9uPihbXHJcbiAgICBbJ3JlcXVpcmVkJywgKGZpZWxkTmFtZSkgPT4gYCR7ZmllbGROYW1lfSBpcyByZXF1aXJlZC5gXSxcclxuICAgIFsnZW1haWwnLCAoKSA9PiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy4nXSxcclxuICAgIFsnbWlubGVuZ3RoJywgKGZpZWxkTmFtZSwgZXJyb3JWYWx1ZSkgPT4gIWVycm9yVmFsdWUgPyAnVmFsdWUgaXMgdG9vIHNob3J0JyA6IGAke2ZpZWxkTmFtZX0gbXVzdCBiZSBhdCBsZWFzdCAke2Vycm9yVmFsdWU/LnJlcXVpcmVkTGVuZ3RofSBjaGFyYWN0ZXJzLmBdLFxyXG4gICAgWydtYXhsZW5ndGgnLCAoZmllbGROYW1lLCBlcnJvclZhbHVlKSA9PiAhZXJyb3JWYWx1ZSA/ICdWYWx1ZSBpcyB0b28gbG9uZycgOiBgJHtmaWVsZE5hbWV9IG11c3QgYmUgbm8gbW9yZSB0aGFuICR7ZXJyb3JWYWx1ZT8ucmVxdWlyZWRMZW5ndGh9IGNoYXJhY3RlcnMuYF0sXHJcbiAgICBbJ3BhdHRlcm4nLCAoZmllbGROYW1lKSA9PiBgJHtmaWVsZE5hbWV9IGZvcm1hdCBpcyBpbnZhbGlkLmBdLFxyXG4gICAgWydtaW4nLCAoZmllbGROYW1lLCBlcnJvclZhbHVlKSA9PiAhZXJyb3JWYWx1ZSA/ICdWYWx1ZSBpcyB0b28gc21hbGwnIDogYCR7ZmllbGROYW1lfSBtdXN0IGJlIGF0IGxlYXN0ICR7ZXJyb3JWYWx1ZT8ubWlufS5gXSxcclxuICAgIFsnbWF4JywgKGZpZWxkTmFtZSwgZXJyb3JWYWx1ZSkgPT4gIWVycm9yVmFsdWUgPyAnVmFsdWUgaXMgdG9vIGxhcmdlJyA6IGAke2ZpZWxkTmFtZX0gbXVzdCBiZSBubyBtb3JlIHRoYW4gJHtlcnJvclZhbHVlPy5tYXh9LmBdLFxyXG4gICAgWydwYXNzd29yZE1pc21hdGNoJywgKCkgPT4gJ1Bhc3N3b3JkcyBkbyBub3QgbWF0Y2guJ10sXHJcbiAgICBbJ211c3RNYXRjaCcsICgpID0+ICdGaWVsZHMgZG8gbm90IG1hdGNoLiddLFxyXG4gICAgWyd3aGl0ZXNwYWNlJywgKGZpZWxkTmFtZSkgPT4gYCR7ZmllbGROYW1lfSBjYW5ub3QgY29udGFpbiBvbmx5IHdoaXRlc3BhY2UuYF0sXHJcbiAgICBbJ2ZvcmJpZGRlblZhbHVlJywgKGZpZWxkTmFtZSwgZXJyb3JWYWx1ZSkgPT4gIWVycm9yVmFsdWUgPyAnVGhpcyB2YWx1ZSBpcyBub3QgYWxsb3dlZCcgOiBgJHtmaWVsZE5hbWV9IGNhbm5vdCBiZSBcIiR7ZXJyb3JWYWx1ZT8udmFsdWV9XCIuYF0sXHJcbiAgICBbJ2FzeW5jVmFsaWRhdGlvbicsIChmaWVsZE5hbWUpID0+IGAke2ZpZWxkTmFtZX0gdmFsaWRhdGlvbiBpcyBwZW5kaW5nLi4uYF0sXHJcbiAgICBbJ2ludmFsaWREYXRlJywgKCkgPT4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUuJ10sXHJcbiAgICBbJ2Z1dHVyZURhdGUnLCAoKSA9PiAnRGF0ZSBtdXN0IGJlIGluIHRoZSBmdXR1cmUuJ10sXHJcbiAgICBbJ3Bhc3REYXRlJywgKCkgPT4gJ0RhdGUgbXVzdCBiZSBpbiB0aGUgcGFzdC4nXSxcclxuICAgIFsnc3Ryb25nUGFzc3dvcmQnLCAoKSA9PiAnUGFzc3dvcmQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSB1cHBlcmNhc2UgbGV0dGVyLCBvbmUgbG93ZXJjYXNlIGxldHRlciwgb25lIG51bWJlciwgYW5kIG9uZSBzcGVjaWFsIGNoYXJhY3Rlci4nXSxcclxuICAgIFsncGhvbmVOdW1iZXInLCAoZmllbGROYW1lLCBlcnJvclZhbHVlKSA9PiAhZXJyb3JWYWx1ZS5tZXNzYWdlID8gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIHBob25lIG51bWJlci4nIDogZXJyb3JWYWx1ZS5tZXNzYWdlXSxcclxuICAgIFsndXJsJywgKCkgPT4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTC4nXSxcclxuICAgIFsndW5pcXVlJywgKGZpZWxkTmFtZSkgPT4gYFRoaXMgJHtmaWVsZE5hbWUudG9Mb3dlckNhc2UoKX0gaXMgYWxyZWFkeSB0YWtlbi5gXSxcclxuICAgIFsnZmlsZVNpemUnLCAoZmllbGROYW1lLCBlcnJvclZhbHVlKSA9PiAhZXJyb3JWYWx1ZSA/ICdGaWxlIGlzIHRvbyBsYXJnZScgOiBgRmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuICR7ZXJyb3JWYWx1ZT8ubWF4U2l6ZX0uYF0sXHJcbiAgICBbJ2ZpbGVUeXBlJywgKGZpZWxkTmFtZSwgZXJyb3JWYWx1ZSkgPT4gIWVycm9yVmFsdWUgPyAnSW52YWxpZCBmaWxlIHR5cGUnIDogYE9ubHkgJHtlcnJvclZhbHVlPy5hbGxvd2VkVHlwZXM/LmpvaW4oJywgJyl9IGZpbGVzIGFyZSBhbGxvd2VkLmBdXHJcbl0pO1xyXG5cclxuXHJcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMvL1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBGb3JtRXJyb3JzIHtcclxuXHJcblxyXG4gICAgc3RhdGljIHNldEZpcnN0RXJyb3JzKFxyXG4gICAgICAgIGZvcm06IEZvcm1Hcm91cCxcclxuICAgICAgICBjdXN0b21FcnJvck1lc3NhZ2VzPzogQ3VzdG9tRXJyb3JNZXNzYWdlTWFwKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gZm9ybS5jb250cm9sc1xyXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBjb250cm9scykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gY29udHJvbHNbbmFtZV1cclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wuaW52YWxpZClcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rmlyc3RFcnJvck1lc3NhZ2UobmFtZSwgY29udHJvbCwgY3VzdG9tRXJyb3JNZXNzYWdlcylcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vICAgIFxyXG5cclxuXHJcbiAgICBzdGF0aWMgc2V0Rmlyc3RFcnJvck1lc3NhZ2UoXHJcbiAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcclxuICAgICAgICBjdXN0b21FcnJvck1lc3NhZ2VzPzogQ3VzdG9tRXJyb3JNZXNzYWdlTWFwKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRFcnJvcnMgPSBjb250cm9sLmVycm9yc1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RXJyb3JNZXNzYWdlID0gRm9ybUVycm9ycy5nZXRGaXJzdEVycm9yTWVzc2FnZShuYW1lLCBjb250cm9sLCBjdXN0b21FcnJvck1lc3NhZ2VzKVxyXG4gICAgICAgIGlmIChmaXJzdEVycm9yTWVzc2FnZSlcclxuICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoXHJcbiAgICAgICAgICAgICAgICB7IC4uLmN1cnJlbnRFcnJvcnMsIGZpcnN0RXJyb3I6IGZpcnN0RXJyb3JNZXNzYWdlIH0sXHJcbiAgICAgICAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfSAgLy8gVGhpcyBwcmV2ZW50cyBzdGF0dXNDaGFuZ2VzIGVtaXNzaW9uXHJcbiAgICAgICAgICAgIClcclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLyAgICBcclxuXHJcblxyXG4gICAgc3RhdGljIGdldEZpcnN0RXJyb3JNZXNzYWdlKFxyXG4gICAgICAgIG5hbWU6IHN0cmluZyxcclxuICAgICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICAgICAgY3VzdG9tRXJyb3JNZXNzYWdlcz86IEN1c3RvbUVycm9yTWVzc2FnZU1hcCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgICAgICBjb25zdCBlcnJvcktleSA9IHRoaXMuZmlyc3RFcnJvcktleShjb250cm9sKVxyXG4gICAgICAgIGlmICghZXJyb3JLZXkpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcblxyXG5cclxuICAgICAgICBjb25zdCBlcnJvclZhbHVlID0gY29udHJvbC5lcnJvcnM/LltlcnJvcktleV1cclxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLnRvVGl0bGVDYXNlKG5hbWUpIFxyXG5cclxuICAgICAgICAvLyBIYW5kbGUgc3RyaW5nIGVycm9yIHZhbHVlcyAoY3VzdG9tIGVycm9yIG1lc3NhZ2VzKVxyXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JWYWx1ZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgIHJldHVybiBlcnJvclZhbHVlXHJcblxyXG5cclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VGbiA9IGN1c3RvbUVycm9yTWVzc2FnZXM/LmdldChlcnJvcktleSkgPz8gZXJyb3JNZXNzYWdlTWFwLmdldChlcnJvcktleSk7XHJcblxyXG5cclxuICAgICAgICAvLyBHZXQgZXJyb3IgbWVzc2FnZSBmdW5jdGlvbiBhbmQgY2FsbCBpdFxyXG4gICAgICAgIGlmIChlcnJvck1lc3NhZ2VGbilcclxuICAgICAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZUZuKGZpZWxkTmFtZSwgZXJyb3JWYWx1ZSlcclxuXHJcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIHVua25vd24gZXJyb3IgdHlwZXNcclxuICAgICAgICByZXR1cm4gYEludmFsaWQgdmFsdWUgZm9yICR7ZmllbGROYW1lfS5gXHJcbiAgICB9XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmlyc3RFcnJvcktleSA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBzdHJpbmcgfCBudWxsID0+XHJcbiAgICAgICAgT2JqZWN0LmtleXMoY29udHJvbC5lcnJvcnMgfHwge30pLmxlbmd0aCA+IDAgPyBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycyB8fCB7fSlbMF0gOiBudWxsO1xyXG5cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHRvVGl0bGVDYXNlKHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcy5yZXBsYWNlKC8oW0EtWl0pL2csICcgJDEnKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVzdWx0LnNsaWNlKDEpO1xyXG4gICAgfVxyXG5cclxufS8vQ2xzIl19","//##########################//\nexport class FormUtility {\n static findInvalidControlNames(form) {\n const invalid = new Set();\n const controls = form.controls;\n for (const name in controls) {\n if (controls[name].invalid)\n invalid.add(name);\n }\n return invalid;\n }\n //----------------------------//\n static findInvalidControlInfo(form) {\n const invalid = new Set();\n const controls = form.controls;\n for (const name in controls) {\n if (controls[name].invalid)\n invalid.add(`${name}: ${this.firstErrorKey(controls[name]) || 'Invalid'}`);\n }\n return invalid;\n }\n //----------------------------//\n static findInvalidControls(form) {\n const invalid = [];\n const controls = form.controls;\n for (const name in controls) {\n if (controls[name].invalid)\n invalid.push(controls[name]);\n }\n return invalid;\n }\n //----------------------------//\n static findInvalidControlsData(form) {\n const invalid = [];\n const controls = form.controls;\n for (const name in controls) {\n const control = controls[name];\n if (control.invalid)\n invalid.push({ name, control });\n }\n return invalid;\n }\n //----------------------------//\n static replaceNullWithUndefined(obj) {\n for (const [key, value] of Object.entries(obj)) {\n if (value === null)\n obj[key] = undefined;\n }\n return obj;\n }\n //----------------------------//\n static getFirstFormError(form) {\n if (form.valid)\n return null;\n // Check form-level errors first\n if (form.errors) {\n const firstKey = Object.keys(form.errors)[0];\n return { [firstKey]: form.errors[firstKey] };\n }\n // Check control-specific errors\n for (const key of Object.keys(form.controls)) {\n const control = form.get(key);\n if (control?.errors) {\n const errorKey = Object.keys(control.errors)[0];\n return { [errorKey]: control.errors[errorKey] };\n }\n }\n return null;\n }\n //----------------------------//\n static firstErrorKey = (control) => Object.keys(control.errors || {}).length > 0 ? Object.keys(control.errors || {})[0] : null;\n} //Cls\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS11dGlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy91dGlscy9mb3Jtcy9zcmMvbGliL2Zvcm0tdXRpbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSw4QkFBOEI7QUFFOUIsTUFBTSxPQUFPLFdBQVc7SUFFZixNQUFNLENBQUMsdUJBQXVCLENBQUMsSUFBZTtRQUVuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUE7UUFFOUIsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUM1QixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPO2dCQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JCLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsZ0NBQWdDO0lBRXpCLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFlO1FBRWxELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUE7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUU5QixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU87Z0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQzlFLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsZ0NBQWdDO0lBRXpCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFlO1FBRS9DLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FB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cm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEYXRhe1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XHJcbn1cclxuXHJcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMvL1xyXG5cclxuZXhwb3J0IGNsYXNzIEZvcm1VdGlsaXR5IHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBmaW5kSW52YWxpZENvbnRyb2xOYW1lcyhmb3JtOiBGb3JtR3JvdXApOiBTZXQ8c3RyaW5nPiB7XHJcblxyXG4gICAgY29uc3QgaW52YWxpZCA9IG5ldyBTZXQ8c3RyaW5nPigpXHJcbiAgICBjb25zdCBjb250cm9scyA9IGZvcm0uY29udHJvbHNcclxuXHJcbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gY29udHJvbHMpIHtcclxuICAgICAgaWYgKGNvbnRyb2xzW25hbWVdLmludmFsaWQpXHJcbiAgICAgICAgaW52YWxpZC5hZGQobmFtZSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW52YWxpZFxyXG4gIH1cclxuXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cclxuXHJcbiAgcHVibGljIHN0YXRpYyBmaW5kSW52YWxpZENvbnRyb2xJbmZvKGZvcm06IEZvcm1Hcm91cCk6IFNldDxzdHJpbmc+IHtcclxuXHJcbiAgICBjb25zdCBpbnZhbGlkID0gbmV3IFNldDxzdHJpbmc+KClcclxuICAgIGNvbnN0IGNvbnRyb2xzID0gZm9ybS5jb250cm9sc1xyXG5cclxuICAgIGZvciAoY29uc3QgbmFtZSBpbiBjb250cm9scykge1xyXG4gICAgICBpZiAoY29udHJvbHNbbmFtZV0uaW52YWxpZClcclxuICAgICAgICBpbnZhbGlkLmFkZChgJHtuYW1lfTogJHt0aGlzLmZpcnN0RXJyb3JLZXkoY29udHJvbHNbbmFtZV0pIHx8ICdJbnZhbGlkJ31gKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnZhbGlkXHJcbiAgfVxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xyXG5cclxuICBwdWJsaWMgc3RhdGljIGZpbmRJbnZhbGlkQ29udHJvbHMoZm9ybTogRm9ybUdyb3VwKTogQWJzdHJhY3RDb250cm9sW10ge1xyXG5cclxuICAgIGNvbnN0IGludmFsaWQgPSBbXVxyXG4gICAgY29uc3QgY29udHJvbHMgPSBmb3JtLmNvbnRyb2xzXHJcblxyXG4gICAgZm9yIChjb25zdCBuYW1lIGluIGNvbnRyb2xzKSB7XHJcbiAgICAgIGlmIChjb250cm9sc1tuYW1lXS5pbnZhbGlkKVxyXG4gICAgICAgIGludmFsaWQucHVzaChjb250cm9sc1tuYW1lXSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW52YWxpZFxyXG4gIH1cclxuXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cclxuXHJcbiAgcHVibGljIHN0YXRpYyBmaW5kSW52YWxpZENvbnRyb2xzRGF0YShmb3JtOiBGb3JtR3JvdXApOiBDb250cm9sRGF0YVtdIHtcclxuXHJcbiAgICBjb25zdCBpbnZhbGlkOiB7IG5hbWU6IHN0cmluZywgY29udHJvbDogQWJzdHJhY3RDb250cm9sIH1bXSA9IFtdO1xyXG4gICAgY29uc3QgY29udHJvbHMgPSBmb3JtLmNvbnRyb2xzXHJcblxyXG4gICAgZm9yIChjb25zdCBuYW1lIGluIGNvbnRyb2xzKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBjb250cm9sc1tuYW1lXVxyXG4gICAgICBpZiAoY29udHJvbC5pbnZhbGlkKVxyXG4gICAgICAgIGludmFsaWQucHVzaCh7IG5hbWUsIGNvbnRyb2wgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW52YWxpZFxyXG4gIH1cclxuXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cclxuXHJcblxyXG4gIHN0YXRpYyByZXBsYWNlTnVsbFdpdGhVbmRlZmluZWQob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xyXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIFxyXG4gICAgICAgIG9ialtrZXldID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXHJcblxyXG4gIHN0YXRpYyBnZXRGaXJzdEZvcm1FcnJvcihmb3JtOiBGb3JtR3JvdXApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoZm9ybS52YWxpZClcclxuICAgICAgcmV0dXJuIG51bGxcclxuXHJcbiAgICAvLyBDaGVjayBmb3JtLWxldmVsIGVycm9ycyBmaXJzdFxyXG4gICAgaWYgKGZvcm0uZXJyb3JzKSB7XHJcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gT2JqZWN0LmtleXMoZm9ybS5lcnJvcnMpWzBdXHJcbiAgICAgIHJldHVybiB7IFtmaXJzdEtleV06IGZvcm0uZXJyb3JzW2ZpcnN0S2V5XSB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgY29udHJvbC1zcGVjaWZpYyBlcnJvcnNcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChrZXkpXHJcbiAgICAgIGlmIChjb250cm9sPy5lcnJvcnMpIHtcclxuICAgICAgICBjb25zdCBlcnJvcktleSA9IE9iamVjdC5rZXlzKGNvbnRyb2wuZXJyb3JzKVswXVxyXG4gICAgICAgIHJldHVybiB7IFtlcnJvcktleV06IGNvbnRyb2wuZXJyb3JzW2Vycm9yS2V5XSB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cclxuXHJcbiAgc3RhdGljIGZpcnN0RXJyb3JLZXkgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogc3RyaW5nIHwgbnVsbCA9PlxyXG4gICAgT2JqZWN0LmtleXMoY29udHJvbC5lcnJvcnMgfHwge30pLmxlbmd0aCA+IDAgPyBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycyB8fCB7fSlbMF0gOiBudWxsO1xyXG5cclxuXHJcbn0vL0NscyJdfQ==","import { isPlatformBrowser } from '@angular/common';\nimport { Directive, ElementRef, inject, Input, PLATFORM_ID, Renderer2 } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { filter } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\nimport { FormErrors } from './form-errors';\nimport { FormUtility } from './form-utility';\nimport * as i0 from \"@angular/core\";\n/**\n * Directive: sbFormControlFirstError\n *\n * Automatically manages and displays the first validation error for each control in a FormGroup.\n * - Shows errors only after controls are touched (unless showUntouched is true)\n * - Dynamically adds blur/focusout listeners for untouched invalid controls\n * - Supports custom error messages via CustomErrorMessageMap\n * - Cleans up all listeners and subscriptions on destroy\n * - SSR-safe: all DOM access is guarded by isPlatformBrowser\n *\n * Limitations:\n * - Dynamic form changes (adding/removing controls at runtime) are NOT automatically handled in this version.\n * If you add or remove controls after initialization, you must manually re-run error setup logic.\n * (This feature is planned for a future release.)\n */\nexport class FirstErrorDirective {\n _platformId = inject(PLATFORM_ID);\n _renderer = inject(Renderer2);\n _host = inject(ElementRef);\n set sbFormControlFirstError(form) {\n this._form = form;\n this.observeValueChanges(this._form);\n }\n /**\n * Custom error messages map to override default error messages.\n * If map returns undefined for a specific error, the default message map will be used.\n */\n customErrorMessages;\n /**\n * If true, errors will be shown immediately for untouched controls.\n * If false, errors will only be shown after the control is touched.\n * Default is false.\n */\n showUntouched = false;\n //- - - - - - - - - - - - - - //\n _form;\n _vcSub;\n blurListeners = new Map();\n //----------------------------//\n ngOnDestroy() {\n this._vcSub?.unsubscribe();\n this.removeAllBlurListeners();\n }\n //----------------------------//\n addBlurListener(controlName, control) {\n // Find the input element by formControlName\n const input = this._host.nativeElement.querySelector(`[formControlName=\"${controlName}\"]`);\n if (!input)\n return;\n // Use Renderer2 to listen for 'focusout'\n const unlisten = this._renderer.listen(input, 'focusout', () => {\n if (!control.errors?.['firstError']) {\n FormErrors.setFirstErrorMessage(controlName, control, this.customErrorMessages);\n }\n // Remove the event listener after setting the error\n unlisten();\n this.blurListeners.delete(controlName);\n });\n this.blurListeners.set(controlName, unlisten);\n }\n //- - - - - - - - - - - - - - //\n removeAllBlurListeners() {\n for (const unlisten of this.blurListeners.values())\n unlisten();\n this.blurListeners.clear();\n }\n //----------------------------//\n observeValueChanges(form) {\n if (!isPlatformBrowser(this._platformId))\n return;\n this._vcSub?.unsubscribe();\n this._vcSub = form.statusChanges\n .pipe(startWith('PENDING'), // Start with non-Invalid so the first error will be set on blur if the user clicks input without entering any data\n filter(() => form.status === 'INVALID'), map(() => FormUtility.findInvalidControlsData(form)))\n .subscribe((invalidControlData) => {\n for (const controlData of invalidControlData) {\n const control = controlData.control;\n const name = controlData.name;\n // Skip if firstError is already set\n if (control.errors?.['firstError'])\n continue;\n if (this.showUntouched || control.touched) {\n FormErrors.setFirstErrorMessage(name, control, this.customErrorMessages);\n }\n else if (!control.touched) {\n // Add blur listener if not already present\n if (!this.blurListeners.has(name))\n this.addBlurListener(name, control);\n }\n }\n });\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: FirstErrorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.2\", type: FirstErrorDirective, isStandalone: true, selector: \"[sbFormControlFirstError]\", inputs: { sbFormControlFirstError: \"sbFormControlFirstError\", customErrorMessages: \"customErrorMessages\", showUntouched: \"showUntouched\" }, ngImport: i0 });\n} //Cls\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: FirstErrorDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[sbFormControlFirstError]',\n standalone: true\n }]\n }], propDecorators: { sbFormControlFirstError: [{\n type: Input,\n args: [{ required: true }]\n }], customErrorMessages: [{\n type: Input\n }], showUntouched: [{\n type: Input\n }] } });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyc3QtZXJyb3IuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy91dGlscy9mb3Jtcy9zcmMvbGliL2ZpcnN0LWVycm9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFtQixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBeUIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFHN0M7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFLSCxNQUFNLE9BQU8sbUJBQW1CO0lBRXRCLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixLQUFLLEdBQTRCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUc1RCxJQUErQix1QkFBdUIsQ0FBQyxJQUFlO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNNLG1CQUFtQixDQUF5QjtJQUVyRDs7OztPQUlHO0lBQ00sYUFBYSxHQUFZLEtBQUssQ0FBQztJQUV4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QyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzt1R0E5R1UsbUJBQW1COzJGQUFuQixtQkFBbUI7RUFnSC9CLEtBQUs7MkZBaEhPLG1CQUFtQjtrQkFKL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBUWdDLHVCQUF1QjtzQkFBckQsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBU2hCLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFPRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgUExBVEZPUk1fSUQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZmlsdGVyLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEN1c3RvbUVycm9yTWVzc2FnZU1hcCwgRm9ybUVycm9ycyB9IGZyb20gJy4vZm9ybS1lcnJvcnMnO1xyXG5pbXBvcnQgeyBGb3JtVXRpbGl0eSB9IGZyb20gJy4vZm9ybS11dGlsaXR5JztcclxuXHJcblxyXG4vKipcclxuICogRGlyZWN0aXZlOiBzYkZvcm1Db250cm9sRmlyc3RFcnJvclxyXG4gKlxyXG4gKiBBdXRvbWF0aWNhbGx5IG1hbmFnZXMgYW5kIGRpc3BsYXlzIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGVycm9yIGZvciBlYWNoIGNvbnRyb2wgaW4gYSBGb3JtR3JvdXAuXHJcbiAqIC0gU2hvd3MgZXJyb3JzIG9ubHkgYWZ0ZXIgY29udHJvbHMgYXJlIHRvdWNoZWQgKHVubGVzcyBzaG93VW50b3VjaGVkIGlzIHRydWUpXHJcbiAqIC0gRHluYW1pY2FsbHkgYWRkcyBibHVyL2ZvY3Vzb3V0IGxpc3RlbmVycyBmb3IgdW50b3VjaGVkIGludmFsaWQgY29udHJvbHNcclxuICogLSBTdXBwb3J0cyBjdXN0b20gZXJyb3IgbWVzc2FnZXMgdmlhIEN1c3RvbUVycm9yTWVzc2FnZU1hcFxyXG4gKiAtIENsZWFucyB1cCBhbGwgbGlzdGVuZXJzIGFuZCBzdWJzY3JpcHRpb25zIG9uIGRlc3Ryb3lcclxuICogLSBTU1Itc2FmZTogYWxsIERPTSBhY2Nlc3MgaXMgZ3VhcmRlZCBieSBpc1BsYXRmb3JtQnJvd3NlclxyXG4gKlxyXG4gKiBMaW1pdGF0aW9uczpcclxuICogLSBEeW5hbWljIGZvcm0gY2hhbmdlcyAoYWRkaW5nL3JlbW92aW5nIGNvbnRyb2xzIGF0IHJ1bnRpbWUpIGFyZSBOT1QgYXV0b21hdGljYWxseSBoYW5kbGVkIGluIHRoaXMgdmVyc2lvbi5cclxuICogICBJZiB5b3UgYWRkIG9yIHJlbW92ZSBjb250cm9scyBhZnRlciBpbml0aWFsaXphdGlvbiwgeW91IG11c3QgbWFudWFsbHkgcmUtcnVuIGVycm9yIHNldHVwIGxvZ2ljLlxyXG4gKiAgIChUaGlzIGZlYXR1cmUgaXMgcGxhbm5lZCBmb3IgYSBmdXR1cmUgcmVsZWFzZS4pXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tzYkZvcm1Db250cm9sRmlyc3RFcnJvcl0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIEZpcnN0RXJyb3JEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBwcml2YXRlIF9wbGF0Zm9ybUlkID0gaW5qZWN0KFBMQVRGT1JNX0lEKTtcclxuICBwcml2YXRlIF9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xyXG4gIHByaXZhdGUgX2hvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xyXG5cclxuXHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2V0IHNiRm9ybUNvbnRyb2xGaXJzdEVycm9yKGZvcm06IEZvcm1Hcm91cCkge1xyXG4gICAgdGhpcy5fZm9ybSA9IGZvcm1cclxuICAgIHRoaXMub2JzZXJ2ZVZhbHVlQ2hhbmdlcyh0aGlzLl9mb3JtKVxyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlcyBtYXAgdG8gb3ZlcnJpZGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlcy5cclxuICAgKiBJZiBtYXAgcmV0dXJucyB1bmRlZmluZWQgZm9yIGEgc3BlY2lmaWMgZXJyb3IsIHRoZSBkZWZhdWx0IG1lc3NhZ2UgbWFwIHdpbGwgYmUgdXNlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSBjdXN0b21FcnJvck1lc3NhZ2VzPzogQ3VzdG9tRXJyb3JNZXNzYWdlTWFwO1xyXG5cclxuICAvKipcclxuICAgKiBJZiB0cnVlLCBlcnJvcnMgd2lsbCBiZSBzaG93biBpbW1lZGlhdGVseSBmb3IgdW50b3VjaGVkIGNvbnRyb2xzLlxyXG4gICAqIElmIGZhbHNlLCBlcnJvcnMgd2lsbCBvbmx5IGJlIHNob3duIGFmdGVyIHRoZSBjb250cm9sIGlzIHRvdWNoZWQuXHJcbiAgICogRGVmYXVsdCBpcyBmYWxzZS5cclxuICAgKi9cclxuICBASW5wdXQoKSBzaG93VW50b3VjaGVkOiBib29sZWFuID0gZmFsc2U7IFxyXG5cclxuICAvLy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAvL1xyXG5cclxuICBwcml2YXRlIF9mb3JtPzogRm9ybUdyb3VwXHJcbiAgcHJpdmF0ZSBfdmNTdWI/OiBTdWJzY3JpcHRpb25cclxuICBwcml2YXRlIGJsdXJMaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgKCkgPT4gdm9pZD4oKVxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ZjU3ViPy51bnN1YnNjcmliZSgpXHJcbiAgICB0aGlzLnJlbW92ZUFsbEJsdXJMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXHJcblxyXG4gIHByaXZhdGUgYWRkQmx1ckxpc3RlbmVyKGNvbnRyb2xOYW1lOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHZvaWQge1xyXG5cclxuICAgIC8vIEZpbmQgdGhlIGlucHV0IGVsZW1lbnQgYnkgZm9ybUNvbnRyb2xOYW1lXHJcbiAgICBjb25zdCBpbnB1dDogSFRNTEVsZW1lbnQgfCBudWxsID0gdGhpcy5faG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtmb3JtQ29udHJvbE5hbWU9XCIke2NvbnRyb2xOYW1lfVwiXWApO1xyXG5cclxuICAgIGlmICghaW5wdXQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICAvLyBVc2UgUmVuZGVyZXIyIHRvIGxpc3RlbiBmb3IgJ2ZvY3Vzb3V0J1xyXG4gICAgY29uc3QgdW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oaW5wdXQsICdmb2N1c291dCcsICgpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLmVycm9ycz8uWydmaXJzdEVycm9yJ10pIHtcclxuICAgICAgICBGb3JtRXJyb3JzLnNldEZpcnN0RXJyb3JNZXNzYWdlKFxyXG4gICAgICAgICAgY29udHJvbE5hbWUsXHJcbiAgICAgICAgICBjb250cm9sLFxyXG4gICAgICAgICAgdGhpcy5jdXN0b21FcnJvck1lc3NhZ2VzXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBSZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIGFmdGVyIHNldHRpbmcgdGhlIGVycm9yXHJcbiAgICAgIHVubGlzdGVuKCk7XHJcbiAgICAgIHRoaXMuYmx1ckxpc3RlbmVycy5kZWxldGUoY29udHJvbE5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5ibHVyTGlzdGVuZXJzLnNldChjb250cm9sTmFtZSwgdW5saXN0ZW4pO1xyXG4gIH1cclxuXHJcbiAgLy8tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLy9cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVBbGxCbHVyTGlzdGVuZXJzKCkge1xyXG5cclxuICAgIGZvciAoY29uc3QgdW5saXN0ZW4gb2YgdGhpcy5ibHVyTGlzdGVuZXJzLnZhbHVlcygpKSBcclxuICAgICAgdW5saXN0ZW4oKVxyXG4gICAgXHJcbiAgICB0aGlzLmJsdXJMaXN0ZW5lcnMuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXHJcblxyXG5cclxuICBwcml2YXRlIG9ic2VydmVWYWx1ZUNoYW5nZXMoZm9ybTogRm9ybUdyb3VwKSB7XHJcblxyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLl9wbGF0Zm9ybUlkKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX3ZjU3ViPy51bnN1YnNjcmliZSgpXHJcbiAgICB0aGlzLl92Y1N1YiA9IGZvcm0uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBzdGFydFdpdGgoJ1BFTkRJTkcnKSwgLy8gU3RhcnQgd2l0aCBub24tSW52YWxpZCBzbyB0aGUgZmlyc3QgZXJyb3Igd2lsbCBiZSBzZXQgb24gYmx1ciBpZiB0aGUgdXNlciBjbGlja3MgaW5wdXQgd2l0aG91dCBlbnRlcmluZyBhbnkgZGF0YVxyXG4gICAgICAgIGZpbHRlcigoKSA9PiBmb3JtLnN0YXR1cyA9PT0gJ0lOVkFMSUQnKSxcclxuICAgICAgICBtYXAoKCkgPT4gRm9ybVV0aWxpdHkuZmluZEludmFsaWRDb250cm9sc0RhdGEoZm9ybSkpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoaW52YWxpZENvbnRyb2xEYXRhKSA9PiB7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbERhdGEgb2YgaW52YWxpZENvbnRyb2xEYXRhKSB7XHJcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gY29udHJvbERhdGEuY29udHJvbDtcclxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBjb250cm9sRGF0YS5uYW1lO1xyXG5cclxuICAgICAgICAgIC8vIFNraXAgaWYgZmlyc3RFcnJvciBpcyBhbHJlYWR5IHNldFxyXG4gICAgICAgICAgaWYgKGNvbnRyb2wuZXJyb3JzPy5bJ2ZpcnN0RXJyb3InXSlcclxuICAgICAgICAgICAgY29udGludWU7XHJcblxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnNob3dVbnRvdWNoZWQgfHwgY29udHJvbC50b3VjaGVkKSB7XHJcbiAgICAgICAgICAgIEZvcm1FcnJvcnMuc2V0Rmlyc3RFcnJvck1lc3NhZ2UobmFtZSwgY29udHJvbCwgdGhpcy5jdXN0b21FcnJvck1lc3NhZ2VzKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbnRyb2wudG91Y2hlZCkge1xyXG4gICAgICAgICAgICAvLyBBZGQgYmx1ciBsaXN0ZW5lciBpZiBub3QgYWxyZWFkeSBwcmVzZW50XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ibHVyTGlzdGVuZXJzLmhhcyhuYW1lKSkgXHJcbiAgICAgICAgICAgICAgdGhpcy5hZGRCbHVyTGlzdGVuZXIobmFtZSwgY29udHJvbCk7ICAgICAgICAgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbn0vL0Nsc1xyXG4iXX0=","import { Injectable } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nexport class RemoveNullsService {\n remove = (obj) => RemoveNulls(obj, true);\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: RemoveNullsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\n static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: RemoveNullsService, providedIn: 'root' });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.2\", ngImport: i0, type: RemoveNullsService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//==============================//\nexport function RemoveNulls(obj, iterate = true) {\n if (obj === null || obj === undefined)\n return obj;\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj\n .filter(item => item !== null && item !== undefined) // Remove null/undefined items\n .map(item => iterate && typeof item === 'object' ? RemoveNulls(item, iterate) : item);\n }\n // Handle non-objects (primitives)\n if (typeof obj !== 'object')\n return obj;\n const cleaned = structuredClone(obj);\n for (const key in cleaned) {\n if (cleaned[key] === null || cleaned[key] === undefined)\n delete cleaned[key];\n if (cleaned[key] instanceof Object && iterate)\n cleaned[key] = RemoveNulls(cleaned[key], iterate);\n }\n return cleaned;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlLW51bGxzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3V0aWxzL2Zvcm1zL3NyYy9saWIvcmVtb3ZlLW51bGxzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QixNQUFNLEdBQUcsQ0FBQyxHQUFNLEVBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7dUdBRm5DLGtCQUFrQjsyR0FBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBUUQsa0NBQWtDO0FBR2xDLE1BQU0sVUFBVSxXQUFXLENBQUksR0FBTSxFQUFFLE9BQU8sR0FBRyxJQUFJO0lBRW5ELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztRQUNuQyxPQUFPLEdBQUcsQ0FBQztJQUViLGdCQUFnQjtJQUNoQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEdBQUc7YUFDUCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyw4QkFBOEI7YUFDbEYsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFNLENBQUM7SUFDL0YsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFDekIsT0FBTyxHQUFHLENBQUM7SUFFYixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUUxQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVM7WUFDckQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksTUFBTSxJQUFJLE9BQU87WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFBO0FBRWhCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVtb3ZlTnVsbHNTZXJ2aWNlPFQ+IHtcclxuXHJcbiAgcmVtb3ZlID0gKG9iajogVCk6IFQgPT4gUmVtb3ZlTnVsbHMob2JqLCB0cnVlKVxyXG5cclxufSBcclxuXHJcblxyXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFJlbW92ZU51bGxzPFQ+KG9iajogVCwgaXRlcmF0ZSA9IHRydWUpOiBUIHtcclxuXHJcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZClcclxuICAgIHJldHVybiBvYmo7XHJcblxyXG4gIC8vIEhhbmRsZSBhcnJheXNcclxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XHJcbiAgICByZXR1cm4gb2JqXHJcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IHVuZGVmaW5lZCkgLy8gUmVtb3ZlIG51bGwvdW5kZWZpbmVkIGl0ZW1zXHJcbiAgICAgIC5tYXAoaXRlbSA9PiBpdGVyYXRlICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyA/IFJlbW92ZU51bGxzKGl0ZW0sIGl0ZXJhdGUpIDogaXRlbSkgYXMgVDtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBub24tb2JqZWN0cyAocHJpbWl0aXZlcylcclxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpXHJcbiAgICByZXR1cm4gb2JqO1xyXG5cclxuICBjb25zdCBjbGVhbmVkID0gc3RydWN0dXJlZENsb25lKG9iaik7XHJcblxyXG4gIGZvciAoY29uc3Qga2V5IGluIGNsZWFuZWQpIHtcclxuXHJcbiAgICBpZiAoY2xlYW5lZFtrZXldID09PSBudWxsIHx8IGNsZWFuZWRba2V5XSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICBkZWxldGUgY2xlYW5lZFtrZXldO1xyXG5cclxuICAgIGlmIChjbGVhbmVkW2tleV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgaXRlcmF0ZSlcclxuICAgICAgY2xlYW5lZFtrZXldID0gUmVtb3ZlTnVsbHMoY2xlYW5lZFtrZXldLCBpdGVyYXRlKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBjbGVhbmVkXHJcblxyXG59XHJcblxyXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpZGVyLWJhYnktdXRpbHMtZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3V0aWxzL2Zvcm1zL3NyYy9zcGlkZXItYmFieS11dGlscy1mb3Jtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ=="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"spider-baby-utils-forms.mjs","sources":["../../../../../libs/utils/forms/src/lib/first-error/first-error.component.ts","../../../../../libs/utils/forms/src/lib/first-error/first-error-mat.component.ts","../../../../../libs/utils/forms/src/lib/form-errors.ts","../../../../../libs/utils/forms/src/lib/form-utility.ts","../../../../../libs/utils/forms/src/lib/first-error/first-error.directive.ts","../../../../../libs/utils/forms/src/lib/remove-nulls.service.ts","../../../../../libs/utils/forms/src/spider-baby-utils-forms.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, input, TemplateRef } from \"@angular/core\";\r\nimport { AbstractControl } from \"@angular/forms\";\r\n\r\n@Component({\r\n selector: 'sb-first-error',\r\n standalone: true,\r\n imports: [NgTemplateOutlet],\r\n template: `\r\n @if(control().errors?.['firstError']; as err) {\r\n @if(customErrorTemplate(); as template){\r\n <ng-container \r\n [ngTemplateOutlet]=\"template\" \r\n [ngTemplateOutletContext]=\"{errorMessage: err}\"/>\r\n }@else {\r\n <span class=\"error\" \r\n [attr.aria-live]=\"'polite'\"\r\n [attr.role]=\"'alert'\">\r\n {{err}}\r\n </span>\r\n }\r\n }\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n --error-color: var(--mat-sys-error, #d9534f);\r\n }\r\n .error {\r\n color: var(--error-color, #d9534f );\r\n font-size: 0.875rem;\r\n margin-top: 0.25rem;\r\n display: block;\r\n animation: fadeIn 0.3s ease-in;\r\n }\r\n \r\n @keyframes fadeIn {\r\n from { opacity: 0; transform: translateY(-2px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n }\r\n `]\r\n})\r\nexport class FirstErrorComponent {\r\n\r\n control = input.required<AbstractControl>();\r\n customErrorTemplate = input<TemplateRef<unknown> | undefined>(undefined)\r\n\r\n}","import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, input, TemplateRef } from \"@angular/core\";\r\nimport { AbstractControl } from \"@angular/forms\";\r\nimport {MatFormFieldModule} from '@angular/material/form-field';\r\n\r\n@Component({\r\n selector: 'sb-first-error-mat',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, MatFormFieldModule],\r\n template: `\r\n @if(control().errors?.['firstError']; as err) {\r\n @if(customErrorTemplate(); as template){\r\n <ng-container \r\n [ngTemplateOutlet]=\"template\" \r\n [ngTemplateOutletContext]=\"{errorMessage: err}\"/>\r\n }@else {\r\n <mat-error>{{err}}</mat-error>\r\n }\r\n }\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n }\r\n `]\r\n})\r\nexport class FirstErrorMatComponent {\r\n\r\n control = input.required<AbstractControl>();\r\n customErrorTemplate = input<TemplateRef<unknown> | undefined>(undefined)\r\n\r\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { AbstractControl, FormGroup } from \"@angular/forms\";\r\n\r\n\r\n//##########################//\r\n\r\nexport type ErrorMessageFunction = (fieldName: string, errorValue: any) => string;\r\nexport type CustomErrorMessageMap = Map<string, ErrorMessageFunction>;\r\n\r\n\r\nconst errorMessageMap: CustomErrorMessageMap = new Map<string, ErrorMessageFunction>([\r\n ['required', (fieldName) => `${fieldName} is required.`],\r\n ['email', () => 'Please enter a valid email address.'],\r\n ['minlength', (fieldName, errorValue) => !errorValue ? 'Value is too short' : `${fieldName} must be at least ${errorValue?.requiredLength} characters.`],\r\n ['maxlength', (fieldName, errorValue) => !errorValue ? 'Value is too long' : `${fieldName} must be no more than ${errorValue?.requiredLength} characters.`],\r\n ['pattern', (fieldName) => `${fieldName} format is invalid.`],\r\n ['min', (fieldName, errorValue) => !errorValue ? 'Value is too small' : `${fieldName} must be at least ${errorValue?.min}.`],\r\n ['max', (fieldName, errorValue) => !errorValue ? 'Value is too large' : `${fieldName} must be no more than ${errorValue?.max}.`],\r\n ['passwordMismatch', () => 'Passwords do not match.'],\r\n ['mustMatch', () => 'Fields do not match.'],\r\n ['whitespace', (fieldName) => `${fieldName} cannot contain only whitespace.`],\r\n ['forbiddenValue', (fieldName, errorValue) => !errorValue ? 'This value is not allowed' : `${fieldName} cannot be \"${errorValue?.value}\".`],\r\n ['asyncValidation', (fieldName) => `${fieldName} validation is pending...`],\r\n ['invalidDate', () => 'Please enter a valid date.'],\r\n ['futureDate', () => 'Date must be in the future.'],\r\n ['pastDate', () => 'Date must be in the past.'],\r\n ['strongPassword', () => 'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character.'],\r\n ['phoneNumber', (fieldName, errorValue) => !errorValue.message ? 'Please enter a valid phone number.' : errorValue.message],\r\n ['url', () => 'Please enter a valid URL.'],\r\n ['unique', (fieldName) => `This ${fieldName.toLowerCase()} is already taken.`],\r\n ['fileSize', (fieldName, errorValue) => !errorValue ? 'File is too large' : `File size must be less than ${errorValue?.maxSize}.`],\r\n ['fileType', (fieldName, errorValue) => !errorValue ? 'Invalid file type' : `Only ${errorValue?.allowedTypes?.join(', ')} files are allowed.`]\r\n]);\r\n\r\n\r\n//##########################//\r\n\r\n\r\nexport class FormErrors {\r\n\r\n\r\n static setFirstErrors(\r\n form: FormGroup,\r\n customErrorMessages?: CustomErrorMessageMap): void {\r\n\r\n const controls = form.controls\r\n for (const name in controls) {\r\n const control = controls[name]\r\n if (control.invalid)\r\n this.setFirstErrorMessage(name, control, customErrorMessages)\r\n }\r\n }\r\n\r\n\r\n //----------------------------// \r\n\r\n\r\n static setFirstErrorMessage(\r\n name: string,\r\n control: AbstractControl,\r\n customErrorMessages?: CustomErrorMessageMap): void {\r\n\r\n const currentErrors = control.errors\r\n const firstErrorMessage = FormErrors.getFirstErrorMessage(name, control, customErrorMessages)\r\n if (firstErrorMessage)\r\n control.setErrors(\r\n { ...currentErrors, firstError: firstErrorMessage },\r\n { emitEvent: false } // This prevents statusChanges emission\r\n )\r\n\r\n }\r\n\r\n\r\n\r\n //----------------------------// \r\n\r\n\r\n static getFirstErrorMessage(\r\n name: string,\r\n control: AbstractControl,\r\n customErrorMessages?: CustomErrorMessageMap): string | null {\r\n\r\n const errorKey = this.firstErrorKey(control)\r\n if (!errorKey)\r\n return null\r\n\r\n\r\n const errorValue = control.errors?.[errorKey]\r\n const fieldName = this.toTitleCase(name) \r\n\r\n // Handle string error values (custom error messages)\r\n if (typeof errorValue === 'string')\r\n return errorValue\r\n\r\n\r\n const errorMessageFn = customErrorMessages?.get(errorKey) ?? errorMessageMap.get(errorKey);\r\n\r\n\r\n // Get error message function and call it\r\n if (errorMessageFn)\r\n return errorMessageFn(fieldName, errorValue)\r\n\r\n // Fallback for unknown error types\r\n return `Invalid value for ${fieldName}.`\r\n }\r\n\r\n //----------------------------//\r\n\r\n\r\n private static firstErrorKey = (control: AbstractControl): string | null =>\r\n Object.keys(control.errors || {}).length > 0 ? Object.keys(control.errors || {})[0] : null;\r\n\r\n\r\n //----------------------------//\r\n\r\n private static toTitleCase(s: string): string {\r\n const result = s.replace(/([A-Z])/g, ' $1');\r\n return result.charAt(0).toUpperCase() + result.slice(1);\r\n }\r\n\r\n}//Cls","import { AbstractControl, FormGroup } from \"@angular/forms\";\r\n\r\n//##########################//\r\n\r\nexport interface ControlData {\r\n name: string;\r\n control: AbstractControl;\r\n}\r\n\r\n//##########################//\r\n\r\nexport class FormUtility {\r\n\r\n public static findInvalidControlNames(form: FormGroup): Set<string> {\r\n\r\n const invalid = new Set<string>()\r\n const controls = form.controls\r\n\r\n for (const name in controls) {\r\n if (controls[name].invalid)\r\n invalid.add(name)\r\n }\r\n\r\n return invalid\r\n }\r\n\r\n //----------------------------//\r\n\r\n public static findInvalidControlInfo(form: FormGroup): Set<string> {\r\n\r\n const invalid = new Set<string>()\r\n const controls = form.controls\r\n\r\n for (const name in controls) {\r\n if (controls[name].invalid)\r\n invalid.add(`${name}: ${this.firstErrorKey(controls[name]) || 'Invalid'}`)\r\n }\r\n\r\n return invalid\r\n }\r\n\r\n //----------------------------//\r\n\r\n public static findInvalidControls(form: FormGroup): AbstractControl[] {\r\n\r\n const invalid = []\r\n const controls = form.controls\r\n\r\n for (const name in controls) {\r\n if (controls[name].invalid)\r\n invalid.push(controls[name])\r\n }\r\n\r\n return invalid\r\n }\r\n\r\n //----------------------------//\r\n\r\n public static findInvalidControlsData(form: FormGroup): ControlData[] {\r\n\r\n const invalid: { name: string, control: AbstractControl }[] = [];\r\n const controls = form.controls\r\n\r\n for (const name in controls) {\r\n const control = controls[name]\r\n if (control.invalid)\r\n invalid.push({ name, control })\r\n }\r\n\r\n return invalid\r\n }\r\n\r\n //----------------------------//\r\n\r\n\r\n static replaceNullWithUndefined(obj: Record<string, any>): Record<string, any> {\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value === null)\r\n obj[key] = undefined;\r\n }\r\n return obj;\r\n }\r\n\r\n //----------------------------//\r\n\r\n static getFirstFormError(form: FormGroup): Record<string, any> | null {\r\n \r\n if (form.valid)\r\n return null\r\n\r\n // Check form-level errors first\r\n if (form.errors) {\r\n const firstKey = Object.keys(form.errors)[0]\r\n return { [firstKey]: form.errors[firstKey] }\r\n }\r\n\r\n // Check control-specific errors\r\n for (const key of Object.keys(form.controls)) {\r\n const control = form.get(key)\r\n if (control?.errors) {\r\n const errorKey = Object.keys(control.errors)[0]\r\n return { [errorKey]: control.errors[errorKey] }\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n //----------------------------//\r\n\r\n static firstErrorKey = (control: AbstractControl): string | null =>\r\n Object.keys(control.errors || {}).length > 0\r\n ? Object.keys(control.errors || {})[0]\r\n : null;\r\n\r\n\r\n}//Cls","import { isPlatformBrowser } from '@angular/common';\r\nimport { Directive, ElementRef, inject, Input, OnDestroy, PLATFORM_ID, Renderer2 } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { filter, Subscription } from 'rxjs';\r\nimport { map, startWith } from 'rxjs/operators';\r\nimport { CustomErrorMessageMap, FormErrors } from '../form-errors';\r\nimport { FormUtility } from '../form-utility';\r\n\r\n\r\n/**\r\n * Directive: sbFormControlFirstError\r\n *\r\n * Automatically manages and displays the first validation error for each control in a FormGroup.\r\n * - Shows errors only after controls are touched (unless showUntouched is true)\r\n * - Dynamically adds blur/focusout listeners for untouched invalid controls\r\n * - Supports custom error messages via CustomErrorMessageMap\r\n * - Cleans up all listeners and subscriptions on destroy\r\n * - SSR-safe: all DOM access is guarded by isPlatformBrowser\r\n *\r\n * Limitations:\r\n * - Dynamic form changes (adding/removing controls at runtime) are NOT automatically handled in this version.\r\n * If you add or remove controls after initialization, you must manually re-run error setup logic.\r\n * (This feature is planned for a future release.)\r\n */\r\n@Directive({\r\n selector: '[sbFormControlFirstError]',\r\n standalone: true\r\n})\r\nexport class FirstErrorDirective implements OnDestroy {\r\n\r\n private _platformId = inject(PLATFORM_ID);\r\n private _renderer = inject(Renderer2);\r\n private _host: ElementRef<HTMLElement> = inject(ElementRef);\r\n\r\n\r\n @Input({ required: true }) set sbFormControlFirstError(form: FormGroup) {\r\n this._form = form\r\n this.observeValueChanges(this._form)\r\n }\r\n\r\n /** \r\n * Custom error messages map to override default error messages.\r\n * If map returns undefined for a specific error, the default message map will be used.\r\n */\r\n @Input() customErrorMessages?: CustomErrorMessageMap;\r\n\r\n /**\r\n * If true, errors will be shown immediately for untouched controls.\r\n * If false, errors will only be shown after the control is touched.\r\n * Default is false.\r\n */\r\n @Input() showUntouched: boolean = false; \r\n\r\n //- - - - - - - - - - - - - - //\r\n\r\n private _form?: FormGroup\r\n private _vcSub?: Subscription\r\n private blurListeners = new Map<string, () => void>()\r\n\r\n //----------------------------//\r\n\r\n ngOnDestroy(): void {\r\n this._vcSub?.unsubscribe()\r\n this.removeAllBlurListeners();\r\n }\r\n\r\n //----------------------------//\r\n\r\n private addBlurListener(controlName: string, control: AbstractControl): void {\r\n\r\n // Find the input element by formControlName\r\n const input: HTMLElement | null = this._host.nativeElement.querySelector(`[formControlName=\"${controlName}\"]`);\r\n\r\n if (!input)\r\n return;\r\n\r\n // Use Renderer2 to listen for 'focusout'\r\n const unlisten = this._renderer.listen(input, 'focusout', () => {\r\n if (!control.errors?.['firstError']) {\r\n FormErrors.setFirstErrorMessage(\r\n controlName,\r\n control,\r\n this.customErrorMessages\r\n );\r\n }\r\n // Remove the event listener after setting the error\r\n unlisten();\r\n this.blurListeners.delete(controlName);\r\n });\r\n\r\n this.blurListeners.set(controlName, unlisten);\r\n }\r\n\r\n //- - - - - - - - - - - - - - //\r\n\r\n private removeAllBlurListeners() {\r\n\r\n for (const unlisten of this.blurListeners.values()) \r\n unlisten()\r\n \r\n this.blurListeners.clear();\r\n }\r\n\r\n //----------------------------//\r\n\r\n\r\n private observeValueChanges(form: FormGroup) {\r\n\r\n if (!isPlatformBrowser(this._platformId))\r\n return;\r\n\r\n this._vcSub?.unsubscribe()\r\n this._vcSub = form.statusChanges\r\n .pipe(\r\n startWith('PENDING'), // Start with non-Invalid so the first error will be set on blur if the user clicks input without entering any data\r\n filter(() => form.status === 'INVALID'),\r\n map(() => FormUtility.findInvalidControlsData(form))\r\n )\r\n .subscribe((invalidControlData) => {\r\n\r\n for (const controlData of invalidControlData) {\r\n const control = controlData.control;\r\n const name = controlData.name;\r\n \r\n\r\n // Skip if firstError is already set\r\n if (control.errors?.['firstError'])\r\n continue;\r\n\r\n\r\n if (this.showUntouched || control.touched) {\r\n FormErrors.setFirstErrorMessage(name, control, this.customErrorMessages);\r\n } else if (!control.touched) {\r\n // Add blur listener if not already present\r\n if (!this.blurListeners.has(name)) \r\n this.addBlurListener(name, control); \r\n }\r\n }\r\n })\r\n }\r\n\r\n}//Cls\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RemoveNullsService<T> {\r\n\r\n remove = (obj: T): T => RemoveNulls(obj, true)\r\n\r\n} \r\n\r\n\r\n//==============================//\r\n\r\n\r\nexport function RemoveNulls<T>(obj: T, iterate = true): T {\r\n\r\n if (obj === null || obj === undefined)\r\n return obj;\r\n\r\n // Handle arrays\r\n if (Array.isArray(obj)) {\r\n return obj\r\n .filter(item => item !== null && item !== undefined) // Remove null/undefined items\r\n .map(item => iterate && typeof item === 'object' ? RemoveNulls(item, iterate) : item) as T;\r\n }\r\n\r\n // Handle non-objects (primitives)\r\n if (typeof obj !== 'object')\r\n return obj;\r\n\r\n const cleaned = structuredClone(obj);\r\n\r\n for (const key in cleaned) {\r\n\r\n if (cleaned[key] === null || cleaned[key] === undefined)\r\n delete cleaned[key];\r\n\r\n if (cleaned[key] instanceof Object && iterate)\r\n cleaned[key] = RemoveNulls(cleaned[key], iterate);\r\n }\r\n\r\n return cleaned\r\n\r\n}\r\n\r\n//==============================//","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spider-baby/utils-forms",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "A comprehensive Angular forms utility library for streamlined validation, error handling, and accessible error display.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -26,14 +26,14 @@
|
|
|
26
26
|
"types": "./index.d.ts",
|
|
27
27
|
"exports": {
|
|
28
28
|
".": {
|
|
29
|
-
"types": "./
|
|
29
|
+
"types": "./types/spider-baby-utils-forms.d.ts",
|
|
30
30
|
"default": "./fesm2022/spider-baby-utils-forms.mjs"
|
|
31
31
|
},
|
|
32
32
|
"./package.json": {
|
|
33
33
|
"default": "./package.json"
|
|
34
34
|
},
|
|
35
35
|
"./validators": {
|
|
36
|
-
"types": "./validators
|
|
36
|
+
"types": "./types/spider-baby-utils-forms-validators.d.ts",
|
|
37
37
|
"default": "./fesm2022/spider-baby-utils-forms-validators.mjs"
|
|
38
38
|
}
|
|
39
39
|
},
|
|
@@ -47,15 +47,16 @@
|
|
|
47
47
|
"README.md"
|
|
48
48
|
],
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@angular/core": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
|
|
51
|
-
"@angular/forms": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
|
|
52
|
-
"@angular/common": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
|
|
50
|
+
"@angular/core": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
51
|
+
"@angular/forms": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || >=21.0.0",
|
|
52
|
+
"@angular/common": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || >=21.0.0",
|
|
53
|
+
"@angular/material": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || >=21.0.0",
|
|
53
54
|
"rxjs": "~7.8.0",
|
|
54
55
|
"@spider-baby/dev-console": "^1.1.2 || ^2.0.0",
|
|
55
56
|
"libphonenumber-js": "^1.12.9"
|
|
56
57
|
},
|
|
57
58
|
"sideEffects": false,
|
|
58
|
-
"typings": "
|
|
59
|
+
"typings": "types/spider-baby-utils-forms.d.ts",
|
|
59
60
|
"dependencies": {
|
|
60
61
|
"tslib": "^2.3.0"
|
|
61
62
|
}
|
package/index.d.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { TemplateRef, OnDestroy } from '@angular/core';
|
|
3
|
-
import { AbstractControl, FormGroup } from '@angular/forms';
|
|
4
|
-
|
|
5
|
-
declare class FirstErrorComponent {
|
|
6
|
-
control: i0.InputSignal<AbstractControl<any, any, any>>;
|
|
7
|
-
customErrorTemplate: i0.InputSignal<TemplateRef<unknown> | undefined>;
|
|
8
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<FirstErrorComponent, never>;
|
|
9
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FirstErrorComponent, "sb-first-error", never, { "control": { "alias": "control"; "required": true; "isSignal": true; }; "customErrorTemplate": { "alias": "customErrorTemplate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
type ErrorMessageFunction = (fieldName: string, errorValue: any) => string;
|
|
13
|
-
type CustomErrorMessageMap = Map<string, ErrorMessageFunction>;
|
|
14
|
-
declare class FormErrors {
|
|
15
|
-
static setFirstErrors(form: FormGroup, customErrorMessages?: CustomErrorMessageMap): void;
|
|
16
|
-
static setFirstErrorMessage(name: string, control: AbstractControl, customErrorMessages?: CustomErrorMessageMap): void;
|
|
17
|
-
static getFirstErrorMessage(name: string, control: AbstractControl, customErrorMessages?: CustomErrorMessageMap): string | null;
|
|
18
|
-
private static firstErrorKey;
|
|
19
|
-
private static toTitleCase;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Directive: sbFormControlFirstError
|
|
24
|
-
*
|
|
25
|
-
* Automatically manages and displays the first validation error for each control in a FormGroup.
|
|
26
|
-
* - Shows errors only after controls are touched (unless showUntouched is true)
|
|
27
|
-
* - Dynamically adds blur/focusout listeners for untouched invalid controls
|
|
28
|
-
* - Supports custom error messages via CustomErrorMessageMap
|
|
29
|
-
* - Cleans up all listeners and subscriptions on destroy
|
|
30
|
-
* - SSR-safe: all DOM access is guarded by isPlatformBrowser
|
|
31
|
-
*
|
|
32
|
-
* Limitations:
|
|
33
|
-
* - Dynamic form changes (adding/removing controls at runtime) are NOT automatically handled in this version.
|
|
34
|
-
* If you add or remove controls after initialization, you must manually re-run error setup logic.
|
|
35
|
-
* (This feature is planned for a future release.)
|
|
36
|
-
*/
|
|
37
|
-
declare class FirstErrorDirective implements OnDestroy {
|
|
38
|
-
private _platformId;
|
|
39
|
-
private _renderer;
|
|
40
|
-
private _host;
|
|
41
|
-
set sbFormControlFirstError(form: FormGroup);
|
|
42
|
-
/**
|
|
43
|
-
* Custom error messages map to override default error messages.
|
|
44
|
-
* If map returns undefined for a specific error, the default message map will be used.
|
|
45
|
-
*/
|
|
46
|
-
customErrorMessages?: CustomErrorMessageMap;
|
|
47
|
-
/**
|
|
48
|
-
* If true, errors will be shown immediately for untouched controls.
|
|
49
|
-
* If false, errors will only be shown after the control is touched.
|
|
50
|
-
* Default is false.
|
|
51
|
-
*/
|
|
52
|
-
showUntouched: boolean;
|
|
53
|
-
private _form?;
|
|
54
|
-
private _vcSub?;
|
|
55
|
-
private blurListeners;
|
|
56
|
-
ngOnDestroy(): void;
|
|
57
|
-
private addBlurListener;
|
|
58
|
-
private removeAllBlurListeners;
|
|
59
|
-
private observeValueChanges;
|
|
60
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<FirstErrorDirective, never>;
|
|
61
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FirstErrorDirective, "[sbFormControlFirstError]", never, { "sbFormControlFirstError": { "alias": "sbFormControlFirstError"; "required": true; }; "customErrorMessages": { "alias": "customErrorMessages"; "required": false; }; "showUntouched": { "alias": "showUntouched"; "required": false; }; }, {}, never, never, true, never>;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
interface ControlData {
|
|
65
|
-
name: string;
|
|
66
|
-
control: AbstractControl;
|
|
67
|
-
}
|
|
68
|
-
declare class FormUtility {
|
|
69
|
-
static findInvalidControlNames(form: FormGroup): Set<string>;
|
|
70
|
-
static findInvalidControlInfo(form: FormGroup): Set<string>;
|
|
71
|
-
static findInvalidControls(form: FormGroup): AbstractControl[];
|
|
72
|
-
static findInvalidControlsData(form: FormGroup): ControlData[];
|
|
73
|
-
static replaceNullWithUndefined(obj: Record<string, any>): Record<string, any>;
|
|
74
|
-
static getFirstFormError(form: FormGroup): Record<string, any> | null;
|
|
75
|
-
static firstErrorKey: (control: AbstractControl) => string | null;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
declare class RemoveNullsService<T> {
|
|
79
|
-
remove: (obj: T) => T;
|
|
80
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<RemoveNullsService<any>, never>;
|
|
81
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<RemoveNullsService<any>>;
|
|
82
|
-
}
|
|
83
|
-
declare function RemoveNulls<T>(obj: T, iterate?: boolean): T;
|
|
84
|
-
|
|
85
|
-
export { FirstErrorComponent, FirstErrorDirective, FormErrors, FormUtility, RemoveNulls, RemoveNullsService };
|
|
86
|
-
export type { ControlData, CustomErrorMessageMap, ErrorMessageFunction };
|