UNPKG

@sroussey/parse-address

Version:
142 lines 5.68 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AddressParserUS = void 0; const xregexp_1 = __importDefault(require("xregexp")); const utils_1 = require("../../utils"); const normalize_1 = require("./normalize"); const street_abbrevs_1 = require("./street-abbrevs"); const ruleset_1 = __importDefault(require("./ruleset")); class AddressParserUS { normalizeAddress(parts) { const self = this; if (!parts) return null; const parsed = {}; Object.keys(parts).forEach((part) => { if (["input", "index"].includes(part) || (0, utils_1.isNumeric)(part)) { return; } const key = (0, utils_1.isNumeric)(part.split("_").pop()) ? part.split("_").slice(0, -1).join("_") : part; if (parts[part]) { parsed[key] = parts[part].trim().replace(/^\s+|\s+$|[^\w\s\-#&]/g, ""); } }); (0, utils_1.each)(normalize_1.normalizeMap, function (map, key) { if (parsed[key] && map[parsed[key].toLowerCase()]) { parsed[key] = map[parsed[key].toLowerCase()]; } }); ["type", "type1", "type2"].forEach(function (key) { if (key in parsed) { // Map the address short code const lowerCaseType = parsed[key].toLowerCase(); parsed[`short_street_${key}`] = self.findStreetTypeShortCode(lowerCaseType); parsed[key] = parsed[key].charAt(0).toUpperCase() + parsed[key].slice(1).toLowerCase(); } }); if (parsed.city) { const directionCode = ruleset_1.default.directionCode; parsed.city = xregexp_1.default.replace(parsed.city, (0, xregexp_1.default)(`^(?<dircode>${ruleset_1.default.dircode})\\s+(?=\\S)`, "ix"), function (match) { return (0, utils_1.capitalize)(directionCode[match.dircode.toUpperCase()]) + " "; }); } switch (parts.number) { case "One": parsed.number = "1"; break; case "Two": parsed.number = "2"; break; case "Three": parsed.number = "3"; break; case "Four": parsed.number = "4"; break; case "Five": parsed.number = "5"; break; case "Six": parsed.number = "6"; break; case "Seven": parsed.number = "7"; break; case "Eight": parsed.number = "8"; break; case "Nine": parsed.number = "9"; break; } parsed.country = "US"; return parsed; } parseStreet(street_address) { const parts = xregexp_1.default.exec(street_address, ruleset_1.default.street_address); return this.normalizeAddress(parts); } parseAddress(address) { const parts = xregexp_1.default.exec(address, ruleset_1.default.address); return this.normalizeAddress(parts); } parseInformalAddress(address) { const parts = xregexp_1.default.exec(address, ruleset_1.default.informal_address); return this.normalizeAddress(parts); } parsePoAddress(address) { const parts = xregexp_1.default.exec(address, ruleset_1.default.po_address); return this.normalizeAddress(parts); } parseLocation(address) { if ((0, xregexp_1.default)(ruleset_1.default.corner, "xi").test(address)) { return this.parseIntersection(address); } if ((0, xregexp_1.default)("^" + ruleset_1.default.po_box, "xi").test(address)) { return this.parsePoAddress(address); } return this.parseAddress(address) || this.parseInformalAddress(address); } parseIntersection(address) { let parts = xregexp_1.default.exec(address, ruleset_1.default.intersection); // @ts-ignore parts = this.normalizeAddress(parts); if (parts) { parts.type2 = parts.type2 || ""; parts.type1 = parts.type1 || ""; if ((parts.type2 && !parts.type1) || parts.type1 === parts.type2) { let type = parts.type2; const short_street_type = parts.short_street_type2; type = xregexp_1.default.replace(type, /s\W*$/, ""); if ((0, xregexp_1.default)(`^${ruleset_1.default.type}$`, "ix").test(type)) { parts.type1 = parts.type2 = type; parts.short_street_type1 = parts.short_street_type2 = short_street_type; } } } return parts; } findStreetTypeShortCode(streetType) { const blankShortCode = "BL"; if (!streetType) { return blankShortCode; } const matchedEntry = Object.entries(street_abbrevs_1.streetAbbrevsToShortCodeMap).find(([_, streetTypeString]) => { // Check against singular and plural versions return (streetTypeString === streetType || `${streetTypeString}s` === streetType); }); return matchedEntry ? matchedEntry[0] : blankShortCode; } } exports.AddressParserUS = AddressParserUS; //# sourceMappingURL=parser.js.map