taiwan-id-validator
Version:
中華民國統一編號、外籍人士居留證統一編號、身分證字號驗證規則、電子發票號碼等規則驗證
1 lines • 20.7 kB
Source Map (JSON)
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://taiwanIdValidator/webpack/universalModuleDefinition","webpack://taiwanIdValidator/./src/index.ts","webpack://taiwanIdValidator/./src|sync","webpack://taiwanIdValidator/webpack/bootstrap","webpack://taiwanIdValidator/webpack/runtime/hasOwnProperty shorthand","webpack://taiwanIdValidator/webpack/before-startup","webpack://taiwanIdValidator/webpack/startup","webpack://taiwanIdValidator/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"taiwanIdValidator\"] = factory();\n\telse\n\t\troot[\"taiwanIdValidator\"] = factory();\n})(this, function() {\nreturn ","function zipWith<T, R>(a1: T[], a2: T[], f: (v1: T, v2: T) => R): R[] {\n const length = Math.min(a1.length, a2.length)\n const result: R[] = []\n\n for (let i = 0; i < length; i++) result[i] = f(a1[i], a2[i])\n\n return result\n}\n\nfunction add(a: number, b: number) {\n return a + b\n}\n\nfunction multiply(a: number, b: number) {\n return a * b\n}\n\n/**\n * Verify the input is a valid GUI Number (中華民國統一編號)\n *\n * @param { string | number } input GUI Number\n * @param { boolean } extended check input using extended format: https://www.fia.gov.tw/singlehtml/6?cntId=aaa97a9dcf2649d5bdd317f554e24f75\n * @returns { boolean } is `input` a valid GUI number\n */\nexport function isGuiNumberValid(\n input: string | number,\n extended = false\n): boolean {\n if (typeof input !== 'string' && typeof input !== 'number') return false\n\n /**\n * Example: 12345675\n * Step 1:\n * 1 * 1 = 1\n * 2 * 2 = 4\n * 3 * 1 = 3\n * 4 * 2 = 8\n * 5 * 1 = 5\n * 6 * 2 = 12\n * 7 * 4 = 28\n * 5 * 1 = 5\n *\n * Step 2:\n * 1 -> 1\n * 4 -> 4\n * 3 -> 3\n * 8 -> 8\n * 5 -> 5\n * 12 -> 1 + 2 = 3\n * 28 -> 2 + 8 = 10\n * 5 -> 5\n *\n * Step 3:\n * (1 + 4 + 3 + 8 + 5 + 3 + 10 + 5) % 10 = 9\n */\n\n const GUI_NUMBER_COEFFICIENTS = [1, 2, 1, 2, 1, 2, 4, 1]\n\n const n = input.toString()\n const regex = /^\\d{8}$/\n\n if (!regex.test(n)) return false\n\n /**\n * Step 1: 先把統一編號的每個數字分別乘上對應的係數 (1, 2, 1, 2, 1, 2, 4, 1)\n * Step 2: 再把個別乘積的十位數與個位數相加,得出八個小於 10 的數字\n */\n\n const intRadix = 10\n const checksum = zipWith(\n GUI_NUMBER_COEFFICIENTS,\n n.split('').map(c => parseInt(c, intRadix)),\n multiply\n )\n .map(n => (n % 10) + Math.floor(n / 10))\n .reduce(add, 0)\n\n /**\n * Step 3: 檢查把這 8 個數字相加之後計算此和除以 5 or 10 的餘數\n * Step 4:\n * 4-1: 若是餘數為 0,則為正確的統一編號\n * 4-2: 若是餘數為 9,且原統一編號的第七位是 7,則也為正確的統一編號\n */\n\n const divisor = extended ? 5 : 10\n\n return (\n checksum % divisor === 0 ||\n (parseInt(n.charAt(6), intRadix) === 7 && (checksum + 1) % divisor === 0)\n )\n}\n\n/**\n * Verify the input is a valid National identification number (中華民國身分證字號)\n *\n * @param { string } input National identification number\n * @returns { boolean } is `input` a valid national ID number\n */\nexport function isNationalIdentificationNumberValid(input: string): boolean {\n if (typeof input !== 'string') return false\n\n const regex = /^[A-Z][1,2]\\d{8}$/\n\n return regex.test(input) && verifyTaiwanIdIntermediateString(input)\n}\n\n/**\n * Verify the input is a valid resident certificate number (臺灣地區無戶籍國民、外國人、大陸地區人民及香港或澳門居民之專屬代號)\n *\n * @param { string } input resident certificate number\n * @returns { boolean } is `input` a valid resident certificate number\n */\nexport function isResidentCertificateNumberValid(input: string): boolean {\n if (typeof input !== 'string') return false\n\n return (\n isNewResidentCertificateNumberValid(input) ||\n isOriginalResidentCertificateNumberValid(input)\n )\n}\n\n/**\n * Verify the input is a valid new resident certificate number (臺灣地區無戶籍國民、外國人、大陸地區人民及香港或澳門居民之專屬代號)\n *\n * @param { string } input resident certificate number\n * @returns { boolean } is `input` a valid new resident certificate number\n */\nexport function isNewResidentCertificateNumberValid(input: string): boolean {\n if (typeof input !== 'string') return false\n\n const regex = /^[A-Z][8,9]\\d{8}$/\n\n return regex.test(input) && verifyTaiwanIdIntermediateString(input)\n}\n\n/**\n * Verify the input is a original valid resident certificate number (臺灣地區無戶籍國民、外國人、大陸地區人民及香港或澳門居民之專屬代號)\n *\n * @param { string } input resident certificate number\n * @returns { boolean } is `input` a valid original resident certificate number\n */\nexport function isOriginalResidentCertificateNumberValid(\n input: string\n): boolean {\n if (typeof input !== 'string') return false\n\n const regex = /^[A-Z]{2}\\d{8}$/\n\n return regex.test(input) && verifyTaiwanIdIntermediateString(input)\n}\n\n/**\n * Verify the input is a valid citizen digital certificate number (自然人憑證)\n *\n * @param { string } input citizen digital certificate number\n * @returns { boolean } is `input` a valid citizen digital certificate number\n */\nexport function isCitizenDigitalCertificateNumberValid(input: string): boolean {\n if (typeof input !== 'string') return false\n\n const n = input.toString()\n\n // 驗證規則為兩碼英文 + 14 碼數字\n const regex = /^[A-Z]{2}\\d{14}$/\n\n return regex.test(n)\n}\n\n/**\n * Verify the input is a valid E-Invoice cell phone barcode (電子發票手機條碼)\n *\n * @param { string } input E-Invoice cell phone barcode\n * @returns { boolean } is `input` a valid e-invoice cell phone barcode\n */\nexport function isEInvoiceCellPhoneBarcodeValid(input: string): boolean {\n if (typeof input !== 'string') return false\n\n const n = input.toString()\n\n /**\n * 總長度為 8 碼\n * 第 1 碼為 /\n * 第 2-8 碼由 0-9 (數字), A-Z (大寫英文字母), .(period), -(hyphen), +(plus) 組成\n */\n const regex = /^\\/[\\dA-Z.\\-+]{7}$/\n\n return regex.test(n)\n}\n\n/**\n * Verify the input is a valid E-Invoice donate code (電子發票捐贈碼)\n *\n * @param { string | number } input E-Invoice donate code\n * @returns { boolean } is `input` a valid e-invoice donate code\n */\nexport function isEInvoiceDonateCodeValid(input: string | number): boolean {\n if (typeof input !== 'string' && typeof input !== 'number') return false\n\n const n = input.toString()\n\n // 總長度為 3-7 碼 0-9 的數字\n const regex = /^[\\d]{3,7}$/\n\n return regex.test(n)\n}\n\nexport type CreditCardValidationOptions = {\n /**\n * validate `input` with regex\n * (Warning! Card issuers might introduce new card number patterns. Use this in production might cause unexpected results.)\n */\n checkIssuerRegexes?: boolean\n}\n\n/**\n * Verify the input is a valid credit card number (信用卡卡號)\n *\n * @param { string | number } input credit card number\n * @param { CreditCardValidationOptions } creditCardValidationOptions credit card validation options\n * @returns { boolean } is `input` a valid credit card number\n */\nexport function isCreditCardNumberValid(input: string, options: CreditCardValidationOptions = {}): boolean {\n if (typeof input !== 'string') return false\n\n const regex = /^[0-9]{12,19}$/\n\n if (!regex.test(input)) return false\n\n // ref:\n // https://stackoverflow.com/questions/9315647/regex-credit-card-number-tests\n // https://en.wikipedia.org/wiki/Payment_card_number\n const issuerRegexes = [\n /^3[47][0-9]{13}$/, // American Express\n /^(6541|6556)[0-9]{12}$/, // BCGlobal\n /^389[0-9]{11}$/, // Carte Blanche\n /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/, // Diner's Club\n /^65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}|(622(?:12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|9[01][0-9]|92[0-5])[0-9]{10})$/, // Discover\n /^63[7-9][0-9]{13}$/, // Insta Payment\n /^(?:2131|1800|35\\d{3})\\d{11}$/, // JCB\n /^9[0-9]{15}$/, // KoreanLocalCard\n /^(6304|6706|6709|6771)[0-9]{12,15}$/, // Laser\n /^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$/, // Maestro\n /^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$/, // Mastercard\n /^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$/, // Solo\n /^(4903|4905|4911|4936|6333|6759)[0-9]{12}|(4903|4905|4911|4936|6333|6759)[0-9]{14}|(4903|4905|4911|4936|6333|6759)[0-9]{15}|564182[0-9]{10}|564182[0-9]{12}|564182[0-9]{13}|633110[0-9]{10}|633110[0-9]{12}|633110[0-9]{13}$/, // Switch\n /^(62[0-9]{14,17})$/, // Union Pay\n /^4[0-9]{12}(?:[0-9]{3})?$/, // Visa\n /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$/ // Visa Master\n ]\n\n const { checkIssuerRegexes = false } = options\n\n if (checkIssuerRegexes && !issuerRegexes.some(regex => regex.test(input)))\n return false\n\n // Luhn algorithm\n // ref: https://en.wikipedia.org/wiki/Luhn_algorithm\n const digits = input.split('').map(d => parseInt(d, 10))\n const sum = digits.reverse().reduce((acc, d, i) => {\n if (i % 2 === 0) return acc + d\n return acc + (d * 2 > 9 ? d * 2 - 9 : d * 2)\n }, 0)\n\n return sum % 10 === 0\n}\n\n/**\n * Verify the intermediate string for isNationalIdentificationNumberValid and isResidentCertificateNumberValid\n *\n * @param { string } input String to verify\n * @returns { boolean } is `input` a valid Taiwan ID intermediate string\n */\nfunction verifyTaiwanIdIntermediateString(input: string): boolean {\n const intRadix = 10\n\n /**\n * A=10 台北市 J=18 新竹縣 S=26 高雄縣\n * B=11 台中市 K=19 苗栗縣 T=27 屏東縣\n * C=12 基隆市 L=20 台中縣 U=28 花蓮縣\n * D=13 台南市 M=21 南投縣 V=29 台東縣\n * E=14 高雄市 N=22 彰化縣 W=32 金門縣*\n * F=15 台北縣 O=35 新竹市* X=30 澎湖縣\n * G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山\n * H=17 桃園縣 Q=24 嘉義縣 Z=33 連江縣*\n * I=34 嘉義市* R=25 台南縣\n *\n * Step 1: 英文字母按照上表轉換為數字之後,十位數 * 1 + 個位數 * 9 相加\n */\n const TAIWAN_ID_LOCALE_CODE_LIST = [\n 1, // A -> 10 -> 1 * 1 + 9 * 0 = 1\n 10, // B -> 11 -> 1 * 1 + 9 * 1 = 10\n 19, // C -> 12 -> 1 * 1 + 9 * 2 = 19\n 28, // D\n 37, // E\n 46, // F\n 55, // G\n 64, // H\n 39, // I -> 34 -> 1 * 3 + 9 * 4 = 39\n 73, // J\n 82, // K\n 2, // L\n 11, // M\n 20, // N\n 48, // O -> 35 -> 1 * 3 + 9 * 5 = 48\n 29, // P\n 38, // Q\n 47, // R\n 56, // S\n 65, // T\n 74, // U\n 83, // V\n 21, // W -> 32 -> 1 * 3 + 9 * 2 = 21\n 3, // X\n 12, // Y\n 30 // Z -> 33 -> 1 * 3 + 9 * 3 = 30\n ]\n\n const RESIDENT_CERTIFICATE_NUMBER_LIST = [\n 0, // A\n 1, // B\n 2, // C\n 3, // D\n 4, // E\n 5, // F\n 6, // G\n 7, // H\n 4, // I\n 8, // J\n 9, // K\n 0, // L\n 1, // M\n 2, // N\n 5, // O\n 3, // P\n 4, // Q\n 5, // R\n 6, // S\n 7, // T\n 8, // U\n 9, // V\n 2, // W\n 0, // X\n 1, // Y\n 3 // Z\n ]\n\n const getCharOrder = (s: string, i: number) =>\n s.charCodeAt(i) - 'A'.charCodeAt(0)\n\n const firstDigit = TAIWAN_ID_LOCALE_CODE_LIST[getCharOrder(input, 0)]\n\n const secondDigit = isNaN(parseInt(input[1], intRadix)) // if is not a number (舊版居留證編號)\n ? RESIDENT_CERTIFICATE_NUMBER_LIST[getCharOrder(input, 1)]\n : parseInt(input[1], intRadix)\n\n const rest = input\n .substring(2)\n .split('')\n .map(n => parseInt(n, intRadix))\n\n const idInDigits = [firstDigit, secondDigit, ...rest]\n\n // Step 2: 第 1 位數字 (只能為 1 or 2) 至第 8 位數字分別乘上 8, 7, 6, 5, 4, 3, 2, 1 後相加,再加上第 9 位數字\n\n const ID_COEFFICIENTS = [1, 8, 7, 6, 5, 4, 3, 2, 1, 1]\n const sum = zipWith(idInDigits, ID_COEFFICIENTS, multiply).reduce(add, 0)\n\n // Step 3: 如果該數字為 10 的倍數,則為正確身分證字號\n\n return sum % 10 === 0\n}\n\nexport const isGUI = isGuiNumberValid\nexport const isNI = isNationalIdentificationNumberValid\nexport const isRC = isResidentCertificateNumberValid\nexport const isNewRC = isNewResidentCertificateNumberValid\nexport const isOriginalRC = isOriginalResidentCertificateNumberValid\nexport const isCDC = isCitizenDigitalCertificateNumberValid\nexport const isCellPhoneBarcode = isEInvoiceCellPhoneBarcodeValid\nexport const isDonateCode = isEInvoiceDonateCodeValid\nexport const isCreditCard = isCreditCardNumberValid\n","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 875;\nmodule.exports = webpackEmptyContext;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(607);\n",""],"names":[],"sourceRoot":""}