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