@mailwoman/corpus 8.0.0 → 8.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 (483) hide show
  1. package/out/src/adapter.d.ts +15 -5
  2. package/out/src/adapter.d.ts.map +1 -1
  3. package/out/src/adapter.js +11 -9
  4. package/out/src/adapter.js.map +1 -1
  5. package/out/src/adapters/ban/adapter.d.ts +7 -0
  6. package/out/src/adapters/ban/adapter.d.ts.map +1 -1
  7. package/out/src/adapters/ban/adapter.js +9 -2
  8. package/out/src/adapters/ban/adapter.js.map +1 -1
  9. package/out/src/adapters/ban/street-decompose.d.ts.map +1 -1
  10. package/out/src/adapters/ban/street-decompose.js +5 -1
  11. package/out/src/adapters/ban/street-decompose.js.map +1 -1
  12. package/out/src/adapters/fcc-bdc/adapter.d.ts +14 -1
  13. package/out/src/adapters/fcc-bdc/adapter.d.ts.map +1 -1
  14. package/out/src/adapters/fcc-bdc/adapter.js +15 -2
  15. package/out/src/adapters/fcc-bdc/adapter.js.map +1 -1
  16. package/out/src/adapters/geonames/adapter.d.ts +11 -0
  17. package/out/src/adapters/geonames/adapter.d.ts.map +1 -1
  18. package/out/src/adapters/geonames/adapter.js +24 -5
  19. package/out/src/adapters/geonames/adapter.js.map +1 -1
  20. package/out/src/adapters/geonames-postal/adapter.d.ts +11 -0
  21. package/out/src/adapters/geonames-postal/adapter.d.ts.map +1 -1
  22. package/out/src/adapters/geonames-postal/adapter.js +14 -1
  23. package/out/src/adapters/geonames-postal/adapter.js.map +1 -1
  24. package/out/src/adapters/gnaf/adapter.d.ts +10 -1
  25. package/out/src/adapters/gnaf/adapter.d.ts.map +1 -1
  26. package/out/src/adapters/gnaf/adapter.js +11 -2
  27. package/out/src/adapters/gnaf/adapter.js.map +1 -1
  28. package/out/src/adapters/gnaf/assemble.d.ts +18 -6
  29. package/out/src/adapters/gnaf/assemble.d.ts.map +1 -1
  30. package/out/src/adapters/gnaf/assemble.js +16 -6
  31. package/out/src/adapters/gnaf/assemble.js.map +1 -1
  32. package/out/src/adapters/index.d.ts.map +1 -1
  33. package/out/src/adapters/index.js.map +1 -1
  34. package/out/src/adapters/openaddresses/adapter.d.ts +11 -0
  35. package/out/src/adapters/openaddresses/adapter.d.ts.map +1 -1
  36. package/out/src/adapters/openaddresses/adapter.js +18 -3
  37. package/out/src/adapters/openaddresses/adapter.js.map +1 -1
  38. package/out/src/adapters/overture/adapter.d.ts +11 -0
  39. package/out/src/adapters/overture/adapter.d.ts.map +1 -1
  40. package/out/src/adapters/overture/adapter.js +12 -1
  41. package/out/src/adapters/overture/adapter.js.map +1 -1
  42. package/out/src/adapters/state-hi-schools/adapter.d.ts +11 -0
  43. package/out/src/adapters/state-hi-schools/adapter.d.ts.map +1 -1
  44. package/out/src/adapters/state-hi-schools/adapter.js +11 -0
  45. package/out/src/adapters/state-hi-schools/adapter.js.map +1 -1
  46. package/out/src/adapters/state-ia-contractors/adapter.d.ts +11 -0
  47. package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +1 -1
  48. package/out/src/adapters/state-ia-contractors/adapter.js +11 -0
  49. package/out/src/adapters/state-ia-contractors/adapter.js.map +1 -1
  50. package/out/src/adapters/state-ny-notaries/adapter.d.ts +11 -0
  51. package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +1 -1
  52. package/out/src/adapters/state-ny-notaries/adapter.js +11 -0
  53. package/out/src/adapters/state-ny-notaries/adapter.js.map +1 -1
  54. package/out/src/adapters/state-tx-notaries/adapter.d.ts +11 -0
  55. package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +1 -1
  56. package/out/src/adapters/state-tx-notaries/adapter.js +15 -2
  57. package/out/src/adapters/state-tx-notaries/adapter.js.map +1 -1
  58. package/out/src/adapters/synth-po-box/adapter.d.ts +11 -0
  59. package/out/src/adapters/synth-po-box/adapter.d.ts.map +1 -1
  60. package/out/src/adapters/synth-po-box/adapter.js +13 -2
  61. package/out/src/adapters/synth-po-box/adapter.js.map +1 -1
  62. package/out/src/adapters/tiger/adapter.d.ts +14 -1
  63. package/out/src/adapters/tiger/adapter.d.ts.map +1 -1
  64. package/out/src/adapters/tiger/adapter.js +19 -4
  65. package/out/src/adapters/tiger/adapter.js.map +1 -1
  66. package/out/src/adapters/tiger/street-decompose.d.ts.map +1 -1
  67. package/out/src/adapters/tiger/street-decompose.js.map +1 -1
  68. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +11 -0
  69. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -1
  70. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +12 -1
  71. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -1
  72. package/out/src/adapters/usgov-imls-pls/adapter.d.ts +11 -0
  73. package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +1 -1
  74. package/out/src/adapters/usgov-imls-pls/adapter.js +11 -0
  75. package/out/src/adapters/usgov-imls-pls/adapter.js.map +1 -1
  76. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts +11 -0
  77. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -1
  78. package/out/src/adapters/usgov-irs-bmf/adapter.js +17 -2
  79. package/out/src/adapters/usgov-irs-bmf/adapter.js.map +1 -1
  80. package/out/src/adapters/usgov-nad/adapter.d.ts +11 -0
  81. package/out/src/adapters/usgov-nad/adapter.d.ts.map +1 -1
  82. package/out/src/adapters/usgov-nad/adapter.js +12 -1
  83. package/out/src/adapters/usgov-nad/adapter.js.map +1 -1
  84. package/out/src/adapters/usgov-nppes/adapter.d.ts +11 -0
  85. package/out/src/adapters/usgov-nppes/adapter.d.ts.map +1 -1
  86. package/out/src/adapters/usgov-nppes/adapter.js +11 -0
  87. package/out/src/adapters/usgov-nppes/adapter.js.map +1 -1
  88. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts +11 -0
  89. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -1
  90. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +15 -2
  91. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -1
  92. package/out/src/adapters/wof-admin-jp/adapter.d.ts +7 -0
  93. package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +1 -1
  94. package/out/src/adapters/wof-admin-jp/adapter.js +18 -3
  95. package/out/src/adapters/wof-admin-jp/adapter.js.map +1 -1
  96. package/out/src/adapters/wof-admin-json/adapter.d.ts +13 -3
  97. package/out/src/adapters/wof-admin-json/adapter.d.ts.map +1 -1
  98. package/out/src/adapters/wof-admin-json/adapter.js +15 -5
  99. package/out/src/adapters/wof-admin-json/adapter.js.map +1 -1
  100. package/out/src/adapters/wof-postalcode-json/adapter.d.ts +7 -0
  101. package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +1 -1
  102. package/out/src/adapters/wof-postalcode-json/adapter.js +9 -2
  103. package/out/src/adapters/wof-postalcode-json/adapter.js.map +1 -1
  104. package/out/src/align.d.ts +12 -4
  105. package/out/src/align.d.ts.map +1 -1
  106. package/out/src/align.js +9 -5
  107. package/out/src/align.js.map +1 -1
  108. package/out/src/build.d.ts +24 -8
  109. package/out/src/build.d.ts.map +1 -1
  110. package/out/src/build.js +3 -3
  111. package/out/src/build.js.map +1 -1
  112. package/out/src/codex/us-fips-state.d.ts +6 -2
  113. package/out/src/codex/us-fips-state.d.ts.map +1 -1
  114. package/out/src/codex/us-fips-state.js +3 -1
  115. package/out/src/codex/us-fips-state.js.map +1 -1
  116. package/out/src/golden.d.ts +21 -7
  117. package/out/src/golden.d.ts.map +1 -1
  118. package/out/src/golden.js +18 -10
  119. package/out/src/golden.js.map +1 -1
  120. package/out/src/license.d.ts +3 -1
  121. package/out/src/license.d.ts.map +1 -1
  122. package/out/src/license.js +4 -2
  123. package/out/src/license.js.map +1 -1
  124. package/out/src/parquet-wrapper/reader.d.ts +4 -2
  125. package/out/src/parquet-wrapper/reader.d.ts.map +1 -1
  126. package/out/src/parquet-wrapper/reader.js +5 -4
  127. package/out/src/parquet-wrapper/reader.js.map +1 -1
  128. package/out/src/parquet-wrapper/schema.d.ts +14 -10
  129. package/out/src/parquet-wrapper/schema.d.ts.map +1 -1
  130. package/out/src/parquet-wrapper/schema.js +6 -2
  131. package/out/src/parquet-wrapper/schema.js.map +1 -1
  132. package/out/src/parquet-wrapper/writer.d.ts +12 -4
  133. package/out/src/parquet-wrapper/writer.d.ts.map +1 -1
  134. package/out/src/parquet-wrapper/writer.js +12 -4
  135. package/out/src/parquet-wrapper/writer.js.map +1 -1
  136. package/out/src/parquet.d.ts +21 -7
  137. package/out/src/parquet.d.ts.map +1 -1
  138. package/out/src/parquet.js +15 -4
  139. package/out/src/parquet.js.map +1 -1
  140. package/out/src/runner.d.ts +39 -13
  141. package/out/src/runner.d.ts.map +1 -1
  142. package/out/src/runner.js +7 -3
  143. package/out/src/runner.js.map +1 -1
  144. package/out/src/shard-recipes/anchor-absorption.d.ts +4 -0
  145. package/out/src/shard-recipes/anchor-absorption.d.ts.map +1 -1
  146. package/out/src/shard-recipes/anchor-absorption.js +14 -5
  147. package/out/src/shard-recipes/anchor-absorption.js.map +1 -1
  148. package/out/src/shard-recipes/boundary-stress.d.ts +4 -0
  149. package/out/src/shard-recipes/boundary-stress.d.ts.map +1 -1
  150. package/out/src/shard-recipes/boundary-stress.js +13 -7
  151. package/out/src/shard-recipes/boundary-stress.js.map +1 -1
  152. package/out/src/shard-recipes/country-balanced.d.ts +4 -0
  153. package/out/src/shard-recipes/country-balanced.d.ts.map +1 -1
  154. package/out/src/shard-recipes/country-balanced.js +39 -11
  155. package/out/src/shard-recipes/country-balanced.js.map +1 -1
  156. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts +4 -0
  157. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts.map +1 -1
  158. package/out/src/shard-recipes/cz-pcfirst-preposition.js +4 -0
  159. package/out/src/shard-recipes/cz-pcfirst-preposition.js.map +1 -1
  160. package/out/src/shard-recipes/fr-admin-split.d.ts +4 -0
  161. package/out/src/shard-recipes/fr-admin-split.d.ts.map +1 -1
  162. package/out/src/shard-recipes/fr-admin-split.js +14 -3
  163. package/out/src/shard-recipes/fr-admin-split.js.map +1 -1
  164. package/out/src/shard-recipes/fr-bare-street.d.ts +4 -0
  165. package/out/src/shard-recipes/fr-bare-street.d.ts.map +1 -1
  166. package/out/src/shard-recipes/fr-bare-street.js +4 -0
  167. package/out/src/shard-recipes/fr-bare-street.js.map +1 -1
  168. package/out/src/shard-recipes/fr-fragment.d.ts +4 -0
  169. package/out/src/shard-recipes/fr-fragment.d.ts.map +1 -1
  170. package/out/src/shard-recipes/fr-fragment.js +25 -8
  171. package/out/src/shard-recipes/fr-fragment.js.map +1 -1
  172. package/out/src/shard-recipes/fr-lieudit.d.ts +4 -0
  173. package/out/src/shard-recipes/fr-lieudit.d.ts.map +1 -1
  174. package/out/src/shard-recipes/fr-lieudit.js +21 -8
  175. package/out/src/shard-recipes/fr-lieudit.js.map +1 -1
  176. package/out/src/shard-recipes/fr-order.d.ts +4 -0
  177. package/out/src/shard-recipes/fr-order.d.ts.map +1 -1
  178. package/out/src/shard-recipes/fr-order.js +27 -8
  179. package/out/src/shard-recipes/fr-order.js.map +1 -1
  180. package/out/src/shard-recipes/german.d.ts +4 -0
  181. package/out/src/shard-recipes/german.d.ts.map +1 -1
  182. package/out/src/shard-recipes/german.js +16 -6
  183. package/out/src/shard-recipes/german.js.map +1 -1
  184. package/out/src/shard-recipes/house-venue.d.ts +4 -0
  185. package/out/src/shard-recipes/house-venue.d.ts.map +1 -1
  186. package/out/src/shard-recipes/house-venue.js +4 -0
  187. package/out/src/shard-recipes/house-venue.js.map +1 -1
  188. package/out/src/shard-recipes/index.d.ts +9 -3
  189. package/out/src/shard-recipes/index.d.ts.map +1 -1
  190. package/out/src/shard-recipes/index.js +12 -4
  191. package/out/src/shard-recipes/index.js.map +1 -1
  192. package/out/src/shard-recipes/intersection.d.ts +4 -0
  193. package/out/src/shard-recipes/intersection.d.ts.map +1 -1
  194. package/out/src/shard-recipes/intersection.js +27 -13
  195. package/out/src/shard-recipes/intersection.js.map +1 -1
  196. package/out/src/shard-recipes/locale.d.ts +4 -0
  197. package/out/src/shard-recipes/locale.d.ts.map +1 -1
  198. package/out/src/shard-recipes/locale.js +9 -4
  199. package/out/src/shard-recipes/locale.js.map +1 -1
  200. package/out/src/shard-recipes/nl-postcode.d.ts +4 -0
  201. package/out/src/shard-recipes/nl-postcode.d.ts.map +1 -1
  202. package/out/src/shard-recipes/nl-postcode.js +8 -2
  203. package/out/src/shard-recipes/nl-postcode.js.map +1 -1
  204. package/out/src/shard-recipes/no-fragment.d.ts +4 -0
  205. package/out/src/shard-recipes/no-fragment.d.ts.map +1 -1
  206. package/out/src/shard-recipes/no-fragment.js +8 -2
  207. package/out/src/shard-recipes/no-fragment.js.map +1 -1
  208. package/out/src/shard-recipes/no-street-led.d.ts +4 -0
  209. package/out/src/shard-recipes/no-street-led.d.ts.map +1 -1
  210. package/out/src/shard-recipes/no-street-led.js +5 -1
  211. package/out/src/shard-recipes/no-street-led.js.map +1 -1
  212. package/out/src/shard-recipes/no-street.d.ts +4 -0
  213. package/out/src/shard-recipes/no-street.d.ts.map +1 -1
  214. package/out/src/shard-recipes/no-street.js +4 -0
  215. package/out/src/shard-recipes/no-street.js.map +1 -1
  216. package/out/src/shard-recipes/po-box-cedex.d.ts +4 -0
  217. package/out/src/shard-recipes/po-box-cedex.d.ts.map +1 -1
  218. package/out/src/shard-recipes/po-box-cedex.js +99 -43
  219. package/out/src/shard-recipes/po-box-cedex.js.map +1 -1
  220. package/out/src/shard-recipes/po-box.d.ts +4 -0
  221. package/out/src/shard-recipes/po-box.d.ts.map +1 -1
  222. package/out/src/shard-recipes/po-box.js +4 -0
  223. package/out/src/shard-recipes/po-box.js.map +1 -1
  224. package/out/src/shard-recipes/scaffold.d.ts +48 -16
  225. package/out/src/shard-recipes/scaffold.d.ts.map +1 -1
  226. package/out/src/shard-recipes/scaffold.js +10 -6
  227. package/out/src/shard-recipes/scaffold.js.map +1 -1
  228. package/out/src/shard-recipes/si-bare-village.d.ts +4 -0
  229. package/out/src/shard-recipes/si-bare-village.d.ts.map +1 -1
  230. package/out/src/shard-recipes/si-bare-village.js +4 -0
  231. package/out/src/shard-recipes/si-bare-village.js.map +1 -1
  232. package/out/src/shard-recipes/street-affix.d.ts +4 -0
  233. package/out/src/shard-recipes/street-affix.d.ts.map +1 -1
  234. package/out/src/shard-recipes/street-affix.js +29 -10
  235. package/out/src/shard-recipes/street-affix.js.map +1 -1
  236. package/out/src/shard-recipes/street-bare.d.ts +4 -0
  237. package/out/src/shard-recipes/street-bare.d.ts.map +1 -1
  238. package/out/src/shard-recipes/street-bare.js +4 -0
  239. package/out/src/shard-recipes/street-bare.js.map +1 -1
  240. package/out/src/shard-recipes/street.d.ts +4 -0
  241. package/out/src/shard-recipes/street.d.ts.map +1 -1
  242. package/out/src/shard-recipes/street.js +4 -0
  243. package/out/src/shard-recipes/street.js.map +1 -1
  244. package/out/src/shard-recipes/unit.d.ts +4 -0
  245. package/out/src/shard-recipes/unit.d.ts.map +1 -1
  246. package/out/src/shard-recipes/unit.js +45 -14
  247. package/out/src/shard-recipes/unit.js.map +1 -1
  248. package/out/src/split.d.ts +18 -6
  249. package/out/src/split.d.ts.map +1 -1
  250. package/out/src/split.js +4 -2
  251. package/out/src/split.js.map +1 -1
  252. package/out/src/synthesize-anchor-absorption.d.ts +7 -1
  253. package/out/src/synthesize-anchor-absorption.d.ts.map +1 -1
  254. package/out/src/synthesize-anchor-absorption.js +28 -14
  255. package/out/src/synthesize-anchor-absorption.js.map +1 -1
  256. package/out/src/synthesize-boundary-stress.d.ts +3 -1
  257. package/out/src/synthesize-boundary-stress.d.ts.map +1 -1
  258. package/out/src/synthesize-boundary-stress.js +35 -28
  259. package/out/src/synthesize-boundary-stress.js.map +1 -1
  260. package/out/src/synthesize-german.d.ts +15 -5
  261. package/out/src/synthesize-german.d.ts.map +1 -1
  262. package/out/src/synthesize-german.js +9 -3
  263. package/out/src/synthesize-german.js.map +1 -1
  264. package/out/src/synthesize-house-venue.d.ts.map +1 -1
  265. package/out/src/synthesize-house-venue.js +15 -15
  266. package/out/src/synthesize-house-venue.js.map +1 -1
  267. package/out/src/synthesize-intersection.d.ts +9 -3
  268. package/out/src/synthesize-intersection.d.ts.map +1 -1
  269. package/out/src/synthesize-intersection.js +25 -6
  270. package/out/src/synthesize-intersection.js.map +1 -1
  271. package/out/src/synthesize-no-street.d.ts +3 -1
  272. package/out/src/synthesize-no-street.d.ts.map +1 -1
  273. package/out/src/synthesize-no-street.js +5 -6
  274. package/out/src/synthesize-no-street.js.map +1 -1
  275. package/out/src/synthesize-po-box.d.ts +15 -5
  276. package/out/src/synthesize-po-box.d.ts.map +1 -1
  277. package/out/src/synthesize-po-box.js +21 -7
  278. package/out/src/synthesize-po-box.js.map +1 -1
  279. package/out/src/synthesize-street.d.ts +3 -1
  280. package/out/src/synthesize-street.d.ts.map +1 -1
  281. package/out/src/synthesize-street.js +6 -1
  282. package/out/src/synthesize-street.js.map +1 -1
  283. package/out/src/synthesize.d.ts +39 -13
  284. package/out/src/synthesize.d.ts.map +1 -1
  285. package/out/src/synthesize.js +66 -36
  286. package/out/src/synthesize.js.map +1 -1
  287. package/out/src/tokenize.d.ts +15 -5
  288. package/out/src/tokenize.d.ts.map +1 -1
  289. package/out/src/tokenize.js.map +1 -1
  290. package/out/src/tools/align-shard.d.ts.map +1 -1
  291. package/out/src/tools/align-shard.js +3 -1
  292. package/out/src/tools/align-shard.js.map +1 -1
  293. package/out/src/tools/audit.d.ts.map +1 -1
  294. package/out/src/tools/audit.js +20 -8
  295. package/out/src/tools/audit.js.map +1 -1
  296. package/out/src/tools/corpus-stats.d.ts.map +1 -1
  297. package/out/src/tools/corpus-stats.js.map +1 -1
  298. package/out/src/tools/fetch/ban.d.ts.map +1 -1
  299. package/out/src/tools/fetch/ban.js +17 -10
  300. package/out/src/tools/fetch/ban.js.map +1 -1
  301. package/out/src/tools/fetch/download.d.ts +30 -10
  302. package/out/src/tools/fetch/download.d.ts.map +1 -1
  303. package/out/src/tools/fetch/download.js +26 -6
  304. package/out/src/tools/fetch/download.js.map +1 -1
  305. package/out/src/tools/fetch/hrsa.d.ts.map +1 -1
  306. package/out/src/tools/fetch/hrsa.js.map +1 -1
  307. package/out/src/tools/fetch/imls-pls.d.ts.map +1 -1
  308. package/out/src/tools/fetch/imls-pls.js +18 -18
  309. package/out/src/tools/fetch/imls-pls.js.map +1 -1
  310. package/out/src/tools/fetch/index.d.ts +3 -1
  311. package/out/src/tools/fetch/index.d.ts.map +1 -1
  312. package/out/src/tools/fetch/index.js +3 -1
  313. package/out/src/tools/fetch/index.js.map +1 -1
  314. package/out/src/tools/fetch/nad.d.ts +21 -7
  315. package/out/src/tools/fetch/nad.d.ts.map +1 -1
  316. package/out/src/tools/fetch/nad.js +5 -5
  317. package/out/src/tools/fetch/nad.js.map +1 -1
  318. package/out/src/tools/fetch/nppes.d.ts.map +1 -1
  319. package/out/src/tools/fetch/nppes.js +9 -15
  320. package/out/src/tools/fetch/nppes.js.map +1 -1
  321. package/out/src/tools/fetch/openaddresses.d.ts +3 -1
  322. package/out/src/tools/fetch/openaddresses.d.ts.map +1 -1
  323. package/out/src/tools/fetch/openaddresses.js +32 -23
  324. package/out/src/tools/fetch/openaddresses.js.map +1 -1
  325. package/out/src/tools/fetch/ppd.d.ts +3 -1
  326. package/out/src/tools/fetch/ppd.d.ts.map +1 -1
  327. package/out/src/tools/fetch/ppd.js +14 -3
  328. package/out/src/tools/fetch/ppd.js.map +1 -1
  329. package/out/src/tools/fetch/state-hi-schools.d.ts.map +1 -1
  330. package/out/src/tools/fetch/state-hi-schools.js +13 -6
  331. package/out/src/tools/fetch/state-hi-schools.js.map +1 -1
  332. package/out/src/tools/fetch/state-sources.d.ts.map +1 -1
  333. package/out/src/tools/fetch/state-sources.js +8 -3
  334. package/out/src/tools/fetch/state-sources.js.map +1 -1
  335. package/out/src/tools/fetch/tiger-full.d.ts +9 -3
  336. package/out/src/tools/fetch/tiger-full.d.ts.map +1 -1
  337. package/out/src/tools/fetch/tiger-full.js +35 -20
  338. package/out/src/tools/fetch/tiger-full.js.map +1 -1
  339. package/out/src/tools/gb-title-case.d.ts.map +1 -1
  340. package/out/src/tools/gb-title-case.js.map +1 -1
  341. package/out/src/tools/golden-expand.d.ts +24 -8
  342. package/out/src/tools/golden-expand.d.ts.map +1 -1
  343. package/out/src/tools/golden-expand.js +20 -12
  344. package/out/src/tools/golden-expand.js.map +1 -1
  345. package/out/src/tools/golden-promote.d.ts +18 -6
  346. package/out/src/tools/golden-promote.d.ts.map +1 -1
  347. package/out/src/tools/golden-promote.js +22 -7
  348. package/out/src/tools/golden-promote.js.map +1 -1
  349. package/out/src/tools/ingest-csv.d.ts +3 -1
  350. package/out/src/tools/ingest-csv.d.ts.map +1 -1
  351. package/out/src/tools/ingest-csv.js +17 -19
  352. package/out/src/tools/ingest-csv.js.map +1 -1
  353. package/out/src/tools/jsonl-to-parquet.d.ts +18 -6
  354. package/out/src/tools/jsonl-to-parquet.d.ts.map +1 -1
  355. package/out/src/tools/jsonl-to-parquet.js +11 -5
  356. package/out/src/tools/jsonl-to-parquet.js.map +1 -1
  357. package/out/src/tools/lint-shard-vocab.d.ts +36 -12
  358. package/out/src/tools/lint-shard-vocab.d.ts.map +1 -1
  359. package/out/src/tools/lint-shard-vocab.js +25 -11
  360. package/out/src/tools/lint-shard-vocab.js.map +1 -1
  361. package/out/src/tools/lint-shard.d.ts +30 -10
  362. package/out/src/tools/lint-shard.d.ts.map +1 -1
  363. package/out/src/tools/lint-shard.js +33 -20
  364. package/out/src/tools/lint-shard.js.map +1 -1
  365. package/out/src/tools/overlay-manifest.d.ts.map +1 -1
  366. package/out/src/tools/overlay-manifest.js +6 -4
  367. package/out/src/tools/overlay-manifest.js.map +1 -1
  368. package/out/src/tools/shard-kryptonite.d.ts +6 -2
  369. package/out/src/tools/shard-kryptonite.d.ts.map +1 -1
  370. package/out/src/tools/shard-kryptonite.js +1 -1
  371. package/out/src/tools/shard-kryptonite.js.map +1 -1
  372. package/out/src/tools/shard-translit.d.ts +9 -3
  373. package/out/src/tools/shard-translit.d.ts.map +1 -1
  374. package/out/src/tools/shard-translit.js +2 -2
  375. package/out/src/tools/shard-translit.js.map +1 -1
  376. package/out/src/types.d.ts +51 -17
  377. package/out/src/types.d.ts.map +1 -1
  378. package/out/src/wof-json.d.ts +9 -3
  379. package/out/src/wof-json.d.ts.map +1 -1
  380. package/out/src/wof-json.js +6 -4
  381. package/out/src/wof-json.js.map +1 -1
  382. package/package.json +7 -6
  383. package/src/adapter.ts +24 -13
  384. package/src/adapters/ban/adapter.ts +12 -2
  385. package/src/adapters/ban/street-decompose.ts +7 -1
  386. package/src/adapters/fcc-bdc/adapter.ts +19 -3
  387. package/src/adapters/geonames/adapter.ts +28 -5
  388. package/src/adapters/geonames-postal/adapter.ts +17 -1
  389. package/src/adapters/gnaf/adapter.ts +15 -2
  390. package/src/adapters/gnaf/assemble.ts +40 -10
  391. package/src/adapters/index.ts +13 -0
  392. package/src/adapters/openaddresses/adapter.ts +22 -3
  393. package/src/adapters/overture/adapter.ts +18 -2
  394. package/src/adapters/state-hi-schools/adapter.ts +15 -0
  395. package/src/adapters/state-ia-contractors/adapter.ts +15 -0
  396. package/src/adapters/state-ny-notaries/adapter.ts +15 -0
  397. package/src/adapters/state-tx-notaries/adapter.ts +18 -2
  398. package/src/adapters/synth-po-box/adapter.ts +19 -2
  399. package/src/adapters/tiger/adapter.ts +23 -4
  400. package/src/adapters/tiger/street-decompose.ts +1 -0
  401. package/src/adapters/usgov-hrsa-fqhc/adapter.ts +18 -2
  402. package/src/adapters/usgov-imls-pls/adapter.ts +15 -0
  403. package/src/adapters/usgov-irs-bmf/adapter.ts +19 -2
  404. package/src/adapters/usgov-nad/adapter.ts +14 -1
  405. package/src/adapters/usgov-nppes/adapter.ts +13 -0
  406. package/src/adapters/usgov-samhsa-treatment-locator/adapter.ts +21 -3
  407. package/src/adapters/wof-admin-jp/adapter.ts +20 -3
  408. package/src/adapters/wof-admin-json/adapter.ts +22 -7
  409. package/src/adapters/wof-postalcode-json/adapter.ts +10 -2
  410. package/src/align.ts +21 -8
  411. package/src/build.ts +48 -11
  412. package/src/codex/us-fips-state.ts +6 -2
  413. package/src/golden.ts +28 -13
  414. package/src/license.ts +4 -2
  415. package/src/parquet-wrapper/reader.ts +6 -4
  416. package/src/parquet-wrapper/schema.ts +14 -10
  417. package/src/parquet-wrapper/writer.ts +12 -4
  418. package/src/parquet.ts +39 -8
  419. package/src/runner.ts +49 -15
  420. package/src/shard-recipes/anchor-absorption.ts +21 -5
  421. package/src/shard-recipes/boundary-stress.ts +20 -7
  422. package/src/shard-recipes/country-balanced.ts +78 -13
  423. package/src/shard-recipes/cz-pcfirst-preposition.ts +9 -0
  424. package/src/shard-recipes/fr-admin-split.ts +30 -5
  425. package/src/shard-recipes/fr-bare-street.ts +10 -0
  426. package/src/shard-recipes/fr-fragment.ts +33 -8
  427. package/src/shard-recipes/fr-lieudit.ts +35 -9
  428. package/src/shard-recipes/fr-order.ts +47 -9
  429. package/src/shard-recipes/german.ts +32 -6
  430. package/src/shard-recipes/house-venue.ts +7 -0
  431. package/src/shard-recipes/index.ts +12 -4
  432. package/src/shard-recipes/intersection.ts +63 -14
  433. package/src/shard-recipes/locale.ts +37 -4
  434. package/src/shard-recipes/nl-postcode.ts +12 -2
  435. package/src/shard-recipes/no-fragment.ts +12 -2
  436. package/src/shard-recipes/no-street-led.ts +11 -1
  437. package/src/shard-recipes/no-street.ts +7 -0
  438. package/src/shard-recipes/po-box-cedex.ts +145 -45
  439. package/src/shard-recipes/po-box.ts +7 -0
  440. package/src/shard-recipes/scaffold.ts +52 -20
  441. package/src/shard-recipes/si-bare-village.ts +9 -0
  442. package/src/shard-recipes/street-affix.ts +88 -13
  443. package/src/shard-recipes/street-bare.ts +10 -0
  444. package/src/shard-recipes/street.ts +7 -0
  445. package/src/shard-recipes/unit.ts +79 -16
  446. package/src/split.ts +28 -7
  447. package/src/synthesize-anchor-absorption.ts +41 -14
  448. package/src/synthesize-boundary-stress.ts +57 -30
  449. package/src/synthesize-german.ts +30 -7
  450. package/src/synthesize-house-venue.ts +22 -16
  451. package/src/synthesize-intersection.ts +34 -7
  452. package/src/synthesize-no-street.ts +18 -10
  453. package/src/synthesize-po-box.ts +42 -10
  454. package/src/synthesize-street.ts +10 -2
  455. package/src/synthesize.ts +81 -38
  456. package/src/tokenize.ts +15 -5
  457. package/src/tools/align-shard.ts +6 -1
  458. package/src/tools/audit.ts +57 -11
  459. package/src/tools/corpus-stats.ts +9 -0
  460. package/src/tools/fetch/ban.ts +32 -10
  461. package/src/tools/fetch/download.ts +49 -12
  462. package/src/tools/fetch/hrsa.ts +3 -0
  463. package/src/tools/fetch/imls-pls.ts +28 -18
  464. package/src/tools/fetch/index.ts +3 -1
  465. package/src/tools/fetch/nad.ts +39 -12
  466. package/src/tools/fetch/nppes.ts +17 -15
  467. package/src/tools/fetch/openaddresses.ts +52 -24
  468. package/src/tools/fetch/ppd.ts +22 -3
  469. package/src/tools/fetch/state-hi-schools.ts +17 -6
  470. package/src/tools/fetch/state-sources.ts +16 -3
  471. package/src/tools/fetch/tiger-full.ts +66 -23
  472. package/src/tools/gb-title-case.ts +1 -0
  473. package/src/tools/golden-expand.ts +64 -20
  474. package/src/tools/golden-promote.ts +53 -13
  475. package/src/tools/ingest-csv.ts +41 -26
  476. package/src/tools/jsonl-to-parquet.ts +30 -10
  477. package/src/tools/lint-shard-vocab.ts +75 -24
  478. package/src/tools/lint-shard.ts +75 -31
  479. package/src/tools/overlay-manifest.ts +7 -4
  480. package/src/tools/shard-kryptonite.ts +11 -3
  481. package/src/tools/shard-translit.ts +20 -5
  482. package/src/types.ts +51 -17
  483. package/src/wof-json.ts +18 -7
