@mailwoman/corpus 8.6.0 → 9.1.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 (497) hide show
  1. package/README.md +2 -2
  2. package/data/PROVENANCE.md +214 -0
  3. package/data/sub-venue-lexicon.json +18269 -0
  4. package/out/src/adapters/ban/adapter.d.ts +5 -4
  5. package/out/src/adapters/ban/adapter.d.ts.map +1 -1
  6. package/out/src/adapters/ban/adapter.js +62 -69
  7. package/out/src/adapters/ban/adapter.js.map +1 -1
  8. package/out/src/adapters/ban/street-decompose.d.ts.map +1 -1
  9. package/out/src/adapters/ban/street-decompose.js +18 -25
  10. package/out/src/adapters/ban/street-decompose.js.map +1 -1
  11. package/out/src/adapters/fcc-bdc/adapter.d.ts +1 -7
  12. package/out/src/adapters/fcc-bdc/adapter.d.ts.map +1 -1
  13. package/out/src/adapters/fcc-bdc/adapter.js +4 -26
  14. package/out/src/adapters/fcc-bdc/adapter.js.map +1 -1
  15. package/out/src/adapters/geonames/adapter.d.ts +1 -1
  16. package/out/src/adapters/geonames/adapter.d.ts.map +1 -1
  17. package/out/src/adapters/geonames/adapter.js +72 -78
  18. package/out/src/adapters/geonames/adapter.js.map +1 -1
  19. package/out/src/adapters/geonames-postal/adapter.d.ts +1 -1
  20. package/out/src/adapters/geonames-postal/adapter.d.ts.map +1 -1
  21. package/out/src/adapters/geonames-postal/adapter.js +46 -51
  22. package/out/src/adapters/geonames-postal/adapter.js.map +1 -1
  23. package/out/src/adapters/gnaf/adapter.d.ts +1 -1
  24. package/out/src/adapters/gnaf/adapter.d.ts.map +1 -1
  25. package/out/src/adapters/gnaf/adapter.js +6 -9
  26. package/out/src/adapters/gnaf/adapter.js.map +1 -1
  27. package/out/src/adapters/gnaf/assemble.d.ts.map +1 -1
  28. package/out/src/adapters/gnaf/assemble.js +7 -12
  29. package/out/src/adapters/gnaf/assemble.js.map +1 -1
  30. package/out/src/adapters/index.d.ts +1 -1
  31. package/out/src/adapters/index.d.ts.map +1 -1
  32. package/out/src/adapters/index.js +1 -1
  33. package/out/src/adapters/index.js.map +1 -1
  34. package/out/src/adapters/openaddresses/adapter.d.ts +1 -1
  35. package/out/src/adapters/openaddresses/adapter.d.ts.map +1 -1
  36. package/out/src/adapters/openaddresses/adapter.js +5 -10
  37. package/out/src/adapters/openaddresses/adapter.js.map +1 -1
  38. package/out/src/adapters/overture/adapter.d.ts +1 -1
  39. package/out/src/adapters/overture/adapter.d.ts.map +1 -1
  40. package/out/src/adapters/overture/adapter.js +5 -9
  41. package/out/src/adapters/overture/adapter.js.map +1 -1
  42. package/out/src/adapters/state-hi-schools/adapter.d.ts +1 -1
  43. package/out/src/adapters/state-hi-schools/adapter.d.ts.map +1 -1
  44. package/out/src/adapters/state-hi-schools/adapter.js +57 -75
  45. package/out/src/adapters/state-hi-schools/adapter.js.map +1 -1
  46. package/out/src/adapters/state-ia-contractors/adapter.d.ts +1 -1
  47. package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +1 -1
  48. package/out/src/adapters/state-ia-contractors/adapter.js +60 -78
  49. package/out/src/adapters/state-ia-contractors/adapter.js.map +1 -1
  50. package/out/src/adapters/state-ny-notaries/adapter.d.ts +1 -1
  51. package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +1 -1
  52. package/out/src/adapters/state-ny-notaries/adapter.js +69 -87
  53. package/out/src/adapters/state-ny-notaries/adapter.js.map +1 -1
  54. package/out/src/adapters/state-tx-notaries/adapter.d.ts +1 -1
  55. package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +1 -1
  56. package/out/src/adapters/state-tx-notaries/adapter.js +71 -89
  57. package/out/src/adapters/state-tx-notaries/adapter.js.map +1 -1
  58. package/out/src/adapters/synth-po-box/adapter.d.ts +3 -3
  59. package/out/src/adapters/synth-po-box/adapter.d.ts.map +1 -1
  60. package/out/src/adapters/synth-po-box/adapter.js +10 -18
  61. package/out/src/adapters/synth-po-box/adapter.js.map +1 -1
  62. package/out/src/adapters/tiger/adapter.d.ts +1 -1
  63. package/out/src/adapters/tiger/adapter.d.ts.map +1 -1
  64. package/out/src/adapters/tiger/adapter.js +2 -2
  65. package/out/src/adapters/tiger/adapter.js.map +1 -1
  66. package/out/src/adapters/tiger/street-decompose.d.ts.map +1 -1
  67. package/out/src/adapters/tiger/street-decompose.js +18 -27
  68. package/out/src/adapters/tiger/street-decompose.js.map +1 -1
  69. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +4 -4
  70. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -1
  71. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +64 -82
  72. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -1
  73. package/out/src/adapters/usgov-imls-pls/adapter.d.ts +1 -1
  74. package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +1 -1
  75. package/out/src/adapters/usgov-imls-pls/adapter.js +62 -84
  76. package/out/src/adapters/usgov-imls-pls/adapter.js.map +1 -1
  77. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts +1 -1
  78. package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -1
  79. package/out/src/adapters/usgov-irs-bmf/adapter.js +59 -66
  80. package/out/src/adapters/usgov-irs-bmf/adapter.js.map +1 -1
  81. package/out/src/adapters/usgov-nad/adapter.d.ts +1 -1
  82. package/out/src/adapters/usgov-nad/adapter.d.ts.map +1 -1
  83. package/out/src/adapters/usgov-nad/adapter.js +6 -9
  84. package/out/src/adapters/usgov-nad/adapter.js.map +1 -1
  85. package/out/src/adapters/usgov-nppes/adapter.d.ts +1 -1
  86. package/out/src/adapters/usgov-nppes/adapter.d.ts.map +1 -1
  87. package/out/src/adapters/usgov-nppes/adapter.js +60 -78
  88. package/out/src/adapters/usgov-nppes/adapter.js.map +1 -1
  89. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts +1 -1
  90. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -1
  91. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +53 -73
  92. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -1
  93. package/out/src/{adapter.d.ts → adapters/utils/index.d.ts} +43 -2
  94. package/out/src/adapters/utils/index.d.ts.map +1 -0
  95. package/out/src/{adapter.js → adapters/utils/index.js} +47 -2
  96. package/out/src/adapters/utils/index.js.map +1 -0
  97. package/out/src/adapters/wof-admin-jp/adapter.d.ts +1 -1
  98. package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +1 -1
  99. package/out/src/adapters/wof-admin-jp/adapter.js +24 -6
  100. package/out/src/adapters/wof-admin-jp/adapter.js.map +1 -1
  101. package/out/src/adapters/wof-admin-json/adapter.d.ts +2 -2
  102. package/out/src/adapters/wof-admin-json/adapter.d.ts.map +1 -1
  103. package/out/src/adapters/wof-admin-json/adapter.js +2 -2
  104. package/out/src/adapters/wof-admin-json/adapter.js.map +1 -1
  105. package/out/src/adapters/wof-postalcode-json/adapter.d.ts +2 -2
  106. package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +1 -1
  107. package/out/src/adapters/wof-postalcode-json/adapter.js +2 -2
  108. package/out/src/adapters/wof-postalcode-json/adapter.js.map +1 -1
  109. package/out/src/build.d.ts +3 -4
  110. package/out/src/build.d.ts.map +1 -1
  111. package/out/src/build.js +6 -8
  112. package/out/src/build.js.map +1 -1
  113. package/out/src/index.d.ts +3 -17
  114. package/out/src/index.d.ts.map +1 -1
  115. package/out/src/index.js +3 -17
  116. package/out/src/index.js.map +1 -1
  117. package/out/src/name-prone-us-suffixes.d.ts +12 -0
  118. package/out/src/name-prone-us-suffixes.d.ts.map +1 -0
  119. package/out/src/name-prone-us-suffixes.js +12 -0
  120. package/out/src/name-prone-us-suffixes.js.map +1 -0
  121. package/out/src/parquet-wrapper/reader.d.ts +8 -0
  122. package/out/src/parquet-wrapper/reader.d.ts.map +1 -1
  123. package/out/src/parquet-wrapper/reader.js +16 -0
  124. package/out/src/parquet-wrapper/reader.js.map +1 -1
  125. package/out/src/parquet-wrapper/schema.d.ts +4 -0
  126. package/out/src/parquet-wrapper/schema.d.ts.map +1 -1
  127. package/out/src/parquet-wrapper/schema.js.map +1 -1
  128. package/out/src/runner.d.ts +2 -2
  129. package/out/src/runner.d.ts.map +1 -1
  130. package/out/src/runner.js +1 -1
  131. package/out/src/runner.js.map +1 -1
  132. package/out/src/shard-recipes/anchor-absorption.d.ts.map +1 -1
  133. package/out/src/shard-recipes/anchor-absorption.js +5 -4
  134. package/out/src/shard-recipes/anchor-absorption.js.map +1 -1
  135. package/out/src/shard-recipes/boundary-stress.d.ts.map +1 -1
  136. package/out/src/shard-recipes/boundary-stress.js +2 -2
  137. package/out/src/shard-recipes/boundary-stress.js.map +1 -1
  138. package/out/src/shard-recipes/country-balanced.d.ts.map +1 -1
  139. package/out/src/shard-recipes/country-balanced.js +75 -75
  140. package/out/src/shard-recipes/country-balanced.js.map +1 -1
  141. package/out/src/shard-recipes/fr-admin-split.js +2 -2
  142. package/out/src/shard-recipes/fr-admin-split.js.map +1 -1
  143. package/out/src/shard-recipes/fr-fragment.d.ts.map +1 -1
  144. package/out/src/shard-recipes/fr-fragment.js +8 -5
  145. package/out/src/shard-recipes/fr-fragment.js.map +1 -1
  146. package/out/src/shard-recipes/fr-lieudit.js +2 -2
  147. package/out/src/shard-recipes/fr-lieudit.js.map +1 -1
  148. package/out/src/shard-recipes/fr-order.d.ts.map +1 -1
  149. package/out/src/shard-recipes/fr-order.js +18 -72
  150. package/out/src/shard-recipes/fr-order.js.map +1 -1
  151. package/out/src/shard-recipes/german.d.ts.map +1 -1
  152. package/out/src/shard-recipes/german.js +17 -70
  153. package/out/src/shard-recipes/german.js.map +1 -1
  154. package/out/src/shard-recipes/house-venue.d.ts.map +1 -1
  155. package/out/src/shard-recipes/house-venue.js +1 -1
  156. package/out/src/shard-recipes/house-venue.js.map +1 -1
  157. package/out/src/shard-recipes/index.d.ts.map +1 -1
  158. package/out/src/shard-recipes/index.js +4 -1
  159. package/out/src/shard-recipes/index.js.map +1 -1
  160. package/out/src/shard-recipes/intersection.d.ts +2 -2
  161. package/out/src/shard-recipes/intersection.d.ts.map +1 -1
  162. package/out/src/shard-recipes/intersection.js +28 -72
  163. package/out/src/shard-recipes/intersection.js.map +1 -1
  164. package/out/src/shard-recipes/locale.d.ts +5 -5
  165. package/out/src/shard-recipes/locale.d.ts.map +1 -1
  166. package/out/src/shard-recipes/locale.js +25 -35
  167. package/out/src/shard-recipes/locale.js.map +1 -1
  168. package/out/src/shard-recipes/no-fragment.d.ts.map +1 -1
  169. package/out/src/shard-recipes/no-fragment.js +8 -5
  170. package/out/src/shard-recipes/no-fragment.js.map +1 -1
  171. package/out/src/shard-recipes/no-street-led.d.ts.map +1 -1
  172. package/out/src/shard-recipes/no-street-led.js +8 -5
  173. package/out/src/shard-recipes/no-street-led.js.map +1 -1
  174. package/out/src/shard-recipes/no-street.d.ts.map +1 -1
  175. package/out/src/shard-recipes/no-street.js +1 -1
  176. package/out/src/shard-recipes/no-street.js.map +1 -1
  177. package/out/src/shard-recipes/po-box-cedex.d.ts +3 -3
  178. package/out/src/shard-recipes/po-box-cedex.d.ts.map +1 -1
  179. package/out/src/shard-recipes/po-box-cedex.js +101 -127
  180. package/out/src/shard-recipes/po-box-cedex.js.map +1 -1
  181. package/out/src/shard-recipes/po-box.d.ts.map +1 -1
  182. package/out/src/shard-recipes/po-box.js +1 -1
  183. package/out/src/shard-recipes/po-box.js.map +1 -1
  184. package/out/src/shard-recipes/scaffold.d.ts +58 -9
  185. package/out/src/shard-recipes/scaffold.d.ts.map +1 -1
  186. package/out/src/shard-recipes/scaffold.js +87 -29
  187. package/out/src/shard-recipes/scaffold.js.map +1 -1
  188. package/out/src/shard-recipes/street-affix.d.ts +54 -0
  189. package/out/src/shard-recipes/street-affix.d.ts.map +1 -1
  190. package/out/src/shard-recipes/street-affix.js +253 -111
  191. package/out/src/shard-recipes/street-affix.js.map +1 -1
  192. package/out/src/shard-recipes/street-bare.d.ts.map +1 -1
  193. package/out/src/shard-recipes/street-bare.js +3 -3
  194. package/out/src/shard-recipes/street-bare.js.map +1 -1
  195. package/out/src/shard-recipes/street.d.ts.map +1 -1
  196. package/out/src/shard-recipes/street.js +2 -2
  197. package/out/src/shard-recipes/street.js.map +1 -1
  198. package/out/src/shard-recipes/sub-venue-sources.d.ts +228 -0
  199. package/out/src/shard-recipes/sub-venue-sources.d.ts.map +1 -0
  200. package/out/src/shard-recipes/sub-venue-sources.js +664 -0
  201. package/out/src/shard-recipes/sub-venue-sources.js.map +1 -0
  202. package/out/src/shard-recipes/sub-venue.d.ts +269 -0
  203. package/out/src/shard-recipes/sub-venue.d.ts.map +1 -0
  204. package/out/src/shard-recipes/sub-venue.js +709 -0
  205. package/out/src/shard-recipes/sub-venue.js.map +1 -0
  206. package/out/src/shard-recipes/unit.d.ts +1 -1
  207. package/out/src/shard-recipes/unit.d.ts.map +1 -1
  208. package/out/src/shard-recipes/unit.js +26 -74
  209. package/out/src/shard-recipes/unit.js.map +1 -1
  210. package/out/src/{synthesize-anchor-absorption.d.ts → synthesizers/anchor-absorption.d.ts} +1 -1
  211. package/out/src/synthesizers/anchor-absorption.d.ts.map +1 -0
  212. package/out/src/{synthesize-anchor-absorption.js → synthesizers/anchor-absorption.js} +1 -1
  213. package/out/src/synthesizers/anchor-absorption.js.map +1 -0
  214. package/out/src/{synthesize-boundary-stress.d.ts → synthesizers/boundary-stress.d.ts} +3 -3
  215. package/out/src/synthesizers/boundary-stress.d.ts.map +1 -0
  216. package/out/src/{synthesize-boundary-stress.js → synthesizers/boundary-stress.js} +2 -2
  217. package/out/src/synthesizers/boundary-stress.js.map +1 -0
  218. package/out/src/{synthesize-german.d.ts → synthesizers/german.d.ts} +2 -2
  219. package/out/src/synthesizers/german.d.ts.map +1 -0
  220. package/out/src/{synthesize-german.js → synthesizers/german.js} +2 -2
  221. package/out/src/synthesizers/german.js.map +1 -0
  222. package/out/src/{synthesize-house-venue.d.ts → synthesizers/house-venue.d.ts} +4 -4
  223. package/out/src/synthesizers/house-venue.d.ts.map +1 -0
  224. package/out/src/{synthesize-house-venue.js → synthesizers/house-venue.js} +4 -4
  225. package/out/src/synthesizers/house-venue.js.map +1 -0
  226. package/out/src/{synthesize-intersection.d.ts → synthesizers/intersection.d.ts} +2 -2
  227. package/out/src/synthesizers/intersection.d.ts.map +1 -0
  228. package/out/src/{synthesize-intersection.js → synthesizers/intersection.js} +1 -1
  229. package/out/src/synthesizers/intersection.js.map +1 -0
  230. package/out/src/{synthesize-no-street.d.ts → synthesizers/no-street.d.ts} +3 -3
  231. package/out/src/synthesizers/no-street.d.ts.map +1 -0
  232. package/out/src/{synthesize-no-street.js → synthesizers/no-street.js} +2 -2
  233. package/out/src/synthesizers/no-street.js.map +1 -0
  234. package/out/src/{synthesize-po-box.d.ts → synthesizers/po-box.d.ts} +2 -2
  235. package/out/src/synthesizers/po-box.d.ts.map +1 -0
  236. package/out/src/{synthesize-po-box.js → synthesizers/po-box.js} +1 -1
  237. package/out/src/synthesizers/po-box.js.map +1 -0
  238. package/out/src/{synthesize-street.d.ts → synthesizers/street.d.ts} +2 -2
  239. package/out/src/synthesizers/street.d.ts.map +1 -0
  240. package/out/src/{synthesize-street.js → synthesizers/street.js} +2 -2
  241. package/out/src/synthesizers/street.js.map +1 -0
  242. package/out/src/{synthesize.d.ts → synthesizers/utils.d.ts} +3 -3
  243. package/out/src/synthesizers/utils.d.ts.map +1 -0
  244. package/out/src/{synthesize.js → synthesizers/utils.js} +4 -15
  245. package/out/src/synthesizers/utils.js.map +1 -0
  246. package/out/src/tools/align-shard.d.ts.map +1 -1
  247. package/out/src/tools/align-shard.js +4 -8
  248. package/out/src/tools/align-shard.js.map +1 -1
  249. package/out/src/tools/audit.d.ts.map +1 -1
  250. package/out/src/tools/audit.js +4 -4
  251. package/out/src/tools/audit.js.map +1 -1
  252. package/out/src/tools/corpus-stats.d.ts +2 -2
  253. package/out/src/tools/corpus-stats.d.ts.map +1 -1
  254. package/out/src/tools/corpus-stats.js +18 -31
  255. package/out/src/tools/corpus-stats.js.map +1 -1
  256. package/out/src/tools/fetch/download.d.ts.map +1 -1
  257. package/out/src/tools/fetch/download.js +5 -6
  258. package/out/src/tools/fetch/download.js.map +1 -1
  259. package/out/src/tools/fetch/imls-pls.d.ts.map +1 -1
  260. package/out/src/tools/fetch/imls-pls.js +3 -15
  261. package/out/src/tools/fetch/imls-pls.js.map +1 -1
  262. package/out/src/tools/fetch/index.d.ts +14 -1
  263. package/out/src/tools/fetch/index.d.ts.map +1 -1
  264. package/out/src/tools/fetch/index.js +14 -1
  265. package/out/src/tools/fetch/index.js.map +1 -1
  266. package/out/src/tools/fetch/nad.d.ts +1 -1
  267. package/out/src/tools/fetch/nad.js +1 -1
  268. package/out/src/tools/fetch/nppes.d.ts.map +1 -1
  269. package/out/src/tools/fetch/nppes.js +8 -14
  270. package/out/src/tools/fetch/nppes.js.map +1 -1
  271. package/out/src/tools/fetch/openaddresses.d.ts +1 -1
  272. package/out/src/tools/fetch/openaddresses.js +1 -1
  273. package/out/src/tools/fetch/ourairports.d.ts +45 -0
  274. package/out/src/tools/fetch/ourairports.d.ts.map +1 -0
  275. package/out/src/tools/fetch/ourairports.js +123 -0
  276. package/out/src/tools/fetch/ourairports.js.map +1 -0
  277. package/out/src/tools/fetch/wikidata-subvenue.d.ts +171 -0
  278. package/out/src/tools/fetch/wikidata-subvenue.d.ts.map +1 -0
  279. package/out/src/tools/fetch/wikidata-subvenue.js +275 -0
  280. package/out/src/tools/fetch/wikidata-subvenue.js.map +1 -0
  281. package/out/src/tools/golden-expand.d.ts.map +1 -1
  282. package/out/src/tools/golden-expand.js +18 -16
  283. package/out/src/tools/golden-expand.js.map +1 -1
  284. package/out/src/tools/golden-promote.d.ts.map +1 -1
  285. package/out/src/tools/golden-promote.js +12 -6
  286. package/out/src/tools/golden-promote.js.map +1 -1
  287. package/out/src/tools/golden-relabel-street.d.ts +196 -0
  288. package/out/src/tools/golden-relabel-street.d.ts.map +1 -0
  289. package/out/src/tools/golden-relabel-street.js +440 -0
  290. package/out/src/tools/golden-relabel-street.js.map +1 -0
  291. package/out/src/tools/index.d.ts +4 -0
  292. package/out/src/tools/index.d.ts.map +1 -1
  293. package/out/src/tools/index.js +4 -0
  294. package/out/src/tools/index.js.map +1 -1
  295. package/out/src/tools/jsonl-to-parquet.d.ts.map +1 -1
  296. package/out/src/tools/jsonl-to-parquet.js +3 -2
  297. package/out/src/tools/jsonl-to-parquet.js.map +1 -1
  298. package/out/src/tools/lint-shard-vocab.d.ts.map +1 -1
  299. package/out/src/tools/lint-shard-vocab.js +3 -2
  300. package/out/src/tools/lint-shard-vocab.js.map +1 -1
  301. package/out/src/tools/lint-shard.d.ts +3 -3
  302. package/out/src/tools/lint-shard.d.ts.map +1 -1
  303. package/out/src/tools/lint-shard.js +23 -32
  304. package/out/src/tools/lint-shard.js.map +1 -1
  305. package/out/src/tools/overlay-manifest.d.ts.map +1 -1
  306. package/out/src/tools/overlay-manifest.js +2 -1
  307. package/out/src/tools/overlay-manifest.js.map +1 -1
  308. package/out/src/tools/overture-subvenue.d.ts +112 -0
  309. package/out/src/tools/overture-subvenue.d.ts.map +1 -0
  310. package/out/src/tools/overture-subvenue.js +144 -0
  311. package/out/src/tools/overture-subvenue.js.map +1 -0
  312. package/out/src/tools/shard-kryptonite.d.ts +1 -1
  313. package/out/src/tools/shard-kryptonite.d.ts.map +1 -1
  314. package/out/src/tools/shard-kryptonite.js +6 -6
  315. package/out/src/tools/shard-kryptonite.js.map +1 -1
  316. package/out/src/tools/shard-translit.d.ts +6 -3
  317. package/out/src/tools/shard-translit.d.ts.map +1 -1
  318. package/out/src/tools/shard-translit.js +9 -8
  319. package/out/src/tools/shard-translit.js.map +1 -1
  320. package/out/src/tools/sub-venue-lexicon.d.ts +507 -0
  321. package/out/src/tools/sub-venue-lexicon.d.ts.map +1 -0
  322. package/out/src/tools/sub-venue-lexicon.js +817 -0
  323. package/out/src/tools/sub-venue-lexicon.js.map +1 -0
  324. package/out/src/tools/sub-venue-promotions.d.ts +94 -0
  325. package/out/src/tools/sub-venue-promotions.d.ts.map +1 -0
  326. package/out/src/tools/sub-venue-promotions.js +266 -0
  327. package/out/src/tools/sub-venue-promotions.js.map +1 -0
  328. package/out/src/{align.d.ts → utils/align.d.ts} +1 -1
  329. package/out/src/utils/align.d.ts.map +1 -0
  330. package/out/src/utils/align.js.map +1 -0
  331. package/out/src/{golden.d.ts → utils/golden.d.ts} +5 -0
  332. package/out/src/utils/golden.d.ts.map +1 -0
  333. package/out/src/{golden.js → utils/golden.js} +24 -10
  334. package/out/src/utils/golden.js.map +1 -0
  335. package/out/src/utils/index.d.ts +14 -0
  336. package/out/src/utils/index.d.ts.map +1 -0
  337. package/out/src/utils/index.js +14 -0
  338. package/out/src/utils/index.js.map +1 -0
  339. package/out/src/utils/license.d.ts.map +1 -0
  340. package/out/src/utils/license.js.map +1 -0
  341. package/out/src/{parquet.d.ts → utils/parquet.d.ts} +2 -2
  342. package/out/src/utils/parquet.d.ts.map +1 -0
  343. package/out/src/{parquet.js → utils/parquet.js} +3 -15
  344. package/out/src/utils/parquet.js.map +1 -0
  345. package/out/src/{split.d.ts → utils/split.d.ts} +8 -1
  346. package/out/src/utils/split.d.ts.map +1 -0
  347. package/out/src/{split.js → utils/split.js} +7 -0
  348. package/out/src/utils/split.js.map +1 -0
  349. package/out/src/utils/tokenize.d.ts.map +1 -0
  350. package/out/src/utils/tokenize.js.map +1 -0
  351. package/out/src/{wof-json.d.ts → utils/wof-json.d.ts} +2 -2
  352. package/out/src/utils/wof-json.d.ts.map +1 -0
  353. package/out/src/{wof-json.js → utils/wof-json.js} +5 -8
  354. package/out/src/utils/wof-json.js.map +1 -0
  355. package/package.json +66 -20
  356. package/src/adapters/ban/adapter.ts +58 -68
  357. package/src/adapters/ban/street-decompose.ts +17 -25
  358. package/src/adapters/fcc-bdc/adapter.ts +5 -36
  359. package/src/adapters/geonames/adapter.ts +67 -76
  360. package/src/adapters/geonames-postal/adapter.ts +45 -54
  361. package/src/adapters/gnaf/adapter.ts +7 -11
  362. package/src/adapters/gnaf/assemble.ts +7 -11
  363. package/src/adapters/index.ts +3 -2
  364. package/src/adapters/openaddresses/adapter.ts +6 -12
  365. package/src/adapters/overture/adapter.ts +6 -10
  366. package/src/adapters/state-hi-schools/adapter.ts +53 -77
  367. package/src/adapters/state-ia-contractors/adapter.ts +55 -80
  368. package/src/adapters/state-ny-notaries/adapter.ts +64 -89
  369. package/src/adapters/state-tx-notaries/adapter.ts +63 -88
  370. package/src/adapters/synth-po-box/adapter.ts +12 -23
  371. package/src/adapters/tiger/adapter.ts +4 -3
  372. package/src/adapters/tiger/street-decompose.ts +21 -31
  373. package/src/adapters/usgov-hrsa-fqhc/adapter.ts +64 -88
  374. package/src/adapters/usgov-imls-pls/adapter.ts +57 -86
  375. package/src/adapters/usgov-irs-bmf/adapter.ts +55 -66
  376. package/src/adapters/usgov-nad/adapter.ts +7 -11
  377. package/src/adapters/usgov-nppes/adapter.ts +54 -79
  378. package/src/adapters/usgov-samhsa-treatment-locator/adapter.ts +48 -75
  379. package/src/{adapter.ts → adapters/utils/index.ts} +59 -3
  380. package/src/adapters/wof-admin-jp/adapter.ts +35 -9
  381. package/src/adapters/wof-admin-json/adapter.ts +3 -4
  382. package/src/adapters/wof-postalcode-json/adapter.ts +3 -4
  383. package/src/build.ts +12 -11
  384. package/src/index.ts +3 -17
  385. package/src/name-prone-us-suffixes.ts +12 -0
  386. package/src/parquet-wrapper/reader.ts +19 -0
  387. package/src/parquet-wrapper/schema.ts +4 -0
  388. package/src/runner.ts +7 -2
  389. package/src/shard-recipes/anchor-absorption.ts +5 -4
  390. package/src/shard-recipes/boundary-stress.ts +6 -2
  391. package/src/shard-recipes/country-balanced.ts +77 -91
  392. package/src/shard-recipes/fr-admin-split.ts +3 -3
  393. package/src/shard-recipes/fr-fragment.ts +10 -7
  394. package/src/shard-recipes/fr-lieudit.ts +3 -3
  395. package/src/shard-recipes/fr-order.ts +18 -83
  396. package/src/shard-recipes/german.ts +17 -80
  397. package/src/shard-recipes/house-venue.ts +2 -1
  398. package/src/shard-recipes/index.ts +4 -1
  399. package/src/shard-recipes/intersection.ts +37 -74
  400. package/src/shard-recipes/locale.ts +31 -39
  401. package/src/shard-recipes/no-fragment.ts +10 -7
  402. package/src/shard-recipes/no-street-led.ts +10 -7
  403. package/src/shard-recipes/no-street.ts +2 -1
  404. package/src/shard-recipes/po-box-cedex.ts +127 -161
  405. package/src/shard-recipes/po-box.ts +6 -1
  406. package/src/shard-recipes/scaffold.ts +125 -27
  407. package/src/shard-recipes/street-affix.ts +335 -134
  408. package/src/shard-recipes/street-bare.ts +4 -3
  409. package/src/shard-recipes/street.ts +3 -2
  410. package/src/shard-recipes/sub-venue-sources.ts +895 -0
  411. package/src/shard-recipes/sub-venue.ts +982 -0
  412. package/src/shard-recipes/unit.ts +27 -85
  413. package/src/{synthesize-boundary-stress.ts → synthesizers/boundary-stress.ts} +2 -2
  414. package/src/{synthesize-german.ts → synthesizers/german.ts} +2 -2
  415. package/src/{synthesize-house-venue.ts → synthesizers/house-venue.ts} +4 -4
  416. package/src/{synthesize-intersection.ts → synthesizers/intersection.ts} +1 -1
  417. package/src/{synthesize-no-street.ts → synthesizers/no-street.ts} +2 -2
  418. package/src/{synthesize-po-box.ts → synthesizers/po-box.ts} +1 -1
  419. package/src/{synthesize-street.ts → synthesizers/street.ts} +2 -2
  420. package/src/{synthesize.ts → synthesizers/utils.ts} +4 -18
  421. package/src/tools/align-shard.ts +4 -7
  422. package/src/tools/audit.ts +6 -5
  423. package/src/tools/corpus-stats.ts +25 -33
  424. package/src/tools/fetch/download.ts +7 -5
  425. package/src/tools/fetch/imls-pls.ts +4 -18
  426. package/src/tools/fetch/index.ts +14 -1
  427. package/src/tools/fetch/nad.ts +1 -1
  428. package/src/tools/fetch/nppes.ts +9 -16
  429. package/src/tools/fetch/openaddresses.ts +1 -1
  430. package/src/tools/fetch/ourairports.ts +166 -0
  431. package/src/tools/fetch/wikidata-subvenue.ts +386 -0
  432. package/src/tools/golden-expand.ts +18 -13
  433. package/src/tools/golden-promote.ts +15 -6
  434. package/src/tools/golden-relabel-street.ts +685 -0
  435. package/src/tools/index.ts +4 -0
  436. package/src/tools/jsonl-to-parquet.ts +3 -2
  437. package/src/tools/lint-shard-vocab.ts +3 -2
  438. package/src/tools/lint-shard.ts +33 -36
  439. package/src/tools/overlay-manifest.ts +2 -1
  440. package/src/tools/overture-subvenue.ts +215 -0
  441. package/src/tools/shard-kryptonite.ts +8 -9
  442. package/src/tools/shard-translit.ts +22 -11
  443. package/src/tools/sub-venue-lexicon.ts +1250 -0
  444. package/src/tools/sub-venue-promotions.ts +330 -0
  445. package/src/{align.ts → utils/align.ts} +1 -1
  446. package/src/{golden.ts → utils/golden.ts} +25 -11
  447. package/src/utils/index.ts +14 -0
  448. package/src/{parquet.ts → utils/parquet.ts} +5 -19
  449. package/src/{split.ts → utils/split.ts} +8 -2
  450. package/src/{wof-json.ts → utils/wof-json.ts} +5 -8
  451. package/out/src/adapter.d.ts.map +0 -1
  452. package/out/src/adapter.js.map +0 -1
  453. package/out/src/align.d.ts.map +0 -1
  454. package/out/src/align.js.map +0 -1
  455. package/out/src/format.d.ts +0 -14
  456. package/out/src/format.d.ts.map +0 -1
  457. package/out/src/format.js +0 -14
  458. package/out/src/format.js.map +0 -1
  459. package/out/src/golden.d.ts.map +0 -1
  460. package/out/src/golden.js.map +0 -1
  461. package/out/src/license.d.ts.map +0 -1
  462. package/out/src/license.js.map +0 -1
  463. package/out/src/parquet.d.ts.map +0 -1
  464. package/out/src/parquet.js.map +0 -1
  465. package/out/src/split.d.ts.map +0 -1
  466. package/out/src/split.js.map +0 -1
  467. package/out/src/synthesize-anchor-absorption.d.ts.map +0 -1
  468. package/out/src/synthesize-anchor-absorption.js.map +0 -1
  469. package/out/src/synthesize-boundary-stress.d.ts.map +0 -1
  470. package/out/src/synthesize-boundary-stress.js.map +0 -1
  471. package/out/src/synthesize-german.d.ts.map +0 -1
  472. package/out/src/synthesize-german.js.map +0 -1
  473. package/out/src/synthesize-house-venue.d.ts.map +0 -1
  474. package/out/src/synthesize-house-venue.js.map +0 -1
  475. package/out/src/synthesize-intersection.d.ts.map +0 -1
  476. package/out/src/synthesize-intersection.js.map +0 -1
  477. package/out/src/synthesize-no-street.d.ts.map +0 -1
  478. package/out/src/synthesize-no-street.js.map +0 -1
  479. package/out/src/synthesize-po-box.d.ts.map +0 -1
  480. package/out/src/synthesize-po-box.js.map +0 -1
  481. package/out/src/synthesize-street.d.ts.map +0 -1
  482. package/out/src/synthesize-street.js.map +0 -1
  483. package/out/src/synthesize.d.ts.map +0 -1
  484. package/out/src/synthesize.js.map +0 -1
  485. package/out/src/tokenize.d.ts.map +0 -1
  486. package/out/src/tokenize.js.map +0 -1
  487. package/out/src/wof-json.d.ts.map +0 -1
  488. package/out/src/wof-json.js.map +0 -1
  489. package/src/format.ts +0 -14
  490. /package/out/src/{align.js → utils/align.js} +0 -0
  491. /package/out/src/{license.d.ts → utils/license.d.ts} +0 -0
  492. /package/out/src/{license.js → utils/license.js} +0 -0
  493. /package/out/src/{tokenize.d.ts → utils/tokenize.d.ts} +0 -0
  494. /package/out/src/{tokenize.js → utils/tokenize.js} +0 -0
  495. /package/src/{synthesize-anchor-absorption.ts → synthesizers/anchor-absorption.ts} +0 -0
  496. /package/src/{license.ts → utils/license.ts} +0 -0
  497. /package/src/{tokenize.ts → utils/tokenize.ts} +0 -0
