@sroussey/parse-address
Version:
US Street Address Parser
142 lines • 5.68 kB
JavaScript
;
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