|
| 1 | +enum CardType { |
| 2 | + Visa = 'visa', |
| 3 | + Mastercard = 'mastercard', |
| 4 | + Amex = 'amex', |
| 5 | + Diners = 'diners', |
| 6 | + Discover = 'discover', |
| 7 | +} |
| 8 | + |
| 9 | +type CardTypeConfig = { size: number[]; prefixes: string[] }; |
| 10 | +type CardTypes = { [key in CardType]: CardTypeConfig }; |
| 11 | + |
| 12 | +const options: CardTypes = { |
| 13 | + visa: { size: [13, 16], prefixes: ['4'] }, |
| 14 | + mastercard: { size: [16], prefixes: ['51', '52', '53', '54', '55'] }, |
| 15 | + amex: { size: [15], prefixes: ['34', '37'] }, |
| 16 | + diners: { |
| 17 | + size: [14], |
| 18 | + prefixes: ['300', '301', '302', '303', '304', '305', '36', '38'], |
| 19 | + }, |
| 20 | + discover: { |
| 21 | + size: [16], |
| 22 | + prefixes: ['6011', '644', '645', '646', '647', '648', '649', '65'], |
| 23 | + }, |
| 24 | +}; |
| 25 | + |
| 26 | +/** |
| 27 | + * Returns the card type based on the card number |
| 28 | + * Accepts different formats of card number: |
| 29 | + * - 4242 4242 4242 4242 |
| 30 | + * - 4242-4242-4242-4242 |
| 31 | + * - 4242424242424242 |
| 32 | + * @param cardNumber {string} - The card number to be validated |
| 33 | + * @returns The card type name |
| 34 | + */ |
| 35 | +export const getCardBrand = (cardNumber: string) => { |
| 36 | + const formattedNumber = cardNumber.replace(/[ -]/g, ''); // Removing spaces from the card number |
| 37 | + const validateCode = formattedNumber.substring(0, 4); // Getting the first four gits of the card number |
| 38 | + |
| 39 | + for (const [option, config] of Object.entries(options)) { |
| 40 | + const { size, prefixes } = config; |
| 41 | + if (size.includes(formattedNumber.length)) { |
| 42 | + const testCard = new RegExp(`^(${prefixes.join('|')})`); |
| 43 | + if (testCard.test(validateCode)) { |
| 44 | + return option; |
| 45 | + } |
| 46 | + } |
| 47 | + } |
| 48 | + |
| 49 | + return 'placeholder'; |
| 50 | +}; |
0 commit comments