@mailwoman/resolver-wof-sqlite 9.2.0 → 9.3.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 (488) hide show
  1. package/README.md +16 -19
  2. package/lib/address/index.ts +9 -0
  3. package/{address-point-interpolation.ts → lib/address/point-interpolation.ts} +24 -22
  4. package/{address-point-schema.ts → lib/address/point-schema.ts} +18 -4
  5. package/{address-point.ts → lib/address/point.ts} +89 -27
  6. package/{ancestry-backfill.ts → lib/ancestry/backfill.ts} +14 -19
  7. package/{ancestry.ts → lib/ancestry/index.ts} +5 -3
  8. package/{build-candidate.ts → lib/build-candidate.ts} +84 -77
  9. package/{build-slim.ts → lib/build-slim.ts} +150 -165
  10. package/{candidate → lib/candidate}/alias-bags.ts +8 -6
  11. package/{candidate → lib/candidate}/ancestors-sidecar.ts +13 -15
  12. package/{candidate → lib/candidate}/country-display-names.ts +2 -2
  13. package/{candidate/shard-fold.ts → lib/candidate/extract-fold.ts} +26 -25
  14. package/{candidate → lib/candidate}/name-roles.ts +17 -16
  15. package/{candidate → lib/candidate}/own-name.ts +1 -1
  16. package/{candidate → lib/candidate}/place-attrs.ts +3 -3
  17. package/{candidate-ancestors-schema.ts → lib/candidate-ancestors-schema.ts} +4 -4
  18. package/{candidate-fts.ts → lib/candidate-fts.ts} +3 -3
  19. package/{candidate-importance.ts → lib/candidate-importance.ts} +53 -57
  20. package/{candidate-lookup.ts → lib/candidate-lookup.ts} +76 -73
  21. package/{candidate-schema.ts → lib/candidate-schema.ts} +5 -5
  22. package/{candidate-scoring.ts → lib/candidate-scoring.ts} +15 -22
  23. package/{capital-schema.ts → lib/capital-schema.ts} +5 -6
  24. package/{capitals.ts → lib/capitals.ts} +2 -2
  25. package/{coincident-roles.ts → lib/coincident-roles.ts} +8 -11
  26. package/{convention.ts → lib/convention/index.ts} +3 -3
  27. package/{convention-schema.ts → lib/convention/schema.ts} +2 -2
  28. package/{coverage-manifest-schema.ts → lib/coverage-manifest-schema.ts} +9 -10
  29. package/{currency-backfill.ts → lib/currency-backfill.ts} +126 -41
  30. package/lib/env.ts +50 -0
  31. package/{exact-match.ts → lib/exact-match.ts} +23 -14
  32. package/{sharding.ts → lib/extracts.ts} +61 -58
  33. package/{fst-autocomplete.ts → lib/fst/autocomplete.ts} +4 -4
  34. package/{fst-builder.ts → lib/fst/builder.ts} +17 -16
  35. package/{fst-deserialize-web.ts → lib/fst/deserialize-web.ts} +27 -87
  36. package/lib/fst/format.ts +106 -0
  37. package/{fst-freshness.ts → lib/fst/freshness.ts} +41 -74
  38. package/lib/fst/index.ts +14 -0
  39. package/{fst-matcher.ts → lib/fst/matcher.ts} +1 -1
  40. package/{fst-serialize.ts → lib/fst/serialize.ts} +37 -115
  41. package/{fst-types.ts → lib/fst/types.ts} +4 -2
  42. package/{fts.ts → lib/fts/index.ts} +24 -19
  43. package/{fts-query.ts → lib/fts/query.ts} +1 -1
  44. package/{geonames-aliases.ts → lib/geonames/aliases.ts} +13 -13
  45. package/lib/geonames/index.ts +8 -0
  46. package/{geonames-postal.ts → lib/geonames/postal.ts} +14 -13
  47. package/{index.ts → lib/index.ts} +37 -37
  48. package/{interpolation.ts → lib/interpolation.ts} +27 -25
  49. package/{lookup.ts → lib/lookup.ts} +129 -141
  50. package/lib/nsul/index.ts +8 -0
  51. package/lib/nsul/lookup.ts +144 -0
  52. package/lib/nsul/schema.ts +130 -0
  53. package/{place-importance-schema.ts → lib/place-importance-schema.ts} +7 -8
  54. package/lib/poi/index.ts +8 -0
  55. package/{poi-lookup.ts → lib/poi/lookup.ts} +22 -28
  56. package/{poi-schema.ts → lib/poi/schema.ts} +3 -4
  57. package/{postal-city-alias-lookup.ts → lib/postal/city-alias-lookup.ts} +14 -20
  58. package/{postal-city-candidate-schema.ts → lib/postal/city-candidate-schema.ts} +2 -2
  59. package/lib/postal/index.ts +9 -0
  60. package/{postcode-point-lookup.ts → lib/postcode-point-lookup.ts} +17 -15
  61. package/{primary-preference.ts → lib/primary-preference.ts} +29 -10
  62. package/{proximity-rerank.ts → lib/proximity-rerank.ts} +2 -2
  63. package/{ranking-weights.ts → lib/ranking-weights.ts} +30 -4
  64. package/{region-keys.ts → lib/region-keys.ts} +9 -9
  65. package/{reverse.ts → lib/reverse.ts} +34 -46
  66. package/{schema.ts → lib/schema.ts} +10 -0
  67. package/{search-fetch.ts → lib/search-fetch.ts} +29 -28
  68. package/{sqlite-convention-source.ts → lib/sqlite-convention-source.ts} +9 -10
  69. package/{sqlite-utils.ts → lib/sqlite-utils.ts} +14 -18
  70. package/{street-centroid-schema.ts → lib/street/centroid-schema.ts} +5 -5
  71. package/{street-centroid.ts → lib/street/centroid.ts} +14 -21
  72. package/lib/street/index.ts +13 -0
  73. package/{street-morphology-fst-builder.ts → lib/street/morphology-fst-builder.ts} +24 -14
  74. package/{street-morphology-fst-loader.ts → lib/street/morphology-fst-loader.ts} +14 -12
  75. package/{street-name-lookup.ts → lib/street/name-lookup.ts} +14 -30
  76. package/{street-normalize.ts → lib/street/normalize.ts} +44 -19
  77. package/{street-segment-schema.ts → lib/street/segment-schema.ts} +7 -7
  78. package/{types.ts → lib/types.ts} +18 -12
  79. package/{unified-schema.ts → lib/unified-schema.ts} +20 -24
  80. package/lib/uprn/existence.ts +84 -0
  81. package/lib/uprn/index.ts +9 -0
  82. package/{uprn-lookup.ts → lib/uprn/lookup.ts} +14 -18
  83. package/{uprn-schema.ts → lib/uprn/schema.ts} +3 -3
  84. package/lib/weights-overlay-linker.ts +878 -0
  85. package/out/address/index.d.ts +9 -0
  86. package/out/address/index.d.ts.map +1 -0
  87. package/out/address/index.js +9 -0
  88. package/out/address/index.js.map +1 -0
  89. package/out/{address-point-interpolation.d.ts → address/point-interpolation.d.ts} +11 -10
  90. package/out/address/point-interpolation.d.ts.map +1 -0
  91. package/out/{address-point-interpolation.js → address/point-interpolation.js} +18 -18
  92. package/out/address/point-interpolation.js.map +1 -0
  93. package/out/{address-point-schema.d.ts → address/point-schema.d.ts} +16 -6
  94. package/out/address/point-schema.d.ts.map +1 -0
  95. package/out/{address-point-schema.js → address/point-schema.js} +7 -3
  96. package/out/address/point-schema.js.map +1 -0
  97. package/out/{address-point.d.ts → address/point.d.ts} +16 -8
  98. package/out/address/point.d.ts.map +1 -0
  99. package/out/{address-point.js → address/point.js} +71 -20
  100. package/out/address/point.js.map +1 -0
  101. package/out/{ancestry-backfill.d.ts → ancestry/backfill.d.ts} +7 -5
  102. package/out/ancestry/backfill.d.ts.map +1 -0
  103. package/out/{ancestry-backfill.js → ancestry/backfill.js} +12 -16
  104. package/out/ancestry/backfill.js.map +1 -0
  105. package/out/{ancestry.d.ts → ancestry/index.d.ts} +4 -3
  106. package/out/ancestry/index.d.ts.map +1 -0
  107. package/out/{ancestry.js → ancestry/index.js} +3 -2
  108. package/out/ancestry/index.js.map +1 -0
  109. package/out/build-candidate.d.ts +30 -24
  110. package/out/build-candidate.d.ts.map +1 -1
  111. package/out/build-candidate.js +50 -52
  112. package/out/build-candidate.js.map +1 -1
  113. package/out/build-slim.d.ts +4 -4
  114. package/out/build-slim.d.ts.map +1 -1
  115. package/out/build-slim.js +124 -139
  116. package/out/build-slim.js.map +1 -1
  117. package/out/candidate/alias-bags.d.ts +5 -3
  118. package/out/candidate/alias-bags.d.ts.map +1 -1
  119. package/out/candidate/alias-bags.js +2 -2
  120. package/out/candidate/alias-bags.js.map +1 -1
  121. package/out/candidate/ancestors-sidecar.d.ts +9 -10
  122. package/out/candidate/ancestors-sidecar.d.ts.map +1 -1
  123. package/out/candidate/ancestors-sidecar.js +7 -7
  124. package/out/candidate/ancestors-sidecar.js.map +1 -1
  125. package/out/candidate/country-display-names.d.ts +1 -1
  126. package/out/candidate/country-display-names.d.ts.map +1 -1
  127. package/out/candidate/country-display-names.js +1 -1
  128. package/out/candidate/country-display-names.js.map +1 -1
  129. package/out/candidate/extract-fold.d.ts +32 -0
  130. package/out/candidate/extract-fold.d.ts.map +1 -0
  131. package/out/candidate/{shard-fold.js → extract-fold.js} +20 -20
  132. package/out/candidate/extract-fold.js.map +1 -0
  133. package/out/candidate/name-roles.d.ts +13 -11
  134. package/out/candidate/name-roles.d.ts.map +1 -1
  135. package/out/candidate/name-roles.js +11 -10
  136. package/out/candidate/name-roles.js.map +1 -1
  137. package/out/candidate/own-name.d.ts +1 -1
  138. package/out/candidate/own-name.d.ts.map +1 -1
  139. package/out/candidate/own-name.js +1 -1
  140. package/out/candidate/own-name.js.map +1 -1
  141. package/out/candidate/place-attrs.d.ts +3 -3
  142. package/out/candidate/place-attrs.d.ts.map +1 -1
  143. package/out/candidate/place-attrs.js +1 -1
  144. package/out/candidate/place-attrs.js.map +1 -1
  145. package/out/candidate-ancestors-schema.d.ts +4 -4
  146. package/out/candidate-ancestors-schema.d.ts.map +1 -1
  147. package/out/candidate-ancestors-schema.js +2 -2
  148. package/out/candidate-ancestors-schema.js.map +1 -1
  149. package/out/candidate-fts.d.ts +3 -3
  150. package/out/candidate-fts.d.ts.map +1 -1
  151. package/out/candidate-fts.js +1 -1
  152. package/out/candidate-fts.js.map +1 -1
  153. package/out/candidate-importance.d.ts +16 -16
  154. package/out/candidate-importance.d.ts.map +1 -1
  155. package/out/candidate-importance.js +46 -51
  156. package/out/candidate-importance.js.map +1 -1
  157. package/out/candidate-lookup.d.ts +11 -9
  158. package/out/candidate-lookup.d.ts.map +1 -1
  159. package/out/candidate-lookup.js +61 -58
  160. package/out/candidate-lookup.js.map +1 -1
  161. package/out/candidate-schema.d.ts +5 -5
  162. package/out/candidate-schema.d.ts.map +1 -1
  163. package/out/candidate-schema.js.map +1 -1
  164. package/out/candidate-scoring.d.ts +7 -7
  165. package/out/candidate-scoring.d.ts.map +1 -1
  166. package/out/candidate-scoring.js +10 -14
  167. package/out/candidate-scoring.js.map +1 -1
  168. package/out/capital-schema.d.ts +3 -3
  169. package/out/capital-schema.d.ts.map +1 -1
  170. package/out/capital-schema.js +2 -2
  171. package/out/capital-schema.js.map +1 -1
  172. package/out/capitals.d.ts +1 -1
  173. package/out/capitals.d.ts.map +1 -1
  174. package/out/capitals.js +2 -2
  175. package/out/capitals.js.map +1 -1
  176. package/out/coincident-roles.d.ts +6 -5
  177. package/out/coincident-roles.d.ts.map +1 -1
  178. package/out/coincident-roles.js +2 -4
  179. package/out/coincident-roles.js.map +1 -1
  180. package/out/{convention.d.ts → convention/index.d.ts} +4 -4
  181. package/out/convention/index.d.ts.map +1 -0
  182. package/out/{convention.js → convention/index.js} +2 -2
  183. package/out/convention/index.js.map +1 -0
  184. package/out/{convention-schema.d.ts → convention/schema.d.ts} +2 -2
  185. package/out/convention/schema.d.ts.map +1 -0
  186. package/out/{convention-schema.js → convention/schema.js} +3 -3
  187. package/out/convention/schema.js.map +1 -0
  188. package/out/coverage-manifest-schema.d.ts +8 -8
  189. package/out/coverage-manifest-schema.d.ts.map +1 -1
  190. package/out/coverage-manifest-schema.js +4 -4
  191. package/out/coverage-manifest-schema.js.map +1 -1
  192. package/out/currency-backfill.d.ts +51 -7
  193. package/out/currency-backfill.d.ts.map +1 -1
  194. package/out/currency-backfill.js +65 -49
  195. package/out/currency-backfill.js.map +1 -1
  196. package/out/env.d.ts +43 -0
  197. package/out/env.d.ts.map +1 -0
  198. package/out/env.js +48 -0
  199. package/out/env.js.map +1 -0
  200. package/out/exact-match.d.ts +5 -5
  201. package/out/exact-match.d.ts.map +1 -1
  202. package/out/exact-match.js +10 -11
  203. package/out/exact-match.js.map +1 -1
  204. package/out/extracts.d.ts +114 -0
  205. package/out/extracts.d.ts.map +1 -0
  206. package/out/{sharding.js → extracts.js} +38 -38
  207. package/out/extracts.js.map +1 -0
  208. package/out/{fst-autocomplete.d.ts → fst/autocomplete.d.ts} +2 -2
  209. package/out/fst/autocomplete.d.ts.map +1 -0
  210. package/out/{fst-autocomplete.js → fst/autocomplete.js} +3 -3
  211. package/out/fst/autocomplete.js.map +1 -0
  212. package/out/{fst-builder.d.ts → fst/builder.d.ts} +5 -5
  213. package/out/fst/builder.d.ts.map +1 -0
  214. package/out/{fst-builder.js → fst/builder.js} +14 -13
  215. package/out/fst/builder.js.map +1 -0
  216. package/out/{fst-deserialize-web.d.ts → fst/deserialize-web.d.ts} +3 -3
  217. package/out/fst/deserialize-web.d.ts.map +1 -0
  218. package/out/{fst-deserialize-web.js → fst/deserialize-web.js} +10 -74
  219. package/out/fst/deserialize-web.js.map +1 -0
  220. package/out/fst/format.d.ts +80 -0
  221. package/out/fst/format.d.ts.map +1 -0
  222. package/out/fst/format.js +91 -0
  223. package/out/fst/format.js.map +1 -0
  224. package/out/{fst-freshness.d.ts → fst/freshness.d.ts} +10 -13
  225. package/out/fst/freshness.d.ts.map +1 -0
  226. package/out/{fst-freshness.js → fst/freshness.js} +41 -73
  227. package/out/fst/freshness.js.map +1 -0
  228. package/out/fst/index.d.ts +14 -0
  229. package/out/fst/index.d.ts.map +1 -0
  230. package/out/fst/index.js +14 -0
  231. package/out/fst/index.js.map +1 -0
  232. package/out/{fst-matcher.d.ts → fst/matcher.d.ts} +2 -2
  233. package/out/fst/matcher.d.ts.map +1 -0
  234. package/out/{fst-matcher.js → fst/matcher.js} +1 -1
  235. package/out/fst/matcher.js.map +1 -0
  236. package/out/{fst-serialize.d.ts → fst/serialize.d.ts} +5 -10
  237. package/out/fst/serialize.d.ts.map +1 -0
  238. package/out/{fst-serialize.js → fst/serialize.js} +18 -98
  239. package/out/fst/serialize.js.map +1 -0
  240. package/out/{fst-types.d.ts → fst/types.d.ts} +4 -3
  241. package/out/fst/types.d.ts.map +1 -0
  242. package/out/{fst-types.js → fst/types.js} +1 -1
  243. package/out/fst/types.js.map +1 -0
  244. package/out/{fts.d.ts → fts/index.d.ts} +16 -9
  245. package/out/fts/index.d.ts.map +1 -0
  246. package/out/{fts.js → fts/index.js} +16 -11
  247. package/out/fts/index.js.map +1 -0
  248. package/out/{fts-query.d.ts → fts/query.d.ts} +2 -2
  249. package/out/fts/query.d.ts.map +1 -0
  250. package/out/{fts-query.js → fts/query.js} +1 -1
  251. package/out/fts/query.js.map +1 -0
  252. package/out/{geonames-aliases.d.ts → geonames/aliases.d.ts} +8 -6
  253. package/out/geonames/aliases.d.ts.map +1 -0
  254. package/out/{geonames-aliases.js → geonames/aliases.js} +7 -7
  255. package/out/geonames/aliases.js.map +1 -0
  256. package/out/geonames/index.d.ts +8 -0
  257. package/out/geonames/index.d.ts.map +1 -0
  258. package/out/geonames/index.js +8 -0
  259. package/out/geonames/index.js.map +1 -0
  260. package/out/{geonames-postal.d.ts → geonames/postal.d.ts} +10 -8
  261. package/out/geonames/postal.d.ts.map +1 -0
  262. package/out/{geonames-postal.js → geonames/postal.js} +9 -9
  263. package/out/geonames/postal.js.map +1 -0
  264. package/out/index.d.ts +32 -32
  265. package/out/index.d.ts.map +1 -1
  266. package/out/index.js +24 -24
  267. package/out/index.js.map +1 -1
  268. package/out/interpolation.d.ts +10 -9
  269. package/out/interpolation.d.ts.map +1 -1
  270. package/out/interpolation.js +20 -20
  271. package/out/interpolation.js.map +1 -1
  272. package/out/lookup.d.ts +21 -20
  273. package/out/lookup.d.ts.map +1 -1
  274. package/out/lookup.js +102 -112
  275. package/out/lookup.js.map +1 -1
  276. package/out/name-score.d.ts.map +1 -1
  277. package/out/name-score.js.map +1 -1
  278. package/out/nsul/index.d.ts +8 -0
  279. package/out/nsul/index.d.ts.map +1 -0
  280. package/out/nsul/index.js +8 -0
  281. package/out/nsul/index.js.map +1 -0
  282. package/out/nsul/lookup.d.ts +83 -0
  283. package/out/nsul/lookup.d.ts.map +1 -0
  284. package/out/nsul/lookup.js +80 -0
  285. package/out/nsul/lookup.js.map +1 -0
  286. package/out/nsul/schema.d.ts +100 -0
  287. package/out/nsul/schema.d.ts.map +1 -0
  288. package/out/nsul/schema.js +78 -0
  289. package/out/nsul/schema.js.map +1 -0
  290. package/out/place-importance-schema.d.ts +5 -5
  291. package/out/place-importance-schema.d.ts.map +1 -1
  292. package/out/place-importance-schema.js +3 -3
  293. package/out/place-importance-schema.js.map +1 -1
  294. package/out/poi/index.d.ts +8 -0
  295. package/out/poi/index.d.ts.map +1 -0
  296. package/out/poi/index.js +8 -0
  297. package/out/poi/index.js.map +1 -0
  298. package/out/{poi-lookup.d.ts → poi/lookup.d.ts} +8 -10
  299. package/out/poi/lookup.d.ts.map +1 -0
  300. package/out/{poi-lookup.js → poi/lookup.js} +14 -18
  301. package/out/poi/lookup.js.map +1 -0
  302. package/out/{poi-schema.d.ts → poi/schema.d.ts} +4 -4
  303. package/out/poi/schema.d.ts.map +1 -0
  304. package/out/{poi-schema.js → poi/schema.js} +1 -1
  305. package/out/poi/schema.js.map +1 -0
  306. package/out/polygon-schema.d.ts.map +1 -1
  307. package/out/polygon-schema.js.map +1 -1
  308. package/out/{postal-city-alias-lookup.d.ts → postal/city-alias-lookup.d.ts} +6 -5
  309. package/out/postal/city-alias-lookup.d.ts.map +1 -0
  310. package/out/{postal-city-alias-lookup.js → postal/city-alias-lookup.js} +11 -15
  311. package/out/postal/city-alias-lookup.js.map +1 -0
  312. package/out/{postal-city-alias-schema.d.ts → postal/city-alias-schema.d.ts} +1 -1
  313. package/out/{postal-city-alias-schema.d.ts.map → postal/city-alias-schema.d.ts.map} +1 -1
  314. package/out/{postal-city-alias-schema.js → postal/city-alias-schema.js} +1 -1
  315. package/out/{postal-city-alias-schema.js.map → postal/city-alias-schema.js.map} +1 -1
  316. package/out/{postal-city-candidate-schema.d.ts → postal/city-candidate-schema.d.ts} +3 -3
  317. package/out/{postal-city-candidate-schema.d.ts.map → postal/city-candidate-schema.d.ts.map} +1 -1
  318. package/out/{postal-city-candidate-schema.js → postal/city-candidate-schema.js} +2 -2
  319. package/out/{postal-city-candidate-schema.js.map → postal/city-candidate-schema.js.map} +1 -1
  320. package/out/postal/index.d.ts +9 -0
  321. package/out/postal/index.d.ts.map +1 -0
  322. package/out/postal/index.js +9 -0
  323. package/out/postal/index.js.map +1 -0
  324. package/out/postcode-point-lookup.d.ts +10 -10
  325. package/out/postcode-point-lookup.d.ts.map +1 -1
  326. package/out/postcode-point-lookup.js +13 -13
  327. package/out/postcode-point-lookup.js.map +1 -1
  328. package/out/primary-preference.d.ts +13 -5
  329. package/out/primary-preference.d.ts.map +1 -1
  330. package/out/primary-preference.js +16 -8
  331. package/out/primary-preference.js.map +1 -1
  332. package/out/proximity-rerank.d.ts +2 -2
  333. package/out/proximity-rerank.d.ts.map +1 -1
  334. package/out/proximity-rerank.js +2 -2
  335. package/out/proximity-rerank.js.map +1 -1
  336. package/out/ranking-weights.d.ts +15 -3
  337. package/out/ranking-weights.d.ts.map +1 -1
  338. package/out/ranking-weights.js +21 -3
  339. package/out/ranking-weights.js.map +1 -1
  340. package/out/region-keys.d.ts +8 -8
  341. package/out/region-keys.d.ts.map +1 -1
  342. package/out/region-keys.js +9 -9
  343. package/out/region-keys.js.map +1 -1
  344. package/out/reverse.d.ts +6 -6
  345. package/out/reverse.d.ts.map +1 -1
  346. package/out/reverse.js +20 -29
  347. package/out/reverse.js.map +1 -1
  348. package/out/schema.d.ts +9 -0
  349. package/out/schema.d.ts.map +1 -1
  350. package/out/schema.js.map +1 -1
  351. package/out/search-fetch.d.ts +12 -10
  352. package/out/search-fetch.d.ts.map +1 -1
  353. package/out/search-fetch.js +21 -20
  354. package/out/search-fetch.js.map +1 -1
  355. package/out/sqlite-convention-source.d.ts +7 -7
  356. package/out/sqlite-convention-source.d.ts.map +1 -1
  357. package/out/sqlite-convention-source.js +5 -5
  358. package/out/sqlite-convention-source.js.map +1 -1
  359. package/out/sqlite-utils.d.ts +8 -8
  360. package/out/sqlite-utils.d.ts.map +1 -1
  361. package/out/sqlite-utils.js +7 -8
  362. package/out/sqlite-utils.js.map +1 -1
  363. package/out/{street-centroid-schema.d.ts → street/centroid-schema.d.ts} +6 -6
  364. package/out/{street-centroid-schema.d.ts.map → street/centroid-schema.d.ts.map} +1 -1
  365. package/out/{street-centroid-schema.js → street/centroid-schema.js} +5 -5
  366. package/out/{street-centroid-schema.js.map → street/centroid-schema.js.map} +1 -1
  367. package/out/{street-centroid.d.ts → street/centroid.d.ts} +6 -6
  368. package/out/street/centroid.d.ts.map +1 -0
  369. package/out/{street-centroid.js → street/centroid.js} +13 -19
  370. package/out/street/centroid.js.map +1 -0
  371. package/out/street/index.d.ts +13 -0
  372. package/out/street/index.d.ts.map +1 -0
  373. package/out/street/index.js +13 -0
  374. package/out/street/index.js.map +1 -0
  375. package/out/{street-morphology-fst-builder.d.ts → street/morphology-fst-builder.d.ts} +4 -4
  376. package/out/street/morphology-fst-builder.d.ts.map +1 -0
  377. package/out/{street-morphology-fst-builder.js → street/morphology-fst-builder.js} +18 -13
  378. package/out/street/morphology-fst-builder.js.map +1 -0
  379. package/out/{street-morphology-fst-loader.d.ts → street/morphology-fst-loader.d.ts} +5 -5
  380. package/out/street/morphology-fst-loader.d.ts.map +1 -0
  381. package/out/{street-morphology-fst-loader.js → street/morphology-fst-loader.js} +11 -10
  382. package/out/street/morphology-fst-loader.js.map +1 -0
  383. package/out/{street-name-lookup.d.ts → street/name-lookup.d.ts} +4 -7
  384. package/out/street/name-lookup.d.ts.map +1 -0
  385. package/out/{street-name-lookup.js → street/name-lookup.js} +9 -23
  386. package/out/street/name-lookup.js.map +1 -0
  387. package/out/{street-normalize.d.ts → street/normalize.d.ts} +25 -14
  388. package/out/street/normalize.d.ts.map +1 -0
  389. package/out/{street-normalize.js → street/normalize.js} +36 -17
  390. package/out/street/normalize.js.map +1 -0
  391. package/out/{street-segment-schema.d.ts → street/segment-schema.d.ts} +8 -8
  392. package/out/{street-segment-schema.d.ts.map → street/segment-schema.d.ts.map} +1 -1
  393. package/out/{street-segment-schema.js → street/segment-schema.js} +4 -4
  394. package/out/{street-segment-schema.js.map → street/segment-schema.js.map} +1 -1
  395. package/out/types.d.ts +18 -12
  396. package/out/types.d.ts.map +1 -1
  397. package/out/types.js.map +1 -1
  398. package/out/unified-schema.d.ts +5 -4
  399. package/out/unified-schema.d.ts.map +1 -1
  400. package/out/unified-schema.js +15 -18
  401. package/out/unified-schema.js.map +1 -1
  402. package/out/uprn/existence.d.ts +53 -0
  403. package/out/uprn/existence.d.ts.map +1 -0
  404. package/out/uprn/existence.js +61 -0
  405. package/out/uprn/existence.js.map +1 -0
  406. package/out/uprn/index.d.ts +9 -0
  407. package/out/uprn/index.d.ts.map +1 -0
  408. package/out/uprn/index.js +9 -0
  409. package/out/uprn/index.js.map +1 -0
  410. package/out/{uprn-lookup.d.ts → uprn/lookup.d.ts} +4 -4
  411. package/out/uprn/lookup.d.ts.map +1 -0
  412. package/out/{uprn-lookup.js → uprn/lookup.js} +11 -14
  413. package/out/uprn/lookup.js.map +1 -0
  414. package/out/{uprn-schema.d.ts → uprn/schema.d.ts} +4 -4
  415. package/out/uprn/schema.d.ts.map +1 -0
  416. package/out/{uprn-schema.js → uprn/schema.js} +4 -4
  417. package/out/uprn/schema.js.map +1 -0
  418. package/out/weights-overlay-linker.d.ts +184 -26
  419. package/out/weights-overlay-linker.d.ts.map +1 -1
  420. package/out/weights-overlay-linker.js +338 -86
  421. package/out/weights-overlay-linker.js.map +1 -1
  422. package/package.json +465 -269
  423. package/out/address-point-interpolation.d.ts.map +0 -1
  424. package/out/address-point-interpolation.js.map +0 -1
  425. package/out/address-point-schema.d.ts.map +0 -1
  426. package/out/address-point-schema.js.map +0 -1
  427. package/out/address-point.d.ts.map +0 -1
  428. package/out/address-point.js.map +0 -1
  429. package/out/ancestry-backfill.d.ts.map +0 -1
  430. package/out/ancestry-backfill.js.map +0 -1
  431. package/out/ancestry.d.ts.map +0 -1
  432. package/out/ancestry.js.map +0 -1
  433. package/out/candidate/shard-fold.d.ts +0 -31
  434. package/out/candidate/shard-fold.d.ts.map +0 -1
  435. package/out/candidate/shard-fold.js.map +0 -1
  436. package/out/convention-schema.d.ts.map +0 -1
  437. package/out/convention-schema.js.map +0 -1
  438. package/out/convention.d.ts.map +0 -1
  439. package/out/convention.js.map +0 -1
  440. package/out/fst-autocomplete.d.ts.map +0 -1
  441. package/out/fst-autocomplete.js.map +0 -1
  442. package/out/fst-builder.d.ts.map +0 -1
  443. package/out/fst-builder.js.map +0 -1
  444. package/out/fst-deserialize-web.d.ts.map +0 -1
  445. package/out/fst-deserialize-web.js.map +0 -1
  446. package/out/fst-freshness.d.ts.map +0 -1
  447. package/out/fst-freshness.js.map +0 -1
  448. package/out/fst-matcher.d.ts.map +0 -1
  449. package/out/fst-matcher.js.map +0 -1
  450. package/out/fst-serialize.d.ts.map +0 -1
  451. package/out/fst-serialize.js.map +0 -1
  452. package/out/fst-types.d.ts.map +0 -1
  453. package/out/fst-types.js.map +0 -1
  454. package/out/fts-query.d.ts.map +0 -1
  455. package/out/fts-query.js.map +0 -1
  456. package/out/fts.d.ts.map +0 -1
  457. package/out/fts.js.map +0 -1
  458. package/out/geonames-aliases.d.ts.map +0 -1
  459. package/out/geonames-aliases.js.map +0 -1
  460. package/out/geonames-postal.d.ts.map +0 -1
  461. package/out/geonames-postal.js.map +0 -1
  462. package/out/poi-lookup.d.ts.map +0 -1
  463. package/out/poi-lookup.js.map +0 -1
  464. package/out/poi-schema.d.ts.map +0 -1
  465. package/out/poi-schema.js.map +0 -1
  466. package/out/postal-city-alias-lookup.d.ts.map +0 -1
  467. package/out/postal-city-alias-lookup.js.map +0 -1
  468. package/out/sharding.d.ts +0 -114
  469. package/out/sharding.d.ts.map +0 -1
  470. package/out/sharding.js.map +0 -1
  471. package/out/street-centroid.d.ts.map +0 -1
  472. package/out/street-centroid.js.map +0 -1
  473. package/out/street-morphology-fst-builder.d.ts.map +0 -1
  474. package/out/street-morphology-fst-builder.js.map +0 -1
  475. package/out/street-morphology-fst-loader.d.ts.map +0 -1
  476. package/out/street-morphology-fst-loader.js.map +0 -1
  477. package/out/street-name-lookup.d.ts.map +0 -1
  478. package/out/street-name-lookup.js.map +0 -1
  479. package/out/street-normalize.d.ts.map +0 -1
  480. package/out/street-normalize.js.map +0 -1
  481. package/out/uprn-lookup.d.ts.map +0 -1
  482. package/out/uprn-lookup.js.map +0 -1
  483. package/out/uprn-schema.d.ts.map +0 -1
  484. package/out/uprn-schema.js.map +0 -1
  485. package/weights-overlay-linker.ts +0 -377
  486. /package/{name-score.ts → lib/name-score.ts} +0 -0
  487. /package/{polygon-schema.ts → lib/polygon-schema.ts} +0 -0
  488. /package/{postal-city-alias-schema.ts → lib/postal/city-alias-schema.ts} +0 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+
