@mailwoman/corpus 10.1.0 → 10.2.1

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 (736) hide show
  1. package/data/licenses/cdla-permissive-2.0.md +1 -1
  2. package/lib/adapters/cordis/adapter.ts +13 -7
  3. package/lib/adapters/dedup-key.ts +1 -1
  4. package/lib/adapters/geonames/adapter.ts +1 -1
  5. package/lib/adapters/gleif/adapter.ts +17 -16
  6. package/lib/adapters/libpostal-dictionary.ts +0 -2
  7. package/lib/adapters/openaddresses/adapter.ts +4 -3
  8. package/lib/adapters/osm/adapter.ts +22 -21
  9. package/lib/adapters/po-box/adapter.ts +10 -5
  10. package/lib/adapters/registry.ts +4 -4
  11. package/lib/adapters/source-id.ts +2 -2
  12. package/lib/adapters/street-line.ts +7 -6
  13. package/lib/adapters/wof/admin/json/adapter.ts +2 -2
  14. package/lib/adapters/wof/json-rows.ts +2 -1
  15. package/lib/adapters/wof/postalcode-json/adapter.ts +6 -2
  16. package/lib/adapters.ts +5 -5
  17. package/lib/au/adapters/gnaf/adapter.ts +1 -1
  18. package/lib/be/adapters/brussels/adapter.ts +22 -22
  19. package/lib/be/adapters/vlaanderen/adapter.ts +54 -57
  20. package/lib/be/adapters/wallonie/adapter.ts +17 -17
  21. package/lib/be/tools/fetch/brussels.ts +13 -10
  22. package/lib/be/tools/fetch/wallonie.ts +8 -7
  23. package/lib/build/adapters.ts +2 -1
  24. package/lib/build/align.ts +5 -4
  25. package/lib/build/checkpoint.ts +5 -3
  26. package/lib/build/eligibility.ts +3 -3
  27. package/lib/build/types.ts +8 -6
  28. package/lib/cz/adapters/cuzk/adapter.ts +41 -38
  29. package/lib/cz/tools/fetch/cuzk.ts +42 -31
  30. package/lib/de/recipes/locale.ts +1 -1
  31. package/lib/dk/adapters/inspire/adapter.ts +38 -38
  32. package/lib/dk/tools/fetch/inspire.ts +16 -14
  33. package/lib/ee/adapters/ads/adapter.ts +26 -32
  34. package/lib/ee/tools/fetch/ads.ts +10 -8
  35. package/lib/es/adapters/bizkaia/adapter.ts +47 -47
  36. package/lib/es/adapters/catastro/adapter.ts +36 -34
  37. package/lib/es/adapters/gipuzkoa/adapter.ts +38 -45
  38. package/lib/es/adapters/navarra/adapter.ts +28 -27
  39. package/lib/es/cadastre.ts +31 -31
  40. package/lib/es/tools/fetch/bizkaia.ts +40 -36
  41. package/lib/es/tools/fetch/catastro.ts +51 -40
  42. package/lib/es/tools/fetch/gipuzkoa.ts +13 -11
  43. package/lib/es/tools/fetch/navarra.ts +33 -25
  44. package/lib/fi/adapters/ryhti/adapter.ts +22 -26
  45. package/lib/fi/tools/fetch/ryhti.ts +31 -31
  46. package/lib/fr/adapters/annuaire-education/adapter.ts +13 -11
  47. package/lib/fr/adapters/ban/adapter.ts +6 -6
  48. package/lib/fr/adapters/finess/adapter.ts +16 -15
  49. package/lib/fr/adapters/finess/voie-type.ts +4 -3
  50. package/lib/fr/insee-country.ts +2 -2
  51. package/lib/fr/recipes/lieudit.ts +8 -6
  52. package/lib/fr/tools/fetch/annuaire-education.ts +11 -8
  53. package/lib/fr/tools/fetch/ban.ts +3 -2
  54. package/lib/fr/tools/fetch/finess.ts +14 -13
  55. package/lib/inspire/address.ts +86 -78
  56. package/lib/inspire/errors.ts +9 -8
  57. package/lib/inspire/stream.ts +29 -26
  58. package/lib/international/recipes/locale.ts +13 -9
  59. package/lib/it/adapters/anac/adapter.ts +51 -46
  60. package/lib/it/tools/fetch/anac.ts +22 -25
  61. package/lib/jp/adapters/wof-admin/adapter.ts +2 -6
  62. package/lib/jp/tools/fetch/houjin.ts +3 -3
  63. package/lib/kr/adapters/localdata/permit-rows.ts +1 -1
  64. package/lib/kr/tools/fetch/juso.ts +1 -1
  65. package/lib/kr/tools/fetch/localdata.ts +2 -2
  66. package/lib/lu/adapters/bd-adresses/adapter.ts +10 -10
  67. package/lib/lu/tools/fetch/bd-adresses.ts +15 -13
  68. package/lib/lv/adapters/varis/adapter.ts +24 -23
  69. package/lib/lv/tools/fetch/varis.ts +3 -2
  70. package/lib/nl/adapters/kadaster/adapter.ts +29 -29
  71. package/lib/nl/tools/fetch/kadaster.ts +16 -12
  72. package/lib/no/adapters/matrikkelen/adapter.ts +6 -5
  73. package/lib/no/tools/fetch/matrikkelen.ts +59 -47
  74. package/lib/parquet/duckdb.ts +7 -4
  75. package/lib/parquet/readers.ts +3 -3
  76. package/lib/parquet/schema.ts +1 -1
  77. package/lib/parquet/writers.ts +3 -2
  78. package/lib/pl/adapters/emuia/adapter.ts +12 -12
  79. package/lib/pl/tools/fetch/emuia.ts +10 -9
  80. package/lib/recipes/bare/postcode.ts +1 -1
  81. package/lib/recipes/boundary-stress.ts +1 -1
  82. package/lib/recipes/house-venue.ts +7 -3
  83. package/lib/recipes/intersection.ts +2 -2
  84. package/lib/recipes/po/box/cedex/recipe.ts +3 -3
  85. package/lib/recipes/po/box/cedex/sources.ts +13 -1
  86. package/lib/recipes/scaffold.ts +31 -21
  87. package/lib/recipes/sources.ts +16 -3
  88. package/lib/recipes/street/bare.ts +2 -2
  89. package/lib/recipes/street.ts +3 -1
  90. package/lib/recipes/sub/venue/context.ts +2 -0
  91. package/lib/recipes/sub/venue/render.ts +1 -1
  92. package/lib/recipes/sub/venue/sources.ts +24 -29
  93. package/lib/recipes/sub/venue.ts +12 -18
  94. package/lib/recipes/trailing-region.ts +6 -2
  95. package/lib/recipes/unit.ts +3 -3
  96. package/lib/recipes/venue.ts +347 -0
  97. package/lib/recipes.ts +4 -2
  98. package/lib/registers.ts +8 -6
  99. package/lib/ro/adapters/retea-scolara/adapter.ts +5 -5
  100. package/lib/ro/tools/fetch/retea-scolara.ts +1 -1
  101. package/lib/runner.ts +4 -3
  102. package/lib/sg/recipes/register.ts +1 -1
  103. package/lib/sg/tools/fetch/acra.ts +3 -3
  104. package/lib/sk/adapters/inspire/adapter.ts +25 -27
  105. package/lib/sk/tools/fetch/inspire.ts +15 -14
  106. package/lib/source-register/effective-manifest.ts +3 -3
  107. package/lib/source-register/register.ts +3 -3
  108. package/lib/source-register/training-manifest.ts +1 -1
  109. package/lib/source-register/types.ts +12 -13
  110. package/lib/subvenue/promotions.ts +1 -1
  111. package/lib/subvenue/table.ts +4 -4
  112. package/lib/surfaces/locale.ts +2 -0
  113. package/lib/synthesizers/anchor-absorption.ts +2 -1
  114. package/lib/synthesizers/boundary-stress.ts +20 -26
  115. package/lib/synthesizers/house-venue.ts +26 -30
  116. package/lib/synthesizers/no-street.ts +2 -1
  117. package/lib/synthesizers/po-box.ts +6 -3
  118. package/lib/synthesizers/tail.ts +55 -0
  119. package/lib/synthesizers/utils.ts +19 -2
  120. package/lib/test-kit.ts +2 -2
  121. package/lib/tools/audit.ts +7 -5
  122. package/lib/tools/corpus-stats.ts +1 -1
  123. package/lib/tools/fetch/atom.ts +10 -10
  124. package/lib/tools/fetch/cordis.ts +11 -9
  125. package/lib/tools/fetch/download/manifest.ts +2 -1
  126. package/lib/tools/fetch/download/network.ts +4 -4
  127. package/lib/tools/fetch/download/retry.ts +4 -4
  128. package/lib/tools/fetch/geonames/dump.ts +5 -3
  129. package/lib/tools/fetch/geonames/postal.ts +2 -2
  130. package/lib/tools/fetch/gleif.ts +6 -4
  131. package/lib/tools/fetch/header.ts +8 -6
  132. package/lib/tools/fetch/inspire-addresses.ts +41 -36
  133. package/lib/tools/fetch/openaddresses.ts +1 -1
  134. package/lib/tools/fetch/vlaanderen-ad.ts +17 -17
  135. package/lib/tools/fetch/wfs-harvest.ts +39 -28
  136. package/lib/tools/fetch.ts +0 -42
  137. package/lib/tools/golden/expand.ts +8 -8
  138. package/lib/tools/golden/promote.ts +12 -8
  139. package/lib/tools/golden/relabel-street/directory.ts +7 -6
  140. package/lib/tools/golden/relabel-street/row.ts +7 -6
  141. package/lib/tools/ingest-csv.ts +3 -3
  142. package/lib/tools/jsonl-to-parquet.ts +1 -1
  143. package/lib/tools/lint/recipe-output/vocab.ts +10 -5
  144. package/lib/tools/lint/recipe-output.ts +26 -8
  145. package/lib/tools/overlay/kryptonite.ts +4 -3
  146. package/lib/tools/overlay/manifest.ts +4 -2
  147. package/lib/tools/overlay/merge-source.ts +2 -1
  148. package/lib/tools/overlay/split-slice.ts +2 -2
  149. package/lib/tools/overlay/translit.ts +6 -4
  150. package/lib/tools/overture-subvenue.ts +1 -1
  151. package/lib/tools/postcode-triples.ts +5 -4
  152. package/lib/tools/source-register/build.ts +17 -14
  153. package/lib/tools/sub/venue/lexicon.ts +4 -8
  154. package/lib/tw/tools/fetch/gcis.ts +4 -4
  155. package/lib/types.ts +4 -3
  156. package/lib/us/adapters/state/hi-schools/workbook.ts +1 -1
  157. package/lib/us/adapters/usgov/nad/adapter.ts +11 -11
  158. package/lib/us/adapters/usgov/samhsa-treatment-locator/adapter.ts +4 -4
  159. package/lib/us/fips-state.ts +2 -2
  160. package/lib/{synthesizers → us/synthesizers}/intersection.ts +12 -13
  161. package/lib/{synthesizers → us/synthesizers}/street.ts +16 -15
  162. package/lib/us/tools/fetch/imls-pls.ts +1 -1
  163. package/lib/us/tools/fetch/nad.ts +7 -7
  164. package/lib/us/tools/fetch/nppes.ts +5 -5
  165. package/lib/us/tools/fetch/state/hi-schools.ts +3 -2
  166. package/lib/us/tools/fetch/tiger-full.ts +1 -1
  167. package/lib/utils/align.ts +13 -10
  168. package/lib/utils/golden.ts +2 -2
  169. package/lib/utils/license.ts +3 -3
  170. package/lib/utils/split.ts +19 -15
  171. package/lib/utils/tokenize.ts +7 -26
  172. package/lib/utils/wof-json.ts +4 -4
  173. package/out/adapters/cordis/adapter.d.ts +5 -3
  174. package/out/adapters/cordis/adapter.d.ts.map +1 -1
  175. package/out/adapters/cordis/adapter.js +13 -7
  176. package/out/adapters/cordis/adapter.js.map +1 -1
  177. package/out/adapters/dedup-key.d.ts +1 -1
  178. package/out/adapters/dedup-key.js +1 -1
  179. package/out/adapters/geonames/adapter.js +1 -1
  180. package/out/adapters/geonames/adapter.js.map +1 -1
  181. package/out/adapters/gleif/adapter.d.ts +9 -9
  182. package/out/adapters/gleif/adapter.d.ts.map +1 -1
  183. package/out/adapters/gleif/adapter.js +15 -14
  184. package/out/adapters/gleif/adapter.js.map +1 -1
  185. package/out/adapters/libpostal-dictionary.d.ts +0 -2
  186. package/out/adapters/libpostal-dictionary.d.ts.map +1 -1
  187. package/out/adapters/libpostal-dictionary.js +0 -2
  188. package/out/adapters/libpostal-dictionary.js.map +1 -1
  189. package/out/adapters/openaddresses/adapter.d.ts +3 -2
  190. package/out/adapters/openaddresses/adapter.d.ts.map +1 -1
  191. package/out/adapters/openaddresses/adapter.js +1 -1
  192. package/out/adapters/openaddresses/adapter.js.map +1 -1
  193. package/out/adapters/osm/adapter.d.ts +17 -16
  194. package/out/adapters/osm/adapter.d.ts.map +1 -1
  195. package/out/adapters/osm/adapter.js +10 -9
  196. package/out/adapters/osm/adapter.js.map +1 -1
  197. package/out/adapters/po-box/adapter.d.ts +6 -3
  198. package/out/adapters/po-box/adapter.d.ts.map +1 -1
  199. package/out/adapters/po-box/adapter.js +4 -2
  200. package/out/adapters/po-box/adapter.js.map +1 -1
  201. package/out/adapters/registry.d.ts +3 -3
  202. package/out/adapters/registry.d.ts.map +1 -1
  203. package/out/adapters/registry.js +1 -1
  204. package/out/adapters/registry.js.map +1 -1
  205. package/out/adapters/source-id.d.ts +2 -2
  206. package/out/adapters/source-id.js +2 -2
  207. package/out/adapters/street-line.d.ts +7 -6
  208. package/out/adapters/street-line.d.ts.map +1 -1
  209. package/out/adapters/street-line.js +7 -6
  210. package/out/adapters/street-line.js.map +1 -1
  211. package/out/adapters/wof/admin/json/adapter.js +1 -1
  212. package/out/adapters/wof/admin/json/adapter.js.map +1 -1
  213. package/out/adapters/wof/json-rows.d.ts +2 -1
  214. package/out/adapters/wof/json-rows.d.ts.map +1 -1
  215. package/out/adapters/wof/json-rows.js.map +1 -1
  216. package/out/adapters/wof/postalcode-json/adapter.d.ts.map +1 -1
  217. package/out/adapters/wof/postalcode-json/adapter.js +5 -1
  218. package/out/adapters/wof/postalcode-json/adapter.js.map +1 -1
  219. package/out/adapters.d.ts +5 -5
  220. package/out/adapters.js +5 -5
  221. package/out/au/adapters/gnaf/adapter.js +1 -1
  222. package/out/au/adapters/gnaf/adapter.js.map +1 -1
  223. package/out/be/adapters/brussels/adapter.d.ts +9 -9
  224. package/out/be/adapters/brussels/adapter.d.ts.map +1 -1
  225. package/out/be/adapters/brussels/adapter.js +21 -21
  226. package/out/be/adapters/brussels/adapter.js.map +1 -1
  227. package/out/be/adapters/vlaanderen/adapter.d.ts +34 -37
  228. package/out/be/adapters/vlaanderen/adapter.d.ts.map +1 -1
  229. package/out/be/adapters/vlaanderen/adapter.js +40 -38
  230. package/out/be/adapters/vlaanderen/adapter.js.map +1 -1
  231. package/out/be/adapters/wallonie/adapter.d.ts +2 -2
  232. package/out/be/adapters/wallonie/adapter.js +17 -17
  233. package/out/be/adapters/wallonie/adapter.js.map +1 -1
  234. package/out/be/tools/fetch/brussels.d.ts +11 -8
  235. package/out/be/tools/fetch/brussels.d.ts.map +1 -1
  236. package/out/be/tools/fetch/brussels.js +10 -8
  237. package/out/be/tools/fetch/brussels.js.map +1 -1
  238. package/out/be/tools/fetch/wallonie.d.ts +6 -5
  239. package/out/be/tools/fetch/wallonie.d.ts.map +1 -1
  240. package/out/be/tools/fetch/wallonie.js +4 -4
  241. package/out/be/tools/fetch/wallonie.js.map +1 -1
  242. package/out/build/adapters.d.ts.map +1 -1
  243. package/out/build/adapters.js +2 -1
  244. package/out/build/adapters.js.map +1 -1
  245. package/out/build/align.d.ts +3 -2
  246. package/out/build/align.d.ts.map +1 -1
  247. package/out/build/align.js +2 -2
  248. package/out/build/align.js.map +1 -1
  249. package/out/build/checkpoint.d.ts +1 -1
  250. package/out/build/checkpoint.d.ts.map +1 -1
  251. package/out/build/checkpoint.js +4 -2
  252. package/out/build/checkpoint.js.map +1 -1
  253. package/out/build/eligibility.d.ts +2 -2
  254. package/out/build/eligibility.js +3 -3
  255. package/out/build/eligibility.js.map +1 -1
  256. package/out/build/types.d.ts +8 -6
  257. package/out/build/types.d.ts.map +1 -1
  258. package/out/cz/adapters/cuzk/adapter.d.ts +14 -14
  259. package/out/cz/adapters/cuzk/adapter.d.ts.map +1 -1
  260. package/out/cz/adapters/cuzk/adapter.js +38 -35
  261. package/out/cz/adapters/cuzk/adapter.js.map +1 -1
  262. package/out/cz/tools/fetch/cuzk.d.ts +31 -22
  263. package/out/cz/tools/fetch/cuzk.d.ts.map +1 -1
  264. package/out/cz/tools/fetch/cuzk.js +21 -19
  265. package/out/cz/tools/fetch/cuzk.js.map +1 -1
  266. package/out/de/recipes/locale.js +1 -1
  267. package/out/de/recipes/locale.js.map +1 -1
  268. package/out/dk/adapters/inspire/adapter.d.ts +32 -33
  269. package/out/dk/adapters/inspire/adapter.d.ts.map +1 -1
  270. package/out/dk/adapters/inspire/adapter.js +38 -38
  271. package/out/dk/adapters/inspire/adapter.js.map +1 -1
  272. package/out/dk/tools/fetch/inspire.d.ts +6 -5
  273. package/out/dk/tools/fetch/inspire.d.ts.map +1 -1
  274. package/out/dk/tools/fetch/inspire.js +15 -13
  275. package/out/dk/tools/fetch/inspire.js.map +1 -1
  276. package/out/ee/adapters/ads/adapter.d.ts +19 -26
  277. package/out/ee/adapters/ads/adapter.d.ts.map +1 -1
  278. package/out/ee/adapters/ads/adapter.js +22 -28
  279. package/out/ee/adapters/ads/adapter.js.map +1 -1
  280. package/out/ee/tools/fetch/ads.d.ts +3 -3
  281. package/out/ee/tools/fetch/ads.d.ts.map +1 -1
  282. package/out/ee/tools/fetch/ads.js +10 -8
  283. package/out/ee/tools/fetch/ads.js.map +1 -1
  284. package/out/es/adapters/bizkaia/adapter.d.ts +28 -28
  285. package/out/es/adapters/bizkaia/adapter.d.ts.map +1 -1
  286. package/out/es/adapters/bizkaia/adapter.js +43 -43
  287. package/out/es/adapters/bizkaia/adapter.js.map +1 -1
  288. package/out/es/adapters/catastro/adapter.d.ts +22 -23
  289. package/out/es/adapters/catastro/adapter.d.ts.map +1 -1
  290. package/out/es/adapters/catastro/adapter.js +35 -33
  291. package/out/es/adapters/catastro/adapter.js.map +1 -1
  292. package/out/es/adapters/gipuzkoa/adapter.d.ts +31 -38
  293. package/out/es/adapters/gipuzkoa/adapter.d.ts.map +1 -1
  294. package/out/es/adapters/gipuzkoa/adapter.js +40 -47
  295. package/out/es/adapters/gipuzkoa/adapter.js.map +1 -1
  296. package/out/es/adapters/navarra/adapter.d.ts +20 -19
  297. package/out/es/adapters/navarra/adapter.d.ts.map +1 -1
  298. package/out/es/adapters/navarra/adapter.js +23 -22
  299. package/out/es/adapters/navarra/adapter.js.map +1 -1
  300. package/out/es/cadastre.d.ts +21 -20
  301. package/out/es/cadastre.d.ts.map +1 -1
  302. package/out/es/cadastre.js +19 -21
  303. package/out/es/cadastre.js.map +1 -1
  304. package/out/es/tools/fetch/bizkaia.d.ts +28 -25
  305. package/out/es/tools/fetch/bizkaia.d.ts.map +1 -1
  306. package/out/es/tools/fetch/bizkaia.js +25 -24
  307. package/out/es/tools/fetch/bizkaia.js.map +1 -1
  308. package/out/es/tools/fetch/catastro.d.ts +28 -20
  309. package/out/es/tools/fetch/catastro.d.ts.map +1 -1
  310. package/out/es/tools/fetch/catastro.js +36 -31
  311. package/out/es/tools/fetch/catastro.js.map +1 -1
  312. package/out/es/tools/fetch/gipuzkoa.d.ts +11 -9
  313. package/out/es/tools/fetch/gipuzkoa.d.ts.map +1 -1
  314. package/out/es/tools/fetch/gipuzkoa.js +9 -8
  315. package/out/es/tools/fetch/gipuzkoa.js.map +1 -1
  316. package/out/es/tools/fetch/navarra.d.ts +20 -15
  317. package/out/es/tools/fetch/navarra.d.ts.map +1 -1
  318. package/out/es/tools/fetch/navarra.js +21 -16
  319. package/out/es/tools/fetch/navarra.js.map +1 -1
  320. package/out/fi/adapters/ryhti/adapter.d.ts +16 -20
  321. package/out/fi/adapters/ryhti/adapter.d.ts.map +1 -1
  322. package/out/fi/adapters/ryhti/adapter.js +21 -25
  323. package/out/fi/adapters/ryhti/adapter.js.map +1 -1
  324. package/out/fi/tools/fetch/ryhti.d.ts +24 -24
  325. package/out/fi/tools/fetch/ryhti.d.ts.map +1 -1
  326. package/out/fi/tools/fetch/ryhti.js +21 -24
  327. package/out/fi/tools/fetch/ryhti.js.map +1 -1
  328. package/out/fr/adapters/annuaire-education/adapter.d.ts +8 -8
  329. package/out/fr/adapters/annuaire-education/adapter.d.ts.map +1 -1
  330. package/out/fr/adapters/annuaire-education/adapter.js +13 -11
  331. package/out/fr/adapters/annuaire-education/adapter.js.map +1 -1
  332. package/out/fr/adapters/ban/adapter.d.ts +4 -4
  333. package/out/fr/adapters/ban/adapter.js +6 -6
  334. package/out/fr/adapters/ban/adapter.js.map +1 -1
  335. package/out/fr/adapters/finess/adapter.d.ts +12 -11
  336. package/out/fr/adapters/finess/adapter.d.ts.map +1 -1
  337. package/out/fr/adapters/finess/adapter.js +16 -15
  338. package/out/fr/adapters/finess/adapter.js.map +1 -1
  339. package/out/fr/adapters/finess/voie-type.d.ts +2 -2
  340. package/out/fr/adapters/finess/voie-type.d.ts.map +1 -1
  341. package/out/fr/adapters/finess/voie-type.js +4 -3
  342. package/out/fr/adapters/finess/voie-type.js.map +1 -1
  343. package/out/fr/insee-country.d.ts +2 -2
  344. package/out/fr/insee-country.js +2 -2
  345. package/out/fr/recipes/lieudit.d.ts.map +1 -1
  346. package/out/fr/recipes/lieudit.js +5 -4
  347. package/out/fr/recipes/lieudit.js.map +1 -1
  348. package/out/fr/tools/fetch/annuaire-education.d.ts +7 -4
  349. package/out/fr/tools/fetch/annuaire-education.d.ts.map +1 -1
  350. package/out/fr/tools/fetch/annuaire-education.js +9 -7
  351. package/out/fr/tools/fetch/annuaire-education.js.map +1 -1
  352. package/out/fr/tools/fetch/ban.d.ts +1 -1
  353. package/out/fr/tools/fetch/ban.d.ts.map +1 -1
  354. package/out/fr/tools/fetch/ban.js +3 -2
  355. package/out/fr/tools/fetch/ban.js.map +1 -1
  356. package/out/fr/tools/fetch/finess.d.ts +5 -5
  357. package/out/fr/tools/fetch/finess.d.ts.map +1 -1
  358. package/out/fr/tools/fetch/finess.js +13 -12
  359. package/out/fr/tools/fetch/finess.js.map +1 -1
  360. package/out/inspire/address.d.ts +62 -52
  361. package/out/inspire/address.d.ts.map +1 -1
  362. package/out/inspire/address.js +71 -60
  363. package/out/inspire/address.js.map +1 -1
  364. package/out/inspire/errors.d.ts +9 -8
  365. package/out/inspire/errors.d.ts.map +1 -1
  366. package/out/inspire/errors.js +7 -6
  367. package/out/inspire/errors.js.map +1 -1
  368. package/out/inspire/stream.d.ts +25 -22
  369. package/out/inspire/stream.d.ts.map +1 -1
  370. package/out/inspire/stream.js +10 -12
  371. package/out/inspire/stream.js.map +1 -1
  372. package/out/international/recipes/locale.d.ts +2 -2
  373. package/out/international/recipes/locale.d.ts.map +1 -1
  374. package/out/international/recipes/locale.js +11 -7
  375. package/out/international/recipes/locale.js.map +1 -1
  376. package/out/it/adapters/anac/adapter.d.ts +45 -43
  377. package/out/it/adapters/anac/adapter.d.ts.map +1 -1
  378. package/out/it/adapters/anac/adapter.js +48 -43
  379. package/out/it/adapters/anac/adapter.js.map +1 -1
  380. package/out/it/tools/fetch/anac.d.ts +16 -19
  381. package/out/it/tools/fetch/anac.d.ts.map +1 -1
  382. package/out/it/tools/fetch/anac.js +20 -23
  383. package/out/it/tools/fetch/anac.js.map +1 -1
  384. package/out/jp/adapters/wof-admin/adapter.d.ts.map +1 -1
  385. package/out/jp/adapters/wof-admin/adapter.js.map +1 -1
  386. package/out/jp/tools/fetch/houjin.js +2 -2
  387. package/out/jp/tools/fetch/houjin.js.map +1 -1
  388. package/out/kr/adapters/localdata/permit-rows.js +1 -1
  389. package/out/kr/adapters/localdata/permit-rows.js.map +1 -1
  390. package/out/kr/tools/fetch/juso.d.ts +1 -1
  391. package/out/kr/tools/fetch/localdata.d.ts +1 -1
  392. package/out/kr/tools/fetch/localdata.js +1 -1
  393. package/out/kr/tools/fetch/localdata.js.map +1 -1
  394. package/out/lu/adapters/bd-adresses/adapter.d.ts +9 -9
  395. package/out/lu/adapters/bd-adresses/adapter.js +10 -10
  396. package/out/lu/tools/fetch/bd-adresses.d.ts +11 -9
  397. package/out/lu/tools/fetch/bd-adresses.d.ts.map +1 -1
  398. package/out/lu/tools/fetch/bd-adresses.js +11 -11
  399. package/out/lu/tools/fetch/bd-adresses.js.map +1 -1
  400. package/out/lv/adapters/varis/adapter.d.ts +24 -23
  401. package/out/lv/adapters/varis/adapter.d.ts.map +1 -1
  402. package/out/lv/adapters/varis/adapter.js +24 -23
  403. package/out/lv/adapters/varis/adapter.js.map +1 -1
  404. package/out/lv/tools/fetch/varis.d.ts +2 -1
  405. package/out/lv/tools/fetch/varis.d.ts.map +1 -1
  406. package/out/lv/tools/fetch/varis.js +1 -1
  407. package/out/lv/tools/fetch/varis.js.map +1 -1
  408. package/out/nl/adapters/kadaster/adapter.d.ts +12 -12
  409. package/out/nl/adapters/kadaster/adapter.d.ts.map +1 -1
  410. package/out/nl/adapters/kadaster/adapter.js +22 -23
  411. package/out/nl/adapters/kadaster/adapter.js.map +1 -1
  412. package/out/nl/tools/fetch/kadaster.d.ts +14 -10
  413. package/out/nl/tools/fetch/kadaster.d.ts.map +1 -1
  414. package/out/nl/tools/fetch/kadaster.js +12 -9
  415. package/out/nl/tools/fetch/kadaster.js.map +1 -1
  416. package/out/no/adapters/matrikkelen/adapter.d.ts +1 -1
  417. package/out/no/adapters/matrikkelen/adapter.d.ts.map +1 -1
  418. package/out/no/adapters/matrikkelen/adapter.js +3 -3
  419. package/out/no/adapters/matrikkelen/adapter.js.map +1 -1
  420. package/out/no/tools/fetch/matrikkelen.d.ts +50 -38
  421. package/out/no/tools/fetch/matrikkelen.d.ts.map +1 -1
  422. package/out/no/tools/fetch/matrikkelen.js +44 -36
  423. package/out/no/tools/fetch/matrikkelen.js.map +1 -1
  424. package/out/parquet/duckdb.d.ts +7 -4
  425. package/out/parquet/duckdb.d.ts.map +1 -1
  426. package/out/parquet/duckdb.js +2 -1
  427. package/out/parquet/duckdb.js.map +1 -1
  428. package/out/parquet/readers.js +3 -3
  429. package/out/parquet/readers.js.map +1 -1
  430. package/out/parquet/schema.js +1 -1
  431. package/out/parquet/schema.js.map +1 -1
  432. package/out/parquet/writers.d.ts +1 -1
  433. package/out/parquet/writers.d.ts.map +1 -1
  434. package/out/parquet/writers.js +2 -1
  435. package/out/parquet/writers.js.map +1 -1
  436. package/out/pl/adapters/emuia/adapter.d.ts +8 -8
  437. package/out/pl/adapters/emuia/adapter.js +12 -12
  438. package/out/pl/adapters/emuia/adapter.js.map +1 -1
  439. package/out/pl/tools/fetch/emuia.d.ts +5 -4
  440. package/out/pl/tools/fetch/emuia.d.ts.map +1 -1
  441. package/out/pl/tools/fetch/emuia.js +10 -9
  442. package/out/pl/tools/fetch/emuia.js.map +1 -1
  443. package/out/recipes/bare/postcode.js +1 -1
  444. package/out/recipes/bare/postcode.js.map +1 -1
  445. package/out/recipes/boundary-stress.js +1 -1
  446. package/out/recipes/boundary-stress.js.map +1 -1
  447. package/out/recipes/house-venue.d.ts.map +1 -1
  448. package/out/recipes/house-venue.js +6 -3
  449. package/out/recipes/house-venue.js.map +1 -1
  450. package/out/recipes/intersection.js +2 -2
  451. package/out/recipes/intersection.js.map +1 -1
  452. package/out/recipes/po/box/cedex/recipe.js +2 -1
  453. package/out/recipes/po/box/cedex/recipe.js.map +1 -1
  454. package/out/recipes/po/box/cedex/sources.d.ts +8 -2
  455. package/out/recipes/po/box/cedex/sources.d.ts.map +1 -1
  456. package/out/recipes/po/box/cedex/sources.js +1 -1
  457. package/out/recipes/po/box/cedex/sources.js.map +1 -1
  458. package/out/recipes/scaffold.d.ts +28 -19
  459. package/out/recipes/scaffold.d.ts.map +1 -1
  460. package/out/recipes/scaffold.js +3 -2
  461. package/out/recipes/scaffold.js.map +1 -1
  462. package/out/recipes/sources.d.ts +1 -1
  463. package/out/recipes/sources.d.ts.map +1 -1
  464. package/out/recipes/sources.js +15 -2
  465. package/out/recipes/sources.js.map +1 -1
  466. package/out/recipes/street/bare.js +2 -2
  467. package/out/recipes/street/bare.js.map +1 -1
  468. package/out/recipes/street.d.ts.map +1 -1
  469. package/out/recipes/street.js +3 -1
  470. package/out/recipes/street.js.map +1 -1
  471. package/out/recipes/sub/venue/context.d.ts.map +1 -1
  472. package/out/recipes/sub/venue/context.js +2 -0
  473. package/out/recipes/sub/venue/context.js.map +1 -1
  474. package/out/recipes/sub/venue/render.js +1 -1
  475. package/out/recipes/sub/venue/render.js.map +1 -1
  476. package/out/recipes/sub/venue/sources.d.ts +6 -3
  477. package/out/recipes/sub/venue/sources.d.ts.map +1 -1
  478. package/out/recipes/sub/venue/sources.js +16 -20
  479. package/out/recipes/sub/venue/sources.js.map +1 -1
  480. package/out/recipes/sub/venue.d.ts +2 -5
  481. package/out/recipes/sub/venue.d.ts.map +1 -1
  482. package/out/recipes/sub/venue.js +10 -14
  483. package/out/recipes/sub/venue.js.map +1 -1
  484. package/out/recipes/trailing-region.d.ts.map +1 -1
  485. package/out/recipes/trailing-region.js +6 -1
  486. package/out/recipes/trailing-region.js.map +1 -1
  487. package/out/recipes/unit.js +2 -2
  488. package/out/recipes/unit.js.map +1 -1
  489. package/out/recipes/venue.d.ts +119 -0
  490. package/out/recipes/venue.d.ts.map +1 -0
  491. package/out/recipes/venue.js +245 -0
  492. package/out/recipes/venue.js.map +1 -0
  493. package/out/recipes.d.ts +1 -1
  494. package/out/recipes.d.ts.map +1 -1
  495. package/out/recipes.js +3 -1
  496. package/out/recipes.js.map +1 -1
  497. package/out/registers.d.ts +8 -6
  498. package/out/registers.d.ts.map +1 -1
  499. package/out/registers.js +8 -6
  500. package/out/registers.js.map +1 -1
  501. package/out/ro/adapters/retea-scolara/adapter.d.ts +5 -5
  502. package/out/ro/adapters/retea-scolara/adapter.js +5 -5
  503. package/out/ro/tools/fetch/retea-scolara.js +1 -1
  504. package/out/ro/tools/fetch/retea-scolara.js.map +1 -1
  505. package/out/runner.d.ts +3 -2
  506. package/out/runner.d.ts.map +1 -1
  507. package/out/runner.js +1 -1
  508. package/out/runner.js.map +1 -1
  509. package/out/sg/recipes/register.js +1 -1
  510. package/out/sg/recipes/register.js.map +1 -1
  511. package/out/sg/tools/fetch/acra.js +2 -2
  512. package/out/sg/tools/fetch/acra.js.map +1 -1
  513. package/out/sk/adapters/inspire/adapter.d.ts +5 -5
  514. package/out/sk/adapters/inspire/adapter.d.ts.map +1 -1
  515. package/out/sk/adapters/inspire/adapter.js +18 -18
  516. package/out/sk/adapters/inspire/adapter.js.map +1 -1
  517. package/out/sk/tools/fetch/inspire.d.ts +11 -10
  518. package/out/sk/tools/fetch/inspire.d.ts.map +1 -1
  519. package/out/sk/tools/fetch/inspire.js +15 -14
  520. package/out/sk/tools/fetch/inspire.js.map +1 -1
  521. package/out/source-register/effective-manifest.js +3 -3
  522. package/out/source-register/effective-manifest.js.map +1 -1
  523. package/out/source-register/register.d.ts +2 -2
  524. package/out/source-register/register.d.ts.map +1 -1
  525. package/out/source-register/register.js +2 -2
  526. package/out/source-register/register.js.map +1 -1
  527. package/out/source-register/training-manifest.d.ts +1 -1
  528. package/out/source-register/types.d.ts +12 -13
  529. package/out/source-register/types.d.ts.map +1 -1
  530. package/out/source-register/types.js +2 -2
  531. package/out/source-register/types.js.map +1 -1
  532. package/out/subvenue/promotions.d.ts +1 -1
  533. package/out/subvenue/promotions.js +1 -1
  534. package/out/subvenue/table.d.ts +4 -4
  535. package/out/subvenue/table.js +3 -3
  536. package/out/surfaces/locale.d.ts.map +1 -1
  537. package/out/surfaces/locale.js +2 -0
  538. package/out/surfaces/locale.js.map +1 -1
  539. package/out/synthesizers/anchor-absorption.d.ts +2 -1
  540. package/out/synthesizers/anchor-absorption.d.ts.map +1 -1
  541. package/out/synthesizers/anchor-absorption.js.map +1 -1
  542. package/out/synthesizers/boundary-stress.d.ts +1 -1
  543. package/out/synthesizers/boundary-stress.d.ts.map +1 -1
  544. package/out/synthesizers/boundary-stress.js +20 -23
  545. package/out/synthesizers/boundary-stress.js.map +1 -1
  546. package/out/synthesizers/house-venue.d.ts +3 -2
  547. package/out/synthesizers/house-venue.d.ts.map +1 -1
  548. package/out/synthesizers/house-venue.js +24 -26
  549. package/out/synthesizers/house-venue.js.map +1 -1
  550. package/out/synthesizers/no-street.d.ts.map +1 -1
  551. package/out/synthesizers/no-street.js.map +1 -1
  552. package/out/synthesizers/po-box.d.ts +4 -2
  553. package/out/synthesizers/po-box.d.ts.map +1 -1
  554. package/out/synthesizers/po-box.js.map +1 -1
  555. package/out/synthesizers/tail.d.ts +36 -0
  556. package/out/synthesizers/tail.d.ts.map +1 -0
  557. package/out/synthesizers/tail.js +32 -0
  558. package/out/synthesizers/tail.js.map +1 -0
  559. package/out/synthesizers/utils.d.ts +2 -1
  560. package/out/synthesizers/utils.d.ts.map +1 -1
  561. package/out/synthesizers/utils.js +17 -1
  562. package/out/synthesizers/utils.js.map +1 -1
  563. package/out/test-kit.js +2 -2
  564. package/out/test-kit.js.map +1 -1
  565. package/out/tools/audit.d.ts +2 -1
  566. package/out/tools/audit.d.ts.map +1 -1
  567. package/out/tools/audit.js +4 -3
  568. package/out/tools/audit.js.map +1 -1
  569. package/out/tools/corpus-stats.js +1 -1
  570. package/out/tools/corpus-stats.js.map +1 -1
  571. package/out/tools/fetch/atom.d.ts +8 -8
  572. package/out/tools/fetch/atom.d.ts.map +1 -1
  573. package/out/tools/fetch/atom.js +7 -8
  574. package/out/tools/fetch/atom.js.map +1 -1
  575. package/out/tools/fetch/cordis.d.ts +4 -3
  576. package/out/tools/fetch/cordis.d.ts.map +1 -1
  577. package/out/tools/fetch/cordis.js +9 -7
  578. package/out/tools/fetch/cordis.js.map +1 -1
  579. package/out/tools/fetch/download/manifest.d.ts.map +1 -1
  580. package/out/tools/fetch/download/manifest.js +2 -1
  581. package/out/tools/fetch/download/manifest.js.map +1 -1
  582. package/out/tools/fetch/download/network.d.ts +4 -4
  583. package/out/tools/fetch/download/retry.js +4 -4
  584. package/out/tools/fetch/download/retry.js.map +1 -1
  585. package/out/tools/fetch/geonames/dump.d.ts +3 -2
  586. package/out/tools/fetch/geonames/dump.d.ts.map +1 -1
  587. package/out/tools/fetch/geonames/dump.js +2 -1
  588. package/out/tools/fetch/geonames/dump.js.map +1 -1
  589. package/out/tools/fetch/geonames/postal.d.ts +2 -2
  590. package/out/tools/fetch/gleif.d.ts +3 -2
  591. package/out/tools/fetch/gleif.d.ts.map +1 -1
  592. package/out/tools/fetch/gleif.js +6 -4
  593. package/out/tools/fetch/gleif.js.map +1 -1
  594. package/out/tools/fetch/header.d.ts +7 -5
  595. package/out/tools/fetch/header.d.ts.map +1 -1
  596. package/out/tools/fetch/header.js +8 -6
  597. package/out/tools/fetch/header.js.map +1 -1
  598. package/out/tools/fetch/inspire-addresses.d.ts +32 -27
  599. package/out/tools/fetch/inspire-addresses.d.ts.map +1 -1
  600. package/out/tools/fetch/inspire-addresses.js +25 -24
  601. package/out/tools/fetch/inspire-addresses.js.map +1 -1
  602. package/out/tools/fetch/openaddresses.js +1 -1
  603. package/out/tools/fetch/openaddresses.js.map +1 -1
  604. package/out/tools/fetch/vlaanderen-ad.d.ts +5 -5
  605. package/out/tools/fetch/vlaanderen-ad.d.ts.map +1 -1
  606. package/out/tools/fetch/vlaanderen-ad.js +16 -16
  607. package/out/tools/fetch/vlaanderen-ad.js.map +1 -1
  608. package/out/tools/fetch/wfs-harvest.d.ts +26 -16
  609. package/out/tools/fetch/wfs-harvest.d.ts.map +1 -1
  610. package/out/tools/fetch/wfs-harvest.js +21 -18
  611. package/out/tools/fetch/wfs-harvest.js.map +1 -1
  612. package/out/tools/fetch.d.ts +0 -41
  613. package/out/tools/fetch.d.ts.map +1 -1
  614. package/out/tools/fetch.js +0 -41
  615. package/out/tools/fetch.js.map +1 -1
  616. package/out/tools/golden/expand.d.ts +7 -7
  617. package/out/tools/golden/expand.js +1 -1
  618. package/out/tools/golden/expand.js.map +1 -1
  619. package/out/tools/golden/promote.d.ts +2 -2
  620. package/out/tools/golden/promote.d.ts.map +1 -1
  621. package/out/tools/golden/promote.js +9 -6
  622. package/out/tools/golden/promote.js.map +1 -1
  623. package/out/tools/golden/relabel-street/directory.d.ts +4 -4
  624. package/out/tools/golden/relabel-street/directory.d.ts.map +1 -1
  625. package/out/tools/golden/relabel-street/directory.js +3 -2
  626. package/out/tools/golden/relabel-street/directory.js.map +1 -1
  627. package/out/tools/golden/relabel-street/row.d.ts +4 -3
  628. package/out/tools/golden/relabel-street/row.d.ts.map +1 -1
  629. package/out/tools/golden/relabel-street/row.js +3 -3
  630. package/out/tools/golden/relabel-street/row.js.map +1 -1
  631. package/out/tools/ingest-csv.js +3 -3
  632. package/out/tools/ingest-csv.js.map +1 -1
  633. package/out/tools/jsonl-to-parquet.d.ts +1 -1
  634. package/out/tools/lint/recipe-output/vocab.d.ts +10 -5
  635. package/out/tools/lint/recipe-output/vocab.d.ts.map +1 -1
  636. package/out/tools/lint/recipe-output/vocab.js.map +1 -1
  637. package/out/tools/lint/recipe-output.d.ts +8 -8
  638. package/out/tools/lint/recipe-output.d.ts.map +1 -1
  639. package/out/tools/lint/recipe-output.js +17 -0
  640. package/out/tools/lint/recipe-output.js.map +1 -1
  641. package/out/tools/overlay/kryptonite.d.ts +2 -2
  642. package/out/tools/overlay/kryptonite.d.ts.map +1 -1
  643. package/out/tools/overlay/kryptonite.js +2 -1
  644. package/out/tools/overlay/kryptonite.js.map +1 -1
  645. package/out/tools/overlay/manifest.d.ts +2 -1
  646. package/out/tools/overlay/manifest.d.ts.map +1 -1
  647. package/out/tools/overlay/manifest.js +2 -1
  648. package/out/tools/overlay/manifest.js.map +1 -1
  649. package/out/tools/overlay/merge-source.d.ts +2 -1
  650. package/out/tools/overlay/merge-source.d.ts.map +1 -1
  651. package/out/tools/overlay/merge-source.js.map +1 -1
  652. package/out/tools/overlay/split-slice.d.ts +1 -1
  653. package/out/tools/overlay/split-slice.js +1 -1
  654. package/out/tools/overlay/split-slice.js.map +1 -1
  655. package/out/tools/overlay/translit.d.ts +4 -3
  656. package/out/tools/overlay/translit.d.ts.map +1 -1
  657. package/out/tools/overlay/translit.js +2 -1
  658. package/out/tools/overlay/translit.js.map +1 -1
  659. package/out/tools/overture-subvenue.d.ts +1 -1
  660. package/out/tools/overture-subvenue.d.ts.map +1 -1
  661. package/out/tools/postcode-triples.d.ts +1 -1
  662. package/out/tools/postcode-triples.d.ts.map +1 -1
  663. package/out/tools/postcode-triples.js +4 -3
  664. package/out/tools/postcode-triples.js.map +1 -1
  665. package/out/tools/source-register/build.d.ts +10 -8
  666. package/out/tools/source-register/build.d.ts.map +1 -1
  667. package/out/tools/source-register/build.js +10 -8
  668. package/out/tools/source-register/build.js.map +1 -1
  669. package/out/tools/sub/venue/lexicon.d.ts +2 -6
  670. package/out/tools/sub/venue/lexicon.d.ts.map +1 -1
  671. package/out/tools/sub/venue/lexicon.js +2 -6
  672. package/out/tools/sub/venue/lexicon.js.map +1 -1
  673. package/out/tw/tools/fetch/gcis.js +3 -3
  674. package/out/tw/tools/fetch/gcis.js.map +1 -1
  675. package/out/types.d.ts +4 -3
  676. package/out/types.d.ts.map +1 -1
  677. package/out/types.js.map +1 -1
  678. package/out/us/adapters/state/hi-schools/workbook.d.ts +1 -1
  679. package/out/us/adapters/state/hi-schools/workbook.d.ts.map +1 -1
  680. package/out/us/adapters/state/hi-schools/workbook.js.map +1 -1
  681. package/out/us/adapters/usgov/nad/adapter.js +6 -6
  682. package/out/us/adapters/usgov/nad/adapter.js.map +1 -1
  683. package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js +2 -2
  684. package/out/us/adapters/usgov/samhsa-treatment-locator/adapter.js.map +1 -1
  685. package/out/us/fips-state.d.ts +2 -2
  686. package/out/us/fips-state.d.ts.map +1 -1
  687. package/out/us/fips-state.js.map +1 -1
  688. package/out/us/synthesizers/intersection.d.ts.map +1 -0
  689. package/out/{synthesizers → us/synthesizers}/intersection.js +13 -9
  690. package/out/us/synthesizers/intersection.js.map +1 -0
  691. package/out/{synthesizers → us/synthesizers}/street.d.ts +3 -2
  692. package/out/us/synthesizers/street.d.ts.map +1 -0
  693. package/out/{synthesizers → us/synthesizers}/street.js +12 -12
  694. package/out/us/synthesizers/street.js.map +1 -0
  695. package/out/us/tools/fetch/imls-pls.js +1 -1
  696. package/out/us/tools/fetch/imls-pls.js.map +1 -1
  697. package/out/us/tools/fetch/nad.d.ts +6 -6
  698. package/out/us/tools/fetch/nad.js +1 -1
  699. package/out/us/tools/fetch/nad.js.map +1 -1
  700. package/out/us/tools/fetch/nppes.js +3 -3
  701. package/out/us/tools/fetch/nppes.js.map +1 -1
  702. package/out/us/tools/fetch/state/hi-schools.d.ts +2 -1
  703. package/out/us/tools/fetch/state/hi-schools.d.ts.map +1 -1
  704. package/out/us/tools/fetch/state/hi-schools.js +1 -1
  705. package/out/us/tools/fetch/state/hi-schools.js.map +1 -1
  706. package/out/us/tools/fetch/tiger-full.js +1 -1
  707. package/out/us/tools/fetch/tiger-full.js.map +1 -1
  708. package/out/utils/align.d.ts +5 -3
  709. package/out/utils/align.d.ts.map +1 -1
  710. package/out/utils/align.js +5 -5
  711. package/out/utils/align.js.map +1 -1
  712. package/out/utils/golden.js +2 -2
  713. package/out/utils/golden.js.map +1 -1
  714. package/out/utils/license.d.ts +3 -3
  715. package/out/utils/license.d.ts.map +1 -1
  716. package/out/utils/license.js.map +1 -1
  717. package/out/utils/split.d.ts +1 -1
  718. package/out/utils/split.d.ts.map +1 -1
  719. package/out/utils/split.js +18 -14
  720. package/out/utils/split.js.map +1 -1
  721. package/out/utils/tokenize.d.ts +3 -20
  722. package/out/utils/tokenize.d.ts.map +1 -1
  723. package/out/utils/tokenize.js.map +1 -1
  724. package/out/utils/wof-json.js +3 -3
  725. package/out/utils/wof-json.js.map +1 -1
  726. package/package.json +18 -27
  727. package/lib/tools.ts +0 -31
  728. package/out/synthesizers/intersection.d.ts.map +0 -1
  729. package/out/synthesizers/intersection.js.map +0 -1
  730. package/out/synthesizers/street.d.ts.map +0 -1
  731. package/out/synthesizers/street.js.map +0 -1
  732. package/out/tools.d.ts +0 -31
  733. package/out/tools.d.ts.map +0 -1
  734. package/out/tools.js +0 -31
  735. package/out/tools.js.map +0 -1
  736. /package/out/{synthesizers → us/synthesizers}/intersection.d.ts +0 -0
