@mailwoman/corpus 9.2.0 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1241) 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/name-prone-us-suffixes.ts +12 -0
  33. package/lib/recipes/anchor-absorption.ts +101 -0
  34. package/lib/recipes/bare-country.ts +95 -0
  35. package/lib/recipes/boundary-stress.ts +100 -0
  36. package/lib/recipes/cn-organizational-units.ts +199 -0
  37. package/lib/recipes/country-balanced.ts +509 -0
  38. package/lib/recipes/cz-pcfirst-preposition.ts +111 -0
  39. package/lib/recipes/fr-admin-split.ts +242 -0
  40. package/lib/recipes/fr-bare-street.ts +170 -0
  41. package/lib/recipes/fr-fragment.ts +333 -0
  42. package/lib/recipes/fr-lieudit.ts +301 -0
  43. package/lib/recipes/fr-order.ts +245 -0
  44. package/lib/recipes/german.ts +359 -0
  45. package/lib/recipes/house-venue.ts +92 -0
  46. package/lib/recipes/index.ts +97 -0
  47. package/lib/recipes/intersection.ts +618 -0
  48. package/lib/recipes/locale.ts +599 -0
  49. package/lib/recipes/nl-postcode.ts +115 -0
  50. package/lib/recipes/no-fragment.ts +219 -0
  51. package/lib/recipes/no-street-led.ts +141 -0
  52. package/lib/recipes/no-street.ts +90 -0
  53. package/lib/recipes/po-box-cedex.ts +976 -0
  54. package/lib/recipes/po-box.ts +123 -0
  55. package/lib/recipes/reviewed-postcode-tail.ts +190 -0
  56. package/lib/recipes/scaffold.ts +469 -0
  57. package/lib/recipes/si-bare-village.ts +97 -0
  58. package/lib/recipes/street-affix.ts +804 -0
  59. package/lib/recipes/street-bare.ts +100 -0
  60. package/lib/recipes/street.ts +81 -0
  61. package/lib/recipes/sub-venue-sources.ts +877 -0
  62. package/lib/recipes/sub-venue.ts +997 -0
  63. package/lib/recipes/trailing-region.ts +183 -0
  64. package/lib/recipes/unit.ts +304 -0
  65. package/lib/runner.ts +312 -0
  66. package/lib/synthesizers/anchor-absorption.ts +288 -0
  67. package/lib/synthesizers/boundary-stress.ts +532 -0
  68. package/lib/synthesizers/german.ts +260 -0
  69. package/lib/synthesizers/house-venue.ts +308 -0
  70. package/lib/synthesizers/intersection.ts +233 -0
  71. package/lib/synthesizers/no-street.ts +327 -0
  72. package/lib/synthesizers/po-box.ts +323 -0
  73. package/lib/synthesizers/street.ts +269 -0
  74. package/lib/synthesizers/utils.ts +993 -0
  75. package/lib/test-kit/corpus-recipe.ts +86 -0
  76. package/lib/test-kit/index.ts +100 -0
  77. package/lib/tools/align-slice.ts +68 -0
  78. package/lib/tools/audit.ts +403 -0
  79. package/lib/tools/corpus-stats.ts +136 -0
  80. package/lib/tools/fetch/ban.ts +289 -0
  81. package/lib/tools/fetch/download.ts +262 -0
  82. package/lib/tools/fetch/geonames-dump.ts +257 -0
  83. package/lib/tools/fetch/geonames-postal.ts +180 -0
  84. package/lib/tools/fetch/hrsa.ts +59 -0
  85. package/lib/tools/fetch/imls-pls.ts +149 -0
  86. package/lib/tools/fetch/index.ts +147 -0
  87. package/lib/tools/fetch/nad.ts +341 -0
  88. package/lib/tools/fetch/nppes.ts +165 -0
  89. package/lib/tools/fetch/openaddresses.ts +347 -0
  90. package/lib/tools/fetch/ourairports.ts +170 -0
  91. package/lib/tools/fetch/ppd.ts +121 -0
  92. package/lib/tools/fetch/state-hi-schools.ts +161 -0
  93. package/lib/tools/fetch/state-sources.ts +146 -0
  94. package/lib/tools/fetch/tiger-full.ts +308 -0
  95. package/lib/tools/fetch/wikidata-subvenue.ts +384 -0
  96. package/lib/tools/golden-expand.ts +574 -0
  97. package/lib/tools/golden-promote.ts +337 -0
  98. package/lib/tools/golden-relabel-street.ts +683 -0
  99. package/lib/tools/index.ts +28 -0
  100. package/lib/tools/ingest-csv.ts +378 -0
  101. package/lib/tools/jsonl-to-parquet.ts +207 -0
  102. package/lib/tools/lint-slice-vocab.ts +388 -0
  103. package/lib/tools/lint-slice.ts +496 -0
  104. package/lib/tools/overlay-manifest.ts +148 -0
  105. package/lib/tools/overture-subvenue.ts +209 -0
  106. package/lib/tools/postcode-triples.ts +363 -0
  107. package/lib/tools/slice-kryptonite.ts +137 -0
  108. package/lib/tools/slice-translit.ts +218 -0
  109. package/lib/tools/sub-venue/harvest.ts +234 -0
  110. package/lib/tools/sub-venue/head-nouns.ts +245 -0
  111. package/lib/tools/sub-venue/surfaces.ts +95 -0
  112. package/lib/tools/sub-venue/table.ts +281 -0
  113. package/lib/tools/sub-venue/wikidata.ts +85 -0
  114. package/lib/tools/sub-venue-lexicon.ts +429 -0
  115. package/lib/tools/sub-venue-promotions.ts +330 -0
  116. package/lib/types.ts +247 -0
  117. package/lib/utils/align.ts +330 -0
  118. package/lib/utils/golden.ts +189 -0
  119. package/lib/utils/index.ts +14 -0
  120. package/lib/utils/parquet.ts +582 -0
  121. package/lib/utils/slice-stats.ts +95 -0
  122. package/lib/utils/split.ts +279 -0
  123. package/lib/utils/tokenize.ts +120 -0
  124. package/lib/utils/wof-json.ts +247 -0
  125. package/out/adapters/ban/adapter.d.ts.map +1 -0
  126. package/out/adapters/ban/adapter.js +149 -0
  127. package/out/adapters/ban/adapter.js.map +1 -0
  128. package/out/adapters/ban/street-decompose.d.ts.map +1 -0
  129. package/out/adapters/ban/street-decompose.js +51 -0
  130. package/out/adapters/ban/street-decompose.js.map +1 -0
  131. package/out/adapters/fcc-bdc/adapter.d.ts.map +1 -0
  132. package/out/adapters/fcc-bdc/adapter.js +144 -0
  133. package/out/adapters/fcc-bdc/adapter.js.map +1 -0
  134. package/out/adapters/geonames/adapter.d.ts.map +1 -0
  135. package/out/adapters/geonames/adapter.js +176 -0
  136. package/out/adapters/geonames/adapter.js.map +1 -0
  137. package/out/adapters/geonames-postal/adapter.d.ts +54 -0
  138. package/out/adapters/geonames-postal/adapter.d.ts.map +1 -0
  139. package/out/adapters/geonames-postal/adapter.js +107 -0
  140. package/out/adapters/geonames-postal/adapter.js.map +1 -0
  141. package/out/adapters/gnaf/adapter.d.ts +49 -0
  142. package/out/adapters/gnaf/adapter.d.ts.map +1 -0
  143. package/out/adapters/gnaf/adapter.js +124 -0
  144. package/out/adapters/gnaf/adapter.js.map +1 -0
  145. package/out/adapters/gnaf/assemble.d.ts +65 -0
  146. package/out/adapters/gnaf/assemble.d.ts.map +1 -0
  147. package/out/adapters/gnaf/assemble.js +154 -0
  148. package/out/adapters/gnaf/assemble.js.map +1 -0
  149. package/out/adapters/index.d.ts +51 -0
  150. package/out/adapters/index.d.ts.map +1 -0
  151. package/out/adapters/index.js +95 -0
  152. package/out/adapters/index.js.map +1 -0
  153. package/out/adapters/openaddresses/adapter.d.ts.map +1 -0
  154. package/out/adapters/openaddresses/adapter.js +186 -0
  155. package/out/adapters/openaddresses/adapter.js.map +1 -0
  156. package/out/adapters/overture/adapter.d.ts +48 -0
  157. package/out/adapters/overture/adapter.d.ts.map +1 -0
  158. package/out/adapters/overture/adapter.js +125 -0
  159. package/out/adapters/overture/adapter.js.map +1 -0
  160. package/out/adapters/state-hi-schools/adapter.d.ts +46 -0
  161. package/out/adapters/state-hi-schools/adapter.d.ts.map +1 -0
  162. package/out/adapters/state-hi-schools/adapter.js +145 -0
  163. package/out/adapters/state-hi-schools/adapter.js.map +1 -0
  164. package/out/adapters/state-hi-schools/workbook.d.ts +29 -0
  165. package/out/adapters/state-hi-schools/workbook.d.ts.map +1 -0
  166. package/out/adapters/state-hi-schools/workbook.js +20 -0
  167. package/out/adapters/state-hi-schools/workbook.js.map +1 -0
  168. package/out/adapters/state-ia-contractors/adapter.d.ts.map +1 -0
  169. package/out/adapters/state-ia-contractors/adapter.js.map +1 -0
  170. package/out/adapters/state-ny-notaries/adapter.d.ts.map +1 -0
  171. package/out/adapters/state-ny-notaries/adapter.js.map +1 -0
  172. package/out/adapters/state-tx-notaries/adapter.d.ts.map +1 -0
  173. package/out/adapters/state-tx-notaries/adapter.js.map +1 -0
  174. package/out/adapters/synth-po-box/adapter.d.ts.map +1 -0
  175. package/out/adapters/synth-po-box/adapter.js +140 -0
  176. package/out/adapters/synth-po-box/adapter.js.map +1 -0
  177. package/out/adapters/tiger/adapter.d.ts +55 -0
  178. package/out/adapters/tiger/adapter.d.ts.map +1 -0
  179. package/out/adapters/tiger/adapter.js +201 -0
  180. package/out/adapters/tiger/adapter.js.map +1 -0
  181. package/out/adapters/tiger/street-decompose.d.ts.map +1 -0
  182. package/out/adapters/tiger/street-decompose.js +68 -0
  183. package/out/adapters/tiger/street-decompose.js.map +1 -0
  184. package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts +56 -0
  185. package/out/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -0
  186. package/out/adapters/usgov-hrsa-fqhc/adapter.js +132 -0
  187. package/out/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -0
  188. package/out/adapters/usgov-imls-pls/adapter.d.ts +36 -0
  189. package/out/adapters/usgov-imls-pls/adapter.d.ts.map +1 -0
  190. package/out/adapters/usgov-imls-pls/adapter.js +114 -0
  191. package/out/adapters/usgov-imls-pls/adapter.js.map +1 -0
  192. package/out/adapters/usgov-irs-bmf/adapter.d.ts +37 -0
  193. package/out/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -0
  194. package/out/adapters/usgov-irs-bmf/adapter.js +120 -0
  195. package/out/adapters/usgov-irs-bmf/adapter.js.map +1 -0
  196. package/out/adapters/usgov-nad/adapter.d.ts +48 -0
  197. package/out/adapters/usgov-nad/adapter.d.ts.map +1 -0
  198. package/out/adapters/usgov-nad/adapter.js +249 -0
  199. package/out/adapters/usgov-nad/adapter.js.map +1 -0
  200. package/out/adapters/usgov-nppes/adapter.d.ts.map +1 -0
  201. package/out/adapters/usgov-nppes/adapter.js +118 -0
  202. package/out/adapters/usgov-nppes/adapter.js.map +1 -0
  203. package/out/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -0
  204. package/out/adapters/usgov-samhsa-treatment-locator/adapter.js +154 -0
  205. package/out/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -0
  206. package/out/adapters/utils/index.d.ts +191 -0
  207. package/out/adapters/utils/index.d.ts.map +1 -0
  208. package/out/adapters/utils/index.js +206 -0
  209. package/out/adapters/utils/index.js.map +1 -0
  210. package/out/adapters/wof-admin-jp/adapter.d.ts.map +1 -0
  211. package/out/adapters/wof-admin-jp/adapter.js +161 -0
  212. package/out/adapters/wof-admin-jp/adapter.js.map +1 -0
  213. package/out/adapters/wof-admin-json/adapter.d.ts +79 -0
  214. package/out/adapters/wof-admin-json/adapter.d.ts.map +1 -0
  215. package/out/adapters/wof-admin-json/adapter.js +197 -0
  216. package/out/adapters/wof-admin-json/adapter.js.map +1 -0
  217. package/out/adapters/wof-json-rows.d.ts +62 -0
  218. package/out/adapters/wof-json-rows.d.ts.map +1 -0
  219. package/out/adapters/wof-json-rows.js +83 -0
  220. package/out/adapters/wof-json-rows.js.map +1 -0
  221. package/out/adapters/wof-postalcode-json/adapter.d.ts +65 -0
  222. package/out/adapters/wof-postalcode-json/adapter.d.ts.map +1 -0
  223. package/out/adapters/wof-postalcode-json/adapter.js +151 -0
  224. package/out/adapters/wof-postalcode-json/adapter.js.map +1 -0
  225. package/out/build.d.ts +132 -0
  226. package/out/build.d.ts.map +1 -0
  227. package/out/build.js +245 -0
  228. package/out/build.js.map +1 -0
  229. package/out/codex/us-fips-state.d.ts.map +1 -0
  230. package/out/codex/us-fips-state.js.map +1 -0
  231. package/out/env.d.ts +46 -0
  232. package/out/env.d.ts.map +1 -0
  233. package/out/env.js +46 -0
  234. package/out/env.js.map +1 -0
  235. package/out/index.d.ts +13 -0
  236. package/out/index.d.ts.map +1 -0
  237. package/out/index.js +13 -0
  238. package/out/index.js.map +1 -0
  239. package/out/name-prone-us-suffixes.d.ts +12 -0
  240. package/out/name-prone-us-suffixes.d.ts.map +1 -0
  241. package/out/name-prone-us-suffixes.js +12 -0
  242. package/out/name-prone-us-suffixes.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 +81 -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 +87 -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 +83 -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 +393 -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 +100 -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 +143 -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 +276 -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 +197 -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 +288 -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 +73 -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 +452 -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 +102 -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 +182 -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 +113 -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 +71 -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 +767 -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 +100 -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 +324 -0
  336. package/out/recipes/scaffold.d.ts.map +1 -0
  337. package/out/recipes/scaffold.js +186 -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 +88 -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 +86 -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 +69 -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 +653 -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 +725 -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 +157 -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 +230 -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/ban.d.ts +31 -0
  432. package/out/tools/fetch/ban.d.ts.map +1 -0
  433. package/out/tools/fetch/ban.js +239 -0
  434. package/out/tools/fetch/ban.js.map +1 -0
  435. package/out/tools/fetch/download.d.ts +117 -0
  436. package/out/tools/fetch/download.d.ts.map +1 -0
  437. package/out/tools/fetch/download.js +160 -0
  438. package/out/tools/fetch/download.js.map +1 -0
  439. package/out/tools/fetch/geonames-dump.d.ts +91 -0
  440. package/out/tools/fetch/geonames-dump.d.ts.map +1 -0
  441. package/out/tools/fetch/geonames-dump.js +171 -0
  442. package/out/tools/fetch/geonames-dump.js.map +1 -0
  443. package/out/tools/fetch/geonames-postal.d.ts +76 -0
  444. package/out/tools/fetch/geonames-postal.d.ts.map +1 -0
  445. package/out/tools/fetch/geonames-postal.js +126 -0
  446. package/out/tools/fetch/geonames-postal.js.map +1 -0
  447. package/out/tools/fetch/hrsa.d.ts +18 -0
  448. package/out/tools/fetch/hrsa.d.ts.map +1 -0
  449. package/out/tools/fetch/hrsa.js +46 -0
  450. package/out/tools/fetch/hrsa.js.map +1 -0
  451. package/out/tools/fetch/imls-pls.d.ts +25 -0
  452. package/out/tools/fetch/imls-pls.d.ts.map +1 -0
  453. package/out/tools/fetch/imls-pls.js +108 -0
  454. package/out/tools/fetch/imls-pls.js.map +1 -0
  455. package/out/tools/fetch/index.d.ts +144 -0
  456. package/out/tools/fetch/index.d.ts.map +1 -0
  457. package/out/tools/fetch/index.js +143 -0
  458. package/out/tools/fetch/index.js.map +1 -0
  459. package/out/tools/fetch/nad.d.ts +70 -0
  460. package/out/tools/fetch/nad.d.ts.map +1 -0
  461. package/out/tools/fetch/nad.js +234 -0
  462. package/out/tools/fetch/nad.js.map +1 -0
  463. package/out/tools/fetch/nppes.d.ts +26 -0
  464. package/out/tools/fetch/nppes.d.ts.map +1 -0
  465. package/out/tools/fetch/nppes.js +126 -0
  466. package/out/tools/fetch/nppes.js.map +1 -0
  467. package/out/tools/fetch/openaddresses.d.ts +9 -0
  468. package/out/tools/fetch/openaddresses.d.ts.map +1 -0
  469. package/out/tools/fetch/openaddresses.js +279 -0
  470. package/out/tools/fetch/openaddresses.js.map +1 -0
  471. package/out/tools/fetch/ourairports.d.ts +45 -0
  472. package/out/tools/fetch/ourairports.d.ts.map +1 -0
  473. package/out/tools/fetch/ourairports.js +128 -0
  474. package/out/tools/fetch/ourairports.js.map +1 -0
  475. package/out/tools/fetch/ppd.d.ts.map +1 -0
  476. package/out/tools/fetch/ppd.js +85 -0
  477. package/out/tools/fetch/ppd.js.map +1 -0
  478. package/out/tools/fetch/state-hi-schools.d.ts +26 -0
  479. package/out/tools/fetch/state-hi-schools.d.ts.map +1 -0
  480. package/out/tools/fetch/state-hi-schools.js +112 -0
  481. package/out/tools/fetch/state-hi-schools.js.map +1 -0
  482. package/out/tools/fetch/state-sources.d.ts +26 -0
  483. package/out/tools/fetch/state-sources.d.ts.map +1 -0
  484. package/out/tools/fetch/state-sources.js +111 -0
  485. package/out/tools/fetch/state-sources.js.map +1 -0
  486. package/out/tools/fetch/tiger-full.d.ts +22 -0
  487. package/out/tools/fetch/tiger-full.d.ts.map +1 -0
  488. package/out/tools/fetch/tiger-full.js +217 -0
  489. package/out/tools/fetch/tiger-full.js.map +1 -0
  490. package/out/tools/fetch/wikidata-subvenue.d.ts +171 -0
  491. package/out/tools/fetch/wikidata-subvenue.d.ts.map +1 -0
  492. package/out/tools/fetch/wikidata-subvenue.js +274 -0
  493. package/out/tools/fetch/wikidata-subvenue.js.map +1 -0
  494. package/out/tools/gb-title-case.d.ts.map +1 -0
  495. package/out/tools/gb-title-case.js.map +1 -0
  496. package/out/tools/golden-expand.d.ts +90 -0
  497. package/out/tools/golden-expand.d.ts.map +1 -0
  498. package/out/tools/golden-expand.js +406 -0
  499. package/out/tools/golden-expand.js.map +1 -0
  500. package/out/tools/golden-promote.d.ts.map +1 -0
  501. package/out/tools/golden-promote.js +240 -0
  502. package/out/tools/golden-promote.js.map +1 -0
  503. package/out/tools/golden-relabel-street.d.ts +196 -0
  504. package/out/tools/golden-relabel-street.d.ts.map +1 -0
  505. package/out/tools/golden-relabel-street.js +440 -0
  506. package/out/tools/golden-relabel-street.js.map +1 -0
  507. package/out/tools/index.d.ts +28 -0
  508. package/out/tools/index.d.ts.map +1 -0
  509. package/out/tools/index.js +28 -0
  510. package/out/tools/index.js.map +1 -0
  511. package/out/tools/ingest-csv.d.ts.map +1 -0
  512. package/out/tools/ingest-csv.js +265 -0
  513. package/out/tools/ingest-csv.js.map +1 -0
  514. package/out/tools/jsonl-to-parquet.d.ts +61 -0
  515. package/out/tools/jsonl-to-parquet.d.ts.map +1 -0
  516. package/out/tools/jsonl-to-parquet.js +150 -0
  517. package/out/tools/jsonl-to-parquet.js.map +1 -0
  518. package/out/tools/lint-slice-vocab.d.ts +90 -0
  519. package/out/tools/lint-slice-vocab.d.ts.map +1 -0
  520. package/out/tools/lint-slice-vocab.js +267 -0
  521. package/out/tools/lint-slice-vocab.js.map +1 -0
  522. package/out/tools/lint-slice.d.ts +93 -0
  523. package/out/tools/lint-slice.d.ts.map +1 -0
  524. package/out/tools/lint-slice.js +322 -0
  525. package/out/tools/lint-slice.js.map +1 -0
  526. package/out/tools/overlay-manifest.d.ts +39 -0
  527. package/out/tools/overlay-manifest.d.ts.map +1 -0
  528. package/out/tools/overlay-manifest.js +90 -0
  529. package/out/tools/overlay-manifest.js.map +1 -0
  530. package/out/tools/overture-subvenue.d.ts +112 -0
  531. package/out/tools/overture-subvenue.d.ts.map +1 -0
  532. package/out/tools/overture-subvenue.js +139 -0
  533. package/out/tools/overture-subvenue.js.map +1 -0
  534. package/out/tools/postcode-triples.d.ts +174 -0
  535. package/out/tools/postcode-triples.d.ts.map +1 -0
  536. package/out/tools/postcode-triples.js +292 -0
  537. package/out/tools/postcode-triples.js.map +1 -0
  538. package/out/tools/slice-kryptonite.d.ts +32 -0
  539. package/out/tools/slice-kryptonite.d.ts.map +1 -0
  540. package/out/tools/slice-kryptonite.js +99 -0
  541. package/out/tools/slice-kryptonite.js.map +1 -0
  542. package/out/tools/slice-translit.d.ts +51 -0
  543. package/out/tools/slice-translit.d.ts.map +1 -0
  544. package/out/tools/slice-translit.js +166 -0
  545. package/out/tools/slice-translit.js.map +1 -0
  546. package/out/tools/sub-venue/harvest.d.ts +100 -0
  547. package/out/tools/sub-venue/harvest.d.ts.map +1 -0
  548. package/out/tools/sub-venue/harvest.js +168 -0
  549. package/out/tools/sub-venue/harvest.js.map +1 -0
  550. package/out/tools/sub-venue/head-nouns.d.ts +50 -0
  551. package/out/tools/sub-venue/head-nouns.d.ts.map +1 -0
  552. package/out/tools/sub-venue/head-nouns.js +213 -0
  553. package/out/tools/sub-venue/head-nouns.js.map +1 -0
  554. package/out/tools/sub-venue/surfaces.d.ts +45 -0
  555. package/out/tools/sub-venue/surfaces.d.ts.map +1 -0
  556. package/out/tools/sub-venue/surfaces.js +77 -0
  557. package/out/tools/sub-venue/surfaces.js.map +1 -0
  558. package/out/tools/sub-venue/table.d.ts +229 -0
  559. package/out/tools/sub-venue/table.d.ts.map +1 -0
  560. package/out/tools/sub-venue/table.js +108 -0
  561. package/out/tools/sub-venue/table.js.map +1 -0
  562. package/out/tools/sub-venue/wikidata.d.ts +26 -0
  563. package/out/tools/sub-venue/wikidata.d.ts.map +1 -0
  564. package/out/tools/sub-venue/wikidata.js +62 -0
  565. package/out/tools/sub-venue/wikidata.js.map +1 -0
  566. package/out/tools/sub-venue-lexicon.d.ts +156 -0
  567. package/out/tools/sub-venue-lexicon.d.ts.map +1 -0
  568. package/out/tools/sub-venue-lexicon.js +283 -0
  569. package/out/tools/sub-venue-lexicon.js.map +1 -0
  570. package/out/tools/sub-venue-promotions.d.ts +94 -0
  571. package/out/tools/sub-venue-promotions.d.ts.map +1 -0
  572. package/out/tools/sub-venue-promotions.js +266 -0
  573. package/out/tools/sub-venue-promotions.js.map +1 -0
  574. package/out/types.d.ts +221 -0
  575. package/out/types.d.ts.map +1 -0
  576. package/out/types.js.map +1 -0
  577. package/out/utils/align.d.ts +93 -0
  578. package/out/utils/align.d.ts.map +1 -0
  579. package/out/utils/align.js +234 -0
  580. package/out/utils/align.js.map +1 -0
  581. package/out/utils/golden.d.ts +85 -0
  582. package/out/utils/golden.d.ts.map +1 -0
  583. package/out/utils/golden.js +127 -0
  584. package/out/utils/golden.js.map +1 -0
  585. package/out/utils/index.d.ts +14 -0
  586. package/out/utils/index.d.ts.map +1 -0
  587. package/out/utils/index.js +14 -0
  588. package/out/utils/index.js.map +1 -0
  589. package/out/utils/license.d.ts.map +1 -0
  590. package/out/utils/license.js.map +1 -0
  591. package/out/utils/parquet.d.ts +178 -0
  592. package/out/utils/parquet.d.ts.map +1 -0
  593. package/out/utils/parquet.js +371 -0
  594. package/out/utils/parquet.js.map +1 -0
  595. package/out/utils/slice-stats.d.ts +52 -0
  596. package/out/utils/slice-stats.d.ts.map +1 -0
  597. package/out/utils/slice-stats.js +58 -0
  598. package/out/utils/slice-stats.js.map +1 -0
  599. package/out/utils/split.d.ts +128 -0
  600. package/out/utils/split.d.ts.map +1 -0
  601. package/out/utils/split.js +204 -0
  602. package/out/utils/split.js.map +1 -0
  603. package/out/utils/tokenize.d.ts +64 -0
  604. package/out/utils/tokenize.d.ts.map +1 -0
  605. package/out/utils/tokenize.js +82 -0
  606. package/out/utils/tokenize.js.map +1 -0
  607. package/out/utils/wof-json.d.ts +113 -0
  608. package/out/utils/wof-json.d.ts.map +1 -0
  609. package/out/utils/wof-json.js +173 -0
  610. package/out/utils/wof-json.js.map +1 -0
  611. package/package.json +259 -194
  612. package/out/src/adapters/ban/adapter.d.ts.map +0 -1
  613. package/out/src/adapters/ban/adapter.js +0 -149
  614. package/out/src/adapters/ban/adapter.js.map +0 -1
  615. package/out/src/adapters/ban/street-decompose.d.ts.map +0 -1
  616. package/out/src/adapters/ban/street-decompose.js +0 -75
  617. package/out/src/adapters/ban/street-decompose.js.map +0 -1
  618. package/out/src/adapters/fcc-bdc/adapter.d.ts.map +0 -1
  619. package/out/src/adapters/fcc-bdc/adapter.js +0 -144
  620. package/out/src/adapters/fcc-bdc/adapter.js.map +0 -1
  621. package/out/src/adapters/geonames/adapter.d.ts.map +0 -1
  622. package/out/src/adapters/geonames/adapter.js +0 -176
  623. package/out/src/adapters/geonames/adapter.js.map +0 -1
  624. package/out/src/adapters/geonames-postal/adapter.d.ts +0 -41
  625. package/out/src/adapters/geonames-postal/adapter.d.ts.map +0 -1
  626. package/out/src/adapters/geonames-postal/adapter.js +0 -104
  627. package/out/src/adapters/geonames-postal/adapter.js.map +0 -1
  628. package/out/src/adapters/gnaf/adapter.d.ts +0 -49
  629. package/out/src/adapters/gnaf/adapter.d.ts.map +0 -1
  630. package/out/src/adapters/gnaf/adapter.js +0 -124
  631. package/out/src/adapters/gnaf/adapter.js.map +0 -1
  632. package/out/src/adapters/gnaf/assemble.d.ts +0 -65
  633. package/out/src/adapters/gnaf/assemble.d.ts.map +0 -1
  634. package/out/src/adapters/gnaf/assemble.js +0 -154
  635. package/out/src/adapters/gnaf/assemble.js.map +0 -1
  636. package/out/src/adapters/index.d.ts +0 -51
  637. package/out/src/adapters/index.d.ts.map +0 -1
  638. package/out/src/adapters/index.js +0 -95
  639. package/out/src/adapters/index.js.map +0 -1
  640. package/out/src/adapters/openaddresses/adapter.d.ts.map +0 -1
  641. package/out/src/adapters/openaddresses/adapter.js +0 -186
  642. package/out/src/adapters/openaddresses/adapter.js.map +0 -1
  643. package/out/src/adapters/overture/adapter.d.ts +0 -48
  644. package/out/src/adapters/overture/adapter.d.ts.map +0 -1
  645. package/out/src/adapters/overture/adapter.js +0 -125
  646. package/out/src/adapters/overture/adapter.js.map +0 -1
  647. package/out/src/adapters/state-hi-schools/adapter.d.ts +0 -47
  648. package/out/src/adapters/state-hi-schools/adapter.d.ts.map +0 -1
  649. package/out/src/adapters/state-hi-schools/adapter.js +0 -133
  650. package/out/src/adapters/state-hi-schools/adapter.js.map +0 -1
  651. package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +0 -1
  652. package/out/src/adapters/state-ia-contractors/adapter.js.map +0 -1
  653. package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +0 -1
  654. package/out/src/adapters/state-ny-notaries/adapter.js.map +0 -1
  655. package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +0 -1
  656. package/out/src/adapters/state-tx-notaries/adapter.js.map +0 -1
  657. package/out/src/adapters/synth-po-box/adapter.d.ts.map +0 -1
  658. package/out/src/adapters/synth-po-box/adapter.js +0 -140
  659. package/out/src/adapters/synth-po-box/adapter.js.map +0 -1
  660. package/out/src/adapters/tiger/adapter.d.ts +0 -55
  661. package/out/src/adapters/tiger/adapter.d.ts.map +0 -1
  662. package/out/src/adapters/tiger/adapter.js +0 -201
  663. package/out/src/adapters/tiger/adapter.js.map +0 -1
  664. package/out/src/adapters/tiger/street-decompose.d.ts.map +0 -1
  665. package/out/src/adapters/tiger/street-decompose.js +0 -90
  666. package/out/src/adapters/tiger/street-decompose.js.map +0 -1
  667. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +0 -47
  668. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +0 -1
  669. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +0 -139
  670. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +0 -1
  671. package/out/src/adapters/usgov-imls-pls/adapter.d.ts +0 -36
  672. package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +0 -1
  673. package/out/src/adapters/usgov-imls-pls/adapter.js +0 -114
  674. package/out/src/adapters/usgov-imls-pls/adapter.js.map +0 -1
  675. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts +0 -37
  676. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +0 -1
  677. package/out/src/adapters/usgov-irs-bmf/adapter.js +0 -124
  678. package/out/src/adapters/usgov-irs-bmf/adapter.js.map +0 -1
  679. package/out/src/adapters/usgov-nad/adapter.d.ts +0 -48
  680. package/out/src/adapters/usgov-nad/adapter.d.ts.map +0 -1
  681. package/out/src/adapters/usgov-nad/adapter.js +0 -252
  682. package/out/src/adapters/usgov-nad/adapter.js.map +0 -1
  683. package/out/src/adapters/usgov-nppes/adapter.d.ts.map +0 -1
  684. package/out/src/adapters/usgov-nppes/adapter.js +0 -116
  685. package/out/src/adapters/usgov-nppes/adapter.js.map +0 -1
  686. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +0 -1
  687. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +0 -156
  688. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +0 -1
  689. package/out/src/adapters/utils/index.d.ts +0 -150
  690. package/out/src/adapters/utils/index.d.ts.map +0 -1
  691. package/out/src/adapters/utils/index.js +0 -159
  692. package/out/src/adapters/utils/index.js.map +0 -1
  693. package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +0 -1
  694. package/out/src/adapters/wof-admin-jp/adapter.js +0 -164
  695. package/out/src/adapters/wof-admin-jp/adapter.js.map +0 -1
  696. package/out/src/adapters/wof-admin-json/adapter.d.ts +0 -82
  697. package/out/src/adapters/wof-admin-json/adapter.d.ts.map +0 -1
  698. package/out/src/adapters/wof-admin-json/adapter.js +0 -224
  699. package/out/src/adapters/wof-admin-json/adapter.js.map +0 -1
  700. package/out/src/adapters/wof-json-rows.d.ts +0 -32
  701. package/out/src/adapters/wof-json-rows.d.ts.map +0 -1
  702. package/out/src/adapters/wof-json-rows.js +0 -45
  703. package/out/src/adapters/wof-json-rows.js.map +0 -1
  704. package/out/src/adapters/wof-postalcode-json/adapter.d.ts +0 -65
  705. package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +0 -1
  706. package/out/src/adapters/wof-postalcode-json/adapter.js +0 -160
  707. package/out/src/adapters/wof-postalcode-json/adapter.js.map +0 -1
  708. package/out/src/build.d.ts +0 -132
  709. package/out/src/build.d.ts.map +0 -1
  710. package/out/src/build.js +0 -251
  711. package/out/src/build.js.map +0 -1
  712. package/out/src/codex/us-fips-state.d.ts.map +0 -1
  713. package/out/src/codex/us-fips-state.js.map +0 -1
  714. package/out/src/index.d.ts +0 -14
  715. package/out/src/index.d.ts.map +0 -1
  716. package/out/src/index.js +0 -14
  717. package/out/src/index.js.map +0 -1
  718. package/out/src/name-prone-us-suffixes.d.ts +0 -12
  719. package/out/src/name-prone-us-suffixes.d.ts.map +0 -1
  720. package/out/src/name-prone-us-suffixes.js +0 -12
  721. package/out/src/name-prone-us-suffixes.js.map +0 -1
  722. package/out/src/parquet-wrapper/index.d.ts +0 -9
  723. package/out/src/parquet-wrapper/index.d.ts.map +0 -1
  724. package/out/src/parquet-wrapper/index.js +0 -9
  725. package/out/src/parquet-wrapper/index.js.map +0 -1
  726. package/out/src/parquet-wrapper/reader.d.ts +0 -34
  727. package/out/src/parquet-wrapper/reader.d.ts.map +0 -1
  728. package/out/src/parquet-wrapper/reader.js +0 -69
  729. package/out/src/parquet-wrapper/reader.js.map +0 -1
  730. package/out/src/parquet-wrapper/schema.d.ts +0 -49
  731. package/out/src/parquet-wrapper/schema.d.ts.map +0 -1
  732. package/out/src/parquet-wrapper/schema.js +0 -55
  733. package/out/src/parquet-wrapper/schema.js.map +0 -1
  734. package/out/src/parquet-wrapper/writer.d.ts +0 -46
  735. package/out/src/parquet-wrapper/writer.d.ts.map +0 -1
  736. package/out/src/parquet-wrapper/writer.js +0 -76
  737. package/out/src/parquet-wrapper/writer.js.map +0 -1
  738. package/out/src/runner.d.ts +0 -126
  739. package/out/src/runner.d.ts.map +0 -1
  740. package/out/src/runner.js +0 -189
  741. package/out/src/runner.js.map +0 -1
  742. package/out/src/shard-recipes/anchor-absorption.d.ts +0 -20
  743. package/out/src/shard-recipes/anchor-absorption.d.ts.map +0 -1
  744. package/out/src/shard-recipes/anchor-absorption.js +0 -82
  745. package/out/src/shard-recipes/anchor-absorption.js.map +0 -1
  746. package/out/src/shard-recipes/bare-country.d.ts +0 -25
  747. package/out/src/shard-recipes/bare-country.d.ts.map +0 -1
  748. package/out/src/shard-recipes/bare-country.js +0 -87
  749. package/out/src/shard-recipes/bare-country.js.map +0 -1
  750. package/out/src/shard-recipes/boundary-stress.d.ts +0 -20
  751. package/out/src/shard-recipes/boundary-stress.d.ts.map +0 -1
  752. package/out/src/shard-recipes/boundary-stress.js +0 -83
  753. package/out/src/shard-recipes/boundary-stress.js.map +0 -1
  754. package/out/src/shard-recipes/country-balanced.d.ts +0 -32
  755. package/out/src/shard-recipes/country-balanced.d.ts.map +0 -1
  756. package/out/src/shard-recipes/country-balanced.js +0 -406
  757. package/out/src/shard-recipes/country-balanced.js.map +0 -1
  758. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts +0 -22
  759. package/out/src/shard-recipes/cz-pcfirst-preposition.d.ts.map +0 -1
  760. package/out/src/shard-recipes/cz-pcfirst-preposition.js +0 -100
  761. package/out/src/shard-recipes/cz-pcfirst-preposition.js.map +0 -1
  762. package/out/src/shard-recipes/fr-admin-split.d.ts +0 -38
  763. package/out/src/shard-recipes/fr-admin-split.d.ts.map +0 -1
  764. package/out/src/shard-recipes/fr-admin-split.js +0 -188
  765. package/out/src/shard-recipes/fr-admin-split.js.map +0 -1
  766. package/out/src/shard-recipes/fr-bare-street.d.ts +0 -28
  767. package/out/src/shard-recipes/fr-bare-street.d.ts.map +0 -1
  768. package/out/src/shard-recipes/fr-bare-street.js +0 -143
  769. package/out/src/shard-recipes/fr-bare-street.js.map +0 -1
  770. package/out/src/shard-recipes/fr-fragment.d.ts +0 -77
  771. package/out/src/shard-recipes/fr-fragment.d.ts.map +0 -1
  772. package/out/src/shard-recipes/fr-fragment.js +0 -276
  773. package/out/src/shard-recipes/fr-fragment.js.map +0 -1
  774. package/out/src/shard-recipes/fr-lieudit.d.ts +0 -32
  775. package/out/src/shard-recipes/fr-lieudit.d.ts.map +0 -1
  776. package/out/src/shard-recipes/fr-lieudit.js +0 -226
  777. package/out/src/shard-recipes/fr-lieudit.js.map +0 -1
  778. package/out/src/shard-recipes/fr-order.d.ts +0 -38
  779. package/out/src/shard-recipes/fr-order.d.ts.map +0 -1
  780. package/out/src/shard-recipes/fr-order.js +0 -208
  781. package/out/src/shard-recipes/fr-order.js.map +0 -1
  782. package/out/src/shard-recipes/german.d.ts +0 -23
  783. package/out/src/shard-recipes/german.d.ts.map +0 -1
  784. package/out/src/shard-recipes/german.js +0 -132
  785. package/out/src/shard-recipes/german.js.map +0 -1
  786. package/out/src/shard-recipes/house-venue.d.ts +0 -18
  787. package/out/src/shard-recipes/house-venue.d.ts.map +0 -1
  788. package/out/src/shard-recipes/house-venue.js +0 -74
  789. package/out/src/shard-recipes/house-venue.js.map +0 -1
  790. package/out/src/shard-recipes/index.d.ts +0 -24
  791. package/out/src/shard-recipes/index.d.ts.map +0 -1
  792. package/out/src/shard-recipes/index.js +0 -89
  793. package/out/src/shard-recipes/index.js.map +0 -1
  794. package/out/src/shard-recipes/intersection.d.ts +0 -42
  795. package/out/src/shard-recipes/intersection.d.ts.map +0 -1
  796. package/out/src/shard-recipes/intersection.js +0 -460
  797. package/out/src/shard-recipes/intersection.js.map +0 -1
  798. package/out/src/shard-recipes/locale.d.ts +0 -135
  799. package/out/src/shard-recipes/locale.d.ts.map +0 -1
  800. package/out/src/shard-recipes/locale.js +0 -459
  801. package/out/src/shard-recipes/locale.js.map +0 -1
  802. package/out/src/shard-recipes/nl-postcode.d.ts +0 -26
  803. package/out/src/shard-recipes/nl-postcode.d.ts.map +0 -1
  804. package/out/src/shard-recipes/nl-postcode.js +0 -102
  805. package/out/src/shard-recipes/nl-postcode.js.map +0 -1
  806. package/out/src/shard-recipes/no-fragment.d.ts +0 -43
  807. package/out/src/shard-recipes/no-fragment.d.ts.map +0 -1
  808. package/out/src/shard-recipes/no-fragment.js +0 -188
  809. package/out/src/shard-recipes/no-fragment.js.map +0 -1
  810. package/out/src/shard-recipes/no-street-led.d.ts +0 -24
  811. package/out/src/shard-recipes/no-street-led.d.ts.map +0 -1
  812. package/out/src/shard-recipes/no-street-led.js +0 -121
  813. package/out/src/shard-recipes/no-street-led.js.map +0 -1
  814. package/out/src/shard-recipes/no-street.d.ts +0 -18
  815. package/out/src/shard-recipes/no-street.d.ts.map +0 -1
  816. package/out/src/shard-recipes/no-street.js +0 -72
  817. package/out/src/shard-recipes/no-street.js.map +0 -1
  818. package/out/src/shard-recipes/po-box-cedex.d.ts +0 -38
  819. package/out/src/shard-recipes/po-box-cedex.d.ts.map +0 -1
  820. package/out/src/shard-recipes/po-box-cedex.js +0 -726
  821. package/out/src/shard-recipes/po-box-cedex.js.map +0 -1
  822. package/out/src/shard-recipes/po-box.d.ts +0 -17
  823. package/out/src/shard-recipes/po-box.d.ts.map +0 -1
  824. package/out/src/shard-recipes/po-box.js +0 -101
  825. package/out/src/shard-recipes/po-box.js.map +0 -1
  826. package/out/src/shard-recipes/reviewed-postcode-tail.d.ts +0 -47
  827. package/out/src/shard-recipes/reviewed-postcode-tail.d.ts.map +0 -1
  828. package/out/src/shard-recipes/reviewed-postcode-tail.js +0 -125
  829. package/out/src/shard-recipes/reviewed-postcode-tail.js.map +0 -1
  830. package/out/src/shard-recipes/scaffold.d.ts +0 -246
  831. package/out/src/shard-recipes/scaffold.d.ts.map +0 -1
  832. package/out/src/shard-recipes/scaffold.js +0 -137
  833. package/out/src/shard-recipes/scaffold.js.map +0 -1
  834. package/out/src/shard-recipes/si-bare-village.d.ts +0 -32
  835. package/out/src/shard-recipes/si-bare-village.d.ts.map +0 -1
  836. package/out/src/shard-recipes/si-bare-village.js +0 -88
  837. package/out/src/shard-recipes/si-bare-village.js.map +0 -1
  838. package/out/src/shard-recipes/street-affix.d.ts +0 -89
  839. package/out/src/shard-recipes/street-affix.d.ts.map +0 -1
  840. package/out/src/shard-recipes/street-affix.js +0 -578
  841. package/out/src/shard-recipes/street-affix.js.map +0 -1
  842. package/out/src/shard-recipes/street-bare.d.ts +0 -25
  843. package/out/src/shard-recipes/street-bare.d.ts.map +0 -1
  844. package/out/src/shard-recipes/street-bare.js +0 -86
  845. package/out/src/shard-recipes/street-bare.js.map +0 -1
  846. package/out/src/shard-recipes/street.d.ts +0 -15
  847. package/out/src/shard-recipes/street.d.ts.map +0 -1
  848. package/out/src/shard-recipes/street.js +0 -69
  849. package/out/src/shard-recipes/street.js.map +0 -1
  850. package/out/src/shard-recipes/sub-venue-sources.d.ts +0 -228
  851. package/out/src/shard-recipes/sub-venue-sources.d.ts.map +0 -1
  852. package/out/src/shard-recipes/sub-venue-sources.js +0 -664
  853. package/out/src/shard-recipes/sub-venue-sources.js.map +0 -1
  854. package/out/src/shard-recipes/sub-venue.d.ts +0 -269
  855. package/out/src/shard-recipes/sub-venue.d.ts.map +0 -1
  856. package/out/src/shard-recipes/sub-venue.js +0 -710
  857. package/out/src/shard-recipes/sub-venue.js.map +0 -1
  858. package/out/src/shard-recipes/trailing-region.d.ts +0 -74
  859. package/out/src/shard-recipes/trailing-region.d.ts.map +0 -1
  860. package/out/src/shard-recipes/trailing-region.js +0 -157
  861. package/out/src/shard-recipes/trailing-region.js.map +0 -1
  862. package/out/src/shard-recipes/unit.d.ts +0 -29
  863. package/out/src/shard-recipes/unit.d.ts.map +0 -1
  864. package/out/src/shard-recipes/unit.js +0 -243
  865. package/out/src/shard-recipes/unit.js.map +0 -1
  866. package/out/src/synthesizers/anchor-absorption.d.ts +0 -63
  867. package/out/src/synthesizers/anchor-absorption.d.ts.map +0 -1
  868. package/out/src/synthesizers/anchor-absorption.js +0 -223
  869. package/out/src/synthesizers/anchor-absorption.js.map +0 -1
  870. package/out/src/synthesizers/boundary-stress.d.ts +0 -78
  871. package/out/src/synthesizers/boundary-stress.d.ts.map +0 -1
  872. package/out/src/synthesizers/boundary-stress.js +0 -455
  873. package/out/src/synthesizers/boundary-stress.js.map +0 -1
  874. package/out/src/synthesizers/german.d.ts +0 -107
  875. package/out/src/synthesizers/german.d.ts.map +0 -1
  876. package/out/src/synthesizers/german.js +0 -148
  877. package/out/src/synthesizers/german.js.map +0 -1
  878. package/out/src/synthesizers/house-venue.d.ts +0 -56
  879. package/out/src/synthesizers/house-venue.d.ts.map +0 -1
  880. package/out/src/synthesizers/house-venue.js +0 -267
  881. package/out/src/synthesizers/house-venue.js.map +0 -1
  882. package/out/src/synthesizers/intersection.d.ts +0 -52
  883. package/out/src/synthesizers/intersection.d.ts.map +0 -1
  884. package/out/src/synthesizers/intersection.js +0 -175
  885. package/out/src/synthesizers/intersection.js.map +0 -1
  886. package/out/src/synthesizers/no-street.d.ts +0 -72
  887. package/out/src/synthesizers/no-street.d.ts.map +0 -1
  888. package/out/src/synthesizers/no-street.js +0 -282
  889. package/out/src/synthesizers/no-street.js.map +0 -1
  890. package/out/src/synthesizers/po-box.d.ts +0 -104
  891. package/out/src/synthesizers/po-box.d.ts.map +0 -1
  892. package/out/src/synthesizers/po-box.js +0 -266
  893. package/out/src/synthesizers/po-box.js.map +0 -1
  894. package/out/src/synthesizers/street.d.ts +0 -54
  895. package/out/src/synthesizers/street.d.ts.map +0 -1
  896. package/out/src/synthesizers/street.js +0 -221
  897. package/out/src/synthesizers/street.js.map +0 -1
  898. package/out/src/synthesizers/utils.d.ts +0 -203
  899. package/out/src/synthesizers/utils.d.ts.map +0 -1
  900. package/out/src/synthesizers/utils.js +0 -708
  901. package/out/src/synthesizers/utils.js.map +0 -1
  902. package/out/src/tools/align-shard.d.ts +0 -8
  903. package/out/src/tools/align-shard.d.ts.map +0 -1
  904. package/out/src/tools/align-shard.js +0 -56
  905. package/out/src/tools/align-shard.js.map +0 -1
  906. package/out/src/tools/audit.d.ts +0 -28
  907. package/out/src/tools/audit.d.ts.map +0 -1
  908. package/out/src/tools/audit.js +0 -285
  909. package/out/src/tools/audit.js.map +0 -1
  910. package/out/src/tools/corpus-stats.d.ts +0 -44
  911. package/out/src/tools/corpus-stats.d.ts.map +0 -1
  912. package/out/src/tools/corpus-stats.js +0 -138
  913. package/out/src/tools/corpus-stats.js.map +0 -1
  914. package/out/src/tools/fetch/ban.d.ts +0 -31
  915. package/out/src/tools/fetch/ban.d.ts.map +0 -1
  916. package/out/src/tools/fetch/ban.js +0 -239
  917. package/out/src/tools/fetch/ban.js.map +0 -1
  918. package/out/src/tools/fetch/download.d.ts +0 -78
  919. package/out/src/tools/fetch/download.d.ts.map +0 -1
  920. package/out/src/tools/fetch/download.js +0 -116
  921. package/out/src/tools/fetch/download.js.map +0 -1
  922. package/out/src/tools/fetch/geonames-dump.d.ts +0 -87
  923. package/out/src/tools/fetch/geonames-dump.d.ts.map +0 -1
  924. package/out/src/tools/fetch/geonames-dump.js +0 -178
  925. package/out/src/tools/fetch/geonames-dump.js.map +0 -1
  926. package/out/src/tools/fetch/geonames-postal.d.ts +0 -76
  927. package/out/src/tools/fetch/geonames-postal.d.ts.map +0 -1
  928. package/out/src/tools/fetch/geonames-postal.js +0 -125
  929. package/out/src/tools/fetch/geonames-postal.js.map +0 -1
  930. package/out/src/tools/fetch/hrsa.d.ts +0 -18
  931. package/out/src/tools/fetch/hrsa.d.ts.map +0 -1
  932. package/out/src/tools/fetch/hrsa.js +0 -46
  933. package/out/src/tools/fetch/hrsa.js.map +0 -1
  934. package/out/src/tools/fetch/imls-pls.d.ts +0 -25
  935. package/out/src/tools/fetch/imls-pls.d.ts.map +0 -1
  936. package/out/src/tools/fetch/imls-pls.js +0 -108
  937. package/out/src/tools/fetch/imls-pls.js.map +0 -1
  938. package/out/src/tools/fetch/index.d.ts +0 -144
  939. package/out/src/tools/fetch/index.d.ts.map +0 -1
  940. package/out/src/tools/fetch/index.js +0 -143
  941. package/out/src/tools/fetch/index.js.map +0 -1
  942. package/out/src/tools/fetch/nad.d.ts +0 -70
  943. package/out/src/tools/fetch/nad.d.ts.map +0 -1
  944. package/out/src/tools/fetch/nad.js +0 -234
  945. package/out/src/tools/fetch/nad.js.map +0 -1
  946. package/out/src/tools/fetch/nppes.d.ts +0 -26
  947. package/out/src/tools/fetch/nppes.d.ts.map +0 -1
  948. package/out/src/tools/fetch/nppes.js +0 -126
  949. package/out/src/tools/fetch/nppes.js.map +0 -1
  950. package/out/src/tools/fetch/openaddresses.d.ts +0 -61
  951. package/out/src/tools/fetch/openaddresses.d.ts.map +0 -1
  952. package/out/src/tools/fetch/openaddresses.js +0 -317
  953. package/out/src/tools/fetch/openaddresses.js.map +0 -1
  954. package/out/src/tools/fetch/ourairports.d.ts +0 -45
  955. package/out/src/tools/fetch/ourairports.d.ts.map +0 -1
  956. package/out/src/tools/fetch/ourairports.js +0 -128
  957. package/out/src/tools/fetch/ourairports.js.map +0 -1
  958. package/out/src/tools/fetch/ppd.d.ts.map +0 -1
  959. package/out/src/tools/fetch/ppd.js +0 -100
  960. package/out/src/tools/fetch/ppd.js.map +0 -1
  961. package/out/src/tools/fetch/state-hi-schools.d.ts +0 -25
  962. package/out/src/tools/fetch/state-hi-schools.d.ts.map +0 -1
  963. package/out/src/tools/fetch/state-hi-schools.js +0 -162
  964. package/out/src/tools/fetch/state-hi-schools.js.map +0 -1
  965. package/out/src/tools/fetch/state-sources.d.ts +0 -26
  966. package/out/src/tools/fetch/state-sources.d.ts.map +0 -1
  967. package/out/src/tools/fetch/state-sources.js +0 -111
  968. package/out/src/tools/fetch/state-sources.js.map +0 -1
  969. package/out/src/tools/fetch/tiger-full.d.ts +0 -42
  970. package/out/src/tools/fetch/tiger-full.d.ts.map +0 -1
  971. package/out/src/tools/fetch/tiger-full.js +0 -248
  972. package/out/src/tools/fetch/tiger-full.js.map +0 -1
  973. package/out/src/tools/fetch/wikidata-subvenue.d.ts +0 -171
  974. package/out/src/tools/fetch/wikidata-subvenue.d.ts.map +0 -1
  975. package/out/src/tools/fetch/wikidata-subvenue.js +0 -275
  976. package/out/src/tools/fetch/wikidata-subvenue.js.map +0 -1
  977. package/out/src/tools/gb-title-case.d.ts.map +0 -1
  978. package/out/src/tools/gb-title-case.js.map +0 -1
  979. package/out/src/tools/golden-expand.d.ts +0 -90
  980. package/out/src/tools/golden-expand.d.ts.map +0 -1
  981. package/out/src/tools/golden-expand.js +0 -413
  982. package/out/src/tools/golden-expand.js.map +0 -1
  983. package/out/src/tools/golden-promote.d.ts.map +0 -1
  984. package/out/src/tools/golden-promote.js +0 -244
  985. package/out/src/tools/golden-promote.js.map +0 -1
  986. package/out/src/tools/golden-relabel-street.d.ts +0 -196
  987. package/out/src/tools/golden-relabel-street.d.ts.map +0 -1
  988. package/out/src/tools/golden-relabel-street.js +0 -440
  989. package/out/src/tools/golden-relabel-street.js.map +0 -1
  990. package/out/src/tools/index.d.ts +0 -28
  991. package/out/src/tools/index.d.ts.map +0 -1
  992. package/out/src/tools/index.js +0 -28
  993. package/out/src/tools/index.js.map +0 -1
  994. package/out/src/tools/ingest-csv.d.ts.map +0 -1
  995. package/out/src/tools/ingest-csv.js +0 -296
  996. package/out/src/tools/ingest-csv.js.map +0 -1
  997. package/out/src/tools/jsonl-to-parquet.d.ts +0 -61
  998. package/out/src/tools/jsonl-to-parquet.d.ts.map +0 -1
  999. package/out/src/tools/jsonl-to-parquet.js +0 -164
  1000. package/out/src/tools/jsonl-to-parquet.js.map +0 -1
  1001. package/out/src/tools/lint-shard-vocab.d.ts +0 -90
  1002. package/out/src/tools/lint-shard-vocab.d.ts.map +0 -1
  1003. package/out/src/tools/lint-shard-vocab.js +0 -281
  1004. package/out/src/tools/lint-shard-vocab.js.map +0 -1
  1005. package/out/src/tools/lint-shard.d.ts +0 -93
  1006. package/out/src/tools/lint-shard.d.ts.map +0 -1
  1007. package/out/src/tools/lint-shard.js +0 -354
  1008. package/out/src/tools/lint-shard.js.map +0 -1
  1009. package/out/src/tools/overlay-manifest.d.ts +0 -39
  1010. package/out/src/tools/overlay-manifest.d.ts.map +0 -1
  1011. package/out/src/tools/overlay-manifest.js +0 -98
  1012. package/out/src/tools/overlay-manifest.js.map +0 -1
  1013. package/out/src/tools/overture-subvenue.d.ts +0 -112
  1014. package/out/src/tools/overture-subvenue.d.ts.map +0 -1
  1015. package/out/src/tools/overture-subvenue.js +0 -144
  1016. package/out/src/tools/overture-subvenue.js.map +0 -1
  1017. package/out/src/tools/postcode-triples.d.ts +0 -175
  1018. package/out/src/tools/postcode-triples.d.ts.map +0 -1
  1019. package/out/src/tools/postcode-triples.js +0 -304
  1020. package/out/src/tools/postcode-triples.js.map +0 -1
  1021. package/out/src/tools/shard-kryptonite.d.ts +0 -32
  1022. package/out/src/tools/shard-kryptonite.d.ts.map +0 -1
  1023. package/out/src/tools/shard-kryptonite.js +0 -100
  1024. package/out/src/tools/shard-kryptonite.js.map +0 -1
  1025. package/out/src/tools/shard-translit.d.ts +0 -51
  1026. package/out/src/tools/shard-translit.d.ts.map +0 -1
  1027. package/out/src/tools/shard-translit.js +0 -175
  1028. package/out/src/tools/shard-translit.js.map +0 -1
  1029. package/out/src/tools/sub-venue/harvest.d.ts +0 -100
  1030. package/out/src/tools/sub-venue/harvest.d.ts.map +0 -1
  1031. package/out/src/tools/sub-venue/harvest.js +0 -168
  1032. package/out/src/tools/sub-venue/harvest.js.map +0 -1
  1033. package/out/src/tools/sub-venue/head-nouns.d.ts +0 -50
  1034. package/out/src/tools/sub-venue/head-nouns.d.ts.map +0 -1
  1035. package/out/src/tools/sub-venue/head-nouns.js +0 -210
  1036. package/out/src/tools/sub-venue/head-nouns.js.map +0 -1
  1037. package/out/src/tools/sub-venue/surfaces.d.ts +0 -45
  1038. package/out/src/tools/sub-venue/surfaces.d.ts.map +0 -1
  1039. package/out/src/tools/sub-venue/surfaces.js +0 -77
  1040. package/out/src/tools/sub-venue/surfaces.js.map +0 -1
  1041. package/out/src/tools/sub-venue/table.d.ts +0 -229
  1042. package/out/src/tools/sub-venue/table.d.ts.map +0 -1
  1043. package/out/src/tools/sub-venue/table.js +0 -108
  1044. package/out/src/tools/sub-venue/table.js.map +0 -1
  1045. package/out/src/tools/sub-venue/wikidata.d.ts +0 -26
  1046. package/out/src/tools/sub-venue/wikidata.d.ts.map +0 -1
  1047. package/out/src/tools/sub-venue/wikidata.js +0 -62
  1048. package/out/src/tools/sub-venue/wikidata.js.map +0 -1
  1049. package/out/src/tools/sub-venue-lexicon.d.ts +0 -156
  1050. package/out/src/tools/sub-venue-lexicon.d.ts.map +0 -1
  1051. package/out/src/tools/sub-venue-lexicon.js +0 -282
  1052. package/out/src/tools/sub-venue-lexicon.js.map +0 -1
  1053. package/out/src/tools/sub-venue-promotions.d.ts +0 -94
  1054. package/out/src/tools/sub-venue-promotions.d.ts.map +0 -1
  1055. package/out/src/tools/sub-venue-promotions.js +0 -266
  1056. package/out/src/tools/sub-venue-promotions.js.map +0 -1
  1057. package/out/src/types.d.ts +0 -221
  1058. package/out/src/types.d.ts.map +0 -1
  1059. package/out/src/types.js.map +0 -1
  1060. package/out/src/utils/align.d.ts +0 -93
  1061. package/out/src/utils/align.d.ts.map +0 -1
  1062. package/out/src/utils/align.js +0 -234
  1063. package/out/src/utils/align.js.map +0 -1
  1064. package/out/src/utils/golden.d.ts +0 -69
  1065. package/out/src/utils/golden.d.ts.map +0 -1
  1066. package/out/src/utils/golden.js +0 -127
  1067. package/out/src/utils/golden.js.map +0 -1
  1068. package/out/src/utils/index.d.ts +0 -14
  1069. package/out/src/utils/index.d.ts.map +0 -1
  1070. package/out/src/utils/index.js +0 -14
  1071. package/out/src/utils/index.js.map +0 -1
  1072. package/out/src/utils/license.d.ts.map +0 -1
  1073. package/out/src/utils/license.js.map +0 -1
  1074. package/out/src/utils/parquet.d.ts +0 -162
  1075. package/out/src/utils/parquet.d.ts.map +0 -1
  1076. package/out/src/utils/parquet.js +0 -262
  1077. package/out/src/utils/parquet.js.map +0 -1
  1078. package/out/src/utils/split.d.ts +0 -127
  1079. package/out/src/utils/split.d.ts.map +0 -1
  1080. package/out/src/utils/split.js +0 -204
  1081. package/out/src/utils/split.js.map +0 -1
  1082. package/out/src/utils/tokenize.d.ts +0 -56
  1083. package/out/src/utils/tokenize.d.ts.map +0 -1
  1084. package/out/src/utils/tokenize.js +0 -48
  1085. package/out/src/utils/tokenize.js.map +0 -1
  1086. package/out/src/utils/wof-json.d.ts +0 -109
  1087. package/out/src/utils/wof-json.d.ts.map +0 -1
  1088. package/out/src/utils/wof-json.js +0 -173
  1089. package/out/src/utils/wof-json.js.map +0 -1
  1090. package/src/adapters/ban/adapter.ts +0 -191
  1091. package/src/adapters/ban/street-decompose.ts +0 -96
  1092. package/src/adapters/fcc-bdc/adapter.ts +0 -174
  1093. package/src/adapters/geonames/adapter.ts +0 -200
  1094. package/src/adapters/geonames-postal/adapter.ts +0 -119
  1095. package/src/adapters/gnaf/adapter.ts +0 -149
  1096. package/src/adapters/gnaf/assemble.ts +0 -226
  1097. package/src/adapters/index.ts +0 -149
  1098. package/src/adapters/openaddresses/adapter.ts +0 -251
  1099. package/src/adapters/overture/adapter.ts +0 -162
  1100. package/src/adapters/state-hi-schools/adapter.ts +0 -164
  1101. package/src/adapters/synth-po-box/adapter.ts +0 -204
  1102. package/src/adapters/tiger/adapter.ts +0 -253
  1103. package/src/adapters/tiger/street-decompose.ts +0 -111
  1104. package/src/adapters/usgov-hrsa-fqhc/adapter.ts +0 -183
  1105. package/src/adapters/usgov-imls-pls/adapter.ts +0 -143
  1106. package/src/adapters/usgov-irs-bmf/adapter.ts +0 -163
  1107. package/src/adapters/usgov-nad/adapter.ts +0 -348
  1108. package/src/adapters/usgov-nppes/adapter.ts +0 -159
  1109. package/src/adapters/usgov-samhsa-treatment-locator/adapter.ts +0 -204
  1110. package/src/adapters/utils/index.ts +0 -233
  1111. package/src/adapters/wof-admin-jp/adapter.ts +0 -216
  1112. package/src/adapters/wof-admin-json/adapter.ts +0 -256
  1113. package/src/adapters/wof-json-rows.ts +0 -79
  1114. package/src/adapters/wof-postalcode-json/adapter.ts +0 -183
  1115. package/src/build.ts +0 -386
  1116. package/src/index.ts +0 -14
  1117. package/src/name-prone-us-suffixes.ts +0 -12
  1118. package/src/parquet-wrapper/index.ts +0 -9
  1119. package/src/parquet-wrapper/reader.ts +0 -97
  1120. package/src/parquet-wrapper/schema.ts +0 -88
  1121. package/src/parquet-wrapper/writer.ts +0 -110
  1122. package/src/runner.ts +0 -317
  1123. package/src/shard-recipes/anchor-absorption.ts +0 -103
  1124. package/src/shard-recipes/bare-country.ts +0 -95
  1125. package/src/shard-recipes/boundary-stress.ts +0 -101
  1126. package/src/shard-recipes/country-balanced.ts +0 -524
  1127. package/src/shard-recipes/cz-pcfirst-preposition.ts +0 -111
  1128. package/src/shard-recipes/fr-admin-split.ts +0 -239
  1129. package/src/shard-recipes/fr-bare-street.ts +0 -170
  1130. package/src/shard-recipes/fr-fragment.ts +0 -332
  1131. package/src/shard-recipes/fr-lieudit.ts +0 -302
  1132. package/src/shard-recipes/fr-order.ts +0 -258
  1133. package/src/shard-recipes/german.ts +0 -170
  1134. package/src/shard-recipes/house-venue.ts +0 -88
  1135. package/src/shard-recipes/index.ts +0 -95
  1136. package/src/shard-recipes/intersection.ts +0 -630
  1137. package/src/shard-recipes/locale.ts +0 -599
  1138. package/src/shard-recipes/nl-postcode.ts +0 -115
  1139. package/src/shard-recipes/no-fragment.ts +0 -219
  1140. package/src/shard-recipes/no-street-led.ts +0 -143
  1141. package/src/shard-recipes/no-street.ts +0 -86
  1142. package/src/shard-recipes/po-box-cedex.ts +0 -920
  1143. package/src/shard-recipes/po-box.ts +0 -119
  1144. package/src/shard-recipes/reviewed-postcode-tail.ts +0 -189
  1145. package/src/shard-recipes/scaffold.ts +0 -360
  1146. package/src/shard-recipes/si-bare-village.ts +0 -97
  1147. package/src/shard-recipes/street-affix.ts +0 -826
  1148. package/src/shard-recipes/street-bare.ts +0 -101
  1149. package/src/shard-recipes/street.ts +0 -82
  1150. package/src/shard-recipes/sub-venue-sources.ts +0 -885
  1151. package/src/shard-recipes/sub-venue.ts +0 -984
  1152. package/src/shard-recipes/trailing-region.ts +0 -183
  1153. package/src/shard-recipes/unit.ts +0 -321
  1154. package/src/synthesizers/anchor-absorption.ts +0 -290
  1155. package/src/synthesizers/boundary-stress.ts +0 -531
  1156. package/src/synthesizers/german.ts +0 -251
  1157. package/src/synthesizers/house-venue.ts +0 -330
  1158. package/src/synthesizers/intersection.ts +0 -232
  1159. package/src/synthesizers/no-street.ts +0 -349
  1160. package/src/synthesizers/po-box.ts +0 -339
  1161. package/src/synthesizers/street.ts +0 -274
  1162. package/src/synthesizers/utils.ts +0 -903
  1163. package/src/tools/align-shard.ts +0 -70
  1164. package/src/tools/audit.ts +0 -399
  1165. package/src/tools/corpus-stats.ts +0 -184
  1166. package/src/tools/fetch/ban.ts +0 -290
  1167. package/src/tools/fetch/download.ts +0 -176
  1168. package/src/tools/fetch/geonames-dump.ts +0 -267
  1169. package/src/tools/fetch/geonames-postal.ts +0 -180
  1170. package/src/tools/fetch/hrsa.ts +0 -68
  1171. package/src/tools/fetch/imls-pls.ts +0 -158
  1172. package/src/tools/fetch/index.ts +0 -147
  1173. package/src/tools/fetch/nad.ts +0 -342
  1174. package/src/tools/fetch/nppes.ts +0 -174
  1175. package/src/tools/fetch/openaddresses.ts +0 -404
  1176. package/src/tools/fetch/ourairports.ts +0 -171
  1177. package/src/tools/fetch/ppd.ts +0 -137
  1178. package/src/tools/fetch/state-hi-schools.ts +0 -208
  1179. package/src/tools/fetch/state-sources.ts +0 -155
  1180. package/src/tools/fetch/tiger-full.ts +0 -354
  1181. package/src/tools/fetch/wikidata-subvenue.ts +0 -386
  1182. package/src/tools/golden-expand.ts +0 -584
  1183. package/src/tools/golden-promote.ts +0 -353
  1184. package/src/tools/golden-relabel-street.ts +0 -685
  1185. package/src/tools/index.ts +0 -28
  1186. package/src/tools/ingest-csv.ts +0 -422
  1187. package/src/tools/jsonl-to-parquet.ts +0 -221
  1188. package/src/tools/lint-shard-vocab.ts +0 -409
  1189. package/src/tools/lint-shard.ts +0 -543
  1190. package/src/tools/overlay-manifest.ts +0 -157
  1191. package/src/tools/overture-subvenue.ts +0 -215
  1192. package/src/tools/postcode-triples.ts +0 -375
  1193. package/src/tools/shard-kryptonite.ts +0 -139
  1194. package/src/tools/shard-translit.ts +0 -245
  1195. package/src/tools/sub-venue/harvest.ts +0 -235
  1196. package/src/tools/sub-venue/head-nouns.ts +0 -242
  1197. package/src/tools/sub-venue/surfaces.ts +0 -95
  1198. package/src/tools/sub-venue/table.ts +0 -281
  1199. package/src/tools/sub-venue/wikidata.ts +0 -85
  1200. package/src/tools/sub-venue-lexicon.ts +0 -431
  1201. package/src/tools/sub-venue-promotions.ts +0 -330
  1202. package/src/types.ts +0 -247
  1203. package/src/utils/align.ts +0 -331
  1204. package/src/utils/golden.ts +0 -176
  1205. package/src/utils/index.ts +0 -14
  1206. package/src/utils/parquet.ts +0 -391
  1207. package/src/utils/split.ts +0 -279
  1208. package/src/utils/tokenize.ts +0 -78
  1209. package/src/utils/wof-json.ts +0 -244
  1210. /package/{src → lib}/adapters/state-ia-contractors/adapter.ts +0 -0
  1211. /package/{src → lib}/adapters/state-ny-notaries/adapter.ts +0 -0
  1212. /package/{src → lib}/adapters/state-tx-notaries/adapter.ts +0 -0
  1213. /package/{src → lib}/codex/us-fips-state.ts +0 -0
  1214. /package/{src → lib}/tools/gb-title-case.ts +0 -0
  1215. /package/{src → lib}/utils/license.ts +0 -0
  1216. /package/out/{src/adapters → adapters}/ban/adapter.d.ts +0 -0
  1217. /package/out/{src/adapters → adapters}/ban/street-decompose.d.ts +0 -0
  1218. /package/out/{src/adapters → adapters}/fcc-bdc/adapter.d.ts +0 -0
  1219. /package/out/{src/adapters → adapters}/geonames/adapter.d.ts +0 -0
  1220. /package/out/{src/adapters → adapters}/openaddresses/adapter.d.ts +0 -0
  1221. /package/out/{src/adapters → adapters}/state-ia-contractors/adapter.d.ts +0 -0
  1222. /package/out/{src/adapters → adapters}/state-ia-contractors/adapter.js +0 -0
  1223. /package/out/{src/adapters → adapters}/state-ny-notaries/adapter.d.ts +0 -0
  1224. /package/out/{src/adapters → adapters}/state-ny-notaries/adapter.js +0 -0
  1225. /package/out/{src/adapters → adapters}/state-tx-notaries/adapter.d.ts +0 -0
  1226. /package/out/{src/adapters → adapters}/state-tx-notaries/adapter.js +0 -0
  1227. /package/out/{src/adapters → adapters}/synth-po-box/adapter.d.ts +0 -0
  1228. /package/out/{src/adapters → adapters}/tiger/street-decompose.d.ts +0 -0
  1229. /package/out/{src/adapters → adapters}/usgov-nppes/adapter.d.ts +0 -0
  1230. /package/out/{src/adapters → adapters}/usgov-samhsa-treatment-locator/adapter.d.ts +0 -0
  1231. /package/out/{src/adapters → adapters}/wof-admin-jp/adapter.d.ts +0 -0
  1232. /package/out/{src/codex → codex}/us-fips-state.d.ts +0 -0
  1233. /package/out/{src/codex → codex}/us-fips-state.js +0 -0
  1234. /package/out/{src/tools → tools}/fetch/ppd.d.ts +0 -0
  1235. /package/out/{src/tools → tools}/gb-title-case.d.ts +0 -0
  1236. /package/out/{src/tools → tools}/gb-title-case.js +0 -0
  1237. /package/out/{src/tools → tools}/golden-promote.d.ts +0 -0
  1238. /package/out/{src/tools → tools}/ingest-csv.d.ts +0 -0
  1239. /package/out/{src/types.js → types.js} +0 -0
  1240. /package/out/{src/utils → utils}/license.d.ts +0 -0
  1241. /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
+ }