@mailwoman/corpus 10.6.0 → 10.7.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 (223) hide show
  1. package/data/PROVENANCE.md +24 -0
  2. package/data/address-source-register.json +18948 -8757
  3. package/data/corpus-source-inputs.json +4756 -0
  4. package/data/license-decisions.json +7260 -0
  5. package/data/licenses/whosonfirst-licenses.md +3 -2
  6. package/data/reviewed-ve-postcode-tuples.json +5 -72
  7. package/data/source-additions.json +2450 -0
  8. package/data/source-resolutions.json +87 -0
  9. package/data/training-manifests/v0.7.10-gb-county.effective.json +2335 -0
  10. package/data/training-manifests/v0.7.10-gb-county.json +1132 -0
  11. package/data/training-manifests/v0.7.2-address-systems.effective.json +3 -2
  12. package/data/training-manifests/v0.7.7-no-ppd.json +550 -0
  13. package/data/training-manifests/v0.7.8-rights-clean.json +538 -0
  14. package/data/training-manifests/v0.7.9-country-gap.json +1132 -0
  15. package/data/us-situs-sources.json +128 -0
  16. package/lib/adapters/cordis/adapter.ts +1 -1
  17. package/lib/adapters/libpostal-dictionary.ts +23 -3
  18. package/lib/adapters/osm/adapter.ts +42 -11
  19. package/lib/adapters.ts +14 -0
  20. package/lib/az/adapters/opendata/adapter.ts +389 -0
  21. package/lib/bs/adapters/gbpa/adapter.ts +248 -0
  22. package/lib/build/types.ts +16 -0
  23. package/lib/build.ts +21 -0
  24. package/lib/ee/adapters/ads/adapter.ts +18 -0
  25. package/lib/fo/adapters/adressur/adapter.ts +242 -0
  26. package/lib/gb/adapters/os-open/adapter.ts +12 -0
  27. package/lib/gb/county.ts +59 -0
  28. package/lib/gb/os-open/open/names.ts +41 -0
  29. package/lib/gu/adapters/bsp/adapter.ts +434 -0
  30. package/lib/im/adapters/land-registry/adapter.ts +340 -0
  31. package/lib/international/recipes/locale.ts +164 -19
  32. package/lib/li/adapters/llv/adapter.ts +246 -0
  33. package/lib/recipes/bare/postcode.ts +10 -34
  34. package/lib/recipes/country-balanced.ts +95 -78
  35. package/lib/recipes/intersection.ts +22 -30
  36. package/lib/recipes/po/box/cedex/recipe.ts +8 -5
  37. package/lib/recipes/po/box/cedex/sources.ts +2 -23
  38. package/lib/recipes/scaffold.ts +28 -3
  39. package/lib/recipes/sources.ts +112 -1
  40. package/lib/recipes/street/affix.ts +17 -29
  41. package/lib/recipes/sub/venue/context.ts +33 -9
  42. package/lib/recipes/sub/venue/sources.ts +54 -13
  43. package/lib/recipes/sub/venue.ts +68 -23
  44. package/lib/recipes/unit.ts +20 -7
  45. package/lib/registers.ts +33 -0
  46. package/lib/source-register/corpus-inputs.ts +528 -0
  47. package/lib/source-register/effective-manifest.ts +37 -5
  48. package/lib/source-register/types.ts +20 -0
  49. package/lib/south-asia/recipes/register.ts +1 -1
  50. package/lib/tools/overlay/manifest.ts +109 -1
  51. package/lib/tools/source-register/build.ts +47 -1
  52. package/lib/tools/variety-sample.ts +633 -0
  53. package/lib/us/adapters/usgov/nad/adapter.ts +39 -10
  54. package/lib/us/recipes/skeleton-sources.ts +156 -0
  55. package/lib/us/tools/nad-skeletons.ts +395 -0
  56. package/lib/uy/adapters/ide/adapter.ts +275 -0
  57. package/lib/ve/recipes/reviewed-postcode-tail.ts +29 -6
  58. package/out/adapters/cordis/adapter.d.ts +1 -1
  59. package/out/adapters/cordis/adapter.js +1 -1
  60. package/out/adapters/libpostal-dictionary.d.ts +9 -0
  61. package/out/adapters/libpostal-dictionary.d.ts.map +1 -1
  62. package/out/adapters/libpostal-dictionary.js +19 -3
  63. package/out/adapters/libpostal-dictionary.js.map +1 -1
  64. package/out/adapters/osm/adapter.d.ts +12 -1
  65. package/out/adapters/osm/adapter.d.ts.map +1 -1
  66. package/out/adapters/osm/adapter.js +30 -13
  67. package/out/adapters/osm/adapter.js.map +1 -1
  68. package/out/adapters.d.ts.map +1 -1
  69. package/out/adapters.js +14 -0
  70. package/out/adapters.js.map +1 -1
  71. package/out/az/adapters/opendata/adapter.d.ts +88 -0
  72. package/out/az/adapters/opendata/adapter.d.ts.map +1 -0
  73. package/out/az/adapters/opendata/adapter.js +282 -0
  74. package/out/az/adapters/opendata/adapter.js.map +1 -0
  75. package/out/bs/adapters/gbpa/adapter.d.ts +64 -0
  76. package/out/bs/adapters/gbpa/adapter.d.ts.map +1 -0
  77. package/out/bs/adapters/gbpa/adapter.js +187 -0
  78. package/out/bs/adapters/gbpa/adapter.js.map +1 -0
  79. package/out/build/types.d.ts +15 -0
  80. package/out/build/types.d.ts.map +1 -1
  81. package/out/build/types.js.map +1 -1
  82. package/out/build.d.ts.map +1 -1
  83. package/out/build.js +17 -0
  84. package/out/build.js.map +1 -1
  85. package/out/ee/adapters/ads/adapter.d.ts +6 -0
  86. package/out/ee/adapters/ads/adapter.d.ts.map +1 -1
  87. package/out/ee/adapters/ads/adapter.js +16 -0
  88. package/out/ee/adapters/ads/adapter.js.map +1 -1
  89. package/out/fo/adapters/adressur/adapter.d.ts +63 -0
  90. package/out/fo/adapters/adressur/adapter.d.ts.map +1 -0
  91. package/out/fo/adapters/adressur/adapter.js +177 -0
  92. package/out/fo/adapters/adressur/adapter.js.map +1 -0
  93. package/out/gb/adapters/os-open/adapter.d.ts +8 -0
  94. package/out/gb/adapters/os-open/adapter.d.ts.map +1 -1
  95. package/out/gb/adapters/os-open/adapter.js +11 -0
  96. package/out/gb/adapters/os-open/adapter.js.map +1 -1
  97. package/out/gb/county.d.ts +30 -0
  98. package/out/gb/county.d.ts.map +1 -0
  99. package/out/gb/county.js +51 -0
  100. package/out/gb/county.js.map +1 -0
  101. package/out/gb/os-open/open/names.d.ts +17 -0
  102. package/out/gb/os-open/open/names.d.ts.map +1 -1
  103. package/out/gb/os-open/open/names.js +19 -0
  104. package/out/gb/os-open/open/names.js.map +1 -1
  105. package/out/gu/adapters/bsp/adapter.d.ts +83 -0
  106. package/out/gu/adapters/bsp/adapter.d.ts.map +1 -0
  107. package/out/gu/adapters/bsp/adapter.js +346 -0
  108. package/out/gu/adapters/bsp/adapter.js.map +1 -0
  109. package/out/im/adapters/land-registry/adapter.d.ts +68 -0
  110. package/out/im/adapters/land-registry/adapter.d.ts.map +1 -0
  111. package/out/im/adapters/land-registry/adapter.js +261 -0
  112. package/out/im/adapters/land-registry/adapter.js.map +1 -0
  113. package/out/international/recipes/locale.d.ts +24 -4
  114. package/out/international/recipes/locale.d.ts.map +1 -1
  115. package/out/international/recipes/locale.js +107 -15
  116. package/out/international/recipes/locale.js.map +1 -1
  117. package/out/li/adapters/llv/adapter.d.ts +69 -0
  118. package/out/li/adapters/llv/adapter.d.ts.map +1 -0
  119. package/out/li/adapters/llv/adapter.js +181 -0
  120. package/out/li/adapters/llv/adapter.js.map +1 -0
  121. package/out/recipes/bare/postcode.d.ts.map +1 -1
  122. package/out/recipes/bare/postcode.js +9 -30
  123. package/out/recipes/bare/postcode.js.map +1 -1
  124. package/out/recipes/country-balanced.d.ts.map +1 -1
  125. package/out/recipes/country-balanced.js +82 -73
  126. package/out/recipes/country-balanced.js.map +1 -1
  127. package/out/recipes/intersection.d.ts +3 -2
  128. package/out/recipes/intersection.d.ts.map +1 -1
  129. package/out/recipes/intersection.js +20 -26
  130. package/out/recipes/intersection.js.map +1 -1
  131. package/out/recipes/po/box/cedex/recipe.d.ts.map +1 -1
  132. package/out/recipes/po/box/cedex/recipe.js +5 -4
  133. package/out/recipes/po/box/cedex/recipe.js.map +1 -1
  134. package/out/recipes/po/box/cedex/sources.d.ts +2 -45
  135. package/out/recipes/po/box/cedex/sources.d.ts.map +1 -1
  136. package/out/recipes/po/box/cedex/sources.js +0 -20
  137. package/out/recipes/po/box/cedex/sources.js.map +1 -1
  138. package/out/recipes/scaffold.d.ts +15 -2
  139. package/out/recipes/scaffold.d.ts.map +1 -1
  140. package/out/recipes/scaffold.js +21 -1
  141. package/out/recipes/scaffold.js.map +1 -1
  142. package/out/recipes/sources.d.ts.map +1 -1
  143. package/out/recipes/sources.js +112 -1
  144. package/out/recipes/sources.js.map +1 -1
  145. package/out/recipes/street/affix.d.ts.map +1 -1
  146. package/out/recipes/street/affix.js +8 -20
  147. package/out/recipes/street/affix.js.map +1 -1
  148. package/out/recipes/sub/venue/context.d.ts +14 -3
  149. package/out/recipes/sub/venue/context.d.ts.map +1 -1
  150. package/out/recipes/sub/venue/context.js +29 -9
  151. package/out/recipes/sub/venue/context.js.map +1 -1
  152. package/out/recipes/sub/venue/sources.d.ts +41 -8
  153. package/out/recipes/sub/venue/sources.d.ts.map +1 -1
  154. package/out/recipes/sub/venue/sources.js +26 -7
  155. package/out/recipes/sub/venue/sources.js.map +1 -1
  156. package/out/recipes/sub/venue.d.ts.map +1 -1
  157. package/out/recipes/sub/venue.js +35 -14
  158. package/out/recipes/sub/venue.js.map +1 -1
  159. package/out/recipes/unit.d.ts +4 -0
  160. package/out/recipes/unit.d.ts.map +1 -1
  161. package/out/recipes/unit.js +7 -6
  162. package/out/recipes/unit.js.map +1 -1
  163. package/out/registers.d.ts +33 -0
  164. package/out/registers.d.ts.map +1 -1
  165. package/out/registers.js +33 -0
  166. package/out/registers.js.map +1 -1
  167. package/out/source-register/corpus-inputs.d.ts +240 -0
  168. package/out/source-register/corpus-inputs.d.ts.map +1 -0
  169. package/out/source-register/corpus-inputs.js +275 -0
  170. package/out/source-register/corpus-inputs.js.map +1 -0
  171. package/out/source-register/effective-manifest.d.ts +2 -0
  172. package/out/source-register/effective-manifest.d.ts.map +1 -1
  173. package/out/source-register/effective-manifest.js +33 -4
  174. package/out/source-register/effective-manifest.js.map +1 -1
  175. package/out/source-register/types.d.ts +21 -1
  176. package/out/source-register/types.d.ts.map +1 -1
  177. package/out/source-register/types.js +20 -0
  178. package/out/source-register/types.js.map +1 -1
  179. package/out/south-asia/recipes/register.js +1 -1
  180. package/out/south-asia/recipes/register.js.map +1 -1
  181. package/out/tools/overlay/manifest.d.ts +7 -0
  182. package/out/tools/overlay/manifest.d.ts.map +1 -1
  183. package/out/tools/overlay/manifest.js +72 -1
  184. package/out/tools/overlay/manifest.js.map +1 -1
  185. package/out/tools/source-register/build.d.ts +9 -0
  186. package/out/tools/source-register/build.d.ts.map +1 -1
  187. package/out/tools/source-register/build.js +25 -3
  188. package/out/tools/source-register/build.js.map +1 -1
  189. package/out/tools/variety-sample.d.ts +196 -0
  190. package/out/tools/variety-sample.d.ts.map +1 -0
  191. package/out/tools/variety-sample.js +417 -0
  192. package/out/tools/variety-sample.js.map +1 -0
  193. package/out/us/adapters/usgov/nad/adapter.d.ts +80 -0
  194. package/out/us/adapters/usgov/nad/adapter.d.ts.map +1 -1
  195. package/out/us/adapters/usgov/nad/adapter.js +27 -8
  196. package/out/us/adapters/usgov/nad/adapter.js.map +1 -1
  197. package/out/us/recipes/skeleton-sources.d.ts +92 -0
  198. package/out/us/recipes/skeleton-sources.d.ts.map +1 -0
  199. package/out/us/recipes/skeleton-sources.js +121 -0
  200. package/out/us/recipes/skeleton-sources.js.map +1 -0
  201. package/out/us/tools/nad-skeletons.d.ts +120 -0
  202. package/out/us/tools/nad-skeletons.d.ts.map +1 -0
  203. package/out/us/tools/nad-skeletons.js +262 -0
  204. package/out/us/tools/nad-skeletons.js.map +1 -0
  205. package/out/uy/adapters/ide/adapter.d.ts +64 -0
  206. package/out/uy/adapters/ide/adapter.d.ts.map +1 -0
  207. package/out/uy/adapters/ide/adapter.js +206 -0
  208. package/out/uy/adapters/ide/adapter.js.map +1 -0
  209. package/out/ve/recipes/reviewed-postcode-tail.d.ts +6 -2
  210. package/out/ve/recipes/reviewed-postcode-tail.d.ts.map +1 -1
  211. package/out/ve/recipes/reviewed-postcode-tail.js +16 -5
  212. package/out/ve/recipes/reviewed-postcode-tail.js.map +1 -1
  213. package/package.json +14 -14
  214. package/lib/recipes/unit/sources.ts +0 -44
  215. package/lib/tools/fetch/ppd.ts +0 -121
  216. package/out/recipes/unit/sources.d.ts +0 -28
  217. package/out/recipes/unit/sources.d.ts.map +0 -1
  218. package/out/recipes/unit/sources.js +0 -30
  219. package/out/recipes/unit/sources.js.map +0 -1
  220. package/out/tools/fetch/ppd.d.ts +0 -15
  221. package/out/tools/fetch/ppd.d.ts.map +0 -1
  222. package/out/tools/fetch/ppd.js +0 -86
  223. package/out/tools/fetch/ppd.js.map +0 -1