@@ -19,6 +19,9 @@
19
19
  * county ZIP to disk (no curl subprocess).
20
20
  */
21
21
 
22
+ /* oxlint-disable sister-software/prefer-region-over-marks -- these markers label steps inside one
23
+ procedure, not sections of declarations. A region there folds nothing a reader wants folded. */
24
+
22
25
  import { createWriteStream, existsSync, mkdirSync, rmSync, statSync } from "node:fs"
23
26
  import { basename, join } from "node:path"
24
27
  import { Readable } from "node:stream"
@@ -30,6 +33,22 @@ import { sha256File } from "@mailwoman/core/utils"
30
33
  import type { BaseFetchOptions, FetchSummary } from "./download.ts"
31
34
  import { isTransientStatus, readManifest, writeManifest } from "./download.ts"
32
35
 
36
+ /**
37
+ * Bytes per KiB — the divisor for human-readable sizes, and the floor below which a "download" is an error page rather
38
+ * than data.
39
+ */
40
+ /**
41
+ * Lowest 2xx status; anything below is informational.
42
+ */
43
+ const HTTP_OK = 200
44
+
45
+ /**
46
+ * Lowest 3xx status; at or above it the response is a redirect or an error, not a body.
47
+ */
48
+ const HTTP_REDIRECT = 300
49
+
50
+ const BYTES_PER_KIB = 1024
51
+
33
52
  const TIGER_BASE_URL = "https://www2.census.gov/geo/tiger/TIGER2024/ADDRFEAT"
