im-angular-validators
Version:
This library will help you with lots of already written mostly used validators for Angular 2+ applications.
47 lines • 9.29 kB
JavaScript
import { IMCreditCardTypeValidatorEnum } from '../enums/credit-card-type.enum';
import { CreditCardValidatorResolver } from '../helpers/credit-card-validator-helpers/credit-card-length-validator.helper';
export class IMCreditCardValidatorConfigModel {
constructor() {
this.creditCardType = IMCreditCardTypeValidatorEnum.MasterCard;
}
}
export const IMCreditCardValidator = (config = new IMCreditCardValidatorConfigModel()) => {
return (control) => {
const creditCardNumber = control.value?.replace(/\s/g, '');
if (creditCardNumber?.length) {
const creditCardNumberLength = creditCardNumber.length;
const requiredCreditCardLength = CreditCardValidatorResolver.NumberLength[config.creditCardType];
const isNumberInINNRange = () => CreditCardValidatorResolver.IINRange[config.creditCardType].some((IINRange) => {
for (let i = IINRange.from; i <= IINRange.to; i++) {
if (new RegExp('^' + i, 'i').test(creditCardNumber)) {
return true;
}
}
return new RegExp('^' + IINRange, 'i').test(creditCardNumber);
});
const isNumberFitToLength = () => creditCardNumberLength < requiredCreditCardLength
|| creditCardNumberLength > requiredCreditCardLength
|| (creditCardNumberLength < requiredCreditCardLength.from
|| creditCardNumberLength > requiredCreditCardLength.to);
const isLuhnCheckPassed = () => {
const arr = (creditCardNumber + '').split('').reverse().map(x => Number(x));
const lastDigit = arr.splice(0, 1)[0];
let sum = arr.reduce((acc, val, i) => (i % 2 !== 0 ? acc + val : acc + ((val * 2) % 9) || 9), 0);
sum += lastDigit;
return sum % 10 === 0;
};
if (!isNumberInINNRange()) {
return { creditCardTypeValidationError: true };
}
else {
if (isNumberFitToLength()) {
return { creditCardNumberLengthValidatorError: true };
}
else if (!isLuhnCheckPassed()) {
return { creditCardDoesNotExist: true };
}
}
}
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGl0LWNhcmQudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci12YWxpZGF0b3JzL3NyYy9saWIvdmFsaWRhdG9ycy9jcmVkaXQtY2FyZC52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0UsT0FBTyxFQUVMLDJCQUEyQixFQUM1QixNQUFNLDhFQUE4RSxDQUFDO0FBR3RGLE1BQU0sT0FBTyxnQ0FBZ0M7SUFBN0M7UUFDRSxtQkFBYyxHQUFrQyw2QkFBNkIsQ0FBQyxVQUFVLENBQUM7SUFDM0YsQ0FBQztDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxTQUEyQyxJQUFJLGdDQUFnQyxFQUFFLEVBQWUsRUFBRTtJQUN0SSxPQUFPLENBQUMsT0FBd0IsRUFBb0IsRUFBRTtRQUNwRCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUzRCxJQUFJLGdCQUFnQixFQUFFLE1BQU0sRUFBRTtZQUM1QixNQUFNLHNCQUFzQixHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUN2RCxNQUFNLHdCQUF3QixHQUM1QiwyQkFBMkIsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRWxFLE1BQU0sa0JBQWtCLEdBQUcsR0FBWSxFQUFFLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQ3hHLENBQUMsUUFBa0QsRUFBRSxFQUFFO2dCQUNyRCxLQUFLLElBQUksQ0FBQyxHQUFJLFFBQTRDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSyxRQUE0QyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDM0gsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO3dCQUNuRCxPQUFPLElBQUksQ0FBQztxQkFDYjtpQkFDRjtnQkFDRCxPQUFPLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUNGLENBQUM7WUFFRixNQUFNLG1CQUFtQixHQUFHLEdBQVksRUFBRSxDQUFDLHNCQUFzQixHQUFHLHdCQUF3QjttQkFDdkYsc0JBQXNCLEdBQUcsd0JBQXdCO21CQUNqRCxDQUFDLHNCQUFzQixHQUFJLHdCQUE0RCxDQUFDLElBQUk7dUJBQzVGLHNCQUFzQixHQUFJLHdCQUE0RCxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWhHLE1BQU0saUJBQWlCLEdBQUcsR0FBWSxFQUFFO2dCQUN0QyxNQUFNLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pHLEdBQUcsSUFBSSxTQUFTLENBQUM7Z0JBQ2pCLE9BQU8sR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUU7Z0JBQ3pCLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxJQUFJLEVBQStCLENBQUM7YUFDNUU7aUJBQU07Z0JBQ0wsSUFBSSxtQkFBbUIsRUFBRSxFQUFFO29CQUN6QixPQUFPLEVBQUMsb0NBQW9DLEVBQUUsSUFBSSxFQUErQixDQUFDO2lCQUNuRjtxQkFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtvQkFDL0IsT0FBTyxFQUFDLHNCQUFzQixFQUFFLElBQUksRUFBK0IsQ0FBQztpQkFDckU7YUFDRjtTQUNGO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7SU1DcmVkaXRDYXJkVHlwZVZhbGlkYXRvckVudW19IGZyb20gJy4uL2VudW1zL2NyZWRpdC1jYXJkLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7XHJcbiAgQ3JlZGl0Q2FyZExlbmd0aEZyb21Ub0ludGVyZmFjZSxcclxuICBDcmVkaXRDYXJkVmFsaWRhdG9yUmVzb2x2ZXJcclxufSBmcm9tICcuLi9oZWxwZXJzL2NyZWRpdC1jYXJkLXZhbGlkYXRvci1oZWxwZXJzL2NyZWRpdC1jYXJkLWxlbmd0aC12YWxpZGF0b3IuaGVscGVyJztcclxuaW1wb3J0IHtJTUNyZWRpdENhcmRFcnJvckludGVyZmFjZX0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jcmVkaXQtY2FyZC1lcnJvci5pbnRlcmZhY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIElNQ3JlZGl0Q2FyZFZhbGlkYXRvckNvbmZpZ01vZGVsIHtcclxuICBjcmVkaXRDYXJkVHlwZTogSU1DcmVkaXRDYXJkVHlwZVZhbGlkYXRvckVudW0gPSBJTUNyZWRpdENhcmRUeXBlVmFsaWRhdG9yRW51bS5NYXN0ZXJDYXJkO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgSU1DcmVkaXRDYXJkVmFsaWRhdG9yID0gKGNvbmZpZzogSU1DcmVkaXRDYXJkVmFsaWRhdG9yQ29uZmlnTW9kZWwgPSBuZXcgSU1DcmVkaXRDYXJkVmFsaWRhdG9yQ29uZmlnTW9kZWwoKSk6IFZhbGlkYXRvckZuID0+IHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgPT4ge1xyXG4gICAgY29uc3QgY3JlZGl0Q2FyZE51bWJlciA9IGNvbnRyb2wudmFsdWU/LnJlcGxhY2UoL1xccy9nLCAnJyk7XHJcblxyXG4gICAgaWYgKGNyZWRpdENhcmROdW1iZXI/Lmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBjcmVkaXRDYXJkTnVtYmVyTGVuZ3RoID0gY3JlZGl0Q2FyZE51bWJlci5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IHJlcXVpcmVkQ3JlZGl0Q2FyZExlbmd0aDogbnVtYmVyIHwgQ3JlZGl0Q2FyZExlbmd0aEZyb21Ub0ludGVyZmFjZSA9XHJcbiAgICAgICAgQ3JlZGl0Q2FyZFZhbGlkYXRvclJlc29sdmVyLk51bWJlckxlbmd0aFtjb25maWcuY3JlZGl0Q2FyZFR5cGVdO1xyXG5cclxuICAgICAgY29uc3QgaXNOdW1iZXJJbklOTlJhbmdlID0gKCk6IGJvb2xlYW4gPT4gQ3JlZGl0Q2FyZFZhbGlkYXRvclJlc29sdmVyLklJTlJhbmdlW2NvbmZpZy5jcmVkaXRDYXJkVHlwZV0uc29tZShcclxuICAgICAgICAoSUlOUmFuZ2U6IG51bWJlciB8IENyZWRpdENhcmRMZW5ndGhGcm9tVG9JbnRlcmZhY2UpID0+IHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAoSUlOUmFuZ2UgYXMgQ3JlZGl0Q2FyZExlbmd0aEZyb21Ub0ludGVyZmFjZSkuZnJvbTsgaSA8PSAoSUlOUmFuZ2UgYXMgQ3JlZGl0Q2FyZExlbmd0aEZyb21Ub0ludGVyZmFjZSkudG87IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobmV3IFJlZ0V4cCgnXicgKyBpLCAnaScpLnRlc3QoY3JlZGl0Q2FyZE51bWJlcikpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgSUlOUmFuZ2UsICdpJykudGVzdChjcmVkaXRDYXJkTnVtYmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjb25zdCBpc051bWJlckZpdFRvTGVuZ3RoID0gKCk6IGJvb2xlYW4gPT4gY3JlZGl0Q2FyZE51bWJlckxlbmd0aCA8IHJlcXVpcmVkQ3JlZGl0Q2FyZExlbmd0aFxyXG4gICAgICAgIHx8IGNyZWRpdENhcmROdW1iZXJMZW5ndGggPiByZXF1aXJlZENyZWRpdENhcmRMZW5ndGhcclxuICAgICAgICB8fCAoY3JlZGl0Q2FyZE51bWJlckxlbmd0aCA8IChyZXF1aXJlZENyZWRpdENhcmRMZW5ndGggYXMgQ3JlZGl0Q2FyZExlbmd0aEZyb21Ub0ludGVyZmFjZSkuZnJvbVxyXG4gICAgICAgIHx8IGNyZWRpdENhcmROdW1iZXJMZW5ndGggPiAocmVxdWlyZWRDcmVkaXRDYXJkTGVuZ3RoIGFzIENyZWRpdENhcmRMZW5ndGhGcm9tVG9JbnRlcmZhY2UpLnRvKTtcclxuXHJcbiAgICAgIGNvbnN0IGlzTHVobkNoZWNrUGFzc2VkID0gKCk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgIGNvbnN0IGFyciA9IChjcmVkaXRDYXJkTnVtYmVyICsgJycpLnNwbGl0KCcnKS5yZXZlcnNlKCkubWFwKHggPT4gTnVtYmVyKHgpKTtcclxuICAgICAgICBjb25zdCBsYXN0RGlnaXQgPSBhcnIuc3BsaWNlKDAsIDEpWzBdO1xyXG4gICAgICAgIGxldCBzdW0gPSBhcnIucmVkdWNlKChhY2MsIHZhbCwgaSkgPT4gKGkgJSAyICE9PSAwID8gYWNjICsgdmFsIDogYWNjICsgKCh2YWwgKiAyKSAlIDkpIHx8IDkpLCAwKTtcclxuICAgICAgICBzdW0gKz0gbGFzdERpZ2l0O1xyXG4gICAgICAgIHJldHVybiBzdW0gJSAxMCA9PT0gMDtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmICghaXNOdW1iZXJJbklOTlJhbmdlKCkpIHtcclxuICAgICAgICByZXR1cm4ge2NyZWRpdENhcmRUeXBlVmFsaWRhdGlvbkVycm9yOiB0cnVlfSBhcyBJTUNyZWRpdENhcmRFcnJvckludGVyZmFjZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoaXNOdW1iZXJGaXRUb0xlbmd0aCgpKSB7XHJcbiAgICAgICAgICByZXR1cm4ge2NyZWRpdENhcmROdW1iZXJMZW5ndGhWYWxpZGF0b3JFcnJvcjogdHJ1ZX0gYXMgSU1DcmVkaXRDYXJkRXJyb3JJbnRlcmZhY2U7XHJcbiAgICAgICAgfSBlbHNlIGlmICghaXNMdWhuQ2hlY2tQYXNzZWQoKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHtjcmVkaXRDYXJkRG9lc05vdEV4aXN0OiB0cnVlfSBhcyBJTUNyZWRpdENhcmRFcnJvckludGVyZmFjZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG59O1xyXG4iXX0=