@mailwoman/resolver-wof-sqlite 10.0.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/README.md +9 -8
- package/lib/address/point/interpolation.ts +45 -39
- package/lib/address/point/schema.ts +17 -40
- package/lib/address/point.ts +316 -0
- package/lib/{address/index.ts → address.ts} +1 -1
- package/lib/ancestry/backfill.ts +20 -86
- package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
- package/lib/build/candidate.ts +122 -174
- package/lib/build/population-corrections.ts +64 -0
- package/lib/build/slim.ts +44 -114
- package/lib/candidate/alias-bags.ts +16 -17
- package/lib/candidate/ancestors/schema.ts +77 -61
- package/lib/candidate/ancestors/sidecar.ts +15 -22
- package/lib/candidate/country-display-names.ts +6 -20
- package/lib/candidate/extract-fold.ts +10 -55
- package/lib/candidate/fts.ts +5 -23
- package/lib/candidate/importance.ts +65 -68
- package/lib/candidate/lookup.ts +124 -415
- package/lib/candidate/name-roles.ts +15 -33
- package/lib/candidate/own-name.ts +35 -32
- package/lib/candidate/place-attrs.ts +20 -13
- package/lib/candidate/schema.ts +29 -65
- package/lib/candidate/scoring.ts +54 -93
- package/lib/capital-schema.ts +21 -17
- package/lib/capitals.ts +29 -27
- package/lib/coincident-roles.ts +85 -55
- package/lib/convention/schema.ts +15 -16
- package/lib/convention.ts +144 -0
- package/lib/coverage-manifest-schema.ts +40 -45
- package/lib/currency-backfill.ts +34 -79
- package/lib/env.ts +1 -1
- package/lib/exact-match.ts +32 -21
- package/lib/extracts.ts +97 -74
- package/lib/fst/autocomplete.ts +54 -37
- package/lib/fst/builder.ts +37 -41
- package/lib/fst/deserialize-web.ts +16 -17
- package/lib/fst/format.ts +41 -23
- package/lib/fst/freshness.ts +43 -120
- package/lib/fst/matcher.ts +7 -5
- package/lib/fst/serialize.ts +54 -74
- package/lib/fst/types.ts +78 -75
- package/lib/{fst/index.ts → fst.ts} +1 -0
- package/lib/fts/query.ts +5 -36
- package/lib/fts.ts +280 -0
- package/lib/geonames/aliases.ts +73 -144
- package/lib/geonames/postal.ts +162 -71
- package/lib/index.ts +9 -8
- package/lib/interpolation.ts +48 -100
- package/lib/lookup.ts +155 -270
- package/lib/name-score.ts +9 -7
- package/lib/nsul/lookup.ts +37 -54
- package/lib/nsul/schema.ts +16 -43
- package/lib/paths.ts +159 -0
- package/lib/place-importance-schema.ts +62 -169
- package/lib/poi/lookup.ts +104 -121
- package/lib/poi/schema.ts +42 -26
- package/lib/polygon-schema.ts +10 -6
- package/lib/postal/city/alias/lookup.ts +22 -40
- package/lib/postal/city/alias/schema.ts +14 -10
- package/lib/postal/city/candidate-schema.ts +26 -20
- package/lib/postcode-point-lookup.ts +8 -27
- package/lib/primary-preference.ts +46 -126
- package/lib/proximity-rerank.ts +44 -33
- package/lib/ranking-weights.ts +105 -78
- package/lib/region-keys.ts +70 -42
- package/lib/reverse.ts +149 -86
- package/lib/schema.ts +73 -50
- package/lib/search-fetch.ts +90 -68
- package/lib/sqlite/convention-source.ts +15 -23
- package/lib/sqlite/utils.ts +19 -22
- package/lib/street/centroid/schema.ts +37 -42
- package/lib/street/{centroid/index.ts → centroid.ts} +16 -25
- package/lib/street/morphology/fst/builder.ts +60 -42
- package/lib/street/morphology/fst/loader.ts +40 -32
- package/lib/street/name-lookup.ts +45 -41
- package/lib/street/normalize.ts +88 -219
- package/lib/street/segment-schema.ts +116 -43
- package/lib/{street/index.ts → street.ts} +1 -1
- package/lib/types.ts +109 -150
- package/lib/unified-schema.ts +29 -29
- package/lib/uprn/existence.ts +30 -19
- package/lib/uprn/lookup.ts +29 -68
- package/lib/uprn/schema.ts +18 -40
- package/lib/weights-overlay-linker.ts +236 -252
- package/out/address/point/interpolation.d.ts +20 -23
- package/out/address/point/interpolation.d.ts.map +1 -1
- package/out/address/point/interpolation.js +42 -39
- package/out/address/point/interpolation.js.map +1 -1
- package/out/address/point/schema.d.ts +12 -35
- package/out/address/point/schema.d.ts.map +1 -1
- package/out/address/point/schema.js +3 -19
- package/out/address/point/schema.js.map +1 -1
- package/out/address/point.d.ts +57 -0
- package/out/address/point.d.ts.map +1 -0
- package/out/address/point.js +206 -0
- package/out/address/point.js.map +1 -0
- package/out/{address/index.js → address.d.ts} +2 -2
- package/out/address.d.ts.map +1 -0
- package/out/{address/index.d.ts → address.js} +2 -2
- package/out/address.js.map +1 -0
- package/out/ancestry/backfill.d.ts +11 -64
- package/out/ancestry/backfill.d.ts.map +1 -1
- package/out/ancestry/backfill.js +14 -74
- package/out/ancestry/backfill.js.map +1 -1
- package/out/ancestry.d.ts +49 -0
- package/out/ancestry.d.ts.map +1 -0
- package/out/ancestry.js +59 -0
- package/out/ancestry.js.map +1 -0
- package/out/build/candidate.d.ts +82 -112
- package/out/build/candidate.d.ts.map +1 -1
- package/out/build/candidate.js +17 -100
- package/out/build/candidate.js.map +1 -1
- package/out/build/population-corrections.d.ts +52 -0
- package/out/build/population-corrections.d.ts.map +1 -0
- package/out/build/population-corrections.js +40 -0
- package/out/build/population-corrections.js.map +1 -0
- package/out/build/slim.d.ts +8 -44
- package/out/build/slim.d.ts.map +1 -1
- package/out/build/slim.js +33 -94
- package/out/build/slim.js.map +1 -1
- package/out/candidate/alias-bags.d.ts +6 -6
- package/out/candidate/alias-bags.d.ts.map +1 -1
- package/out/candidate/alias-bags.js +16 -17
- package/out/candidate/alias-bags.js.map +1 -1
- package/out/candidate/ancestors/schema.d.ts +73 -57
- package/out/candidate/ancestors/schema.d.ts.map +1 -1
- package/out/candidate/ancestors/schema.js +56 -48
- package/out/candidate/ancestors/schema.js.map +1 -1
- package/out/candidate/ancestors/sidecar.d.ts +3 -8
- package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
- package/out/candidate/ancestors/sidecar.js +15 -22
- package/out/candidate/ancestors/sidecar.js.map +1 -1
- package/out/candidate/country-display-names.d.ts +5 -15
- package/out/candidate/country-display-names.d.ts.map +1 -1
- package/out/candidate/country-display-names.js +6 -20
- package/out/candidate/country-display-names.js.map +1 -1
- package/out/candidate/extract-fold.d.ts +7 -15
- package/out/candidate/extract-fold.d.ts.map +1 -1
- package/out/candidate/extract-fold.js +5 -47
- package/out/candidate/extract-fold.js.map +1 -1
- package/out/candidate/fts.d.ts +5 -23
- package/out/candidate/fts.d.ts.map +1 -1
- package/out/candidate/fts.js +5 -23
- package/out/candidate/fts.js.map +1 -1
- package/out/candidate/importance.d.ts +60 -65
- package/out/candidate/importance.d.ts.map +1 -1
- package/out/candidate/importance.js +56 -63
- package/out/candidate/importance.js.map +1 -1
- package/out/candidate/lookup.d.ts +18 -55
- package/out/candidate/lookup.d.ts.map +1 -1
- package/out/candidate/lookup.js +82 -385
- package/out/candidate/lookup.js.map +1 -1
- package/out/candidate/name-roles.d.ts +9 -21
- package/out/candidate/name-roles.d.ts.map +1 -1
- package/out/candidate/name-roles.js +15 -33
- package/out/candidate/name-roles.js.map +1 -1
- package/out/candidate/own-name.d.ts +23 -25
- package/out/candidate/own-name.d.ts.map +1 -1
- package/out/candidate/own-name.js +35 -32
- package/out/candidate/own-name.js.map +1 -1
- package/out/candidate/place-attrs.d.ts +20 -13
- package/out/candidate/place-attrs.d.ts.map +1 -1
- package/out/candidate/place-attrs.js +4 -5
- package/out/candidate/place-attrs.js.map +1 -1
- package/out/candidate/schema.d.ts +27 -62
- package/out/candidate/schema.d.ts.map +1 -1
- package/out/candidate/schema.js +10 -22
- package/out/candidate/schema.js.map +1 -1
- package/out/candidate/scoring.d.ts +7 -8
- package/out/candidate/scoring.d.ts.map +1 -1
- package/out/candidate/scoring.js +52 -89
- package/out/candidate/scoring.js.map +1 -1
- package/out/capital-schema.d.ts +21 -17
- package/out/capital-schema.d.ts.map +1 -1
- package/out/capital-schema.js +17 -15
- package/out/capital-schema.js.map +1 -1
- package/out/capitals.d.ts +27 -25
- package/out/capitals.d.ts.map +1 -1
- package/out/capitals.js +23 -21
- package/out/capitals.js.map +1 -1
- package/out/coincident-roles.d.ts +60 -43
- package/out/coincident-roles.d.ts.map +1 -1
- package/out/coincident-roles.js +72 -50
- package/out/coincident-roles.js.map +1 -1
- package/out/convention/schema.d.ts +14 -14
- package/out/convention/schema.d.ts.map +1 -1
- package/out/convention/schema.js +6 -4
- package/out/convention/schema.js.map +1 -1
- package/out/convention.d.ts +97 -0
- package/out/convention.d.ts.map +1 -0
- package/out/convention.js +81 -0
- package/out/convention.js.map +1 -0
- package/out/coverage-manifest-schema.d.ts +34 -39
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +25 -34
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/currency-backfill.d.ts +16 -38
- package/out/currency-backfill.d.ts.map +1 -1
- package/out/currency-backfill.js +19 -46
- package/out/currency-backfill.js.map +1 -1
- package/out/env.d.ts +1 -1
- package/out/env.js +1 -1
- package/out/exact-match.d.ts +19 -10
- package/out/exact-match.d.ts.map +1 -1
- package/out/exact-match.js +32 -21
- package/out/exact-match.js.map +1 -1
- package/out/extracts.d.ts +66 -55
- package/out/extracts.d.ts.map +1 -1
- package/out/extracts.js +63 -55
- package/out/extracts.js.map +1 -1
- package/out/fst/autocomplete.d.ts +29 -21
- package/out/fst/autocomplete.d.ts.map +1 -1
- package/out/fst/autocomplete.js +39 -28
- package/out/fst/autocomplete.js.map +1 -1
- package/out/fst/builder.d.ts.map +1 -1
- package/out/fst/builder.js +37 -41
- package/out/fst/builder.js.map +1 -1
- package/out/fst/deserialize-web.d.ts +4 -4
- package/out/fst/deserialize-web.d.ts.map +1 -1
- package/out/fst/deserialize-web.js +15 -16
- package/out/fst/deserialize-web.js.map +1 -1
- package/out/fst/format.d.ts +41 -23
- package/out/fst/format.d.ts.map +1 -1
- package/out/fst/format.js +41 -23
- package/out/fst/format.js.map +1 -1
- package/out/fst/freshness.d.ts +19 -81
- package/out/fst/freshness.d.ts.map +1 -1
- package/out/fst/freshness.js +31 -94
- package/out/fst/freshness.js.map +1 -1
- package/out/fst/matcher.d.ts +5 -4
- package/out/fst/matcher.d.ts.map +1 -1
- package/out/fst/matcher.js +2 -2
- package/out/fst/matcher.js.map +1 -1
- package/out/fst/serialize.d.ts +28 -28
- package/out/fst/serialize.d.ts.map +1 -1
- package/out/fst/serialize.js +53 -71
- package/out/fst/serialize.js.map +1 -1
- package/out/fst/types.d.ts +78 -74
- package/out/fst/types.d.ts.map +1 -1
- package/out/fst/types.js +1 -4
- package/out/fst/types.js.map +1 -1
- package/out/{fst/index.js → fst.d.ts} +2 -1
- package/out/fst.d.ts.map +1 -0
- package/out/{fst/index.d.ts → fst.js} +2 -1
- package/out/fst.js.map +1 -0
- package/out/fts/query.d.ts +2 -27
- package/out/fts/query.d.ts.map +1 -1
- package/out/fts/query.js +5 -36
- package/out/fts/query.js.map +1 -1
- package/out/fts.d.ts +126 -0
- package/out/fts.d.ts.map +1 -0
- package/out/fts.js +188 -0
- package/out/fts.js.map +1 -0
- package/out/geonames/aliases.d.ts +26 -62
- package/out/geonames/aliases.d.ts.map +1 -1
- package/out/geonames/aliases.js +45 -117
- package/out/geonames/aliases.js.map +1 -1
- package/out/geonames/postal.d.ts +84 -44
- package/out/geonames/postal.d.ts.map +1 -1
- package/out/geonames/postal.js +115 -73
- package/out/geonames/postal.js.map +1 -1
- package/out/{geonames/index.js → geonames.d.ts} +1 -1
- package/out/geonames.d.ts.map +1 -0
- package/out/{geonames/index.d.ts → geonames.js} +1 -1
- package/out/geonames.js.map +1 -0
- package/out/index.d.ts +9 -8
- package/out/index.d.ts.map +1 -1
- package/out/index.js +6 -5
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +18 -55
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +27 -69
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +23 -51
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +136 -234
- package/out/lookup.js.map +1 -1
- package/out/name-score.d.ts +2 -2
- package/out/name-score.d.ts.map +1 -1
- package/out/name-score.js +9 -7
- package/out/name-score.js.map +1 -1
- package/out/nsul/lookup.d.ts +33 -34
- package/out/nsul/lookup.d.ts.map +1 -1
- package/out/nsul/lookup.js +26 -40
- package/out/nsul/lookup.js.map +1 -1
- package/out/nsul/schema.d.ts +16 -43
- package/out/nsul/schema.d.ts.map +1 -1
- package/out/nsul/schema.js +9 -35
- package/out/nsul/schema.js.map +1 -1
- package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
- package/out/nsul.d.ts.map +1 -0
- package/out/{nsul/index.js → nsul.js} +1 -1
- package/out/nsul.js.map +1 -0
- package/out/paths.d.ts +124 -0
- package/out/paths.d.ts.map +1 -0
- package/out/paths.js +104 -0
- package/out/paths.js.map +1 -0
- package/out/place-importance-schema.d.ts +51 -143
- package/out/place-importance-schema.d.ts.map +1 -1
- package/out/place-importance-schema.js +28 -143
- package/out/place-importance-schema.js.map +1 -1
- package/out/poi/lookup.d.ts +40 -47
- package/out/poi/lookup.d.ts.map +1 -1
- package/out/poi/lookup.js +69 -96
- package/out/poi/lookup.js.map +1 -1
- package/out/poi/schema.d.ts +41 -25
- package/out/poi/schema.d.ts.map +1 -1
- package/out/poi/schema.js +25 -17
- package/out/poi/schema.js.map +1 -1
- package/out/{poi/index.js → poi.d.ts} +1 -1
- package/out/poi.d.ts.map +1 -0
- package/out/{poi/index.d.ts → poi.js} +1 -1
- package/out/poi.js.map +1 -0
- package/out/polygon-schema.d.ts +10 -6
- package/out/polygon-schema.d.ts.map +1 -1
- package/out/polygon-schema.js +2 -2
- package/out/polygon-schema.js.map +1 -1
- package/out/postal/city/alias/lookup.d.ts +20 -23
- package/out/postal/city/alias/lookup.d.ts.map +1 -1
- package/out/postal/city/alias/lookup.js +17 -30
- package/out/postal/city/alias/lookup.js.map +1 -1
- package/out/postal/city/alias/schema.d.ts +14 -10
- package/out/postal/city/alias/schema.d.ts.map +1 -1
- package/out/postal/city/alias/schema.js +10 -8
- package/out/postal/city/alias/schema.js.map +1 -1
- package/out/postal/city/candidate-schema.d.ts +25 -19
- package/out/postal/city/candidate-schema.d.ts.map +1 -1
- package/out/postal/city/candidate-schema.js +21 -17
- package/out/postal/city/candidate-schema.js.map +1 -1
- package/out/{postal/index.d.ts → postal.d.ts} +1 -1
- package/out/postal.d.ts.map +1 -0
- package/out/{postal/index.js → postal.js} +1 -1
- package/out/postal.js.map +1 -0
- package/out/postcode-point-lookup.d.ts +6 -24
- package/out/postcode-point-lookup.d.ts.map +1 -1
- package/out/postcode-point-lookup.js +5 -17
- package/out/postcode-point-lookup.js.map +1 -1
- package/out/primary-preference.d.ts +38 -92
- package/out/primary-preference.d.ts.map +1 -1
- package/out/primary-preference.js +15 -99
- package/out/primary-preference.js.map +1 -1
- package/out/proximity-rerank.d.ts +41 -30
- package/out/proximity-rerank.d.ts.map +1 -1
- package/out/proximity-rerank.js +38 -29
- package/out/proximity-rerank.js.map +1 -1
- package/out/ranking-weights.d.ts +98 -64
- package/out/ranking-weights.d.ts.map +1 -1
- package/out/ranking-weights.js +26 -25
- package/out/ranking-weights.js.map +1 -1
- package/out/region-keys.d.ts +50 -31
- package/out/region-keys.d.ts.map +1 -1
- package/out/region-keys.js +68 -40
- package/out/region-keys.js.map +1 -1
- package/out/reverse.d.ts +78 -50
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +98 -61
- package/out/reverse.js.map +1 -1
- package/out/schema.d.ts +72 -49
- package/out/schema.d.ts.map +1 -1
- package/out/schema.js +4 -5
- package/out/schema.js.map +1 -1
- package/out/search-fetch.d.ts +16 -12
- package/out/search-fetch.d.ts.map +1 -1
- package/out/search-fetch.js +83 -63
- package/out/search-fetch.js.map +1 -1
- package/out/sqlite/convention-source.d.ts +12 -16
- package/out/sqlite/convention-source.d.ts.map +1 -1
- package/out/sqlite/convention-source.js +13 -22
- package/out/sqlite/convention-source.js.map +1 -1
- package/out/sqlite/utils.d.ts +19 -19
- package/out/sqlite/utils.d.ts.map +1 -1
- package/out/sqlite/utils.js +14 -15
- package/out/sqlite/utils.js.map +1 -1
- package/out/street/centroid/schema.d.ts +37 -42
- package/out/street/centroid/schema.d.ts.map +1 -1
- package/out/street/centroid/schema.js +9 -21
- package/out/street/centroid/schema.js.map +1 -1
- package/out/street/centroid.d.ts +30 -0
- package/out/street/centroid.d.ts.map +1 -0
- package/out/street/{centroid/index.js → centroid.js} +13 -24
- package/out/street/centroid.js.map +1 -0
- package/out/street/morphology/fst/builder.d.ts +20 -10
- package/out/street/morphology/fst/builder.d.ts.map +1 -1
- package/out/street/morphology/fst/builder.js +44 -34
- package/out/street/morphology/fst/builder.js.map +1 -1
- package/out/street/morphology/fst/loader.d.ts +33 -26
- package/out/street/morphology/fst/loader.d.ts.map +1 -1
- package/out/street/morphology/fst/loader.js +23 -22
- package/out/street/morphology/fst/loader.js.map +1 -1
- package/out/street/name-lookup.d.ts +24 -18
- package/out/street/name-lookup.d.ts.map +1 -1
- package/out/street/name-lookup.js +34 -35
- package/out/street/name-lookup.js.map +1 -1
- package/out/street/normalize.d.ts +35 -136
- package/out/street/normalize.d.ts.map +1 -1
- package/out/street/normalize.js +77 -194
- package/out/street/normalize.js.map +1 -1
- package/out/street/segment-schema.d.ts +79 -39
- package/out/street/segment-schema.d.ts.map +1 -1
- package/out/street/segment-schema.js +71 -21
- package/out/street/segment-schema.js.map +1 -1
- package/out/{street/index.js → street.d.ts} +2 -2
- package/out/street.d.ts.map +1 -0
- package/out/{street/index.d.ts → street.js} +2 -2
- package/out/street.js.map +1 -0
- package/out/types.d.ts +84 -149
- package/out/types.d.ts.map +1 -1
- package/out/types.js +0 -6
- package/out/types.js.map +1 -1
- package/out/unified-schema.d.ts +8 -12
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +29 -29
- package/out/unified-schema.js.map +1 -1
- package/out/uprn/existence.d.ts +28 -17
- package/out/uprn/existence.d.ts.map +1 -1
- package/out/uprn/existence.js +26 -16
- package/out/uprn/existence.js.map +1 -1
- package/out/uprn/lookup.d.ts +14 -44
- package/out/uprn/lookup.d.ts.map +1 -1
- package/out/uprn/lookup.js +21 -57
- package/out/uprn/lookup.js.map +1 -1
- package/out/uprn/schema.d.ts +18 -40
- package/out/uprn/schema.d.ts.map +1 -1
- package/out/uprn/schema.js +10 -32
- package/out/uprn/schema.js.map +1 -1
- package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
- package/out/uprn.d.ts.map +1 -0
- package/out/{uprn/index.js → uprn.js} +1 -1
- package/out/uprn.js.map +1 -0
- package/out/weights-overlay-linker.d.ts +138 -144
- package/out/weights-overlay-linker.d.ts.map +1 -1
- package/out/weights-overlay-linker.js +105 -159
- package/out/weights-overlay-linker.js.map +1 -1
- package/package.json +91 -596
- package/lib/address/point/index.ts +0 -328
- package/lib/convention/index.ts +0 -154
- package/lib/fts/index.ts +0 -361
- package/out/address/index.d.ts.map +0 -1
- package/out/address/index.js.map +0 -1
- package/out/address/point/index.d.ts +0 -53
- package/out/address/point/index.d.ts.map +0 -1
- package/out/address/point/index.js +0 -222
- package/out/address/point/index.js.map +0 -1
- package/out/ancestry/index.d.ts +0 -45
- package/out/ancestry/index.d.ts.map +0 -1
- package/out/ancestry/index.js +0 -55
- package/out/ancestry/index.js.map +0 -1
- package/out/convention/index.d.ts +0 -106
- package/out/convention/index.d.ts.map +0 -1
- package/out/convention/index.js +0 -93
- package/out/convention/index.js.map +0 -1
- package/out/fst/index.d.ts.map +0 -1
- package/out/fst/index.js.map +0 -1
- package/out/fts/index.d.ts +0 -184
- package/out/fts/index.d.ts.map +0 -1
- package/out/fts/index.js +0 -277
- package/out/fts/index.js.map +0 -1
- package/out/geonames/index.d.ts.map +0 -1
- package/out/geonames/index.js.map +0 -1
- package/out/nsul/index.d.ts.map +0 -1
- package/out/nsul/index.js.map +0 -1
- package/out/poi/index.d.ts.map +0 -1
- package/out/poi/index.js.map +0 -1
- package/out/postal/index.d.ts.map +0 -1
- package/out/postal/index.js.map +0 -1
- package/out/street/centroid/index.d.ts +0 -40
- package/out/street/centroid/index.d.ts.map +0 -1
- package/out/street/centroid/index.js.map +0 -1
- package/out/street/index.d.ts.map +0 -1
- package/out/street/index.js.map +0 -1
- package/out/uprn/index.d.ts.map +0 -1
- package/out/uprn/index.js.map +0 -1
- /package/lib/{geonames/index.ts → geonames.ts} +0 -0
- /package/lib/{nsul/index.ts → nsul.ts} +0 -0
- /package/lib/{poi/index.ts → poi.ts} +0 -0
- /package/lib/{postal/index.ts → postal.ts} +0 -0
- /package/lib/{uprn/index.ts → uprn.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../lib/street/morphology/fst/builder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../lib/street/morphology/fst/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,SAAS,CAAA;AAK3D,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAA;AAa3D,MAAM,WAAW,4BAA4B;IAC5C;;OAEG;IACH,eAAe,EAAE,eAAe,CAAA;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACrD;AAED,MAAM,WAAW,8BAA8B;IAC9C,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,aAAa,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;CACjB;AAsBD,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,4BAA4B,GAChC,OAAO,CAAC,8BAA8B,CAAC,CA2KzC"}
|
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Build a street-morphology FST from libpostal's street_types dictionaries. The morphology FST maps
|
|
7
7
|
* street-typing affixes (Street/Avenue/rue/Calle/Straße/...) to a single synthetic placetype
|
|
8
|
-
* `"street_affix"
|
|
8
|
+
* `"street_affix"`. Its source data and purpose differ from the admin FST.
|
|
9
|
+
* It also produces a separate binary artifact.
|
|
9
10
|
*
|
|
10
11
|
* The morphology FST closes the inference-time vacuum identified by the v0.6.1 postmortem: street
|
|
11
12
|
* tokens have no admin-FST anchor, so synth-street training pushed the model toward over-emitting
|
|
12
13
|
* `dependent_locality` on subcomponents. With the morphology FST, the neural decoder gets
|
|
13
14
|
* positive evidence for street-typing affixes and the adjacent name tokens, plus negative
|
|
14
|
-
* evidence away from `dependent_locality` on the same
|
|
15
|
+
* evidence away from `dependent_locality` on the same neighbors.
|
|
15
16
|
*
|
|
16
17
|
* Design rationale + the four-layer street-supplement architecture lives in
|
|
17
18
|
* `docs/articles/concepts/street-supplement-architecture.md`.
|
|
@@ -22,32 +23,34 @@
|
|
|
22
23
|
* Output: an `FSTMatcher` ready to serialize via `serializeFST` to e.g.
|
|
23
24
|
* `fst-street-morphology.bin`.
|
|
24
25
|
*/
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
26
|
+
import { readLocalTextFile } from "@mailwoman/core/fs/readers";
|
|
27
|
+
import { isDirectory, isFile } from "@mailwoman/core/fs/readers/stat";
|
|
28
|
+
import { PathBuilder } from "path-ts";
|
|
27
29
|
import { TextSpliterator } from "spliterator";
|
|
28
30
|
import { Globerator } from "spliterator/node/fs";
|
|
29
31
|
import { FSTMatcher, normalizeTokens } from "#fst/matcher";
|
|
30
32
|
/**
|
|
31
|
-
* Reserved synthetic wofID base for street-morphology entries. 32-bit unsigned,
|
|
32
|
-
*
|
|
33
|
-
*
|
|
33
|
+
* Reserved synthetic wofID base for street-morphology entries. 32-bit unsigned,
|
|
34
|
+
* well above any realistic WOF allocation.
|
|
35
|
+
*
|
|
36
|
+
* The same base across rebuilds keeps IDs stable for consumers that cache them.
|
|
37
|
+
* See [[project-schema-storage-decision]] for the reserved range policy.
|
|
34
38
|
*/
|
|
35
39
|
const STREET_AFFIX_WOFID_BASE = 1_900_000_000;
|
|
36
40
|
const STREET_TYPES_FILENAME = "street_types.txt";
|
|
37
41
|
/**
|
|
38
|
-
* Parse one `street_types.txt` line into `{ canonical, variants }`.
|
|
39
|
-
*
|
|
42
|
+
* Parse one `street_types.txt` line into `{ canonical, variants }`.
|
|
43
|
+
*
|
|
44
|
+
* Canonical is the first token (pre-`|`); variants are all whitespace-stripped
|
|
45
|
+
* non-empty tokens including the canonical.
|
|
40
46
|
*
|
|
41
47
|
* Lines with no `|` are treated as a single-form entry where canonical == variant.
|
|
42
48
|
*/
|
|
43
49
|
function parseLine(line) {
|
|
44
50
|
const trimmed = line.trim();
|
|
45
|
-
if (!trimmed
|
|
51
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
46
52
|
return null;
|
|
47
|
-
const parts = trimmed
|
|
48
|
-
.split("|")
|
|
49
|
-
.map((s) => s.trim())
|
|
50
|
-
.filter((s) => s.length > 0);
|
|
53
|
+
const parts = TextSpliterator.from(trimmed, { delimiter: "|" }).toArray();
|
|
51
54
|
if (!parts.length)
|
|
52
55
|
return null;
|
|
53
56
|
return { canonical: parts[0], variants: parts };
|
|
@@ -55,6 +58,7 @@ function parseLine(line) {
|
|
|
55
58
|
export async function buildStreetMorphologyFST(opts) {
|
|
56
59
|
const progress = opts.onProgress ?? (() => { });
|
|
57
60
|
const minVariantLength = opts.minVariantLength ?? 3;
|
|
61
|
+
const dictionariesDir = PathBuilder.from(opts.dictionariesDir);
|
|
58
62
|
// Discover locales — either provided explicitly, or all directories containing street_types.txt.
|
|
59
63
|
let locales;
|
|
60
64
|
// oxlint-disable-next-line unicorn/prefer-ternary -- the else branch is a multi-line directory scan
|
|
@@ -63,33 +67,27 @@ export async function buildStreetMorphologyFST(opts) {
|
|
|
63
67
|
}
|
|
64
68
|
else {
|
|
65
69
|
const entries = await Globerator.from("*", {
|
|
66
|
-
cwd:
|
|
70
|
+
cwd: dictionariesDir,
|
|
67
71
|
absolute: false,
|
|
68
72
|
onlyFiles: false,
|
|
69
73
|
}).toArray();
|
|
70
74
|
const localeProbes = [];
|
|
71
75
|
for (const entry of entries) {
|
|
72
|
-
const localePath =
|
|
76
|
+
const localePath = dictionariesDir(entry);
|
|
73
77
|
if (!(await isDirectory(localePath))) {
|
|
74
78
|
localeProbes.push([entry, false]);
|
|
75
79
|
continue;
|
|
76
80
|
}
|
|
77
|
-
|
|
78
|
-
await statPath(join(localePath, STREET_TYPES_FILENAME));
|
|
79
|
-
localeProbes.push([entry, true]);
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
localeProbes.push([entry, false]);
|
|
83
|
-
}
|
|
81
|
+
localeProbes.push([entry, await isFile(localePath(STREET_TYPES_FILENAME))]);
|
|
84
82
|
}
|
|
85
83
|
locales = localeProbes.filter(([, hasFile]) => hasFile).map(([entry]) => entry);
|
|
86
84
|
}
|
|
87
85
|
progress("discover", `Found ${locales.length} locales with ${STREET_TYPES_FILENAME}`);
|
|
88
|
-
// Collect canonical → set-of-variants across all locales.
|
|
89
|
-
// multiple locales (e.g. "avenue" in en/fr); we union the variant sets.
|
|
86
|
+
// Collect canonical → set-of-variants across all locales.
|
|
87
|
+
// Same canonical form may appear in multiple locales (e.g. "avenue" in en/fr); we union the variant sets.
|
|
90
88
|
const canonicalToVariants = new Map();
|
|
91
89
|
for (const locale of locales) {
|
|
92
|
-
const filePath =
|
|
90
|
+
const filePath = dictionariesDir(locale, STREET_TYPES_FILENAME);
|
|
93
91
|
const content = await readLocalTextFile(filePath);
|
|
94
92
|
for (const line of TextSpliterator.from(content)) {
|
|
95
93
|
const parsed = parseLine(line);
|
|
@@ -103,14 +101,16 @@ export async function buildStreetMorphologyFST(opts) {
|
|
|
103
101
|
}
|
|
104
102
|
}
|
|
105
103
|
progress("collect", `Collected ${canonicalToVariants.size} canonical affixes`);
|
|
106
|
-
// Assign stable synthetic wofIDs.
|
|
104
|
+
// Assign stable synthetic wofIDs.
|
|
105
|
+
// Sort canonicals for determinism.
|
|
107
106
|
const sortedCanonicals = [...canonicalToVariants.keys()].toSorted();
|
|
108
107
|
const canonicalToWOFID = new Map();
|
|
109
108
|
for (let i = 0; i < sortedCanonicals.length; i++) {
|
|
110
109
|
canonicalToWOFID.set(sortedCanonicals[i], STREET_AFFIX_WOFID_BASE + i);
|
|
111
110
|
}
|
|
112
|
-
// Build the trie.
|
|
113
|
-
//
|
|
111
|
+
// Build the trie.
|
|
112
|
+
// Each variant is inserted as a token sequence pointing to its canonical's PlaceEntry —
|
|
113
|
+
// so all variants of "avenue" (av/ave/aven/...) lead to the same terminal entry.
|
|
114
114
|
const nodes = [{ edges: new Map(), places: [] }];
|
|
115
115
|
function insertName(tokens, entry) {
|
|
116
116
|
if (!tokens.length)
|
|
@@ -141,13 +141,16 @@ export async function buildStreetMorphologyFST(opts) {
|
|
|
141
141
|
placetype: "street_affix",
|
|
142
142
|
name: canonical,
|
|
143
143
|
parentChain: [],
|
|
144
|
-
// Fixed referential score: street affixes are structurally unambiguous
|
|
145
|
-
// never anything but street-typing).
|
|
146
|
-
//
|
|
147
|
-
//
|
|
144
|
+
// Fixed referential score: street affixes are structurally unambiguous
|
|
145
|
+
// (Avenue is almost never anything but street-typing).
|
|
146
|
+
// The morphology prior caps bias separately.
|
|
147
|
+
// This value just feeds the cap formula `referential * cap`.
|
|
148
|
+
// No encyclopedic score — a street affix is not a place and has no article.
|
|
148
149
|
referential: 1,
|
|
150
|
+
encyclopedic: null,
|
|
149
151
|
lat: 0,
|
|
150
152
|
lon: 0,
|
|
153
|
+
crossCountryBranches: null,
|
|
151
154
|
};
|
|
152
155
|
for (const variant of variants) {
|
|
153
156
|
const tokens = normalizeTokens(variant);
|
|
@@ -174,7 +177,14 @@ export async function buildStreetMorphologyFST(opts) {
|
|
|
174
177
|
edgeCount,
|
|
175
178
|
nameInsertions: insertCount,
|
|
176
179
|
importanceMatches: 0, // No importance scoring for morphology — fixed at 1.0.
|
|
177
|
-
|
|
180
|
+
encyclopedicMatches: null,
|
|
181
|
+
importanceSource: null,
|
|
182
|
+
sourceDB: dictionariesDir.toString(),
|
|
183
|
+
sourceDBMD5: null,
|
|
184
|
+
sourceDBBytes: null,
|
|
185
|
+
modelCardVersion: null,
|
|
186
|
+
exclusionPolicy: null,
|
|
187
|
+
excludedInsertions: null,
|
|
178
188
|
};
|
|
179
189
|
return {
|
|
180
190
|
matcher,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../../lib/street/morphology/fst/builder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../../lib/street/morphology/fst/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,45 +3,51 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* (`fst-street-morphology.bin`, built by `mailwoman gazetteer build street-morphology`) replaces
|
|
10
|
-
* those per-process builds; this loader is the ONE resolution ladder every node call site shares:
|
|
6
|
+
* Runtime loader for the street-morphology FST. The sealed artifact
|
|
7
|
+
* (`fst-street-morphology.bin`, built by `mailwoman gazetteer build street-morphology`) is the one
|
|
8
|
+
* resolution ladder every node call site shares.
|
|
11
9
|
*
|
|
12
|
-
* 1. An explicit `artifactPath
|
|
13
|
-
* `NeuralAddressClassifier.streetMorphologyPath
|
|
14
|
-
* 2. Otherwise the staged sealed artifact at `$MAILWOMAN_DATA_ROOT/wof/fst-street-morphology.bin`.
|
|
15
|
-
* 3.
|
|
16
|
-
* `street_types.txt` files
|
|
17
|
-
*
|
|
10
|
+
* 1. An explicit `artifactPath`, e.g. the weights-package sibling surfaced by
|
|
11
|
+
* `NeuralAddressClassifier.streetMorphologyPath`. When given, it is the only artifact probed.
|
|
12
|
+
* 2. Otherwise the staged sealed artifact at `$MAILWOMAN_DATA_ROOT/db/wof/fst-street-morphology.bin`.
|
|
13
|
+
* 3. A build-from-dictionaries fallback: `buildStreetMorphologyFST` over core's bundled libpostal
|
|
14
|
+
* `street_types.txt` files, kept so a missing artifact degrades to a per-process build instead
|
|
15
|
+
* of a crash.
|
|
18
16
|
*
|
|
19
17
|
* A present-but-unreadable artifact reports through `onWarn` and falls through to the build rung.
|
|
20
|
-
* Browsers
|
|
21
|
-
* `fst-deserialize-web.ts` (see the docs demo loader).
|
|
18
|
+
* Browsers cannot take the fallback because they have no filesystem API. They deserialize the same
|
|
19
|
+
* artifact through `fst-deserialize-web.ts` (see the docs demo loader).
|
|
22
20
|
*/
|
|
21
|
+
import type { PathBuilder, PathBuilderLike } from "path-ts";
|
|
23
22
|
import type { FSTMatcher } from "#fst/matcher";
|
|
24
23
|
import type { FSTProvenance } from "#fst/types";
|
|
25
24
|
/**
|
|
26
|
-
* The sealed artifact's canonical filename
|
|
25
|
+
* The sealed artifact's canonical filename, identical in the data-root staging dir
|
|
26
|
+
* and as a weights-package sibling.
|
|
27
27
|
*/
|
|
28
28
|
export declare const STREET_MORPHOLOGY_ARTIFACT_FILENAME = "fst-street-morphology.bin";
|
|
29
29
|
/**
|
|
30
|
-
* The staged artifact's default location: `$MAILWOMAN_DATA_ROOT/wof/fst-street-morphology.bin`.
|
|
30
|
+
* The staged artifact's default location: `$MAILWOMAN_DATA_ROOT/db/wof/fst-street-morphology.bin`.
|
|
31
31
|
*/
|
|
32
|
-
export declare function defaultStreetMorphologyArtifactPath():
|
|
32
|
+
export declare function defaultStreetMorphologyArtifactPath(): PathBuilder;
|
|
33
33
|
export interface LoadStreetMorphologyFSTOpts {
|
|
34
34
|
/**
|
|
35
|
-
* Explicit artifact path (e.g.
|
|
36
|
-
*
|
|
35
|
+
* Explicit artifact path (e.g. A weights-package sibling).
|
|
36
|
+
*
|
|
37
|
+
* When given, it is the only artifact probed.
|
|
38
|
+
* A missing or unreadable artifact degrades straight to the dictionary build, never a throw.
|
|
37
39
|
*/
|
|
38
|
-
artifactPath?:
|
|
40
|
+
artifactPath?: PathBuilderLike;
|
|
39
41
|
/**
|
|
40
|
-
* Dictionaries dir for the build fallback.
|
|
42
|
+
* Dictionaries dir for the build fallback.
|
|
43
|
+
*
|
|
44
|
+
* @defaultValue core's bundled libpostal dictionaries.
|
|
41
45
|
*/
|
|
42
|
-
dictionariesDir?:
|
|
46
|
+
dictionariesDir?: PathBuilderLike;
|
|
43
47
|
/**
|
|
44
|
-
* Unreadable-artifact diagnostics.
|
|
48
|
+
* Unreadable-artifact diagnostics.
|
|
49
|
+
*
|
|
50
|
+
* @defaultValue silent (the caller owns its warn channel).
|
|
45
51
|
*/
|
|
46
52
|
onWarn?: (message: string) => void;
|
|
47
53
|
}
|
|
@@ -54,14 +60,15 @@ export interface LoadedStreetMorphologyFST {
|
|
|
54
60
|
/**
|
|
55
61
|
* The artifact path when `source === "artifact"`.
|
|
56
62
|
*/
|
|
57
|
-
path
|
|
63
|
+
path: PathBuilderLike | null;
|
|
58
64
|
/**
|
|
59
|
-
* Build provenance
|
|
65
|
+
* Build provenance, read from the artifact trailer or copied from the fallback build.
|
|
60
66
|
*/
|
|
61
|
-
provenance
|
|
67
|
+
provenance: FSTProvenance | null;
|
|
62
68
|
}
|
|
63
69
|
/**
|
|
64
|
-
* Load the street-morphology matcher: sealed artifact first, per-process
|
|
70
|
+
* Load the street-morphology matcher: sealed artifact first, per-process
|
|
71
|
+
* dictionary build as the degrade path.
|
|
65
72
|
*/
|
|
66
73
|
export declare function loadStreetMorphologyFST(opts?: LoadStreetMorphologyFSTOpts): Promise<LoadedStreetMorphologyFST>;
|
|
67
74
|
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../lib/street/morphology/fst/loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../lib/street/morphology/fst/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAI/C;;;GAGG;AACH,eAAO,MAAM,mCAAmC,8BAA8B,CAAA;AAE9E;;GAEG;AACH,wBAAgB,mCAAmC,IAAI,WAAW,CAEjE;AAED,MAAM,WAAW,2BAA2B;IAC3C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,eAAe,CAAA;IAC9B;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC;AAED,MAAM,WAAW,yBAAyB;IACzC,OAAO,EAAE,UAAU,CAAA;IACnB;;OAEG;IACH,MAAM,EAAE,UAAU,GAAG,OAAO,CAAA;IAC5B;;OAEG;IACH,IAAI,EAAE,eAAe,GAAG,IAAI,CAAA;IAC5B;;OAEG;IACH,UAAU,EAAE,aAAa,GAAG,IAAI,CAAA;CAChC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC5C,IAAI,GAAE,2BAAgC,GACpC,OAAO,CAAC,yBAAyB,CAAC,CAuBpC"}
|
|
@@ -3,40 +3,41 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* (`fst-street-morphology.bin`, built by `mailwoman gazetteer build street-morphology`) replaces
|
|
10
|
-
* those per-process builds; this loader is the ONE resolution ladder every node call site shares:
|
|
6
|
+
* Runtime loader for the street-morphology FST. The sealed artifact
|
|
7
|
+
* (`fst-street-morphology.bin`, built by `mailwoman gazetteer build street-morphology`) is the one
|
|
8
|
+
* resolution ladder every node call site shares.
|
|
11
9
|
*
|
|
12
|
-
* 1. An explicit `artifactPath
|
|
13
|
-
* `NeuralAddressClassifier.streetMorphologyPath
|
|
14
|
-
* 2. Otherwise the staged sealed artifact at `$MAILWOMAN_DATA_ROOT/wof/fst-street-morphology.bin`.
|
|
15
|
-
* 3.
|
|
16
|
-
* `street_types.txt` files
|
|
17
|
-
*
|
|
10
|
+
* 1. An explicit `artifactPath`, e.g. the weights-package sibling surfaced by
|
|
11
|
+
* `NeuralAddressClassifier.streetMorphologyPath`. When given, it is the only artifact probed.
|
|
12
|
+
* 2. Otherwise the staged sealed artifact at `$MAILWOMAN_DATA_ROOT/db/wof/fst-street-morphology.bin`.
|
|
13
|
+
* 3. A build-from-dictionaries fallback: `buildStreetMorphologyFST` over core's bundled libpostal
|
|
14
|
+
* `street_types.txt` files, kept so a missing artifact degrades to a per-process build instead
|
|
15
|
+
* of a crash.
|
|
18
16
|
*
|
|
19
17
|
* A present-but-unreadable artifact reports through `onWarn` and falls through to the build rung.
|
|
20
|
-
* Browsers
|
|
21
|
-
* `fst-deserialize-web.ts` (see the docs demo loader).
|
|
18
|
+
* Browsers cannot take the fallback because they have no filesystem API. They deserialize the same
|
|
19
|
+
* artifact through `fst-deserialize-web.ts` (see the docs demo loader).
|
|
22
20
|
*/
|
|
23
|
-
import {
|
|
24
|
-
import { pathExists
|
|
21
|
+
import { readLocalBuffer } from "@mailwoman/core/fs/readers";
|
|
22
|
+
import { pathExists } from "@mailwoman/core/fs/readers/stat";
|
|
25
23
|
import { resourceDictionaryPath } from "@mailwoman/core/paths";
|
|
26
24
|
import { deserializeFST, readFSTProvenance } from "#fst/serialize";
|
|
25
|
+
import { wofDatabasePath } from "#paths";
|
|
27
26
|
import { buildStreetMorphologyFST } from "#street/morphology/fst/builder";
|
|
28
27
|
/**
|
|
29
|
-
* The sealed artifact's canonical filename
|
|
28
|
+
* The sealed artifact's canonical filename, identical in the data-root staging dir
|
|
29
|
+
* and as a weights-package sibling.
|
|
30
30
|
*/
|
|
31
31
|
export const STREET_MORPHOLOGY_ARTIFACT_FILENAME = "fst-street-morphology.bin";
|
|
32
32
|
/**
|
|
33
|
-
* The staged artifact's default location: `$MAILWOMAN_DATA_ROOT/wof/fst-street-morphology.bin`.
|
|
33
|
+
* The staged artifact's default location: `$MAILWOMAN_DATA_ROOT/db/wof/fst-street-morphology.bin`.
|
|
34
34
|
*/
|
|
35
35
|
export function defaultStreetMorphologyArtifactPath() {
|
|
36
|
-
return
|
|
36
|
+
return wofDatabasePath(STREET_MORPHOLOGY_ARTIFACT_FILENAME);
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* Load the street-morphology matcher: sealed artifact first, per-process
|
|
39
|
+
* Load the street-morphology matcher: sealed artifact first, per-process
|
|
40
|
+
* dictionary build as the degrade path.
|
|
40
41
|
*/
|
|
41
42
|
export async function loadStreetMorphologyFST(opts = {}) {
|
|
42
43
|
const warn = opts.onWarn ?? (() => { });
|
|
@@ -46,15 +47,15 @@ export async function loadStreetMorphologyFST(opts = {}) {
|
|
|
46
47
|
const buf = await readLocalBuffer(artifactPath);
|
|
47
48
|
const matcher = deserializeFST(buf);
|
|
48
49
|
const provenance = readFSTProvenance(buf);
|
|
49
|
-
return { matcher, source: "artifact", path: artifactPath,
|
|
50
|
+
return { matcher, source: "artifact", path: artifactPath, provenance };
|
|
50
51
|
}
|
|
51
52
|
catch (error) {
|
|
52
53
|
warn(`street-morphology artifact at ${artifactPath} unreadable (${error.message}) — falling back to the dictionary build`);
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
const built = await buildStreetMorphologyFST({
|
|
56
|
-
dictionariesDir: opts.dictionariesDir ?? resourceDictionaryPath("libpostal"),
|
|
57
|
+
dictionariesDir: (opts.dictionariesDir ?? resourceDictionaryPath("libpostal")).toString(),
|
|
57
58
|
});
|
|
58
|
-
return { matcher: built.matcher, source: "built", provenance: built.provenance };
|
|
59
|
+
return { matcher: built.matcher, source: "built", path: null, provenance: built.provenance };
|
|
59
60
|
}
|
|
60
61
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../lib/street/morphology/fst/loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../lib/street/morphology/fst/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAI9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAA;AAEzE;;;GAGG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,2BAA2B,CAAA;AAE9E;;GAEG;AACH,MAAM,UAAU,mCAAmC;IAClD,OAAO,eAAe,CAAC,mCAAmC,CAAC,CAAA;AAC5D,CAAC;AAwCD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,IAAI,GAAgC,EAAE;IAEtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mCAAmC,EAAE,CAAA;IAE/E,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAA;YAC/C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;YAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAA;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CACH,iCAAiC,YAAY,gBAAiB,KAAe,CAAC,OAAO,0CAA0C,CAC/H,CAAA;QACF,CAAC;IACF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC;QAC5C,eAAe,EAAE,CAAC,IAAI,CAAC,eAAe,IAAI,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;KACzF,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAA;AAC7F,CAAC"}
|
|
@@ -3,41 +3,47 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* The SQLite backend for {@link StreetLocalityEvidence}.
|
|
7
7
|
*
|
|
8
|
-
* Reads a street-name index (the FR instance
|
|
8
|
+
* Reads a street-name index (the FR instance is BAN `street-centroids-fr.db`, a `street_centroid`
|
|
9
9
|
* table of `street_norm × locality_base × postcode` rows) and answers "does this street surface
|
|
10
|
-
* exist as a name" for the k-best rerank.
|
|
11
|
-
*
|
|
10
|
+
* exist as a name" for the k-best rerank. It is sync-by-interface and read-only, uses prepared
|
|
11
|
+
* statements. It also degrades gracefully on a tableless extract, following the same reader discipline as
|
|
12
|
+
* `AddressPointSqliteLookup`.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* apostrophe'd street silently misses. The
|
|
16
|
-
*
|
|
17
|
-
* `foldStreetSurface` + a `street_norm` index before this backend is wired in production. Until
|
|
18
|
-
* then this class is correct-by-construction against a fixture built with the contract fold, and
|
|
19
|
-
* the production rebuild is a tracked BAN-sdk follow-up.
|
|
14
|
+
* The fold interface: the surface is folded with {@link foldStreetSurface} (the shared function),
|
|
15
|
+
* so the DB's `street_norm` column must have been built with that same fold or every hyphenated
|
|
16
|
+
* or apostrophe'd street silently misses. The column also needs a `street_norm` index before this
|
|
17
|
+
* backend is wired in production.
|
|
20
18
|
*/
|
|
21
19
|
import { type StreetEvidenceScope, type StreetLocalityEvidence } from "@mailwoman/resolver";
|
|
20
|
+
import { SQLiteLookup } from "@mailwoman/sqlite/lookup";
|
|
21
|
+
import type { PathBuilderLike } from "path-ts";
|
|
22
|
+
import type { WOFDatabase } from "#schema";
|
|
22
23
|
export interface SQLiteStreetNameLookupOpts {
|
|
23
24
|
/**
|
|
24
|
-
* ISO-2 (upper-case) countries this index answers for.
|
|
25
|
+
* ISO-2 (upper-case) countries this index answers for.
|
|
26
|
+
*
|
|
27
|
+
* @defaultValue `["FR"]` (the BAN street-centroids instance).
|
|
25
28
|
*/
|
|
26
29
|
countries?: Iterable<string>;
|
|
27
30
|
/**
|
|
28
|
-
* Table name.
|
|
31
|
+
* Table name.
|
|
32
|
+
*
|
|
33
|
+
* @defaultValue `street_centroid`
|
|
29
34
|
*/
|
|
30
35
|
table?: string;
|
|
31
36
|
}
|
|
32
37
|
/**
|
|
33
|
-
* A {@link StreetLocalityEvidence} backed by a street-name SQLite index.
|
|
34
|
-
*
|
|
38
|
+
* A {@link StreetLocalityEvidence} backed by a street-name SQLite index.
|
|
39
|
+
*
|
|
40
|
+
* Positive evidence only: any doubt (missing table, read miss) returns `false`,
|
|
41
|
+
* so the rerank fails open to the model's ranking.
|
|
35
42
|
*/
|
|
36
|
-
export declare class SQLiteStreetNameLookup implements StreetLocalityEvidence
|
|
43
|
+
export declare class SQLiteStreetNameLookup extends SQLiteLookup<WOFDatabase> implements StreetLocalityEvidence {
|
|
37
44
|
#private;
|
|
38
45
|
readonly countries: ReadonlySet<string>;
|
|
39
|
-
constructor(dbPath:
|
|
46
|
+
constructor(dbPath: PathBuilderLike, opts?: SQLiteStreetNameLookupOpts);
|
|
40
47
|
hasStreetName(streetSurface: string, scope?: StreetEvidenceScope): boolean;
|
|
41
|
-
[Symbol.dispose](): void;
|
|
42
48
|
}
|
|
43
49
|
//# sourceMappingURL=name-lookup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-lookup.d.ts","sourceRoot":"","sources":["../../lib/street/name-lookup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"name-lookup.d.ts","sourceRoot":"","sources":["../../lib/street/name-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAqB,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE9G,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAG1C,MAAM,WAAW,0BAA0B;IAC1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,YAAY,CAAC,WAAW,CAAE,YAAW,sBAAsB;;IACtG,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAKvC,YAAY,MAAM,EAAE,eAAe,EAAE,IAAI,GAAE,0BAA+B,EAyBzE;IAED,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAkBzE;CACD"}
|
|
@@ -3,47 +3,50 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* The SQLite backend for {@link StreetLocalityEvidence}.
|
|
7
7
|
*
|
|
8
|
-
* Reads a street-name index (the FR instance
|
|
8
|
+
* Reads a street-name index (the FR instance is BAN `street-centroids-fr.db`, a `street_centroid`
|
|
9
9
|
* table of `street_norm × locality_base × postcode` rows) and answers "does this street surface
|
|
10
|
-
* exist as a name" for the k-best rerank.
|
|
11
|
-
*
|
|
10
|
+
* exist as a name" for the k-best rerank. It is sync-by-interface and read-only, uses prepared
|
|
11
|
+
* statements. It also degrades gracefully on a tableless extract, following the same reader discipline as
|
|
12
|
+
* `AddressPointSqliteLookup`.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* apostrophe'd street silently misses. The
|
|
16
|
-
*
|
|
17
|
-
* `foldStreetSurface` + a `street_norm` index before this backend is wired in production. Until
|
|
18
|
-
* then this class is correct-by-construction against a fixture built with the contract fold, and
|
|
19
|
-
* the production rebuild is a tracked BAN-sdk follow-up.
|
|
14
|
+
* The fold interface: the surface is folded with {@link foldStreetSurface} (the shared function),
|
|
15
|
+
* so the DB's `street_norm` column must have been built with that same fold or every hyphenated
|
|
16
|
+
* or apostrophe'd street silently misses. The column also needs a `street_norm` index before this
|
|
17
|
+
* backend is wired in production.
|
|
20
18
|
*/
|
|
21
19
|
import { foldStreetSurface } from "@mailwoman/resolver";
|
|
22
|
-
import {
|
|
20
|
+
import { SQLiteLookup } from "@mailwoman/sqlite/lookup";
|
|
23
21
|
import { hasColumn, hasTable } from "#sqlite-utils";
|
|
24
22
|
/**
|
|
25
|
-
* A {@link StreetLocalityEvidence} backed by a street-name SQLite index.
|
|
26
|
-
*
|
|
23
|
+
* A {@link StreetLocalityEvidence} backed by a street-name SQLite index.
|
|
24
|
+
*
|
|
25
|
+
* Positive evidence only: any doubt (missing table, read miss) returns `false`,
|
|
26
|
+
* so the rerank fails open to the model's ranking.
|
|
27
27
|
*/
|
|
28
|
-
export class SQLiteStreetNameLookup {
|
|
28
|
+
export class SQLiteStreetNameLookup extends SQLiteLookup {
|
|
29
29
|
countries;
|
|
30
|
-
#db;
|
|
31
30
|
#byName;
|
|
32
31
|
#byNameLocality;
|
|
33
32
|
#byNamePostcode;
|
|
34
33
|
constructor(dbPath, opts = {}) {
|
|
34
|
+
super({ databasePath: dbPath });
|
|
35
35
|
this.countries = new Set([...(opts.countries ?? ["FR"])].map((c) => c.toUpperCase()));
|
|
36
|
-
this.#db = new DatabaseClient(dbPath, { readOnly: true });
|
|
37
36
|
const table = opts.table ?? "street_centroid";
|
|
38
|
-
// Degrade gracefully on an empty
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
37
|
+
// Degrade gracefully on an empty or tableless extract.
|
|
38
|
+
// A no-op miss, never a crash.
|
|
39
|
+
if (hasTable(this.database, table)) {
|
|
40
|
+
// Prefer the `name_key` column (built with `foldStreetSurface`
|
|
41
|
+
// and indexed by `idx_sc_name` for a direct seek).
|
|
42
|
+
// On a pre-rebuild extract, `street_norm` is a correct fallback.
|
|
43
|
+
// It uses a skip-scan.
|
|
44
|
+
// The fold that built `name_key` must match `foldStreetSurface` here.
|
|
45
|
+
// This is the fold-parity interface.
|
|
46
|
+
const keyCol = hasColumn(this.database, table, "name_key") ? "name_key" : "street_norm";
|
|
47
|
+
this.#byName = this.database.prepare(`SELECT 1 FROM ${table} WHERE ${keyCol} = ? LIMIT 1`);
|
|
48
|
+
this.#byNameLocality = this.database.prepare(`SELECT 1 FROM ${table} WHERE ${keyCol} = ? AND locality_base = ? LIMIT 1`);
|
|
49
|
+
this.#byNamePostcode = this.database.prepare(`SELECT 1 FROM ${table} WHERE ${keyCol} = ? AND postcode = ? LIMIT 1`);
|
|
47
50
|
}
|
|
48
51
|
}
|
|
49
52
|
hasStreetName(streetSurface, scope) {
|
|
@@ -52,20 +55,16 @@ export class SQLiteStreetNameLookup {
|
|
|
52
55
|
const norm = foldStreetSurface(streetSurface);
|
|
53
56
|
if (!norm)
|
|
54
57
|
return false;
|
|
55
|
-
// Scoped lookups tighten precision when the hypothesis
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
this.#byNameLocality.get(norm, foldStreetSurface(scope.locality)) !== undefined) {
|
|
58
|
+
// Scoped lookups tighten precision when the hypothesis includes a locality/postcode.
|
|
59
|
+
// A scoped miss falls back to the unscoped probe.
|
|
60
|
+
// The scope column may be incomplete, so a miss there does not establish absence.
|
|
61
|
+
if (scope?.locality && this.#byNameLocality && this.#byNameLocality.get(norm, foldStreetSurface(scope.locality))) {
|
|
60
62
|
return true;
|
|
61
63
|
}
|
|
62
|
-
if (scope?.postcode && this.#byNamePostcode && this.#byNamePostcode.get(norm, scope.postcode)
|
|
64
|
+
if (scope?.postcode && this.#byNamePostcode && this.#byNamePostcode.get(norm, scope.postcode)) {
|
|
63
65
|
return true;
|
|
64
66
|
}
|
|
65
67
|
return this.#byName.get(norm) !== undefined;
|
|
66
68
|
}
|
|
67
|
-
[Symbol.dispose]() {
|
|
68
|
-
this.#db[Symbol.dispose]();
|
|
69
|
-
}
|
|
70
69
|
}
|
|
71
70
|
//# sourceMappingURL=name-lookup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-lookup.js","sourceRoot":"","sources":["../../lib/street/name-lookup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"name-lookup.js","sourceRoot":"","sources":["../../lib/street/name-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,iBAAiB,EAAyD,MAAM,qBAAqB,CAAA;AAE9G,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAiBnD;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAyB;IAC3D,SAAS,CAAqB;IAC9B,OAAO,CAAmD;IAC1D,eAAe,CAAmD;IAClE,eAAe,CAAmD;IAE3E,YAAY,MAAuB,EAAE,IAAI,GAA+B,EAAE;QACzE,KAAK,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QACrF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAA;QAE7C,uDAAuD;QACvD,+BAA+B;QAC/B,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;YACpC,+DAA+D;YAC/D,mDAAmD;YACnD,iEAAiE;YACjE,uBAAuB;YACvB,sEAAsE;YACtE,qCAAqC;YACrC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAA;YACvF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,KAAK,UAAU,MAAM,cAAc,CAAC,CAAA;YAE1F,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAC3C,iBAAiB,KAAK,UAAU,MAAM,oCAAoC,CAC1E,CAAA;YAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAC3C,iBAAiB,KAAK,UAAU,MAAM,+BAA+B,CACrE,CAAA;QACF,CAAC;IACF,CAAC;IAED,aAAa,CAAC,aAAqB,EAAE,KAA2B;QAC/D,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAA;QAE7C,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAA;QAEvB,qFAAqF;QACrF,kDAAkD;QAClD,kFAAkF;QAClF,IAAI,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClH,OAAO,IAAI,CAAA;QACZ,CAAC;QAED,IAAI,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/F,OAAO,IAAI,CAAA;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAA;IAC5C,CAAC;CACD"}
|