|
1 | | -import CARDS from './cards'; |
| 1 | +import CARDS from './cards' |
2 | 2 |
|
3 | | -const MILLENNIUM = 1000; |
4 | | -const DEFAULT_CODE_LENGTH = 3; |
| 3 | +const MILLENNIUM = 1000 |
| 4 | +const DEFAULT_CODE_LENGTH = 3 |
5 | 5 |
|
6 | | -export const getCreditCardNameByNumber = (number) => { |
7 | | - return findCreditCardObjectByNumber(number).name || 'Credit card is invalid!'; |
8 | | -}; |
| 6 | +export const getCreditCardNameByNumber = number => { |
| 7 | + return findCreditCardObjectByNumber(number).name || 'Credit card is invalid!' |
| 8 | +} |
9 | 9 |
|
10 | 10 | export const isSecurityCodeValid = (creditCardNumber, securityCode) => { |
11 | | - const numberLength = getCreditCardCodeLengthByNumber(creditCardNumber); |
12 | | - return new RegExp(`^[0-9]{${numberLength}}$`).test(securityCode); |
13 | | -}; |
| 11 | + const numberLength = getCreditCardCodeLengthByNumber(creditCardNumber) |
| 12 | + return new RegExp(`^[0-9]{${numberLength}}$`).test(securityCode) |
| 13 | +} |
14 | 14 |
|
15 | 15 | export const isExpirationDateValid = (month, year) => { |
16 | 16 | return ( |
17 | 17 | isValidMonth(month) && |
18 | 18 | isValidYear(year) && |
19 | 19 | isFutureOrPresentDate(month, year) |
20 | | - ); |
21 | | -}; |
| 20 | + ) |
| 21 | +} |
22 | 22 |
|
23 | 23 | export const isValid = (number, options = {}) => { |
24 | | - const { cards } = options; |
25 | | - const rawNumber = removeNonNumbersCaracteres(number); |
| 24 | + const { cards } = options |
| 25 | + const rawNumber = removeNonNumbersCaracteres(number) |
26 | 26 |
|
27 | 27 | if (hasSomeInvalidDigit(number) || !hasCorrectLength(rawNumber)) { |
28 | | - return false; |
| 28 | + return false |
29 | 29 | } |
30 | 30 |
|
31 | | - const sum = sumNumber(rawNumber); |
| 31 | + const sum = sumNumber(rawNumber) |
32 | 32 |
|
33 | | - return checkSum(sum) && validateCardsWhenRequired(number, cards); |
34 | | -}; |
| 33 | + return checkSum(sum) && validateCardsWhenRequired(number, cards) |
| 34 | +} |
35 | 35 |
|
36 | 36 | function validateCardsWhenRequired(number, cards) { |
37 | | - return !cards || !cards.length || validateCards(number, cards); |
| 37 | + return !cards || !cards.length || validateCards(number, cards) |
38 | 38 | } |
39 | 39 |
|
40 | 40 | function validateCards(number, cards) { |
41 | 41 | return ( |
42 | 42 | areCardsSupported(cards) && |
43 | 43 | cards |
44 | | - .map((c) => c.toLowerCase()) |
| 44 | + .map(c => c.toLowerCase()) |
45 | 45 | .includes(getCreditCardNameByNumber(number).toLowerCase()) |
46 | | - ); |
| 46 | + ) |
47 | 47 | } |
48 | 48 |
|
49 | 49 | function hasCorrectLength(number) { |
50 | | - return number && number.length <= 19; |
| 50 | + return number && number.length <= 19 |
51 | 51 | } |
52 | 52 |
|
53 | 53 | function removeNonNumbersCaracteres(number) { |
54 | | - return number.replace(/\D/g, ''); |
| 54 | + return number.replace(/\D/g, '') |
55 | 55 | } |
56 | 56 |
|
57 | 57 | function hasSomeInvalidDigit(creditcardNumber) { |
58 | | - const invalidDigits = new RegExp('[^0-9- ]'); |
59 | | - return invalidDigits.test(creditcardNumber); |
| 58 | + const invalidDigits = new RegExp('[^0-9- ]') |
| 59 | + return invalidDigits.test(creditcardNumber) |
60 | 60 | } |
61 | 61 |
|
62 | 62 | function checkSum(sum) { |
63 | | - return sum > 0 && sum % 10 === 0; |
| 63 | + return sum > 0 && sum % 10 === 0 |
64 | 64 | } |
65 | 65 |
|
66 | 66 | function areCardsSupported(passedCards) { |
67 | | - const supportedCards = CARDS.map((c) => c.name.toLowerCase()); |
68 | | - return passedCards.every((c) => supportedCards.includes(c.toLowerCase())); |
| 67 | + const supportedCards = CARDS.map(c => c.name.toLowerCase()) |
| 68 | + return passedCards.every(c => supportedCards.includes(c.toLowerCase())) |
69 | 69 | } |
70 | 70 |
|
71 | 71 | function findCreditCardObjectByNumber(number) { |
72 | | - if (!number) return {}; |
73 | | - const numberOnly = number.replace(/[^\d]/g, ''); |
74 | | - return CARDS.find((card) => card.bins.test(numberOnly) && card) || {}; |
| 72 | + if (!number) return {} |
| 73 | + const numberOnly = number.replace(/[^\d]/g, '') |
| 74 | + return CARDS.find(card => card.bins.test(numberOnly) && card) || {} |
75 | 75 | } |
76 | 76 |
|
77 | 77 | function getCreditCardCodeLengthByNumber(number) { |
78 | | - return findCreditCardObjectByNumber(number).codeLength || DEFAULT_CODE_LENGTH; |
| 78 | + return findCreditCardObjectByNumber(number).codeLength || DEFAULT_CODE_LENGTH |
79 | 79 | } |
80 | 80 |
|
81 | 81 | function isValidMonth(month) { |
82 | | - return !isNaN(month) && month >= 1 && month <= 12; |
| 82 | + return !isNaN(month) && month >= 1 && month <= 12 |
83 | 83 | } |
84 | 84 |
|
85 | 85 | function isValidYear(year) { |
86 | | - return !isNaN(year) && isValidFullYear(formatFullYear(year)); |
| 86 | + return !isNaN(year) && isValidFullYear(formatFullYear(year)) |
87 | 87 | } |
88 | 88 |
|
89 | 89 | function formatFullYear(year) { |
90 | | - if (year.length === 2) return dateRange(year); |
| 90 | + if (year.length === 2) return dateRange(year) |
91 | 91 |
|
92 | | - return year.length === 4 ? year : 0; |
| 92 | + return year.length === 4 ? year : 0 |
93 | 93 | } |
94 | 94 |
|
95 | 95 | function dateRange(increaseYear = 0) { |
96 | | - const year = parseInt(increaseYear); |
97 | | - const today = new Date(); |
98 | | - return Math.floor(today.getFullYear() / MILLENNIUM) * MILLENNIUM + year; |
| 96 | + const year = parseInt(increaseYear) |
| 97 | + const today = new Date() |
| 98 | + return Math.floor(today.getFullYear() / MILLENNIUM) * MILLENNIUM + year |
99 | 99 | } |
100 | 100 |
|
101 | 101 | function isValidFullYear(year) { |
102 | | - return year >= dateRange() && year <= dateRange(MILLENNIUM); |
| 102 | + return year >= dateRange() && year <= dateRange(MILLENNIUM) |
103 | 103 | } |
104 | 104 |
|
105 | 105 | function isFutureOrPresentDate(month, year) { |
106 | | - const fullYear = formatFullYear(year); |
107 | | - const currentDate = new Date(); |
108 | | - const expirationDate = new Date(); |
| 106 | + const fullYear = formatFullYear(year) |
| 107 | + const currentDate = new Date() |
| 108 | + const expirationDate = new Date() |
109 | 109 |
|
110 | | - currentDate.setFullYear(currentDate.getFullYear(), currentDate.getMonth(), 1); |
111 | | - expirationDate.setFullYear(fullYear, month - 1, 1); |
| 110 | + currentDate.setFullYear(currentDate.getFullYear(), currentDate.getMonth(), 1) |
| 111 | + expirationDate.setFullYear(fullYear, month - 1, 1) |
112 | 112 |
|
113 | | - return currentDate <= expirationDate; |
| 113 | + return currentDate <= expirationDate |
114 | 114 | } |
115 | 115 |
|
116 | 116 | function sumNumber(number) { |
117 | | - const computed = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]; |
118 | | - let sum = 0; |
119 | | - let digit = 0; |
120 | | - let i = number.length; |
121 | | - let even = true; |
| 117 | + const computed = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9] |
| 118 | + let sum = 0 |
| 119 | + let digit = 0 |
| 120 | + let i = number.length |
| 121 | + let even = true |
122 | 122 |
|
123 | 123 | while (i--) { |
124 | | - digit = Number(number[i]); |
125 | | - sum += (even = !even) ? computed[digit] : digit; |
| 124 | + digit = Number(number[i]) |
| 125 | + sum += (even = !even) ? computed[digit] : digit |
126 | 126 | } |
127 | 127 |
|
128 | | - return sum; |
| 128 | + return sum |
129 | 129 | } |
0 commit comments