@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
package/lib/fts/index.ts
DELETED
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @copyright Sister Software
|
|
3
|
-
* @license AGPL-3.0
|
|
4
|
-
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* FTS5 index lifecycle for the WOF SQLite distribution.
|
|
7
|
-
*
|
|
8
|
-
* Shared by `WOFSQLitePlaceLookup` (lazy build via `buildFTS: true`) and the operator-side
|
|
9
|
-
* `mailwoman gazetteer build fts` CLI (ahead-of-time build to avoid first-open latency in production).
|
|
10
|
-
*
|
|
11
|
-
* Upstream WOF SQLite distributions do NOT ship FTS5. The index lives in a `place_search` virtual
|
|
12
|
-
* table whose rows mirror `(spr.id, spr.name, GROUP_CONCAT(names.name))` — one current,
|
|
13
|
-
* non-deprecated place per row, with all alternate names concatenated into a single search-token
|
|
14
|
-
* bag.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import type { DatabaseClient } from "@mailwoman/sqlite/client"
|
|
18
|
-
import { tableExists } from "@mailwoman/sqlite/introspection"
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Name of the FTS5 virtual table this module owns. Centralized so `WOFSQLitePlaceLookup` and the CLI can't drift apart.
|
|
22
|
-
*/
|
|
23
|
-
export const PLACE_SEARCH_TABLE = "place_search"
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Boundary-preserving separator between aliases in the `alt_names` bag (#523): U+E000, the first Private Use Area
|
|
27
|
-
* codepoint, written as an escape so the source stays plain ASCII.
|
|
28
|
-
*
|
|
29
|
-
* Why a PUA codepoint and not punctuation: the goal is to stop a phrase query from matching ACROSS two adjacent
|
|
30
|
-
* aliases' concatenation boundary ("York" + "New City" must not phrase-match `"york new"`). FTS5 assigns token
|
|
31
|
-
* positions to TOKENS only — separator characters never consume a position — so any character the tokenizer treats as a
|
|
32
|
-
* boundary leaves the two aliases' tokens adjacent and the false phrase match intact. The separator must therefore be
|
|
33
|
-
* an INDEXED TOKEN that sits between the aliases and breaks positional adjacency.
|
|
34
|
-
*
|
|
35
|
-
* Empirical probe (node:sqlite, `tokenize = 'unicode61 remove_diacritics 2'` — the exact config below). Bag = the
|
|
36
|
-
* aliases "York" and "New City" joined by each candidate separator; query = the cross-boundary phrase `MATCH '"york
|
|
37
|
-
* new"'`:
|
|
38
|
-
*
|
|
39
|
-
* - `' '` (the pre-#523 join, no separator) — false HIT
|
|
40
|
-
* - `' ; '` (punctuation) — false HIT
|
|
41
|
-
* - `' \u2016 '` (double vertical line) — false HIT
|
|
42
|
-
* - `' \x1F '` (ASCII unit separator) — false HIT
|
|
43
|
-
* - `' \uE000 '` (PUA, this constant) — NO match, while `'"york"'` and `'"new city"'` still match the bag individually
|
|
44
|
-
* under every variant above.
|
|
45
|
-
*
|
|
46
|
-
* U+E000 works because unicode61 classifies it (category Co — neither space nor punctuation) as a token character, so
|
|
47
|
-
* the standalone `\uE000` between aliases is indexed as its own token and the aliases' tokens are no longer
|
|
48
|
-
* positionally adjacent. The remaining requirements also hold:
|
|
49
|
-
*
|
|
50
|
-
* - **Unreachable from queries**: `sanitizeFTSQuery` (Node + WASM resolvers) strips everything outside `\p{L}\p{N}` from
|
|
51
|
-
* token bodies, and U+E000 is neither — no user query can ever address the separator token. The demo's `sanitizeFTS`
|
|
52
|
-
* strips it explicitly.
|
|
53
|
-
* - **Never in place names**: PUA codepoints are unassigned by definition; real-world WOF names don't carry them.
|
|
54
|
-
* Defensively, the INSERT below also strips any embedded U+E000 from source names so a poisoned row can't forge an
|
|
55
|
-
* alias boundary.
|
|
56
|
-
* - **Survives GROUP_CONCAT**: verified — `GROUP_CONCAT(name, ' ' || char(57344) || ' ')` emits the codepoint intact
|
|
57
|
-
* (`57344` = 0xE000).
|
|
58
|
-
* - **Cost**: one extra token per alias boundary in the FTS document. Marginal BM25 length-norm impact, on a column whose
|
|
59
|
-
* length stats are already the known #189 problem.
|
|
60
|
-
*
|
|
61
|
-
* Interaction with #189 (split `alt_names` into its own FTS table for independent BM25 length stats): the separator
|
|
62
|
-
* SURVIVES that split as proposed — #189 still GROUP_CONCATs all aliases into one `place_search_alt` row per place, so
|
|
63
|
-
* both the separator and the bag-parsing exact check (`aliasBagExactMatch`) carry over unchanged, just pointed at the
|
|
64
|
-
* new table. Only if #189 were instead built as one-row-per-alias would both become moot (per-alias rows give exact
|
|
65
|
-
* equality and phrase isolation for free). Sequencing: if #189 lands before the next slim-DB artifact rebuild, fold
|
|
66
|
-
* both into ONE rebuild rather than shipping two FTS schema bumps.
|
|
67
|
-
*/
|
|
68
|
-
export const ALIAS_SEPARATOR = "\uE000"
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* `char()` argument for {@link ALIAS_SEPARATOR} in SQL — keeps the SQL text plain ASCII.
|
|
72
|
-
*/
|
|
73
|
-
const ALIAS_SEPARATOR_CODEPOINT = ALIAS_SEPARATOR.codePointAt(0) as number
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* The query/name fold every exact-tier comparison uses: lowercase, trim, collapse internal whitespace. The `alt_names`
|
|
77
|
-
* bag is compared alias-by-alias against a query folded THIS way, so the fold lives beside the bag parser — every
|
|
78
|
-
* consumer (the Node resolver's exact tier, the WASM resolver, the name-exact sub-tier sort) folds through this one
|
|
79
|
-
* function.
|
|
80
|
-
*/
|
|
81
|
-
export function foldQueryText(input: string): string {
|
|
82
|
-
return input.toLowerCase().trim().replaceAll(/\s+/g, " ")
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Does any alias in an `alt_names` bag exactly equal the (already-normalized) query? The single shared implementation
|
|
87
|
-
* of the exact-tier alias check for every consumer of the bag — the Node resolver's `#exactMatchIDs` fallback, the WASM
|
|
88
|
-
* resolver, and the demo's httpvfs resolver — so the bag format and its parsers can't drift.
|
|
89
|
-
*
|
|
90
|
-
* Two formats exist in the wild:
|
|
91
|
-
*
|
|
92
|
-
* - **Separated bags** (built since #523): aliases joined with {@link ALIAS_SEPARATOR}, plus a trailing separator so even
|
|
93
|
-
* a single-alias bag self-identifies as separator-formatted. Split + per-alias equality — a true exact-alias check,
|
|
94
|
-
* matching the semantics of the full `names` table (`names.name = ? COLLATE NOCASE`), so it runs unrestricted: an
|
|
95
|
-
* alias match is an exact match whether or not another candidate matched on its canonical name.
|
|
96
|
-
* - **Legacy bags** (pre-#523 artifacts, e.g. an already-deployed slim DB): aliases space-joined, boundaries lost. Falls
|
|
97
|
-
* back to the historical padded-containment check, conditioned on `anyStrictExact` — unrestricted containment would
|
|
98
|
-
* false-promote interior fragments ("York" inside the alias "New York City") and cross-boundary fragments ("York New"
|
|
99
|
-
* across "…York" + "New…"). Delete this branch once every shipped artifact carries the separator.
|
|
100
|
-
*
|
|
101
|
-
* @param altNames The `alt_names` bag from `place_search` (null when the row has no aliases).
|
|
102
|
-
* @param normalizedQuery The query, pre-normalized: lowercased, trimmed, internal whitespace collapsed (every consumer
|
|
103
|
-
* already normalizes this way).
|
|
104
|
-
* @param anyStrictExact Whether ANY candidate in the pool already matched strictly (canonical name or region
|
|
105
|
-
* abbreviation). Only consulted for legacy bags.
|
|
106
|
-
*/
|
|
107
|
-
export function aliasBagExactMatch(altNames: string | null, normalizedQuery: string, anyStrictExact: boolean): boolean {
|
|
108
|
-
if (altNames === null || altNames === "" || !normalizedQuery) return false
|
|
109
|
-
|
|
110
|
-
if (altNames.includes(ALIAS_SEPARATOR)) {
|
|
111
|
-
return altNames.split(ALIAS_SEPARATOR).some((alias) => foldQueryText(alias) === normalizedQuery)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (anyStrictExact) return false
|
|
115
|
-
|
|
116
|
-
return ` ${foldQueryText(altNames)} `.includes(` ${normalizedQuery} `)
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Name of the R*Tree virtual table that indexes WOF places' bounding boxes for proximity / bbox lookups. Built
|
|
121
|
-
* alongside `place_search` by the CLI and `buildFTS: true`. Pure SQLite — no extensions needed, the `rtree`
|
|
122
|
-
* virtual-table module ships with the core library.
|
|
123
|
-
*/
|
|
124
|
-
export const PLACE_BBOX_TABLE = "place_bbox"
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Name of the auxiliary table holding `wof:population` per place. Powers the population-weighted ranking boost. Sparse
|
|
128
|
-
* — WOF only populates this field for ~15% of localities (and mostly larger ones); missing means no boost, never a
|
|
129
|
-
* penalty. Built upstream by `scripts/build-unified-wof.ts` at ingest (and copied through by `build-slim`) — this
|
|
130
|
-
* module consumes it, never builds it.
|
|
131
|
-
*
|
|
132
|
-
* Schema: `(id INTEGER PRIMARY KEY, population INTEGER NOT NULL)`. Plain table, not virtual.
|
|
133
|
-
*/
|
|
134
|
-
export const PLACE_POPULATION_TABLE = "place_population"
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Name of the auxiliary table holding the two salience scores per place — `referential` (population-anchored, the
|
|
138
|
-
* ranking backbone) and `encyclopedic` (the Wikipedia join, NULL when there is no article). Built by `mailwoman
|
|
139
|
-
* gazetteer importance`; schema and derivations in `place-importance-schema.ts`.
|
|
140
|
-
*
|
|
141
|
-
* The lookup reads ONLY `encyclopedic` from it, and only to CARRY the value onto the result — referential is derived
|
|
142
|
-
* from the population already joined, and no ORDER BY anywhere touches this table (ROAD_TO_V9 §2). Sparse and
|
|
143
|
-
* schema-versioned: a pre-split gazetteer has this table with a single conflated `importance` column instead, which the
|
|
144
|
-
* lookup's column probe deliberately refuses to read.
|
|
145
|
-
*/
|
|
146
|
-
export const PLACE_IMPORTANCE_TABLE = "place_importance"
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Counters for a single `buildPlaceSearchFTS` run. Exposed so callers (CLI, lazy-build) can render progress to the
|
|
150
|
-
* user.
|
|
151
|
-
*/
|
|
152
|
-
export interface BuildPlaceSearchFTSResult {
|
|
153
|
-
/**
|
|
154
|
-
* Whether the FTS5 index was created (true) or already existed and was left alone (false).
|
|
155
|
-
*/
|
|
156
|
-
created: boolean
|
|
157
|
-
/**
|
|
158
|
-
* Number of rows in the `place_search` table after the call.
|
|
159
|
-
*/
|
|
160
|
-
indexedRows: number
|
|
161
|
-
/**
|
|
162
|
-
* Whether the R*Tree bbox index was created (true) or already existed (false).
|
|
163
|
-
*/
|
|
164
|
-
bboxCreated: boolean
|
|
165
|
-
/**
|
|
166
|
-
* Number of rows in the `place_bbox` R*Tree after the call.
|
|
167
|
-
*/
|
|
168
|
-
bboxIndexedRows: number
|
|
169
|
-
/**
|
|
170
|
-
* Wall-clock duration of the build step, in milliseconds.
|
|
171
|
-
*/
|
|
172
|
-
durationMs: number
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export interface BuildPlaceSearchFTSOpts {
|
|
176
|
-
/**
|
|
177
|
-
* Drop the existing `place_search` AND `place_bbox` tables before building. Default false — if either already exists
|
|
178
|
-
* the corresponding build step is skipped. Set true when you want to rebuild against an updated `spr` / `names`
|
|
179
|
-
* snapshot.
|
|
180
|
-
*/
|
|
181
|
-
drop?: boolean
|
|
182
|
-
/**
|
|
183
|
-
* Optional progress callback invoked after each phase. Useful for CLI output on the planet-scale builds where the
|
|
184
|
-
* INSERT step can take minutes.
|
|
185
|
-
*/
|
|
186
|
-
onProgress?: (
|
|
187
|
-
phase: "checking" | "dropping" | "creating" | "populating" | "creating-bbox" | "populating-bbox" | "done",
|
|
188
|
-
detail?: string
|
|
189
|
-
) => void
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Build (or rebuild, with `drop: true`) the `place_search` FTS5 virtual table AND the `place_bbox` R*Tree virtual table
|
|
194
|
-
* from the existing `spr` + `names` tables in a WOF SQLite distribution.
|
|
195
|
-
*
|
|
196
|
-
* The FTS5 index is used for name-based MATCH queries; the R*Tree is used for bbox + proximity filtering. Both are pure
|
|
197
|
-
* SQLite — no extensions required.
|
|
198
|
-
*
|
|
199
|
-
* Returns a `BuildPlaceSearchFTSResult` summary. Idempotent when `drop: false` — re-running against an already-indexed
|
|
200
|
-
* DB skips whichever indexes already exist.
|
|
201
|
-
*/
|
|
202
|
-
export function buildPlaceSearchFTS<DB>(
|
|
203
|
-
db: DatabaseClient<DB>,
|
|
204
|
-
opts: BuildPlaceSearchFTSOpts = {}
|
|
205
|
-
): BuildPlaceSearchFTSResult {
|
|
206
|
-
const start = Date.now()
|
|
207
|
-
const onProgress = opts.onProgress ?? (() => {})
|
|
208
|
-
|
|
209
|
-
onProgress("checking")
|
|
210
|
-
const ftsExisting = tableExists(db, PLACE_SEARCH_TABLE)
|
|
211
|
-
const bboxExisting = tableExists(db, PLACE_BBOX_TABLE)
|
|
212
|
-
|
|
213
|
-
// ─── FTS5 phase ──────────────────────────────────────────────────
|
|
214
|
-
let ftsCreated = false
|
|
215
|
-
|
|
216
|
-
if (ftsExisting && opts.drop) {
|
|
217
|
-
onProgress("dropping", PLACE_SEARCH_TABLE)
|
|
218
|
-
db.exec(`DROP TABLE ${PLACE_SEARCH_TABLE}`)
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
if (!ftsExisting || opts.drop) {
|
|
222
|
-
onProgress("creating")
|
|
223
|
-
|
|
224
|
-
db.exec(`
|
|
225
|
-
CREATE VIRTUAL TABLE ${PLACE_SEARCH_TABLE} USING fts5(
|
|
226
|
-
wof_id UNINDEXED,
|
|
227
|
-
name,
|
|
228
|
-
alt_names,
|
|
229
|
-
tokenize = 'unicode61 remove_diacritics 2'
|
|
230
|
-
);
|
|
231
|
-
`)
|
|
232
|
-
|
|
233
|
-
onProgress("populating")
|
|
234
|
-
|
|
235
|
-
// Excludes only definitively-not-current places. WOF's `is_current` carries TWO conventions:
|
|
236
|
-
// `-1` (modern Who's On First) and `1` (legacy Mapzen-era), both meaning "currently valid".
|
|
237
|
-
// Only `0` means "no longer current". Filtering on `= -1` strict (as Phase 4.2 did) excluded
|
|
238
|
-
// ~42% of admin-US and ~68% of postcode-US — see #91 for the diagnostic + magnitude.
|
|
239
|
-
//
|
|
240
|
-
// Aliases join on the boundary-preserving ALIAS_SEPARATOR token (#523) — space-padded so each
|
|
241
|
-
// alias still tokenizes normally — and any U+E000 embedded in a source name is defensively
|
|
242
|
-
// flattened to a space so it can't forge a boundary. A TRAILING separator marks the bag as
|
|
243
|
-
// separator-formatted even when it holds a single alias, so `aliasBagExactMatch` never
|
|
244
|
-
// mistakes a new bag for a legacy (pre-#523) one. See the ALIAS_SEPARATOR docs for the
|
|
245
|
-
// probe + rationale.
|
|
246
|
-
db.exec(`
|
|
247
|
-
INSERT INTO ${PLACE_SEARCH_TABLE} (wof_id, name, alt_names)
|
|
248
|
-
SELECT
|
|
249
|
-
spr.id,
|
|
250
|
-
spr.name,
|
|
251
|
-
COALESCE((
|
|
252
|
-
SELECT GROUP_CONCAT(
|
|
253
|
-
REPLACE(name, char(${ALIAS_SEPARATOR_CODEPOINT}), ' '),
|
|
254
|
-
' ' || char(${ALIAS_SEPARATOR_CODEPOINT}) || ' '
|
|
255
|
-
) || ' ' || char(${ALIAS_SEPARATOR_CODEPOINT})
|
|
256
|
-
FROM names WHERE names.id = spr.id
|
|
257
|
-
), '')
|
|
258
|
-
FROM spr
|
|
259
|
-
WHERE spr.is_current != 0
|
|
260
|
-
AND spr.is_deprecated = 0
|
|
261
|
-
AND spr.name IS NOT NULL;
|
|
262
|
-
`)
|
|
263
|
-
|
|
264
|
-
ftsCreated = true
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
const ftsCountRow = db.prepare(`SELECT COUNT(*) AS n FROM ${PLACE_SEARCH_TABLE}`).get() as { n: number }
|
|
268
|
-
|
|
269
|
-
// ─── R*Tree phase ────────────────────────────────────────────────
|
|
270
|
-
let bboxCreated = false
|
|
271
|
-
|
|
272
|
-
if (bboxExisting && opts.drop) {
|
|
273
|
-
onProgress("dropping", PLACE_BBOX_TABLE)
|
|
274
|
-
db.exec(`DROP TABLE ${PLACE_BBOX_TABLE}`)
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
if (!bboxExisting || opts.drop) {
|
|
278
|
-
onProgress("creating-bbox")
|
|
279
|
-
|
|
280
|
-
// R*Tree requires INTEGER PRIMARY KEY (id) + paired min/max for each indexed dimension.
|
|
281
|
-
// `rtree` (not `rtree_i32`) keeps coordinates as REAL — what we want for WGS-84.
|
|
282
|
-
db.exec(`
|
|
283
|
-
CREATE VIRTUAL TABLE ${PLACE_BBOX_TABLE} USING rtree(
|
|
284
|
-
id,
|
|
285
|
-
min_lat, max_lat,
|
|
286
|
-
min_lon, max_lon
|
|
287
|
-
);
|
|
288
|
-
`)
|
|
289
|
-
|
|
290
|
-
onProgress("populating-bbox")
|
|
291
|
-
|
|
292
|
-
// Only index places that have non-zero coordinates AND a real bbox. WOF stores both the
|
|
293
|
-
// centroid (latitude/longitude) and the bounding box (min_*/max_*). A subset of rows have
|
|
294
|
-
// all-zero coordinates — likely placeholders for deprecated / unmapped entries; the
|
|
295
|
-
// is_current / is_deprecated filter mostly catches them, but we double-check at insert.
|
|
296
|
-
db.exec(`
|
|
297
|
-
INSERT INTO ${PLACE_BBOX_TABLE} (id, min_lat, max_lat, min_lon, max_lon)
|
|
298
|
-
SELECT
|
|
299
|
-
spr.id,
|
|
300
|
-
spr.min_latitude,
|
|
301
|
-
spr.max_latitude,
|
|
302
|
-
spr.min_longitude,
|
|
303
|
-
spr.max_longitude
|
|
304
|
-
FROM spr
|
|
305
|
-
WHERE spr.is_current != 0
|
|
306
|
-
AND spr.is_deprecated = 0
|
|
307
|
-
AND spr.min_latitude IS NOT NULL
|
|
308
|
-
AND spr.max_latitude IS NOT NULL
|
|
309
|
-
AND spr.min_longitude IS NOT NULL
|
|
310
|
-
AND spr.max_longitude IS NOT NULL
|
|
311
|
-
AND NOT (spr.min_latitude = 0 AND spr.max_latitude = 0
|
|
312
|
-
AND spr.min_longitude = 0 AND spr.max_longitude = 0);
|
|
313
|
-
`)
|
|
314
|
-
|
|
315
|
-
bboxCreated = true
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const bboxCountRow = db.prepare(`SELECT COUNT(*) AS n FROM ${PLACE_BBOX_TABLE}`).get() as { n: number }
|
|
319
|
-
|
|
320
|
-
// NOTE: `place_population` is NOT built here. `scripts/build-unified-wof.ts` extracts
|
|
321
|
-
// `wof:population` straight into that table at ingest (the canonical source carries no `geojson`
|
|
322
|
-
// table), and `build-slim` copies it through. This function only owns the two FTS-derived virtual
|
|
323
|
-
// tables, both of which build from `spr` + `names` alone. `placePopulationExists` lets callers
|
|
324
|
-
// check for the pre-built table.
|
|
325
|
-
|
|
326
|
-
onProgress(
|
|
327
|
-
"done",
|
|
328
|
-
`${ftsCountRow.n} FTS rows + ${bboxCountRow.n} bbox rows ` +
|
|
329
|
-
`(${ftsCreated ? "built" : "preexisting"} / ${bboxCreated ? "built" : "preexisting"})`
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
return {
|
|
333
|
-
created: ftsCreated,
|
|
334
|
-
indexedRows: ftsCountRow.n,
|
|
335
|
-
bboxCreated,
|
|
336
|
-
bboxIndexedRows: bboxCountRow.n,
|
|
337
|
-
durationMs: Date.now() - start,
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
/**
|
|
342
|
-
* Returns true iff the `place_search` table exists in the connected DB. Used by `WOFSQLitePlaceLookup` for its "FTS
|
|
343
|
-
* missing — pass buildFTS:true or run the CLI" guard.
|
|
344
|
-
*/
|
|
345
|
-
export function placeSearchFTSExists<DB>(db: DatabaseClient<DB>): boolean {
|
|
346
|
-
return tableExists(db, PLACE_SEARCH_TABLE)
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* Returns true iff the `place_bbox` R*Tree table exists. Used for opt-in proximity lookup checks.
|
|
351
|
-
*/
|
|
352
|
-
export function placeBboxExists<DB>(db: DatabaseClient<DB>): boolean {
|
|
353
|
-
return tableExists(db, PLACE_BBOX_TABLE)
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
/**
|
|
357
|
-
* Returns true iff the `place_population` table exists. Used for opt-in population-ranking checks.
|
|
358
|
-
*/
|
|
359
|
-
export function placePopulationExists<DB>(db: DatabaseClient<DB>): boolean {
|
|
360
|
-
return tableExists(db, PLACE_POPULATION_TABLE)
|
|
361
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/address/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,sBAAsB,CAAA;AACpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,uBAAuB,CAAA"}
|
package/out/address/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/address/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,sBAAsB,CAAA;AACpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,uBAAuB,CAAA"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @copyright Sister Software
|
|
3
|
-
* @license AGPL-3.0
|
|
4
|
-
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* SQLite implementation of core's `AddressPointLookup` (#476): exact `(street, number)` within a
|
|
7
|
-
* postcode (preferred), locality, or — for extracts whose points carry no scope tag (OSM, #247) —
|
|
8
|
-
* the resolved locality's BBOX. Query-side normalization is THE shared normalizer
|
|
9
|
-
* (`street-normalize.ts`), selected per the extract's `streetLocale` so build-side and probe-side
|
|
10
|
-
* stay identical by construction (US delegates to the USPS pipeline; FR/DE/NL use the locale rules).
|
|
11
|
-
*
|
|
12
|
-
* Matching is exact-after-normalization only — no fuzzy street matching in this tier (measure how
|
|
13
|
-
* far exact gets first; fuzz is a later, separate decision). Scope order is most-selective first:
|
|
14
|
-
* postcode, then locality, then the bbox fall-through (only when a bbox is supplied AND the prior
|
|
15
|
-
* scopes missed). Multiple hits return the first by rowid — unit siblings share the building coord.
|
|
16
|
-
*/
|
|
17
|
-
import type { AddressPointHit, AddressPointLookup } from "@mailwoman/core/resolver";
|
|
18
|
-
import type { AddressPointDatabase } from "#address/point/schema";
|
|
19
|
-
import { type StreetLocale } from "#street/normalize";
|
|
20
|
-
export declare class AddressPointSqliteLookup<DB extends AddressPointDatabase = AddressPointDatabase> implements AddressPointLookup, Disposable {
|
|
21
|
-
#private;
|
|
22
|
-
/**
|
|
23
|
-
* @param dbPath Extract path.
|
|
24
|
-
* @param opts.streetLocale The street-normalization locale this extract was BUILT with — must match, or every key
|
|
25
|
-
* misses. Defaults to `"us"` (the situs tier), so existing callers are unchanged.
|
|
26
|
-
* @param opts.localityKeys Whether the extract's `locality_norm` is a FULL place name a query can be held to. The BAN
|
|
27
|
-
* and OSM extracts write the commune or `addr:city` in full; the US situs extract writes the NAD city field, which
|
|
28
|
-
* several counties abbreviate (`addi` for Addison on 5,174 Texas rows, 327,264 Texas rows at four characters or
|
|
29
|
-
* fewer) or give as the parent town (`easton` for North Easton). A key like that can steer WHICH row answers but
|
|
30
|
-
* cannot refuse one, so it never contradicts. Defaults from the street locale: `"us"` is abbreviated, the rest
|
|
31
|
-
* full.
|
|
32
|
-
*/
|
|
33
|
-
constructor(dbPath: string, opts?: {
|
|
34
|
-
streetLocale?: StreetLocale;
|
|
35
|
-
localityKeys?: "full" | "abbreviated";
|
|
36
|
-
});
|
|
37
|
-
find(query: {
|
|
38
|
-
street: string;
|
|
39
|
-
number: string;
|
|
40
|
-
postcode?: string;
|
|
41
|
-
locality?: string;
|
|
42
|
-
region?: string;
|
|
43
|
-
subregion?: string;
|
|
44
|
-
bbox?: {
|
|
45
|
-
minLat: number;
|
|
46
|
-
maxLat: number;
|
|
47
|
-
minLon: number;
|
|
48
|
-
maxLon: number;
|
|
49
|
-
};
|
|
50
|
-
}): AddressPointHit | null;
|
|
51
|
-
[Symbol.dispose](): void;
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/address/point/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAGnF,OAAO,KAAK,EAAE,oBAAoB,EAAqB,MAAM,uBAAuB,CAAA;AAEpF,OAAO,EASN,KAAK,YAAY,EACjB,MAAM,mBAAmB,CAAA;AAc1B,qBAAa,wBAAwB,CAAC,EAAE,SAAS,oBAAoB,GAAG,oBAAoB,CAC3F,YAAW,kBAAkB,EAAE,UAAU;;IAwBzC;;;;;;;;;;OAUG;IACH,YAAY,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,YAAY,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAAA;KAAO,EAsC5G;IAED,IAAI,CAAC,KAAK,EAAE;QACX,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KACzE,GAAG,eAAe,GAAG,IAAI,CAsCzB;IA4JD,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAEvB;CACD"}
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @copyright Sister Software
|
|
3
|
-
* @license AGPL-3.0
|
|
4
|
-
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* SQLite implementation of core's `AddressPointLookup` (#476): exact `(street, number)` within a
|
|
7
|
-
* postcode (preferred), locality, or — for extracts whose points carry no scope tag (OSM, #247) —
|
|
8
|
-
* the resolved locality's BBOX. Query-side normalization is THE shared normalizer
|
|
9
|
-
* (`street-normalize.ts`), selected per the extract's `streetLocale` so build-side and probe-side
|
|
10
|
-
* stay identical by construction (US delegates to the USPS pipeline; FR/DE/NL use the locale rules).
|
|
11
|
-
*
|
|
12
|
-
* Matching is exact-after-normalization only — no fuzzy street matching in this tier (measure how
|
|
13
|
-
* far exact gets first; fuzz is a later, separate decision). Scope order is most-selective first:
|
|
14
|
-
* postcode, then locality, then the bbox fall-through (only when a bbox is supplied AND the prior
|
|
15
|
-
* scopes missed). Multiple hits return the first by rowid — unit siblings share the building coord.
|
|
16
|
-
*/
|
|
17
|
-
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
18
|
-
import { hasTable, prepareGet } from "#sqlite-utils";
|
|
19
|
-
import { normalizeHouseNumberForKey, normalizeLocalityForKey, normalizeLocalityForKeyLocale, streetKeyVariants, streetLocaleForSurface, stripArrondissement, } from "#street/normalize";
|
|
20
|
-
/**
|
|
21
|
-
* The 4 columns the reader SELECTs, in the schema's order — referenced by the prepared SELECTs so the projected
|
|
22
|
-
* `AddressPointRow` stays in lockstep with the shared schema.
|
|
23
|
-
*/
|
|
24
|
-
const SELECT_COLS = "lat, lon, source, release, locality_norm, postcode";
|
|
25
|
-
export class AddressPointSqliteLookup {
|
|
26
|
-
#db;
|
|
27
|
-
#locale;
|
|
28
|
-
#localityKeys;
|
|
29
|
-
#byPostcode;
|
|
30
|
-
#byPostcodeLocality;
|
|
31
|
-
#byLocality;
|
|
32
|
-
/**
|
|
33
|
-
* The scope key matched by its TAIL — a `zh` query that names the 鄉鎮市區 without its 縣市. Narrowed by the (street,
|
|
34
|
-
* number) index first, so the LIKE walks the handful of rows that share the pair.
|
|
35
|
-
*/
|
|
36
|
-
#byLocalityTail;
|
|
37
|
-
#byBbox;
|
|
38
|
-
/**
|
|
39
|
-
* @param dbPath Extract path.
|
|
40
|
-
* @param opts.streetLocale The street-normalization locale this extract was BUILT with — must match, or every key
|
|
41
|
-
* misses. Defaults to `"us"` (the situs tier), so existing callers are unchanged.
|
|
42
|
-
* @param opts.localityKeys Whether the extract's `locality_norm` is a FULL place name a query can be held to. The BAN
|
|
43
|
-
* and OSM extracts write the commune or `addr:city` in full; the US situs extract writes the NAD city field, which
|
|
44
|
-
* several counties abbreviate (`addi` for Addison on 5,174 Texas rows, 327,264 Texas rows at four characters or
|
|
45
|
-
* fewer) or give as the parent town (`easton` for North Easton). A key like that can steer WHICH row answers but
|
|
46
|
-
* cannot refuse one, so it never contradicts. Defaults from the street locale: `"us"` is abbreviated, the rest
|
|
47
|
-
* full.
|
|
48
|
-
*/
|
|
49
|
-
constructor(dbPath, opts = {}) {
|
|
50
|
-
this.#db = new DatabaseClient(dbPath, { readOnly: true });
|
|
51
|
-
this.#locale = opts.streetLocale ?? "us";
|
|
52
|
-
this.#localityKeys = opts.localityKeys ?? (this.#locale === "us" ? "abbreviated" : "full");
|
|
53
|
-
// Degrade gracefully on an empty/tableless extract (interrupted build, stray 0-byte file): with no
|
|
54
|
-
// `address_point` table this lookup is a no-op miss, not a crash that loses the whole state (#568).
|
|
55
|
-
if (hasTable(this.#db, "address_point")) {
|
|
56
|
-
this.#byPostcode = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
57
|
-
WHERE postcode = ? AND street_norm = ? AND number = ? LIMIT 1`);
|
|
58
|
-
this.#byPostcodeLocality = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
59
|
-
WHERE postcode = ? AND locality_norm = ? AND street_norm = ? AND number = ? LIMIT 1`);
|
|
60
|
-
this.#byLocality = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
61
|
-
WHERE locality_norm = ? AND street_norm = ? AND number = ? LIMIT 1`);
|
|
62
|
-
this.#byBbox = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
63
|
-
WHERE street_norm = ? AND number = ? AND lat BETWEEN ? AND ? AND lon BETWEEN ? AND ? LIMIT 1`);
|
|
64
|
-
this.#byLocalityTail = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
65
|
-
WHERE street_norm = ? AND number = ? AND locality_norm LIKE ? LIMIT 1`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
find(query) {
|
|
69
|
-
if (!this.#byPostcode || !this.#byLocality || !this.#byBbox)
|
|
70
|
-
return null;
|
|
71
|
-
const number = normalizeHouseNumberForKey(query.number, this.#locale);
|
|
72
|
-
if (!number)
|
|
73
|
-
return null;
|
|
74
|
-
// A `zh` extract scopes a point by 縣市 + 鄉鎮市區, the pair the parse tags `region` + `subregion`; the Taiwanese
|
|
75
|
-
// register carries no postcode and the parse no `locality`. The pair becomes the locality key here, on the
|
|
76
|
-
// reader that was built with the same fold, and a Latin extract never sees the two fields. A line that names
|
|
77
|
-
// only the 鄉鎮市區 (`中和區中興街281號`, 14.7% of the TW board) matches the stored pair by its tail instead.
|
|
78
|
-
const scoped = this.#locale === "zh" && !query.locality && query.subregion
|
|
79
|
-
? query.region
|
|
80
|
-
? { ...query, locality: `${query.region}${query.subregion}` }
|
|
81
|
-
: { ...query, localityTail: normalizeLocalityForKeyLocale(query.subregion, "zh") }
|
|
82
|
-
: query;
|
|
83
|
-
// Key-variant ladder (see `streetKeyVariants`): the literal key first, then the doubled-type
|
|
84
|
-
// collapse and the saint↔st register swap — each variant runs the FULL number ladder below, and
|
|
85
|
-
// the first variant to answer wins, so an attested literal key is never second-guessed.
|
|
86
|
-
let row;
|
|
87
|
-
for (const streetNorm of streetKeyVariants(query.street, streetLocaleForSurface(query.street, this.#locale))) {
|
|
88
|
-
row = this.#findForKey(streetNorm, number, scoped);
|
|
89
|
-
if (row)
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
if (!row)
|
|
93
|
-
return null;
|
|
94
|
-
return {
|
|
95
|
-
lat: row.lat,
|
|
96
|
-
lon: row.lon,
|
|
97
|
-
source: row.source,
|
|
98
|
-
release: row.release,
|
|
99
|
-
...(row.locality_norm ? { localityNorm: row.locality_norm } : {}),
|
|
100
|
-
...(row.postcode ? { postcode: row.postcode } : {}),
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* The full number ladder for ONE normalized street key: exact, then the range low-end, then letter-suffix spacing
|
|
105
|
-
* with the base-number fall — see each rung's note in place.
|
|
106
|
-
*/
|
|
107
|
-
#findForKey(streetNorm, number, query) {
|
|
108
|
-
let row = this.#probe(streetNorm, number, query);
|
|
109
|
-
// Range-surface fallback: every register this reader serves stores ONE number per point
|
|
110
|
-
// (G-NAF `NUMBER_FIRST`, BAN, OA, OSM `addr:housenumber`), but the attested surface is often
|
|
111
|
-
// a range — "385-387 Esplanade" keys `385`. Null-only: an exact range key that matched above
|
|
112
|
-
// (some OSM points DO carry "385-387" verbatim) is never second-guessed.
|
|
113
|
-
if (!row) {
|
|
114
|
-
const low = /^(\d+[a-z]?)-\d+[a-z]?$/.exec(number)?.[1];
|
|
115
|
-
if (low) {
|
|
116
|
-
row = this.#probe(streetNorm, low, query);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
// Letter-suffix spacing fallback: the registers disagree on the joint — BAN stores "3 a"
|
|
120
|
-
// (space-separated), G-NAF and most OA sources store "3a" — and the parsed surface can arrive
|
|
121
|
-
// either way. On a miss, retry the OTHER spacing; on a double miss, the BASE number (the
|
|
122
|
-
// register attests no 3A but does attest 3 — the adjacent-parcel approximation, priced the
|
|
123
|
-
// same as the range fallback's low end). Null-only throughout, and only for the
|
|
124
|
-
// digits+single-letter shape (never touches "12 1/2" or unit-bearing forms).
|
|
125
|
-
if (!row) {
|
|
126
|
-
const joined = /^(\d+)\s+([a-z])$/.exec(number);
|
|
127
|
-
const spaced = /^(\d+)([a-z])$/.exec(number);
|
|
128
|
-
if (joined) {
|
|
129
|
-
row = this.#probe(streetNorm, `${joined[1]}${joined[2]}`, query) ?? this.#probe(streetNorm, joined[1], query);
|
|
130
|
-
}
|
|
131
|
-
else if (spaced) {
|
|
132
|
-
row = this.#probe(streetNorm, `${spaced[1]} ${spaced[2]}`, query) ?? this.#probe(streetNorm, spaced[1], query);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
// Sub-number fallback for the Taiwanese register: `14之12` is building 12 off number 14, `30附40` an attached
|
|
136
|
-
// number, stored as number `14` / `30` with the rest in `unit`. A query that kept the pair on the number span
|
|
137
|
-
// falls to the base number — the same adjacent-parcel approximation the letter-suffix rung makes, priced the
|
|
138
|
-
// same: on the 2,000-row served read the rows answered this way sit a median 256 m and at most 1.0 km from the
|
|
139
|
-
// building.
|
|
140
|
-
if (!row && this.#locale === "zh") {
|
|
141
|
-
const base = /^(\d+)(?:[之附]\d+)+$/u.exec(number)?.[1];
|
|
142
|
-
if (base) {
|
|
143
|
-
row = this.#probe(streetNorm, base, query);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return row;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* The scope ladder for one (street, number) key: postcode, then locality, then the bbox fall-through — each rung only
|
|
150
|
-
* when the prior missed.
|
|
151
|
-
*/
|
|
152
|
-
#probe(streetNorm, number, query) {
|
|
153
|
-
let row;
|
|
154
|
-
if (query.postcode) {
|
|
155
|
-
const postcode = query.postcode.trim();
|
|
156
|
-
const localityKey = query.locality ? this.#localityKey(query.locality) : undefined;
|
|
157
|
-
// A postcode can span several places — DE 04509 covers Schönwölkau and Werlitzsch, both with a Teichstraße 3 —
|
|
158
|
-
// so when the query names a locality the row whose own locality agrees is asked for FIRST. Only when no such
|
|
159
|
-
// row exists does the postcode-only row answer, and then only if its locality does not name a different place
|
|
160
|
-
// (see `#scopeContradicts` for what "different" tolerates): a query naming a third village under the postcode
|
|
161
|
-
// falls through to the locality rung rather than answering the wrong rooftop.
|
|
162
|
-
const agreeing = localityKey ? this.#byPostcodeLocality(postcode, localityKey, streetNorm, number) : undefined;
|
|
163
|
-
const candidate = agreeing ?? this.#byPostcode(postcode, streetNorm, number);
|
|
164
|
-
row = candidate && !this.#scopeContradicts(candidate, query) ? candidate : undefined;
|
|
165
|
-
}
|
|
166
|
-
if (!row && query.locality) {
|
|
167
|
-
// FR extracts key arrondissement communes at the base city (both-sides fold, see the BAN
|
|
168
|
-
// builder + stripArrondissement) — fold the probe too so "Paris 13e Arrondissement" and
|
|
169
|
-
// "Paris" both hit. No-op for "us" extracts and every non-arrondissement commune.
|
|
170
|
-
row = this.#byLocality(this.#localityKey(query.locality), streetNorm, number);
|
|
171
|
-
}
|
|
172
|
-
if (!row && query.localityTail && this.#byLocalityTail) {
|
|
173
|
-
// A Han key carries no `%` or `_`, so the tail is a literal suffix pattern.
|
|
174
|
-
row = this.#byLocalityTail(streetNorm, number, `%${query.localityTail}`);
|
|
175
|
-
}
|
|
176
|
-
// Bbox fall-through (#247): the point carries no postcode/locality of its own, but its coordinate falls
|
|
177
|
-
// inside the resolved locality's box. Only reached when the scoped probes missed AND a bbox was supplied.
|
|
178
|
-
if (!row && query.bbox) {
|
|
179
|
-
const b = query.bbox;
|
|
180
|
-
const candidate = this.#byBbox(streetNorm, number, b.minLat, b.maxLat, b.minLon, b.maxLon);
|
|
181
|
-
// A register row that carries its own scope and was NOT found by the scoped rungs is a different address that
|
|
182
|
-
// happens to share the street and number inside the box: `10 rue de la République, 75008 Paris` reached
|
|
183
|
-
// Servon's `10 rue de la République` (postcode 77170) 26 km away this way, at rooftop tier and 1 m uncertainty.
|
|
184
|
-
// The rung exists for points with no scope of their own; a point whose scope disagrees with the query is a miss.
|
|
185
|
-
row = candidate && !this.#scopeContradicts(candidate, query) ? candidate : undefined;
|
|
186
|
-
}
|
|
187
|
-
return row;
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* The query's locality folded the way the extract's builder folded its `locality_norm`. FR extracts key
|
|
191
|
-
* arrondissement communes at the base city (both-sides fold, see the BAN builder + stripArrondissement), so "Paris
|
|
192
|
-
* 13e Arrondissement" and "Paris" both hit; a no-op for every other locale.
|
|
193
|
-
*/
|
|
194
|
-
#localityKey(locality) {
|
|
195
|
-
if (this.#locale === "fr")
|
|
196
|
-
return stripArrondissement(normalizeLocalityForKey(locality));
|
|
197
|
-
return normalizeLocalityForKeyLocale(locality, this.#locale);
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Whether a row's OWN postcode or locality names a different place than the query did. Absent scope on the row is not
|
|
201
|
-
* a contradiction — it is the case the bbox rung was built for — and a rung that matched ON a field cannot contradict
|
|
202
|
-
* it, so at the postcode rung only the locality can disagree and at the bbox rung either can.
|
|
203
|
-
*
|
|
204
|
-
* The locality is consulted only on an extract whose keys are full names (the constructor's `localityKeys`). Under
|
|
205
|
-
* exact comparison against the US extract's abbreviated keys, the postcode rung refused `4900 Airport Pkwy, Addison
|
|
206
|
-
* TX 75001`'s own rooftop row (`addi`) and `678 Depot St, North Easton, MA 02356`'s (`easton`), and both `pass` board
|
|
207
|
-
* rows fell to interpolation 144–198 m away — invisible to a 1 km grade (#2155). `servon` against `paris` and
|
|
208
|
-
* `werlitzsch` against `krensitz`, on the BAN and OSM extracts, are different places and still refuse.
|
|
209
|
-
*/
|
|
210
|
-
#scopeContradicts(row, query) {
|
|
211
|
-
if (query.postcode && row.postcode && row.postcode.trim() !== query.postcode.trim())
|
|
212
|
-
return true;
|
|
213
|
-
if (this.#localityKeys === "full" && query.locality && row.locality_norm) {
|
|
214
|
-
return row.locality_norm !== this.#localityKey(query.locality);
|
|
215
|
-
}
|
|
216
|
-
return false;
|
|
217
|
-
}
|
|
218
|
-
[Symbol.dispose]() {
|
|
219
|
-
this.#db[Symbol.dispose]();
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/address/point/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAGzD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAA;AACtE,OAAO,EACN,0BAA0B,EAC1B,uBAAuB,EACvB,6BAA6B,EAG7B,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,GAEnB,MAAM,mBAAmB,CAAA;AAQ1B;;;GAGG;AACH,MAAM,WAAW,GAAG,oDAAoD,CAAA;AAExE,MAAM,OAAO,wBAAwB;IAG3B,GAAG,CAAoB;IACvB,OAAO,CAAc;IACrB,aAAa,CAAwB;IACrC,WAAW,CAAiG;IAC5G,mBAAmB,CAEhB;IACH,WAAW,CAAkG;IACtH;;;OAGG;IACM,eAAe,CAEZ;IACH,OAAO,CAKJ;IAEZ;;;;;;;;;;OAUG;IACH,YAAY,MAAc,EAAE,IAAI,GAA2E,EAAE;QAC5G,IAAI,CAAC,GAAG,GAAG,IAAI,cAAc,CAAK,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAA;QACxC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAE1F,mGAAmG;QACnG,oGAAoG;QACpG,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,GAAG,UAAU,CAC5B,IAAI,CAAC,GAAG,EACR,UAAU,WAAW;mEAC0C,CAC/D,CAAA;YAED,IAAI,CAAC,mBAAmB,GAAG,UAAU,CACpC,IAAI,CAAC,GAAG,EACR,UAAU,WAAW;yFACgE,CACrF,CAAA;YAED,IAAI,CAAC,WAAW,GAAG,UAAU,CAC5B,IAAI,CAAC,GAAG,EACR,UAAU,WAAW;wEAC+C,CACpE,CAAA;YAED,IAAI,CAAC,OAAO,GAAG,UAAU,CACxB,IAAI,CAAC,GAAG,EACR,UAAU,WAAW;kGACyE,CAC9F,CAAA;YAED,IAAI,CAAC,eAAe,GAAG,UAAU,CAChC,IAAI,CAAC,GAAG,EACR,UAAU,WAAW;2EACkD,CACvE,CAAA;QACF,CAAC;IACF,CAAC;IAED,IAAI,CAAC,KAQJ;QACA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QACxE,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAErE,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,4GAA4G;QAC5G,2GAA2G;QAC3G,6GAA6G;QAC7G,mGAAmG;QACnG,MAAM,MAAM,GACX,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS;YAC1D,CAAC,CAAC,KAAK,CAAC,MAAM;gBACb,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE;gBAC7D,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,6BAA6B,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;YACnF,CAAC,CAAC,KAAK,CAAA;QAET,6FAA6F;QAC7F,gGAAgG;QAChG,wFAAwF;QACxF,IAAI,GAAgC,CAAA;QAEpC,KAAK,MAAM,UAAU,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC9G,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;YAElD,IAAI,GAAG;gBAAE,MAAK;QACf,CAAC;QAED,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QAErB,OAAO;YACN,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAA;IACF,CAAC;IAED;;;OAGG;IACH,WAAW,CACV,UAAqB,EACrB,MAAc,EACd,KAOC;QAED,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QAEhD,wFAAwF;QACxF,6FAA6F;QAC7F,6FAA6F;QAC7F,yEAAyE;QACzE,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAEvD,IAAI,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;YAC1C,CAAC;QACF,CAAC;QAED,yFAAyF;QACzF,8FAA8F;QAC9F,yFAAyF;QACzF,2FAA2F;QAC3F,gFAAgF;QAChF,6EAA6E;QAC7E,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAE5C,IAAI,MAAM,EAAE,CAAC;gBACZ,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAA;YAC/G,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC;gBACnB,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAA;YAChH,CAAC;QACF,CAAC;QAED,4GAA4G;QAC5G,8GAA8G;QAC9G,6GAA6G;QAC7G,+GAA+G;QAC/G,YAAY;QACZ,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAErD,IAAI,IAAI,EAAE,CAAC;gBACV,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;YAC3C,CAAC;QACF,CAAC;QAED,OAAO,GAAG,CAAA;IACX,CAAC;IAED;;;OAGG;IACH,MAAM,CACL,UAAqB,EACrB,MAAc,EACd,KAKC;QAED,IAAI,GAAgC,CAAA;QAEpC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;YACtC,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAElF,+GAA+G;YAC/G,6GAA6G;YAC7G,8GAA8G;YAC9G,8GAA8G;YAC9G,8EAA8E;YAC9E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAC/G,MAAM,SAAS,GAAG,QAAQ,IAAI,IAAI,CAAC,WAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;YAE7E,GAAG,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;QACrF,CAAC;QAED,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC5B,yFAAyF;YACzF,wFAAwF;YACxF,kFAAkF;YAClF,GAAG,GAAG,IAAI,CAAC,WAAY,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;QAC/E,CAAC;QAED,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACxD,4EAA4E;YAC5E,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,CAAA;QACzE,CAAC;QAED,wGAAwG;QACxG,0GAA0G;QAC1G,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAA;YACpB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;YAE3F,8GAA8G;YAC9G,wGAAwG;YACxG,gHAAgH;YAChH,iHAAiH;YACjH,GAAG,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;QACrF,CAAC;QAED,OAAO,GAAG,CAAA;IACX,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,QAAgB;QAC5B,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,mBAAmB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAA;QAExF,OAAO,6BAA6B,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;;;;;OAUG;IACH,iBAAiB,CAAC,GAAoB,EAAE,KAA+C;QACtF,IAAI,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAA;QAEhG,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YAC1E,OAAO,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,KAAK,CAAA;IACb,CAAC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;IAC3B,CAAC;CACD"}
|