diff --git a/src/index.ts b/src/index.ts index 6dc2019..b054f6d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,3 +5,4 @@ import states from './generated/states'; import parse from './parse/parse'; export { formats, states, parse }; +export * from './types'; diff --git a/src/parse/autoCorrection.ts b/src/parse/autoCorrection.ts index 6f32d97..094c24f 100644 --- a/src/parse/autoCorrection.ts +++ b/src/parse/autoCorrection.ts @@ -1,5 +1,7 @@ 'use strict'; +import { Autocorrect } from '../types'; + import { FieldOptions, fieldTypes } from './createFieldParser'; const numberToLetterMismatches = { @@ -18,12 +20,6 @@ const letterToNumberMismatches = { S: '5', Z: '2', }; -export interface Autocorrect { - line: number; - column: number; - original: string; - corrected: string; -} export function letterToNumber(char: string): string { if (letterToNumberMismatches[char]) { return letterToNumberMismatches[char]; diff --git a/src/parse/createFieldParser.ts b/src/parse/createFieldParser.ts index c441479..e3f608a 100644 --- a/src/parse/createFieldParser.ts +++ b/src/parse/createFieldParser.ts @@ -1,19 +1,8 @@ 'use strict'; -import { Autocorrect, autoCorrection } from './autoCorrection'; +import { Autocorrect, Details, FieldName, Range } from '../types'; -export interface Details { - label: string; - field: string | null; - value: string | null; - valid: boolean; - ranges: Range[]; - line: number; - start: number; - end: number; - error?: string; - autocorrect: Autocorrect[]; -} +import { autoCorrection } from './autoCorrection'; interface ParseResult { value: string; @@ -32,7 +21,7 @@ export const fieldTypes = { export interface FieldOptions { label: string; - field: string | null; + field: FieldName | null; line: number; start: number; end: number; @@ -40,11 +29,6 @@ export interface FieldOptions { related?: Range[]; type?: FieldTypes; } -interface Range { - line: number; - start: number; - end: number; -} export interface CreateFieldParserResult { parser: (lines: string[], autocorrect: Autocorrect[]) => Details; diff --git a/src/parse/fieldTemplates.ts b/src/parse/fieldTemplates.ts index c7567d3..f5b122e 100644 --- a/src/parse/fieldTemplates.ts +++ b/src/parse/fieldTemplates.ts @@ -10,104 +10,106 @@ import parseLastName from '../parsers/parseLastName'; import parseSex from '../parsers/parseSex'; import parseState from '../parsers/parseState'; -import { fieldTypes } from './createFieldParser'; +import { FieldOptions, fieldTypes } from './createFieldParser'; + +type FieldOptionTemplate = Partial; const documentNumberTemplate = { label: 'Document number', field: 'documentNumber', parser: parseDocumentNumber, type: fieldTypes.ALPHANUMERIC, -}; +} satisfies FieldOptionTemplate; const documentNumberCheckDigitTemplate = { label: 'Document number check digit', field: 'documentNumberCheckDigit', parser: parseDocumentNumberCheckDigit, type: fieldTypes.NUMERIC, -}; +} satisfies FieldOptionTemplate; const documentCodeTemplate = { label: 'Document code', field: 'documentCode', type: fieldTypes.ALPHABETIC, -}; +} satisfies FieldOptionTemplate; const nationalityTemplate = { label: 'Nationality', field: 'nationality', parser: parseState, type: fieldTypes.ALPHABETIC, -}; +} satisfies FieldOptionTemplate; const sexTemplate = { label: 'Sex', field: 'sex', parser: parseSex, type: fieldTypes.ALPHABETIC, -}; +} satisfies FieldOptionTemplate; const expirationDateTemplate = { label: 'Expiration date', field: 'expirationDate', parser: parseDate, type: fieldTypes.NUMERIC, -}; +} satisfies FieldOptionTemplate; const expirationDateCheckDigitTemplate = { label: 'Expiration date check digit', field: 'expirationDateCheckDigit', parser: parseDateCheckDigit, type: fieldTypes.NUMERIC, -}; +} satisfies FieldOptionTemplate; const compositeCheckDigitTemplate = { label: 'Composite check digit', field: 'compositeCheckDigit', parser: parseCompositeCheckDigit, type: fieldTypes.NUMERIC, -}; +} satisfies FieldOptionTemplate; const birthDateTemplate = { label: 'Birth date', field: 'birthDate', parser: parseDate, type: fieldTypes.NUMERIC, -}; +} satisfies FieldOptionTemplate; const birthDateCheckDigitTemplate = { label: 'Birth date check digit', field: 'birthDateCheckDigit', parser: parseDateCheckDigit, type: fieldTypes.NUMERIC, -}; +} satisfies FieldOptionTemplate; const issueDateTemplate = { label: 'Issue date', field: 'issueDate', parser: parseDate, type: fieldTypes.NUMERIC, -}; +} satisfies FieldOptionTemplate; const firstNameTemplate = { label: 'First name', field: 'firstName', parser: parseFirstName, type: fieldTypes.ALPHABETIC, -}; +} satisfies FieldOptionTemplate; const lastNameTemplate = { label: 'Last name', field: 'lastName', parser: parseLastName, type: fieldTypes.ALPHABETIC, -}; +} satisfies FieldOptionTemplate; const issuingStateTemplate = { label: 'Issuing state', field: 'issuingState', parser: parseState, type: fieldTypes.ALPHABETIC, -}; +} satisfies FieldOptionTemplate; export { documentNumberTemplate, diff --git a/src/parse/frenchNationalIdFields.ts b/src/parse/frenchNationalIdFields.ts index af41d47..f53665f 100644 --- a/src/parse/frenchNationalIdFields.ts +++ b/src/parse/frenchNationalIdFields.ts @@ -4,22 +4,22 @@ import { parseAlpha } from '../parsers/parseAlpha'; import parseDocumentCode from '../parsers/parseDocumentCodeId'; import { parseOptional } from '../parsers/parseOptional'; -import createFieldParser from './createFieldParser'; +import createFieldParser, { FieldOptions } from './createFieldParser'; import { + birthDateCheckDigitTemplate, + birthDateTemplate, + compositeCheckDigitTemplate, documentCodeTemplate, + documentNumberCheckDigitTemplate, + documentNumberTemplate, + firstNameTemplate, + issueDateTemplate, issuingStateTemplate, lastNameTemplate, - issueDateTemplate, - firstNameTemplate, - documentNumberTemplate, - documentNumberCheckDigitTemplate, - birthDateTemplate, - birthDateCheckDigitTemplate, sexTemplate, - compositeCheckDigitTemplate, } from './fieldTemplates'; -export default [ +const fields: FieldOptions[] = [ { ...documentCodeTemplate, line: 0, @@ -94,4 +94,5 @@ export default [ }, ], }, -].map(createFieldParser); +]; +export default fields.map(createFieldParser); diff --git a/src/parse/getResult.ts b/src/parse/getResult.ts index b1d97bd..9a9a1d2 100644 --- a/src/parse/getResult.ts +++ b/src/parse/getResult.ts @@ -1,9 +1,9 @@ 'use strict'; import { FormatType } from '../formats'; +import { Autocorrect, Details, FieldRecords, ParseResult } from '../types'; -import { Autocorrect } from './autoCorrection'; -import { Details, CreateFieldParserResult } from './createFieldParser'; +import { CreateFieldParserResult } from './createFieldParser'; import { ParseMRZOptions } from './parse'; function getDetails( @@ -19,7 +19,7 @@ function getDetails( } function getFields(details: Details[]) { - const fields: Record = {}; + const fields: FieldRecords = {}; let valid = true; for (const detail of details) { if (!detail.valid) valid = false; @@ -57,7 +57,7 @@ export function getResult( lines: string[], fieldParsers: CreateFieldParserResult[], options: ParseMRZOptions, -) { +): ParseResult { const { autocorrect = false } = options; const { corrected, autocorrectArray } = getCorrection( diff --git a/src/parse/swissDrivingLicenseFields.ts b/src/parse/swissDrivingLicenseFields.ts index 96a3e3b..3b15f96 100644 --- a/src/parse/swissDrivingLicenseFields.ts +++ b/src/parse/swissDrivingLicenseFields.ts @@ -7,17 +7,20 @@ import parseDocumentNumber from '../parsers/swissDrivingLicense/parseDocumentNum import parseIssuingState from '../parsers/swissDrivingLicense/parseIssuingState'; import parseLanguageCode from '../parsers/swissDrivingLicense/parseLanguageCode'; -import createFieldParser, { fieldTypes } from './createFieldParser'; +import createFieldParser, { + FieldOptions, + fieldTypes, +} from './createFieldParser'; import { - documentNumberTemplate, + birthDateTemplate, documentCodeTemplate, + documentNumberTemplate, + firstNameTemplate, issuingStateTemplate, - birthDateTemplate, lastNameTemplate, - firstNameTemplate, } from './fieldTemplates'; -export default [ +const fields: FieldOptions[] = [ { ...documentNumberTemplate, line: 0, @@ -85,4 +88,5 @@ export default [ }, { ...lastNameTemplate, line: 2, start: 0, end: 30 }, { ...firstNameTemplate, line: 2, start: 0, end: 30 }, -].map(createFieldParser); +]; +export default fields.map(createFieldParser); diff --git a/src/parse/td1Fields.ts b/src/parse/td1Fields.ts index 4ba15e1..e9db398 100644 --- a/src/parse/td1Fields.ts +++ b/src/parse/td1Fields.ts @@ -4,24 +4,24 @@ import parseDocumentCode from '../parsers/parseDocumentCodeId'; import { parseDocumentNumberOptional } from '../parsers/parseDocumentNumberOptional'; import { parseOptional } from '../parsers/parseOptional'; -import createFieldParser from './createFieldParser'; +import createFieldParser, { FieldOptions } from './createFieldParser'; import { + birthDateCheckDigitTemplate, + birthDateTemplate, + compositeCheckDigitTemplate, documentCodeTemplate, - issuingStateTemplate, - documentNumberTemplate, documentNumberCheckDigitTemplate, - birthDateTemplate, - birthDateCheckDigitTemplate, - sexTemplate, - expirationDateTemplate, + documentNumberTemplate, expirationDateCheckDigitTemplate, - nationalityTemplate, - compositeCheckDigitTemplate, - lastNameTemplate, + expirationDateTemplate, firstNameTemplate, + issuingStateTemplate, + lastNameTemplate, + nationalityTemplate, + sexTemplate, } from './fieldTemplates'; -export default [ +const fields: FieldOptions[] = [ { ...documentCodeTemplate, line: 0, @@ -154,4 +154,6 @@ export default [ }, { ...lastNameTemplate, line: 2, start: 0, end: 30 }, { ...firstNameTemplate, line: 2, start: 0, end: 30 }, -].map(createFieldParser); +]; + +export default fields.map(createFieldParser); diff --git a/src/parse/td2Fields.ts b/src/parse/td2Fields.ts index d4006a3..ded3f19 100644 --- a/src/parse/td2Fields.ts +++ b/src/parse/td2Fields.ts @@ -3,24 +3,24 @@ import parseDocumentCode from '../parsers/parseDocumentCodeId'; import { parseOptional } from '../parsers/parseOptional'; -import createFieldParser from './createFieldParser'; +import createFieldParser, { FieldOptions } from './createFieldParser'; import { + birthDateCheckDigitTemplate, + birthDateTemplate, + compositeCheckDigitTemplate, documentCodeTemplate, - issuingStateTemplate, + documentNumberCheckDigitTemplate, + documentNumberTemplate, + expirationDateCheckDigitTemplate, + expirationDateTemplate, firstNameTemplate, + issuingStateTemplate, lastNameTemplate, - documentNumberTemplate, - documentNumberCheckDigitTemplate, nationalityTemplate, - birthDateTemplate, - birthDateCheckDigitTemplate, sexTemplate, - expirationDateTemplate, - expirationDateCheckDigitTemplate, - compositeCheckDigitTemplate, } from './fieldTemplates'; -export default [ +const fields: FieldOptions[] = [ { ...documentCodeTemplate, line: 0, @@ -128,4 +128,6 @@ export default [ }, ], }, -].map(createFieldParser); +]; + +export default fields.map(createFieldParser); diff --git a/src/parse/td3Fields.ts b/src/parse/td3Fields.ts index ae35cef..faf7334 100644 --- a/src/parse/td3Fields.ts +++ b/src/parse/td3Fields.ts @@ -4,24 +4,24 @@ import parseDocumentCode from '../parsers/parseDocumentCodePassport'; import { parsePersonalNumber } from '../parsers/parsePersonalNumber'; import { parsePersonalNumberCheckDigit } from '../parsers/parsePersonalNumberCheckDigit'; -import createFieldParser from './createFieldParser'; +import createFieldParser, { FieldOptions } from './createFieldParser'; import { + birthDateCheckDigitTemplate, + birthDateTemplate, + compositeCheckDigitTemplate, documentCodeTemplate, + documentNumberCheckDigitTemplate, + documentNumberTemplate, + expirationDateCheckDigitTemplate, + expirationDateTemplate, + firstNameTemplate, issuingStateTemplate, lastNameTemplate, - firstNameTemplate, - documentNumberTemplate, - documentNumberCheckDigitTemplate, nationalityTemplate, - birthDateTemplate, - birthDateCheckDigitTemplate, sexTemplate, - expirationDateTemplate, - expirationDateCheckDigitTemplate, - compositeCheckDigitTemplate, } from './fieldTemplates'; -export default [ +const fields: FieldOptions[] = [ { ...documentCodeTemplate, line: 0, @@ -122,4 +122,6 @@ export default [ }, ], }, -].map(createFieldParser); +]; + +export default fields.map(createFieldParser); diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..e71e43a --- /dev/null +++ b/src/types.ts @@ -0,0 +1,69 @@ +'use strict'; + +export interface Autocorrect { + line: number; + column: number; + original: string; + corrected: string; +} + +export interface Details { + label: string; + field: FieldName | null; + value: string | null; + valid: boolean; + ranges: Range[]; + line: number; + start: number; + end: number; + error?: string; + autocorrect: Autocorrect[]; +} + +export interface Range { + line: number; + start: number; + end: number; +} + +export interface ParseResult { + valid: boolean; + format: MRZFormat; + details: Details[]; + fields: FieldRecords; +} + +export type FieldRecords = Partial>; + +export type FieldName = + | 'administrativeCode' + | 'administrativeCode2' + | 'birthDate' + | 'birthDateCheckDigit' + | 'compositeCheckDigit' + | 'documentNumber' + | 'documentNumberCheckDigit' + | 'documentCode' + | 'expirationDate' + | 'expirationDateCheckDigit' + | 'firstName' + | 'issueDate' + | 'issuingState' + | 'languageCode' + | 'lastName' + | 'nationality' + | 'optional' + | 'optional1' + | 'optional2' + | 'personalNumber' + | 'personalNumberCheckDigit' + | 'pinCode' + | 'sex' + | 'versionNumber'; + +export type MRZFormat = + | 'TD1' + | 'TD3' + | 'TD2' + | 'FRENCH_NATIONAL_ID' + | 'SWISS_DRIVING_LICENSE';