64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = isIdentityCard;
|
|
|
|
var _assertString = require('./util/assertString');
|
|
|
|
var _assertString2 = _interopRequireDefault(_assertString);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var validators = {
|
|
ES: function ES(str) {
|
|
(0, _assertString2.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]);
|
|
}
|
|
};
|
|
|
|
function isIdentityCard(str) {
|
|
var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'any';
|
|
|
|
(0, _assertString2.default)(str);
|
|
if (locale in validators) {
|
|
return validators[locale](str);
|
|
} else if (locale === 'any') {
|
|
for (var key in validators) {
|
|
if (validators.hasOwnProperty(key)) {
|
|
var validator = validators[key];
|
|
if (validator(str)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
throw new Error('Invalid locale \'' + locale + '\'');
|
|
}
|
|
module.exports = exports['default']; |