UNPKG

pt-id-validator

Version:

Library to perform validation of Portuguese ID documents

90 lines (89 loc) 2.87 kB
"use strict"; /******************************************* * STRING RELATED FUNCTIONS * * FROM http://stackoverflow.com/a/1144788 * *******************************************/ Object.defineProperty(exports, "__esModule", { value: true }); function escapeRegExp(str) { return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1'); } function replaceAll(find, replace, str) { return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); } /******************************************* * CHAR RELATED FUNCTIONS * *******************************************/ function isNumber(char) { var asciiVal = char.charCodeAt(0); return asciiVal >= 48 && asciiVal <= 57; } /******************************************* * BI CHECK FUNCTIONS * *******************************************/ function validBI(biVal, is10) { return (Array.from(Array(biVal.length).keys()) .reverse() .map(function (charIndex, index) { if (charIndex === biVal.length - 1 && is10) { return 10 * (index + 1); } return parseInt(biVal.charAt(charIndex), 10) * (index + 1); }) .reduce(function (a, b) { return a + b; }, 0) % 11 === 0); } function performBIValidation(biVal) { if (!validBI(biVal, false)) { if (parseInt(biVal.charAt(biVal.length - 1), 10) === 0) { return validBI(biVal, true); } return false; } return true; } /******************************************* * CC CHECK FUNCTIONS * *******************************************/ function getNumberFromChar(letter) { if (isNumber(letter)) { return parseInt(letter, 10); } else { return letter.charCodeAt(0) - 55; } } function performCCValidation(ccVal) { return (Array.from(Array(ccVal.length).keys()) .reverse() .map(function (charIndex, index) { var value = getNumberFromChar(ccVal.charAt(charIndex)); if (index % 2 !== 0) { value *= 2; if (value > 9) { value -= 9; } } return value; }) .reduce(function (a, b) { return a + b; }, 0) % 10 === 0); } /******************************************* * CHECK FUNCTION * *******************************************/ function check(val) { var ccRegExp = /^[0-9]{7,8}\ [0-9]\ ([A-Z]|[0-9]){2}[0-9]$/; var biRegExp = /^[0-9]{7,8}\ [0-9]$/; if (ccRegExp.test(val)) { return performCCValidation(replaceAll(' ', '', val)); } else if (biRegExp.test(val)) { return performBIValidation(replaceAll(' ', '', val)); } else { throw TypeError('The value provided does not match the official format for portuguese IDs'); } } exports.default = check;