@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
|
@@ -80,6 +80,8 @@ export const trailingRegionRecipe: CorpusRecipe = {
|
|
|
80
80
|
mode: "tuples",
|
|
81
81
|
async run(opts, write) {
|
|
82
82
|
makeMulberry32(opts.seed)
|
|
83
|
+
const structuredSource = opts.sourceName ?? "synth-trailing-region-structured"
|
|
84
|
+
const bareSource = opts.sourceName ? `${opts.sourceName}-bare` : "synth-trailing-region"
|
|
83
85
|
let read = 0
|
|
84
86
|
let emitted = 0
|
|
85
87
|
let skipped = 0
|
|
@@ -152,7 +154,10 @@ export const trailingRegionRecipe: CorpusRecipe = {
|
|
|
152
154
|
// A DISTINCT source for the structured rows. The sampler buckets by `source` and weights each bucket,
|
|
153
155
|
// so emitting these under `synth-trailing-region` would pool them with the 88,904 bare rows and make
|
|
154
156
|
// the new surface unweightable — the dose would silently be whatever the bare slice's weight bought.
|
|
155
|
-
|
|
157
|
+
// `--source-name` overrides both, and for the same reason one rung up: a rebuild of one country's
|
|
158
|
+
// surfaces (#1673's corrected Spanish names) pooled under the shipped label would be dosed at
|
|
159
|
+
// whatever the rows it was built to outweigh are already drawing.
|
|
160
|
+
const sourceLabel = postcode ? structuredSource : bareSource
|
|
156
161
|
const source_id = sliceSourceID(sourceLabel, { ...components, v: String(read) })
|
|
157
162
|
|
|
158
163
|
const canonical = {
|
package/lib/recipes/unit.ts
CHANGED
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
* framework LCG) is consumed in the exact call order the legacy script used.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
+
import type { ComponentTag } from "@mailwoman/codex/component"
|
|
24
25
|
import { US_UNIT_DESIGNATOR_PREFERRED_ABBR, type USUnitDesignator } from "@mailwoman/codex/us"
|
|
25
26
|
import { dataRootPath } from "@mailwoman/core/data-root"
|
|
26
|
-
import type { ComponentTag } from "@mailwoman/core/types"
|
|
27
27
|
import { mulberry32 as makeMulberry32 } from "@mailwoman/core/utils"
|
|
28
28
|
import type { PathBuilderLike } from "path-ts"
|
|
29
29
|
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `sg-register` slice recipe — the forms a person in Singapore types, rendered over the Overture-SG register rows
|
|
7
|
+
* (#2204 §4). The base `overture` source carries the register's own shape, `990 OLD CHOA CHU KANG ROAD, 699814,
|
|
8
|
+
* Singapore`, and the Latin model has no register for the three forms that dominate typed Singapore addresses:
|
|
9
|
+
*
|
|
10
|
+
* - the HDB block line, `Blk 123 Ang Mo Kio Ave 3 #05-67 Singapore 560123` — `Blk` in front of the block number (the
|
|
11
|
+
* register's `number`), a floor-unit `#NN-NN` after the street, the country name as the locality;
|
|
12
|
+
* - the bracketed postcode, `123 Ang Mo Kio Ave 3 S(560123)` — the form the postal service prints;
|
|
13
|
+
* - the building-led line, `National Shooting Centre, 990 Old Choa Chu Kang Road, Singapore 699814` — the register's
|
|
14
|
+
* `unit` field holds the BUILDING or ESTATE name on 91,818 of 142,210 rows, which the adapter refuses as a unit and
|
|
15
|
+
* this recipe renders as a `venue` when it reads as a building rather than an estate.
|
|
16
|
+
*
|
|
17
|
+
* Every value in `components` is a verbatim substring of `raw`, aligned by {@link alignAndWrite}. The floor-unit is
|
|
18
|
+
* SYNTHESIZED (the register carries one on a single row): floor 01–30, unit 01–399, zero-padded — the shape, not a
|
|
19
|
+
* real occupancy. `Blk` and the `S(` `)` around a postcode are untagged, as the board's `sg-cs-blk-12-kallang-ave`
|
|
20
|
+
* row expects (`house_number: "12"`). Streets arrive upper-case and are rendered title-cased; a third abbreviate the
|
|
21
|
+
* generic (`Avenue` → `Ave`, `Road` → `Rd`, …) the way a typed line does.
|
|
22
|
+
*
|
|
23
|
+
* Run: mailwoman corpus slice sg-register --input <overture-sg.corpus.jsonl> --count N --seed S
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { mulberry32 as makeMulberry32 } from "@mailwoman/core/utils"
|
|
27
|
+
|
|
28
|
+
import { titlecase } from "#au/adapters/gnaf/assemble"
|
|
29
|
+
import { alignAndWrite, type CorpusRecipe, readTuples, sliceSourceID } from "#recipes/scaffold"
|
|
30
|
+
|
|
31
|
+
const SOURCE = "synth-sg-register"
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The register's generics and the abbreviation a typed line uses for each.
|
|
35
|
+
*/
|
|
36
|
+
const GENERIC_ABBREVIATIONS: ReadonlyArray<readonly [full: string, short: string]> = [
|
|
37
|
+
["Avenue", "Ave"],
|
|
38
|
+
["Road", "Rd"],
|
|
39
|
+
["Street", "St"],
|
|
40
|
+
["Drive", "Dr"],
|
|
41
|
+
["Crescent", "Cres"],
|
|
42
|
+
["Lane", "Ln"],
|
|
43
|
+
["Boulevard", "Blvd"],
|
|
44
|
+
["Terrace", "Ter"],
|
|
45
|
+
["Place", "Pl"],
|
|
46
|
+
["Close", "Cl"],
|
|
47
|
+
["Walk", "Wk"],
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Estate and area names the register's `unit` field carries beside building names. A name ending in one of these is an
|
|
52
|
+
* estate, which no one writes in front of an address line; a name without one reads as a building and is rendered as a
|
|
53
|
+
* `venue`.
|
|
54
|
+
*/
|
|
55
|
+
const ESTATE_TAILS = ["ESTATE", "CONSERVATION AREA", "HILLS", "PARK", "GARDENS", "GARDEN", "HEIGHTS", "GROVE", "VILLE"]
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Share of rows per register. The block line and the bracketed postcode are the two the Latin model has never seen; the
|
|
59
|
+
* official line keeps the register's own shape in the mix so the block forms train beside it.
|
|
60
|
+
*/
|
|
61
|
+
const P_BLOCK = 0.4
|
|
62
|
+
const P_BRACKET_POSTCODE = 0.25
|
|
63
|
+
const P_BUILDING_LED = 0.15
|
|
64
|
+
const P_ABBREVIATE = 0.35
|
|
65
|
+
const P_UPPER = 0.1
|
|
66
|
+
|
|
67
|
+
const FLOOR_MAX = 30
|
|
68
|
+
const UNIT_MAX = 399
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The draw value that lands each register in the branch order below, for a caller that names the form.
|
|
72
|
+
*/
|
|
73
|
+
const REGISTER_DRAW: Record<SGRegister, number> = {
|
|
74
|
+
block: 0,
|
|
75
|
+
bracket_postcode: P_BLOCK,
|
|
76
|
+
building_led: P_BLOCK + P_BRACKET_POSTCODE,
|
|
77
|
+
official: 1,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* `OLD CHOA CHU KANG ROAD` → `Old Choa Chu Kang Road`; an already-mixed value is returned as it is. The register writes
|
|
82
|
+
* every street and building name upper-case, the same convention as G-NAF, so the G-NAF title-caser serves both.
|
|
83
|
+
*/
|
|
84
|
+
export function titleCaseSGName(name: string): string {
|
|
85
|
+
return name === name.toUpperCase() ? titlecase(name) : name
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Abbreviate the street's generic, wherever it sits (`Ang Mo Kio Avenue 3` → `Ang Mo Kio Ave 3`).
|
|
90
|
+
*/
|
|
91
|
+
export function abbreviateSGStreet(street: string): string {
|
|
92
|
+
for (const [full, short] of GENERIC_ABBREVIATIONS) {
|
|
93
|
+
const pattern = new RegExp(`\\b${full}\\b`, "u")
|
|
94
|
+
|
|
95
|
+
if (pattern.test(street)) return street.replace(pattern, short)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return street
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Whether the register's `unit` value names a building rather than an estate — the building-led register's lead. A name
|
|
103
|
+
* carrying a digit, a parenthesized abbreviation (`DIABETES & METABOLISM CENTRE (DMC)`) or one word only is not one.
|
|
104
|
+
*/
|
|
105
|
+
export function isBuildingName(unit: string): boolean {
|
|
106
|
+
const value = unit.trim().toUpperCase()
|
|
107
|
+
|
|
108
|
+
if (!value || value === "NIL" || /[\d()]/u.test(value) || !/\s/u.test(value)) return false
|
|
109
|
+
|
|
110
|
+
return !ESTATE_TAILS.some((tail) => value.endsWith(tail))
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
interface SGRow {
|
|
114
|
+
street: string
|
|
115
|
+
number: string
|
|
116
|
+
unit: string
|
|
117
|
+
postcode: string
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The four typed forms this recipe renders.
|
|
122
|
+
*/
|
|
123
|
+
export type SGRegister = "official" | "block" | "bracket_postcode" | "building_led"
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* One rendered register: the raw line plus the components it carries, every value a substring of the line.
|
|
127
|
+
*/
|
|
128
|
+
export interface SGRegisterRendering {
|
|
129
|
+
raw: string
|
|
130
|
+
components: Record<string, string>
|
|
131
|
+
register: SGRegister
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Render one register form for one register row. Pure: every random draw comes through `random`. A `register` names the
|
|
136
|
+
* form to render instead of drawing one, for a board that wants a balanced spread; `building_led` still needs a
|
|
137
|
+
* building-shaped `unit` and falls back to `official` without one.
|
|
138
|
+
*/
|
|
139
|
+
export function renderSGRegister(row: SGRow, random: () => number, register?: SGRegister): SGRegisterRendering {
|
|
140
|
+
const street0 = titleCaseSGName(row.street)
|
|
141
|
+
const street = random() < P_ABBREVIATE ? abbreviateSGStreet(street0) : street0
|
|
142
|
+
const drawn = random()
|
|
143
|
+
const building = isBuildingName(row.unit) ? titleCaseSGName(row.unit) : null
|
|
144
|
+
const draw = register === undefined ? drawn : REGISTER_DRAW[register]
|
|
145
|
+
|
|
146
|
+
let raw: string
|
|
147
|
+
let rendered: SGRegister
|
|
148
|
+
const components: Record<string, string> = { house_number: row.number, street, postcode: row.postcode }
|
|
149
|
+
|
|
150
|
+
if (draw < P_BLOCK && /^\d+[A-Z]?$/u.test(row.number)) {
|
|
151
|
+
const floor = String(1 + Math.floor(random() * FLOOR_MAX)).padStart(2, "0")
|
|
152
|
+
const unitNo = String(1 + Math.floor(random() * UNIT_MAX)).padStart(2, "0")
|
|
153
|
+
const unit = `#${floor}-${unitNo}`
|
|
154
|
+
|
|
155
|
+
raw = `Blk ${row.number} ${street} ${unit} Singapore ${row.postcode}`
|
|
156
|
+
components.unit = unit
|
|
157
|
+
components.locality = "Singapore"
|
|
158
|
+
rendered = "block"
|
|
159
|
+
} else if (draw < P_BLOCK + P_BRACKET_POSTCODE) {
|
|
160
|
+
raw = `${row.number} ${street} S(${row.postcode})`
|
|
161
|
+
rendered = "bracket_postcode"
|
|
162
|
+
} else if (draw < P_BLOCK + P_BRACKET_POSTCODE + P_BUILDING_LED && building) {
|
|
163
|
+
raw = `${building}, ${row.number} ${street}, Singapore ${row.postcode}`
|
|
164
|
+
components.venue = building
|
|
165
|
+
components.locality = "Singapore"
|
|
166
|
+
rendered = "building_led"
|
|
167
|
+
} else {
|
|
168
|
+
raw = `${row.number} ${street} Singapore ${row.postcode}`
|
|
169
|
+
components.locality = "Singapore"
|
|
170
|
+
rendered = "official"
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (random() < P_UPPER) {
|
|
174
|
+
raw = raw.toUpperCase()
|
|
175
|
+
|
|
176
|
+
for (const key of Object.keys(components)) {
|
|
177
|
+
components[key] = components[key]!.toUpperCase()
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return { raw, components, register: rendered }
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Slice recipe registered with the corpus builder — see the file header for the registers and why each is here.
|
|
186
|
+
*/
|
|
187
|
+
export const sgRegisterRecipe: CorpusRecipe = {
|
|
188
|
+
name: "sg-register",
|
|
189
|
+
description:
|
|
190
|
+
"Singapore typed registers over the Overture-SG rows: the HDB block line with a #NN-NN unit, the S(NNNNNN) postcode, the building-led line",
|
|
191
|
+
mode: "tuples",
|
|
192
|
+
options: [
|
|
193
|
+
{ flag: "--count", description: "Rows to emit (default: every input row once)" },
|
|
194
|
+
{ flag: "--input", description: "The Overture-SG corpus JSONL ({ street, number, unit, postcode, locality })" },
|
|
195
|
+
],
|
|
196
|
+
async run(opts, write) {
|
|
197
|
+
if (!opts.input) {
|
|
198
|
+
throw new Error("sg-register: --input <overture-sg.corpus.jsonl> is required")
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const random = makeMulberry32(opts.seed)
|
|
202
|
+
const source = opts.sourceName ?? SOURCE
|
|
203
|
+
const registers: Record<string, number> = {}
|
|
204
|
+
let read = 0
|
|
205
|
+
let emitted = 0
|
|
206
|
+
let skipped = 0
|
|
207
|
+
let quarantined = 0
|
|
208
|
+
|
|
209
|
+
for await (const tuple of readTuples(opts.input)) {
|
|
210
|
+
read++
|
|
211
|
+
|
|
212
|
+
if (opts.count !== undefined && emitted >= opts.count) break
|
|
213
|
+
|
|
214
|
+
const street = typeof tuple["street"] === "string" ? tuple["street"].trim() : ""
|
|
215
|
+
const number = typeof tuple["number"] === "string" ? tuple["number"].trim() : ""
|
|
216
|
+
const postcode = typeof tuple["postcode"] === "string" ? tuple["postcode"].trim() : ""
|
|
217
|
+
const unit = typeof tuple["unit"] === "string" ? tuple["unit"].trim() : ""
|
|
218
|
+
|
|
219
|
+
if (!street || !/^\d+[A-Z]?$/u.test(number) || !/^\d{6}$/u.test(postcode)) {
|
|
220
|
+
skipped++
|
|
221
|
+
|
|
222
|
+
continue
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const rendering = renderSGRegister({ street, number, unit, postcode }, random)
|
|
226
|
+
|
|
227
|
+
if (opts.golden) {
|
|
228
|
+
const golden = { raw: rendering.raw, components: rendering.components, country: "SG", locale: "en-SG" }
|
|
229
|
+
|
|
230
|
+
write(JSON.stringify(golden) + "\n")
|
|
231
|
+
|
|
232
|
+
emitted++
|
|
233
|
+
registers[rendering.register] = (registers[rendering.register] ?? 0) + 1
|
|
234
|
+
|
|
235
|
+
continue
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const ok = alignAndWrite(
|
|
239
|
+
write,
|
|
240
|
+
{
|
|
241
|
+
raw: rendering.raw,
|
|
242
|
+
components: rendering.components,
|
|
243
|
+
country: "SG",
|
|
244
|
+
locale: "en-SG",
|
|
245
|
+
source,
|
|
246
|
+
source_id: sliceSourceID(source, { raw: rendering.raw }),
|
|
247
|
+
corpus_version: "0.1.0",
|
|
248
|
+
license:
|
|
249
|
+
"CDLA-Permissive-2.0 — Overture Maps addresses over the Singapore Open Data Licence 1.0 (OneMap / Singapore Land Authority)",
|
|
250
|
+
},
|
|
251
|
+
`sg-register:${rendering.register}`
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
if (ok) {
|
|
255
|
+
emitted++
|
|
256
|
+
registers[rendering.register] = (registers[rendering.register] ?? 0) + 1
|
|
257
|
+
} else {
|
|
258
|
+
quarantined++
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
console.error(
|
|
263
|
+
` sg-register: ${emitted} emitted (${Object.entries(registers)
|
|
264
|
+
.map(([k, v]) => `${k} ${v}`)
|
|
265
|
+
.join(", ")}), ${skipped} skipped, ${quarantined} quarantined of ${read} read`
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
return { read, emitted, skipped }
|
|
269
|
+
},
|
|
270
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Fetch Singapore's ACRA corporate-entity register from data.gov.sg: 27 monthly CSVs (one per first
|
|
7
|
+
* letter of the entity name plus "others"), 53 columns, the registered address FIELDED — `Block`,
|
|
8
|
+
* `Street Name`, `Level No`, `Unit No`, `Building Name`, `Postal Code` — which is the NPPES shape,
|
|
9
|
+
* so the corpus adapter renders the string and the spans fall out by construction. A Singapore
|
|
10
|
+
* postcode names one building, so the postcode column is also the join to the OneMap/Overture rows.
|
|
11
|
+
*
|
|
12
|
+
* License: Singapore Open Data Licence version 1.0 (attribution; commercial use, modification and
|
|
13
|
+
* adaptation permitted; no share-alike). The prescribed attribution sentence goes in the manifest.
|
|
14
|
+
*
|
|
15
|
+
* data.gov.sg serves a dataset in two calls: `initiate-download` prepares a signed URL and
|
|
16
|
+
* `poll-download` answers it once the export is ready.
|
|
17
|
+
*
|
|
18
|
+
* Invoke via `mailwoman corpus fetch acra-sg --out-root <path>`.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { BYTES_PER_KIB } from "@mailwoman/core/fs/formatters"
|
|
22
|
+
import { pathExists } from "@mailwoman/core/fs/readers"
|
|
23
|
+
import { makeDirectories } from "@mailwoman/core/fs/writers"
|
|
24
|
+
import { sha256File } from "@mailwoman/core/hash"
|
|
25
|
+
import { sleep } from "@mailwoman/core/utils/sleep"
|
|
26
|
+
import { join } from "path-ts"
|
|
27
|
+
|
|
28
|
+
import type {
|
|
29
|
+
BaseFetchOptions,
|
|
30
|
+
FetchSummary,
|
|
31
|
+
SourceCollectionManifest,
|
|
32
|
+
SourceManifest,
|
|
33
|
+
} from "#tools/fetch/download/index"
|
|
34
|
+
import { loadCollectionFiles, streamBodyToFile, withRetries, writeManifest } from "#tools/fetch/download/index"
|
|
35
|
+
|
|
36
|
+
const SLUG = "acra-sg"
|
|
37
|
+
const COLLECTION_URL = "https://api-production.data.gov.sg/v2/public/api/collections/2/metadata"
|
|
38
|
+
const DATASET_API = "https://api-production.data.gov.sg/v2/public/api/datasets"
|
|
39
|
+
const DOWNLOAD_API = "https://api-open.data.gov.sg/v1/public/api/datasets"
|
|
40
|
+
const LICENSE = "Singapore Open Data Licence version 1.0 — https://data.gov.sg/open-data-licence"
|
|
41
|
+
|
|
42
|
+
const ATTRIBUTION =
|
|
43
|
+
"Contains information from ACRA Information on Corporate Entities accessed on <date> from data.gov.sg which is made available under the terms of the Singapore Open Data Licence version 1.0 https://data.gov.sg/open-data-licence"
|
|
44
|
+
|
|
45
|
+
const POLL_INTERVAL_MS = 3000
|
|
46
|
+
const POLL_ATTEMPTS = 40
|
|
47
|
+
|
|
48
|
+
export type FetchACRASGOptions = BaseFetchOptions
|
|
49
|
+
|
|
50
|
+
interface CollectionMetadata {
|
|
51
|
+
data?: { collectionMetadata?: { childDatasets?: string[] } }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
interface DatasetMetadata {
|
|
55
|
+
data?: { name?: string; lastUpdatedAt?: string }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface PollResponse {
|
|
59
|
+
data?: { status?: string; url?: string }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function readJSON<T>(url: string): Promise<T> {
|
|
63
|
+
const res = await fetch(url, { headers: { accept: "application/json" } })
|
|
64
|
+
|
|
65
|
+
if (!res.ok) throw new Error(`acra-sg: ${url} answered HTTP ${res.status}`)
|
|
66
|
+
|
|
67
|
+
return (await res.json()) as T
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Ask the portal to prepare the CSV export, then poll until it names the signed URL.
|
|
72
|
+
*/
|
|
73
|
+
async function signedURLFor(datasetID: string): Promise<string | undefined> {
|
|
74
|
+
await readJSON(`${DOWNLOAD_API}/${datasetID}/initiate-download`)
|
|
75
|
+
|
|
76
|
+
for (let attempt = 0; attempt < POLL_ATTEMPTS; attempt++) {
|
|
77
|
+
await sleep(POLL_INTERVAL_MS)
|
|
78
|
+
const poll = await readJSON<PollResponse>(`${DOWNLOAD_API}/${datasetID}/poll-download`)
|
|
79
|
+
|
|
80
|
+
if (poll.data?.status === "DOWNLOAD_SUCCESS" && poll.data.url) return poll.data.url
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function filenameFor(name: string, datasetID: string): string {
|
|
87
|
+
const letter = /\('([^']+)'\)/.exec(name)?.[1]
|
|
88
|
+
|
|
89
|
+
return `acra-entities-${(letter ?? datasetID).toLowerCase().replaceAll(/[^a-z0-9]+/g, "-")}.csv`
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export async function fetchACRASG(options: FetchACRASGOptions, report?: (line: string) => void): Promise<FetchSummary> {
|
|
93
|
+
const destDir = join(options.outRoot, SLUG)
|
|
94
|
+
await makeDirectories(destDir)
|
|
95
|
+
const manifestPath = join(destDir, "MANIFEST.json")
|
|
96
|
+
|
|
97
|
+
const collection = await readJSON<CollectionMetadata>(COLLECTION_URL)
|
|
98
|
+
const datasetIDs = collection.data?.collectionMetadata?.childDatasets ?? []
|
|
99
|
+
report?.(`=== ${SLUG}: ${datasetIDs.length} datasets in collection 2`)
|
|
100
|
+
|
|
101
|
+
const previous = await loadCollectionFiles(manifestPath)
|
|
102
|
+
const files = new Map<string, SourceManifest>()
|
|
103
|
+
let fetched = 0
|
|
104
|
+
let skipped = 0
|
|
105
|
+
const failedCodes: string[] = []
|
|
106
|
+
|
|
107
|
+
for (const datasetID of datasetIDs) {
|
|
108
|
+
const metadata = await readJSON<DatasetMetadata>(`${DATASET_API}/${datasetID}/metadata`)
|
|
109
|
+
const name = metadata.data?.name ?? datasetID
|
|
110
|
+
const filename = filenameFor(name, datasetID)
|
|
111
|
+
const dest = join(destDir, filename)
|
|
112
|
+
const before = previous.get(filename)
|
|
113
|
+
|
|
114
|
+
if (before && (await pathExists(dest))) {
|
|
115
|
+
files.set(filename, before)
|
|
116
|
+
|
|
117
|
+
skipped++
|
|
118
|
+
|
|
119
|
+
continue
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
report?.(`--- ${name} (${datasetID})`)
|
|
123
|
+
let bytes: number
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
bytes = await withRetries(
|
|
127
|
+
async () => {
|
|
128
|
+
const url = await signedURLFor(datasetID)
|
|
129
|
+
|
|
130
|
+
if (!url) throw new Error(`the export never reached DOWNLOAD_SUCCESS for ${datasetID}`)
|
|
131
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(1_800_000) })
|
|
132
|
+
|
|
133
|
+
if (!res.ok) throw new Error(`HTTP ${res.status} on the signed URL for ${datasetID}`)
|
|
134
|
+
|
|
135
|
+
return streamBodyToFile(res, dest)
|
|
136
|
+
},
|
|
137
|
+
{ report, label: name }
|
|
138
|
+
)
|
|
139
|
+
} catch (error) {
|
|
140
|
+
report?.(` ✗ ${(error as Error).message}`)
|
|
141
|
+
failedCodes.push(datasetID)
|
|
142
|
+
|
|
143
|
+
continue
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (bytes < BYTES_PER_KIB) {
|
|
147
|
+
report?.(` ✗ ${bytes} bytes — an error page, not the register`)
|
|
148
|
+
failedCodes.push(datasetID)
|
|
149
|
+
|
|
150
|
+
continue
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const sha = await sha256File(dest)
|
|
154
|
+
|
|
155
|
+
files.set(filename, {
|
|
156
|
+
source_url: `https://data.gov.sg/datasets/${datasetID}/view`,
|
|
157
|
+
downloaded_at: new Date().toISOString(),
|
|
158
|
+
filename,
|
|
159
|
+
sha256: sha,
|
|
160
|
+
bytes,
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
fetched++
|
|
164
|
+
report?.(` ✓ ${(bytes / 1024 / 1024).toFixed(1)} MB sha256=${sha}`)
|
|
165
|
+
|
|
166
|
+
const manifest: SourceCollectionManifest = {
|
|
167
|
+
source: SLUG,
|
|
168
|
+
source_url: "https://data.gov.sg/collections/2/view",
|
|
169
|
+
license: LICENSE,
|
|
170
|
+
attribution: ATTRIBUTION,
|
|
171
|
+
downloaded_at: new Date().toISOString(),
|
|
172
|
+
files: [...files.values()],
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
await writeManifest(manifestPath, manifest)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return { fetched, skipped, failed: failedCodes.length, failedCodes }
|
|
179
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `pk-register` and `bd-register` slice recipes — the typed forms of Pakistan and Bangladesh the country templates do
|
|
7
|
+
* not render, over the OpenStreetMap corpus JSONL the `osm` adapter reads (#1744, the F8 family). The adapter's own
|
|
8
|
+
* rows carry the template shape (`4 38th Street, DHA Phase 6, Karachi`; `24 Road 104, Dhaka - 1207`); these two carry
|
|
9
|
+
* the register:
|
|
10
|
+
*
|
|
11
|
+
* - the HOUSE line, `House 4, Street 25, F-7/2, Islamabad` and `House 34, Road 4, Sector 9, Uttara, Dhaka 1230` —
|
|
12
|
+
* `House` in front of the number (untagged, the same rule as Singapore's `Blk`), the numbered street, the scheme or
|
|
13
|
+
* sector as the dependent locality, the city;
|
|
14
|
+
* - the PLAIN line with the trailing postcode and no dash, `58 Kalabagan 1st Ln, Dhaka 1205` — what a person types,
|
|
15
|
+
* where the template writes `Dhaka - 1205`.
|
|
16
|
+
*
|
|
17
|
+
* Islamabad's sector codes (`F-7/2`, `G-10/3`) are the one synthesized value: the register carries them on a handful
|
|
18
|
+
* of rows, mostly inside `addr:city` (`F7/2 Islamabad`), so a row whose city is Islamabad and whose scheme is unknown
|
|
19
|
+
* draws one from the capital's grid. Every other value is the row's own. The components are the `osm` adapter's
|
|
20
|
+
* mapping (`componentsForOSMRow`), so the two surfaces cannot disagree about what a field means.
|
|
21
|
+
*
|
|
22
|
+
* ⚠ ODbL: the rows inherit OpenStreetMap's share-alike license, and `--exclude-share-alike` drops them.
|
|
23
|
+
*
|
|
24
|
+
* Run: mailwoman corpus slice pk-register --input <osm-pk.corpus.jsonl> --count N --seed S
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { mulberry32 as makeMulberry32 } from "@mailwoman/core/utils"
|
|
28
|
+
|
|
29
|
+
import { componentsForOSMRow, OSM_LICENSE, sameName } from "#adapters/osm/adapter"
|
|
30
|
+
import { alignAndWrite, type CorpusRecipe, readTuples, type SliceRecipeOpts, sliceSourceID } from "#recipes/scaffold"
|
|
31
|
+
import type { CanonicalRow } from "#types"
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Islamabad's residential sectors: the lettered rows E to I, the numbered columns the Capital Development Authority has
|
|
35
|
+
* developed, and the four sub-sectors each splits into.
|
|
36
|
+
*/
|
|
37
|
+
const ISLAMABAD_SECTOR_ROWS = ["E", "F", "G", "I"] as const
|
|
38
|
+
const ISLAMABAD_SECTOR_COLUMNS = [6, 7, 8, 9, 10, 11] as const
|
|
39
|
+
const ISLAMABAD_SUB_SECTORS = [1, 2, 3, 4] as const
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Share of rows rendered in the house register; the rest take the plain line.
|
|
43
|
+
*/
|
|
44
|
+
const P_HOUSE = 0.55
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Share of house lines that spell the number `House No. 4` / `House # 4` rather than `House 4`.
|
|
48
|
+
*/
|
|
49
|
+
const P_HOUSE_NO = 0.25
|
|
50
|
+
|
|
51
|
+
export type SouthAsiaRegister = "house" | "plain"
|
|
52
|
+
|
|
53
|
+
export interface SouthAsiaRendering {
|
|
54
|
+
raw: string
|
|
55
|
+
components: Record<string, string>
|
|
56
|
+
register: SouthAsiaRegister
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Draw one Islamabad sector code, `F-7/2`.
|
|
61
|
+
*/
|
|
62
|
+
export function drawIslamabadSector(random: () => number): string {
|
|
63
|
+
const row = ISLAMABAD_SECTOR_ROWS[Math.floor(random() * ISLAMABAD_SECTOR_ROWS.length)]!
|
|
64
|
+
const column = ISLAMABAD_SECTOR_COLUMNS[Math.floor(random() * ISLAMABAD_SECTOR_COLUMNS.length)]!
|
|
65
|
+
const sub = ISLAMABAD_SUB_SECTORS[Math.floor(random() * ISLAMABAD_SUB_SECTORS.length)]!
|
|
66
|
+
|
|
67
|
+
return `${row}-${column}/${sub}`
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Render one register line from the adapter's components. Returns null when the row has no house number or no locality:
|
|
72
|
+
* both registers need the two.
|
|
73
|
+
*/
|
|
74
|
+
export function renderSouthAsiaRegister(
|
|
75
|
+
components: CanonicalRow["components"],
|
|
76
|
+
random: () => number,
|
|
77
|
+
register?: SouthAsiaRegister
|
|
78
|
+
): SouthAsiaRendering | null {
|
|
79
|
+
const { house_number: number, street, locality, postcode } = components
|
|
80
|
+
|
|
81
|
+
if (!number || !street || !locality) return null
|
|
82
|
+
|
|
83
|
+
let dependent = components.dependent_locality
|
|
84
|
+
|
|
85
|
+
if (!dependent && sameName(locality, "Islamabad")) {
|
|
86
|
+
dependent = drawIslamabadSector(random)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const chosen = register ?? (random() < P_HOUSE ? "house" : "plain")
|
|
90
|
+
const out: Record<string, string> = { house_number: number, street, locality }
|
|
91
|
+
const tail = postcode ? `${locality} ${postcode}` : locality
|
|
92
|
+
|
|
93
|
+
if (postcode) {
|
|
94
|
+
out.postcode = postcode
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (dependent) {
|
|
98
|
+
out.dependent_locality = dependent
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const middle = dependent ? `${street}, ${dependent}` : street
|
|
102
|
+
|
|
103
|
+
if (chosen === "house") {
|
|
104
|
+
const spelling = random() < P_HOUSE_NO ? (random() < 0.5 ? "House No. " : "House # ") : "House "
|
|
105
|
+
|
|
106
|
+
return { raw: `${spelling}${number}, ${middle}, ${tail}`, components: out, register: "house" }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return { raw: `${number} ${middle}, ${tail}`, components: out, register: "plain" }
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function makeRecipe(name: string, country: "PK" | "BD", locale: string, description: string): CorpusRecipe {
|
|
113
|
+
const source = `synth-${name}`
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
name,
|
|
117
|
+
description,
|
|
118
|
+
mode: "tuples",
|
|
119
|
+
options: [
|
|
120
|
+
{ flag: "--count", description: "Rows to emit (default: every input row once)" },
|
|
121
|
+
{
|
|
122
|
+
flag: "--input",
|
|
123
|
+
description: `The OpenStreetMap ${country} corpus JSONL (osm-${country.toLowerCase()}.corpus.jsonl)`,
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
async run(opts: SliceRecipeOpts, write) {
|
|
127
|
+
if (!opts.input) {
|
|
128
|
+
throw new Error(`${name}: --input <osm-${country.toLowerCase()}.corpus.jsonl> is required`)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const random = makeMulberry32(opts.seed)
|
|
132
|
+
const sourceName = opts.sourceName ?? source
|
|
133
|
+
const registers: Record<string, number> = {}
|
|
134
|
+
let read = 0
|
|
135
|
+
let emitted = 0
|
|
136
|
+
let skipped = 0
|
|
137
|
+
let quarantined = 0
|
|
138
|
+
|
|
139
|
+
for await (const tuple of readTuples(opts.input)) {
|
|
140
|
+
read++
|
|
141
|
+
|
|
142
|
+
if (opts.count !== undefined && emitted >= opts.count) break
|
|
143
|
+
|
|
144
|
+
const components = componentsForOSMRow(tuple as Parameters<typeof componentsForOSMRow>[0])
|
|
145
|
+
const rendering = components ? renderSouthAsiaRegister(components, random) : null
|
|
146
|
+
|
|
147
|
+
if (!rendering) {
|
|
148
|
+
skipped++
|
|
149
|
+
|
|
150
|
+
continue
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (opts.golden) {
|
|
154
|
+
write(JSON.stringify({ raw: rendering.raw, components: rendering.components, country, locale }) + "\n")
|
|
155
|
+
|
|
156
|
+
emitted++
|
|
157
|
+
registers[rendering.register] = (registers[rendering.register] ?? 0) + 1
|
|
158
|
+
|
|
159
|
+
continue
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const ok = alignAndWrite(
|
|
163
|
+
write,
|
|
164
|
+
{
|
|
165
|
+
raw: rendering.raw,
|
|
166
|
+
components: rendering.components,
|
|
167
|
+
country,
|
|
168
|
+
locale,
|
|
169
|
+
source: sourceName,
|
|
170
|
+
source_id: sliceSourceID(sourceName, { raw: rendering.raw }),
|
|
171
|
+
corpus_version: "0.1.0",
|
|
172
|
+
license: OSM_LICENSE,
|
|
173
|
+
},
|
|
174
|
+
`${name}:${rendering.register}`
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
if (ok) {
|
|
178
|
+
emitted++
|
|
179
|
+
registers[rendering.register] = (registers[rendering.register] ?? 0) + 1
|
|
180
|
+
} else {
|
|
181
|
+
quarantined++
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
console.error(
|
|
186
|
+
` ${name}: ${emitted} emitted (${Object.entries(registers)
|
|
187
|
+
.map(([k, v]) => `${k} ${v}`)
|
|
188
|
+
.join(", ")}), ${skipped} skipped, ${quarantined} quarantined of ${read} read`
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
return { read, emitted, skipped }
|
|
192
|
+
},
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Pakistan: `House 4, Street 25, F-7/2, Islamabad` and `B230 Street 5, Block 3, Karachi`.
|
|
198
|
+
*/
|
|
199
|
+
export const pkRegisterRecipe: CorpusRecipe = makeRecipe(
|
|
200
|
+
"pk-register",
|
|
201
|
+
"PK",
|
|
202
|
+
"en-PK",
|
|
203
|
+
"Pakistan typed registers over the OpenStreetMap rows: the House line with the sector or scheme, the plain line with the trailing postcode"
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Bangladesh: `House 34, Road 4, Sector 9, Uttara, Dhaka 1230` and `58 Kalabagan 1st Ln, Dhaka 1205`.
|
|
208
|
+
*/
|
|
209
|
+
export const bdRegisterRecipe: CorpusRecipe = makeRecipe(
|
|
210
|
+
"bd-register",
|
|
211
|
+
"BD",
|
|
212
|
+
"en-BD",
|
|
213
|
+
"Bangladesh typed registers over the OpenStreetMap rows: the House line, the plain line with the trailing postcode and no dash"
|
|
214
|
+
)
|