34
53
 
35
54
  export interface FetchTigerFullOptions extends BaseFetchOptions {
@@ -38,11 +57,17 @@ export interface FetchTigerFullOptions extends BaseFetchOptions {
38
57
  * v0.1.1.
39
58
  */
40
59
  skipStateFips?: string
41
- /** Seconds to sleep between downloads. Default `0.2`. */
60
+ /**
61
+ * Seconds to sleep between downloads. Default `0.2`.
62
+ */
42
63
  rateSleep?: number
43
- /** Max concurrent download workers per state. Default `4`. */
64
+ /**
65
+ * Max concurrent download workers per state. Default `4`.
66
+ */
44
67
  maxParallel?: number
45
- /** Print planned downloads without fetching. Default `false`. */
68
+ /**
69
+ * Print planned downloads without fetching. Default `false`.
70
+ */
46
71
  dryRun?: boolean
47
72
  }
48
73
 
@@ -57,8 +82,9 @@ function humanBytes(bytes: number): string {
57
82
  let value = bytes
58
83
  let unit = 0
59
84
 
60
- while (value >= 1024 && unit < units.length - 1) {
85
+ while (value >= BYTES_PER_KIB && unit < units.length - 1) {
61
86
  value /= 1024
87
+
62
88
  unit++
63
89
  }
64
90
 
@@ -89,6 +115,7 @@ async function streamDownload(
89
115
 
90
116
  if (attempt < opts.retries && isTransientStatus(res.status)) {
91
117
  await sleep(opts.retryDelayMs)
118
+
92
119
  continue
93
120
  }
94
121
 
@@ -96,6 +123,7 @@ async function streamDownload(
96
123
  } catch {
97
124
  if (attempt < opts.retries) {
98
125
  await sleep(opts.retryDelayMs)
126
+
99
127
  continue
100
128
  }
101
129
 
@@ -106,7 +134,9 @@ async function streamDownload(
106
134
  return 0
107
135
  }
108
136
 
109
- /** Read a per-state MANIFEST.json into a filename → entry map. */
137
+ /**
138
+ * Read a per-state MANIFEST.json into a filename → entry map.
139
+ */
110
140
  async function readCountyManifest(manifestPath: string): Promise<Map<string, CountyEntry>> {
111
141
  const map = new Map<string, CountyEntry>()
112
142
  const parsed = await readManifest<{ counties?: CountyEntry[] }>(manifestPath)
@@ -120,7 +150,9 @@ async function readCountyManifest(manifestPath: string): Promise<Map<string, Cou
120
150
  return map
121
151
  }
122
152
 
123
- /** Check whether a file already matches a recorded sha256 and byte count. */
153
+ /**
154
+ * Check whether a file already matches a recorded sha256 and byte count.
155
+ */
124
156
  async function fileMatchesSha(path: string, expectedSha: string, expectedBytes: number): Promise<boolean> {
125
157
  if (!existsSync(path)) return false
126
158
 
@@ -133,18 +165,20 @@ type CountyResult =
133
165
  | { ok: true; filename: string; sha256: string; bytes: number }
134
166
  | { ok: false; filename: string; reason: string }
135
167
 
136
- /** Download one county ZIP (size sanity check + sha256). */
168
+ /**
169
+ * Download one county ZIP (size sanity check + sha256).
170
+ */
137
171
  async function downloadCounty(url: string, dest: string): Promise<CountyResult> {
138
172
  const filename = basename(dest)
139
- const status = await streamDownload(url, dest, { timeoutMs: 600_000, retries: 3, retryDelayMs: 5_000 })
173
+ const status = await streamDownload(url, dest, { timeoutMs: 600_000, retries: 3, retryDelayMs: 5000 })
140
174
 
141
- if (status < 200 || status >= 300) {
175
+ if (status < HTTP_OK || status >= HTTP_REDIRECT) {
142
176
  return { ok: false, filename, reason: `HTTP ${status}` }
143
177
  }
144
178
 
145
179
  const bytes = statSync(dest).size
146
180
 
147
- if (bytes < 1024) {
181
+ if (bytes < BYTES_PER_KIB) {
148
182
  rmSync(dest, { force: true })
149
183
 
150
184
  return { ok: false, filename, reason: `too small (${bytes} bytes)` }
@@ -167,10 +201,10 @@ export async function fetchTigerFull(
167
201
  const addrfeatDir = join(options.outRoot, "tiger", "addrfeat")
168
202
  mkdirSync(addrfeatDir, { recursive: true })
169
203
 
170
- // -------------------------------------------------------------------------
171
- // Step 1: Discover the full county file list from the TIGER directory listing.
172
- // -------------------------------------------------------------------------
204
+ // MARK: Step 1 — discover the county file list
205
+
173
206
  report?.(`=== Fetching TIGER 2024 ADDRFEAT directory listing...`)
207
+
174
208
  const listingRes = await fetch(`${TIGER_BASE_URL}/`, {
175
209
  headers: { "Accept-Encoding": "gzip, br" },
176
210
  signal: AbortSignal.timeout(60_000),
@@ -178,7 +212,7 @@ export async function fetchTigerFull(
178
212
 
179
213
  if (!listingRes.ok) throw new Error(`Failed to fetch TIGER directory listing: HTTP ${listingRes.status}`)
180
214
  const html = await listingRes.text()
181
- const allZips = [...new Set(html.match(/tl_2024_[0-9]{5}_addrfeat\.zip/g) ?? [])].sort()
215
+ const allZips = [...new Set(html.match(/tl_2024_[0-9]{5}_addrfeat\.zip/g))].toSorted()
182
216
  const totalCounties = allZips.length
183
217
  report?.(` Found ${totalCounties} county ZIPs in the TIGER 2024 ADDRFEAT index.`)
184
218
 
@@ -195,9 +229,8 @@ export async function fetchTigerFull(
195
229
 
196
230
  report?.(` Spans ${stateFiles.size} state/territory FIPS codes.`)
197
231
 
198
- // -------------------------------------------------------------------------
199
- // Step 2: For each state, download missing/unverified county ZIPs.
200
- // -------------------------------------------------------------------------
232
+ // MARK: Step 2 — download the county ZIPs
233
+
201
234
  let totalFetched = 0
202
235
  let totalSkipped = 0
203
236
  let totalSkippedState = 0
@@ -206,7 +239,7 @@ export async function fetchTigerFull(
206
239
  const failedCodes: string[] = []
207
240
 
208
241
  // Process states in sorted FIPS order for predictable output.
209
- const sortedStates = [...stateFiles.keys()].sort()
242
+ const sortedStates = [...stateFiles.keys()].toSorted()
210
243
 
211
244
  for (const stateFips of sortedStates) {
212
245
  const countyFiles = stateFiles.get(stateFips) ?? []
@@ -215,6 +248,7 @@ export async function fetchTigerFull(
215
248
  if (skipStateFips.includes(stateFips)) {
216
249
  report?.(`--- State ${stateFips} — SKIPPED (in --skip-state-fips, ${countyFiles.length} counties)`)
217
250
  totalSkippedState += countyFiles.length
251
+
218
252
  continue
219
253
  }
220
254
 
@@ -238,13 +272,17 @@ export async function fetchTigerFull(
238
272
  // Skip if already verified via MANIFEST.
239
273
  if (known && (await fileMatchesSha(dest, known.sha256, known.bytes))) {
240
274
  report?.(` skip (verified) ${fname}`)
275
+
241
276
  totalSkipped++
277
+
242
278
  continue
243
279
  }
244
280
 
245
281
  if (dryRun) {
246
282
  report?.(` would fetch: ${url}`)
283
+
247
284
  totalFetched++
285
+
248
286
  continue
249
287
  }
250
288
 
@@ -253,11 +291,12 @@ export async function fetchTigerFull(
253
291
 
254
292
  if (dryRun) continue
255
293
 
256
- if (pending.length === 0) continue
294
+ if (!pending.length) continue
257
295
 
258
296
  // --- Download pending files with bounded parallelism + rate-limit spacing ---
259
297
  const results: CountyResult[] = new Array(pending.length)
260
298
  let cursor = 0
299
+
261
300
  const workers = Array.from({ length: Math.min(maxParallel, pending.length) }, async () => {
262
301
  while (true) {
263
302
  const i = cursor++
@@ -269,6 +308,7 @@ export async function fetchTigerFull(
269
308
  results[i] = await downloadCounty(item.url, item.dest)
270
309
  }
271
310
  })
311
+
272
312
  await Promise.all(workers)
273
313
 
274
314
  // Collect results from this state.
@@ -276,29 +316,32 @@ export async function fetchTigerFull(
276
316
  if (result.ok) {
277
317
  report?.(` ok ${result.filename} ${humanBytes(result.bytes)} sha256=${result.sha256.slice(0, 12)}...`)
278
318
  manifest.set(result.filename, { filename: result.filename, sha256: result.sha256, bytes: result.bytes })
319
+
279
320
  totalFetched++
280
321
  totalBytesFetched += result.bytes
281
322
  } else {
282
323
  report?.(` FAIL ${result.filename} -- ${result.reason}`)
324
+
283
325
  totalFailed++
284
326
  failedCodes.push(result.filename)
285
327
  }
286
328
  }
287
329
 
288
330
  // Rewrite per-state MANIFEST.json with all known-good counties (sorted for determinism).
289
- const counties = [...manifest.values()].sort((a, b) => a.filename.localeCompare(b.filename))
331
+ const counties = [...manifest.values()].toSorted((a, b) => a.filename.localeCompare(b.filename))
332
+
290
333
  const manifestDoc = {
291
334
  state_fips: stateFips,
292
335
  updated_at: new Date().toISOString().replace(/\.\d{3}Z$/, "Z"),
293
336
  tiger_base_url: TIGER_BASE_URL,
294
337
  counties,
295
338
  }
339
+
296
340
  await writeManifest(manifestPath, manifestDoc)
297
341
  }
298
342
 
299
- // -------------------------------------------------------------------------
300
- // Summary
301
- // -------------------------------------------------------------------------
343
+ // MARK: Summary
344
+
302
345
  report?.(`=== Summary ===`)
303
346
  report?.(` Total counties in index : ${totalCounties}`)
304
347
  report?.(` State(s) fully skipped : ${totalSkippedState} (--skip-state-fips "${skipStateFips.join(" ")}")`)
@@ -59,6 +59,7 @@ export function titleCaseGB(value: string): string {
59
59
  .split("-")
60
60
  .map((seg, segIndex) => caseWord(seg, wordIndex === 0 && segIndex === 0))
61
61
  .join("-")
62
+
62
63
  wordIndex += 1
63
64
 
64
65
  return cased
@@ -55,6 +55,11 @@ import { dataRootPath, writeJSONL } from "@mailwoman/core/utils"
55
55
 
56
56
  // ── Types ─────────────────────────────────────────────────────────────────
57
57
 
58
+ /**
59
+ * Longest raw line still plausibly a single address rather than a concatenated record.
60
+ */
61
+ const MAX_CANDIDATE_LENGTH = 500
62
+
58
63
  interface CorpusRow {
59
64
  raw: string
60
65
  tokens: string[]
@@ -90,21 +95,37 @@ interface GoldenCandidate {
90
95
  }
91
96
 
92
97
  export interface ExpandGoldenOptions {
93
- /** Corpus test shard path(s), comma-separated. Default: the v0.2.0 test shard under the data root. */
98
+ /**
99
+ * Corpus test shard path(s), comma-separated. Default: the v0.2.0 test shard under the data root.
100
+ */
94
101
  corpus?: string
95
- /** Total seeds to process. Default `100` (pilot). */
102
+ /**
103
+ * Total seeds to process. Default `100` (pilot).
104
+ */
96
105
  count?: number
97
- /** Variants requested per seed. Default `5`. */
106
+ /**
107
+ * Variants requested per seed. Default `5`.
108
+ */
98
109
  variants?: number
99
- /** JSONL output path. Default `data/eval/golden/candidates/expand-<ts>.jsonl`. */
110
+ /**
111
+ * JSONL output path. Default `data/eval/golden/candidates/expand-<ts>.jsonl`.
112
+ */
100
113
  output?: string
101
- /** LLM provider. Default `deepseek`. */
114
+ /**
115
+ * LLM provider. Default `deepseek`.
116
+ */
102
117
  provider?: "deepseek" | "anthropic"
103
- /** Model id. Default depends on provider. */
118
+ /**
119
+ * Model id. Default depends on provider.
120
+ */
104
121
  model?: string
105
- /** Parallel LLM calls. Default `4`. */
122
+ /**
123
+ * Parallel LLM calls. Default `4`.
124
+ */
106
125
  concurrency?: number
107
- /** Comma-separated source allow-list. */
126
+ /**
127
+ * Comma-separated source allow-list.
128
+ */
108
129
  includeSources?: string
109
130
  }
110
131
 
@@ -127,10 +148,12 @@ function decodeComponents(tokens: string[], labels: string[]): Record<string, st
127
148
  const out: Record<string, string> = {}
128
149
  let currentTag: string | null = null
129
150
  let currentTokens: string[] = []
151
+
130
152
  const flush = () => {
131
- if (currentTag && currentTokens.length > 0 && !(currentTag in out)) {
153
+ if (currentTag && currentTokens.length && !(currentTag in out)) {
132
154
  out[currentTag] = currentTokens.join(" ").trim()
133
155
  }
156
+
134
157
  currentTag = null
135
158
  currentTokens = []
136
159
  }
@@ -141,8 +164,10 @@ function decodeComponents(tokens: string[], labels: string[]): Record<string, st
141
164
 
142
165
  if (label === "O") {
143
166
  flush()
167
+
144
168
  continue
145
169
  }
170
+
146
171
  const [prefix, tag] = label.split("-", 2)
147
172
 
148
173
  if (prefix === "B" || currentTag !== tag) {
@@ -153,6 +178,7 @@ function decodeComponents(tokens: string[], labels: string[]): Record<string, st
153
178
  currentTokens.push(tok)
154
179
  }
155
180
  }
181
+
156
182
  flush()
157
183
 
158
184
  return out
@@ -168,6 +194,7 @@ async function loadSeeds(
168
194
  .split(",")
169
195
  .map((p) => p.trim())
170
196
  .filter(Boolean)
197
+
171
198
  report?.(`reading seeds from ${paths.length} shard(s) (target: ${count}, stratified)`)
172
199
 
173
200
  if (includeSources) {
@@ -190,6 +217,7 @@ async function loadSeeds(
190
217
  const row = (await cursor.next()) as CorpusRow | null
191
218
 
192
219
  if (!row) break
220
+
193
221
  scanned++
194
222
 
195
223
  // Source allow-list (--include-sources) — applied early to skip parsing rows we won't use
@@ -199,8 +227,10 @@ async function loadSeeds(
199
227
  // Skip rows with too few components — single-name wof-admin entries don't make useful seeds
200
228
  if (Object.keys(components).length < 2) {
201
229
  skippedThinComponents++
230
+
202
231
  continue
203
232
  }
233
+
204
234
  const seed: Seed = {
205
235
  raw: row.raw,
206
236
  components,
@@ -208,6 +238,7 @@ async function loadSeeds(
208
238
  source: row.source,
209
239
  source_id: row.source_id,
210
240
  }
241
+
211
242
  let bucket = bySource.get(row.source)
212
243
 
213
244
  if (!bucket) {
@@ -219,12 +250,14 @@ async function loadSeeds(
219
250
  bucket.push(seed)
220
251
  }
221
252
  }
253
+
222
254
  await reader.close()
223
255
  }
224
256
 
225
257
  report?.(
226
258
  ` scanned ${scanned} rows across ${paths.length} shard(s); thin-components dropped: ${skippedThinComponents}`
227
259
  )
260
+
228
261
  report?.(` per-source pool sizes:`)
229
262
 
230
263
  for (const [src, pool] of bySource) {
@@ -233,7 +266,7 @@ async function loadSeeds(
233
266
 
234
267
  // Round-robin sample. Each source gives floor(count / nSources) seeds; rounding goes
235
268
  // to sources in alphabetical order. If a pool is smaller than its target, take all of it.
236
- const sources = Array.from(bySource.keys()).sort()
269
+ const sources = Array.from(bySource.keys()).toSorted()
237
270
  const perSource = Math.floor(count / sources.length)
238
271
  const remainder = count - perSource * sources.length
239
272
  const picked: Seed[] = []
@@ -248,6 +281,7 @@ async function loadSeeds(
248
281
  const k = Math.floor(Math.random() * (j + 1))
249
282
  ;[pool[j], pool[k]] = [pool[k]!, pool[j]!]
250
283
  }
284
+
251
285
  const take = Math.min(target, pool.length)
252
286
  picked.push(...pool.slice(0, take))
253
287
 
@@ -255,6 +289,7 @@ async function loadSeeds(
255
289
  report?.(` ⚠ ${src}: requested ${target}, pool had ${pool.length}`)
256
290
  }
257
291
  }
292
+
258
293
  report?.(` → loaded ${picked.length} seeds across ${sources.length} sources`)
259
294
 
260
295
  return picked
@@ -369,7 +404,7 @@ function makeAnthropicProvider(model: string): LlmProvider {
369
404
 
370
405
  function parseCandidates(text: string): Candidate[] {
371
406
  // Strip markdown fences the model sometimes wraps around JSON
372
- const cleaned = text.replace(/^```(?:json)?\n?|\n?```$/g, "").trim()
407
+ const cleaned = text.replaceAll(/^```(?:json)?\n?|\n?```$/g, "").trim()
373
408
 
374
409
  try {
375
410
  const parsed = JSON.parse(cleaned) as unknown
@@ -394,20 +429,22 @@ function parseCandidates(text: string): Candidate[] {
394
429
  // ── Validator ─────────────────────────────────────────────────────────────
395
430
 
396
431
  function normalize(s: string): string {
397
- return s.toLowerCase().replace(/\s+/g, " ").trim()
432
+ return s.toLowerCase().replaceAll(/\s+/g, " ").trim()
398
433
  }
399
434
 
400
- // Components that are NEVER allowed to be dropped — keeps degenerate single-token candidates out.
435
+ /**
436
+ * Components that are NEVER allowed to be dropped — keeps degenerate single-token candidates out.
437
+ */
401
438
  const REQUIRED_COMPONENT_TAGS = new Set(["locality", "region", "street", "house_number", "venue"])
402
439
 
403
440
  function validate(seed: Seed, candidate: Candidate): boolean {
404
441
  if (!candidate.raw || typeof candidate.raw !== "string") return false
405
442
 
406
- if (candidate.raw.length > 500) return false
443
+ if (candidate.raw.length > MAX_CANDIDATE_LENGTH) return false
407
444
 
408
445
  if (/```|<\/?\w+>|^\s*\{/.test(candidate.raw)) return false
409
446
  const normRaw = normalize(candidate.raw)
410
- const dropped = new Set(candidate.dropped ?? [])
447
+ const dropped = new Set(candidate.dropped)
411
448
 
412
449
  // LLM cannot drop required components present in the seed.
413
450
  for (const tag of dropped) {
@@ -423,6 +460,7 @@ function validate(seed: Seed, candidate: Candidate): boolean {
423
460
  if (!value) continue
424
461
 
425
462
  if (!normRaw.includes(normalize(value))) return false
463
+
426
464
  keptCount++
427
465
  }
428
466
 
@@ -440,13 +478,14 @@ export async function expandGolden(
440
478
  ): Promise<ExpandGoldenSummary> {
441
479
  const corpusPath =
442
480
  options.corpus ?? dataRootPath("corpus", "versioned", "v0.2.0", "corpus-v0.2.0", "test", "part-0000.parquet")
481
+
443
482
  const count = options.count ?? 100
444
483
  const variants = options.variants ?? 5
445
484
  const providerName = options.provider ?? "deepseek"
446
485
  const model = options.model ?? (providerName === "anthropic" ? "claude-haiku-4-5-20251001" : "deepseek-chat")
447
486
  const concurrencyLimit = options.concurrency ?? 4
448
487
  const includeSources = options.includeSources ? new Set(options.includeSources.split(",").map((s) => s.trim())) : null
449
- const ts = new Date().toISOString().replace(/[:.]/g, "-").slice(0, 19)
488
+ const ts = new Date().toISOString().replaceAll(/[:.]/g, "-").slice(0, 19)
450
489
  const outputPath = options.output ?? `data/eval/golden/candidates/expand-${ts}.jsonl`
451
490
 
452
491
  const provider = providerName === "anthropic" ? makeAnthropicProvider(model) : makeDeepseekProvider(model)
@@ -454,7 +493,7 @@ export async function expandGolden(
454
493
 
455
494
  const seeds = await loadSeeds(corpusPath, count, includeSources, report)
456
495
 
457
- if (seeds.length === 0) {
496
+ if (!seeds.length) {
458
497
  throw new Error("no seeds loaded — corpus path or filter is wrong")
459
498
  }
460
499
 
@@ -466,6 +505,7 @@ export async function expandGolden(
466
505
 
467
506
  // Bounded-concurrency worker pool
468
507
  let cursor = 0
508
+
469
509
  const workers = Array.from({ length: Math.min(concurrencyLimit, seeds.length) }, async () => {
470
510
  while (true) {
471
511
  const i = cursor++
@@ -491,17 +531,20 @@ export async function expandGolden(
491
531
 
492
532
  // Remove dropped components from the components map
493
533
  for (const tag of goldenCandidate.dropped_components) {
534
+ // oxlint-disable-next-line typescript/no-dynamic-delete -- removing one key from a plain record; the object is not on a hot path
494
535
  delete goldenCandidate.components[tag]
495
536
  }
537
+
496
538
  outRows.push(goldenCandidate)
539
+
497
540
  kept++
498
541
  } else {
499
542
  dropped++
500
543
  }
501
544
  }
502
- } catch (err) {
545
+ } catch (error) {
503
546
  errored++
504
- report?.(` ✗ seed ${seed.source_id}: ${(err as Error).message}`)
547
+ report?.(` ✗ seed ${seed.source_id}: ${(error as Error).message}`)
505
548
  }
506
549
 
507
550
  if ((i + 1) % 10 === 0) {
@@ -509,6 +552,7 @@ export async function expandGolden(
509
552
  }
510
553
  }
511
554
  })
555
+
512
556
  await Promise.all(workers)
513
557
 
514
558
  writeJSONL(outputPath, outRows)
@@ -517,7 +561,7 @@ export async function expandGolden(
517
561
  report?.(`candidates kept: ${kept}`)
518
562
  report?.(`candidates dropped (validator): ${dropped}`)
519
563
  report?.(`seeds with errors: ${errored}`)
520
- report?.(`yield: ${seeds.length > 0 ? ((kept / (seeds.length * variants)) * 100).toFixed(1) : "0"}%`)
564
+ report?.(`yield: ${seeds.length ? ((kept / (seeds.length * variants)) * 100).toFixed(1) : "0"}%`)
521
565
  report?.(`output: ${outputPath}`)
522
566
 
523
567
  return { seedsProcessed: seeds.length, kept, dropped, errored, outputPath }