@@ -0,0 +1,275 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * `ide-uy`: the national address points of Uruguay, `Direcciones Geográficas del Uruguay`, which the
7
+ * Infraestructura de Datos Espaciales (IDE) publishes on catalogodatos.gub.uy as one CSV per department.
8
+ *
9
+ * The CSVs are Windows-1252 (`ORDOÑEZ` reads `ORDO\xd1EZ`), and quote a street name that holds a
10
+ * nickname in doubled quotes (`"AVENIDA JOSE ""PEPE"" D' ELIA"`). Absent values read `N/A`.
11
+ *
12
+ * The adapter reads `nombre_via` as the street, `num_puerta` with `letra_puerta` as the house number,
13
+ * `codigo_postal` as the postcode, `localidad` as the locality, `departamento` as the region and
14
+ * `nombre_inmueble` as a venue. A census locality named `<DEPARTAMENTO> RURAL` names the department's rural
15
+ * remainder rather than a place, so such a row keeps the department and no locality. A street the register
16
+ * leaves unnamed carries a generated code (`UYARMQA_SN_012`) and is dropped, as is a point located only by a
17
+ * route kilometer, which has no door number to render.
18
+ *
19
+ * The IDE publishes the dataset under the Licencia de Datos Abiertos – Uruguay, which grants adaptation and
20
+ * commercial use and requires the note of origin to name the provider, the license and the dataset, and to
21
+ * mention changes. Every row records that license.
22
+ */
23
+
24
+ import { formatAddressRow } from "@mailwoman/codex/address/format"
25
+ import { matchCountryPostcode } from "@mailwoman/codex/postcode/country-formats"
26
+ import { readLocalBuffer } from "@mailwoman/core/fs/readers"
27
+ import { tryStat } from "@mailwoman/core/fs/readers/stat"
28
+ import { decodeBytes } from "@mailwoman/core/fs/streams"
29
+ import { resolvePath } from "path-ts"
30
+ import { CSVSpliterator } from "spliterator"
31
+ import { Globerator } from "spliterator/node/fs"
32
+
33
+ import { UnsupportedCountryError } from "#adapters/errors"
34
+ import { stableSourceIDFromParts } from "#adapters/source-id"
35
+ import { composeHouseNumber } from "#adapters/street-line"
36
+ import { SourceRegister } from "#registers"
37
+ import {
38
+ AddressRole,
39
+ type AdapterOptions,
40
+ type CanonicalRow,
41
+ type CorpusAdapter,
42
+ countDropped,
43
+ SurfaceOrigin,
44
+ } from "#types"
45
+
46
+ /**
47
+ * Registry id for this adapter, stamped into every row it emits.
48
+ */
49
+ export const IDE_UY_ADAPTER_ID = "ide-uy"
50
+
51
+ /**
52
+ * The license the IDE publishes the dataset under.
53
+ * It has no SPDX identifier.
54
+ */
55
+ export const IDE_UY_LICENSE = "LicenseRef-Licencia-Datos-Abiertos-Uruguay-0.1"
56
+
57
+ /**
58
+ * Every jurisdiction this adapter emits, checked against a caller's `--country`.
59
+ */
60
+ export const IDE_UY_COUNTRIES: readonly string[] = ["UY"]
61
+
62
+ /**
63
+ * The columns the adapter reads from each department's CSV.
64
+ */
65
+ export interface IDEUruguayRecord {
66
+ codigo_postal: string
67
+ codigo_via: string
68
+ nombre_via: string
69
+ num_puerta: string
70
+ letra_puerta: string
71
+ km: string
72
+ nombre_inmueble: string
73
+ localidad: string
74
+ departamento: string
75
+ latitud: string
76
+ longitud: string
77
+ }
78
+
79
+ const ABSENT = "N/A"
80
+
81
+ /**
82
+ * A value, or null when the IDE writes it as absent.
83
+ */
84
+ function present(value: string | undefined): string | null {
85
+ const trimmed = value?.trim() ?? ""
86
+
87
+ return trimmed && trimmed !== ABSENT ? trimmed : null
88
+ }
89
+
90
+ /**
91
+ * The house-number suffixes `letra_puerta` holds that a door number is written with:
92
+ * `BIS` and a single letter.
93
+ *
94
+ * The two-letter values (`DU`, `CC`, `TR`) are codes the dataset's metadata
95
+ * does not define, so they are left off.
96
+ */
97
+ const LETTER_SUFFIX = /^(?:BIS|[A-Z])$/u
98
+
99
+ /**
100
+ * A street the register leaves unnamed carries a generated code, such as `UYARMQA_SN_012`.
101
+ */
102
+ const GENERATED_STREET = /_SN_|^[A-Z0-9]+_[A-Z0-9_]+$/u
103
+
104
+ /**
105
+ * Maps one record onto the components the corpus asserts, or returns null when the row is refused.
106
+ *
107
+ * Each refusal increments its reason in `dropped`.
108
+ */
109
+ export function componentsForIDERecord(
110
+ record: IDEUruguayRecord,
111
+ dropped?: Pick<AdapterOptions, "dropped">
112
+ ): CanonicalRow["components"] | null {
113
+ const tally = dropped ?? {}
114
+ const street = present(record.nombre_via)
115
+
116
+ if (!street) {
117
+ countDropped(tally, "row:no-street")
118
+
119
+ return null
120
+ }
121
+
122
+ if (GENERATED_STREET.test(street)) {
123
+ countDropped(tally, "row:street-generated-code")
124
+
125
+ return null
126
+ }
127
+
128
+ const number = present(record.num_puerta)
129
+
130
+ if (!number) {
131
+ countDropped(tally, present(record.km) ? "row:route-kilometer-without-door-number" : "row:no-door-number")
132
+
133
+ return null
134
+ }
135
+
136
+ const letter = present(record.letra_puerta)
137
+ const suffix = letter && LETTER_SUFFIX.test(letter) ? letter : ""
138
+
139
+ if (letter && !suffix) {
140
+ countDropped(tally, "component:letra_puerta:code")
141
+ }
142
+
143
+ const components: CanonicalRow["components"] = {
144
+ house_number: composeHouseNumber(number, suffix, " "),
145
+ street,
146
+ }
147
+
148
+ const venue = present(record.nombre_inmueble)
149
+
150
+ // A post office's distribution agent is listed under the agent's own name (`Agente` and a person's names),
151
+ // and a code such as `CH109` names no place, so neither becomes a venue.
152
+ if (venue && /^AGENTE\b/iu.test(venue)) {
153
+ countDropped(tally, "component:venue:names-a-person")
154
+ } else if (venue && !/\p{L}{3}/u.test(venue)) {
155
+ countDropped(tally, "component:venue:code")
156
+ } else if (venue) {
157
+ components.venue = venue
158
+ }
159
+
160
+ const postcode = present(record.codigo_postal)
161
+ const matched = postcode ? matchCountryPostcode(postcode, "UY") : null
162
+
163
+ if (matched) {
164
+ components.postcode = matched
165
+ } else if (postcode) {
166
+ countDropped(tally, "component:postcode:not-country-format")
167
+ }
168
+
169
+ const locality = present(record.localidad)
170
+ const region = present(record.departamento)
171
+
172
+ if (locality && !locality.endsWith(" RURAL")) {
173
+ components.locality = locality
174
+ } else if (locality) {
175
+ countDropped(tally, "component:locality:rural-remainder")
176
+ }
177
+
178
+ if (region && region !== components.locality) {
179
+ components.region = region
180
+ }
181
+
182
+ if (!components.locality && !components.postcode) {
183
+ countDropped(tally, "row:no-locality-or-postcode")
184
+
185
+ return null
186
+ }
187
+
188
+ return components
189
+ }
190
+
191
+ /**
192
+ * The department CSVs an input names: the file itself, or every `.csv` in a directory, in name order.
193
+ */
194
+ async function departmentFiles(inputPath: string): Promise<string[]> {
195
+ const stat = await tryStat(inputPath)
196
+
197
+ if (!stat?.isDirectory()) return [inputPath]
198
+
199
+ const names = await Globerator.from("*.csv", { cwd: inputPath, absolute: false }).toSorted()
200
+
201
+ return names.map((name) => `${inputPath}/${name}`)
202
+ }
203
+
204
+ export function createIDEUruguayAdapter(): CorpusAdapter {
205
+ return {
206
+ id: IDE_UY_ADAPTER_ID,
207
+ defaultLicense: IDE_UY_LICENSE,
208
+ addressRole: AddressRole.Premise,
209
+ register: SourceRegister.UruguayIDEDirecciones,
210
+ surface: SurfaceOrigin.Rendered,
211
+ description: "Direcciones Geográficas del Uruguay (IDE Uruguay): national address points, one CSV per department.",
212
+
213
+ async *rows(opts: AdapterOptions): AsyncIterable<CanonicalRow> {
214
+ if (opts.country && !IDE_UY_COUNTRIES.includes(opts.country)) {
215
+ throw new UnsupportedCountryError(IDE_UY_ADAPTER_ID, IDE_UY_COUNTRIES, opts.country)
216
+ }
217
+
218
+ let emitted = 0
219
+
220
+ for (const file of await departmentFiles(resolvePath(opts.inputPath))) {
221
+ // The largest department file is 65 MB, and the publisher fixes the partition, so each is decoded whole.
222
+ const text = decodeBytes(await readLocalBuffer(file), "windows-1252")
223
+ const records = CSVSpliterator.from<IDEUruguayRecord>(Buffer.from(text, "utf8"), { normalizeKeys: false })
224
+
225
+ for (const record of records) {
226
+ if (opts.signal?.aborted) return
227
+
228
+ if (opts.limit !== undefined && emitted >= opts.limit) return
229
+
230
+ const components = componentsForIDERecord(record, opts)
231
+
232
+ if (!components) continue
233
+
234
+ const rendered = formatAddressRow(components, "UY", { singleLine: true })
235
+
236
+ if (!rendered) {
237
+ countDropped(opts, "row:render-failed")
238
+
239
+ continue
240
+ }
241
+
242
+ for (const tag of rendered.unplaced) {
243
+ countDropped(opts, `component:${tag}:not-rendered`)
244
+ }
245
+
246
+ const { raw, components: aligned } = rendered
247
+
248
+ yield {
249
+ raw,
250
+ components: aligned,
251
+ country: "UY",
252
+ locale: "es-UY",
253
+ source: IDE_UY_ADAPTER_ID,
254
+ // The point's coordinates separate two doors the rendered components cannot,
255
+ // such as the several access points one `num_puerta` has on a corner lot.
256
+ source_id: stableSourceIDFromParts(IDE_UY_ADAPTER_ID, {
257
+ ...aligned,
258
+ lat: record.latitud ?? "",
259
+ lon: record.longitud ?? "",
260
+ }),
261
+ corpus_version: "",
262
+ license: IDE_UY_LICENSE,
263
+ }
264
+
265
+ emitted++
266
+ }
267
+ }
268
+ },
269
+ }
270
+ }
271
+
272
+ /**
273
+ * The configured adapter instance registered with the corpus builder.
274
+ */
275
+ export const ideUruguayAdapter = createIDEUruguayAdapter()
@@ -3,7 +3,10 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Renders four hand-reviewed Venezuelan postcode facts in the `locality postcode, region` order.
6
+ * Renders hand-reviewed Venezuelan postcode facts in the `locality postcode, region` order.
7
+ *
8
+ * A fact is kept in the data file only when its citation reaches a register row whose elected decision permits
9
+ * transform and train. None does today, so the file holds no tuple and the recipe refuses to run.
7
10
  */
