@mailwoman/corpus 8.1.0 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +7 -1
  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 +34 -18
  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 +10 -1
  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 +43 -19
  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
@@ -13,7 +13,9 @@
13
13
  * join.
14
14
  */
15
15
 
16
- /** Per-state record: two-letter postal abbreviation + full canonical display name. */
16
+ /**
17
+ * Per-state record: two-letter postal abbreviation + full canonical display name.
18
+ */
17
19
  export interface USStateInfo {
18
20
  abbreviation: string
19
21
  name: string
@@ -83,7 +85,9 @@ export const US_FIPS_STATE: Readonly<Record<string, USStateInfo>> = Object.freez
83
85
  "78": { abbreviation: "VI", name: "Virgin Islands" },
84
86
  })
85
87
 
86
- /** Lookup helper. Returns null when the FIPS code isn't recognized. */
88
+ /**
89
+ * Lookup helper. Returns null when the FIPS code isn't recognized.
90
+ */
87
91
  export function lookupFipsState(statefp: string | null | undefined): USStateInfo | null {
88
92
  if (!statefp) return null
89
93
 
package/src/golden.ts CHANGED
@@ -28,7 +28,9 @@ import { reconcileComponents } from "./format.ts"
28
28
 
29
29
  const TAG_SET = new Set<string>(COMPONENT_TAGS as readonly string[])
30
30
 
31
- /** One entry in a golden `.jsonl` file. */
31
+ /**
32
+ * One entry in a golden `.jsonl` file.
33
+ */
32
34
  export interface GoldenEntry {
33
35
  raw: string
34
36
  components: Partial<Record<ComponentTag, string>>
@@ -37,25 +39,31 @@ export interface GoldenEntry {
37
39
  notes?: string
38
40
  }
39
41
 
40
- /** Per-entry validation failure. */
42
+ /**
43
+ * Per-entry validation failure.
44
+ */
41
45
  export interface GoldenIssue {
42
46
  file: string
43
47
  line: number
44
48
  reason: string
45
49
  }
46
50
 
47
- /** Aggregate report from `validateGoldenDir`. */
51
+ /**
52
+ * Aggregate report from `validateGoldenDir`.
53
+ */
48
54
  export interface GoldenReport {
49
55
  entries: number
50
56
  files: number
51
57
  issues: GoldenIssue[]
52
58
  }
53
59
 
54
- /** Parse a single JSONL line into a `GoldenEntry`. Throws on schema violations. */
60
+ /**
61
+ * Parse a single JSONL line into a `GoldenEntry`. Throws on schema violations.
62
+ */
55
63
  export function parseGoldenLine(line: string): GoldenEntry {
56
64
  const obj = JSON.parse(line) as Partial<GoldenEntry> & Record<string, unknown>
57
65
 
58
- if (typeof obj.raw !== "string" || obj.raw.length === 0) {
66
+ if (typeof obj.raw !== "string" || !obj.raw.length) {
59
67
  throw new Error("missing/empty raw")
60
68
  }
61
69
 
@@ -66,12 +74,13 @@ export function parseGoldenLine(line: string): GoldenEntry {
66
74
  if (obj.source !== "golden") {
67
75
  throw new Error(`source must be "golden" (got ${JSON.stringify(obj.source)})`)
68
76
  }
77
+
69
78
  const components = (obj.components ?? {}) as Record<string, unknown>
70
79
 
71
80
  for (const [k, v] of Object.entries(components)) {
72
81
  if (!TAG_SET.has(k)) throw new Error(`unknown ComponentTag: ${k}`)
73
82
 
74
- if (typeof v !== "string" || v.length === 0) {
83
+ if (typeof v !== "string" || !v.length) {
75
84
  throw new Error(`components.${k} must be a non-empty string`)
76
85
  }
77
86
  }
@@ -85,7 +94,9 @@ export function parseGoldenLine(line: string): GoldenEntry {
85
94
  }
86
95
  }
87
96
 
88
- /** Check that every component in `entry` appears in `entry.raw` (reconciliation-equivalent). */
97
+ /**
98
+ * Check that every component in `entry` appears in `entry.raw` (reconciliation-equivalent).
99
+ */
89
100
  export function unreachableComponents(entry: GoldenEntry): ComponentTag[] {
90
101
  const reconciled = reconcileComponents(entry.components, entry.raw)
91
102
  const missing: ComponentTag[] = []
@@ -99,7 +110,9 @@ export function unreachableComponents(entry: GoldenEntry): ComponentTag[] {
99
110
  return missing
100
111
  }
101
112
 
102
- /** Validate one `.jsonl` file end-to-end, returning a list of issues. */
113
+ /**
114
+ * Validate one `.jsonl` file end-to-end, returning a list of issues.
115
+ */
103
116
  export async function validateGoldenFile(path: string): Promise<GoldenIssue[]> {
104
117
  const text = await readFile(path, "utf8")
105
118
  const lines = text.split("\n")
@@ -114,24 +127,26 @@ export async function validateGoldenFile(path: string): Promise<GoldenIssue[]> {
114
127
  const entry = parseGoldenLine(line)
115
128
  const unreachable = unreachableComponents(entry)
116
129
 
117
- if (unreachable.length > 0) {
130
+ if (unreachable.length) {
118
131
  issues.push({
119
132
  file: path,
120
133
  line: i + 1,
121
134
  reason: `components not reachable in raw: ${unreachable.join(", ")}`,
122
135
  })
123
136
  }
124
- } catch (err) {
125
- issues.push({ file: path, line: i + 1, reason: (err as Error).message })
137
+ } catch (error) {
138
+ issues.push({ file: path, line: i + 1, reason: (error as Error).message })
126
139
  }
127
140
  }
128
141
 
129
142
  return issues
130
143
  }
131
144
 
132
- /** Validate every `.jsonl` in a golden directory. */
145
+ /**
146
+ * Validate every `.jsonl` in a golden directory.
147
+ */
133
148
  export async function validateGoldenDir(dir: string): Promise<GoldenReport> {
134
- const files = (await readdir(dir)).filter((n) => extname(n) === ".jsonl").sort()
149
+ const files = (await readdir(dir)).filter((n) => extname(n) === ".jsonl").toSorted()
135
150
  const issues: GoldenIssue[] = []
136
151
  let entries = 0
137
152
 
package/src/license.ts CHANGED
@@ -37,10 +37,12 @@ export function compileLicenseExcludes(spec: string): RegExp[] {
37
37
  .split(",")
38
38
  .map((s) => s.trim())
39
39
  .filter(Boolean)
40
- .map((s) => new RegExp("^" + s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i"))
40
+ .map((s) => new RegExp("^" + s.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i"))
41
41
  }
42
42
 
43
- /** True iff `license` matches any of the exclude `patterns` (empty patterns → never excluded). */
43
+ /**
44
+ * True iff `license` matches any of the exclude `patterns` (empty patterns → never excluded).
45
+ */
44
46
  export function licenseExcluded(license: string | undefined, patterns: readonly RegExp[]): boolean {
45
47
  const l = license ?? ""
46
48
 
@@ -12,9 +12,11 @@ import { ParquetReader as BaseParquetReader } from "@dsnp/parquetjs"
12
12
  import type { BufferReaderOptions } from "@dsnp/parquetjs/dist/lib/bufferReader.js"
13
13
  import { ParquetEnvelopeReader } from "@dsnp/parquetjs/dist/lib/reader.js"
14
14
 
15
- import { type ParquetRecordLike, ParquetSchema } from "./schema.ts"
15
+ import type { ParquetSchema, ParquetRecordLike } from "./schema.ts"
16
16
 
17
- /** A typed Parquet reader, wrapping the base Parquet reader. */
17
+ /**
18
+ * A typed Parquet reader, wrapping the base Parquet reader.
19
+ */
18
20
  export class ParquetReader<T extends ParquetRecordLike> extends BaseParquetReader implements AsyncDisposable {
19
21
  declare schema: ParquetSchema<T>
20
22
 
@@ -47,9 +49,9 @@ export class ParquetReader<T extends ParquetRecordLike> extends BaseParquetReade
47
49
  const metadata = await envelopeReader.readFooter()
48
50
 
49
51
  return new ParquetReader<T>(metadata, envelopeReader, opts)
50
- } catch (err) {
52
+ } catch (error) {
51
53
  await envelopeReader.close()
52
- throw err
54
+ throw error
53
55
  }
54
56
  }
55
57
 
@@ -21,22 +21,26 @@ import type { createSBBFParams as BloomFilterCreation } from "@dsnp/parquetjs/di
21
21
  import type { FieldDefinition } from "@dsnp/parquetjs/dist/lib/declare.js"
22
22
  import { LRUCache } from "lru-cache"
23
23
 
24
- /** A Parquet record-like object, i.e. a record with string keys and JSON-serializable values. */
25
- export type ParquetRecordLike = {
26
- [key: string]: unknown | undefined
27
- }
24
+ /**
25
+ * A Parquet record-like object, i.e. a record with string keys and JSON-serializable values.
26
+ */
27
+ export type ParquetRecordLike = Record<string, unknown | undefined>
28
28
 
29
- /** Typed Parquet schema definition. */
30
- export type ParquetSchemaDefinition<T = ParquetRecordLike> = {
31
- [field in Extract<keyof T, string>]: FieldDefinition
32
- }
29
+ /**
30
+ * Typed Parquet schema definition.
31
+ */
32
+ export type ParquetSchemaDefinition<T = ParquetRecordLike> = Record<Extract<keyof T, string>, FieldDefinition>
33
33
 
34
- /** Typed Parquet schema. */
34
+ /**
35
+ * Typed Parquet schema.
36
+ */
35
37
  export class ParquetSchema<T> extends BaseParquetSchema {
36
38
  declare schema: ParquetSchemaDefinition<T>
37
39
  }
38
40
 
39
- /** Given a Parquet schema and a list of columns, create a list of Bloom filters for those columns. */
41
+ /**
42
+ * Given a Parquet schema and a list of columns, create a list of Bloom filters for those columns.
43
+ */
40
44
  export function createBloomFilters<T>(
41
45
  parquetSchemaDef: ParquetSchemaDefinition<T>,
42
46
  columns: Extract<keyof T, string>[]
@@ -51,7 +51,9 @@ export class ParquetWriter<T extends ParquetRecordLike> extends BaseParquetWrite
51
51
  return new ParquetWriter<T>(schema, envelopeWriter, opts)
52
52
  }
53
53
 
54
- /** Convenience method to create a new buffered parquet writer that writes to the specified file. */
54
+ /**
55
+ * Convenience method to create a new buffered parquet writer that writes to the specified file.
56
+ */
55
57
  static override async openFile<T extends ParquetRecordLike>(
56
58
  schemaLike: ParquetSchema<T> | ParquetSchemaDefinition<T>,
57
59
  sourcePath: string | Buffer | URL,
@@ -67,17 +69,23 @@ export class ParquetWriter<T extends ParquetRecordLike> extends BaseParquetWrite
67
69
  }
68
70
 
69
71
  // @note This fixes invalid Markdown in the base class JSDoc.
70
- /** Set a metadata key-value pair on the writer. */
72
+ /**
73
+ * Set a metadata key-value pair on the writer.
74
+ */
71
75
  public override setMetadata(key: string, value: string): void {
72
76
  return super.setMetadata(key, value)
73
77
  }
74
78
 
75
- /** Append a row to the buffer. If the buffer is full, the data will be written to disk. */
79
+ /**
80
+ * Append a row to the buffer. If the buffer is full, the data will be written to disk.
81
+ */
76
82
  public override async appendRow(row: T): Promise<void> {
77
83
  return super.appendRow(row)
78
84
  }
79
85
 
80
- /** Flush all buffered data to disk, close the file, and release resources. */
86
+ /**
87
+ * Flush all buffered data to disk, close the file, and release resources.
88
+ */
81
89
  public override async close(): Promise<void> {
82
90
  await this.#flushing
83
91
 
package/src/parquet.ts CHANGED
@@ -46,10 +46,14 @@ import { ParquetWriter, type ParquetSchemaDefinition } from "./parquet-wrapper/i
46
46
  import type { SplitName } from "./split.ts"
47
47
  import type { LabeledRow } from "./types.ts"
48
48
 
49
- /** Row groups flush at this many rows (parquetjs internal cadence within a shard). */
49
+ /**
50
+ * Row groups flush at this many rows (parquetjs internal cadence within a shard).
51
+ */
50
52
  export const ROW_GROUP_SIZE = 50_000
51
53
 
52
- /** Snappy is the only zstd-equivalent codec available in @dsnp/parquetjs 1.7.0. */
54
+ /**
55
+ * Snappy is the only zstd-equivalent codec available in @dsnp/parquetjs 1.7.0.
56
+ */
53
57
  export const SHARD_COMPRESSION = "SNAPPY" as const
54
58
 
55
59
  /**
@@ -74,7 +78,9 @@ export interface ParquetRow {
74
78
  [key: string]: unknown
75
79
  }
76
80
 
77
- /** Column names emitted into every shard. Matches `ParquetRow`. */
81
+ /**
82
+ * Column names emitted into every shard. Matches `ParquetRow`.
83
+ */
78
84
  export const PARQUET_COLUMNS = [
79
85
  "raw",
80
86
  "tokens",
@@ -92,6 +98,10 @@ export const PARQUET_COLUMNS = [
92
98
  "synth_base_id",
93
99
  ] as const
94
100
 
101
+ /* oxlint-disable unicorn/text-encoding-identifier-case -- `"UTF8"` below is a ParquetType enum member,
102
+ not a text-encoding identifier. Lowercasing it does not type-check against ParquetSchemaDefinition,
103
+ and the rule has no way to tell the two apart. */
104
+
95
105
  /**
96
106
  * Parquet schema for `LabeledRow` per #18 §4. Optional fields use `optional: true`; repeated UTF8 columns capture
97
107
  * tokens/labels arrays. Compression is per-column SNAPPY.
@@ -116,7 +126,9 @@ export const LABELED_ROW_SCHEMA: ParquetSchemaDefinition<ParquetRow> = {
116
126
  synth_base_id: { type: "UTF8", compression: SHARD_COMPRESSION, optional: true },
117
127
  }
118
128
 
119
- /** Per-shard metadata captured in `MANIFEST.json`. */
129
+ /**
130
+ * Per-shard metadata captured in `MANIFEST.json`.
131
+ */
120
132
  export interface ShardDescriptor {
121
133
  split: SplitName
122
134
  path: string
@@ -140,13 +152,19 @@ export interface ShardManifest {
140
152
  }
141
153
 
142
154
  export interface WriteShardsOptions {
143
- /** Root output directory; corpus version dir is created beneath. */
155
+ /**
156
+ * Root output directory; corpus version dir is created beneath.
157
+ */
144
158
  outputDir: string
145
159
 
146
- /** Corpus version stamped onto rows + into the output directory name. */
160
+ /**
161
+ * Corpus version stamped onto rows + into the output directory name.
162
+ */
147
163
  corpusVersion: string
148
164
 
149
- /** Max rows per `.parquet` shard. Default 1_000_000 per the Phase 1 plan. */
165
+ /**
166
+ * Max rows per `.parquet` shard. Default 1_000_000 per the Phase 1 plan.
167
+ */
150
168
  rowsPerShard?: number
151
169
  }
152
170
 
@@ -274,9 +292,11 @@ export async function writeShards(perSplit: PerSplitRows, opts: WriteShardsOptio
274
292
  const splitDir = join(corpusDir, split)
275
293
  await mkdir(splitDir, { recursive: true })
276
294
  path = join(splitDir, `part-${String(shardIndex).padStart(4, "0")}.parquet`)
295
+
277
296
  writer = await ParquetWriter.openFile<ParquetRow>(LABELED_ROW_SCHEMA, path, {
278
297
  rowGroupSize: ROW_GROUP_SIZE,
279
298
  })
299
+
280
300
  writer.setMetadata("mailwoman.corpus_version", opts.corpusVersion)
281
301
  writer.setMetadata("mailwoman.split", split)
282
302
  writer.setMetadata("mailwoman.shard_index", String(shardIndex))
@@ -292,6 +312,7 @@ export async function writeShards(perSplit: PerSplitRows, opts: WriteShardsOptio
292
312
  if (shardRows > 0) {
293
313
  const fileStat = await stat(path)
294
314
  const sha256 = await hashFile(path)
315
+
295
316
  shards.push({
296
317
  split,
297
318
  path,
@@ -304,6 +325,7 @@ export async function writeShards(perSplit: PerSplitRows, opts: WriteShardsOptio
304
325
  last_source_id: lastSourceID,
305
326
  })
306
327
  }
328
+
307
329
  writer = null
308
330
  }
309
331
 
@@ -311,19 +333,25 @@ export async function writeShards(perSplit: PerSplitRows, opts: WriteShardsOptio
311
333
  if (!writer) {
312
334
  await openShard()
313
335
  }
336
+
314
337
  const pq = rowToParquet(row)
315
338
  await writer!.appendRow(appendShape(pq) as unknown as ParquetRow)
316
339
 
317
340
  if (shardRows === 0) {
318
341
  firstSourceID = row.source_id
319
342
  }
343
+
320
344
  lastSourceID = row.source_id
345
+
321
346
  shardRows++
347
+
322
348
  counts[split]++
349
+
323
350
  totalRows++
324
351
 
325
352
  if (shardRows >= rowsPerShard) {
326
353
  await closeShard()
354
+
327
355
  shardIndex++
328
356
  }
329
357
  }
@@ -342,12 +370,15 @@ export async function writeShards(perSplit: PerSplitRows, opts: WriteShardsOptio
342
370
  counts,
343
371
  total_rows: totalRows,
344
372
  }
373
+
345
374
  await writeFile(join(corpusDir, "MANIFEST.json"), `${JSON.stringify(manifest, null, 2)}\n`, "utf8")
346
375
 
347
376
  return manifest
348
377
  }
349
378
 
350
- /** Single-pass SHA-256 over the file at `path`. Cheap relative to Parquet write throughput. */
379
+ /**
380
+ * Single-pass SHA-256 over the file at `path`. Cheap relative to Parquet write throughput.
381
+ */
351
382
  async function hashFile(path: string): Promise<string> {
352
383
  const hash = createHash("sha256")
353
384
  const stream = createReadStream(path)
package/src/runner.ts CHANGED
@@ -34,36 +34,58 @@ import { dirname, join } from "node:path"
34
34
  import { canonicalDedupKey, streamingSha256, type AdapterRegistry, type StreamingHasher } from "./adapter.ts"
35
35
  import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "./types.ts"
36
36
 
37
- /** Snapshot of the runner's state, emitted on every progress tick. */
37
+ /**
38
+ * Snapshot of the runner's state, emitted on every progress tick.
39
+ */
38
40
  export interface RunnerProgress {
39
- /** Adapter being driven. */
41
+ /**
42
+ * Adapter being driven.
43
+ */
40
44
  adapterID: string
41
45
 
42
- /** Total rows the adapter has yielded (before dedup). */
46
+ /**
47
+ * Total rows the adapter has yielded (before dedup).
48
+ */
43
49
  yielded: number
44
50
 
45
- /** Rows actually written to JSONL (after dedup). */
51
+ /**
52
+ * Rows actually written to JSONL (after dedup).
53
+ */
46
54
  written: number
47
55
 
48
- /** Bytes written to JSONL so far. */
56
+ /**
57
+ * Bytes written to JSONL so far.
58
+ */
49
59
  bytes: number
50
60
 
51
- /** Wall-clock milliseconds since the run started. */
61
+ /**
62
+ * Wall-clock milliseconds since the run started.
63
+ */
52
64
  elapsed_ms: number
53
65
  }
54
66
 
55
- /** Per-invocation options for `runAdapter`. */
67
+ /**
68
+ * Per-invocation options for `runAdapter`.
69
+ */
56
70
  export interface RunAdapterOptions {
57
- /** Adapter to drive. */
71
+ /**
72
+ * Adapter to drive.
73
+ */
58
74
  adapter: CorpusAdapter
59
75
 
60
- /** Options handed to the adapter (input path, country filter, limit, signal). */
76
+ /**
77
+ * Options handed to the adapter (input path, country filter, limit, signal).
78
+ */
61
79
  adapterOptions: AdapterOptions
62
80
 
63
- /** Root output directory; the runner creates `<outputDir>/<adapter.id>/` under it. */
81
+ /**
82
+ * Root output directory; the runner creates `<outputDir>/<adapter.id>/` under it.
83
+ */
64
84
  outputDir: string
65
85
 
66
- /** Corpus version stamped onto every row. Locked together with the tokenizer version. */
86
+ /**
87
+ * Corpus version stamped onto every row. Locked together with the tokenizer version.
88
+ */
67
89
  corpusVersion: string
68
90
 
69
91
  /**
@@ -79,7 +101,9 @@ export interface RunAdapterOptions {
79
101
  progressEvery?: number
80
102
  }
81
103
 
82
- /** Return value of `runAdapter`: the same shape as `MANIFEST.json` on disk. */
104
+ /**
105
+ * Return value of `runAdapter`: the same shape as `MANIFEST.json` on disk.
106
+ */
83
107
  export interface AdapterRunManifest {
84
108
  adapter_id: string
85
109
  corpus_version: string
@@ -105,7 +129,7 @@ export interface AdapterRunManifest {
105
129
  */
106
130
  export async function runAdapter(opts: RunAdapterOptions): Promise<AdapterRunManifest> {
107
131
  const { adapter, adapterOptions, outputDir, corpusVersion } = opts
108
- const progressEvery = opts.progressEvery ?? 1_000
132
+ const progressEvery = opts.progressEvery ?? 1000
109
133
 
110
134
  const adapterDir = join(outputDir, adapter.id)
111
135
  await mkdir(adapterDir, { recursive: true })
@@ -153,11 +177,13 @@ export async function runAdapter(opts: RunAdapterOptions): Promise<AdapterRunMan
153
177
  if (yielded % progressEvery === 0) {
154
178
  emitProgress()
155
179
  }
180
+
156
181
  continue
157
182
  }
158
183
 
159
184
  if (seen.size >= DEDUP_MAX_SIZE) {
160
185
  dedupExhausted = true
186
+
161
187
  process.stderr.write(
162
188
  ` runner: dedup set full at ${DEDUP_MAX_SIZE.toLocaleString()} — skipping dedup for remaining rows\n`
163
189
  )
@@ -169,6 +195,7 @@ export async function runAdapter(opts: RunAdapterOptions): Promise<AdapterRunMan
169
195
  const line = `${JSON.stringify(stamped)}\n`
170
196
  hasher.update(line)
171
197
  bytes += Buffer.byteLength(line, "utf8")
198
+
172
199
  written++
173
200
 
174
201
  if (!stream.write(line)) {
@@ -223,6 +250,7 @@ export async function runAllAdapters(
223
250
 
224
251
  for (const adapter of registry.list()) {
225
252
  const adapterOptions = common.adapterOptionsFor?.(adapter) ?? common.adapterOptions
253
+
226
254
  out.push(
227
255
  await runAdapter({
228
256
  ...common,
@@ -261,23 +289,29 @@ function assertEmittedRow(adapter: CorpusAdapter, row: CanonicalRow): void {
261
289
  }
262
290
  }
263
291
 
264
- /** Promise-ify a single event emission. Used to await `drain` / `close` on the write stream. */
292
+ /**
293
+ * Promise-ify a single event emission. Used to await `drain` / `close` on the write stream.
294
+ */
265
295
  function once(emitter: WriteStream, event: "drain" | "close"): Promise<void> {
266
296
  return new Promise((resolve, reject) => {
267
297
  const onEvent = (): void => {
268
298
  emitter.off("error", onError)
269
299
  resolve()
270
300
  }
301
+
271
302
  const onError = (err: Error): void => {
272
303
  emitter.off(event, onEvent)
273
304
  reject(err)
274
305
  }
306
+
275
307
  emitter.once(event, onEvent)
276
308
  emitter.once("error", onError)
277
309
  })
278
310
  }
279
311
 
280
- /** Convenience: ensure the parent directory of `filePath` exists. */
312
+ /**
313
+ * Convenience: ensure the parent directory of `filePath` exists.
314
+ */
281
315
  export async function ensureParentDir(filePath: string): Promise<void> {
282
316
  await mkdir(dirname(filePath), { recursive: true })
283
317
  }
@@ -21,11 +21,15 @@ import { alignRow } from "../align.ts"
21
21
  import { synthesizeAnchorAbsorptionRow } from "../synthesize-anchor-absorption.ts"
22
22
  import { makeLcg, type ShardRecipe } from "./scaffold.ts"
23
23
 
24
- // The leading-5-digit source: the real US ZIPs in the postcode anchor's pilot lookup. Resolved through
25
- // the data-root helper (the lab default is `$MAILWOMAN_DATA_ROOT`), never re-hardcoded.
24
+ /**
25
+ * The leading-5-digit source: the real US ZIPs in the postcode anchor's pilot lookup. Resolved through the data-root
26
+ * helper (the lab default is `$MAILWOMAN_DATA_ROOT`), never re-hardcoded.
27
+ */
26
28
  const ANCHOR_LOOKUP = dataRootPath("anchor", "pilot-anchor-lookup.json")
27
29
 
28
- /** The real US ZIPs in the anchor lookup (entries whose value is a `[{ US: … }]` candidate list). */
30
+ /**
31
+ * The real US ZIPs in the anchor lookup (entries whose value is a `[{ US: … }]` candidate list).
32
+ */
29
33
  function loadRealUsZips(path: string): string[] {
30
34
  const d = JSON.parse(readFileSync(path, "utf8")) as Record<string, unknown>
31
35
  const zips: string[] = []
@@ -39,6 +43,10 @@ function loadRealUsZips(path: string): string[] {
39
43
  return zips
40
44
  }
41
45
 
46
+ /**
47
+ * Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
48
+ * and `description` below for the surface form it generates.
49
+ */
42
50
  export const anchorAbsorptionRecipe: ShardRecipe = {
43
51
  name: "anchor-absorption",
44
52
  description: "Anchor-absorption counter-augmentation (#220/#723): 6-slice mix → synthesizeAnchorAbsorptionRow",
@@ -47,8 +55,9 @@ export const anchorAbsorptionRecipe: ShardRecipe = {
47
55
  // Emit PRNG: the legacy build-anchor-absorption-shard.mjs seeded an LCG (lcg(opts.seed)).
48
56
  const random = makeLcg(opts.seed)
49
57
  const source = opts.sourceName ?? "synth-anchor-absorption"
50
- const count = opts.count ?? 50000
58
+ const count = opts.count ?? 50_000
51
59
  const realZips = loadRealUsZips(ANCHOR_LOOKUP)
60
+
52
61
  console.error(`Loaded ${realZips.length} real US ZIPs from the anchor lookup (the leading-5-digit source).`)
53
62
 
54
63
  let written = 0
@@ -57,7 +66,9 @@ export const anchorAbsorptionRecipe: ShardRecipe = {
57
66
 
58
67
  for (let i = 0; i < count; i++) {
59
68
  const synth = synthesizeAnchorAbsorptionRow({ random, realZips })
60
- const country = synth.locale.split("-")[1] // "en-US" -> "US", "de-DE" -> "DE"
69
+ const country = synth.locale.split("-")[1]
70
+
71
+ // "en-US" -> "US", "de-DE" -> "DE"
61
72
  const canonical = {
62
73
  raw: synth.raw,
63
74
  components: synth.components,
@@ -66,18 +77,23 @@ export const anchorAbsorptionRecipe: ShardRecipe = {
66
77
  source,
67
78
  source_id: stableSourceID(source, `${i}` as unknown as Parameters<typeof stableSourceID>[1]),
68
79
  }
80
+
69
81
  const aligned = alignRow(canonical as Parameters<typeof alignRow>[0])
70
82
 
71
83
  if (aligned.kind !== "labeled") {
72
84
  quarantined++
85
+
73
86
  continue
74
87
  }
88
+
75
89
  write(
76
90
  JSON.stringify({ ...aligned.row, synth_method: "anchor-absorption", synth_template: synth.template }) + "\n"
77
91
  )
92
+
78
93
  written++
79
94
  byTemplate[synth.template] = (byTemplate[synth.template] ?? 0) + 1
80
95
  }
96
+
81
97
  console.error(`\nwrote ${written} rows (${quarantined} quarantined)`)
82
98
  console.error(" by slice:", JSON.stringify(byTemplate))
83
99