@mailwoman/corpus 10.1.0 → 10.2.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/data/licenses/cdla-permissive-2.0.md +1 -1
- package/lib/adapters/cordis/adapter.ts +13 -7
- package/lib/adapters/dedup-key.ts +1 -1
- package/lib/adapters/geonames/adapter.ts +1 -1
- package/lib/adapters/gleif/adapter.ts +17 -16
- package/lib/adapters/libpostal-dictionary.ts +0 -2
- package/lib/adapters/openaddresses/adapter.ts +4 -3
- package/lib/adapters/osm/adapter.ts +22 -21
- package/lib/adapters/po-box/adapter.ts +10 -5
- package/lib/adapters/registry.ts +4 -4
- package/lib/adapters/source-id.ts +2 -2
- package/lib/adapters/street-line.ts +7 -6
- package/lib/adapters/wof/admin/json/adapter.ts +2 -2
- package/lib/adapters/wof/json-rows.ts +2 -1
- package/lib/adapters/wof/postalcode-json/adapter.ts +6 -2
- package/lib/adapters.ts +5 -5
- package/lib/au/adapters/gnaf/adapter.ts +1 -1
- package/lib/be/adapters/brussels/adapter.ts +22 -22
- package/lib/be/adapters/vlaanderen/adapter.ts +54 -57
- package/lib/be/adapters/wallonie/adapter.ts +17 -17
- package/lib/be/tools/fetch/brussels.ts +13 -10
- package/lib/be/tools/fetch/wallonie.ts +8 -7
- package/lib/build/adapters.ts +2 -1
- package/lib/build/align.ts +5 -4
- package/lib/build/checkpoint.ts +5 -3
- package/lib/build/eligibility.ts +3 -3
- package/lib/build/types.ts +8 -6
- package/lib/cz/adapters/cuzk/adapter.ts +41 -38
- package/lib/cz/tools/fetch/cuzk.ts +42 -31
- package/lib/de/recipes/locale.ts +1 -1
- package/lib/dk/adapters/inspire/adapter.ts +38 -38
- package/lib/dk/tools/fetch/inspire.ts +16 -14
- package/lib/ee/adapters/ads/adapter.ts +26 -32
- package/lib/ee/tools/fetch/ads.ts +10 -8
- package/lib/es/adapters/bizkaia/adapter.ts +47 -47
- package/lib/es/adapters/catastro/adapter.ts +36 -34
- package/lib/es/adapters/gipuzkoa/adapter.ts +38 -45
- package/lib/es/adapters/navarra/adapter.ts +28 -27
- package/lib/es/cadastre.ts +31 -31
- package/lib/es/tools/fetch/bizkaia.ts +40 -36
- package/lib/es/tools/fetch/catastro.ts +51 -40
- package/lib/es/tools/fetch/gipuzkoa.ts +13 -11
- package/lib/es/tools/fetch/navarra.ts +33 -25
- package/lib/fi/adapters/ryhti/adapter.ts +22 -26
- package/lib/fi/tools/fetch/ryhti.ts +31 -31
- package/lib/fr/adapters/annuaire-education/adapter.ts +13 -11
- package/lib/fr/adapters/ban/adapter.ts +6 -6
- package/lib/fr/adapters/finess/adapter.ts +16 -15
- package/lib/fr/adapters/finess/voie-type.ts +4 -3
- package/lib/fr/insee-country.ts +2 -2
- package/lib/fr/recipes/lieudit.ts +8 -6
- package/lib/fr/tools/fetch/annuaire-education.ts +11 -8
- package/lib/fr/tools/fetch/ban.ts +3 -2
- package/lib/fr/tools/fetch/finess.ts +14 -13
- package/lib/inspire/address.ts +86 -78
- package/lib/inspire/errors.ts +9 -8
- package/lib/inspire/stream.ts +29 -26
- package/lib/international/recipes/locale.ts +13 -9
- package/lib/it/adapters/anac/adapter.ts +51 -46
- package/lib/it/tools/fetch/anac.ts +22 -25
- package/lib/jp/adapters/wof-admin/adapter.ts +2 -6
- package/lib/jp/tools/fetch/houjin.ts +3 -3
- package/lib/kr/adapters/localdata/permit-rows.ts +1 -1
- package/lib/kr/tools/fetch/juso.ts +1 -1
- package/lib/kr/tools/fetch/localdata.ts +2 -2
- package/lib/lu/adapters/bd-adresses/adapter.ts +10 -10
- package/lib/lu/tools/fetch/bd-adresses.ts +15 -13
- package/lib/lv/adapters/varis/adapter.ts +24 -23
- package/lib/lv/tools/fetch/varis.ts +3 -2
- package/lib/nl/adapters/kadaster/adapter.ts +29 -29
- package/lib/nl/tools/fetch/kadaster.ts +16 -12
- package/lib/no/adapters/matrikkelen/adapter.ts +6 -5
- package/lib/no/tools/fetch/matrikkelen.ts +59 -47
- package/lib/parquet/duckdb.ts +7 -4
- package/lib/parquet/readers.ts +3 -3
- package/lib/parquet/schema.ts +1 -1
- package/lib/parquet/writers.ts +3 -2
- package/lib/pl/adapters/emuia/adapter.ts +12 -12
- package/lib/pl/tools/fetch/emuia.ts +10 -9
- package/lib/recipes/bare/postcode.ts +1 -1
- package/lib/recipes/boundary-stress.ts +1 -1
- package/lib/recipes/house-venue.ts +7 -3
- package/lib/recipes/intersection.ts +2 -2
- package/lib/recipes/po/box/cedex/recipe.ts +3 -3
- package/lib/recipes/po/box/cedex/sources.ts +13 -1
- package/lib/recipes/scaffold.ts +31 -21
- package/lib/recipes/sources.ts +16 -3
- package/lib/recipes/street/bare.ts +2 -2
- package/lib/recipes/street.ts +3 -1
- package/lib/recipes/sub/venue/context.ts +2 -0
- package/lib/recipes/sub/venue/render.ts +1 -1
- package/lib/recipes/sub/venue/sources.ts +24 -29
- package/lib/recipes/sub/venue.ts +12 -18
- package/lib/recipes/trailing-region.ts +6 -2
- package/lib/recipes/unit.ts +3 -3
- package/lib/recipes/venue.ts +347 -0
- package/lib/recipes.ts +4 -2
- package/lib/registers.ts +8 -6
- package/lib/ro/adapters/retea-scolara/adapter.ts +5 -5
- package/lib/ro/tools/fetch/retea-scolara.ts +1 -1
- package/lib/runner.ts +4 -3
- package/lib/sg/recipes/register.ts +1 -1
- package/lib/sg/tools/fetch/acra.ts +3 -3
- package/lib/sk/adapters/inspire/adapter.ts +25 -27
- package/lib/sk/tools/fetch/inspire.ts +15 -14
- package/lib/source-register/effective-manifest.ts +3 -3
- package/lib/source-register/register.ts +3 -3
- package/lib/source-register/training-manifest.ts +1 -1
- package/lib/source-register/types.ts +12 -13
- package/lib/subvenue/promotions.ts +1 -1
- package/lib/subvenue/table.ts +4 -4
- package/lib/surfaces/locale.ts +2 -0
- package/lib/synthesizers/anchor-absorption.ts +2 -1
- package/lib/synthesizers/boundary-stress.ts +20 -26
- package/lib/synthesizers/house-venue.ts +26 -30
- package/lib/synthesizers/no-street.ts +2 -1
- package/lib/synthesizers/po-box.ts +6 -3
- package/lib/synthesizers/tail.ts +55 -0
- package/lib/synthesizers/utils.ts +19 -2
- package/lib/test-kit.ts +2 -2
- package/lib/tools/audit.ts +7 -5
- package/lib/tools/corpus-stats.ts +1 -1
- package/lib/tools/fetch/atom.ts +10 -10
- package/lib/tools/fetch/cordis.ts +11 -9
- package/lib/tools/fetch/download/manifest.ts +2 -1
- package/lib/tools/fetch/download/network.ts +4 -4
- package/lib/tools/fetch/download/retry.ts +4 -4
- package/lib/tools/fetch/geonames/dump.ts +5 -3
- package/lib/tools/fetch/geonames/postal.ts +2 -2
- package/lib/tools/fetch/gleif.ts +6 -4
- package/lib/tools/fetch/header.ts +8 -6
- package/lib/tools/fetch/inspire-addresses.ts +41 -36
- package/lib/tools/fetch/openaddresses.ts +1 -1
- package/lib/tools/fetch/vlaanderen-ad.ts +17 -17
- package/lib/tools/fetch/wfs-harvest.ts +39 -28
- package/lib/tools/fetch.ts +0 -42
- package/lib/tools/golden/expand.ts +8 -8
- package/lib/tools/golden/promote.ts +12 -8
- package/lib/tools/golden/relabel-street/directory.ts +7 -6
- package/lib/tools/golden/relabel-street/row.ts +7 -6
- package/lib/tools/ingest-csv.ts +3 -3
- package/lib/tools/jsonl-to-parquet.ts +1 -1
- package/lib/tools/lint/recipe-output/vocab.ts +10 -5
- package/lib/tools/lint/recipe-output.ts +26 -8
- package/lib/tools/overlay/kryptonite.ts +4 -3
- package/lib/tools/overlay/manifest.ts +4 -2
- package/lib/tools/overlay/merge-source.ts +2 -1
- package/lib/tools/overlay/split-slice.ts +2 -2
- package/lib/tools/overlay/translit.ts +6 -4
- package/lib/tools/overture-subvenue.ts +1 -1
- package/lib/tools/postcode-triples.ts +5 -4
- package/lib/tools/source-register/build.ts +17 -14
- package/lib/tools/sub/venue/lexicon.ts +4 -8
- package/lib/tw/tools/fetch/gcis.ts +4 -4
- package/lib/types.ts +4 -3
- package/lib/us/adapters/state/hi-schools/workbook.ts +1 -1
- package/lib/us/adapters/usgov/nad/adapter.ts +11 -11
- package/lib/us/adapters/usgov/samhsa-treatment-locator/adapter.ts +4 -4
- package/lib/us/fips-state.ts +2 -2
- package/lib/{synthesizers → us/synthesizers}/intersection.ts +12 -13
- package/lib/{synthesizers → us/synthesizers}/street.ts +16 -15
- package/lib/us/tools/fetch/imls-pls.ts +1 -1
- package/lib/us/tools/fetch/nad.ts +7 -7
- package/lib/us/tools/fetch/nppes.ts +5 -5
- package/lib/us/tools/fetch/state/hi-schools.ts +3 -2
- package/lib/us/tools/fetch/tiger-full.ts +1 -1
- package/lib/utils/align.ts +13 -10
- package/lib/utils/golden.ts +2 -2
- package/lib/utils/license.ts +3 -3
- package/lib/utils/split.ts +19 -15
- package/lib/utils/tokenize.ts +7 -26
- package/lib/utils/wof-json.ts +4 -4
- package/out/adapters/cordis/adapter.d.ts +5 -3
- package/out/adapters/cordis/adapter.d.ts.map +1 -1
- package/out/adapters/cordis/adapter.js +13 -7
- package/out/adapters/cordis/adapter.js.map +1 -1
- package/out/adapters/dedup-key.d.ts +1 -1
- package/out/adapters/dedup-key.js +1 -1
- package/out/adapters/geonames/adapter.js +1 -1
- package/out/adapters/geonames/adapter.js.map +1 -1
- package/out/adapters/gleif/adapter.d.ts +9 -9
- package/out/adapters/gleif/adapter.d.ts.map +1 -1
- package/out/adapters/gleif/adapter.js +15 -14
- package/out/adapters/gleif/adapter.js.map +1 -1
- package/out/adapters/libpostal-dictionary.d.ts +0 -2
- package/out/adapters/libpostal-dictionary.d.ts.map +1 -1
- package/out/adapters/libpostal-dictionary.js +0 -2
- package/out/adapters/libpostal-dictionary.js.map +1 -1
- package/out/adapters/openaddresses/adapter.d.ts +3 -2
- package/out/adapters/openaddresses/adapter.d.ts.map +1 -1
- package/out/adapters/openaddresses/adapter.js +1 -1
- package/out/adapters/openaddresses/adapter.js.map +1 -1
- package/out/adapters/osm/adapter.d.ts +17 -16
- package/out/adapters/osm/adapter.d.ts.map +1 -1
- package/out/adapters/osm/adapter.js +10 -9
- package/out/adapters/osm/adapter.js.map +1 -1
- package/out/adapters/po-box/adapter.d.ts +6 -3
- package/out/adapters/po-box/adapter.d.ts.map +1 -1
- package/out/adapters/po-box/adapter.js +4 -2
- package/out/adapters/po-box/adapter.js.map +1 -1
- package/out/adapters/registry.d.ts +3 -3
- package/out/adapters/registry.d.ts.map +1 -1
- package/out/adapters/registry.js +1 -1
- package/out/adapters/registry.js.map +1 -1
- package/out/adapters/source-id.d.ts +2 -2
- package/out/adapters/source-id.js +2 -2
- package/out/adapters/street-line.d.ts +7 -6
- package/out/adapters/street-line.d.ts.map +1 -1
- package/out/adapters/street-line.js +7 -6
- package/out/adapters/street-line.js.map +1 -1
- package/out/adapters/wof/admin/json/adapter.js +1 -1
- package/out/adapters/wof/admin/json/adapter.js.map +1 -1
- package/out/adapters/wof/json-rows.d.ts +2 -1
- package/out/adapters/wof/json-rows.d.ts.map +1 -1
- package/out/adapters/wof/json-rows.js.map +1 -1
- package/out/adapters/wof/postalcode-json/adapter.d.ts.map +1 -1
- package/out/adapters/wof/postalcode-json/adapter.js +5 -1
- package/out/adapters/wof/postalcode-json/adapter.js.map +1 -1
- package/out/adapters.d.ts +5 -5
- package/out/adapters.js +5 -5
- package/out/au/adapters/gnaf/adapter.js +1 -1
- package/out/au/adapters/gnaf/adapter.js.map +1 -1
- package/out/be/adapters/brussels/adapter.d.ts +9 -9
- package/out/be/adapters/brussels/adapter.d.ts.map +1 -1
- package/out/be/adapters/brussels/adapter.js +21 -21
- package/out/be/adapters/brussels/adapter.js.map +1 -1
- package/out/be/adapters/vlaanderen/adapter.d.ts +34 -37
- package/out/be/adapters/vlaanderen/adapter.d.ts.map +1 -1
- package/out/be/adapters/vlaanderen/adapter.js +40 -38
- package/out/be/adapters/vlaanderen/adapter.js.map +1 -1
- package/out/be/adapters/wallonie/adapter.d.ts +2 -2
- package/out/be/adapters/wallonie/adapter.js +17 -17
- package/out/be/adapters/wallonie/adapter.js.map +1 -1
- package/out/be/tools/fetch/brussels.d.ts +11 -8
- package/out/be/tools/fetch/brussels.d.ts.map +1 -1
- package/out/be/tools/fetch/brussels.js +10 -8
- package/out/be/tools/fetch/brussels.js.map +1 -1
- package/out/be/tools/fetch/wallonie.d.ts +6 -5
- package/out/be/tools/fetch/wallonie.d.ts.map +1 -1
- package/out/be/tools/fetch/wallonie.js +4 -4
- package/out/be/tools/fetch/wallonie.js.map +1 -1
- package/out/build/adapters.d.ts.map +1 -1
- package/out/build/adapters.js +2 -1
- package/out/build/adapters.js.map +1 -1
- package/out/build/align.d.ts +3 -2
- package/out/build/align.d.ts.map +1 -1
- package/out/build/align.js +2 -2
- package/out/build/align.js.map +1 -1
- package/out/build/checkpoint.d.ts +1 -1
- package/out/build/checkpoint.d.ts.map +1 -1
- package/out/build/checkpoint.js +4 -2
- package/out/build/checkpoint.js.map +1 -1
- package/out/build/eligibility.d.ts +2 -2
- package/out/build/eligibility.js +3 -3
- package/out/build/eligibility.js.map +1 -1
- package/out/build/types.d.ts +8 -6
- package/out/build/types.d.ts.map +1 -1
- package/out/cz/adapters/cuzk/adapter.d.ts +14 -14
- package/out/cz/adapters/cuzk/adapter.d.ts.map +1 -1
- package/out/cz/adapters/cuzk/adapter.js +38 -35
- package/out/cz/adapters/cuzk/adapter.js.map +1 -1
- package/out/cz/tools/fetch/cuzk.d.ts +31 -22
- package/out/cz/tools/fetch/cuzk.d.ts.map +1 -1
- package/out/cz/tools/fetch/cuzk.js +21 -19
- package/out/cz/tools/fetch/cuzk.js.map +1 -1
- package/out/de/recipes/locale.js +1 -1
- package/out/de/recipes/locale.js.map +1 -1
- package/out/dk/adapters/inspire/adapter.d.ts +32 -33
- package/out/dk/adapters/inspire/adapter.d.ts.map +1 -1
- package/out/dk/adapters/inspire/adapter.js +38 -38
- package/out/dk/adapters/inspire/adapter.js.map +1 -1
- package/out/dk/tools/fetch/inspire.d.ts +6 -5
- package/out/dk/tools/fetch/inspire.d.ts.map +1 -1
- package/out/dk/tools/fetch/inspire.js +15 -13
- package/out/dk/tools/fetch/inspire.js.map +1 -1
- package/out/ee/adapters/ads/adapter.d.ts +19 -26
- package/out/ee/adapters/ads/adapter.d.ts.map +1 -1
- package/out/ee/adapters/ads/adapter.js +22 -28
- package/out/ee/adapters/ads/adapter.js.map +1 -1
- package/out/ee/tools/fetch/ads.d.ts +3 -3
- package/out/ee/tools/fetch/ads.d.ts.map +1 -1
- package/out/ee/tools/fetch/ads.js +10 -8
- package/out/ee/tools/fetch/ads.js.map +1 -1
- package/out/es/adapters/bizkaia/adapter.d.ts +28 -28
- package/out/es/adapters/bizkaia/adapter.d.ts.map +1 -1
- package/out/es/adapters/bizkaia/adapter.js +43 -43
- package/out/es/adapters/bizkaia/adapter.js.map +1 -1
- package/out/es/adapters/catastro/adapter.d.ts +22 -23
- package/out/es/adapters/catastro/adapter.d.ts.map +1 -1
- package/out/es/adapters/catastro/adapter.js +35 -33
- package/out/es/adapters/catastro/adapter.js.map +1 -1
- package/out/es/adapters/gipuzkoa/adapter.d.ts +31 -38
- package/out/es/adapters/gipuzkoa/adapter.d.ts.map +1 -1
- package/out/es/adapters/gipuzkoa/adapter.js +40 -47
- package/out/es/adapters/gipuzkoa/adapter.js.map +1 -1
- package/out/es/adapters/navarra/adapter.d.ts +20 -19
- package/out/es/adapters/navarra/adapter.d.ts.map +1 -1
- package/out/es/adapters/navarra/adapter.js +23 -22
- package/out/es/adapters/navarra/adapter.js.map +1 -1
- package/out/es/cadastre.d.ts +21 -20
- package/out/es/cadastre.d.ts.map +1 -1
- package/out/es/cadastre.js +19 -21
- package/out/es/cadastre.js.map +1 -1
- package/out/es/tools/fetch/bizkaia.d.ts +28 -25
- package/out/es/tools/fetch/bizkaia.d.ts.map +1 -1
- package/out/es/tools/fetch/bizkaia.js +25 -24
- package/out/es/tools/fetch/bizkaia.js.map +1 -1
- package/out/es/tools/fetch/catastro.d.ts +28 -20
- package/out/es/tools/fetch/catastro.d.ts.map +1 -1
- package/out/es/tools/fetch/catastro.js +36 -31
- package/out/es/tools/fetch/catastro.js.map +1 -1
- package/out/es/tools/fetch/gipuzkoa.d.ts +11 -9
- package/out/es/tools/fetch/gipuzkoa.d.ts.map +1 -1
- package/out/es/tools/fetch/gipuzkoa.js +9 -8
- package/out/es/tools/fetch/gipuzkoa.js.map +1 -1
- package/out/es/tools/fetch/navarra.d.ts +20 -15
- package/out/es/tools/fetch/navarra.d.ts.map +1 -1
- package/out/es/tools/fetch/navarra.js +21 -16
- package/out/es/tools/fetch/navarra.js.map +1 -1
- package/out/fi/adapters/ryhti/adapter.d.ts +16 -20
- package/out/fi/adapters/ryhti/adapter.d.ts.map +1 -1
- package/out/fi/adapters/ryhti/adapter.js +21 -25
- package/out/fi/adapters/ryhti/adapter.js.map +1 -1
- package/out/fi/tools/fetch/ryhti.d.ts +24 -24
- package/out/fi/tools/fetch/ryhti.d.ts.map +1 -1
- package/out/fi/tools/fetch/ryhti.js +21 -24
- package/out/fi/tools/fetch/ryhti.js.map +1 -1
- package/out/fr/adapters/annuaire-education/adapter.d.ts +8 -8
- package/out/fr/adapters/annuaire-education/adapter.d.ts.map +1 -1
- package/out/fr/adapters/annuaire-education/adapter.js +13 -11
- package/out/fr/adapters/annuaire-education/adapter.js.map +1 -1
- package/out/fr/adapters/ban/adapter.d.ts +4 -4
- package/out/fr/adapters/ban/adapter.js +6 -6
- package/out/fr/adapters/ban/adapter.js.map +1 -1
- package/out/fr/adapters/finess/adapter.d.ts +12 -11
- package/out/fr/adapters/finess/adapter.d.ts.map +1 -1
- package/out/fr/adapters/finess/adapter.js +16 -15
- package/out/fr/adapters/finess/adapter.js.map +1 -1
- package/out/fr/adapters/finess/voie-type.d.ts +2 -2
- package/out/fr/adapters/finess/voie-type.d.ts.map +1 -1
- package/out/fr/adapters/finess/voie-type.js +4 -3
- package/out/fr/adapters/finess/voie-type.js.map +1 -1
- package/out/fr/insee-country.d.ts +2 -2
- package/out/fr/insee-country.js +2 -2
- package/out/fr/recipes/lieudit.d.ts.map +1 -1
- package/out/fr/recipes/lieudit.js +5 -4
- package/out/fr/recipes/lieudit.js.map +1 -1
- package/out/fr/tools/fetch/annuaire-education.d.ts +7 -4
- package/out/fr/tools/fetch/annuaire-education.d.ts.map +1 -1
- package/out/fr/tools/fetch/annuaire-education.js +9 -7
- package/out/fr/tools/fetch/annuaire-education.js.map +1 -1
- package/out/fr/tools/fetch/ban.d.ts +1 -1
- package/out/fr/tools/fetch/ban.d.ts.map +1 -1
- package/out/fr/tools/fetch/ban.js +3 -2
- package/out/fr/tools/fetch/ban.js.map +1 -1
- package/out/fr/tools/fetch/finess.d.ts +5 -5
- package/out/fr/tools/fetch/finess.d.ts.map +1 -1
- package/out/fr/tools/fetch/finess.js +13 -12
- package/out/fr/tools/fetch/finess.js.map +1 -1
- package/out/inspire/address.d.ts +62 -52
- package/out/inspire/address.d.ts.map +1 -1
- package/out/inspire/address.js +71 -60
- package/out/inspire/address.js.map +1 -1
- package/out/inspire/errors.d.ts +9 -8
- package/out/inspire/errors.d.ts.map +1 -1
- package/out/inspire/errors.js +7 -6
- package/out/inspire/errors.js.map +1 -1
- package/out/inspire/stream.d.ts +25 -22
- package/out/inspire/stream.d.ts.map +1 -1
- package/out/inspire/stream.js +10 -12
- package/out/inspire/stream.js.map +1 -1
- package/out/international/recipes/locale.d.ts +2 -2
- package/out/international/recipes/locale.d.ts.map +1 -1
- package/out/international/recipes/locale.js +11 -7
- package/out/international/recipes/locale.js.map +1 -1
- package/out/it/adapters/anac/adapter.d.ts +45 -43
- package/out/it/adapters/anac/adapter.d.ts.map +1 -1
- package/out/it/adapters/anac/adapter.js +48 -43
- package/out/it/adapters/anac/adapter.js.map +1 -1
- package/out/it/tools/fetch/anac.d.ts +16 -19
- package/out/it/tools/fetch/anac.d.ts.map +1 -1
- package/out/it/tools/fetch/anac.js +20 -23
- package/out/it/tools/fetch/anac.js.map +1 -1
- package/out/jp/adapters/wof-admin/adapter.d.ts.map +1 -1
- package/out/jp/adapters/wof-admin/adapter.js.map +1 -1
- package/out/jp/tools/fetch/houjin.js +2 -2
- package/out/jp/tools/fetch/houjin.js.map +1 -1
- package/out/kr/adapters/localdata/permit-rows.js +1 -1
- package/out/kr/adapters/localdata/permit-rows.js.map +1 -1
- package/out/kr/tools/fetch/juso.d.ts +1 -1
- package/out/kr/tools/fetch/localdata.d.ts +1 -1
- package/out/kr/tools/fetch/localdata.js +1 -1
- package/out/kr/tools/fetch/localdata.js.map +1 -1
- package/out/lu/adapters/bd-adresses/adapter.d.ts +9 -9
- package/out/lu/adapters/bd-adresses/adapter.js +10 -10
- package/out/lu/tools/fetch/bd-adresses.d.ts +11 -9
- package/out/lu/tools/fetch/bd-adresses.d.ts.map +1 -1
- package/out/lu/tools/fetch/bd-adresses.js +11 -11
- package/out/lu/tools/fetch/bd-adresses.js.map +1 -1
- package/out/lv/adapters/varis/adapter.d.ts +24 -23
- package/out/lv/adapters/varis/adapter.d.ts.map +1 -1
- package/out/lv/adapters/varis/adapter.js +24 -23
- package/out/lv/adapters/varis/adapter.js.map +1 -1
- package/out/lv/tools/fetch/varis.d.ts +2 -1
- package/out/lv/tools/fetch/varis.d.ts.map +1 -1
- package/out/lv/tools/fetch/varis.js +1 -1
- package/out/lv/tools/fetch/varis.js.map +1 -1
- package/out/nl/adapters/kadaster/adapter.d.ts +12 -12
- package/out/nl/adapters/kadaster/adapter.d.ts.map +1 -1
- package/out/nl/adapters/kadaster/adapter.js +22 -23
- package/out/nl/adapters/kadaster/adapter.js.map +1 -1
- package/out/nl/tools/fetch/kadaster.d.ts +14 -10
- package/out/nl/tools/fetch/kadaster.d.ts.map +1 -1
- package/out/nl/tools/fetch/kadaster.js +12 -9
- package/out/nl/tools/fetch/kadaster.js.map +1 -1
- package/out/no/adapters/matrikkelen/adapter.d.ts +1 -1
- package/out/no/adapters/matrikkelen/adapter.d.ts.map +1 -1
- package/out/no/adapters/matrikkelen/adapter.js +3 -3
- package/out/no/adapters/matrikkelen/adapter.js.map +1 -1
- package/out/no/tools/fetch/matrikkelen.d.ts +50 -38
- package/out/no/tools/fetch/matrikkelen.d.ts.map +1 -1
- package/out/no/tools/fetch/matrikkelen.js +44 -36
- package/out/no/tools/fetch/matrikkelen.js.map +1 -1
- package/out/parquet/duckdb.d.ts +7 -4
- package/out/parquet/duckdb.d.ts.map +1 -1
- package/out/parquet/duckdb.js +2 -1
- package/out/parquet/duckdb.js.map +1 -1
- package/out/parquet/readers.js +3 -3
- package/out/parquet/readers.js.map +1 -1
- package/out/parquet/schema.js +1 -1
- package/out/parquet/schema.js.map +1 -1
- package/out/parquet/writers.d.ts +1 -1
- package/out/parquet/writers.d.ts.map +1 -1
- package/out/parquet/writers.js +2 -1
- package/out/parquet/writers.js.map +1 -1
- package/out/pl/adapters/emuia/adapter.d.ts +8 -8
- package/out/pl/adapters/emuia/adapter.js +12 -12
- package/out/pl/adapters/emuia/adapter.js.map +1 -1
- package/out/pl/tools/fetch/emuia.d.ts +5 -4
- package/out/pl/tools/fetch/emuia.d.ts.map +1 -1
- package/out/pl/tools/fetch/emuia.js +10 -9
- package/out/pl/tools/fetch/emuia.js.map +1 -1
- package/out/recipes/bare/postcode.js +1 -1
- package/out/recipes/bare/postcode.js.map +1 -1
- package/out/recipes/boundary-stress.js +1 -1
- package/out/recipes/boundary-stress.js.map +1 -1
- package/out/recipes/house-venue.d.ts.map +1 -1
- package/out/recipes/house-venue.js +6 -3
- package/out/recipes/house-venue.js.map +1 -1
- package/out/recipes/intersection.js +2 -2
- package/out/recipes/intersection.js.map +1 -1
- package/out/recipes/po/box/cedex/recipe.js +2 -1
- package/out/recipes/po/box/cedex/recipe.js.map +1 -1
- package/out/recipes/po/box/cedex/sources.d.ts +8 -2
- package/out/recipes/po/box/cedex/sources.d.ts.map +1 -1
- package/out/recipes/po/box/cedex/sources.js +1 -1
- package/out/recipes/po/box/cedex/sources.js.map +1 -1
- package/out/recipes/scaffold.d.ts +28 -19
- package/out/recipes/scaffold.d.ts.map +1 -1
- package/out/recipes/scaffold.js +3 -2
- package/out/recipes/scaffold.js.map +1 -1
- package/out/recipes/sources.d.ts +1 -1
- package/out/recipes/sources.d.ts.map +1 -1
- package/out/recipes/sources.js +15 -2
- package/out/recipes/sources.js.map +1 -1
- package/out/recipes/street/bare.js +2 -2
- package/out/recipes/street/bare.js.map +1 -1
- package/out/recipes/street.d.ts.map +1 -1
- package/out/recipes/street.js +3 -1
- package/out/recipes/street.js.map +1 -1
- package/out/recipes/sub/venue/context.d.ts.map +1 -1
- package/out/recipes/sub/venue/context.js +2 -0
- package/out/recipes/sub/venue/context.js.map +1 -1
- package/out/recipes/sub/venue/render.js +1 -1
- package/out/recipes/sub/venue/render.js.map +1 -1
- package/out/recipes/sub/venue/sources.d.ts +6 -3
- package/out/recipes/sub/venue/sources.d.ts.map +1 -1
- package/out/recipes/sub/venue/sources.js +16 -20
- package/out/recipes/sub/venue/sources.js.map +1 -1
- package/out/recipes/sub/venue.d.ts +2 -5
- package/out/recipes/sub/venue.d.ts.map +1 -1
- package/out/recipes/sub/venue.js +10 -14
- package/out/recipes/sub/venue.js.map +1 -1
- 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 +2 -2
- package/out/recipes/unit.js.map +1 -1
- package/out/recipes/venue.d.ts +119 -0
- package/out/recipes/venue.d.ts.map +1 -0
- package/out/recipes/venue.js +245 -0
- package/out/recipes/venue.js.map +1 -0
- package/out/recipes.d.ts +1 -1
- package/out/recipes.d.ts.map +1 -1
- package/out/recipes.js +3 -1
- package/out/recipes.js.map +1 -1
- package/out/registers.d.ts +8 -6
- package/out/registers.d.ts.map +1 -1
- package/out/registers.js +8 -6
- package/out/registers.js.map +1 -1
- package/out/ro/adapters/retea-scolara/adapter.d.ts +5 -5
- package/out/ro/adapters/retea-scolara/adapter.js +5 -5
- package/out/ro/tools/fetch/retea-scolara.js +1 -1
- package/out/ro/tools/fetch/retea-scolara.js.map +1 -1
- package/out/runner.d.ts +3 -2
- package/out/runner.d.ts.map +1 -1
- package/out/runner.js +1 -1
- package/out/runner.js.map +1 -1
- package/out/sg/recipes/register.js +1 -1
- package/out/sg/recipes/register.js.map +1 -1
- package/out/sg/tools/fetch/acra.js +2 -2
- package/out/sg/tools/fetch/acra.js.map +1 -1
- package/out/sk/adapters/inspire/adapter.d.ts +5 -5
- package/out/sk/adapters/inspire/adapter.d.ts.map +1 -1
- package/out/sk/adapters/inspire/adapter.js +18 -18
- package/out/sk/adapters/inspire/adapter.js.map +1 -1
- package/out/sk/tools/fetch/inspire.d.ts +11 -10
- package/out/sk/tools/fetch/inspire.d.ts.map +1 -1
- package/out/sk/tools/fetch/inspire.js +15 -14
- package/out/sk/tools/fetch/inspire.js.map +1 -1
- package/out/source-register/effective-manifest.js +3 -3
- package/out/source-register/effective-manifest.js.map +1 -1
- package/out/source-register/register.d.ts +2 -2
- package/out/source-register/register.d.ts.map +1 -1
- package/out/source-register/register.js +2 -2
- package/out/source-register/register.js.map +1 -1
- package/out/source-register/training-manifest.d.ts +1 -1
- package/out/source-register/types.d.ts +12 -13
- package/out/source-register/types.d.ts.map +1 -1
- package/out/source-register/types.js +2 -2
- package/out/source-register/types.js.map +1 -1
- package/out/subvenue/promotions.d.ts +1 -1
- package/out/subvenue/promotions.js +1 -1
- package/out/subvenue/table.d.ts +4 -4
- package/out/subvenue/table.js +3 -3
- package/out/surfaces/locale.d.ts.map +1 -1
- package/out/surfaces/locale.js +2 -0
- package/out/surfaces/locale.js.map +1 -1
- package/out/synthesizers/anchor-absorption.d.ts +2 -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.d.ts +1 -1
- package/out/synthesizers/boundary-stress.d.ts.map +1 -1
- package/out/synthesizers/boundary-stress.js +20 -23
- package/out/synthesizers/boundary-stress.js.map +1 -1
- package/out/synthesizers/house-venue.d.ts +3 -2
- package/out/synthesizers/house-venue.d.ts.map +1 -1
- package/out/synthesizers/house-venue.js +24 -26
- package/out/synthesizers/house-venue.js.map +1 -1
- package/out/synthesizers/no-street.d.ts.map +1 -1
- package/out/synthesizers/no-street.js.map +1 -1
- package/out/synthesizers/po-box.d.ts +4 -2
- package/out/synthesizers/po-box.d.ts.map +1 -1
- package/out/synthesizers/po-box.js.map +1 -1
- package/out/synthesizers/tail.d.ts +36 -0
- package/out/synthesizers/tail.d.ts.map +1 -0
- package/out/synthesizers/tail.js +32 -0
- package/out/synthesizers/tail.js.map +1 -0
- package/out/synthesizers/utils.d.ts +2 -1
- package/out/synthesizers/utils.d.ts.map +1 -1
- package/out/synthesizers/utils.js +17 -1
- package/out/synthesizers/utils.js.map +1 -1
- package/out/test-kit.js +2 -2
- package/out/test-kit.js.map +1 -1
- package/out/tools/audit.d.ts +2 -1
- package/out/tools/audit.d.ts.map +1 -1
- package/out/tools/audit.js +4 -3
- package/out/tools/audit.js.map +1 -1
- package/out/tools/corpus-stats.js +1 -1
- package/out/tools/corpus-stats.js.map +1 -1
- package/out/tools/fetch/atom.d.ts +8 -8
- package/out/tools/fetch/atom.d.ts.map +1 -1
- package/out/tools/fetch/atom.js +7 -8
- package/out/tools/fetch/atom.js.map +1 -1
- package/out/tools/fetch/cordis.d.ts +4 -3
- package/out/tools/fetch/cordis.d.ts.map +1 -1
- package/out/tools/fetch/cordis.js +9 -7
- package/out/tools/fetch/cordis.js.map +1 -1
- package/out/tools/fetch/download/manifest.d.ts.map +1 -1
- package/out/tools/fetch/download/manifest.js +2 -1
- package/out/tools/fetch/download/manifest.js.map +1 -1
- package/out/tools/fetch/download/network.d.ts +4 -4
- package/out/tools/fetch/download/retry.js +4 -4
- package/out/tools/fetch/download/retry.js.map +1 -1
- package/out/tools/fetch/geonames/dump.d.ts +3 -2
- package/out/tools/fetch/geonames/dump.d.ts.map +1 -1
- package/out/tools/fetch/geonames/dump.js +2 -1
- package/out/tools/fetch/geonames/dump.js.map +1 -1
- package/out/tools/fetch/geonames/postal.d.ts +2 -2
- package/out/tools/fetch/gleif.d.ts +3 -2
- package/out/tools/fetch/gleif.d.ts.map +1 -1
- package/out/tools/fetch/gleif.js +6 -4
- package/out/tools/fetch/gleif.js.map +1 -1
- package/out/tools/fetch/header.d.ts +7 -5
- package/out/tools/fetch/header.d.ts.map +1 -1
- package/out/tools/fetch/header.js +8 -6
- package/out/tools/fetch/header.js.map +1 -1
- package/out/tools/fetch/inspire-addresses.d.ts +32 -27
- package/out/tools/fetch/inspire-addresses.d.ts.map +1 -1
- package/out/tools/fetch/inspire-addresses.js +25 -24
- package/out/tools/fetch/inspire-addresses.js.map +1 -1
- package/out/tools/fetch/openaddresses.js +1 -1
- package/out/tools/fetch/openaddresses.js.map +1 -1
- package/out/tools/fetch/vlaanderen-ad.d.ts +5 -5
- package/out/tools/fetch/vlaanderen-ad.d.ts.map +1 -1
- package/out/tools/fetch/vlaanderen-ad.js +16 -16
- package/out/tools/fetch/vlaanderen-ad.js.map +1 -1
- package/out/tools/fetch/wfs-harvest.d.ts +26 -16
- package/out/tools/fetch/wfs-harvest.d.ts.map +1 -1
- package/out/tools/fetch/wfs-harvest.js +21 -18
- package/out/tools/fetch/wfs-harvest.js.map +1 -1
- package/out/tools/fetch.d.ts +0 -41
- package/out/tools/fetch.d.ts.map +1 -1
- package/out/tools/fetch.js +0 -41
- package/out/tools/fetch.js.map +1 -1
- package/out/tools/golden/expand.d.ts +7 -7
- package/out/tools/golden/expand.js +1 -1
- package/out/tools/golden/expand.js.map +1 -1
- package/out/tools/golden/promote.d.ts +2 -2
- package/out/tools/golden/promote.d.ts.map +1 -1
- package/out/tools/golden/promote.js +9 -6
- package/out/tools/golden/promote.js.map +1 -1
- package/out/tools/golden/relabel-street/directory.d.ts +4 -4
- package/out/tools/golden/relabel-street/directory.d.ts.map +1 -1
- package/out/tools/golden/relabel-street/directory.js +3 -2
- package/out/tools/golden/relabel-street/directory.js.map +1 -1
- package/out/tools/golden/relabel-street/row.d.ts +4 -3
- package/out/tools/golden/relabel-street/row.d.ts.map +1 -1
- package/out/tools/golden/relabel-street/row.js +3 -3
- package/out/tools/golden/relabel-street/row.js.map +1 -1
- package/out/tools/ingest-csv.js +3 -3
- package/out/tools/ingest-csv.js.map +1 -1
- package/out/tools/jsonl-to-parquet.d.ts +1 -1
- package/out/tools/lint/recipe-output/vocab.d.ts +10 -5
- package/out/tools/lint/recipe-output/vocab.d.ts.map +1 -1
- package/out/tools/lint/recipe-output/vocab.js.map +1 -1
- package/out/tools/lint/recipe-output.d.ts +8 -8
- package/out/tools/lint/recipe-output.d.ts.map +1 -1
- package/out/tools/lint/recipe-output.js +17 -0
- package/out/tools/lint/recipe-output.js.map +1 -1
- package/out/tools/overlay/kryptonite.d.ts +2 -2
- package/out/tools/overlay/kryptonite.d.ts.map +1 -1
- package/out/tools/overlay/kryptonite.js +2 -1
- package/out/tools/overlay/kryptonite.js.map +1 -1
- package/out/tools/overlay/manifest.d.ts +2 -1
- package/out/tools/overlay/manifest.d.ts.map +1 -1
- package/out/tools/overlay/manifest.js +2 -1
- package/out/tools/overlay/manifest.js.map +1 -1
- package/out/tools/overlay/merge-source.d.ts +2 -1
- package/out/tools/overlay/merge-source.d.ts.map +1 -1
- package/out/tools/overlay/merge-source.js.map +1 -1
- package/out/tools/overlay/split-slice.d.ts +1 -1
- package/out/tools/overlay/split-slice.js +1 -1
- package/out/tools/overlay/split-slice.js.map +1 -1
- package/out/tools/overlay/translit.d.ts +4 -3
- package/out/tools/overlay/translit.d.ts.map +1 -1
- package/out/tools/overlay/translit.js +2 -1
- package/out/tools/overlay/translit.js.map +1 -1
- package/out/tools/overture-subvenue.d.ts +1 -1
- package/out/tools/overture-subvenue.d.ts.map +1 -1
- package/out/tools/postcode-triples.d.ts +1 -1
- package/out/tools/postcode-triples.d.ts.map +1 -1
- package/out/tools/postcode-triples.js +4 -3
- package/out/tools/postcode-triples.js.map +1 -1
- package/out/tools/source-register/build.d.ts +10 -8
- package/out/tools/source-register/build.d.ts.map +1 -1
- package/out/tools/source-register/build.js +10 -8
- package/out/tools/source-register/build.js.map +1 -1
- package/out/tools/sub/venue/lexicon.d.ts +2 -6
- package/out/tools/sub/venue/lexicon.d.ts.map +1 -1
- package/out/tools/sub/venue/lexicon.js +2 -6
- package/out/tools/sub/venue/lexicon.js.map +1 -1
- package/out/tw/tools/fetch/gcis.js +3 -3
- package/out/tw/tools/fetch/gcis.js.map +1 -1
- package/out/types.d.ts +4 -3
- package/out/types.d.ts.map +1 -1
- package/out/types.js.map +1 -1
- package/out/us/adapters/state/hi-schools/workbook.d.ts +1 -1
- package/out/us/adapters/state/hi-schools/workbook.d.ts.map +1 -1
- package/out/us/adapters/state/hi-schools/workbook.js.map +1 -1
- package/out/us/adapters/usgov/nad/adapter.js +6 -6
- package/out/us/adapters/usgov/nad/adapter.js.map +1 -1
- package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js +2 -2
- package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js.map +1 -1
- package/out/us/fips-state.d.ts +2 -2
- package/out/us/fips-state.d.ts.map +1 -1
- package/out/us/fips-state.js.map +1 -1
- package/out/us/synthesizers/intersection.d.ts.map +1 -0
- package/out/{synthesizers → us/synthesizers}/intersection.js +13 -9
- package/out/us/synthesizers/intersection.js.map +1 -0
- package/out/{synthesizers → us/synthesizers}/street.d.ts +3 -2
- package/out/us/synthesizers/street.d.ts.map +1 -0
- package/out/{synthesizers → us/synthesizers}/street.js +12 -12
- package/out/us/synthesizers/street.js.map +1 -0
- package/out/us/tools/fetch/imls-pls.js +1 -1
- package/out/us/tools/fetch/imls-pls.js.map +1 -1
- package/out/us/tools/fetch/nad.d.ts +6 -6
- package/out/us/tools/fetch/nad.js +1 -1
- package/out/us/tools/fetch/nad.js.map +1 -1
- package/out/us/tools/fetch/nppes.js +3 -3
- package/out/us/tools/fetch/nppes.js.map +1 -1
- package/out/us/tools/fetch/state/hi-schools.d.ts +2 -1
- package/out/us/tools/fetch/state/hi-schools.d.ts.map +1 -1
- package/out/us/tools/fetch/state/hi-schools.js +1 -1
- package/out/us/tools/fetch/state/hi-schools.js.map +1 -1
- package/out/us/tools/fetch/tiger-full.js +1 -1
- package/out/us/tools/fetch/tiger-full.js.map +1 -1
- package/out/utils/align.d.ts +5 -3
- package/out/utils/align.d.ts.map +1 -1
- package/out/utils/align.js +5 -5
- package/out/utils/align.js.map +1 -1
- package/out/utils/golden.js +2 -2
- package/out/utils/golden.js.map +1 -1
- package/out/utils/license.d.ts +3 -3
- package/out/utils/license.d.ts.map +1 -1
- package/out/utils/license.js.map +1 -1
- package/out/utils/split.d.ts +1 -1
- package/out/utils/split.d.ts.map +1 -1
- package/out/utils/split.js +18 -14
- package/out/utils/split.js.map +1 -1
- package/out/utils/tokenize.d.ts +3 -20
- package/out/utils/tokenize.d.ts.map +1 -1
- package/out/utils/tokenize.js.map +1 -1
- package/out/utils/wof-json.js +3 -3
- package/out/utils/wof-json.js.map +1 -1
- package/package.json +18 -27
- package/lib/tools.ts +0 -31
- package/out/synthesizers/intersection.d.ts.map +0 -1
- package/out/synthesizers/intersection.js.map +0 -1
- package/out/synthesizers/street.d.ts.map +0 -1
- package/out/synthesizers/street.js.map +0 -1
- package/out/tools.d.ts +0 -31
- package/out/tools.d.ts.map +0 -1
- package/out/tools.js +0 -31
- package/out/tools.js.map +0 -1
- /package/out/{synthesizers → us/synthesizers}/intersection.d.ts +0 -0
|
@@ -14,27 +14,26 @@
|
|
|
14
14
|
* `@mailwoman/sqlite`'s Kysely client. The file is a published artifact and is opened read-only.
|
|
15
15
|
*
|
|
16
16
|
* The INSPIRE address model is normalized, so one address is a join rather than a row. The `address`
|
|
17
|
-
* table
|
|
18
|
-
*
|
|
19
|
-
* `
|
|
20
|
-
* measured file, and a reference that does not resolve raises
|
|
17
|
+
* table holds the locator designators and a reference per component. The street name and the postcode
|
|
18
|
+
* live in `thoroughfarename` and `postaldescriptor`, reached through `component_thoroughfarename` and
|
|
19
|
+
* `component_postaldescriptor`. An unresolved reference raises
|
|
21
20
|
* {@linkcode UnresolvedAddressComponentError} rather than yielding an address missing its street.
|
|
22
21
|
*
|
|
23
|
-
* The adapter reads `locator_designator_1_designator` as `house_number
|
|
24
|
-
* letter (`2A`, `68A`)
|
|
25
|
-
* `postname` as `postcode` and `locality`. Denmark writes a floor
|
|
26
|
-
* and the publisher splits them across
|
|
27
|
-
* `locator_designator_3_designator
|
|
28
|
-
* address layout places `unit` and leaves `level` unplaced.
|
|
22
|
+
* The adapter reads `locator_designator_1_designator` as `house_number`. That column already holds
|
|
23
|
+
* any letter (`2A`, `68A`). It reads `thoroughfarename.name_name` as `street`, and
|
|
24
|
+
* `postaldescriptor.postcode` and `postname` as `postcode` and `locality`. Denmark writes a floor
|
|
25
|
+
* and a door after the house number, and the publisher splits them across
|
|
26
|
+
* `locator_designator_2_designator` and `locator_designator_3_designator`. The adapter joins the two
|
|
27
|
+
* into one `unit`, because the Danish address layout places `unit` and leaves `level` unplaced.
|
|
29
28
|
*
|
|
30
|
-
* The file
|
|
29
|
+
* The file holds no region column that belongs in an address. `component_adminunitname_2` and
|
|
31
30
|
* `_3` name a region and a municipality, neither of which a Danish address line states, so region
|
|
32
31
|
* is left to the wof-postalcode and wof-admin cross-reference at corpus build time, as BAN's is.
|
|
33
32
|
*
|
|
34
|
-
* The address-source register
|
|
35
|
-
* `unchecked-access-free-dk-klimadatastyrelsen
|
|
36
|
-
*
|
|
37
|
-
*
|
|
33
|
+
* The address-source register lists this source as `dk-property-building-1`. Its
|
|
34
|
+
* `unchecked-access-free-dk-klimadatastyrelsen` license holds `CC-BY-4.0` in `spdx`, an `elected`
|
|
35
|
+
* state with `train` permitted. The adapter records that license on every row, and the model card
|
|
36
|
+
* must attribute Klimadatastyrelsen.
|
|
38
37
|
*
|
|
39
38
|
* The adapter streams through Kysely's `.stream()`, so the `address` table never sits in memory, and
|
|
40
39
|
* orders by `objectid` so two runs over one file emit the same rows in the same order. It honors
|
|
@@ -42,9 +41,9 @@
|
|
|
42
41
|
* Denmark proper, and Greenland and the Faroe Islands are their own jurisdictions and are absent
|
|
43
42
|
* from it.
|
|
44
43
|
*
|
|
45
|
-
* The measured file holds 599,999 `address` rows
|
|
46
|
-
* national register several times
|
|
47
|
-
* Denmark's address count.
|
|
44
|
+
* The measured file holds 599,999 `address` rows. That is one short of a round 600,000, while the
|
|
45
|
+
* national register is several times larger, so treat the file as a possible export cap rather than
|
|
46
|
+
* as Denmark's address count.
|
|
48
47
|
*/
|
|
49
48
|
|
|
50
49
|
import { formatAddressRow } from "@mailwoman/codex/address/format"
|
|
@@ -66,9 +65,10 @@ export const DK_INSPIRE_ADAPTER_ID = "dk-inspire"
|
|
|
66
65
|
/**
|
|
67
66
|
* The license the address-source register elects for this source.
|
|
68
67
|
*
|
|
69
|
-
* Read from the `spdx` field of the register's `unchecked-access-free-dk-klimadatastyrelsen`
|
|
70
|
-
*
|
|
71
|
-
*
|
|
68
|
+
* Read from the `spdx` field of the register's `unchecked-access-free-dk-klimadatastyrelsen` license.
|
|
69
|
+
* The register's `dk-property-building-1` source points to it.
|
|
70
|
+
*
|
|
71
|
+
* The feed's own `<rights>` states the same, but the register is what governs.
|
|
72
72
|
*/
|
|
73
73
|
export const DK_INSPIRE_DEFAULT_LICENSE = "CC-BY-4.0"
|
|
74
74
|
|
|
@@ -82,12 +82,13 @@ export const DK_INSPIRE_DEFAULT_LICENSE = "CC-BY-4.0"
|
|
|
82
82
|
export const DK_INSPIRE_COUNTRIES: readonly string[] = ["DK"]
|
|
83
83
|
|
|
84
84
|
/**
|
|
85
|
-
* The tables the adapter reads
|
|
85
|
+
* The tables the adapter reads.
|
|
86
|
+
* It requires `gpkg_contents` to declare them.
|
|
86
87
|
*
|
|
87
88
|
* The GeoPackage declares five.
|
|
88
|
-
* `addressareaname`
|
|
89
|
-
*
|
|
90
|
-
*
|
|
89
|
+
* `addressareaname` holds a supplementary locality that a Danish address line does
|
|
90
|
+
* not state, and `adminunitname` holds the region and municipality the adapter
|
|
91
|
+
* leaves to cross-reference, so neither is read.
|
|
91
92
|
*/
|
|
92
93
|
export const DK_INSPIRE_REQUIRED_TABLES: readonly string[] = ["address", "postaldescriptor", "thoroughfarename"]
|
|
93
94
|
|
|
@@ -116,15 +117,14 @@ export class AddressGeoPackageSchemaError extends Error {
|
|
|
116
117
|
/**
|
|
117
118
|
* Raised when an address row's component reference resolves to no row of the referenced table.
|
|
118
119
|
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* rather than converted into an address missing its street.
|
|
120
|
+
* An unresolved reference means the database is incomplete.
|
|
121
|
+
* The adapter reports it rather than converting it into an address missing its street.
|
|
122
122
|
*/
|
|
123
123
|
export class UnresolvedAddressComponentError extends Error {
|
|
124
124
|
constructor(inspireID: string, column: string, reference: string | null) {
|
|
125
125
|
super(
|
|
126
126
|
`${DK_INSPIRE_ADAPTER_ID} adapter: address ${inspireID} carries ${column}=` +
|
|
127
|
-
`${reference
|
|
127
|
+
`${reference ? `"${reference}"` : "NULL"}, which resolves to no row.`
|
|
128
128
|
)
|
|
129
129
|
|
|
130
130
|
this.name = "UnresolvedAddressComponentError"
|
|
@@ -172,11 +172,10 @@ export interface AddressGeoPackageDatabase {
|
|
|
172
172
|
* `locator_designator_3_designator` (`tv` for `til venstre`, or a number).
|
|
173
173
|
* Danish writes the floor first, so the two join in that order.
|
|
174
174
|
*
|
|
175
|
-
* {@linkcode composeHouseNumber} answers the empty string when its first argument is absent
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
* The door alone is therefore the value when the floor is absent.
|
|
175
|
+
* {@linkcode composeHouseNumber} answers the empty string when its first argument is absent.
|
|
176
|
+
* That suits the house-number columns it was written for, and it would drop every
|
|
177
|
+
* door here: 967 measured rows have a door and no floor.
|
|
178
|
+
* The door is therefore the value when the floor is absent.
|
|
180
179
|
*
|
|
181
180
|
* @returns The joined designator, or the empty string when the publisher states neither.
|
|
182
181
|
*/
|
|
@@ -223,8 +222,9 @@ export function createDKInspireAdapter(): CorpusAdapter {
|
|
|
223
222
|
throw new AddressGeoPackageSchemaError(inputPath, declared, missing)
|
|
224
223
|
}
|
|
225
224
|
|
|
226
|
-
// Left joins, deliberately: an inner join would drop an address whose
|
|
227
|
-
// does not resolve
|
|
225
|
+
// Left joins, deliberately: an inner join would drop an address whose
|
|
226
|
+
// component reference does not resolve.
|
|
227
|
+
// That absence has to be reported rather than applied.
|
|
228
228
|
const stream = db
|
|
229
229
|
.selectFrom("address as a")
|
|
230
230
|
.leftJoin("thoroughfarename as t", "t.inspireid", "a.component_thoroughfarename")
|
|
@@ -256,7 +256,7 @@ export function createDKInspireAdapter(): CorpusAdapter {
|
|
|
256
256
|
// The street is the one component every address needs and every row
|
|
257
257
|
// of the measured file resolves.
|
|
258
258
|
// An unresolved reference is reported, never read as a missing street.
|
|
259
|
-
if (record.street
|
|
259
|
+
if (!record.street) {
|
|
260
260
|
throw new UnresolvedAddressComponentError(
|
|
261
261
|
record.inspireid,
|
|
262
262
|
"component_thoroughfarename",
|
|
@@ -264,7 +264,7 @@ export function createDKInspireAdapter(): CorpusAdapter {
|
|
|
264
264
|
)
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
-
if (record.postcode
|
|
267
|
+
if (!record.postcode && !record.postname) {
|
|
268
268
|
throw new UnresolvedAddressComponentError(
|
|
269
269
|
record.inspireid,
|
|
270
270
|
"component_postaldescriptor",
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
*
|
|
21
21
|
* Five properties of this host were measured, and each one breaks a reader that assumes otherwise:
|
|
22
22
|
*
|
|
23
|
-
* 1. `content-length` on the feed is the gzip-compressed length. The header
|
|
23
|
+
* 1. `content-length` on the feed is the gzip-compressed length. The header reports 1,455 while 3,130
|
|
24
24
|
* bytes are delivered, so a reader that trusts it truncates the feed. Every byte count here is
|
|
25
25
|
* counted off the delivered body.
|
|
26
26
|
* 2. The entry's `rel="alternate"` href is a Wing FTP weblink landing page, HTTP 200 `text/html`,
|
|
27
|
-
* 3,811 bytes. The file needs `&realfilename=DK_INSPIRE_Addresses.zip` appended
|
|
27
|
+
* 3,811 bytes. The file needs `&realfilename=DK_INSPIRE_Addresses.zip` appended. That query answers
|
|
28
28
|
* HTTP 200 `application/zip`.
|
|
29
29
|
* 3. The host ignores `Range`. `bytes=0-4095` answers HTTP 200 with no `content-range` and the whole
|
|
30
30
|
* 101 MB body, so the one-byte range GET that sizes an OpenAddresses source cannot be used here.
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
procedure rather than sections of declarations. A region there folds no element a reader wants folded. */
|
|
44
44
|
|
|
45
45
|
import { ByteFormatter } from "@mailwoman/core/fs/formatters"
|
|
46
|
-
import { pathExists, statPath } from "@mailwoman/core/fs/readers"
|
|
46
|
+
import { pathExists, statPath } from "@mailwoman/core/fs/readers/stat"
|
|
47
47
|
import { makeDirectories, removePathIfPresent } from "@mailwoman/core/fs/writers"
|
|
48
48
|
import { extractZipEntry, listZipEntries } from "@mailwoman/core/fs/zip"
|
|
49
49
|
import { sha256File } from "@mailwoman/core/hash"
|
|
@@ -70,7 +70,7 @@ export const DK_ADDRESSES_GEOPACKAGE_MEMBER = "ad_inspire.gpkg"
|
|
|
70
70
|
/**
|
|
71
71
|
* The query parameter that turns the entry's weblink landing page into the file itself.
|
|
72
72
|
*
|
|
73
|
-
* Wing FTP serves
|
|
73
|
+
* Wing FTP serves the file only when the request asks for the member.
|
|
74
74
|
*/
|
|
75
75
|
const REAL_FILENAME_PARAMETER = "realfilename"
|
|
76
76
|
|
|
@@ -91,7 +91,7 @@ export interface AddressesFeedEntry {
|
|
|
91
91
|
*/
|
|
92
92
|
title: string
|
|
93
93
|
/**
|
|
94
|
-
* The download URL, with the member
|
|
94
|
+
* The download URL, with the member in the query so the host serves the file.
|
|
95
95
|
*/
|
|
96
96
|
downloadURL: string
|
|
97
97
|
/**
|
|
@@ -106,7 +106,7 @@ export interface AddressesFeedEntry {
|
|
|
106
106
|
* Parsed with `@mailwoman/core/html/elements` rather than matched with a pattern.
|
|
107
107
|
*
|
|
108
108
|
* The feed needs both of the things a pattern handles badly.
|
|
109
|
-
* Its entry tag
|
|
109
|
+
* Its entry tag has an `xml:lang` attribute, so a reader has to keep attributes.
|
|
110
110
|
*
|
|
111
111
|
* Its hrefs escape the ampersand between query parameters, so a reader has to decode entities.
|
|
112
112
|
*
|
|
@@ -115,7 +115,8 @@ export interface AddressesFeedEntry {
|
|
|
115
115
|
*
|
|
116
116
|
* @param xml The whole feed, 3,130 bytes, taken as one string rather than as a stream.
|
|
117
117
|
* @throws When the feed holds no entry, or its entry no usable link.
|
|
118
|
-
* A feed holding neither reads as a change at the publisher
|
|
118
|
+
* A feed holding neither reads as a change at the publisher.
|
|
119
|
+
* A caller has to see that.
|
|
119
120
|
*/
|
|
120
121
|
export async function readAddressesFeed(xml: string, feedURL: string): Promise<AddressesFeedEntry> {
|
|
121
122
|
async function* oneChunk(): AsyncIterable<string> {
|
|
@@ -123,7 +124,7 @@ export async function readAddressesFeed(xml: string, feedURL: string): Promise<A
|
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
// The feed holds one entry covering the whole country, so the first is the dataset.
|
|
126
|
-
let entry: MarkupElement |
|
|
127
|
+
let entry: MarkupElement | null = null
|
|
127
128
|
|
|
128
129
|
for await (const found of streamMarkupElements(oneChunk(), "entry", { xml: true })) {
|
|
129
130
|
entry ??= found
|
|
@@ -136,8 +137,8 @@ export async function readAddressesFeed(xml: string, feedURL: string): Promise<A
|
|
|
136
137
|
const title = childElement(entry, "title")?.text ?? ""
|
|
137
138
|
|
|
138
139
|
// The alternate link is the dataset.
|
|
139
|
-
// The same entry
|
|
140
|
-
//
|
|
140
|
+
// The same entry also has a `describedby` link to the ISO 19139 record.
|
|
141
|
+
// Either would download as a dataset without this check.
|
|
141
142
|
const alternate = childElements(entry, "link").find(
|
|
142
143
|
(link: MarkupElement) => (link.attributes.rel ?? "").toLowerCase() === "alternate"
|
|
143
144
|
)
|
|
@@ -243,8 +244,9 @@ export async function fetchDKAddresses(
|
|
|
243
244
|
|
|
244
245
|
// MARK: Download the dataset
|
|
245
246
|
//
|
|
246
|
-
// Streamed rather than buffered, and the byte count comes from the body
|
|
247
|
-
// from the entry's `length` attribute
|
|
247
|
+
// Streamed rather than buffered, and the byte count comes from the body
|
|
248
|
+
// rather than from the entry's `length` attribute.
|
|
249
|
+
// That attribute understates the file by 23 times.
|
|
248
250
|
|
|
249
251
|
const datasetResponse = await fetch(entry.downloadURL, { redirect: "follow" })
|
|
250
252
|
|
|
@@ -256,8 +258,8 @@ export async function fetchDKAddresses(
|
|
|
256
258
|
|
|
257
259
|
const contentType = datasetResponse.headers.get("content-type") ?? ""
|
|
258
260
|
|
|
259
|
-
// The bare weblink href answers HTTP 200 `text/html` with a landing page
|
|
260
|
-
//
|
|
261
|
+
// The bare weblink href answers HTTP 200 `text/html` with a landing page.
|
|
262
|
+
// A write to disk would fail later as a corrupt zip.
|
|
261
263
|
if (contentType.includes("text/html")) {
|
|
262
264
|
report?.(` ✗ The dataset URL answered ${contentType}, which is the weblink's landing page rather than the file`)
|
|
263
265
|
|
|
@@ -14,39 +14,32 @@
|
|
|
14
14
|
* GeoServer flattens the INSPIRE application schema here, so every component value arrives inline on
|
|
15
15
|
* the feature's `properties` and the adapter resolves no reference. The county, the municipality, the
|
|
16
16
|
* settlement unit, the address area, the thoroughfare and the postal descriptor each occupy one of six
|
|
17
|
-
* fixed `component<n>_xlink_title` slots
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* name, 4 of 4 with an address area do, and 685 of 685 with neither carry a name instead. The two
|
|
37
|
-
* never co-occur. The adapter therefore reads `house_number` where a thoroughfare element exists and
|
|
38
|
-
* `venue` where none does, so a farm name never arrives labeled as a number.
|
|
39
|
-
*
|
|
40
|
-
* Slots 4 and 5 carry a malformed `href`: it addresses the `AU_haldusyksused` workspace with an
|
|
17
|
+
* fixed `component<n>_xlink_title` slots. An unused slot holds the string `unpopulated` rather than a
|
|
18
|
+
* void object. The slot a value lands in is fixed: slot 1 holds the county, slot 2 the municipality,
|
|
19
|
+
* slot 3 the settlement unit, slot 4 the address area, slot 5 the thoroughfare and slot 6 the postal
|
|
20
|
+
* descriptor.
|
|
21
|
+
*
|
|
22
|
+
* The field whose name matches the INSPIRE designator holds an internal ADS code, and the house
|
|
23
|
+
* number sits in the locator's name-spelling element. Estonia writes that ADS code in
|
|
24
|
+
* `locator_addresslocator_designator_locatordesignator_designator` (`7_1DOW`, `7_3P4Y`, `6_0MU3`).
|
|
25
|
+
* The human-readable number is in `locator_addresslocator_name_locatorname_name_spelling_text`. The
|
|
26
|
+
* designator's own type states `addressNumber` on the street rows, so that field is tempting to
|
|
27
|
+
* read. A reader that takes it would stamp `7_1DOW` as the house number on every row.
|
|
28
|
+
*
|
|
29
|
+
* The locator name takes one of two roles, and the feature's structure decides which. A feature that
|
|
30
|
+
* holds a thoroughfare or an address area writes its number there, and one that holds neither writes
|
|
31
|
+
* the farm or building name that designates the addressable unit. The two never co-occur. The adapter
|
|
32
|
+
* therefore reads `house_number` where a thoroughfare element exists and `venue` where none does, so a
|
|
33
|
+
* farm name never arrives labeled as a number.
|
|
34
|
+
*
|
|
35
|
+
* Slots 4 and 5 hold a malformed `href`: it addresses the `AU_haldusyksused` workspace with an
|
|
41
36
|
* `AD_Address` type and answers HTTP 400 `Unknown namespace [AD_Address]`. The adapter reads the slot's
|
|
42
37
|
* `title` and never follows an `href`.
|
|
43
38
|
*
|
|
44
|
-
* A row with no thoroughfare element is the ordinary rural case rather than a defect
|
|
45
|
-
* 1,003 features, against the whole-service share of 288,009 thoroughfare-bearing rows in 729,973,
|
|
46
|
-
* which is 39.5%.
|
|
39
|
+
* A row with no thoroughfare element is the ordinary rural case rather than a defect.
|
|
47
40
|
*
|
|
48
|
-
* Maa- ja Ruumiamet's dataset record states Creative Commons CC0 1.0 in `otherConstraints
|
|
49
|
-
* address-source register elected and records under `spdx` as `CC0-1.0`. CC0 reserves no act, so the
|
|
41
|
+
* Maa- ja Ruumiamet's dataset record states Creative Commons CC0 1.0 in `otherConstraints`. The
|
|
42
|
+
* address-source register elected that license and records it under `spdx` as `CC0-1.0`. CC0 reserves no act, so the
|
|
50
43
|
* adapter stamps that label on every row and the model card needs no attribution clause, although
|
|
51
44
|
* crediting the publisher stays good practice.
|
|
52
45
|
*
|
|
@@ -126,7 +119,7 @@ interface ADSFeature {
|
|
|
126
119
|
* The sentinel is compared case-insensitively because it renders an INSPIRE codelist term
|
|
127
120
|
* rather than a value the publisher authored.
|
|
128
121
|
*/
|
|
129
|
-
function slotValue(value: string | undefined): string {
|
|
122
|
+
function slotValue(value: string | null | undefined): string {
|
|
130
123
|
const trimmed = (value ?? "").trim()
|
|
131
124
|
|
|
132
125
|
return trimmed.toLowerCase() === UNPOPULATED ? "" : trimmed
|
|
@@ -192,8 +185,9 @@ export function createADSAdapter(): CorpusAdapter {
|
|
|
192
185
|
|
|
193
186
|
components.street = street
|
|
194
187
|
} else if (locatorName) {
|
|
195
|
-
// With no thoroughfare the locator name is the site or building name
|
|
196
|
-
// designates the addressable unit
|
|
188
|
+
// With no thoroughfare the locator name is the site or building name
|
|
189
|
+
// that designates the addressable unit.
|
|
190
|
+
// That is how a rural Estonian address works.
|
|
197
191
|
components.venue = locatorName
|
|
198
192
|
}
|
|
199
193
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* `#tools/fetch/inspire-addresses` owns the capabilities read and the GeoJSON page read, and
|
|
16
16
|
* `#tools/fetch/wfs-harvest` owns the appending, the manifest and the resumption. This module states
|
|
17
|
-
* what is particular to Estonia
|
|
17
|
+
* what is particular to Estonia: four measurements taken on 2026-10-02:
|
|
18
18
|
*
|
|
19
19
|
* 1. The payload needs no component resolution. GeoServer flattens the application schema here, so
|
|
20
20
|
* each `component<n>_xlink_href` has a sibling `component<n>_xlink_title` carrying the referenced
|
|
@@ -25,14 +25,14 @@
|
|
|
25
25
|
* `readCheckedWFSFeatureCount`, which proves the number against a page before a caller uses it,
|
|
26
26
|
* and no count is written into this file.
|
|
27
27
|
* 3. The service honors a sort. `ImplementsSorting` is `TRUE`, `sortBy=gml_id` answers HTTP 200 and
|
|
28
|
-
* `sortBy=gml_id D` returns the type's last features first
|
|
28
|
+
* `sortBy=gml_id D` returns the type's last features first. That proves the parameter is
|
|
29
29
|
* applied rather than accepted and dropped. `sortBy=gml:identifier` and `sortBy=inspireId` answer
|
|
30
30
|
* HTTP 400 `Illegal property name`, so the sort property is one of the flattened names.
|
|
31
31
|
* 4. A `count=10000` page of `application/json` is 31,198,909 bytes and takes about 6 seconds. At
|
|
32
32
|
* 729,973 features that is 73 pages and about 2.3 GB, plus three requests for the capabilities and
|
|
33
33
|
* the checked count.
|
|
34
34
|
*
|
|
35
|
-
* The harvest writes one feature per line
|
|
35
|
+
* The harvest writes one feature per line. The adapter can then stream the whole extract
|
|
36
36
|
* without holding a page. The `FeatureCollection` envelope is dropped: its counts describe one page
|
|
37
37
|
* and the manifest records them per page instead.
|
|
38
38
|
*/
|
|
@@ -105,8 +105,10 @@ const LICENSE = "CC0-1.0"
|
|
|
105
105
|
* The spacing between requests.
|
|
106
106
|
*
|
|
107
107
|
* The service answers a 10,000-feature page in about 6 seconds, so this is not what limits the harvest.
|
|
108
|
-
* It bounds the harvest to one request per second against a government host
|
|
109
|
-
* state no rate
|
|
108
|
+
* It bounds the harvest to one request per second against a government host
|
|
109
|
+
* whose published terms state no rate.
|
|
110
|
+
*
|
|
111
|
+
* The shorter requests (the capabilities and the count) would otherwise exceed that rate.
|
|
110
112
|
*/
|
|
111
113
|
const MIN_REQUEST_INTERVAL_MS = 1000
|
|
112
114
|
|
|
@@ -186,7 +188,7 @@ export async function harvestADSEE(
|
|
|
186
188
|
|
|
187
189
|
options.report?.(` Feature count: ${featureCount.count ?? "not stated"} — ${featureCount.because}`)
|
|
188
190
|
|
|
189
|
-
return
|
|
191
|
+
return harvestPagedWFS({
|
|
190
192
|
context: CONTEXT,
|
|
191
193
|
source: SLUG,
|
|
192
194
|
outputDir: options.outputDir,
|
|
@@ -246,7 +248,7 @@ export type FetchADSEEOptions = BaseFetchOptions &
|
|
|
246
248
|
export async function fetchADSEE(options: FetchADSEEOptions, report?: (line: string) => void): Promise<FetchSummary> {
|
|
247
249
|
const pageSize = options.pageSize ?? EE_ADS_PAGE_SIZE
|
|
248
250
|
|
|
249
|
-
return
|
|
251
|
+
return runWFSHarvest(
|
|
250
252
|
{
|
|
251
253
|
slug: SLUG,
|
|
252
254
|
outRoot: options.outRoot,
|
|
@@ -257,7 +259,7 @@ export async function fetchADSEE(options: FetchADSEEOptions, report?: (line: str
|
|
|
257
259
|
client: options.client,
|
|
258
260
|
maxPages: options.maxPages,
|
|
259
261
|
harvest: async (client) =>
|
|
260
|
-
|
|
262
|
+
harvestADSEE(client, {
|
|
261
263
|
outputDir: options.outRoot(SLUG),
|
|
262
264
|
pageSize,
|
|
263
265
|
maxPages: options.maxPages,
|
|
@@ -8,17 +8,17 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The ATOM service at `https://apli.bizkaia.eus/apps/Danok/INSPIRE/addresses.xml` lists 112
|
|
10
10
|
* municipality entries, one zipped GML each. Catastro's national feed links this service rather than
|
|
11
|
-
* serving its data
|
|
11
|
+
* serving its data. The publisher is therefore a register of its own.
|
|
12
12
|
*
|
|
13
|
-
* The archives
|
|
13
|
+
* The archives hold only addresses. That shapes this reader. Abadiño's
|
|
14
14
|
* `ES.BFA.AD.001.zip` holds one member, `ES.BFA.AD.gml`, whose 1,360 `ad:Address` features write
|
|
15
15
|
* 4,080 `ad:component` references and not one `ad:ThoroughfareName`, `ad:PostalDescriptor` or
|
|
16
16
|
* `ad:AdminUnitName` feature. Every reference is a stored-query URL on
|
|
17
17
|
* `https://geo.bizkaia.eus/arcgisserverinspire/…` addressing an `adComponent.<n>` the ATOM feed never
|
|
18
|
-
* publishes. A reader
|
|
18
|
+
* publishes. A reader given only those archives therefore writes every address in the province without
|
|
19
19
|
* its street, its postcode or its municipality.
|
|
20
20
|
*
|
|
21
|
-
* Those features are on the publisher's WFS
|
|
21
|
+
* Those features are on the publisher's WFS. It serves the whole province in one request per type. The
|
|
22
22
|
* service answers `ad:ThoroughfareName` with `numberMatched="6921"`, `ad:PostalDescriptor` with
|
|
23
23
|
* `96` and `ad:AdminUnitName` with `113`, and a `GetFeature` with `COUNT=10000` returns each type
|
|
24
24
|
* whole: 6,921 thoroughfare names arrive in one 13,916,056-byte document. One request per type is
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
* addresses. An unresolved reference is a value the reader asked for and could not read, and it
|
|
33
33
|
* raises.
|
|
34
34
|
*
|
|
35
|
-
* Two of the publisher's own spellings decide what a row
|
|
35
|
+
* Two of the publisher's own spellings decide what a row records.
|
|
36
36
|
*
|
|
37
37
|
* A thoroughfare name is a cadastral field rather than a street name:
|
|
38
38
|
* `BO\TRAÑA-MATIENA(1)` is the street-type abbreviation `BO`, a backslash, the name, and the
|
|
39
39
|
* street's own sequence code in parentheses. All 6,921 take that form. The row keeps the
|
|
40
40
|
* abbreviation, as the Dirección General del Catastro's own rendered line does with `CL SANTIAGO
|
|
41
|
-
* APOSTOL`, writes a space where the cadastre writes its separator, and drops the sequence code
|
|
42
|
-
*
|
|
41
|
+
* APOSTOL`, writes a space where the cadastre writes its separator, and drops the sequence code
|
|
42
|
+
* because it is an identifier rather than part of the name.
|
|
43
43
|
*
|
|
44
44
|
* The house number is the last of the four dot-separated fields of the designator, and the
|
|
45
45
|
* designator is a cadastral code: `48.001.00026.003` is municipality 48001, street 00026 and number
|
|
@@ -57,10 +57,9 @@
|
|
|
57
57
|
* The first three are an ordinary Spanish number, a number with a letter, and a number with a
|
|
58
58
|
* *bis*, *izquierda* or *derecha* qualifier. The fourth is two fields concatenated and what its
|
|
59
59
|
* second field designates is not established: it is three digits wide like the number itself, and
|
|
60
|
-
* no document the publisher publishes
|
|
61
|
-
* publisher's own concatenation with its padding removed
|
|
62
|
-
*
|
|
63
|
-
* not hold.
|
|
60
|
+
* no document the publisher publishes states what it counts. The row therefore writes the
|
|
61
|
+
* publisher's own concatenation with its padding removed. A split on a guessed separator would
|
|
62
|
+
* state a number the cadastre does not hold.
|
|
64
63
|
*
|
|
65
64
|
* The municipality is `ad:AdminUnitName` at `3rdOrder`, which is the only level the service
|
|
66
65
|
* publishes: 113 of 113 of its administrative-unit features state it, and their names are padded
|
|
@@ -71,14 +70,14 @@
|
|
|
71
70
|
* `48 001 CL\TRAÑAETXOSTE(00066) 002` for the address whose designator is `48.001.00066.002`. It
|
|
72
71
|
* restates the municipality code, the street type and name, the street code zero-padded to five, and
|
|
73
72
|
* the number field, and it is written inside the archive while the street itself comes from a
|
|
74
|
-
* separate WFS document.
|
|
75
|
-
*
|
|
73
|
+
* separate WFS document. The adapter's test compares the resolved street and the composed number
|
|
74
|
+
* against it to check that the right feature was joined. The register's
|
|
76
75
|
* personal-data review reads these values as internal cadastral references rather than names, and
|
|
77
76
|
* the adapter writes none of them into a row.
|
|
78
77
|
*
|
|
79
78
|
* No service either publisher runs was found to render a postal address for this province: the
|
|
80
|
-
* ArcGIS layer behind the WFS exposes INSPIRE fields
|
|
81
|
-
* stays
|
|
79
|
+
* ArcGIS layer behind the WFS exposes only INSPIRE fields. The number's unexplained second field
|
|
80
|
+
* therefore stays open.
|
|
82
81
|
*/
|
|
83
82
|
|
|
84
83
|
import { openReadStream } from "@mailwoman/core/fs/streams"
|
|
@@ -120,26 +119,26 @@ export const ES_BIZKAIA_COUNTRIES: readonly string[] = ["ES"]
|
|
|
120
119
|
/**
|
|
121
120
|
* The license the address-source register elected for this publisher.
|
|
122
121
|
*
|
|
123
|
-
* Bizkaia
|
|
124
|
-
* publisher's own words. Its INSPIRE metadata
|
|
122
|
+
* Bizkaia states no license instrument, so no SPDX identifier is written and this records the
|
|
123
|
+
* publisher's own words. Its INSPIRE metadata states the controlled values `No limitations to
|
|
125
124
|
* public access` and `No conditions to access and use`, and its feed-level `rights` adds the
|
|
126
125
|
* condition that authorship and ownership of the BFA be stated as «©Bizkaiko Foru Aldundia». The
|
|
127
126
|
* register records two contradictions it did not resolve: all 112 municipality entries also read
|
|
128
127
|
* `Copyright (c) 2017", ES.BFA; all rights reserved`, and Catastro's national feed labels this
|
|
129
|
-
* publisher `CC BY 3.0 ES
|
|
128
|
+
* publisher `CC BY 3.0 ES`. No document Bizkaia publishes states that label.
|
|
130
129
|
*/
|
|
131
130
|
export const ES_BIZKAIA_LICENSE = "No conditions to access and use, with attribution to «©Bizkaiko Foru Aldundia»"
|
|
132
131
|
|
|
133
132
|
/**
|
|
134
133
|
* The member of a municipality's archive that holds the GML.
|
|
135
134
|
*
|
|
136
|
-
* Each archive ships one member,
|
|
137
|
-
* so the extension selects it and the archive's own name
|
|
135
|
+
* Each archive ships one member, `ES.BFA.AD.gml` whichever municipality it holds,
|
|
136
|
+
* so the extension selects it and the archive's own name identifies the municipality.
|
|
138
137
|
*/
|
|
139
138
|
const GML_MEMBER = /\.gml$/iu
|
|
140
139
|
|
|
141
140
|
/**
|
|
142
|
-
* The feature types the saved WFS documents
|
|
141
|
+
* The feature types in the saved WFS documents, indexed before any address is read.
|
|
143
142
|
*/
|
|
144
143
|
const COMPONENT_ELEMENTS = [
|
|
145
144
|
"ad:ThoroughfareName",
|
|
@@ -165,7 +164,7 @@ const MUNICIPALITY_LEVEL = "3rdOrder"
|
|
|
165
164
|
const HOUSE_NUMBER_TYPE = "buildingIdentifier"
|
|
166
165
|
|
|
167
166
|
/**
|
|
168
|
-
* How many dot-separated fields a designator
|
|
167
|
+
* How many dot-separated fields a designator has.
|
|
169
168
|
*
|
|
170
169
|
* Municipality, street, number: `48.001.00026.003` splits the municipality code across two.
|
|
171
170
|
*/
|
|
@@ -176,15 +175,16 @@ const DESIGNATOR_FIELDS = 4
|
|
|
176
175
|
*
|
|
177
176
|
* `BO\TRAÑA-MATIENA(1)` answers `BO TRAÑA-MATIENA`.
|
|
178
177
|
* The backslash is the cadastre's separator between the street-type abbreviation
|
|
179
|
-
* and the name, and the trailing parenthesis holds the street's sequence code
|
|
180
|
-
* which the address's own designator repeats as its third field.
|
|
178
|
+
* and the name, and the trailing parenthesis holds the street's sequence code.
|
|
181
179
|
*
|
|
182
|
-
*
|
|
180
|
+
* The address's own designator repeats that code as its third field.
|
|
181
|
+
*
|
|
182
|
+
* @returns The street, or null where the feature states no name.
|
|
183
183
|
*/
|
|
184
|
-
export function bizkaiaStreet(feature: MarkupElement): string |
|
|
184
|
+
export function bizkaiaStreet(feature: MarkupElement): string | null {
|
|
185
185
|
const text = thoroughfareName(feature)
|
|
186
186
|
|
|
187
|
-
if (!text) return
|
|
187
|
+
if (!text) return null
|
|
188
188
|
|
|
189
189
|
const street = text
|
|
190
190
|
.replace(/\((\d+)\)\s*$/u, "")
|
|
@@ -192,19 +192,19 @@ export function bizkaiaStreet(feature: MarkupElement): string | undefined {
|
|
|
192
192
|
.replaceAll(/\s+/gu, " ")
|
|
193
193
|
.trim()
|
|
194
194
|
|
|
195
|
-
return street ||
|
|
195
|
+
return street || null
|
|
196
196
|
}
|
|
197
197
|
|
|
198
198
|
/**
|
|
199
199
|
* The street's sequence code a thoroughfare feature states, as the feature writes it.
|
|
200
200
|
*
|
|
201
|
-
* The code the address's designator joins on
|
|
202
|
-
* `ad:LocatorName`
|
|
201
|
+
* The code the address's designator joins on.
|
|
202
|
+
* The publisher's own `ad:LocatorName` therefore checks the join rather than copying it.
|
|
203
203
|
*
|
|
204
|
-
* @returns The digits inside the trailing parentheses, or
|
|
204
|
+
* @returns The digits inside the trailing parentheses, or null where there are none.
|
|
205
205
|
*/
|
|
206
|
-
export function bizkaiaStreetCode(feature: MarkupElement): string |
|
|
207
|
-
return /\((\d+)\)\s*$/u.exec(thoroughfareName(feature) ?? "")?.[1]
|
|
206
|
+
export function bizkaiaStreetCode(feature: MarkupElement): string | null {
|
|
207
|
+
return /\((\d+)\)\s*$/u.exec(thoroughfareName(feature) ?? "")?.[1] ?? null
|
|
208
208
|
}
|
|
209
209
|
|
|
210
210
|
/**
|
|
@@ -215,20 +215,20 @@ export function bizkaiaStreetCode(feature: MarkupElement): string | undefined {
|
|
|
215
215
|
*
|
|
216
216
|
* This module's header tabulates the four shapes it takes, with their counts.
|
|
217
217
|
*
|
|
218
|
-
* @returns The number, or
|
|
218
|
+
* @returns The number, or null where the designator is absent or does not have four fields.
|
|
219
219
|
*/
|
|
220
|
-
export function bizkaiaHouseNumber(byType: ReadonlyMap<string, readonly string[]>): string |
|
|
220
|
+
export function bizkaiaHouseNumber(byType: ReadonlyMap<string, readonly string[]>): string | null {
|
|
221
221
|
const code = designator(byType, HOUSE_NUMBER_TYPE)
|
|
222
222
|
|
|
223
|
-
if (!code) return
|
|
223
|
+
if (!code) return null
|
|
224
224
|
|
|
225
225
|
const fields = code.split(".")
|
|
226
226
|
|
|
227
|
-
if (fields.length !== DESIGNATOR_FIELDS) return
|
|
227
|
+
if (fields.length !== DESIGNATOR_FIELDS) return null
|
|
228
228
|
|
|
229
229
|
const number = fields[DESIGNATOR_FIELDS - 1]!.replace(/^0+(?=.)/u, "")
|
|
230
230
|
|
|
231
|
-
return number ||
|
|
231
|
+
return number || null
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
export function createESBizkaiaAdapter(): CorpusAdapter {
|
|
@@ -296,19 +296,19 @@ export function createESBizkaiaAdapter(): CorpusAdapter {
|
|
|
296
296
|
}
|
|
297
297
|
|
|
298
298
|
/**
|
|
299
|
-
* One address's row, or
|
|
299
|
+
* One address's row, or null when it has too little to render.
|
|
300
300
|
*/
|
|
301
|
-
function composeRow(address: MarkupElement, referenced: ReadonlyMap<string, MarkupElement>): CanonicalRow |
|
|
302
|
-
const addressID = address.attributes["gml:id"]?.trim()
|
|
301
|
+
function composeRow(address: MarkupElement, referenced: ReadonlyMap<string, MarkupElement>): CanonicalRow | null {
|
|
302
|
+
const addressID = address.attributes["gml:id"]?.trim() ?? null
|
|
303
303
|
|
|
304
304
|
if (voidDesignatorTypes(address).has(HOUSE_NUMBER_TYPE)) {
|
|
305
305
|
throw new VoidDesignatorError(ES_BIZKAIA_ADAPTER_ID, addressID, HOUSE_NUMBER_TYPE)
|
|
306
306
|
}
|
|
307
307
|
|
|
308
|
-
let street: string |
|
|
309
|
-
let postcode: string |
|
|
310
|
-
let locality: string |
|
|
311
|
-
let settlement: string |
|
|
308
|
+
let street: string | null = null
|
|
309
|
+
let postcode: string | null = null
|
|
310
|
+
let locality: string | null = null
|
|
311
|
+
let settlement: string | null = null
|
|
312
312
|
|
|
313
313
|
for (const href of componentHrefs(address)) {
|
|
314
314
|
const key = componentJoinKey(href)
|
|
@@ -361,8 +361,8 @@ function memberChunks(path: PathBuilderLike): AsyncIterable<string | Uint8Array>
|
|
|
361
361
|
* The two passes read the same list, so an input holding addresses and an input holding
|
|
362
362
|
* component features need not be told apart: a municipality archive contributes addresses
|
|
363
363
|
* to the second pass and no feature to the first, and a saved WFS page the reverse.
|
|
364
|
-
*
|
|
365
|
-
*
|
|
364
|
+
* Extension cannot decide: a hand-assembled input can hold both, and the
|
|
365
|
+
* publisher's own naming distinguishes neither.
|
|
366
366
|
*
|
|
367
367
|
* A path holding no input raises rather than yielding zero rows, so a wrong path
|
|
368
368
|
* reports itself instead of reading as an empty publisher.
|