You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
2.9 KiB
126 lines
2.9 KiB
import assertString from './util/assertString'; |
|
/** |
|
* Reference: |
|
* https://en.wikipedia.org/ -- Wikipedia |
|
* https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number |
|
* https://countrycode.org/ -- Country Codes |
|
*/ |
|
|
|
var passportRegexByCountryCode = { |
|
AM: /^[A-Z]{2}\d{7}$/, |
|
// ARMENIA |
|
AR: /^[A-Z]{3}\d{6}$/, |
|
// ARGENTINA |
|
AT: /^[A-Z]\d{7}$/, |
|
// AUSTRIA |
|
AU: /^[A-Z]\d{7}$/, |
|
// AUSTRALIA |
|
BE: /^[A-Z]{2}\d{6}$/, |
|
// BELGIUM |
|
BG: /^\d{9}$/, |
|
// BULGARIA |
|
BR: /^[A-Z]{2}\d{6}$/, |
|
// BRAZIL |
|
BY: /^[A-Z]{2}\d{7}$/, |
|
// BELARUS |
|
CA: /^[A-Z]{2}\d{6}$/, |
|
// CANADA |
|
CH: /^[A-Z]\d{7}$/, |
|
// SWITZERLAND |
|
CN: /^G\d{8}$|^E(?![IO])[A-Z0-9]\d{7}$/, |
|
// CHINA [G=Ordinary, E=Electronic] followed by 8-digits, or E followed by any UPPERCASE letter (except I and O) followed by 7 digits |
|
CY: /^[A-Z](\d{6}|\d{8})$/, |
|
// CYPRUS |
|
CZ: /^\d{8}$/, |
|
// CZECH REPUBLIC |
|
DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/, |
|
// GERMANY |
|
DK: /^\d{9}$/, |
|
// DENMARK |
|
DZ: /^\d{9}$/, |
|
// ALGERIA |
|
EE: /^([A-Z]\d{7}|[A-Z]{2}\d{7})$/, |
|
// ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits |
|
ES: /^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/, |
|
// SPAIN |
|
FI: /^[A-Z]{2}\d{7}$/, |
|
// FINLAND |
|
FR: /^\d{2}[A-Z]{2}\d{5}$/, |
|
// FRANCE |
|
GB: /^\d{9}$/, |
|
// UNITED KINGDOM |
|
GR: /^[A-Z]{2}\d{7}$/, |
|
// GREECE |
|
HR: /^\d{9}$/, |
|
// CROATIA |
|
HU: /^[A-Z]{2}(\d{6}|\d{7})$/, |
|
// HUNGARY |
|
IE: /^[A-Z0-9]{2}\d{7}$/, |
|
// IRELAND |
|
IN: /^[A-Z]{1}-?\d{7}$/, |
|
// INDIA |
|
ID: /^[A-C]\d{7}$/, |
|
// INDONESIA |
|
IR: /^[A-Z]\d{8}$/, |
|
// IRAN |
|
IS: /^(A)\d{7}$/, |
|
// ICELAND |
|
IT: /^[A-Z0-9]{2}\d{7}$/, |
|
// ITALY |
|
JP: /^[A-Z]{2}\d{7}$/, |
|
// JAPAN |
|
KR: /^[MS]\d{8}$/, |
|
// SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports] |
|
LT: /^[A-Z0-9]{8}$/, |
|
// LITHUANIA |
|
LU: /^[A-Z0-9]{8}$/, |
|
// LUXEMBURG |
|
LV: /^[A-Z0-9]{2}\d{7}$/, |
|
// LATVIA |
|
LY: /^[A-Z0-9]{8}$/, |
|
// LIBYA |
|
MT: /^\d{7}$/, |
|
// MALTA |
|
MZ: /^([A-Z]{2}\d{7})|(\d{2}[A-Z]{2}\d{5})$/, |
|
// MOZAMBIQUE |
|
MY: /^[AHK]\d{8}$/, |
|
// MALAYSIA |
|
NL: /^[A-Z]{2}[A-Z0-9]{6}\d$/, |
|
// NETHERLANDS |
|
PL: /^[A-Z]{2}\d{7}$/, |
|
// POLAND |
|
PT: /^[A-Z]\d{6}$/, |
|
// PORTUGAL |
|
RO: /^\d{8,9}$/, |
|
// ROMANIA |
|
RU: /^\d{9}$/, |
|
// RUSSIAN FEDERATION |
|
SE: /^\d{8}$/, |
|
// SWEDEN |
|
SL: /^(P)[A-Z]\d{7}$/, |
|
// SLOVANIA |
|
SK: /^[0-9A-Z]\d{7}$/, |
|
// SLOVAKIA |
|
TR: /^[A-Z]\d{8}$/, |
|
// TURKEY |
|
UA: /^[A-Z]{2}\d{6}$/, |
|
// UKRAINE |
|
US: /^\d{9}$/ // UNITED STATES |
|
|
|
}; |
|
/** |
|
* Check if str is a valid passport number |
|
* relative to provided ISO Country Code. |
|
* |
|
* @param {string} str |
|
* @param {string} countryCode |
|
* @return {boolean} |
|
*/ |
|
|
|
export default function isPassportNumber(str, countryCode) { |
|
assertString(str); |
|
/** Remove All Whitespaces, Convert to UPPERCASE */ |
|
|
|
var normalizedStr = str.replace(/\s/g, '').toUpperCase(); |
|
return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr); |
|
} |