StructureJS
0.14.5A class based utility library for building modular and scalable web platform applications. Features opt-in classes and utilities which provide a solid foundation and toolset to build your next project.
(function (factory) { if (typeof module === 'object' && typeof module.exports === 'object') { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === 'function' && define.amd) { define(["require", "exports"], factory); } })(function (require, exports) { "use strict"; /** * A MerchantUtility class that has several static methods to assist in development. * * @class MerchantUtil * @module StructureJS * @submodule util * @author Robert S. (www.codeBelt.com) * @static */ var MerchantUtil = (function () { function MerchantUtil() { throw new Error('[MerchantUtil] Do not instantiate the MerchantUtil class because it is a static class.'); } /** * Encode a credit card number as a string and encode all digits except the last <code>digitsShown</code>. * * @method encodeCreditCardNumber * @param strNumber {string} The credit card number as string. * @param [digitsShown=4] {number} Display this many digits at the end of the card number for security purposes. * @param [encodeChar=*] {string} Optional encoding character to use instead of default '*'. * @returns {string} * @public * @static * @example * MerchantUtil.encodeCreditCardNumber('4556106734384949'); * // ************4949 * * MerchantUtil.encodeCreditCardNumber('4556106734384949', 5, 'x'); * // xxxxxxxxxxx84949 */ MerchantUtil.encodeCreditCardNumber = function (strNumber, digitsShown, encodeChar) { if (digitsShown === void 0) { digitsShown = 4; } if (encodeChar === void 0) { encodeChar = '*'; } var encoded = ''; for (var i = 0; i < strNumber.length - digitsShown; i++) { encoded += encodeChar; } encoded += strNumber.slice(-digitsShown); return encoded; }; /** * Returns a credit card provider name from the credit card number passed in. * * @method getCreditCardProvider * @param cardNumber {string|number} * @returns {string} * @example * MerchantUtil.getCreditCardProvider("4"); * MerchantUtil.getCreditCardProvider("4556106734384949"); * // visa * * MerchantUtil.getCreditCardProvider("5428070016026573"); * // mastercard */ MerchantUtil.getCreditCardProvider = function (cardNumber) { // Remove all non-numeric chars. var stringNumber = String(cardNumber).replace(/[^0-9]/g, ''); for (var _i = 0, _a = MerchantUtil.CARD_TYPES; _i < _a.length; _i++) { var cardType = _a[_i]; for (var _b = 0, _c = cardType.range; _b < _c.length; _b++) { var num = _c[_b]; var regex = new RegExp("^" + num + "+"); if (regex.test(stringNumber) === true) { return cardType.name; } } } return null; }; /** * Validate a credit card's expiration date. * * @method isValidExpirationDate * @param month {number} * @param year {number} * @returns {boolean} * @example * MerchantUtil.isValidExDate(11, 2010); * // false */ MerchantUtil.isValidExpirationDate = function (month, year) { var d = new Date(); var currentMonth = d.getMonth() + 1; var currentYear = d.getFullYear(); if ((year > currentYear) || (year == currentYear && month >= currentMonth)) { return true; } return false; }; /** * Determines if credit card is valid * * @method isCreditCard * @param cardNumber {string|number} The credit card number. * @returns {boolean} * @public * @static * @example * MerchantUtil.isCreditCard('4556106734384949'); * // true */ MerchantUtil.isCreditCard = function (cardNumber) { if (this._validateCreditCard(cardNumber) === true) { return this._validateStructure(cardNumber); } return false; }; /** * https://davidwalsh.name/validate-credit-cards * * @method _validateStructure * @param cardNumber {string|number} * @return {boolean} */ MerchantUtil._validateStructure = function (cardNumber) { // Remove all non-numeric chars. var stringNumber = String(cardNumber).replace(/[^0-9]/g, ''); var results = []; for (var _i = 0, _a = MerchantUtil.CARD_TYPES; _i < _a.length; _i++) { var cardType = _a[_i]; if (stringNumber.match('^' + cardType.regex + '$')) { results.push(cardType.name); } } return results.length ? true : false; }; /** * Determines if credit card is valid using the Luhn formula. * https://gist.github.com/ShirtlessKirk/2134376 * * @method _validateCreditCard * @param cardNumber {string|number} * @return {boolean} */ MerchantUtil._validateCreditCard = function (cardNumber) { // Remove all non-numeric chars. var stringNumber = String(cardNumber).replace(/[^0-9]/g, ''); var prodArr = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]]; var len = stringNumber.length; var mul = 0; var sum = 0; while (len--) { sum += prodArr[mul][parseInt(stringNumber.charAt(len), 10)]; mul ^= 1; } return sum % 10 === 0 && sum > 0; }; /** * @method _updateRanges * @protected */ MerchantUtil._updateRanges = function () { MerchantUtil .CARD_TYPES .forEach(function (cardType) { cardType.range = cardType.range.reduce(function (previous, current) { if (current.indexOf('-') >= 0) { var rangeArray = current.split('-'); for (var i = rangeArray[0]; i <= rangeArray[1]; i++) { previous.push(String(i)); } } else { previous.push(current); } return previous; }, []); }); }; // https://davidwalsh.name/validate-credit-cards // http://www.freeformatter.com/credit-card-number-generator-validator.html // http://www.validcreditcardnumber.com/ MerchantUtil.CARD_TYPES = [ { name: 'American Express', range: ['34', '37'], validLength: [15], regex: '3[47][0-9]{13}', }, { name: 'Diners Club - Carte Blanche', range: ['300-305'], validLength: [14], regex: '3(?:0[0-5][0-9]{11}|[68][0-9]{12})', }, { name: 'Diners Club - International', range: ['36'], validLength: [14], regex: '3(?:0[0-5][0-9]{11}|[68][0-9]{12})', }, { name: 'JCB', range: ['3528-3589'], validLength: [16], regex: '(?:3[0-9]{15}|(2131|1800)[0-9]{11})', }, { name: 'Visa Electron', range: ['4026', '417500', '4508', '4844', '4913', '4917'], validLength: [16], regex: '4(?:[0-9]{12}|[0-9]{15})', }, { name: 'Visa', range: ['4'], validLength: [13, 14, 15, 16, 17, 18, 19], regex: '4(?:[0-9]{12}|[0-9]{15})', }, { name: 'MasterCard', range: ['51-55', '2221-2720'], validLength: [16], regex: '5[1-5][0-9]{14}', }, { name: 'Discover', range: ['6011', '622126-622925', '644-649', '65'], validLength: [16], regex: '6011[0-9]{12}', }, ]; return MerchantUtil; }()); MerchantUtil._updateRanges(); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = MerchantUtil; });