stdnum
Version:
Standard Number Validation
94 lines • 8.68 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.toDateArray = toDateArray;
exports.validStructure = validStructure;
exports.validChecksum = validChecksum;
const util_1 = require("../util");
function getApproximatelyNow() {
const ONE_DAY = 1000 * 60 * 60 * 24;
return new Date(Date.now() + ONE_DAY);
}
function isInPast(date) {
return new Date(String(date)) <= getApproximatelyNow();
}
function getFullYears(yy) {
const yval = typeof yy === 'string' ? parseInt(yy, 10) : yy;
return [1900 + yval, 2000 + yval];
}
function getFirstSix(number) {
return util_1.strings.splitAt(number, 6)[0];
}
function getBaseNumber(number) {
return util_1.strings.splitAt(number, 9)[0];
}
function getChecksum(number) {
const checksumString = util_1.strings.splitAt(number, 9)[1];
return parseInt(checksumString, 10);
}
function toDateArray(number) {
const [yy, mm, dd] = util_1.strings.splitAt(number, 2, 4, 6);
return [yy, mm, dd];
}
function getValidPastDates(yymmdd) {
const [yy, mm, dd] = toDateArray(yymmdd);
return getFullYears(yy)
.filter(yyyy => (0, util_1.isValidDateCompactYYYYMMDD)(`${yyyy}${mm}${dd}`))
.map(yyyy => `${yyyy}-${mm}-${dd}`)
.filter(isInPast);
}
function isUnknownDob(dob) {
if (['000001', '002001', '004001'].includes(dob)) {
return true;
}
const [yy, mm, dd] = toDateArray(dob);
return util_1.strings.isdigits(yy) && mm === '00' && util_1.strings.isdigits(dd);
}
function toChecksumBasis(year, baseNumber) {
return parseInt(year < 2000 ? baseNumber : `${2}${baseNumber}`, 10);
}
function isValidDob(dob) {
return Boolean(getValidPastDates(dob).length);
}
function defaultToDob(origFirstSix) {
return origFirstSix;
}
function isValidFirstSix(firstSix, toDob) {
const dob = toDob(firstSix);
return isUnknownDob(dob) || isValidDob(dob);
}
function validStructure(number, toDob = defaultToDob) {
const firstSix = getFirstSix(number);
return isValidFirstSix(firstSix, toDob);
}
function getChecksumBasesUnknownDob(baseNumber) {
const firstSix = getFirstSix(baseNumber);
const [yy] = toDateArray(firstSix);
return getFullYears(yy)
.filter(isInPast)
.map(year => toChecksumBasis(year, baseNumber));
}
function getChecksumBasesForStandardDob(baseNumber, toDob) {
const firstSix = getFirstSix(baseNumber);
const dob = toDob(firstSix);
const validPastDates = getValidPastDates(dob);
const extractYearFromDate = (date) => parseInt(date.split('-')[0], 10);
const validPastYears = validPastDates.map(extractYearFromDate);
return validPastYears.map(year => toChecksumBasis(year, baseNumber));
}
function getChecksumBases(number, toDob) {
const firstSix = getFirstSix(number);
const dob = toDob(firstSix);
const baseNumber = getBaseNumber(number);
if (isUnknownDob(dob))
return getChecksumBasesUnknownDob(baseNumber);
return getChecksumBasesForStandardDob(baseNumber, toDob);
}
function isValidChecksumPair(checksumBasis, checksum) {
return !((checksumBasis + checksum) % 97);
}
function validChecksum(number, toDob = defaultToDob) {
const checksumBases = getChecksumBases(number, toDob);
const checksum = getChecksum(number);
return checksumBases.some(csb => isValidChecksumPair(csb, checksum));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uSWRlbnRpZmllckhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmUvcGVyc29uSWRlbnRpZmllckhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsa0NBSUM7QUF5Q0Qsd0NBTUM7QUF5Q0Qsc0NBT0M7QUFqSUQsa0NBQThEO0FBRTlELFNBQVMsbUJBQW1CO0lBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNwQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsSUFBcUI7SUFDckMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxFQUFtQjtJQUN2QyxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUU1RCxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQWM7SUFDakMsT0FBTyxjQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxPQUFPLGNBQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxTQUFTLFdBQVcs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
;