@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
@@ -16,17 +16,15 @@ import type { WOFDatabase } from "#schema"
16
16
  import { normalizeLocalityForKey } from "#street/normalize"
17
17
 
18
18
  /**
19
- * Key-count threshold for the gloss anomaly detector (#1730) — the sweep's own boundary: 4,000 places carried >= 50
20
- * keys, and a legitimate famous place at that count (New York, 176 keys) is separated by the PROMINENCE check, never by
21
- * this number alone.
19
+ * Key-count threshold for the gloss anomaly detector.
20
+ *
21
+ * A legitimate famous place is separated by the prominence check rather than this number by itself.
22
22
  */
23
23
  export const GLOSS_KEY_THRESHOLD = 50
24
24
 
25
25
  /**
26
- * Placetypes the gloss detector never flags. A country or region legitimately carries a name in every language — that
27
- * is what an exonym set IS — so key volume discriminates nothing there. The detector's population is the non-admin
28
- * tail, where a place named by a common noun ("Poisson", "Sunday") accumulating 200+ translations is a
29
- * machine-translated gloss set, not fame.
26
+ * Placetypes the gloss detector never flags: a country or region legitimately has a
27
+ * name in every language, so key volume provides no signal there.
30
28
  */
31
29
  export const GLOSS_EXCLUDED_PLACETYPES: ReadonlySet<string> = new Set([
32
30
  "country",
@@ -40,21 +38,11 @@ export const GLOSS_EXCLUDED_PLACETYPES: ReadonlySet<string> = new Set([
40
38
  ])
41
39
 
42
40
  /**
43
- * Pass 3c — the #1730 name-role prototype: two independent detectors over the staged rows, WRITE-ONLY in this
44
- * generation (no ranking consumer; the rank penalty is its own D-rule-conditional step with the `gloss_key` board as
45
- * regression check). Both stamp `is_primary = 0` rows only — a place's canonical name and the `place_abbr` region
46
- * abbreviations are never a gloss or a variant.
47
- *
48
- * - `gloss` is ANOMALY-based, and stamps only the certain core: key volume at/over the threshold + a non-admin placetype
49
- *
50
- * - NO measured prominence (population absent AND importance unmeasured). Provenance cannot separate a gloss from an
51
- * exonym — WOF imported both as `x_preferred` — and prominence is what rescues New York/Paris.
52
- * - `abbr` is PROVENANCE-based — the #936 signal: a WOF `variant` name in one of the country's official languages (or
53
- * English), measured there at a 13× key-collision rate. A source without a `names` table (fixture-scale admin DBs)
54
- * skips this detector loudly.
41
+ * Stamp `name_role` on non-primary rows: `abbr` by provenance, `variant` by
42
+ * own-name verdict, then `gloss` by key-volume anomaly.
55
43
  *
56
- * Returns the stamp counts plus the census the prototype exists to report: how much of the ≥-threshold key tail carries
57
- * any role.
44
+ * @returns The stamp counts plus the census the prototype exists to report:
45
+ * how much of the ≥-threshold key tail has any role.
58
46
  */
59
47
  export function stampNameRoles(ctx: {
60
48
  src: DatabaseClient<WOFDatabase>
@@ -85,7 +73,7 @@ export function stampNameRoles(ctx: {
85
73
 
86
74
  if (GLOSS_EXCLUDED_PLACETYPES.has(ptNameByID.get(a.ptid) ?? "")) continue
87
75
 
88
- if (a.pop > 0 || a.imp != null) continue
76
+ if ((a.pop ?? 0) > 0 || a.imp != null) continue
89
77
  glossSids.push(sid)
90
78
  }
91
79
 
@@ -101,9 +89,8 @@ export function stampNameRoles(ctx: {
101
89
  if (hasSourceNames) {
102
90
  out.exec("BEGIN")
103
91
 
104
- // Two provenance routes into the same stamp: WOF's abbreviation/short name KINDS arrive in the
105
- // LANGUAGE column ('abbr'/'short' — 280 rows, measured 2026-08-18, Toledo's 'TO' among them) and
106
- // qualify by kind alone; everything else qualifies as a variant in an official language.
92
+ // WOF's abbreviation/short name kinds qualify by kind only.
93
+ // Everything else qualifies as a variant in an official language.
107
94
  for (const r of src
108
95
  .prepare("SELECT id, name, language FROM names WHERE privateuse = 'variant' OR language IN ('abbr', 'short')")
109
96
  .iterate()) {
@@ -129,8 +116,7 @@ export function stampNameRoles(ctx: {
129
116
  progress("roles", "source carries no `names` table — abbr detector skipped (gloss still runs)")
130
117
  }
131
118
 
132
- // Stamp order is precedence: the provenance-based abbr first, then the own-name variant verdict,
133
- // then gloss fills what neither claimed.
119
+ // Stamp order is precedence: abbr first, then the own-name variant verdict, then gloss fills what neither claimed.
134
120
  const roleAbbr = Number(
135
121
  out
136
122
  .prepare(
@@ -141,12 +127,8 @@ export function stampNameRoles(ctx: {
141
127
  .run().changes
142
128
  )
143
129
 
144
- // Detect aliases that are the holder's own primary name in another variant.
145
- // orthography — romanization, spacing/diacritic variant, or abbreviation expansion. The verdict
146
- // is per (alias key, primary key) pair, so it runs in JS over the still-unstamped alias rows;
147
- // an uncovered script answers no-verdict and stamps nothing (own-name.ts owns the predicate and
148
- // its measured threshold). Runs BEFORE gloss on purpose: a surface that IS the place's own name
149
- // is not a translation, whatever the key volume says.
130
+ // Runs before gloss so the place's own name remains its source name.
131
+ // An uncovered script answers no-verdict.
150
132
  out.exec(
151
133
  "CREATE TEMP TABLE variant_key (spr_id INTEGER NOT NULL, name_key TEXT NOT NULL, PRIMARY KEY (spr_id, name_key)) WITHOUT ROWID"
152
134
  )
@@ -3,40 +3,36 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * The OWN-NAME VARIANT predicate (#1882): is an alias surface the holder's own primary name in
7
- * another orthography — a romanization (`Брэст` → `brest`), a spacing/diacritic variant
8
- * (`George Town` → `georgetown`), an abbreviation expansion (`St. George's` → `Saint George's`)
9
- * — rather than a different name that merely shares the folded key?
6
+ * The own-name variant predicate: is an alias surface the holder's own primary name in another
7
+ * orthography, whether a romanization (`Брэст` → `brest`), a spacing or diacritic variant
8
+ * (`George Town` → `georgetown`), or an abbreviation expansion (`St. George's` → `Saint George's`)?
9
+ * The alternative is a different name that merely shares the folded key.
10
10
  *
11
- * The comparator is `levenshteinSimilarity`, NOT Jaro-Winkler: JW's common-prefix bonus scores
12
- * the required NEGATIVE case (`chanchun` vs `cancun`, 0.925) above real positives
13
- * (`saint george s` vs `st georges` expanded, 0.914), so no JW threshold separates them.
14
- * Measured on the #1882 census contests, edit similarity separates every case with margin:
11
+ * The comparator is `levenshteinSimilarity`. Jaro-Winkler's common-prefix bonus scores the required
12
+ * negative case (`chanchun` against `cancun`, 0.925) above real positives (`saint george s` against
13
+ * `st georges` expanded, 0.914), so no JW threshold separates them. Edit similarity separates every
14
+ * measured case with margin.
15
15
  *
16
- * - IN: `brest`/`brest` 1.0 · `george town`/`georgetown` 0.909 · `saint george s`/`saint georges`
17
- * 0.929 · `adamovka`/`adamowka` 0.875
18
- * - OUT: `lievin`/`levin` 0.833 (Liévin FR vs Levin NZ — different places with near-identical
19
- * names; the panel's `41 Weraroa Road, Levin` row needs this side) · `chanchun`/`cancun` 0.75 ·
20
- * `augsburg`/`augusta` 0.375 · `west bay`/`west end` 0.625 · `derry`/`londonderry` 0.455
21
- * (Derry/Londonderry is a DUAL NAME, not a variant — its own follow-up on #1882)
22
- *
23
- * An unhandled script (Arabic, Hebrew, CJK — the romanizer covers Cyrillic only) answers NULL,
24
- * never "different name": absence of a verdict must not stamp anything (the meaning-of-zero rule).
25
- * The #1882 census counted 396 demoted Arabic/Hebrew-primary aliases left unclassified by this.
16
+ * An unhandled script (Arabic, Hebrew, CJK, since the romanizer covers Cyrillic only) answers NULL,
17
+ * never "different name". Absence of a verdict must not stamp anything.
26
18
  */
27
19
 
28
20
  import { levenshteinSimilarity } from "@mailwoman/match/comparators"
29
21
 
30
22
  /**
31
- * Edit-similarity floor for the variant verdict. The measured band: nearest admitted pair 0.875
32
- * (`adamovka`/`adamowka`), nearest refused pair 0.833 (`lievin`/`levin`).
23
+ * Edit-similarity floor for the variant verdict.
24
+ *
25
+ * The measured band: nearest admitted pair 0.875 (`adamovka`/`adamowka`),
26
+ * nearest refused pair 0.833 (`lievin`/`levin`).
33
27
  */
34
28
  export const VARIANT_SIMILARITY_MIN = 0.85
35
29
 
36
30
  /**
37
- * BGN/PCGN-flavored Cyrillic romanization, folded to the name-key alphabet. Digraph outputs (zh, kh, ts, ch, sh, shch,
38
- * yu, ya) match the dominant transliteration conventions the gazetteer's Latin aliases actually use; the `w`/`v` and
39
- * `kh`/`h` style variance between systems is what the edit-similarity threshold absorbs.
31
+ * BGN/pcgn-flavored Cyrillic romanization, folded to the name-key alphabet.
32
+ *
33
+ * Digraph outputs (zh, kh, ts, ch, sh, shch, yu, ya) match the dominant transliteration
34
+ * conventions the gazetteer's Latin aliases actually use.
35
+ * The `w`/`v` and `kh`/`h` style variance between systems is what the edit-similarity threshold absorbs.
40
36
  */
41
37
  const CYRILLIC_TO_LATIN: Record<string, string> = {
42
38
  а: "a",
@@ -80,8 +76,10 @@ const CYRILLIC_TO_LATIN: Record<string, string> = {
80
76
  }
81
77
 
82
78
  /**
83
- * Leading-word abbreviations expanded BEFORE comparison, so `st georges` meets `saint george s` inside the edit
84
- * threshold. Whole-word only — `st` inside `stanley` never expands.
79
+ * Leading-word abbreviations expanded before comparison, so `st georges` meets
80
+ * `saint george s` inside the edit threshold.
81
+ *
82
+ * Whole-word only, so `st` inside `stanley` never expands.
85
83
  */
86
84
  const NAME_ABBREVIATIONS: ReadonlyArray<[RegExp, string]> = [
87
85
  [/\bst\b/g, "saint"],
@@ -91,7 +89,7 @@ const NAME_ABBREVIATIONS: ReadonlyArray<[RegExp, string]> = [
91
89
  ]
92
90
 
93
91
  /**
94
- * Expand the whole-word abbreviations above.
92
+ * Expand the whole-word abbreviations above in a name key.
95
93
  */
96
94
  export function expandNameAbbreviations(key: string): string {
97
95
  let out = key
@@ -104,8 +102,10 @@ export function expandNameAbbreviations(key: string): string {
104
102
  }
105
103
 
106
104
  /**
107
- * Romanize a folded name key to the a–z0–9/space alphabet. `null` when characters outside the covered scripts remain —
108
- * an unhandled script is NO VERDICT, not a mismatch.
105
+ * Romanize a folded name key to the a–z0–9/space alphabet.
106
+ *
107
+ * `null` when characters outside the covered scripts remain.
108
+ * An unhandled script is no verdict.
109
109
  */
110
110
  export function romanizeNameKey(key: string): string | null {
111
111
  let out = ""
@@ -124,15 +124,18 @@ export function romanizeNameKey(key: string): string | null {
124
124
  }
125
125
 
126
126
  /**
127
- * Edit similarity between a holder's primary name key and one of its alias keys, both romanized and
128
- * abbreviation-expanded. `null` when either side's script is uncovered.
127
+ * Edit similarity between a holder's primary name key and one of its alias keys,
128
+ * both romanized and abbreviation-expanded.
129
+ *
130
+ * `null` when either side's script is uncovered.
129
131
  */
130
- // repo-health-ignore export-name-affix -- romanizes and expands abbreviations first; `nameSimilarity` compares as given.
132
+ // repo-health-ignore export-name-affix -- romanizes and expands abbreviations first;
133
+ // `nameSimilarity` compares as given.
131
134
  export function ownNameSimilarity(primaryKey: string, aliasKey: string): number | null {
132
135
  const primary = romanizeNameKey(primaryKey)
133
136
  const alias = romanizeNameKey(aliasKey)
134
137
 
135
- if (primary == null || alias == null || !primary || !alias) return null
138
+ if (!primary || !alias || !primary || !alias) return null
136
139
 
137
140
  return levenshteinSimilarity(expandNameAbbreviations(primary), expandNameAbbreviations(alias))
138
141
  }
@@ -4,12 +4,11 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  * @file The per-place record every candidate-staging pass writes its rows from.
6
6
  *
7
- * Pass 1 reduces each current `spr` row to one {@link PlaceAttrs}; every later pass (alias bags,
7
+ * Pass 1 reduces each current `spr` row to one {@link PlaceAttrs}. Every later pass (alias bags,
8
8
  * region abbreviations, country display names, the currency backfill, the extract folds) discovers
9
- * ADDITIONAL name keys for a place already in that map and stages a row against the same record.
10
- * That is what keeps each candidate row denormalized without re-reading the source, and it is why
11
- * a pass needs exactly four things to stage: the key it found, the place, the id the row hangs on,
12
- * and whether the key is the place's canonical name.
9
+ * additional name keys for a place already in that map and stages a row against the same record.
10
+ * That keeps each candidate row denormalized without re-reading the source. A pass therefore needs
11
+ * exactly four values: the key, place, row ID, plus a flag for the place's canonical name.
13
12
  */
14
13
 
15
14
  export interface PlaceAttrs {
@@ -23,22 +22,30 @@ export interface PlaceAttrs {
23
22
  mnLon: number
24
23
  mxLat: number
25
24
  mxLon: number
26
- pop: number
25
+ /**
26
+ * The place's recorded population, or null when the gazetteer never measured one.
27
+ *
28
+ * NULL rather than zero.
29
+ * `place_population` holds no zero, so an absent row is the only way a place has no number.
30
+ * A zero written for those would be an unmeasured count.
31
+ */
32
+ pop: number | null
27
33
  neg: number
28
34
  pkey: string
29
35
  /**
30
- * The place's toponym-fame score, or null when the score source has no measurement for it (#28). A property of the
31
- * PLACE, so it rides {@link StageRow} onto the alias and abbrev rows too — that is how a bare `Moscow` reaches
32
- * Москва's score through the alias row that carries the key.
36
+ * The place's toponym-fame score, or null when the score source has no measurement for it.
37
+ *
38
+ * A property of the place, so it appears on {@link StageRow} and on alias and abbrev rows too.
39
+ * That is how a bare `Moscow` reaches Москва's score through the alias row that includes the key.
33
40
  */
34
41
  imp: number | null
35
42
  }
36
43
 
37
44
  /**
38
- * Stage one candidate row: a normalized name key, the place it belongs to, the source id the row hangs on, and whether
39
- * the key is that place's canonical name (`is_primary`).
45
+ * Stages one candidate row with a normalized name key, place, source ID,
46
+ * plus a canonical-name flag (`is_primary`).
40
47
  *
41
- * `sid` is passed separately rather than read off the place because a extract fold and the alias pass stage rows for
42
- * ids the admin `attrs` map never held.
48
+ * `sid` is passed separately rather than read off the place because an extract fold
49
+ * and the alias pass stage rows for ids the admin `attrs` map never held.
43
50
  */
44
51
  export type StageRow = (k: string, a: PlaceAttrs, sid: number, isPrimary: number) => void
@@ -2,17 +2,6 @@
2
2
  * @copyright Sister Software
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
- *
6
- * Typed schema for the byte-range CANDIDATE gazetteer (`candidate.db`) — the single source of truth
7
- * for the columns shared by the BUILDER ({@link buildCandidateTable}) and the READERS (the Node
8
- * {@link WOFCandidateTableLookup} + the browser `@mailwoman/resolver-wof-wasm/httpvfs/resolver`). Before this module each
9
- * side hand-wrote the column list; a rename in one place broke the other at runtime. Now the
10
- * contract is a Kysely `Database` interface (`new DatabaseClient<CandidateDatabase>(...)` for
11
- * typed inserts) plus the table DDL as strings — so a column change is a compile error on every
12
- * consumer.
13
- *
14
- * `cand_stage` is the transient staging table the builder bulk-loads; `candidate` is the clustered
15
- * `WITHOUT ROWID` B-tree it's materialized into (same columns). The reader queries `candidate`.
16
5
  */
17
6
 
18
7
  import { sql, type Kysely } from "kysely"
@@ -22,9 +11,10 @@ import type { CapitalTable } from "#capital-schema"
22
11
  import type { NameKey } from "#street/normalize"
23
12
 
24
13
  /**
25
- * One candidate row. `name_key` + the four small int keys + `neg_rank` + `spr_id` form the clustered primary key; the
26
- * rest is denormalized so a resolve is one probe (no join to `spr`). Coordinates + bbox + name are nullable at the SQL
27
- * level (a postcode extract row may lack a bbox).
14
+ * One candidate row.
15
+ *
16
+ * `name_key`, four small integer keys, `neg_rank`, and `spr_id` form the clustered primary key.
17
+ * The remaining fields are denormalized so a resolve needs one probe.
28
18
  */
29
19
  export interface CandidateTable {
30
20
  /**
@@ -36,7 +26,7 @@ export interface CandidateTable {
36
26
  */
37
27
  country_id: number
38
28
  /**
39
- * The place's region-tier ancestor id, or 0 (carried for the future region 2-step).
29
+ * The place's region-tier ancestor id, or 0.
40
30
  */
41
31
  region_id: number
42
32
  /**
@@ -44,7 +34,10 @@ export interface CandidateTable {
44
34
  */
45
35
  placetype_id: number
46
36
  /**
47
- * `-log10(population + 1)` — ASC order = highest-population first. 0 for postcodes (no population).
37
+ * `-log10(population + 1)`.
38
+ *
39
+ * The sort uses ascending order to put the highest population first.
40
+ * Postcodes use `0`.
48
41
  */
49
42
  neg_rank: number
50
43
  /**
@@ -64,42 +57,14 @@ export interface CandidateTable {
64
57
  */
65
58
  is_primary: number | null
66
59
  /**
67
- * Blended place importance in [0, 1] — the toponym-fame prior the bare-city-name class is decided on (#28). NULL
68
- * means the score source had no row for this place: UNMEASURED, never "an importance of zero" (meaning-of-zero).
69
- * Constant across every row of one place — primary, alias and abbrev alike — because it is a property of the PLACE,
70
- * not of the name that reached it, which is what lets a bare `Moscow` inherit Москва's score through the alias row.
71
- *
72
- * **THIS IS THE PRE-SPLIT CONFLATION, AND THE NAME SAYS SO.** It is `place_importance.importance` copied verbatim
73
- * from the score source — the bounded blend `place-importance-schema.ts`'s `blendImportance` writes (the
74
- * concordance's encyclopedia-derived channel clamped around a population-derived base); that module calls the column
75
- * DEPRECATED. It is NOT the split `encyclopedic` channel, and the two must not be conflated in a future build:
76
- * writing the split value here instead was measured on 2026-08-10 and makes the ranking key INERT on three of the
77
- * four rows it exists to fix. The reason is coverage, not principle — the encyclopedia-concordance join in
78
- * `admin-global-priority-importance.db` reaches 133,888 of 702,709 scored places and only eleven countries
79
- * (US/FR/GB/DE/IT/ES/NL/JP/CN/KR/TW). CA, AU and RU have ZERO concordance rows, so Whitby CA, Windsor CA and Epping
80
- * AU carry the population fallback and nothing else. Under the strict split those three become unmeasured, the
81
- * consumer's positive-evidence-only rule leaves them exactly where population put them (first), and the famous GB
82
- * bearer can never overtake them. The conflated column is the only one on which every bearer of a name is scored on a
83
- * single comparable scale, which is the precondition for comparing them at all.
84
- *
85
- * So a consumer reads this as "fame, with population standing in where fame was never measured" — the legacy blended
86
- * semantics — and NOT as "this place has an encyclopedia entry of this importance". When the score source grows a
87
- * real `encyclopedic` column for every country, add a SECOND column rather than redefining this one.
60
+ * Blended place importance in [0, 1], NULL when unmeasured (never zero) and copied
61
+ * verbatim from the pre-split score source rather than the split `encyclopedic` channel.
88
62
  */
89
63
  importance: number | null
90
64
  /**
91
- * The NAME'S detected role on this row, or NULL (#1730). Two build-time detectors stamp `is_primary = 0` rows only:
92
- *
93
- * - `'abbr'` — provenance-based: the surface is a WOF `variant` name in one of the place's country's official languages
94
- * (or English) — the #936 signal, measured at a 13× key-collision rate vs preferred names.
95
- * - `'gloss'` — anomaly-based: the row belongs to a place whose key count crosses the gloss threshold with a non-admin
96
- * placetype and NO measured prominence (population absent AND importance unmeasured) — the translation-gloss
97
- * fingerprint (#1730's sweep; `Poisson` → a US fish-name place). Provenance CANNOT separate a gloss from an exonym
98
- * (WOF imported both as `x_preferred`), which is why this detector is an anomaly test and stamps only the certain
99
- * core.
100
- *
101
- * NULL = no role detected. The column is WRITE-ONLY in this build generation: no ranking consumer reads it — a rank
102
- * penalty is its own future, D-rule-conditional step with the `gloss_key` board as regression check.
65
+ * The name's detected role on this row (`'abbr'`, `'gloss'` or `'variant'`),
66
+ * or NULL when no role was detected.
67
+ * The column is write-only in this build generation.
103
68
  */
104
69
  name_role: string | null
105
70
  }
@@ -121,13 +86,12 @@ export interface PlacetypeCodeTable {
121
86
  }
122
87
 
123
88
  /**
124
- * The candidate database schema for `new DatabaseClient<CandidateDatabase>(...)`. Extends the ancestors sidecar
125
- * (`candidate_ancestor` + `candidate_interval` — see candidate-ancestors-schema.ts for the encoding decision), so the
126
- * builder's one typed client covers every table in the artifact.
89
+ * The candidate database schema, extending the ancestors sidecar so one typed
90
+ * client covers every table in the artifact.
127
91
  */
128
92
  export interface CandidateDatabase extends CandidateAncestorsDatabase {
129
93
  /**
130
- * The clustered `WITHOUT ROWID` lookup table the reader probes.
94
+ * The clustered `without rowid` lookup table the reader probes.
131
95
  */
132
96
  candidate: CandidateTable
133
97
  /**
@@ -137,15 +101,16 @@ export interface CandidateDatabase extends CandidateAncestorsDatabase {
137
101
  country_codes: CountryCodeTable
138
102
  placetype_codes: PlacetypeCodeTable
139
103
  /**
140
- * The capital-status reference carried in-artifact (#1880's distribution home) — see capital-schema.ts.
104
+ * The capital-status reference stored in the artifact.
105
+ * See capital-schema.ts.
141
106
  */
142
107
  capital: CapitalTable
143
108
  }
144
109
 
145
110
  /**
146
- * The `candidate`/`cand_stage` columns in clustered-key order. The materialization `INSERT INTO candidate SELECT … FROM
147
- * cand_stage` derives its column list from this, so the two tables can't drift. Keep in sync with
148
- * {@link CandidateTable}.
111
+ * The `candidate`/`cand_stage` columns in clustered-key order, from which the
112
+ * materialization derives its column list.
113
+ * Keep in sync with {@link CandidateTable}.
149
114
  */
150
115
  export const CANDIDATE_COLUMNS = [
151
116
  "name_key",
@@ -163,16 +128,14 @@ export const CANDIDATE_COLUMNS = [
163
128
  "max_lon",
164
129
  "population",
165
130
  "is_primary",
166
- // Appended, never inserted mid-list: the first six entries ARE the clustered primary key, and the
167
- // positional `INSERT INTO cand_stage VALUES (…)` in the builder binds by position.
131
+ // Appended, never inserted mid-list: the positional `insert into cand_stage values (…)` binds by position.
168
132
  "importance",
169
133
  "name_role",
170
134
  ] as const
171
135
 
172
136
  /**
173
- * Create the code dictionaries + the transient staging table — called before the build's load passes. `cand_stage`
174
- * mirrors {@link CandidateTable} but every column is nullable (the loader fills them positionally). Pass a
175
- * {@link DatabaseClient} (or any `Kysely`) over the candidate DB.
137
+ * Create the code dictionaries and the transient staging table; `cand_stage` mirrors
138
+ * {@link CandidateTable} with every column nullable because the loader fills them positionally.
176
139
  */
177
140
  export async function createCandidateStagingTables(db: Kysely<CandidateDatabase>): Promise<void> {
178
141
  await db.schema
@@ -210,8 +173,9 @@ export async function createCandidateStagingTables(db: Kysely<CandidateDatabase>
210
173
  }
211
174
 
212
175
  /**
213
- * Create the clustered `WITHOUT ROWID` lookup table — called after staging, before the VACUUM. The first six columns
214
- * form the clustered primary key (population-ranked via `neg_rank`).
176
+ * Create the clustered `without rowid` lookup table.
177
+ *
178
+ * Its first six columns form the primary key, ranked by population through `neg_rank`.
215
179
  */
216
180
  export async function createCandidateTable(db: Kysely<CandidateDatabase>): Promise<void> {
217
181
  await db.schema
@@ -241,7 +205,7 @@ export async function createCandidateTable(db: Kysely<CandidateDatabase>): Promi
241
205
  "neg_rank",
242
206
  "spr_id",
243
207
  ])
244
- // `WITHOUT ROWID` has no first-class builder; the raw modifier is the idiomatic fallback.
208
+ // `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
245
209
  .modifyEnd(sql`without rowid`)
246
210
  .execute()
247
211
  }