@universe/address-parser

Universe address parser.

Usage no npm install needed!

<script type="module">
  import universeAddressParser from 'https://cdn.skypack.dev/@universe/address-parser';
</script>

README

Address Parser

Parse dirty United States postal addresses in to a standard address model.

This repo includes a suite of unit tests for:

  • Residential Addresses
  • Fractional Addresses
  • Grid Addresses
  • Range Addresses
  • Military Addresses
  • PO Boxes
  • Rural Routes
  • Spanish Road Identifiers
  • Care-Of Lines
  • Facility Lines
  • Personal ID Lines
  • International Addresses

Also included in the test suite (but disabled by default) is the USPS CASS1 certification test fixtures data set. Because the CASS certification process expects parsers to spell check street names, correct street and unit identifiers, etc, this parser does not pass the entire suite. However, even without advanced correction features this little address parser does clear over 50% of the 150,000 fixtures!

Data Model

This package is fully typed by Typescript. Enum values can be found in the type definitions. A parsed address will take the form:

interface ISitus {
  care: String
  facility: String
  facilityType: FacilityType

  pinType: PersonalIdentifier
  pinNum: String
  unitAbbr: UnitAbbr
  unitNum: String

  number: String

  streetPreDir: Directional
  streetName: String
  streetType: StreetType
  streetPostDir: Directional

  city: String
  state: State
  zip: String
  zip4: String

  country: Country
}

International addresses are handled by placing the entire address in to the care property – with newlines preserved – and specifying the destination country in the country proeprty.

API

This package exposes a number of convenience methods to convert Enum values to and from plain text, and for type checking input tokens. However, the primary interfaces are:

parse(...lines: string[]): Promise<ISitus>

Parse takes one to many address lines and returns a situs object. Line breaks are used as hints for the address parser to differentiate between and care-of, facility, personal identifier, street, city/state/zip lines in an input address. You can designate a line break by passing multiple arguments to the parse() function, or by including newlines, or tabs, or commas in the input string. For example, all of the following produce the same ISitus object:

parse('Box 1142', '700 Commonwealth Avenue', 'Boston MA 02215');
parse('Box 1142, 700 Commonwealth Avenue, Boston MA 02215');
parse('Box 1142\n700 Commonwealth Avenue\nBoston MA 02215');
parse('Box 1142 700 Commonwealth Avenue Boston MA 02215');

The Address class

The Address class contain convenience methods to export a given parsed address in a number of formats.

Address.constructor(...lines: string[] | ISitus)

The Address constructor can accept the same input as parse(), or a pre-parsed ISitus interface.

public Address.label(): USPSLabel

The Address.label() method returns an object with USPS designated fields label in the following format:

interface USPSLabel {
  care: string | null;
  urbanization: string | null;
  line1: string | null;
  line2: string | null;
  city: string | null;
  state: State | null;
  zip: string | null;
  zip4: string | null;
  country: string | null;
}

public Address.lines(): [string | null, string | null, string | null, string | null]

The Address.lines() method returns four lines that can be printed on an address label in the USPS preferred format. Ex:

const addr = new Address('P.O Box 123-ABC', 'Loon Lake WA, 99148')
console.log(addr.lines())
// Logs: [ 'PO BOX 123ABC', 'LOON LAKE WA  99148', null, null ],

public Address.print(): string

The Address.print() prints the standard USPS four line label as a single string with newlines. Ex:

const addr = new Address('P.O Box 123-ABC', 'Loon Lake WA, 99148')
console.log(addr.lines())
// Logs:
// PO BOX 123ABC
// LOON LAKE WA  99148

static Address.label(situs?: ISitus | null): USPSLabel

A functional version of the Address.label method above. Pass it a situs and it will output a USPSLabel object.

static Address.lines(situs?: ISitus | null): [string | null, string | null, string | null, string | null]

A functional version of the Address.lines method above. Pass it a situs and it will output an array of printable address lines.

static Address.print(situs?: ISitus | null): string

A functional version of the Address.print method above. Pass it a situs and it will output a multi-line string of the USPS formatted address.