@mailwoman/corpus 9.3.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/lib/adapters/geonames/adapter.ts +3 -3
- package/lib/adapters/geonames/postal/adapter.ts +122 -0
- package/lib/adapters/index.ts +39 -32
- package/lib/adapters/openaddresses/adapter.ts +4 -7
- package/lib/adapters/osm/adapter.ts +278 -0
- package/lib/adapters/overture/adapter.ts +22 -7
- package/lib/adapters/utils/index.ts +1 -1
- package/lib/adapters/wof/admin/json/adapter.ts +239 -0
- package/lib/adapters/wof/json-rows.ts +181 -0
- package/lib/adapters/wof/postalcode-json/adapter.ts +196 -0
- package/lib/au/adapters/gnaf/adapter.ts +152 -0
- package/lib/au/adapters/gnaf/assemble.ts +225 -0
- package/lib/cz/recipes/pcfirst-preposition.ts +112 -0
- package/lib/de/recipes/locale.ts +360 -0
- package/lib/fr/adapters/ban/adapter.ts +159 -0
- package/lib/fr/recipes/admin-split.ts +243 -0
- package/lib/fr/recipes/bare-street.ts +171 -0
- package/lib/fr/recipes/fragment.ts +334 -0
- package/lib/fr/recipes/lieudit.ts +274 -0
- package/lib/fr/recipes/order.ts +246 -0
- package/lib/fr/tools/fetch/ban.ts +289 -0
- package/lib/index.ts +1 -1
- package/lib/international/recipes/locale.ts +598 -0
- package/lib/jp/tools/fetch/houjin.ts +141 -0
- package/lib/kr/adapters/juso/label-rows.ts +259 -0
- package/lib/kr/adapters/localdata/align.ts +299 -0
- package/lib/kr/adapters/localdata/key-index.ts +185 -0
- package/lib/kr/adapters/localdata/permit-rows.ts +186 -0
- package/lib/kr/tools/fetch/juso.ts +172 -0
- package/lib/kr/tools/fetch/localdata.ts +206 -0
- package/lib/nl/recipes/postcode.ts +117 -0
- package/lib/no/recipes/fragment.ts +213 -0
- package/lib/no/recipes/street/index.ts +91 -0
- package/lib/no/recipes/street/led.ts +135 -0
- package/lib/recipes/anchor-absorption.ts +2 -2
- package/lib/recipes/bare/country.ts +95 -0
- package/lib/recipes/bare/postcode/eval.ts +99 -0
- package/lib/recipes/bare/postcode/index.ts +327 -0
- package/lib/recipes/boundary-stress.ts +3 -1
- package/lib/recipes/country-balanced.ts +3 -2
- package/lib/recipes/house-venue.ts +2 -1
- package/lib/recipes/index.ts +28 -21
- package/lib/recipes/intersection.ts +3 -2
- package/lib/recipes/po/box/cedex/au-nz.ts +82 -0
- package/lib/recipes/po/box/cedex/ca.ts +58 -0
- package/lib/recipes/po/box/cedex/fr.ts +76 -0
- package/lib/recipes/po/box/cedex/phrases.ts +108 -0
- package/lib/recipes/po/box/cedex/recipe.ts +203 -0
- package/lib/recipes/po/box/cedex/sources.ts +189 -0
- package/lib/recipes/po/box/cedex/types.ts +35 -0
- package/lib/recipes/po/box/cedex/us.ts +69 -0
- package/lib/recipes/po/box/cedex/vocabulary.ts +106 -0
- package/lib/recipes/po/box/cedex.ts +9 -0
- package/lib/recipes/po/box/index.ts +128 -0
- package/lib/recipes/scaffold.ts +18 -42
- package/lib/recipes/street/affix.ts +807 -0
- package/lib/recipes/street/bare.ts +102 -0
- package/lib/recipes/street.ts +3 -1
- package/lib/recipes/sub/venue/context.ts +149 -0
- package/lib/recipes/sub/venue/index.ts +997 -0
- package/lib/recipes/sub/venue/sources.ts +739 -0
- package/lib/recipes/trailing-region.ts +9 -9
- package/lib/recipes/unit.ts +3 -3
- package/lib/sg/recipes/register.ts +270 -0
- package/lib/sg/tools/fetch/acra.ts +179 -0
- package/lib/si/recipes/bare-village.ts +99 -0
- package/lib/south-asia/recipes/register.ts +214 -0
- package/lib/synthesizers/anchor-absorption.ts +1 -1
- package/lib/synthesizers/locale.ts +261 -0
- package/lib/synthesizers/street.ts +1 -1
- package/lib/synthesizers/utils.ts +2 -2
- package/lib/tools/audit.ts +3 -2
- package/lib/tools/corpus-stats.ts +3 -3
- package/lib/tools/fetch/download/index.ts +10 -0
- package/lib/tools/fetch/download/manifest.ts +102 -0
- package/lib/tools/fetch/download/network.ts +226 -0
- package/lib/tools/fetch/download/retry.ts +173 -0
- package/lib/tools/fetch/geonames/dump.ts +257 -0
- package/lib/tools/fetch/geonames/postal.ts +180 -0
- package/lib/tools/fetch/index.ts +47 -20
- package/lib/tools/fetch/openaddresses.ts +2 -2
- package/lib/tools/fetch/ourairports.ts +2 -2
- package/lib/tools/fetch/ppd.ts +1 -3
- package/lib/tools/fetch/wikidata-subvenue.ts +2 -2
- package/lib/tools/golden/promote.ts +340 -0
- package/lib/tools/golden/relabel-street/directory.ts +340 -0
- package/lib/tools/golden/relabel-street/index.ts +9 -0
- package/lib/tools/golden/relabel-street/row.ts +361 -0
- package/lib/tools/index.ts +10 -10
- package/lib/tools/ingest-csv.ts +5 -7
- package/lib/tools/lint/slice/vocab.ts +376 -0
- package/lib/tools/overlay-manifest.ts +92 -25
- package/lib/tools/overture-subvenue.ts +1 -1
- package/lib/tools/postcode-triples.ts +138 -14
- package/lib/tools/sub/venue/harvest.ts +234 -0
- package/lib/tools/sub/venue/head-nouns.ts +245 -0
- package/lib/tools/sub/venue/lexicon.ts +429 -0
- package/lib/tools/sub/venue/surfaces.ts +95 -0
- package/lib/tools/sub/venue/table.ts +281 -0
- package/lib/tools/sub/venue/wikidata.ts +85 -0
- package/lib/tw/tools/fetch/gcis.ts +180 -0
- package/lib/types.ts +1 -1
- package/lib/us/adapters/fcc-bdc/adapter.ts +173 -0
- package/lib/us/adapters/state/hi-schools/adapter.ts +160 -0
- package/lib/us/adapters/state/ia-contractors/adapter.ts +136 -0
- package/lib/us/adapters/state/ny-notaries/adapter.ts +133 -0
- package/lib/us/adapters/state/tx-notaries/adapter.ts +149 -0
- package/lib/us/adapters/tiger/adapter.ts +250 -0
- package/lib/us/adapters/usgov/hrsa-fqhc/adapter.ts +156 -0
- package/lib/us/adapters/usgov/imls-pls/adapter.ts +134 -0
- package/lib/us/adapters/usgov/irs-bmf/adapter.ts +145 -0
- package/lib/us/adapters/usgov/nad/adapter.ts +324 -0
- package/lib/us/adapters/usgov/nppes/adapter.ts +143 -0
- package/lib/us/adapters/usgov/samhsa-treatment-locator/adapter.ts +182 -0
- package/lib/us/tools/fetch/hrsa.ts +59 -0
- package/lib/us/tools/fetch/imls-pls.ts +149 -0
- package/lib/us/tools/fetch/nad.ts +341 -0
- package/lib/us/tools/fetch/nppes.ts +165 -0
- package/lib/us/tools/fetch/state/hi-schools.ts +161 -0
- package/lib/us/tools/fetch/state/sources.ts +146 -0
- package/lib/us/tools/fetch/tiger-full.ts +308 -0
- package/lib/utils/align.ts +1 -1
- package/lib/utils/golden.ts +12 -8
- package/lib/utils/wof-json.ts +7 -13
- package/out/adapters/geonames/adapter.d.ts +1 -1
- package/out/adapters/geonames/adapter.js +3 -3
- package/out/adapters/geonames/adapter.js.map +1 -1
- package/out/adapters/geonames/postal/adapter.d.ts.map +1 -0
- package/out/adapters/geonames/postal/adapter.js +107 -0
- package/out/adapters/geonames/postal/adapter.js.map +1 -0
- package/out/adapters/index.d.ts +16 -16
- package/out/adapters/index.d.ts.map +1 -1
- package/out/adapters/index.js +34 -32
- package/out/adapters/index.js.map +1 -1
- package/out/adapters/openaddresses/adapter.d.ts.map +1 -1
- package/out/adapters/openaddresses/adapter.js +4 -6
- package/out/adapters/openaddresses/adapter.js.map +1 -1
- package/out/adapters/osm/adapter.d.ts +95 -0
- package/out/adapters/osm/adapter.d.ts.map +1 -0
- package/out/adapters/osm/adapter.js +211 -0
- package/out/adapters/osm/adapter.js.map +1 -0
- package/out/adapters/overture/adapter.d.ts +10 -0
- package/out/adapters/overture/adapter.d.ts.map +1 -1
- package/out/adapters/overture/adapter.js +20 -7
- package/out/adapters/overture/adapter.js.map +1 -1
- package/out/adapters/synth-po-box/adapter.js.map +1 -1
- package/out/adapters/utils/index.d.ts +1 -1
- package/out/adapters/utils/index.d.ts.map +1 -1
- package/out/adapters/utils/index.js.map +1 -1
- package/out/adapters/wof/admin/json/adapter.d.ts +79 -0
- package/out/adapters/wof/admin/json/adapter.d.ts.map +1 -0
- package/out/adapters/wof/admin/json/adapter.js +204 -0
- package/out/adapters/wof/admin/json/adapter.js.map +1 -0
- package/out/adapters/wof/json-rows.d.ts +73 -0
- package/out/adapters/wof/json-rows.d.ts.map +1 -0
- package/out/adapters/wof/json-rows.js +115 -0
- package/out/adapters/wof/json-rows.js.map +1 -0
- package/out/adapters/wof/postalcode-json/adapter.d.ts +65 -0
- package/out/adapters/wof/postalcode-json/adapter.d.ts.map +1 -0
- package/out/adapters/wof/postalcode-json/adapter.js +167 -0
- package/out/adapters/wof/postalcode-json/adapter.js.map +1 -0
- package/out/au/adapters/gnaf/adapter.d.ts.map +1 -0
- package/out/au/adapters/gnaf/adapter.js +127 -0
- package/out/au/adapters/gnaf/adapter.js.map +1 -0
- package/out/au/adapters/gnaf/assemble.d.ts +65 -0
- package/out/au/adapters/gnaf/assemble.d.ts.map +1 -0
- package/out/au/adapters/gnaf/assemble.js +154 -0
- package/out/au/adapters/gnaf/assemble.js.map +1 -0
- package/out/cn/recipes/organizational-units.d.ts +36 -0
- package/out/cn/recipes/organizational-units.d.ts.map +1 -0
- package/out/cn/recipes/organizational-units.js +159 -0
- package/out/cn/recipes/organizational-units.js.map +1 -0
- package/out/cz/recipes/pcfirst-preposition.d.ts +22 -0
- package/out/cz/recipes/pcfirst-preposition.d.ts.map +1 -0
- package/out/cz/recipes/pcfirst-preposition.js +101 -0
- package/out/cz/recipes/pcfirst-preposition.js.map +1 -0
- package/out/de/recipes/locale.d.ts +44 -0
- package/out/de/recipes/locale.d.ts.map +1 -0
- package/out/de/recipes/locale.js +289 -0
- package/out/de/recipes/locale.js.map +1 -0
- package/out/env.d.ts +1 -1
- package/out/fr/adapters/ban/adapter.d.ts.map +1 -0
- package/out/fr/adapters/ban/adapter.js +123 -0
- package/out/fr/adapters/ban/adapter.js.map +1 -0
- package/out/fr/adapters/ban/street-decompose.d.ts.map +1 -0
- package/out/fr/adapters/ban/street-decompose.js.map +1 -0
- package/out/fr/recipes/admin-split.d.ts +38 -0
- package/out/fr/recipes/admin-split.d.ts.map +1 -0
- package/out/fr/recipes/admin-split.js +192 -0
- package/out/fr/recipes/admin-split.js.map +1 -0
- package/out/fr/recipes/bare-street.d.ts +28 -0
- package/out/fr/recipes/bare-street.d.ts.map +1 -0
- package/out/fr/recipes/bare-street.js +144 -0
- package/out/fr/recipes/bare-street.js.map +1 -0
- package/out/fr/recipes/fragment.d.ts +77 -0
- package/out/fr/recipes/fragment.d.ts.map +1 -0
- package/out/fr/recipes/fragment.js +277 -0
- package/out/fr/recipes/fragment.js.map +1 -0
- package/out/fr/recipes/lieudit.d.ts +32 -0
- package/out/fr/recipes/lieudit.d.ts.map +1 -0
- package/out/fr/recipes/lieudit.js +211 -0
- package/out/fr/recipes/lieudit.js.map +1 -0
- package/out/fr/recipes/order.d.ts +38 -0
- package/out/fr/recipes/order.d.ts.map +1 -0
- package/out/fr/recipes/order.js +198 -0
- package/out/fr/recipes/order.js.map +1 -0
- package/out/fr/tools/fetch/ban.d.ts +31 -0
- package/out/fr/tools/fetch/ban.d.ts.map +1 -0
- package/out/fr/tools/fetch/ban.js +239 -0
- package/out/fr/tools/fetch/ban.js.map +1 -0
- package/out/index.d.ts +1 -1
- package/out/index.d.ts.map +1 -1
- package/out/index.js +1 -1
- package/out/index.js.map +1 -1
- package/out/international/recipes/locale.d.ts +136 -0
- package/out/international/recipes/locale.d.ts.map +1 -0
- package/out/international/recipes/locale.js +458 -0
- package/out/international/recipes/locale.js.map +1 -0
- package/out/jp/adapters/wof-admin/adapter.d.ts.map +1 -0
- package/out/jp/adapters/wof-admin/adapter.js.map +1 -0
- package/out/jp/tools/fetch/houjin.d.ts +24 -0
- package/out/jp/tools/fetch/houjin.d.ts.map +1 -0
- package/out/jp/tools/fetch/houjin.js +102 -0
- package/out/jp/tools/fetch/houjin.js.map +1 -0
- package/out/kr/adapters/juso/label-rows.d.ts +76 -0
- package/out/kr/adapters/juso/label-rows.d.ts.map +1 -0
- package/out/kr/adapters/juso/label-rows.js +194 -0
- package/out/kr/adapters/juso/label-rows.js.map +1 -0
- package/out/kr/adapters/localdata/align.d.ts +43 -0
- package/out/kr/adapters/localdata/align.d.ts.map +1 -0
- package/out/kr/adapters/localdata/align.js +223 -0
- package/out/kr/adapters/localdata/align.js.map +1 -0
- package/out/kr/adapters/localdata/key-index.d.ts +71 -0
- package/out/kr/adapters/localdata/key-index.d.ts.map +1 -0
- package/out/kr/adapters/localdata/key-index.js +133 -0
- package/out/kr/adapters/localdata/key-index.js.map +1 -0
- package/out/kr/adapters/localdata/permit-rows.d.ts +66 -0
- package/out/kr/adapters/localdata/permit-rows.d.ts.map +1 -0
- package/out/kr/adapters/localdata/permit-rows.js +131 -0
- package/out/kr/adapters/localdata/permit-rows.js.map +1 -0
- package/out/kr/tools/fetch/juso.d.ts +30 -0
- package/out/kr/tools/fetch/juso.d.ts.map +1 -0
- package/out/kr/tools/fetch/juso.js +120 -0
- package/out/kr/tools/fetch/juso.js.map +1 -0
- package/out/kr/tools/fetch/localdata.d.ts +30 -0
- package/out/kr/tools/fetch/localdata.d.ts.map +1 -0
- package/out/kr/tools/fetch/localdata.js +139 -0
- package/out/kr/tools/fetch/localdata.js.map +1 -0
- package/out/nl/recipes/postcode.d.ts +26 -0
- package/out/nl/recipes/postcode.d.ts.map +1 -0
- package/out/nl/recipes/postcode.js +103 -0
- package/out/nl/recipes/postcode.js.map +1 -0
- package/out/no/recipes/fragment.d.ts +43 -0
- package/out/no/recipes/fragment.d.ts.map +1 -0
- package/out/no/recipes/fragment.js +183 -0
- package/out/no/recipes/fragment.js.map +1 -0
- package/out/no/recipes/street/index.d.ts +18 -0
- package/out/no/recipes/street/index.d.ts.map +1 -0
- package/out/no/recipes/street/index.js +72 -0
- package/out/no/recipes/street/index.js.map +1 -0
- package/out/no/recipes/street/led.d.ts +24 -0
- package/out/no/recipes/street/led.d.ts.map +1 -0
- package/out/no/recipes/street/led.js +114 -0
- package/out/no/recipes/street/led.js.map +1 -0
- package/out/recipes/anchor-absorption.d.ts.map +1 -1
- package/out/recipes/anchor-absorption.js +2 -1
- package/out/recipes/anchor-absorption.js.map +1 -1
- package/out/recipes/bare/country.d.ts +25 -0
- package/out/recipes/bare/country.d.ts.map +1 -0
- package/out/recipes/bare/country.js +88 -0
- package/out/recipes/bare/country.js.map +1 -0
- package/out/recipes/bare/postcode/eval.d.ts +29 -0
- package/out/recipes/bare/postcode/eval.d.ts.map +1 -0
- package/out/recipes/bare/postcode/eval.js +85 -0
- package/out/recipes/bare/postcode/eval.js.map +1 -0
- package/out/recipes/bare/postcode/index.d.ts +62 -0
- package/out/recipes/bare/postcode/index.d.ts.map +1 -0
- package/out/recipes/bare/postcode/index.js +267 -0
- package/out/recipes/bare/postcode/index.js.map +1 -0
- package/out/recipes/boundary-stress.d.ts.map +1 -1
- package/out/recipes/boundary-stress.js +2 -1
- package/out/recipes/boundary-stress.js.map +1 -1
- package/out/recipes/country-balanced.d.ts.map +1 -1
- package/out/recipes/country-balanced.js +2 -1
- package/out/recipes/country-balanced.js.map +1 -1
- package/out/recipes/house-venue.d.ts.map +1 -1
- package/out/recipes/house-venue.js +2 -1
- package/out/recipes/house-venue.js.map +1 -1
- package/out/recipes/index.d.ts.map +1 -1
- package/out/recipes/index.js +28 -21
- package/out/recipes/index.js.map +1 -1
- package/out/recipes/intersection.d.ts.map +1 -1
- package/out/recipes/intersection.js +2 -1
- package/out/recipes/intersection.js.map +1 -1
- package/out/recipes/po/box/cedex/au-nz.d.ts +7 -0
- package/out/recipes/po/box/cedex/au-nz.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/au-nz.js +56 -0
- package/out/recipes/po/box/cedex/au-nz.js.map +1 -0
- package/out/recipes/po/box/cedex/ca.d.ts +7 -0
- package/out/recipes/po/box/cedex/ca.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/ca.js +38 -0
- package/out/recipes/po/box/cedex/ca.js.map +1 -0
- package/out/recipes/po/box/cedex/fr.d.ts +7 -0
- package/out/recipes/po/box/cedex/fr.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/fr.js +57 -0
- package/out/recipes/po/box/cedex/fr.js.map +1 -0
- package/out/recipes/po/box/cedex/phrases.d.ts +8 -0
- package/out/recipes/po/box/cedex/phrases.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/phrases.js +76 -0
- package/out/recipes/po/box/cedex/phrases.js.map +1 -0
- package/out/recipes/po/box/cedex/recipe.d.ts +9 -0
- package/out/recipes/po/box/cedex/recipe.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/recipe.js +153 -0
- package/out/recipes/po/box/cedex/recipe.js.map +1 -0
- package/out/recipes/po/box/cedex/sources.d.ts +86 -0
- package/out/recipes/po/box/cedex/sources.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/sources.js +143 -0
- package/out/recipes/po/box/cedex/sources.js.map +1 -0
- package/out/recipes/po/box/cedex/types.d.ts +31 -0
- package/out/recipes/po/box/cedex/types.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/types.js +5 -0
- package/out/recipes/po/box/cedex/types.js.map +1 -0
- package/out/recipes/po/box/cedex/us.d.ts +7 -0
- package/out/recipes/po/box/cedex/us.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/us.js +51 -0
- package/out/recipes/po/box/cedex/us.js.map +1 -0
- package/out/recipes/po/box/cedex/vocabulary.d.ts +68 -0
- package/out/recipes/po/box/cedex/vocabulary.d.ts.map +1 -0
- package/out/recipes/po/box/cedex/vocabulary.js +90 -0
- package/out/recipes/po/box/cedex/vocabulary.js.map +1 -0
- package/out/recipes/po/box/cedex.d.ts +9 -0
- package/out/recipes/po/box/cedex.d.ts.map +1 -0
- package/out/recipes/po/box/cedex.js +9 -0
- package/out/recipes/po/box/cedex.js.map +1 -0
- package/out/recipes/po/box/index.d.ts +17 -0
- package/out/recipes/po/box/index.d.ts.map +1 -0
- package/out/recipes/po/box/index.js +105 -0
- package/out/recipes/po/box/index.js.map +1 -0
- package/out/recipes/scaffold.d.ts +20 -1
- package/out/recipes/scaffold.d.ts.map +1 -1
- package/out/recipes/scaffold.js +18 -49
- package/out/recipes/scaffold.js.map +1 -1
- package/out/recipes/street/affix.d.ts +89 -0
- package/out/recipes/street/affix.d.ts.map +1 -0
- package/out/recipes/street/affix.js +565 -0
- package/out/recipes/street/affix.js.map +1 -0
- package/out/recipes/street/bare.d.ts +25 -0
- package/out/recipes/street/bare.d.ts.map +1 -0
- package/out/recipes/street/bare.js +87 -0
- package/out/recipes/street/bare.js.map +1 -0
- package/out/recipes/street.d.ts.map +1 -1
- package/out/recipes/street.js +2 -1
- package/out/recipes/street.js.map +1 -1
- package/out/recipes/sub/venue/context.d.ts +29 -0
- package/out/recipes/sub/venue/context.d.ts.map +1 -0
- package/out/recipes/sub/venue/context.js +106 -0
- package/out/recipes/sub/venue/context.js.map +1 -0
- package/out/recipes/sub/venue/index.d.ts +270 -0
- package/out/recipes/sub/venue/index.d.ts.map +1 -0
- package/out/recipes/sub/venue/index.js +728 -0
- package/out/recipes/sub/venue/index.js.map +1 -0
- package/out/recipes/sub/venue/sources.d.ts +209 -0
- package/out/recipes/sub/venue/sources.d.ts.map +1 -0
- package/out/recipes/sub/venue/sources.js +555 -0
- package/out/recipes/sub/venue/sources.js.map +1 -0
- package/out/recipes/trailing-region.d.ts.map +1 -1
- package/out/recipes/trailing-region.js +8 -2
- package/out/recipes/trailing-region.js.map +1 -1
- package/out/recipes/unit.d.ts.map +1 -1
- package/out/recipes/unit.js +2 -1
- package/out/recipes/unit.js.map +1 -1
- package/out/sg/recipes/register.d.ts +69 -0
- package/out/sg/recipes/register.d.ts.map +1 -0
- package/out/sg/recipes/register.js +211 -0
- package/out/sg/recipes/register.js.map +1 -0
- package/out/sg/tools/fetch/acra.d.ts +23 -0
- package/out/sg/tools/fetch/acra.d.ts.map +1 -0
- package/out/sg/tools/fetch/acra.js +126 -0
- package/out/sg/tools/fetch/acra.js.map +1 -0
- package/out/si/recipes/bare-village.d.ts +32 -0
- package/out/si/recipes/bare-village.d.ts.map +1 -0
- package/out/si/recipes/bare-village.js +89 -0
- package/out/si/recipes/bare-village.js.map +1 -0
- package/out/south-asia/recipes/register.d.ts +51 -0
- package/out/south-asia/recipes/register.d.ts.map +1 -0
- package/out/south-asia/recipes/register.js +154 -0
- package/out/south-asia/recipes/register.js.map +1 -0
- package/out/synthesizers/anchor-absorption.d.ts +1 -1
- package/out/synthesizers/anchor-absorption.d.ts.map +1 -1
- package/out/synthesizers/anchor-absorption.js.map +1 -1
- package/out/synthesizers/boundary-stress.js.map +1 -1
- package/out/synthesizers/house-venue.js.map +1 -1
- package/out/synthesizers/intersection.js.map +1 -1
- package/out/synthesizers/locale.d.ts +116 -0
- package/out/synthesizers/locale.d.ts.map +1 -0
- package/out/synthesizers/locale.js +150 -0
- package/out/synthesizers/locale.js.map +1 -0
- package/out/synthesizers/no-street.d.ts.map +1 -1
- package/out/synthesizers/no-street.js.map +1 -1
- package/out/synthesizers/po-box.js.map +1 -1
- package/out/synthesizers/street.d.ts.map +1 -1
- package/out/synthesizers/street.js +1 -1
- package/out/synthesizers/street.js.map +1 -1
- package/out/synthesizers/utils.js +1 -1
- package/out/synthesizers/utils.js.map +1 -1
- package/out/test-kit/corpus-recipe.d.ts.map +1 -1
- package/out/test-kit/corpus-recipe.js.map +1 -1
- package/out/tools/audit.d.ts.map +1 -1
- package/out/tools/audit.js +3 -2
- package/out/tools/audit.js.map +1 -1
- package/out/tools/corpus-stats.js +3 -3
- package/out/tools/corpus-stats.js.map +1 -1
- package/out/tools/fetch/download/index.d.ts +10 -0
- package/out/tools/fetch/download/index.d.ts.map +1 -0
- package/out/tools/fetch/download/index.js +10 -0
- package/out/tools/fetch/download/index.js.map +1 -0
- package/out/tools/fetch/download/manifest.d.ts +47 -0
- package/out/tools/fetch/download/manifest.d.ts.map +1 -0
- package/out/tools/fetch/download/manifest.js +74 -0
- package/out/tools/fetch/download/manifest.js.map +1 -0
- package/out/tools/fetch/download/network.d.ts +105 -0
- package/out/tools/fetch/download/network.d.ts.map +1 -0
- package/out/tools/fetch/download/network.js +130 -0
- package/out/tools/fetch/download/network.js.map +1 -0
- package/out/tools/fetch/download/retry.d.ts +45 -0
- package/out/tools/fetch/download/retry.d.ts.map +1 -0
- package/out/tools/fetch/download/retry.js +136 -0
- package/out/tools/fetch/download/retry.js.map +1 -0
- package/out/tools/fetch/geonames/dump.d.ts +91 -0
- package/out/tools/fetch/geonames/dump.d.ts.map +1 -0
- package/out/tools/fetch/geonames/dump.js +171 -0
- package/out/tools/fetch/geonames/dump.js.map +1 -0
- package/out/tools/fetch/geonames/postal.d.ts +76 -0
- package/out/tools/fetch/geonames/postal.d.ts.map +1 -0
- package/out/tools/fetch/geonames/postal.js +126 -0
- package/out/tools/fetch/geonames/postal.js.map +1 -0
- package/out/tools/fetch/index.d.ts +47 -20
- package/out/tools/fetch/index.d.ts.map +1 -1
- package/out/tools/fetch/index.js +47 -20
- package/out/tools/fetch/index.js.map +1 -1
- package/out/tools/fetch/openaddresses.d.ts +1 -1
- package/out/tools/fetch/openaddresses.d.ts.map +1 -1
- package/out/tools/fetch/openaddresses.js +1 -1
- package/out/tools/fetch/openaddresses.js.map +1 -1
- package/out/tools/fetch/ourairports.d.ts +1 -1
- package/out/tools/fetch/ourairports.d.ts.map +1 -1
- package/out/tools/fetch/ourairports.js +1 -1
- package/out/tools/fetch/ourairports.js.map +1 -1
- package/out/tools/fetch/ppd.js +1 -3
- package/out/tools/fetch/ppd.js.map +1 -1
- package/out/tools/fetch/wikidata-subvenue.d.ts +1 -1
- package/out/tools/fetch/wikidata-subvenue.d.ts.map +1 -1
- package/out/tools/fetch/wikidata-subvenue.js +1 -1
- package/out/tools/fetch/wikidata-subvenue.js.map +1 -1
- package/out/tools/golden/expand.d.ts +90 -0
- package/out/tools/golden/expand.d.ts.map +1 -0
- package/out/tools/golden/expand.js +406 -0
- package/out/tools/golden/expand.js.map +1 -0
- package/out/tools/golden/promote.d.ts +72 -0
- package/out/tools/golden/promote.d.ts.map +1 -0
- package/out/tools/golden/promote.js +243 -0
- package/out/tools/golden/promote.js.map +1 -0
- package/out/tools/golden/relabel-street/directory.d.ts +83 -0
- package/out/tools/golden/relabel-street/directory.d.ts.map +1 -0
- package/out/tools/golden/relabel-street/directory.js +216 -0
- package/out/tools/golden/relabel-street/directory.js.map +1 -0
- package/out/tools/golden/relabel-street/index.d.ts +9 -0
- package/out/tools/golden/relabel-street/index.d.ts.map +1 -0
- package/out/tools/golden/relabel-street/index.js +9 -0
- package/out/tools/golden/relabel-street/index.js.map +1 -0
- package/out/tools/golden/relabel-street/row.d.ts +121 -0
- package/out/tools/golden/relabel-street/row.d.ts.map +1 -0
- package/out/tools/golden/relabel-street/row.js +232 -0
- package/out/tools/golden/relabel-street/row.js.map +1 -0
- package/out/tools/index.d.ts +10 -10
- package/out/tools/index.d.ts.map +1 -1
- package/out/tools/index.js +10 -10
- package/out/tools/index.js.map +1 -1
- package/out/tools/ingest-csv.d.ts.map +1 -1
- package/out/tools/ingest-csv.js +5 -7
- package/out/tools/ingest-csv.js.map +1 -1
- package/out/tools/lint/slice/index.d.ts +93 -0
- package/out/tools/lint/slice/index.d.ts.map +1 -0
- package/out/tools/lint/slice/index.js +322 -0
- package/out/tools/lint/slice/index.js.map +1 -0
- package/out/tools/lint/slice/vocab.d.ts +90 -0
- package/out/tools/lint/slice/vocab.d.ts.map +1 -0
- package/out/tools/lint/slice/vocab.js +254 -0
- package/out/tools/lint/slice/vocab.js.map +1 -0
- package/out/tools/overlay-manifest.d.ts +56 -6
- package/out/tools/overlay-manifest.d.ts.map +1 -1
- package/out/tools/overlay-manifest.js +56 -15
- package/out/tools/overlay-manifest.js.map +1 -1
- package/out/tools/overture-subvenue.d.ts +1 -1
- package/out/tools/postcode-triples.d.ts +36 -0
- package/out/tools/postcode-triples.d.ts.map +1 -1
- package/out/tools/postcode-triples.js +91 -12
- package/out/tools/postcode-triples.js.map +1 -1
- package/out/tools/slice/kryptonite.d.ts +32 -0
- package/out/tools/slice/kryptonite.d.ts.map +1 -0
- package/out/tools/slice/kryptonite.js +99 -0
- package/out/tools/slice/kryptonite.js.map +1 -0
- package/out/tools/slice/translit.d.ts +51 -0
- package/out/tools/slice/translit.d.ts.map +1 -0
- package/out/tools/slice/translit.js +166 -0
- package/out/tools/slice/translit.js.map +1 -0
- package/out/tools/sub/venue/harvest.d.ts +100 -0
- package/out/tools/sub/venue/harvest.d.ts.map +1 -0
- package/out/tools/sub/venue/harvest.js +168 -0
- package/out/tools/sub/venue/harvest.js.map +1 -0
- package/out/tools/sub/venue/head-nouns.d.ts +50 -0
- package/out/tools/sub/venue/head-nouns.d.ts.map +1 -0
- package/out/tools/sub/venue/head-nouns.js.map +1 -0
- package/out/tools/sub/venue/lexicon.d.ts +156 -0
- package/out/tools/sub/venue/lexicon.d.ts.map +1 -0
- package/out/tools/sub/venue/lexicon.js +283 -0
- package/out/tools/sub/venue/lexicon.js.map +1 -0
- package/out/tools/sub/venue/promotions.d.ts +94 -0
- package/out/tools/sub/venue/promotions.d.ts.map +1 -0
- package/out/tools/sub/venue/promotions.js +266 -0
- package/out/tools/sub/venue/promotions.js.map +1 -0
- package/out/tools/sub/venue/surfaces.d.ts +45 -0
- package/out/tools/sub/venue/surfaces.d.ts.map +1 -0
- package/out/tools/sub/venue/surfaces.js.map +1 -0
- package/out/tools/sub/venue/table.d.ts +229 -0
- package/out/tools/sub/venue/table.d.ts.map +1 -0
- package/out/tools/sub/venue/table.js.map +1 -0
- package/out/tools/sub/venue/wikidata.d.ts +26 -0
- package/out/tools/sub/venue/wikidata.d.ts.map +1 -0
- package/out/tools/sub/venue/wikidata.js +62 -0
- package/out/tools/sub/venue/wikidata.js.map +1 -0
- package/out/tw/tools/fetch/gcis.d.ts +23 -0
- package/out/tw/tools/fetch/gcis.d.ts.map +1 -0
- package/out/tw/tools/fetch/gcis.js +135 -0
- package/out/tw/tools/fetch/gcis.js.map +1 -0
- package/out/types.d.ts +1 -1
- package/out/types.d.ts.map +1 -1
- package/out/us/adapters/fcc-bdc/adapter.d.ts.map +1 -0
- package/out/us/adapters/fcc-bdc/adapter.js +142 -0
- package/out/us/adapters/fcc-bdc/adapter.js.map +1 -0
- package/out/us/adapters/state/hi-schools/adapter.d.ts.map +1 -0
- package/out/us/adapters/state/hi-schools/adapter.js +136 -0
- package/out/us/adapters/state/hi-schools/adapter.js.map +1 -0
- package/out/us/adapters/state/hi-schools/workbook.d.ts.map +1 -0
- package/out/us/adapters/state/hi-schools/workbook.js.map +1 -0
- package/out/us/adapters/state/ia-contractors/adapter.d.ts.map +1 -0
- package/out/us/adapters/state/ia-contractors/adapter.js +104 -0
- package/out/us/adapters/state/ia-contractors/adapter.js.map +1 -0
- package/out/us/adapters/state/ny-notaries/adapter.d.ts.map +1 -0
- package/out/us/adapters/state/ny-notaries/adapter.js +112 -0
- package/out/us/adapters/state/ny-notaries/adapter.js.map +1 -0
- package/out/us/adapters/state/tx-notaries/adapter.d.ts.map +1 -0
- package/out/us/adapters/state/tx-notaries/adapter.js +118 -0
- package/out/us/adapters/state/tx-notaries/adapter.js.map +1 -0
- package/out/us/adapters/tiger/adapter.d.ts +55 -0
- package/out/us/adapters/tiger/adapter.d.ts.map +1 -0
- package/out/us/adapters/tiger/adapter.js +197 -0
- package/out/us/adapters/tiger/adapter.js.map +1 -0
- package/out/us/adapters/tiger/street-decompose.d.ts.map +1 -0
- package/out/us/adapters/tiger/street-decompose.js.map +1 -0
- package/out/us/adapters/usgov/hrsa-fqhc/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/hrsa-fqhc/adapter.js +121 -0
- package/out/us/adapters/usgov/hrsa-fqhc/adapter.js.map +1 -0
- package/out/us/adapters/usgov/imls-pls/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/imls-pls/adapter.js +106 -0
- package/out/us/adapters/usgov/imls-pls/adapter.js.map +1 -0
- package/out/us/adapters/usgov/irs-bmf/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/irs-bmf/adapter.js +116 -0
- package/out/us/adapters/usgov/irs-bmf/adapter.js.map +1 -0
- package/out/us/adapters/usgov/nad/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/nad/adapter.js +239 -0
- package/out/us/adapters/usgov/nad/adapter.js.map +1 -0
- package/out/us/adapters/usgov/nppes/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/nppes/adapter.js +110 -0
- package/out/us/adapters/usgov/nppes/adapter.js.map +1 -0
- package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.d.ts.map +1 -0
- package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js +143 -0
- package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js.map +1 -0
- package/out/us/fips-state.d.ts +41 -0
- package/out/us/fips-state.d.ts.map +1 -0
- package/out/us/fips-state.js +100 -0
- package/out/us/fips-state.js.map +1 -0
- package/out/us/tools/fetch/hrsa.d.ts +18 -0
- package/out/us/tools/fetch/hrsa.d.ts.map +1 -0
- package/out/us/tools/fetch/hrsa.js +46 -0
- package/out/us/tools/fetch/hrsa.js.map +1 -0
- package/out/us/tools/fetch/imls-pls.d.ts +25 -0
- package/out/us/tools/fetch/imls-pls.d.ts.map +1 -0
- package/out/us/tools/fetch/imls-pls.js +108 -0
- package/out/us/tools/fetch/imls-pls.js.map +1 -0
- package/out/us/tools/fetch/nad.d.ts +70 -0
- package/out/us/tools/fetch/nad.d.ts.map +1 -0
- package/out/us/tools/fetch/nad.js +234 -0
- package/out/us/tools/fetch/nad.js.map +1 -0
- package/out/us/tools/fetch/nppes.d.ts +26 -0
- package/out/us/tools/fetch/nppes.d.ts.map +1 -0
- package/out/us/tools/fetch/nppes.js +126 -0
- package/out/us/tools/fetch/nppes.js.map +1 -0
- package/out/us/tools/fetch/state/hi-schools.d.ts +26 -0
- package/out/us/tools/fetch/state/hi-schools.d.ts.map +1 -0
- package/out/us/tools/fetch/state/hi-schools.js +112 -0
- package/out/us/tools/fetch/state/hi-schools.js.map +1 -0
- package/out/us/tools/fetch/state/sources.d.ts +26 -0
- package/out/us/tools/fetch/state/sources.d.ts.map +1 -0
- package/out/us/tools/fetch/state/sources.js +111 -0
- package/out/us/tools/fetch/state/sources.js.map +1 -0
- package/out/us/tools/fetch/tiger-full.d.ts +22 -0
- package/out/us/tools/fetch/tiger-full.d.ts.map +1 -0
- package/out/us/tools/fetch/tiger-full.js +217 -0
- package/out/us/tools/fetch/tiger-full.js.map +1 -0
- package/out/utils/align.d.ts +1 -1
- package/out/utils/align.d.ts.map +1 -1
- package/out/utils/align.js.map +1 -1
- package/out/utils/golden.d.ts +7 -3
- package/out/utils/golden.d.ts.map +1 -1
- package/out/utils/golden.js +12 -8
- package/out/utils/golden.js.map +1 -1
- package/out/utils/parquet.d.ts.map +1 -1
- package/out/utils/split.js.map +1 -1
- package/out/utils/wof-json.d.ts.map +1 -1
- package/out/utils/wof-json.js +7 -12
- package/out/utils/wof-json.js.map +1 -1
- package/out/ve/recipes/reviewed-postcode-tail.d.ts.map +1 -0
- package/out/ve/recipes/reviewed-postcode-tail.js.map +1 -0
- package/package.json +196 -46
- package/lib/adapters/ban/adapter.ts +0 -190
- package/lib/adapters/fcc-bdc/adapter.ts +0 -174
- package/lib/adapters/geonames-postal/adapter.ts +0 -122
- package/lib/adapters/gnaf/adapter.ts +0 -149
- package/lib/adapters/gnaf/assemble.ts +0 -225
- package/lib/adapters/state-hi-schools/adapter.ts +0 -170
- package/lib/adapters/state-ia-contractors/adapter.ts +0 -144
- package/lib/adapters/state-ny-notaries/adapter.ts +0 -141
- package/lib/adapters/state-tx-notaries/adapter.ts +0 -157
- package/lib/adapters/tiger/adapter.ts +0 -252
- package/lib/adapters/usgov-hrsa-fqhc/adapter.ts +0 -167
- package/lib/adapters/usgov-imls-pls/adapter.ts +0 -143
- package/lib/adapters/usgov-irs-bmf/adapter.ts +0 -151
- package/lib/adapters/usgov-nad/adapter.ts +0 -334
- package/lib/adapters/usgov-nppes/adapter.ts +0 -151
- package/lib/adapters/usgov-samhsa-treatment-locator/adapter.ts +0 -193
- package/lib/adapters/wof-admin-json/adapter.ts +0 -231
- package/lib/adapters/wof-json-rows.ts +0 -129
- package/lib/adapters/wof-postalcode-json/adapter.ts +0 -176
- package/lib/name-prone-us-suffixes.ts +0 -12
- package/lib/recipes/bare-country.ts +0 -95
- package/lib/recipes/cz-pcfirst-preposition.ts +0 -111
- package/lib/recipes/fr-admin-split.ts +0 -242
- package/lib/recipes/fr-bare-street.ts +0 -170
- package/lib/recipes/fr-fragment.ts +0 -333
- package/lib/recipes/fr-lieudit.ts +0 -301
- package/lib/recipes/fr-order.ts +0 -245
- package/lib/recipes/german.ts +0 -359
- package/lib/recipes/locale.ts +0 -599
- package/lib/recipes/nl-postcode.ts +0 -115
- package/lib/recipes/no-fragment.ts +0 -219
- package/lib/recipes/no-street-led.ts +0 -141
- package/lib/recipes/no-street.ts +0 -90
- package/lib/recipes/po-box-cedex.ts +0 -976
- package/lib/recipes/po-box.ts +0 -123
- package/lib/recipes/si-bare-village.ts +0 -97
- package/lib/recipes/street-affix.ts +0 -804
- package/lib/recipes/street-bare.ts +0 -100
- package/lib/recipes/sub-venue-sources.ts +0 -877
- package/lib/recipes/sub-venue.ts +0 -997
- package/lib/synthesizers/german.ts +0 -260
- package/lib/tools/fetch/ban.ts +0 -289
- package/lib/tools/fetch/download.ts +0 -262
- package/lib/tools/fetch/geonames-dump.ts +0 -257
- package/lib/tools/fetch/geonames-postal.ts +0 -180
- package/lib/tools/fetch/hrsa.ts +0 -59
- package/lib/tools/fetch/imls-pls.ts +0 -149
- package/lib/tools/fetch/nad.ts +0 -341
- package/lib/tools/fetch/nppes.ts +0 -165
- package/lib/tools/fetch/state-hi-schools.ts +0 -161
- package/lib/tools/fetch/state-sources.ts +0 -146
- package/lib/tools/fetch/tiger-full.ts +0 -308
- package/lib/tools/golden-promote.ts +0 -337
- package/lib/tools/golden-relabel-street.ts +0 -683
- package/lib/tools/lint-slice-vocab.ts +0 -388
- package/lib/tools/sub-venue/harvest.ts +0 -234
- package/lib/tools/sub-venue/head-nouns.ts +0 -245
- package/lib/tools/sub-venue/surfaces.ts +0 -95
- package/lib/tools/sub-venue/table.ts +0 -281
- package/lib/tools/sub-venue/wikidata.ts +0 -85
- package/lib/tools/sub-venue-lexicon.ts +0 -429
- package/out/adapters/ban/adapter.d.ts.map +0 -1
- package/out/adapters/ban/adapter.js +0 -149
- package/out/adapters/ban/adapter.js.map +0 -1
- package/out/adapters/ban/street-decompose.d.ts.map +0 -1
- package/out/adapters/ban/street-decompose.js.map +0 -1
- package/out/adapters/fcc-bdc/adapter.d.ts.map +0 -1
- package/out/adapters/fcc-bdc/adapter.js +0 -144
- package/out/adapters/fcc-bdc/adapter.js.map +0 -1
- package/out/adapters/geonames-postal/adapter.d.ts.map +0 -1
- package/out/adapters/geonames-postal/adapter.js +0 -107
- package/out/adapters/geonames-postal/adapter.js.map +0 -1
- package/out/adapters/gnaf/adapter.d.ts.map +0 -1
- package/out/adapters/gnaf/adapter.js +0 -124
- package/out/adapters/gnaf/adapter.js.map +0 -1
- package/out/adapters/gnaf/assemble.d.ts +0 -65
- package/out/adapters/gnaf/assemble.d.ts.map +0 -1
- package/out/adapters/gnaf/assemble.js +0 -154
- package/out/adapters/gnaf/assemble.js.map +0 -1
- package/out/adapters/state-hi-schools/adapter.d.ts.map +0 -1
- package/out/adapters/state-hi-schools/adapter.js +0 -145
- package/out/adapters/state-hi-schools/adapter.js.map +0 -1
- package/out/adapters/state-hi-schools/workbook.d.ts.map +0 -1
- package/out/adapters/state-hi-schools/workbook.js.map +0 -1
- package/out/adapters/state-ia-contractors/adapter.d.ts.map +0 -1
- package/out/adapters/state-ia-contractors/adapter.js +0 -111
- package/out/adapters/state-ia-contractors/adapter.js.map +0 -1
- package/out/adapters/state-ny-notaries/adapter.d.ts.map +0 -1
- package/out/adapters/state-ny-notaries/adapter.js +0 -119
- package/out/adapters/state-ny-notaries/adapter.js.map +0 -1
- package/out/adapters/state-tx-notaries/adapter.d.ts.map +0 -1
- package/out/adapters/state-tx-notaries/adapter.js +0 -125
- package/out/adapters/state-tx-notaries/adapter.js.map +0 -1
- package/out/adapters/tiger/adapter.d.ts +0 -55
- package/out/adapters/tiger/adapter.d.ts.map +0 -1
- package/out/adapters/tiger/adapter.js +0 -201
- package/out/adapters/tiger/adapter.js.map +0 -1
- package/out/adapters/tiger/street-decompose.d.ts.map +0 -1
- package/out/adapters/tiger/street-decompose.js.map +0 -1
- package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-hrsa-fqhc/adapter.js +0 -132
- package/out/adapters/usgov-hrsa-fqhc/adapter.js.map +0 -1
- package/out/adapters/usgov-imls-pls/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-imls-pls/adapter.js +0 -114
- package/out/adapters/usgov-imls-pls/adapter.js.map +0 -1
- package/out/adapters/usgov-irs-bmf/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-irs-bmf/adapter.js +0 -120
- package/out/adapters/usgov-irs-bmf/adapter.js.map +0 -1
- package/out/adapters/usgov-nad/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-nad/adapter.js +0 -249
- package/out/adapters/usgov-nad/adapter.js.map +0 -1
- package/out/adapters/usgov-nppes/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-nppes/adapter.js +0 -118
- package/out/adapters/usgov-nppes/adapter.js.map +0 -1
- package/out/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +0 -1
- package/out/adapters/usgov-samhsa-treatment-locator/adapter.js +0 -154
- package/out/adapters/usgov-samhsa-treatment-locator/adapter.js.map +0 -1
- package/out/adapters/wof-admin-jp/adapter.d.ts.map +0 -1
- package/out/adapters/wof-admin-jp/adapter.js.map +0 -1
- package/out/adapters/wof-admin-json/adapter.d.ts +0 -79
- package/out/adapters/wof-admin-json/adapter.d.ts.map +0 -1
- package/out/adapters/wof-admin-json/adapter.js +0 -197
- package/out/adapters/wof-admin-json/adapter.js.map +0 -1
- package/out/adapters/wof-json-rows.d.ts +0 -62
- package/out/adapters/wof-json-rows.d.ts.map +0 -1
- package/out/adapters/wof-json-rows.js +0 -83
- package/out/adapters/wof-json-rows.js.map +0 -1
- package/out/adapters/wof-postalcode-json/adapter.d.ts +0 -65
- package/out/adapters/wof-postalcode-json/adapter.d.ts.map +0 -1
- package/out/adapters/wof-postalcode-json/adapter.js +0 -151
- package/out/adapters/wof-postalcode-json/adapter.js.map +0 -1
- package/out/codex/us-fips-state.d.ts +0 -41
- package/out/codex/us-fips-state.d.ts.map +0 -1
- package/out/codex/us-fips-state.js +0 -100
- package/out/codex/us-fips-state.js.map +0 -1
- package/out/name-prone-us-suffixes.d.ts +0 -12
- package/out/name-prone-us-suffixes.d.ts.map +0 -1
- package/out/name-prone-us-suffixes.js +0 -12
- package/out/name-prone-us-suffixes.js.map +0 -1
- package/out/recipes/bare-country.d.ts +0 -25
- package/out/recipes/bare-country.d.ts.map +0 -1
- package/out/recipes/bare-country.js +0 -87
- package/out/recipes/bare-country.js.map +0 -1
- package/out/recipes/cn-organizational-units.d.ts +0 -36
- package/out/recipes/cn-organizational-units.d.ts.map +0 -1
- package/out/recipes/cn-organizational-units.js +0 -159
- package/out/recipes/cn-organizational-units.js.map +0 -1
- package/out/recipes/cz-pcfirst-preposition.d.ts +0 -22
- package/out/recipes/cz-pcfirst-preposition.d.ts.map +0 -1
- package/out/recipes/cz-pcfirst-preposition.js +0 -100
- package/out/recipes/cz-pcfirst-preposition.js.map +0 -1
- package/out/recipes/fr-admin-split.d.ts +0 -38
- package/out/recipes/fr-admin-split.d.ts.map +0 -1
- package/out/recipes/fr-admin-split.js +0 -192
- package/out/recipes/fr-admin-split.js.map +0 -1
- package/out/recipes/fr-bare-street.d.ts +0 -28
- package/out/recipes/fr-bare-street.d.ts.map +0 -1
- package/out/recipes/fr-bare-street.js +0 -143
- package/out/recipes/fr-bare-street.js.map +0 -1
- package/out/recipes/fr-fragment.d.ts +0 -77
- package/out/recipes/fr-fragment.d.ts.map +0 -1
- package/out/recipes/fr-fragment.js +0 -276
- package/out/recipes/fr-fragment.js.map +0 -1
- package/out/recipes/fr-lieudit.d.ts +0 -32
- package/out/recipes/fr-lieudit.d.ts.map +0 -1
- package/out/recipes/fr-lieudit.js +0 -227
- package/out/recipes/fr-lieudit.js.map +0 -1
- package/out/recipes/fr-order.d.ts +0 -38
- package/out/recipes/fr-order.d.ts.map +0 -1
- package/out/recipes/fr-order.js +0 -197
- package/out/recipes/fr-order.js.map +0 -1
- package/out/recipes/german.d.ts +0 -44
- package/out/recipes/german.d.ts.map +0 -1
- package/out/recipes/german.js +0 -288
- package/out/recipes/german.js.map +0 -1
- package/out/recipes/locale.d.ts +0 -136
- package/out/recipes/locale.d.ts.map +0 -1
- package/out/recipes/locale.js +0 -460
- package/out/recipes/locale.js.map +0 -1
- package/out/recipes/nl-postcode.d.ts +0 -26
- package/out/recipes/nl-postcode.d.ts.map +0 -1
- package/out/recipes/nl-postcode.js +0 -102
- package/out/recipes/nl-postcode.js.map +0 -1
- package/out/recipes/no-fragment.d.ts +0 -43
- package/out/recipes/no-fragment.d.ts.map +0 -1
- package/out/recipes/no-fragment.js +0 -182
- package/out/recipes/no-fragment.js.map +0 -1
- package/out/recipes/no-street-led.d.ts +0 -24
- package/out/recipes/no-street-led.d.ts.map +0 -1
- package/out/recipes/no-street-led.js +0 -113
- package/out/recipes/no-street-led.js.map +0 -1
- package/out/recipes/no-street.d.ts +0 -18
- package/out/recipes/no-street.d.ts.map +0 -1
- package/out/recipes/no-street.js +0 -71
- package/out/recipes/no-street.js.map +0 -1
- package/out/recipes/po-box-cedex.d.ts +0 -38
- package/out/recipes/po-box-cedex.d.ts.map +0 -1
- package/out/recipes/po-box-cedex.js +0 -767
- package/out/recipes/po-box-cedex.js.map +0 -1
- package/out/recipes/po-box.d.ts +0 -17
- package/out/recipes/po-box.d.ts.map +0 -1
- package/out/recipes/po-box.js +0 -100
- package/out/recipes/po-box.js.map +0 -1
- package/out/recipes/reviewed-postcode-tail.d.ts.map +0 -1
- package/out/recipes/reviewed-postcode-tail.js.map +0 -1
- package/out/recipes/si-bare-village.d.ts +0 -32
- package/out/recipes/si-bare-village.d.ts.map +0 -1
- package/out/recipes/si-bare-village.js +0 -88
- package/out/recipes/si-bare-village.js.map +0 -1
- package/out/recipes/street-affix.d.ts +0 -89
- package/out/recipes/street-affix.d.ts.map +0 -1
- package/out/recipes/street-affix.js +0 -563
- package/out/recipes/street-affix.js.map +0 -1
- package/out/recipes/street-bare.d.ts +0 -25
- package/out/recipes/street-bare.d.ts.map +0 -1
- package/out/recipes/street-bare.js +0 -86
- package/out/recipes/street-bare.js.map +0 -1
- package/out/recipes/sub-venue-sources.d.ts +0 -229
- package/out/recipes/sub-venue-sources.d.ts.map +0 -1
- package/out/recipes/sub-venue-sources.js +0 -653
- package/out/recipes/sub-venue-sources.js.map +0 -1
- package/out/recipes/sub-venue.d.ts +0 -269
- package/out/recipes/sub-venue.d.ts.map +0 -1
- package/out/recipes/sub-venue.js +0 -725
- package/out/recipes/sub-venue.js.map +0 -1
- package/out/synthesizers/german.d.ts +0 -115
- package/out/synthesizers/german.d.ts.map +0 -1
- package/out/synthesizers/german.js +0 -149
- package/out/synthesizers/german.js.map +0 -1
- package/out/tools/fetch/ban.d.ts +0 -31
- package/out/tools/fetch/ban.d.ts.map +0 -1
- package/out/tools/fetch/ban.js +0 -239
- package/out/tools/fetch/ban.js.map +0 -1
- package/out/tools/fetch/download.d.ts +0 -117
- package/out/tools/fetch/download.d.ts.map +0 -1
- package/out/tools/fetch/download.js +0 -160
- package/out/tools/fetch/download.js.map +0 -1
- package/out/tools/fetch/geonames-dump.d.ts +0 -91
- package/out/tools/fetch/geonames-dump.d.ts.map +0 -1
- package/out/tools/fetch/geonames-dump.js +0 -171
- package/out/tools/fetch/geonames-dump.js.map +0 -1
- package/out/tools/fetch/geonames-postal.d.ts +0 -76
- package/out/tools/fetch/geonames-postal.d.ts.map +0 -1
- package/out/tools/fetch/geonames-postal.js +0 -126
- package/out/tools/fetch/geonames-postal.js.map +0 -1
- package/out/tools/fetch/hrsa.d.ts +0 -18
- package/out/tools/fetch/hrsa.d.ts.map +0 -1
- package/out/tools/fetch/hrsa.js +0 -46
- package/out/tools/fetch/hrsa.js.map +0 -1
- package/out/tools/fetch/imls-pls.d.ts +0 -25
- package/out/tools/fetch/imls-pls.d.ts.map +0 -1
- package/out/tools/fetch/imls-pls.js +0 -108
- package/out/tools/fetch/imls-pls.js.map +0 -1
- package/out/tools/fetch/nad.d.ts +0 -70
- package/out/tools/fetch/nad.d.ts.map +0 -1
- package/out/tools/fetch/nad.js +0 -234
- package/out/tools/fetch/nad.js.map +0 -1
- package/out/tools/fetch/nppes.d.ts +0 -26
- package/out/tools/fetch/nppes.d.ts.map +0 -1
- package/out/tools/fetch/nppes.js +0 -126
- package/out/tools/fetch/nppes.js.map +0 -1
- package/out/tools/fetch/state-hi-schools.d.ts +0 -26
- package/out/tools/fetch/state-hi-schools.d.ts.map +0 -1
- package/out/tools/fetch/state-hi-schools.js +0 -112
- package/out/tools/fetch/state-hi-schools.js.map +0 -1
- package/out/tools/fetch/state-sources.d.ts +0 -26
- package/out/tools/fetch/state-sources.d.ts.map +0 -1
- package/out/tools/fetch/state-sources.js +0 -111
- package/out/tools/fetch/state-sources.js.map +0 -1
- package/out/tools/fetch/tiger-full.d.ts +0 -22
- package/out/tools/fetch/tiger-full.d.ts.map +0 -1
- package/out/tools/fetch/tiger-full.js +0 -217
- package/out/tools/fetch/tiger-full.js.map +0 -1
- package/out/tools/golden-expand.d.ts +0 -90
- package/out/tools/golden-expand.d.ts.map +0 -1
- package/out/tools/golden-expand.js +0 -406
- package/out/tools/golden-expand.js.map +0 -1
- package/out/tools/golden-promote.d.ts +0 -72
- package/out/tools/golden-promote.d.ts.map +0 -1
- package/out/tools/golden-promote.js +0 -240
- package/out/tools/golden-promote.js.map +0 -1
- package/out/tools/golden-relabel-street.d.ts +0 -196
- package/out/tools/golden-relabel-street.d.ts.map +0 -1
- package/out/tools/golden-relabel-street.js +0 -440
- package/out/tools/golden-relabel-street.js.map +0 -1
- package/out/tools/lint-slice-vocab.d.ts +0 -90
- package/out/tools/lint-slice-vocab.d.ts.map +0 -1
- package/out/tools/lint-slice-vocab.js +0 -267
- package/out/tools/lint-slice-vocab.js.map +0 -1
- package/out/tools/lint-slice.d.ts +0 -93
- package/out/tools/lint-slice.d.ts.map +0 -1
- package/out/tools/lint-slice.js +0 -322
- package/out/tools/lint-slice.js.map +0 -1
- package/out/tools/slice-kryptonite.d.ts +0 -32
- package/out/tools/slice-kryptonite.d.ts.map +0 -1
- package/out/tools/slice-kryptonite.js +0 -99
- package/out/tools/slice-kryptonite.js.map +0 -1
- package/out/tools/slice-translit.d.ts +0 -51
- package/out/tools/slice-translit.d.ts.map +0 -1
- package/out/tools/slice-translit.js +0 -166
- package/out/tools/slice-translit.js.map +0 -1
- package/out/tools/sub-venue/harvest.d.ts +0 -100
- package/out/tools/sub-venue/harvest.d.ts.map +0 -1
- package/out/tools/sub-venue/harvest.js +0 -168
- package/out/tools/sub-venue/harvest.js.map +0 -1
- package/out/tools/sub-venue/head-nouns.d.ts +0 -50
- package/out/tools/sub-venue/head-nouns.d.ts.map +0 -1
- package/out/tools/sub-venue/head-nouns.js.map +0 -1
- package/out/tools/sub-venue/surfaces.d.ts +0 -45
- package/out/tools/sub-venue/surfaces.d.ts.map +0 -1
- package/out/tools/sub-venue/surfaces.js.map +0 -1
- package/out/tools/sub-venue/table.d.ts +0 -229
- package/out/tools/sub-venue/table.d.ts.map +0 -1
- package/out/tools/sub-venue/table.js.map +0 -1
- package/out/tools/sub-venue/wikidata.d.ts +0 -26
- package/out/tools/sub-venue/wikidata.d.ts.map +0 -1
- package/out/tools/sub-venue/wikidata.js +0 -62
- package/out/tools/sub-venue/wikidata.js.map +0 -1
- package/out/tools/sub-venue-lexicon.d.ts +0 -156
- package/out/tools/sub-venue-lexicon.d.ts.map +0 -1
- package/out/tools/sub-venue-lexicon.js +0 -283
- package/out/tools/sub-venue-lexicon.js.map +0 -1
- package/out/tools/sub-venue-promotions.d.ts +0 -94
- package/out/tools/sub-venue-promotions.d.ts.map +0 -1
- package/out/tools/sub-venue-promotions.js +0 -266
- package/out/tools/sub-venue-promotions.js.map +0 -1
- /package/lib/{recipes/cn-organizational-units.ts → cn/recipes/organizational-units.ts} +0 -0
- /package/lib/{adapters → fr/adapters}/ban/street-decompose.ts +0 -0
- /package/lib/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.ts +0 -0
- /package/lib/tools/{golden-expand.ts → golden/expand.ts} +0 -0
- /package/lib/tools/{lint-slice.ts → lint/slice/index.ts} +0 -0
- /package/lib/tools/{slice-kryptonite.ts → slice/kryptonite.ts} +0 -0
- /package/lib/tools/{slice-translit.ts → slice/translit.ts} +0 -0
- /package/lib/tools/{sub-venue-promotions.ts → sub/venue/promotions.ts} +0 -0
- /package/lib/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.ts +0 -0
- /package/lib/{adapters → us/adapters}/tiger/street-decompose.ts +0 -0
- /package/lib/{codex/us-fips-state.ts → us/fips-state.ts} +0 -0
- /package/lib/{recipes → ve/recipes}/reviewed-postcode-tail.ts +0 -0
- /package/out/adapters/{geonames-postal → geonames/postal}/adapter.d.ts +0 -0
- /package/out/{adapters → au/adapters}/gnaf/adapter.d.ts +0 -0
- /package/out/{adapters → fr/adapters}/ban/adapter.d.ts +0 -0
- /package/out/{adapters → fr/adapters}/ban/street-decompose.d.ts +0 -0
- /package/out/{adapters → fr/adapters}/ban/street-decompose.js +0 -0
- /package/out/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.d.ts +0 -0
- /package/out/{adapters/wof-admin-jp → jp/adapters/wof-admin}/adapter.js +0 -0
- /package/out/tools/{sub-venue → sub/venue}/head-nouns.js +0 -0
- /package/out/tools/{sub-venue → sub/venue}/surfaces.js +0 -0
- /package/out/tools/{sub-venue → sub/venue}/table.js +0 -0
- /package/out/{adapters → us/adapters}/fcc-bdc/adapter.d.ts +0 -0
- /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/adapter.d.ts +0 -0
- /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.d.ts +0 -0
- /package/out/{adapters/state-hi-schools → us/adapters/state/hi-schools}/workbook.js +0 -0
- /package/out/{adapters/state-ia-contractors → us/adapters/state/ia-contractors}/adapter.d.ts +0 -0
- /package/out/{adapters/state-ny-notaries → us/adapters/state/ny-notaries}/adapter.d.ts +0 -0
- /package/out/{adapters/state-tx-notaries → us/adapters/state/tx-notaries}/adapter.d.ts +0 -0
- /package/out/{adapters → us/adapters}/tiger/street-decompose.d.ts +0 -0
- /package/out/{adapters → us/adapters}/tiger/street-decompose.js +0 -0
- /package/out/{adapters/usgov-hrsa-fqhc → us/adapters/usgov/hrsa-fqhc}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-imls-pls → us/adapters/usgov/imls-pls}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-irs-bmf → us/adapters/usgov/irs-bmf}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-nad → us/adapters/usgov/nad}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-nppes → us/adapters/usgov/nppes}/adapter.d.ts +0 -0
- /package/out/{adapters/usgov-samhsa-treatment-locator → us/adapters/usgov/samhsa-treatment-locator}/adapter.d.ts +0 -0
- /package/out/{recipes → ve/recipes}/reviewed-postcode-tail.d.ts +0 -0
- /package/out/{recipes → ve/recipes}/reviewed-postcode-tail.js +0 -0
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @copyright Sister Software
|
|
3
|
-
* @license AGPL-3.0
|
|
4
|
-
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* `fcc-bdc`: FCC Broadband Data Collection (BDC) — Fabric-derived location consumer.
|
|
7
|
-
*
|
|
8
|
-
* The first member of Phase 1.6's "adversarial sources" class. BDC ships the public-domain US
|
|
9
|
-
* broadband-serviceable-location (BSL) fabric: ~120M addresses keyed by stable `location_id`,
|
|
10
|
-
* carrying `address_primary` + `city` + `state` + `zip` + `zip_suffix`. Compared to the clean
|
|
11
|
-
* gazetteer rows from WOF / TIGER / BAN, BDC carries the chaos of address data that has passed
|
|
12
|
-
* through several layers of human entry + automated geocoding + revision: abbreviation drift,
|
|
13
|
-
* inconsistent unit designators, "RR" / "HC" / "PSC" rural-route shapes, embedded apartment /
|
|
14
|
-
* suite numbers that did not survive the address parser cleanly. This is the highest-signal,
|
|
15
|
-
* hardest-to-normalize address corpus in the federal public-domain catalog.
|
|
16
|
-
*
|
|
17
|
-
* Following the `tiger` / `wof-admin` pattern, this adapter consumes a SQLite database the operator
|
|
18
|
-
* pre-builds via the isp-nexus BDC ETL (`/srv/isp-nexus/sync/fcc/bdc/`) or any equivalent
|
|
19
|
-
* host-side pipeline. The mailwoman side does not download or parse the raw CSV/ZIP distribution
|
|
20
|
-
* directly — that keeps the adapter narrow and the BDC ingest pluggable.
|
|
21
|
-
*
|
|
22
|
-
* The SQLite schema is documented in README.md and modeled after `NTIARecord`
|
|
23
|
-
* (`isp-nexus/fcc/bdc/data-collection.ts`): one row per `location_id`. The adapter splits
|
|
24
|
-
* `address_primary` into `house_number` (leading numeric prefix, if any) + `street` (everything
|
|
25
|
-
* after), and combines `zip` + `zip_suffix` into the canonical USPS `postcode` slot.
|
|
26
|
-
*
|
|
27
|
-
* One CanonicalRow per fabric record. Unlike `tiger` (multiple postcode variants per segment) or
|
|
28
|
-
* `wof-admin` (multiple hierarchy variants per place), BDC records already represent fully
|
|
29
|
-
* specified addresses; no fan-out is warranted. Adversarial composition (Phase 1.6 §2.1) is the
|
|
30
|
-
* mechanism for deriving multiple training rows per BDC record.
|
|
31
|
-
*
|
|
32
|
-
* License: stamped `"Public Domain"` per the BDC fabric's US federal-government distribution terms.
|
|
33
|
-
* The CostQuest Fabric source data has its own license; consumers who substitute that path should
|
|
34
|
-
* re-stamp accordingly.
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
import type { BDCDatabase } from "@mailwoman/bdc/schema"
|
|
38
|
-
import { formatAddress, reconcileComponents } from "@mailwoman/formatter"
|
|
39
|
-
import { DatabaseClient } from "@mailwoman/sqlite/client"
|
|
40
|
-
|
|
41
|
-
import { splitStreetLine } from "#adapters/utils"
|
|
42
|
-
import { lookupStateAbbreviation } from "#codex/us-fips-state"
|
|
43
|
-
import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "#types"
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Registry id for this adapter. Stamped into every row it emits, so a corpus record can be traced back to the dataset
|
|
47
|
-
* it came from.
|
|
48
|
-
*/
|
|
49
|
-
export const FCC_BDC_ADAPTER_ID = "fcc-bdc"
|
|
50
|
-
/**
|
|
51
|
-
* License carried by this source (Public Domain), attached to each row so downstream consumers inherit the terms rather
|
|
52
|
-
* than having to look them up.
|
|
53
|
-
*/
|
|
54
|
-
export const FCC_BDC_DEFAULT_LICENSE = "Public Domain"
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* SQLite row shape — one row per BSL `location_id`. Columns mirror NTIARecord.
|
|
58
|
-
*/
|
|
59
|
-
interface BdcLocationRow {
|
|
60
|
-
location_id: number
|
|
61
|
-
address_primary: string
|
|
62
|
-
city: string
|
|
63
|
-
state: string
|
|
64
|
-
zip: string
|
|
65
|
-
zip_suffix: string | null
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Combine `zip` + optional `zip_suffix` into the canonical USPS postcode surface form.
|
|
70
|
-
*
|
|
71
|
-
* NTIARecord doc is ambiguous about whether `zip_suffix` is the 4-digit extension alone or the full ZIP+4 string. This
|
|
72
|
-
* handles both:
|
|
73
|
-
*
|
|
74
|
-
* - Bare 4-digit extension (`zip="94103"`, `zip_suffix="1234"`) → `"94103-1234"`
|
|
75
|
-
* - Already-joined form (`zip_suffix="94103-1234"`) → returned as-is
|
|
76
|
-
* - No suffix → bare `zip`
|
|
77
|
-
*
|
|
78
|
-
* Empty / whitespace-only suffix is treated as missing.
|
|
79
|
-
*/
|
|
80
|
-
export function buildPostcode(zip: string, suffix: string | null): string {
|
|
81
|
-
const z = zip.trim()
|
|
82
|
-
|
|
83
|
-
if (!z) return ""
|
|
84
|
-
const s = suffix?.trim() ?? ""
|
|
85
|
-
|
|
86
|
-
if (!s) return z
|
|
87
|
-
|
|
88
|
-
if (s.includes("-")) return s
|
|
89
|
-
|
|
90
|
-
return `${z}-${s}`
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Build a BDC adapter. Pure factory so multiple instances can be created in tests.
|
|
95
|
-
*/
|
|
96
|
-
export function createFccBdcAdapter(): CorpusAdapter {
|
|
97
|
-
return {
|
|
98
|
-
id: FCC_BDC_ADAPTER_ID,
|
|
99
|
-
defaultLicense: FCC_BDC_DEFAULT_LICENSE,
|
|
100
|
-
description:
|
|
101
|
-
"FCC Broadband Data Collection — Fabric-derived BSL addresses (public-domain); SQLite DB the operator builds via the isp-nexus BDC ETL.",
|
|
102
|
-
|
|
103
|
-
async *rows(opts: AdapterOptions): AsyncIterable<CanonicalRow> {
|
|
104
|
-
if (opts.country && opts.country !== "US") {
|
|
105
|
-
throw new Error(`fcc-bdc adapter: only US supported, got country=${opts.country}`)
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const db = new DatabaseClient<BDCDatabase>(opts.inputPath, { readOnly: true })
|
|
109
|
-
let emitted = 0
|
|
110
|
-
|
|
111
|
-
try {
|
|
112
|
-
const stmt = db.prepare(
|
|
113
|
-
`SELECT location_id, address_primary, city, state, zip, zip_suffix
|
|
114
|
-
FROM bdc_locations
|
|
115
|
-
ORDER BY location_id`
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
for (const row of stmt.iterate() as IterableIterator<BdcLocationRow>) {
|
|
119
|
-
if (opts.signal?.aborted) return
|
|
120
|
-
|
|
121
|
-
if (opts.limit !== undefined && emitted >= opts.limit) return
|
|
122
|
-
|
|
123
|
-
const split = splitStreetLine(row.address_primary ?? "")
|
|
124
|
-
|
|
125
|
-
if (!split) continue
|
|
126
|
-
const state = lookupStateAbbreviation(row.state)
|
|
127
|
-
|
|
128
|
-
if (!state) continue
|
|
129
|
-
const locality = row.city?.trim()
|
|
130
|
-
|
|
131
|
-
if (!locality) continue
|
|
132
|
-
const postcode = buildPostcode(row.zip ?? "", row.zip_suffix ?? null)
|
|
133
|
-
|
|
134
|
-
if (!postcode) continue
|
|
135
|
-
|
|
136
|
-
const components: CanonicalRow["components"] = {
|
|
137
|
-
...(split.house_number ? { house_number: split.house_number } : {}),
|
|
138
|
-
street: split.street,
|
|
139
|
-
locality,
|
|
140
|
-
region: state.abbreviation,
|
|
141
|
-
postcode,
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const raw = formatAddress(components, "US", { separator: ", " })
|
|
145
|
-
|
|
146
|
-
if (!raw) continue
|
|
147
|
-
const aligned = reconcileComponents(components, raw)
|
|
148
|
-
|
|
149
|
-
if (!Object.keys(aligned).length) continue
|
|
150
|
-
|
|
151
|
-
yield {
|
|
152
|
-
raw,
|
|
153
|
-
components: aligned,
|
|
154
|
-
country: "US",
|
|
155
|
-
locale: "en-US",
|
|
156
|
-
source: FCC_BDC_ADAPTER_ID,
|
|
157
|
-
source_id: `${FCC_BDC_ADAPTER_ID}-${row.location_id}`,
|
|
158
|
-
corpus_version: "",
|
|
159
|
-
license: FCC_BDC_DEFAULT_LICENSE,
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
emitted++
|
|
163
|
-
}
|
|
164
|
-
} finally {
|
|
165
|
-
await db.destroy()
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* The configured adapter instance registered with the corpus builder.
|
|
173
|
-
*/
|
|
174
|
-
export const fccBdcAdapter = createFccBdcAdapter()
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @copyright Sister Software
|
|
3
|
-
* @license AGPL-3.0
|
|
4
|
-
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* `geonames-postal`: GeoNames postal-code dump consumer (https://www.geonames.org/, CC-BY-4.0).
|
|
7
|
-
*
|
|
8
|
-
* The GeoNames postal export (`https://download.geonames.org/export/zip/<CC>.zip`) is a clean,
|
|
9
|
-
* per-country `postcode → place → admin1` table with the place + region NAMES inline (no aux-file
|
|
10
|
-
* join needed). It broadens the corpus's postcode→locality→region coverage to ~80 countries, well
|
|
11
|
-
* beyond `wof-postalcode`/the coordinate-first table — forward coverage for the multi-locale
|
|
12
|
-
* goal.
|
|
13
|
-
*
|
|
14
|
-
* Input: a per-country postal dump (`<CC>.txt`, 12 tab-separated columns, no header): country,
|
|
15
|
-
* postcode, place, admin1_name, admin1_code, admin2__, admin3__, lat, lon, accuracy.
|
|
16
|
-
*
|
|
17
|
-
* Output: per row, postcode-FIRST (international) variants — the common order for the non-US
|
|
18
|
-
* locales this fills (US postcodes are already covered by TIGER/WOF, which use postcode-LAST):
|
|
19
|
-
*
|
|
20
|
-
* 1. `{ postcode, locality }` → "AD100 Canillo"
|
|
21
|
-
* 2. `{ postcode, locality, region }` → "AD100 Canillo, Canillo" Prefer configuring this adapter for
|
|
22
|
-
* non-US countries; for US, the postcode-last sources are the right order. License:
|
|
23
|
-
* `"CC-BY-4.0"` per row (attribute "GeoNames").
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
import { reconcileComponents } from "@mailwoman/formatter"
|
|
27
|
-
import { TSVSpliterator } from "spliterator"
|
|
28
|
-
|
|
29
|
-
import { stableSourceID } from "#adapters/utils"
|
|
30
|
-
import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "#types"
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Registry id for this adapter. Stamped into every row it emits, so a corpus record can be traced back to the dataset
|
|
34
|
-
* it came from.
|
|
35
|
-
*/
|
|
36
|
-
export const GEONAMES_POSTAL_ADAPTER_ID = "geonames-postal"
|
|
37
|
-
/**
|
|
38
|
-
* License carried by this source (CC-BY-4.0), attached to each row so downstream consumers inherit the terms rather
|
|
39
|
-
* than having to look them up.
|
|
40
|
-
*/
|
|
41
|
-
export const GEONAMES_POSTAL_DEFAULT_LICENSE = "CC-BY-4.0"
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* GeoNames postal-dump columns (0-based): country, postcode, place, admin1_name, admin1_code, admin2_name, ….
|
|
45
|
-
*
|
|
46
|
-
* Shared with `tools/postcode-triples.ts`, which additionally reads `admin2Name` — the CITY for the IN/MX/PT-shaped
|
|
47
|
-
* exports whose `place` column is a street or colonia.
|
|
48
|
-
*/
|
|
49
|
-
export const GEONAMES_POSTAL_COLUMNS = { country: 0, postcode: 1, place: 2, admin1Name: 3, admin2Name: 5 } as const
|
|
50
|
-
|
|
51
|
-
export function createGeonamesPostalAdapter(): CorpusAdapter {
|
|
52
|
-
return {
|
|
53
|
-
id: GEONAMES_POSTAL_ADAPTER_ID,
|
|
54
|
-
defaultLicense: GEONAMES_POSTAL_DEFAULT_LICENSE,
|
|
55
|
-
description:
|
|
56
|
-
"GeoNames postcodes (CC-BY-4.0) — multi-locale postcode→locality→region, names inline; international postcode-first order.",
|
|
57
|
-
|
|
58
|
-
async *rows(opts: AdapterOptions): AsyncIterable<CanonicalRow> {
|
|
59
|
-
// `header: false` — the GeoNames postal dump is headerless, and the spliterator would
|
|
60
|
-
// otherwise consume row 1 as column names and lose its first postcode.
|
|
61
|
-
const rows = TSVSpliterator.fromAsync(opts.inputPath, { header: false })
|
|
62
|
-
|
|
63
|
-
let emitted = 0
|
|
64
|
-
|
|
65
|
-
for await (const rec of rows as AsyncIterable<string[]>) {
|
|
66
|
-
if (opts.signal?.aborted) break
|
|
67
|
-
|
|
68
|
-
if (opts.limit !== undefined && emitted >= opts.limit) break
|
|
69
|
-
|
|
70
|
-
const cc = (rec[GEONAMES_POSTAL_COLUMNS.country] ?? "").trim()
|
|
71
|
-
|
|
72
|
-
if (!cc) continue
|
|
73
|
-
|
|
74
|
-
if (opts.country && cc !== opts.country) continue
|
|
75
|
-
|
|
76
|
-
const postcode = (rec[GEONAMES_POSTAL_COLUMNS.postcode] ?? "").trim()
|
|
77
|
-
const locality = (rec[GEONAMES_POSTAL_COLUMNS.place] ?? "").trim()
|
|
78
|
-
|
|
79
|
-
if (!postcode || !locality) continue
|
|
80
|
-
const region = (rec[GEONAMES_POSTAL_COLUMNS.admin1Name] ?? "").trim()
|
|
81
|
-
|
|
82
|
-
// Postcode-first (international) variants. Skip the region variant when admin1 just
|
|
83
|
-
// repeats the place (common for city-states / micro-admin) to avoid "X X" noise.
|
|
84
|
-
const variants: Array<{ slot: string; comp: CanonicalRow["components"]; raw: string }> = [
|
|
85
|
-
{ slot: "pl", comp: { postcode, locality }, raw: `${postcode} ${locality}` },
|
|
86
|
-
]
|
|
87
|
-
|
|
88
|
-
if (region && region.toLowerCase() !== locality.toLowerCase()) {
|
|
89
|
-
variants.push({
|
|
90
|
-
slot: "plr",
|
|
91
|
-
comp: { postcode, locality, region },
|
|
92
|
-
raw: `${postcode} ${locality}, ${region}`,
|
|
93
|
-
})
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
for (const v of variants) {
|
|
97
|
-
if (opts.limit !== undefined && emitted >= opts.limit) break
|
|
98
|
-
const aligned = reconcileComponents(v.comp, v.raw)
|
|
99
|
-
|
|
100
|
-
if (Object.keys(aligned).length < 2) continue
|
|
101
|
-
|
|
102
|
-
yield {
|
|
103
|
-
raw: v.raw,
|
|
104
|
-
components: aligned,
|
|
105
|
-
country: cc,
|
|
106
|
-
source: GEONAMES_POSTAL_ADAPTER_ID,
|
|
107
|
-
source_id: `${stableSourceID(GEONAMES_POSTAL_ADAPTER_ID, aligned)}-${v.slot}`,
|
|
108
|
-
corpus_version: "",
|
|
109
|
-
license: GEONAMES_POSTAL_DEFAULT_LICENSE,
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
emitted++
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* The configured adapter instance registered with the corpus builder.
|
|
121
|
-
*/
|
|
122
|
-
export const geonamesPostalAdapter = createGeonamesPostalAdapter()
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @copyright Sister Software
|
|
3
|
-
* @license AGPL-3.0
|
|
4
|
-
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* G-NAF (Australia) corpus adapter — the parser-teaching half of #208.
|
|
7
|
-
*
|
|
8
|
-
* The model mis-parses Australian addresses in their native postcode-first / house-number-last
|
|
9
|
-
* order: it tags a leading 4-digit postcode as a house number (its US/EU prior) and swaps street
|
|
10
|
-
* ↔ locality with it. `scripts/eval/au-order-probe.ts` proved this is a word-ORDER coverage gap,
|
|
11
|
-
* not capability — the same addresses parse perfectly in canonical order (65% → 87% @25km if the
|
|
12
|
-
* parse were order-robust). EU survives the same eval because its postcodes are
|
|
13
|
-
* format-distinctive (a hyphenated `26-300` reads as a postcode anywhere); a bare AU `3053` only
|
|
14
|
-
* disambiguates by position.
|
|
15
|
-
*
|
|
16
|
-
* So this adapter renders each assembled G-NAF tuple (from {@link ./assemble}) in one of three real
|
|
17
|
-
* AU layouts — real-AU canonical (number-first, postcode-trailing), postcode-first,
|
|
18
|
-
* locality-first — ROTATED by row index (`i % 3`), so the locality + postcode each land in every
|
|
19
|
-
* position across the slice. This is the exact mechanism that fixed #148's v1.9.0 order-overfit
|
|
20
|
-
* for the 16 EU locales (`scripts/rerender-overture-multiorder.mjs`, v1.9.1 → shipped v4.13.0);
|
|
21
|
-
* AU was simply never in that train (`country_weights` had no AU, and `data_loader.py` excludes
|
|
22
|
-
* unlisted countries). Rotating one order per row (rather than emitting all three) keeps this a
|
|
23
|
-
* clean single-variable extension of the proven recipe + matches its source-mass structure. The
|
|
24
|
-
* corpus aligner BIO-labels each (every component surface form occurs verbatim in `raw`, so
|
|
25
|
-
* alignment lands).
|
|
26
|
-
*
|
|
27
|
-
* Input: the assembled component JSONL (one `{house_number,street,locality,region,postcode}` per
|
|
28
|
-
* line). Open G-NAF licence — attribute "Geoscape Australia".
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import { tryParsingJSON } from "@mailwoman/core/json"
|
|
32
|
-
import { reconcileComponents } from "@mailwoman/formatter"
|
|
33
|
-
import { TextSpliterator } from "spliterator"
|
|
34
|
-
|
|
35
|
-
import { stableSourceID } from "#adapters/utils"
|
|
36
|
-
import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "#types"
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Registry id for this adapter. Stamped into every row it emits, so a corpus record can be traced back to the dataset
|
|
40
|
-
* it came from.
|
|
41
|
-
*/
|
|
42
|
-
export const GNAF_ADAPTER_ID = "gnaf"
|
|
43
|
-
/**
|
|
44
|
-
* Open G-NAF is freely redistributable with attribution to Geoscape Australia (CC-BY-style).
|
|
45
|
-
*/
|
|
46
|
-
export const GNAF_DEFAULT_LICENSE = "CC-BY-4.0"
|
|
47
|
-
|
|
48
|
-
interface GNAFTuple {
|
|
49
|
-
house_number: string
|
|
50
|
-
street: string
|
|
51
|
-
locality: string
|
|
52
|
-
region?: string
|
|
53
|
-
postcode: string
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* The address layouts an AU address actually arrives in. The model already handles postcode-TRAILING (canonical); the
|
|
58
|
-
* two postcode-LEADING forms are the ones it fails, so they carry the change. We keep the canonical form too so the
|
|
59
|
-
* retrain doesn't forget it.
|
|
60
|
-
*/
|
|
61
|
-
function renderOrders(c: GNAFTuple): string[] {
|
|
62
|
-
const region = c.region ? ` ${c.region}` : ""
|
|
63
|
-
|
|
64
|
-
return [
|
|
65
|
-
// real-AU canonical: number-first, street, suburb [state] postcode — "50 Barry Street, Carlton NSW 2000"
|
|
66
|
-
`${c.house_number} ${c.street}, ${c.locality}${region} ${c.postcode}`,
|
|
67
|
-
// postcode-first (the dominant failure): "2000 Carlton, Barry Street 50"
|
|
68
|
-
`${c.postcode} ${c.locality}, ${c.street} ${c.house_number}`,
|
|
69
|
-
// locality-first: "Carlton, 2000, Barry Street 50"
|
|
70
|
-
`${c.locality}, ${c.postcode}, ${c.street} ${c.house_number}`,
|
|
71
|
-
]
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Build the G-NAF adapter. `inputPath` is the assembled component JSONL (see {@link ./assemble}); it is country-pinned
|
|
76
|
-
* to AU regardless of `opts.country` (G-NAF is Australia-only).
|
|
77
|
-
*/
|
|
78
|
-
export function createGNAFAdapter(): CorpusAdapter {
|
|
79
|
-
return {
|
|
80
|
-
id: GNAF_ADAPTER_ID,
|
|
81
|
-
defaultLicense: GNAF_DEFAULT_LICENSE,
|
|
82
|
-
description:
|
|
83
|
-
"G-NAF (Australia): assembled address tuples rendered in multiple word orders (canonical / postcode-first / locality-first) — teaches the model AU's postcode-first layout.",
|
|
84
|
-
|
|
85
|
-
async *rows(opts: AdapterOptions): AsyncIterable<CanonicalRow> {
|
|
86
|
-
let emitted = 0
|
|
87
|
-
let idx = 0
|
|
88
|
-
|
|
89
|
-
// Input is the assembled component JSONL (one tuple per line). TextSpliterator auto-disposes on
|
|
90
|
-
// loop completion and on an early `break` (abort / limit), so the old explicit handle teardown is
|
|
91
|
-
// gone; the parse tolerates a trailing CR on CRLF sources and the `!line.trim()` guard skips blanks.
|
|
92
|
-
// The render order rotates (i % 3), matching v1.9.1's rerender.
|
|
93
|
-
for await (const line of TextSpliterator.fromAsync(opts.inputPath)) {
|
|
94
|
-
if (opts.signal?.aborted) break
|
|
95
|
-
|
|
96
|
-
if (opts.limit !== undefined && emitted >= opts.limit) break
|
|
97
|
-
|
|
98
|
-
if (!line.trim()) continue
|
|
99
|
-
|
|
100
|
-
const t = tryParsingJSON<GNAFTuple>(line)
|
|
101
|
-
|
|
102
|
-
if (t === null) continue
|
|
103
|
-
|
|
104
|
-
if (!t.house_number || !t.street || !t.locality || !t.postcode) continue
|
|
105
|
-
|
|
106
|
-
const orders = renderOrders(t)
|
|
107
|
-
const order = idx % orders.length
|
|
108
|
-
|
|
109
|
-
idx++
|
|
110
|
-
const raw = orders[order]!
|
|
111
|
-
|
|
112
|
-
const components: CanonicalRow["components"] = {
|
|
113
|
-
house_number: t.house_number,
|
|
114
|
-
street: t.street,
|
|
115
|
-
locality: t.locality,
|
|
116
|
-
postcode: t.postcode,
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// region (state) rides only the canonical render (order 0); the postcode-leading layouts
|
|
120
|
-
// omit it (matching the eval's serialization) so it never breaks verbatim alignment.
|
|
121
|
-
if (order === 0 && t.region) {
|
|
122
|
-
components.region = t.region
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const aligned = reconcileComponents(components, raw)
|
|
126
|
-
|
|
127
|
-
if (!Object.keys(aligned).length) continue
|
|
128
|
-
|
|
129
|
-
yield {
|
|
130
|
-
raw,
|
|
131
|
-
components: aligned,
|
|
132
|
-
country: "AU",
|
|
133
|
-
locale: "en-AU",
|
|
134
|
-
source: GNAF_ADAPTER_ID,
|
|
135
|
-
source_id: `${stableSourceID(GNAF_ADAPTER_ID, aligned)}-o${order}`,
|
|
136
|
-
corpus_version: "",
|
|
137
|
-
license: GNAF_DEFAULT_LICENSE,
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
emitted++
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* The configured adapter instance registered with the corpus builder.
|
|
148
|
-
*/
|
|
149
|
-
export const gnafAdapter = createGNAFAdapter()
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @copyright Sister Software
|
|
3
|
-
* @license AGPL-3.0
|
|
4
|
-
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* Assemble a sampled, component-labeled Australian address set from G-NAF (the Geocoded National
|
|
7
|
-
* Address File — Geoscape Australia, Open G-NAF licence; any derived artifact must attribute
|
|
8
|
-
* "Geoscape Australia"). G-NAF is a relational PSV distribution (~16.9M addresses);
|
|
9
|
-
* reconstructing a street address joins three tables — ADDRESS_DETAIL (number, postcode, the
|
|
10
|
-
* PIDs) → STREET_LOCALITY (street name + type) → LOCALITY (suburb). State is the per-file prefix
|
|
11
|
-
* (ACT/NSW/…).
|
|
12
|
-
*
|
|
13
|
-
* Streaming + in-memory join via the house {@link PSVSpliterator} (pipe-separated; `mode: "object"`
|
|
14
|
-
* keys each row by its header) — NOT raw `read_csv` SQL, which a flat-file join doesn't need and
|
|
15
|
-
* which the #183–190 cleanup retired. The two lookup tables (STREET_LOCALITY ~765k rows, LOCALITY
|
|
16
|
-
* ~16k) fit as Maps; ADDRESS_DETAIL is streamed once and reservoir-sampled, so memory stays
|
|
17
|
-
* bounded (the OOM lesson from the Overture ingest).
|
|
18
|
-
*
|
|
19
|
-
* No coordinates: the output feeds the PARSER ({@link ../gnaf/adapter}, #208) — teaching the model
|
|
20
|
-
* AU's postcode-first / house-number-last word order, the gap `scripts/eval/au-order-probe.ts`
|
|
21
|
-
* pinned (65%→87% if the parse were order-robust). The parser needs the address string +
|
|
22
|
-
* component labels, not lat/lon.
|
|
23
|
-
*
|
|
24
|
-
* Output: component tuples as JSONL, consumed by the `gnaf` corpus adapter (which renders them in
|
|
25
|
-
* multiple orders + the corpus aligner BIO-labels them). An optional held-out eval set is
|
|
26
|
-
* excluded by (street, locality, postcode) so the training slice never overlaps the benchmark.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
import { readDirectory } from "@mailwoman/core/fs/readers"
|
|
30
|
-
import { openWriteStream } from "@mailwoman/core/fs/streams"
|
|
31
|
-
import { tryParsingJSON } from "@mailwoman/core/json"
|
|
32
|
-
import { join } from "path-ts"
|
|
33
|
-
import { PSVSpliterator, TextSpliterator } from "spliterator"
|
|
34
|
-
|
|
35
|
-
export interface GNAFAssembleOptions {
|
|
36
|
-
/**
|
|
37
|
-
* G-NAF `Standard` directory (holds the per-state `*_psv.psv` tables).
|
|
38
|
-
*/
|
|
39
|
-
standardDir: string
|
|
40
|
-
/**
|
|
41
|
-
* Target sample size (uniform reservoir → population-proportional across states).
|
|
42
|
-
*/
|
|
43
|
-
sampleSize: number
|
|
44
|
-
/**
|
|
45
|
-
* Output JSONL path.
|
|
46
|
-
*/
|
|
47
|
-
out: string
|
|
48
|
-
/**
|
|
49
|
-
* Optional held-out eval JSONL (rows with a `components` field) — its (street,locality,postcode) are excluded.
|
|
50
|
-
*/
|
|
51
|
-
holdoutPath?: string
|
|
52
|
-
/**
|
|
53
|
-
* Progress sink (the CLI passes a setter).
|
|
54
|
-
*/
|
|
55
|
-
onProgress?: (message: string) => void
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export interface GNAFAssembleResult {
|
|
59
|
-
written: number
|
|
60
|
-
seen: number
|
|
61
|
-
heldOut: number
|
|
62
|
-
byState: Record<string, number>
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* UPPERCASE → Title Case, preserving intra-word apostrophes/hyphens (O'Brien, Coff's Harbour).
|
|
67
|
-
*/
|
|
68
|
-
export function titlecase(s: string): string {
|
|
69
|
-
return s
|
|
70
|
-
.toLowerCase()
|
|
71
|
-
.replaceAll(/(^|[\s'\-/])([a-z])/g, (_m, p: string, c: string) => p + c.toUpperCase())
|
|
72
|
-
.trim()
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Holdout/dedup key: a street within a locality+postcode (house-number-agnostic — conservative).
|
|
77
|
-
*/
|
|
78
|
-
export function gnafHoldoutKey(street: string, locality: string, postcode: string): string {
|
|
79
|
-
return `${street}|${locality}|${postcode}`.toLowerCase()
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
type Row = Record<string, string | number | undefined>
|
|
83
|
-
|
|
84
|
-
async function* psvObjects(path: string): AsyncIterable<Row> {
|
|
85
|
-
yield* PSVSpliterator.fromAsync(path, { mode: "object", header: true }) as AsyncIterable<Row>
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Load a small lookup table fully into a Map keyed by `keyCol`.
|
|
90
|
-
*/
|
|
91
|
-
async function loadMap<V>(paths: string[], keyCol: string, pick: (r: Row) => V): Promise<Map<string, V>> {
|
|
92
|
-
const m = new Map<string, V>()
|
|
93
|
-
|
|
94
|
-
for (const p of paths) {
|
|
95
|
-
for await (const r of psvObjects(p)) {
|
|
96
|
-
const k = r[keyCol]
|
|
97
|
-
|
|
98
|
-
if (k != null && k !== "") {
|
|
99
|
-
m.set(String(k), pick(r))
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return m
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Build the held-out key set from an eval JSONL whose rows carry a `components` object.
|
|
109
|
-
*/
|
|
110
|
-
async function loadHoldout(path: string): Promise<Set<string>> {
|
|
111
|
-
const keys = new Set<string>()
|
|
112
|
-
|
|
113
|
-
for await (const line of TextSpliterator.fromAsync(path)) {
|
|
114
|
-
if (!line.trim()) continue
|
|
115
|
-
|
|
116
|
-
const c = tryParsingJSON<{ components?: Record<string, string> }>(line)?.components
|
|
117
|
-
|
|
118
|
-
if (c?.street && c?.locality && c?.postcode) {
|
|
119
|
-
keys.add(gnafHoldoutKey(c.street, c.locality, c.postcode))
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return keys
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export async function assembleGNAF(opts: GNAFAssembleOptions): Promise<GNAFAssembleResult> {
|
|
127
|
-
const progress = opts.onProgress ?? (() => {})
|
|
128
|
-
const files = await readDirectory(opts.standardDir)
|
|
129
|
-
|
|
130
|
-
const pick = (re: RegExp, exclude?: RegExp) =>
|
|
131
|
-
files.filter((f) => re.test(f) && !(exclude && exclude.test(f))).map((f) => join(opts.standardDir, f))
|
|
132
|
-
|
|
133
|
-
// `*_LOCALITY_psv.psv` also globs `*_STREET_LOCALITY_psv.psv` — exclude the latter explicitly.
|
|
134
|
-
const streetPaths = pick(/_STREET_LOCALITY_psv\.psv$/)
|
|
135
|
-
const localityPaths = pick(/_LOCALITY_psv\.psv$/, /_STREET_LOCALITY_psv\.psv$/)
|
|
136
|
-
const addressPaths = pick(/_ADDRESS_DETAIL_psv\.psv$/)
|
|
137
|
-
|
|
138
|
-
const holdout = opts.holdoutPath ? await loadHoldout(opts.holdoutPath) : new Set<string>()
|
|
139
|
-
|
|
140
|
-
if (opts.holdoutPath) {
|
|
141
|
-
progress(`held-out eval keys: ${holdout.size}`)
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
progress(`loading STREET_LOCALITY (${streetPaths.length} files) + LOCALITY (${localityPaths.length})…`)
|
|
145
|
-
|
|
146
|
-
const streetMap = await loadMap(streetPaths, "STREET_LOCALITY_PID", (r) => ({
|
|
147
|
-
name: String(r.STREET_NAME ?? ""),
|
|
148
|
-
type: String(r.STREET_TYPE_CODE ?? ""),
|
|
149
|
-
suffix: String(r.STREET_SUFFIX_CODE ?? ""),
|
|
150
|
-
}))
|
|
151
|
-
|
|
152
|
-
const localityMap = await loadMap(localityPaths, "LOCALITY_PID", (r) => String(r.LOCALITY_NAME ?? ""))
|
|
153
|
-
progress(`streets=${streetMap.size.toLocaleString()} localities=${localityMap.size.toLocaleString()}`)
|
|
154
|
-
|
|
155
|
-
const reservoir: Array<{ house_number: string; street: string; locality: string; region: string; postcode: string }> =
|
|
156
|
-
[]
|
|
157
|
-
|
|
158
|
-
let seen = 0
|
|
159
|
-
let heldOut = 0
|
|
160
|
-
|
|
161
|
-
for (const p of addressPaths) {
|
|
162
|
-
const state = (p.match(/\/([A-Z]+)_ADDRESS_DETAIL/) ?? [])[1] ?? ""
|
|
163
|
-
|
|
164
|
-
for await (const r of psvObjects(p)) {
|
|
165
|
-
const numberFirst = String(r.NUMBER_FIRST ?? "")
|
|
166
|
-
|
|
167
|
-
if (!numberFirst || r.DATE_RETIRED || !r.POSTCODE) continue
|
|
168
|
-
const st = streetMap.get(String(r.STREET_LOCALITY_PID ?? ""))
|
|
169
|
-
const suburbRaw = localityMap.get(String(r.LOCALITY_PID ?? ""))
|
|
170
|
-
|
|
171
|
-
if (!st?.name || !suburbRaw) continue
|
|
172
|
-
const street = `${titlecase(st.name)} ${titlecase(st.type)}${st.suffix ? " " + titlecase(st.suffix) : ""}`.trim()
|
|
173
|
-
const locality = titlecase(suburbRaw)
|
|
174
|
-
const postcode = String(r.POSTCODE)
|
|
175
|
-
|
|
176
|
-
if (holdout.has(gnafHoldoutKey(street, locality, postcode))) {
|
|
177
|
-
heldOut++
|
|
178
|
-
|
|
179
|
-
continue
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
let house = numberFirst + (r.NUMBER_FIRST_SUFFIX ? String(r.NUMBER_FIRST_SUFFIX) : "")
|
|
183
|
-
|
|
184
|
-
if (r.NUMBER_LAST) {
|
|
185
|
-
house = `${house}-${String(r.NUMBER_LAST)}`
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (r.FLAT_NUMBER) {
|
|
189
|
-
house = `${String(r.FLAT_NUMBER)}/${house}`
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const tuple = { house_number: house, street, locality, region: state, postcode }
|
|
193
|
-
|
|
194
|
-
seen++
|
|
195
|
-
|
|
196
|
-
if (reservoir.length < opts.sampleSize) {
|
|
197
|
-
reservoir.push(tuple)
|
|
198
|
-
} else {
|
|
199
|
-
const j = Math.floor(Math.random() * seen)
|
|
200
|
-
|
|
201
|
-
if (j < opts.sampleSize) {
|
|
202
|
-
reservoir[j] = tuple
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
progress(`${state}: ${seen.toLocaleString()} valid joinable seen`)
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
const out = openWriteStream(opts.out)
|
|
211
|
-
const byState: Record<string, number> = {}
|
|
212
|
-
|
|
213
|
-
for (const t of reservoir) {
|
|
214
|
-
out.write(JSON.stringify(t) + "\n")
|
|
215
|
-
byState[t.region] = (byState[t.region] ?? 0) + 1
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
await new Promise<void>((res) => {
|
|
219
|
-
out.end(res)
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
progress(`wrote ${reservoir.length.toLocaleString()} tuples → ${opts.out}`)
|
|
223
|
-
|
|
224
|
-
return { written: reservoir.length, seen, heldOut, byState }
|
|
225
|
-
}
|