@@ -12,15 +12,15 @@
12
12
  * this WFS as the theme's only distributions and states one condition of use, `Neuplatňujú sa žiadne
13
13
  * podmienky (CC0 Voľné dielo)`, which the address-source register elected. There is no INSPIRE ATOM
14
14
  * download service for this theme: the feeds under `inspirews.skgeodesy.sk` belong to the
15
- * Geodetický a kartografický ústav, which is a different publisher and a different record.
15
+ * Geodetický a kartografický ústav. That is a different publisher and a different record.
16
16
  *
17
17
  * `#tools/fetch/wfs-harvest` owns the page read, the appending, the manifest and the resumption.
18
18
  * What is particular to Slovakia is that an address is assembled from five feature types rather
19
- * than read from one, which is what shapes the layout this writes.
19
+ * than read from one. That shapes the layout this writes.
20
20
  *
21
21
  * ## Five types, five documents, one directory
22
22
  *
23
- * `ad:Address` carries a locator and references its street, its settlement part, its administrative
23
+ * `ad:Address` has a locator and references its street, its settlement part, its administrative
24
24
  * units and its postcode through `ad:component`. The adapter resolves those references locally
25
25
  * against an index it builds in a first pass over every document in `inputPath`, so every type has
26
26
  * to be on disk before the first address is composed. Measured 2026-10-03, `resultType=hits` past
