@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/candidate/scoring.ts
CHANGED
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* How a raw `place_search` row becomes a scored `PlaceCandidate`, and how the resulting pool is
|
|
7
|
-
* ordered — the weighted-sum score and the exact-match tiering that ranks over it.
|
|
8
5
|
*/
|
|
9
6
|
|
|
10
7
|
import { compareReferential, referentialFromPopulation } from "@mailwoman/core/resolver"
|
|
@@ -12,15 +9,17 @@ import { haversineKm } from "@mailwoman/spatial"
|
|
|
12
9
|
import type { DatabaseClient } from "@mailwoman/sqlite/client"
|
|
13
10
|
|
|
14
11
|
import { exactMatchIDs, officialNameIDs } from "#exact-match"
|
|
15
|
-
import { foldQueryText } from "#fts
|
|
12
|
+
import { foldQueryText } from "#fts"
|
|
16
13
|
import { populationBoostTerm, type RankingWeights } from "#ranking-weights"
|
|
17
14
|
import type { RawSearchRow } from "#search-fetch"
|
|
18
15
|
import type { FindPlaceQuery, PlaceCandidate, WOFPlacetype } from "#types"
|
|
19
16
|
|
|
20
17
|
/**
|
|
21
|
-
* Score one raw FTS row into a `PlaceCandidate`: the weighted sum over the negated
|
|
22
|
-
*
|
|
23
|
-
*
|
|
18
|
+
* Score one raw FTS row into a `PlaceCandidate`: the weighted sum over the negated
|
|
19
|
+
* BM25 baseline plus placetype, country and parent boosts.
|
|
20
|
+
*
|
|
21
|
+
* It also applies the length penalty, proximity and population terms,
|
|
22
|
+
* then returns the fields consumers read.
|
|
24
23
|
*/
|
|
25
24
|
export function candidateFromSearchRow(
|
|
26
25
|
row: RawSearchRow,
|
|
@@ -33,8 +32,7 @@ export function candidateFromSearchRow(
|
|
|
33
32
|
): PlaceCandidate {
|
|
34
33
|
const { query, placetypes, queryLen, weights } = context
|
|
35
34
|
|
|
36
|
-
// SQLite's bm25()
|
|
37
|
-
// start from a higher-is-better baseline.
|
|
35
|
+
// SQLite's bm25() is lower-is-better, so negate it to get a higher-is-better baseline.
|
|
38
36
|
let score = -row.rank
|
|
39
37
|
|
|
40
38
|
if (placetypes && placetypes.length && placetypes.includes(row.placetype as WOFPlacetype)) {
|
|
@@ -56,13 +54,10 @@ export function candidateFromSearchRow(
|
|
|
56
54
|
const extraLen = Math.max(0, row.name.length - queryLen - 3)
|
|
57
55
|
score -= (weights.lengthPenaltyWeight * extraLen) / 10
|
|
58
56
|
|
|
59
|
-
// Proximity boost
|
|
60
|
-
//
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
// The best decayed-distance term over `near` + every `bias` point (each point's term is
|
|
64
|
-
// scaled by its weight; the MAX wins — a candidate near ANY hint is "nearby"). Carried
|
|
65
|
-
// into the exact-tier prominence sort below when hints are present.
|
|
57
|
+
// Proximity boost applies only when the query includes `near` and the candidate has real coordinates.
|
|
58
|
+
// The decay is tunable via proximityBoost + proximityScaleKm.
|
|
59
|
+
let distanceKm: number | null = null
|
|
60
|
+
// The best decayed-distance term over `near` and every `bias` point wins, each scaled by its weight.
|
|
66
61
|
let proximityTerm = 0
|
|
67
62
|
|
|
68
63
|
if (row.lat !== null && row.lon !== null && !(row.lat === 0 && row.lon === 0)) {
|
|
@@ -93,16 +88,22 @@ export function candidateFromSearchRow(
|
|
|
93
88
|
score += scoreTerm
|
|
94
89
|
}
|
|
95
90
|
|
|
96
|
-
// Population boost
|
|
97
|
-
// people. Missing population → no contribution. Never penalizes.
|
|
91
|
+
// Population boost caps at `populationBoost` magnitude at `10^populationScaleLog10` people and never penalizes.
|
|
98
92
|
const popTerm = populationBoostTerm(row.population, weights)
|
|
99
93
|
score += popTerm
|
|
100
94
|
|
|
101
|
-
// Combined prominence for the exact-tier sort
|
|
102
|
-
//
|
|
103
|
-
// cross-country postcode tie without a hard filter.
|
|
95
|
+
// Combined prominence for the exact-tier sort: population and nearness in the same
|
|
96
|
+
// additive units, so hints can win a cross-country postcode tie without a hard filter.
|
|
104
97
|
const prominence = popTerm + proximityTerm
|
|
105
98
|
|
|
99
|
+
const population = row.population !== null && row.population > 0 ? row.population : null
|
|
100
|
+
|
|
101
|
+
// The referential key derives from this row's population and no other field,
|
|
102
|
+
// so it cannot drift from the ordering.
|
|
103
|
+
// Consumers read the encyclopedic value.
|
|
104
|
+
// No ranking site reads it.
|
|
105
|
+
// The bbox gives parity with the wasm lookup.
|
|
106
|
+
// Without it the region→bbox constraint is dead and disambiguation falls to population ranking.
|
|
106
107
|
const candidate: PlaceCandidate = {
|
|
107
108
|
id: row.id,
|
|
108
109
|
prominence,
|
|
@@ -111,45 +112,35 @@ export function candidateFromSearchRow(
|
|
|
111
112
|
country: row.country ?? "",
|
|
112
113
|
lat: row.lat ?? 0,
|
|
113
114
|
lon: row.lon ?? 0,
|
|
114
|
-
parent_id: row.parent_id ??
|
|
115
|
+
parent_id: row.parent_id ?? null,
|
|
115
116
|
score,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// consumers (the demo cascade's region constraint) read it. Without this the Node
|
|
136
|
-
// backend's region→bbox constraint is dead and disambiguation falls to population
|
|
137
|
-
// ranking (the Springfield-IL→MO failure the #524 smoke eval caught).
|
|
138
|
-
if (row.min_latitude != null && row.max_latitude != null && row.min_longitude != null && row.max_longitude != null) {
|
|
139
|
-
candidate.bbox = {
|
|
140
|
-
minLat: row.min_latitude,
|
|
141
|
-
maxLat: row.max_latitude,
|
|
142
|
-
minLon: row.min_longitude,
|
|
143
|
-
maxLon: row.max_longitude,
|
|
144
|
-
}
|
|
117
|
+
distanceKm,
|
|
118
|
+
exactMatch: null,
|
|
119
|
+
population,
|
|
120
|
+
referential: population === null ? null : referentialFromPopulation(population),
|
|
121
|
+
encyclopedic: row.encyclopedic ?? null,
|
|
122
|
+
importance: null,
|
|
123
|
+
bbox:
|
|
124
|
+
row.min_latitude != null && row.max_latitude != null && row.min_longitude != null && row.max_longitude != null
|
|
125
|
+
? {
|
|
126
|
+
minLat: row.min_latitude,
|
|
127
|
+
maxLat: row.max_latitude,
|
|
128
|
+
minLon: row.min_longitude,
|
|
129
|
+
maxLon: row.max_longitude,
|
|
130
|
+
}
|
|
131
|
+
: null,
|
|
132
|
+
mismatch: null,
|
|
133
|
+
containedByQualifier: null,
|
|
134
|
+
regionScopeMiss: null,
|
|
135
|
+
variantAliasExempted: null,
|
|
145
136
|
}
|
|
146
137
|
|
|
147
138
|
return candidate
|
|
148
139
|
}
|
|
149
140
|
|
|
150
141
|
/**
|
|
151
|
-
* Order `candidates`
|
|
152
|
-
*
|
|
142
|
+
* Order `candidates` in place with the exact-match tier first when the extract can answer name probes.
|
|
143
|
+
* Stamp every candidate's `exactMatch` flag.
|
|
153
144
|
*/
|
|
154
145
|
export function rankCandidates<DB>(
|
|
155
146
|
candidates: PlaceCandidate[],
|
|
@@ -162,13 +153,8 @@ export function rankCandidates<DB>(
|
|
|
162
153
|
): void {
|
|
163
154
|
const { db, schemaName, query, weights } = options
|
|
164
155
|
|
|
165
|
-
// Exact-match tiering
|
|
166
|
-
//
|
|
167
|
-
// WITHIN a tier. See the RankingWeights.exactMatchTiering docstring for why this aligns the
|
|
168
|
-
// population prior rather than overriding it. One cheap indexed lookup over the candidate ids.
|
|
169
|
-
// Runs even for a SINGLE candidate so `exactMatch` is stamped consistently (parity with the
|
|
170
|
-
// WASM lookup) — a sole alias hit ("New York City" → New York) must still carry the flag the
|
|
171
|
-
// demo cascade / #369 re-rank read.
|
|
156
|
+
// Exact-match tiering ranks a case-folded full match above a partial one.
|
|
157
|
+
// It also runs for a single candidate so `exactMatch` is stamped consistently.
|
|
172
158
|
if (weights.exactMatchTiering && candidates.length) {
|
|
173
159
|
const exactIDs = exactMatchIDs(
|
|
174
160
|
db,
|
|
@@ -177,34 +163,18 @@ export function rankCandidates<DB>(
|
|
|
177
163
|
query.text
|
|
178
164
|
)
|
|
179
165
|
|
|
180
|
-
// Stamp the tier onto every candidate
|
|
181
|
-
//
|
|
182
|
-
// crossing the exact/partial boundary ("ME" → Maine, not the more-populous Missouri).
|
|
166
|
+
// Stamp the tier onto every candidate so a downstream re-rank's country pin
|
|
167
|
+
// cannot cross the exact/partial boundary.
|
|
183
168
|
for (const c of candidates) {
|
|
184
169
|
c.exactMatch = exactIDs.has(c.id as number)
|
|
185
170
|
}
|
|
186
171
|
|
|
187
172
|
if (exactIDs.size) {
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
// residue inside `score` is length-noise (see the fetch-site comment), so letting it
|
|
191
|
-
// order the tier is what sent unscoped "Paris" to an Ohio township. The partial tier
|
|
192
|
-
// keeps score order — text relevance still means something there. This makes the
|
|
193
|
-
// exactMatchTiering docstring literal: match quality primary, prominence within.
|
|
194
|
-
//
|
|
195
|
-
// #912 sub-tier: a NAME-exact candidate (spr.name equals the query) outranks an
|
|
196
|
-
// ALIAS-exact one ('Paris' the place beats 'Paris Township' held via alias 'Paris').
|
|
197
|
-
// The place's own name is a stronger identity claim than an alias — aliases exist to
|
|
198
|
-
// widen recall, not to tie primaries. ME→Maine is untouched: 'ME' name-exact-matches
|
|
199
|
-
// nothing, so the alias sub-tier still decides there. Population orders within each
|
|
200
|
-
// sub-tier as before.
|
|
173
|
+
// Within the exact tier, population is the primary key and the score only breaks
|
|
174
|
+
// ties. a name-exact candidate outranks an alias-exact one.
|
|
201
175
|
const needle = foldQueryText(query.text)
|
|
202
176
|
|
|
203
|
-
//
|
|
204
|
-
// country, `names.official = 1`) counts as the place's own name for the sub-tier — "Åbo" is
|
|
205
|
-
// Turku's name, not merely its alias. Floor-conditioned on the holder's population (see the
|
|
206
|
-
// RankingWeights docstring for the measured 100k boundary). officialIDs ⊆ exactIDs by
|
|
207
|
-
// construction (official rows are names rows), so only the sub-tier KIND changes.
|
|
177
|
+
// An official name counts as the place's own name for the sub-tier, floor-conditioned on the holder's population.
|
|
208
178
|
const officialIDs = weights.officialNameExact
|
|
209
179
|
? officialNameIDs(
|
|
210
180
|
db,
|
|
@@ -224,18 +194,9 @@ export function rankCandidates<DB>(
|
|
|
224
194
|
return officialIDs?.has(c.id as number) ? 2 : 1
|
|
225
195
|
}
|
|
226
196
|
|
|
227
|
-
// With proximity hints
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
// ordering decides.
|
|
231
|
-
//
|
|
232
|
-
// ROAD_TO_V9 §2: this is the site that "orders namesakes", so it is the site that has to
|
|
233
|
-
// say what it orders by. `compareReferential` is referential DESC with raw population as
|
|
234
|
-
// the tiebreak, which is provably the SAME ORDER as the `(b.population ?? 0) - (a.population ?? 0)`
|
|
235
|
-
// it replaces — referential is strictly increasing in population below saturation and
|
|
236
|
-
// constant above it, and the tiebreak restores the order in the saturated tail. Measured
|
|
237
|
-
// zero-delta, not assumed: see `place-importance-schema.test.ts` and `resolver-referential-ranking.test.ts`.
|
|
238
|
-
// Encyclopedic importance is not, and must not become, an input here.
|
|
197
|
+
// With proximity hints, prominence replaces raw population as the within-tier key.
|
|
198
|
+
// Without them, referential ordering decides.
|
|
199
|
+
// Encyclopedic importance does not affect this order.
|
|
239
200
|
const hasHints = !!query.near || (query.bias?.length ?? 0) > 0
|
|
240
201
|
|
|
241
202
|
candidates.sort((a, b) => {
|
package/lib/capital-schema.ts
CHANGED
|
@@ -3,15 +3,14 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* The `capital` table
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* per-probe query and no index beyond the rowid.
|
|
6
|
+
* The `capital` table: the capital-status reference included inside `candidate.db`, so an npm
|
|
7
|
+
* consumer who pulled the artifact can run `capital_tier` without the repo's
|
|
8
|
+
* `data/gazetteer/capitals-v1.json`, which published packages do not ship. One row per reference
|
|
9
|
+
* entry. The loader reads the whole table once into a `CapitalIndex` at session construction, so
|
|
10
|
+
* there is no per-probe query and no index beyond the rowid.
|
|
12
11
|
*
|
|
13
|
-
* `keys` holds the entry's folded name set as a JSON array
|
|
14
|
-
*
|
|
12
|
+
* `keys` holds the entry's folded name set as a JSON array, the name-membership conjunct that keeps
|
|
13
|
+
* the coordinate radius from promoting a capital's same-name neighbors (`capitals.ts`).
|
|
15
14
|
*/
|
|
16
15
|
|
|
17
16
|
import { tryParsingJSON } from "@mailwoman/core/json"
|
|
@@ -22,14 +21,16 @@ import type { CapitalPoint } from "#capitals"
|
|
|
22
21
|
import { hasTable } from "#sqlite-utils"
|
|
23
22
|
|
|
24
23
|
/**
|
|
25
|
-
* The table name the builder writes and the reader probes
|
|
26
|
-
* tables (`candidate`, `country_codes`).
|
|
24
|
+
* The table name the builder writes and the reader probes, one word and singular,
|
|
25
|
+
* matching the artifact's other reference tables (`candidate`, `country_codes`).
|
|
27
26
|
*/
|
|
28
27
|
export const CAPITAL_TABLE = "capital"
|
|
29
28
|
|
|
30
29
|
/**
|
|
31
|
-
* One reference entry as the artifact stores it.
|
|
32
|
-
*
|
|
30
|
+
* One reference entry as the artifact stores it.
|
|
31
|
+
*
|
|
32
|
+
* `level` is the reference vocabulary (`national` | `admin1`) kept as text.
|
|
33
|
+
* and the reader validates on load rather than trusting bytes.
|
|
33
34
|
*/
|
|
34
35
|
export interface CapitalTable {
|
|
35
36
|
country: string
|
|
@@ -43,8 +44,10 @@ export interface CapitalTable {
|
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
/**
|
|
46
|
-
* Create the table on a build in progress.
|
|
47
|
-
*
|
|
47
|
+
* Create the table on a build in progress.
|
|
48
|
+
*
|
|
49
|
+
* Async because Kysely's schema-builder is.
|
|
50
|
+
* Called from the candidate build's DDL phase alongside the other typed builders.
|
|
48
51
|
*/
|
|
49
52
|
export async function createCapitalTable<DB extends { capital: CapitalTable }>(db: Kysely<DB>): Promise<void> {
|
|
50
53
|
await db.schema
|
|
@@ -58,9 +61,10 @@ export async function createCapitalTable<DB extends { capital: CapitalTable }>(d
|
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
/**
|
|
61
|
-
* Read the whole reference out of an artifact, or `null` when the artifact predates the table
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
+
* Read the whole reference out of an artifact, or `null` when the artifact predates the table.
|
|
65
|
+
*
|
|
66
|
+
* The caller then falls back to its next source rather than treating an old artifact as "no
|
|
67
|
+
* capitals" (the meaning-of-zero rule: a missing table is unmeasured, an empty one is a finding).
|
|
64
68
|
*/
|
|
65
69
|
export function readCapitalPoints<DB>(db: DatabaseClient<DB>): CapitalPoint[] | null {
|
|
66
70
|
if (!hasTable(db, CAPITAL_TABLE)) return null
|
package/lib/capitals.ts
CHANGED
|
@@ -3,19 +3,15 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* The
|
|
7
|
-
*
|
|
6
|
+
* The capital-status reference index answers whether a resolved candidate is its country's national capital or admin-1 seat.
|
|
7
|
+
* The consumer is the resolver's
|
|
8
8
|
* bounded capital promotion (`@mailwoman/resolver`'s `promoteCapitals`, applied after the fame
|
|
9
|
-
* key on the bare-toponym class)
|
|
10
|
-
* platform-free
|
|
9
|
+
* key on the bare-toponym class). This module only matches and never ranks. It is pure and
|
|
10
|
+
* platform-free.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* names, so exonym rows — "Vienna" for Wien — still match). All three are required. The
|
|
16
|
-
* iteration-1 board run matched on country + coordinate alone, and the 25 km radius promoted
|
|
17
|
-
* capital-ADJACENT namesakes instead of capitals: North Salt Lake beside the Utah seat, a Gujarat
|
|
18
|
-
* Indiranagar beside Gandhinagar, Via delle Parti beside Perugia. The name set is what makes the
|
|
12
|
+
* A match requires the same country and a distance within {@link CAPITAL_MATCH_RADIUS_KM} of the reference point.
|
|
13
|
+
* The candidate's folded name must also appear in the reference entry's folded name set (name + romanization + the source's alternate
|
|
14
|
+
* names, so exonym rows such as "Vienna" for Wien still match). The name set is what makes the
|
|
19
15
|
* radius a centroid-drift allowance rather than a catchment.
|
|
20
16
|
*/
|
|
21
17
|
|
|
@@ -24,8 +20,9 @@ import { haversineKm } from "@mailwoman/spatial"
|
|
|
24
20
|
import { normalizeLocalityForKey } from "#street/normalize"
|
|
25
21
|
|
|
26
22
|
/**
|
|
27
|
-
* Capital status of one candidate: national capital, admin-1 seat, or neither.
|
|
28
|
-
*
|
|
23
|
+
* Capital status of one candidate: national capital, admin-1 seat, or neither.
|
|
24
|
+
*
|
|
25
|
+
* Numeric so the resolver's promotion can compare levels.
|
|
29
26
|
*/
|
|
30
27
|
export const CAPITAL_LEVEL = {
|
|
31
28
|
none: 0,
|
|
@@ -36,14 +33,15 @@ export const CAPITAL_LEVEL = {
|
|
|
36
33
|
export type CapitalLevel = (typeof CAPITAL_LEVEL)[keyof typeof CAPITAL_LEVEL]
|
|
37
34
|
|
|
38
35
|
/**
|
|
39
|
-
* How far a candidate row may sit from the reference point and still read as the same place
|
|
40
|
-
*
|
|
41
|
-
*
|
|
36
|
+
* How far a candidate row may sit from the reference point and still read as the same place.
|
|
37
|
+
*
|
|
38
|
+
* A centroid-convention allowance for a GeoNames point against a WOF centroid on a metro-scale city.
|
|
39
|
+
* The name-membership conjunct excludes neighbors inside the radius.
|
|
42
40
|
*/
|
|
43
41
|
export const CAPITAL_MATCH_RADIUS_KM = 25
|
|
44
42
|
|
|
45
43
|
/**
|
|
46
|
-
* One reference entry, as `data/gazetteer/capitals-v1.json`
|
|
44
|
+
* One reference entry, as recorded in `data/gazetteer/capitals-v1.json` (`entries[]`).
|
|
47
45
|
*/
|
|
48
46
|
export interface CapitalPoint {
|
|
49
47
|
/**
|
|
@@ -54,8 +52,8 @@ export interface CapitalPoint {
|
|
|
54
52
|
longitude: number
|
|
55
53
|
level: "national" | "admin1"
|
|
56
54
|
/**
|
|
57
|
-
* Folded name keys (name + romanization + alternate names, `normalizeLocalityForKey` fold)
|
|
58
|
-
* the name conjunct.
|
|
55
|
+
* Folded name keys (name + romanization + alternate names, `normalizeLocalityForKey` fold).
|
|
56
|
+
* The membership set for the name conjunct.
|
|
59
57
|
*/
|
|
60
58
|
k: string[]
|
|
61
59
|
}
|
|
@@ -73,9 +71,11 @@ interface IndexedPoint {
|
|
|
73
71
|
}
|
|
74
72
|
|
|
75
73
|
/**
|
|
76
|
-
* Country-bucketed capital points with the three-conjunct identity probe.
|
|
77
|
-
*
|
|
78
|
-
*
|
|
74
|
+
* Country-bucketed capital points with the three-conjunct identity probe.
|
|
75
|
+
*
|
|
76
|
+
* Construct from the parsed reference file's `entries`.
|
|
77
|
+
* The loader that reads the file off disk lives with the path owners
|
|
78
|
+
* (`mailwoman`'s resolver backend), keeping this module platform-free.
|
|
79
79
|
*/
|
|
80
80
|
export class CapitalIndex {
|
|
81
81
|
readonly #byCountry = new Map<string, IndexedPoint[]>()
|
|
@@ -102,13 +102,15 @@ export class CapitalIndex {
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
/**
|
|
105
|
-
* The highest capital level whose entry passes all three conjuncts for this place.
|
|
106
|
-
*
|
|
105
|
+
* The highest capital level whose entry passes all three conjuncts for this place.
|
|
106
|
+
*
|
|
107
|
+
* `none`, never a throw, for a missing name, country, or coordinate,
|
|
108
|
+
* an unknown country, or no matching entry.
|
|
107
109
|
*/
|
|
108
110
|
levelOfPlace(
|
|
109
|
-
name: string | null
|
|
110
|
-
country: string | null
|
|
111
|
-
latitude: number | null
|
|
111
|
+
name: string | null,
|
|
112
|
+
country: string | null,
|
|
113
|
+
latitude: number | null,
|
|
112
114
|
longitude: number | null | undefined
|
|
113
115
|
): CapitalLevel {
|
|
114
116
|
if (!name || !country || typeof latitude !== "number" || typeof longitude !== "number") return CAPITAL_LEVEL.none
|