@mailwoman/corpus 9.2.0 → 9.4.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 (1261) hide show
  1. package/README.md +22 -22
  2. package/data/PROVENANCE.md +7 -7
  3. package/lib/adapters/ban/adapter.ts +190 -0
  4. package/lib/adapters/ban/street-decompose.ts +66 -0
  5. package/lib/adapters/fcc-bdc/adapter.ts +174 -0
  6. package/lib/adapters/geonames/adapter.ts +199 -0
  7. package/lib/adapters/geonames-postal/adapter.ts +122 -0
  8. package/lib/adapters/gnaf/adapter.ts +149 -0
  9. package/lib/adapters/gnaf/assemble.ts +225 -0
  10. package/lib/adapters/index.ts +153 -0
  11. package/lib/adapters/openaddresses/adapter.ts +251 -0
  12. package/lib/adapters/overture/adapter.ts +162 -0
  13. package/lib/adapters/state-hi-schools/adapter.ts +170 -0
  14. package/lib/adapters/state-hi-schools/workbook.ts +35 -0
  15. package/lib/adapters/synth-po-box/adapter.ts +204 -0
  16. package/lib/adapters/tiger/adapter.ts +252 -0
  17. package/lib/adapters/tiger/street-decompose.ts +83 -0
  18. package/lib/adapters/usgov-hrsa-fqhc/adapter.ts +167 -0
  19. package/lib/adapters/usgov-imls-pls/adapter.ts +143 -0
  20. package/lib/adapters/usgov-irs-bmf/adapter.ts +151 -0
  21. package/lib/adapters/usgov-nad/adapter.ts +334 -0
  22. package/lib/adapters/usgov-nppes/adapter.ts +151 -0
  23. package/lib/adapters/usgov-samhsa-treatment-locator/adapter.ts +193 -0
  24. package/lib/adapters/utils/index.ts +307 -0
  25. package/lib/adapters/wof-admin-jp/adapter.ts +214 -0
  26. package/lib/adapters/wof-admin-json/adapter.ts +231 -0
  27. package/lib/adapters/wof-json-rows.ts +129 -0
  28. package/lib/adapters/wof-postalcode-json/adapter.ts +176 -0
  29. package/lib/build.ts +378 -0
  30. package/lib/env.ts +50 -0
  31. package/lib/index.ts +13 -0
  32. package/lib/recipes/anchor-absorption.ts +101 -0
  33. package/lib/recipes/bare-country.ts +95 -0
  34. package/lib/recipes/boundary-stress.ts +102 -0
  35. package/lib/recipes/cn-organizational-units.ts +199 -0
  36. package/lib/recipes/country-balanced.ts +510 -0
  37. package/lib/recipes/cz-pcfirst-preposition.ts +112 -0
  38. package/lib/recipes/fr-admin-split.ts +243 -0
  39. package/lib/recipes/fr-bare-street.ts +171 -0
  40. package/lib/recipes/fr-fragment.ts +334 -0
  41. package/lib/recipes/fr-lieudit.ts +301 -0
  42. package/lib/recipes/fr-order.ts +246 -0
  43. package/lib/recipes/german.ts +360 -0
  44. package/lib/recipes/house-venue.ts +93 -0
  45. package/lib/recipes/index.ts +97 -0
  46. package/lib/recipes/intersection.ts +619 -0
  47. package/lib/recipes/locale.ts +600 -0
  48. package/lib/recipes/nl-postcode.ts +117 -0
  49. package/lib/recipes/no-fragment.ts +213 -0
  50. package/lib/recipes/no-street-led.ts +135 -0
  51. package/lib/recipes/no-street.ts +91 -0
  52. package/lib/recipes/po-box-cedex.ts +976 -0
  53. package/lib/recipes/po-box.ts +124 -0
  54. package/lib/recipes/reviewed-postcode-tail.ts +190 -0
  55. package/lib/recipes/scaffold.ts +468 -0
  56. package/lib/recipes/si-bare-village.ts +99 -0
  57. package/lib/recipes/street-affix.ts +805 -0
  58. package/lib/recipes/street-bare.ts +102 -0
  59. package/lib/recipes/street.ts +83 -0
  60. package/lib/recipes/sub-venue-sources.ts +878 -0
  61. package/lib/recipes/sub-venue.ts +998 -0
  62. package/lib/recipes/trailing-region.ts +178 -0
  63. package/lib/recipes/unit.ts +304 -0
  64. package/lib/runner.ts +312 -0
  65. package/lib/synthesizers/anchor-absorption.ts +288 -0
  66. package/lib/synthesizers/boundary-stress.ts +532 -0
  67. package/lib/synthesizers/german.ts +260 -0
  68. package/lib/synthesizers/house-venue.ts +308 -0
  69. package/lib/synthesizers/intersection.ts +233 -0
  70. package/lib/synthesizers/no-street.ts +327 -0
  71. package/lib/synthesizers/po-box.ts +323 -0
  72. package/lib/synthesizers/street.ts +269 -0
  73. package/lib/synthesizers/utils.ts +993 -0
  74. package/lib/test-kit/corpus-recipe.ts +86 -0
  75. package/lib/test-kit/index.ts +100 -0
  76. package/lib/tools/align-slice.ts +68 -0
  77. package/lib/tools/audit.ts +403 -0
  78. package/lib/tools/corpus-stats.ts +136 -0
  79. package/lib/tools/fetch/acra-sg.ts +174 -0
  80. package/lib/tools/fetch/ban.ts +289 -0
  81. package/lib/tools/fetch/download.ts +477 -0
  82. package/lib/tools/fetch/gcis-tw.ts +175 -0
  83. package/lib/tools/fetch/geonames-dump.ts +257 -0
  84. package/lib/tools/fetch/geonames-postal.ts +180 -0
  85. package/lib/tools/fetch/houjin-jp.ts +135 -0
  86. package/lib/tools/fetch/hrsa.ts +59 -0
  87. package/lib/tools/fetch/imls-pls.ts +149 -0
  88. package/lib/tools/fetch/index.ts +174 -0
  89. package/lib/tools/fetch/juso-kr.ts +165 -0
  90. package/lib/tools/fetch/localdata-kr.ts +194 -0
  91. package/lib/tools/fetch/nad.ts +341 -0
  92. package/lib/tools/fetch/nppes.ts +165 -0
  93. package/lib/tools/fetch/openaddresses.ts +347 -0
  94. package/lib/tools/fetch/ourairports.ts +170 -0
  95. package/lib/tools/fetch/ppd.ts +121 -0
  96. package/lib/tools/fetch/state-hi-schools.ts +161 -0
  97. package/lib/tools/fetch/state-sources.ts +146 -0
  98. package/lib/tools/fetch/tiger-full.ts +308 -0
  99. package/lib/tools/fetch/wikidata-subvenue.ts +384 -0
  100. package/lib/tools/golden-expand.ts +574 -0
  101. package/lib/tools/golden-promote.ts +337 -0
  102. package/lib/tools/golden-relabel-street.ts +686 -0
  103. package/lib/tools/index.ts +28 -0
  104. package/lib/tools/ingest-csv.ts +378 -0
  105. package/lib/tools/jsonl-to-parquet.ts +207 -0
  106. package/lib/tools/lint-slice-vocab.ts +388 -0
  107. package/lib/tools/lint-slice.ts +496 -0
  108. package/lib/tools/overlay-manifest.ts +148 -0
  109. package/lib/tools/overture-subvenue.ts +209 -0
  110. package/lib/tools/postcode-triples.ts +363 -0
  111. package/lib/tools/slice-kryptonite.ts +137 -0
  112. package/lib/tools/slice-translit.ts +218 -0
  113. package/lib/tools/sub-venue/harvest.ts +234 -0
  114. package/lib/tools/sub-venue/head-nouns.ts +245 -0
  115. package/lib/tools/sub-venue/surfaces.ts +95 -0
  116. package/lib/tools/sub-venue/table.ts +281 -0
  117. package/lib/tools/sub-venue/wikidata.ts +85 -0
  118. package/lib/tools/sub-venue-lexicon.ts +429 -0
  119. package/lib/tools/sub-venue-promotions.ts +330 -0
  120. package/lib/types.ts +247 -0
  121. package/lib/utils/align.ts +330 -0
  122. package/lib/utils/golden.ts +189 -0
  123. package/lib/utils/index.ts +14 -0
  124. package/lib/utils/parquet.ts +582 -0
  125. package/lib/utils/slice-stats.ts +95 -0
  126. package/lib/utils/split.ts +279 -0
  127. package/lib/utils/tokenize.ts +120 -0
  128. package/lib/utils/wof-json.ts +247 -0
  129. package/out/adapters/ban/adapter.d.ts.map +1 -0
  130. package/out/adapters/ban/adapter.js +149 -0
  131. package/out/adapters/ban/adapter.js.map +1 -0
  132. package/out/adapters/ban/street-decompose.d.ts.map +1 -0
  133. package/out/adapters/ban/street-decompose.js +51 -0
  134. package/out/adapters/ban/street-decompose.js.map +1 -0
  135. package/out/adapters/fcc-bdc/adapter.d.ts.map +1 -0
  136. package/out/adapters/fcc-bdc/adapter.js +144 -0
  137. package/out/adapters/fcc-bdc/adapter.js.map +1 -0
  138. package/out/adapters/geonames/adapter.d.ts.map +1 -0
  139. package/out/adapters/geonames/adapter.js +176 -0
  140. package/out/adapters/geonames/adapter.js.map +1 -0
  141. package/out/adapters/geonames-postal/adapter.d.ts +54 -0
  142. package/out/adapters/geonames-postal/adapter.d.ts.map +1 -0
  143. package/out/adapters/geonames-postal/adapter.js +107 -0
  144. package/out/adapters/geonames-postal/adapter.js.map +1 -0
  145. package/out/adapters/gnaf/adapter.d.ts +49 -0
  146. package/out/adapters/gnaf/adapter.d.ts.map +1 -0
  147. package/out/adapters/gnaf/adapter.js +124 -0
  148. package/out/adapters/gnaf/adapter.js.map +1 -0
  149. package/out/adapters/gnaf/assemble.d.ts +65 -0
  150. package/out/adapters/gnaf/assemble.d.ts.map +1 -0
  151. package/out/adapters/gnaf/assemble.js +154 -0
  152. package/out/adapters/gnaf/assemble.js.map +1 -0
  153. package/out/adapters/index.d.ts +51 -0
  154. package/out/adapters/index.d.ts.map +1 -0
  155. package/out/adapters/index.js +95 -0
  156. package/out/adapters/index.js.map +1 -0
  157. package/out/adapters/openaddresses/adapter.d.ts.map +1 -0
  158. package/out/adapters/openaddresses/adapter.js +186 -0
  159. package/out/adapters/openaddresses/adapter.js.map +1 -0
  160. package/out/adapters/overture/adapter.d.ts +48 -0
  161. package/out/adapters/overture/adapter.d.ts.map +1 -0
  162. package/out/adapters/overture/adapter.js +125 -0
  163. package/out/adapters/overture/adapter.js.map +1 -0
  164. package/out/adapters/state-hi-schools/adapter.d.ts +46 -0
  165. package/out/adapters/state-hi-schools/adapter.d.ts.map +1 -0
  166. package/out/adapters/state-hi-schools/adapter.js +145 -0
  167. package/out/adapters/state-hi-schools/adapter.js.map +1 -0
  168. package/out/adapters/state-hi-schools/workbook.d.ts +29 -0
  169. package/out/adapters/state-hi-schools/workbook.d.ts.map +1 -0
  170. package/out/adapters/state-hi-schools/workbook.js +20 -0
  171. package/out/adapters/state-hi-schools/workbook.js.map +1 -0
  172. package/out/adapters/state-ia-contractors/adapter.d.ts.map +1 -0
  173. package/out/adapters/state-ia-contractors/adapter.js.map +1 -0
  174. package/out/adapters/state-ny-notaries/adapter.d.ts.map +1 -0
  175. package/out/adapters/state-ny-notaries/adapter.js.map +1 -0
  176. package/out/adapters/state-tx-notaries/adapter.d.ts.map +1 -0
  177. package/out/adapters/state-tx-notaries/adapter.js.map +1 -0
  178. package/out/adapters/synth-po-box/adapter.d.ts.map +1 -0
  179. package/out/adapters/synth-po-box/adapter.js +140 -0
  180. package/out/adapters/synth-po-box/adapter.js.map +1 -0
  181. package/out/adapters/tiger/adapter.d.ts +55 -0
  182. package/out/adapters/tiger/adapter.d.ts.map +1 -0
  183. package/out/adapters/tiger/adapter.js +201 -0
  184. package/out/adapters/tiger/adapter.js.map +1 -0
  185. package/out/adapters/tiger/street-decompose.d.ts.map +1 -0
  186. package/out/adapters/tiger/street-decompose.js +68 -0
  187. package/out/adapters/tiger/street-decompose.js.map +1 -0
  188. package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts +56 -0
  189. package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -0
  190. package/out/adapters/usgov-hrsa-fqhc/adapter.js +132 -0
  191. package/out/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -0
  192. package/out/adapters/usgov-imls-pls/adapter.d.ts +36 -0
  193. package/out/adapters/usgov-imls-pls/adapter.d.ts.map +1 -0
  194. package/out/adapters/usgov-imls-pls/adapter.js +114 -0
  195. package/out/adapters/usgov-imls-pls/adapter.js.map +1 -0
  196. package/out/adapters/usgov-irs-bmf/adapter.d.ts +37 -0
  197. package/out/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -0
  198. package/out/adapters/usgov-irs-bmf/adapter.js +120 -0
  199. package/out/adapters/usgov-irs-bmf/adapter.js.map +1 -0
  200. package/out/adapters/usgov-nad/adapter.d.ts +48 -0
  201. package/out/adapters/usgov-nad/adapter.d.ts.map +1 -0
  202. package/out/adapters/usgov-nad/adapter.js +249 -0
  203. package/out/adapters/usgov-nad/adapter.js.map +1 -0
  204. package/out/adapters/usgov-nppes/adapter.d.ts.map +1 -0
  205. package/out/adapters/usgov-nppes/adapter.js +118 -0
  206. package/out/adapters/usgov-nppes/adapter.js.map +1 -0
  207. package/out/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -0
  208. package/out/adapters/usgov-samhsa-treatment-locator/adapter.js +154 -0
  209. package/out/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -0
  210. package/out/adapters/utils/index.d.ts +191 -0
  211. package/out/adapters/utils/index.d.ts.map +1 -0
  212. package/out/adapters/utils/index.js +206 -0
  213. package/out/adapters/utils/index.js.map +1 -0
  214. package/out/adapters/wof-admin-jp/adapter.d.ts.map +1 -0
  215. package/out/adapters/wof-admin-jp/adapter.js +161 -0
  216. package/out/adapters/wof-admin-jp/adapter.js.map +1 -0
  217. package/out/adapters/wof-admin-json/adapter.d.ts +79 -0
  218. package/out/adapters/wof-admin-json/adapter.d.ts.map +1 -0
  219. package/out/adapters/wof-admin-json/adapter.js +197 -0
  220. package/out/adapters/wof-admin-json/adapter.js.map +1 -0
  221. package/out/adapters/wof-json-rows.d.ts +62 -0
  222. package/out/adapters/wof-json-rows.d.ts.map +1 -0
  223. package/out/adapters/wof-json-rows.js +83 -0
  224. package/out/adapters/wof-json-rows.js.map +1 -0
  225. package/out/adapters/wof-postalcode-json/adapter.d.ts +65 -0
  226. package/out/adapters/wof-postalcode-json/adapter.d.ts.map +1 -0
  227. package/out/adapters/wof-postalcode-json/adapter.js +151 -0
  228. package/out/adapters/wof-postalcode-json/adapter.js.map +1 -0
  229. package/out/build.d.ts +132 -0
  230. package/out/build.d.ts.map +1 -0
  231. package/out/build.js +245 -0
  232. package/out/build.js.map +1 -0
  233. package/out/codex/us-fips-state.d.ts.map +1 -0
  234. package/out/codex/us-fips-state.js.map +1 -0
  235. package/out/env.d.ts +46 -0
  236. package/out/env.d.ts.map +1 -0
  237. package/out/env.js +46 -0
  238. package/out/env.js.map +1 -0
  239. package/out/index.d.ts +13 -0
  240. package/out/index.d.ts.map +1 -0
  241. package/out/index.js +13 -0
  242. package/out/index.js.map +1 -0
  243. package/out/recipes/anchor-absorption.d.ts +20 -0
  244. package/out/recipes/anchor-absorption.d.ts.map +1 -0
  245. package/out/recipes/anchor-absorption.js +82 -0
  246. package/out/recipes/anchor-absorption.js.map +1 -0
  247. package/out/recipes/bare-country.d.ts +25 -0
  248. package/out/recipes/bare-country.d.ts.map +1 -0
  249. package/out/recipes/bare-country.js +88 -0
  250. package/out/recipes/bare-country.js.map +1 -0
  251. package/out/recipes/boundary-stress.d.ts +20 -0
  252. package/out/recipes/boundary-stress.d.ts.map +1 -0
  253. package/out/recipes/boundary-stress.js +84 -0
  254. package/out/recipes/boundary-stress.js.map +1 -0
  255. package/out/recipes/cn-organizational-units.d.ts +36 -0
  256. package/out/recipes/cn-organizational-units.d.ts.map +1 -0
  257. package/out/recipes/cn-organizational-units.js +159 -0
  258. package/out/recipes/cn-organizational-units.js.map +1 -0
  259. package/out/recipes/country-balanced.d.ts +32 -0
  260. package/out/recipes/country-balanced.d.ts.map +1 -0
  261. package/out/recipes/country-balanced.js +394 -0
  262. package/out/recipes/country-balanced.js.map +1 -0
  263. package/out/recipes/cz-pcfirst-preposition.d.ts +22 -0
  264. package/out/recipes/cz-pcfirst-preposition.d.ts.map +1 -0
  265. package/out/recipes/cz-pcfirst-preposition.js +101 -0
  266. package/out/recipes/cz-pcfirst-preposition.js.map +1 -0
  267. package/out/recipes/fr-admin-split.d.ts +38 -0
  268. package/out/recipes/fr-admin-split.d.ts.map +1 -0
  269. package/out/recipes/fr-admin-split.js +192 -0
  270. package/out/recipes/fr-admin-split.js.map +1 -0
  271. package/out/recipes/fr-bare-street.d.ts +28 -0
  272. package/out/recipes/fr-bare-street.d.ts.map +1 -0
  273. package/out/recipes/fr-bare-street.js +144 -0
  274. package/out/recipes/fr-bare-street.js.map +1 -0
  275. package/out/recipes/fr-fragment.d.ts +77 -0
  276. package/out/recipes/fr-fragment.d.ts.map +1 -0
  277. package/out/recipes/fr-fragment.js +277 -0
  278. package/out/recipes/fr-fragment.js.map +1 -0
  279. package/out/recipes/fr-lieudit.d.ts +32 -0
  280. package/out/recipes/fr-lieudit.d.ts.map +1 -0
  281. package/out/recipes/fr-lieudit.js +227 -0
  282. package/out/recipes/fr-lieudit.js.map +1 -0
  283. package/out/recipes/fr-order.d.ts +38 -0
  284. package/out/recipes/fr-order.d.ts.map +1 -0
  285. package/out/recipes/fr-order.js +198 -0
  286. package/out/recipes/fr-order.js.map +1 -0
  287. package/out/recipes/german.d.ts +44 -0
  288. package/out/recipes/german.d.ts.map +1 -0
  289. package/out/recipes/german.js +289 -0
  290. package/out/recipes/german.js.map +1 -0
  291. package/out/recipes/house-venue.d.ts +18 -0
  292. package/out/recipes/house-venue.d.ts.map +1 -0
  293. package/out/recipes/house-venue.js +74 -0
  294. package/out/recipes/house-venue.js.map +1 -0
  295. package/out/recipes/index.d.ts +24 -0
  296. package/out/recipes/index.d.ts.map +1 -0
  297. package/out/recipes/index.js +91 -0
  298. package/out/recipes/index.js.map +1 -0
  299. package/out/recipes/intersection.d.ts +42 -0
  300. package/out/recipes/intersection.d.ts.map +1 -0
  301. package/out/recipes/intersection.js +453 -0
  302. package/out/recipes/intersection.js.map +1 -0
  303. package/out/recipes/locale.d.ts +136 -0
  304. package/out/recipes/locale.d.ts.map +1 -0
  305. package/out/recipes/locale.js +460 -0
  306. package/out/recipes/locale.js.map +1 -0
  307. package/out/recipes/nl-postcode.d.ts +26 -0
  308. package/out/recipes/nl-postcode.d.ts.map +1 -0
  309. package/out/recipes/nl-postcode.js +103 -0
  310. package/out/recipes/nl-postcode.js.map +1 -0
  311. package/out/recipes/no-fragment.d.ts +43 -0
  312. package/out/recipes/no-fragment.d.ts.map +1 -0
  313. package/out/recipes/no-fragment.js +183 -0
  314. package/out/recipes/no-fragment.js.map +1 -0
  315. package/out/recipes/no-street-led.d.ts +24 -0
  316. package/out/recipes/no-street-led.d.ts.map +1 -0
  317. package/out/recipes/no-street-led.js +114 -0
  318. package/out/recipes/no-street-led.js.map +1 -0
  319. package/out/recipes/no-street.d.ts +18 -0
  320. package/out/recipes/no-street.d.ts.map +1 -0
  321. package/out/recipes/no-street.js +72 -0
  322. package/out/recipes/no-street.js.map +1 -0
  323. package/out/recipes/po-box-cedex.d.ts +38 -0
  324. package/out/recipes/po-box-cedex.d.ts.map +1 -0
  325. package/out/recipes/po-box-cedex.js +768 -0
  326. package/out/recipes/po-box-cedex.js.map +1 -0
  327. package/out/recipes/po-box.d.ts +17 -0
  328. package/out/recipes/po-box.d.ts.map +1 -0
  329. package/out/recipes/po-box.js +101 -0
  330. package/out/recipes/po-box.js.map +1 -0
  331. package/out/recipes/reviewed-postcode-tail.d.ts +47 -0
  332. package/out/recipes/reviewed-postcode-tail.d.ts.map +1 -0
  333. package/out/recipes/reviewed-postcode-tail.js +125 -0
  334. package/out/recipes/reviewed-postcode-tail.js.map +1 -0
  335. package/out/recipes/scaffold.d.ts +323 -0
  336. package/out/recipes/scaffold.d.ts.map +1 -0
  337. package/out/recipes/scaffold.js +174 -0
  338. package/out/recipes/scaffold.js.map +1 -0
  339. package/out/recipes/si-bare-village.d.ts +32 -0
  340. package/out/recipes/si-bare-village.d.ts.map +1 -0
  341. package/out/recipes/si-bare-village.js +89 -0
  342. package/out/recipes/si-bare-village.js.map +1 -0
  343. package/out/recipes/street-affix.d.ts +89 -0
  344. package/out/recipes/street-affix.d.ts.map +1 -0
  345. package/out/recipes/street-affix.js +563 -0
  346. package/out/recipes/street-affix.js.map +1 -0
  347. package/out/recipes/street-bare.d.ts +25 -0
  348. package/out/recipes/street-bare.d.ts.map +1 -0
  349. package/out/recipes/street-bare.js +87 -0
  350. package/out/recipes/street-bare.js.map +1 -0
  351. package/out/recipes/street.d.ts +15 -0
  352. package/out/recipes/street.d.ts.map +1 -0
  353. package/out/recipes/street.js +70 -0
  354. package/out/recipes/street.js.map +1 -0
  355. package/out/recipes/sub-venue-sources.d.ts +229 -0
  356. package/out/recipes/sub-venue-sources.d.ts.map +1 -0
  357. package/out/recipes/sub-venue-sources.js +654 -0
  358. package/out/recipes/sub-venue-sources.js.map +1 -0
  359. package/out/recipes/sub-venue.d.ts +269 -0
  360. package/out/recipes/sub-venue.d.ts.map +1 -0
  361. package/out/recipes/sub-venue.js +726 -0
  362. package/out/recipes/sub-venue.js.map +1 -0
  363. package/out/recipes/trailing-region.d.ts +74 -0
  364. package/out/recipes/trailing-region.d.ts.map +1 -0
  365. package/out/recipes/trailing-region.js +158 -0
  366. package/out/recipes/trailing-region.js.map +1 -0
  367. package/out/recipes/unit.d.ts +29 -0
  368. package/out/recipes/unit.d.ts.map +1 -0
  369. package/out/recipes/unit.js +231 -0
  370. package/out/recipes/unit.js.map +1 -0
  371. package/out/runner.d.ts +130 -0
  372. package/out/runner.d.ts.map +1 -0
  373. package/out/runner.js +185 -0
  374. package/out/runner.js.map +1 -0
  375. package/out/synthesizers/anchor-absorption.d.ts +63 -0
  376. package/out/synthesizers/anchor-absorption.d.ts.map +1 -0
  377. package/out/synthesizers/anchor-absorption.js +221 -0
  378. package/out/synthesizers/anchor-absorption.js.map +1 -0
  379. package/out/synthesizers/boundary-stress.d.ts +78 -0
  380. package/out/synthesizers/boundary-stress.d.ts.map +1 -0
  381. package/out/synthesizers/boundary-stress.js +455 -0
  382. package/out/synthesizers/boundary-stress.js.map +1 -0
  383. package/out/synthesizers/german.d.ts +115 -0
  384. package/out/synthesizers/german.d.ts.map +1 -0
  385. package/out/synthesizers/german.js +149 -0
  386. package/out/synthesizers/german.js.map +1 -0
  387. package/out/synthesizers/house-venue.d.ts +56 -0
  388. package/out/synthesizers/house-venue.d.ts.map +1 -0
  389. package/out/synthesizers/house-venue.js +247 -0
  390. package/out/synthesizers/house-venue.js.map +1 -0
  391. package/out/synthesizers/intersection.d.ts +52 -0
  392. package/out/synthesizers/intersection.d.ts.map +1 -0
  393. package/out/synthesizers/intersection.js +175 -0
  394. package/out/synthesizers/intersection.js.map +1 -0
  395. package/out/synthesizers/no-street.d.ts +72 -0
  396. package/out/synthesizers/no-street.d.ts.map +1 -0
  397. package/out/synthesizers/no-street.js +262 -0
  398. package/out/synthesizers/no-street.js.map +1 -0
  399. package/out/synthesizers/po-box.d.ts +108 -0
  400. package/out/synthesizers/po-box.d.ts.map +1 -0
  401. package/out/synthesizers/po-box.js +250 -0
  402. package/out/synthesizers/po-box.js.map +1 -0
  403. package/out/synthesizers/street.d.ts +54 -0
  404. package/out/synthesizers/street.d.ts.map +1 -0
  405. package/out/synthesizers/street.js +218 -0
  406. package/out/synthesizers/street.js.map +1 -0
  407. package/out/synthesizers/utils.d.ts +241 -0
  408. package/out/synthesizers/utils.d.ts.map +1 -0
  409. package/out/synthesizers/utils.js +776 -0
  410. package/out/synthesizers/utils.js.map +1 -0
  411. package/out/test-kit/corpus-recipe.d.ts +59 -0
  412. package/out/test-kit/corpus-recipe.d.ts.map +1 -0
  413. package/out/test-kit/corpus-recipe.js +39 -0
  414. package/out/test-kit/corpus-recipe.js.map +1 -0
  415. package/out/test-kit/index.d.ts +48 -0
  416. package/out/test-kit/index.d.ts.map +1 -0
  417. package/out/test-kit/index.js +78 -0
  418. package/out/test-kit/index.js.map +1 -0
  419. package/out/tools/align-slice.d.ts +7 -0
  420. package/out/tools/align-slice.d.ts.map +1 -0
  421. package/out/tools/align-slice.js +55 -0
  422. package/out/tools/align-slice.js.map +1 -0
  423. package/out/tools/audit.d.ts +29 -0
  424. package/out/tools/audit.d.ts.map +1 -0
  425. package/out/tools/audit.js +282 -0
  426. package/out/tools/audit.js.map +1 -0
  427. package/out/tools/corpus-stats.d.ts +44 -0
  428. package/out/tools/corpus-stats.d.ts.map +1 -0
  429. package/out/tools/corpus-stats.js +102 -0
  430. package/out/tools/corpus-stats.js.map +1 -0
  431. package/out/tools/fetch/acra-sg.d.ts +23 -0
  432. package/out/tools/fetch/acra-sg.d.ts.map +1 -0
  433. package/out/tools/fetch/acra-sg.js +126 -0
  434. package/out/tools/fetch/acra-sg.js.map +1 -0
  435. package/out/tools/fetch/ban.d.ts +31 -0
  436. package/out/tools/fetch/ban.d.ts.map +1 -0
  437. package/out/tools/fetch/ban.js +239 -0
  438. package/out/tools/fetch/ban.js.map +1 -0
  439. package/out/tools/fetch/download.d.ts +182 -0
  440. package/out/tools/fetch/download.d.ts.map +1 -0
  441. package/out/tools/fetch/download.js +318 -0
  442. package/out/tools/fetch/download.js.map +1 -0
  443. package/out/tools/fetch/gcis-tw.d.ts +23 -0
  444. package/out/tools/fetch/gcis-tw.d.ts.map +1 -0
  445. package/out/tools/fetch/gcis-tw.js +135 -0
  446. package/out/tools/fetch/gcis-tw.js.map +1 -0
  447. package/out/tools/fetch/geonames-dump.d.ts +91 -0
  448. package/out/tools/fetch/geonames-dump.d.ts.map +1 -0
  449. package/out/tools/fetch/geonames-dump.js +171 -0
  450. package/out/tools/fetch/geonames-dump.js.map +1 -0
  451. package/out/tools/fetch/geonames-postal.d.ts +76 -0
  452. package/out/tools/fetch/geonames-postal.d.ts.map +1 -0
  453. package/out/tools/fetch/geonames-postal.js +126 -0
  454. package/out/tools/fetch/geonames-postal.js.map +1 -0
  455. package/out/tools/fetch/houjin-jp.d.ts +24 -0
  456. package/out/tools/fetch/houjin-jp.d.ts.map +1 -0
  457. package/out/tools/fetch/houjin-jp.js +102 -0
  458. package/out/tools/fetch/houjin-jp.js.map +1 -0
  459. package/out/tools/fetch/hrsa.d.ts +18 -0
  460. package/out/tools/fetch/hrsa.d.ts.map +1 -0
  461. package/out/tools/fetch/hrsa.js +46 -0
  462. package/out/tools/fetch/hrsa.js.map +1 -0
  463. package/out/tools/fetch/imls-pls.d.ts +25 -0
  464. package/out/tools/fetch/imls-pls.d.ts.map +1 -0
  465. package/out/tools/fetch/imls-pls.js +108 -0
  466. package/out/tools/fetch/imls-pls.js.map +1 -0
  467. package/out/tools/fetch/index.d.ts +171 -0
  468. package/out/tools/fetch/index.d.ts.map +1 -0
  469. package/out/tools/fetch/index.js +170 -0
  470. package/out/tools/fetch/index.js.map +1 -0
  471. package/out/tools/fetch/juso-kr.d.ts +30 -0
  472. package/out/tools/fetch/juso-kr.d.ts.map +1 -0
  473. package/out/tools/fetch/juso-kr.js +120 -0
  474. package/out/tools/fetch/juso-kr.js.map +1 -0
  475. package/out/tools/fetch/localdata-kr.d.ts +30 -0
  476. package/out/tools/fetch/localdata-kr.d.ts.map +1 -0
  477. package/out/tools/fetch/localdata-kr.js +139 -0
  478. package/out/tools/fetch/localdata-kr.js.map +1 -0
  479. package/out/tools/fetch/nad.d.ts +70 -0
  480. package/out/tools/fetch/nad.d.ts.map +1 -0
  481. package/out/tools/fetch/nad.js +234 -0
  482. package/out/tools/fetch/nad.js.map +1 -0
  483. package/out/tools/fetch/nppes.d.ts +26 -0
  484. package/out/tools/fetch/nppes.d.ts.map +1 -0
  485. package/out/tools/fetch/nppes.js +126 -0
  486. package/out/tools/fetch/nppes.js.map +1 -0
  487. package/out/tools/fetch/openaddresses.d.ts +9 -0
  488. package/out/tools/fetch/openaddresses.d.ts.map +1 -0
  489. package/out/tools/fetch/openaddresses.js +279 -0
  490. package/out/tools/fetch/openaddresses.js.map +1 -0
  491. package/out/tools/fetch/ourairports.d.ts +45 -0
  492. package/out/tools/fetch/ourairports.d.ts.map +1 -0
  493. package/out/tools/fetch/ourairports.js +128 -0
  494. package/out/tools/fetch/ourairports.js.map +1 -0
  495. package/out/tools/fetch/ppd.d.ts.map +1 -0
  496. package/out/tools/fetch/ppd.js +85 -0
  497. package/out/tools/fetch/ppd.js.map +1 -0
  498. package/out/tools/fetch/state-hi-schools.d.ts +26 -0
  499. package/out/tools/fetch/state-hi-schools.d.ts.map +1 -0
  500. package/out/tools/fetch/state-hi-schools.js +112 -0
  501. package/out/tools/fetch/state-hi-schools.js.map +1 -0
  502. package/out/tools/fetch/state-sources.d.ts +26 -0
  503. package/out/tools/fetch/state-sources.d.ts.map +1 -0
  504. package/out/tools/fetch/state-sources.js +111 -0
  505. package/out/tools/fetch/state-sources.js.map +1 -0
  506. package/out/tools/fetch/tiger-full.d.ts +22 -0
  507. package/out/tools/fetch/tiger-full.d.ts.map +1 -0
  508. package/out/tools/fetch/tiger-full.js +217 -0
  509. package/out/tools/fetch/tiger-full.js.map +1 -0
  510. package/out/tools/fetch/wikidata-subvenue.d.ts +171 -0
  511. package/out/tools/fetch/wikidata-subvenue.d.ts.map +1 -0
  512. package/out/tools/fetch/wikidata-subvenue.js +274 -0
  513. package/out/tools/fetch/wikidata-subvenue.js.map +1 -0
  514. package/out/tools/gb-title-case.d.ts.map +1 -0
  515. package/out/tools/gb-title-case.js.map +1 -0
  516. package/out/tools/golden-expand.d.ts +90 -0
  517. package/out/tools/golden-expand.d.ts.map +1 -0
  518. package/out/tools/golden-expand.js +406 -0
  519. package/out/tools/golden-expand.js.map +1 -0
  520. package/out/tools/golden-promote.d.ts.map +1 -0
  521. package/out/tools/golden-promote.js +240 -0
  522. package/out/tools/golden-promote.js.map +1 -0
  523. package/out/tools/golden-relabel-street.d.ts +196 -0
  524. package/out/tools/golden-relabel-street.d.ts.map +1 -0
  525. package/out/tools/golden-relabel-street.js +439 -0
  526. package/out/tools/golden-relabel-street.js.map +1 -0
  527. package/out/tools/index.d.ts +28 -0
  528. package/out/tools/index.d.ts.map +1 -0
  529. package/out/tools/index.js +28 -0
  530. package/out/tools/index.js.map +1 -0
  531. package/out/tools/ingest-csv.d.ts.map +1 -0
  532. package/out/tools/ingest-csv.js +265 -0
  533. package/out/tools/ingest-csv.js.map +1 -0
  534. package/out/tools/jsonl-to-parquet.d.ts +61 -0
  535. package/out/tools/jsonl-to-parquet.d.ts.map +1 -0
  536. package/out/tools/jsonl-to-parquet.js +150 -0
  537. package/out/tools/jsonl-to-parquet.js.map +1 -0
  538. package/out/tools/lint-slice-vocab.d.ts +90 -0
  539. package/out/tools/lint-slice-vocab.d.ts.map +1 -0
  540. package/out/tools/lint-slice-vocab.js +267 -0
  541. package/out/tools/lint-slice-vocab.js.map +1 -0
  542. package/out/tools/lint-slice.d.ts +93 -0
  543. package/out/tools/lint-slice.d.ts.map +1 -0
  544. package/out/tools/lint-slice.js +322 -0
  545. package/out/tools/lint-slice.js.map +1 -0
  546. package/out/tools/overlay-manifest.d.ts +39 -0
  547. package/out/tools/overlay-manifest.d.ts.map +1 -0
  548. package/out/tools/overlay-manifest.js +90 -0
  549. package/out/tools/overlay-manifest.js.map +1 -0
  550. package/out/tools/overture-subvenue.d.ts +112 -0
  551. package/out/tools/overture-subvenue.d.ts.map +1 -0
  552. package/out/tools/overture-subvenue.js +139 -0
  553. package/out/tools/overture-subvenue.js.map +1 -0
  554. package/out/tools/postcode-triples.d.ts +174 -0
  555. package/out/tools/postcode-triples.d.ts.map +1 -0
  556. package/out/tools/postcode-triples.js +292 -0
  557. package/out/tools/postcode-triples.js.map +1 -0
  558. package/out/tools/slice-kryptonite.d.ts +32 -0
  559. package/out/tools/slice-kryptonite.d.ts.map +1 -0
  560. package/out/tools/slice-kryptonite.js +99 -0
  561. package/out/tools/slice-kryptonite.js.map +1 -0
  562. package/out/tools/slice-translit.d.ts +51 -0
  563. package/out/tools/slice-translit.d.ts.map +1 -0
  564. package/out/tools/slice-translit.js +166 -0
  565. package/out/tools/slice-translit.js.map +1 -0
  566. package/out/tools/sub-venue/harvest.d.ts +100 -0
  567. package/out/tools/sub-venue/harvest.d.ts.map +1 -0
  568. package/out/tools/sub-venue/harvest.js +168 -0
  569. package/out/tools/sub-venue/harvest.js.map +1 -0
  570. package/out/tools/sub-venue/head-nouns.d.ts +50 -0
  571. package/out/tools/sub-venue/head-nouns.d.ts.map +1 -0
  572. package/out/tools/sub-venue/head-nouns.js +213 -0
  573. package/out/tools/sub-venue/head-nouns.js.map +1 -0
  574. package/out/tools/sub-venue/surfaces.d.ts +45 -0
  575. package/out/tools/sub-venue/surfaces.d.ts.map +1 -0
  576. package/out/tools/sub-venue/surfaces.js +77 -0
  577. package/out/tools/sub-venue/surfaces.js.map +1 -0
  578. package/out/tools/sub-venue/table.d.ts +229 -0
  579. package/out/tools/sub-venue/table.d.ts.map +1 -0
  580. package/out/tools/sub-venue/table.js +108 -0
  581. package/out/tools/sub-venue/table.js.map +1 -0
  582. package/out/tools/sub-venue/wikidata.d.ts +26 -0
  583. package/out/tools/sub-venue/wikidata.d.ts.map +1 -0
  584. package/out/tools/sub-venue/wikidata.js +62 -0
  585. package/out/tools/sub-venue/wikidata.js.map +1 -0
  586. package/out/tools/sub-venue-lexicon.d.ts +156 -0
  587. package/out/tools/sub-venue-lexicon.d.ts.map +1 -0
  588. package/out/tools/sub-venue-lexicon.js +283 -0
  589. package/out/tools/sub-venue-lexicon.js.map +1 -0
  590. package/out/tools/sub-venue-promotions.d.ts +94 -0
  591. package/out/tools/sub-venue-promotions.d.ts.map +1 -0
  592. package/out/tools/sub-venue-promotions.js +266 -0
  593. package/out/tools/sub-venue-promotions.js.map +1 -0
  594. package/out/types.d.ts +221 -0
  595. package/out/types.d.ts.map +1 -0
  596. package/out/types.js.map +1 -0
  597. package/out/utils/align.d.ts +93 -0
  598. package/out/utils/align.d.ts.map +1 -0
  599. package/out/utils/align.js +234 -0
  600. package/out/utils/align.js.map +1 -0
  601. package/out/utils/golden.d.ts +85 -0
  602. package/out/utils/golden.d.ts.map +1 -0
  603. package/out/utils/golden.js +127 -0
  604. package/out/utils/golden.js.map +1 -0
  605. package/out/utils/index.d.ts +14 -0
  606. package/out/utils/index.d.ts.map +1 -0
  607. package/out/utils/index.js +14 -0
  608. package/out/utils/index.js.map +1 -0
  609. package/out/utils/license.d.ts.map +1 -0
  610. package/out/utils/license.js.map +1 -0
  611. package/out/utils/parquet.d.ts +178 -0
  612. package/out/utils/parquet.d.ts.map +1 -0
  613. package/out/utils/parquet.js +371 -0
  614. package/out/utils/parquet.js.map +1 -0
  615. package/out/utils/slice-stats.d.ts +52 -0
  616. package/out/utils/slice-stats.d.ts.map +1 -0
  617. package/out/utils/slice-stats.js +58 -0
  618. package/out/utils/slice-stats.js.map +1 -0
  619. package/out/utils/split.d.ts +128 -0
  620. package/out/utils/split.d.ts.map +1 -0
  621. package/out/utils/split.js +204 -0
  622. package/out/utils/split.js.map +1 -0
  623. package/out/utils/tokenize.d.ts +64 -0
  624. package/out/utils/tokenize.d.ts.map +1 -0
  625. package/out/utils/tokenize.js +82 -0
  626. package/out/utils/tokenize.js.map +1 -0
  627. package/out/utils/wof-json.d.ts +113 -0
  628. package/out/utils/wof-json.d.ts.map +1 -0
  629. package/out/utils/wof-json.js +173 -0
  630. package/out/utils/wof-json.js.map +1 -0
  631. package/package.json +259 -194
  632. package/out/src/adapters/ban/adapter.d.ts.map +0 -1
  633. package/out/src/adapters/ban/adapter.js +0 -149
  634. package/out/src/adapters/ban/adapter.js.map +0 -1
  635. package/out/src/adapters/ban/street-decompose.d.ts.map +0 -1
  636. package/out/src/adapters/ban/street-decompose.js +0 -75
  637. package/out/src/adapters/ban/street-decompose.js.map +0 -1
  638. package/out/src/adapters/fcc-bdc/adapter.d.ts.map +0 -1
  639. package/out/src/adapters/fcc-bdc/adapter.js +0 -144
  640. package/out/src/adapters/fcc-bdc/adapter.js.map +0 -1
  641. package/out/src/adapters/geonames/adapter.d.ts.map +0 -1
  642. package/out/src/adapters/geonames/adapter.js +0 -176
  643. package/out/src/adapters/geonames/adapter.js.map +0 -1
  644. package/out/src/adapters/geonames-postal/adapter.d.ts +0 -41
  645. package/out/src/adapters/geonames-postal/adapter.d.ts.map +0 -1
  646. package/out/src/adapters/geonames-postal/adapter.js +0 -104
  647. package/out/src/adapters/geonames-postal/adapter.js.map +0 -1
  648. package/out/src/adapters/gnaf/adapter.d.ts +0 -49
  649. package/out/src/adapters/gnaf/adapter.d.ts.map +0 -1
  650. package/out/src/adapters/gnaf/adapter.js +0 -124
  651. package/out/src/adapters/gnaf/adapter.js.map +0 -1
  652. package/out/src/adapters/gnaf/assemble.d.ts +0 -65
  653. package/out/src/adapters/gnaf/assemble.d.ts.map +0 -1
  654. package/out/src/adapters/gnaf/assemble.js +0 -154
  655. package/out/src/adapters/gnaf/assemble.js.map +0 -1
  656. package/out/src/adapters/index.d.ts +0 -51
  657. package/out/src/adapters/index.d.ts.map +0 -1
  658. package/out/src/adapters/index.js +0 -95
  659. package/out/src/adapters/index.js.map +0 -1
  660. package/out/src/adapters/openaddresses/adapter.d.ts.map +0 -1
  661. package/out/src/adapters/openaddresses/adapter.js +0 -186
  662. package/out/src/adapters/openaddresses/adapter.js.map +0 -1
  663. package/out/src/adapters/overture/adapter.d.ts +0 -48
  664. package/out/src/adapters/overture/adapter.d.ts.map +0 -1
  665. package/out/src/adapters/overture/adapter.js +0 -125
  666. package/out/src/adapters/overture/adapter.js.map +0 -1
  667. package/out/src/adapters/state-hi-schools/adapter.d.ts +0 -47
  668. package/out/src/adapters/state-hi-schools/adapter.d.ts.map +0 -1
  669. package/out/src/adapters/state-hi-schools/adapter.js +0 -133
  670. package/out/src/adapters/state-hi-schools/adapter.js.map +0 -1
  671. package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +0 -1
  672. package/out/src/adapters/state-ia-contractors/adapter.js.map +0 -1
  673. package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +0 -1
  674. package/out/src/adapters/state-ny-notaries/adapter.js.map +0 -1
  675. package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +0 -1
  676. package/out/src/adapters/state-tx-notaries/adapter.js.map +0 -1
  677. package/out/src/adapters/synth-po-box/adapter.d.ts.map +0 -1
  678. package/out/src/adapters/synth-po-box/adapter.js +0 -140
  679. package/out/src/adapters/synth-po-box/adapter.js.map +0 -1
  680. package/out/src/adapters/tiger/adapter.d.ts +0 -55
  681. package/out/src/adapters/tiger/adapter.d.ts.map +0 -1
  682. package/out/src/adapters/tiger/adapter.js +0 -201
  683. package/out/src/adapters/tiger/adapter.js.map +0 -1
  684. package/out/src/adapters/tiger/street-decompose.d.ts.map +0 -1
  685. package/out/src/adapters/tiger/street-decompose.js +0 -90
  686. package/out/src/adapters/tiger/street-decompose.js.map +0 -1
  687. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +0 -47
  688. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +0 -1
  689. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +0 -139
  690. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +0 -1
  691. package/out/src/adapters/usgov-imls-pls/adapter.d.ts +0 -36
  692. package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +0 -1
  693. package/out/src/adapters/usgov-imls-pls/adapter.js +0 -114
  694. package/out/src/adapters/usgov-imls-pls/adapter.js.map +0 -1
  695. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts +0 -37
  696. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +0 -1
  697. package/out/src/adapters/usgov-irs-bmf/adapter.js +0 -124
  698. package/out/src/adapters/usgov-irs-bmf/adapter.js.map +0 -1
  699. package/out/src/adapters/usgov-nad/adapter.d.ts +0 -48
  700. package/out/src/adapters/usgov-nad/adapter.d.ts.map +0 -1
  701. package/out/src/adapters/usgov-nad/adapter.js +0 -252
  702. package/out/src/adapters/usgov-nad/adapter.js.map +0 -1
  703. package/out/src/adapters/usgov-nppes/adapter.d.ts.map +0 -1
  704. package/out/src/adapters/usgov-nppes/adapter.js +0 -116
  705. package/out/src/adapters/usgov-nppes/adapter.js.map +0 -1
  706. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +0 -1
  707. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +0 -156
  708. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +0 -1
  709. package/out/src/adapters/utils/index.d.ts +0 -150
  710. package/out/src/adapters/utils/index.d.ts.map +0 -1
  711. package/out/src/adapters/utils/index.js +0 -159
  712. package/out/src/adapters/utils/index.js.map +0 -1
  713. package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +0 -1
  714. package/out/src/adapters/wof-admin-jp/adapter.js +0 -164
  715. package/out/src/adapters/wof-admin-jp/adapter.js.map +0 -1
  716. package/out/src/adapters/wof-admin-json/adapter.d.ts +0 -82
  717. package/out/src/adapters/wof-admin-json/adapter.d.ts.map +0 -1
  718. package/out/src/adapters/wof-admin-json/adapter.js +0 -224
  719. package/out/src/adapters/wof-admin-json/adapter.js.map +0 -1
  720. package/out/src/adapters/wof-json-rows.d.ts +0 -32
  721. package/out/src/adapters/wof-json-rows.d.ts.map +0 -1
  722. package/out/src/adapters/wof-json-rows.js +0 -45
  723. package/out/src/adapters/wof-json-rows.js.map +0 -1
  724. package/out/src/adapters/wof-postalcode-json/adapter.d.ts +0 -65
  725. package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +0 -1
  726. package/out/src/adapters/wof-postalcode-json/adapter.js +0 -160
  727. package/out/src/adapters/wof-postalcode-json/adapter.js.map +0 -1
  728. package/out/src/build.d.ts +0 -132
  729. package/out/src/build.d.ts.map +0 -1
  730. package/out/src/build.js +0 -251
  731. package/out/src/build.js.map +0 -1
  732. package/out/src/codex/us-fips-state.d.ts.map +0 -1
  733. package/out/src/codex/us-fips-state.js.map +0 -1
  734. package/out/src/index.d.ts +0 -14
  735. package/out/src/index.d.ts.map +0 -1
  736. package/out/src/index.js +0 -14
  737. package/out/src/index.js.map +0 -1
  738. package/out/src/name-prone-us-suffixes.d.ts +0 -12
  739. package/out/src/name-prone-us-suffixes.d.ts.map +0 -1
  740. package/out/src/name-prone-us-suffixes.js +0 -12
  741. package/out/src/name-prone-us-suffixes.js.map +0 -1
  742. package/out/src/parquet-wrapper/index.d.ts +0 -9
  743. package/out/src/parquet-wrapper/index.d.ts.map +0 -1
  744. package/out/src/parquet-wrapper/index.js +0 -9
  745. package/out/src/parquet-wrapper/index.js.map +0 -1
  746. package/out/src/parquet-wrapper/reader.d.ts +0 -34
  747. package/out/src/parquet-wrapper/reader.d.ts.map +0 -1
  748. package/out/src/parquet-wrapper/reader.js +0 -69
  749. package/out/src/parquet-wrapper/reader.js.map +0 -1
  750. package/out/src/parquet-wrapper/schema.d.ts +0 -49
  751. package/out/src/parquet-wrapper/schema.d.ts.map +0 -1
  752. package/out/src/parquet-wrapper/schema.js +0 -55
  753. package/out/src/parquet-wrapper/schema.js.map +0 -1
  754. package/out/src/parquet-wrapper/writer.d.ts +0 -46
  755. package/out/src/parquet-wrapper/writer.d.ts.map +0 -1
  756. package/out/src/parquet-wrapper/writer.js +0 -76
  757. package/out/src/parquet-wrapper/writer.js.map +0 -1
  758. package/out/src/runner.d.ts +0 -126
  759. package/out/src/runner.d.ts.map +0 -1
  760. package/out/src/runner.js +0 -189
  761. package/out/src/runner.js.map +0 -1
  762. package/out/src/shard-recipes/anchor-absorption.d.ts +0 -20
  763. package/out/src/shard-recipes/anchor-absorption.d.ts.map +0 -1
  764. package/out/src/shard-recipes/anchor-absorption.js +0 -82
  765. package/out/src/shard-recipes/anchor-absorption.js.map +0 -1
  766. package/out/src/shard-recipes/bare-country.d.ts +0 -25
  767. package/out/src/shard-recipes/bare-country.d.ts.map +0 -1
  768. package/out/src/shard-recipes/bare-country.js +0 -87
  769. package/out/src/shard-recipes/bare-country.js.map +0 -1
  770. package/out/src/shard-recipes/boundary-stress.d.ts +0 -20
  771. package/out/src/shard-recipes/boundary-stress.d.ts.map +0 -1
  772. package/out/src/shard-recipes/boundary-stress.js +0 -83
  773. package/out/src/shard-recipes/boundary-stress.js.map +0 -1
  774. package/out/src/shard-recipes/country-balanced.d.ts +0 -32
  775. package/out/src/shard-recipes/country-balanced.d.ts.map +0 -1
  776. package/out/src/shard-recipes/country-balanced.js +0 -406
  777. package/out/src/shard-recipes/country-balanced.js.map +0 -1
  778. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts +0 -22
  779. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts.map +0 -1
  780. package/out/src/shard-recipes/cz-pcfirst-preposition.js +0 -100
  781. package/out/src/shard-recipes/cz-pcfirst-preposition.js.map +0 -1
  782. package/out/src/shard-recipes/fr-admin-split.d.ts +0 -38
  783. package/out/src/shard-recipes/fr-admin-split.d.ts.map +0 -1
  784. package/out/src/shard-recipes/fr-admin-split.js +0 -188
  785. package/out/src/shard-recipes/fr-admin-split.js.map +0 -1
  786. package/out/src/shard-recipes/fr-bare-street.d.ts +0 -28
  787. package/out/src/shard-recipes/fr-bare-street.d.ts.map +0 -1
  788. package/out/src/shard-recipes/fr-bare-street.js +0 -143
  789. package/out/src/shard-recipes/fr-bare-street.js.map +0 -1
  790. package/out/src/shard-recipes/fr-fragment.d.ts +0 -77
  791. package/out/src/shard-recipes/fr-fragment.d.ts.map +0 -1
  792. package/out/src/shard-recipes/fr-fragment.js +0 -276
  793. package/out/src/shard-recipes/fr-fragment.js.map +0 -1
  794. package/out/src/shard-recipes/fr-lieudit.d.ts +0 -32
  795. package/out/src/shard-recipes/fr-lieudit.d.ts.map +0 -1
  796. package/out/src/shard-recipes/fr-lieudit.js +0 -226
  797. package/out/src/shard-recipes/fr-lieudit.js.map +0 -1
  798. package/out/src/shard-recipes/fr-order.d.ts +0 -38
  799. package/out/src/shard-recipes/fr-order.d.ts.map +0 -1
  800. package/out/src/shard-recipes/fr-order.js +0 -208
  801. package/out/src/shard-recipes/fr-order.js.map +0 -1
  802. package/out/src/shard-recipes/german.d.ts +0 -23
  803. package/out/src/shard-recipes/german.d.ts.map +0 -1
  804. package/out/src/shard-recipes/german.js +0 -132
  805. package/out/src/shard-recipes/german.js.map +0 -1
  806. package/out/src/shard-recipes/house-venue.d.ts +0 -18
  807. package/out/src/shard-recipes/house-venue.d.ts.map +0 -1
  808. package/out/src/shard-recipes/house-venue.js +0 -74
  809. package/out/src/shard-recipes/house-venue.js.map +0 -1
  810. package/out/src/shard-recipes/index.d.ts +0 -24
  811. package/out/src/shard-recipes/index.d.ts.map +0 -1
  812. package/out/src/shard-recipes/index.js +0 -89
  813. package/out/src/shard-recipes/index.js.map +0 -1
  814. package/out/src/shard-recipes/intersection.d.ts +0 -42
  815. package/out/src/shard-recipes/intersection.d.ts.map +0 -1
  816. package/out/src/shard-recipes/intersection.js +0 -460
  817. package/out/src/shard-recipes/intersection.js.map +0 -1
  818. package/out/src/shard-recipes/locale.d.ts +0 -135
  819. package/out/src/shard-recipes/locale.d.ts.map +0 -1
  820. package/out/src/shard-recipes/locale.js +0 -459
  821. package/out/src/shard-recipes/locale.js.map +0 -1
  822. package/out/src/shard-recipes/nl-postcode.d.ts +0 -26
  823. package/out/src/shard-recipes/nl-postcode.d.ts.map +0 -1
  824. package/out/src/shard-recipes/nl-postcode.js +0 -102
  825. package/out/src/shard-recipes/nl-postcode.js.map +0 -1
  826. package/out/src/shard-recipes/no-fragment.d.ts +0 -43
  827. package/out/src/shard-recipes/no-fragment.d.ts.map +0 -1
  828. package/out/src/shard-recipes/no-fragment.js +0 -188
  829. package/out/src/shard-recipes/no-fragment.js.map +0 -1
  830. package/out/src/shard-recipes/no-street-led.d.ts +0 -24
  831. package/out/src/shard-recipes/no-street-led.d.ts.map +0 -1
  832. package/out/src/shard-recipes/no-street-led.js +0 -121
  833. package/out/src/shard-recipes/no-street-led.js.map +0 -1
  834. package/out/src/shard-recipes/no-street.d.ts +0 -18
  835. package/out/src/shard-recipes/no-street.d.ts.map +0 -1
  836. package/out/src/shard-recipes/no-street.js +0 -72
  837. package/out/src/shard-recipes/no-street.js.map +0 -1
  838. package/out/src/shard-recipes/po-box-cedex.d.ts +0 -38
  839. package/out/src/shard-recipes/po-box-cedex.d.ts.map +0 -1
  840. package/out/src/shard-recipes/po-box-cedex.js +0 -726
  841. package/out/src/shard-recipes/po-box-cedex.js.map +0 -1
  842. package/out/src/shard-recipes/po-box.d.ts +0 -17
  843. package/out/src/shard-recipes/po-box.d.ts.map +0 -1
  844. package/out/src/shard-recipes/po-box.js +0 -101
  845. package/out/src/shard-recipes/po-box.js.map +0 -1
  846. package/out/src/shard-recipes/reviewed-postcode-tail.d.ts +0 -47
  847. package/out/src/shard-recipes/reviewed-postcode-tail.d.ts.map +0 -1
  848. package/out/src/shard-recipes/reviewed-postcode-tail.js +0 -125
  849. package/out/src/shard-recipes/reviewed-postcode-tail.js.map +0 -1
  850. package/out/src/shard-recipes/scaffold.d.ts +0 -246
  851. package/out/src/shard-recipes/scaffold.d.ts.map +0 -1
  852. package/out/src/shard-recipes/scaffold.js +0 -137
  853. package/out/src/shard-recipes/scaffold.js.map +0 -1
  854. package/out/src/shard-recipes/si-bare-village.d.ts +0 -32
  855. package/out/src/shard-recipes/si-bare-village.d.ts.map +0 -1
  856. package/out/src/shard-recipes/si-bare-village.js +0 -88
  857. package/out/src/shard-recipes/si-bare-village.js.map +0 -1
  858. package/out/src/shard-recipes/street-affix.d.ts +0 -89
  859. package/out/src/shard-recipes/street-affix.d.ts.map +0 -1
  860. package/out/src/shard-recipes/street-affix.js +0 -578
  861. package/out/src/shard-recipes/street-affix.js.map +0 -1
  862. package/out/src/shard-recipes/street-bare.d.ts +0 -25
  863. package/out/src/shard-recipes/street-bare.d.ts.map +0 -1
  864. package/out/src/shard-recipes/street-bare.js +0 -86
  865. package/out/src/shard-recipes/street-bare.js.map +0 -1
  866. package/out/src/shard-recipes/street.d.ts +0 -15
  867. package/out/src/shard-recipes/street.d.ts.map +0 -1
  868. package/out/src/shard-recipes/street.js +0 -69
  869. package/out/src/shard-recipes/street.js.map +0 -1
  870. package/out/src/shard-recipes/sub-venue-sources.d.ts +0 -228
  871. package/out/src/shard-recipes/sub-venue-sources.d.ts.map +0 -1
  872. package/out/src/shard-recipes/sub-venue-sources.js +0 -664
  873. package/out/src/shard-recipes/sub-venue-sources.js.map +0 -1
  874. package/out/src/shard-recipes/sub-venue.d.ts +0 -269
  875. package/out/src/shard-recipes/sub-venue.d.ts.map +0 -1
  876. package/out/src/shard-recipes/sub-venue.js +0 -710
  877. package/out/src/shard-recipes/sub-venue.js.map +0 -1
  878. package/out/src/shard-recipes/trailing-region.d.ts +0 -74
  879. package/out/src/shard-recipes/trailing-region.d.ts.map +0 -1
  880. package/out/src/shard-recipes/trailing-region.js +0 -157
  881. package/out/src/shard-recipes/trailing-region.js.map +0 -1
  882. package/out/src/shard-recipes/unit.d.ts +0 -29
  883. package/out/src/shard-recipes/unit.d.ts.map +0 -1
  884. package/out/src/shard-recipes/unit.js +0 -243
  885. package/out/src/shard-recipes/unit.js.map +0 -1
  886. package/out/src/synthesizers/anchor-absorption.d.ts +0 -63
  887. package/out/src/synthesizers/anchor-absorption.d.ts.map +0 -1
  888. package/out/src/synthesizers/anchor-absorption.js +0 -223
  889. package/out/src/synthesizers/anchor-absorption.js.map +0 -1
  890. package/out/src/synthesizers/boundary-stress.d.ts +0 -78
  891. package/out/src/synthesizers/boundary-stress.d.ts.map +0 -1
  892. package/out/src/synthesizers/boundary-stress.js +0 -455
  893. package/out/src/synthesizers/boundary-stress.js.map +0 -1
  894. package/out/src/synthesizers/german.d.ts +0 -107
  895. package/out/src/synthesizers/german.d.ts.map +0 -1
  896. package/out/src/synthesizers/german.js +0 -148
  897. package/out/src/synthesizers/german.js.map +0 -1
  898. package/out/src/synthesizers/house-venue.d.ts +0 -56
  899. package/out/src/synthesizers/house-venue.d.ts.map +0 -1
  900. package/out/src/synthesizers/house-venue.js +0 -267
  901. package/out/src/synthesizers/house-venue.js.map +0 -1
  902. package/out/src/synthesizers/intersection.d.ts +0 -52
  903. package/out/src/synthesizers/intersection.d.ts.map +0 -1
  904. package/out/src/synthesizers/intersection.js +0 -175
  905. package/out/src/synthesizers/intersection.js.map +0 -1
  906. package/out/src/synthesizers/no-street.d.ts +0 -72
  907. package/out/src/synthesizers/no-street.d.ts.map +0 -1
  908. package/out/src/synthesizers/no-street.js +0 -282
  909. package/out/src/synthesizers/no-street.js.map +0 -1
  910. package/out/src/synthesizers/po-box.d.ts +0 -104
  911. package/out/src/synthesizers/po-box.d.ts.map +0 -1
  912. package/out/src/synthesizers/po-box.js +0 -266
  913. package/out/src/synthesizers/po-box.js.map +0 -1
  914. package/out/src/synthesizers/street.d.ts +0 -54
  915. package/out/src/synthesizers/street.d.ts.map +0 -1
  916. package/out/src/synthesizers/street.js +0 -221
  917. package/out/src/synthesizers/street.js.map +0 -1
  918. package/out/src/synthesizers/utils.d.ts +0 -203
  919. package/out/src/synthesizers/utils.d.ts.map +0 -1
  920. package/out/src/synthesizers/utils.js +0 -708
  921. package/out/src/synthesizers/utils.js.map +0 -1
  922. package/out/src/tools/align-shard.d.ts +0 -8
  923. package/out/src/tools/align-shard.d.ts.map +0 -1
  924. package/out/src/tools/align-shard.js +0 -56
  925. package/out/src/tools/align-shard.js.map +0 -1
  926. package/out/src/tools/audit.d.ts +0 -28
  927. package/out/src/tools/audit.d.ts.map +0 -1
  928. package/out/src/tools/audit.js +0 -285
  929. package/out/src/tools/audit.js.map +0 -1
  930. package/out/src/tools/corpus-stats.d.ts +0 -44
  931. package/out/src/tools/corpus-stats.d.ts.map +0 -1
  932. package/out/src/tools/corpus-stats.js +0 -138
  933. package/out/src/tools/corpus-stats.js.map +0 -1
  934. package/out/src/tools/fetch/ban.d.ts +0 -31
  935. package/out/src/tools/fetch/ban.d.ts.map +0 -1
  936. package/out/src/tools/fetch/ban.js +0 -239
  937. package/out/src/tools/fetch/ban.js.map +0 -1
  938. package/out/src/tools/fetch/download.d.ts +0 -78
  939. package/out/src/tools/fetch/download.d.ts.map +0 -1
  940. package/out/src/tools/fetch/download.js +0 -116
  941. package/out/src/tools/fetch/download.js.map +0 -1
  942. package/out/src/tools/fetch/geonames-dump.d.ts +0 -87
  943. package/out/src/tools/fetch/geonames-dump.d.ts.map +0 -1
  944. package/out/src/tools/fetch/geonames-dump.js +0 -178
  945. package/out/src/tools/fetch/geonames-dump.js.map +0 -1
  946. package/out/src/tools/fetch/geonames-postal.d.ts +0 -76
  947. package/out/src/tools/fetch/geonames-postal.d.ts.map +0 -1
  948. package/out/src/tools/fetch/geonames-postal.js +0 -125
  949. package/out/src/tools/fetch/geonames-postal.js.map +0 -1
  950. package/out/src/tools/fetch/hrsa.d.ts +0 -18
  951. package/out/src/tools/fetch/hrsa.d.ts.map +0 -1
  952. package/out/src/tools/fetch/hrsa.js +0 -46
  953. package/out/src/tools/fetch/hrsa.js.map +0 -1
  954. package/out/src/tools/fetch/imls-pls.d.ts +0 -25
  955. package/out/src/tools/fetch/imls-pls.d.ts.map +0 -1
  956. package/out/src/tools/fetch/imls-pls.js +0 -108
  957. package/out/src/tools/fetch/imls-pls.js.map +0 -1
  958. package/out/src/tools/fetch/index.d.ts +0 -144
  959. package/out/src/tools/fetch/index.d.ts.map +0 -1
  960. package/out/src/tools/fetch/index.js +0 -143
  961. package/out/src/tools/fetch/index.js.map +0 -1
  962. package/out/src/tools/fetch/nad.d.ts +0 -70
  963. package/out/src/tools/fetch/nad.d.ts.map +0 -1
  964. package/out/src/tools/fetch/nad.js +0 -234
  965. package/out/src/tools/fetch/nad.js.map +0 -1
  966. package/out/src/tools/fetch/nppes.d.ts +0 -26
  967. package/out/src/tools/fetch/nppes.d.ts.map +0 -1
  968. package/out/src/tools/fetch/nppes.js +0 -126
  969. package/out/src/tools/fetch/nppes.js.map +0 -1
  970. package/out/src/tools/fetch/openaddresses.d.ts +0 -61
  971. package/out/src/tools/fetch/openaddresses.d.ts.map +0 -1
  972. package/out/src/tools/fetch/openaddresses.js +0 -317
  973. package/out/src/tools/fetch/openaddresses.js.map +0 -1
  974. package/out/src/tools/fetch/ourairports.d.ts +0 -45
  975. package/out/src/tools/fetch/ourairports.d.ts.map +0 -1
  976. package/out/src/tools/fetch/ourairports.js +0 -128
  977. package/out/src/tools/fetch/ourairports.js.map +0 -1
  978. package/out/src/tools/fetch/ppd.d.ts.map +0 -1
  979. package/out/src/tools/fetch/ppd.js +0 -100
  980. package/out/src/tools/fetch/ppd.js.map +0 -1
  981. package/out/src/tools/fetch/state-hi-schools.d.ts +0 -25
  982. package/out/src/tools/fetch/state-hi-schools.d.ts.map +0 -1
  983. package/out/src/tools/fetch/state-hi-schools.js +0 -162
  984. package/out/src/tools/fetch/state-hi-schools.js.map +0 -1
  985. package/out/src/tools/fetch/state-sources.d.ts +0 -26
  986. package/out/src/tools/fetch/state-sources.d.ts.map +0 -1
  987. package/out/src/tools/fetch/state-sources.js +0 -111
  988. package/out/src/tools/fetch/state-sources.js.map +0 -1
  989. package/out/src/tools/fetch/tiger-full.d.ts +0 -42
  990. package/out/src/tools/fetch/tiger-full.d.ts.map +0 -1
  991. package/out/src/tools/fetch/tiger-full.js +0 -248
  992. package/out/src/tools/fetch/tiger-full.js.map +0 -1
  993. package/out/src/tools/fetch/wikidata-subvenue.d.ts +0 -171
  994. package/out/src/tools/fetch/wikidata-subvenue.d.ts.map +0 -1
  995. package/out/src/tools/fetch/wikidata-subvenue.js +0 -275
  996. package/out/src/tools/fetch/wikidata-subvenue.js.map +0 -1
  997. package/out/src/tools/gb-title-case.d.ts.map +0 -1
  998. package/out/src/tools/gb-title-case.js.map +0 -1
  999. package/out/src/tools/golden-expand.d.ts +0 -90
  1000. package/out/src/tools/golden-expand.d.ts.map +0 -1
  1001. package/out/src/tools/golden-expand.js +0 -413
  1002. package/out/src/tools/golden-expand.js.map +0 -1
  1003. package/out/src/tools/golden-promote.d.ts.map +0 -1
  1004. package/out/src/tools/golden-promote.js +0 -244
  1005. package/out/src/tools/golden-promote.js.map +0 -1
  1006. package/out/src/tools/golden-relabel-street.d.ts +0 -196
  1007. package/out/src/tools/golden-relabel-street.d.ts.map +0 -1
  1008. package/out/src/tools/golden-relabel-street.js +0 -440
  1009. package/out/src/tools/golden-relabel-street.js.map +0 -1
  1010. package/out/src/tools/index.d.ts +0 -28
  1011. package/out/src/tools/index.d.ts.map +0 -1
  1012. package/out/src/tools/index.js +0 -28
  1013. package/out/src/tools/index.js.map +0 -1
  1014. package/out/src/tools/ingest-csv.d.ts.map +0 -1
  1015. package/out/src/tools/ingest-csv.js +0 -296
  1016. package/out/src/tools/ingest-csv.js.map +0 -1
  1017. package/out/src/tools/jsonl-to-parquet.d.ts +0 -61
  1018. package/out/src/tools/jsonl-to-parquet.d.ts.map +0 -1
  1019. package/out/src/tools/jsonl-to-parquet.js +0 -164
  1020. package/out/src/tools/jsonl-to-parquet.js.map +0 -1
  1021. package/out/src/tools/lint-shard-vocab.d.ts +0 -90
  1022. package/out/src/tools/lint-shard-vocab.d.ts.map +0 -1
  1023. package/out/src/tools/lint-shard-vocab.js +0 -281
  1024. package/out/src/tools/lint-shard-vocab.js.map +0 -1
  1025. package/out/src/tools/lint-shard.d.ts +0 -93
  1026. package/out/src/tools/lint-shard.d.ts.map +0 -1
  1027. package/out/src/tools/lint-shard.js +0 -354
  1028. package/out/src/tools/lint-shard.js.map +0 -1
  1029. package/out/src/tools/overlay-manifest.d.ts +0 -39
  1030. package/out/src/tools/overlay-manifest.d.ts.map +0 -1
  1031. package/out/src/tools/overlay-manifest.js +0 -98
  1032. package/out/src/tools/overlay-manifest.js.map +0 -1
  1033. package/out/src/tools/overture-subvenue.d.ts +0 -112
  1034. package/out/src/tools/overture-subvenue.d.ts.map +0 -1
  1035. package/out/src/tools/overture-subvenue.js +0 -144
  1036. package/out/src/tools/overture-subvenue.js.map +0 -1
  1037. package/out/src/tools/postcode-triples.d.ts +0 -175
  1038. package/out/src/tools/postcode-triples.d.ts.map +0 -1
  1039. package/out/src/tools/postcode-triples.js +0 -304
  1040. package/out/src/tools/postcode-triples.js.map +0 -1
  1041. package/out/src/tools/shard-kryptonite.d.ts +0 -32
  1042. package/out/src/tools/shard-kryptonite.d.ts.map +0 -1
  1043. package/out/src/tools/shard-kryptonite.js +0 -100
  1044. package/out/src/tools/shard-kryptonite.js.map +0 -1
  1045. package/out/src/tools/shard-translit.d.ts +0 -51
  1046. package/out/src/tools/shard-translit.d.ts.map +0 -1
  1047. package/out/src/tools/shard-translit.js +0 -175
  1048. package/out/src/tools/shard-translit.js.map +0 -1
  1049. package/out/src/tools/sub-venue/harvest.d.ts +0 -100
  1050. package/out/src/tools/sub-venue/harvest.d.ts.map +0 -1
  1051. package/out/src/tools/sub-venue/harvest.js +0 -168
  1052. package/out/src/tools/sub-venue/harvest.js.map +0 -1
  1053. package/out/src/tools/sub-venue/head-nouns.d.ts +0 -50
  1054. package/out/src/tools/sub-venue/head-nouns.d.ts.map +0 -1
  1055. package/out/src/tools/sub-venue/head-nouns.js +0 -210
  1056. package/out/src/tools/sub-venue/head-nouns.js.map +0 -1
  1057. package/out/src/tools/sub-venue/surfaces.d.ts +0 -45
  1058. package/out/src/tools/sub-venue/surfaces.d.ts.map +0 -1
  1059. package/out/src/tools/sub-venue/surfaces.js +0 -77
  1060. package/out/src/tools/sub-venue/surfaces.js.map +0 -1
  1061. package/out/src/tools/sub-venue/table.d.ts +0 -229
  1062. package/out/src/tools/sub-venue/table.d.ts.map +0 -1
  1063. package/out/src/tools/sub-venue/table.js +0 -108
  1064. package/out/src/tools/sub-venue/table.js.map +0 -1
  1065. package/out/src/tools/sub-venue/wikidata.d.ts +0 -26
  1066. package/out/src/tools/sub-venue/wikidata.d.ts.map +0 -1
  1067. package/out/src/tools/sub-venue/wikidata.js +0 -62
  1068. package/out/src/tools/sub-venue/wikidata.js.map +0 -1
  1069. package/out/src/tools/sub-venue-lexicon.d.ts +0 -156
  1070. package/out/src/tools/sub-venue-lexicon.d.ts.map +0 -1
  1071. package/out/src/tools/sub-venue-lexicon.js +0 -282
  1072. package/out/src/tools/sub-venue-lexicon.js.map +0 -1
  1073. package/out/src/tools/sub-venue-promotions.d.ts +0 -94
  1074. package/out/src/tools/sub-venue-promotions.d.ts.map +0 -1
  1075. package/out/src/tools/sub-venue-promotions.js +0 -266
  1076. package/out/src/tools/sub-venue-promotions.js.map +0 -1
  1077. package/out/src/types.d.ts +0 -221
  1078. package/out/src/types.d.ts.map +0 -1
  1079. package/out/src/types.js.map +0 -1
  1080. package/out/src/utils/align.d.ts +0 -93
  1081. package/out/src/utils/align.d.ts.map +0 -1
  1082. package/out/src/utils/align.js +0 -234
  1083. package/out/src/utils/align.js.map +0 -1
  1084. package/out/src/utils/golden.d.ts +0 -69
  1085. package/out/src/utils/golden.d.ts.map +0 -1
  1086. package/out/src/utils/golden.js +0 -127
  1087. package/out/src/utils/golden.js.map +0 -1
  1088. package/out/src/utils/index.d.ts +0 -14
  1089. package/out/src/utils/index.d.ts.map +0 -1
  1090. package/out/src/utils/index.js +0 -14
  1091. package/out/src/utils/index.js.map +0 -1
  1092. package/out/src/utils/license.d.ts.map +0 -1
  1093. package/out/src/utils/license.js.map +0 -1
  1094. package/out/src/utils/parquet.d.ts +0 -162
  1095. package/out/src/utils/parquet.d.ts.map +0 -1
  1096. package/out/src/utils/parquet.js +0 -262
  1097. package/out/src/utils/parquet.js.map +0 -1
  1098. package/out/src/utils/split.d.ts +0 -127
  1099. package/out/src/utils/split.d.ts.map +0 -1
  1100. package/out/src/utils/split.js +0 -204
  1101. package/out/src/utils/split.js.map +0 -1
  1102. package/out/src/utils/tokenize.d.ts +0 -56
  1103. package/out/src/utils/tokenize.d.ts.map +0 -1
  1104. package/out/src/utils/tokenize.js +0 -48
  1105. package/out/src/utils/tokenize.js.map +0 -1
  1106. package/out/src/utils/wof-json.d.ts +0 -109
  1107. package/out/src/utils/wof-json.d.ts.map +0 -1
  1108. package/out/src/utils/wof-json.js +0 -173
  1109. package/out/src/utils/wof-json.js.map +0 -1
  1110. package/src/adapters/ban/adapter.ts +0 -191
  1111. package/src/adapters/ban/street-decompose.ts +0 -96
  1112. package/src/adapters/fcc-bdc/adapter.ts +0 -174
  1113. package/src/adapters/geonames/adapter.ts +0 -200
  1114. package/src/adapters/geonames-postal/adapter.ts +0 -119
  1115. package/src/adapters/gnaf/adapter.ts +0 -149
  1116. package/src/adapters/gnaf/assemble.ts +0 -226
  1117. package/src/adapters/index.ts +0 -149
  1118. package/src/adapters/openaddresses/adapter.ts +0 -251
  1119. package/src/adapters/overture/adapter.ts +0 -162
  1120. package/src/adapters/state-hi-schools/adapter.ts +0 -164
  1121. package/src/adapters/synth-po-box/adapter.ts +0 -204
  1122. package/src/adapters/tiger/adapter.ts +0 -253
  1123. package/src/adapters/tiger/street-decompose.ts +0 -111
  1124. package/src/adapters/usgov-hrsa-fqhc/adapter.ts +0 -183
  1125. package/src/adapters/usgov-imls-pls/adapter.ts +0 -143
  1126. package/src/adapters/usgov-irs-bmf/adapter.ts +0 -163
  1127. package/src/adapters/usgov-nad/adapter.ts +0 -348
  1128. package/src/adapters/usgov-nppes/adapter.ts +0 -159
  1129. package/src/adapters/usgov-samhsa-treatment-locator/adapter.ts +0 -204
  1130. package/src/adapters/utils/index.ts +0 -233
  1131. package/src/adapters/wof-admin-jp/adapter.ts +0 -216
  1132. package/src/adapters/wof-admin-json/adapter.ts +0 -256
  1133. package/src/adapters/wof-json-rows.ts +0 -79
  1134. package/src/adapters/wof-postalcode-json/adapter.ts +0 -183
  1135. package/src/build.ts +0 -386
  1136. package/src/index.ts +0 -14
  1137. package/src/name-prone-us-suffixes.ts +0 -12
  1138. package/src/parquet-wrapper/index.ts +0 -9
  1139. package/src/parquet-wrapper/reader.ts +0 -97
  1140. package/src/parquet-wrapper/schema.ts +0 -88
  1141. package/src/parquet-wrapper/writer.ts +0 -110
  1142. package/src/runner.ts +0 -317
  1143. package/src/shard-recipes/anchor-absorption.ts +0 -103
  1144. package/src/shard-recipes/bare-country.ts +0 -95
  1145. package/src/shard-recipes/boundary-stress.ts +0 -101
  1146. package/src/shard-recipes/country-balanced.ts +0 -524
  1147. package/src/shard-recipes/cz-pcfirst-preposition.ts +0 -111
  1148. package/src/shard-recipes/fr-admin-split.ts +0 -239
  1149. package/src/shard-recipes/fr-bare-street.ts +0 -170
  1150. package/src/shard-recipes/fr-fragment.ts +0 -332
  1151. package/src/shard-recipes/fr-lieudit.ts +0 -302
  1152. package/src/shard-recipes/fr-order.ts +0 -258
  1153. package/src/shard-recipes/german.ts +0 -170
  1154. package/src/shard-recipes/house-venue.ts +0 -88
  1155. package/src/shard-recipes/index.ts +0 -95
  1156. package/src/shard-recipes/intersection.ts +0 -630
  1157. package/src/shard-recipes/locale.ts +0 -599
  1158. package/src/shard-recipes/nl-postcode.ts +0 -115
  1159. package/src/shard-recipes/no-fragment.ts +0 -219
  1160. package/src/shard-recipes/no-street-led.ts +0 -143
  1161. package/src/shard-recipes/no-street.ts +0 -86
  1162. package/src/shard-recipes/po-box-cedex.ts +0 -920
  1163. package/src/shard-recipes/po-box.ts +0 -119
  1164. package/src/shard-recipes/reviewed-postcode-tail.ts +0 -189
  1165. package/src/shard-recipes/scaffold.ts +0 -360
  1166. package/src/shard-recipes/si-bare-village.ts +0 -97
  1167. package/src/shard-recipes/street-affix.ts +0 -826
  1168. package/src/shard-recipes/street-bare.ts +0 -101
  1169. package/src/shard-recipes/street.ts +0 -82
  1170. package/src/shard-recipes/sub-venue-sources.ts +0 -885
  1171. package/src/shard-recipes/sub-venue.ts +0 -984
  1172. package/src/shard-recipes/trailing-region.ts +0 -183
  1173. package/src/shard-recipes/unit.ts +0 -321
  1174. package/src/synthesizers/anchor-absorption.ts +0 -290
  1175. package/src/synthesizers/boundary-stress.ts +0 -531
  1176. package/src/synthesizers/german.ts +0 -251
  1177. package/src/synthesizers/house-venue.ts +0 -330
  1178. package/src/synthesizers/intersection.ts +0 -232
  1179. package/src/synthesizers/no-street.ts +0 -349
  1180. package/src/synthesizers/po-box.ts +0 -339
  1181. package/src/synthesizers/street.ts +0 -274
  1182. package/src/synthesizers/utils.ts +0 -903
  1183. package/src/tools/align-shard.ts +0 -70
  1184. package/src/tools/audit.ts +0 -399
  1185. package/src/tools/corpus-stats.ts +0 -184
  1186. package/src/tools/fetch/ban.ts +0 -290
  1187. package/src/tools/fetch/download.ts +0 -176
  1188. package/src/tools/fetch/geonames-dump.ts +0 -267
  1189. package/src/tools/fetch/geonames-postal.ts +0 -180
  1190. package/src/tools/fetch/hrsa.ts +0 -68
  1191. package/src/tools/fetch/imls-pls.ts +0 -158
  1192. package/src/tools/fetch/index.ts +0 -147
  1193. package/src/tools/fetch/nad.ts +0 -342
  1194. package/src/tools/fetch/nppes.ts +0 -174
  1195. package/src/tools/fetch/openaddresses.ts +0 -404
  1196. package/src/tools/fetch/ourairports.ts +0 -171
  1197. package/src/tools/fetch/ppd.ts +0 -137
  1198. package/src/tools/fetch/state-hi-schools.ts +0 -208
  1199. package/src/tools/fetch/state-sources.ts +0 -155
  1200. package/src/tools/fetch/tiger-full.ts +0 -354
  1201. package/src/tools/fetch/wikidata-subvenue.ts +0 -386
  1202. package/src/tools/golden-expand.ts +0 -584
  1203. package/src/tools/golden-promote.ts +0 -353
  1204. package/src/tools/golden-relabel-street.ts +0 -685
  1205. package/src/tools/index.ts +0 -28
  1206. package/src/tools/ingest-csv.ts +0 -422
  1207. package/src/tools/jsonl-to-parquet.ts +0 -221
  1208. package/src/tools/lint-shard-vocab.ts +0 -409
  1209. package/src/tools/lint-shard.ts +0 -543
  1210. package/src/tools/overlay-manifest.ts +0 -157
  1211. package/src/tools/overture-subvenue.ts +0 -215
  1212. package/src/tools/postcode-triples.ts +0 -375
  1213. package/src/tools/shard-kryptonite.ts +0 -139
  1214. package/src/tools/shard-translit.ts +0 -245
  1215. package/src/tools/sub-venue/harvest.ts +0 -235
  1216. package/src/tools/sub-venue/head-nouns.ts +0 -242
  1217. package/src/tools/sub-venue/surfaces.ts +0 -95
  1218. package/src/tools/sub-venue/table.ts +0 -281
  1219. package/src/tools/sub-venue/wikidata.ts +0 -85
  1220. package/src/tools/sub-venue-lexicon.ts +0 -431
  1221. package/src/tools/sub-venue-promotions.ts +0 -330
  1222. package/src/types.ts +0 -247
  1223. package/src/utils/align.ts +0 -331
  1224. package/src/utils/golden.ts +0 -176
  1225. package/src/utils/index.ts +0 -14
  1226. package/src/utils/parquet.ts +0 -391
  1227. package/src/utils/split.ts +0 -279
  1228. package/src/utils/tokenize.ts +0 -78
  1229. package/src/utils/wof-json.ts +0 -244
  1230. /package/{src → lib}/adapters/state-ia-contractors/adapter.ts +0 -0
  1231. /package/{src → lib}/adapters/state-ny-notaries/adapter.ts +0 -0
  1232. /package/{src → lib}/adapters/state-tx-notaries/adapter.ts +0 -0
  1233. /package/{src → lib}/codex/us-fips-state.ts +0 -0
  1234. /package/{src → lib}/tools/gb-title-case.ts +0 -0
  1235. /package/{src → lib}/utils/license.ts +0 -0
  1236. /package/out/{src/adapters → adapters}/ban/adapter.d.ts +0 -0
  1237. /package/out/{src/adapters → adapters}/ban/street-decompose.d.ts +0 -0
  1238. /package/out/{src/adapters → adapters}/fcc-bdc/adapter.d.ts +0 -0
  1239. /package/out/{src/adapters → adapters}/geonames/adapter.d.ts +0 -0
  1240. /package/out/{src/adapters → adapters}/openaddresses/adapter.d.ts +0 -0
  1241. /package/out/{src/adapters → adapters}/state-ia-contractors/adapter.d.ts +0 -0
  1242. /package/out/{src/adapters → adapters}/state-ia-contractors/adapter.js +0 -0
  1243. /package/out/{src/adapters → adapters}/state-ny-notaries/adapter.d.ts +0 -0
  1244. /package/out/{src/adapters → adapters}/state-ny-notaries/adapter.js +0 -0
  1245. /package/out/{src/adapters → adapters}/state-tx-notaries/adapter.d.ts +0 -0
  1246. /package/out/{src/adapters → adapters}/state-tx-notaries/adapter.js +0 -0
  1247. /package/out/{src/adapters → adapters}/synth-po-box/adapter.d.ts +0 -0
  1248. /package/out/{src/adapters → adapters}/tiger/street-decompose.d.ts +0 -0
  1249. /package/out/{src/adapters → adapters}/usgov-nppes/adapter.d.ts +0 -0
  1250. /package/out/{src/adapters → adapters}/usgov-samhsa-treatment-locator/adapter.d.ts +0 -0
  1251. /package/out/{src/adapters → adapters}/wof-admin-jp/adapter.d.ts +0 -0
  1252. /package/out/{src/codex → codex}/us-fips-state.d.ts +0 -0
  1253. /package/out/{src/codex → codex}/us-fips-state.js +0 -0
  1254. /package/out/{src/tools → tools}/fetch/ppd.d.ts +0 -0
  1255. /package/out/{src/tools → tools}/gb-title-case.d.ts +0 -0
  1256. /package/out/{src/tools → tools}/gb-title-case.js +0 -0
  1257. /package/out/{src/tools → tools}/golden-promote.d.ts +0 -0
  1258. /package/out/{src/tools → tools}/ingest-csv.d.ts +0 -0
  1259. /package/out/{src/types.js → types.js} +0 -0
  1260. /package/out/{src/utils → utils}/license.d.ts +0 -0
  1261. /package/out/{src/utils → utils}/license.js +0 -0
