@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.
Files changed (477) hide show
  1. package/README.md +9 -8
  2. package/lib/address/point/interpolation.ts +45 -39
  3. package/lib/address/point/schema.ts +17 -40
  4. package/lib/address/point.ts +316 -0
  5. package/lib/{address/index.ts → address.ts} +1 -1
  6. package/lib/ancestry/backfill.ts +20 -86
  7. package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
  8. package/lib/build/candidate.ts +122 -174
  9. package/lib/build/population-corrections.ts +64 -0
  10. package/lib/build/slim.ts +44 -114
  11. package/lib/candidate/alias-bags.ts +16 -17
  12. package/lib/candidate/ancestors/schema.ts +77 -61
  13. package/lib/candidate/ancestors/sidecar.ts +15 -22
  14. package/lib/candidate/country-display-names.ts +6 -20
  15. package/lib/candidate/extract-fold.ts +10 -55
  16. package/lib/candidate/fts.ts +5 -23
  17. package/lib/candidate/importance.ts +65 -68
  18. package/lib/candidate/lookup.ts +124 -415
  19. package/lib/candidate/name-roles.ts +15 -33
  20. package/lib/candidate/own-name.ts +35 -32
  21. package/lib/candidate/place-attrs.ts +20 -13
  22. package/lib/candidate/schema.ts +29 -65
  23. package/lib/candidate/scoring.ts +54 -93
  24. package/lib/capital-schema.ts +21 -17
  25. package/lib/capitals.ts +29 -27
  26. package/lib/coincident-roles.ts +85 -55
  27. package/lib/convention/schema.ts +15 -16
  28. package/lib/convention.ts +144 -0
  29. package/lib/coverage-manifest-schema.ts +40 -45
  30. package/lib/currency-backfill.ts +34 -79
  31. package/lib/env.ts +1 -1
  32. package/lib/exact-match.ts +32 -21
  33. package/lib/extracts.ts +97 -74
  34. package/lib/fst/autocomplete.ts +54 -37
  35. package/lib/fst/builder.ts +37 -41
  36. package/lib/fst/deserialize-web.ts +16 -17
  37. package/lib/fst/format.ts +41 -23
  38. package/lib/fst/freshness.ts +43 -120
  39. package/lib/fst/matcher.ts +7 -5
  40. package/lib/fst/serialize.ts +54 -74
  41. package/lib/fst/types.ts +78 -75
  42. package/lib/{fst/index.ts → fst.ts} +1 -0
  43. package/lib/fts/query.ts +5 -36
  44. package/lib/fts.ts +280 -0
  45. package/lib/geonames/aliases.ts +73 -144
  46. package/lib/geonames/postal.ts +162 -71
  47. package/lib/index.ts +9 -8
  48. package/lib/interpolation.ts +48 -100
  49. package/lib/lookup.ts +155 -270
  50. package/lib/name-score.ts +9 -7
  51. package/lib/nsul/lookup.ts +37 -54
  52. package/lib/nsul/schema.ts +16 -43
  53. package/lib/paths.ts +159 -0
  54. package/lib/place-importance-schema.ts +62 -169
  55. package/lib/poi/lookup.ts +104 -121
  56. package/lib/poi/schema.ts +42 -26
  57. package/lib/polygon-schema.ts +10 -6
  58. package/lib/postal/city/alias/lookup.ts +22 -40
  59. package/lib/postal/city/alias/schema.ts +14 -10
  60. package/lib/postal/city/candidate-schema.ts +26 -20
  61. package/lib/postcode-point-lookup.ts +8 -27
  62. package/lib/primary-preference.ts +46 -126
  63. package/lib/proximity-rerank.ts +44 -33
  64. package/lib/ranking-weights.ts +105 -78
  65. package/lib/region-keys.ts +70 -42
  66. package/lib/reverse.ts +149 -86
  67. package/lib/schema.ts +73 -50
  68. package/lib/search-fetch.ts +90 -68
  69. package/lib/sqlite/convention-source.ts +15 -23
  70. package/lib/sqlite/utils.ts +19 -22
  71. package/lib/street/centroid/schema.ts +37 -42
  72. package/lib/street/{centroid/index.ts → centroid.ts} +16 -25
  73. package/lib/street/morphology/fst/builder.ts +60 -42
  74. package/lib/street/morphology/fst/loader.ts +40 -32
  75. package/lib/street/name-lookup.ts +45 -41
  76. package/lib/street/normalize.ts +88 -219
  77. package/lib/street/segment-schema.ts +116 -43
  78. package/lib/{street/index.ts → street.ts} +1 -1
  79. package/lib/types.ts +109 -150
  80. package/lib/unified-schema.ts +29 -29
  81. package/lib/uprn/existence.ts +30 -19
  82. package/lib/uprn/lookup.ts +29 -68
  83. package/lib/uprn/schema.ts +18 -40
  84. package/lib/weights-overlay-linker.ts +236 -252
  85. package/out/address/point/interpolation.d.ts +20 -23
  86. package/out/address/point/interpolation.d.ts.map +1 -1
  87. package/out/address/point/interpolation.js +42 -39
  88. package/out/address/point/interpolation.js.map +1 -1
  89. package/out/address/point/schema.d.ts +12 -35
  90. package/out/address/point/schema.d.ts.map +1 -1
  91. package/out/address/point/schema.js +3 -19
  92. package/out/address/point/schema.js.map +1 -1
  93. package/out/address/point.d.ts +57 -0
  94. package/out/address/point.d.ts.map +1 -0
  95. package/out/address/point.js +206 -0
  96. package/out/address/point.js.map +1 -0
  97. package/out/{address/index.js → address.d.ts} +2 -2
  98. package/out/address.d.ts.map +1 -0
  99. package/out/{address/index.d.ts → address.js} +2 -2
  100. package/out/address.js.map +1 -0
  101. package/out/ancestry/backfill.d.ts +11 -64
  102. package/out/ancestry/backfill.d.ts.map +1 -1
  103. package/out/ancestry/backfill.js +14 -74
  104. package/out/ancestry/backfill.js.map +1 -1
  105. package/out/ancestry.d.ts +49 -0
  106. package/out/ancestry.d.ts.map +1 -0
  107. package/out/ancestry.js +59 -0
  108. package/out/ancestry.js.map +1 -0
  109. package/out/build/candidate.d.ts +82 -112
  110. package/out/build/candidate.d.ts.map +1 -1
  111. package/out/build/candidate.js +17 -100
  112. package/out/build/candidate.js.map +1 -1
  113. package/out/build/population-corrections.d.ts +52 -0
  114. package/out/build/population-corrections.d.ts.map +1 -0
  115. package/out/build/population-corrections.js +40 -0
  116. package/out/build/population-corrections.js.map +1 -0
  117. package/out/build/slim.d.ts +8 -44
  118. package/out/build/slim.d.ts.map +1 -1
  119. package/out/build/slim.js +33 -94
  120. package/out/build/slim.js.map +1 -1
  121. package/out/candidate/alias-bags.d.ts +6 -6
  122. package/out/candidate/alias-bags.d.ts.map +1 -1
  123. package/out/candidate/alias-bags.js +16 -17
  124. package/out/candidate/alias-bags.js.map +1 -1
  125. package/out/candidate/ancestors/schema.d.ts +73 -57
  126. package/out/candidate/ancestors/schema.d.ts.map +1 -1
  127. package/out/candidate/ancestors/schema.js +56 -48
  128. package/out/candidate/ancestors/schema.js.map +1 -1
  129. package/out/candidate/ancestors/sidecar.d.ts +3 -8
  130. package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
  131. package/out/candidate/ancestors/sidecar.js +15 -22
  132. package/out/candidate/ancestors/sidecar.js.map +1 -1
  133. package/out/candidate/country-display-names.d.ts +5 -15
  134. package/out/candidate/country-display-names.d.ts.map +1 -1
  135. package/out/candidate/country-display-names.js +6 -20
  136. package/out/candidate/country-display-names.js.map +1 -1
  137. package/out/candidate/extract-fold.d.ts +7 -15
  138. package/out/candidate/extract-fold.d.ts.map +1 -1
  139. package/out/candidate/extract-fold.js +5 -47
  140. package/out/candidate/extract-fold.js.map +1 -1
  141. package/out/candidate/fts.d.ts +5 -23
  142. package/out/candidate/fts.d.ts.map +1 -1
  143. package/out/candidate/fts.js +5 -23
  144. package/out/candidate/fts.js.map +1 -1
  145. package/out/candidate/importance.d.ts +60 -65
  146. package/out/candidate/importance.d.ts.map +1 -1
  147. package/out/candidate/importance.js +56 -63
  148. package/out/candidate/importance.js.map +1 -1
  149. package/out/candidate/lookup.d.ts +18 -55
  150. package/out/candidate/lookup.d.ts.map +1 -1
  151. package/out/candidate/lookup.js +82 -385
  152. package/out/candidate/lookup.js.map +1 -1
  153. package/out/candidate/name-roles.d.ts +9 -21
  154. package/out/candidate/name-roles.d.ts.map +1 -1
  155. package/out/candidate/name-roles.js +15 -33
  156. package/out/candidate/name-roles.js.map +1 -1
  157. package/out/candidate/own-name.d.ts +23 -25
  158. package/out/candidate/own-name.d.ts.map +1 -1
  159. package/out/candidate/own-name.js +35 -32
  160. package/out/candidate/own-name.js.map +1 -1
  161. package/out/candidate/place-attrs.d.ts +20 -13
  162. package/out/candidate/place-attrs.d.ts.map +1 -1
  163. package/out/candidate/place-attrs.js +4 -5
  164. package/out/candidate/place-attrs.js.map +1 -1
  165. package/out/candidate/schema.d.ts +27 -62
  166. package/out/candidate/schema.d.ts.map +1 -1
  167. package/out/candidate/schema.js +10 -22
  168. package/out/candidate/schema.js.map +1 -1
  169. package/out/candidate/scoring.d.ts +7 -8
  170. package/out/candidate/scoring.d.ts.map +1 -1
  171. package/out/candidate/scoring.js +52 -89
  172. package/out/candidate/scoring.js.map +1 -1
  173. package/out/capital-schema.d.ts +21 -17
  174. package/out/capital-schema.d.ts.map +1 -1
  175. package/out/capital-schema.js +17 -15
  176. package/out/capital-schema.js.map +1 -1
  177. package/out/capitals.d.ts +27 -25
  178. package/out/capitals.d.ts.map +1 -1
  179. package/out/capitals.js +23 -21
  180. package/out/capitals.js.map +1 -1
  181. package/out/coincident-roles.d.ts +60 -43
  182. package/out/coincident-roles.d.ts.map +1 -1
  183. package/out/coincident-roles.js +72 -50
  184. package/out/coincident-roles.js.map +1 -1
  185. package/out/convention/schema.d.ts +14 -14
  186. package/out/convention/schema.d.ts.map +1 -1
  187. package/out/convention/schema.js +6 -4
  188. package/out/convention/schema.js.map +1 -1
  189. package/out/convention.d.ts +97 -0
  190. package/out/convention.d.ts.map +1 -0
  191. package/out/convention.js +81 -0
  192. package/out/convention.js.map +1 -0
  193. package/out/coverage-manifest-schema.d.ts +34 -39
  194. package/out/coverage-manifest-schema.d.ts.map +1 -1
  195. package/out/coverage-manifest-schema.js +25 -34
  196. package/out/coverage-manifest-schema.js.map +1 -1
  197. package/out/currency-backfill.d.ts +16 -38
  198. package/out/currency-backfill.d.ts.map +1 -1
  199. package/out/currency-backfill.js +19 -46
  200. package/out/currency-backfill.js.map +1 -1
  201. package/out/env.d.ts +1 -1
  202. package/out/env.js +1 -1
  203. package/out/exact-match.d.ts +19 -10
  204. package/out/exact-match.d.ts.map +1 -1
  205. package/out/exact-match.js +32 -21
  206. package/out/exact-match.js.map +1 -1
  207. package/out/extracts.d.ts +66 -55
  208. package/out/extracts.d.ts.map +1 -1
  209. package/out/extracts.js +63 -55
  210. package/out/extracts.js.map +1 -1
  211. package/out/fst/autocomplete.d.ts +29 -21
  212. package/out/fst/autocomplete.d.ts.map +1 -1
  213. package/out/fst/autocomplete.js +39 -28
  214. package/out/fst/autocomplete.js.map +1 -1
  215. package/out/fst/builder.d.ts.map +1 -1
  216. package/out/fst/builder.js +37 -41
  217. package/out/fst/builder.js.map +1 -1
  218. package/out/fst/deserialize-web.d.ts +4 -4
  219. package/out/fst/deserialize-web.d.ts.map +1 -1
  220. package/out/fst/deserialize-web.js +15 -16
  221. package/out/fst/deserialize-web.js.map +1 -1
  222. package/out/fst/format.d.ts +41 -23
  223. package/out/fst/format.d.ts.map +1 -1
  224. package/out/fst/format.js +41 -23
  225. package/out/fst/format.js.map +1 -1
  226. package/out/fst/freshness.d.ts +19 -81
  227. package/out/fst/freshness.d.ts.map +1 -1
  228. package/out/fst/freshness.js +31 -94
  229. package/out/fst/freshness.js.map +1 -1
  230. package/out/fst/matcher.d.ts +5 -4
  231. package/out/fst/matcher.d.ts.map +1 -1
  232. package/out/fst/matcher.js +2 -2
  233. package/out/fst/matcher.js.map +1 -1
  234. package/out/fst/serialize.d.ts +28 -28
  235. package/out/fst/serialize.d.ts.map +1 -1
  236. package/out/fst/serialize.js +53 -71
  237. package/out/fst/serialize.js.map +1 -1
  238. package/out/fst/types.d.ts +78 -74
  239. package/out/fst/types.d.ts.map +1 -1
  240. package/out/fst/types.js +1 -4
  241. package/out/fst/types.js.map +1 -1
  242. package/out/{fst/index.js → fst.d.ts} +2 -1
  243. package/out/fst.d.ts.map +1 -0
  244. package/out/{fst/index.d.ts → fst.js} +2 -1
  245. package/out/fst.js.map +1 -0
  246. package/out/fts/query.d.ts +2 -27
  247. package/out/fts/query.d.ts.map +1 -1
  248. package/out/fts/query.js +5 -36
  249. package/out/fts/query.js.map +1 -1
  250. package/out/fts.d.ts +126 -0
  251. package/out/fts.d.ts.map +1 -0
  252. package/out/fts.js +188 -0
  253. package/out/fts.js.map +1 -0
  254. package/out/geonames/aliases.d.ts +26 -62
  255. package/out/geonames/aliases.d.ts.map +1 -1
  256. package/out/geonames/aliases.js +45 -117
  257. package/out/geonames/aliases.js.map +1 -1
  258. package/out/geonames/postal.d.ts +84 -44
  259. package/out/geonames/postal.d.ts.map +1 -1
  260. package/out/geonames/postal.js +115 -73
  261. package/out/geonames/postal.js.map +1 -1
  262. package/out/{geonames/index.js → geonames.d.ts} +1 -1
  263. package/out/geonames.d.ts.map +1 -0
  264. package/out/{geonames/index.d.ts → geonames.js} +1 -1
  265. package/out/geonames.js.map +1 -0
  266. package/out/index.d.ts +9 -8
  267. package/out/index.d.ts.map +1 -1
  268. package/out/index.js +6 -5
  269. package/out/index.js.map +1 -1
  270. package/out/interpolation.d.ts +18 -55
  271. package/out/interpolation.d.ts.map +1 -1
  272. package/out/interpolation.js +27 -69
  273. package/out/interpolation.js.map +1 -1
  274. package/out/lookup.d.ts +23 -51
  275. package/out/lookup.d.ts.map +1 -1
  276. package/out/lookup.js +136 -234
  277. package/out/lookup.js.map +1 -1
  278. package/out/name-score.d.ts +2 -2
  279. package/out/name-score.d.ts.map +1 -1
  280. package/out/name-score.js +9 -7
  281. package/out/name-score.js.map +1 -1
  282. package/out/nsul/lookup.d.ts +33 -34
  283. package/out/nsul/lookup.d.ts.map +1 -1
  284. package/out/nsul/lookup.js +26 -40
  285. package/out/nsul/lookup.js.map +1 -1
  286. package/out/nsul/schema.d.ts +16 -43
  287. package/out/nsul/schema.d.ts.map +1 -1
  288. package/out/nsul/schema.js +9 -35
  289. package/out/nsul/schema.js.map +1 -1
  290. package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
  291. package/out/nsul.d.ts.map +1 -0
  292. package/out/{nsul/index.js → nsul.js} +1 -1
  293. package/out/nsul.js.map +1 -0
  294. package/out/paths.d.ts +124 -0
  295. package/out/paths.d.ts.map +1 -0
  296. package/out/paths.js +104 -0
  297. package/out/paths.js.map +1 -0
  298. package/out/place-importance-schema.d.ts +51 -143
  299. package/out/place-importance-schema.d.ts.map +1 -1
  300. package/out/place-importance-schema.js +28 -143
  301. package/out/place-importance-schema.js.map +1 -1
  302. package/out/poi/lookup.d.ts +40 -47
  303. package/out/poi/lookup.d.ts.map +1 -1
  304. package/out/poi/lookup.js +69 -96
  305. package/out/poi/lookup.js.map +1 -1
  306. package/out/poi/schema.d.ts +41 -25
  307. package/out/poi/schema.d.ts.map +1 -1
  308. package/out/poi/schema.js +25 -17
  309. package/out/poi/schema.js.map +1 -1
  310. package/out/{poi/index.js → poi.d.ts} +1 -1
  311. package/out/poi.d.ts.map +1 -0
  312. package/out/{poi/index.d.ts → poi.js} +1 -1
  313. package/out/poi.js.map +1 -0
  314. package/out/polygon-schema.d.ts +10 -6
  315. package/out/polygon-schema.d.ts.map +1 -1
  316. package/out/polygon-schema.js +2 -2
  317. package/out/polygon-schema.js.map +1 -1
  318. package/out/postal/city/alias/lookup.d.ts +20 -23
  319. package/out/postal/city/alias/lookup.d.ts.map +1 -1
  320. package/out/postal/city/alias/lookup.js +17 -30
  321. package/out/postal/city/alias/lookup.js.map +1 -1
  322. package/out/postal/city/alias/schema.d.ts +14 -10
  323. package/out/postal/city/alias/schema.d.ts.map +1 -1
  324. package/out/postal/city/alias/schema.js +10 -8
  325. package/out/postal/city/alias/schema.js.map +1 -1
  326. package/out/postal/city/candidate-schema.d.ts +25 -19
  327. package/out/postal/city/candidate-schema.d.ts.map +1 -1
  328. package/out/postal/city/candidate-schema.js +21 -17
  329. package/out/postal/city/candidate-schema.js.map +1 -1
  330. package/out/{postal/index.d.ts → postal.d.ts} +1 -1
  331. package/out/postal.d.ts.map +1 -0
  332. package/out/{postal/index.js → postal.js} +1 -1
  333. package/out/postal.js.map +1 -0
  334. package/out/postcode-point-lookup.d.ts +6 -24
  335. package/out/postcode-point-lookup.d.ts.map +1 -1
  336. package/out/postcode-point-lookup.js +5 -17
  337. package/out/postcode-point-lookup.js.map +1 -1
  338. package/out/primary-preference.d.ts +38 -92
  339. package/out/primary-preference.d.ts.map +1 -1
  340. package/out/primary-preference.js +15 -99
  341. package/out/primary-preference.js.map +1 -1
  342. package/out/proximity-rerank.d.ts +41 -30
  343. package/out/proximity-rerank.d.ts.map +1 -1
  344. package/out/proximity-rerank.js +38 -29
  345. package/out/proximity-rerank.js.map +1 -1
  346. package/out/ranking-weights.d.ts +98 -64
  347. package/out/ranking-weights.d.ts.map +1 -1
  348. package/out/ranking-weights.js +26 -25
  349. package/out/ranking-weights.js.map +1 -1
  350. package/out/region-keys.d.ts +50 -31
  351. package/out/region-keys.d.ts.map +1 -1
  352. package/out/region-keys.js +68 -40
  353. package/out/region-keys.js.map +1 -1
  354. package/out/reverse.d.ts +78 -50
  355. package/out/reverse.d.ts.map +1 -1
  356. package/out/reverse.js +98 -61
  357. package/out/reverse.js.map +1 -1
  358. package/out/schema.d.ts +72 -49
  359. package/out/schema.d.ts.map +1 -1
  360. package/out/schema.js +4 -5
  361. package/out/schema.js.map +1 -1
  362. package/out/search-fetch.d.ts +16 -12
  363. package/out/search-fetch.d.ts.map +1 -1
  364. package/out/search-fetch.js +83 -63
  365. package/out/search-fetch.js.map +1 -1
  366. package/out/sqlite/convention-source.d.ts +12 -16
  367. package/out/sqlite/convention-source.d.ts.map +1 -1
  368. package/out/sqlite/convention-source.js +13 -22
  369. package/out/sqlite/convention-source.js.map +1 -1
  370. package/out/sqlite/utils.d.ts +19 -19
  371. package/out/sqlite/utils.d.ts.map +1 -1
  372. package/out/sqlite/utils.js +14 -15
  373. package/out/sqlite/utils.js.map +1 -1
  374. package/out/street/centroid/schema.d.ts +37 -42
  375. package/out/street/centroid/schema.d.ts.map +1 -1
  376. package/out/street/centroid/schema.js +9 -21
  377. package/out/street/centroid/schema.js.map +1 -1
  378. package/out/street/centroid.d.ts +30 -0
  379. package/out/street/centroid.d.ts.map +1 -0
  380. package/out/street/{centroid/index.js → centroid.js} +13 -24
  381. package/out/street/centroid.js.map +1 -0
  382. package/out/street/morphology/fst/builder.d.ts +20 -10
  383. package/out/street/morphology/fst/builder.d.ts.map +1 -1
  384. package/out/street/morphology/fst/builder.js +44 -34
  385. package/out/street/morphology/fst/builder.js.map +1 -1
  386. package/out/street/morphology/fst/loader.d.ts +33 -26
  387. package/out/street/morphology/fst/loader.d.ts.map +1 -1
  388. package/out/street/morphology/fst/loader.js +23 -22
  389. package/out/street/morphology/fst/loader.js.map +1 -1
  390. package/out/street/name-lookup.d.ts +24 -18
  391. package/out/street/name-lookup.d.ts.map +1 -1
  392. package/out/street/name-lookup.js +34 -35
  393. package/out/street/name-lookup.js.map +1 -1
  394. package/out/street/normalize.d.ts +35 -136
  395. package/out/street/normalize.d.ts.map +1 -1
  396. package/out/street/normalize.js +77 -194
  397. package/out/street/normalize.js.map +1 -1
  398. package/out/street/segment-schema.d.ts +79 -39
  399. package/out/street/segment-schema.d.ts.map +1 -1
  400. package/out/street/segment-schema.js +71 -21
  401. package/out/street/segment-schema.js.map +1 -1
  402. package/out/{street/index.js → street.d.ts} +2 -2
  403. package/out/street.d.ts.map +1 -0
  404. package/out/{street/index.d.ts → street.js} +2 -2
  405. package/out/street.js.map +1 -0
  406. package/out/types.d.ts +84 -149
  407. package/out/types.d.ts.map +1 -1
  408. package/out/types.js +0 -6
  409. package/out/types.js.map +1 -1
  410. package/out/unified-schema.d.ts +8 -12
  411. package/out/unified-schema.d.ts.map +1 -1
  412. package/out/unified-schema.js +29 -29
  413. package/out/unified-schema.js.map +1 -1
  414. package/out/uprn/existence.d.ts +28 -17
  415. package/out/uprn/existence.d.ts.map +1 -1
  416. package/out/uprn/existence.js +26 -16
  417. package/out/uprn/existence.js.map +1 -1
  418. package/out/uprn/lookup.d.ts +14 -44
  419. package/out/uprn/lookup.d.ts.map +1 -1
  420. package/out/uprn/lookup.js +21 -57
  421. package/out/uprn/lookup.js.map +1 -1
  422. package/out/uprn/schema.d.ts +18 -40
  423. package/out/uprn/schema.d.ts.map +1 -1
  424. package/out/uprn/schema.js +10 -32
  425. package/out/uprn/schema.js.map +1 -1
  426. package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
  427. package/out/uprn.d.ts.map +1 -0
  428. package/out/{uprn/index.js → uprn.js} +1 -1
  429. package/out/uprn.js.map +1 -0
  430. package/out/weights-overlay-linker.d.ts +138 -144
  431. package/out/weights-overlay-linker.d.ts.map +1 -1
  432. package/out/weights-overlay-linker.js +105 -159
  433. package/out/weights-overlay-linker.js.map +1 -1
  434. package/package.json +91 -596
  435. package/lib/address/point/index.ts +0 -328
  436. package/lib/convention/index.ts +0 -154
  437. package/lib/fts/index.ts +0 -361
  438. package/out/address/index.d.ts.map +0 -1
  439. package/out/address/index.js.map +0 -1
  440. package/out/address/point/index.d.ts +0 -53
  441. package/out/address/point/index.d.ts.map +0 -1
  442. package/out/address/point/index.js +0 -222
  443. package/out/address/point/index.js.map +0 -1
  444. package/out/ancestry/index.d.ts +0 -45
  445. package/out/ancestry/index.d.ts.map +0 -1
  446. package/out/ancestry/index.js +0 -55
  447. package/out/ancestry/index.js.map +0 -1
  448. package/out/convention/index.d.ts +0 -106
  449. package/out/convention/index.d.ts.map +0 -1
  450. package/out/convention/index.js +0 -93
  451. package/out/convention/index.js.map +0 -1
  452. package/out/fst/index.d.ts.map +0 -1
  453. package/out/fst/index.js.map +0 -1
  454. package/out/fts/index.d.ts +0 -184
  455. package/out/fts/index.d.ts.map +0 -1
  456. package/out/fts/index.js +0 -277
  457. package/out/fts/index.js.map +0 -1
  458. package/out/geonames/index.d.ts.map +0 -1
  459. package/out/geonames/index.js.map +0 -1
  460. package/out/nsul/index.d.ts.map +0 -1
  461. package/out/nsul/index.js.map +0 -1
  462. package/out/poi/index.d.ts.map +0 -1
  463. package/out/poi/index.js.map +0 -1
  464. package/out/postal/index.d.ts.map +0 -1
  465. package/out/postal/index.js.map +0 -1
  466. package/out/street/centroid/index.d.ts +0 -40
  467. package/out/street/centroid/index.d.ts.map +0 -1
  468. package/out/street/centroid/index.js.map +0 -1
  469. package/out/street/index.d.ts.map +0 -1
  470. package/out/street/index.js.map +0 -1
  471. package/out/uprn/index.d.ts.map +0 -1
  472. package/out/uprn/index.js.map +0 -1
  473. /package/lib/{geonames/index.ts → geonames.ts} +0 -0
  474. /package/lib/{nsul/index.ts → nsul.ts} +0 -0
  475. /package/lib/{poi/index.ts → poi.ts} +0 -0
  476. /package/lib/{postal/index.ts → postal.ts} +0 -0
  477. /package/lib/{uprn/index.ts → uprn.ts} +0 -0
