ngx2-credit-cards
Version:
A Credit Card Directives and Reactive Form Validators package for Angular X (6+)
210 lines (201 loc) • 15.1 kB
JavaScript
import { Directive, ElementRef, Renderer, HostListener, NgModule } from '@angular/core';
import { formatCardCVC, restrictNumeric, formatCardExpiry, formatCardNumber, fns } from 'payment';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class CCNumberFormatDirective {
/**
* @param {?} renderer
* @param {?} el
*/
constructor(renderer, el) {
this.renderer = renderer;
this.el = el;
/** @type {?} */
let element = this.el.nativeElement;
this.cardType = "";
// call lib functions
formatCardNumber(element);
restrictNumeric(element);
}
/**
* @param {?} e
* @return {?}
*/
onKeypress(e) {
/** @type {?} */
let element = this.el.nativeElement;
/** @type {?} */
let elementValue = element.value;
this.cardType = fns.cardType(elementValue);
if (this.cardType !== "") {
this.renderer.setElementClass(element, this.cardType, false);
}
else {
this.cardType = "";
}
}
}
CCNumberFormatDirective.decorators = [
{ type: Directive, args: [{
selector: '[ccNum]'
},] }
];
/** @nocollapse */
CCNumberFormatDirective.ctorParameters = () => [
{ type: Renderer },
{ type: ElementRef }
];
CCNumberFormatDirective.propDecorators = {
onKeypress: [{ type: HostListener, args: ['keypress', ['$event'],] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class CCExpiryFormatDirective {
/**
* @param {?} el
*/
constructor(el) {
this.el = el;
/** @type {?} */
let element = this.el.nativeElement;
// call lib functions
formatCardExpiry(element);
restrictNumeric(element);
}
}
CCExpiryFormatDirective.decorators = [
{ type: Directive, args: [{
selector: '[ccExp]'
},] }
];
/** @nocollapse */
CCExpiryFormatDirective.ctorParameters = () => [
{ type: ElementRef }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class CCCvcFormatDirective {
/**
* @param {?} el
*/
constructor(el) {
this.el = el;
/** @type {?} */
let element = this.el.nativeElement;
// call lib functions
formatCardCVC(element);
restrictNumeric(element);
}
}
CCCvcFormatDirective.decorators = [
{ type: Directive, args: [{
selector: '[ccCvc]'
},] }
];
/** @nocollapse */
CCCvcFormatDirective.ctorParameters = () => [
{ type: ElementRef }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** @type {?} */
const CC_DIRECTIVES = [
CCNumberFormatDirective,
CCExpiryFormatDirective,
CCCvcFormatDirective
];
class NgXCreditCardsModule {
}
NgXCreditCardsModule.decorators = [
{ type: NgModule, args: [{
declarations: CC_DIRECTIVES,
exports: CC_DIRECTIVES
},] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class CreditCardValidator {
/**
* Validates a cc number
* @param {?} control
* @return {?}
*/
static validateCardNumber(control) {
if (control) {
/** @type {?} */
let isValid = 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
* @return {?}
*/
static validateCardExpiry(control) {
if (control) {
/** @type {?} */
let controlValue = control.value.split("/");
/** @type {?} */
let isValid = false;
if (controlValue.length > 1) {
/** @type {?} */
let month = controlValue[0].replace(/^\s+|\s+$/g, '');
/** @type {?} */
let year = controlValue[1].replace(/^\s+|\s+$/g, '');
isValid = fns.validateCardExpiry(month, year);
}
if (!isValid) {
return {
"error": "CREDIT_EXPIRY_INVALID"
};
}
}
return null;
}
/**
* Validates cards CVC
* Also removes any spaces
* @param {?} control
* @return {?}
*/
static validateCardCvc(control) {
if (control) {
/** @type {?} */
let isValid = fns.validateCardCVC(control.value);
if (!isValid) {
return {
"error": "CREDIT_CARD_INVALID"
};
}
}
return null;
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { NgXCreditCardsModule, CreditCardValidator, CCCvcFormatDirective as ɵc, CCExpiryFormatDirective as ɵb, CCNumberFormatDirective as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4Mi1jcmVkaXQtY2FyZHMuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtbnVtYmVyLWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtZXhwaXJ5LWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtY3ZjLWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL25neGNyZWRpdGNhcmQubW9kdWxlLnRzIiwibmc6Ly9uZ3gyLWNyZWRpdC1jYXJkcy92YWxpZGF0b3JzL0NyZWRpdENhcmQudmFsaWRhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuXHREaXJlY3RpdmUsIFxuXHRFbGVtZW50UmVmLCBcblx0UmVuZGVyZXIsXG5cdEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0ICogYXMgUGF5bWVudCBmcm9tICdwYXltZW50JztcblxuQERpcmVjdGl2ZSh7IFxuXHRzZWxlY3RvcjogJ1tjY051bV0nIFxufSlcbmV4cG9ydCBjbGFzcyBDQ051bWJlckZvcm1hdERpcmVjdGl2ZSB7XG5cblx0Y2FyZFR5cGU6IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlciwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuXG5cdFx0bGV0IGVsZW1lbnQgICA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblx0XHR0aGlzLmNhcmRUeXBlID0gXCJcIjtcblxuICAgIFx0Ly8gY2FsbCBsaWIgZnVuY3Rpb25zXG4gICAgICAgIFBheW1lbnQuZm9ybWF0Q2FyZE51bWJlcihlbGVtZW50KTtcbiAgICAgICAgUGF5bWVudC5yZXN0cmljdE51bWVyaWMoZWxlbWVudCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdrZXlwcmVzcycsIFsnJGV2ZW50J10pIG9uS2V5cHJlc3MoZTogYW55KSB7XG5cdFx0XG5cdFx0bGV0IGVsZW1lbnQgXHQgID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuXHRcdGxldCBlbGVtZW50VmFsdWUgID0gZWxlbWVudC52YWx1ZTtcblxuXHRcdHRoaXMuY2FyZFR5cGUgPSBQYXltZW50LmZucy5jYXJkVHlwZShlbGVtZW50VmFsdWUpO1xuXG5cdFx0aWYgKCB0aGlzLmNhcmRUeXBlICE9PSBcIlwiIClcblx0XHR7XHRcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKGVsZW1lbnQsIHRoaXMuY2FyZFR5cGUsIGZhbHNlKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuY2FyZFR5cGUgPSBcIlwiO1x0XHRcdFxuXHRcdH1cblxuXHR9XG5cbn1cbiIsImltcG9ydCB7IFxuICBEaXJlY3RpdmUsIFxuICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBQYXltZW50IGZyb20gJ3BheW1lbnQnO1xuXG5ARGlyZWN0aXZlKHsgXG5cdHNlbGVjdG9yOiAnW2NjRXhwXScgXG59KVxuZXhwb3J0IGNsYXNzIENDRXhwaXJ5Rm9ybWF0RGlyZWN0aXZlIHtcbiAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgIFx0bGV0IGVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBcdC8vIGNhbGwgbGliIGZ1bmN0aW9uc1xuICAgICAgICBQYXltZW50LmZvcm1hdENhcmRFeHBpcnkoZWxlbWVudCk7XG4gICAgICAgIFBheW1lbnQucmVzdHJpY3ROdW1lcmljKGVsZW1lbnQpO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgXG4gIERpcmVjdGl2ZSwgXG4gIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCAqIGFzIFBheW1lbnQgZnJvbSAncGF5bWVudCc7XG5cbkBEaXJlY3RpdmUoeyBcblx0c2VsZWN0b3I6ICdbY2NDdmNdJyBcbn0pXG5leHBvcnQgY2xhc3MgQ0NDdmNGb3JtYXREaXJlY3RpdmUge1xuICBcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7XG4gICAgXHRsZXQgZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblxuICAgIFx0Ly8gY2FsbCBsaWIgZnVuY3Rpb25zXG4gICAgICAgIFBheW1lbnQuZm9ybWF0Q2FyZENWQyhlbGVtZW50KTtcbiAgICAgICAgUGF5bWVudC5yZXN0cmljdE51bWVyaWMoZWxlbWVudCk7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDQ051bWJlckZvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1udW1iZXItZm9ybWF0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDQ0V4cGlyeUZvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1leHBpcnktZm9ybWF0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDQ0N2Y0Zvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1jdmMtZm9ybWF0LmRpcmVjdGl2ZSc7XG5cbmltcG9ydCAqIGFzIFBheW1lbnQgZnJvbSAncGF5bWVudCc7XG5cbmNvbnN0IENDX0RJUkVDVElWRVMgPSBbXG5cdENDTnVtYmVyRm9ybWF0RGlyZWN0aXZlLFxuXHRDQ0V4cGlyeUZvcm1hdERpcmVjdGl2ZSwgXG5cdENDQ3ZjRm9ybWF0RGlyZWN0aXZlXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IENDX0RJUkVDVElWRVMsXG4gIGV4cG9ydHM6IENDX0RJUkVDVElWRVNcbn0pXG5leHBvcnQgY2xhc3MgTmdYQ3JlZGl0Q2FyZHNNb2R1bGUge1xufSIsImltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0ICogYXMgUGF5bWVudCBmcm9tICdwYXltZW50JztcblxuZXhwb3J0IGNsYXNzIENyZWRpdENhcmRWYWxpZGF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIGEgY2MgbnVtYmVyXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkTnVtYmVyKGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSBQYXltZW50LmZucy52YWxpZGF0ZUNhcmROdW1iZXIoY29udHJvbC52YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0NBUkRfSU5WQUxJRFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcblxuICAgICAgICByZXR1cm4gbnVsbDsgICBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhlIGV4cGlyeSBkYXRlLlxuICAgICAqIEJyZWFrcyBleHAgYnkgXCIvXCIgc3RyaW5nIGFuZCBhc3N1bWVzIHRoYXQgZmlyc3QgYXJyYXkgZW50cnkgaXMgbW9udGggYW5kIHNlY29uZCB5ZWFyXG4gICAgICogQWxzbyByZW1vdmVzIGFueSBzcGFjZXMgXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkRXhwaXJ5KGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2wudmFsdWUuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgbGV0IGlzVmFsaWQgICAgICA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoY29udHJvbFZhbHVlLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoID0gY29udHJvbFZhbHVlWzBdLnJlcGxhY2UoL15cXHMrfFxccyskL2csJycpO1xuICAgICAgICAgICAgICAgIGxldCB5ZWFyID0gY29udHJvbFZhbHVlWzFdLnJlcGxhY2UoL15cXHMrfFxccyskL2csJycpO1xuXG4gICAgICAgICAgICAgICAgaXNWYWxpZCA9IFBheW1lbnQuZm5zLnZhbGlkYXRlQ2FyZEV4cGlyeShtb250aCwgeWVhcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0VYUElSWV9JTlZBTElEXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgIFxuXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgY2FyZHMgQ1ZDXG4gICAgICogQWxzbyByZW1vdmVzIGFueSBzcGFjZXMgXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkQ3ZjKGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSBQYXltZW50LmZucy52YWxpZGF0ZUNhcmRDVkMoY29udHJvbC52YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0NBUkRfSU5WQUxJRFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcblxuICAgICAgICByZXR1cm4gbnVsbDsgIFxuICAgIH1cblxufVxuIl0sIm5hbWVzIjpbIlBheW1lbnQuZm9ybWF0Q2FyZE51bWJlciIsIlBheW1lbnQucmVzdHJpY3ROdW1lcmljIiwiUGF5bWVudC5mbnMiLCJQYXltZW50LmZvcm1hdENhcmRFeHBpcnkiLCJQYXltZW50LmZvcm1hdENhcmRDVkMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7Ozs7SUFnQkMsWUFBb0IsUUFBa0IsRUFBVSxFQUFjO1FBQTFDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFZOztRQUU3RCxJQUFJLE9BQU8sR0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQzs7UUFHYkEsZ0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbENDLGVBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDdkM7Ozs7O0lBRXFDLFVBQVUsQ0FBQyxDQUFNOztRQUV0RCxJQUFJLE9BQU8sR0FBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQzs7UUFDdkMsSUFBSSxZQUFZLEdBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztRQUVsQyxJQUFJLENBQUMsUUFBUSxHQUFHQyxHQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRW5ELElBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQ3pCO1lBQ0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDN0Q7YUFFRDtZQUNDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1NBQ25CO0tBRUQ7OztZQWpDRCxTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLFNB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