UNPKG

za-id

Version:

A small package to help validate South African ID numbers

58 lines 2.1 kB
"use strict"; 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