@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,27 +3,7 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * House-number interpolation (#483): when the exact address-point tier (#476, `address-point.ts`)
7
- * misses, estimate the coordinate from TIGER street-segment ranges — parity-aware range match,
8
- * then linear interpolation along the segment polyline. Design:
9
- * `docs/articles/plan/2026-06-11-interpolation-design.md`.
10
- *
11
- * Reads the per-state extract built by `scripts/build-interpolation-extract.ts` (`street_segment`: one
12
- * row per TIGER edge SIDE — independent left/right ranges, ZIPs, parity). Query-side
13
- * normalization is THE shared normalizer (`street-normalize.ts`) — identical to build-side, by
14
- * construction.
15
- *
16
- * Every answer is honest about being an estimate: `interpolated: true`, `parityMatched` (false when
17
- * only the opposite side's range contained the number — usually the right block, wrong side of
18
- * the street), and `uncertaintyM` (half the matched segment's length — the #483 issue's honest
19
- * default). Scoping is postcode-first (a given ZIP that scopes to nothing is a MISS — the
20
- * statewide retry was measured and rejected, see `find()`); without a postcode the statewide name
21
- * match must agree on a single postcode or the lookup ABSTAINS (a common street name spanning
22
- * towns is ambiguity, not an answer).
23
- *
24
- * Standalone in this slice — core tier wiring (`resolution_tier: "interpolated"` after the
25
- * exact-point fall-through) is a noted follow-up on #483, so the `find()` shape mirrors
26
- * `AddressPointLookup.find()` to keep that wiring mechanical.
6
+ * House-number interpolation: when the exact address-point tier misses, estimate the coordinate from tiger street-segment ranges by parity-aware range match and linear interpolation along the segment polyline.
27
7
  */
28
8
 
29
9
  import { parseJSONStrict } from "@mailwoman/core/json"
@@ -36,51 +16,38 @@ import { canonicalizeRouteKey, type RouteKey, streetKeyVariants } from "#street/
36
16
  import type { StreetSegmentDatabase } from "#street/segment-schema"
37
17
 
38
18
  /**
39
- * How an interpolated answer was computed (#483 Method 2):
40
- *
41
- * - `address_point` — bracketed/extrapolated between REAL neighbor points from the #476 extract
42
- * (`AddressPointInterpolator`), replacing TIGER's uniform-spacing assumption with occupancy.
43
- * - `tiger_range` — linear position within a TIGER segment's theoretical house-number range (`StreetInterpolator`), the
44
- * fallback for streets too sparse to bracket.
19
+ * How an interpolated answer was computed, `address_point` for bracketed neighbor points
20
+ * and `tiger_range` for linear position within a tiger segment.
45
21
  */
46
22
  export type InterpolationMethod = "address_point" | "tiger_range"
47
23
 
48
24
  /**
49
- * One interpolated coordinate estimate. Never an exact situs point — see `uncertaintyM`.
25
+ * One interpolated coordinate estimate, never an exact situs point.
50
26
  */
51
27
  export interface InterpolatedHit {
52
28
  lat: number
53
29
  lon: number
54
- /**
55
- * Always true — the tier's honesty flag, mirrored into `resolution_tier` when wired.
56
- */
30
+
57
31
  interpolated: true
58
- /**
59
- * Which rung answered — see {@link InterpolationMethod}.
60
- */
32
+
61
33
  method: InterpolationMethod
62
34
  /**
63
- * `tiger_range` only. True when the matched segment side's parity agrees with the house number (or the side is
64
- * `mixed`). False = opposite-side fallback: usually the right block, wrong side of the street.
35
+ * True when the matched segment side's parity agrees with the house number
36
+ * (or the side is `mixed`); false is an opposite-side fallback.
65
37
  */
66
- parityMatched?: boolean
38
+ parityMatched: boolean | null
67
39
  /**
68
- * `address_point` only. `both` = the query number sits between two known neighbor numbers; `single` = neighbors exist
69
- * on one side only (extrapolated, larger `uncertaintyM`).
40
+ * `both` sits between two known neighbor numbers; `single` is extrapolated from one side only.
70
41
  */
71
- bracket?: "both" | "single"
42
+ bracket: "both" | "single" | null
72
43
  /**
73
- * Honest uncertainty radius in meters: half the matched segment's polyline length (`tiger_range`), half the bracket
74
- * span (`address_point`/`both`), or the explicitly larger extrapolation penalty (`address_point`/`single`).
44
+ * Uncertainty radius in meters: half the matched segment length for `tiger_range`, half the
45
+ * bracket span for `address_point`/`both`, or a larger extrapolation penalty for `single`.
75
46
  */
76
47
  uncertaintyM: number
77
- /**
78
- * Provenance, e.g. `"tiger:edges"`.
79
- */
48
+
80
49
  source: string
81
- /**
82
- * Pinned data vintage, e.g. `"TIGER2023"`.
83
- */
50
+
84
51
  release: string
85
52
  }
86
53
 
@@ -88,28 +55,23 @@ export interface InterpolationQuery {
88
55
  street: string
89
56
  number: string
90
57
  /**
91
- * ZIP scope — strongly preferred; without it common street names abstain (see module doc).
58
+ * ZIP scope.
59
+ * Without it common street names abstain.
92
60
  */
93
61
  postcode?: string
94
62
  /**
95
- * The resolved locality's coordinate — the tie-breaker when no postcode was given and the parity-preferred covering
96
- * ranges still span several postcodes. See {@link NEAR_MAX_KM} for the acceptance geometry.
63
+ * The resolved locality's coordinate, tie-breaking when no postcode was given
64
+ * and several postcodes survive parity.
97
65
  */
98
66
  near?: { lat: number; lon: number }
99
67
  }
100
68
 
101
69
  /**
102
- * Acceptance geometry for the `near` tie-break: the winning postcode group's closest segment must sit within this many
103
- * kilometres of `near`, AND the runner-up group must be at least {@link NEAR_DOMINANCE} times farther. Both measured on
104
- * the two live failures: Brooklyn's `st pauls place` 11226 segment is ~2 km from the Brooklyn centroid with Great
105
- * Neck's 11021 at ~24 km (12×); Fraser's `east 13 mile road` 48026 is ~2 km with Mecosta's namesake ~190 km away. A
106
- * near-tie between groups is genuine ambiguity and stays an abstention.
70
+ * Acceptance geometry for the `near` tie-break: the winning group must be within this
71
+ * many kilometers and the runner-up at least {@link NEAR_DOMINANCE} times farther.
107
72
  */
108
73
  const NEAR_MAX_KM = 25
109
74
 
110
- /**
111
- * See {@link NEAR_MAX_KM}.
112
- */
113
75
  const NEAR_DOMINANCE = 2
114
76
 
115
77
  interface SegmentRow {
@@ -125,9 +87,7 @@ interface SegmentRow {
125
87
  }
126
88
 
127
89
  /**
128
- * The postcode group nearest `near`, under the {@link NEAR_MAX_KM} dominance geometry — or null when no group qualifies
129
- * (out of range, or the runner-up is too close to call). A group's distance is its closest segment's first polyline
130
- * vertex; a segment whose geometry fails to parse prices as unreachable rather than aborting the tie-break.
90
+ * The postcode group nearest `near`, or null when no group qualifies within the dominance geometry.
131
91
  */
132
92
  function nearestPostcodeGroup(pool: readonly SegmentRow[], near: { lat: number; lon: number }): SegmentRow[] | null {
133
93
  const groups = new Map<string, { rows: SegmentRow[]; km: number }>()
@@ -171,27 +131,29 @@ export class StreetInterpolator<
171
131
  > implements InterpolationLookup {
172
132
  readonly #db: DatabaseClient<DB>
173
133
  /**
174
- * Resources this instance opened. A connection handed in by a caller is NOT in here, so disposal cannot reach it —
175
- * ownership is membership rather than a flag a later branch has to check.
134
+ * Resources this instance opened.
135
+ *
136
+ * A caller-supplied connection is not in here, so disposal cannot reach it.
176
137
  */
177
- readonly #resources = new DisposableStack()
138
+ readonly #resources: DisposableStack
178
139
  readonly #byPostcode:
179
140
  | PreparedAll<[postcode: string, street: RouteKey, minNumber: number, maxNumber: number], SegmentRow>
180
141
  | undefined
181
142
  readonly #byStreet: PreparedAll<[street: RouteKey, minNumber: number, maxNumber: number], SegmentRow> | undefined
182
- readonly #radiusCalibration: number | undefined
143
+ readonly #radiusCalibration: number | null = null
183
144
 
184
145
  constructor(opts: { dbPath?: string; database?: DatabaseClient<DB> }) {
146
+ using resources = new DisposableStack()
147
+
185
148
  if (opts.database) {
186
149
  this.#db = opts.database
187
150
  } else if (opts.dbPath) {
188
- this.#db = this.#resources.use(new DatabaseClient<DB>(opts.dbPath, { readOnly: true }))
151
+ this.#db = resources.use(new DatabaseClient<DB>(opts.dbPath, { readOnly: true }))
189
152
  } else {
190
153
  throw new Error("StreetInterpolator: one of dbPath or database is required")
191
154
  }
192
155
 
193
- // Degrade gracefully on an empty/tableless extract (interrupted build, stray 0-byte file): with no
194
- // `street_segment` table this interpolator is a no-op miss, not a crash that loses the state (#568).
156
+ // A tableless extract degrades to a no-op miss rather than a crash.
195
157
  if (hasTable(this.#db, "street_segment")) {
196
158
  const columns = `from_hn, to_hn, min_hn, max_hn, parity, postcode, geometry, source, release`
197
159
 
@@ -208,11 +170,9 @@ export class StreetInterpolator<
208
170
  )
209
171
  }
210
172
 
211
- // #374 doctrine: the conformal radius multiplier is a property of the calibration set the ARTIFACT was
212
- // built against, so it ships in the extract's `interp_calibration` metadata table (street-segment-schema.ts)
213
- // and is read here, once, at open time — sync raw `.prepare()` per the sync-by-interface doctrine
214
- // (AGENTS.md). Extracts predating the table (the pre-2026-07 fleet) yield `undefined`; callers then fall
215
- // back to their in-code table, byte-identically.
173
+ // The conformal radius multiplier ships in the extract's `interp_calibration` table
174
+ // and is read once at open time.
175
+ // Extracts without that table leave it null.
216
176
  if (hasTable(this.#db, "interp_calibration")) {
217
177
  const row = this.#db.prepare("SELECT radius_multiplier FROM interp_calibration LIMIT 1").get() as
218
178
  | { radius_multiplier: unknown }
@@ -224,14 +184,15 @@ export class StreetInterpolator<
224
184
  this.#radiusCalibration = value
225
185
  }
226
186
  }
187
+
188
+ this.#resources = resources.move()
227
189
  }
228
190
 
229
191
  /**
230
- * The artifact's own conformal radius multiplier (#374), read from the extract's `interp_calibration` metadata table
231
- * at construction. `undefined` = the extract predates the table (or carries no valid row) — the resolver then applies
232
- * no artifact default and callers may supply a legacy fallback.
192
+ * The artifact's own conformal radius multiplier, read from the extract at construction;
193
+ * `null` when the extract predates the table or contains no valid row.
233
194
  */
234
- get radiusCalibration(): number | undefined {
195
+ get radiusCalibration(): number | null {
235
196
  return this.#radiusCalibration
236
197
  }
237
198
 
@@ -239,22 +200,16 @@ export class StreetInterpolator<
239
200
  if (!this.#byPostcode || !this.#byStreet) return null
240
201
  const numberRaw = query.number.trim()
241
202
 
242
- // Strictly-numeric house numbers only — this tier estimates, it doesn't guess at
243
- // hyphenated/alphanumeric schemes the ranges don't model.
203
+ // Strictly-numeric house numbers only.
204
+ // The ranges do not model hyphenated or alphanumeric schemes.
244
205
  if (!/^\d+$/.test(numberRaw)) return null
245
206
  const n = Number(numberRaw)
246
207
 
247
- // Key-variant ladder (see `streetKeyVariants`): the literal key first, then the doubled-type
248
- // collapse and the saint↔st register swap. A variant advances the ladder when it produces no
249
- // ANSWER, not merely no rows — a wrong-register key can cover the number in far-away towns and
250
- // then fail the ambiguity check ("saint pauls place" reaches Nassau's rows; the Brooklyn answer
251
- // lives under "st pauls place"), and stopping at rows would eclipse the right variant.
208
+ // A variant advances the ladder when it produces no answer rather than merely no rows.
252
209
  for (const variant of streetKeyVariants(query.street)) {
253
210
  const streetNorm = canonicalizeRouteKey(variant)
254
211
 
255
- // A given ZIP that scopes to nothing is a MISS, not a statewide guess: the retry was
256
- // measured (2026-06-11 VT eval) at +2.3pp coverage for a poisoned tail (p99 1.0 → 20.8
257
- // km, max 204 km — a unique name statewide can live in a far-away town).
212
+ // A ZIP that scopes to no candidate is a miss rather than a statewide guess.
258
213
  const rows = query.postcode
259
214
  ? this.#byPostcode(query.postcode.trim(), streetNorm, n, n)
260
215
  : this.#byStreet(streetNorm, n, n)
@@ -268,14 +223,12 @@ export class StreetInterpolator<
268
223
  }
269
224
 
270
225
  /**
271
- * Resolve one key variant's covering rows to an answer, or null when they cannot honestly give one — the
272
- * parity/ambiguity/tightest-range pipeline the module doc describes.
226
+ * Resolve one key variant's covering rows to an answer, or null when they cannot give one honestly.
273
227
  */
274
228
  #answerFromRows(rows: SegmentRow[], n: number, query: InterpolationQuery): InterpolatedHit | null {
275
229
  if (!rows.length) return null
276
230
 
277
- // Parity preference: exact side first, then 'mixed' (matches either), then the
278
- // opposite side as a flagged fallback.
231
+ // Parity preference: exact side first, then `mixed`, then the opposite side as a flagged fallback.
279
232
  const wantOdd = n % 2 === 1
280
233
  const exact = rows.filter((r) => r.parity === (wantOdd ? "odd" : "even"))
281
234
  const mixed = rows.filter((r) => r.parity === "mixed")
@@ -283,13 +236,8 @@ export class StreetInterpolator<
283
236
  let pool = preferred.length ? preferred : rows
284
237
  const parityMatched = preferred.length > 0
285
238
 
286
- // No scope given: the covering ranges must agree on ONE postcode or the lookup abstains — a
287
- // name spanning towns is ambiguity, not an answer. Counted over the PARITY pool, not all
288
- // rows: a section-line boundary road carries a different ZIP per side ("east 13 mile road"
289
- // is Fraser 48026 odd / Roseville 48066 even), and the opposite side can never hold the
290
- // number it would otherwise veto. When several postcodes survive parity, the caller's
291
- // resolved-locality coordinate breaks the tie by segment proximity under the dominance
292
- // geometry of {@link NEAR_MAX_KM} — a near-tie stays an abstention.
239
+ // Without a postcode the covering ranges must agree on one postcode
240
+ // or the lookup abstains, counted over the parity pool.
293
241
  if (!query.postcode) {
294
242
  const postcodes = new Set(pool.map((r) => r.postcode ?? ""))
295
243
 
@@ -301,7 +249,6 @@ export class StreetInterpolator<
301
249
  }
302
250
  }
303
251
 
304
- // Tightest range wins — the most specific claim about where this number lives.
305
252
  let best = pool[0]!
306
253
 
307
254
  for (const candidate of pool) {
@@ -321,6 +268,7 @@ export class StreetInterpolator<
321
268
  interpolated: true,
322
269
  method: "tiger_range",
323
270
  parityMatched,
271
+ bracket: null,
324
272
  uncertaintyM: Math.round((lengthKm * 1000) / 2),
325
273
  source: best.source,
326
274
  release: best.release,