|
| 1 | +/** |
| 2 | + * Generate fake and valid numbers |
| 3 | + * |
| 4 | + * @see https://fakenumbers.io |
| 5 | + * @license https://fakenumbers.io/license |
| 6 | + * @copyright 2020 Nguyen Huu Phuoc <[email protected]> |
| 7 | + */ |
| 8 | + |
| 9 | +import CheckResult from '../CheckResult'; |
| 10 | +import { isValid } from '../utils/mod97And10'; |
| 11 | + |
| 12 | +const check = (input: string): CheckResult<{}> => { |
| 13 | + // http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf |
| 14 | + // http://en.wikipedia.org/wiki/International_Bank_Account_Number#IBAN_formats_by_country |
| 15 | + const ibanPatterns = { |
| 16 | + AD: 'AD[0-9]{10}[A-Z0-9]{12}', // Andorra |
| 17 | + AE: 'AE[0-9]{21}', // United Arab Emirates |
| 18 | + AL: 'AL[0-9]{10}[A-Z0-9]{16}', // Albania |
| 19 | + AO: 'AO[0-9]{23}', // Angola |
| 20 | + AT: 'AT[0-9]{18}', // Austria |
| 21 | + AZ: 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}', // Azerbaijan |
| 22 | + BA: 'BA[0-9]{18}', // Bosnia and Herzegovina |
| 23 | + BE: 'BE[0-9]{14}', // Belgium |
| 24 | + BF: 'BF[0-9]{25}', // Burkina Faso |
| 25 | + BG: 'BG[0-9]{2}[A-Z]{4}[0-9]{6}[A-Z0-9]{8}', // Bulgaria |
| 26 | + BH: 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}', // Bahrain |
| 27 | + BI: 'BI[0-9]{14}', // Burundi |
| 28 | + BJ: 'BJ[0-9]{2}[A-Z]{1}[0-9]{23}', // Benin |
| 29 | + BR: 'BR[0-9]{25}[A-Z][A-Z0-9]', // Brazil |
| 30 | + CH: 'CH[0-9]{7}[A-Z0-9]{12}', // Switzerland |
| 31 | + CI: 'CI[0-9]{2}[A-Z]{1}[0-9]{23}', // Ivory Coast |
| 32 | + CM: 'CM[0-9]{25}', // Cameroon |
| 33 | + CR: 'CR[0-9]{20}', // Costa Rica |
| 34 | + CV: 'CV[0-9]{23}', // Cape Verde |
| 35 | + CY: 'CY[0-9]{10}[A-Z0-9]{16}', // Cyprus |
| 36 | + CZ: 'CZ[0-9]{22}', // Czech Republic |
| 37 | + DE: 'DE[0-9]{20}', // Germany |
| 38 | + DK: 'DK[0-9]{16}', // Denmark |
| 39 | + DO: 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}', // Dominican Republic |
| 40 | + DZ: 'DZ[0-9]{22}', // Algeria |
| 41 | + EE: 'EE[0-9]{18}', // Estonia |
| 42 | + ES: 'ES[0-9]{22}', // Spain |
| 43 | + FI: 'FI[0-9]{16}', // Finland |
| 44 | + FO: 'FO[0-9]{16}', // Faroe Islands |
| 45 | + FR: 'FR[0-9]{12}[A-Z0-9]{11}[0-9]{2}', // France |
| 46 | + GB: 'GB[0-9]{2}[A-Z]{4}[0-9]{14}', // United Kingdom |
| 47 | + GE: 'GE[0-9]{2}[A-Z]{2}[0-9]{16}', // Georgia |
| 48 | + GI: 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}', // Gibraltar |
| 49 | + GL: 'GL[0-9]{16}', // Greenland |
| 50 | + GR: 'GR[0-9]{9}[A-Z0-9]{16}', // Greece |
| 51 | + GT: 'GT[0-9]{2}[A-Z0-9]{24}', // Guatemala |
| 52 | + HR: 'HR[0-9]{19}', // Croatia |
| 53 | + HU: 'HU[0-9]{26}', // Hungary |
| 54 | + IE: 'IE[0-9]{2}[A-Z]{4}[0-9]{14}', // Ireland |
| 55 | + IL: 'IL[0-9]{21}', // Israel |
| 56 | + IR: 'IR[0-9]{23}', // Iran |
| 57 | + IS: 'IS[0-9]{24}', // Iceland |
| 58 | + IT: 'IT[0-9]{2}[A-Z]{1}[0-9]{10}[A-Z0-9]{12}', // Italy |
| 59 | + JO: 'JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}', // Jordan |
| 60 | + KW: 'KW[0-9]{2}[A-Z]{4}[0-9]{22}', // Kuwait |
| 61 | + KZ: 'KZ[0-9]{5}[A-Z0-9]{13}', // Kazakhstan |
| 62 | + LB: 'LB[0-9]{6}[A-Z0-9]{20}', // Lebanon |
| 63 | + LI: 'LI[0-9]{7}[A-Z0-9]{12}', // Liechtenstein |
| 64 | + LT: 'LT[0-9]{18}', // Lithuania |
| 65 | + LU: 'LU[0-9]{5}[A-Z0-9]{13}', // Luxembourg |
| 66 | + LV: 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}', // Latvia |
| 67 | + MC: 'MC[0-9]{12}[A-Z0-9]{11}[0-9]{2}', // Monaco |
| 68 | + MD: 'MD[0-9]{2}[A-Z0-9]{20}', // Moldova |
| 69 | + ME: 'ME[0-9]{20}', // Montenegro |
| 70 | + MG: 'MG[0-9]{25}', // Madagascar |
| 71 | + MK: 'MK[0-9]{5}[A-Z0-9]{10}[0-9]{2}', // Macedonia |
| 72 | + ML: 'ML[0-9]{2}[A-Z]{1}[0-9]{23}', // Mali |
| 73 | + MR: 'MR[0-9]{25}', // Mauritania |
| 74 | + MT: 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}', // Malta |
| 75 | + MU: 'MU[0-9]{2}[A-Z]{4}[0-9]{19}[A-Z]{3}', // Mauritius |
| 76 | + MZ: 'MZ[0-9]{23}', // Mozambique |
| 77 | + NL: 'NL[0-9]{2}[A-Z]{4}[0-9]{10}', // Netherlands |
| 78 | + NO: 'NO[0-9]{13}', // Norway |
| 79 | + PK: 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', // Pakistan |
| 80 | + PL: 'PL[0-9]{26}', // Poland |
| 81 | + PS: 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', // Palestinian |
| 82 | + PT: 'PT[0-9]{23}', // Portugal |
| 83 | + QA: 'QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', // Qatar |
| 84 | + RO: 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', // Romania |
| 85 | + RS: 'RS[0-9]{20}', // Serbia |
| 86 | + SA: 'SA[0-9]{4}[A-Z0-9]{18}', // Saudi Arabia |
| 87 | + SE: 'SE[0-9]{22}', // Sweden |
| 88 | + SI: 'SI[0-9]{17}', // Slovenia |
| 89 | + SK: 'SK[0-9]{22}', // Slovakia |
| 90 | + SM: 'SM[0-9]{2}[A-Z]{1}[0-9]{10}[A-Z0-9]{12}', // San Marino |
| 91 | + SN: 'SN[0-9]{2}[A-Z]{1}[0-9]{23}', // Senegal |
| 92 | + TL: 'TL[0-9]{21}', // East Timor |
| 93 | + TN: 'TN[0-9]{22}', // Tunisia |
| 94 | + TR: 'TR[0-9]{7}[A-Z0-9]{17}', // Turkey |
| 95 | + VG: 'VG[0-9]{2}[A-Z]{4}[0-9]{16}', // Virgin Islands, British |
| 96 | + XK: 'XK[0-9]{18}', // Republic of Kosovo |
| 97 | + }; |
| 98 | + |
| 99 | + const value = input.replace(/\s/g, ''); |
| 100 | + const country = value.substr(0, 2); |
| 101 | + if (!ibanPatterns[country]) { |
| 102 | + return { valid: false }; |
| 103 | + } |
| 104 | + |
| 105 | + return { |
| 106 | + valid: isValid(`${value.substr(4)}${value.substr(0, 4)}`), |
| 107 | + }; |
| 108 | +}; |
| 109 | + |
| 110 | +export default check; |
0 commit comments