@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.
Files changed (83) hide show
  1. package/dist/cjs/capture-normalization.d.ts +21 -1
  2. package/dist/cjs/capture-normalization.d.ts.map +1 -1
  3. package/dist/cjs/capture-normalization.js +85 -13
  4. package/dist/cjs/capture-normalization.js.map +1 -1
  5. package/dist/cjs/document-classifier.d.ts.map +1 -1
  6. package/dist/cjs/document-classifier.js +59 -2
  7. package/dist/cjs/document-classifier.js.map +1 -1
  8. package/dist/cjs/document-placement.d.ts +21 -0
  9. package/dist/cjs/document-placement.d.ts.map +1 -0
  10. package/dist/cjs/document-placement.js +66 -0
  11. package/dist/cjs/document-placement.js.map +1 -0
  12. package/dist/cjs/index.d.ts +12 -4
  13. package/dist/cjs/index.d.ts.map +1 -1
  14. package/dist/cjs/index.js +27 -2
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/issuing-country.d.ts +16 -0
  17. package/dist/cjs/issuing-country.d.ts.map +1 -0
  18. package/dist/cjs/issuing-country.js +77 -0
  19. package/dist/cjs/issuing-country.js.map +1 -0
  20. package/dist/cjs/kyc-mobile-contract.d.ts +13 -1
  21. package/dist/cjs/kyc-mobile-contract.d.ts.map +1 -1
  22. package/dist/cjs/kyc-mobile-contract.js +64 -6
  23. package/dist/cjs/kyc-mobile-contract.js.map +1 -1
  24. package/dist/cjs/mrz-band-detector.d.ts +12 -5
  25. package/dist/cjs/mrz-band-detector.d.ts.map +1 -1
  26. package/dist/cjs/mrz-band-detector.js +29 -14
  27. package/dist/cjs/mrz-band-detector.js.map +1 -1
  28. package/dist/cjs/mrz-check-digits.d.ts +74 -0
  29. package/dist/cjs/mrz-check-digits.d.ts.map +1 -0
  30. package/dist/cjs/mrz-check-digits.js +478 -0
  31. package/dist/cjs/mrz-check-digits.js.map +1 -0
  32. package/dist/cjs/mrz-policy.d.ts +18 -0
  33. package/dist/cjs/mrz-policy.d.ts.map +1 -0
  34. package/dist/cjs/mrz-policy.js +90 -0
  35. package/dist/cjs/mrz-policy.js.map +1 -0
  36. package/dist/cjs/quality-checks.d.ts +16 -0
  37. package/dist/cjs/quality-checks.d.ts.map +1 -1
  38. package/dist/cjs/quality-checks.js +72 -17
  39. package/dist/cjs/quality-checks.js.map +1 -1
  40. package/dist/cjs/types.d.ts +2 -2
  41. package/dist/cjs/types.js +2 -2
  42. package/dist/esm/capture-normalization.d.ts +21 -1
  43. package/dist/esm/capture-normalization.d.ts.map +1 -1
  44. package/dist/esm/capture-normalization.js +84 -13
  45. package/dist/esm/capture-normalization.js.map +1 -1
  46. package/dist/esm/document-classifier.d.ts.map +1 -1
  47. package/dist/esm/document-classifier.js +59 -2
  48. package/dist/esm/document-classifier.js.map +1 -1
  49. package/dist/esm/document-placement.d.ts +21 -0
  50. package/dist/esm/document-placement.d.ts.map +1 -0
  51. package/dist/esm/document-placement.js +62 -0
  52. package/dist/esm/document-placement.js.map +1 -0
  53. package/dist/esm/index.d.ts +12 -4
  54. package/dist/esm/index.d.ts.map +1 -1
  55. package/dist/esm/index.js +7 -3
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/issuing-country.d.ts +16 -0
  58. package/dist/esm/issuing-country.d.ts.map +1 -0
  59. package/dist/esm/issuing-country.js +71 -0
  60. package/dist/esm/issuing-country.js.map +1 -0
  61. package/dist/esm/kyc-mobile-contract.d.ts +13 -1
  62. package/dist/esm/kyc-mobile-contract.d.ts.map +1 -1
  63. package/dist/esm/kyc-mobile-contract.js +63 -5
  64. package/dist/esm/kyc-mobile-contract.js.map +1 -1
  65. package/dist/esm/mrz-band-detector.d.ts +12 -5
  66. package/dist/esm/mrz-band-detector.d.ts.map +1 -1
  67. package/dist/esm/mrz-band-detector.js +29 -14
  68. package/dist/esm/mrz-band-detector.js.map +1 -1
  69. package/dist/esm/mrz-check-digits.d.ts +74 -0
  70. package/dist/esm/mrz-check-digits.d.ts.map +1 -0
  71. package/dist/esm/mrz-check-digits.js +471 -0
  72. package/dist/esm/mrz-check-digits.js.map +1 -0
  73. package/dist/esm/mrz-policy.d.ts +18 -0
  74. package/dist/esm/mrz-policy.d.ts.map +1 -0
  75. package/dist/esm/mrz-policy.js +87 -0
  76. package/dist/esm/mrz-policy.js.map +1 -0
  77. package/dist/esm/quality-checks.d.ts +16 -0
  78. package/dist/esm/quality-checks.d.ts.map +1 -1
  79. package/dist/esm/quality-checks.js +71 -17
  80. package/dist/esm/quality-checks.js.map +1 -1
  81. package/dist/esm/types.d.ts +2 -2
  82. package/dist/esm/types.js +2 -2
  83. 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"}