UNPKG

@socoe/mykad

Version:

Library to validate, parse, generate, and format Malaysian identity card (MyKad) numbers

206 lines (205 loc) 4.87 kB
"use strict"; var REGION_SOUTHEAST_ASIA = 'SOUTHEAST_ASIA'; var REGION_BRITISH_ISLES = 'BRITISH_ISLES'; var REGION_SOVIET_REPUBLIC = 'SOVIET_REPUBLIC'; var REGION_EAST_ASIA = 'EAST_ASIA'; var REGION_SOUTH_ASIA = 'SOUTH_ASIA'; var REGION_AFRICA = 'AFRICA'; var REGION_SOUTH_AMERICA = 'SOUTH_AMERICA'; var REGION_NORTH_AMERICA = 'NORTH_AMERICA'; var REGION_OCEANIA = 'OCEANIA'; var REGION_MIDDLE_EAST = 'MIDDLE_EAST'; var REGION_EUROPE = 'EUROPE'; var REGION_MIDDLE_AMERICA = 'MIDDLE_AMERICA'; var REGION_MISCELLANEOUS = 'MISCELLANEOUS'; var stateCodePairs = { 'JHR': ['01', '21', '22', '24'], 'KDH': ['02', '25', '26', '27'], 'KTN': ['03', '28', '29'], 'MLK': ['04', '30'], 'NSN': ['05', '31', '59'], 'PHG': ['06', '32', '33'], 'PNG': ['07', '34', '35'], 'PRK': ['08', '36', '37', '38'], 'PLS': ['09', '40'], 'SGR': ['10', '41', '42', '43', '44'], 'TRG': ['11', '45', '46'], 'SBH': ['12', '47', '48', '49'], 'SWK': ['13', '50', '51', '52', '53'], 'KUL': ['14', '54', '55', '56', '57'], 'LBN': ['15', '58'], 'PJY': ['16'], 'UNKNOWN_STATE': ['82'] }; var countryCodePairs = { '60': { country: 'BN', region: REGION_SOUTHEAST_ASIA }, '61': { country: 'ID', region: REGION_SOUTHEAST_ASIA }, '62': { country: 'KH', region: REGION_SOUTHEAST_ASIA }, '63': { country: 'LA', region: REGION_SOUTHEAST_ASIA }, '64': { country: 'MM', region: REGION_SOUTHEAST_ASIA }, '65': { country: 'PH', region: REGION_SOUTHEAST_ASIA }, '66': { country: 'SG', region: REGION_SOUTHEAST_ASIA }, '67': { country: 'TH', region: REGION_SOUTHEAST_ASIA }, '68': { country: 'VN', region: REGION_SOUTHEAST_ASIA }, '71': { country: 'FOREIGN_UNKNOWN', region: null }, '72': { country: 'FOREIGN_UNKNOWN', region: null }, '74': { country: 'CN', region: REGION_EAST_ASIA }, '75': { country: 'IN', region: REGION_SOUTH_ASIA }, '76': { country: 'PK', region: REGION_SOUTH_ASIA }, '77': { country: 'SA', region: REGION_MIDDLE_EAST }, '78': { country: 'LK', region: REGION_SOUTH_ASIA }, '79': { country: 'BD', region: REGION_SOUTH_ASIA }, '83': { country: 'AS|AU|CX|CC|CK|FJ|PF|GU|HM|MH|FM|NC|NZ|NU|NF|PG|TL|TK|UM|WF', region: REGION_OCEANIA }, '84': { country: 'AI|AR|AW|BO|BR|CL|CO|EC|GF|GP|GY|PY|PE|GS|ST|UY|VE', region: REGION_SOUTH_AMERICA }, '85': { country: 'DZ|AO|BW|BI|CM|CF|CG|CD|DG|EG|ER|ET|GA|GM|GN|KE|LR|MW|ML|MR|YT|' + 'MA|MZ|NA|NE|NG|RW|RE|SN|SL|SO|SD|SZ|TZ|TG|TO|TN|UG|ME|ZR|ZM|ZW', region: REGION_AFRICA }, '86': { country: 'AM|AT|BE|CY|DK|FO|FR|FI|DE|DD|GR|VA|IT|LU|' + 'MK|MT|MC|NL|NO|PT|MD|SK|SI|ES|SE|CH|GG|JE|IM', region: REGION_EUROPE }, '87': { country: 'GB|IE', region: REGION_BRITISH_ISLES }, '88': { country: 'BH|IR|IQ|PS|JO|KW|OM|QA|YE|SY|TR|YE|YD|', region: REGION_MIDDLE_EAST }, '89': { country: 'JP|KP|KR|TW', region: REGION_EAST_ASIA }, '90': { country: 'BS|BB|BZ|CR|CU|DM|DO|SV|GD|GT|HT|HN|' + 'JM|MQ|MX|NI|PA|PR|KN|LC|VC|TT|TC|VI', region: REGION_MIDDLE_AMERICA }, '91': { country: 'CA|GL|AN|PM|US', region: REGION_NORTH_AMERICA }, '92': { country: 'AL|BY|BA|BG|HR|CZ|CS|EE|GE|HU|LV|LT|ME|PL|XK|RO|RU|RS|UA', region: REGION_SOVIET_REPUBLIC }, '93': { country: 'AF|AD|AQ|AG|AZ|BJ|BM|BT|IO|BF|CV|KY|KM|DY|GQ|TF|GI|GW|HK|' + 'IS|CI|KZ|KI|KG|LS|LY|LI|MO|MG|MV|MU|MN|MS|NR|NP|MP|PW|PS|' + 'PN|SH|LC|VC|WS|SM|ST|SC|SB|SJ|TJ|TM|TV|HV|UZ|VU|VA|VG|YU', region: REGION_MISCELLANEOUS }, '98': { country: 'STATELESS', region: null }, '99': { country: 'UNSPECIFIED', region: null } }; function numIsBetween(num, lower, upper) { return (num - lower) * (num - upper) <= 0; } function codeToState(code) { return Object.keys(stateCodePairs).find(function (key) { return stateCodePairs[key].includes(code); }); } function isMalaysia(code) { var MALAYSIA_CODES = [{ lower: 1, upper: 16 }, { lower: 21, upper: 59 }, { lower: 82, upper: 82 }]; return MALAYSIA_CODES.some(function (range) { return numIsBetween(code, range.lower, range.upper); }); } function isForeign(code) { return countryCodePairs[code] != undefined; } function parseMalaysia(code) { return { region: REGION_SOUTHEAST_ASIA, country: 'MY', state: codeToState(code) }; } function parseForeign(code) { return Object.assign({ state: null }, countryCodePairs[code]); } function parse(code) { if (isMalaysia(code)) return parseMalaysia(code); if (isForeign(code)) return parseForeign(code); throw new Error('Invalid birth place code'); } function isValid(code) { return isMalaysia(code) || isForeign(code); } module.exports = { parse: parse, isValid: isValid };