@mikashboks/capture-intelligence-core 0.1.9 → 0.1.18
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/dist/cjs/capture-normalization.d.ts +21 -1
- package/dist/cjs/capture-normalization.d.ts.map +1 -1
- package/dist/cjs/capture-normalization.js +85 -13
- package/dist/cjs/capture-normalization.js.map +1 -1
- package/dist/cjs/document-classifier.d.ts.map +1 -1
- package/dist/cjs/document-classifier.js +59 -2
- package/dist/cjs/document-classifier.js.map +1 -1
- package/dist/cjs/document-placement.d.ts +21 -0
- package/dist/cjs/document-placement.d.ts.map +1 -0
- package/dist/cjs/document-placement.js +66 -0
- package/dist/cjs/document-placement.js.map +1 -0
- package/dist/cjs/index.d.ts +12 -4
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +27 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/issuing-country.d.ts +16 -0
- package/dist/cjs/issuing-country.d.ts.map +1 -0
- package/dist/cjs/issuing-country.js +77 -0
- package/dist/cjs/issuing-country.js.map +1 -0
- package/dist/cjs/kyc-mobile-contract.d.ts +13 -1
- package/dist/cjs/kyc-mobile-contract.d.ts.map +1 -1
- package/dist/cjs/kyc-mobile-contract.js +64 -6
- package/dist/cjs/kyc-mobile-contract.js.map +1 -1
- package/dist/cjs/mrz-band-detector.d.ts +12 -5
- package/dist/cjs/mrz-band-detector.d.ts.map +1 -1
- package/dist/cjs/mrz-band-detector.js +29 -14
- package/dist/cjs/mrz-band-detector.js.map +1 -1
- package/dist/cjs/mrz-check-digits.d.ts +74 -0
- package/dist/cjs/mrz-check-digits.d.ts.map +1 -0
- package/dist/cjs/mrz-check-digits.js +478 -0
- package/dist/cjs/mrz-check-digits.js.map +1 -0
- package/dist/cjs/mrz-policy.d.ts +18 -0
- package/dist/cjs/mrz-policy.d.ts.map +1 -0
- package/dist/cjs/mrz-policy.js +90 -0
- package/dist/cjs/mrz-policy.js.map +1 -0
- package/dist/cjs/quality-checks.d.ts +16 -0
- package/dist/cjs/quality-checks.d.ts.map +1 -1
- package/dist/cjs/quality-checks.js +72 -17
- package/dist/cjs/quality-checks.js.map +1 -1
- package/dist/cjs/types.d.ts +2 -2
- package/dist/cjs/types.js +2 -2
- package/dist/esm/capture-normalization.d.ts +21 -1
- package/dist/esm/capture-normalization.d.ts.map +1 -1
- package/dist/esm/capture-normalization.js +84 -13
- package/dist/esm/capture-normalization.js.map +1 -1
- package/dist/esm/document-classifier.d.ts.map +1 -1
- package/dist/esm/document-classifier.js +59 -2
- package/dist/esm/document-classifier.js.map +1 -1
- package/dist/esm/document-placement.d.ts +21 -0
- package/dist/esm/document-placement.d.ts.map +1 -0
- package/dist/esm/document-placement.js +62 -0
- package/dist/esm/document-placement.js.map +1 -0
- package/dist/esm/index.d.ts +12 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +7 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/issuing-country.d.ts +16 -0
- package/dist/esm/issuing-country.d.ts.map +1 -0
- package/dist/esm/issuing-country.js +71 -0
- package/dist/esm/issuing-country.js.map +1 -0
- package/dist/esm/kyc-mobile-contract.d.ts +13 -1
- package/dist/esm/kyc-mobile-contract.d.ts.map +1 -1
- package/dist/esm/kyc-mobile-contract.js +63 -5
- package/dist/esm/kyc-mobile-contract.js.map +1 -1
- package/dist/esm/mrz-band-detector.d.ts +12 -5
- package/dist/esm/mrz-band-detector.d.ts.map +1 -1
- package/dist/esm/mrz-band-detector.js +29 -14
- package/dist/esm/mrz-band-detector.js.map +1 -1
- package/dist/esm/mrz-check-digits.d.ts +74 -0
- package/dist/esm/mrz-check-digits.d.ts.map +1 -0
- package/dist/esm/mrz-check-digits.js +471 -0
- package/dist/esm/mrz-check-digits.js.map +1 -0
- package/dist/esm/mrz-policy.d.ts +18 -0
- package/dist/esm/mrz-policy.d.ts.map +1 -0
- package/dist/esm/mrz-policy.js +87 -0
- package/dist/esm/mrz-policy.js.map +1 -0
- package/dist/esm/quality-checks.d.ts +16 -0
- package/dist/esm/quality-checks.d.ts.map +1 -1
- package/dist/esm/quality-checks.js +71 -17
- package/dist/esm/quality-checks.js.map +1 -1
- package/dist/esm/types.d.ts +2 -2
- package/dist/esm/types.js +2 -2
- package/package.json +8 -4
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export type MrzDocumentFormat = 'TD1' | 'TD2' | 'TD3';
|
|
2
|
+
export type MrzCheckDigitField = 'documentNumber' | 'dateOfBirth' | 'expirationDate' | 'optionalData' | 'composite';
|
|
3
|
+
export interface MrzCheckDigitResult {
|
|
4
|
+
field: MrzCheckDigitField;
|
|
5
|
+
value: string;
|
|
6
|
+
expected: string;
|
|
7
|
+
actual: string;
|
|
8
|
+
valid: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface MrzAutocorrection {
|
|
11
|
+
line: number;
|
|
12
|
+
column: number;
|
|
13
|
+
original: string;
|
|
14
|
+
corrected: string;
|
|
15
|
+
}
|
|
16
|
+
export interface MrzParsedFields {
|
|
17
|
+
documentCode?: string;
|
|
18
|
+
issuingState?: string;
|
|
19
|
+
documentNumber?: string;
|
|
20
|
+
dateOfBirth?: string;
|
|
21
|
+
birthDate?: string;
|
|
22
|
+
expirationDate?: string;
|
|
23
|
+
expiryDate?: string;
|
|
24
|
+
nationality?: string;
|
|
25
|
+
sex?: string;
|
|
26
|
+
firstName?: string;
|
|
27
|
+
lastName?: string;
|
|
28
|
+
optional?: string;
|
|
29
|
+
optional1?: string;
|
|
30
|
+
optional2?: string;
|
|
31
|
+
personalNumber?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface MrzParserDetail {
|
|
34
|
+
label?: string;
|
|
35
|
+
field?: string;
|
|
36
|
+
value?: string | null;
|
|
37
|
+
valid?: boolean;
|
|
38
|
+
error?: string;
|
|
39
|
+
autocorrect?: MrzAutocorrection[];
|
|
40
|
+
}
|
|
41
|
+
export interface MrzParseOptions {
|
|
42
|
+
autocorrect?: boolean;
|
|
43
|
+
allowedFormats?: readonly MrzDocumentFormat[];
|
|
44
|
+
requireParserValidity?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface MrzValidationResult {
|
|
47
|
+
valid: boolean;
|
|
48
|
+
format: MrzDocumentFormat | null;
|
|
49
|
+
normalizedLines: string[];
|
|
50
|
+
checks: MrzCheckDigitResult[];
|
|
51
|
+
errors: string[];
|
|
52
|
+
checkDigitsValid?: boolean;
|
|
53
|
+
parserValid?: boolean | null;
|
|
54
|
+
autocorrections?: MrzAutocorrection[];
|
|
55
|
+
}
|
|
56
|
+
export interface MrzParseResult {
|
|
57
|
+
valid: boolean;
|
|
58
|
+
format: MrzDocumentFormat | null;
|
|
59
|
+
normalizedLines: string[];
|
|
60
|
+
fields: MrzParsedFields;
|
|
61
|
+
checks: MrzCheckDigitResult[];
|
|
62
|
+
checkDigitsValid: boolean;
|
|
63
|
+
parserValid: boolean | null;
|
|
64
|
+
details: MrzParserDetail[];
|
|
65
|
+
autocorrections: MrzAutocorrection[];
|
|
66
|
+
errors: string[];
|
|
67
|
+
raw: unknown | null;
|
|
68
|
+
}
|
|
69
|
+
export declare function getMrzCharacterValue(char: string): number | null;
|
|
70
|
+
export declare function computeMrzCheckDigit(value: string): string;
|
|
71
|
+
export declare function normalizeMrzLines(input: string | string[]): string[];
|
|
72
|
+
export declare function parseMrzText(input: string | string[], options?: MrzParseOptions): MrzParseResult;
|
|
73
|
+
export declare function validateMrzCheckDigits(input: string | string[]): MrzValidationResult;
|
|
74
|
+
//# sourceMappingURL=mrz-check-digits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mrz-check-digits.d.ts","sourceRoot":"","sources":["../../src/mrz-check-digits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMrzCharacterValue = getMrzCharacterValue;
|
|
4
|
+
exports.computeMrzCheckDigit = computeMrzCheckDigit;
|
|
5
|
+
exports.normalizeMrzLines = normalizeMrzLines;
|
|
6
|
+
exports.parseMrzText = parseMrzText;
|
|
7
|
+
exports.validateMrzCheckDigits = validateMrzCheckDigits;
|
|
8
|
+
const mrz_1 = { parse: null };
|
|
9
|
+
const MRZ_WEIGHTS = [7, 3, 1];
|
|
10
|
+
const MRZ_ALLOWED_CHARS = /^[A-Z0-9<]+$/;
|
|
11
|
+
const MRZ_SUPPORTED_FORMATS = new Set(['TD1', 'TD2', 'TD3']);
|
|
12
|
+
const EMPTY_RESULT = Object.freeze({
|
|
13
|
+
valid: false,
|
|
14
|
+
format: null,
|
|
15
|
+
normalizedLines: [],
|
|
16
|
+
checks: [],
|
|
17
|
+
errors: ['empty_mrz'],
|
|
18
|
+
});
|
|
19
|
+
function getMrzCharacterValue(char) {
|
|
20
|
+
if (char === '<')
|
|
21
|
+
return 0;
|
|
22
|
+
const code = char.charCodeAt(0);
|
|
23
|
+
if (code >= 48 && code <= 57)
|
|
24
|
+
return code - 48;
|
|
25
|
+
if (code >= 65 && code <= 90)
|
|
26
|
+
return code - 55;
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function computeMrzCheckDigit(value) {
|
|
30
|
+
let sum = 0;
|
|
31
|
+
const normalized = String(value).toUpperCase();
|
|
32
|
+
for (let index = 0; index < normalized.length; index += 1) {
|
|
33
|
+
const charValue = getMrzCharacterValue(normalized[index] ?? '');
|
|
34
|
+
if (charValue === null) {
|
|
35
|
+
throw new Error(`Invalid MRZ character at index ${index}`);
|
|
36
|
+
}
|
|
37
|
+
sum += charValue * MRZ_WEIGHTS[index % MRZ_WEIGHTS.length];
|
|
38
|
+
}
|
|
39
|
+
return String(sum % 10);
|
|
40
|
+
}
|
|
41
|
+
function normalizeMrzLines(input) {
|
|
42
|
+
const lines = Array.isArray(input) ? input : String(input).split(/\r?\n/g);
|
|
43
|
+
return lines.map(line => String(line).trim().replace(/\s+/g, '').toUpperCase()).filter(Boolean);
|
|
44
|
+
}
|
|
45
|
+
function isLikelyTd3NameLine(line) {
|
|
46
|
+
return /^P[A-Z<][A-Z<]{3}[A-Z<]+<<[A-Z<]+/.test(line);
|
|
47
|
+
}
|
|
48
|
+
function isLikelyTd3DataLine(line) {
|
|
49
|
+
return /^[A-Z0-9<]{9}[0-9A-Z][A-Z<]{3}[0-9A-Z]{6}[0-9A-Z][MF<X]/.test(line);
|
|
50
|
+
}
|
|
51
|
+
function orderLikelyMrzLines(lines) {
|
|
52
|
+
if (lines.length === 2 &&
|
|
53
|
+
isLikelyTd3DataLine(lines[0] ?? '') &&
|
|
54
|
+
isLikelyTd3NameLine(lines[1] ?? '')) {
|
|
55
|
+
return [lines[1] ?? '', lines[0] ?? ''];
|
|
56
|
+
}
|
|
57
|
+
return lines;
|
|
58
|
+
}
|
|
59
|
+
function trimCandidateLines(lines) {
|
|
60
|
+
const ordered = orderLikelyMrzLines(lines);
|
|
61
|
+
if (ordered.length === 2 &&
|
|
62
|
+
isLikelyTd3NameLine(ordered[0] ?? '') &&
|
|
63
|
+
isLikelyTd3DataLine(ordered[1] ?? '') &&
|
|
64
|
+
ordered[0].length >= 44 &&
|
|
65
|
+
ordered[1].length >= 40) {
|
|
66
|
+
return [ordered[0].slice(0, 44), ordered[1].slice(0, 44).padEnd(44, '<')];
|
|
67
|
+
}
|
|
68
|
+
if (ordered.length === 2 && ordered[0].length >= 44 && ordered[1].length >= 44) {
|
|
69
|
+
return [ordered[0].slice(0, 44), ordered[1].slice(0, 44)];
|
|
70
|
+
}
|
|
71
|
+
if (ordered.length === 3 &&
|
|
72
|
+
ordered[0].length >= 30 &&
|
|
73
|
+
ordered[1].length >= 30 &&
|
|
74
|
+
ordered[2].length >= 30) {
|
|
75
|
+
return [ordered[0].slice(0, 30), ordered[1].slice(0, 30), ordered[2].slice(0, 30)];
|
|
76
|
+
}
|
|
77
|
+
if (ordered.length === 2 && ordered[0].length >= 36 && ordered[1].length >= 36) {
|
|
78
|
+
return [ordered[0].slice(0, 36), ordered[1].slice(0, 36)];
|
|
79
|
+
}
|
|
80
|
+
return ordered;
|
|
81
|
+
}
|
|
82
|
+
function inferMrzFormat(lines) {
|
|
83
|
+
if (lines.length === 2 && lines.every(line => line.length === 44))
|
|
84
|
+
return 'TD3';
|
|
85
|
+
if (lines.length === 2 && lines.every(line => line.length === 36))
|
|
86
|
+
return 'TD2';
|
|
87
|
+
if (lines.length === 3 && lines.every(line => line.length === 30))
|
|
88
|
+
return 'TD1';
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
function addCheck(checks, field, value, actual) {
|
|
92
|
+
const expected = computeMrzCheckDigit(value);
|
|
93
|
+
checks.push({
|
|
94
|
+
field,
|
|
95
|
+
value,
|
|
96
|
+
expected,
|
|
97
|
+
actual,
|
|
98
|
+
valid: actual === expected,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function validateTd3(lines) {
|
|
102
|
+
const line2 = lines[1] ?? '';
|
|
103
|
+
const checks = [];
|
|
104
|
+
addCheck(checks, 'documentNumber', line2.slice(0, 9), line2[9] ?? '');
|
|
105
|
+
addCheck(checks, 'dateOfBirth', line2.slice(13, 19), line2[19] ?? '');
|
|
106
|
+
addCheck(checks, 'expirationDate', line2.slice(21, 27), line2[27] ?? '');
|
|
107
|
+
addCheck(checks, 'optionalData', line2.slice(28, 42), line2[42] ?? '');
|
|
108
|
+
addCheck(checks, 'composite', `${line2.slice(0, 10)}${line2.slice(13, 20)}${line2.slice(21, 43)}`, line2[43] ?? '');
|
|
109
|
+
return checks;
|
|
110
|
+
}
|
|
111
|
+
function validateTd2(lines) {
|
|
112
|
+
const line2 = lines[1] ?? '';
|
|
113
|
+
const checks = [];
|
|
114
|
+
addCheck(checks, 'documentNumber', line2.slice(0, 9), line2[9] ?? '');
|
|
115
|
+
addCheck(checks, 'dateOfBirth', line2.slice(13, 19), line2[19] ?? '');
|
|
116
|
+
addCheck(checks, 'expirationDate', line2.slice(21, 27), line2[27] ?? '');
|
|
117
|
+
addCheck(checks, 'composite', `${line2.slice(0, 10)}${line2.slice(13, 20)}${line2.slice(21, 35)}`, line2[35] ?? '');
|
|
118
|
+
return checks;
|
|
119
|
+
}
|
|
120
|
+
function validateTd1(lines) {
|
|
121
|
+
const line1 = lines[0] ?? '';
|
|
122
|
+
const line2 = lines[1] ?? '';
|
|
123
|
+
const checks = [];
|
|
124
|
+
addCheck(checks, 'documentNumber', line1.slice(5, 14), line1[14] ?? '');
|
|
125
|
+
addCheck(checks, 'dateOfBirth', line2.slice(0, 6), line2[6] ?? '');
|
|
126
|
+
addCheck(checks, 'expirationDate', line2.slice(8, 14), line2[14] ?? '');
|
|
127
|
+
addCheck(checks, 'composite', `${line1.slice(5, 30)}${line2.slice(0, 7)}${line2.slice(8, 15)}${line2.slice(18, 29)}`, line2[29] ?? '');
|
|
128
|
+
return checks;
|
|
129
|
+
}
|
|
130
|
+
const OCR_NUMERIC_CORRECTIONS = {
|
|
131
|
+
O: '0',
|
|
132
|
+
Q: '0',
|
|
133
|
+
D: '0',
|
|
134
|
+
I: '1',
|
|
135
|
+
L: '1',
|
|
136
|
+
Z: '2',
|
|
137
|
+
S: '5',
|
|
138
|
+
G: '6',
|
|
139
|
+
B: '8',
|
|
140
|
+
};
|
|
141
|
+
function correctNumericChar(lines, lineIndex, column, corrections) {
|
|
142
|
+
const line = lines[lineIndex];
|
|
143
|
+
const original = line?.[column];
|
|
144
|
+
if (!line || !original || /[0-9<]/.test(original))
|
|
145
|
+
return;
|
|
146
|
+
const corrected = OCR_NUMERIC_CORRECTIONS[original];
|
|
147
|
+
if (!corrected)
|
|
148
|
+
return;
|
|
149
|
+
lines[lineIndex] = `${line.slice(0, column)}${corrected}${line.slice(column + 1)}`;
|
|
150
|
+
corrections.push({
|
|
151
|
+
line: lineIndex,
|
|
152
|
+
column,
|
|
153
|
+
original,
|
|
154
|
+
corrected,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function correctNumericRange(lines, lineIndex, start, endExclusive, corrections) {
|
|
158
|
+
for (let column = start; column < endExclusive; column += 1) {
|
|
159
|
+
correctNumericChar(lines, lineIndex, column, corrections);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function autocorrectMrzLines(lines, format) {
|
|
163
|
+
const corrected = [...lines];
|
|
164
|
+
const corrections = [];
|
|
165
|
+
if (format === 'TD3') {
|
|
166
|
+
correctNumericChar(corrected, 1, 9, corrections);
|
|
167
|
+
correctNumericRange(corrected, 1, 13, 20, corrections);
|
|
168
|
+
correctNumericRange(corrected, 1, 21, 28, corrections);
|
|
169
|
+
correctNumericChar(corrected, 1, 42, corrections);
|
|
170
|
+
correctNumericChar(corrected, 1, 43, corrections);
|
|
171
|
+
}
|
|
172
|
+
else if (format === 'TD2') {
|
|
173
|
+
correctNumericChar(corrected, 1, 9, corrections);
|
|
174
|
+
correctNumericRange(corrected, 1, 13, 20, corrections);
|
|
175
|
+
correctNumericRange(corrected, 1, 21, 28, corrections);
|
|
176
|
+
correctNumericChar(corrected, 1, 35, corrections);
|
|
177
|
+
}
|
|
178
|
+
else if (format === 'TD1') {
|
|
179
|
+
correctNumericChar(corrected, 0, 14, corrections);
|
|
180
|
+
correctNumericRange(corrected, 1, 0, 7, corrections);
|
|
181
|
+
correctNumericRange(corrected, 1, 8, 15, corrections);
|
|
182
|
+
correctNumericChar(corrected, 1, 29, corrections);
|
|
183
|
+
}
|
|
184
|
+
return { lines: corrected, corrections };
|
|
185
|
+
}
|
|
186
|
+
function stripFiller(value) {
|
|
187
|
+
return value.replace(/<+$/g, '').replace(/</g, '');
|
|
188
|
+
}
|
|
189
|
+
function parseNameLine(value) {
|
|
190
|
+
const [lastName = '', firstName = ''] = value.split('<<');
|
|
191
|
+
const clean = (part) => {
|
|
192
|
+
const cleaned = part.replace(/<+/g, ' ').trim();
|
|
193
|
+
return cleaned || undefined;
|
|
194
|
+
};
|
|
195
|
+
return {
|
|
196
|
+
lastName: clean(lastName),
|
|
197
|
+
firstName: clean(firstName),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function normalizeSex(value) {
|
|
201
|
+
if (value === 'M')
|
|
202
|
+
return 'male';
|
|
203
|
+
if (value === 'F')
|
|
204
|
+
return 'female';
|
|
205
|
+
if (value === '<' || value === 'X')
|
|
206
|
+
return 'other';
|
|
207
|
+
return value || undefined;
|
|
208
|
+
}
|
|
209
|
+
function mapFields(format, lines) {
|
|
210
|
+
if (format === 'TD3') {
|
|
211
|
+
const line1 = lines[0] ?? '';
|
|
212
|
+
const line2 = lines[1] ?? '';
|
|
213
|
+
const names = parseNameLine(line1.slice(5));
|
|
214
|
+
const dateOfBirth = line2.slice(13, 19);
|
|
215
|
+
const expirationDate = line2.slice(21, 27);
|
|
216
|
+
return {
|
|
217
|
+
documentCode: line1.slice(0, 1) || undefined,
|
|
218
|
+
issuingState: stripFiller(line1.slice(2, 5)) || undefined,
|
|
219
|
+
documentNumber: stripFiller(line2.slice(0, 9)) || undefined,
|
|
220
|
+
dateOfBirth,
|
|
221
|
+
birthDate: dateOfBirth,
|
|
222
|
+
expirationDate,
|
|
223
|
+
expiryDate: expirationDate,
|
|
224
|
+
nationality: stripFiller(line2.slice(10, 13)) || undefined,
|
|
225
|
+
sex: normalizeSex(line2.slice(20, 21)),
|
|
226
|
+
personalNumber: stripFiller(line2.slice(28, 42)) || undefined,
|
|
227
|
+
...names,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
if (format === 'TD2') {
|
|
231
|
+
const line1 = lines[0] ?? '';
|
|
232
|
+
const line2 = lines[1] ?? '';
|
|
233
|
+
const names = parseNameLine(line1.slice(5));
|
|
234
|
+
const dateOfBirth = line2.slice(13, 19);
|
|
235
|
+
const expirationDate = line2.slice(21, 27);
|
|
236
|
+
return {
|
|
237
|
+
documentCode: line1.slice(0, 1) || undefined,
|
|
238
|
+
issuingState: stripFiller(line1.slice(2, 5)) || undefined,
|
|
239
|
+
documentNumber: stripFiller(line2.slice(0, 9)) || undefined,
|
|
240
|
+
dateOfBirth,
|
|
241
|
+
birthDate: dateOfBirth,
|
|
242
|
+
expirationDate,
|
|
243
|
+
expiryDate: expirationDate,
|
|
244
|
+
nationality: stripFiller(line2.slice(10, 13)) || undefined,
|
|
245
|
+
sex: normalizeSex(line2.slice(20, 21)),
|
|
246
|
+
optional: stripFiller(line2.slice(28, 35)) || undefined,
|
|
247
|
+
...names,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
const line1 = lines[0] ?? '';
|
|
251
|
+
const line2 = lines[1] ?? '';
|
|
252
|
+
const line3 = lines[2] ?? '';
|
|
253
|
+
const names = parseNameLine(line3);
|
|
254
|
+
const dateOfBirth = line2.slice(0, 6);
|
|
255
|
+
const expirationDate = line2.slice(8, 14);
|
|
256
|
+
return {
|
|
257
|
+
documentCode: line1.slice(0, 1) || undefined,
|
|
258
|
+
issuingState: stripFiller(line1.slice(2, 5)) || undefined,
|
|
259
|
+
documentNumber: stripFiller(line1.slice(5, 14)) || undefined,
|
|
260
|
+
dateOfBirth,
|
|
261
|
+
birthDate: dateOfBirth,
|
|
262
|
+
expirationDate,
|
|
263
|
+
expiryDate: expirationDate,
|
|
264
|
+
nationality: stripFiller(line2.slice(15, 18)) || undefined,
|
|
265
|
+
sex: normalizeSex(line2.slice(7, 8)),
|
|
266
|
+
optional1: stripFiller(line1.slice(15, 30)) || undefined,
|
|
267
|
+
optional2: stripFiller(line2.slice(18, 29)) || undefined,
|
|
268
|
+
...names,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
const parseMrzLibrary = mrz_1.parse;
|
|
272
|
+
function getMrzParserSync() {
|
|
273
|
+
return typeof parseMrzLibrary === 'function' ? parseMrzLibrary : null;
|
|
274
|
+
}
|
|
275
|
+
function isParserResult(value) {
|
|
276
|
+
return typeof value === 'object' && value !== null;
|
|
277
|
+
}
|
|
278
|
+
function mapParserDetails(raw) {
|
|
279
|
+
if (!isParserResult(raw) || !Array.isArray(raw.details))
|
|
280
|
+
return [];
|
|
281
|
+
return raw.details.map(detail => ({
|
|
282
|
+
label: detail.label,
|
|
283
|
+
field: detail.field,
|
|
284
|
+
value: detail.value,
|
|
285
|
+
valid: detail.valid,
|
|
286
|
+
error: detail.error,
|
|
287
|
+
autocorrect: Array.isArray(detail.autocorrect) ? detail.autocorrect : [],
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
function mergeParserFields(fields, raw) {
|
|
291
|
+
if (!isParserResult(raw) || !raw.fields)
|
|
292
|
+
return fields;
|
|
293
|
+
const rawFields = raw.fields;
|
|
294
|
+
return {
|
|
295
|
+
...fields,
|
|
296
|
+
documentCode: rawFields.documentCode ?? fields.documentCode,
|
|
297
|
+
issuingState: rawFields.issuingState ?? fields.issuingState,
|
|
298
|
+
documentNumber: rawFields.documentNumber ?? fields.documentNumber,
|
|
299
|
+
dateOfBirth: rawFields.birthDate ?? fields.dateOfBirth,
|
|
300
|
+
birthDate: rawFields.birthDate ?? fields.birthDate,
|
|
301
|
+
expirationDate: rawFields.expirationDate ?? fields.expirationDate,
|
|
302
|
+
expiryDate: rawFields.expirationDate ?? fields.expiryDate,
|
|
303
|
+
nationality: rawFields.nationality ?? fields.nationality,
|
|
304
|
+
sex: rawFields.sex ?? fields.sex,
|
|
305
|
+
firstName: rawFields.firstName ?? fields.firstName,
|
|
306
|
+
lastName: rawFields.lastName ?? fields.lastName,
|
|
307
|
+
optional: rawFields.optional ?? fields.optional,
|
|
308
|
+
optional1: rawFields.optional1 ?? fields.optional1,
|
|
309
|
+
optional2: rawFields.optional2 ?? fields.optional2,
|
|
310
|
+
personalNumber: rawFields.personalNumber ?? fields.personalNumber,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function getParserAutocorrections(details) {
|
|
314
|
+
return details.flatMap(detail => detail.autocorrect ?? []);
|
|
315
|
+
}
|
|
316
|
+
function parseWithLibrary(lines, autocorrect) {
|
|
317
|
+
const parser = getMrzParserSync();
|
|
318
|
+
if (!parser) {
|
|
319
|
+
return {
|
|
320
|
+
raw: null,
|
|
321
|
+
parserValid: null,
|
|
322
|
+
details: [],
|
|
323
|
+
errors: [],
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
const raw = parser(lines, { autocorrect });
|
|
328
|
+
const details = mapParserDetails(raw);
|
|
329
|
+
const parserValid = isParserResult(raw) && typeof raw.valid === 'boolean' ? raw.valid : null;
|
|
330
|
+
return {
|
|
331
|
+
raw,
|
|
332
|
+
parserValid,
|
|
333
|
+
details,
|
|
334
|
+
errors: parserValid === false ? ['parser_invalid'] : [],
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
return {
|
|
339
|
+
raw: null,
|
|
340
|
+
parserValid: false,
|
|
341
|
+
details: [],
|
|
342
|
+
errors: [
|
|
343
|
+
error instanceof Error && error.message ? `parser_error:${error.message}` : 'parser_error',
|
|
344
|
+
],
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
function buildChecks(format, lines) {
|
|
349
|
+
if (format === 'TD3')
|
|
350
|
+
return validateTd3(lines);
|
|
351
|
+
if (format === 'TD2')
|
|
352
|
+
return validateTd2(lines);
|
|
353
|
+
return validateTd1(lines);
|
|
354
|
+
}
|
|
355
|
+
function parseMrzText(input, options = {}) {
|
|
356
|
+
const rawNormalizedLines = normalizeMrzLines(input);
|
|
357
|
+
if (rawNormalizedLines.length === 0) {
|
|
358
|
+
return {
|
|
359
|
+
valid: false,
|
|
360
|
+
format: null,
|
|
361
|
+
normalizedLines: [],
|
|
362
|
+
fields: {},
|
|
363
|
+
checks: [],
|
|
364
|
+
checkDigitsValid: false,
|
|
365
|
+
parserValid: null,
|
|
366
|
+
details: [],
|
|
367
|
+
autocorrections: [],
|
|
368
|
+
errors: ['empty_mrz'],
|
|
369
|
+
raw: null,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
let normalizedLines = trimCandidateLines(rawNormalizedLines);
|
|
373
|
+
const invalidLine = normalizedLines.find(line => !MRZ_ALLOWED_CHARS.test(line));
|
|
374
|
+
if (invalidLine) {
|
|
375
|
+
return {
|
|
376
|
+
valid: false,
|
|
377
|
+
format: null,
|
|
378
|
+
normalizedLines,
|
|
379
|
+
fields: {},
|
|
380
|
+
checks: [],
|
|
381
|
+
checkDigitsValid: false,
|
|
382
|
+
parserValid: null,
|
|
383
|
+
details: [],
|
|
384
|
+
autocorrections: [],
|
|
385
|
+
errors: ['invalid_characters'],
|
|
386
|
+
raw: null,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
const format = inferMrzFormat(normalizedLines);
|
|
390
|
+
if (!format) {
|
|
391
|
+
return {
|
|
392
|
+
valid: false,
|
|
393
|
+
format: null,
|
|
394
|
+
normalizedLines,
|
|
395
|
+
checks: [],
|
|
396
|
+
errors: ['unsupported_mrz_format'],
|
|
397
|
+
fields: {},
|
|
398
|
+
checkDigitsValid: false,
|
|
399
|
+
parserValid: null,
|
|
400
|
+
details: [],
|
|
401
|
+
autocorrections: [],
|
|
402
|
+
raw: null,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
if (options.allowedFormats?.length && !options.allowedFormats.includes(format)) {
|
|
406
|
+
return {
|
|
407
|
+
valid: false,
|
|
408
|
+
format,
|
|
409
|
+
normalizedLines,
|
|
410
|
+
fields: {},
|
|
411
|
+
checks: [],
|
|
412
|
+
checkDigitsValid: false,
|
|
413
|
+
parserValid: null,
|
|
414
|
+
details: [],
|
|
415
|
+
autocorrections: [],
|
|
416
|
+
errors: ['unexpected_mrz_format'],
|
|
417
|
+
raw: null,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
const localAutocorrect = options.autocorrect === false
|
|
421
|
+
? { lines: normalizedLines, corrections: [] }
|
|
422
|
+
: autocorrectMrzLines(normalizedLines, format);
|
|
423
|
+
normalizedLines = localAutocorrect.lines;
|
|
424
|
+
const checks = buildChecks(format, normalizedLines);
|
|
425
|
+
const failedFields = checks.filter(check => !check.valid).map(check => check.field);
|
|
426
|
+
const checkErrors = failedFields.map(field => `invalid_${field}_check_digit`);
|
|
427
|
+
const checkDigitsValid = failedFields.length === 0;
|
|
428
|
+
const parsed = parseWithLibrary(normalizedLines, options.autocorrect !== false);
|
|
429
|
+
const details = parsed.details.length
|
|
430
|
+
? parsed.details
|
|
431
|
+
: checks.map(check => ({
|
|
432
|
+
label: `${check.field} check digit`,
|
|
433
|
+
field: check.field,
|
|
434
|
+
value: check.actual,
|
|
435
|
+
valid: check.valid,
|
|
436
|
+
error: check.valid
|
|
437
|
+
? undefined
|
|
438
|
+
: `invalid check digit: ${check.actual}. Must be ${check.expected}`,
|
|
439
|
+
}));
|
|
440
|
+
const parserAutocorrections = getParserAutocorrections(details);
|
|
441
|
+
const autocorrections = [...localAutocorrect.corrections, ...parserAutocorrections];
|
|
442
|
+
const parserValid = parsed.parserValid === null ? null : parsed.parserValid && MRZ_SUPPORTED_FORMATS.has(format);
|
|
443
|
+
const requireParserValidity = options.requireParserValidity !== false;
|
|
444
|
+
const valid = checkDigitsValid && (requireParserValidity ? parserValid === true : true);
|
|
445
|
+
const fields = mergeParserFields(mapFields(format, normalizedLines), parsed.raw);
|
|
446
|
+
return {
|
|
447
|
+
valid,
|
|
448
|
+
format,
|
|
449
|
+
normalizedLines,
|
|
450
|
+
fields,
|
|
451
|
+
checks,
|
|
452
|
+
checkDigitsValid,
|
|
453
|
+
parserValid,
|
|
454
|
+
details,
|
|
455
|
+
autocorrections,
|
|
456
|
+
errors: [...checkErrors, ...parsed.errors],
|
|
457
|
+
raw: parsed.raw,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
function validateMrzCheckDigits(input) {
|
|
461
|
+
const result = parseMrzText(input, { requireParserValidity: false });
|
|
462
|
+
if (result.normalizedLines.length === 0)
|
|
463
|
+
return { ...EMPTY_RESULT };
|
|
464
|
+
return {
|
|
465
|
+
valid: result.checkDigitsValid,
|
|
466
|
+
format: result.format,
|
|
467
|
+
normalizedLines: result.normalizedLines,
|
|
468
|
+
checks: result.checks,
|
|
469
|
+
errors: result.errors.filter(error => error.startsWith('invalid_') ||
|
|
470
|
+
error === 'empty_mrz' ||
|
|
471
|
+
error === 'invalid_characters' ||
|
|
472
|
+
error === 'unsupported_mrz_format'),
|
|
473
|
+
checkDigitsValid: result.checkDigitsValid,
|
|
474
|
+
parserValid: result.parserValid,
|
|
475
|
+
autocorrections: result.autocorrections,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
//# sourceMappingURL=mrz-check-digits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mrz-check-digits.js","sourceRoot":"","sources":["../../src/mrz-check-digits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { MrzDocumentFormat } from './mrz-check-digits.js';
|
|
2
|
+
export type MrzPlacement = 'passport_data_page' | 'card_back';
|
|
3
|
+
export type MrzExpectation = 'expected' | 'none';
|
|
4
|
+
export interface DocumentMrzPolicy {
|
|
5
|
+
expected: boolean;
|
|
6
|
+
expectation: MrzExpectation;
|
|
7
|
+
formats: readonly MrzDocumentFormat[];
|
|
8
|
+
placement: MrzPlacement | null;
|
|
9
|
+
reason: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DocumentMrzPolicyInput {
|
|
12
|
+
documentType?: string | null;
|
|
13
|
+
documentSide?: 'front' | 'back' | string | null;
|
|
14
|
+
captureMode?: string | null;
|
|
15
|
+
overlayVariant?: 'card' | 'passport' | 'a4' | string | null;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveDocumentMrzPolicy(input?: DocumentMrzPolicyInput): DocumentMrzPolicy;
|
|
18
|
+
//# sourceMappingURL=mrz-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mrz-policy.d.ts","sourceRoot":"","sources":["../../src/mrz-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG,oBAAoB,GAAG,WAAW,CAAC;AAC9D,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACtC,SAAS,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CAC7D;AA8ED,wBAAgB,wBAAwB,CAAC,KAAK,GAAE,sBAA2B,GAAG,iBAAiB,CA2B9F"}
|