@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
@@ -1 +1 @@
1
- {"version":3,"file":"polygon-schema.d.ts","sourceRoot":"","sources":["../lib/polygon-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,aAAa,CAAA;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEzE;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF"}
1
+ {"version":3,"file":"polygon-schema.d.ts","sourceRoot":"","sources":["../lib/polygon-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,aAAa,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEzE;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF"}
@@ -4,10 +4,10 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
6
  * Typed schema for the polygon sidecar (`wof-polygons.db`) — the one table `WOFReverseGeocoder` probes for a
7
- * place's geometry. The interface is the read/write contract and {@link createPolygonsTable} creates the table, so a
7
+ * place's geometry. The interface is the read/write interface and {@link createPolygonsTable} creates the table, so a
8
8
  * column added to one is a compile error against the other.
9
9
  *
10
- * The sidecar is OPTIONAL to the reverse geocoder: without it every result falls back to a centroid, so the reader
10
+ * The sidecar is optional to the reverse geocoder: without it every result falls back to a centroid, so the reader
11
11
  * checks for the table's presence rather than assuming it.
12
12
  */
13
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"polygon-schema.js","sourceRoot":"","sources":["../lib/polygon-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA0BH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAuB;IAChE,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,UAAU,CAAC;SACvB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;SAC3D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SACvD,OAAO,EAAE,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"polygon-schema.js","sourceRoot":"","sources":["../lib/polygon-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA8BH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAuB;IAChE,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,UAAU,CAAC;SACvB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;SAC3D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SACvD,OAAO,EAAE,CAAA;AACZ,CAAC"}
@@ -3,30 +3,25 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Node reader over the POSTAL-CITY ALIAS table (`postal-city-alias-<cc>.db`) — the observed
6
+ * Node reader over the postal-city alias table (`postal-city-alias-<cc>.db`) — the observed
7
7
  * `postal_city → geo_locality` aliases per postcode (`build-postal-city-alias.ts`). Consumed by
8
8
  * {@link WOFSQLitePlaceLookup}'s coordinate-first locality scorer: a user-typed postal city
9
9
  * ("Antioch", postcode 37013) becomes a name-match alias for the geographic locality the postcode
10
- * actually sits in ("Nashville"), so the right place tiers to the top instead of a same-named
11
- * town in another state. Opt-in — the lookup is only constructed when a path is supplied, and
10
+ * actually sits in ("Nashville"), so the right place tiers to the top instead of a place with the same name
11
+ * town in another state. Opt-in — the lookup is only constructed when a path is supplied.
12
12
  * absent it the resolver is byte-identical.
13
13
  *
14
- * The reader returns RAW divergent rows for a postcode; normalization + name-matching against the
14
+ * The reader returns RAW divergent rows for a postcode. normalization + name-matching against the
15
15
  * candidate localities is the scorer's job (it owns the case/diacritic fold the soft name score
16
16
  * uses), keeping one normalizer in one place.
17
17
  */
18
- import { DatabaseClient } from "@mailwoman/sqlite/client";
18
+ import { SQLiteLookup, type SQLiteLookupOptions } from "@mailwoman/sqlite/lookup";
19
19
  import type { PostalCityAliasDatabase } from "#postal/city/alias/schema";
20
- export interface WOFPostalCityAliasLookupOpts {
21
- /**
22
- * Path to a `postal-city-alias-<cc>.db` built by `build-postal-city-alias.ts`. Opened read-only.
23
- */
24
- databasePath?: string;
25
- /**
26
- * Pre-opened handle (tests / shared connections). Mutually exclusive with `databasePath`.
27
- */
28
- database?: DatabaseClient<PostalCityAliasDatabase>;
29
- }
20
+ /**
21
+ * Where a {@link WOFPostalCityAliasLookup} reads from: a `postal-city-alias-<cc>.db` built by
22
+ * `build-postal-city-alias.ts`, opened read-only, or a connection the caller already holds.
23
+ */
24
+ export type WOFPostalCityAliasLookupOpts = SQLiteLookupOptions<PostalCityAliasDatabase>;
30
25
  /**
31
26
  * One divergent alias edge: the postal-system name and the geographic locality it maps to.
32
27
  */
@@ -45,18 +40,20 @@ export interface PostalCityAlias {
45
40
  n: number;
46
41
  }
47
42
  /**
48
- * Reader over `postal_city_alias`. The only query is a postcode-scoped probe for DIVERGENT rows (where the postal name
49
- * differs from the geographic name — the rows that carry alias signal), issued via the typed Kysely query builder
50
- * against {@link PostalCityAliasDatabase}.
43
+ * Reader over `postal_city_alias`.
44
+ *
45
+ * The only query is a postcode-scoped probe for divergent rows
46
+ * (where the postal name differs from the geographic name — the rows that provide alias signal),
47
+ * issued via the typed Kysely query builder against {@link PostalCityAliasDatabase}.
51
48
  */
52
- export declare class WOFPostalCityAliasLookup implements Disposable {
53
- #private;
49
+ export declare class WOFPostalCityAliasLookup extends SQLiteLookup<PostalCityAliasDatabase> {
54
50
  constructor(opts: WOFPostalCityAliasLookupOpts);
55
51
  /**
56
- * Divergent postal-city aliases for a postcode (empty when the postcode isn't in the table). The scorer groups these
57
- * by normalized `geoLocality` and appends the `postalCity` surfaces to the matching candidate locality's alias set.
52
+ * Divergent postal-city aliases for a postcode (empty when the postcode isn't in the table).
53
+ *
54
+ * The scorer groups these by normalized `geoLocality` and appends the `postalCity`
55
+ * surfaces to the matching candidate locality's alias set.
58
56
  */
59
57
  getDivergentAliases(postcode: string): Promise<PostalCityAlias[]>;
60
- [Symbol.dispose](): void;
61
58
  }
62
59
  //# sourceMappingURL=lookup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../../../lib/postal/city/alias/lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAExE,MAAM,WAAW,4BAA4B;IAC5C;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC,uBAAuB,CAAC,CAAA;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,CAAC,EAAE,MAAM,CAAA;CACT;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,UAAU;;IAQ1D,YAAY,IAAI,EAAE,4BAA4B,EAQ7C;IAED;;;OAGG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAatE;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAEvB;CACD"}
1
+ {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../../../lib/postal/city/alias/lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAExE;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG,mBAAmB,CAAC,uBAAuB,CAAC,CAAA;AAEvF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,CAAC,EAAE,MAAM,CAAA;CACT;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,YAAY,CAAC,uBAAuB,CAAC;IAClF,YAAY,IAAI,EAAE,4BAA4B,EAE7C;IAED;;;;;OAKG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAatE;CACD"}
@@ -3,51 +3,41 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Node reader over the POSTAL-CITY ALIAS table (`postal-city-alias-<cc>.db`) — the observed
6
+ * Node reader over the postal-city alias table (`postal-city-alias-<cc>.db`) — the observed
7
7
  * `postal_city → geo_locality` aliases per postcode (`build-postal-city-alias.ts`). Consumed by
8
8
  * {@link WOFSQLitePlaceLookup}'s coordinate-first locality scorer: a user-typed postal city
9
9
  * ("Antioch", postcode 37013) becomes a name-match alias for the geographic locality the postcode
10
- * actually sits in ("Nashville"), so the right place tiers to the top instead of a same-named
11
- * town in another state. Opt-in — the lookup is only constructed when a path is supplied, and
10
+ * actually sits in ("Nashville"), so the right place tiers to the top instead of a place with the same name
11
+ * town in another state. Opt-in — the lookup is only constructed when a path is supplied.
12
12
  * absent it the resolver is byte-identical.
13
13
  *
14
- * The reader returns RAW divergent rows for a postcode; normalization + name-matching against the
14
+ * The reader returns RAW divergent rows for a postcode. normalization + name-matching against the
15
15
  * candidate localities is the scorer's job (it owns the case/diacritic fold the soft name score
16
16
  * uses), keeping one normalizer in one place.
17
17
  */
18
- import { DatabaseClient } from "@mailwoman/sqlite/client";
18
+ import { SQLiteLookup } from "@mailwoman/sqlite/lookup";
19
19
  /**
20
- * Reader over `postal_city_alias`. The only query is a postcode-scoped probe for DIVERGENT rows (where the postal name
21
- * differs from the geographic name — the rows that carry alias signal), issued via the typed Kysely query builder
22
- * against {@link PostalCityAliasDatabase}.
20
+ * Reader over `postal_city_alias`.
21
+ *
22
+ * The only query is a postcode-scoped probe for divergent rows
23
+ * (where the postal name differs from the geographic name — the rows that provide alias signal),
24
+ * issued via the typed Kysely query builder against {@link PostalCityAliasDatabase}.
23
25
  */
24
- export class WOFPostalCityAliasLookup {
25
- #db;
26
- /**
27
- * Resources this instance opened. A connection handed in by a caller is NOT in here, so disposal cannot reach it —
28
- * ownership is membership rather than a flag a later branch has to check.
29
- */
30
- #resources = new DisposableStack();
26
+ export class WOFPostalCityAliasLookup extends SQLiteLookup {
31
27
  constructor(opts) {
32
- if (opts.database) {
33
- this.#db = opts.database;
34
- }
35
- else if (opts.databasePath) {
36
- this.#db = this.#resources.use(new DatabaseClient(opts.databasePath, { readOnly: true }));
37
- }
38
- else {
39
- throw new Error("WOFPostalCityAliasLookup needs `databasePath` or `database`");
40
- }
28
+ super(opts);
41
29
  }
42
30
  /**
43
- * Divergent postal-city aliases for a postcode (empty when the postcode isn't in the table). The scorer groups these
44
- * by normalized `geoLocality` and appends the `postalCity` surfaces to the matching candidate locality's alias set.
31
+ * Divergent postal-city aliases for a postcode (empty when the postcode isn't in the table).
32
+ *
33
+ * The scorer groups these by normalized `geoLocality` and appends the `postalCity`
34
+ * surfaces to the matching candidate locality's alias set.
45
35
  */
46
36
  async getDivergentAliases(postcode) {
47
37
  const pc = postcode.trim();
48
38
  if (!pc)
49
39
  return [];
50
- const rows = await this.#db
40
+ const rows = await this.database
51
41
  .selectFrom("postal_city_alias")
52
42
  .select(["postal_city", "geo_locality", "n"])
53
43
  .where("postcode", "=", pc)
@@ -55,8 +45,5 @@ export class WOFPostalCityAliasLookup {
55
45
  .execute();
56
46
  return rows.map((r) => ({ postalCity: String(r.postal_city), geoLocality: String(r.geo_locality), n: Number(r.n) }));
57
47
  }
58
- [Symbol.dispose]() {
59
- this.#resources[Symbol.dispose]();
60
- }
61
48
  }
62
49
  //# sourceMappingURL=lookup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../lib/postal/city/alias/lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAiCzD;;;;GAIG;AACH,MAAM,OAAO,wBAAwB;IACpC,GAAG,CAAyC;IAC5C;;;OAGG;IACM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAE3C,YAAY,IAAkC;QAC7C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;QACzB,CAAC;aAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAA0B,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACnH,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;QAC/E,CAAC;IACF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAE1B,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAA;QAElB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG;aACzB,UAAU,CAAC,mBAAmB,CAAC;aAC/B,MAAM,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;aAC5C,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;aAC1B,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;aAC1B,OAAO,EAAE,CAAA;QAEX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrH,CAAC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC;QACf,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;IAClC,CAAC;CACD"}
1
+ {"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../../lib/postal/city/alias/lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAA4B,MAAM,0BAA0B,CAAA;AA4BjF;;;;;;GAMG;AACH,MAAM,OAAO,wBAAyB,SAAQ,YAAqC;IAClF,YAAY,IAAkC;QAC7C,KAAK,CAAC,IAAI,CAAC,CAAA;IACZ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAE1B,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAA;QAElB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ;aAC9B,UAAU,CAAC,mBAAmB,CAAC;aAC/B,MAAM,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;aAC5C,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;aAC1B,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;aAC1B,OAAO,EAAE,CAAA;QAEX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrH,CAAC;CACD"}
@@ -3,22 +3,24 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Typed schema for the POSTAL-CITY ALIAS table (`postal-city-alias-<cc>.db`, built by
6
+ * Typed schema for the postal-city alias table (`postal-city-alias-<cc>.db`, built by
7
7
  * `scripts/build-postal-city-alias.ts`) — the single source of truth for the columns shared by
8
- * the BUILDER and the READER ({@link WOFPostalCityAliasLookup}). Like {@link CandidateTable}, the
9
- * contract is a Kysely `Database` interface plus the table DDL as a string, so a column rename in
8
+ * the builder and the reader ({@link WOFPostalCityAliasLookup}). Like {@link CandidateTable}, the
9
+ * interface is a Kysely `Database` interface plus the table DDL as a string, so a column rename in
10
10
  * the builder is a compile error in the reader.
11
11
  *
12
- * Provenance discipline (provenance-first): this is a SIBLING table to the PIP-derived
12
+ * Provenance discipline (provenance-first): this is a sibling table to the PIP-derived
13
13
  * `postcode_locality` data, never mixed into it — one table, one provenance class. Each row is an
14
- * OBSERVED `(postcode, postal_city, geo_locality)` aggregate from Overture's `postal_city` field
14
+ * observed `(postcode, postal_city, geo_locality)` aggregate from Overture's `postal_city` field
15
15
  * with a usage count `n`; `divergent = 1` exactly when `postal_city != geo_locality` (the alias
16
16
  * signal — the only rows the resolver consumes).
17
17
  */
18
18
  import type { Kysely } from "kysely";
19
19
  /**
20
- * One observed postal-city aggregate. The natural key is `(postcode, postal_city, geo_locality)`; the builder enforces
21
- * a `MIN_COUNT` floor on `n`, so every row is a non-trivial usage.
20
+ * One observed postal-city aggregate.
21
+ *
22
+ * The natural key is `(postcode, postal_city, geo_locality)`; the builder enforces a
23
+ * `MIN_COUNT` floor on `n`, so every row is a non-trivial usage.
22
24
  */
23
25
  export interface PostalCityAliasTable {
24
26
  /**
@@ -57,12 +59,14 @@ export interface PostalCityAliasDatabase {
57
59
  postal_city_alias: PostalCityAliasTable;
58
60
  }
59
61
  /**
60
- * The `postal_city_alias` column order — the builder's INSERT derives its column list from this.
62
+ * The `postal_city_alias` column order — the builder's insert derives its column list from this.
61
63
  */
62
64
  export declare const POSTAL_CITY_ALIAS_COLUMNS: readonly ["postcode", "postal_city", "geo_locality", "n", "divergent", "source", "release"];
63
65
  /**
64
- * Create the `postal_city_alias` table + its two probe indexes. Kept here (not only in the builder) so tests can stand
65
- * up a fixture DB with the exact production shape. Pass a {@link DatabaseClient} (or any `Kysely`) over the alias DB.
66
+ * Create the `postal_city_alias` table + its two probe indexes.
67
+ *
68
+ * Kept here (not only in the builder) so tests can stand up a fixture DB with the exact production shape.
69
+ * Pass a {@link DatabaseClient} (or any `Kysely`) over the alias DB.
66
70
  */
67
71
  export declare function createPostalCityAliasTable(db: Kysely<PostalCityAliasDatabase>): Promise<void>;
68
72
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../lib/postal/city/alias/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,CAAC,EAAE,MAAM,CAAA;IACT;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,iBAAiB,EAAE,oBAAoB,CAAA;CACvC;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,YACrC,UAAU,EACV,aAAa,EACb,cAAc,EACd,GAAG,EACH,WAAW,EACX,QAAQ,EACR,SAAS,CACA,CAAA;AAEV;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnG"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../lib/postal/city/alias/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,CAAC,EAAE,MAAM,CAAA;IACT;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,iBAAiB,EAAE,oBAAoB,CAAA;CACvC;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,YACrC,UAAU,EACV,aAAa,EACb,cAAc,EACd,GAAG,EACH,WAAW,EACX,QAAQ,EACR,SAAS,CACA,CAAA;AAEV;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnG"}
@@ -3,20 +3,20 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Typed schema for the POSTAL-CITY ALIAS table (`postal-city-alias-<cc>.db`, built by
6
+ * Typed schema for the postal-city alias table (`postal-city-alias-<cc>.db`, built by
7
7
  * `scripts/build-postal-city-alias.ts`) — the single source of truth for the columns shared by
8
- * the BUILDER and the READER ({@link WOFPostalCityAliasLookup}). Like {@link CandidateTable}, the
9
- * contract is a Kysely `Database` interface plus the table DDL as a string, so a column rename in
8
+ * the builder and the reader ({@link WOFPostalCityAliasLookup}). Like {@link CandidateTable}, the
9
+ * interface is a Kysely `Database` interface plus the table DDL as a string, so a column rename in
10
10
  * the builder is a compile error in the reader.
11
11
  *
12
- * Provenance discipline (provenance-first): this is a SIBLING table to the PIP-derived
12
+ * Provenance discipline (provenance-first): this is a sibling table to the PIP-derived
13
13
  * `postcode_locality` data, never mixed into it — one table, one provenance class. Each row is an
14
- * OBSERVED `(postcode, postal_city, geo_locality)` aggregate from Overture's `postal_city` field
14
+ * observed `(postcode, postal_city, geo_locality)` aggregate from Overture's `postal_city` field
15
15
  * with a usage count `n`; `divergent = 1` exactly when `postal_city != geo_locality` (the alias
16
16
  * signal — the only rows the resolver consumes).
17
17
  */
18
18
  /**
19
- * The `postal_city_alias` column order — the builder's INSERT derives its column list from this.
19
+ * The `postal_city_alias` column order — the builder's insert derives its column list from this.
20
20
  */
21
21
  export const POSTAL_CITY_ALIAS_COLUMNS = [
22
22
  "postcode",
@@ -28,8 +28,10 @@ export const POSTAL_CITY_ALIAS_COLUMNS = [
28
28
  "release",
29
29
  ];
30
30
  /**
31
- * Create the `postal_city_alias` table + its two probe indexes. Kept here (not only in the builder) so tests can stand
32
- * up a fixture DB with the exact production shape. Pass a {@link DatabaseClient} (or any `Kysely`) over the alias DB.
31
+ * Create the `postal_city_alias` table + its two probe indexes.
32
+ *
33
+ * Kept here (not only in the builder) so tests can stand up a fixture DB with the exact production shape.
34
+ * Pass a {@link DatabaseClient} (or any `Kysely`) over the alias DB.
33
35
  */
34
36
  export async function createPostalCityAliasTable(db) {
35
37
  await db.schema
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../lib/postal/city/alias/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA8CH;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,UAAU;IACV,aAAa;IACb,cAAc;IACd,GAAG;IACH,WAAW;IACX,QAAQ;IACR,SAAS;CACA,CAAA;AAEV;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAAmC;IACnF,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,mBAAmB,CAAC;SAChC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACpD,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7C,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,OAAO,EAAE,CAAA;IAEX,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAA;IACpG,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;AACvH,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../lib/postal/city/alias/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgDH;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,UAAU;IACV,aAAa;IACb,cAAc;IACd,GAAG;IACH,WAAW;IACX,QAAQ;IACR,SAAS;CACA,CAAA;AAEV;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAAmC;IACnF,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,mBAAmB,CAAC;SAChC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACpD,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7C,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,OAAO,EAAE,CAAA;IAEX,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAA;IACpG,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;AACvH,CAAC"}
@@ -3,29 +3,30 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Typed schema for the POSTAL-CITY CANDIDATE side-index (#741 / #475) — a small `(name_key,
7
- * postcode) → geo-locality` table that lives alongside the byte-range `candidate` table so the
8
- * candidate-backend resolver (the demo/CLI default) can do what the FTS coordinate-first scorer
9
- * does: resolve a user-typed POSTAL city ("Antioch", 37013) to the geographic locality the
10
- * postcode sits in ("Nashville").
6
+ * Typed schema for the postal-city candidate side-index, a small `(name_key, postcode)` →
7
+ * geo-locality table alongside the byte-range `candidate` table.
8
+ * The candidate-backend resolver (the demo and CLI default) can then match the FTS coordinate-first scorer.
9
+ * It resolves a user-typed postal city ("Antioch", 37013) to the geographic locality the postcode
10
+ * resolve a user-typed postal city ("Antioch", 37013) to the geographic locality the postcode
11
+ * sits in ("Nashville").
11
12
  *
12
- * Why a SIDE-INDEX, not cloned `candidate` rows: the `candidate` B-tree is keyed `(name_key,
13
- * country_id, region_id, placetype_id, …)` and ranked population-first — it has no postcode
14
- * dimension. A cloned alias row was tested (#741) and falsified: a sentinel rank is
15
- * bare-name-safe but then loses to any in-region homonym, and there is no single rank that is
16
- * both. The fix is an EXACT `(name_key, postcode)` probe that bypasses population/region ranking
17
- * entirely — consulted only when the query carries a postcode, so the common no-postcode path is
18
- * untouched.
13
+ * The `candidate` B-tree is keyed `(name_key, country_id, region_id, placetype_id, …)` and ranked
14
+ * population-first, so it has no postcode dimension. A cloned alias row cannot satisfy both
15
+ * purposes, because a sentinel rank is bare-name-safe and then loses to any in-region homonym.
16
+ * The exact `(name_key, postcode)` probe bypasses population and region ranking entirely.
17
+ * It runs only when the query includes a postcode, leaving the common no-postcode path untouched.
19
18
  */
20
19
  import { type Kysely } from "kysely";
21
20
  import type { NameKey } from "#street/normalize";
22
21
  /**
23
- * One postal-city → geo-locality edge, keyed exactly by `(name_key, postcode)`. The probe returns the geographic
24
- * locality directly; the denormalized name/coord avoid a join back to `candidate`.
22
+ * One postal-city → geo-locality edge, keyed exactly by `(name_key, postcode)`.
23
+ *
24
+ * The probe returns the geographic locality directly.
25
+ * The denormalized name/coord avoid a join back to `candidate`.
25
26
  */
26
27
  export interface PostalCityCandidateTable {
27
28
  /**
28
- * {@link normalizeLocalityForKey} of the postal-city name — the build/query-consistent probe key.
29
+ * {@link normalizeLocalityForKey} of the postal-city name, the build/query-consistent probe key.
29
30
  */
30
31
  name_key: NameKey;
31
32
  /**
@@ -54,13 +55,18 @@ export interface PostalCityCandidateDatabase {
54
55
  */
55
56
  export declare const POSTAL_CITY_CANDIDATE_TABLE = "postal_city_candidate";
56
57
  /**
57
- * Column order for the builder's positional INSERT.
58
+ * Column order for the builder's positional insert.
58
59
  */
59
60
  export declare const POSTAL_CITY_CANDIDATE_COLUMNS: readonly ["name_key", "postcode", "spr_id", "name", "latitude", "longitude"];
60
61
  /**
61
- * Create the side-index — a clustered `WITHOUT ROWID` B-tree on `(name_key, postcode)` so the resolve is a single exact
62
- * probe. Idempotent (`IF NOT EXISTS`); pass a {@link DatabaseClient} (or any `Kysely`) over the candidate DB. The
63
- * Kysely schema-builder is the house idiom for table creation — see `AGENTS.md` (inline-SQL → Kysely).
62
+ * Create the side-index, a clustered `without rowid` B-tree on `(name_key, postcode)`
63
+ * so the resolve is a single exact probe.
64
+ *
65
+ * Idempotent (`if not exists`).
66
+ * Pass a {@link DatabaseClient} (or any `Kysely`) over the candidate DB.
67
+ *
68
+ * The Kysely schema-builder is the house idiom for table creation.
69
+ * See `agents.md` on inline SQL and Kysely.
64
70
  */
65
71
  export declare function createPostalCityCandidateTable(db: Kysely<PostalCityCandidateDatabase>): Promise<void>;
66
72
  //# sourceMappingURL=candidate-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-schema.d.ts","sourceRoot":"","sources":["../../../lib/postal/city/candidate-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACxC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC3C,qBAAqB,EAAE,wBAAwB,CAAA;CAC/C;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,0BAA0B,CAAA;AAElE;;GAEG;AACH,eAAO,MAAM,6BAA6B,YACzC,UAAU,EACV,UAAU,EACV,QAAQ,EACR,MAAM,EACN,UAAU,EACV,WAAW,CACF,CAAA;AAEV;;;;GAIG;AACH,wBAAsB,8BAA8B,CAAC,EAAE,EAAE,MAAM,CAAC,2BAA2B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3G"}
1
+ {"version":3,"file":"candidate-schema.d.ts","sourceRoot":"","sources":["../../../lib/postal/city/candidate-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACxC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC3C,qBAAqB,EAAE,wBAAwB,CAAA;CAC/C;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,0BAA0B,CAAA;AAElE;;GAEG;AACH,eAAO,MAAM,6BAA6B,YACzC,UAAU,EACV,UAAU,EACV,QAAQ,EACR,MAAM,EACN,UAAU,EACV,WAAW,CACF,CAAA;AAEV;;;;;;;;;GASG;AACH,wBAAsB,8BAA8B,CAAC,EAAE,EAAE,MAAM,CAAC,2BAA2B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3G"}
@@ -3,19 +3,18 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Typed schema for the POSTAL-CITY CANDIDATE side-index (#741 / #475) — a small `(name_key,
7
- * postcode) → geo-locality` table that lives alongside the byte-range `candidate` table so the
8
- * candidate-backend resolver (the demo/CLI default) can do what the FTS coordinate-first scorer
9
- * does: resolve a user-typed POSTAL city ("Antioch", 37013) to the geographic locality the
10
- * postcode sits in ("Nashville").
6
+ * Typed schema for the postal-city candidate side-index, a small `(name_key, postcode)` →
7
+ * geo-locality table alongside the byte-range `candidate` table.
8
+ * The candidate-backend resolver (the demo and CLI default) can then match the FTS coordinate-first scorer.
9
+ * It resolves a user-typed postal city ("Antioch", 37013) to the geographic locality the postcode
10
+ * resolve a user-typed postal city ("Antioch", 37013) to the geographic locality the postcode
11
+ * sits in ("Nashville").
11
12
  *
12
- * Why a SIDE-INDEX, not cloned `candidate` rows: the `candidate` B-tree is keyed `(name_key,
13
- * country_id, region_id, placetype_id, …)` and ranked population-first — it has no postcode
14
- * dimension. A cloned alias row was tested (#741) and falsified: a sentinel rank is
15
- * bare-name-safe but then loses to any in-region homonym, and there is no single rank that is
16
- * both. The fix is an EXACT `(name_key, postcode)` probe that bypasses population/region ranking
17
- * entirely — consulted only when the query carries a postcode, so the common no-postcode path is
18
- * untouched.
13
+ * The `candidate` B-tree is keyed `(name_key, country_id, region_id, placetype_id, …)` and ranked
14
+ * population-first, so it has no postcode dimension. A cloned alias row cannot satisfy both
15
+ * purposes, because a sentinel rank is bare-name-safe and then loses to any in-region homonym.
16
+ * The exact `(name_key, postcode)` probe bypasses population and region ranking entirely.
17
+ * It runs only when the query includes a postcode, leaving the common no-postcode path untouched.
19
18
  */
20
19
  import { sql } from "kysely";
21
20
  /**
@@ -23,7 +22,7 @@ import { sql } from "kysely";
23
22
  */
24
23
  export const POSTAL_CITY_CANDIDATE_TABLE = "postal_city_candidate";
25
24
  /**
26
- * Column order for the builder's positional INSERT.
25
+ * Column order for the builder's positional insert.
27
26
  */
28
27
  export const POSTAL_CITY_CANDIDATE_COLUMNS = [
29
28
  "name_key",
@@ -34,9 +33,14 @@ export const POSTAL_CITY_CANDIDATE_COLUMNS = [
34
33
  "longitude",
35
34
  ];
36
35
  /**
37
- * Create the side-index — a clustered `WITHOUT ROWID` B-tree on `(name_key, postcode)` so the resolve is a single exact
38
- * probe. Idempotent (`IF NOT EXISTS`); pass a {@link DatabaseClient} (or any `Kysely`) over the candidate DB. The
39
- * Kysely schema-builder is the house idiom for table creation — see `AGENTS.md` (inline-SQL → Kysely).
36
+ * Create the side-index, a clustered `without rowid` B-tree on `(name_key, postcode)`
37
+ * so the resolve is a single exact probe.
38
+ *
39
+ * Idempotent (`if not exists`).
40
+ * Pass a {@link DatabaseClient} (or any `Kysely`) over the candidate DB.
41
+ *
42
+ * The Kysely schema-builder is the house idiom for table creation.
43
+ * See `agents.md` on inline SQL and Kysely.
40
44
  */
41
45
  export async function createPostalCityCandidateTable(db) {
42
46
  await db.schema
@@ -49,7 +53,7 @@ export async function createPostalCityCandidateTable(db) {
49
53
  .addColumn("latitude", "real", (c) => c.notNull())
50
54
  .addColumn("longitude", "real", (c) => c.notNull())
51
55
  .addPrimaryKeyConstraint("postal_city_candidate_pk", ["name_key", "postcode"])
52
- // `WITHOUT ROWID` has no first-class builder; the raw modifier is the idiomatic fallback.
56
+ // `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
53
57
  .modifyEnd(sql `without rowid`)
54
58
  .execute();
55
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-schema.js","sourceRoot":"","sources":["../../../lib/postal/city/candidate-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;AAoCzC;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,uBAAuB,CAAA;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC5C,UAAU;IACV,UAAU;IACV,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;CACF,CAAA;AAEV;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,EAAuC;IAC3F,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,2BAA2B,CAAC;SACxC,WAAW,EAAE;SACb,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAClD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7C,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,uBAAuB,CAAC,0BAA0B,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9E,0FAA0F;SACzF,SAAS,CAAC,GAAG,CAAA,eAAe,CAAC;SAC7B,OAAO,EAAE,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"candidate-schema.js","sourceRoot":"","sources":["../../../lib/postal/city/candidate-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;AAsCzC;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,uBAAuB,CAAA;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC5C,UAAU;IACV,UAAU;IACV,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;CACF,CAAA;AAEV;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,EAAuC;IAC3F,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,2BAA2B,CAAC;SACxC,WAAW,EAAE;SACb,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAClD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7C,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,uBAAuB,CAAC,0BAA0B,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9E,0FAA0F;SACzF,SAAS,CAAC,GAAG,CAAA,eAAe,CAAC;SAC7B,OAAO,EAAE,CAAA;AACZ,CAAC"}
@@ -6,4 +6,4 @@
6
6
  export * from "#postal/city/alias/lookup";
7
7
  export * from "#postal/city/alias/schema";
8
8
  export * from "#postal/city/candidate-schema";
9
- //# sourceMappingURL=index.d.ts.map
9
+ //# sourceMappingURL=postal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postal.d.ts","sourceRoot":"","sources":["../lib/postal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA"}
@@ -6,4 +6,4 @@
6
6
  export * from "#postal/city/alias/lookup";
7
7
  export * from "#postal/city/alias/schema";
8
8
  export * from "#postal/city/candidate-schema";
9
- //# sourceMappingURL=index.js.map
9
+ //# sourceMappingURL=postal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postal.js","sourceRoot":"","sources":["../lib/postal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA"}
@@ -2,38 +2,20 @@
2
2
  * @copyright Sister Software
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
- *
6
- * SQLite-backed postcode lookup for the postcode anchor (#240). A thin exact-match resolver over
7
- * one or more `postalcode-*.db` extracts (the `spr` schema built by `build-unified-wof --placetypes
8
- * postalcode`, then centroid-backfilled by `scripts/backfill-postcode-centroids.ts`).
9
- *
10
- * This is the production implementation of the `PostcodeResolver` interface consumed by
11
- * `@mailwoman/neural`'s `extractPostcodeAnchors`. It is deliberately dumb: an indexed exact-match
12
- * on the postcode string across every extract, unioned. No FTS, no ranking, no proximity — the
13
- * anchor only needs "does this string exist as a postcode, in which countries, near where". A
14
- * future WASM build swaps this for an FST-backed resolver behind the same `lookup()` interface.
15
- *
16
- * Why multiple extracts instead of the multi-extract `WOFSQLitePlaceLookup`: that resolver routes a
17
- * query to ONE extract by placetype, but every postcode extract shares `placetype='postalcode'`, so a
18
- * single query could only ever hit one country's extract. The anchor needs the union across
19
- * countries to build its country posterior, so it queries each extract directly.
20
5
  */
6
+ import type { PostcodePlace } from "@mailwoman/core/resolver";
7
+ import type { PathBuilderLike } from "path-ts";
21
8
  /**
22
- * A gazetteer hit. `lat`/`lon` of 0 means the postcode is known but has no centroid (no admin parent).
9
+ * Looks up current WOF `postalcode` places by exact name across one or more read-only gazetteer databases.
23
10
  */
24
- export interface PostcodePlace {
25
- country: string;
26
- lat: number;
27
- lon: number;
28
- }
29
11
  export declare class WOFPostcodeLookup {
30
12
  #private;
31
13
  /**
32
- * Open each extract read-only and prepare its exact-match statement.
14
+ * Opens each database read-only and prepares its exact-match statement.
33
15
  */
34
- constructor(dbPaths: readonly string[]);
16
+ constructor(dbPaths: readonly PathBuilderLike[]);
35
17
  /**
36
- * Exact-match the postcode across every extract and union the rows.
18
+ * Returns the union of exact-name matches for `postcode` across every database, without deduplication.
37
19
  */
38
20
  lookup(postcode: string): PostcodePlace[];
39
21
  [Symbol.dispose](): void;
@@ -1 +1 @@
1
- {"version":3,"file":"postcode-point-lookup.d.ts","sourceRoot":"","sources":["../lib/postcode-point-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;CACX;AAKD,qBAAa,iBAAiB;;IAI7B;;OAEG;IACH,YAAY,OAAO,EAAE,SAAS,MAAM,EAAE,EAGrC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAUxC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAIvB;CACD"}
1
+ {"version":3,"file":"postcode-point-lookup.d.ts","sourceRoot":"","sources":["../lib/postcode-point-lookup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAO9C;;GAEG;AACH,qBAAa,iBAAiB;;IAI7B;;OAEG;IACH,YAAY,OAAO,EAAE,SAAS,eAAe,EAAE,EAG9C;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAUxC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAIvB;CACD"}
@@ -2,36 +2,24 @@
2
2
  * @copyright Sister Software
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
- *
6
- * SQLite-backed postcode lookup for the postcode anchor (#240). A thin exact-match resolver over
7
- * one or more `postalcode-*.db` extracts (the `spr` schema built by `build-unified-wof --placetypes
8
- * postalcode`, then centroid-backfilled by `scripts/backfill-postcode-centroids.ts`).
9
- *
10
- * This is the production implementation of the `PostcodeResolver` interface consumed by
11
- * `@mailwoman/neural`'s `extractPostcodeAnchors`. It is deliberately dumb: an indexed exact-match
12
- * on the postcode string across every extract, unioned. No FTS, no ranking, no proximity — the
13
- * anchor only needs "does this string exist as a postcode, in which countries, near where". A
14
- * future WASM build swaps this for an FST-backed resolver behind the same `lookup()` interface.
15
- *
16
- * Why multiple extracts instead of the multi-extract `WOFSQLitePlaceLookup`: that resolver routes a
17
- * query to ONE extract by placetype, but every postcode extract shares `placetype='postalcode'`, so a
18
- * single query could only ever hit one country's extract. The anchor needs the union across
19
- * countries to build its country posterior, so it queries each extract directly.
20
5
  */
21
6
  import { DatabaseClient } from "@mailwoman/sqlite/client";
22
7
  const LOOKUP_SQL = "SELECT country, latitude AS lat, longitude AS lon FROM spr WHERE name = ? AND placetype = 'postalcode' AND is_current != 0";
8
+ /**
9
+ * Looks up current WOF `postalcode` places by exact name across one or more read-only gazetteer databases.
10
+ */
23
11
  export class WOFPostcodeLookup {
24
12
  #dbs;
25
13
  #stmts;
26
14
  /**
27
- * Open each extract read-only and prepare its exact-match statement.
15
+ * Opens each database read-only and prepares its exact-match statement.
28
16
  */
29
17
  constructor(dbPaths) {
30
18
  this.#dbs = dbPaths.map((p) => new DatabaseClient(p, { readOnly: true }));
31
19
  this.#stmts = this.#dbs.map((db) => db.prepare(LOOKUP_SQL));
32
20
  }
33
21
  /**
34
- * Exact-match the postcode across every extract and union the rows.
22
+ * Returns the union of exact-name matches for `postcode` across every database, without deduplication.
35
23
  */
36
24
  lookup(postcode) {
37
25
  const out = [];
@@ -1 +1 @@
1
- {"version":3,"file":"postcode-point-lookup.js","sourceRoot":"","sources":["../lib/postcode-point-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAazD,MAAM,UAAU,GACf,4HAA4H,CAAA;AAE7H,MAAM,OAAO,iBAAiB;IACpB,IAAI,CAA+B;IACnC,MAAM,CAAyC;IAExD;;OAEG;IACH,YAAY,OAA0B;QACrC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,cAAc,CAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACtF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAgB;QACtB,MAAM,GAAG,GAAoB,EAAE,CAAA;QAE/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACvF,CAAC;QACF,CAAC;QAED,OAAO,GAAG,CAAA;IACX,CAAC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC;QACf,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,EAAE,CAAC,OAAO,EAAE,CAAA;QACb,CAAC;IACF,CAAC;CACD"}
1
+ {"version":3,"file":"postcode-point-lookup.js","sourceRoot":"","sources":["../lib/postcode-point-lookup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAKzD,MAAM,UAAU,GACf,4HAA4H,CAAA;AAE7H;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACpB,IAAI,CAA+B;IACnC,MAAM,CAAyC;IAExD;;OAEG;IACH,YAAY,OAAmC;QAC9C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,cAAc,CAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACtF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAgB;QACtB,MAAM,GAAG,GAAoB,EAAE,CAAA;QAE/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACvF,CAAC;QACF,CAAC;QAED,OAAO,GAAG,CAAA;IACX,CAAC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC;QACf,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,EAAE,CAAC,OAAO,EAAE,CAAA;QACb,CAAC;IACF,CAAC;CACD"}