@mailwoman/resolver-wof-sqlite 9.1.0 → 9.3.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 +36 -20
- package/lib/address/index.ts +9 -0
- package/{address-point-interpolation.ts → lib/address/point-interpolation.ts} +40 -28
- package/{address-point-schema.ts → lib/address/point-schema.ts} +34 -8
- package/lib/address/point.ts +280 -0
- package/{ancestry-backfill.ts → lib/ancestry/backfill.ts} +14 -19
- package/{ancestry.ts → lib/ancestry/index.ts} +13 -8
- package/{build-candidate.ts → lib/build-candidate.ts} +243 -199
- package/{build-slim.ts → lib/build-slim.ts} +153 -168
- package/lib/candidate/alias-bags.ts +56 -0
- package/lib/candidate/ancestors-sidecar.ts +204 -0
- package/lib/candidate/country-display-names.ts +79 -0
- package/lib/candidate/extract-fold.ts +138 -0
- package/lib/candidate/name-roles.ts +238 -0
- package/lib/candidate/own-name.ts +146 -0
- package/lib/candidate/place-attrs.ts +44 -0
- package/lib/candidate-ancestors-schema.ts +195 -0
- package/{candidate-fts.ts → lib/candidate-fts.ts} +7 -5
- package/{candidate-importance.ts → lib/candidate-importance.ts} +54 -57
- package/lib/candidate-lookup.ts +976 -0
- package/{candidate-schema.ts → lib/candidate-schema.ts} +34 -6
- package/lib/candidate-scoring.ts +261 -0
- package/lib/capital-schema.ts +89 -0
- package/lib/capitals.ts +148 -0
- package/{coincident-roles.ts → lib/coincident-roles.ts} +75 -19
- package/{convention.ts → lib/convention/index.ts} +5 -5
- package/lib/convention/schema.ts +72 -0
- package/{coverage-manifest-schema.ts → lib/coverage-manifest-schema.ts} +15 -16
- package/lib/currency-backfill.ts +334 -0
- package/lib/env.ts +50 -0
- package/lib/exact-match.ts +113 -0
- package/{sharding.ts → lib/extracts.ts} +63 -60
- package/lib/fst/autocomplete.ts +176 -0
- package/{fst-builder.ts → lib/fst/builder.ts} +30 -27
- package/{fst-deserialize-web.ts → lib/fst/deserialize-web.ts} +27 -87
- package/lib/fst/format.ts +106 -0
- package/{fst-freshness.ts → lib/fst/freshness.ts} +42 -75
- package/lib/fst/index.ts +14 -0
- package/{fst-matcher.ts → lib/fst/matcher.ts} +1 -1
- package/{fst-serialize.ts → lib/fst/serialize.ts} +37 -115
- package/{fst-types.ts → lib/fst/types.ts} +4 -2
- package/{fts.ts → lib/fts/index.ts} +28 -23
- package/{fts-query.ts → lib/fts/query.ts} +2 -2
- package/{geonames-aliases.ts → lib/geonames/aliases.ts} +13 -13
- package/lib/geonames/index.ts +8 -0
- package/{geonames-postal.ts → lib/geonames/postal.ts} +16 -15
- package/{index.ts → lib/index.ts} +52 -48
- package/{interpolation.ts → lib/interpolation.ts} +137 -41
- package/lib/lookup.ts +861 -0
- package/{name-score.ts → lib/name-score.ts} +6 -4
- package/lib/nsul/index.ts +8 -0
- package/lib/nsul/lookup.ts +144 -0
- package/lib/nsul/schema.ts +130 -0
- package/{place-importance-schema.ts → lib/place-importance-schema.ts} +70 -22
- package/lib/poi/index.ts +8 -0
- package/{poi-lookup.ts → lib/poi/lookup.ts} +32 -39
- package/{poi-schema.ts → lib/poi/schema.ts} +10 -6
- package/lib/polygon-schema.ts +47 -0
- package/{postal-city-alias-lookup.ts → lib/postal/city-alias-lookup.ts} +15 -21
- package/{postal-city-candidate-schema.ts → lib/postal/city-candidate-schema.ts} +4 -2
- package/lib/postal/index.ts +9 -0
- package/{postcode-point-lookup.ts → lib/postcode-point-lookup.ts} +17 -15
- package/lib/primary-preference.ts +226 -0
- package/lib/proximity-rerank.ts +120 -0
- package/{ranking-weights.ts → lib/ranking-weights.ts} +30 -4
- package/lib/region-keys.ts +144 -0
- package/{reverse.ts → lib/reverse.ts} +45 -56
- package/{schema.ts → lib/schema.ts} +11 -1
- package/lib/search-fetch.ts +257 -0
- package/{sqlite-convention-source.ts → lib/sqlite-convention-source.ts} +9 -10
- package/lib/sqlite-utils.ts +83 -0
- package/{street-centroid-schema.ts → lib/street/centroid-schema.ts} +12 -6
- package/{street-centroid.ts → lib/street/centroid.ts} +26 -28
- package/lib/street/index.ts +13 -0
- package/{street-morphology-fst-builder.ts → lib/street/morphology-fst-builder.ts} +24 -14
- package/{street-morphology-fst-loader.ts → lib/street/morphology-fst-loader.ts} +14 -12
- package/{street-name-lookup.ts → lib/street/name-lookup.ts} +14 -30
- package/lib/street/normalize.ts +572 -0
- package/{street-segment-schema.ts → lib/street/segment-schema.ts} +13 -8
- package/{types.ts → lib/types.ts} +49 -9
- package/{unified-schema.ts → lib/unified-schema.ts} +21 -25
- package/lib/uprn/existence.ts +84 -0
- package/lib/uprn/index.ts +9 -0
- package/lib/uprn/lookup.ts +206 -0
- package/lib/uprn/schema.ts +124 -0
- package/lib/weights-overlay-linker.ts +878 -0
- package/out/address/index.d.ts +9 -0
- package/out/address/index.d.ts.map +1 -0
- package/out/address/index.js +9 -0
- package/out/address/index.js.map +1 -0
- package/out/{address-point-interpolation.d.ts → address/point-interpolation.d.ts} +11 -10
- package/out/address/point-interpolation.d.ts.map +1 -0
- package/out/{address-point-interpolation.js → address/point-interpolation.js} +29 -23
- package/out/address/point-interpolation.js.map +1 -0
- package/out/{address-point-schema.d.ts → address/point-schema.d.ts} +30 -10
- package/out/address/point-schema.d.ts.map +1 -0
- package/out/{address-point-schema.js → address/point-schema.js} +7 -3
- package/out/address/point-schema.js.map +1 -0
- package/out/{address-point.d.ts → address/point.d.ts} +16 -8
- package/out/address/point.d.ts.map +1 -0
- package/out/address/point.js +191 -0
- package/out/address/point.js.map +1 -0
- package/out/{ancestry-backfill.d.ts → ancestry/backfill.d.ts} +7 -5
- package/out/ancestry/backfill.d.ts.map +1 -0
- package/out/{ancestry-backfill.js → ancestry/backfill.js} +12 -16
- package/out/ancestry/backfill.js.map +1 -0
- package/out/{ancestry.d.ts → ancestry/index.d.ts} +6 -5
- package/out/ancestry/index.d.ts.map +1 -0
- package/out/{ancestry.js → ancestry/index.js} +7 -7
- package/out/ancestry/index.js.map +1 -0
- package/out/build-candidate.d.ts +88 -7
- package/out/build-candidate.d.ts.map +1 -1
- package/out/build-candidate.js +145 -149
- package/out/build-candidate.js.map +1 -1
- package/out/build-slim.d.ts +5 -5
- package/out/build-slim.d.ts.map +1 -1
- package/out/build-slim.js +127 -142
- package/out/build-slim.js.map +1 -1
- package/out/candidate/alias-bags.d.ts +19 -0
- package/out/candidate/alias-bags.d.ts.map +1 -0
- package/out/candidate/alias-bags.js +39 -0
- package/out/candidate/alias-bags.js.map +1 -0
- package/out/candidate/ancestors-sidecar.d.ts +32 -0
- package/out/candidate/ancestors-sidecar.d.ts.map +1 -0
- package/out/candidate/ancestors-sidecar.js +140 -0
- package/out/candidate/ancestors-sidecar.js.map +1 -0
- package/out/candidate/country-display-names.d.ts +35 -0
- package/out/candidate/country-display-names.d.ts.map +1 -0
- package/out/candidate/country-display-names.js +59 -0
- package/out/candidate/country-display-names.js.map +1 -0
- package/out/candidate/extract-fold.d.ts +32 -0
- package/out/candidate/extract-fold.d.ts.map +1 -0
- package/out/candidate/extract-fold.js +104 -0
- package/out/candidate/extract-fold.js.map +1 -0
- package/out/candidate/name-roles.d.ts +57 -0
- package/out/candidate/name-roles.d.ts.map +1 -0
- package/out/candidate/name-roles.js +166 -0
- package/out/candidate/name-roles.js.map +1 -0
- package/out/candidate/own-name.d.ts +50 -0
- package/out/candidate/own-name.d.ts.map +1 -0
- package/out/candidate/own-name.js +132 -0
- package/out/candidate/own-name.js.map +1 -0
- package/out/candidate/place-attrs.d.ts +43 -0
- package/out/candidate/place-attrs.d.ts.map +1 -0
- package/out/candidate/place-attrs.js +15 -0
- package/out/candidate/place-attrs.js.map +1 -0
- package/out/candidate-ancestors-schema.d.ts +150 -0
- package/out/candidate-ancestors-schema.d.ts.map +1 -0
- package/out/candidate-ancestors-schema.js +123 -0
- package/out/candidate-ancestors-schema.js.map +1 -0
- package/out/candidate-fts.d.ts +7 -5
- package/out/candidate-fts.d.ts.map +1 -1
- package/out/candidate-fts.js +5 -3
- package/out/candidate-fts.js.map +1 -1
- package/out/candidate-importance.d.ts +16 -16
- package/out/candidate-importance.d.ts.map +1 -1
- package/out/candidate-importance.js +47 -52
- package/out/candidate-importance.js.map +1 -1
- package/out/candidate-lookup.d.ts +31 -52
- package/out/candidate-lookup.d.ts.map +1 -1
- package/out/candidate-lookup.js +380 -172
- package/out/candidate-lookup.js.map +1 -1
- package/out/candidate-schema.d.ts +31 -7
- package/out/candidate-schema.d.ts.map +1 -1
- package/out/candidate-schema.js +3 -0
- package/out/candidate-schema.js.map +1 -1
- package/out/candidate-scoring.d.ts +34 -0
- package/out/candidate-scoring.d.ts.map +1 -0
- package/out/candidate-scoring.js +196 -0
- package/out/candidate-scoring.js.map +1 -0
- package/out/capital-schema.d.ts +51 -0
- package/out/capital-schema.d.ts.map +1 -0
- package/out/capital-schema.js +63 -0
- package/out/capital-schema.js.map +1 -0
- package/out/capitals.d.ts +69 -0
- package/out/capitals.d.ts.map +1 -0
- package/out/capitals.js +98 -0
- package/out/capitals.js.map +1 -0
- package/out/coincident-roles.d.ts +12 -4
- package/out/coincident-roles.d.ts.map +1 -1
- package/out/coincident-roles.js +43 -11
- package/out/coincident-roles.js.map +1 -1
- package/out/{convention.d.ts → convention/index.d.ts} +5 -5
- package/out/convention/index.d.ts.map +1 -0
- package/out/{convention.js → convention/index.js} +4 -4
- package/out/convention/index.js.map +1 -0
- package/out/convention/schema.d.ts +51 -0
- package/out/convention/schema.d.ts.map +1 -0
- package/out/convention/schema.js +34 -0
- package/out/convention/schema.js.map +1 -0
- package/out/coverage-manifest-schema.d.ts +8 -8
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +6 -10
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/currency-backfill.d.ts +90 -0
- package/out/currency-backfill.d.ts.map +1 -0
- package/out/currency-backfill.js +196 -0
- package/out/currency-backfill.js.map +1 -0
- package/out/env.d.ts +43 -0
- package/out/env.d.ts.map +1 -0
- package/out/env.js +48 -0
- package/out/env.js.map +1 -0
- package/out/exact-match.d.ts +25 -0
- package/out/exact-match.d.ts.map +1 -0
- package/out/exact-match.js +88 -0
- package/out/exact-match.js.map +1 -0
- package/out/extracts.d.ts +114 -0
- package/out/extracts.d.ts.map +1 -0
- package/out/{sharding.js → extracts.js} +38 -38
- package/out/extracts.js.map +1 -0
- package/out/{fst-autocomplete.d.ts → fst/autocomplete.d.ts} +13 -13
- package/out/fst/autocomplete.d.ts.map +1 -0
- package/out/fst/autocomplete.js +113 -0
- package/out/fst/autocomplete.js.map +1 -0
- package/out/{fst-builder.d.ts → fst/builder.d.ts} +5 -5
- package/out/fst/builder.d.ts.map +1 -0
- package/out/{fst-builder.js → fst/builder.js} +24 -24
- package/out/fst/builder.js.map +1 -0
- package/out/{fst-deserialize-web.d.ts → fst/deserialize-web.d.ts} +3 -3
- package/out/fst/deserialize-web.d.ts.map +1 -0
- package/out/{fst-deserialize-web.js → fst/deserialize-web.js} +10 -74
- package/out/fst/deserialize-web.js.map +1 -0
- package/out/fst/format.d.ts +80 -0
- package/out/fst/format.d.ts.map +1 -0
- package/out/fst/format.js +91 -0
- package/out/fst/format.js.map +1 -0
- package/out/{fst-freshness.d.ts → fst/freshness.d.ts} +11 -14
- package/out/fst/freshness.d.ts.map +1 -0
- package/out/{fst-freshness.js → fst/freshness.js} +42 -74
- package/out/fst/freshness.js.map +1 -0
- package/out/fst/index.d.ts +14 -0
- package/out/fst/index.d.ts.map +1 -0
- package/out/fst/index.js +14 -0
- package/out/fst/index.js.map +1 -0
- package/out/{fst-matcher.d.ts → fst/matcher.d.ts} +2 -2
- package/out/fst/matcher.d.ts.map +1 -0
- package/out/{fst-matcher.js → fst/matcher.js} +1 -1
- package/out/fst/matcher.js.map +1 -0
- package/out/{fst-serialize.d.ts → fst/serialize.d.ts} +5 -10
- package/out/fst/serialize.d.ts.map +1 -0
- package/out/{fst-serialize.js → fst/serialize.js} +18 -98
- package/out/fst/serialize.js.map +1 -0
- package/out/{fst-types.d.ts → fst/types.d.ts} +4 -3
- package/out/fst/types.d.ts.map +1 -0
- package/out/{fst-types.js → fst/types.js} +1 -1
- package/out/fst/types.js.map +1 -0
- package/out/{fts.d.ts → fts/index.d.ts} +20 -13
- package/out/fts/index.d.ts.map +1 -0
- package/out/{fts.js → fts/index.js} +20 -15
- package/out/fts/index.js.map +1 -0
- package/out/{fts-query.d.ts → fts/query.d.ts} +2 -2
- package/out/fts/query.d.ts.map +1 -0
- package/out/{fts-query.js → fts/query.js} +2 -2
- package/out/fts/query.js.map +1 -0
- package/out/{geonames-aliases.d.ts → geonames/aliases.d.ts} +8 -6
- package/out/geonames/aliases.d.ts.map +1 -0
- package/out/{geonames-aliases.js → geonames/aliases.js} +7 -7
- package/out/geonames/aliases.js.map +1 -0
- package/out/geonames/index.d.ts +8 -0
- package/out/geonames/index.d.ts.map +1 -0
- package/out/geonames/index.js +8 -0
- package/out/geonames/index.js.map +1 -0
- package/out/{geonames-postal.d.ts → geonames/postal.d.ts} +12 -10
- package/out/geonames/postal.d.ts.map +1 -0
- package/out/{geonames-postal.js → geonames/postal.js} +11 -11
- package/out/geonames/postal.js.map +1 -0
- package/out/index.d.ts +32 -31
- package/out/index.d.ts.map +1 -1
- package/out/index.js +24 -24
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +18 -9
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +108 -36
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +25 -25
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +174 -558
- package/out/lookup.js.map +1 -1
- package/out/name-score.d.ts +0 -10
- package/out/name-score.d.ts.map +1 -1
- package/out/name-score.js +6 -4
- package/out/name-score.js.map +1 -1
- package/out/nsul/index.d.ts +8 -0
- package/out/nsul/index.d.ts.map +1 -0
- package/out/nsul/index.js +8 -0
- package/out/nsul/index.js.map +1 -0
- package/out/nsul/lookup.d.ts +83 -0
- package/out/nsul/lookup.d.ts.map +1 -0
- package/out/nsul/lookup.js +80 -0
- package/out/nsul/lookup.js.map +1 -0
- package/out/nsul/schema.d.ts +100 -0
- package/out/nsul/schema.d.ts.map +1 -0
- package/out/nsul/schema.js +78 -0
- package/out/nsul/schema.js.map +1 -0
- package/out/place-importance-schema.d.ts +47 -10
- package/out/place-importance-schema.d.ts.map +1 -1
- package/out/place-importance-schema.js +56 -10
- package/out/place-importance-schema.js.map +1 -1
- package/out/poi/index.d.ts +8 -0
- package/out/poi/index.d.ts.map +1 -0
- package/out/poi/index.js +8 -0
- package/out/poi/index.js.map +1 -0
- package/out/{poi-lookup.d.ts → poi/lookup.d.ts} +8 -10
- package/out/poi/lookup.d.ts.map +1 -0
- package/out/{poi-lookup.js → poi/lookup.js} +24 -29
- package/out/poi/lookup.js.map +1 -0
- package/out/{poi-schema.d.ts → poi/schema.d.ts} +10 -6
- package/out/poi/schema.d.ts.map +1 -0
- package/out/{poi-schema.js → poi/schema.js} +1 -1
- package/out/poi/schema.js.map +1 -0
- package/out/polygon-schema.d.ts +37 -0
- package/out/polygon-schema.d.ts.map +1 -0
- package/out/polygon-schema.js +23 -0
- package/out/polygon-schema.js.map +1 -0
- package/out/{postal-city-alias-lookup.d.ts → postal/city-alias-lookup.d.ts} +7 -6
- package/out/postal/city-alias-lookup.d.ts.map +1 -0
- package/out/{postal-city-alias-lookup.js → postal/city-alias-lookup.js} +12 -16
- package/out/postal/city-alias-lookup.js.map +1 -0
- package/out/{postal-city-alias-schema.d.ts → postal/city-alias-schema.d.ts} +1 -1
- package/out/{postal-city-alias-schema.d.ts.map → postal/city-alias-schema.d.ts.map} +1 -1
- package/out/{postal-city-alias-schema.js → postal/city-alias-schema.js} +1 -1
- package/out/{postal-city-alias-schema.js.map → postal/city-alias-schema.js.map} +1 -1
- package/out/{postal-city-candidate-schema.d.ts → postal/city-candidate-schema.d.ts} +4 -3
- package/out/postal/city-candidate-schema.d.ts.map +1 -0
- package/out/{postal-city-candidate-schema.js → postal/city-candidate-schema.js} +2 -2
- package/out/{postal-city-candidate-schema.js.map → postal/city-candidate-schema.js.map} +1 -1
- package/out/postal/index.d.ts +9 -0
- package/out/postal/index.d.ts.map +1 -0
- package/out/postal/index.js +9 -0
- package/out/postal/index.js.map +1 -0
- package/out/postcode-point-lookup.d.ts +10 -10
- package/out/postcode-point-lookup.d.ts.map +1 -1
- package/out/postcode-point-lookup.js +13 -13
- package/out/postcode-point-lookup.js.map +1 -1
- package/out/primary-preference.d.ts +133 -0
- package/out/primary-preference.d.ts.map +1 -0
- package/out/primary-preference.js +146 -0
- package/out/primary-preference.js.map +1 -0
- package/out/proximity-rerank.d.ts +77 -0
- package/out/proximity-rerank.d.ts.map +1 -0
- package/out/proximity-rerank.js +86 -0
- package/out/proximity-rerank.js.map +1 -0
- package/out/ranking-weights.d.ts +15 -3
- package/out/ranking-weights.d.ts.map +1 -1
- package/out/ranking-weights.js +21 -3
- package/out/ranking-weights.js.map +1 -1
- package/out/region-keys.d.ts +47 -0
- package/out/region-keys.d.ts.map +1 -0
- package/out/region-keys.js +121 -0
- package/out/region-keys.js.map +1 -0
- package/out/reverse.d.ts +6 -6
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +23 -35
- package/out/reverse.js.map +1 -1
- package/out/schema.d.ts +10 -1
- package/out/schema.d.ts.map +1 -1
- package/out/schema.js.map +1 -1
- package/out/search-fetch.d.ts +59 -0
- package/out/search-fetch.d.ts.map +1 -0
- package/out/search-fetch.js +184 -0
- package/out/search-fetch.js.map +1 -0
- package/out/sqlite-convention-source.d.ts +7 -7
- package/out/sqlite-convention-source.d.ts.map +1 -1
- package/out/sqlite-convention-source.js +5 -5
- package/out/sqlite-convention-source.js.map +1 -1
- package/out/sqlite-utils.d.ts +24 -6
- package/out/sqlite-utils.d.ts.map +1 -1
- package/out/sqlite-utils.js +24 -7
- package/out/sqlite-utils.js.map +1 -1
- package/out/{street-centroid-schema.d.ts → street/centroid-schema.d.ts} +12 -7
- package/out/street/centroid-schema.d.ts.map +1 -0
- package/out/{street-centroid-schema.js → street/centroid-schema.js} +5 -5
- package/out/{street-centroid-schema.js.map → street/centroid-schema.js.map} +1 -1
- package/out/{street-centroid.d.ts → street/centroid.d.ts} +6 -6
- package/out/street/centroid.d.ts.map +1 -0
- package/out/{street-centroid.js → street/centroid.js} +18 -24
- package/out/street/centroid.js.map +1 -0
- package/out/street/index.d.ts +13 -0
- package/out/street/index.d.ts.map +1 -0
- package/out/street/index.js +13 -0
- package/out/street/index.js.map +1 -0
- package/out/{street-morphology-fst-builder.d.ts → street/morphology-fst-builder.d.ts} +4 -4
- package/out/street/morphology-fst-builder.d.ts.map +1 -0
- package/out/{street-morphology-fst-builder.js → street/morphology-fst-builder.js} +18 -13
- package/out/street/morphology-fst-builder.js.map +1 -0
- package/out/{street-morphology-fst-loader.d.ts → street/morphology-fst-loader.d.ts} +5 -5
- package/out/street/morphology-fst-loader.d.ts.map +1 -0
- package/out/{street-morphology-fst-loader.js → street/morphology-fst-loader.js} +11 -10
- package/out/street/morphology-fst-loader.js.map +1 -0
- package/out/{street-name-lookup.d.ts → street/name-lookup.d.ts} +4 -7
- package/out/street/name-lookup.d.ts.map +1 -0
- package/out/{street-name-lookup.js → street/name-lookup.js} +9 -23
- package/out/street/name-lookup.js.map +1 -0
- package/out/street/normalize.d.ts +179 -0
- package/out/street/normalize.d.ts.map +1 -0
- package/out/street/normalize.js +457 -0
- package/out/street/normalize.js.map +1 -0
- package/out/{street-segment-schema.d.ts → street/segment-schema.d.ts} +13 -9
- package/out/street/segment-schema.d.ts.map +1 -0
- package/out/{street-segment-schema.js → street/segment-schema.js} +4 -4
- package/out/{street-segment-schema.js.map → street/segment-schema.js.map} +1 -1
- package/out/types.d.ts +49 -9
- package/out/types.d.ts.map +1 -1
- package/out/types.js.map +1 -1
- package/out/unified-schema.d.ts +6 -5
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +16 -19
- package/out/unified-schema.js.map +1 -1
- package/out/uprn/existence.d.ts +53 -0
- package/out/uprn/existence.d.ts.map +1 -0
- package/out/uprn/existence.js +61 -0
- package/out/uprn/existence.js.map +1 -0
- package/out/uprn/index.d.ts +9 -0
- package/out/uprn/index.d.ts.map +1 -0
- package/out/uprn/index.js +9 -0
- package/out/uprn/index.js.map +1 -0
- package/out/uprn/lookup.d.ts +85 -0
- package/out/uprn/lookup.d.ts.map +1 -0
- package/out/uprn/lookup.js +149 -0
- package/out/uprn/lookup.js.map +1 -0
- package/out/uprn/schema.d.ts +93 -0
- package/out/uprn/schema.d.ts.map +1 -0
- package/out/uprn/schema.js +78 -0
- package/out/uprn/schema.js.map +1 -0
- package/out/weights-overlay-linker.d.ts +299 -0
- package/out/weights-overlay-linker.d.ts.map +1 -0
- package/out/weights-overlay-linker.js +511 -0
- package/out/weights-overlay-linker.js.map +1 -0
- package/package.json +622 -154
- package/address-point.ts +0 -125
- package/candidate-lookup.ts +0 -720
- package/fst-autocomplete.ts +0 -204
- package/geo.ts +0 -121
- package/lookup.ts +0 -1354
- package/out/address-point-interpolation.d.ts.map +0 -1
- package/out/address-point-interpolation.js.map +0 -1
- package/out/address-point-schema.d.ts.map +0 -1
- package/out/address-point-schema.js.map +0 -1
- package/out/address-point.d.ts.map +0 -1
- package/out/address-point.js +0 -84
- package/out/address-point.js.map +0 -1
- package/out/ancestry-backfill.d.ts.map +0 -1
- package/out/ancestry-backfill.js.map +0 -1
- package/out/ancestry.d.ts.map +0 -1
- package/out/ancestry.js.map +0 -1
- package/out/convention.d.ts.map +0 -1
- package/out/convention.js.map +0 -1
- package/out/fst-autocomplete.d.ts.map +0 -1
- package/out/fst-autocomplete.js +0 -130
- package/out/fst-autocomplete.js.map +0 -1
- package/out/fst-builder.d.ts.map +0 -1
- package/out/fst-builder.js.map +0 -1
- package/out/fst-deserialize-web.d.ts.map +0 -1
- package/out/fst-deserialize-web.js.map +0 -1
- package/out/fst-freshness.d.ts.map +0 -1
- package/out/fst-freshness.js.map +0 -1
- package/out/fst-matcher.d.ts.map +0 -1
- package/out/fst-matcher.js.map +0 -1
- package/out/fst-serialize.d.ts.map +0 -1
- package/out/fst-serialize.js.map +0 -1
- package/out/fst-types.d.ts.map +0 -1
- package/out/fst-types.js.map +0 -1
- package/out/fts-query.d.ts.map +0 -1
- package/out/fts-query.js.map +0 -1
- package/out/fts.d.ts.map +0 -1
- package/out/fts.js.map +0 -1
- package/out/geo.d.ts +0 -74
- package/out/geo.d.ts.map +0 -1
- package/out/geo.js +0 -71
- package/out/geo.js.map +0 -1
- package/out/geonames-aliases.d.ts.map +0 -1
- package/out/geonames-aliases.js.map +0 -1
- package/out/geonames-postal.d.ts.map +0 -1
- package/out/geonames-postal.js.map +0 -1
- package/out/poi-lookup.d.ts.map +0 -1
- package/out/poi-lookup.js.map +0 -1
- package/out/poi-schema.d.ts.map +0 -1
- package/out/poi-schema.js.map +0 -1
- package/out/postal-city-alias-lookup.d.ts.map +0 -1
- package/out/postal-city-alias-lookup.js.map +0 -1
- package/out/postal-city-candidate-schema.d.ts.map +0 -1
- package/out/sharding.d.ts +0 -114
- package/out/sharding.d.ts.map +0 -1
- package/out/sharding.js.map +0 -1
- package/out/street-centroid-schema.d.ts.map +0 -1
- package/out/street-centroid.d.ts.map +0 -1
- package/out/street-centroid.js.map +0 -1
- package/out/street-morphology-fst-builder.d.ts.map +0 -1
- package/out/street-morphology-fst-builder.js.map +0 -1
- package/out/street-morphology-fst-loader.d.ts.map +0 -1
- package/out/street-morphology-fst-loader.js.map +0 -1
- package/out/street-name-lookup.d.ts.map +0 -1
- package/out/street-name-lookup.js.map +0 -1
- package/out/street-normalize.d.ts +0 -95
- package/out/street-normalize.d.ts.map +0 -1
- package/out/street-normalize.js +0 -272
- package/out/street-normalize.js.map +0 -1
- package/out/street-segment-schema.d.ts.map +0 -1
- package/sqlite-utils.ts +0 -46
- package/street-normalize.ts +0 -318
- /package/{postal-city-alias-schema.ts → lib/postal/city-alias-schema.ts} +0 -0
package/out/interpolation.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* then linear interpolation along the segment polyline. Design:
|
|
9
9
|
* `docs/articles/plan/2026-06-11-interpolation-design.md`.
|
|
10
10
|
*
|
|
11
|
-
* Reads the per-state
|
|
11
|
+
* Reads the per-state extract built by `scripts/build-interpolation-extract.ts` (`street_segment`: one
|
|
12
12
|
* row per TIGER edge SIDE — independent left/right ranges, ZIPs, parity). Query-side
|
|
13
13
|
* normalization is THE shared normalizer (`street-normalize.ts`) — identical to build-side, by
|
|
14
14
|
* construction.
|
|
@@ -25,43 +25,92 @@
|
|
|
25
25
|
* exact-point fall-through) is a noted follow-up on #483, so the `find()` shape mirrors
|
|
26
26
|
* `AddressPointLookup.find()` to keep that wiring mechanical.
|
|
27
27
|
*/
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
|
|
28
|
+
import { parseJSONStrict } from "@mailwoman/core/json";
|
|
29
|
+
import { clampFraction, haversineKm, pointAlong } from "@mailwoman/spatial";
|
|
30
|
+
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
31
|
+
import { hasTable, prepareAll } from "#sqlite-utils";
|
|
32
|
+
import { canonicalizeRouteKey, streetKeyVariants } from "#street/normalize";
|
|
33
|
+
/**
|
|
34
|
+
* Acceptance geometry for the `near` tie-break: the winning postcode group's closest segment must sit within this many
|
|
35
|
+
* kilometres of `near`, AND the runner-up group must be at least {@link NEAR_DOMINANCE} times farther. Both measured on
|
|
36
|
+
* the two live failures: Brooklyn's `st pauls place` 11226 segment is ~2 km from the Brooklyn centroid with Great
|
|
37
|
+
* Neck's 11021 at ~24 km (12×); Fraser's `east 13 mile road` 48026 is ~2 km with Mecosta's namesake ~190 km away. A
|
|
38
|
+
* near-tie between groups is genuine ambiguity and stays an abstention.
|
|
39
|
+
*/
|
|
40
|
+
const NEAR_MAX_KM = 25;
|
|
41
|
+
/**
|
|
42
|
+
* See {@link NEAR_MAX_KM}.
|
|
43
|
+
*/
|
|
44
|
+
const NEAR_DOMINANCE = 2;
|
|
45
|
+
/**
|
|
46
|
+
* The postcode group nearest `near`, under the {@link NEAR_MAX_KM} dominance geometry — or null when no group qualifies
|
|
47
|
+
* (out of range, or the runner-up is too close to call). A group's distance is its closest segment's first polyline
|
|
48
|
+
* vertex; a segment whose geometry fails to parse prices as unreachable rather than aborting the tie-break.
|
|
49
|
+
*/
|
|
50
|
+
function nearestPostcodeGroup(pool, near) {
|
|
51
|
+
const groups = new Map();
|
|
52
|
+
for (const row of pool) {
|
|
53
|
+
const key = row.postcode ?? "";
|
|
54
|
+
let km = Number.POSITIVE_INFINITY;
|
|
55
|
+
try {
|
|
56
|
+
const [firstVertex] = parseJSONStrict(row.geometry);
|
|
57
|
+
if (firstVertex) {
|
|
58
|
+
km = haversineKm(near.lat, near.lon, firstVertex[1], firstVertex[0]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Unparseable geometry: this row cannot be sited, so it cannot win the tie-break.
|
|
63
|
+
}
|
|
64
|
+
const group = groups.get(key);
|
|
65
|
+
if (group) {
|
|
66
|
+
group.rows.push(row);
|
|
67
|
+
group.km = Math.min(group.km, km);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
groups.set(key, { rows: [row], km });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const ranked = [...groups.values()].toSorted((a, b) => a.km - b.km);
|
|
74
|
+
const [winner, runnerUp] = ranked;
|
|
75
|
+
if (!winner || winner.km > NEAR_MAX_KM)
|
|
76
|
+
return null;
|
|
77
|
+
if (runnerUp && runnerUp.km < winner.km * NEAR_DOMINANCE)
|
|
78
|
+
return null;
|
|
79
|
+
return winner.rows;
|
|
80
|
+
}
|
|
34
81
|
export class StreetInterpolator {
|
|
35
82
|
#db;
|
|
36
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Resources this instance opened. A connection handed in by a caller is NOT in here, so disposal cannot reach it —
|
|
85
|
+
* ownership is membership rather than a flag a later branch has to check.
|
|
86
|
+
*/
|
|
87
|
+
#resources = new DisposableStack();
|
|
37
88
|
#byPostcode;
|
|
38
89
|
#byStreet;
|
|
39
90
|
#radiusCalibration;
|
|
40
91
|
constructor(opts) {
|
|
41
92
|
if (opts.database) {
|
|
42
93
|
this.#db = opts.database;
|
|
43
|
-
this.#ownsDB = false;
|
|
44
94
|
}
|
|
45
95
|
else if (opts.dbPath) {
|
|
46
|
-
this.#db = new
|
|
47
|
-
this.#ownsDB = true;
|
|
96
|
+
this.#db = this.#resources.use(new DatabaseClient(opts.dbPath, { readOnly: true }));
|
|
48
97
|
}
|
|
49
98
|
else {
|
|
50
99
|
throw new Error("StreetInterpolator: one of dbPath or database is required");
|
|
51
100
|
}
|
|
52
|
-
// Degrade gracefully on an empty/tableless
|
|
101
|
+
// Degrade gracefully on an empty/tableless extract (interrupted build, stray 0-byte file): with no
|
|
53
102
|
// `street_segment` table this interpolator is a no-op miss, not a crash that loses the state (#568).
|
|
54
103
|
if (hasTable(this.#db, "street_segment")) {
|
|
55
104
|
const columns = `from_hn, to_hn, min_hn, max_hn, parity, postcode, geometry, source, release`;
|
|
56
|
-
this.#byPostcode = this.#db
|
|
105
|
+
this.#byPostcode = prepareAll(this.#db, `SELECT ${columns} FROM street_segment
|
|
57
106
|
WHERE postcode = ? AND street_norm = ? AND min_hn <= ? AND max_hn >= ?`);
|
|
58
|
-
this.#byStreet = this.#db
|
|
107
|
+
this.#byStreet = prepareAll(this.#db, `SELECT ${columns} FROM street_segment
|
|
59
108
|
WHERE street_norm = ? AND min_hn <= ? AND max_hn >= ?`);
|
|
60
109
|
}
|
|
61
110
|
// #374 doctrine: the conformal radius multiplier is a property of the calibration set the ARTIFACT was
|
|
62
|
-
// built against, so it ships in the
|
|
111
|
+
// built against, so it ships in the extract's `interp_calibration` metadata table (street-segment-schema.ts)
|
|
63
112
|
// and is read here, once, at open time — sync raw `.prepare()` per the sync-by-interface doctrine
|
|
64
|
-
// (AGENTS.md).
|
|
113
|
+
// (AGENTS.md). Extracts predating the table (the pre-2026-07 fleet) yield `undefined`; callers then fall
|
|
65
114
|
// back to their in-code table, byte-identically.
|
|
66
115
|
if (hasTable(this.#db, "interp_calibration")) {
|
|
67
116
|
const row = this.#db.prepare("SELECT radius_multiplier FROM interp_calibration LIMIT 1").get();
|
|
@@ -72,9 +121,9 @@ export class StreetInterpolator {
|
|
|
72
121
|
}
|
|
73
122
|
}
|
|
74
123
|
/**
|
|
75
|
-
* The artifact's own conformal radius multiplier (#374), read from the
|
|
76
|
-
* construction. `undefined` = the
|
|
77
|
-
* artifact default and callers may supply a legacy fallback.
|
|
124
|
+
* The artifact's own conformal radius multiplier (#374), read from the extract's `interp_calibration` metadata table
|
|
125
|
+
* at construction. `undefined` = the extract predates the table (or carries no valid row) — the resolver then applies
|
|
126
|
+
* no artifact default and callers may supply a legacy fallback.
|
|
78
127
|
*/
|
|
79
128
|
get radiusCalibration() {
|
|
80
129
|
return this.#radiusCalibration;
|
|
@@ -82,27 +131,36 @@ export class StreetInterpolator {
|
|
|
82
131
|
find(query) {
|
|
83
132
|
if (!this.#byPostcode || !this.#byStreet)
|
|
84
133
|
return null;
|
|
85
|
-
const streetNorm = canonicalizeRouteKey(normalizeStreetForKey(query.street));
|
|
86
134
|
const numberRaw = query.number.trim();
|
|
87
135
|
// Strictly-numeric house numbers only — this tier estimates, it doesn't guess at
|
|
88
136
|
// hyphenated/alphanumeric schemes the ranges don't model.
|
|
89
|
-
if (
|
|
137
|
+
if (!/^\d+$/.test(numberRaw))
|
|
90
138
|
return null;
|
|
91
139
|
const n = Number(numberRaw);
|
|
92
|
-
|
|
93
|
-
|
|
140
|
+
// Key-variant ladder (see `streetKeyVariants`): the literal key first, then the doubled-type
|
|
141
|
+
// collapse and the saint↔st register swap. A variant advances the ladder when it produces no
|
|
142
|
+
// ANSWER, not merely no rows — a wrong-register key can cover the number in far-away towns and
|
|
143
|
+
// then fail the ambiguity check ("saint pauls place" reaches Nassau's rows; the Brooklyn answer
|
|
144
|
+
// lives under "st pauls place"), and stopping at rows would eclipse the right variant.
|
|
145
|
+
for (const variant of streetKeyVariants(query.street)) {
|
|
146
|
+
const streetNorm = canonicalizeRouteKey(variant);
|
|
94
147
|
// A given ZIP that scopes to nothing is a MISS, not a statewide guess: the retry was
|
|
95
148
|
// measured (2026-06-11 VT eval) at +2.3pp coverage for a poisoned tail (p99 1.0 → 20.8
|
|
96
149
|
// km, max 204 km — a unique name statewide can live in a far-away town).
|
|
97
|
-
rows =
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (postcodes.size > 1)
|
|
104
|
-
return null;
|
|
150
|
+
const rows = query.postcode
|
|
151
|
+
? this.#byPostcode(query.postcode.trim(), streetNorm, n, n)
|
|
152
|
+
: this.#byStreet(streetNorm, n, n);
|
|
153
|
+
const hit = this.#answerFromRows(rows, n, query);
|
|
154
|
+
if (hit)
|
|
155
|
+
return hit;
|
|
105
156
|
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Resolve one key variant's covering rows to an answer, or null when they cannot honestly give one — the
|
|
161
|
+
* parity/ambiguity/tightest-range pipeline the module doc describes.
|
|
162
|
+
*/
|
|
163
|
+
#answerFromRows(rows, n, query) {
|
|
106
164
|
if (!rows.length)
|
|
107
165
|
return null;
|
|
108
166
|
// Parity preference: exact side first, then 'mixed' (matches either), then the
|
|
@@ -111,8 +169,24 @@ export class StreetInterpolator {
|
|
|
111
169
|
const exact = rows.filter((r) => r.parity === (wantOdd ? "odd" : "even"));
|
|
112
170
|
const mixed = rows.filter((r) => r.parity === "mixed");
|
|
113
171
|
const preferred = exact.length ? exact : mixed;
|
|
114
|
-
|
|
172
|
+
let pool = preferred.length ? preferred : rows;
|
|
115
173
|
const parityMatched = preferred.length > 0;
|
|
174
|
+
// No scope given: the covering ranges must agree on ONE postcode or the lookup abstains — a
|
|
175
|
+
// name spanning towns is ambiguity, not an answer. Counted over the PARITY pool, not all
|
|
176
|
+
// rows: a section-line boundary road carries a different ZIP per side ("east 13 mile road"
|
|
177
|
+
// is Fraser 48026 odd / Roseville 48066 even), and the opposite side can never hold the
|
|
178
|
+
// number it would otherwise veto. When several postcodes survive parity, the caller's
|
|
179
|
+
// resolved-locality coordinate breaks the tie by segment proximity under the dominance
|
|
180
|
+
// geometry of {@link NEAR_MAX_KM} — a near-tie stays an abstention.
|
|
181
|
+
if (!query.postcode) {
|
|
182
|
+
const postcodes = new Set(pool.map((r) => r.postcode ?? ""));
|
|
183
|
+
if (postcodes.size > 1) {
|
|
184
|
+
const scoped = query.near ? nearestPostcodeGroup(pool, query.near) : null;
|
|
185
|
+
if (!scoped)
|
|
186
|
+
return null;
|
|
187
|
+
pool = scoped;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
116
190
|
// Tightest range wins — the most specific claim about where this number lives.
|
|
117
191
|
let best = pool[0];
|
|
118
192
|
for (const candidate of pool) {
|
|
@@ -135,10 +209,8 @@ export class StreetInterpolator {
|
|
|
135
209
|
release: best.release,
|
|
136
210
|
};
|
|
137
211
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
this.#db.close();
|
|
141
|
-
}
|
|
212
|
+
[Symbol.dispose]() {
|
|
213
|
+
this.#resources[Symbol.dispose]();
|
|
142
214
|
}
|
|
143
215
|
}
|
|
144
216
|
//# sourceMappingURL=interpolation.js.map
|
package/out/interpolation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interpolation.js","sourceRoot":"","sources":["../interpolation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"interpolation.js","sourceRoot":"","sources":["../lib/interpolation.ts"],"names":[],"mappings":"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"}
|
package/out/lookup.d.ts
CHANGED
|
@@ -3,48 +3,49 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* `
|
|
6
|
+
* `WOFSQLitePlaceLookup` — the resolver implementation backed by `node:sqlite` + a Kysely-typed
|
|
7
7
|
* query layer where the queries are non-trivial, and raw SQL where they aren't (FTS5 MATCH, the
|
|
8
8
|
* FTS index build).
|
|
9
9
|
*
|
|
10
10
|
* See `docs/plan/phases/PHASE_4_2_wof_sqlite.md` for the design rationale.
|
|
11
11
|
*/
|
|
12
|
-
import { DatabaseSync } from "node:sqlite";
|
|
13
12
|
import { type Ancestor, type CoincidentLocality } from "@mailwoman/resolver";
|
|
14
|
-
import {
|
|
15
|
-
import type
|
|
16
|
-
import { type
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
19
|
-
|
|
13
|
+
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
14
|
+
import { type Convention, type ConventionSource } from "#convention/index";
|
|
15
|
+
import { type ExtractConfig } from "#extracts";
|
|
16
|
+
import type { WOFPostalCityAliasLookup } from "#postal/city-alias-lookup";
|
|
17
|
+
import { type RankingWeights } from "#ranking-weights";
|
|
18
|
+
import type { WOFDatabase } from "#schema";
|
|
19
|
+
import type { FindPlaceQuery, PlaceCandidate, PlaceLookup } from "#types";
|
|
20
|
+
export interface WOFSQLitePlaceLookupOpts {
|
|
20
21
|
/**
|
|
21
22
|
* Path to the WOF SQLite distribution on disk. Mutually exclusive with `database`.
|
|
22
23
|
*
|
|
23
|
-
* **Single string** — opens that one DB as the main
|
|
24
|
+
* **Single string** — opens that one DB as the main extract.
|
|
24
25
|
*
|
|
25
26
|
* **Array** — opens the first entry as main, then ATTACHes each subsequent entry as a separate SQLite schema. Schema
|
|
26
27
|
* names are derived from the filename (`whosonfirst-data-postalcode- us-latest.db` → `postalcode_us`); override with
|
|
27
|
-
* `
|
|
28
|
+
* `ExtractConfig.schemaName` when the filename doesn't follow WOF convention. See `extracts.ts` for the derivation
|
|
28
29
|
* rules.
|
|
29
30
|
*
|
|
30
|
-
* Routing: queries with a `placetype` matching a
|
|
31
|
-
* everything else hits main. Cross-
|
|
32
|
-
* corpora.
|
|
31
|
+
* Routing: queries with a `placetype` matching a extract's name (or explicit `placetypes` hint) are sent to that
|
|
32
|
+
* extract; everything else hits main. Cross-extract UNION is NOT done — BM25 isn't comparable across
|
|
33
|
+
* separately-indexed corpora.
|
|
33
34
|
*/
|
|
34
|
-
databasePath?: string | ReadonlyArray<string |
|
|
35
|
+
databasePath?: string | ReadonlyArray<string | ExtractConfig>;
|
|
35
36
|
/**
|
|
36
|
-
* Pre-opened
|
|
37
|
-
* Multi-
|
|
37
|
+
* Pre-opened connection — primarily for tests against an inline fixture DB. Mutually exclusive with `databasePath`.
|
|
38
|
+
* Multi-extract requires `databasePath` (so the lookup owns the ATTACH).
|
|
38
39
|
*/
|
|
39
|
-
database?:
|
|
40
|
+
database?: DatabaseClient<WOFDatabase>;
|
|
40
41
|
/**
|
|
41
42
|
* If true, build the FTS5 `place_search` virtual table on construction if it doesn't already exist. The upstream WOF
|
|
42
43
|
* distribution does NOT ship FTS5, so callers either set this once on first open or pre-build it via the
|
|
43
44
|
* operator-side CLI documented in the README. Default false — the resolver assumes the index already exists and
|
|
44
45
|
* errors loudly if it doesn't.
|
|
45
46
|
*
|
|
46
|
-
* With multi-
|
|
47
|
-
* `mailwoman gazetteer build fts` — operator script for predictable cost.
|
|
47
|
+
* With multi-extract, `buildFTS: true` builds the index on the **main** extract only. Other extracts must be
|
|
48
|
+
* pre-built via `mailwoman gazetteer build fts` — operator script for predictable cost.
|
|
48
49
|
*/
|
|
49
50
|
buildFTS?: boolean;
|
|
50
51
|
/**
|
|
@@ -58,13 +59,14 @@ export interface WOFSqlitePlaceLookupOpts {
|
|
|
58
59
|
* Opt-in postal-city alias reader (#475). When supplied, the coordinate-first locality scorer treats an observed
|
|
59
60
|
* `postal_city` ("Antioch", postcode 37013) as a name-match alias for the geographic locality the postcode sits in
|
|
60
61
|
* ("Nashville"), recovering the chronic postal-vs- geographic-city mismatch. Absent (the default), the resolver is
|
|
61
|
-
* byte-identical — every alias code path is
|
|
62
|
+
* byte-identical — every alias code path is conditioned on this being non-null, so an unprovided reader changes no
|
|
63
|
+
* score.
|
|
62
64
|
*/
|
|
63
65
|
postalCityAliases?: WOFPostalCityAliasLookup;
|
|
64
66
|
}
|
|
65
|
-
export declare class
|
|
67
|
+
export declare class WOFSQLitePlaceLookup implements PlaceLookup, Disposable {
|
|
66
68
|
#private;
|
|
67
|
-
constructor(opts:
|
|
69
|
+
constructor(opts: WOFSQLitePlaceLookupOpts, weights?: Partial<RankingWeights>);
|
|
68
70
|
findPlace(query: FindPlaceQuery): Promise<PlaceCandidate[]>;
|
|
69
71
|
/**
|
|
70
72
|
* Dual-role localities coincident with an admin id, from the precomputed `coincident_roles` relation (#403). Backs
|
|
@@ -83,9 +85,7 @@ export declare class WOFSqlitePlaceLookup implements PlaceLookup, Disposable {
|
|
|
83
85
|
* locality/neighbourhood ancestors order correctly instead of sorting last.
|
|
84
86
|
*/
|
|
85
87
|
ancestors(id: number | string): Ancestor[];
|
|
86
|
-
close(): void;
|
|
87
88
|
[Symbol.dispose](): void;
|
|
88
89
|
}
|
|
89
|
-
export {
|
|
90
|
-
export type { RankingWeights } from "./ranking-weights.ts";
|
|
90
|
+
export type { RankingWeights } from "#ranking-weights";
|
|
91
91
|
//# sourceMappingURL=lookup.d.ts.map
|
package/out/lookup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../lib/lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAyB,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAGnG,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAKzD,OAAO,EAIN,KAAK,UAAU,EACf,KAAK,gBAAgB,EAGrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAKN,KAAK,aAAa,EAClB,MAAM,WAAW,CAAA;AAalB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACzE,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAI1C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAgB,MAAM,QAAQ,CAAA;AAEvF,MAAM,WAAW,wBAAwB;IACxC;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,CAAA;IAC7D;;;OAGG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;IACtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC3D;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,wBAAwB,CAAA;CAC5C;AAqCD,qBAAa,oBAAqB,YAAW,WAAW,EAAE,UAAU;;gBAsEvD,IAAI,EAAE,wBAAwB,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAqKvE,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA6DjE;;;;;OAKG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,kBAAkB,EAAE;IAYvE;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,EAAE;IAwX1C,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAoBxB;AAED,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA"}
|