za-id
Version:
A small package to help validate South African ID numbers
58 lines • 2.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var moment = require("moment");
exports.male = "Male";
exports.female = "Female";
var genderCheck = 6;
var southAfricanCheck = 10;
var penultimate = 11;
function validateIdNumber(idNumber, details) {
if (idNumber.length !== 13 || !/^\d+$/.test(idNumber)) {
return false;
}
var idArray = idNumber.split("").map(function (c) { return parseInt(c); });
if (idArray[southAfricanCheck] > 1 ||
idArray[penultimate] < 8 ||
!validateArray(idArray)) {
return false;
}
var dateOfBirth = extractDateOfBirth(idNumber);
if (!validateBirthday(dateOfBirth, idNumber)) {
return false;
}
if (details != null) {
details.dateOfBirth = dateOfBirth.toDate();
details.gender = idArray[genderCheck] >= 5 ? exports.male : exports.female;
details.southAfrican = idArray[southAfricanCheck] === 0;
}
return true;
}
exports.validateIdNumber = validateIdNumber;
function validateBirthday(dateOfBirth, idNumber) {
return dateOfBirth.format("YYMMDD") == idNumber.substr(0, 6);
}
function validateArray(idArray) {
var oddPredicate = function (_, i) { return i % 2 === 0; };
var evenPredicate = function (_, i) { return i % 2 !== 0; };
var evenMap = function (n) { return ((n *= 2) > 9 ? n - 9 : n); };
var reduction = function (a, b) { return a + b; };
var odds = idArray.filter(oddPredicate).reduce(reduction, 0);
var evens = idArray
.filter(evenPredicate)
.map(evenMap)
.reduce(reduction, 0);
var nCheck = odds + evens;
return nCheck % 10 === 0;
}
function extractDateOfBirth(idNumber) {
var now = moment();
var year = idNumber.substr(0, 2);
var month = idNumber.substr(2, 2);
var day = idNumber.substr(4, 2);
var dateOfBirth = moment("20" + year + "-" + month + "-" + day + " 00+0200");
if (dateOfBirth.isAfter(now)) {
dateOfBirth = moment("19" + year + "-" + month + "-" + day + " 00+0200");
}
return dateOfBirth;
}
//# sourceMappingURL=index.js.map