@@ -0,0 +1,993 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Synthesis / augmentation per Phase 1 task #6.
7
+ *
8
+ * An `Augmentation` is a pure function that takes a `CanonicalRow` and either returns a new
9
+ * `CanonicalRow` (with `raw` AND `components` transformed in lockstep so alignment still
10
+ * succeeds) or `null` when the augmentation doesn't apply to the row's shape.
11
+ *
12
+ * Synthesis runs **before** alignment: augmentations transform raw + components together, and the
13
+ * runner reruns alignment on each augmented row to produce its labels. This keeps the synthesis
14
+ * surface small (no token/label arithmetic) at the cost of a re-run.
15
+ *
16
+ * Every augmented row carries the `synth` marker:
17
+ *
18
+ * - `method`: the augmentation's stable id (e.g. `"case-upper"`, `"accent-strip"`).
19
+ * - `base_source_id`: the source_id of the un-augmented (or upstream-augmented) row, so ancestry is
20
+ * traceable.
21
+ *
22
+ * Phase 1 implements the locale-agnostic + most useful US/FR augmentations. Typo injection (#530)
23
+ * is now implemented ({@link typoInject}) — the "seed-aware API" the deferral asked for is
24
+ * resolved by seeding the PRNG from each row's `source_id`. It ships in {@link AUGMENTATIONS} but
25
+ * is kept OUT of the default set ({@link defaultAugmentationsForCountry}) until its on-model
26
+ * effect is measured; see the note there.
27
+ */
28
+
29
+ import {
30
+ US_STREET_SUFFIX_PREFERRED_ABBR,
31
+ US_UNIT_DESIGNATOR_PREFERRED_ABBR,
32
+ matchCase,
33
+ matchLeadingDesignator,
34
+ matchTrailingSuffix,
35
+ } from "@mailwoman/codex/us"
36
+ import { isPresent } from "@mailwoman/core/objects"
37
+ import { mulberry32 } from "@mailwoman/core/random"
38
+ import { escapeRegExp } from "@mailwoman/core/strings/regexp"
39
+ import type { BIOLabel, ComponentTag } from "@mailwoman/core/types"
40
+ import { stripCombiningMarks } from "@mailwoman/normalize/fold"
41
+
42
+ import type { CanonicalRow, LabeledRow, QuarantinedRow } from "#types"
43
+ import { alignRow, assertSpanInvariants, type ComponentSpan } from "#utils/align"
44
+ import { whitespaceTokenizer, type Tokenizer } from "#utils/tokenize"
45
+
46
+ /**
47
+ * An augmentation transforms a single row. Return `null` if the augmentation doesn't apply (e.g. accent-strip on a row
48
+ * that has no accents; particle-strip on a US row).
49
+ */
50
+ export type Augmentation = (row: CanonicalRow) => CanonicalRow | null
51
+
52
+ type ComponentDict = Partial<Record<ComponentTag, string>>
53
+
54
+ /**
55
+ * Helper: build the augmented row with synth marker + chained source_id.
56
+ */
57
+ function withAugmentation(
58
+ source: CanonicalRow,
59
+ method: string,
60
+ newRaw: string,
61
+ newComponents: ComponentDict
62
+ ): CanonicalRow {
63
+ const baseID = source.synth?.base_source_id ?? source.source_id
64
+
65
+ return {
66
+ ...source,
67
+ raw: newRaw,
68
+ components: newComponents,
69
+ source_id: `${source.source_id}+${method}`,
70
+ synth: { method, base_source_id: baseID },
71
+ }
72
+ }
73
+
74
+ // ===========================================================================
75
+ // Locale-agnostic augmentations
76
+ // ===========================================================================
77
+
78
+ /**
79
+ * Upper-case raw + every component value. Returns null if already all-upper.
80
+ */
81
+ export const caseUpper: Augmentation = (row) => {
82
+ if (row.raw === row.raw.toUpperCase()) return null
83
+ const upRaw = row.raw.toUpperCase()
84
+ const upComponents: ComponentDict = {}
85
+
86
+ for (const [k, v] of Object.entries(row.components)) {
87
+ if (v) {
88
+ upComponents[k as ComponentTag] = v.toUpperCase()
89
+ }
90
+ }
91
+
92
+ return withAugmentation(row, "case-upper", upRaw, upComponents)
93
+ }
94
+
95
+ /**
96
+ * Lower-case raw + every component value. Returns null if already all-lower.
97
+ */
98
+ export const caseLower: Augmentation = (row) => {
99
+ if (row.raw === row.raw.toLowerCase()) return null
100
+ const downRaw = row.raw.toLowerCase()
101
+ const downComponents: ComponentDict = {}
102
+
103
+ for (const [k, v] of Object.entries(row.components)) {
104
+ if (v) {
105
+ downComponents[k as ComponentTag] = v.toLowerCase()
106
+ }
107
+ }
108
+
109
+ return withAugmentation(row, "case-lower", downRaw, downComponents)
110
+ }
111
+
112
+ /**
113
+ * Drop commas from `raw`. Components unchanged (they didn't carry commas).
114
+ */
115
+ export const dropCommas: Augmentation = (row) => {
116
+ if (!row.raw.includes(",")) return null
117
+ const newRaw = row.raw.replaceAll(",", "").replaceAll(/\s+/g, " ").trim()
118
+
119
+ return withAugmentation(row, "drop-commas", newRaw, { ...row.components })
120
+ }
121
+
122
+ /**
123
+ * Replace single spaces with double spaces in `raw` AND in every component value. The component update is essential for
124
+ * alignment: `alignRow` substring-searches each component's surface form inside `raw`, so doubling the spaces in `raw`
125
+ * only would leave single-spaced components unfindable (this was the bug behind v0.1.1's first build attempt — 99.9% of
126
+ * quarantined rows traced back to this augmentation). Doubling both keeps the substring contract intact.
127
+ */
128
+ export const doubleSpace: Augmentation = (row) => {
129
+ if (!/ /.test(row.raw)) return null
130
+ const newRaw = row.raw.replaceAll(" ", " ")
131
+ const newComponents: ComponentDict = {}
132
+
133
+ for (const [k, v] of Object.entries(row.components)) {
134
+ if (v) {
135
+ newComponents[k as ComponentTag] = v.replaceAll(" ", " ")
136
+ }
137
+ }
138
+
139
+ return withAugmentation(row, "double-space", newRaw, newComponents)
140
+ }
141
+
142
+ /**
143
+ * Strip Unicode combining marks (accents, diacritics) from raw + components. "Hôtel" → "Hotel"; "Île-de-France" →
144
+ * "Ile-de-France". Returns null if the row has no accents.
145
+ */
146
+ export const accentStrip: Augmentation = (row) => {
147
+ const stripped = stripCombiningMarks(row.raw)
148
+
149
+ if (stripped === row.raw) return null
150
+ const newComponents: ComponentDict = {}
151
+
152
+ for (const [k, v] of Object.entries(row.components)) {
153
+ if (v) {
154
+ newComponents[k as ComponentTag] = stripCombiningMarks(v)
155
+ }
156
+ }
157
+
158
+ return withAugmentation(row, "accent-strip", stripped, newComponents)
159
+ }
160
+
161
+ // --- typo injection (#530) -------------------------------------------------
162
+ // The Phase-1 deferral asked for a "seed-aware API" so the corpus stays reproducible. Resolution:
163
+ // seed the PRNG from the row's own `source_id` — deterministic per row, no global state, fits the
164
+ // existing `(row) => CanonicalRow | null` signature unchanged.
165
+
166
+ /**
167
+ * QWERTY adjacency for realistic single-key substitutions (lowercase; case is restored on apply).
168
+ */
169
+ const QWERTY_ADJACENCY: Record<string, string> = {
170
+ a: "qwsz",
171
+ b: "vghn",
172
+ c: "xdfv",
173
+ d: "serfcx",
174
+ e: "wsdr",
175
+ f: "drtgvc",
176
+ g: "ftyhbv",
177
+ h: "gyujnb",
178
+ i: "ujko",
179
+ j: "huikmn",
180
+ k: "jiolm",
181
+ l: "kop",
182
+ m: "njk",
183
+ n: "bhjm",
184
+ o: "iklp",
185
+ p: "ol",
186
+ q: "wa",
187
+ r: "edft",
188
+ s: "awedxz",
189
+ t: "rfgy",
190
+ u: "yhji",
191
+ v: "cfgb",
192
+ w: "qase",
193
+ x: "zsdc",
194
+ y: "tghu",
195
+ z: "asx",
196
+ }
197
+
198
+ /**
199
+ * A component value eligible for a typo: a pure-letter name of ≥4 chars (excludes numbers/postcodes/units).
200
+ */
201
+ const ALPHA_NAME = /^[\p{L}][\p{L} '.-]{3,}$/u
202
+
203
+ /**
204
+ * Djb2 → uint32 seed. Deterministic; no `Math.random` (banned here and breaks corpus reproducibility).
205
+ */
206
+ function hashString(s: string): number {
207
+ let h = 5381
208
+
209
+ for (let i = 0; i < s.length; i++) {
210
+ h = ((h << 5) + h + s.charCodeAt(i)) >>> 0
211
+ }
212
+
213
+ return h >>> 0
214
+ }
215
+
216
+ /**
217
+ * Inject ONE realistic typo — an adjacent-QWERTY-key substitution OR an adjacent-character transposition — into a
218
+ * single alpha name component (street/locality/region…), teaching the model to recover from real-world misspellings
219
+ * ("Cupertino" → "Cupertimo"). The edit is applied to BOTH `raw` and the component so the substring contract `alignRow`
220
+ * depends on holds. Number / postcode / unit components are never touched (they fail {@link ALPHA_NAME}). Deterministic
221
+ * per row (seeded from `source_id`). Returns `null` when no eligible component exists or the edit is a no-op.
222
+ */
223
+ export const typoInject: Augmentation = (row) => {
224
+ const rng = mulberry32(hashString(`${row.source_id}:typo`))
225
+
226
+ // Count occurrences so we only edit an UNAMBIGUOUS target — a value that appears exactly once in
227
+ // raw and isn't a substring of another component. (e.g. "Cupertino" the locality is a substring of
228
+ // "Cupertino Avenue" the street; editing it would `replace` the street's occurrence and break the
229
+ // span. The substring contract `alignRow` enforces is why we filter rather than guess the position.)
230
+ const occurs = (needle: string): number => {
231
+ let n = 0
232
+
233
+ for (let i = row.raw.indexOf(needle); i >= 0; i = row.raw.indexOf(needle, i + needle.length)) {
234
+ n++
235
+ }
236
+
237
+ return n
238
+ }
239
+
240
+ const values = Object.values(row.components).filter(isPresent)
241
+
242
+ const eligible = (Object.entries(row.components) as Array<[ComponentTag, string]>).filter(
243
+ ([, v]) => v && ALPHA_NAME.test(v) && occurs(v) === 1 && !values.some((o) => o !== v && o.includes(v))
244
+ )
245
+
246
+ if (!eligible.length) return null
247
+ const [tag, value] = pick(eligible, rng)
248
+ // Interior alpha positions only — keep the first char (most real typos are interior) + a right neighbour.
249
+ const positions: number[] = []
250
+
251
+ for (let i = 1; i < value.length - 1; i++)
252
+ if (/\p{L}/u.test(value[i]!)) {
253
+ positions.push(i)
254
+ }
255
+
256
+ if (!positions.length) return null
257
+ const i = pick(positions, rng)
258
+ const ch = value[i]!
259
+ let typed: string
260
+
261
+ if (rng() < 0.5) {
262
+ const next = value[i + 1]!
263
+
264
+ if (ch === next) return null // transposing equal chars is a no-op
265
+ typed = value.slice(0, i) + next + ch + value.slice(i + 2)
266
+ } else {
267
+ const lower = ch.toLowerCase()
268
+ const adj = QWERTY_ADJACENCY[lower]
269
+
270
+ if (!adj) return null
271
+ const sub = adj[Math.floor(rng() * adj.length)]!
272
+ typed = value.slice(0, i) + (ch !== lower ? sub.toUpperCase() : sub) + value.slice(i + 1)
273
+ }
274
+
275
+ if (typed === value) return null
276
+ const newRaw = row.raw.replace(value, typed)
277
+
278
+ // first occurrence; `replace(string, …)` is literal, not regex
279
+ return withAugmentation(row, "typo-inject", newRaw, { ...row.components, [tag]: typed })
280
+ }
281
+
282
+ // ===========================================================================
283
+ // US-specific augmentations
284
+ // ===========================================================================
285
+
286
+ /**
287
+ * US state full ↔ alpha-2 mapping. Two-way: `STATE_TO_ABBR["Oregon"] = "OR"`.
288
+ */
289
+ const STATE_NAME_TO_ABBR: Record<string, string> = {
290
+ Alabama: "AL",
291
+ Alaska: "AK",
292
+ Arizona: "AZ",
293
+ Arkansas: "AR",
294
+ California: "CA",
295
+ Colorado: "CO",
296
+ Connecticut: "CT",
297
+ Delaware: "DE",
298
+ Florida: "FL",
299
+ Georgia: "GA",
300
+ Hawaii: "HI",
301
+ Idaho: "ID",
302
+ Illinois: "IL",
303
+ Indiana: "IN",
304
+ Iowa: "IA",
305
+ Kansas: "KS",
306
+ Kentucky: "KY",
307
+ Louisiana: "LA",
308
+ Maine: "ME",
309
+ Maryland: "MD",
310
+ Massachusetts: "MA",
311
+ Michigan: "MI",
312
+ Minnesota: "MN",
313
+ Mississippi: "MS",
314
+ Missouri: "MO",
315
+ Montana: "MT",
316
+ Nebraska: "NE",
317
+ Nevada: "NV",
318
+ "New Hampshire": "NH",
319
+ "New Jersey": "NJ",
320
+ "New Mexico": "NM",
321
+ "New York": "NY",
322
+ "North Carolina": "NC",
323
+ "North Dakota": "ND",
324
+ Ohio: "OH",
325
+ Oklahoma: "OK",
326
+ Oregon: "OR",
327
+ Pennsylvania: "PA",
328
+ "Rhode Island": "RI",
329
+ "South Carolina": "SC",
330
+ "South Dakota": "SD",
331
+ Tennessee: "TN",
332
+ Texas: "TX",
333
+ Utah: "UT",
334
+ Vermont: "VT",
335
+ Virginia: "VA",
336
+ Washington: "WA",
337
+ "West Virginia": "WV",
338
+ Wisconsin: "WI",
339
+ Wyoming: "WY",
340
+ "District of Columbia": "DC",
341
+ }
342
+
343
+ const STATE_ABBR_TO_NAME: Record<string, string> = Object.fromEntries(
344
+ Object.entries(STATE_NAME_TO_ABBR).map(([k, v]) => [v, k])
345
+ )
346
+
347
+ /**
348
+ * US: substitute the full state name for its alpha-2 abbreviation.
349
+ */
350
+ export const stateExpand: Augmentation = (row) => {
351
+ if (row.country !== "US") return null
352
+ const region = row.components.region
353
+
354
+ if (!region) return null
355
+ const full = STATE_ABBR_TO_NAME[region]
356
+
357
+ if (!full) return null
358
+ // Replace the bounded "OR" surface form with "Oregon" in raw. Use word boundaries so we
359
+ // don't match inside "Stop" or similar.
360
+ const re = new RegExp(`\\b${region}\\b`, "g")
361
+
362
+ if (!re.test(row.raw)) return null
363
+ const newRaw = row.raw.replaceAll(new RegExp(`\\b${region}\\b`, "g"), full)
364
+ const newComponents: ComponentDict = { ...row.components, region: full }
365
+
366
+ return withAugmentation(row, "state-expand", newRaw, newComponents)
367
+ }
368
+
369
+ /**
370
+ * US: substitute the alpha-2 abbreviation for the full state name.
371
+ */
372
+ export const stateAbbreviate: Augmentation = (row) => {
373
+ if (row.country !== "US") return null
374
+ const region = row.components.region
375
+
376
+ if (!region) return null
377
+ const abbr = STATE_NAME_TO_ABBR[region]
378
+
379
+ if (!abbr) return null
380
+ const re = new RegExp(`\\b${region}\\b`, "g")
381
+
382
+ if (!re.test(row.raw)) return null
383
+ const newRaw = row.raw.replaceAll(new RegExp(`\\b${region}\\b`, "g"), abbr)
384
+ const newComponents: ComponentDict = { ...row.components, region: abbr }
385
+
386
+ return withAugmentation(row, "state-abbreviate", newRaw, newComponents)
387
+ }
388
+
389
+ const DIRECTIONAL_FULL_TO_ABBR: Record<string, string> = {
390
+ North: "N",
391
+ South: "S",
392
+ East: "E",
393
+ West: "W",
394
+ Northeast: "NE",
395
+ Northwest: "NW",
396
+ Southeast: "SE",
397
+ Southwest: "SW",
398
+ }
399
+
400
+ const DIRECTIONAL_ABBR_TO_FULL: Record<string, string> = Object.fromEntries(
401
+ Object.entries(DIRECTIONAL_FULL_TO_ABBR).map(([k, v]) => [v, k])
402
+ )
403
+
404
+ /**
405
+ * US: expand directional abbreviations in `street`/`street_suffix` (NW → Northwest).
406
+ */
407
+ export const directionalExpand: Augmentation = (row) => {
408
+ if (row.country !== "US") return null
409
+ const tagsToCheck: ComponentTag[] = ["street", "street_suffix", "street_prefix"]
410
+ let changed = false
411
+ let newRaw = row.raw
412
+ const newComponents: ComponentDict = { ...row.components }
413
+
414
+ for (const tag of tagsToCheck) {
415
+ const v = newComponents[tag]
416
+
417
+ if (!v) continue
418
+ const replaced = v.replaceAll(/\b(N|S|E|W|NE|NW|SE|SW)\b/g, (m) => DIRECTIONAL_ABBR_TO_FULL[m] ?? m)
419
+
420
+ if (replaced !== v) {
421
+ newComponents[tag] = replaced
422
+ newRaw = newRaw.replaceAll(new RegExp(`\\b${escapeRegExp(v)}\\b`, "g"), replaced)
423
+ changed = true
424
+ }
425
+ }
426
+
427
+ if (!changed) return null
428
+
429
+ return withAugmentation(row, "directional-expand", newRaw, newComponents)
430
+ }
431
+
432
+ /**
433
+ * US: abbreviate directional words (Northwest → NW).
434
+ */
435
+ export const directionalAbbreviate: Augmentation = (row) => {
436
+ if (row.country !== "US") return null
437
+ const tagsToCheck: ComponentTag[] = ["street", "street_suffix", "street_prefix"]
438
+ let changed = false
439
+ let newRaw = row.raw
440
+ const newComponents: ComponentDict = { ...row.components }
441
+
442
+ for (const tag of tagsToCheck) {
443
+ const v = newComponents[tag]
444
+
445
+ if (!v) continue
446
+
447
+ const replaced = v.replaceAll(
448
+ /\b(North|South|East|West|Northeast|Northwest|Southeast|Southwest)\b/g,
449
+ (m) => DIRECTIONAL_FULL_TO_ABBR[m] ?? m
450
+ )
451
+
452
+ if (replaced !== v) {
453
+ newComponents[tag] = replaced
454
+ newRaw = newRaw.replaceAll(new RegExp(`\\b${escapeRegExp(v)}\\b`, "g"), replaced)
455
+ changed = true
456
+ }
457
+ }
458
+
459
+ if (!changed) return null
460
+
461
+ return withAugmentation(row, "directional-abbreviate", newRaw, newComponents)
462
+ }
463
+
464
+ /**
465
+ * US: swap the trailing street-suffix word in `components.street` to its preferred USPS abbreviation, preserving case.
466
+ * `"5th Avenue"` → `"5th Ave"`; `"5TH AVENUE"` → `"5TH AVE"`; `"main street"` → `"main st"`. Returns null when no
467
+ * trailing suffix is recognized, when the trailing word is already the preferred abbreviation, or when the swap would
468
+ * leave `raw` un- touched (alignment requires both raw and components to move in lockstep).
469
+ *
470
+ * Targets the trailing word only to avoid mangling streets like "Avenue of the Americas" where the suffix-shaped word
471
+ * is part of the proper name rather than a USPS suffix.
472
+ */
473
+ export const streetSuffixAbbreviate: Augmentation = (row) => {
474
+ if (row.country !== "US") return null
475
+ const street = row.components.street
476
+
477
+ if (!street) return null
478
+ const match = matchTrailingSuffix(street)
479
+
480
+ if (!match) return null
481
+
482
+ const preferred = US_STREET_SUFFIX_PREFERRED_ABBR[match.canonical]
483
+ const target = matchCase(preferred, match.matched)
484
+
485
+ if (target === match.matched) return null
486
+
487
+ const newStreet = `${street.slice(0, street.lastIndexOf(match.matched))}${target}`
488
+
489
+ if (newStreet === street) return null
490
+
491
+ const newComponents: ComponentDict = { ...row.components, street: newStreet }
492
+ const newRaw = row.raw.replaceAll(new RegExp(`\\b${escapeRegExp(street)}\\b`, "g"), newStreet)
493
+
494
+ if (newRaw === row.raw) return null
495
+
496
+ return withAugmentation(row, "us-street-suffix-abbreviate", newRaw, newComponents)
497
+ }
498
+
499
+ /**
500
+ * US: swap the trailing street-suffix word in `components.street` to its full canonical form, preserving case. `"5th
501
+ * Ave"` → `"5th Avenue"`; `"5TH AVE"` → `"5TH AVENUE"`; `"main st"` → `"main street"`. Returns null when no trailing
502
+ * suffix is recognized, when the trailing word is already the canonical full form, or when the swap would leave `raw`
503
+ * untouched.
504
+ *
505
+ * Same trailing-word-only rule as `streetSuffixAbbreviate`.
506
+ */
507
+ export const streetSuffixExpand: Augmentation = (row) => {
508
+ if (row.country !== "US") return null
509
+ const street = row.components.street
510
+
511
+ if (!street) return null
512
+ const match = matchTrailingSuffix(street)
513
+
514
+ if (!match) return null
515
+
516
+ const target = matchCase(match.canonical, match.matched)
517
+
518
+ if (target === match.matched) return null
519
+
520
+ const newStreet = `${street.slice(0, street.lastIndexOf(match.matched))}${target}`
521
+
522
+ if (newStreet === street) return null
523
+
524
+ const newComponents: ComponentDict = { ...row.components, street: newStreet }
525
+ const newRaw = row.raw.replaceAll(new RegExp(`\\b${escapeRegExp(street)}\\b`, "g"), newStreet)
526
+
527
+ if (newRaw === row.raw) return null
528
+
529
+ return withAugmentation(row, "us-street-suffix-expand", newRaw, newComponents)
530
+ }
531
+
532
+ /**
533
+ * US: swap the LEADING secondary-unit designator in `components.unit` to its approved USPS abbreviation, preserving
534
+ * case + the identifier. `"Apartment 4B"` → `"Apt 4B"`; `"SUITE 200"` → `"STE 200"`; `"floor 3"` → `"fl 3"`. Returns
535
+ * null when the unit has no recognized leading designator (a bare `"4B"` / `"#210"`), the designator is already the
536
+ * approved abbreviation, or the swap would leave `raw` untouched.
537
+ *
538
+ * Mirrors `streetSuffixAbbreviate`, but designators LEAD the unit (vs suffixes that trail the street). Sourced from the
539
+ * USPS Pub-28 C2 codex — the data-generation counterpart to the runtime `UnitDesignatorClassifier`.
540
+ */
541
+ export const unitDesignatorAbbreviate: Augmentation = (row) => {
542
+ if (row.country !== "US") return null
543
+ const unit = row.components.unit
544
+
545
+ if (!unit) return null
546
+ const match = matchLeadingDesignator(unit)
547
+
548
+ if (!match) return null
549
+
550
+ const preferred = US_UNIT_DESIGNATOR_PREFERRED_ABBR[match.canonical]
551
+ const target = matchCase(preferred, match.matched)
552
+
553
+ if (target === match.matched) return null
554
+
555
+ const newUnit = `${target}${unit.slice(match.matched.length)}`
556
+
557
+ if (newUnit === unit) return null
558
+
559
+ const newComponents: ComponentDict = { ...row.components, unit: newUnit }
560
+ const newRaw = row.raw.replaceAll(new RegExp(`\\b${escapeRegExp(unit)}\\b`, "g"), newUnit)
561
+
562
+ if (newRaw === row.raw) return null
563
+
564
+ return withAugmentation(row, "us-unit-designator-abbreviate", newRaw, newComponents)
565
+ }
566
+
567
+ /**
568
+ * US: swap the LEADING secondary-unit designator in `components.unit` to its full canonical form, preserving case + the
569
+ * identifier. `"Apt 4B"` → `"Apartment 4B"`; `"STE 200"` → `"SUITE 200"`. Returns null when there's no recognized
570
+ * leading designator, it's already the canonical word, or the swap would leave `raw` untouched. Same leading-word-only
571
+ * rule as `unitDesignatorAbbreviate`.
572
+ */
573
+ export const unitDesignatorExpand: Augmentation = (row) => {
574
+ if (row.country !== "US") return null
575
+ const unit = row.components.unit
576
+
577
+ if (!unit) return null
578
+ const match = matchLeadingDesignator(unit)
579
+
580
+ if (!match) return null
581
+
582
+ const target = matchCase(match.canonical, match.matched)
583
+
584
+ if (target === match.matched) return null
585
+
586
+ const newUnit = `${target}${unit.slice(match.matched.length)}`
587
+
588
+ if (newUnit === unit) return null
589
+
590
+ const newComponents: ComponentDict = { ...row.components, unit: newUnit }
591
+ const newRaw = row.raw.replaceAll(new RegExp(`\\b${escapeRegExp(unit)}\\b`, "g"), newUnit)
592
+
593
+ if (newRaw === row.raw) return null
594
+
595
+ return withAugmentation(row, "us-unit-designator-expand", newRaw, newComponents)
596
+ }
597
+
598
+ /**
599
+ * US: ZIP+4 form `12345-6789` → `123456789` (dash dropped).
600
+ */
601
+ export const zipPlus4DashDrop: Augmentation = (row) => {
602
+ if (row.country !== "US") return null
603
+ const postcode = row.components.postcode
604
+
605
+ if (!postcode || !/^\d{5}-\d{4}$/.test(postcode)) return null
606
+ const noDash = postcode.replace("-", "")
607
+ const newRaw = row.raw.replace(postcode, noDash)
608
+
609
+ if (newRaw === row.raw) return null
610
+
611
+ return withAugmentation(row, "zip-plus4-dash-drop", newRaw, { ...row.components, postcode: noDash })
612
+ }
613
+
614
+ // ===========================================================================
615
+ // FR-specific augmentations
616
+ // ===========================================================================
617
+
618
+ /**
619
+ * FR: drop the article particle from a street ("Rue de la République" → "Rue République").
620
+ */
621
+ export const particleStrip: Augmentation = (row) => {
622
+ if (row.country !== "FR") return null
623
+ const particle = row.components.street_prefix_particle
624
+
625
+ if (!particle) return null
626
+ const newComponents: ComponentDict = { ...row.components }
627
+ delete newComponents.street_prefix_particle
628
+ // Drop the particle from raw, then collapse any double spaces.
629
+ const re = new RegExp(`\\s+${escapeRegExp(particle)}\\s+`, "g")
630
+
631
+ if (!re.test(row.raw)) return null
632
+ const newRaw = row.raw.replace(re, " ").replaceAll(/\s+/g, " ").trim()
633
+
634
+ return withAugmentation(row, "particle-strip", newRaw, newComponents)
635
+ }
636
+
637
+ // ===========================================================================
638
+ // Registry + default policies
639
+ // ===========================================================================
640
+
641
+ /**
642
+ * Stable id → augmentation table.
643
+ */
644
+ export const AUGMENTATIONS: Record<string, Augmentation> = {
645
+ "case-upper": caseUpper,
646
+ "case-lower": caseLower,
647
+ "drop-commas": dropCommas,
648
+ "double-space": doubleSpace,
649
+ "accent-strip": accentStrip,
650
+ "state-expand": stateExpand,
651
+ "state-abbreviate": stateAbbreviate,
652
+ "directional-expand": directionalExpand,
653
+ "directional-abbreviate": directionalAbbreviate,
654
+ "us-street-suffix-abbreviate": streetSuffixAbbreviate,
655
+ "us-street-suffix-expand": streetSuffixExpand,
656
+ "us-unit-designator-abbreviate": unitDesignatorAbbreviate,
657
+ "us-unit-designator-expand": unitDesignatorExpand,
658
+ "zip-plus4-dash-drop": zipPlus4DashDrop,
659
+ "particle-strip": particleStrip,
660
+ "typo-inject": typoInject,
661
+ }
662
+
663
+ /**
664
+ * Default augmentation set, by country. Phase 1: US + FR; others get the locale-agnostic set.
665
+ */
666
+ export function defaultAugmentationsForCountry(country: string): readonly Augmentation[] {
667
+ // `typoInject` (#530) is deliberately NOT in the default set. It is implemented, tested, and
668
+ // registered in {@link AUGMENTATIONS} so callers can opt in (add it here or compose it directly),
669
+ // but it changes the synthesized corpus distribution and its effect on the trained model is not
670
+ // yet measured. Per the project's default-OFF discipline, promotion into the default build is an
671
+ // operator call once an A/B vs the current corpus exists — keeping the default byte-stable.
672
+ const universal = [caseUpper, caseLower, dropCommas, doubleSpace]
673
+
674
+ switch (country) {
675
+ case "US":
676
+ return [
677
+ ...universal,
678
+ stateExpand,
679
+ stateAbbreviate,
680
+ directionalExpand,
681
+ directionalAbbreviate,
682
+ streetSuffixAbbreviate,
683
+ streetSuffixExpand,
684
+ unitDesignatorAbbreviate,
685
+ unitDesignatorExpand,
686
+ zipPlus4DashDrop,
687
+ ]
688
+ case "FR":
689
+ return [...universal, accentStrip, particleStrip]
690
+ default:
691
+ return universal
692
+ }
693
+ }
694
+
695
+ /**
696
+ * Run every augmentation against a row; collect the non-null outputs. The augmentations are pure, so callers can
697
+ * compose them off this generator (e.g. nesting accent-strip ∘ state-abbreviate).
698
+ */
699
+ export function* synthesizeRow(
700
+ row: CanonicalRow,
701
+ augmentations: readonly Augmentation[] = defaultAugmentationsForCountry(row.country)
702
+ ): Generator<CanonicalRow> {
703
+ for (const aug of augmentations) {
704
+ const out = aug(row)
705
+
706
+ if (out) {
707
+ yield out
708
+ }
709
+ }
710
+ }
711
+
712
+ /**
713
+ * One element of `arr`, drawn with the supplied unit-interval source.
714
+ */
715
+ export function pick<T>(arr: ReadonlyArray<T>, random: () => number): T {
716
+ return arr[Math.floor(random() * arr.length)]!
717
+ }
718
+
719
+ /**
720
+ * One element of `items`, drawn with probability proportional to `weightOf(item)`.
721
+ *
722
+ * One `random()` draw per call. `inclusive` (the default) keeps an item whose cumulative weight lands exactly on the
723
+ * draw (`r <= 0` after subtraction); pass `inclusive: false` for the strict `r < 0` boundary — the two callers this
724
+ * consolidates disagreed on that float-exact edge, and each keeps its own reading so its draw stream is unchanged.
725
+ */
726
+ export function weightedPick<T>(
727
+ items: readonly T[],
728
+ random: () => number,
729
+ weightOf: (item: T) => number,
730
+ options: { inclusive?: boolean } = {}
731
+ ): T {
732
+ const inclusive = options.inclusive ?? true
733
+ const total = items.reduce((sum, item) => sum + weightOf(item), 0)
734
+ let r = random() * total
735
+
736
+ for (const item of items) {
737
+ r -= weightOf(item)
738
+
739
+ if (inclusive ? r <= 0 : r < 0) return item
740
+ }
741
+
742
+ return items.at(-1)!
743
+ }
744
+
745
+ /**
746
+ * One band of a {@link tieredNumber} distribution: a tier draw below `cutoff` (the last band omits it) yields `base +
747
+ * floor(random() * span)`.
748
+ */
749
+ export interface TieredNumberBand {
750
+ cutoff?: number
751
+ base: number
752
+ span: number
753
+ }
754
+
755
+ /**
756
+ * A number drawn from a tiered magnitude distribution — the house/box-number shape the synthesizers share.
757
+ *
758
+ * Exactly two `random()` draws per call, in the order every caller established: one tier draw, then one value draw
759
+ * inside the chosen band.
760
+ */
761
+ export function tieredNumber(random: () => number, bands: readonly TieredNumberBand[]): string {
762
+ const r = random()
763
+ let chosen = bands.at(-1)!
764
+
765
+ for (const band of bands) {
766
+ if (band.cutoff === undefined || r < band.cutoff) {
767
+ chosen = band
768
+
769
+ break
770
+ }
771
+ }
772
+
773
+ return String(chosen.base + Math.floor(random() * chosen.span))
774
+ }
775
+
776
+ /**
777
+ * The primary locale a synthesizer renders for a country — ISO-3166-1 alpha-2, alpha-3, or the English display name,
778
+ * case- and whitespace-tolerant. Unknown countries render as `en-US`.
779
+ *
780
+ * The PO-box synthesizer keeps its own template-scoped `countryToLocale` on top of this one: it maps any locale WITHOUT
781
+ * a PO-box template back to `en-US` (so `DE` still renders the en-US box vocabulary there).
782
+ */
783
+ export function countryToLocale(country: string): string {
784
+ const c = country.trim().toUpperCase()
785
+
786
+ if (c === "US" || c === "USA" || c === "UNITED STATES") return "en-US"
787
+
788
+ if (c === "CA" || c === "CAN" || c === "CANADA") return "en-CA"
789
+
790
+ if (c === "GB" || c === "UK" || c === "GBR" || c === "UNITED KINGDOM") return "en-GB"
791
+
792
+ if (c === "AU" || c === "AUS" || c === "AUSTRALIA") return "en-AU"
793
+
794
+ if (c === "NZ" || c === "NZL" || c === "NEW ZEALAND") return "en-NZ"
795
+
796
+ if (c === "FR" || c === "FRA" || c === "FRANCE") return "fr-FR"
797
+
798
+ if (c === "DE" || c === "DEU" || c === "GERMANY") return "de-DE"
799
+
800
+ if (c === "ES" || c === "ESP" || c === "SPAIN") return "es-ES"
801
+
802
+ if (c === "MX" || c === "MEX" || c === "MEXICO") return "es-MX"
803
+
804
+ if (c === "AR" || c === "ARG" || c === "ARGENTINA") return "es-AR"
805
+
806
+ return "en-US"
807
+ }
808
+
809
+ // ===========================================================================
810
+ // Compositional synthesis (Phase 1.6 §2.1)
811
+ // ===========================================================================
812
+ //
813
+ // The single-row augmentations above transform one `CanonicalRow` into another with `raw` and
814
+ // `components` moved in lockstep, leaving alignment to derive labels downstream. Composition is
815
+ // fundamentally different: it takes a **venue string** and an **address row** from a different
816
+ // source and renders them together as a single `raw`, producing adversarial training examples
817
+ // where embedded place-shaped tokens collide with real address components.
818
+ //
819
+ // Naive post-hoc alignment of the composed string would mis-label the embedded tokens: a venue
820
+ // like `"Buffalo Health Clinic"` shares the token `"Buffalo"` with an address locality
821
+ // `"Buffalo, NY"`, and alignment's leftmost-substring search would claim the venue's `"Buffalo"`
822
+ // as the locality (or vice versa, depending on order). Composition therefore **emits labels
823
+ // directly** — venue tokens are unconditionally labeled `B-venue` / `I-venue`, and the address
824
+ // half re-uses the labels produced by aligning the un-composed address row in isolation. No
825
+ // re-search across the composed boundary.
826
+ //
827
+ // Why a separate primitive (not an `Augmentation`):
828
+ //
829
+ // - Augmentations are unary `(CanonicalRow) -> CanonicalRow | null` and run through
830
+ // `synthesizeRow`. Composition is binary `(string, CanonicalRow) -> LabeledRow` and emits
831
+ // `LabeledRow` directly (it cannot defer labels to alignment without the embedded-token bug).
832
+ // - Augmentations preserve provenance to a single source; compositions cite the address source
833
+ // in `synth.base_source_id` and carry the venue surface form on the `venue` component.
834
+ // - Throttling (the issue calls for ~5-15% of training set) is a build-time policy, not an
835
+ // adapter-level concern — the build pipeline applies it; the primitive stays pure.
836
+ //
837
+ // See `DECISIONS.md` for the rationale on why composition lives alongside augmentation but is
838
+ // not part of the `AUGMENTATIONS` registry.
839
+
840
+ /**
841
+ * Options accepted by `composeAdversarialRow`.
842
+ */
843
+ export interface ComposeAdversarialOptions {
844
+ /**
845
+ * Stable pattern label written into the emitted row's `synth.method` field (as `compose:<pattern>`). Free-form but
846
+ * should be one of a small set of canonical pattern names so downstream filtering / stratification can target
847
+ * individual patterns.
848
+ *
849
+ * Recommended values (Phase 1.6 §2.1):
850
+ *
851
+ * - `"place-name-venue"` — venue token shared with locality (`Buffalo Health Clinic, Buffalo NY`).
852
+ * - `"place-shaped-venue"` — venue contains a place-shaped substring (`New York, New York Steakhouse, Las Vegas NV`).
853
+ * - `"particle-honorific"` — apostrophe + St./Saint ambiguity (`P'tit St. Denis Street Café`).
854
+ */
855
+ pattern: string
856
+
857
+ /**
858
+ * Separator inserted between the venue and the address `raw`. Default `", "`. Single space (`" "`) produces the
859
+ * harder unpunctuated variant; newline (`"\n"`) the multi-line variant.
860
+ */
861
+ separator?: string
862
+
863
+ /**
864
+ * Tokenizer to apply to the venue prefix. Default `whitespaceTokenizer()`. The address half uses the same tokenizer
865
+ * when re-aligned — pass a consistent one if customizing.
866
+ */
867
+ tokenizer?: Tokenizer
868
+ }
869
+
870
+ /**
871
+ * Either a successful labeled composition or a quarantined attempt.
872
+ */
873
+ export type ComposeResult = { kind: "labeled"; row: LabeledRow } | { kind: "quarantined"; row: QuarantinedRow }
874
+
875
+ /**
876
+ * Compose a venue string + an address row into a single adversarial `LabeledRow`.
877
+ *
878
+ * The emitted row's `raw` is `${venue}${separator}${address.raw}`. Tokens are produced by tokenizing the two halves
879
+ * independently and concatenating; labels are venue tokens → `B-venue` / `I-venue` followed by the address's labels
880
+ * (obtained by aligning the input address in isolation). This deterministic boundary is the entire point of the
881
+ * primitive: the embedded place-shaped tokens in the venue stay labeled as `venue`, never as the address's locality /
882
+ * region / etc., even when they share surface forms.
883
+ *
884
+ * The char-offset span triple (#519) is re-targeted to the composed surface by the same deterministic boundary: one
885
+ * `venue` span over `[0, venue.length)` (no re-search), then the address's own spans shifted by `venue.length +
886
+ * separator.length` — plain offset arithmetic, no token indirection. The separator chars sit outside every span
887
+ * (deliberately unlabeled — now expressible). The composed triple is passed through `assertSpanInvariants` so a
888
+ * composition bug can't ride into a corpus.
889
+ *
890
+ * The address's components are forwarded as-is (alignment ran on them and they survived); `venue` is added on top with
891
+ * the trimmed venue string as its surface form.
892
+ *
893
+ * Returns `{ kind: "quarantined" }` when:
894
+ *
895
+ * - The venue is empty or whitespace-only.
896
+ * - The venue is not NFC-normalized (char offsets over a non-NFC raw are ambiguous — the same discipline `alignRow`
897
+ * enforces on adapter rows, surfaced as quarantine here because the venue is caller-supplied data).
898
+ * - The address row fails alignment in isolation (the underlying failure reason is propagated).
899
+ */
900
+ export function composeAdversarialRow(
901
+ venue: string,
902
+ address: CanonicalRow,
903
+ options: ComposeAdversarialOptions
904
+ ): ComposeResult {
905
+ const separator = options.separator ?? ", "
906
+ const tokenizer = options.tokenizer ?? whitespaceTokenizer()
907
+
908
+ const venueTrimmed = venue.trim()
909
+
910
+ if (!venueTrimmed) {
911
+ return { kind: "quarantined", row: { row: address, reason: "venue-empty" } }
912
+ }
913
+
914
+ // Char-offset spans over the composed raw are only meaningful under NFC (#519) — the address
915
+ // half is enforced by alignRow; the venue is caller-supplied and checked here.
916
+ if (venueTrimmed.normalize("NFC") !== venueTrimmed) {
917
+ return { kind: "quarantined", row: { row: address, reason: "venue-not-nfc" } }
918
+ }
919
+
920
+ const addressAligned = alignRow(address, { tokenizer })
921
+
922
+ if (addressAligned.kind !== "labeled") {
923
+ // Surface the address's quarantine reason but tag it with the compose attempt for
924
+ // debugging. The original CanonicalRow stays on the QuarantinedRow so callers can
925
+ // inspect the address payload.
926
+ return {
927
+ kind: "quarantined",
928
+ row: { row: address, reason: `compose-address-${addressAligned.row.reason}` },
929
+ }
930
+ }
931
+
932
+ const venueTokens = tokenizer.tokenize(venueTrimmed)
933
+
934
+ if (!venueTokens.length) {
935
+ return { kind: "quarantined", row: { row: address, reason: "venue-no-tokens" } }
936
+ }
937
+
938
+ const venueLabels: BIOLabel[] = venueTokens.map((_, i) => (i === 0 ? "B-venue" : "I-venue"))
939
+
940
+ const tokens: string[] = [...venueTokens.map((t) => t.text), ...addressAligned.row.tokens]
941
+ const labels: BIOLabel[] = [...venueLabels, ...addressAligned.row.labels]
942
+
943
+ const composedRaw = `${venueTrimmed}${separator}${address.raw}`
944
+
945
+ const composedComponents = {
946
+ venue: venueTrimmed,
947
+ ...address.components,
948
+ }
949
+
950
+ // Re-target the char-offset spans (#519) onto the composed surface: the venue span covers the
951
+ // whole trimmed venue (internal punctuation included — the token path cannot say that), and the
952
+ // address's spans shift right by the venue + separator length. alignRow emits the triple on
953
+ // every labeled row, so absence here is an alignment-contract bug, not data — fail loudly.
954
+ const { span_starts: addrStarts, span_ends: addrEnds, span_tags: addrTags } = addressAligned.row
955
+
956
+ if (addrStarts === undefined || addrEnds === undefined || addrTags === undefined) {
957
+ throw new Error(
958
+ `composeAdversarialRow: alignRow returned a labeled row without the span triple ` +
959
+ `(source=${address.source}, source_id=${address.source_id}) — alignment contract violation`
960
+ )
961
+ }
962
+
963
+ const offset = venueTrimmed.length + separator.length
964
+
965
+ const spans: ComponentSpan[] = [
966
+ { tag: "venue", start: 0, end: venueTrimmed.length },
967
+ ...addrTags.map((tag, i) => ({ tag, start: addrStarts[i]! + offset, end: addrEnds[i]! + offset })),
968
+ ]
969
+
970
+ const baseSourceID = address.synth?.base_source_id ?? address.source_id
971
+ const method = `compose:${options.pattern}`
972
+
973
+ const composed: LabeledRow = {
974
+ raw: composedRaw,
975
+ components: composedComponents,
976
+ country: address.country,
977
+ locale: address.locale,
978
+ source: address.source,
979
+ source_id: `${address.source_id}+${method}`,
980
+ corpus_version: address.corpus_version,
981
+ license: address.license,
982
+ synth: { method, base_source_id: baseSourceID },
983
+ tokens,
984
+ labels,
985
+ span_starts: spans.map((s) => s.start),
986
+ span_ends: spans.map((s) => s.end),
987
+ span_tags: spans.map((s) => s.tag),
988
+ }
989
+
990
+ assertSpanInvariants(spans, composed)
991
+
992
+ return { kind: "labeled", row: composed }
993
+ }