@@ -29,14 +29,11 @@
29
29
  * License: stamped `"Public Domain"` per Hawaii state government open-data terms.
30
30
  */
31
31
 
32
- import { createReadStream } from "node:fs"
33
-
34
- import { parse as csvParse } from "csv-parse"
35
-
36
- import { stableSourceID } from "../../adapter.ts"
37
- import { lookupStateAbbreviation } from "../../codex/us-fips-state.ts"
38
- import { reconcileComponents } from "../../format.ts"
39
- import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "../../types.ts"
32
+ import { splitStreetLine, stableSourceID } from "@mailwoman/corpus/adapters/utils"
33
+ import { lookupStateAbbreviation } from "@mailwoman/corpus/codex/us-fips-state"
34
+ import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "@mailwoman/corpus/types"
35
+ import { reconcileComponents } from "@mailwoman/formatter"
36
+ import { CSVSpliterator } from "spliterator"
40
37
 
41
38
  /**
42
39
  * Registry id for this adapter. Stamped into every row it emits, so a corpus record can be traced back to the dataset
@@ -49,7 +46,6 @@ export const STATE_HI_SCHOOLS_ADAPTER_ID = "state-hi-schools"
49
46
  */
50
47
  export const STATE_HI_SCHOOLS_DEFAULT_LICENSE = "Public Domain"
