aamva-parser
Version:
Plugin to parse AAMVA Drivers License Data from the PDF417 barcode
111 lines (110 loc) • 5.48 kB
JavaScript
import { Regex } from "../utils/regex";
import { FieldParser } from "../mappers/fieldParser";
import { VersionOneFieldParser } from "../mappers/v1/versionOneFieldParser";
import { VersionTwoFieldParser } from "../mappers/v2/versionTwoFieldParser";
import { VersionThreeFieldParser } from "../mappers/v3/versionThreeFieldParser";
import { VersionFourFieldParser } from "../mappers/v4/versionFourFieldParser";
import { VersionFiveFieldParser } from "../mappers/v5/versionFiveFieldParser";
import { VersionSixFieldParser } from "../mappers/v6/versionSixFieldParser";
import { VersionSevenFieldParser } from "../mappers/v7/versionSevenFieldParser";
import { VersionEightFieldParser } from "../mappers/v8/versionEightFieldParser";
import { VersionNineFieldParser } from "../mappers/v9/versionNineFieldParser";
import { VersionTenFieldParser } from "../mappers/v10/versionTenFieldParser";
import { License } from "../models/license";
export class LicenseParser {
constructor(data) {
this.regex = new Regex();
this.data = this.cleanAndFormatString(data);
this.fieldParser = new FieldParser(data);
}
cleanAndFormatString(data) {
// Remove non-printable characters
data = data.replace(/\u001e/g, '').replace(/\r/g, '');
// Split the string into lines
const lines = data.split('\n');
console.warn('After splitting into lines: ', lines);
// Remove any empty lines and trim whitespace
const cleanedLines = lines.map(line => line.trim()).filter(line => line.length > 0);
// Join the lines back together with newline characters
data = cleanedLines.join('\n');
// Add leading '@' if not already present
if (!data.startsWith('@')) {
data = '@\n' + data;
}
return data;
}
parse() {
this.fieldParser = this.versionBasedFieldParsing(this.parseVersion());
const licenseData = {
firstName: this.fieldParser.parseFirstName(),
lastName: this.fieldParser.parseLastName(),
middleName: this.fieldParser.parseMiddleName(),
expirationDate: this.fieldParser.parseExpirationDate(),
issueDate: this.fieldParser.parseIssueDate(),
dateOfBirth: this.fieldParser.parseDateOfBirth(),
gender: this.fieldParser.parseGender(),
eyeColor: this.fieldParser.parseEyeColor(),
height: this.fieldParser.parseHeight(),
streetAddress: this.fieldParser.parseString("streetAddress"),
city: this.fieldParser.parseString("city"),
state: this.fieldParser.parseString("state"),
postalCode: this.fieldParser.parseString("postalCode"),
driversLicenseId: this.fieldParser.parseString("driversLicenseId"),
documentId: this.fieldParser.parseString("documentId"),
country: this.fieldParser.parseCountry(),
middleNameTruncation: this.fieldParser.parseTruncationStatus("middleNameTruncation"),
firstNameTruncation: this.fieldParser.parseTruncationStatus("firstNameTruncation"),
lastNameTruncation: this.fieldParser.parseTruncationStatus("lastNameTruncation"),
streetAddressSupplement: this.fieldParser.parseString("streetAddressSupplement"),
hairColor: this.fieldParser.parseHairColor(),
placeOfBirth: this.fieldParser.parseString("placeOfBirth"),
auditInformation: this.fieldParser.parseString("auditInformation"),
inventoryControlNumber: this.fieldParser.parseString("inventoryControlNumber"),
lastNameAlias: this.fieldParser.parseString("lastNameAlias"),
firstNameAlias: this.fieldParser.parseString("firstNameAlias"),
suffixAlias: this.fieldParser.parseString("suffixAlias"),
suffix: this.fieldParser.parseNameSuffix(),
version: this.parseVersion(),
pdf417: this.data,
expired: this.fieldParser.parseIsExpired(),
weight: this.fieldParser.parseString("weight"),
};
return new License(licenseData);
}
parseVersion() {
return this.regex.firstMatch("\\d{6}(\\d{2})\\w+", this.data);
}
versionBasedFieldParsing(version) {
const defaultParser = new FieldParser(this.data);
if (!version)
return defaultParser;
switch (version) {
case "01":
return new VersionOneFieldParser(this.data);
case "02":
return new VersionTwoFieldParser(this.data);
case "03":
return new VersionThreeFieldParser(this.data);
case "04":
return new VersionFourFieldParser(this.data);
case "05":
return new VersionFiveFieldParser(this.data);
case "06":
return new VersionSixFieldParser(this.data);
case "07":
return new VersionSevenFieldParser(this.data);
case "08":
return new VersionEightFieldParser(this.data);
case "09":
return new VersionNineFieldParser(this.data);
case "10":
return new VersionTenFieldParser(this.data);
default:
return defaultParser;
}
}
isExpired() {
return (this.fieldParser.parseExpirationDate() !== null &&
new Date() > this.fieldParser.parseExpirationDate());
}
}