UNPKG

react-svg-credit-card-payment-icons

Version:

React components library with 6 styles, 108 icons, TypeScript support, and a variety of types and formats for easy integration into React applications.

452 lines (436 loc) 15.1 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// generated/cardMetadata.ts var CARD_METADATA = [ { type: "Alipay", legacyType: null, displayName: "Alipay", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: [], patterns: { full: [].map((p) => new RegExp(p)), prefix: null }, lengthRange: null, formatPattern: null, issuingCountries: ["GLOBAL"] }, { type: "AmericanExpress", legacyType: "Americanexpress", displayName: "American Express", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: ["Amex"], variants: {}, testNumbers: ["378282246310005", "371449635398431"], patterns: { full: ["^3[47][0-9]{13}$"].map((p) => new RegExp(p)), prefix: new RegExp("^3[47]") }, lengthRange: { "min": 15, "max": 15 }, formatPattern: [4, 6, 5], issuingCountries: ["US"] }, { type: "DinersClub", legacyType: "Diners", displayName: "Diners Club", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["3056930009020004", "30569309025904", "38520000023237", "36227206271667"], patterns: { full: ["^3[0689][0-9]{12}$", "^30[0-5][0-9]{11}$", "^3[0689][0-9]{14}$"].map((p) => new RegExp(p)), prefix: new RegExp("^3(0[0-5]|6|8)") }, lengthRange: { "min": 14, "max": 16 }, formatPattern: { "14": [4, 6, 4], "16": [4, 4, 4, 4] }, issuingCountries: ["US"] }, { type: "Discover", legacyType: null, displayName: "Discover", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["6011111111111117", "6011000990139424", "6011981111111113"], patterns: { full: ["^6(?:011|5[0-9]{2})[0-9]{12}$"].map((p) => new RegExp(p)), prefix: new RegExp("^6(011|5[0-9]{2}|[45])") }, lengthRange: { "min": 16, "max": 16 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["US"] }, { type: "Elo", legacyType: null, displayName: "Elo", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["5066991111111118"], patterns: { full: ["^(?:4011(78|79)|43(1274|8935)|45(1416|7393|763(1|2))|50(4175|6699|67[0-6][0-9]|677[0-8]|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9])|627780|63(6297|6368|6369))[0-9]*$"].map((p) => new RegExp(p)), prefix: new RegExp("^(4011(78|79)|43(1274|8935)|45(1416|7393|763[12])|50(4175|6699|67[0-6]|677[0-8])|627780|636(297|368|369))") }, lengthRange: { "min": 16, "max": 16 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["BR"] }, { type: "Generic", legacyType: null, displayName: "Generic Card (Front)", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: ["GenericCard", "GenericCardFront"], variants: { "Code": { "slug": "code", "displayName": "Generic Card (Back) - Security Code", "aliases": ["GenericBack", "GenericCardBack", "CvvBack", "CvcBack"] }, "CodeFront": { "slug": "code-front", "displayName": "Generic Card (Front) - Security Code", "aliases": ["GenericFrontCode", "CvvFront", "CvcFront"] } }, testNumbers: [], patterns: { full: [].map((p) => new RegExp(p)), prefix: null }, lengthRange: null, formatPattern: null, issuingCountries: null }, { type: "Hipercard", legacyType: null, displayName: "Hipercard", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: { "Hiper": { "slug": "hiper", "displayName": "Hiper", "iconAuthor": "Aaron Fagan", "iconLicense": "Apache-2.0" } }, testNumbers: ["6062825624254001", "6062823936268330", "6062828888666688"], patterns: { full: ["^(606282\\d{10}(\\d{3})?)|(3841\\d{15})$"].map((p) => new RegExp(p)), prefix: new RegExp("^(606282|3841)") }, lengthRange: { "min": 16, "max": 16 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["BR"] }, { type: "JCB", legacyType: "Jcb", displayName: "JCB", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["3566002020360505"], patterns: { full: ["^(?:2131|1800|35[0-9]{3})[0-9]{11}$"].map((p) => new RegExp(p)), prefix: new RegExp("^(2131|1800|35)") }, lengthRange: { "min": 15, "max": 16 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["JP"] }, { type: "Maestro", legacyType: null, displayName: "Maestro", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["6771798021000008", "6771798021000016"], patterns: { full: ["^(?:5[0678][0-9]{2}|6304|6390|67[0-9]{2})[0-9]{8,15}$"].map((p) => new RegExp(p)), prefix: new RegExp("^(5[0678]|6304|6390|67)") }, lengthRange: { "min": 12, "max": 19 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["GLOBAL"] }, { type: "Mastercard", legacyType: null, displayName: "Mastercard", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["5555555555554444", "2223003122003222", "5200828282828210", "5105105105105100"], patterns: { full: ["^5[1-5][0-9]{14}$", "^2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9][0-9]|7(?:[01][0-9]|20))[0-9]{12}$"].map((p) => new RegExp(p)), prefix: new RegExp("^(5[1-5]|2(22[1-9]|2[3-9]|[3-6]|7[01]|720))") }, lengthRange: { "min": 16, "max": 16 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["GLOBAL"] }, { type: "Mir", legacyType: null, displayName: "Mir", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["2200000000000004", "2200000000000012", "2202207558945880"], patterns: { full: ["^220[0-4][0-9]{12}$"].map((p) => new RegExp(p)), prefix: new RegExp("^220[0-4]") }, lengthRange: { "min": 16, "max": 16 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["RU"] }, { type: "PayPal", legacyType: "Paypal", displayName: "PayPal", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: [], patterns: { full: [].map((p) => new RegExp(p)), prefix: null }, lengthRange: null, formatPattern: null, issuingCountries: ["GLOBAL"] }, { type: "Swish", legacyType: null, displayName: "Swish", iconAuthor: "ThorANilsson", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: [], patterns: { full: [].map((p) => new RegExp(p)), prefix: null }, lengthRange: null, formatPattern: null, issuingCountries: ["SE"] }, { type: "UnionPay", legacyType: "Unionpay", displayName: "UnionPay", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["6200000000000005", "6200000000000047", "6205500000000000004"], patterns: { full: ["^62[0-9]{14,17}$"].map((p) => new RegExp(p)), prefix: new RegExp("^62") }, lengthRange: { "min": 16, "max": 19 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["CN"] }, { type: "Visa", legacyType: null, displayName: "Visa", iconAuthor: "Aaron Fagan", iconLicense: "Apache-2.0", aliases: [], variants: {}, testNumbers: ["4242424242424242", "4000056655665556", "4012888888881881"], patterns: { full: ["^4[0-9]{12}(?:[0-9]{3})?$"].map((p) => new RegExp(p)), prefix: new RegExp("^4") }, lengthRange: { "min": 13, "max": 19 }, formatPattern: [4, 4, 4, 4], issuingCountries: ["GLOBAL"] } ]; // src/utils/loadCardDefinitions.ts function calculateSpecificity(pattern) { if (!pattern) return 0; const patternStr = pattern.source; let specificity = 0; const exactChars = patternStr.match(/[0-9]/g); specificity += (_optionalChain([exactChars, 'optionalAccess', _ => _.length]) || 0) * 10; const ranges = patternStr.match(/\[\d-\d\]/g); specificity += (_optionalChain([ranges, 'optionalAccess', _2 => _2.length]) || 0) * 5; const groups = patternStr.match(/\([^)]+\|[^)]+\)/g); specificity += (_optionalChain([groups, 'optionalAccess', _3 => _3.length]) || 0) * 3; const wildcards = patternStr.match(/\[0-9\]/g); specificity -= (_optionalChain([wildcards, 'optionalAccess', _4 => _4.length]) || 0) * 1; if (patternStr.startsWith("^")) specificity += 20; return specificity; } var CARD_DEFINITIONS = null; function getCardDefinitions() { if (CARD_DEFINITIONS) { return CARD_DEFINITIONS; } const definitions = []; for (const metadata of CARD_METADATA) { const specificity = calculateSpecificity(metadata.patterns.prefix); definitions.push({ type: metadata.type, legacyType: metadata.legacyType, patterns: metadata.patterns, lengthRange: metadata.lengthRange, formatPattern: metadata.formatPattern, issuingCountries: metadata.issuingCountries, specificity }); } definitions.sort((a, b) => b.specificity - a.specificity); CARD_DEFINITIONS = definitions; return CARD_DEFINITIONS; } // src/utils/cardUtils.ts function sanitizeCardNumber(cardNumber) { return cardNumber.replace(/\D/g, ""); } function getCardType(cardNumber) { const sanitized = sanitizeCardNumber(cardNumber); if (sanitized.length < 4) { return "Generic"; } const isPartial = sanitized.length < 13; for (const { type, patterns } of getCardDefinitions()) { if (isPartial) { if (_optionalChain([patterns, 'access', _5 => _5.prefix, 'optionalAccess', _6 => _6.test, 'call', _7 => _7(sanitized)])) { return type; } } else { if (patterns.full.some((p) => p.test(sanitized))) { return type; } } } return "Generic"; } function detectCardType(cardNumber) { const sanitized = sanitizeCardNumber(cardNumber); if (sanitized.length < 4) { return "Generic"; } const isPartial = sanitized.length < 13; for (const { type, legacyType, patterns } of getCardDefinitions()) { if (isPartial) { if (_optionalChain([patterns, 'access', _8 => _8.prefix, 'optionalAccess', _9 => _9.test, 'call', _10 => _10(sanitized)])) { return legacyType || type; } } else { if (patterns.full.some((p) => p.test(sanitized))) { return legacyType || type; } } } return "Generic"; } function validateCardNumber(cardNumber) { const sanitized = sanitizeCardNumber(cardNumber); if (sanitized.length < 13 || sanitized.length > 19) { return false; } let sum = 0; let alternate = false; for (let i = sanitized.length - 1; i >= 0; i--) { let digit = parseInt(sanitized[i]); if (alternate) { digit *= 2; if (digit > 9) { digit = digit % 10 + 1; } } sum += digit; alternate = !alternate; } return sum % 10 === 0; } function formatCardNumber(cardNumber) { const sanitized = sanitizeCardNumber(cardNumber); const cardType = getCardType(sanitized); const cardDefinition = getCardDefinitions().find((def) => def.type === cardType); if (!_optionalChain([cardDefinition, 'optionalAccess', _11 => _11.formatPattern])) { return sanitized; } let pattern; if (Array.isArray(cardDefinition.formatPattern)) { pattern = cardDefinition.formatPattern; } else { const lengthKey = sanitized.length.toString(); pattern = cardDefinition.formatPattern[lengthKey] || cardDefinition.formatPattern[Object.keys(cardDefinition.formatPattern)[0]]; } let formatted = ""; let position = 0; for (const groupSize of pattern) { if (position >= sanitized.length) break; if (formatted) formatted += " "; formatted += sanitized.slice(position, position + groupSize); position += groupSize; } if (position < sanitized.length) { if (formatted) formatted += " "; formatted += sanitized.slice(position); } return formatted; } function validateCardForType(cardNumber, cardType) { const sanitized = sanitizeCardNumber(cardNumber); const cardEntry = getCardDefinitions().find(({ type }) => type === cardType); if (!cardEntry || cardEntry.patterns.full.length === 0) { return false; } return cardEntry.patterns.full.some((pattern) => pattern.test(sanitized)) && validateCardNumber(sanitized); } function getCardLengthRange(cardType) { return _nullishCoalesce(_optionalChain([getCardDefinitions, 'call', _12 => _12(), 'access', _13 => _13.find, 'call', _14 => _14(({ type }) => type === cardType), 'optionalAccess', _15 => _15.lengthRange]), () => ( null)); } function isCardNumberPotentiallyValid(cardNumber) { const sanitized = sanitizeCardNumber(cardNumber); const cardType = getCardType(sanitized); const lengthRange = getCardLengthRange(cardType); if (!lengthRange) { return false; } return sanitized.length >= lengthRange.min && sanitized.length <= lengthRange.max; } function maskCardNumber(cardNumber, maskChar = "*") { const sanitized = sanitizeCardNumber(cardNumber); if (sanitized.length < 4) { return sanitized; } const lastFour = sanitized.slice(-4); const maskedPortion = maskChar.repeat(sanitized.length - 4); return formatCardNumber(maskedPortion + lastFour); } function getCardsByCountry(countryCode, options = {}) { const { includeGlobal = true } = options; const definitions = getCardDefinitions(); return definitions.filter((def) => { const countries = def.issuingCountries; if (countries === null) { return false; } if (countryCode === "GLOBAL") { return countries.includes("GLOBAL"); } if (countries.includes(countryCode)) { return true; } if (includeGlobal && countries.includes("GLOBAL")) { return true; } return false; }).map((def) => def.type); } exports.CARD_METADATA = CARD_METADATA; exports.sanitizeCardNumber = sanitizeCardNumber; exports.getCardType = getCardType; exports.detectCardType = detectCardType; exports.validateCardNumber = validateCardNumber; exports.formatCardNumber = formatCardNumber; exports.validateCardForType = validateCardForType; exports.getCardLengthRange = getCardLengthRange; exports.isCardNumberPotentiallyValid = isCardNumberPotentiallyValid; exports.maskCardNumber = maskCardNumber; exports.getCardsByCountry = getCardsByCountry;