@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
package/lib/name-score.ts CHANGED
@@ -3,13 +3,13 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Soft name matching for locality ranking: case/diacritic folding, padded character trigrams, and the
6
+ * Soft name matching for locality ranking: case/diacritic folding, padded character trigrams and the
7
7
  * trigram-Jaccard score built on them. Shared by the FTS lookup and the candidate-table backend so
8
8
  * both rank the same typo identically — the whole reason this is one module rather than two copies.
9
9
  */
10
10
 
11
11
  /**
12
- * Case-fold + strip diacritics + collapse punctuation — for the coord-first soft name match.
12
+ * Case-fold + strip diacritics + collapse punctuation, for the coord-first soft name match.
13
13
  */
14
14
  export function cfNormalize(s: string): string {
15
15
  return s
@@ -35,11 +35,13 @@ function trigrams(s: string): Set<string> {
35
35
  }
36
36
 
37
37
  /**
38
- * Character-trigram Jaccard ∈ [0,1] — tolerant of the swallowed-leading-char fragments ("auen" vs "plauen") and minor
39
- * misspellings without a heavyweight edit-distance pass. The fuzzy component of {@link softNameScore}, and private to
40
- * this module: the candidate backend scores typos with a WORD-level measure instead, on receipts that falsify trigram
41
- * Jaccard for that job (see `candidate-lookup.ts`'s `FUZZY_FETCH`). A shared name here would assert a parity the two
42
- * backends do not have.
38
+ * Character-trigram Jaccard ∈ [0,1] — tolerant of the swallowed-leading-char fragments
39
+ * ("auen" vs "plauen") and minor misspellings without a heavyweight edit-distance pass.
40
+ *
41
+ * The fuzzy component of {@link softNameScore}, and private to this module:
42
+ * the candidate backend scores typos with a word-level measure instead, on receipts that
43
+ * falsify trigram Jaccard for that job (see `candidate-lookup.ts`'s `FUZZY_FETCH`).
44
+ * A shared name here would assert a parity the two backends do not have.
43
45
  */
44
46
  function trigramJaccard(a: string, b: string): number {
45
47
  const A = trigrams(a)
@@ -3,38 +3,38 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Node reader for `nsul.db` — the GB UPRN → unit-postcode register (`nsul/schema.ts`). Two probes,
6
+ * Node reader for `nsul.db` — the GB uprn → unit-postcode register (`nsul/schema.ts`). Two probes,
7
7
  * both synchronous `.prepare()` hits in the `uprn/lookup.ts` style:
8
8
  *
9
- * - **`postcodeForUPRN(uprn)`**: primary-key hit on the `WITHOUT ROWID` table.
10
- * - **`uprnsForPostcode(postcode)`**: the `pcds_compact` index, answering every UPRN the register
9
+ * - **`postcodeForUPRN(uprn)`**: primary-key hit on the `without rowid` table.
10
+ * - **`uprnsForPostcode(postcode)`**: the `pcds_compact` index, answering every uprn the register
11
11
  * assigns to one unit postcode with the point OS publishes for each — the "assigned points and
12
12
  * their bound" the physical-constraint design record names as the prior's soft structure.
13
13
  *
14
14
  * ## `null` and `[]` are claims, scoped by coverage
15
15
  *
16
- * The register designates GB complete (every UPRN in AddressBase with a Code-Point Open postcode),
16
+ * The register designates GB complete (every uprn in AddressBase with a Code-Point Open postcode),
17
17
  * and the builder writes `layer_coverage` with basis `designated` for every cell the register
18
- * touches. Inside a covered cell an empty answer is evidence of absence: no GB UPRN by that number
19
- * carries a Code-Point postcode, or no UPRN carries that postcode. Two absences the reader cannot
20
- * tell from those are recorded in `nsul_meta` as counts rather than as rows — a UPRN whose `PCDS` is
21
- * null (its postcode is not in Code-Point Open) and one Open UPRN publishes no coordinate for — so a
22
- * caller building negative evidence reads the coverage table and those counts, not this reader
23
- * alone. Outside coverage (Northern Ireland, the Isle of Man, the Channel Islands) the answer is
24
- * UNKNOWN, per the meaning-of-zero rule.
18
+ * touches. Inside a covered cell an empty answer is evidence of absence: no GB uprn by that number
19
+ * has a Code-Point postcode, or no UPRN has that postcode. Two absences the reader cannot
20
+ * tell from those are recorded in `nsul_meta` as counts rather than as rows. A uprn whose `pcds` is
21
+ * null (its postcode is not in Code-Point Open) and one Open uprn publishes no coordinate for — so a
22
+ * caller building negative evidence reads the coverage table and those counts rather than this reader
23
+ * by itself. Outside coverage (Northern Ireland, the Isle of Man, the Channel Islands) the answer is
24
+ * unknown, per the meaning-of-zero rule.
25
25
  */
26
26
 
27
- import { DatabaseClient } from "@mailwoman/sqlite/client"
27
+ import { SQLiteLookup, type SQLiteLookupOptions } from "@mailwoman/sqlite/lookup"
28
28
 
29
29
  import { compactPostcode, type NSULDatabase } from "#nsul/schema"
30
30
  import { prepareAll, prepareGet } from "#sqlite-utils"
31
31
 
32
32
  /**
33
- * The unit postcode the register assigns to a UPRN, in both stored forms.
33
+ * The unit postcode the register assigns to a uprn, in both stored forms.
34
34
  */
35
35
  export interface NSULPostcode {
36
36
  /**
37
- * As NSUL writes it — `RG40 4HR`.
37
+ * As nsul writes it — `RG40 4HR`.
38
38
  */
39
39
  pcds: string
40
40
  /**
@@ -44,7 +44,7 @@ export interface NSULPostcode {
44
44
  }
45
45
 
46
46
  /**
47
- * One UPRN assigned to a unit postcode, with the point `uprn.db` holds for it.
47
+ * One uprn assigned to a unit postcode, with the point `uprn.db` holds for it.
48
48
  */
49
49
  export interface NSULAssignedPoint {
50
50
  uprn: number
@@ -56,16 +56,13 @@ export interface NSULAssignedPoint {
56
56
  h3Cell: number
57
57
  }
58
58
 
59
- export interface NSULLookupOpts {
60
- /**
61
- * Path to a `nsul.db` built by `mailwoman`'s gazetteer pipeline. Opened read-only.
62
- */
63
- databasePath?: string
64
- /**
65
- * Pre-opened handle (tests / shared connections). Mutually exclusive with `databasePath`.
66
- */
67
- database?: DatabaseClient<NSULDatabase>
68
- }
59
+ /**
60
+ * Where an {@link NSULLookup} reads from.
61
+ *
62
+ * The source is a `nsul.db` built by `mailwoman`'s gazetteer pipeline, opened read-only,
63
+ * or a connection the caller already holds.
64
+ */
65
+ export type NSULLookupOpts = SQLiteLookupOptions<NSULDatabase>
69
66
 
70
67
  interface PostcodeRow {
71
68
  pcds: string
@@ -80,43 +77,31 @@ interface PointRow {
80
77
  }
81
78
 
82
79
  /**
83
- * Node reader over `nsul.db`. `implements Disposable` so callers can `using lookup = new NSULLookup(...)` — the same
84
- * precedent as `UPRNLookup`.
80
+ * Node reader over `nsul.db`.
81
+ *
82
+ * Disposable, so callers can `using lookup = new NSULLookup(...)`.
85
83
  */
86
- export class NSULLookup implements Disposable {
87
- #db: DatabaseClient<NSULDatabase>
88
- /**
89
- * Resources this instance opened. A connection handed in by a caller is NOT in here, so disposal cannot reach it —
90
- * ownership is membership rather than a flag a later branch has to check.
91
- */
92
- readonly #resources = new DisposableStack()
93
-
94
- readonly #postcodeProbe: (uprn: number) => PostcodeRow | undefined
84
+ export class NSULLookup extends SQLiteLookup<NSULDatabase> {
85
+ readonly #postcodeProbe: (uprn: number) => PostcodeRow | null
95
86
  readonly #pointsProbe: (pcdsCompact: string) => PointRow[]
96
87
 
97
88
  constructor(opts: NSULLookupOpts) {
98
- if (opts.database) {
99
- this.#db = opts.database
100
- } else if (opts.databasePath) {
101
- this.#db = this.#resources.use(new DatabaseClient<NSULDatabase>(opts.databasePath, { readOnly: true }))
102
- } else {
103
- throw new Error("NSULLookup needs `databasePath` or `database`")
104
- }
89
+ super(opts)
105
90
 
106
91
  this.#postcodeProbe = prepareGet<[number], PostcodeRow, NSULDatabase>(
107
- this.#db,
92
+ this.database,
108
93
  "SELECT pcds, pcds_compact FROM uprn_postcode WHERE uprn = ?"
109
94
  )
110
95
 
111
96
  this.#pointsProbe = prepareAll<[string], PointRow, NSULDatabase>(
112
- this.#db,
97
+ this.database,
113
98
  "SELECT uprn, lat, lon, h3_cell FROM uprn_postcode WHERE pcds_compact = ? ORDER BY uprn"
114
99
  )
115
100
  }
116
101
 
117
102
  /**
118
- * The unit postcode the register assigns to `uprn`, or `null` when the register holds no row for it (see the module
119
- * docstring for what that `null` claims).
103
+ * The unit postcode the register assigns to `uprn`, or `null` when the register holds
104
+ * no row for it (see the module docstring for what that `null` claims).
120
105
  */
121
106
  postcodeForUPRN(uprn: number): NSULPostcode | null {
122
107
  const row = this.#postcodeProbe(uprn)
@@ -125,9 +110,11 @@ export class NSULLookup implements Disposable {
125
110
  }
126
111
 
127
112
  /**
128
- * Every UPRN the register assigns to one unit postcode, with its published point, in ascending UPRN order. The key is
129
- * compacted through {@link compactPostcode} first, so `PO21 1HR` and `PO211HR` answer identically. An empty array is
130
- * the register's answer, scoped as the module docstring says.
113
+ * Every uprn the register assigns to one unit postcode, with its published point, in ascending uprn order.
114
+ *
115
+ * The key is compacted through {@link compactPostcode} first, so `PO21 1HR`
116
+ * and `PO211HR` answer identically.
117
+ * An empty array is the register's answer, scoped as the module docstring describes.
131
118
  */
132
119
  uprnsForPostcode(postcode: string): NSULAssignedPoint[] {
133
120
  return this.#pointsProbe(compactPostcode(postcode)).map((row) => ({
@@ -137,8 +124,4 @@ export class NSULLookup implements Disposable {
137
124
  h3Cell: row.h3_cell,
138
125
  }))
139
126
  }
140
-
141
- [Symbol.dispose](): void {
142
- this.#resources[Symbol.dispose]()
143
- }
144
127
  }
@@ -3,44 +3,21 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Typed schema for `nsul.db` — the GB UPRN → unit-postcode register: the ONS **National Statistics
7
- * UPRN Lookup** (NSUL) joined to the WGS84 point OS Open UPRN publishes for the same UPRN. One row per
8
- * GB UPRN that carries a unit postcode AND has a published coordinate; the postcode is Code-Point
9
- * Open's, so this table and `postcode-gb.bin` agree by construction on the universe of unit postcodes.
10
- *
11
- * ## Why this table exists
12
- *
13
- * Code-Point Open gives one coordinate per unit postcode; Open UPRN gives one coordinate per
14
- * addressable object; neither says which object carries which postcode. NSUL does, as field `PCDS`,
15
- * under OGL-UK-3.0. The `PO`-area measurement that produced this design (recorded on #1975) showed a
16
- * nearest-centroid reconstruction of the register is exact on 69.6% of 531,266 UPRNs and a building
17
- * footprint adds nothing, so the register is stored rather than inferred.
18
- *
19
- * ## Shape
20
- *
21
- * `uprn_postcode` is `WITHOUT ROWID` keyed on the UPRN: small fixed rows, probed by primary key, with
22
- * one secondary index on `pcds_compact`. The postcode is stored twice on purpose — `pcds` exactly as
23
- * NSUL writes it (`RG40 4HR`, one space) and `pcds_compact` with the space removed (`RG404HR`), which
24
- * is the form Code-Point Open's `spr.name` uses, so the two artifacts join on a column rather than an
25
- * expression. `lat`/`lon`/`h3_cell` are COPIED from `uprn.db` at build time by UPRN join — OS's own
26
- * WGS84 columns, never a reprojection of NSUL's `GRIDGB1E`/`GRIDGB1N` — so a coordinate here is
27
- * byte-identical to the one `uprn.db` holds for the same UPRN.
28
- *
29
- * The DB also embeds the layer-contract tables from `@mailwoman/core/layers`; the builder
30
- * (`packages/mailwoman/lib/gazetteer-pipeline/nsul-layer.ts`) writes the manifest and coverage.
6
+ * Typed schema for `nsul.db`, the GB UPRN-to-unit-postcode register.
31
7
  */
32
8
 
33
- import type { LayerContractDatabase } from "@mailwoman/core/layers"
9
+ import type { layerschemadatabase } from "@mailwoman/core/layers"
34
10
  import { sql, type Kysely } from "kysely"
35
11
 
36
12
  /**
37
- * Resolution of the `h3_cell` column — the same res-9 spine `uprn.db` keys on, because the value is copied from it.
13
+ * Resolution of the `h3_cell` column, matching the res-9 spine `uprn.db` keys on
14
+ * because the value is copied from it.
38
15
  */
39
16
  export const NSUL_H3_RESOLUTION = 9
40
17
 
41
18
  /**
42
- * Resolution of the layer's `layer_coverage` cells — coarse, per the contract, and the same as `uprn.db`'s so the two
43
- * layers' coverage tables describe the same cells.
19
+ * Resolution of the layer's `layer_coverage` cells, matching `uprn.db`'s
20
+ * so both coverage tables describe the same cells.
44
21
  */
45
22
  export const NSUL_COVERAGE_H3_RESOLUTION = 6
46
23
 
@@ -49,16 +26,16 @@ export const NSUL_COVERAGE_H3_RESOLUTION = 6
49
26
  */
50
27
  export interface UPRNPostcodeTable {
51
28
  /**
52
- * The Unique Property Reference Number — up to 12 digits, so always within `Number.MAX_SAFE_INTEGER`.
29
+ * The Unique Property Reference Number, up to 12 digits, so always within `Number.MAX_SAFE_INTEGER`.
53
30
  */
54
31
  uprn: number
55
32
  /**
56
- * The unit postcode as NSUL writes it — outward code, one space, inward code (`RG40 4HR`).
33
+ * The unit postcode as nsul writes it: outward code, one space, inward code (`RG40 4HR`).
57
34
  */
58
35
  pcds: string
59
36
  /**
60
- * {@link pcds} with the space removed (`RG404HR`) — the form Code-Point Open's `spr.name` carries, and the column
61
- * `uprnsForPostcode` probes.
37
+ * {@link pcds} with the space removed (`RG404HR`), the form Code-Point Open's
38
+ * `spr.name` contains and `uprnsForPostcode` probes.
62
39
  */
63
40
  pcds_compact: string
64
41
  /**
@@ -76,23 +53,20 @@ export interface UPRNPostcodeTable {
76
53
  }
77
54
 
78
55
  /**
79
- * Build-provenance key/value pairs the fixed `layer_manifest` columns have no room for: the accounting counts, the
80
- * header as found, the per-region row counts, the four attribution lines.
56
+ * Build-provenance key/value pairs the fixed `layer_manifest` columns have no room for.
81
57
  */
82
58
  export interface NSULMetaTable {
83
59
  key: string
84
60
  value: string
85
61
  }
86
62
 
87
- export interface NSULDatabase extends LayerContractDatabase {
63
+ export interface NSULDatabase extends layerschemadatabase {
88
64
  uprn_postcode: UPRNPostcodeTable
89
65
  nsul_meta: NSULMetaTable
90
66
  }
91
67
 
92
68
  /**
93
- * The compact form of a unit postcode: every space removed, upper-cased. `RG40 4HR` → `RG404HR`. The ONE derivation
94
- * both the builder and every consumer share, so a caller holding NSUL's spaced form and one holding Code-Point's
95
- * compact form reach the same key.
69
+ * The compact form of a unit postcode, every space removed and upper-cased.
96
70
  */
97
71
  export function compactPostcode(pcds: string): string {
98
72
  return pcds.replaceAll(/\s+/g, "").toUpperCase()
@@ -120,10 +94,9 @@ export async function createNSULMetaTable(db: Kysely<NSULDatabase>): Promise<voi
120
94
  }
121
95
 
122
96
  /**
123
- * The `pcds_compact` index the `uprnsForPostcode` probe reads. Builders call this AFTER the bulk load
124
- * (index-after-load). There is no index on the spaced `pcds`: it is derivable from `pcds_compact` through
125
- * {@link compactPostcode}, and a second index over 40 million rows would buy nothing a caller cannot get by compacting
126
- * its key first.
97
+ * The `pcds_compact` index the `uprnsForPostcode` probe reads.
98
+ *
99
+ * There is no index on the spaced `pcds` because it is derivable through {@link compactPostcode}.
127
100
  */
128
101
  export async function createNSULIndexes(db: Kysely<NSULDatabase>): Promise<void> {
129
102
  await db.schema.createIndex("uprn_postcode_pcds_compact").on("uprn_postcode").column("pcds_compact").execute()
package/lib/paths.ts ADDED
@@ -0,0 +1,159 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Where the databases this resolver reads live under the data root's `db/` group.
7
+ *
8
+ * Each constant is a lazy path builder: it reads `$MAILWOMAN_DATA_ROOT` when a path is requested,
9
+ * so a later environment change or a test stub is honored.
10
+ * Call it with a filename, as in `wofDatabasePath("admin-global-priority.db")`.
11
+ * A caller holding another data root uses the matching `…DatabaseRoot(dataRoot)` function.
12
+ */
13
+
14
+ import { databaseRootPath, dataRootPath } from "@mailwoman/core/data-root"
15
+ import type { PathBuilder, PathBuilderLike } from "path-ts"
16
+
17
+ /**
18
+ * `<dataRoot>/db/wof`, which holds the admin, candidate and postcode databases.
19
+ */
20
+ export function wofDatabaseRoot(dataRoot: PathBuilderLike): PathBuilder {
21
+ return databaseRootPath(dataRoot)("wof")
22
+ }
23
+
24
+ /**
25
+ * `$MAILWOMAN_DATA_ROOT/db/wof`.
26
+ *
27
+ * @see {@link wofDatabaseRoot} for another data root.
28
+ */
29
+ export const wofDatabasePath: PathBuilder = wofDatabaseRoot(dataRootPath())
30
+
31
+ /**
32
+ * `<dataRoot>/db/address-points`, which holds the national rooftop address-point databases.
33
+ */
34
+ export function addressPointDatabaseRoot(dataRoot: PathBuilderLike): PathBuilder {
35
+ return databaseRootPath(dataRoot)("address-points")
36
+ }
37
+
38
+ /**
39
+ * `$MAILWOMAN_DATA_ROOT/db/address-points`.
40
+ */
41
+ export const addressPointDatabasePath: PathBuilder = addressPointDatabaseRoot(dataRootPath())
42
+
43
+ /**
44
+ * `<dataRoot>/db/interpolation`, which holds the street-segment interpolation databases.
45
+ */
46
+ export function interpolationDatabaseRoot(dataRoot: PathBuilderLike): PathBuilder {
47
+ return databaseRootPath(dataRoot)("interpolation")
48
+ }
49
+
50
+ /**
51
+ * `$MAILWOMAN_DATA_ROOT/db/interpolation`.
52
+ */
53
+ export const interpolationDatabasePath: PathBuilder = interpolationDatabaseRoot(dataRootPath())
54
+
55
+ /**
56
+ * `<dataRoot>/db/poi`, which holds `poi.db` and its per-source builds.
57
+ */
58
+ export function poiDatabaseRoot(dataRoot: PathBuilderLike): PathBuilder {
59
+ return databaseRootPath(dataRoot)("poi")
60
+ }
61
+
62
+ /**
63
+ * `$MAILWOMAN_DATA_ROOT/db/poi`.
64
+ */
65
+ export const poiDatabasePath: PathBuilder = poiDatabaseRoot(dataRootPath())
66
+
67
+ /**
68
+ * `$MAILWOMAN_DATA_ROOT/db/uprn`, which holds the UPRN point database.
69
+ */
70
+ export const uprnDatabasePath: PathBuilder = databaseRootPath(dataRootPath())("uprn")
71
+
72
+ /**
73
+ * `$MAILWOMAN_DATA_ROOT/db/nsul`, which holds the NSUL postcode layer and its source vintages.
74
+ */
75
+ export const nsulDatabasePath: PathBuilder = databaseRootPath(dataRootPath())("nsul")
76
+
77
+ /**
78
+ * Default WOF extracts for FTS when `--wof-db` is not provided.
79
+ *
80
+ * Includes the global admin-priority extract plus postcode extracts.
81
+ * The routing in `pickExtractForPlacetype` sends each postcode query to the
82
+ * extract that claims that country.
83
+ *
84
+ * All paths are under `dataRoot`.
85
+ * It defaults to `$MAILWOMAN_DATA_ROOT`, and callers may pass `--data-root`.
86
+ * Returns a fresh array each call.
87
+ *
88
+ * Callers usually filter with `existsSync`, so missing files are skipped.
89
+ *
90
+ * This runtime list is intentionally smaller than `DEFAULT_POSTCODE_DATABASES`
91
+ * (`mailwoman/gazetteer-pipeline/index.ts`), because these databases are attached live at boot.
92
+ *
93
+ * Notes:
94
+ * - `postalcode-geonames-tail.db` now contains FI/CZ/SK/SI/DK/no/HR/PL/SE.
95
+ * - `postalcode-ni-osm.db` is build-local (ODbL, OSM `addr:postcode`) and may be absent.
96
+ * A missing file is filtered out.
97
+ * This is the only GB-claiming extract in the list.
98
+ * Code-Point Open is absent.
99
+ */
100
+ export function wofExtractPaths(dataRoot: PathBuilderLike = dataRootPath()): string[] {
101
+ return Object.values(wofExtractPathsByName(dataRoot))
102
+ }
103
+
104
+ /**
105
+ * The extract set {@link wofExtractPaths} lists, keyed by role so a caller can
106
+ * name one without indexing a tuple.
107
+ */
108
+ export interface WOFExtractPaths {
109
+ /**
110
+ * The global admin-priority extract, where every admin lookup starts.
111
+ */
112
+ adminGlobalPriority: string
113
+ /**
114
+ * US ZIP codes.
115
+ */
116
+ postalcodeUS: string
117
+ /**
118
+ * The nine-country namesake set FI/CZ/SK/SI/DK/no/HR/PL/SE (see {@link wofExtractPaths}).
119
+ */
120
+ postalcodeGeonamesTail: string
121
+ /**
122
+ * The international postcode extract (FR/DE/ES/IT/NL and the other countries
123
+ * routed here by `pickExtractForPlacetype`).
124
+ */
125
+ postalcodeIntl: string
126
+ /**
127
+ * The NL PC6 full-postcode extract from CBS via pdok (`scripts/build-postalcode-nl-pc6.ts`), the
128
+ * data the lookup's NL PC6 ladder (`"1012 LG"` → joined `"1012LG"` → 4-digit stem) resolves against.
129
+ */
130
+ postalcodeNLPC6: string
131
+ /**
132
+ * Northern Ireland (BT) from OpenStreetMap, 4,757 of 50,032 live NI postcodes (9.5 %).
133
+ *
134
+ * It is the only coverage for the hole Code-Point Open leaves.
135
+ *
136
+ * ODbL, build-local, 2.5 MB.
137
+ * A miss on a BT code means not attested in OSM.
138
+ *
139
+ * An unknown postcode abstains, so the extract is strictly additive.
140
+ * Rebuild: `mailwoman gazetteer build postcode-ni-osm`.
141
+ */
142
+ postalcodeNIOSM: string
143
+ }
144
+
145
+ /**
146
+ * {@link wofExtractPaths} as a record keyed by source, in the same order the runtime attaches them.
147
+ */
148
+ export function wofExtractPathsByName(dataRoot: PathBuilderLike = dataRootPath()): WOFExtractPaths {
149
+ const wof = wofDatabaseRoot(dataRoot)
150
+
151
+ return {
152
+ adminGlobalPriority: wof("admin-global-priority.db").toString(),
153
+ postalcodeUS: wof("postalcode-us.db").toString(),
154
+ postalcodeGeonamesTail: wof("postalcode-geonames-tail.db").toString(),
155
+ postalcodeIntl: wof("postalcode-intl.db").toString(),
156
+ postalcodeNLPC6: wof("postalcode-nl-pc6.db").toString(),
157
+ postalcodeNIOSM: wof("postalcode-ni-osm.db").toString(),
158
+ }
159
+ }