51
48
 
52
- const HOUSE_NUMBER_PREFIX = /^(\d+(?:-\d+)?[A-Za-z]?)\s+(.+)$/
53
49
  const HI_STATE_ABBR = "HI"
54
50
 
55
51
  interface HiSchoolRow {
@@ -60,17 +56,6 @@ interface HiSchoolRow {
60
56
  zip: string
61
57
  }
62
58
 
63
- function splitAddress(address: string): { house_number?: string; street: string } | null {
64
- const trimmed = address.trim()
65
-
66
- if (!trimmed) return null
67
- const m = HOUSE_NUMBER_PREFIX.exec(trimmed)
68
-
69
- if (m) return { house_number: m[1], street: m[2]!.trim() }
70
-
71
- return { street: trimmed }
72
- }
73
-
74
59
  function normalizeZip(raw: string): string {
75
60
  const trimmed = raw.trim()
76
61
 
@@ -95,16 +80,11 @@ export function createStateHiSchoolsAdapter(): CorpusAdapter {
95
80
  throw new Error(`state-hi-schools adapter: only US supported, got country=${opts.country}`)
96
81
  }
97
82
 
98
- const stream = createReadStream(opts.inputPath, { encoding: "utf8" })
99
-
100
- const parser = stream.pipe(
101
- csvParse({
102
- columns: true,
103
- skip_empty_lines: true,
104
- relax_quotes: true,
105
- relax_column_count: true,
106
- })
107
- )
83
+ const rows = CSVSpliterator.fromAsync(opts.inputPath, {
84
+ mode: "object",
85
+ normalizeKeys: false,
86
+ enableQuoteHandling: true,
87
+ })
108
88
 
109
89
  const state = lookupStateAbbreviation(HI_STATE_ABBR)
110
90
 
@@ -114,67 +94,63 @@ export function createStateHiSchoolsAdapter(): CorpusAdapter {
114
94
 
115
95
  let emitted = 0
116
96
 
117
- try {
118
- for await (const record of parser as AsyncIterable<HiSchoolRow>) {
119
- if (opts.signal?.aborted) break
120
-
121
- if (opts.limit !== undefined && emitted >= opts.limit) break
97
+ for await (const record of rows as AsyncIterable<HiSchoolRow>) {
98
+ if (opts.signal?.aborted) break
122
99
 
123
- const name = (record.name ?? "").trim()
124
- const address = (record.address ?? "").trim()
125
- const city = (record.city ?? "").trim()
126
- const zip = normalizeZip(record.zip ?? "")
100
+ if (opts.limit !== undefined && emitted >= opts.limit) break
127
101
 
128
- if (!name || !address || !city || !zip) continue
102
+ const name = (record.name ?? "").trim()
103
+ const address = (record.address ?? "").trim()
104
+ const city = (record.city ?? "").trim()
105
+ const zip = normalizeZip(record.zip ?? "")
129
106
 
130
- const split = splitAddress(address)
107
+ if (!name || !address || !city || !zip) continue
131
108
 
132
- if (!split) continue
109
+ const split = splitStreetLine(address)
133
110
 
134
- const components: CanonicalRow["components"] = {
135
- venue: name,
136
- ...(split.house_number ? { house_number: split.house_number } : {}),
137
- street: split.street,
138
- locality: city,
139
- region: state.abbreviation,
140
- postcode: zip,
141
- }
111
+ if (!split) continue
142
112
 
143
- const streetPart = [split.house_number, split.street].filter(Boolean).join(" ").trim()
113
+ const components: CanonicalRow["components"] = {
114
+ venue: name,
115
+ ...(split.house_number ? { house_number: split.house_number } : {}),
116
+ street: split.street,
117
+ locality: city,
118
+ region: state.abbreviation,
119
+ postcode: zip,
120
+ }
144
121
 
145
- const raw = [
146
- name,
147
- streetPart,
148
- [city, [HI_STATE_ABBR, zip].filter(Boolean).join(" ")].filter(Boolean).join(", "),
149
- ]
150
- .filter(Boolean)
151
- .join(", ")
122
+ const streetPart = [split.house_number, split.street].filter(Boolean).join(" ").trim()
152
123
 
153
- const aligned = reconcileComponents(components, raw)
124
+ const raw = [
125
+ name,
126
+ streetPart,
127
+ [city, [HI_STATE_ABBR, zip].filter(Boolean).join(" ")].filter(Boolean).join(", "),
128
+ ]
129
+ .filter(Boolean)
130
+ .join(", ")
154
131
 
155
- if (Object.keys(aligned).length <= 2) continue
132
+ const aligned = reconcileComponents(components, raw)
156
133
 
157
- const code = (record.code ?? "").toString().trim()
134
+ if (Object.keys(aligned).length <= 2) continue
158
135
 
159
- const sourceID = code
160
- ? `${STATE_HI_SCHOOLS_ADAPTER_ID}-${code}`
161
- : stableSourceID(STATE_HI_SCHOOLS_ADAPTER_ID, aligned)
136
+ const code = (record.code ?? "").toString().trim()
162
137
 
163
- yield {
164
- raw,
165
- components: aligned,
166
- country: "US",
167
- locale: "en-US",
168
- source: STATE_HI_SCHOOLS_ADAPTER_ID,
169
- source_id: sourceID,
170
- corpus_version: "",
171
- license: STATE_HI_SCHOOLS_DEFAULT_LICENSE,
172
- }
138
+ const sourceID = code
139
+ ? `${STATE_HI_SCHOOLS_ADAPTER_ID}-${code}`
140
+ : stableSourceID(STATE_HI_SCHOOLS_ADAPTER_ID, aligned)
173
141
 
174
- emitted++
142
+ yield {
143
+ raw,
144
+ components: aligned,
145
+ country: "US",
146
+ locale: "en-US",
147
+ source: STATE_HI_SCHOOLS_ADAPTER_ID,
148
+ source_id: sourceID,
149
+ corpus_version: "",
150
+ license: STATE_HI_SCHOOLS_DEFAULT_LICENSE,
175
151
  }
176
- } finally {
177
- stream.destroy()
152
+
153
+ emitted++
178
154
  }
179
155
  },
180
156
  }
@@ -16,14 +16,11 @@
16
16
  * License: stamped `"Public Domain"` per Iowa state government open-data terms.
17
17
  */
18
18
 
19
- import { createReadStream } from "node:fs"
20
-
21
- import { parse as csvParse } from "csv-parse"
22
-
23
- import { stableSourceID } from "../../adapter.ts"
24
- import { lookupStateAbbreviation } from "../../codex/us-fips-state.ts"
25
- import { reconcileComponents } from "../../format.ts"
26
- import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "../../types.ts"
19
+ import { splitStreetLine, stableSourceID } from "@mailwoman/corpus/adapters/utils"
20
+ import { lookupStateAbbreviation } from "@mailwoman/corpus/codex/us-fips-state"
21
+ import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "@mailwoman/corpus/types"
22
+ import { reconcileComponents } from "@mailwoman/formatter"
23
+ import { CSVSpliterator } from "spliterator"
27
24
 
28
25
  /**
29
26
  * Registry id for this adapter. Stamped into every row it emits, so a corpus record can be traced back to the dataset
@@ -36,8 +33,6 @@ export const STATE_IA_CONTRACTORS_ADAPTER_ID = "state-ia-contractors"
36
33
  */
37
34
  export const STATE_IA_CONTRACTORS_DEFAULT_LICENSE = "Public Domain"
38
35
 
39
- const HOUSE_NUMBER_PREFIX = /^(\d+(?:-\d+)?[A-Za-z]?)\s+(.+)$/
40
-
41
36
  interface IaContractorRow {
42
37
  "Registration #": string
43
38
  "Business Name": string
@@ -50,17 +45,6 @@ interface IaContractorRow {
50
45
  "Last Name": string
51
46
  }
52
47
 
53
- function splitAddress(address: string): { house_number?: string; street: string } | null {
54
- const trimmed = address.trim()
55
-
56
- if (!trimmed) return null
57
- const m = HOUSE_NUMBER_PREFIX.exec(trimmed)
58
-
59
- if (m) return { house_number: m[1], street: m[2]!.trim() }
60
-
61
- return { street: trimmed }
62
- }
63
-
64
48
  export function createStateIaContractorsAdapter(): CorpusAdapter {
65
49
  return {
66
50
  id: STATE_IA_CONTRACTORS_ADAPTER_ID,
@@ -73,85 +57,76 @@ export function createStateIaContractorsAdapter(): CorpusAdapter {
73
57
  throw new Error(`state-ia-contractors adapter: only US supported, got country=${opts.country}`)
74
58
  }
75
59
 
76
- const stream = createReadStream(opts.inputPath, { encoding: "utf8" })
77
-
78
- const parser = stream.pipe(
79
- csvParse({
80
- columns: true,
81
- skip_empty_lines: true,
82
- relax_quotes: true,
83
- relax_column_count: true,
84
- })
85
- )
60
+ const rows = CSVSpliterator.fromAsync(opts.inputPath, {
61
+ mode: "object",
62
+ normalizeKeys: false,
63
+ enableQuoteHandling: true,
64
+ })
86
65
 
87
66
  let emitted = 0
88
67
 
89
- try {
90
- for await (const record of parser as AsyncIterable<IaContractorRow>) {
91
- if (opts.signal?.aborted) break
68
+ for await (const record of rows as AsyncIterable<IaContractorRow>) {
69
+ if (opts.signal?.aborted) break
92
70
 
93
- if (opts.limit !== undefined && emitted >= opts.limit) break
71
+ if (opts.limit !== undefined && emitted >= opts.limit) break
94
72
 
95
- const businessName = (record["Business Name"] ?? "").trim()
96
- const address1 = (record["Address 1"] ?? "").trim()
97
- const address2 = (record["Address 2"] ?? "").trim()
98
- const city = (record.City ?? "").trim()
99
- const stateAbbr = (record.State ?? "").trim()
100
- const zip = (record["Zip Code"] ?? "").trim()
73
+ const businessName = (record["Business Name"] ?? "").trim()
74
+ const address1 = (record["Address 1"] ?? "").trim()
75
+ const address2 = (record["Address 2"] ?? "").trim()
76
+ const city = (record.City ?? "").trim()
77
+ const stateAbbr = (record.State ?? "").trim()
78
+ const zip = (record["Zip Code"] ?? "").trim()
101
79
 
102
- if (!city || !zip) continue
80
+ if (!city || !zip) continue
103
81
 
104
- const state = lookupStateAbbreviation(stateAbbr)
82
+ const state = lookupStateAbbreviation(stateAbbr)
105
83
 
106
- if (!state) continue
84
+ if (!state) continue
107
85
 
108
- const fullAddress = [address1, address2].filter(Boolean).join(" ")
109
- const split = splitAddress(fullAddress)
86
+ const fullAddress = [address1, address2].filter(Boolean).join(" ")
87
+ const split = splitStreetLine(fullAddress)
110
88
 
111
- if (!split) continue
89
+ if (!split) continue
112
90
 
113
- const venue = businessName || undefined
91
+ const venue = businessName || undefined
114
92
 
115
- const components: CanonicalRow["components"] = {
116
- ...(venue ? { venue } : {}),
117
- ...(split.house_number ? { house_number: split.house_number } : {}),
118
- street: split.street,
119
- locality: city,
120
- region: state.abbreviation,
121
- postcode: zip,
122
- }
123
-
124
- const streetPart = [split.house_number, split.street].filter(Boolean).join(" ").trim()
93
+ const components: CanonicalRow["components"] = {
94
+ ...(venue ? { venue } : {}),
95
+ ...(split.house_number ? { house_number: split.house_number } : {}),
96
+ street: split.street,
97
+ locality: city,
98
+ region: state.abbreviation,
99
+ postcode: zip,
100
+ }
125
101
 
126
- const raw = [venue, streetPart, [city, [stateAbbr, zip].filter(Boolean).join(" ")].filter(Boolean).join(", ")]
127
- .filter(Boolean)
128
- .join(", ")
102
+ const streetPart = [split.house_number, split.street].filter(Boolean).join(" ").trim()
129
103
 
130
- const aligned = reconcileComponents(components, raw)
104
+ const raw = [venue, streetPart, [city, [stateAbbr, zip].filter(Boolean).join(" ")].filter(Boolean).join(", ")]
105
+ .filter(Boolean)
106
+ .join(", ")
131
107
 
132
- if (Object.keys(aligned).length <= 2) continue
108
+ const aligned = reconcileComponents(components, raw)
133
109
 
134
- const regNum = (record["Registration #"] ?? "").trim()
110
+ if (Object.keys(aligned).length <= 2) continue
135
111
 
136
- const sourceID = regNum
137
- ? `${STATE_IA_CONTRACTORS_ADAPTER_ID}-${regNum}`
138
- : stableSourceID(STATE_IA_CONTRACTORS_ADAPTER_ID, aligned)
112
+ const regNum = (record["Registration #"] ?? "").trim()
139
113
 
140
- yield {
141
- raw,
142
- components: aligned,
143
- country: "US",
144
- locale: "en-US",
145
- source: STATE_IA_CONTRACTORS_ADAPTER_ID,
146
- source_id: sourceID,
147
- corpus_version: "",
148
- license: STATE_IA_CONTRACTORS_DEFAULT_LICENSE,
149
- }
114
+ const sourceID = regNum
115
+ ? `${STATE_IA_CONTRACTORS_ADAPTER_ID}-${regNum}`
116
+ : stableSourceID(STATE_IA_CONTRACTORS_ADAPTER_ID, aligned)
150
117
 
151
- emitted++
118
+ yield {
119
+ raw,
120
+ components: aligned,
121
+ country: "US",
122
+ locale: "en-US",
123
+ source: STATE_IA_CONTRACTORS_ADAPTER_ID,
124
+ source_id: sourceID,
125
+ corpus_version: "",
126
+ license: STATE_IA_CONTRACTORS_DEFAULT_LICENSE,
152
127
  }
153
- } finally {
154
- stream.destroy()
128
+
129
+ emitted++
155
130
  }
156
131
  },
157
132
  }
@@ -14,14 +14,11 @@
14
14
  * License: stamped `"Public Domain"` per New York state government open-data terms.
15
15
  */
16
16
 
17
- import { createReadStream } from "node:fs"
18
-
19
- import { parse as csvParse } from "csv-parse"
20
-
21
- import { stableSourceID } from "../../adapter.ts"
22
- import { lookupStateAbbreviation } from "../../codex/us-fips-state.ts"
23
- import { reconcileComponents } from "../../format.ts"
24
- import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "../../types.ts"
17
+ import { splitStreetLine, stableSourceID } from "@mailwoman/corpus/adapters/utils"
18
+ import { lookupStateAbbreviation } from "@mailwoman/corpus/codex/us-fips-state"
19
+ import type { AdapterOptions, CanonicalRow, CorpusAdapter } from "@mailwoman/corpus/types"
20
+ import { reconcileComponents } from "@mailwoman/formatter"
21
+ import { CSVSpliterator } from "spliterator"
25
22
 
26
23
  /**
27
24
  * Registry id for this adapter. Stamped into every row it emits, so a corpus record can be traced back to the dataset
@@ -34,8 +31,6 @@ export const STATE_NY_NOTARIES_ADAPTER_ID = "state-ny-notaries"
34
31
  */
35
32
  export const STATE_NY_NOTARIES_DEFAULT_LICENSE = "Public Domain"
36
33
 
37
- const HOUSE_NUMBER_PREFIX = /^(\d+(?:-\d+)?[A-Za-z]?)\s+(.+)$/
38
-
39
34
  interface NyNotaryRow {
40
35
  "Commission Holder Name": string
41
36
  "Commission Number (UID)": string
@@ -48,17 +43,6 @@ interface NyNotaryRow {
48
43
  "Commissioned County": string
49
44
  }
50
45
 
51
- function splitAddress(address: string): { house_number?: string; street: string } | null {
52
- const trimmed = address.trim()
53
-
54
- if (!trimmed) return null
55
- const m = HOUSE_NUMBER_PREFIX.exec(trimmed)
56
-
57
- if (m) return { house_number: m[1], street: m[2]!.trim() }
58
-
59
- return { street: trimmed }
60
- }
61
-
62
46
  const RAW_NY_COLUMNS = [
63
47
  "Commission Holder Name",
64
48
  "Commission Number (UID)",
@@ -82,97 +66,88 @@ export function createStateNyNotariesAdapter(): CorpusAdapter {
82
66
  throw new Error(`state-ny-notaries adapter: only US supported, got country=${opts.country}`)
83
67
  }
84
68
 
85
- const stream = createReadStream(opts.inputPath, { encoding: "utf8" })
86
-
87
- const parser = stream.pipe(
88
- csvParse({
89
- columns: true,
90
- skip_empty_lines: true,
91
- relax_quotes: true,
92
- relax_column_count: true,
93
- })
94
- )
69
+ const rows = CSVSpliterator.fromAsync(opts.inputPath, {
70
+ mode: "object",
71
+ normalizeKeys: false,
72
+ enableQuoteHandling: true,
73
+ })
95
74
 
96
75
  let emitted = 0
97
76
 
98
- try {
99
- for await (const rawRecord of parser as AsyncIterable<Record<string, string>>) {
100
- if (opts.signal?.aborted) break
101
-
102
- if (opts.limit !== undefined && emitted >= opts.limit) break
77
+ for await (const rawRecord of rows as AsyncIterable<Record<string, string>>) {
78
+ if (opts.signal?.aborted) break
103
79
 
104
- // NY CSV has columns with leading spaces, so we normalize by trimming keys.
105
- const record: Record<string, string> = {}
80
+ if (opts.limit !== undefined && emitted >= opts.limit) break
106
81
 
107
- for (const key of Object.keys(rawRecord)) {
108
- record[key.trim()] = rawRecord[key] ?? ""
109
- }
82
+ // NY CSV has columns with leading spaces, so we normalize by trimming keys.
83
+ const record: Record<string, string> = {}
110
84
 
111
- const holderName = (record["Commission Holder Name"] ?? "").trim()
112
- const businessName = (record["Business Name (if available)"] ?? "").trim()
113
- const address1 = (record["Business Address 1 (if available)"] ?? "").trim()
114
- const address2 = (record["Business Address 2 (if available)"] ?? "").trim()
115
- const city = (record["Business City (if available)"] ?? "").trim()
116
- const stateAbbr = (record["Business State (if available)"] ?? "").trim()
117
- const zip = (record["Business Zip (if available)"] ?? "").trim()
118
- const county = (record["Commissioned County"] ?? "").trim()
85
+ for (const key of Object.keys(rawRecord)) {
86
+ record[key.trim()] = rawRecord[key] ?? ""
87
+ }
119
88
 
120
- if (!city || !stateAbbr || !zip) continue
89
+ const holderName = (record["Commission Holder Name"] ?? "").trim()
90
+ const businessName = (record["Business Name (if available)"] ?? "").trim()
91
+ const address1 = (record["Business Address 1 (if available)"] ?? "").trim()
92
+ const address2 = (record["Business Address 2 (if available)"] ?? "").trim()
93
+ const city = (record["Business City (if available)"] ?? "").trim()
94
+ const stateAbbr = (record["Business State (if available)"] ?? "").trim()
95
+ const zip = (record["Business Zip (if available)"] ?? "").trim()
96
+ const county = (record["Commissioned County"] ?? "").trim()
121
97
 
122
- if (!address1 && !address2) continue
98
+ if (!city || !stateAbbr || !zip) continue
123
99
 
124
- const state = lookupStateAbbreviation(stateAbbr)
100
+ if (!address1 && !address2) continue
125
101
 
126
- if (!state) continue
102
+ const state = lookupStateAbbreviation(stateAbbr)
127
103
 
128
- const fullAddress = [address1, address2].filter(Boolean).join(" ")
129
- const split = splitAddress(fullAddress)
104
+ if (!state) continue
130
105
 
131
- if (!split) continue
106
+ const fullAddress = [address1, address2].filter(Boolean).join(" ")
107
+ const split = splitStreetLine(fullAddress)
132
108
 
133
- const venue = businessName || holderName || undefined
109
+ if (!split) continue
134
110
 
135
- const components: CanonicalRow["components"] = {
136
- ...(venue ? { venue } : {}),
137
- ...(split.house_number ? { house_number: split.house_number } : {}),
138
- street: split.street,
139
- locality: city,
140
- region: state.abbreviation,
141
- postcode: zip,
142
- ...(county ? { subregion: county } : {}),
143
- }
111
+ const venue = businessName || holderName || undefined
144
112
 
145
- const streetPart = [split.house_number, split.street].filter(Boolean).join(" ").trim()
113
+ const components: CanonicalRow["components"] = {
114
+ ...(venue ? { venue } : {}),
115
+ ...(split.house_number ? { house_number: split.house_number } : {}),
116
+ street: split.street,
117
+ locality: city,
118
+ region: state.abbreviation,
119
+ postcode: zip,
120
+ ...(county ? { subregion: county } : {}),
121
+ }
146
122
 
147
- const raw = [venue, streetPart, [city, [stateAbbr, zip].filter(Boolean).join(" ")].filter(Boolean).join(", ")]
148
- .filter(Boolean)
149
- .join(", ")
123
+ const streetPart = [split.house_number, split.street].filter(Boolean).join(" ").trim()
150
124
 
151
- const aligned = reconcileComponents(components, raw)
125
+ const raw = [venue, streetPart, [city, [stateAbbr, zip].filter(Boolean).join(" ")].filter(Boolean).join(", ")]
126
+ .filter(Boolean)
127
+ .join(", ")
152
128
 
153
- if (Object.keys(aligned).length <= 2) continue
129
+ const aligned = reconcileComponents(components, raw)
154
130
 
155
- const commNum = (record["Commission Number (UID)"] ?? "").trim()
131
+ if (Object.keys(aligned).length <= 2) continue
156
132
 
157
- const sourceID = commNum
158
- ? `${STATE_NY_NOTARIES_ADAPTER_ID}-${commNum}`
159
- : stableSourceID(STATE_NY_NOTARIES_ADAPTER_ID, aligned)
133
+ const commNum = (record["Commission Number (UID)"] ?? "").trim()
160
134
 
161
- yield {
162
- raw,
163
- components: aligned,
164
- country: "US",
165
- locale: "en-US",
166
- source: STATE_NY_NOTARIES_ADAPTER_ID,
167
- source_id: sourceID,
168
- corpus_version: "",
169
- license: STATE_NY_NOTARIES_DEFAULT_LICENSE,
170
- }
135
+ const sourceID = commNum
136
+ ? `${STATE_NY_NOTARIES_ADAPTER_ID}-${commNum}`
137
+ : stableSourceID(STATE_NY_NOTARIES_ADAPTER_ID, aligned)
171
138
 
172
- emitted++
139
+ yield {
140
+ raw,
141
+ components: aligned,
142
+ country: "US",
143
+ locale: "en-US",
144
+ source: STATE_NY_NOTARIES_ADAPTER_ID,
145
+ source_id: sourceID,
146
+ corpus_version: "",
147
+ license: STATE_NY_NOTARIES_DEFAULT_LICENSE,
173
148
  }
174
- } finally {
175
- stream.destroy()
149
+
150
+ emitted++
176
151
  }
177
152
  },
178
153
  }