@@ -3,26 +3,27 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * The `capital` table (#1880's distribution home): the capital-status reference carried INSIDE
7
- * `candidate.db`, so an npm consumer who pulled the artifact can run `capital_tier` without the
8
- * repo's `data/gazetteer/capitals-v1.json` — which published packages do not ship. One row per
9
- * reference entry (241 national capitals + 3,463 admin-1 seats at the 2026-08-24 build); the
10
- * loader reads the WHOLE table once into a `CapitalIndex` at session construction, so there is no
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 — the name-membership conjunct that
14
- * keeps the coordinate radius from promoting a capital's same-name neighbours (`capitals.ts`).
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
  import { tryParsingJSON } from "@mailwoman/core/json";
17
16
  import { hasTable } from "#sqlite-utils";
18
17
  /**
19
- * The table name the builder writes and the reader probes — one word, singular, matching the artifact's other reference
20
- * tables (`candidate`, `country_codes`).
18
+ * The table name the builder writes and the reader probes, one word and singular,
19
+ * matching the artifact's other reference tables (`candidate`, `country_codes`).
21
20
  */
22
21
  export const CAPITAL_TABLE = "capital";
23
22
  /**
24
- * Create the table on a build in progress. Async because Kysely's schema-builder is; called from the candidate build's
25
- * DDL phase alongside the other typed builders.
23
+ * Create the table on a build in progress.
24
+ *
25
+ * Async because Kysely's schema-builder is.
26
+ * Called from the candidate build's DDL phase alongside the other typed builders.
26
27
  */
27
28
  export async function createCapitalTable(db) {
28
29
  await db.schema
@@ -35,9 +36,10 @@ export async function createCapitalTable(db) {
35
36
  .execute();
36
37
  }
37
38
  /**
38
- * Read the whole reference out of an artifact, or `null` when the artifact predates the table — the caller then falls
39
- * back to its next source rather than treating an old artifact as "no capitals" (the meaning-of-zero rule: a missing
40
- * table is UNMEASURED, an empty one is a finding).
39
+ * Read the whole reference out of an artifact, or `null` when the artifact predates the table.
40
+ *
41
+ * The caller then falls back to its next source rather than treating an old artifact as "no
42
+ * capitals" (the meaning-of-zero rule: a missing table is unmeasured, an empty one is a finding).
41
43
  */
42
44
  export function readCapitalPoints(db) {
43
45
  if (!hasTable(db, CAPITAL_TABLE))
@@ -1 +1 @@
1
- {"version":3,"file":"capital-schema.js","sourceRoot":"","sources":["../lib/capital-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAKrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAA;AAiBtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAuC,EAAc;IAC5F,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,aAAa,CAAC;SAC1B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAClD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC9C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7C,OAAO,EAAE,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAK,EAAsB;IAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;QAAE,OAAO,IAAI,CAAA;IAE7C,MAAM,MAAM,GAAmB,EAAE,CAAA;IAEjC,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,yDAAyD,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAE/B,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,QAAQ;YAAE,SAAQ;QAExD,MAAM,IAAI,GAAG,cAAc,CAAW,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QAEvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAQ;QAElC,MAAM,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC9B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAChC,KAAK;YACL,CAAC,EAAE,IAAI;SACP,CAAC,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"capital-schema.js","sourceRoot":"","sources":["../lib/capital-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAKrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAA;AAmBtC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAuC,EAAc;IAC5F,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,aAAa,CAAC;SAC1B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAClD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC9C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7C,OAAO,EAAE,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAK,EAAsB;IAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;QAAE,OAAO,IAAI,CAAA;IAE7C,MAAM,MAAM,GAAmB,EAAE,CAAA;IAEjC,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,yDAAyD,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAE/B,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,QAAQ;YAAE,SAAQ;QAExD,MAAM,IAAI,GAAG,cAAc,CAAW,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QAEvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAQ;QAElC,MAAM,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC9B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAChC,KAAK;YACL,CAAC,EAAE,IAAI;SACP,CAAC,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
package/out/capitals.d.ts CHANGED
@@ -3,24 +3,21 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * The CAPITAL-STATUS reference index (#1880) — answers, for one resolved candidate, "is this
7
- * place the national capital or an admin-1 seat of its country?". The consumer is the resolver's
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); this module only matches, it never ranks. PURE and
10
- * platform-free (the #861 parity discipline).
9
+ * key on the bare-toponym class). This module only matches and never ranks. It is pure and
10
+ * platform-free.
11
11
  *
12
- * Matching is an IDENTITY test with three conjuncts: same country, within
13
- * {@link CAPITAL_MATCH_RADIUS_KM} of the reference point, and the candidate's own folded name a
14
- * member of the reference entry's folded name set (name + romanization + the source's alternate
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
  /**
22
- * Capital status of one candidate: national capital, admin-1 seat, or neither. Numeric so the resolver's promotion can
23
- * compare levels.
18
+ * Capital status of one candidate: national capital, admin-1 seat, or neither.
19
+ *
20
+ * Numeric so the resolver's promotion can compare levels.
24
21
  */
25
22
  export declare const CAPITAL_LEVEL: {
26
23
  readonly none: 0;
@@ -29,13 +26,14 @@ export declare const CAPITAL_LEVEL: {
29
26
  };
30
27
  export type CapitalLevel = (typeof CAPITAL_LEVEL)[keyof typeof CAPITAL_LEVEL];
31
28
  /**
32
- * How far a candidate row may sit from the reference point and still read as the same place — a centroid-convention
33
- * allowance (GeoNames point vs WOF centroid on a metro-scale city), not a catchment: the name-membership conjunct is
34
- * what excludes neighbours inside the radius.
29
+ * How far a candidate row may sit from the reference point and still read as the same place.
30
+ *
31
+ * A centroid-convention allowance for a GeoNames point against a WOF centroid on a metro-scale city.
32
+ * The name-membership conjunct excludes neighbors inside the radius.
35
33
  */
36
34
  export declare const CAPITAL_MATCH_RADIUS_KM = 25;
37
35
  /**
38
- * One reference entry, as `data/gazetteer/capitals-v1.json` carries it (`entries[]`).
36
+ * One reference entry, as recorded in `data/gazetteer/capitals-v1.json` (`entries[]`).
39
37
  */
40
38
  export interface CapitalPoint {
41
39
  /**
@@ -46,24 +44,28 @@ export interface CapitalPoint {
46
44
  longitude: number;
47
45
  level: "national" | "admin1";
48
46
  /**
49
- * Folded name keys (name + romanization + alternate names, `normalizeLocalityForKey` fold) — the membership set for
50
- * the name conjunct.
47
+ * Folded name keys (name + romanization + alternate names, `normalizeLocalityForKey` fold).
48
+ * The membership set for the name conjunct.
51
49
  */
52
50
  k: string[];
53
51
  }
54
52
  /**
55
- * Country-bucketed capital points with the three-conjunct identity probe. Construct from the parsed reference file's
56
- * `entries` — the loader that reads the file off disk lives with the path owners (`mailwoman`'s resolver backend),
57
- * keeping this module platform-free.
53
+ * Country-bucketed capital points with the three-conjunct identity probe.
54
+ *
55
+ * Construct from the parsed reference file's `entries`.
56
+ * The loader that reads the file off disk lives with the path owners
57
+ * (`mailwoman`'s resolver backend), keeping this module platform-free.
58
58
  */
59
59
  export declare class CapitalIndex {
60
60
  #private;
61
61
  constructor(entries: Iterable<CapitalPoint>);
62
62
  /**
63
- * The highest capital level whose entry passes all three conjuncts for this place. `none` — never a throw — for a
64
- * missing name, country, or coordinate, an unknown country, or no matching entry.
63
+ * The highest capital level whose entry passes all three conjuncts for this place.
64
+ *
65
+ * `none`, never a throw, for a missing name, country, or coordinate,
66
+ * an unknown country, or no matching entry.
65
67
  */
66
- levelOfPlace(name: string | null | undefined, country: string | null | undefined, latitude: number | null | undefined, longitude: number | null | undefined): CapitalLevel;
68
+ levelOfPlace(name: string | null, country: string | null, latitude: number | null, longitude: number | null | undefined): CapitalLevel;
67
69
  get size(): number;
68
70
  }
69
71
  //# sourceMappingURL=capitals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capitals.d.ts","sourceRoot":"","sources":["../lib/capitals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH;;;GAGG;AACH,eAAO,MAAM,aAAa;aACzB,IAAI,EAAE,CAAC;aACP,MAAM,EAAE,CAAC;aACT,QAAQ,EAAE,CAAC;CACF,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAA;AAE7E;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC5B;;;OAGG;IACH,CAAC,EAAE,MAAM,EAAE,CAAA;CACX;AAcD;;;;GAIG;AACH,qBAAa,YAAY;;IAGxB,YAAY,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAmB1C;IAED;;;OAGG;IACH,YAAY,CACX,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,YAAY,CAwBd;IAED,IAAI,IAAI,IAAI,MAAM,CAQjB;CACD"}
1
+ {"version":3,"file":"capitals.d.ts","sourceRoot":"","sources":["../lib/capitals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH;;;;GAIG;AACH,eAAO,MAAM,aAAa;aACzB,IAAI,EAAE,CAAC;aACP,MAAM,EAAE,CAAC;aACT,QAAQ,EAAE,CAAC;CACF,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAA;AAE7E;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC5B;;;OAGG;IACH,CAAC,EAAE,MAAM,EAAE,CAAA;CACX;AAcD;;;;;;GAMG;AACH,qBAAa,YAAY;;IAGxB,YAAY,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAmB1C;IAED;;;;;OAKG;IACH,YAAY,CACX,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,YAAY,CAwBd;IAED,IAAI,IAAI,IAAI,MAAM,CAQjB;CACD"}
package/out/capitals.js CHANGED
@@ -3,26 +3,23 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * The CAPITAL-STATUS reference index (#1880) — answers, for one resolved candidate, "is this
7
- * place the national capital or an admin-1 seat of its country?". The consumer is the resolver's
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); this module only matches, it never ranks. PURE and
10
- * platform-free (the #861 parity discipline).
9
+ * key on the bare-toponym class). This module only matches and never ranks. It is pure and
10
+ * platform-free.
11
11
  *
12
- * Matching is an IDENTITY test with three conjuncts: same country, within
13
- * {@link CAPITAL_MATCH_RADIUS_KM} of the reference point, and the candidate's own folded name a
14
- * member of the reference entry's folded name set (name + romanization + the source's alternate
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
  import { haversineKm } from "@mailwoman/spatial";
22
18
  import { normalizeLocalityForKey } from "#street/normalize";
23
19
  /**
24
- * Capital status of one candidate: national capital, admin-1 seat, or neither. Numeric so the resolver's promotion can
25
- * compare levels.
20
+ * Capital status of one candidate: national capital, admin-1 seat, or neither.
21
+ *
22
+ * Numeric so the resolver's promotion can compare levels.
26
23
  */
27
24
  export const CAPITAL_LEVEL = {
28
25
  none: 0,
@@ -30,9 +27,10 @@ export const CAPITAL_LEVEL = {
30
27
  national: 2,
31
28
  };
32
29
  /**
33
- * How far a candidate row may sit from the reference point and still read as the same place — a centroid-convention
34
- * allowance (GeoNames point vs WOF centroid on a metro-scale city), not a catchment: the name-membership conjunct is
35
- * what excludes neighbours inside the radius.
30
+ * How far a candidate row may sit from the reference point and still read as the same place.
31
+ *
32
+ * A centroid-convention allowance for a GeoNames point against a WOF centroid on a metro-scale city.
33
+ * The name-membership conjunct excludes neighbors inside the radius.
36
34
  */
37
35
  export const CAPITAL_MATCH_RADIUS_KM = 25;
38
36
  const LEVEL_OF = {
@@ -40,9 +38,11 @@ const LEVEL_OF = {
40
38
  admin1: CAPITAL_LEVEL.admin1,
41
39
  };
42
40
  /**
43
- * Country-bucketed capital points with the three-conjunct identity probe. Construct from the parsed reference file's
44
- * `entries` — the loader that reads the file off disk lives with the path owners (`mailwoman`'s resolver backend),
45
- * keeping this module platform-free.
41
+ * Country-bucketed capital points with the three-conjunct identity probe.
42
+ *
43
+ * Construct from the parsed reference file's `entries`.
44
+ * The loader that reads the file off disk lives with the path owners
45
+ * (`mailwoman`'s resolver backend), keeping this module platform-free.
46
46
  */
47
47
  export class CapitalIndex {
48
48
  #byCountry = new Map();
@@ -65,8 +65,10 @@ export class CapitalIndex {
65
65
  }
66
66
  }
67
67
  /**
68
- * The highest capital level whose entry passes all three conjuncts for this place. `none` — never a throw — for a
69
- * missing name, country, or coordinate, an unknown country, or no matching entry.
68
+ * The highest capital level whose entry passes all three conjuncts for this place.
69
+ *
70
+ * `none`, never a throw, for a missing name, country, or coordinate,
71
+ * an unknown country, or no matching entry.
70
72
  */
71
73
  levelOfPlace(name, country, latitude, longitude) {
72
74
  if (!name || !country || typeof latitude !== "number" || typeof longitude !== "number")
@@ -1 +1 @@
1
- {"version":3,"file":"capitals.js","sourceRoot":"","sources":["../lib/capitals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;CACF,CAAA;AAIV;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAA;AAoBzC,MAAM,QAAQ,GAAgD;IAC7D,QAAQ,EAAE,aAAa,CAAC,QAAQ;IAChC,MAAM,EAAE,aAAa,CAAC,MAAM;CAC5B,CAAA;AASD;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACf,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAA;IAEvD,YAAY,OAA+B;QAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;YAE3C,MAAM,KAAK,GAAiB;gBAC3B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;aACtB,CAAA;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAE3C,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;YACtC,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,YAAY,CACX,IAA+B,EAC/B,OAAkC,EAClC,QAAmC,EACnC,SAAoC;QAEpC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,aAAa,CAAC,IAAI,CAAA;QAEjH,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;QAEzD,IAAI,CAAC,MAAM;YAAE,OAAO,aAAa,CAAC,IAAI,CAAA;QAEtC,MAAM,GAAG,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;QAEjD,IAAI,CAAC,GAAG;YAAE,OAAO,aAAa,CAAC,IAAI,CAAA;QAEnC,IAAI,IAAI,GAAiB,aAAa,CAAC,IAAI,CAAA;QAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IACC,KAAK,CAAC,KAAK,GAAG,IAAI;gBAClB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBACnB,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,uBAAuB,EAC3F,CAAC;gBACF,IAAI,GAAG,KAAK,CAAC,KAAK,CAAA;YACnB,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,IAAI,IAAI;QACP,IAAI,CAAC,GAAG,CAAC,CAAA;QAET,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,CAAC,IAAI,MAAM,CAAC,MAAM,CAAA;QACnB,CAAC;QAED,OAAO,CAAC,CAAA;IACT,CAAC;CACD"}
1
+ {"version":3,"file":"capitals.js","sourceRoot":"","sources":["../lib/capitals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;CACF,CAAA;AAIV;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAA;AAoBzC,MAAM,QAAQ,GAAgD;IAC7D,QAAQ,EAAE,aAAa,CAAC,QAAQ;IAChC,MAAM,EAAE,aAAa,CAAC,MAAM;CAC5B,CAAA;AASD;;;;;;GAMG;AACH,MAAM,OAAO,YAAY;IACf,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAA;IAEvD,YAAY,OAA+B;QAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;YAE3C,MAAM,KAAK,GAAiB;gBAC3B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC5B,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;aACtB,CAAA;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAE3C,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;YACtC,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,YAAY,CACX,IAAmB,EACnB,OAAsB,EACtB,QAAuB,EACvB,SAAoC;QAEpC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,aAAa,CAAC,IAAI,CAAA;QAEjH,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;QAEzD,IAAI,CAAC,MAAM;YAAE,OAAO,aAAa,CAAC,IAAI,CAAA;QAEtC,MAAM,GAAG,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAA;QAEjD,IAAI,CAAC,GAAG;YAAE,OAAO,aAAa,CAAC,IAAI,CAAA;QAEnC,IAAI,IAAI,GAAiB,aAAa,CAAC,IAAI,CAAA;QAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IACC,KAAK,CAAC,KAAK,GAAG,IAAI;gBAClB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBACnB,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,uBAAuB,EAC3F,CAAC;gBACF,IAAI,GAAG,KAAK,CAAC,KAAK,CAAA;YACnB,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,IAAI,IAAI;QACP,IAAI,CAAC,GAAG,CAAC,CAAA;QAET,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,CAAC,IAAI,MAAM,CAAC,MAAM,CAAA;QACnB,CAAC;QAED,OAAO,CAAC,CAAA;IACT,CAAC;CACD"}
@@ -3,50 +3,50 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * `buildCoincidentRoles` — derives the **coincident-roles relation** (#403, epic #402) into the
7
- * unified gazetteer.
6
+ * `buildCoincidentRoles` derives the coincident-roles relation into the unified gazetteer.
8
7
  *
9
- * Many places occupy MULTIPLE admin tiers under one name: German city-states (Berlin/Hamburg/Bremen
10
- * = city == state), Italian provinces named after their capital (Milano, Varese…), Spanish
11
- * provinces-after-capitals, UK unitary authorities, JP prefectures, NL province-capitals
12
- * (Utrecht/Groningen), Shanghai. When an address surfaces only the admin role (the parser drops
13
- * the locality span), the resolver has no locality to place. The hierarchy-completion step (#405)
14
- * repairs that by consulting THIS relation; the table replaces #387's hardcoded 15 km constant
15
- * with the gazetteer's own structure, so the runtime is an O(1) membership lookup with no
16
- * distance math.
8
+ * Many places occupy multiple admin tiers under one name: German city-states (Berlin, Hamburg,
9
+ * Bremen), Italian provinces whose names match their capital (Milano, Varese), Spanish
10
+ * provinces-after-capitals, UK unitary authorities, JP prefectures, NL province-capitals (Utrecht,
11
+ * Groningen), and Shanghai. When an address surfaces only the admin role because the parser
12
+ * dropped the locality span, the resolver has no locality to place. The hierarchy-completion step
13
+ * consults this relation. The table preserves the gazetteer's own structure, so the runtime is an
14
+ * O(1) membership lookup with no distance math.
17
15
  *
18
- * V1 is REGION-tier only (admin.placetype = `region`): the ~124 places matching the census across 9
19
- * countries (IT/ES/GB/JP/KR/FR/DE/NL/CN). County-tier same-name coincidences are deliberately
20
- * excluded — they're dominated by French cantons and JP counties (admin subdivisions named after
21
- * a seat town, not dual-role cities) that don't hit the parser-drops-locality failure; genuine
22
- * consolidated city-counties (US SF/Denver) are a separate follow-up needing a relative-size
23
- * filter.
16
+ * V1 is region-tier only (admin.placetype = `region`), the ~124 places matching the census across
17
+ * nine countries. County-tier same-name coincidences are excluded because they are dominated by
18
+ * French cantons and JP counties, admin subdivisions whose names match a seat town that do not hit the
19
+ * parser-drops-locality failure. Consolidated city-counties (US SF, Denver) are a separate
20
+ * follow-up needing a relative-size filter.
24
21
  *
25
- * A pair `(admin, locality)` is recorded when all hold: same `name` (case-insensitive), the
26
- * locality is a `descendant` of the admin (via the `ancestors` table), and their centroids are
27
- * within a RELATIVE tolerance — `toleranceFraction × admin-bbox-diagonal`, floored at
28
- * `minToleranceKm`. The relative term lets a large Italian province admit a city ~tens of km from
29
- * its centroid while a tiny city-state stays tight; the floor catches city-states whose bbox is
30
- * small (Bremen's centroids sit 9.3 km apart). The tolerance lives ONLY here at build time — it
31
- * never enters the resolver hot path.
22
+ * A pair `(admin, locality)` is recorded when the names match case-insensitively, the locality descends from the admin in `ancestors`,
23
+ * and their centroids fall within a
24
+ * relative tolerance of `toleranceFraction × admin-bbox-diagonal`, floored at `minToleranceKm`.
25
+ * The relative term lets a large Italian province admit a city tens of km from its centroid while
26
+ * a tiny city-state stays tight. The floor catches city-states whose bbox is small (Bremen's
27
+ * centroids sit 9.3 km apart). The tolerance lives only here at build time and never enters the
28
+ * resolver hot path.
32
29
  *
33
- * `relationship_type` is recorded for debuggability / deferred per-type behavior; v1 completion is
34
- * uniform (see #405). It's a coarse classification, not critical.
30
+ * `relationship_type` is recorded for debuggability and deferred per-type behavior. V1 completion
31
+ * is uniform. It is a coarse classification.
35
32
  *
36
- * Mirrors the derived-table builder pattern in `fts.ts` (`buildPlaceSearchFTS`). Run incrementally
37
- * against an existing `admin-global-priority.db` via `build-coincident-roles-cli.ts`; should also
38
- * be wired as a post-step of the main `scripts/build-unified-wof.ts`.
33
+ * This mirrors the derived-table builder pattern in `fts.ts` (`buildPlaceSearchFTS`). It runs
34
+ * incrementally against an existing `admin-global-priority.db` via
35
+ * `build-coincident-roles-cli.ts`, and it should also be wired as a post-step of the main
36
+ * `scripts/build-unified-wof.ts`.
39
37
  */
40
38
  import type { CoincidentLocality } from "@mailwoman/core/resolver";
41
39
  import type { DatabaseClient } from "@mailwoman/sqlite/client";
42
40
  import type { WOFDatabase } from "#schema";
43
41
  /**
44
- * Table of places that hold more than one admin role — a locality that is also its county seat. Written by the
45
- * gazetteer build, read by the resolver when a coincident locality has to be chosen.
42
+ * Table of places that hold more than one admin role.
43
+ * A locality that is also its county seat.
44
+ *
45
+ * Written by the gazetteer build, read by the resolver when a coincident locality has to be chosen.
46
46
  */
47
47
  export declare const COINCIDENT_ROLES_TABLE = "coincident_roles";
48
48
  /**
49
- * A place that plays multiple admin roles — one row of the relation, keyed by `admin_id`.
49
+ * A place that plays multiple admin roles, one row of the relation keyed by `admin_id`.
50
50
  */
51
51
  export interface CoincidentRole {
52
52
  localityID: number;
@@ -57,19 +57,27 @@ export interface CoincidentRole {
57
57
  }
58
58
  export interface BuildCoincidentRolesOpts {
59
59
  /**
60
- * Drop + rebuild the table if it already exists. Default true (the build is cheap + idempotent).
60
+ * Drop + rebuild the table if it already exists.
61
+ *
62
+ * @defaultValue `true` (the build is cheap + idempotent)
61
63
  */
62
64
  drop?: boolean;
63
65
  /**
64
- * Relative tolerance: a pair is kept when centroid distance ≤ `toleranceFraction × bbox-diagonal`. Default 0.15.
66
+ * Relative tolerance: a pair is kept when centroid distance ≤ `toleranceFraction × bbox-diagonal`.
67
+ *
68
+ * @defaultValue `0.15`
65
69
  */
66
70
  toleranceFraction?: number;
67
71
  /**
68
- * Floor (km) under the relative tolerance, so small-bbox city-states still qualify. Default 12.
72
+ * Floor (km) under the relative tolerance, so small-bbox city-states still qualify.
73
+ *
74
+ * @defaultValue `12`
69
75
  */
70
76
  minToleranceKm?: number;
71
77
  /**
72
- * Centroid distance (km) below which a region-tier pair is classed `city-state` (metadata only). Default 2.
78
+ * Centroid distance (km) below which a region-tier pair is classed `city-state` (metadata only).
79
+ *
80
+ * @defaultValue `2`
73
81
  */
74
82
  cityStateMaxKm?: number;
75
83
  onProgress?: (phase: string, detail?: string) => void;
@@ -81,23 +89,32 @@ export interface BuildCoincidentRolesResult {
81
89
  durationMs: number;
82
90
  }
83
91
  /**
84
- * Derive the coincident-roles relation into `db`. Additive — only creates/replaces the `coincident_roles` table; never
85
- * touches `spr`/`names`/`ancestors`. Idempotent.
92
+ * Derive the coincident-roles relation into `db`.
93
+ *
94
+ * Additive, only creating or replacing the `coincident_roles` table.
95
+ * It never touches `spr`, `names`, or `ancestors`.
96
+ * Idempotent.
86
97
  */
87
98
  export declare function buildCoincidentRoles(db: DatabaseClient<WOFDatabase>, opts?: BuildCoincidentRolesOpts): BuildCoincidentRolesResult;
88
99
  /**
89
- * True iff the relation table exists. Used by the resolver to decide whether completion can run.
100
+ * True iff the relation table exists.
101
+ *
102
+ * Used by the resolver to decide whether completion can run.
90
103
  */
91
104
  export declare function coincidentRolesExists<DB>(db: DatabaseClient<DB>): boolean;
92
105
  /**
93
- * Load the relation into an in-memory map keyed by `admin_id` for O(1) runtime lookup (#405). Each admin may map to
94
- * MULTIPLE same-name descendants; the consumer disambiguates (min distance → population → abstain). Returns an empty
95
- * map when the table is absent.
106
+ * Load the relation into an in-memory map keyed by `admin_id` for an O(1) runtime lookup.
107
+ *
108
+ * Each admin may map to multiple same-name descendants.
109
+ * The consumer disambiguates by minimum distance, then population, then abstains.
110
+ * Returns an empty map when the table is absent.
96
111
  */
97
112
  export declare function loadCoincidentRoles<DB>(db: DatabaseClient<DB>): Map<number, CoincidentRole[]>;
98
113
  /**
99
- * The relation joined with `spr`, as an in-memory map keyed by `admin_id` — the resolver-facing view of
100
- * {@link loadCoincidentRoles}, carrying the canonical name and coordinates each coincident locality resolves to.
114
+ * The relation joined with `spr`, as an in-memory map keyed by `admin_id`.
115
+ *
116
+ * The resolver-facing view of {@link loadCoincidentRoles}, carrying the canonical name
117
+ * and coordinates each coincident locality resolves to.
101
118
  * Returns an empty map when the relation table is absent.
102
119
  */
103
120
  export declare function loadCoincidentLocalities<DB>(db: DatabaseClient<DB>): Map<number, CoincidentLocality[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"coincident-roles.d.ts","sourceRoot":"","sources":["../lib/coincident-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAGlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAG9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C;;;GAGG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,YAAY,GAAG,cAAc,GAAG,qBAAqB,CAAA;IACvE,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACrD;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;CAClB;AAkBD;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,EAC/B,IAAI,GAAE,wBAA6B,GACjC,0BAA0B,CA8F5B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,OAAO,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAsC7F;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAiDtG"}
1
+ {"version":3,"file":"coincident-roles.d.ts","sourceRoot":"","sources":["../lib/coincident-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAGlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAG9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,YAAY,GAAG,cAAc,GAAG,qBAAqB,CAAA;IACvE,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACrD;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;CAClB;AAkBD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CACnC,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,EAC/B,IAAI,GAAE,wBAA6B,GACjC,0BAA0B,CAgG5B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,OAAO,CAEzE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAsC7F;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CA4DtG"}
@@ -3,51 +3,54 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * `buildCoincidentRoles` — derives the **coincident-roles relation** (#403, epic #402) into the
7
- * unified gazetteer.
6
+ * `buildCoincidentRoles` derives the coincident-roles relation into the unified gazetteer.
8
7
  *
9
- * Many places occupy MULTIPLE admin tiers under one name: German city-states (Berlin/Hamburg/Bremen
10
- * = city == state), Italian provinces named after their capital (Milano, Varese…), Spanish
11
- * provinces-after-capitals, UK unitary authorities, JP prefectures, NL province-capitals
12
- * (Utrecht/Groningen), Shanghai. When an address surfaces only the admin role (the parser drops
13
- * the locality span), the resolver has no locality to place. The hierarchy-completion step (#405)
14
- * repairs that by consulting THIS relation; the table replaces #387's hardcoded 15 km constant
15
- * with the gazetteer's own structure, so the runtime is an O(1) membership lookup with no
16
- * distance math.
8
+ * Many places occupy multiple admin tiers under one name: German city-states (Berlin, Hamburg,
9
+ * Bremen), Italian provinces whose names match their capital (Milano, Varese), Spanish
10
+ * provinces-after-capitals, UK unitary authorities, JP prefectures, NL province-capitals (Utrecht,
11
+ * Groningen), and Shanghai. When an address surfaces only the admin role because the parser
12
+ * dropped the locality span, the resolver has no locality to place. The hierarchy-completion step
13
+ * consults this relation. The table preserves the gazetteer's own structure, so the runtime is an
14
+ * O(1) membership lookup with no distance math.
17
15
  *
18
- * V1 is REGION-tier only (admin.placetype = `region`): the ~124 places matching the census across 9
19
- * countries (IT/ES/GB/JP/KR/FR/DE/NL/CN). County-tier same-name coincidences are deliberately
20
- * excluded — they're dominated by French cantons and JP counties (admin subdivisions named after
21
- * a seat town, not dual-role cities) that don't hit the parser-drops-locality failure; genuine
22
- * consolidated city-counties (US SF/Denver) are a separate follow-up needing a relative-size
23
- * filter.
16
+ * V1 is region-tier only (admin.placetype = `region`), the ~124 places matching the census across
17
+ * nine countries. County-tier same-name coincidences are excluded because they are dominated by
18
+ * French cantons and JP counties, admin subdivisions whose names match a seat town that do not hit the
19
+ * parser-drops-locality failure. Consolidated city-counties (US SF, Denver) are a separate
20
+ * follow-up needing a relative-size filter.
24
21
  *
25
- * A pair `(admin, locality)` is recorded when all hold: same `name` (case-insensitive), the
26
- * locality is a `descendant` of the admin (via the `ancestors` table), and their centroids are
27
- * within a RELATIVE tolerance — `toleranceFraction × admin-bbox-diagonal`, floored at
28
- * `minToleranceKm`. The relative term lets a large Italian province admit a city ~tens of km from
29
- * its centroid while a tiny city-state stays tight; the floor catches city-states whose bbox is
30
- * small (Bremen's centroids sit 9.3 km apart). The tolerance lives ONLY here at build time — it
31
- * never enters the resolver hot path.
22
+ * A pair `(admin, locality)` is recorded when the names match case-insensitively, the locality descends from the admin in `ancestors`,
23
+ * and their centroids fall within a
24
+ * relative tolerance of `toleranceFraction × admin-bbox-diagonal`, floored at `minToleranceKm`.
25
+ * The relative term lets a large Italian province admit a city tens of km from its centroid while
26
+ * a tiny city-state stays tight. The floor catches city-states whose bbox is small (Bremen's
27
+ * centroids sit 9.3 km apart). The tolerance lives only here at build time and never enters the
28
+ * resolver hot path.
32
29
  *
33
- * `relationship_type` is recorded for debuggability / deferred per-type behavior; v1 completion is
34
- * uniform (see #405). It's a coarse classification, not critical.
30
+ * `relationship_type` is recorded for debuggability and deferred per-type behavior. V1 completion
31
+ * is uniform. It is a coarse classification.
35
32
  *
36
- * Mirrors the derived-table builder pattern in `fts.ts` (`buildPlaceSearchFTS`). Run incrementally
37
- * against an existing `admin-global-priority.db` via `build-coincident-roles-cli.ts`; should also
38
- * be wired as a post-step of the main `scripts/build-unified-wof.ts`.
33
+ * This mirrors the derived-table builder pattern in `fts.ts` (`buildPlaceSearchFTS`). It runs
34
+ * incrementally against an existing `admin-global-priority.db` via
35
+ * `build-coincident-roles-cli.ts`, and it should also be wired as a post-step of the main
36
+ * `scripts/build-unified-wof.ts`.
39
37
  */
40
38
  import { allRows } from "@mailwoman/core/utils";
41
39
  import { haversineKm } from "@mailwoman/spatial";
42
40
  import { tableExists } from "@mailwoman/sqlite/introspection";
43
41
  /**
44
- * Table of places that hold more than one admin role — a locality that is also its county seat. Written by the
45
- * gazetteer build, read by the resolver when a coincident locality has to be chosen.
42
+ * Table of places that hold more than one admin role.
43
+ * A locality that is also its county seat.
44
+ *
45
+ * Written by the gazetteer build, read by the resolver when a coincident locality has to be chosen.
46
46
  */
47
47
  export const COINCIDENT_ROLES_TABLE = "coincident_roles";
48
48
  /**
49
- * Derive the coincident-roles relation into `db`. Additive — only creates/replaces the `coincident_roles` table; never
50
- * touches `spr`/`names`/`ancestors`. Idempotent.
49
+ * Derive the coincident-roles relation into `db`.
50
+ *
51
+ * Additive, only creating or replacing the `coincident_roles` table.
52
+ * It never touches `spr`, `names`, or `ancestors`.
53
+ * Idempotent.
51
54
  */
52
55
  export function buildCoincidentRoles(db, opts = {}) {
53
56
  const start = Date.now();
@@ -61,10 +64,9 @@ export function buildCoincidentRoles(db, opts = {}) {
61
64
  db.exec(`DROP TABLE ${COINCIDENT_ROLES_TABLE}`);
62
65
  }
63
66
  onProgress("creating", COINCIDENT_ROLES_TABLE);
64
- // Raw DDL by design: this is a sync builder consumed by a sync CLI (build-coincident-roles-cli) and
65
- // 6 sync unit tests, so routing one table through async Kysely would cascade async through all of
66
- // them for no real gain. See AGENTS.md "Database / inline SQL". (The SELECT + INSERT loop below are
67
- // likewise the raw hot path.)
67
+ // Raw DDL by design: this is a sync builder consumed by a sync CLI and six sync unit tests,
68
+ // so routing one table through async Kysely would cascade async through all of them.
69
+ // See agents.md "Database / inline SQL".
68
70
  db.exec(`
69
71
  CREATE TABLE IF NOT EXISTS ${COINCIDENT_ROLES_TABLE} (
70
72
  admin_id INTEGER NOT NULL,
@@ -77,9 +79,11 @@ export function buildCoincidentRoles(db, opts = {}) {
77
79
  )
78
80
  `);
79
81
  onProgress("scanning");
80
- // Admin (region/county tier) ⋈ same-name DESCENDANT locality. `place_population` is optional (LEFT
81
- // JOIN → 0 when absent). The relative-tolerance filter + relationship classification happen in JS so
82
- // the SQL stays a plain join. `spr` exposes the bbox columns we need for the diagonal.
82
+ // Admin (region or county tier) joined to a same-name descendant locality.
83
+ // `place_population` is optional, so the left join yields 0 when absent.
84
+ // JavaScript applies the relative-tolerance filter and classifies the relationship.
85
+ // SQL stays a plain join.
86
+ // `spr` exposes the bbox columns needed for the diagonal.
83
87
  const candidates = allRows(db.prepare(`SELECT r.id AS admin_id, r.placetype AS admin_placetype, r.country AS country, l.id AS locality_id,
84
88
  r.latitude AS rlat, r.longitude AS rlon, l.latitude AS llat, l.longitude AS llon,
85
89
  r.min_latitude, r.min_longitude, r.max_latitude, r.max_longitude,
@@ -105,11 +109,12 @@ export function buildCoincidentRoles(db, opts = {}) {
105
109
  const tolerance = Math.max(toleranceFraction * diag, minToleranceKm);
106
110
  if (dist > tolerance)
107
111
  continue;
108
- // v1 is region-tier only: a place is a `city-state` when its centroid coincides with the
109
- // region's (Berlin/Hamburg), else `capital-seat` (a region named after its principal city, e.g.
110
- // Milano province → Milano comune). `consolidated-county` is reserved for a future county-tier
111
- // pass (US SF/Denver) — excluded from v1 because county-tier same-name coincidences are
112
- // dominated by French cantons / JP counties that don't hit the parser-drops-locality failure.
112
+ // v1 is region-tier only: a place is `city-state` when its centroid coincides with the
113
+ // region's (Berlin, Hamburg), otherwise `capital-seat` (a region whose name matches its
114
+ // principal city, such as Milano province and Milano comune). `consolidated-county` is
115
+ // reserved for a future county-tier pass (US SF, Denver), excluded from v1 because
116
+ // county-tier same-name coincidences are dominated by French cantons and JP counties
117
+ // that do not hit the parser-drops-locality failure.
113
118
  const relationshipType = dist <= cityStateMaxKm ? "city-state" : "capital-seat";
114
119
  insert.run(c.admin_id, c.locality_id, relationshipType, c.admin_placetype, dist, c.pop);
115
120
  rowCount++;
@@ -126,15 +131,19 @@ export function buildCoincidentRoles(db, opts = {}) {
126
131
  return { created: true, rowCount, byCountry, durationMs: Date.now() - start };
127
132
  }
128
133
  /**
129
- * True iff the relation table exists. Used by the resolver to decide whether completion can run.
134
+ * True iff the relation table exists.
135
+ *
136
+ * Used by the resolver to decide whether completion can run.
130
137
  */
131
138
  export function coincidentRolesExists(db) {
132
139
  return tableExists(db, COINCIDENT_ROLES_TABLE);
133
140
  }
134
141
  /**
135
- * Load the relation into an in-memory map keyed by `admin_id` for O(1) runtime lookup (#405). Each admin may map to
136
- * MULTIPLE same-name descendants; the consumer disambiguates (min distance → population → abstain). Returns an empty
137
- * map when the table is absent.
142
+ * Load the relation into an in-memory map keyed by `admin_id` for an O(1) runtime lookup.
143
+ *
144
+ * Each admin may map to multiple same-name descendants.
145
+ * The consumer disambiguates by minimum distance, then population, then abstains.
146
+ * Returns an empty map when the table is absent.
138
147
  */
139
148
  export function loadCoincidentRoles(db) {
140
149
  const map = new Map();
@@ -161,8 +170,10 @@ export function loadCoincidentRoles(db) {
161
170
  return map;
162
171
  }
163
172
  /**
164
- * The relation joined with `spr`, as an in-memory map keyed by `admin_id` — the resolver-facing view of
165
- * {@link loadCoincidentRoles}, carrying the canonical name and coordinates each coincident locality resolves to.
173
+ * The relation joined with `spr`, as an in-memory map keyed by `admin_id`.
174
+ *
175
+ * The resolver-facing view of {@link loadCoincidentRoles}, carrying the canonical name
176
+ * and coordinates each coincident locality resolves to.
166
177
  * Returns an empty map when the relation table is absent.
167
178
  */
168
179
  export function loadCoincidentLocalities(db) {
@@ -185,6 +196,17 @@ export function loadCoincidentLocalities(db) {
185
196
  relationshipType: r.relationshipType,
186
197
  population: r.population,
187
198
  distanceKm: r.distanceKm,
199
+ parent_id: null,
200
+ prominence: null,
201
+ referential: null,
202
+ encyclopedic: null,
203
+ importance: null,
204
+ exactMatch: null,
205
+ mismatch: null,
206
+ resolutionQuality: null,
207
+ containedByQualifier: null,
208
+ regionScopeMiss: null,
209
+ variantAliasExempted: null,
188
210
  };
189
211
  const list = map.get(r.adminID);
190
212
  if (list) {