UNPKG

bitfront-library

Version:

Angular CLI project with components and classes used by other Angular projects of the BIT foundation.

677 lines 29.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CustomValidators = void 0; var core_1 = require("@angular/core"); var forms_1 = require("@angular/forms"); var general_utils_service_1 = require("./general-utils.service"); var i0 = require("@angular/core"); var CustomValidators = /** @class */ (function () { function CustomValidators() { } CustomValidators.getValidatorErrorMessage = function (code) { return this.config[code]; }; // método para unir validadores CustomValidators.compose = function (validators) { return function (g) { // ejecutamos cada uno de los validadores y unimos sus resultados return validators.map(function (validator) { return validator(g); }).reduce(function (acc, result) { if (result === void 0) { result = {}; } return Object.assign(acc, result); }, {}); }; }; CustomValidators.required = function (control) { if (!control.value) { return { required: true }; } else { return null; } }; // este validador en realidad no está haciendo nada porque bit-input, para fechas no válidas, sustituye // control.value por un null y el validador pasa siempre CustomValidators.dataValidator = function (control) { // formato dd/MM/yyyy if (!control.value || control.value.match(/^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/)) { return null; } else { return { invalidDate: true }; } }; CustomValidators.timeValidator = function (control) { // formato hh:mm if (!control.value || (control.value && control.value.match(/^[0-9][0-9]:[0-9][0-9]$/))) { return null; } else { return { invalidTime: true }; } }; CustomValidators.emailValidator = function (control) { // RFC 2822 compliant regex if (!control.value || control.value.match(/\S+@([-\w]+\.)+\w+/g)) { return null; } else { return { invalidEmailAddress: true }; } }; CustomValidators.emailCSVValidator = function (control) { // RFC 2822 compliant regex if (!control.value || control.value.match(/^(( )*[\w\.]+@([-\w]+\.)+\w+( )*)(,( )*[\w\.]+@([-\w]+\.)+\w+( )*)*$/g)) { return null; } else { return { invalidEmailCSVAddress: true }; } }; CustomValidators.loginValidator = function (control) { if (!control.value || control.value.match(/^[a-z0-9_-]{3,15}/)) { return null; } else { return { invalidLogin: true }; } }; CustomValidators.etiquetaValidator = function (control) { if (!control.value || control.value.match(/^[a-zA-Z0-9_-]+/)) { return null; } else { return { invalidEtiqueta: true }; } }; CustomValidators.nombreValidator = function (control) { if (!control.value || /^([A-Za-z0-9_\.\,\'\"\(\)\;\:\-\/\@\?\%\?\¿\&\+\-\*\/\ \n\rºª'´’·ïü?`áéíóúÁÉÍÓÚàèìòùÀÈÌÒÙÄËÏÖÜäëïöüñÑçÇ¡!#])+$/.test(control.value)) { return null; } else { return { invalidName: true }; } }; CustomValidators.codigoValidator = function (control) { if (!control.value || control.value.match(/^([0-9])+$/)) { return null; } else { return { invalidCodigo: true }; } }; CustomValidators.alfanumericoValidator = function (control) { if (!control.value || control.value.match(/^([A-Z0-9_\.\-ÑÇ])+$/)) { return null; } else { return { invalidAlfanumerico: true }; } }; CustomValidators.cantidadValidator = function (control) { // value is either empty, or a number without decimals if (!control.value || control.value === "") { return null; } var num = Number(control.value); if (!isNaN(num) && num % 1 == 0) { return null; } return { invalidCantidad: true }; }; /* Valida numeros enteros (sin decimales) positivos (>=0) */ CustomValidators.enteroPositivoValidator = function (control) { // value is either empty, or a number without decimals if (!control.value || control.value === "") { return null; } var num = Number(control.value); if (!isNaN(num) && num % 1 == 0 && num >= 0) { return null; } return { invalidEnteroPositivo: true }; }; CustomValidators.enteroPositivoValidatorIncluyeCeroValidator = function (control) { // value is either empty, or a positive number (including 0) without decimals if (!control.value || control.value === "") { return null; } var num = Number(control.value); if (!isNaN(num) && num % 1 == 0 && num >= 0) { return null; } return { invalidEnteroPositivoIncluyeCero: true }; }; /* Valida numeros enteros (con decimales) */ CustomValidators.cantidadDecimalValidator = function (control) { // value is either empty, or a number (including decimals) if (!control.value || control.value === "" || !isNaN(Number(control.value))) { return null; } else { return { invalidCantidadDecimal: true }; } }; /* Valida numeros enteros (con decimales) positivos (>=0) */ CustomValidators.numeroPositivoValidator = function (control) { if (!control.value || control.value === "" || (!isNaN(Number(control.value)) && Number(control.value) >= 0)) { return null; } else { return { invalidNumeroPositivo: true }; } }; /* Valida codigo postal (numero de 5 digitos) */ CustomValidators.codigoPostalValidator = function (control) { if (!control.value || (control.value.match(/^([0-9])+$/) && control.value.length == 5)) { return null; } else { return { invalidCodigoPostal: true }; } }; /* Valida telefono (numero de 9 digitos) */ CustomValidators.telefonoValidator = function (control) { if (!control.value || control.value.match(/^[6789]\d{8}$/) || control.value.match(/^00\d{10,15}$/)) { return null; } else { return { invalidTelefono: true }; } }; CustomValidators.buildLongitudValidator = function (lon) { var errorKey = "invalidLongitud-" + lon; this.config[errorKey] = "La dada no pot excedir els " + lon + " car\u00E0cters."; return function (control) { if (!control.value || control.value.length <= lon) { return null; } else { var ret = {}; ret[errorKey] = true; return ret; } }; }; CustomValidators.buildCantidadMinValidator = function (min) { var errorKey = "invalidCantidadMin-" + min; this.config[errorKey] = "Format incorrecte. Nom\u00E9s s'accepten valors num\u00E8rics majors o iguals que " + min; return function (control) { var num = Number(control.value); if (control.value === "") { return null; } else if (isNaN(num) || num >= min) { // si no es numerico o el valor >= min, pasa la validacion return null; } else { var ret = {}; ret[errorKey] = true; return ret; } }; }; CustomValidators.buildCantidadMaxValidator = function (max) { var errorKey = "invalidCantidadMax-" + max; this.config[errorKey] = "Format incorrecte. Nom\u00E9s s'accepten valors num\u00E8rics menors o iguals que " + max; return function (control) { var num = Number(control.value); if (control.value === "") { return null; } else if (isNaN(num) || num <= max) { // si no es numerico o el valor <= max, pasa la validacion return null; } else { var ret = {}; ret[errorKey] = true; return ret; } }; }; CustomValidators.buildCantidadMinMaxValidator = function (min, max) { var errorKey = "invalidCantidadMinMax-" + min + "-" + max; this.config[errorKey] = "Format incorrecte. Nom\u00E9s s'accepten valors num\u00E8rics entre " + min + " i " + max; return function (control) { var num = Number(control.value); if (control.value === "") { return null; } else if (!isNaN(num) && num >= min && num <= max) { return null; } else { var ret = {}; ret[errorKey] = true; return ret; } }; }; CustomValidators.porcentajeValidator = function (control) { // expected a numeric value between 0 and 100 if (!control.value || control.value === "") { return null; } else { var n = Number(control.value); if (!isNaN(n) && n >= 0 && n <= 100) { return null; } else { return { invalidPorcentaje: true }; } } }; CustomValidators.urlValidator = function (control) { var pattern = new RegExp("^(https?:\\/\\/)?" + // protocol "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|" + // domain name "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string "(\\#[-a-z\\d_]*)?$", "i"); // fragment locator if (!control.value || pattern.test(control.value)) { return null; } else { return { invalidUrl: true }; } }; CustomValidators.pathValidator = function (control) { var pattern = new RegExp("^((\\/)?[-a-z\\d%_.~+]*)*" + // port and path "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string "(\\#[-a-z\\d_]*)?$", "i"); // fragment locator if (!control.value || pattern.test(control.value)) { return null; } else { return { invalidPath: true }; } }; /** * Retorna un string con todos los errores que contiene el formulario separados por saltos de línea. */ CustomValidators.validateForm = function (form, prefix) { var mensajes = []; // errores a nivel de grupo for (var errorKey in form.errors) { var pr = prefix ? prefix + ": " : ""; mensajes.push("" + pr + CustomValidators.config[errorKey]); } var _loop_1 = function (controlKey) { var control = form.controls[controlKey]; if (!control.valid) { // no es válido, hay mensajes que recuperar var controlLabel_1 = prefix ? prefix + " > " + controlKey : controlKey; // nombre apilado // detectamos si es un campo o un formulario anidado if (control instanceof forms_1.FormGroup) { // es un formulario anidado, seguimos bajando recursivamente mensajes = mensajes.concat(CustomValidators.validateForm(control, controlLabel_1)); } else if (control instanceof forms_1.FormControl) { // es un campo final, añadimos sus mensajes de error for (var errorKey in control.errors) { mensajes.push(controlLabel_1 + ": " + CustomValidators.config[errorKey]); } } else if (control instanceof forms_1.FormArray) { // es una lista de controles anidada, la recorremos control.controls && control.controls.forEach(function (arrControl, index) { var arrControlLabel = controlLabel_1 + " > " + index; if (arrControl instanceof forms_1.FormGroup) { // es una lista de FormGroups, bajamos a ellos recursivamente mensajes = mensajes.concat(CustomValidators.validateForm(arrControl, arrControlLabel)); } else if (arrControl instanceof forms_1.FormControl) { // es una lista de FormControls, los tratamos desde aquí for (var errorKey in control.errors) { mensajes.push(arrControlLabel + ": " + CustomValidators.config[errorKey]); } } else { // ??? ¿Un array de arrays? No está previsto. console.log("[CustomValidators] Unexpected FormArray with nested FormArrays"); } }); } } }; for (var controlKey in form.controls) { _loop_1(controlKey); } return mensajes; }; /** * Recibe un objeto con las propiedades {fieldTipo, fieldNumero} y devuelve un validador de formulario para documentos de identificación. * El error que puede generarse es del tipo 'invalidNumeroDocumentoTipoDocumento'. */ CustomValidators.buildNumeroDocumentoValidator = function (_a) { var _b = _a === void 0 ? {} : _a, _c = _b.fieldTipo, fieldTipo = _c === void 0 ? "documentoTipo" : _c, _d = _b.fieldNumero, fieldNumero = _d === void 0 ? "documentoNumero" : _d; return function (g) { if (!g) { return null; } var documentoTipo = g.get(fieldTipo) && g.get(fieldTipo).value; var documentoNumero = g && g.get(fieldNumero) && g.get(fieldNumero).value; var invalid = false; if (documentoTipo && documentoNumero) { if (documentoTipo == "DNI") { invalid = !CustomValidators.isValidDNI(documentoNumero); } else if (documentoTipo == "CIF") { invalid = !CustomValidators.isValidCIF(documentoNumero); } else if (documentoTipo == "NIF") { //invalid = !documentoNumero.match(/^[0-9]{8}[a-z|A-Z]$/); invalid = !CustomValidators.isValidNIF(documentoNumero); } else if (documentoTipo == "NIE") { invalid = !CustomValidators.isValidNIE(documentoNumero); } } if (invalid) { return { invalidNumeroDocumentoTipoDocumento: true }; } else { return null; } }; }; CustomValidators.nifValidator = function (control) { if (!control.value || CustomValidators.isValidNIF(control.value)) { return null; } else { return { invalidNIF: true }; } }; CustomValidators.nieValidator = function (control) { if (!control.value || CustomValidators.isValidNIE(control.value)) { return null; } else { return { invalidNIE: true }; } }; CustomValidators.nifNieValidator = function (control) { if (!control.value || CustomValidators.isValidNIF(control.value) || CustomValidators.isValidNIE(control.value)) { return null; } else { return { invalidNIFNIE: true }; } }; CustomValidators.cifValidator = function (control) { var pattern = new RegExp(/^[a-z|A-Z][0-9]{7}[a-z|A-Z|0-9]/); // TODO if (!control.value || pattern.test(control.value)) { return null; } else { return { invalidCIF: true }; } }; CustomValidators.nifNieCipValidator = function (control) { if (!control.value || CustomValidators.isValidNIF(control.value) || CustomValidators.isValidNIE(control.value) || CustomValidators.isValidCIP(control.value)) { return null; } else { return { invalidNIFNIECIP: true }; } }; CustomValidators.cipValidator = function (control) { if (!control.value || CustomValidators.isValidCIP(control.value)) { return null; } else { return { invalidCIP: true }; } }; CustomValidators.anyoValidator = function (control) { var pattern = new RegExp(/^[0-9]{4}$/); // TODO if (!control.value || pattern.test(control.value)) { return null; } else { return { invalidAnyo: true }; } }; CustomValidators.isValidDNI = function (value) { return true; // ¿deberíamos validar algo? Con letra ya tenemos el NIF }; // https://github.com/jquery-validation/jquery-validation/blob/master/src/additional/cifES.js CustomValidators.isValidCIF = function (value) { var cifRegEx = new RegExp(/^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi); var letter = value.substring(0, 1), // [ T ] number = value.substring(1, 8), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ] control = value.substring(8, 9), // [ C ] all_sum = 0, even_sum = 0, odd_sum = 0, i, n, control_digit, control_letter; function isOdd(n) { return n % 2 === 0; } // Quick format test if (value.length !== 9 || !cifRegEx.test(value)) { return false; } for (i = 0; i < number.length; i++) { n = parseInt(number[i], 10); // Odd positions if (isOdd(i)) { // Odd positions are multiplied first. n *= 2; // If the multiplication is bigger than 10 we need to adjust odd_sum += n < 10 ? n : n - 9; // Even positions // Just sum them } else { even_sum += n; } } all_sum = even_sum + odd_sum; control_digit = (10 - Number(all_sum.toString().substr(-1))).toString(); control_digit = parseInt(control_digit, 10) > 9 ? "0" : control_digit; control_letter = "JABCDEFGHI".substr(control_digit, 1).toString(); // Control must be a digit if (letter.match(/[ABEH]/)) { return control === control_digit; // Control must be a letter } else if (letter.match(/[KPQS]/)) { return control === control_letter; } // Can be either return control === control_digit || control === control_letter; }; // https://github.com/jquery-validation/jquery-validation/blob/master/src/additional/nifES.js CustomValidators.isValidNIF = function (value) { value = value.toUpperCase(); // Basic format test if (!value.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")) { return false; } // Test NIF if (/^[0-9]{8}[A-Z]{1}$/.test(value)) { return "TRWAGMYFPDXBNJZSQVHLCKE".charAt(Number(value.substring(8, 0)) % 23) === value.charAt(8); } // Test specials NIF (starts with K, L or M) if (/^[KLM]{1}/.test(value)) { return value[8] !== "TRWAGMYFPDXBNJZSQVHLCKE".charAt(Number(value.substring(8, 1)) % 23); } return false; }; CustomValidators.isValidNIE = function (value) { // Un NIE sigue una validación muy similar a la de un DNI, con la diferencia // de que en lugar de ser ocho números + letra debe ser letra + siete números + letra, // siendo la primera letra X, Y o Z sustituible por 0, 1 o 2 respectivamente. var nieRegEx = new RegExp(/^[XYZ]{1}[0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi); // Si no tiene el formato básico, no es válido if (!nieRegEx.test(value)) { return false; } // Sustituimos la primera letra por el número equivalente y reaprovechamos la validación de NIF value = value.toString().toUpperCase().replace(/^[X]/, "0").replace(/^[Y]/, "1").replace(/^[Z]/, "2"); return CustomValidators.isValidNIF(value); }; CustomValidators.isValidCIP = function (value) { // Un CIP son 11 caracteres, de los cuales el primero es "3" var cipRegEx = new RegExp(/^3[0-9]{10}$/gi); // Si no tiene el formato básico, no es válido if (!cipRegEx.test(value)) { return false; } return true; }; CustomValidators.rangoFechasValidator = function (_a) { var _b = _a === void 0 ? {} : _a, _c = _b.fieldFechaInicio, fieldFechaInicio = _c === void 0 ? "fechaInicio" : _c, _d = _b.fieldFechaFin, fieldFechaFin = _d === void 0 ? "fechaFin" : _d; return function (g) { if (!g) { return null; } var fechaInicio = g.get(fieldFechaInicio) && g.get(fieldFechaInicio).value; var fechaFin = g && g.get(fieldFechaFin) && g.get(fieldFechaFin).value; if (fechaInicio && fechaFin) { var inicio = general_utils_service_1.GeneralUtils.stringShortToDate(fechaInicio); var fin = general_utils_service_1.GeneralUtils.stringShortToDate(fechaFin); if (inicio > fin) { return { invalidRangoFechaFinPosteriorInicio: true, requiredTipoDatoTipoCheck: true }; } } return null; }; }; CustomValidators.rangoHorasValidator = function (_a) { var _b = _a === void 0 ? {} : _a, _c = _b.fieldHoraInicio, fieldHoraInicio = _c === void 0 ? "horaInicio" : _c, _d = _b.fieldHoraFin, fieldHoraFin = _d === void 0 ? "horaFin" : _d; return function (g) { if (!g) { return null; } var inicio = g.get(fieldHoraInicio) && g.get(fieldHoraInicio).value && general_utils_service_1.GeneralUtils.stringToTime(g.get(fieldHoraInicio).value); var fin = g && g.get(fieldHoraFin) && g.get(fieldHoraFin).value && general_utils_service_1.GeneralUtils.stringToTime(g.get(fieldHoraFin).value); if (inicio && fin && inicio >= fin) { return { invalidRangoHoraFinPosteriorInicio: true }; } return null; }; }; CustomValidators.dateTimeNotAfterCurrentDateValidator = function (_a) { var _b = _a === void 0 ? {} : _a, _c = _b.fieldfecha, fieldfecha = _c === void 0 ? "fecha" : _c, _d = _b.fieldHora, fieldHora = _d === void 0 ? "hora" : _d; return function (g) { if (!g) { return null; } var campoFecha = g.get(fieldfecha); var campoHora = g.get(fieldHora); if (campoFecha && campoFecha.value && campoFecha.value.match(/^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/)) { var date = general_utils_service_1.GeneralUtils.getStringAsDate(campoFecha.value); if (campoHora && campoHora.value && campoHora.value.match(/^[0-9][0-9]:[0-9][0-9]$/)) { date.setHours(campoHora.value.split(":")[0]); date.setMinutes(campoHora.value.split(":")[1]); } if (date < new Date()) { return { invalidDateTimeNotAfterCurrentDate: true }; } } return null; }; }; CustomValidators.buildMinLongitudValidator = function (lon) { var errorKey = "invalidLongitud-" + lon; this.config[errorKey] = "El camp ha de tenir almenys " + lon + " car\u00E0cters."; return function (control) { if (!control.value || control.value.length >= lon) { return null; } else { var ret = {}; ret[errorKey] = true; return ret; } }; }; CustomValidators.config = { required: "Camp obligatori", invalidDate: "Data incorrecta", invalidTime: "Format hora incorrecte", invalidEmailAddress: "Adreça electrònica incorrecta", invalidEmailCSVAddress: "Format adreça electrònica incorrecte", invalidLogin: "Login incorrecte", invalidEtiqueta: 'Etiqueta incorrecta, només s\'accepten valors alfanumèrics i "_"', invalidName: "Valor incorrecte", invalidCodigo: "Format de codi incorrecte", invalidAlfanumerico: "Format alfanumèric incorrecte", invalidCantidad: "Format incorrecte, només s'accepten valors numèrics (sense decimals)", invalidEnteroPositivo: "Introdueixi un valor numèric positiu (sense decimals) ", invalidEnteroPositivoIncluyeCero: "Introdueixi numèrics (sense decimals) majors o iguals que zero", invalidCantidadDecimal: "Format incorrecte, només s'accepten valors numèrics (amb decimals)", invalidNumeroPositivo: "Introdueixi un valor numèric positiu (amb decimals)", invalidCodigoPostal: "Introdueixi 5 dígits", invalidTelefono: "Número de telèfon incorrecte. Si és un telèfon nacional, introdueixi 9 dígits. Si és un telèfon internacional, introdueixi 00, el prefix del país i el número de telèfon (p. ex., 00491234567890).", invalidPorcentaje: "Percentatge incorrecte, només s'accepten valors numèrics entre 0 i 100", invalidUrl: "Adreça web incorrecta", invalidPath: "Ruta incorrecte", invalidNIF: "NIF incorrecte", invalidNIE: "NIE incorrecte", invalidCIF: "CIF incorrecte", invalidNIFNIE: "NIF/NIE incorrecte", invalidNIFNIECIP: "NIF/NIE/CIP incorrecte", invalidCIP: "CIP incorrecte", invalidAnyo: "Format incorrecte, només s'accepten anys amb quatre dígits", maxlength: "Camp massa llarg", invalidNumeroDocumentoTipoDocumento: "Format del número de document incorrecte", direccionIncompleta: "El municipi i codi postal de l'adreça obligatoris", requiredExtraData: "Altres dades són obligatòries", invalidRangoFechaFinPosteriorInicio: "La data de fi ha de ser posterior a la data d'inici", invalidRangoHoraFinPosteriorInicio: "L'hora de fi ha de ser posterior a l'hora d'inici", invalidDateTimeNotAfterCurrentDate: "La data i hora han de ser posteriors a la data actual", // Cathos requiredProtocoloId: "Heu d'especificar un protocol d'inspecció", requiredTipoDatoTipoCheck: "Heu d'especificar si el tipus de dada aplica a tramitacions, inspeccions i/o autoavaluacions", // Bitcita agendaInvalidRangoFechaFinPosteriorInicio: "La data de fi ha de ser posterior a la data d'inici", agendaInvalidRangoFechaCampanya: "Les dates d'inici i de fi han de ser dins el període de la campanya", agendaInvalidSeleccionServicios: "Heu de seleccionar almenys un servei", agendaInvalidPlazasServicioMultiple: "Heu d'indicar el nombre de places del servei múltiple", agendaInvalidSeleccionHorario: "És necessari omplir almenys una hora d`inici i una hora de fi de qualsevol dia per guardar l'agenda", // CitaIVR Back llamadasCamposObligatorios: "Per favor, indiqui almenys un dels següents camps de cerca: transacció, telèfon, data, sol·licitant", transaccionCamposObligatorios: "Per favor, indiqui una transacció o una data de cerca" }; CustomValidators.CustomValidatorsMap = { codigoNumerico: CustomValidators.codigoValidator, codigoAlfanumerico: CustomValidators.alfanumericoValidator, nombre: CustomValidators.nombreValidator, numero: CustomValidators.cantidadDecimalValidator, entero: CustomValidators.cantidadValidator, numeroPositivo: CustomValidators.numeroPositivoValidator, enteroPositivo: CustomValidators.enteroPositivoValidator, nif: CustomValidators.nifValidator, nie: CustomValidators.nieValidator, cif: CustomValidators.cifValidator, nifnie: CustomValidators.nifNieValidator, nifniecip: CustomValidators.nifNieCipValidator, cip: CustomValidators.cipValidator, cp: CustomValidators.codigoPostalValidator, telefono: CustomValidators.telefonoValidator, email: CustomValidators.emailValidator, fecha: CustomValidators.dataValidator, anyo: CustomValidators.anyoValidator }; CustomValidators.ɵfac = function CustomValidators_Factory(t) { return new (t || CustomValidators)(); }; CustomValidators.ɵprov = i0.ɵɵdefineInjectable({ token: CustomValidators, factory: CustomValidators.ɵfac }); return CustomValidators; }()); exports.CustomValidators = CustomValidators; (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CustomValidators, [{ type: core_1.Injectable }], null, null); })(); //# sourceMappingURL=custom-validators.service.js.map