ngx2-credit-cards
Version:
A Credit Card Directives and Reactive Form Validators package for Angular X (6+)
263 lines (252 loc) • 18.6 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('payment')) :
typeof define === 'function' && define.amd ? define('ngx2-credit-cards', ['exports', '@angular/core', 'payment'], factory) :
(factory((global['ngx2-credit-cards'] = {}),global.ng.core,global.Payment));
}(this, (function (exports,core,Payment) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var CCNumberFormatDirective = /** @class */ (function () {
function CCNumberFormatDirective(renderer, el) {
this.renderer = renderer;
this.el = el;
/** @type {?} */
var element = this.el.nativeElement;
this.cardType = "";
// call lib functions
Payment.formatCardNumber(element);
Payment.restrictNumeric(element);
}
/**
* @param {?} e
* @return {?}
*/
CCNumberFormatDirective.prototype.onKeypress = /**
* @param {?} e
* @return {?}
*/
function (e) {
/** @type {?} */
var element = this.el.nativeElement;
/** @type {?} */
var elementValue = element.value;
this.cardType = Payment.fns.cardType(elementValue);
if (this.cardType !== "") {
this.renderer.setElementClass(element, this.cardType, false);
}
else {
this.cardType = "";
}
};
CCNumberFormatDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[ccNum]'
},] }
];
/** @nocollapse */
CCNumberFormatDirective.ctorParameters = function () {
return [
{ type: core.Renderer },
{ type: core.ElementRef }
];
};
CCNumberFormatDirective.propDecorators = {
onKeypress: [{ type: core.HostListener, args: ['keypress', ['$event'],] }]
};
return CCNumberFormatDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var CCExpiryFormatDirective = /** @class */ (function () {
function CCExpiryFormatDirective(el) {
this.el = el;
/** @type {?} */
var element = this.el.nativeElement;
// call lib functions
Payment.formatCardExpiry(element);
Payment.restrictNumeric(element);
}
CCExpiryFormatDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[ccExp]'
},] }
];
/** @nocollapse */
CCExpiryFormatDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
return CCExpiryFormatDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var CCCvcFormatDirective = /** @class */ (function () {
function CCCvcFormatDirective(el) {
this.el = el;
/** @type {?} */
var element = this.el.nativeElement;
// call lib functions
Payment.formatCardCVC(element);
Payment.restrictNumeric(element);
}
CCCvcFormatDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[ccCvc]'
},] }
];
/** @nocollapse */
CCCvcFormatDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
return CCCvcFormatDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** @type {?} */
var CC_DIRECTIVES = [
CCNumberFormatDirective,
CCExpiryFormatDirective,
CCCvcFormatDirective
];
var NgXCreditCardsModule = /** @class */ (function () {
function NgXCreditCardsModule() {
}
NgXCreditCardsModule.decorators = [
{ type: core.NgModule, args: [{
declarations: CC_DIRECTIVES,
exports: CC_DIRECTIVES
},] }
];
return NgXCreditCardsModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var CreditCardValidator = /** @class */ (function () {
function CreditCardValidator() {
}
/**
* Validates a cc number
* @param control
*/
/**
* Validates a cc number
* @param {?} control
* @return {?}
*/
CreditCardValidator.validateCardNumber = /**
* Validates a cc number
* @param {?} control
* @return {?}
*/
function (control) {
if (control) {
/** @type {?} */
var isValid = Payment.fns.validateCardNumber(control.value);
if (!isValid) {
return {
"error": "CREDIT_CARD_INVALID"
};
}
}
return null;
};
/**
* Validates the expiry date.
* Breaks exp by "/" string and assumes that first array entry is month and second year
* Also removes any spaces
* @param control
*/
/**
* Validates the expiry date.
* Breaks exp by "/" string and assumes that first array entry is month and second year
* Also removes any spaces
* @param {?} control
* @return {?}
*/
CreditCardValidator.validateCardExpiry = /**
* Validates the expiry date.
* Breaks exp by "/" string and assumes that first array entry is month and second year
* Also removes any spaces
* @param {?} control
* @return {?}
*/
function (control) {
if (control) {
/** @type {?} */
var controlValue = control.value.split("/");
/** @type {?} */
var isValid = false;
if (controlValue.length > 1) {
/** @type {?} */
var month = controlValue[0].replace(/^\s+|\s+$/g, '');
/** @type {?} */
var year = controlValue[1].replace(/^\s+|\s+$/g, '');
isValid = Payment.fns.validateCardExpiry(month, year);
}
if (!isValid) {
return {
"error": "CREDIT_EXPIRY_INVALID"
};
}
}
return null;
};
/**
* Validates cards CVC
* Also removes any spaces
* @param control
*/
/**
* Validates cards CVC
* Also removes any spaces
* @param {?} control
* @return {?}
*/
CreditCardValidator.validateCardCvc = /**
* Validates cards CVC
* Also removes any spaces
* @param {?} control
* @return {?}
*/
function (control) {
if (control) {
/** @type {?} */
var isValid = Payment.fns.validateCardCVC(control.value);
if (!isValid) {
return {
"error": "CREDIT_CARD_INVALID"
};
}
}
return null;
};
return CreditCardValidator;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
exports.NgXCreditCardsModule = NgXCreditCardsModule;
exports.CreditCardValidator = CreditCardValidator;
exports.ɵc = CCCvcFormatDirective;
exports.ɵb = CCExpiryFormatDirective;
exports.ɵa = CCNumberFormatDirective;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4Mi1jcmVkaXQtY2FyZHMudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZ3gyLWNyZWRpdC1jYXJkcy9kaXJlY3RpdmVzL2NjLW51bWJlci1mb3JtYXQuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gyLWNyZWRpdC1jYXJkcy9kaXJlY3RpdmVzL2NjLWV4cGlyeS1mb3JtYXQuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gyLWNyZWRpdC1jYXJkcy9kaXJlY3RpdmVzL2NjLWN2Yy1mb3JtYXQuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gyLWNyZWRpdC1jYXJkcy9uZ3hjcmVkaXRjYXJkLm1vZHVsZS50cyIsIm5nOi8vbmd4Mi1jcmVkaXQtY2FyZHMvdmFsaWRhdG9ycy9DcmVkaXRDYXJkLnZhbGlkYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBcblx0RGlyZWN0aXZlLCBcblx0RWxlbWVudFJlZiwgXG5cdFJlbmRlcmVyLFxuXHRIb3N0TGlzdGVuZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCAqIGFzIFBheW1lbnQgZnJvbSAncGF5bWVudCc7XG5cbkBEaXJlY3RpdmUoeyBcblx0c2VsZWN0b3I6ICdbY2NOdW1dJyBcbn0pXG5leHBvcnQgY2xhc3MgQ0NOdW1iZXJGb3JtYXREaXJlY3RpdmUge1xuXG5cdGNhcmRUeXBlOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcblxuXHRcdGxldCBlbGVtZW50ICAgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0dGhpcy5jYXJkVHlwZSA9IFwiXCI7XG5cbiAgICBcdC8vIGNhbGwgbGliIGZ1bmN0aW9uc1xuICAgICAgICBQYXltZW50LmZvcm1hdENhcmROdW1iZXIoZWxlbWVudCk7XG4gICAgICAgIFBheW1lbnQucmVzdHJpY3ROdW1lcmljKGVsZW1lbnQpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcigna2V5cHJlc3MnLCBbJyRldmVudCddKSBvbktleXByZXNzKGU6IGFueSkge1xuXHRcdFxuXHRcdGxldCBlbGVtZW50IFx0ICA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblx0XHRsZXQgZWxlbWVudFZhbHVlICA9IGVsZW1lbnQudmFsdWU7XG5cblx0XHR0aGlzLmNhcmRUeXBlID0gUGF5bWVudC5mbnMuY2FyZFR5cGUoZWxlbWVudFZhbHVlKTtcblxuXHRcdGlmICggdGhpcy5jYXJkVHlwZSAhPT0gXCJcIiApXG5cdFx0e1x0XG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyhlbGVtZW50LCB0aGlzLmNhcmRUeXBlLCBmYWxzZSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLmNhcmRUeXBlID0gXCJcIjtcdFx0XHRcblx0XHR9XG5cblx0fVxuXG59XG4iLCJpbXBvcnQgeyBcbiAgRGlyZWN0aXZlLCBcbiAgRWxlbWVudFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0ICogYXMgUGF5bWVudCBmcm9tICdwYXltZW50JztcblxuQERpcmVjdGl2ZSh7IFxuXHRzZWxlY3RvcjogJ1tjY0V4cF0nIFxufSlcbmV4cG9ydCBjbGFzcyBDQ0V4cGlyeUZvcm1hdERpcmVjdGl2ZSB7XG4gIFxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBcdGxldCBlbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuXG4gICAgXHQvLyBjYWxsIGxpYiBmdW5jdGlvbnNcbiAgICAgICAgUGF5bWVudC5mb3JtYXRDYXJkRXhwaXJ5KGVsZW1lbnQpO1xuICAgICAgICBQYXltZW50LnJlc3RyaWN0TnVtZXJpYyhlbGVtZW50KTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCB7IFxuICBEaXJlY3RpdmUsIFxuICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBQYXltZW50IGZyb20gJ3BheW1lbnQnO1xuXG5ARGlyZWN0aXZlKHsgXG5cdHNlbGVjdG9yOiAnW2NjQ3ZjXScgXG59KVxuZXhwb3J0IGNsYXNzIENDQ3ZjRm9ybWF0RGlyZWN0aXZlIHtcbiAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgIFx0bGV0IGVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBcdC8vIGNhbGwgbGliIGZ1bmN0aW9uc1xuICAgICAgICBQYXltZW50LmZvcm1hdENhcmRDVkMoZWxlbWVudCk7XG4gICAgICAgIFBheW1lbnQucmVzdHJpY3ROdW1lcmljKGVsZW1lbnQpO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ0NOdW1iZXJGb3JtYXREaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2MtbnVtYmVyLWZvcm1hdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ0NFeHBpcnlGb3JtYXREaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2MtZXhwaXJ5LWZvcm1hdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ0NDdmNGb3JtYXREaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2MtY3ZjLWZvcm1hdC5kaXJlY3RpdmUnO1xuXG5pbXBvcnQgKiBhcyBQYXltZW50IGZyb20gJ3BheW1lbnQnO1xuXG5jb25zdCBDQ19ESVJFQ1RJVkVTID0gW1xuXHRDQ051bWJlckZvcm1hdERpcmVjdGl2ZSxcblx0Q0NFeHBpcnlGb3JtYXREaXJlY3RpdmUsIFxuXHRDQ0N2Y0Zvcm1hdERpcmVjdGl2ZVxuXTtcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBDQ19ESVJFQ1RJVkVTLFxuICBleHBvcnRzOiBDQ19ESVJFQ1RJVkVTXG59KVxuZXhwb3J0IGNsYXNzIE5nWENyZWRpdENhcmRzTW9kdWxlIHtcbn0iLCJpbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCAqIGFzIFBheW1lbnQgZnJvbSAncGF5bWVudCc7XG5cbmV4cG9ydCBjbGFzcyBDcmVkaXRDYXJkVmFsaWRhdG9yIHtcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyBhIGNjIG51bWJlclxuICAgICAqIEBwYXJhbSBjb250cm9sXG4gICAgICovXG4gICAgc3RhdGljIHZhbGlkYXRlQ2FyZE51bWJlcihjb250cm9sOiBGb3JtQ29udHJvbCkge1xuXG4gICAgICAgIGlmIChjb250cm9sKSB7XG5cbiAgICAgICAgICAgIGxldCBpc1ZhbGlkID0gUGF5bWVudC5mbnMudmFsaWRhdGVDYXJkTnVtYmVyKGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgXCJlcnJvclwiOiBcIkNSRURJVF9DQVJEX0lOVkFMSURcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAgICAgXG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICAgXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoZSBleHBpcnkgZGF0ZS5cbiAgICAgKiBCcmVha3MgZXhwIGJ5IFwiL1wiIHN0cmluZyBhbmQgYXNzdW1lcyB0aGF0IGZpcnN0IGFycmF5IGVudHJ5IGlzIG1vbnRoIGFuZCBzZWNvbmQgeWVhclxuICAgICAqIEFsc28gcmVtb3ZlcyBhbnkgc3BhY2VzIFxuICAgICAqIEBwYXJhbSBjb250cm9sXG4gICAgICovXG4gICAgc3RhdGljIHZhbGlkYXRlQ2FyZEV4cGlyeShjb250cm9sOiBGb3JtQ29udHJvbCkge1xuXG4gICAgICAgIGlmIChjb250cm9sKSB7XG5cbiAgICAgICAgICAgIGxldCBjb250cm9sVmFsdWUgPSBjb250cm9sLnZhbHVlLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkICAgICAgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZS5sZW5ndGggPiAxKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBtb250aCA9IGNvbnRyb2xWYWx1ZVswXS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCcnKTtcbiAgICAgICAgICAgICAgICBsZXQgeWVhciA9IGNvbnRyb2xWYWx1ZVsxXS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCcnKTtcblxuICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBQYXltZW50LmZucy52YWxpZGF0ZUNhcmRFeHBpcnkobW9udGgsIHllYXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgXCJlcnJvclwiOiBcIkNSRURJVF9FWFBJUllfSU5WQUxJRFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcblxuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIGNhcmRzIENWQ1xuICAgICAqIEFsc28gcmVtb3ZlcyBhbnkgc3BhY2VzIFxuICAgICAqIEBwYXJhbSBjb250cm9sXG4gICAgICovXG4gICAgc3RhdGljIHZhbGlkYXRlQ2FyZEN2Yyhjb250cm9sOiBGb3JtQ29udHJvbCkge1xuXG4gICAgICAgIGlmIChjb250cm9sKSB7XG5cbiAgICAgICAgICAgIGxldCBpc1ZhbGlkID0gUGF5bWVudC5mbnMudmFsaWRhdGVDYXJkQ1ZDKGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgXCJlcnJvclwiOiBcIkNSRURJVF9DQVJEX0lOVkFMSURcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAgICAgXG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICBcbiAgICB9XG5cbn1cbiJdLCJuYW1lcyI6WyJQYXltZW50LmZvcm1hdENhcmROdW1iZXIiLCJQYXltZW50LnJlc3RyaWN0TnVtZXJpYyIsIlBheW1lbnQuZm5zIiwiRGlyZWN0aXZlIiwiUmVuZGVyZXIiLCJFbGVtZW50UmVmIiwiSG9zdExpc3RlbmVyIiwiUGF5bWVudC5mb3JtYXRDYXJkRXhwaXJ5IiwiUGF5bWVudC5mb3JtYXRDYXJkQ1ZDIiwiTmdNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtRQWdCQyxpQ0FBb0IsUUFBa0IsRUFBVSxFQUFjO1lBQTFDLGFBQVEsR0FBUixRQUFRLENBQVU7WUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFZOztZQUU3RCxJQUFJLE9BQU8sR0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQzs7WUFHYkEsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbENDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZDOzs7OztRQUVxQyw0Q0FBVTs7OztZQUFoRCxVQUFpRCxDQUFNOztnQkFFdEQsSUFBSSxPQUFPLEdBQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7O2dCQUN2QyxJQUFJLFlBQVksR0FBSSxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUVsQyxJQUFJLENBQUMsUUFBUSxHQUFHQyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUVuRCxJQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxFQUN6QjtvQkFDQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDN0Q7cUJB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