@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
@@ -38,9 +38,14 @@ import { alignRow } from "../align.ts"
38
38
  import type { CanonicalRow } from "../types.ts"
39
39
  import { makeMulberry32, type ShardRecipe } from "./scaffold.ts"
40
40
 
41
- const DEFAULT_LICENSE = "Licence Ouverte 2.0" // matches the `ban` adapter's Tier-B election for BAN data
41
+ /**
42
+ * Matches the `ban` adapter's Tier-B election for BAN data.
43
+ */
44
+ const DEFAULT_LICENSE = "Licence Ouverte 2.0"
42
45
 
43
- /** One BAN row surviving the lieu-dit filter — the minimal tuple the pool holds. */
46
+ /**
47
+ * One BAN row surviving the lieu-dit filter — the minimal tuple the pool holds.
48
+ */
44
49
  interface LieuDitTuple {
45
50
  numero: string
46
51
  rep: string | null
@@ -60,7 +65,7 @@ interface LieuDitTuple {
60
65
  function departementFiles(banDir: string): string[] {
61
66
  const byDept = new Map<string, string>()
62
67
 
63
- for (const name of readdirSync(banDir).sort()) {
68
+ for (const name of readdirSync(banDir).toSorted()) {
64
69
  const m = /^adresses-(.+?)\.csv(\.gz)?$/.exec(name)
65
70
 
66
71
  if (!m) continue
@@ -76,14 +81,16 @@ function departementFiles(banDir: string): string[] {
76
81
  }
77
82
  }
78
83
 
79
- return [...byDept.keys()].sort().map((dept) => byDept.get(dept)!)
84
+ return [...byDept.keys()].toSorted().map((dept) => byDept.get(dept)!)
80
85
  }
81
86
 
82
- /** Stream every département file, keeping only rows with a clean `lieuDit` (junk/dup filtering lives in `ban/sdk`). */
87
+ /**
88
+ * Stream every département file, keeping only rows with a clean `lieuDit` (junk/dup filtering lives in `ban/sdk`).
89
+ */
83
90
  async function readLieuDitPool(banDir: string): Promise<LieuDitTuple[]> {
84
91
  const files = departementFiles(banDir)
85
92
 
86
- if (files.length === 0) {
93
+ if (!files.length) {
87
94
  throw new Error(
88
95
  `No BAN adresses-<dept>.csv files found in ${banDir} — fetch BAN first (\`mailwoman corpus fetch ban\`).`
89
96
  )
@@ -108,10 +115,13 @@ async function readLieuDitPool(banDir: string): Promise<LieuDitTuple[]> {
108
115
  locality: rec.city,
109
116
  dependentLocality: rec.lieuDit,
110
117
  })
118
+
111
119
  deptCount++
112
120
  }
121
+
113
122
  console.error(` ${path}: ${deptCount.toLocaleString()} clean lieu-dit rows`)
114
123
  }
124
+
115
125
  console.error(
116
126
  ` scanned ${scanned.toLocaleString()} BAN rows across ${files.length} départements → pool=${pool.length.toLocaleString()}`
117
127
  )
@@ -119,7 +129,9 @@ async function readLieuDitPool(banDir: string): Promise<LieuDitTuple[]> {
119
129
  return pool
120
130
  }
121
131
 
122
- /** `house_number` = `numero` + folded `rep` ("10 bis"), matching the `ban` adapter's own composition. */
132
+ /**
133
+ * `house_number` = `numero` + folded `rep` ("10 bis"), matching the `ban` adapter's own composition.
134
+ */
123
135
  function composeHouseNumber(numero: string, rep: string | null): string {
124
136
  return rep ? `${numero} ${rep}` : numero
125
137
  }
@@ -142,6 +154,7 @@ function composeRaw(
142
154
  if (streetLine) {
143
155
  lines.push(streetLine)
144
156
  }
157
+
145
158
  lines.push(dependentLocality)
146
159
  const cityLine = [postcode, locality].filter(Boolean).join(" ").trim()
147
160
 
@@ -152,7 +165,9 @@ function composeRaw(
152
165
  return lines.join("\n")
153
166
  }
154
167
 
155
- /** Fisher-Yates shuffle, in place, with the recipe's seeded PRNG — reproducible sampling without replacement. */
168
+ /**
169
+ * Fisher-Yates shuffle, in place, with the recipe's seeded PRNG — reproducible sampling without replacement.
170
+ */
156
171
  function shuffleInPlace<T>(arr: T[], random: () => number): void {
157
172
  for (let i = arr.length - 1; i > 0; i--) {
158
173
  const j = Math.floor(random() * (i + 1))
@@ -160,6 +175,10 @@ function shuffleInPlace<T>(arr: T[], random: () => number): void {
160
175
  }
161
176
  }
162
177
 
178
+ /**
179
+ * Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
180
+ * and `description` below for the surface form it generates.
181
+ */
163
182
  export const frLieuditRecipe: ShardRecipe = {
164
183
  name: "fr-lieudit",
165
184
  description: "FR lieu-dit rows: BAN nom_ld → dependent_locality (commune → locality), lieu-dit on its own line",
@@ -187,7 +206,7 @@ export const frLieuditRecipe: ShardRecipe = {
187
206
 
188
207
  const pool = await readLieuDitPool(banDir)
189
208
 
190
- if (pool.length === 0) {
209
+ if (!pool.length) {
191
210
  throw new Error(`No clean lieu-dit rows found under ${banDir} — see ban/sdk/extract.ts's cleanLieuDit filter.`)
192
211
  }
193
212
 
@@ -224,6 +243,7 @@ export const frLieuditRecipe: ShardRecipe = {
224
243
 
225
244
  if (!raw) {
226
245
  skipped++
246
+
227
247
  continue
228
248
  }
229
249
 
@@ -237,6 +257,7 @@ export const frLieuditRecipe: ShardRecipe = {
237
257
  const form = forms[Math.floor(random() * forms.length)]!
238
258
  raw = `${raw}, ${form}`
239
259
  components.country = form
260
+
240
261
  countryAppended++
241
262
  }
242
263
 
@@ -247,6 +268,7 @@ export const frLieuditRecipe: ShardRecipe = {
247
268
  locality: t.locality,
248
269
  postcode: t.postcode ?? undefined,
249
270
  })
271
+
250
272
  const canonical: CanonicalRow = {
251
273
  raw,
252
274
  components,
@@ -257,13 +279,17 @@ export const frLieuditRecipe: ShardRecipe = {
257
279
  corpus_version: "",
258
280
  license: DEFAULT_LICENSE,
259
281
  }
282
+
260
283
  const aligned = alignRow(canonical)
261
284
 
262
285
  if (aligned.kind !== "labeled" || !aligned.row) {
263
286
  skipped++
287
+
264
288
  continue
265
289
  }
290
+
266
291
  write(JSON.stringify({ ...aligned.row, synth_method: source, synth_base_id: null }) + "\n")
292
+
267
293
  emitted++
268
294
  }
269
295
 
@@ -39,16 +39,30 @@ import { alignRow } from "../align.ts"
39
39
  import type { CanonicalRow } from "../types.ts"
40
40
  import { makeMulberry32, type ShardRecipe } from "./scaffold.ts"
41
41
 
42
+ /* oxlint-disable sister-software/no-unnamed-threshold -- the bare decimals below are weighted-sampler
43
+ cutoffs, not thresholds: `const r = random()` followed by a cascade of `r < 0.4` branches IS the
44
+ output distribution, and reading the cascade top-to-bottom is how you see it. Naming each cutoff
45
+ would hide the distribution behind a wall of identifiers. Genuine thresholds in these files are
46
+ extracted as named constants above. */
47
+
42
48
  const SOURCE = { zip: "/tmp/oa-cache/fr__countrywide.zip", csv: "fr/countrywide.csv" }
43
49
 
44
- // Ordinal suffixes used in French house numbers (BAN corpus), to cover the "8 bis" sub-mode.
50
+ /**
51
+ * Ordinal suffixes used in French house numbers (BAN corpus), to cover the "8 bis" sub-mode.
52
+ */
45
53
  const ORDINAL_SUFFIXES: readonly string[] = ["bis", "ter", "quater"]
46
- // Probability that a row gets an ordinal suffix injected (matches the golden's ~10-15% rate).
54
+ /**
55
+ * Probability that a row gets an ordinal suffix injected (matches the golden's ~10-15% rate).
56
+ */
47
57
  const ORDINAL_PROB = 0.12
48
- // Probability that a locality renders ALL-CAPS (another sub-mode: "SAINTE-LIVRADE-SUR-LOT").
58
+ /**
59
+ * Probability that a locality renders ALL-CAPS (another sub-mode: "SAINTE-LIVRADE-SUR-LOT").
60
+ */
49
61
  const ALLCAPS_PROB = 0.1
50
62
 
51
- /** A real FR tuple read out of the cached OA zip. */
63
+ /**
64
+ * A real FR tuple read out of the cached OA zip.
65
+ */
52
66
  interface FrTuple {
53
67
  house_number: string
54
68
  street: string
@@ -56,7 +70,9 @@ interface FrTuple {
56
70
  postcode: string
57
71
  }
58
72
 
59
- /** Minimal RFC-4180-ish splitter (handles quoted fields with doubled-quote escaping). */
73
+ /**
74
+ * Minimal RFC-4180-ish splitter (handles quoted fields with doubled-quote escaping).
75
+ */
60
76
  function splitCSV(line: string): string[] {
61
77
  const out: string[] = []
62
78
  let cur = ""
@@ -69,6 +85,7 @@ function splitCSV(line: string): string[] {
69
85
  if (c === '"') {
70
86
  if (line[i + 1] === '"') {
71
87
  cur += '"'
88
+
72
89
  i++
73
90
  } else {
74
91
  inQ = false
@@ -85,6 +102,7 @@ function splitCSV(line: string): string[] {
85
102
  cur += c
86
103
  }
87
104
  }
105
+
88
106
  out.push(cur)
89
107
 
90
108
  return out
@@ -96,7 +114,8 @@ function splitCSV(line: string): string[] {
96
114
  * reversed-order rendering to be meaningful).
97
115
  */
98
116
  function readTuples(limit: number): FrTuple[] {
99
- const maxLines = Math.max(limit * 8, 40000) + 1
117
+ const maxLines = Math.max(limit * 8, 40_000) + 1
118
+
100
119
  const r = spawnSync("bash", ["-c", `unzip -p "${SOURCE.zip}" "${SOURCE.csv}" | head -n ${maxLines}`], {
101
120
  maxBuffer: 1024 * 1024 * 1024,
102
121
  encoding: "buffer",
@@ -107,15 +126,18 @@ function readTuples(limit: number): FrTuple[] {
107
126
 
108
127
  return []
109
128
  }
129
+
110
130
  const lines = r.stdout.toString("utf8").split(/\r?\n/)
111
131
 
112
132
  if (lines.length < 2) return []
113
133
  const header = splitCSV(lines[0]!).map((h) => h.trim().toLowerCase())
114
134
  const idx = (name: string): number => header.indexOf(name)
135
+
115
136
  const iNum = idx("number"),
116
137
  iStreet = idx("street"),
117
138
  iCity = idx("city"),
118
139
  iPost = idx("postcode")
140
+
119
141
  const get = (cells: string[], i: number): string => (i >= 0 && i < cells.length ? (cells[i] ?? "").trim() : "")
120
142
  const tuples: FrTuple[] = []
121
143
  const seen = new Set<string>()
@@ -152,7 +174,9 @@ function maybeAddOrdinal(random: () => number, house_number: string): string {
152
174
  return `${house_number} ${random() < 0.5 ? suffix : suffix.toUpperCase()}`
153
175
  }
154
176
 
155
- /** Render a tuple in CANONICAL French order: "9 Rue de la Promenade, 01200 Villes". */
177
+ /**
178
+ * Render a tuple in CANONICAL French order: "9 Rue de la Promenade, 01200 Villes".
179
+ */
156
180
  function renderCanonical(
157
181
  hn: string,
158
182
  street: string,
@@ -164,6 +188,10 @@ function renderCanonical(
164
188
  return { raw, components: { house_number: hn, street, postcode, locality } }
165
189
  }
166
190
 
191
+ /**
192
+ * Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
193
+ * and `description` below for the surface form it generates.
194
+ */
167
195
  export const frOrderRecipe: ShardRecipe = {
168
196
  name: "fr-order",
169
197
  description: "French reversed-order rows (#560): real OA FR tuples rendered canonical + 4 postcode-first variants",
@@ -182,11 +210,12 @@ export const frOrderRecipe: ShardRecipe = {
182
210
  const reversedFraction = opts.reversedFraction ?? 0.5
183
211
 
184
212
  // Over-read from the CSV so the dedup + filter pass can fill `count` rows.
185
- const poolLimit = Math.max(count * 8, 40000)
213
+ const poolLimit = Math.max(count * 8, 40_000)
186
214
  const pool = readTuples(poolLimit)
215
+
187
216
  console.error(` ${SOURCE.csv}: ${pool.length} unique tuples (capped read)`)
188
217
 
189
- if (pool.length === 0) {
218
+ if (!pool.length) {
190
219
  throw new Error("No FR tuples found — is /tmp/oa-cache/fr__countrywide.zip present?")
191
220
  }
192
221
 
@@ -223,6 +252,7 @@ export const frOrderRecipe: ShardRecipe = {
223
252
  // Variant D: postcode, HN+street, city (reversed top-to-bottom)
224
253
  raw = `${postcode}, ${house_number} ${street}, ${locality}`
225
254
  }
255
+
226
256
  rendered = { raw, components: { house_number, street, postcode, locality } }
227
257
  } else {
228
258
  rendered = renderCanonical(house_number, street, postcode, locality)
@@ -235,13 +265,16 @@ export const frOrderRecipe: ShardRecipe = {
235
265
 
236
266
  if (!componentValues.every((v) => raw.includes(v))) {
237
267
  skipped++
268
+
238
269
  continue
239
270
  }
240
271
 
241
272
  // --golden: emit per-locale-f1 eval rows ({raw, components, country:"FR"}).
242
273
  if (opts.golden) {
243
274
  write(JSON.stringify({ raw, components, country: "FR" }) + "\n")
275
+
244
276
  emitted++
277
+
245
278
  continue
246
279
  }
247
280
 
@@ -251,6 +284,7 @@ export const frOrderRecipe: ShardRecipe = {
251
284
  locality: components.locality,
252
285
  postcode: components.postcode,
253
286
  })
287
+
254
288
  const canonical: CanonicalRow = {
255
289
  raw,
256
290
  components,
@@ -261,12 +295,15 @@ export const frOrderRecipe: ShardRecipe = {
261
295
  corpus_version: "0.5.0",
262
296
  license: "OpenAddresses FR countrywide tuples, rendered canonical + reversed-order — see ingest SOURCE",
263
297
  }
298
+
264
299
  const aligned = alignRow(canonical)
265
300
 
266
301
  if (aligned.kind !== "labeled" || !aligned.row) {
267
302
  skipped++
303
+
268
304
  continue
269
305
  }
306
+
270
307
  write(
271
308
  JSON.stringify({
272
309
  ...aligned.row,
@@ -275,6 +312,7 @@ export const frOrderRecipe: ShardRecipe = {
275
312
  synth_base_id: null,
276
313
  }) + "\n"
277
314
  )
315
+
278
316
  emitted++
279
317
  }
280
318
 
@@ -31,15 +31,19 @@ interface GermanSource {
31
31
  region: string
32
32
  }
33
33
 
34
- // `region` is the Bundesland the source covers. OA's REGION column is empty for DE, but the region is
35
- // implied by the per-state file — the international order needs it for the "City, Region Postcode" tail
36
- // (v0.9.3 / #327). berlin.csv → Berlin (a city-state, region==locality); sn/statewide → Sachsen.
34
+ /**
35
+ * `region` is the Bundesland the source covers. OA's REGION column is empty for DE, but the region is implied by the
36
+ * per-state file — the international order needs it for the "City, Region Postcode" tail (v0.9.3 / #327). berlin.csv →
37
+ * Berlin (a city-state, region==locality); sn/statewide → Sachsen.
38
+ */
37
39
  const SOURCES: GermanSource[] = [
38
40
  { zip: "/tmp/oa-cache/de__berlin.zip", csv: "de/berlin.csv", region: "Berlin" },
39
41
  { zip: "/tmp/oa-cache/de__sn__statewide.zip", csv: "de/sn/statewide.csv", region: "Sachsen" },
40
42
  ]
41
43
 
42
- /** Minimal RFC-4180-ish splitter (handles quoted fields). */
44
+ /**
45
+ * Minimal RFC-4180-ish splitter (handles quoted fields).
46
+ */
43
47
  function splitCSV(line: string): string[] {
44
48
  const out: string[] = []
45
49
  let cur = ""
@@ -52,6 +56,7 @@ function splitCSV(line: string): string[] {
52
56
  if (c === '"') {
53
57
  if (line[i + 1] === '"') {
54
58
  cur += '"'
59
+
55
60
  i++
56
61
  } else {
57
62
  inQ = false
@@ -68,12 +73,15 @@ function splitCSV(line: string): string[] {
68
73
  cur += c
69
74
  }
70
75
  }
76
+
71
77
  out.push(cur)
72
78
 
73
79
  return out
74
80
  }
75
81
 
76
- /** Stream real German tuples out of a cached OA zip (buffered `unzip -p`). */
82
+ /**
83
+ * Stream real German tuples out of a cached OA zip (buffered `unzip -p`).
84
+ */
77
85
  function readGermanTuples(source: GermanSource): LocaleBaseTuple[] {
78
86
  const r = spawnSync("unzip", ["-p", source.zip, source.csv], { maxBuffer: 1024 * 1024 * 1024, encoding: "buffer" })
79
87
 
@@ -82,16 +90,19 @@ function readGermanTuples(source: GermanSource): LocaleBaseTuple[] {
82
90
 
83
91
  return []
84
92
  }
93
+
85
94
  const lines = r.stdout.toString("utf8").split(/\r?\n/)
86
95
 
87
96
  if (lines.length < 2) return []
88
97
  const header = splitCSV(lines[0]!).map((h) => h.trim().toLowerCase())
89
98
  const idx = (name: string): number => header.indexOf(name)
99
+
90
100
  const iNum = idx("number"),
91
101
  iStreet = idx("street"),
92
102
  iCity = idx("city"),
93
103
  iRegion = idx("region"),
94
104
  iPost = idx("postcode")
105
+
95
106
  const get = (cells: string[], i: number): string => (i >= 0 && i < cells.length ? (cells[i] ?? "").trim() : "")
96
107
  const tuples: LocaleBaseTuple[] = []
97
108
  const seen = new Set<string>()
@@ -119,6 +130,10 @@ function readGermanTuples(source: GermanSource): LocaleBaseTuple[] {
119
130
  return tuples
120
131
  }
121
132
 
133
+ /**
134
+ * Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
135
+ * and `description` below for the surface form it generates.
136
+ */
122
137
  export const germanRecipe: ShardRecipe = {
123
138
  name: "german",
124
139
  description: "German coverage rows from real OA tuples (Berlin/Saxony), both orders → synthesizeGermanRow",
@@ -133,6 +148,7 @@ export const germanRecipe: ShardRecipe = {
133
148
  if (!(intlFraction >= 0 && intlFraction <= 1)) {
134
149
  throw new Error(`--intl-fraction must be in [0, 1], got ${intlFraction}`)
135
150
  }
151
+
136
152
  const count = opts.count ?? 4000
137
153
 
138
154
  // Pool real tuples from every German source, then sample `count` rows from it.
@@ -140,6 +156,7 @@ export const germanRecipe: ShardRecipe = {
140
156
 
141
157
  for (const s of SOURCES) {
142
158
  const t = readGermanTuples(s)
159
+
143
160
  console.error(` ${s.csv}: ${t.length} unique tuples`)
144
161
 
145
162
  for (const x of t) {
@@ -147,7 +164,7 @@ export const germanRecipe: ShardRecipe = {
147
164
  } // NOT pool.push(...t) — spreading ~840K args overflows the stack
148
165
  }
149
166
 
150
- if (pool.length === 0) {
167
+ if (!pool.length) {
151
168
  throw new Error("No German tuples found — are the cached zips present in /tmp/oa-cache?")
152
169
  }
153
170
 
@@ -165,6 +182,7 @@ export const germanRecipe: ShardRecipe = {
165
182
 
166
183
  if (!synth) {
167
184
  skipped++
185
+
168
186
  continue
169
187
  }
170
188
 
@@ -172,15 +190,19 @@ export const germanRecipe: ShardRecipe = {
172
190
  // rides along so the eval can stratify native vs international.
173
191
  if (opts.golden) {
174
192
  write(JSON.stringify({ raw: synth.raw, components: synth.components, country: "DE", order }) + "\n")
193
+
175
194
  emitted++
195
+
176
196
  continue
177
197
  }
198
+
178
199
  const sourceID = stableSourceID(source, {
179
200
  street: synth.components.street,
180
201
  house_number: synth.components.house_number,
181
202
  locality: synth.components.locality,
182
203
  postcode: synth.components.postcode,
183
204
  })
205
+
184
206
  const canonical = {
185
207
  raw: synth.raw,
186
208
  components: synth.components,
@@ -191,13 +213,17 @@ export const germanRecipe: ShardRecipe = {
191
213
  corpus_version: "0.4.0",
192
214
  license: `OpenAddresses DE (Berlin/Saxony) tuples, rendered ${order}-order — see ingest SOURCES`,
193
215
  }
216
+
194
217
  const aligned = alignRow(canonical as Parameters<typeof alignRow>[0])
195
218
 
196
219
  if (aligned.kind !== "labeled" || !aligned.row) {
197
220
  skipped++
221
+
198
222
  continue
199
223
  }
224
+
200
225
  write(JSON.stringify({ ...aligned.row, synth_method: "german", synth_order: order, synth_base_id: null }) + "\n")
226
+
201
227
  emitted++
202
228
  }
203
229
 
@@ -15,6 +15,10 @@ import { alignAndWrite, makeLcg, readTuples, shardSourceID, type ShardRecipe } f
15
15
 
16
16
  const LICENSE = "Synthetic — derived from CC-BY / public-domain input tuples"
17
17
 
18
+ /**
19
+ * Shard recipe registered with the corpus builder — see the file header for the parse behaviour it exists to exercise,
20
+ * and `description` below for the surface form it generates.
21
+ */
18
22
  export const houseVenueRecipe: ShardRecipe = {
19
23
  name: "house-venue",
20
24
  description: "House_number+venue co-occurrence rows: tuples → synthesizeHouseVenueRow → aligned LabeledRow",
@@ -33,6 +37,7 @@ export const houseVenueRecipe: ShardRecipe = {
33
37
 
34
38
  if (!tuple.locality || !tuple.region || !tuple.postcode || !tuple.country) {
35
39
  skipped++
40
+
36
41
  continue
37
42
  }
38
43
 
@@ -41,8 +46,10 @@ export const houseVenueRecipe: ShardRecipe = {
41
46
 
42
47
  if (!synth) {
43
48
  skipped++
49
+
44
50
  continue
45
51
  }
52
+
46
53
  const ok = alignAndWrite(
47
54
  write,
48
55
  {
@@ -36,7 +36,9 @@ import { unitRecipe } from "./unit.ts"
36
36
 
37
37
  export * from "./scaffold.ts"
38
38
 
39
- /** Every registered recipe, in display order. */
39
+ /**
40
+ * Every registered recipe, in display order.
41
+ */
40
42
  const RECIPES: readonly ShardRecipe[] = [
41
43
  streetRecipe,
42
44
  streetBareRecipe,
@@ -64,15 +66,21 @@ const RECIPES: readonly ShardRecipe[] = [
64
66
  anchorAbsorptionRecipe,
65
67
  ]
66
68
 
67
- /** Recipe name → recipe. */
69
+ /**
70
+ * Recipe name → recipe.
71
+ */
68
72
  export const SHARD_RECIPES: ReadonlyMap<string, ShardRecipe> = new Map(RECIPES.map((r) => [r.name, r]))
69
73
 
70
- /** Look up a recipe by its `<recipe>` name. */
74
+ /**
75
+ * Look up a recipe by its `<recipe>` name.
76
+ */
71
77
  export function getShardRecipe(name: string): ShardRecipe | undefined {
72
78
  return SHARD_RECIPES.get(name)
73
79
  }
74
80
 
75
- /** All recipes (for `--list` / help). */
81
+ /**
82
+ * All recipes (for `--list` / help).
83
+ */
76
84
  export function listShardRecipes(): readonly ShardRecipe[] {
77
85
  return RECIPES
78
86
  }