UNPKG

ngx2-credit-cards

Version:

A Credit Card Directives and Reactive Form Validators package for Angular X (6+)

246 lines (237 loc) 16.7 kB
import { Directive, ElementRef, Renderer, HostListener, NgModule } from '@angular/core'; import { formatCardCVC, restrictNumeric, formatCardNumber, fns, formatCardExpiry } from 'payment'; /** * @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 formatCardNumber(element); 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 = 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 = function () { return [ { type: Renderer }, { type: ElementRef } ]; }; CCNumberFormatDirective.propDecorators = { onKeypress: [{ type: 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 formatCardExpiry(element); restrictNumeric(element); } CCExpiryFormatDirective.decorators = [ { type: Directive, args: [{ selector: '[ccExp]' },] } ]; /** @nocollapse */ CCExpiryFormatDirective.ctorParameters = function () { return [ { type: 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 formatCardCVC(element); restrictNumeric(element); } CCCvcFormatDirective.decorators = [ { type: Directive, args: [{ selector: '[ccCvc]' },] } ]; /** @nocollapse */ CCCvcFormatDirective.ctorParameters = function () { return [ { type: 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: 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 = 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 = 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 = 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 */ export { NgXCreditCardsModule, CreditCardValidator, CCCvcFormatDirective as ɵc, CCExpiryFormatDirective as ɵb, CCNumberFormatDirective as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4Mi1jcmVkaXQtY2FyZHMuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtbnVtYmVyLWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtZXhwaXJ5LWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL2RpcmVjdGl2ZXMvY2MtY3ZjLWZvcm1hdC5kaXJlY3RpdmUudHMiLCJuZzovL25neDItY3JlZGl0LWNhcmRzL25neGNyZWRpdGNhcmQubW9kdWxlLnRzIiwibmc6Ly9uZ3gyLWNyZWRpdC1jYXJkcy92YWxpZGF0b3JzL0NyZWRpdENhcmQudmFsaWRhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuXHREaXJlY3RpdmUsIFxuXHRFbGVtZW50UmVmLCBcblx0UmVuZGVyZXIsXG5cdEhvc3RMaXN0ZW5lclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0ICogYXMgUGF5bWVudCBmcm9tICdwYXltZW50JztcblxuQERpcmVjdGl2ZSh7IFxuXHRzZWxlY3RvcjogJ1tjY051bV0nIFxufSlcbmV4cG9ydCBjbGFzcyBDQ051bWJlckZvcm1hdERpcmVjdGl2ZSB7XG5cblx0Y2FyZFR5cGU6IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlciwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuXG5cdFx0bGV0IGVsZW1lbnQgICA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblx0XHR0aGlzLmNhcmRUeXBlID0gXCJcIjtcblxuICAgIFx0Ly8gY2FsbCBsaWIgZnVuY3Rpb25zXG4gICAgICAgIFBheW1lbnQuZm9ybWF0Q2FyZE51bWJlcihlbGVtZW50KTtcbiAgICAgICAgUGF5bWVudC5yZXN0cmljdE51bWVyaWMoZWxlbWVudCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdrZXlwcmVzcycsIFsnJGV2ZW50J10pIG9uS2V5cHJlc3MoZTogYW55KSB7XG5cdFx0XG5cdFx0bGV0IGVsZW1lbnQgXHQgID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuXHRcdGxldCBlbGVtZW50VmFsdWUgID0gZWxlbWVudC52YWx1ZTtcblxuXHRcdHRoaXMuY2FyZFR5cGUgPSBQYXltZW50LmZucy5jYXJkVHlwZShlbGVtZW50VmFsdWUpO1xuXG5cdFx0aWYgKCB0aGlzLmNhcmRUeXBlICE9PSBcIlwiIClcblx0XHR7XHRcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKGVsZW1lbnQsIHRoaXMuY2FyZFR5cGUsIGZhbHNlKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuY2FyZFR5cGUgPSBcIlwiO1x0XHRcdFxuXHRcdH1cblxuXHR9XG5cbn1cbiIsImltcG9ydCB7IFxuICBEaXJlY3RpdmUsIFxuICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBQYXltZW50IGZyb20gJ3BheW1lbnQnO1xuXG5ARGlyZWN0aXZlKHsgXG5cdHNlbGVjdG9yOiAnW2NjRXhwXScgXG59KVxuZXhwb3J0IGNsYXNzIENDRXhwaXJ5Rm9ybWF0RGlyZWN0aXZlIHtcbiAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgIFx0bGV0IGVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBcdC8vIGNhbGwgbGliIGZ1bmN0aW9uc1xuICAgICAgICBQYXltZW50LmZvcm1hdENhcmRFeHBpcnkoZWxlbWVudCk7XG4gICAgICAgIFBheW1lbnQucmVzdHJpY3ROdW1lcmljKGVsZW1lbnQpO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgXG4gIERpcmVjdGl2ZSwgXG4gIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCAqIGFzIFBheW1lbnQgZnJvbSAncGF5bWVudCc7XG5cbkBEaXJlY3RpdmUoeyBcblx0c2VsZWN0b3I6ICdbY2NDdmNdJyBcbn0pXG5leHBvcnQgY2xhc3MgQ0NDdmNGb3JtYXREaXJlY3RpdmUge1xuICBcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7XG4gICAgXHRsZXQgZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcblxuICAgIFx0Ly8gY2FsbCBsaWIgZnVuY3Rpb25zXG4gICAgICAgIFBheW1lbnQuZm9ybWF0Q2FyZENWQyhlbGVtZW50KTtcbiAgICAgICAgUGF5bWVudC5yZXN0cmljdE51bWVyaWMoZWxlbWVudCk7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDQ051bWJlckZvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1udW1iZXItZm9ybWF0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDQ0V4cGlyeUZvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1leHBpcnktZm9ybWF0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDQ0N2Y0Zvcm1hdERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jYy1jdmMtZm9ybWF0LmRpcmVjdGl2ZSc7XG5cbmltcG9ydCAqIGFzIFBheW1lbnQgZnJvbSAncGF5bWVudCc7XG5cbmNvbnN0IENDX0RJUkVDVElWRVMgPSBbXG5cdENDTnVtYmVyRm9ybWF0RGlyZWN0aXZlLFxuXHRDQ0V4cGlyeUZvcm1hdERpcmVjdGl2ZSwgXG5cdENDQ3ZjRm9ybWF0RGlyZWN0aXZlXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IENDX0RJUkVDVElWRVMsXG4gIGV4cG9ydHM6IENDX0RJUkVDVElWRVNcbn0pXG5leHBvcnQgY2xhc3MgTmdYQ3JlZGl0Q2FyZHNNb2R1bGUge1xufSIsImltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0ICogYXMgUGF5bWVudCBmcm9tICdwYXltZW50JztcblxuZXhwb3J0IGNsYXNzIENyZWRpdENhcmRWYWxpZGF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIGEgY2MgbnVtYmVyXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkTnVtYmVyKGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSBQYXltZW50LmZucy52YWxpZGF0ZUNhcmROdW1iZXIoY29udHJvbC52YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0NBUkRfSU5WQUxJRFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcblxuICAgICAgICByZXR1cm4gbnVsbDsgICBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgdGhlIGV4cGlyeSBkYXRlLlxuICAgICAqIEJyZWFrcyBleHAgYnkgXCIvXCIgc3RyaW5nIGFuZCBhc3N1bWVzIHRoYXQgZmlyc3QgYXJyYXkgZW50cnkgaXMgbW9udGggYW5kIHNlY29uZCB5ZWFyXG4gICAgICogQWxzbyByZW1vdmVzIGFueSBzcGFjZXMgXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkRXhwaXJ5KGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2wudmFsdWUuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgbGV0IGlzVmFsaWQgICAgICA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoY29udHJvbFZhbHVlLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoID0gY29udHJvbFZhbHVlWzBdLnJlcGxhY2UoL15cXHMrfFxccyskL2csJycpO1xuICAgICAgICAgICAgICAgIGxldCB5ZWFyID0gY29udHJvbFZhbHVlWzFdLnJlcGxhY2UoL15cXHMrfFxccyskL2csJycpO1xuXG4gICAgICAgICAgICAgICAgaXNWYWxpZCA9IFBheW1lbnQuZm5zLnZhbGlkYXRlQ2FyZEV4cGlyeShtb250aCwgeWVhcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0VYUElSWV9JTlZBTElEXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgIFxuXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgY2FyZHMgQ1ZDXG4gICAgICogQWxzbyByZW1vdmVzIGFueSBzcGFjZXMgXG4gICAgICogQHBhcmFtIGNvbnRyb2xcbiAgICAgKi9cbiAgICBzdGF0aWMgdmFsaWRhdGVDYXJkQ3ZjKGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcblxuICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSBQYXltZW50LmZucy52YWxpZGF0ZUNhcmRDVkMoY29udHJvbC52YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiQ1JFRElUX0NBUkRfSU5WQUxJRFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICAgICBcblxuICAgICAgICByZXR1cm4gbnVsbDsgIFxuICAgIH1cblxufVxuIl0sIm5hbWVzIjpbIlBheW1lbnQuZm9ybWF0Q2FyZE51bWJlciIsIlBheW1lbnQucmVzdHJpY3ROdW1lcmljIiwiUGF5bWVudC5mbnMiLCJQYXltZW50LmZvcm1hdENhcmRFeHBpcnkiLCJQYXltZW50LmZvcm1hdENhcmRDVkMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtJQWdCQyxpQ0FBb0IsUUFBa0IsRUFBVSxFQUFjO1FBQTFDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFZOztRQUU3RCxJQUFJLE9BQU8sR0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQzs7UUFHYkEsZ0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbENDLGVBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDdkM7Ozs7O0lBRXFDLDRDQUFVOzs7O0lBQWhELFVBQWlELENBQU07O1FBRXRELElBQUksT0FBTyxHQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDOztRQUN2QyxJQUFJLFlBQVksR0FBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBRWxDLElBQUksQ0FBQyxRQUFRLEdBQUdDLEdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbkQsSUFBSyxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFDekI7WUFDQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM3RDthQUVEO1lBQ0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDbkI7S0FFRDs7Z0JBakNELFNBQVMsU0FBQztvQkFDVixRQUFR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