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.
127 lines
3.0 KiB
127 lines
3.0 KiB
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = isIdentityCard;
|
|
|
|
var _assertString = _interopRequireDefault(require("./util/assertString"));
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var validators = {
|
|
ES: function ES(str) {
|
|
(0, _assertString.default)(str);
|
|
var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
|
|
var charsValue = {
|
|
X: 0,
|
|
Y: 1,
|
|
Z: 2
|
|
};
|
|
var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E']; // sanitize user input
|
|
|
|
var sanitized = str.trim().toUpperCase(); // validate the data structure
|
|
|
|
if (!DNI.test(sanitized)) {
|
|
return false;
|
|
} // validate the control digit
|
|
|
|
|
|
var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (char) {
|
|
return charsValue[char];
|
|
});
|
|
return sanitized.endsWith(controlDigits[number % 23]);
|
|
},
|
|
'he-IL': function heIL(str) {
|
|
var DNI = /^\d{9}$/; // sanitize user input
|
|
|
|
var sanitized = str.trim(); // validate the data structure
|
|
|
|
if (!DNI.test(sanitized)) {
|
|
return false;
|
|
}
|
|
|
|
var id = sanitized;
|
|
var sum = 0,
|
|
incNum;
|
|
|
|
for (var i = 0; i < id.length; i++) {
|
|
incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2
|
|
|
|
sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total
|
|
}
|
|
|
|
return sum % 10 === 0;
|
|
},
|
|
'zh-TW': function zhTW(str) {
|
|
var ALPHABET_CODES = {
|
|
A: 10,
|
|
B: 11,
|
|
C: 12,
|
|
D: 13,
|
|
E: 14,
|
|
F: 15,
|
|
G: 16,
|
|
H: 17,
|
|
I: 34,
|
|
J: 18,
|
|
K: 19,
|
|
L: 20,
|
|
M: 21,
|
|
N: 22,
|
|
O: 35,
|
|
P: 23,
|
|
Q: 24,
|
|
R: 25,
|
|
S: 26,
|
|
T: 27,
|
|
U: 28,
|
|
V: 29,
|
|
W: 32,
|
|
X: 30,
|
|
Y: 31,
|
|
Z: 33
|
|
};
|
|
var sanitized = str.trim().toUpperCase();
|
|
if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;
|
|
return Array.from(sanitized).reduce(function (sum, number, index) {
|
|
if (index === 0) {
|
|
var code = ALPHABET_CODES[number];
|
|
return code % 10 * 9 + Math.floor(code / 10);
|
|
}
|
|
|
|
if (index === 9) {
|
|
return (10 - sum % 10 - Number(number)) % 10 === 0;
|
|
}
|
|
|
|
return sum + Number(number) * (9 - index);
|
|
}, 0);
|
|
}
|
|
};
|
|
|
|
function isIdentityCard(str, locale) {
|
|
(0, _assertString.default)(str);
|
|
|
|
if (locale in validators) {
|
|
return validators[locale](str);
|
|
} else if (locale === 'any') {
|
|
for (var key in validators) {
|
|
// https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
|
|
// istanbul ignore else
|
|
if (validators.hasOwnProperty(key)) {
|
|
var validator = validators[key];
|
|
|
|
if (validator(str)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
throw new Error("Invalid locale '".concat(locale, "'"));
|
|
}
|
|
|
|
module.exports = exports.default;
|
|
module.exports.default = exports.default; |