@mailwoman/corpus 9.4.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/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/recipes/bare/postcode/eval.ts +99 -0
- package/lib/recipes/bare/postcode/index.ts +327 -0
- package/lib/recipes/country-balanced.ts +1 -1
- package/lib/recipes/index.ts +28 -21
- package/lib/recipes/intersection.ts +1 -1
- 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 -41
- package/lib/recipes/street/affix.ts +807 -0
- 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 +6 -1
- package/lib/recipes/unit.ts +1 -1
- package/lib/sg/recipes/register.ts +270 -0
- package/lib/sg/tools/fetch/acra.ts +179 -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 +30 -30
- 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/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/country-balanced.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.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 -0
- package/out/recipes/scaffold.d.ts.map +1 -1
- package/out/recipes/scaffold.js +18 -37
- 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/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 +6 -1
- package/out/recipes/trailing-region.js.map +1 -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 +30 -30
- package/out/tools/fetch/index.d.ts.map +1 -1
- package/out/tools/fetch/index.js +30 -30
- 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/recipes/fr-admin-split.ts +0 -243
- package/lib/recipes/fr-bare-street.ts +0 -171
- package/lib/recipes/fr-fragment.ts +0 -334
- package/lib/recipes/fr-lieudit.ts +0 -301
- package/lib/recipes/fr-order.ts +0 -246
- package/lib/recipes/german.ts +0 -360
- package/lib/recipes/locale.ts +0 -600
- package/lib/recipes/po-box-cedex.ts +0 -976
- package/lib/recipes/po-box.ts +0 -124
- package/lib/recipes/street-affix.ts +0 -805
- package/lib/recipes/sub-venue-sources.ts +0 -878
- package/lib/recipes/sub-venue.ts +0 -998
- package/lib/synthesizers/german.ts +0 -260
- package/lib/tools/fetch/acra-sg.ts +0 -174
- package/lib/tools/fetch/ban.ts +0 -289
- package/lib/tools/fetch/download.ts +0 -477
- package/lib/tools/fetch/gcis-tw.ts +0 -175
- package/lib/tools/fetch/geonames-dump.ts +0 -257
- package/lib/tools/fetch/geonames-postal.ts +0 -180
- package/lib/tools/fetch/houjin-jp.ts +0 -135
- package/lib/tools/fetch/hrsa.ts +0 -59
- package/lib/tools/fetch/imls-pls.ts +0 -149
- package/lib/tools/fetch/juso-kr.ts +0 -165
- package/lib/tools/fetch/localdata-kr.ts +0 -194
- 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 -686
- 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/recipes/bare-country.d.ts +0 -25
- package/out/recipes/bare-country.d.ts.map +0 -1
- package/out/recipes/bare-country.js +0 -88
- 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 -101
- 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 -144
- 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 -277
- 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 -198
- 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 -289
- 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 -103
- 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 -183
- 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 -114
- 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 -72
- 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 -768
- 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 -101
- 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 -89
- 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 -87
- 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 -654
- 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 -726
- 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/acra-sg.d.ts +0 -23
- package/out/tools/fetch/acra-sg.d.ts.map +0 -1
- package/out/tools/fetch/acra-sg.js +0 -126
- package/out/tools/fetch/acra-sg.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 -182
- package/out/tools/fetch/download.d.ts.map +0 -1
- package/out/tools/fetch/download.js +0 -318
- package/out/tools/fetch/download.js.map +0 -1
- package/out/tools/fetch/gcis-tw.d.ts +0 -23
- package/out/tools/fetch/gcis-tw.d.ts.map +0 -1
- package/out/tools/fetch/gcis-tw.js +0 -135
- package/out/tools/fetch/gcis-tw.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/houjin-jp.d.ts +0 -24
- package/out/tools/fetch/houjin-jp.d.ts.map +0 -1
- package/out/tools/fetch/houjin-jp.js +0 -102
- package/out/tools/fetch/houjin-jp.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/juso-kr.d.ts +0 -30
- package/out/tools/fetch/juso-kr.d.ts.map +0 -1
- package/out/tools/fetch/juso-kr.js +0 -120
- package/out/tools/fetch/juso-kr.js.map +0 -1
- package/out/tools/fetch/localdata-kr.d.ts +0 -30
- package/out/tools/fetch/localdata-kr.d.ts.map +0 -1
- package/out/tools/fetch/localdata-kr.js +0 -139
- package/out/tools/fetch/localdata-kr.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 -439
- 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/{recipes/cz-pcfirst-preposition.ts → cz/recipes/pcfirst-preposition.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/{recipes/nl-postcode.ts → nl/recipes/postcode.ts} +0 -0
- /package/lib/{recipes/no-fragment.ts → no/recipes/fragment.ts} +0 -0
- /package/lib/{recipes/no-street.ts → no/recipes/street/index.ts} +0 -0
- /package/lib/{recipes/no-street-led.ts → no/recipes/street/led.ts} +0 -0
- /package/lib/recipes/{bare-country.ts → bare/country.ts} +0 -0
- /package/lib/recipes/{street-bare.ts → street/bare.ts} +0 -0
- /package/lib/{recipes/si-bare-village.ts → si/recipes/bare-village.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
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Fetch the GeoNames per-country postal-code exports — the only source in this family that carries a
|
|
7
|
+
* `(postcode, locality, region)` triple with the NAMES inline.
|
|
8
|
+
*
|
|
9
|
+
* Source : https://download.geonames.org/export/zip/<CC>.zip
|
|
10
|
+
* License: CC-BY-4.0, attribute "GeoNames". Tier B.
|
|
11
|
+
*
|
|
12
|
+
* ## Why this source and not a join
|
|
13
|
+
*
|
|
14
|
+
* A postcode slice is only useful to the corpus if a postcode reaches a locality and a region. Two routes exist and
|
|
15
|
+
* only one of them works everywhere:
|
|
16
|
+
*
|
|
17
|
+
* - **`parent_id`** — `postalcode-intl.db` carries a real parent that resolves in the admin gazetteer (measured: NL
|
|
18
|
+
* 97.5% of rows linked, FR 90.7%, DE 66.1%, ES 34.9%, IT 27.4%, and 93.8–100% of those resolve to a
|
|
19
|
+
* `locality`/`localadmin`). It is also the ONLY slice that does: `postalcode-geonames-intl.db` and every
|
|
20
|
+
* `postalcode-<cc>-overture.db` carry `parent_id = 0` on every row, so five countries have this route and the rest
|
|
21
|
+
* have none.
|
|
22
|
+
* - **Nearest locality centroid** — the obvious fallback, and it does not work. Scored against the `parent_id` truth
|
|
23
|
+
* on 1,000–1,500 postcodes per country: NL 81.1%, DE 44.7%, ES 35.1%, FR 29.0%, IT 13.5%. A locality's centroid
|
|
24
|
+
* sits at its middle, so a postcode near the edge is routinely closer to a neighbouring town's centroid than to its
|
|
25
|
+
* own. Under 50% for four of the five, which is not a join.
|
|
26
|
+
*
|
|
27
|
+
* The GeoNames export sidesteps both: columns 3 and 4 ARE the place and admin1 names, so there is nothing to join and
|
|
28
|
+
* nothing to approximate. `@mailwoman/corpus`'s `geonames-postal` adapter consumes it directly.
|
|
29
|
+
*
|
|
30
|
+
* ## Coverage is not universal, and the gap is the point
|
|
31
|
+
*
|
|
32
|
+
* GeoNames publishes ~80 countries, NOT all of them. Venezuela returns 404 — so a VE postcode slice cannot be built
|
|
33
|
+
* from this source at any effort, and that is an acquisition question rather than a build one. Ask for a country
|
|
34
|
+
* before assuming it is there; an absent country fails as one entry, never as the whole run.
|
|
35
|
+
*
|
|
36
|
+
* ## Row counts from this source overstate, for some countries by exactly 2×
|
|
37
|
+
*
|
|
38
|
+
* Countries whose postcode format contains a hyphen are published TWICE — once `3750-000`, once `3750000`. Measured
|
|
39
|
+
* on the slice built from this source: PT 395,544 rows over 197,772 distinct codes and PL 40,598 over 20,299, both
|
|
40
|
+
* exactly 2.00×, while AU, CZ and AT (no hyphen in the format) are 1.00×. A consumer sizing a slice from the row
|
|
41
|
+
* count doubles its estimate for those countries.
|
|
42
|
+
*
|
|
43
|
+
* ## Why `downloadToFile` and not `APIClient`
|
|
44
|
+
*
|
|
45
|
+
* Same split `AGENTS.md` draws and the `ourairports` sibling explains: these are static file transfers from a plain
|
|
46
|
+
* file host, run once per refresh. The pacing, retry and caching `APIClient` exists for have nothing to act on here.
|
|
47
|
+
*
|
|
48
|
+
* Invoke via `mailwoman corpus fetch geonames-postal --countries pt,au,nz`.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
import { makeDirectories } from "@mailwoman/core/fs/writers"
|
|
52
|
+
import { sha256File } from "@mailwoman/core/hash"
|
|
53
|
+
import { join } from "path-ts"
|
|
54
|
+
|
|
55
|
+
import type { BaseFetchOptions, FetchSummary } from "#tools/fetch/download/index"
|
|
56
|
+
import { downloadToFile, HTTPStatusError, writeManifest } from "#tools/fetch/download/index"
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The one status that means "the source does not publish this country" rather than "the transfer failed".
|
|
60
|
+
*/
|
|
61
|
+
const HTTP_NOT_FOUND = 404
|
|
62
|
+
|
|
63
|
+
const SLUG = "geonames-postal"
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* GeoNames' own export directory. One zip per ISO alpha-2 code, each holding `<CC>.txt` plus the shared `readme.txt`.
|
|
67
|
+
*/
|
|
68
|
+
const BASE_URL = "https://download.geonames.org/export/zip"
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Countries fetched when the caller names none.
|
|
72
|
+
*
|
|
73
|
+
* These are the ones the corpus wants and cannot get from `postalcode-intl.db`'s `parent_id` route — see the header for
|
|
74
|
+
* why that route covers exactly five countries. Venezuela is deliberately absent because GeoNames does not publish it.
|
|
75
|
+
*/
|
|
76
|
+
export const GEONAMES_POSTAL_DEFAULT_COUNTRIES = ["PT", "AU", "NZ", "IE", "BR", "ZA", "MX"] as const
|
|
77
|
+
|
|
78
|
+
export interface FetchGeonamesPostalOptions extends BaseFetchOptions {
|
|
79
|
+
/**
|
|
80
|
+
* ISO alpha-2 codes, in any casing. Defaults to {@linkcode GEONAMES_POSTAL_DEFAULT_COUNTRIES}.
|
|
81
|
+
*/
|
|
82
|
+
countries?: readonly string[]
|
|
83
|
+
/**
|
|
84
|
+
* Export directory to read from. Defaults to GeoNames' own. Exists so the 404-is-a-coverage-finding behaviour can be
|
|
85
|
+
* exercised against a local server rather than by asking GeoNames for a country it does not have.
|
|
86
|
+
*/
|
|
87
|
+
baseURL?: string
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
interface GeonamesPostalFileEntry {
|
|
91
|
+
country: string
|
|
92
|
+
filename: string
|
|
93
|
+
source_url: string
|
|
94
|
+
sha256: string
|
|
95
|
+
bytes: number
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
interface GeonamesPostalManifest {
|
|
99
|
+
source: string
|
|
100
|
+
base_url: string
|
|
101
|
+
license: string
|
|
102
|
+
attribution: string
|
|
103
|
+
downloaded_at: string
|
|
104
|
+
files: GeonamesPostalFileEntry[]
|
|
105
|
+
/**
|
|
106
|
+
* Countries asked for and NOT published by GeoNames, recorded so a later reader does not spend the fetch again to
|
|
107
|
+
* rediscover it. An absence here is a fact about the source, not about the run.
|
|
108
|
+
*/
|
|
109
|
+
unavailable: string[]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Download the requested GeoNames postal zips into `<outRoot>/geonames-postal/`, with a sibling `MANIFEST.json`
|
|
114
|
+
* carrying each file's origin URL, sha256 and byte count, plus the countries the source does not publish.
|
|
115
|
+
*
|
|
116
|
+
* A country the source does not carry is counted as failed and named in `failedCodes` — it does not stop the rest.
|
|
117
|
+
*/
|
|
118
|
+
export async function fetchGeonamesPostal(
|
|
119
|
+
options: FetchGeonamesPostalOptions,
|
|
120
|
+
report?: (line: string) => void
|
|
121
|
+
): Promise<FetchSummary> {
|
|
122
|
+
const destDir = join(options.outRoot, SLUG)
|
|
123
|
+
await makeDirectories(destDir)
|
|
124
|
+
|
|
125
|
+
const countries = (options.countries ?? GEONAMES_POSTAL_DEFAULT_COUNTRIES).map((code) => code.trim().toUpperCase())
|
|
126
|
+
const baseURL = options.baseURL ?? BASE_URL
|
|
127
|
+
const retryDelayMs = options.retryDelayMs
|
|
128
|
+
const entries: GeonamesPostalFileEntry[] = []
|
|
129
|
+
const failedCodes: string[] = []
|
|
130
|
+
const unavailable: string[] = []
|
|
131
|
+
let fetched = 0
|
|
132
|
+
let failed = 0
|
|
133
|
+
|
|
134
|
+
for (const country of countries) {
|
|
135
|
+
const filename = `${country}.zip`
|
|
136
|
+
const url = `${baseURL}/${filename}`
|
|
137
|
+
const dest = join(destDir, filename)
|
|
138
|
+
|
|
139
|
+
report?.(`=== ${SLUG} / ${country}`)
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
const { bytes } = await downloadToFile({ url, dest, timeoutMs: 300_000, retries: 2, retryDelayMs, report })
|
|
143
|
+
|
|
144
|
+
entries.push({ country, filename, source_url: url, sha256: await sha256File(dest), bytes })
|
|
145
|
+
|
|
146
|
+
fetched++
|
|
147
|
+
} catch (error) {
|
|
148
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
149
|
+
|
|
150
|
+
// A 404 here means GeoNames does not publish the country at all, which is a different finding from a failed
|
|
151
|
+
// transfer and the one a caller planning a slice needs to see. Branch on the TYPED status: matching message
|
|
152
|
+
// prose classified a 500 as "unpublished" whenever the URL happened to contain the substring 404 — an
|
|
153
|
+
// ephemeral test-server port did exactly that in CI.
|
|
154
|
+
if (error instanceof HTTPStatusError && error.status === HTTP_NOT_FOUND) {
|
|
155
|
+
report?.(`✗ ${country}: GeoNames does not publish a postal export for this country`)
|
|
156
|
+
unavailable.push(country)
|
|
157
|
+
} else {
|
|
158
|
+
report?.(`✗ ${country}: ${message}`)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
failedCodes.push(country)
|
|
162
|
+
|
|
163
|
+
failed++
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const manifest: GeonamesPostalManifest = {
|
|
168
|
+
source: "GeoNames postal codes",
|
|
169
|
+
base_url: baseURL,
|
|
170
|
+
license: "CC-BY-4.0",
|
|
171
|
+
attribution: "GeoNames",
|
|
172
|
+
downloaded_at: new Date().toISOString(),
|
|
173
|
+
files: entries,
|
|
174
|
+
unavailable,
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
await writeManifest(join(destDir, "MANIFEST.json"), manifest)
|
|
178
|
+
|
|
179
|
+
return { fetched, skipped: 0, failed, failedCodes }
|
|
180
|
+
}
|
package/lib/tools/fetch/index.ts
CHANGED
|
@@ -109,42 +109,42 @@
|
|
|
109
109
|
* 5. Add the source's adapter (or extend an existing one) under `corpus/src/adapters/`.
|
|
110
110
|
*/
|
|
111
111
|
|
|
112
|
-
import {
|
|
113
|
-
import {
|
|
114
|
-
import {
|
|
115
|
-
import {
|
|
116
|
-
import {
|
|
117
|
-
import {
|
|
118
|
-
import {
|
|
119
|
-
import { fetchIMLSPLS } from "#tools/fetch/imls-pls"
|
|
120
|
-
import { fetchJusoKR } from "#tools/fetch/juso-kr"
|
|
121
|
-
import { fetchLocaldataKR } from "#tools/fetch/localdata-kr"
|
|
122
|
-
import { fetchNAD } from "#tools/fetch/nad"
|
|
123
|
-
import { fetchNPPES } from "#tools/fetch/nppes"
|
|
112
|
+
import { fetchBan } from "#fr/tools/fetch/ban"
|
|
113
|
+
import { fetchHoujinJP } from "#jp/tools/fetch/houjin"
|
|
114
|
+
import { fetchJusoKR } from "#kr/tools/fetch/juso"
|
|
115
|
+
import { fetchLocaldataKR } from "#kr/tools/fetch/localdata"
|
|
116
|
+
import { fetchACRASG } from "#sg/tools/fetch/acra"
|
|
117
|
+
import { fetchGeonamesDumps } from "#tools/fetch/geonames/dump"
|
|
118
|
+
import { fetchGeonamesPostal } from "#tools/fetch/geonames/postal"
|
|
124
119
|
import { fetchOpenAddresses } from "#tools/fetch/openaddresses"
|
|
125
120
|
import { fetchOurAirports } from "#tools/fetch/ourairports"
|
|
126
|
-
import { fetchStateHISchools } from "#tools/fetch/state-hi-schools"
|
|
127
|
-
import { fetchStateSources } from "#tools/fetch/state-sources"
|
|
128
|
-
import { fetchTigerFull } from "#tools/fetch/tiger-full"
|
|
129
121
|
import { fetchWikidataSubVenue } from "#tools/fetch/wikidata-subvenue"
|
|
122
|
+
import { fetchGCISTW } from "#tw/tools/fetch/gcis"
|
|
123
|
+
import { fetchHRSA } from "#us/tools/fetch/hrsa"
|
|
124
|
+
import { fetchIMLSPLS } from "#us/tools/fetch/imls-pls"
|
|
125
|
+
import { fetchNAD } from "#us/tools/fetch/nad"
|
|
126
|
+
import { fetchNPPES } from "#us/tools/fetch/nppes"
|
|
127
|
+
import { fetchStateHISchools } from "#us/tools/fetch/state/hi-schools"
|
|
128
|
+
import { fetchStateSources } from "#us/tools/fetch/state/sources"
|
|
129
|
+
import { fetchTigerFull } from "#us/tools/fetch/tiger-full"
|
|
130
130
|
|
|
131
|
-
export * from "#tools/fetch/acra
|
|
132
|
-
export * from "#tools/fetch/ban"
|
|
133
|
-
export * from "#tools/fetch/gcis
|
|
134
|
-
export * from "#tools/fetch/geonames
|
|
135
|
-
export * from "#tools/fetch/geonames
|
|
136
|
-
export * from "#tools/fetch/houjin
|
|
137
|
-
export * from "#tools/fetch/hrsa"
|
|
138
|
-
export * from "#tools/fetch/imls-pls"
|
|
139
|
-
export * from "#tools/fetch/juso
|
|
140
|
-
export * from "#tools/fetch/localdata
|
|
141
|
-
export * from "#tools/fetch/nad"
|
|
142
|
-
export * from "#tools/fetch/nppes"
|
|
131
|
+
export * from "#sg/tools/fetch/acra"
|
|
132
|
+
export * from "#fr/tools/fetch/ban"
|
|
133
|
+
export * from "#tw/tools/fetch/gcis"
|
|
134
|
+
export * from "#tools/fetch/geonames/dump"
|
|
135
|
+
export * from "#tools/fetch/geonames/postal"
|
|
136
|
+
export * from "#jp/tools/fetch/houjin"
|
|
137
|
+
export * from "#us/tools/fetch/hrsa"
|
|
138
|
+
export * from "#us/tools/fetch/imls-pls"
|
|
139
|
+
export * from "#kr/tools/fetch/juso"
|
|
140
|
+
export * from "#kr/tools/fetch/localdata"
|
|
141
|
+
export * from "#us/tools/fetch/nad"
|
|
142
|
+
export * from "#us/tools/fetch/nppes"
|
|
143
143
|
export * from "#tools/fetch/openaddresses"
|
|
144
144
|
export * from "#tools/fetch/ourairports"
|
|
145
|
-
export * from "#tools/fetch/state
|
|
146
|
-
export * from "#tools/fetch/state
|
|
147
|
-
export * from "#tools/fetch/tiger-full"
|
|
145
|
+
export * from "#us/tools/fetch/state/hi-schools"
|
|
146
|
+
export * from "#us/tools/fetch/state/sources"
|
|
147
|
+
export * from "#us/tools/fetch/tiger-full"
|
|
148
148
|
export * from "#tools/fetch/wikidata-subvenue"
|
|
149
149
|
|
|
150
150
|
/**
|
|
@@ -63,8 +63,8 @@ import { isoSeconds } from "@mailwoman/core/utils"
|
|
|
63
63
|
import { join } from "path-ts"
|
|
64
64
|
|
|
65
65
|
import { $private } from "#env"
|
|
66
|
-
import type { BaseFetchOptions, FetchSummary } from "#tools/fetch/download"
|
|
67
|
-
import { streamDownload, writeManifest } from "#tools/fetch/download"
|
|
66
|
+
import type { BaseFetchOptions, FetchSummary } from "#tools/fetch/download/index"
|
|
67
|
+
import { streamDownload, writeManifest } from "#tools/fetch/download/index"
|
|
68
68
|
|
|
69
69
|
/**
|
|
70
70
|
* Bytes per KiB — the divisor for human-readable sizes, and the floor below which a "download" is an error page rather
|
|
@@ -41,8 +41,8 @@ import { makeDirectories } from "@mailwoman/core/fs/writers"
|
|
|
41
41
|
import { sha256File } from "@mailwoman/core/hash"
|
|
42
42
|
import { join } from "path-ts"
|
|
43
43
|
|
|
44
|
-
import type { BaseFetchOptions, FetchSummary } from "#tools/fetch/download"
|
|
45
|
-
import { downloadToFile, writeManifest } from "#tools/fetch/download"
|
|
44
|
+
import type { BaseFetchOptions, FetchSummary } from "#tools/fetch/download/index"
|
|
45
|
+
import { downloadToFile, writeManifest } from "#tools/fetch/download/index"
|
|
46
46
|
|
|
47
47
|
const SLUG = "ourairports"
|
|
48
48
|
|
package/lib/tools/fetch/ppd.ts
CHANGED
|
@@ -90,11 +90,9 @@ export async function extractPPDTuples(
|
|
|
90
90
|
*/
|
|
91
91
|
async function runPPDExtract(inputPath: string, outputPath: string): Promise<PPDExtractStats> {
|
|
92
92
|
// No `encoding` — CSVSpliterator delimits raw bytes and decodes utf-8 itself (see readTuples in
|
|
93
|
-
// recipes/locale.ts). `header: false` yields every row as data — PPD ships no header row.
|
|
93
|
+
// recipes/international/locale.ts). `header: false` yields every row as data — PPD ships no header row.
|
|
94
94
|
const rows = CSVSpliterator.fromAsync<string[]>(openReadStream(inputPath), {
|
|
95
|
-
mode: "array",
|
|
96
95
|
header: false,
|
|
97
|
-
enableQuoteHandling: true,
|
|
98
96
|
})
|
|
99
97
|
|
|
100
98
|
const out = openWriteStream(outputPath, { encoding: "utf8" })
|
|
@@ -60,8 +60,8 @@ import { makeDirectories, writeLocalFile } from "@mailwoman/core/fs/writers"
|
|
|
60
60
|
import { sha256File } from "@mailwoman/core/hash"
|
|
61
61
|
import { join } from "path-ts"
|
|
62
62
|
|
|
63
|
-
import type { BaseFetchOptions, FetchSummary } from "#tools/fetch/download"
|
|
64
|
-
import { writeManifest } from "#tools/fetch/download"
|
|
63
|
+
import type { BaseFetchOptions, FetchSummary } from "#tools/fetch/download/index"
|
|
64
|
+
import { writeManifest } from "#tools/fetch/download/index"
|
|
65
65
|
|
|
66
66
|
const SLUG = "wikidata-subvenue"
|
|
67
67
|
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Promote LLM-synthesized golden-set candidates into a versioned golden dir, with
|
|
7
|
+
* human-typed-likelihood filters + dedup. Companion to `golden-expand.ts`.
|
|
8
|
+
*
|
|
9
|
+
* ## What it does
|
|
10
|
+
*
|
|
11
|
+
* 1. Reads a candidates JSONL from `data/eval/golden/candidates/`
|
|
12
|
+
* 2. Reads the previous-version golden dir for forward-copy + dedup base
|
|
13
|
+
* 3. Applies filters that drop candidates unlikely to be human-typed:
|
|
14
|
+
*
|
|
15
|
+
* - Components-glued-without-commas (5+ components but <2 separators → freeform jumble)
|
|
16
|
+
* - Postcode-at-start with many other components (US/UK conventions put postcode last; FR puts it
|
|
17
|
+
* before locality only)
|
|
18
|
+
* - Suspicious-token signals (unmatched brackets, control chars, etc.)
|
|
19
|
+
* 4. Dedupes by normalized raw (case-insensitive, whitespace-collapsed)
|
|
20
|
+
* 5. Splits by country (US/FR/other) and writes `data/eval/golden/v<X.Y.Z>/{us,fr,other}.jsonl`
|
|
21
|
+
* 6. Forward-copies the prior version's adversarial.jsonl + README as-is
|
|
22
|
+
* 7. Writes MANIFEST.json with sha256 of each output file
|
|
23
|
+
*
|
|
24
|
+
* ## Usage
|
|
25
|
+
*
|
|
26
|
+
* ```sh
|
|
27
|
+
* mailwoman corpus golden promote \
|
|
28
|
+
* --input data/eval/golden/candidates/expand-20260518-162627.jsonl \
|
|
29
|
+
* --bump-to v0.1.1 \
|
|
30
|
+
* --prior v0.1.0
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import { pathExists } from "@mailwoman/core/fs/readers"
|
|
35
|
+
import { copyFileTo, makeDirectories, writeLocalJSONFile } from "@mailwoman/core/fs/writers"
|
|
36
|
+
import { sha256File } from "@mailwoman/core/hash"
|
|
37
|
+
import { foldCaseWhitespace } from "@mailwoman/normalize/fold"
|
|
38
|
+
import { join } from "path-ts"
|
|
39
|
+
import { createNewlineWriter, JSONSpliterator } from "spliterator"
|
|
40
|
+
import { Globerator } from "spliterator/node/fs"
|
|
41
|
+
|
|
42
|
+
import type { GoldenCandidateEntry as GoldenEntry } from "#utils/golden"
|
|
43
|
+
|
|
44
|
+
// ── Types ──────────────────────────────────────────────────────────────────
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Components a candidate needs before it is rich enough to be worth a golden-set slot.
|
|
48
|
+
*/
|
|
49
|
+
const MIN_GOLDEN_COMPONENTS = 5
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Components an existing entry must still carry to survive promotion.
|
|
53
|
+
*/
|
|
54
|
+
const MIN_PROMOTABLE_COMPONENTS = 4
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Quote-delimited segments above which the raw line is malformed rather than merely quoted.
|
|
58
|
+
*/
|
|
59
|
+
const MAX_QUOTE_SEGMENTS = 3
|
|
60
|
+
|
|
61
|
+
export interface PromoteStats {
|
|
62
|
+
candidatesIn: number
|
|
63
|
+
filteredOut: { glued: number; postcodeLeading: number; suspicious: number; duplicate: number; forwardDup: number }
|
|
64
|
+
kept: number
|
|
65
|
+
perCountry: Record<string, number>
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface PromoteGoldenOptions {
|
|
69
|
+
/**
|
|
70
|
+
* Candidates JSONL (required).
|
|
71
|
+
*/
|
|
72
|
+
input: string
|
|
73
|
+
/**
|
|
74
|
+
* Target golden version dir (required, e.g. `v0.1.1`).
|
|
75
|
+
*/
|
|
76
|
+
bumpTo: string
|
|
77
|
+
/**
|
|
78
|
+
* Previous version to forward-copy + dedup against. Default `v0.1.0`.
|
|
79
|
+
*/
|
|
80
|
+
prior?: string
|
|
81
|
+
/**
|
|
82
|
+
* Golden dir root. Default `data/eval/golden`.
|
|
83
|
+
*/
|
|
84
|
+
goldenRoot?: string
|
|
85
|
+
/**
|
|
86
|
+
* Skip the human-typed-likelihood filters (keep everything that passed expand-golden's validator).
|
|
87
|
+
*/
|
|
88
|
+
noFilters?: boolean
|
|
89
|
+
/**
|
|
90
|
+
* Report what would be written but don't touch disk.
|
|
91
|
+
*/
|
|
92
|
+
dryRun?: boolean
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ── Filters ───────────────────────────────────────────────────────────────
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Heuristic: an address with 5+ components but fewer than 2 separators (commas/newlines/dashes) is most likely glued
|
|
99
|
+
* together rather than human-typed.
|
|
100
|
+
*/
|
|
101
|
+
function isComponentsGlued(entry: GoldenEntry): boolean {
|
|
102
|
+
const componentCount = Object.keys(entry.components).length
|
|
103
|
+
|
|
104
|
+
if (componentCount < MIN_GOLDEN_COMPONENTS) return false
|
|
105
|
+
const separators = (entry.raw.match(/[,\n;]/g) ?? []).length
|
|
106
|
+
|
|
107
|
+
return separators < 2
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Heuristic: in US/UK conventions, postcode goes at the END of the address. If postcode appears in the first third of a
|
|
112
|
+
* multi-component raw AND there are 4+ components, the LLM probably over-aggressively reordered. FR is exempt (postcode
|
|
113
|
+
* often precedes locality there).
|
|
114
|
+
*/
|
|
115
|
+
function isPostcodeBadlyLeading(entry: GoldenEntry): boolean {
|
|
116
|
+
if (Object.keys(entry.components).length < MIN_PROMOTABLE_COMPONENTS) return false
|
|
117
|
+
|
|
118
|
+
if (entry.country === "FR" || entry.country === "France") return false
|
|
119
|
+
const postcode = entry.components.postcode
|
|
120
|
+
|
|
121
|
+
if (!postcode) return false
|
|
122
|
+
const postcodeIdx = entry.raw.indexOf(postcode)
|
|
123
|
+
|
|
124
|
+
if (postcodeIdx === -1) return false
|
|
125
|
+
|
|
126
|
+
return postcodeIdx < entry.raw.length / 3
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Heuristic: catch-all for visually-bad outputs — unmatched brackets, control chars, suspicious punctuation that
|
|
131
|
+
* suggests the LLM emitted markup instead of an address.
|
|
132
|
+
*/
|
|
133
|
+
function isSuspicious(entry: GoldenEntry): boolean {
|
|
134
|
+
const raw = entry.raw
|
|
135
|
+
|
|
136
|
+
// eslint-disable-next-line no-control-regex
|
|
137
|
+
if (/[\u0000-\u001F\u007F]/.test(raw)) return true
|
|
138
|
+
const openBrackets = (raw.match(/[[({<]/g) ?? []).length
|
|
139
|
+
const closeBrackets = (raw.match(/[\])}>]/g) ?? []).length
|
|
140
|
+
|
|
141
|
+
if (openBrackets !== closeBrackets) return true
|
|
142
|
+
|
|
143
|
+
if (raw.split('"').length > MAX_QUOTE_SEGMENTS) return true
|
|
144
|
+
|
|
145
|
+
// too many quote marks
|
|
146
|
+
return false
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ── Main ───────────────────────────────────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
export async function promoteGolden(
|
|
152
|
+
options: PromoteGoldenOptions,
|
|
153
|
+
report?: (line: string) => void
|
|
154
|
+
): Promise<PromoteStats> {
|
|
155
|
+
const prior = options.prior ?? "v0.1.0"
|
|
156
|
+
const goldenRoot = options.goldenRoot ?? "data/eval/golden"
|
|
157
|
+
const applyFilters = !options.noFilters
|
|
158
|
+
const dryRun = options.dryRun ?? false
|
|
159
|
+
|
|
160
|
+
report?.(`reading candidates: ${options.input}`)
|
|
161
|
+
|
|
162
|
+
// The candidates file is the REQUIRED input, so its absence must not read as "zero candidates" —
|
|
163
|
+
// that promotes the prior version unchanged and reports success. `JSONSpliterator.fromAsync`
|
|
164
|
+
// reports a missing path as a bare `TypeError` naming its own internals, so name the path here.
|
|
165
|
+
if (!(await pathExists(options.input))) {
|
|
166
|
+
throw new Error(`Candidates file not found: ${options.input}`)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Forward-copy base: existing entries from the prior golden version go forward verbatim,
|
|
170
|
+
// and we dedupe new candidates against them so v_new = v_old ∪ accepted_candidates.
|
|
171
|
+
const priorDir = join(goldenRoot, prior)
|
|
172
|
+
const priorEntries: { country: string; entries: GoldenEntry[] }[] = []
|
|
173
|
+
const seenNormalized = new Set<string>()
|
|
174
|
+
|
|
175
|
+
if (await pathExists(priorDir)) {
|
|
176
|
+
for await (const f of Globerator.files("jsonl", { cwd: priorDir, absolute: false })) {
|
|
177
|
+
const country = f.replace(".jsonl", "").toUpperCase()
|
|
178
|
+
const entries = await JSONSpliterator.fromAsync<GoldenEntry>(join(priorDir, f)).toArray()
|
|
179
|
+
|
|
180
|
+
priorEntries.push({ country, entries })
|
|
181
|
+
|
|
182
|
+
for (const e of entries) {
|
|
183
|
+
seenNormalized.add(foldCaseWhitespace(e.raw))
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
report?.(` prior ${country}: ${entries.length} entries (forward-copy base)`)
|
|
187
|
+
}
|
|
188
|
+
} else {
|
|
189
|
+
report?.(` ⚠ prior dir ${priorDir} not found — starting fresh`)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Filter pass
|
|
193
|
+
const stats: PromoteStats = {
|
|
194
|
+
candidatesIn: 0,
|
|
195
|
+
filteredOut: { glued: 0, postcodeLeading: 0, suspicious: 0, duplicate: 0, forwardDup: 0 },
|
|
196
|
+
kept: 0,
|
|
197
|
+
perCountry: {},
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const accepted: GoldenEntry[] = []
|
|
201
|
+
const seenInBatch = new Set<string>()
|
|
202
|
+
|
|
203
|
+
for await (const cand of JSONSpliterator.fromAsync<GoldenEntry>(options.input)) {
|
|
204
|
+
stats.candidatesIn++
|
|
205
|
+
const norm = foldCaseWhitespace(cand.raw)
|
|
206
|
+
|
|
207
|
+
// Dedup pass 1: against prior versioned golden
|
|
208
|
+
if (seenNormalized.has(norm)) {
|
|
209
|
+
stats.filteredOut.forwardDup++
|
|
210
|
+
|
|
211
|
+
continue
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Dedup pass 2: against this batch
|
|
215
|
+
if (seenInBatch.has(norm)) {
|
|
216
|
+
stats.filteredOut.duplicate++
|
|
217
|
+
|
|
218
|
+
continue
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (applyFilters) {
|
|
222
|
+
if (isComponentsGlued(cand)) {
|
|
223
|
+
stats.filteredOut.glued++
|
|
224
|
+
|
|
225
|
+
continue
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (isPostcodeBadlyLeading(cand)) {
|
|
229
|
+
stats.filteredOut.postcodeLeading++
|
|
230
|
+
|
|
231
|
+
continue
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (isSuspicious(cand)) {
|
|
235
|
+
stats.filteredOut.suspicious++
|
|
236
|
+
|
|
237
|
+
continue
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
accepted.push(cand)
|
|
242
|
+
seenInBatch.add(norm)
|
|
243
|
+
|
|
244
|
+
stats.kept++
|
|
245
|
+
const country = cand.country || "OTHER"
|
|
246
|
+
stats.perCountry[country] = (stats.perCountry[country] ?? 0) + 1
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
report?.(` ${stats.candidatesIn} candidates loaded`)
|
|
250
|
+
|
|
251
|
+
// Bucket per country, including forward-copied entries
|
|
252
|
+
const buckets = new Map<string, GoldenEntry[]>()
|
|
253
|
+
|
|
254
|
+
for (const { country, entries } of priorEntries) {
|
|
255
|
+
// Existing files keyed by filename uppercase (us.jsonl → US, adversarial.jsonl → ADVERSARIAL)
|
|
256
|
+
buckets.set(country, [...entries])
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
for (const cand of accepted) {
|
|
260
|
+
const key = (cand.country || "OTHER").toUpperCase()
|
|
261
|
+
|
|
262
|
+
if (!buckets.has(key)) {
|
|
263
|
+
buckets.set(key, [])
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
buckets.get(key)!.push(cand)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Output
|
|
270
|
+
const outDir = join(goldenRoot, options.bumpTo)
|
|
271
|
+
report?.(`=== plan ===`)
|
|
272
|
+
report?.(`output dir: ${outDir}${dryRun ? " (dry-run)" : ""}`)
|
|
273
|
+
|
|
274
|
+
for (const [key, entries] of buckets) {
|
|
275
|
+
report?.(` ${key.toLowerCase()}.jsonl: ${entries.length} entries`)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
report?.(`=== filter stats ===`)
|
|
279
|
+
report?.(`candidates in: ${stats.candidatesIn}`)
|
|
280
|
+
report?.(` filtered (glued): ${stats.filteredOut.glued}`)
|
|
281
|
+
report?.(` filtered (postcode-lead): ${stats.filteredOut.postcodeLeading}`)
|
|
282
|
+
report?.(` filtered (suspicious): ${stats.filteredOut.suspicious}`)
|
|
283
|
+
report?.(` filtered (dup-in-batch): ${stats.filteredOut.duplicate}`)
|
|
284
|
+
report?.(` filtered (dup-vs-prior): ${stats.filteredOut.forwardDup}`)
|
|
285
|
+
report?.(` kept: ${stats.kept}`)
|
|
286
|
+
report?.(`per-country (kept):`)
|
|
287
|
+
|
|
288
|
+
for (const [c, n] of Object.entries(stats.perCountry).toSorted((a, b) => b[1] - a[1])) {
|
|
289
|
+
report?.(` ${c}: ${n}`)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (dryRun) {
|
|
293
|
+
report?.(`(dry-run: no files written)`)
|
|
294
|
+
|
|
295
|
+
return stats
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
await makeDirectories(outDir)
|
|
299
|
+
|
|
300
|
+
const manifest: {
|
|
301
|
+
promoted_at: string
|
|
302
|
+
from: string
|
|
303
|
+
from_sha256: string
|
|
304
|
+
files: Record<string, { entries: number; sha256: string }>
|
|
305
|
+
} = {
|
|
306
|
+
promoted_at: new Date().toISOString(),
|
|
307
|
+
from: options.input,
|
|
308
|
+
from_sha256: await sha256File(options.input),
|
|
309
|
+
files: {},
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
for (const [key, entries] of buckets) {
|
|
313
|
+
const filename = `${key.toLowerCase()}.jsonl`
|
|
314
|
+
const path = join(outDir, filename)
|
|
315
|
+
|
|
316
|
+
{
|
|
317
|
+
await using out = createNewlineWriter(path)
|
|
318
|
+
|
|
319
|
+
for (const entry of entries) {
|
|
320
|
+
await out.write(JSON.stringify(entry))
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
manifest.files[filename] = { entries: entries.length, sha256: await sha256File(path) }
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Forward-copy non-.jsonl files (README.md, etc.) from prior
|
|
328
|
+
if (await pathExists(priorDir)) {
|
|
329
|
+
for await (const f of Globerator.from("*", { cwd: priorDir, absolute: false })) {
|
|
330
|
+
if (f.endsWith(".jsonl")) continue
|
|
331
|
+
await copyFileTo(join(priorDir, f), join(outDir, f))
|
|
332
|
+
report?.(` forward-copied: ${f}`)
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
await writeLocalJSONFile(manifest, join(outDir, "MANIFEST.json"))
|
|
337
|
+
report?.(`✓ promoted to ${outDir}`)
|
|
338
|
+
|
|
339
|
+
return stats
|
|
340
|
+
}
|