import type { CreditCardBrand } from '../../../index'; /** * Calculates the credit card type. * Extracted from https://locastic.com/blog/how-to-check-credit-card-type-with-javascript */ export function getCreditCardBrand(cardNumber: string): CreditCardBrand { const cc = cardNumber.replace(/ /g, ''); let amex = new RegExp('^3[47][0-9]{13}$'); // starts with 34 or 37 [15 digits] let visa = new RegExp('^4[0-9]{12}(?:[0-9]{3})?$'); // if it starts with a 4 it’s a Visa [16 digits (13 in some special cases)] let mastercard = new RegExp('^5[1-5][0-9]{14}$'); // First 2 digits can range from 51 to 55, but as mentioned above since 2017. they also cover the 2221-2720 range [luckily in both cases 16 digits] let mastercard2 = new RegExp('^2[2-7][0-9]{14}$'); let disco1 = new RegExp('^6011[0-9]{12}[0-9]*$'); // if it starts with 64 or 65 [16–19 digits] it’s definitely Discover, but… It can also start with any of these 6011, 622126 – 622925, 624000 – 626999, 628200 – 628899 (😭 ) let disco2 = new RegExp('^62[24568][0-9]{13}[0-9]*$'); let disco3 = new RegExp('^6[45][0-9]{14}[0-9]*$'); let diners = new RegExp('^3[0689][0-9]{12}[0-9]*$'); // 36 definitely Diners [14-19 digits], but also 300–305, 3095, 38–39 [note that these range from 16-19 digits] let jcb = new RegExp('^35[0-9]{14}[0-9]*$'); //covers the range 3528-3589 [16–19 digits] let uatp = new RegExp('^1[0-9]{14}$'); // UATP cards are 15 digits and start with a 1 if (visa.test(cc)) { return 'visa'; } if (amex.test(cc)) { return 'american_express'; } if (mastercard.test(cc) || mastercard2.test(cc)) { return 'mastercard'; } if (disco1.test(cc) || disco2.test(cc) || disco3.test(cc)) { return 'discover'; } if (diners.test(cc)) { return 'diners_club'; } if (jcb.test(cc)) { return 'jcb'; } if (uatp.test(cc)) { return 'uatp'; } return ''; }