stdnum 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/be/nn.d.ts +2 -0
- package/lib/cjs/be/nn.js +137 -0
- package/lib/esm/be/nn.d.ts +2 -0
- package/lib/esm/be/nn.js +115 -0
- package/package.json +19 -1
package/lib/cjs/be/nn.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.compact = exports.format = exports.validate = exports.abbreviation = exports.localName = exports.name = void 0;
|
|
23
|
+
const exceptions = __importStar(require("../exceptions"));
|
|
24
|
+
const util_1 = require("../util");
|
|
25
|
+
function clean(input) {
|
|
26
|
+
return util_1.strings.cleanUnicode(input, ' -.');
|
|
27
|
+
}
|
|
28
|
+
const impl = {
|
|
29
|
+
name: 'Belgian National Number',
|
|
30
|
+
localName: 'Numéro National',
|
|
31
|
+
abbreviation: 'NN, NISS',
|
|
32
|
+
compact(input) {
|
|
33
|
+
const [value, err] = clean(input);
|
|
34
|
+
if (err) {
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
},
|
|
39
|
+
format(input) {
|
|
40
|
+
const [value] = clean(input);
|
|
41
|
+
return value;
|
|
42
|
+
},
|
|
43
|
+
validate(input) {
|
|
44
|
+
const number = exports.compact(input);
|
|
45
|
+
if (!util_1.strings.isdigits(number) || parseInt(number, 10) <= 0) {
|
|
46
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
47
|
+
}
|
|
48
|
+
if (number.length !== 11) {
|
|
49
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
50
|
+
}
|
|
51
|
+
if (!validStructure(number)) {
|
|
52
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
53
|
+
}
|
|
54
|
+
if (!validChecksum(number)) {
|
|
55
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
isValid: true,
|
|
59
|
+
compact: number,
|
|
60
|
+
isIndividual: true,
|
|
61
|
+
isCompany: false,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.name = impl.name, exports.localName = impl.localName, exports.abbreviation = impl.abbreviation, exports.validate = impl.validate, exports.format = impl.format, exports.compact = impl.compact;
|
|
66
|
+
function validStructure(number) {
|
|
67
|
+
const firstSix = getFirstSix(number);
|
|
68
|
+
return isValidFirstSix(firstSix);
|
|
69
|
+
}
|
|
70
|
+
function validChecksum(number) {
|
|
71
|
+
const checksumBases = getChecksumBases(number);
|
|
72
|
+
const checksum = getChecksum(number);
|
|
73
|
+
return checksumBases.some(csb => csb % 97 + checksum === 97);
|
|
74
|
+
}
|
|
75
|
+
function isValidFirstSix(firstSix) {
|
|
76
|
+
return isUnknownDob(firstSix) || isValidDob(firstSix);
|
|
77
|
+
}
|
|
78
|
+
function isUnknownDob(dob) {
|
|
79
|
+
const [yy, mm, dd] = toDateArray(dob);
|
|
80
|
+
return (util_1.strings.isdigits(yy) && mm === '00' && util_1.strings.isdigits(dd));
|
|
81
|
+
}
|
|
82
|
+
function isValidDob(dob) {
|
|
83
|
+
return Boolean(getValidPastDates(dob).length);
|
|
84
|
+
}
|
|
85
|
+
function getValidPastDates(yymmdd) {
|
|
86
|
+
const [yy, mm, dd] = toDateArray(yymmdd);
|
|
87
|
+
return getFullYears(yy).
|
|
88
|
+
filter((yyyy) => util_1.isValidDateCompactYYYYMMDD(`${yyyy}${mm}${dd}`)).
|
|
89
|
+
map((yyyy) => `${yyyy}-${mm}-${dd}`).
|
|
90
|
+
filter(isInPast);
|
|
91
|
+
}
|
|
92
|
+
function getChecksumBases(number) {
|
|
93
|
+
const firstSix = getFirstSix(number);
|
|
94
|
+
const baseNumber = getBaseNumber(number);
|
|
95
|
+
if (isUnknownDob(firstSix))
|
|
96
|
+
return getChecksumBasesUnknownDob(firstSix, baseNumber);
|
|
97
|
+
return getChecksumBasesForStandardDob(firstSix, baseNumber);
|
|
98
|
+
}
|
|
99
|
+
function getChecksumBasesUnknownDob(dob, baseNumber) {
|
|
100
|
+
const [yy] = toDateArray(dob);
|
|
101
|
+
return getFullYears(yy).
|
|
102
|
+
filter(isInPast).
|
|
103
|
+
map(year => toChecksumBasis(year, baseNumber));
|
|
104
|
+
}
|
|
105
|
+
function getChecksumBasesForStandardDob(dob, baseNumber) {
|
|
106
|
+
const validPastDates = getValidPastDates(dob);
|
|
107
|
+
const extractYearFromDate = (date) => parseInt(date.split('-')[0], 10);
|
|
108
|
+
const validPastYears = validPastDates.map(extractYearFromDate);
|
|
109
|
+
return validPastYears.map(year => toChecksumBasis(year, baseNumber));
|
|
110
|
+
}
|
|
111
|
+
function toChecksumBasis(year, baseNumber) {
|
|
112
|
+
return parseInt(year < 2000 ? baseNumber : `${2}${baseNumber}`, 10);
|
|
113
|
+
}
|
|
114
|
+
function isInPast(date) {
|
|
115
|
+
return new Date(`${date}`) <= getApproximatelyNow();
|
|
116
|
+
}
|
|
117
|
+
function getApproximatelyNow() {
|
|
118
|
+
const ONE_DAY = 1000 * 60 * 60 * 24;
|
|
119
|
+
return new Date(Date.now() + ONE_DAY);
|
|
120
|
+
}
|
|
121
|
+
function getFullYears(yy) {
|
|
122
|
+
return [parseInt(`19${yy}`, 10), parseInt(`20${yy}`, 10)];
|
|
123
|
+
}
|
|
124
|
+
function getFirstSix(number) {
|
|
125
|
+
return util_1.strings.splitAt(number, 6)[0];
|
|
126
|
+
}
|
|
127
|
+
function getBaseNumber(number) {
|
|
128
|
+
return util_1.strings.splitAt(number, 9)[0];
|
|
129
|
+
}
|
|
130
|
+
function getChecksum(number) {
|
|
131
|
+
const checksumString = util_1.strings.splitAt(number, 9)[1];
|
|
132
|
+
return parseInt(checksumString, 10);
|
|
133
|
+
}
|
|
134
|
+
function toDateArray(number) {
|
|
135
|
+
return util_1.strings.splitAt(number, 2, 4, 6).slice(0, 3);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmUvbm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLDBEQUE0QztBQUM1QyxrQ0FBOEQ7QUFHOUQsU0FBUyxLQUFLLENBQUMsS0FBYTtJQUMxQixPQUFPLGNBQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLElBQUksR0FBYztJQUN0QixJQUFJLEVBQUUseUJBQXlCO0lBQy9CLFNBQVMsRUFBRSxpQkFBaUI7SUFDNUIsWUFBWSxFQUFFLFVBQVU7SUFDeEIsT0FBTyxDQUFDLEtBQWE7UUFDbkIsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsSUFBSSxHQUFHLEVBQUU7WUFDUCxNQUFNLEdBQUcsQ0FBQztTQUNYO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQWE7UUFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxRQUFRLENBQUMsS0FBYTtRQUNwQixNQUFNLE1BQU0sR0FBRyxlQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLGNBQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUE7U0FDakU7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE9BQU8s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
|
package/lib/esm/be/nn.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import * as exceptions from '../exceptions';
|
|
2
|
+
import { strings, isValidDateCompactYYYYMMDD } from '../util';
|
|
3
|
+
function clean(input) {
|
|
4
|
+
return strings.cleanUnicode(input, ' -.');
|
|
5
|
+
}
|
|
6
|
+
const impl = {
|
|
7
|
+
name: 'Belgian National Number',
|
|
8
|
+
localName: 'Numéro National',
|
|
9
|
+
abbreviation: 'NN, NISS',
|
|
10
|
+
compact(input) {
|
|
11
|
+
const [value, err] = clean(input);
|
|
12
|
+
if (err) {
|
|
13
|
+
throw err;
|
|
14
|
+
}
|
|
15
|
+
return value;
|
|
16
|
+
},
|
|
17
|
+
format(input) {
|
|
18
|
+
const [value] = clean(input);
|
|
19
|
+
return value;
|
|
20
|
+
},
|
|
21
|
+
validate(input) {
|
|
22
|
+
const number = compact(input);
|
|
23
|
+
if (!strings.isdigits(number) || parseInt(number, 10) <= 0) {
|
|
24
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
25
|
+
}
|
|
26
|
+
if (number.length !== 11) {
|
|
27
|
+
return { isValid: false, error: new exceptions.InvalidLength() };
|
|
28
|
+
}
|
|
29
|
+
if (!validStructure(number)) {
|
|
30
|
+
return { isValid: false, error: new exceptions.InvalidFormat() };
|
|
31
|
+
}
|
|
32
|
+
if (!validChecksum(number)) {
|
|
33
|
+
return { isValid: false, error: new exceptions.InvalidChecksum() };
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
isValid: true,
|
|
37
|
+
compact: number,
|
|
38
|
+
isIndividual: true,
|
|
39
|
+
isCompany: false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
export const { name, localName, abbreviation, validate, format, compact, } = impl;
|
|
44
|
+
function validStructure(number) {
|
|
45
|
+
const firstSix = getFirstSix(number);
|
|
46
|
+
return isValidFirstSix(firstSix);
|
|
47
|
+
}
|
|
48
|
+
function validChecksum(number) {
|
|
49
|
+
const checksumBases = getChecksumBases(number);
|
|
50
|
+
const checksum = getChecksum(number);
|
|
51
|
+
return checksumBases.some(csb => csb % 97 + checksum === 97);
|
|
52
|
+
}
|
|
53
|
+
function isValidFirstSix(firstSix) {
|
|
54
|
+
return isUnknownDob(firstSix) || isValidDob(firstSix);
|
|
55
|
+
}
|
|
56
|
+
function isUnknownDob(dob) {
|
|
57
|
+
const [yy, mm, dd] = toDateArray(dob);
|
|
58
|
+
return (strings.isdigits(yy) && mm === '00' && strings.isdigits(dd));
|
|
59
|
+
}
|
|
60
|
+
function isValidDob(dob) {
|
|
61
|
+
return Boolean(getValidPastDates(dob).length);
|
|
62
|
+
}
|
|
63
|
+
function getValidPastDates(yymmdd) {
|
|
64
|
+
const [yy, mm, dd] = toDateArray(yymmdd);
|
|
65
|
+
return getFullYears(yy).
|
|
66
|
+
filter((yyyy) => isValidDateCompactYYYYMMDD(`${yyyy}${mm}${dd}`)).
|
|
67
|
+
map((yyyy) => `${yyyy}-${mm}-${dd}`).
|
|
68
|
+
filter(isInPast);
|
|
69
|
+
}
|
|
70
|
+
function getChecksumBases(number) {
|
|
71
|
+
const firstSix = getFirstSix(number);
|
|
72
|
+
const baseNumber = getBaseNumber(number);
|
|
73
|
+
if (isUnknownDob(firstSix))
|
|
74
|
+
return getChecksumBasesUnknownDob(firstSix, baseNumber);
|
|
75
|
+
return getChecksumBasesForStandardDob(firstSix, baseNumber);
|
|
76
|
+
}
|
|
77
|
+
function getChecksumBasesUnknownDob(dob, baseNumber) {
|
|
78
|
+
const [yy] = toDateArray(dob);
|
|
79
|
+
return getFullYears(yy).
|
|
80
|
+
filter(isInPast).
|
|
81
|
+
map(year => toChecksumBasis(year, baseNumber));
|
|
82
|
+
}
|
|
83
|
+
function getChecksumBasesForStandardDob(dob, baseNumber) {
|
|
84
|
+
const validPastDates = getValidPastDates(dob);
|
|
85
|
+
const extractYearFromDate = (date) => parseInt(date.split('-')[0], 10);
|
|
86
|
+
const validPastYears = validPastDates.map(extractYearFromDate);
|
|
87
|
+
return validPastYears.map(year => toChecksumBasis(year, baseNumber));
|
|
88
|
+
}
|
|
89
|
+
function toChecksumBasis(year, baseNumber) {
|
|
90
|
+
return parseInt(year < 2000 ? baseNumber : `${2}${baseNumber}`, 10);
|
|
91
|
+
}
|
|
92
|
+
function isInPast(date) {
|
|
93
|
+
return new Date(`${date}`) <= getApproximatelyNow();
|
|
94
|
+
}
|
|
95
|
+
function getApproximatelyNow() {
|
|
96
|
+
const ONE_DAY = 1000 * 60 * 60 * 24;
|
|
97
|
+
return new Date(Date.now() + ONE_DAY);
|
|
98
|
+
}
|
|
99
|
+
function getFullYears(yy) {
|
|
100
|
+
return [parseInt(`19${yy}`, 10), parseInt(`20${yy}`, 10)];
|
|
101
|
+
}
|
|
102
|
+
function getFirstSix(number) {
|
|
103
|
+
return strings.splitAt(number, 6)[0];
|
|
104
|
+
}
|
|
105
|
+
function getBaseNumber(number) {
|
|
106
|
+
return strings.splitAt(number, 9)[0];
|
|
107
|
+
}
|
|
108
|
+
function getChecksum(number) {
|
|
109
|
+
const checksumString = strings.splitAt(number, 9)[1];
|
|
110
|
+
return parseInt(checksumString, 10);
|
|
111
|
+
}
|
|
112
|
+
function toDateArray(number) {
|
|
113
|
+
return strings.splitAt(number, 2, 4, 6).slice(0, 3);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmUvbm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUc5RCxTQUFTLEtBQUssQ0FBQyxLQUFhO0lBQzFCLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sSUFBSSxHQUFjO0lBQ3RCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsU0FBUyxFQUFFLGlCQUFpQjtJQUM1QixZQUFZLEVBQUUsVUFBVTtJQUN4QixPQUFPLENBQUMsS0FBYTtRQUNuQixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLEdBQUcsRUFBRTtZQUNQLE1BQU0sR0FBRyxDQUFDO1NBQ1g7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBYTtRQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELFFBQVEsQ0FBQyxLQUFhO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQTtTQUNqRTtRQUVELElBQUks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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stdnum",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Standard Number Validation",
|
|
5
5
|
"files": [
|
|
6
6
|
"lib"
|
|
@@ -14,6 +14,24 @@
|
|
|
14
14
|
"require": "./lib/cjs/"
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
|
+
"release": {
|
|
18
|
+
"branches": [
|
|
19
|
+
"main"
|
|
20
|
+
],
|
|
21
|
+
"plugins": [
|
|
22
|
+
"@semantic-release/commit-analyzer",
|
|
23
|
+
"@semantic-release/npm",
|
|
24
|
+
[
|
|
25
|
+
"@semantic-release/git",
|
|
26
|
+
{
|
|
27
|
+
"assets": [
|
|
28
|
+
"package.json"
|
|
29
|
+
],
|
|
30
|
+
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
]
|
|
34
|
+
},
|
|
17
35
|
"scripts": {
|
|
18
36
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
19
37
|
"lint": "eslint --ext .js,.jsx,.ts,.tsx src",
|