7
+ export * from "#geonames/aliases"
8
+ export * from "#geonames/postal"
@@ -3,15 +3,15 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * #920 — fold GeoNames POSTAL codes into a WOF/unified postcode shard as first-class
6
+ * #920 — fold GeoNames POSTAL codes into a WOF/unified postcode extract as first-class
7
7
  * `postalcode` places, for the countries whose WOF postalcode repos don't exist (the
8
8
  * namesake-tail locales: FI/CZ/SK/SI/DK/NO/HR/PL and any future gap).
9
9
  *
10
10
  * Why: the night-31 taxonomy measured the cross-locale resolve tail as NAMESAKE COLLISION
11
- * (FI 300/1k … PL 75/1k offender rows), and the controlled experiment showed postcode-shard
11
+ * (FI 300/1k … PL 75/1k offender rows), and the controlled experiment showed postcode-extract
12
12
  * coverage alone collapses it (FI 300→1, CZ 131→4): a resolvable postcode node feeds the
13
13
  * resolver's coordinate-first sibling-postcode candidate injection, which binds the locality
14
- * pick to its postcode neighborhood. The machinery already ships; it was coverage-starved.
14
+ * pick to its postcode neighborhood. The implementation already ships; it was coverage-starved.
15
15
  *
16
16
  * Two hard-won laws from the experiment are enforced HERE, in code, not in a runbook:
17
17
  *
@@ -30,16 +30,17 @@
30
30
  * --geonames-postal-countries`, any standalone fold, and the `mailwoman gazetteer` commands
31
31
  * share ONE implementation. GeoNames postal dump = `download.geonames.org/export/zip/<CC>.zip`
32
32
  * → `<CC>.txt` (TSV: country, postcode, place, admin1, code1, admin2, code2, admin3, code3,
33
- * lat, lon, accuracy). License CC BY 4.0 — attribution rides the shard's `meta` provenance and
33
+ * lat, lon, accuracy). License CC BY 4.0 — attribution rides the extract's `meta` provenance and
34
34
  * the model card like the existing GeoNames alias fold.
35
35
  */
36
36
 
37
- import { existsSync } from "node:fs"
38
- import type { DatabaseSync } from "node:sqlite"
39
-
40
- import { join } from "path-ts"
37
+ import { pathExists } from "@mailwoman/core/fs/readers"
38
+ import type { DatabaseClient } from "@mailwoman/sqlite/client"
39
+ import { join, type PathBuilderLike } from "path-ts"
41
40
  import { TSVSpliterator } from "spliterator"
42
41
 
42
+ import type { WOFDatabase } from "#schema"
43
+
43
44
  /**
44
45
  * Column count of a GeoNames postal-code TSV row. Short rows are truncated or blank and are skipped. See the
45
46
  * allCountries.zip readme for the field list.
@@ -77,7 +78,7 @@ export type PostcodePoint = readonly [number, number]
77
78
  *
78
79
  * Distance is squared-Euclidean in DEGREES, not haversine. At the scale a postcode spans, the ranking the two produce
79
80
  * is the same, and this one carries no trig into a per-group inner loop. Ties go to the earliest member, which makes
80
- * the result a pure function of the input order — the property a rebuilt shard's ids depend on.
81
+ * the result a pure function of the input order — the property a rebuilt extract's ids depend on.
81
82
  *
82
83
  * Exported (rather than inlined at each ingest) because it is the second half of the #920 pair: every postcode source
83
84
  * that groups member points — GeoNames postal, OSM `addr:postcode` — owes the same law, and a second hand-rolled copy
@@ -138,9 +139,9 @@ export interface GeonamesPostalIngestResult {
138
139
  * freeze phase).
139
140
  */
140
141
  export async function ingestGeonamesPostal(
141
- db: DatabaseSync,
142
+ db: DatabaseClient<WOFDatabase>,
142
143
  countries: readonly string[],
143
- postalDir: string
144
+ postalDir: PathBuilderLike
144
145
  ): Promise<GeonamesPostalIngestResult> {
145
146
  const sprInsert = db.prepare(
146
147
  `INSERT OR REPLACE INTO spr (id, parent_id, name, placetype, country, latitude, longitude, min_latitude, min_longitude, max_latitude, max_longitude, is_current, is_deprecated, is_ceased, is_superseded, is_superseding, lastmodified) VALUES (?, -1, ?, 'postalcode', ?, ?, ?, ?, ?, ?, ?, 1, 0, 0, 0, 0, 0)`
@@ -159,7 +160,7 @@ export async function ingestGeonamesPostal(
159
160
  const cc = country.toUpperCase()
160
161
  const file = join(postalDir, `${cc}.txt`)
161
162
 
162
- if (!existsSync(file)) {
163
+ if (!(await pathExists(file))) {
163
164
  missing.push(cc)
164
165
 
165
166
  console.error(
@@ -173,7 +174,7 @@ export async function ingestGeonamesPostal(
173
174
  const members = new Map<string, { display: string; pts: Array<[number, number]> }>()
174
175
 
175
176
  // Streamed: a national dump is a caller-supplied size — GB's is 177 MB, and only the caller
176
- // knows which country is next. `header: false` is load-bearing; the GeoNames postal dump is
177
+ // knows which country is next. `header: false` is required; the GeoNames postal dump is
177
178
  // headerless, so row 1 would be consumed as column names and its postcode lost.
178
179
  for await (const cols of TSVSpliterator.fromAsync(file, { header: false })) {
179
180
  if (cols.length < GEONAMES_POSTAL_COLUMNS) continue
@@ -4,7 +4,7 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  */
6
6
 
7
- export type { FindPlaceQuery, GeoBbox, GeoPoint, PlaceCandidate, PlaceLookup, WOFPlacetype } from "./types.ts"
7
+ export type { FindPlaceQuery, GeoBbox, GeoPoint, PlaceCandidate, PlaceLookup, WOFPlacetype } from "#types"
8
8
 
9
9
  export type {
10
10
  AncestorsTable,
@@ -17,9 +17,9 @@ export type {
17
17
  PlaceSearchTable,
18
18
  SprTable,
19
19
  WOFDatabase,
20
- } from "./schema.ts"
20
+ } from "#schema"
21
21
 
22
- export { WOFSQLitePlaceLookup, type RankingWeights, type WOFSQLitePlaceLookupOpts } from "./lookup.ts"
22
+ export { WOFSQLitePlaceLookup, type RankingWeights, type WOFSQLitePlaceLookupOpts } from "#lookup"
23
23
 
24
24
  export {
25
25
  CANDIDATE_ANCESTOR_COLUMNS,
@@ -29,25 +29,25 @@ export {
29
29
  createCandidateIntervalTable,
30
30
  intervalContains,
31
31
  MAX_ANCESTOR_DEPTH,
32
- } from "./candidate-ancestors-schema.ts"
32
+ } from "#candidate-ancestors-schema"
33
33
 
34
34
  export type {
35
35
  CandidateAncestorsDatabase,
36
36
  CandidateAncestorTable,
37
37
  CandidateIntervalTable,
38
38
  IntervalLabel,
39
- } from "./candidate-ancestors-schema.ts"
39
+ } from "#candidate-ancestors-schema"
40
40
 
41
- export { CANDIDATE_FTS_TABLE, createCandidateFTS } from "./candidate-fts.ts"
41
+ export { CANDIDATE_FTS_TABLE, createCandidateFTS } from "#candidate-fts"
42
42
 
43
43
  export {
44
44
  ImportanceIndex,
45
- IMPORTANCE_JOIN_GATE_KM,
45
+ IMPORTANCE_JOIN_RADIUS_KM,
46
46
  type ImportanceIndexStats,
47
47
  loadImportanceIndex,
48
- } from "./candidate-importance.ts"
48
+ } from "#candidate-importance"
49
49
 
50
- export { WOFCandidateTableLookup, type WOFCandidateTableLookupOpts } from "./candidate-lookup.ts"
50
+ export { WOFCandidateTableLookup, type WOFCandidateTableLookupOpts } from "#candidate-lookup"
51
51
 
52
52
  export {
53
53
  COUNTRY_BBOX_TABLE,
@@ -56,38 +56,38 @@ export {
56
56
  createCountryCoverageTable,
57
57
  readGazetteerCoverageManifest,
58
58
  writeGazetteerCoverageManifest,
59
- } from "./coverage-manifest-schema.ts"
59
+ } from "#coverage-manifest-schema"
60
60
 
61
- export type { CountryBBoxTable, CountryCoverageTable, GazetteerCoverageDatabase } from "./coverage-manifest-schema.ts"
62
- export { SQLiteStreetNameLookup, type SQLiteStreetNameLookupOpts } from "./street-name-lookup.ts"
61
+ export type { CountryBBoxTable, CountryCoverageTable, GazetteerCoverageDatabase } from "#coverage-manifest-schema"
62
+ export { SQLiteStreetNameLookup, type SQLiteStreetNameLookupOpts } from "#street/name-lookup"
63
63
 
64
64
  export {
65
65
  GEONAMES_ID_BASE,
66
66
  type GeonamesIngestProgress,
67
67
  ingestGeonamesAliases,
68
68
  purgeGeonamesAliasRange,
69
- } from "./geonames-aliases.ts"
69
+ } from "#geonames/aliases"
70
70
 
71
- export { GEONAMES_POSTAL_ID_BASE } from "./geonames-postal.ts"
71
+ export { GEONAMES_POSTAL_ID_BASE } from "#geonames/postal"
72
72
 
73
- export { ADDRESS_POINT_COLUMNS, createAddressPointIndexes, createAddressPointTable } from "./address-point-schema.ts"
74
- export type { AddressPointDatabase, AddressPointTable } from "./address-point-schema.ts"
73
+ export { ADDRESS_POINT_COLUMNS, createAddressPointIndexes, createAddressPointTable } from "#address/point-schema"
74
+ export type { AddressPointDatabase, AddressPointTable } from "#address/point-schema"
75
75
 
76
76
  export {
77
77
  WOFPostalCityAliasLookup,
78
78
  type PostalCityAlias,
79
79
  type WOFPostalCityAliasLookupOpts,
80
- } from "./postal-city-alias-lookup.ts"
80
+ } from "#postal/city-alias-lookup"
81
81
 
82
- export type { PostalCityAliasDatabase, PostalCityAliasTable } from "./postal-city-alias-schema.ts"
82
+ export type { PostalCityAliasDatabase, PostalCityAliasTable } from "#postal/city-alias-schema"
83
83
 
84
84
  export {
85
85
  POSTAL_CITY_CANDIDATE_COLUMNS,
86
86
  POSTAL_CITY_CANDIDATE_TABLE,
87
87
  createPostalCityCandidateTable,
88
- } from "./postal-city-candidate-schema.ts"
88
+ } from "#postal/city-candidate-schema"
89
89
 
90
- export type { PostalCityCandidateDatabase, PostalCityCandidateTable } from "./postal-city-candidate-schema.ts"
90
+ export type { PostalCityCandidateDatabase, PostalCityCandidateTable } from "#postal/city-candidate-schema"
91
91
 
92
92
  export {
93
93
  ADDRESS_CONVENTION_TABLE,
@@ -101,11 +101,11 @@ export {
101
101
  type ResolvedConvention,
102
102
  type ScoringWeights,
103
103
  type Strategy,
104
- } from "./convention.ts"
104
+ } from "#convention/index"
105
105
 
106
- export { SqliteConventionSource } from "./sqlite-convention-source.ts"
106
+ export { SqliteConventionSource } from "#sqlite-convention-source"
107
107
 
108
- export { WOFPostcodeLookup, type PostcodePlace } from "./postcode-point-lookup.ts"
108
+ export { WOFPostcodeLookup, type PostcodePlace } from "#postcode-point-lookup"
109
109
 
110
110
  export {
111
111
  PLACE_BBOX_TABLE,
@@ -115,9 +115,9 @@ export {
115
115
  placeSearchFTSExists,
116
116
  type BuildPlaceSearchFTSOpts,
117
117
  type BuildPlaceSearchFTSResult,
118
- } from "./fts.ts"
118
+ } from "#fts/index"
119
119
 
120
- export { PLACETYPE_DEPTH, ancestorLineage, placetypeDepth, type AncestorPlaceRow } from "./ancestry.ts"
120
+ export { PLACETYPE_DEPTH, ancestorLineage, placetypeDepth, type AncestorPlaceRow } from "#ancestry/index"
121
121
 
122
122
  export {
123
123
  WOFReverseGeocoder,
@@ -125,31 +125,31 @@ export {
125
125
  type ReverseGeocodeOpts,
126
126
  type ReverseGeocodeResult,
127
127
  type WOFReverseGeocoderOpts,
128
- } from "./reverse.ts"
128
+ } from "#reverse"
129
129
 
130
- export { AddressPointInterpolator } from "./address-point-interpolation.ts"
131
- export { AddressPointSqliteLookup } from "./address-point.ts"
130
+ export { AddressPointInterpolator } from "#address/point-interpolation"
131
+ export { AddressPointSqliteLookup } from "#address/point"
132
132
 
133
133
  export {
134
134
  STREET_CENTROID_COLUMNS,
135
135
  createStreetCentroidIndexes,
136
136
  createStreetCentroidTable,
137
- } from "./street-centroid-schema.ts"
137
+ } from "#street/centroid-schema"
138
138
 
139
- export type { StreetCentroidDatabase, StreetCentroidTable } from "./street-centroid-schema.ts"
140
- export { StreetCentroidSqliteLookup } from "./street-centroid.ts"
139
+ export type { StreetCentroidDatabase, StreetCentroidTable } from "#street/centroid-schema"
140
+ export { StreetCentroidSqliteLookup } from "#street/centroid"
141
141
 
142
142
  export {
143
143
  StreetInterpolator,
144
144
  type InterpolatedHit,
145
145
  type InterpolationMethod,
146
146
  type InterpolationQuery,
147
- } from "./interpolation.ts"
147
+ } from "#interpolation"
148
148
 
149
149
  export {
150
150
  deriveSchemaName,
151
- pickShardForPlacetype,
152
- resolveShards,
153
- type ResolvedShard,
154
- type ShardConfig,
155
- } from "./sharding.ts"
151
+ pickExtractForPlacetype,
152
+ resolveExtracts,
153
+ type ResolvedExtract,
154
+ type ExtractConfig,
155
+ } from "#extracts"
@@ -8,7 +8,7 @@
8
8
  * then linear interpolation along the segment polyline. Design:
9
9
  * `docs/articles/plan/2026-06-11-interpolation-design.md`.
10
10
  *
11
- * Reads the per-state shard built by `scripts/build-interpolation-shard.ts` (`street_segment`: one
11
+ * Reads the per-state extract built by `scripts/build-interpolation-extract.ts` (`street_segment`: one
12
12
  * row per TIGER edge SIDE — independent left/right ranges, ZIPs, parity). Query-side
13
13
  * normalization is THE shared normalizer (`street-normalize.ts`) — identical to build-side, by
14
14
  * construction.
@@ -26,19 +26,19 @@
26
26
  * `AddressPointLookup.find()` to keep that wiring mechanical.
27
27
  */
28
28
 
29
- import { DatabaseSync } from "node:sqlite"
30
-
31
- import { parseJSONStrict } from "@mailwoman/core/objects"
29
+ import { parseJSONStrict } from "@mailwoman/core/json"
32
30
  import type { InterpolationLookup } from "@mailwoman/resolver"
33
31
  import { clampFraction, haversineKm, pointAlong } from "@mailwoman/spatial"
32
+ import { DatabaseClient } from "@mailwoman/sqlite/client"
34
33
 
35
- import { hasTable, prepareAll, type PreparedAll } from "./sqlite-utils.ts"
36
- import { canonicalizeRouteKey, type RouteKey, streetKeyVariants } from "./street-normalize.ts"
34
+ import { hasTable, prepareAll, type PreparedAll } from "#sqlite-utils"
35
+ import { canonicalizeRouteKey, type RouteKey, streetKeyVariants } from "#street/normalize"
36
+ import type { StreetSegmentDatabase } from "#street/segment-schema"
37
37
 
38
38
  /**
39
39
  * How an interpolated answer was computed (#483 Method 2):
40
40
  *
41
- * - `address_point` — bracketed/extrapolated between REAL neighbor points from the #476 shard
41
+ * - `address_point` — bracketed/extrapolated between REAL neighbor points from the #476 extract
42
42
  * (`AddressPointInterpolator`), replacing TIGER's uniform-spacing assumption with occupancy.
43
43
  * - `tiger_range` — linear position within a TIGER segment's theoretical house-number range (`StreetInterpolator`), the
44
44
  * fallback for streets too sparse to bracket.
@@ -166,27 +166,31 @@ function nearestPostcodeGroup(pool: readonly SegmentRow[], near: { lat: number;
166
166
  return winner.rows
167
167
  }
168
168
 
169
- export class StreetInterpolator implements InterpolationLookup {
170
- readonly #db: DatabaseSync
171
- readonly #ownsDB: boolean
169
+ export class StreetInterpolator<
170
+ DB extends StreetSegmentDatabase = StreetSegmentDatabase,
171
+ > implements InterpolationLookup {
172
+ readonly #db: DatabaseClient<DB>
173
+ /**
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.
176
+ */
177
+ readonly #resources = new DisposableStack()
172
178
  readonly #byPostcode:
173
179
  | PreparedAll<[postcode: string, street: RouteKey, minNumber: number, maxNumber: number], SegmentRow>
174
180
  | undefined
175
181
  readonly #byStreet: PreparedAll<[street: RouteKey, minNumber: number, maxNumber: number], SegmentRow> | undefined
176
182
  readonly #radiusCalibration: number | undefined
177
183
 
178
- constructor(opts: { dbPath?: string; database?: DatabaseSync }) {
184
+ constructor(opts: { dbPath?: string; database?: DatabaseClient<DB> }) {
179
185
  if (opts.database) {
180
186
  this.#db = opts.database
181
- this.#ownsDB = false
182
187
  } else if (opts.dbPath) {
183
- this.#db = new DatabaseSync(opts.dbPath, { readOnly: true })
184
- this.#ownsDB = true
188
+ this.#db = this.#resources.use(new DatabaseClient<DB>(opts.dbPath, { readOnly: true }))
185
189
  } else {
186
190
  throw new Error("StreetInterpolator: one of dbPath or database is required")
187
191
  }
188
192
 
189
- // Degrade gracefully on an empty/tableless shard (interrupted build, stray 0-byte file): with no
193
+ // Degrade gracefully on an empty/tableless extract (interrupted build, stray 0-byte file): with no
190
194
  // `street_segment` table this interpolator is a no-op miss, not a crash that loses the state (#568).
191
195
  if (hasTable(this.#db, "street_segment")) {
192
196
  const columns = `from_hn, to_hn, min_hn, max_hn, parity, postcode, geometry, source, release`
@@ -205,9 +209,9 @@ export class StreetInterpolator implements InterpolationLookup {
205
209
  }
206
210
 
207
211
  // #374 doctrine: the conformal radius multiplier is a property of the calibration set the ARTIFACT was
208
- // built against, so it ships in the shard's `interp_calibration` metadata table (street-segment-schema.ts)
212
+ // built against, so it ships in the extract's `interp_calibration` metadata table (street-segment-schema.ts)
209
213
  // and is read here, once, at open time — sync raw `.prepare()` per the sync-by-interface doctrine
210
- // (AGENTS.md). Shards predating the table (the pre-2026-07 fleet) yield `undefined`; callers then fall
214
+ // (AGENTS.md). Extracts predating the table (the pre-2026-07 fleet) yield `undefined`; callers then fall
211
215
  // back to their in-code table, byte-identically.
212
216
  if (hasTable(this.#db, "interp_calibration")) {
213
217
  const row = this.#db.prepare("SELECT radius_multiplier FROM interp_calibration LIMIT 1").get() as
@@ -223,9 +227,9 @@ export class StreetInterpolator implements InterpolationLookup {
223
227
  }
224
228
 
225
229
  /**
226
- * The artifact's own conformal radius multiplier (#374), read from the shard's `interp_calibration` metadata table at
227
- * construction. `undefined` = the shard predates the table (or carries no valid row) — the resolver then applies no
228
- * artifact default and callers may supply a legacy fallback.
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.
229
233
  */
230
234
  get radiusCalibration(): number | undefined {
231
235
  return this.#radiusCalibration
@@ -243,7 +247,7 @@ export class StreetInterpolator implements InterpolationLookup {
243
247
  // Key-variant ladder (see `streetKeyVariants`): the literal key first, then the doubled-type
244
248
  // collapse and the saint↔st register swap. A variant advances the ladder when it produces no
245
249
  // ANSWER, not merely no rows — a wrong-register key can cover the number in far-away towns and
246
- // then fail the ambiguity gate ("saint pauls place" reaches Nassau's rows; the Brooklyn answer
250
+ // then fail the ambiguity check ("saint pauls place" reaches Nassau's rows; the Brooklyn answer
247
251
  // lives under "st pauls place"), and stopping at rows would eclipse the right variant.
248
252
  for (const variant of streetKeyVariants(query.street)) {
249
253
  const streetNorm = canonicalizeRouteKey(variant)
@@ -323,9 +327,7 @@ export class StreetInterpolator implements InterpolationLookup {
323
327
  }
324
328
  }
325
329
 
326
- close(): void {
327
- if (this.#ownsDB) {
328
- this.#db.close()
329
- }
330
+ [Symbol.dispose](): void {
331
+ this.#resources[Symbol.dispose]()
330
332
  }
331
333
  }