8
11
 
9
12
  import { readLocalJSONFile } from "@mailwoman/core/fs/readers"
@@ -23,8 +26,6 @@ import { SurfaceOrigin } from "#types"
23
26
  */
24
27
  export const REVIEWED_POSTCODE_TAIL_SOURCE = defaultRecipeSource("synth-reviewed-postcode-tail")
25
28
 
26
- const REVIEWED_TUPLE_COUNT = 4
27
-
28
29
  interface ReviewedTupleProvenance {
29
30
  publisher: string
30
31
  url: string
@@ -51,6 +52,11 @@ export interface ReviewedPostcodeTuple {
51
52
  interface ReviewedPostcodeTupleFile {
52
53
  version: string
53
54
  reviewedAt: string
55
+ /**
56
+ * How many tuples the file declares, so a tuple lost in an edit fails the read
57
+ * rather than shrinking the output.
58
+ */
59
+ tupleCount: number
54
60
  tuples: ReviewedPostcodeTuple[]
55
61
  }
56
62
 
@@ -80,15 +86,24 @@ export function defaultReviewedPostcodeTuplePath(): string {
80
86
  /**
81
87
  * Reads and validates the reviewed tuples.
82
88
  *
83
- * @throws When the file does not hold exactly four complete, unique, reviewed tuples.
89
+ * @throws When the file does not hold as many complete, unique, reviewed
90
+ * tuples as its `tupleCount` declares.
84
91
  */
85
92
  export async function readReviewedPostcodeTuples(
86
93
  path: PathBuilderLike = defaultReviewedPostcodeTuplePath()
87
94
  ): Promise<ReviewedPostcodeTuple[]> {
88
95
  const document = await readLocalJSONFile<ReviewedPostcodeTupleFile>(path)
89
96
 
90
- if (!document.version || !ISO_DATE.test(document.reviewedAt) || document.tuples.length !== REVIEWED_TUPLE_COUNT) {
91
- throw new Error("reviewed postcode tuple file must declare a version, review date, and exactly four tuples")
97
+ if (
98
+ !document.version ||
99
+ !ISO_DATE.test(document.reviewedAt) ||
100
+ !Number.isInteger(document.tupleCount) ||
101
+ document.tuples.length !== document.tupleCount
102
+ ) {
103
+ throw new Error(
104
+ `reviewed postcode tuple file must declare a version, a review date, and a tupleCount matching its ` +
105
+ `${document.tuples?.length ?? 0} tuples`
106
+ )
92
107
  }
93
108
 
94
109
  const ids = new Set<string>()
@@ -177,6 +192,14 @@ export const reviewedPostcodeTailRecipe: CorpusRecipe = {
177
192
  mode: "generate",
178
193
  async run(opts, write) {
179
194
  const tuples = await readReviewedPostcodeTuples(opts.input)
195
+
196
+ if (!tuples.length) {
197
+ throw new Error(
198
+ "reviewed-postcode-tail has no tuple to render: no reviewed fact's citation reaches a register row " +
199
+ "permitting transform and train"
200
+ )
201
+ }
202
+
180
203
  let emitted = 0
181
204
  let skipped = 0
182
205
 
@@ -67,7 +67,7 @@
67
67
  *
68
68
  * A country whose codex `layoutForCountry` is `null` has no rendering to write the row in.
69
69
  * The row is refused with {@linkcode CORDISRefusal.CountryNoLayout} rather than rendered in another
70
- * country's order: 353 records over 37 countries, Ghana's 77 the most.
70
+ * country's order.
71
71
  *
72
72
  * ## The street line
73
73
  *
@@ -67,7 +67,7 @@
67
67
  *
68
68
  * A country whose codex `layoutForCountry` is `null` has no rendering to write the row in.
69
69
  * The row is refused with {@linkcode CORDISRefusal.CountryNoLayout} rather than rendered in another
70
- * country's order: 353 records over 37 countries, Ghana's 77 the most.
70
+ * country's order.
71
71
  *
72
72
  * ## The street line
73
73
  *
@@ -17,4 +17,13 @@
17
17
  * The largest dictionary is 8.4 KB, and each caller loads it once per process at module load.
18
18
  */
19
19
  export declare function loadLibpostalDictionary(language: string, filename: string): Promise<Set<string>>;
20
+ /**
21
+ * Loads one curated libpostal dictionary as a map from each lower-cased form
22
+ * to its line's canonical spelling.
23
+ *
24
+ * `ул.` and `улица` both map to `улица`, so a count of distinct canonical values
25
+ * counts street types rather than their spellings.
26
+ * A form two lines share keeps the first line's canonical spelling.
27
+ */
28
+ export declare function loadLibpostalCanonicalForms(language: string, filename: string): Promise<Map<string, string>>;
20
29
  //# sourceMappingURL=libpostal-dictionary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"libpostal-dictionary.d.ts","sourceRoot":"","sources":["../../lib/adapters/libpostal-dictionary.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAatG"}
1
+ {"version":3,"file":"libpostal-dictionary.d.ts","sourceRoot":"","sources":["../../lib/adapters/libpostal-dictionary.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAEtG;AAED;;;;;;;GAOG;AACH,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqBlH"}
@@ -20,15 +20,31 @@ import { TextSpliterator } from "spliterator";
20
20
  * The largest dictionary is 8.4 KB, and each caller loads it once per process at module load.
21
21
  */
22
22
  export async function loadLibpostalDictionary(language, filename) {
23
+ return new Set((await loadLibpostalCanonicalForms(language, filename)).keys());
24
+ }
25
+ /**
26
+ * Loads one curated libpostal dictionary as a map from each lower-cased form
27
+ * to its line's canonical spelling.
28
+ *
29
+ * `ул.` and `улица` both map to `улица`, so a count of distinct canonical values
30
+ * counts street types rather than their spellings.
31
+ * A form two lines share keeps the first line's canonical spelling.
32
+ */
33
+ export async function loadLibpostalCanonicalForms(language, filename) {
23
34
  const text = await readLocalTextFile(resourceDictionaryPath("libpostal", language, filename));
24
- const set = new Set();
35
+ const forms = new Map();
25
36
  for (const line of TextSpliterator.from(text)) {
26
37
  if (line.startsWith("#"))
27
38
  continue;
39
+ let canonical = null;
28
40
  for (const form of TextSpliterator.from(line, { delimiter: "|" })) {
29
- set.add(form.toLowerCase());
41
+ const lower = form.toLowerCase();
42
+ canonical ??= lower;
43
+ if (!forms.has(lower)) {
44
+ forms.set(lower, canonical);
45
+ }
30
46
  }
31
47
  }
32
- return set;
48
+ return forms;
33
49
  }
34
50
  //# sourceMappingURL=libpostal-dictionary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"libpostal-dictionary.js","sourceRoot":"","sources":["../../lib/adapters/libpostal-dictionary.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAgB,EAAE,QAAgB;IAC/E,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,sBAAsB,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC7F,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAE7B,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAElC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QAC5B,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAA;AACX,CAAC"}
1
+ {"version":3,"file":"libpostal-dictionary.js","sourceRoot":"","sources":["../../lib/adapters/libpostal-dictionary.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAgB,EAAE,QAAgB;IAC/E,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,QAAgB,EAAE,QAAgB;IACnF,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,sBAAsB,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC7F,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEvC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAElC,IAAI,SAAS,GAAkB,IAAI,CAAA;QAEnC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YACnE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;YAEhC,SAAS,KAAK,KAAK,CAAA;YAEnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YAC5B,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAA;AACb,CAAC"}
@@ -48,6 +48,15 @@ interface OSMCorpusRow {
48
48
  district?: string | null;
49
49
  province?: string | null;
50
50
  country?: string | null;
51
+ /**
52
+ * The containing administrative area's name, which `emit-corpus-jsonl --locality-level`
53
+ * writes for a record without `addr:city`.
54
+ */
55
+ boundary_locality?: string | null;
56
+ /**
57
+ * The same for a record without `addr:suburb`, from `--dependent-locality-level`.
58
+ */
59
+ boundary_dependent_locality?: string | null;
51
60
  }
52
61
  /**
53
62
  * Whether `addr:housenumber` holds a street designator — digits with an optional letter,
@@ -85,9 +94,11 @@ export declare function splitCityValue(value: string): {
85
94
  * A row whose `addr:street` holds a line rather than a name stays refused:
86
95
  * the mapper supplied a street, and the value is a line.
87
96
  *
97
+ * A postcode is kept when the whole value has `country`'s postcode format.
98
+ *
88
99
  * Each refusal and each discarded component increments its reason in `dropped`.
89
100
  */
90
- export declare function componentsForOSMRow(row: OSMCorpusRow, dropped?: Pick<AdapterOptions, "dropped">): CanonicalRow["components"] | null;
101
+ export declare function componentsForOSMRow(row: OSMCorpusRow, country: string, dropped?: Pick<AdapterOptions, "dropped">): CanonicalRow["components"] | null;
91
102
  /**
92
103
  * Whether two place names are the same name: case, whitespace, diacritics and a leading
93
104
  * admin generic folded (`Bắc Ninh` = `Bac Ninh`; `Hà Nội` = `Thành phố Hà Nội`).
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../lib/adapters/osm/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,aAAa,EAGlB,MAAM,QAAQ,CAAA;AAEf;;GAEG;AACH,eAAO,MAAM,cAAc,QAAQ,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,WAAW,aAAa,CAAA;AAErC;;GAEG;AACH,eAAO,MAAM,eAAe,mDAAmD,CAAA;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAEyC,CAAA;AAErE;;GAEG;AACH,UAAU,YAAY;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAI9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAQvF;AAoBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GACvC,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,CAuFnC;AAQD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAWtD;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAkFhD;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,eAAqB,CAAA"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../lib/adapters/osm/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,aAAa,EAGlB,MAAM,QAAQ,CAAA;AAEf;;GAEG;AACH,eAAO,MAAM,cAAc,QAAQ,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,WAAW,aAAa,CAAA;AAErC;;GAEG;AACH,eAAO,MAAM,eAAe,mDAAmD,CAAA;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAEyC,CAAA;AAErE;;GAEG;AACH,UAAU,YAAY;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC;;OAEG;IACH,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3C;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAI9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CASnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAQvF;AAoBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GACvC,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,CAyGnC;AAQD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAWtD;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAkFhD;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,eAAqB,CAAA"}
@@ -10,6 +10,7 @@
10
10
  * That is why `defaultLicense` is not an option on this adapter.
11
11
  */
12
12
  import { formatAddressRow } from "@mailwoman/codex/address/format";
13
+ import { countryPostcodeFormat, matchCountryPostcode } from "@mailwoman/codex/postcode/country-formats";
13
14
  import { tryParsingJSON } from "@mailwoman/core/json";
14
15
  import { extractDelimited } from "@mailwoman/core/scripting/arguments";
15
16
  import { stripCombiningMarks } from "@mailwoman/normalize/fold";
@@ -102,9 +103,11 @@ function parseLine(line) {
102
103
  * A row whose `addr:street` holds a line rather than a name stays refused:
103
104
  * the mapper supplied a street, and the value is a line.
104
105
  *
106
+ * A postcode is kept when the whole value has `country`'s postcode format.
107
+ *
105
108
  * Each refusal and each discarded component increments its reason in `dropped`.
106
109
  */
107
- export function componentsForOSMRow(row, dropped) {
110
+ export function componentsForOSMRow(row, country, dropped) {
108
111
  const tally = dropped ?? {};
109
112
  const street = clean(row.street);
110
113
  const number = clean(row.number);
@@ -129,31 +132,45 @@ export function componentsForOSMRow(row, dropped) {
129
132
  components.unit = unit;
130
133
  }
131
134
  const postcode = clean(row.postcode);
132
- if (postcode && /^\d{4,6}$/u.test(postcode)) {
133
- components.postcode = postcode;
134
- }
135
- else if (postcode) {
136
- countDropped(tally, "component:postcode:not-4-to-6-digits");
135
+ if (postcode) {
136
+ // The country's own format decides, so Argentina's `C1425ABC`, Brunei's `BS8811` and Chile's
137
+ // seven digits stay postcodes, and a value outside the country's form is dropped by name.
138
+ const matched = matchCountryPostcode(postcode, country);
139
+ if (matched) {
140
+ components.postcode = matched;
141
+ }
142
+ else {
143
+ countDropped(tally, countryPostcodeFormat(country) ? "component:postcode:not-country-format" : "component:postcode:country-has-none");
144
+ }
137
145
  }
138
146
  const city = clean(row.city);
139
147
  const split = city ? splitCityValue(city) : null;
140
148
  if (split) {
141
149
  components.locality = split.locality;
142
150
  }
143
- // Dependent-locality candidates in priority order (suburb, subdistrict, district, place, city head);
144
- // `district` never becomes `region`, because Vietnam's country template
145
- // renders it only when no city is present.
146
- const dependent = [row.suburb, row.subdistrict, row.district, row.place, split?.head]
151
+ else {
152
+ // The containing boundary's name stands in only where the mapper tagged no city,
153
+ // so a tagged value is never replaced by a position.
154
+ const boundary = clean(row.boundary_locality);
155
+ if (boundary) {
156
+ components.locality = boundary;
157
+ countDropped(tally, "kept:locality-from-boundary");
158
+ }
159
+ }
160
+ // Dependent-locality candidates in priority order (suburb, subdistrict, district, place,
161
+ // city head, then the containing boundary's name); `district` never becomes `region`,
162
+ // because Vietnam's country template renders it only when no city is present.
163
+ const dependent = [row.suburb, row.subdistrict, row.district, row.place, split?.head, row.boundary_dependent_locality]
147
164
  .map((value) => clean(value))
148
165
  .find((value) => value !== null &&
149
166
  !value.includes(",") &&
150
167
  (street === null || !sameName(value, street)) &&
151
- (split === null || !sameName(value, split.locality)));
168
+ (!components.locality || !sameName(value, components.locality)));
152
169
  if (dependent) {
153
170
  components.dependent_locality = dependent;
154
171
  }
155
172
  const province = clean(row.province);
156
- if (province && (!split || !sameName(province, split.locality))) {
173
+ if (province && (!components.locality || !sameName(province, components.locality))) {
157
174
  components.region = province;
158
175
  }
159
176
  // A streetless premise is a house number within a place that has a name, so it needs
@@ -228,7 +245,7 @@ export function createOSMAdapter() {
228
245
  if (!tagged) {
229
246
  countDropped(opts, "kept:country-untagged");
230
247
  }
231
- const components = componentsForOSMRow(row, opts);
248
+ const components = componentsForOSMRow(row, country, opts);
232
249
  if (!components)
233
250
  continue;
234
251
  const rendered = formatAddressRow(components, country, { singleLine: true });
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../lib/adapters/osm/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../lib/adapters/osm/adapter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../lib/adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAoCH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAa3C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EA6CpD,CAAA;AAQD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAC7F,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEzG,OAAO,EACN,0BAA0B,EAC1B,+BAA+B,EAC/B,qBAAqB,GACrB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE3G,OAAO,EACN,wBAAwB,EACxB,6BAA6B,EAC7B,oBAAoB,GACpB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACN,2BAA2B,EAC3B,gCAAgC,EAChC,qBAAqB,GACrB,MAAM,uCAAuC,CAAA;AAE9C,OAAO,EACN,+BAA+B,EAC/B,oCAAoC,EACpC,yBAAyB,GACzB,MAAM,2CAA2C,CAAA;AAElD,OAAO,EACN,4BAA4B,EAC5B,iCAAiC,EACjC,sBAAsB,GACtB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,EACN,4BAA4B,EAC5B,iCAAiC,EACjC,sBAAsB,GACtB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAElG,OAAO,EACN,0BAA0B,EAC1B,+BAA+B,EAC/B,oBAAoB,GACpB,MAAM,sCAAsC,CAAA;AAE7C,OAAO,EACN,yBAAyB,EACzB,8BAA8B,EAC9B,mBAAmB,GACnB,MAAM,qCAAqC,CAAA;AAE5C,OAAO,EACN,wBAAwB,EACxB,6BAA6B,EAC7B,kBAAkB,GAClB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEjH,OAAO,EACN,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,GACjB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACN,uBAAuB,EACvB,4BAA4B,EAC5B,kCAAkC,GAClC,MAAM,qDAAqD,CAAA;AAE5D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AACxF,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA"}
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../lib/adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AA0CH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAc3C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAoDpD,CAAA;AAQD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAC7F,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEzG,OAAO,EACN,0BAA0B,EAC1B,+BAA+B,EAC/B,qBAAqB,GACrB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE3G,OAAO,EACN,wBAAwB,EACxB,6BAA6B,EAC7B,oBAAoB,GACpB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACN,2BAA2B,EAC3B,gCAAgC,EAChC,qBAAqB,GACrB,MAAM,uCAAuC,CAAA;AAE9C,OAAO,EACN,+BAA+B,EAC/B,oCAAoC,EACpC,yBAAyB,GACzB,MAAM,2CAA2C,CAAA;AAElD,OAAO,EACN,4BAA4B,EAC5B,iCAAiC,EACjC,sBAAsB,GACtB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,EACN,4BAA4B,EAC5B,iCAAiC,EACjC,sBAAsB,GACtB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAElG,OAAO,EACN,0BAA0B,EAC1B,+BAA+B,EAC/B,oBAAoB,GACpB,MAAM,sCAAsC,CAAA;AAE7C,OAAO,EACN,yBAAyB,EACzB,8BAA8B,EAC9B,mBAAmB,GACnB,MAAM,qCAAqC,CAAA;AAE5C,OAAO,EACN,wBAAwB,EACxB,6BAA6B,EAC7B,kBAAkB,GAClB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEjH,OAAO,EACN,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,GACjB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACN,uBAAuB,EACvB,4BAA4B,EAC5B,kCAAkC,GAClC,MAAM,qDAAqD,CAAA;AAE5D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AACxF,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA"}
package/out/adapters.js CHANGED
@@ -49,9 +49,11 @@ import { defaultAdapterRegistry } from "#adapters/registry";
49
49
  import { wofAdminAdapter } from "#adapters/wof/admin/json/adapter";
50
50
  import { wofPostalcodeAdapter } from "#adapters/wof/postalcode-json/adapter";
51
51
  import { gnafAdapter } from "#au/adapters/gnaf/adapter";
52
+ import { azerbaijanPlacesAdapter } from "#az/adapters/opendata/adapter";
52
53
  import { brusselsAdapter } from "#be/adapters/brussels/adapter";
53
54
  import { vlaanderenAdapter } from "#be/adapters/vlaanderen/adapter";
54
55
  import { wallonieAdapter } from "#be/adapters/wallonie/adapter";
56
+ import { gbpaAdapter } from "#bs/adapters/gbpa/adapter";
55
57
  import { czCuzkAdapter } from "#cz/adapters/cuzk/adapter";
56
58
  import { dkInspireAdapter } from "#dk/adapters/inspire/adapter";
57
59
  import { adsAdapter } from "#ee/adapters/ads/adapter";
@@ -60,11 +62,15 @@ import { esCatastroAdapter } from "#es/adapters/catastro/adapter";
60
62
  import { esGipuzkoaAdapter } from "#es/adapters/gipuzkoa/adapter";
61
63
  import { esNavarraAdapter } from "#es/adapters/navarra/adapter";
62
64
  import { ryhtiAdapter } from "#fi/adapters/ryhti/adapter";
65
+ import { adressurFaroeAdapter } from "#fo/adapters/adressur/adapter";
63
66
  import { annuaireEducationAdapter } from "#fr/adapters/annuaire-education/adapter";
64
67
  import { banAdapter } from "#fr/adapters/ban/adapter";
65
68
  import { finessAdapter } from "#fr/adapters/finess/adapter";
66
69
  import { gbOSOpenAdapter } from "#gb/adapters/os-open/adapter";
70
+ import { guamAddressPointsAdapter } from "#gu/adapters/bsp/adapter";
71
+ import { isleOfManLandRegistryAdapter } from "#im/adapters/land-registry/adapter";
67
72
  import { itANACAdapter } from "#it/adapters/anac/adapter";
73
+ import { llvLiechtensteinAdapter } from "#li/adapters/llv/adapter";
68
74
  import { bdAdressesAdapter } from "#lu/adapters/bd-adresses/adapter";
69
75
  import { varisAdapter } from "#lv/adapters/varis/adapter";
70
76
  import { nlKadasterAdapter } from "#nl/adapters/kadaster/adapter";
@@ -83,6 +89,7 @@ import { usgovImlsPlsAdapter } from "#us/adapters/usgov/imls-pls/adapter";
83
89
  import { USGovIRSBMFAdapter } from "#us/adapters/usgov/irs-bmf/adapter";
84
90
  import { usgovNADAdapter } from "#us/adapters/usgov/nad/adapter";
85
91
  import { usgovNPPESAdapter } from "#us/adapters/usgov/nppes/adapter";
92
+ import { ideUruguayAdapter } from "#uy/adapters/ide/adapter";
86
93
  /**
87
94
  * Built-in adapters.
88
95
  *
@@ -104,6 +111,13 @@ export const BUILTIN_ADAPTERS = [
104
111
  banAdapter,
105
112
  matrikkelenAdapter,
106
113
  ryhtiAdapter,
114
+ ideUruguayAdapter,
115
+ llvLiechtensteinAdapter,
116
+ adressurFaroeAdapter,
117
+ isleOfManLandRegistryAdapter,
118
+ gbpaAdapter,
119
+ azerbaijanPlacesAdapter,
120
+ guamAddressPointsAdapter,
107
121
  czCuzkAdapter,
108
122
  dkInspireAdapter,
109
123
  adsAdapter,