UNPKG

ngx2-credit-cards

Version:

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

263 lines (252 loc) 18.6 kB
(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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