@@ -51,7 +51,7 @@
51
51
  *
52
52
  * `CountDefault` is 5000 and no type reports 5000 features, so `statedFeatureCount` accepts each
53
53
  * type's `numberMatched` as a count rather than refusing it as a page cap. The register records one
54
- * response in nine that carried no `numberMatched` attribute at all;
54
+ * response in nine with no `numberMatched` attribute at all.
55
55
  * `readCheckedWFSFeatureCount` reads such a response as no usable count, and the harvest then ends
56
56
  * on the first page that returns no features instead of recording a wrong total.
57
57
  */
@@ -80,16 +80,18 @@ import {
80
80
  export const SK_INSPIRE_WFS = "https://rageo.minv.sk/geoserver/ad/wfs"
81
81
 
82
82
  /**
83
- * The output format the harvest asks for, which is the GML the adapter's markup reader takes.
83
+ * The output format the harvest asks for.
84
+ * It is the GML the adapter's markup reader takes.
84
85
  */
85
86
  export const SK_INSPIRE_OUTPUT_FORMAT = "application/gml+xml; version=3.2"
86
87
 
87
88
  /**
88
89
  * The property the pages are ordered by.
89
90
  *
90
- * Every AD feature type carries `ad:inspireId`, so one sort serves all five.
91
+ * Every AD feature type has `ad:inspireId`, so one sort serves all five.
91
92
  * Without a sort, a resumed harvest would rest on the service returning the same
92
- * features in the same order as the earlier run, which no WFS guarantees.
93
+ * features in the same order as the earlier run.
94
+ * No WFS guarantees that.
93
95
  */
94
96
  export const SK_INSPIRE_SORT_BY = "ad:inspireId"
95
97
 
@@ -193,9 +195,8 @@ export async function readSKInspireCapabilities(client: Pick<APIClient, "fetch">
193
195
  /**
194
196
  * The count the service states for one type, with how it was obtained.
195
197
  *
196
- * `statedFeatureCount` carries no count forward where the reported number equals
197
- * the advertised page cap, because such a number describes the largest page the
198
- * service will serve rather than what the type holds.
198
+ * `statedFeatureCount` withholds a count where the reported number equals the advertised page cap,
199
+ * because such a number describes the largest page the service will serve rather than what the type holds.
199
200
  * This service's cap is 5000 and no type reports 5000.
200
201
  */
201
202
  export async function readSKInspireFeatureCount(
@@ -259,7 +260,7 @@ export async function harvestSKInspireType(
259
260
 
260
261
  options.report?.(` ${type}: ${featureCount.count ?? "no stated count"} — ${featureCount.because}`)
261
262
 
262
- return await harvestPagedWFS({
263
+ return harvestPagedWFS({
263
264
  context: `${CONTEXT} ${typeName}`,
264
265
  source: SLUG,
265
266
  outputDir: options.outputDir,
@@ -271,8 +272,8 @@ export async function harvestSKInspireType(
271
272
  sortBy: SK_INSPIRE_SORT_BY,
272
273
  },
273
274
  license: SK_INSPIRE_DEFAULT_LICENSE,
274
- // The elected statement names no attribution clause.
275
- // Crediting the Ministerstvo vnútra SR stays good practice.
275
+ // The elected statement has no attribution clause.
276
+ // Attribution to the Ministerstvo vnútra SR stays good practice.
276
277
  attribution: "",
277
278
  featureCount,
278
279
  pageSize,
@@ -377,7 +378,7 @@ export async function fetchSKInspire(
377
378
  )
378
379
  }
379
380
 
380
- return await harvestSKInspireType(client, {
381
+ return harvestSKInspireType(client, {
381
382
  outputDir: options.outRoot(SLUG, type),
382
383
  typeName,
383
384
  type,
@@ -380,11 +380,11 @@ export function readConfigView(text: string): EffectiveConfigView {
380
380
 
381
381
  const indent = /^[\t ]*/.exec(raw)![0].length
382
382
 
383
- if (field !== null && indent <= fieldIndent) {
383
+ if (field && indent <= fieldIndent) {
384
384
  field = null
385
385
  }
386
386
 
387
- if (field === null) {
387
+ if (!field) {
388
388
  const opener = /^([\t ]*)(source_weights|augment_exclude_sources):\s*(#.*)?$/.exec(raw)
389
389
 
390
390
  if (opener) {
@@ -627,7 +627,7 @@ export function provenanceRefusals(input: {
627
627
  )
628
628
  }
629
629
 
630
- if (input.declared === null) {
630
+ if (!input.declared) {
631
631
  refusals.push(
632
632
  `${input.packageName}: whether its declared provenance equals the ${input.manifest.trainingSources.length} ` +
633
633
  `source(s) the audited epoch drew from is unmeasured. The model card states its attribution as prose ` +
@@ -53,10 +53,10 @@ const ADDRESS_ROLES = new Set<string>(Object.values(AddressRole))
53
53
  /**
54
54
  * Returns the license label that the exclude filter in `@mailwoman/corpus/utils/license` matches by prefix.
55
55
  *
56
- * The function returns `undefined` until someone has elected terms for the decision.
56
+ * The function returns `null` until someone has elected terms for the decision.
57
57
  */
58
- export function electedLicenseLabel(decision: LicenseDecision): string | undefined {
59
- if (decision.state !== LicenseReviewState.Elected) return undefined
58
+ export function electedLicenseLabel(decision: LicenseDecision): string | null {
59
+ if (decision.state !== LicenseReviewState.Elected) return null
60
60
 
61
61
  return decision.spdx ?? decision.electedTerms
62
62
  }
@@ -70,7 +70,7 @@ export interface TrainingManifest {
70
70
  * left out as well as what went in.
71
71
  *
72
72
  * Each key is `<adapter id>:<ISO 3166-1 alpha-2>`, the pair that addresses one register source,
73
- * because one adapter can emit several jurisdictions and each carries its own license decision.
73
+ * because one adapter can emit several jurisdictions and each has its own license decision.
74
74
  */
75
75
  refused: Record<string, readonly string[]>
76
76
  totalRows: number
@@ -179,8 +179,8 @@ export const ResearchPass = {
179
179
  */
180
180
  RightsReview: "2026-09-30-rights-review",
181
181
  /**
182
- * The decoder-exposure survey, which recorded the authoritative address source of
183
- * each jurisdiction the exposure arc admits through OpenStreetMap.
182
+ * The decoder-exposure survey recorded the authoritative address source of each
183
+ * jurisdiction the exposure arc admits through OpenStreetMap.
184
184
  * It located each authority and did not read its terms.
185
185
  */
186
186
  DecoderExposureSurvey: "2026-10-03-decoder-exposure",
@@ -347,13 +347,14 @@ export interface ElectedLicense {
347
347
  * Every grant the publisher states, where its surfaces state more than one.
348
348
  *
349
349
  * A publisher may state different terms in its dataset metadata, its download service
350
- * and its website, and it may be offering the same material under more than
351
- * one license, which Creative Commons permits.
350
+ * and its website, and it may be offering the same material under more than one license.
351
+ * Creative Commons permits that.
352
+ *
352
353
  * Where that happens, {@linkcode ElectedLicense.spdx} records the one a build filters on
353
354
  * and this records what the publisher actually said, so a later reviewer reads
354
355
  * the conflict rather than one reading presented as settled.
355
356
  *
356
- * Electing the strictest grant is an engineering policy for deciding what a released corpus may carry.
357
+ * The engineering policy elects the strictest grant for what a released corpus may include.
357
358
  * It does not establish which grant governs, and `electedBecause` states
358
359
  * the substantive ground separately.
359
360
  */
@@ -498,16 +499,15 @@ export interface AddressSourceRecord {
498
499
  sourceURL?: string
499
500
  note?: string
500
501
  /**
501
- * The role each of the source's address columns carries, keyed by that
502
- * column's path in the published record.
502
+ * The role of each source address column, keyed by that column's path in the published record.
503
503
  *
504
504
  * A source is ineligible for ingest until at least one column has a role.
505
- * One role per source cannot describe a publication that carries two roles on one record:
505
+ * One role per source cannot describe a publication that has two roles on one record:
506
506
  * AusTender's OCDS release gives a supplier address and a procuring-entity address on
507
507
  * every contracting process, and Taiwan's GCIS register gives a registered company address
508
508
  * and a tax-office business address in separate columns.
509
509
  *
510
- * A source whose every address carries one role records one entry keyed by the field that holds it.
510
+ * A source whose every address has one role records one entry keyed by the field that holds it.
511
511
  */
512
512
  addressRoles?: Readonly<Record<string, AddressRole>>
513
513
  /**
@@ -529,15 +529,14 @@ export interface AddressSourceRecord {
529
529
  /**
530
530
  * The id of the corpus adapter that emits this source's rows.
531
531
  *
532
- * A corpus row carries its adapter's id in `source` and its jurisdiction in `country`,
533
- * and the register scopes a source to one publisher in one jurisdiction,
534
- * so that pair addresses one record here.
532
+ * A corpus row has its adapter's id in `source` and its jurisdiction in `country`, and the register
533
+ * scopes a source to one publisher in one jurisdiction, so that pair addresses one record here.
535
534
  * One adapter can serve several records: the `ban` reader emits eleven jurisdictions
536
535
  * from one schema, and each is its own source under its own license decision.
537
536
  *
538
537
  * A source that declares no adapter produces no rows, so a build sees zero rows
539
538
  * under it and has none to admit or refuse.
540
- * Declaring one is what lets `readSourceEligibility` answer for a row at all.
539
+ * An adapter id is what lets `readSourceEligibility` answer for a row at all.
541
540
  */
542
541
  adapterID?: string
543
542
  }
@@ -60,7 +60,7 @@ export interface SubVenuePromotion {
60
60
  * This ledger is the only input that sets `curated: true` on a machine-derived surface.
61
61
  * Rejections stay in the ledger so the system can reject duplicate proposals until new evidence arrives.
62
62
  *
63
- * The span proposer in `packages/neural/lib/venue-structure.ts` ships its English designators
63
+ * The span proposer in `packages/neural/lib/venue/structure.ts` ships its English designators
64
64
  * without a locale gate, so a rejection here guides recipes only and does not stop the proposer.
65
65
  */
66
66
  export const SUBVENUE_PROMOTIONS: readonly SubVenuePromotion[] = [
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * @file The sub-venue lexicon's record schema and the shipped vocabulary it is seeded from.
7
7
  *
8
- * The seeds mirror `neural/venue-structure.ts`. `@mailwoman/corpus` has no dependency on `@mailwoman/neural`,
8
+ * The seeds mirror `neural/venue/structure.ts`. `@mailwoman/corpus` has no dependency on `@mailwoman/neural`,
9
9
  * so this file declares the shipped vocabulary locally. `sub-venue-lexicon.test.ts` pins the seed values
10
10
  * and fails when either copy changes.
11
11
  */
@@ -39,7 +39,7 @@ export interface SubVenueDesignator {
39
39
  /**
40
40
  * Canonical id, lowercase English.
41
41
  *
42
- * It matches `neural/venue-structure.ts`'s `VENUE_STRUCTURE_DESIGNATORS` wherever the two overlap.
42
+ * It matches `neural/venue/structure.ts`'s `VENUE_STRUCTURE_DESIGNATORS` wherever the two overlap.
43
43
  */
44
44
  id: string
45
45
  tier: LexiconTier
@@ -186,7 +186,7 @@ export interface SubVenueLexiconTable {
186
186
  }
187
187
 
188
188
  /**
189
- * The vocabulary that already ships in `neural/venue-structure.ts`, re-declared
189
+ * The vocabulary that already ships in `neural/venue/structure.ts`, re-declared
190
190
  * below for the module docstring's dependency-direction reason.
191
191
  *
192
192
  * `tier` is added here: the seven WOF placetypes plus `terminal`/`gate` are all venue-interior,
@@ -210,7 +210,7 @@ export const SHIPPED_DESIGNATOR_SEED: ReadonlyArray<{
210
210
  ]
211
211
 
212
212
  /**
213
- * The shipped positional modifiers, re-declared from `neural/venue-structure.ts`'s `VENUE_STRUCTURE_MODIFIERS`.
213
+ * The shipped positional modifiers, re-declared from `neural/venue/structure.ts`'s `VENUE_STRUCTURE_MODIFIERS`.
214
214
  */
215
215
  export const SHIPPED_MODIFIER_SEED: readonly string[] = [
216
216
  "central",
@@ -125,6 +125,8 @@ const LOCALE_TAG: Record<string, string> = {
125
125
  * Other countries pass through unchanged.
126
126
  */
127
127
  function normalizePostcode(postcode: string, country: string): string {
128
+ // country-branch: the NL postcode is the one whose source spells it without the space the layout writes.
129
+ // The codex postal regimes' canonical spacing per country would replace this.
128
130
  if (country === "NL") {
129
131
  const m = /^(\d{4})\s*([A-Za-z]{2})$/.exec(postcode)
130
132
 
@@ -52,7 +52,8 @@ export interface AnchorAbsorptionSynthesisOpts {
52
52
  * Real US ZIP codes from the postcode-anchor lookup.
53
53
  *
54
54
  * The templates place them where the anchor fires on a token that is really a house number.
55
- * The default is the postcodes of the built-in US tuples.
55
+ *
56
+ * @defaultValue the postcodes of the built-in US tuples.
56
57
  */
57
58
  realZips?: ReadonlyArray<string>
58
59
  }
@@ -10,9 +10,11 @@
10
10
  synthesizer draws from is `US_TUPLES`, a hardcoded US list. The comma-less arm deliberately malforms that order.
11
11
  A layout cannot express it. The arm stresses the segmentation cue created by commas. */
12
12
 
13
+ import { countryDisplayNames } from "@mailwoman/codex/country/display-names"
13
14
  import type { DirectionalAbbreviation } from "@mailwoman/codex/us"
14
15
  import { sample } from "@mailwoman/core/random"
15
16
 
17
+ import { layoutAdminTail } from "#synthesizers/tail"
16
18
  import type { CanonicalRow } from "#types"
17
19
 
18
20
  /* oxlint-disable sister-software/no-unnamed-threshold -- the bare decimals below are weighted-sampler
@@ -328,7 +330,7 @@ const ALL_TEMPLATES: readonly BoundaryStressTemplate[] = [
328
330
  * When `base` is absent, the function samples a built-in US or French tuple that suits the template.
329
331
  */
330
332
  export function synthesizeBoundaryStressRow(
331
- base: BoundaryStressBaseTuple | undefined,
333
+ base: BoundaryStressBaseTuple | null,
332
334
  opts: BoundaryStressSynthesisOpts = {}
333
335
  ): SynthesizedBoundaryStressRow {
334
336
  const random = opts.random ?? Math.random
@@ -339,38 +341,30 @@ export function synthesizeBoundaryStressRow(
339
341
  const venue = random() < 0.45 ? sample(VENUES, random) : ""
340
342
  const withCountry = random() < 0.12
341
343
 
342
- if (b.country === "FR") {
343
- const core = `${b.postcode} ${b.locality}${withCountry ? ", France" : ""}`
344
-
345
- return {
346
- raw: venue ? `${venue}, ${core}` : core,
347
- components: {
348
- ...(venue ? { venue } : {}),
349
- postcode: b.postcode,
350
- locality: b.locality,
351
- ...(withCountry ? { country: "France" } : {}),
352
- },
353
- locale: "fr-FR",
354
- template,
355
- }
356
- }
357
-
358
344
  const withZip = random() < 0.5
359
- const comma = random() < 0.6 ? "," : ""
360
- // The base corpus labels this spelling as country.
361
- const countryName = "United States"
362
- const core = `${b.locality}${comma} ${b.region}${withZip ? ` ${b.postcode}` : ""}${withCountry ? `, ${countryName}` : ""}`
345
+ const comma = random() < 0.6
346
+ // The base corpus labels these spellings as country.
347
+ const countryName = countryDisplayNames(b.country, ["en"])[0] ?? b.country
348
+
349
+ // The layout renders the tail in the country's order: `75005 Paris` for FR
350
+ // and `Boston, MA 02116` for the US.
351
+ // Dropping the layout's commas is a surface perturbation that applies to any country.
352
+ const tail = layoutAdminTail(b.country, {
353
+ locality: b.locality,
354
+ region: b.region,
355
+ postcode: withZip ? b.postcode : undefined,
356
+ country: withCountry ? countryName : undefined,
357
+ })
358
+
359
+ const core = tail ? (comma ? tail.raw : tail.raw.replaceAll(", ", " ")) : b.locality
363
360
 
364
361
  return {
365
362
  raw: venue ? `${venue}, ${core}` : core,
366
363
  components: {
367
364
  ...(venue ? { venue } : {}),
368
- locality: b.locality,
369
- region: b.region,
370
- ...(withZip ? { postcode: b.postcode } : {}),
371
- ...(withCountry ? { country: countryName } : {}),
365
+ ...(tail ? tail.components : { locality: b.locality }),
372
366
  },
373
- locale: "en-US",
367
+ locale: localeFor[b.country] ?? "en-US",
374
368
  template,
375
369
  }
376
370
  }
@@ -6,10 +6,9 @@
6
6
  * Generates addresses in which a house number, a street and a venue appear together.
7
7
  */
8
8
 
9
- /* oxlint-disable mailwoman/prefer-home -- the four admin tails below are hand-written per country on purpose. */
10
-
11
9
  import { sample } from "@mailwoman/core/random"
12
10
 
11
+ import { layoutAdminTail } from "#synthesizers/tail"
13
12
  import { countryToLocale } from "#synthesizers/utils"
14
13
  import type { CanonicalRow } from "#types"
15
14
 
@@ -172,10 +171,11 @@ const COUNTRY_SURFACES: Readonly<Record<string, ReadonlyArray<string>>> = {
172
171
  }
173
172
 
174
173
  /**
175
- * Synthesizes one row with a house number, a street, a venue and the tuple's locality and postcode.
174
+ * Synthesizes one row with a house number, a street, a venue and the tuple's admin tail,
175
+ * rendered through the country's codex layout.
176
+ * A country with no layout yields `null`.
176
177
  *
177
178
  * GB rows sometimes use British venue names and ranged house numbers.
178
- * FR and GB rows omit the region.
179
179
  */
180
180
  export function synthesizeHouseVenueRow(
181
181
  base: HouseVenueBaseTuple,
@@ -185,54 +185,50 @@ export function synthesizeHouseVenueRow(
185
185
  const locale = countryToLocale(base.country)
186
186
  const template = opts.forceTemplate ?? (random() < 0.5 ? "venue-after-street" : "venue-before-street")
187
187
 
188
- const frOrder = base.country === "FR"
189
- const gbOrder = base.country === "GB"
190
- const veOrder = base.country === "VE"
188
+ // country-branch: the British venue pool and the ranged house number are GB English data.
189
+ // A per-country venue pool from the Overture names file would replace the branch.
190
+ const gbPools = base.country === "GB"
191
191
 
192
- const venue = gbOrder && random() < GB_VENUE_POOL_RATE ? sample(GB_VENUES, random) : sample(PLAIN_VENUES, random)
192
+ const venue = gbPools && random() < GB_VENUE_POOL_RATE ? sample(GB_VENUES, random) : sample(PLAIN_VENUES, random)
193
193
  const street = base.street ?? sample(FALLBACK_STREETS, random)
194
194
  let houseNumber = base.houseNumber ?? randomHouseNumber(random)
195
195
 
196
- if (gbOrder && random() < GB_RANGE_NUMBER_RATE && /^\d+$/.test(houseNumber)) {
196
+ if (gbPools && random() < GB_RANGE_NUMBER_RATE && /^\d+$/.test(houseNumber)) {
197
197
  const start = Number.parseInt(houseNumber, 10)
198
198
  const span = (1 + Math.floor(random() * 4)) * 2
199
199
 
200
200
  houseNumber = `${start}-${start + span}`
201
201
  }
202
202
 
203
- const components: CanonicalRow["components"] = {
204
- house_number: houseNumber,
205
- street,
206
- venue,
203
+ const countrySurfaces = COUNTRY_SURFACES[base.country]
204
+ const countrySurface = countrySurfaces && random() < COUNTRY_APPEND_RATE ? sample(countrySurfaces, random) : undefined
205
+
206
+ // The layout decides the tail's order and which parts it prints: FR prints no region,
207
+ // VE keeps the region after the postcode, GB puts the postcode after the locality.
208
+ const tail = layoutAdminTail(base.country, {
207
209
  locality: base.locality,
208
- ...(frOrder || gbOrder ? {} : { region: base.region }),
210
+ region: base.region,
209
211
  postcode: base.postcode,
210
- }
211
-
212
- let tail = frOrder
213
- ? `${base.postcode} ${base.locality}`
214
- : gbOrder
215
- ? `${base.locality} ${base.postcode}`
216
- : veOrder
217
- ? `${base.locality} ${base.postcode}, ${base.region}`
218
- : `${base.locality}, ${base.region} ${base.postcode}`
212
+ country: countrySurface,
213
+ })
219
214
 
220
- const countrySurfaces = COUNTRY_SURFACES[base.country]
215
+ if (!tail) return null
221
216
 
222
- if (countrySurfaces && random() < COUNTRY_APPEND_RATE) {
223
- const countrySurface = sample(countrySurfaces, random)
224
- components.country = countrySurface
225
- tail = `${tail}, ${countrySurface}`
217
+ const components: CanonicalRow["components"] = {
218
+ house_number: houseNumber,
219
+ street,
220
+ venue,
221
+ ...tail.components,
226
222
  }
227
223
 
228
224
  let raw: string
229
225
 
230
226
  switch (template) {
231
227
  case "venue-after-street":
232
- raw = `${houseNumber} ${street}, ${venue}, ${tail}`
228
+ raw = `${houseNumber} ${street}, ${venue}, ${tail.raw}`
233
229
  break
234
230
  case "venue-before-street":
235
- raw = `${venue}, ${houseNumber} ${street}, ${tail}`
231
+ raw = `${venue}, ${houseNumber} ${street}, ${tail.raw}`
236
232
  break
237
233
  }
238
234
 
@@ -8,7 +8,8 @@
8
8
  * street-like words. Output components never include street-side tags.
9
9
  */
10
10
 
11
- import { type ComponentDict, formatAddressRow } from "@mailwoman/codex/address/format"
11
+ import { formatAddressRow } from "@mailwoman/codex/address/format"
12
+ import type { ComponentDict } from "@mailwoman/codex/address/render"
12
13
  import { countryCodeForTable } from "@mailwoman/codex/country"
13
14
  import { sample } from "@mailwoman/core/random"
14
15
 
@@ -6,7 +6,8 @@
6
6
  * Generates localized PO-box and private-mailbox rows in which the designator and number form one `po_box` span.
7
7
  */
8
8
 
9
- import { type ComponentDict, formatAddressRow } from "@mailwoman/codex/address/format"
9
+ import { formatAddressRow } from "@mailwoman/codex/address/format"
10
+ import type { ComponentDict } from "@mailwoman/codex/address/render"
10
11
  import { countryCodeForTable } from "@mailwoman/codex/country"
11
12
  import { sample } from "@mailwoman/core/random"
12
13
 
@@ -140,7 +141,8 @@ export interface SynthesizedPoBoxRow {
140
141
  export interface PoBoxSynthesisOpts {
141
142
  /**
142
143
  * The random source.
143
- * It defaults to `Math.random`.
144
+ *
145
+ * @defaultValue `Math.random`
144
146
  */
145
147
  random?: () => number
146
148
  /**
@@ -151,7 +153,8 @@ export interface PoBoxSynthesisOpts {
151
153
  pickNumber?: (random: () => number) => string
152
154
  /**
153
155
  * The probability of a private-mailbox row when the locale and tuple allow one.
154
- * The default is 0.
156
+ *
157
+ * @defaultValue `0`
155
158
  */
156
159
  pmbRatio?: number
157
160
  }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Renders the admin tail of a synthesized row through the country's codex address layout, so a
7
+ * synthesizer writes `Chicago, IL 60613`, `75005 Paris`, `London, EC3N 1DE` or
8
+ * `Maracaibo 4001, Zulia` from one call rather than from a template per country.
9
+ *
10
+ * The layout decides which parts print: the FR layout prints no region, so a FR tail carries none
11
+ * and the returned components say so. The lines the layout writes are joined with the country's
12
+ * line join, which is the one-line form the corpus rows take.
13
+ */
14
+
15
+ import { formatAddressRow } from "@mailwoman/codex/address/format"
16
+ import { lineJoinForCountry } from "@mailwoman/codex/address/layouts"
17
+ import type { ComponentDict } from "@mailwoman/codex/address/render"
18
+
19
+ /**
20
+ * The admin parts a synthesizer has for a row.
21
+ */
22
+ export interface AdminTailParts {
23
+ locality?: string
24
+ region?: string
25
+ postcode?: string
26
+ country?: string
27
+ }
28
+
29
+ /**
30
+ * A rendered tail and the parts the layout printed, with the caller's values.
31
+ */
32
+ export interface RenderedTail {
33
+ raw: string
34
+ components: ComponentDict
35
+ }
36
+
37
+ /**
38
+ * Renders the admin parts through the layout of `country`, or returns `null`
39
+ * when the codex has no layout for the country or the layout prints none of the parts.
40
+ */
41
+ export function layoutAdminTail(country: string, parts: AdminTailParts): RenderedTail | null {
42
+ const components: ComponentDict = {}
43
+
44
+ for (const [tag, value] of Object.entries(parts) as Array<[keyof AdminTailParts, string | undefined]>) {
45
+ if (value?.trim()) {
46
+ components[tag] = value
47
+ }
48
+ }
49
+
50
+ const row = formatAddressRow(components, country)
51
+
52
+ if (!row || !row.raw.trim()) return null
53
+
54
+ return { raw: row.raw.replaceAll("\n", lineJoinForCountry(country)), components: row.components }
55
+ }