@mailwoman/corpus 2.0.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 (137) hide show
  1. package/out/src/adapter.d.ts +96 -0
  2. package/out/src/adapter.d.ts.map +1 -0
  3. package/out/src/adapter.js +107 -0
  4. package/out/src/adapter.js.map +1 -0
  5. package/out/src/adapters/ban/adapter.d.ts +32 -0
  6. package/out/src/adapters/ban/adapter.d.ts.map +1 -0
  7. package/out/src/adapters/ban/adapter.js +133 -0
  8. package/out/src/adapters/ban/adapter.js.map +1 -0
  9. package/out/src/adapters/fcc-bdc/adapter.d.ts +61 -0
  10. package/out/src/adapters/fcc-bdc/adapter.d.ts.map +1 -0
  11. package/out/src/adapters/fcc-bdc/adapter.js +153 -0
  12. package/out/src/adapters/fcc-bdc/adapter.js.map +1 -0
  13. package/out/src/adapters/index.d.ts +42 -0
  14. package/out/src/adapters/index.d.ts.map +1 -0
  15. package/out/src/adapters/index.js +76 -0
  16. package/out/src/adapters/index.js.map +1 -0
  17. package/out/src/adapters/openaddresses/adapter.d.ts +60 -0
  18. package/out/src/adapters/openaddresses/adapter.d.ts.map +1 -0
  19. package/out/src/adapters/openaddresses/adapter.js +174 -0
  20. package/out/src/adapters/openaddresses/adapter.js.map +1 -0
  21. package/out/src/adapters/state-ia-contractors/adapter.d.ts +23 -0
  22. package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +1 -0
  23. package/out/src/adapters/state-ia-contractors/adapter.js +113 -0
  24. package/out/src/adapters/state-ia-contractors/adapter.js.map +1 -0
  25. package/out/src/adapters/state-ny-notaries/adapter.d.ts +21 -0
  26. package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +1 -0
  27. package/out/src/adapters/state-ny-notaries/adapter.js +132 -0
  28. package/out/src/adapters/state-ny-notaries/adapter.js.map +1 -0
  29. package/out/src/adapters/state-tx-notaries/adapter.d.ts +22 -0
  30. package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +1 -0
  31. package/out/src/adapters/state-tx-notaries/adapter.js +125 -0
  32. package/out/src/adapters/state-tx-notaries/adapter.js.map +1 -0
  33. package/out/src/adapters/tiger/adapter.d.ts +45 -0
  34. package/out/src/adapters/tiger/adapter.d.ts.map +1 -0
  35. package/out/src/adapters/tiger/adapter.js +179 -0
  36. package/out/src/adapters/tiger/adapter.js.map +1 -0
  37. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts +36 -0
  38. package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -0
  39. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +147 -0
  40. package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -0
  41. package/out/src/adapters/usgov-imls-pls/adapter.d.ts +25 -0
  42. package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +1 -0
  43. package/out/src/adapters/usgov-imls-pls/adapter.js +118 -0
  44. package/out/src/adapters/usgov-imls-pls/adapter.js.map +1 -0
  45. package/out/src/adapters/usgov-nad/adapter.d.ts +37 -0
  46. package/out/src/adapters/usgov-nad/adapter.d.ts.map +1 -0
  47. package/out/src/adapters/usgov-nad/adapter.js +227 -0
  48. package/out/src/adapters/usgov-nad/adapter.js.map +1 -0
  49. package/out/src/adapters/usgov-nppes/adapter.d.ts +28 -0
  50. package/out/src/adapters/usgov-nppes/adapter.d.ts.map +1 -0
  51. package/out/src/adapters/usgov-nppes/adapter.js +123 -0
  52. package/out/src/adapters/usgov-nppes/adapter.js.map +1 -0
  53. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts +35 -0
  54. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -0
  55. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +162 -0
  56. package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -0
  57. package/out/src/adapters/wof-admin-json/adapter.d.ts +85 -0
  58. package/out/src/adapters/wof-admin-json/adapter.d.ts.map +1 -0
  59. package/out/src/adapters/wof-admin-json/adapter.js +241 -0
  60. package/out/src/adapters/wof-admin-json/adapter.js.map +1 -0
  61. package/out/src/adapters/wof-postalcode-json/adapter.d.ts +63 -0
  62. package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +1 -0
  63. package/out/src/adapters/wof-postalcode-json/adapter.js +178 -0
  64. package/out/src/adapters/wof-postalcode-json/adapter.js.map +1 -0
  65. package/out/src/align.d.ts +58 -0
  66. package/out/src/align.d.ts.map +1 -0
  67. package/out/src/align.js +139 -0
  68. package/out/src/align.js.map +1 -0
  69. package/out/src/build.d.ts +104 -0
  70. package/out/src/build.d.ts.map +1 -0
  71. package/out/src/build.js +201 -0
  72. package/out/src/build.js.map +1 -0
  73. package/out/src/codex/us-fips-state.d.ts +44 -0
  74. package/out/src/codex/us-fips-state.d.ts.map +1 -0
  75. package/out/src/codex/us-fips-state.js +105 -0
  76. package/out/src/codex/us-fips-state.js.map +1 -0
  77. package/out/src/codex/us-street-suffix.d.ts +259 -0
  78. package/out/src/codex/us-street-suffix.d.ts.map +1 -0
  79. package/out/src/codex/us-street-suffix.js +285 -0
  80. package/out/src/codex/us-street-suffix.js.map +1 -0
  81. package/out/src/format.d.ts +79 -0
  82. package/out/src/format.d.ts.map +1 -0
  83. package/out/src/format.js +151 -0
  84. package/out/src/format.js.map +1 -0
  85. package/out/src/golden.d.ts +50 -0
  86. package/out/src/golden.d.ts.map +1 -0
  87. package/out/src/golden.js +104 -0
  88. package/out/src/golden.js.map +1 -0
  89. package/out/src/index.d.ts +18 -0
  90. package/out/src/index.d.ts.map +1 -0
  91. package/out/src/index.js +18 -0
  92. package/out/src/index.js.map +1 -0
  93. package/out/src/parquet-wrapper/index.d.ts +12 -0
  94. package/out/src/parquet-wrapper/index.d.ts.map +1 -0
  95. package/out/src/parquet-wrapper/index.js +12 -0
  96. package/out/src/parquet-wrapper/index.js.map +1 -0
  97. package/out/src/parquet-wrapper/reader.d.ts +31 -0
  98. package/out/src/parquet-wrapper/reader.d.ts.map +1 -0
  99. package/out/src/parquet-wrapper/reader.js +54 -0
  100. package/out/src/parquet-wrapper/reader.js.map +1 -0
  101. package/out/src/parquet-wrapper/schema.d.ts +45 -0
  102. package/out/src/parquet-wrapper/schema.d.ts.map +1 -0
  103. package/out/src/parquet-wrapper/schema.js +55 -0
  104. package/out/src/parquet-wrapper/schema.js.map +1 -0
  105. package/out/src/parquet-wrapper/writer.d.ts +41 -0
  106. package/out/src/parquet-wrapper/writer.d.ts.map +1 -0
  107. package/out/src/parquet-wrapper/writer.js +71 -0
  108. package/out/src/parquet-wrapper/writer.js.map +1 -0
  109. package/out/src/parquet.d.ts +122 -0
  110. package/out/src/parquet.d.ts.map +1 -0
  111. package/out/src/parquet.js +220 -0
  112. package/out/src/parquet.js.map +1 -0
  113. package/out/src/runner.d.ts +100 -0
  114. package/out/src/runner.d.ts.map +1 -0
  115. package/out/src/runner.js +183 -0
  116. package/out/src/runner.js.map +1 -0
  117. package/out/src/split.d.ts +108 -0
  118. package/out/src/split.d.ts.map +1 -0
  119. package/out/src/split.js +191 -0
  120. package/out/src/split.js.map +1 -0
  121. package/out/src/synthesize.d.ts +146 -0
  122. package/out/src/synthesize.d.ts.map +1 -0
  123. package/out/src/synthesize.js +472 -0
  124. package/out/src/synthesize.js.map +1 -0
  125. package/out/src/tokenize.d.ts +47 -0
  126. package/out/src/tokenize.d.ts.map +1 -0
  127. package/out/src/tokenize.js +49 -0
  128. package/out/src/tokenize.js.map +1 -0
  129. package/out/src/types.d.ts +168 -0
  130. package/out/src/types.d.ts.map +1 -0
  131. package/out/src/types.js +19 -0
  132. package/out/src/types.js.map +1 -0
  133. package/out/src/wof-json.d.ts +105 -0
  134. package/out/src/wof-json.d.ts.map +1 -0
  135. package/out/src/wof-json.js +174 -0
  136. package/out/src/wof-json.js.map +1 -0
  137. package/package.json +36 -0
@@ -0,0 +1,259 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * USPS Publication 28, Appendix C — Postal Service Standard Suffix Abbreviations.
7
+ *
8
+ * This module exposes the codex (the dataset itself) plus a small set of pure helpers used by the
9
+ * synthesis layer's `us-street-suffix-abbreviate` / `us-street-suffix-expand` augmentations.
10
+ *
11
+ * For each canonical suffix the value lists every recognized variant in USPS-published order; the
12
+ * first variant is the preferred USPS abbreviation (e.g. `AVENUE → ["AVE", "AV", "AVEN", "AVENU",
13
+ * "AVN", "AVNUE"]` — `AVE` is what the post office prints).
14
+ *
15
+ * Salvaged 2026-05-17 from `isp-nexus/universe@6eeb7bd99643a6d62a8b8abbd50968a1e492b90b`
16
+ * `mailwoman/postal/suffix.ts` (originally copyright OpenISP, Inc.; both projects are AGPL-3.0).
17
+ * The dataset is verbatim; the helper API was reshaped to match mailwoman's synthesis registry
18
+ * (the original isp-nexus `lookupStreetSuffix` was geared toward parsing, not augmentation).
19
+ * @see {@link https://pe.usps.com/text/pub28/28apc_002.htm USPS Street Suffix Abbreviations}
20
+ */
21
+ /**
22
+ * Canonical USPS street suffix → list of recognized variants. The first variant in each list is the
23
+ * preferred USPS abbreviation. Keys + values are uppercase per the publication.
24
+ */
25
+ export declare const US_STREET_SUFFIX_VARIANTS: {
26
+ readonly ALLEY: readonly ["ALY", "ALLEE", "ALLY"];
27
+ readonly ANEX: readonly ["ANX", "ANNEX", "ANNX"];
28
+ readonly ARCADE: readonly ["ARC"];
29
+ readonly AVENUE: readonly ["AVE", "AV", "AVEN", "AVENU", "AVN", "AVNUE"];
30
+ readonly BAYOU: readonly ["BYU", "BAYOO"];
31
+ readonly BEACH: readonly ["BCH"];
32
+ readonly BEND: readonly ["BND"];
33
+ readonly BLUFF: readonly ["BLF", "BLUF"];
34
+ readonly BLUFFS: readonly ["BLFS"];
35
+ readonly BOTTOM: readonly ["BTM", "BOT", "BOTTM"];
36
+ readonly BOULEVARD: readonly ["BLVD", "BOUL", "BOULV"];
37
+ readonly BRANCH: readonly ["BR", "BRNCH"];
38
+ readonly BRIDGE: readonly ["BRG", "BRDGE"];
39
+ readonly BROOK: readonly ["BRK"];
40
+ readonly BROOKS: readonly ["BRKS"];
41
+ readonly BURG: readonly ["BG"];
42
+ readonly BURGS: readonly ["BGS"];
43
+ readonly BYPASS: readonly ["BYP", "BYPA", "BYPAS", "BYPS"];
44
+ readonly CAMP: readonly ["CP", "CMP"];
45
+ readonly CANYON: readonly ["CYN", "CANYN", "CNYN"];
46
+ readonly CAPE: readonly ["CPE"];
47
+ readonly CAUSEWAY: readonly ["CSWY", "CAUSWA"];
48
+ readonly CENTER: readonly ["CTR", "CEN", "CENT", "CENTR", "CENTRE", "CNTER", "CNTR"];
49
+ readonly CENTERS: readonly ["CTRS"];
50
+ readonly CIRCLE: readonly ["CIR", "CIRC", "CIRCL", "CRCL", "CRCLE"];
51
+ readonly CIRCLES: readonly ["CIRS"];
52
+ readonly CLIFF: readonly ["CLF"];
53
+ readonly CLIFFS: readonly ["CLFS"];
54
+ readonly CLUB: readonly ["CLB"];
55
+ readonly COMMON: readonly ["CMN"];
56
+ readonly COMMONS: readonly ["CMNS"];
57
+ readonly CORNER: readonly ["COR"];
58
+ readonly CORNERS: readonly ["CORS"];
59
+ readonly COURSE: readonly ["CRSE"];
60
+ readonly COURT: readonly ["CT"];
61
+ readonly COURTS: readonly ["CTS"];
62
+ readonly COVE: readonly ["CV"];
63
+ readonly COVES: readonly ["CVS"];
64
+ readonly CREEK: readonly ["CRK"];
65
+ readonly CRESCENT: readonly ["CRES", "CRSENT", "CRSNT"];
66
+ readonly CREST: readonly ["CRST"];
67
+ readonly CROSSING: readonly ["XING", "CRSSNG"];
68
+ readonly CROSSROAD: readonly ["XRD"];
69
+ readonly CROSSROADS: readonly ["XRDS"];
70
+ readonly CURVE: readonly ["CURV"];
71
+ readonly DALE: readonly ["DL"];
72
+ readonly DAM: readonly ["DM"];
73
+ readonly DIVIDE: readonly ["DV", "DIV", "DVD"];
74
+ readonly DRIVE: readonly ["DR", "DRIV", "DRV"];
75
+ readonly DRIVES: readonly ["DRS"];
76
+ readonly ESTATE: readonly ["EST"];
77
+ readonly ESTATES: readonly ["ESTS"];
78
+ readonly EXPRESSWAY: readonly ["EXPY", "EXP", "EXPR", "EXPRESS", "EXPW"];
79
+ readonly EXTENSION: readonly ["EXT", "EXTN", "EXTNSN"];
80
+ readonly EXTENSIONS: readonly ["EXTS"];
81
+ readonly FALL: readonly ["FALL"];
82
+ readonly FALLS: readonly ["FLS"];
83
+ readonly FERRY: readonly ["FRY", "FRRY"];
84
+ readonly FIELD: readonly ["FLD"];
85
+ readonly FIELDS: readonly ["FLDS"];
86
+ readonly FLAT: readonly ["FLT"];
87
+ readonly FLATS: readonly ["FLTS"];
88
+ readonly FORD: readonly ["FRD"];
89
+ readonly FORDS: readonly ["FRDS"];
90
+ readonly FOREST: readonly ["FRST", "FORESTS"];
91
+ readonly FORGE: readonly ["FRG", "FORG"];
92
+ readonly FORGES: readonly ["FRGS"];
93
+ readonly FORK: readonly ["FRK"];
94
+ readonly FORKS: readonly ["FRKS"];
95
+ readonly FORT: readonly ["FT", "FRT"];
96
+ readonly FREEWAY: readonly ["FWY", "FREEWY", "FRWAY", "FRWY"];
97
+ readonly GARDEN: readonly ["GDN", "GARDN", "GRDEN", "GRDN"];
98
+ readonly GARDENS: readonly ["GDNS", "GRDNS"];
99
+ readonly GATEWAY: readonly ["GTWY", "GATEWY", "GATWAY", "GTWAY"];
100
+ readonly GLEN: readonly ["GLN"];
101
+ readonly GLENS: readonly ["GLNS"];
102
+ readonly GREEN: readonly ["GRN"];
103
+ readonly GREENS: readonly ["GRNS"];
104
+ readonly GROVE: readonly ["GRV", "GROV"];
105
+ readonly GROVES: readonly ["GRVS"];
106
+ readonly HARBOR: readonly ["HBR", "HARB", "HARBR", "HRBOR"];
107
+ readonly HARBORS: readonly ["HBRS"];
108
+ readonly HAVEN: readonly ["HVN"];
109
+ readonly HEIGHTS: readonly ["HTS", "HT"];
110
+ readonly HIGHWAY: readonly ["HWY", "HIGHWY", "HIWAY", "HIWY", "HWAY"];
111
+ readonly HILL: readonly ["HL"];
112
+ readonly HILLS: readonly ["HLS"];
113
+ readonly HOLLOW: readonly ["HOLW", "HLLW", "HOLLOWS", "HOLWS"];
114
+ readonly INLET: readonly ["INLT"];
115
+ readonly ISLAND: readonly ["IS", "ISLND"];
116
+ readonly ISLANDS: readonly ["ISS", "ISLNDS"];
117
+ readonly ISLE: readonly ["ISLE", "ISLES"];
118
+ readonly JUNCTION: readonly ["JCT", "JCTION", "JCTN", "JUNCTN", "JUNCTON"];
119
+ readonly JUNCTIONS: readonly ["JCTS", "JCTNS"];
120
+ readonly KEY: readonly ["KY"];
121
+ readonly KEYS: readonly ["KYS"];
122
+ readonly KNOLL: readonly ["KNL", "KNOL"];
123
+ readonly KNOLLS: readonly ["KNLS"];
124
+ readonly LAKE: readonly ["LK"];
125
+ readonly LAKES: readonly ["LKS"];
126
+ readonly LAND: readonly ["LAND"];
127
+ readonly LANDING: readonly ["LNDG", "LNDNG"];
128
+ readonly LANE: readonly ["LN"];
129
+ readonly LIGHT: readonly ["LGT"];
130
+ readonly LIGHTS: readonly ["LGTS"];
131
+ readonly LOAF: readonly ["LF"];
132
+ readonly LOCK: readonly ["LCK"];
133
+ readonly LOCKS: readonly ["LCKS"];
134
+ readonly LODGE: readonly ["LDG", "LDGE", "LODG"];
135
+ readonly LOOP: readonly ["LOOP", "LOOPS"];
136
+ readonly MALL: readonly ["MALL"];
137
+ readonly MANOR: readonly ["MNR"];
138
+ readonly MANORS: readonly ["MNRS"];
139
+ readonly MEADOW: readonly ["MDW"];
140
+ readonly MEADOWS: readonly ["MDWS", "MDW", "MEDOWS"];
141
+ readonly MEWS: readonly ["MEWS"];
142
+ readonly MILL: readonly ["ML"];
143
+ readonly MILLS: readonly ["MLS"];
144
+ readonly MISSION: readonly ["MSN", "MISSN", "MSSN"];
145
+ readonly MOTORWAY: readonly ["MTWY"];
146
+ readonly MOUNT: readonly ["MT", "MNT"];
147
+ readonly MOUNTAIN: readonly ["MTN", "MNTAIN", "MNTN", "MOUNTIN", "MTIN"];
148
+ readonly MOUNTAINS: readonly ["MTNS", "MNTNS"];
149
+ readonly NECK: readonly ["NCK"];
150
+ readonly ORCHARD: readonly ["ORCH", "ORCHRD"];
151
+ readonly OVAL: readonly ["OVAL", "OVL"];
152
+ readonly OVERPASS: readonly ["OPAS"];
153
+ readonly PARK: readonly ["PARK", "PRK", "PARKS"];
154
+ readonly PARKWAY: readonly ["PKWY", "PARKWY", "PKWAY", "PKY"];
155
+ readonly PARKWAYS: readonly ["PKWY", "PKWYS"];
156
+ readonly PASS: readonly ["PASS"];
157
+ readonly PASSAGE: readonly ["PSGE"];
158
+ readonly PATH: readonly ["PATH", "PATHS"];
159
+ readonly PIKE: readonly ["PIKE", "PIKES"];
160
+ readonly PINE: readonly ["PNE"];
161
+ readonly PINES: readonly ["PNES"];
162
+ readonly PLACE: readonly ["PL"];
163
+ readonly PLAIN: readonly ["PLN"];
164
+ readonly PLAINS: readonly ["PLNS"];
165
+ readonly PLAZA: readonly ["PLZ", "PLZA"];
166
+ readonly POINT: readonly ["PT"];
167
+ readonly POINTS: readonly ["PTS"];
168
+ readonly PORT: readonly ["PRT"];
169
+ readonly PORTS: readonly ["PRTS"];
170
+ readonly PRAIRIE: readonly ["PR", "PRR"];
171
+ readonly RADIAL: readonly ["RADL", "RAD", "RADIEL"];
172
+ readonly RAMP: readonly ["RAMP"];
173
+ readonly RANCH: readonly ["RNCH", "RANCHES", "RNCHS"];
174
+ readonly RAPID: readonly ["RPD"];
175
+ readonly RAPIDS: readonly ["RPDS"];
176
+ readonly REST: readonly ["RST"];
177
+ readonly RIDGE: readonly ["RDG", "RDGE"];
178
+ readonly RIDGES: readonly ["RDGS"];
179
+ readonly RIVER: readonly ["RIV", "RVR", "RIVR"];
180
+ readonly ROAD: readonly ["RD"];
181
+ readonly ROADS: readonly ["RDS"];
182
+ readonly ROUTE: readonly ["RTE"];
183
+ readonly ROW: readonly ["ROW"];
184
+ readonly RUE: readonly ["RUE"];
185
+ readonly RUN: readonly ["RUN"];
186
+ readonly SHOAL: readonly ["SHL"];
187
+ readonly SHOALS: readonly ["SHLS"];
188
+ readonly SHORE: readonly ["SHR", "SHOAR"];
189
+ readonly SHORES: readonly ["SHRS", "SHOARS"];
190
+ readonly SKYWAY: readonly ["SKWY"];
191
+ readonly SPRING: readonly ["SPG", "SPNG", "SPRNG"];
192
+ readonly SPRINGS: readonly ["SPGS", "SPNGS", "SPRNGS"];
193
+ readonly SPUR: readonly ["SPUR"];
194
+ readonly SPURS: readonly ["SPUR"];
195
+ readonly SQUARE: readonly ["SQ", "SQR", "SQRE", "SQU"];
196
+ readonly SQUARES: readonly ["SQS", "SQRS"];
197
+ readonly STATION: readonly ["STA", "STATN", "STN"];
198
+ readonly STRAVENUE: readonly ["STRA", "STRAV", "STRAVEN", "STRAVN", "STRVN", "STRVNUE"];
199
+ readonly STREAM: readonly ["STRM", "STREME"];
200
+ readonly STREET: readonly ["ST", "STRT", "STR"];
201
+ readonly STREETS: readonly ["STS"];
202
+ readonly SUMMIT: readonly ["SMT", "SUMIT", "SUMITT"];
203
+ readonly TERRACE: readonly ["TER", "TERR"];
204
+ readonly THROUGHWAY: readonly ["TRWY"];
205
+ readonly TRACE: readonly ["TRCE", "TRACES"];
206
+ readonly TRACK: readonly ["TRAK", "TRACKS", "TRK", "TRKS"];
207
+ readonly TRAFFICWAY: readonly ["TRFY"];
208
+ readonly TRAIL: readonly ["TRL", "TRAILS", "TRLS"];
209
+ readonly TRAILER: readonly ["TRLR", "TRLRS"];
210
+ readonly TUNNEL: readonly ["TUNL", "TUNEL", "TUNLS", "TUNNELS", "TUNNL"];
211
+ readonly TURNPIKE: readonly ["TPKE", "TRNPK", "TURNPK"];
212
+ readonly UNDERPASS: readonly ["UPAS"];
213
+ readonly UNION: readonly ["UN"];
214
+ readonly UNIONS: readonly ["UNS"];
215
+ readonly VALLEY: readonly ["VLY", "VALLY", "VLLY"];
216
+ readonly VALLEYS: readonly ["VLYS"];
217
+ readonly VIADUCT: readonly ["VIA", "VDCT", "VIADCT"];
218
+ readonly VIEW: readonly ["VW"];
219
+ readonly VIEWS: readonly ["VWS"];
220
+ readonly VILLAGE: readonly ["VLG", "VILL", "VILLAG", "VILLG", "VILLIAGE"];
221
+ readonly VILLAGES: readonly ["VLGS"];
222
+ readonly VILLE: readonly ["VL"];
223
+ readonly VISTA: readonly ["VIS", "VIST", "VST", "VSTA"];
224
+ readonly WALK: readonly ["WALK"];
225
+ readonly WALKS: readonly ["WALK"];
226
+ readonly WALL: readonly ["WALL"];
227
+ readonly WAY: readonly ["WAY", "WY"];
228
+ readonly WAYS: readonly ["WAYS"];
229
+ readonly WELL: readonly ["WL"];
230
+ readonly WELLS: readonly ["WLS"];
231
+ };
232
+ /** Canonical USPS suffix (full word, uppercase per the publication). */
233
+ export type UsStreetSuffix = keyof typeof US_STREET_SUFFIX_VARIANTS;
234
+ /**
235
+ * Inverse lookup: every variant abbreviation OR full canonical word → its canonical key.
236
+ *
237
+ * Built once at module load. `STREET` → `"STREET"`, `ST` → `"STREET"`, `STRT` → `"STREET"`, etc.
238
+ * Built lowercase-keyed for case-insensitive matching.
239
+ */
240
+ export declare const US_STREET_SUFFIX_LOOKUP: ReadonlyMap<string, UsStreetSuffix>;
241
+ /** Preferred USPS abbreviation per canonical (`AVENUE → "AVE"`, `STREET → "ST"`). */
242
+ export declare const US_STREET_SUFFIX_PREFERRED_ABBR: Readonly<Record<UsStreetSuffix, string>>;
243
+ /**
244
+ * Apply `target`'s letters in the same case-pattern as `reference`. Three patterns covered:
245
+ *
246
+ * - All-uppercase reference (`"AVE"`) → uppercase target (`"AVENUE"`).
247
+ * - All-lowercase reference (`"ave"`) → lowercase target (`"avenue"`).
248
+ * - Anything else (`"Ave"`, `"aVe"`) → title-case target (`"Avenue"`).
249
+ */
250
+ export declare function matchCase(target: string, reference: string): string;
251
+ /**
252
+ * If the last whitespace-separated word of `street` is a known USPS suffix variant, return the
253
+ * canonical key and the matched word. Returns null if the trailing word isn't a known suffix.
254
+ */
255
+ export declare function matchTrailingSuffix(street: string): {
256
+ canonical: UsStreetSuffix;
257
+ matched: string;
258
+ } | null;
259
+ //# sourceMappingURL=us-street-suffix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"us-street-suffix.d.ts","sourceRoot":"","sources":["../../../src/codex/us-street-suffix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8MgB,CAAA;AAEtD,wEAAwE;AACxE,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,yBAAyB,CAAA;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAYpE,CAAA;AAEJ,qFAAqF;AACrF,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAExC,CAAA;AAE7C;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQzG"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * USPS Publication 28, Appendix C — Postal Service Standard Suffix Abbreviations.
7
+ *
8
+ * This module exposes the codex (the dataset itself) plus a small set of pure helpers used by the
9
+ * synthesis layer's `us-street-suffix-abbreviate` / `us-street-suffix-expand` augmentations.
10
+ *
11
+ * For each canonical suffix the value lists every recognized variant in USPS-published order; the
12
+ * first variant is the preferred USPS abbreviation (e.g. `AVENUE → ["AVE", "AV", "AVEN", "AVENU",
13
+ * "AVN", "AVNUE"]` — `AVE` is what the post office prints).
14
+ *
15
+ * Salvaged 2026-05-17 from `isp-nexus/universe@6eeb7bd99643a6d62a8b8abbd50968a1e492b90b`
16
+ * `mailwoman/postal/suffix.ts` (originally copyright OpenISP, Inc.; both projects are AGPL-3.0).
17
+ * The dataset is verbatim; the helper API was reshaped to match mailwoman's synthesis registry
18
+ * (the original isp-nexus `lookupStreetSuffix` was geared toward parsing, not augmentation).
19
+ * @see {@link https://pe.usps.com/text/pub28/28apc_002.htm USPS Street Suffix Abbreviations}
20
+ */
21
+ /**
22
+ * Canonical USPS street suffix → list of recognized variants. The first variant in each list is the
23
+ * preferred USPS abbreviation. Keys + values are uppercase per the publication.
24
+ */
25
+ export const US_STREET_SUFFIX_VARIANTS = {
26
+ ALLEY: ["ALY", "ALLEE", "ALLY"],
27
+ ANEX: ["ANX", "ANNEX", "ANNX"],
28
+ ARCADE: ["ARC"],
29
+ AVENUE: ["AVE", "AV", "AVEN", "AVENU", "AVN", "AVNUE"],
30
+ BAYOU: ["BYU", "BAYOO"],
31
+ BEACH: ["BCH"],
32
+ BEND: ["BND"],
33
+ BLUFF: ["BLF", "BLUF"],
34
+ BLUFFS: ["BLFS"],
35
+ BOTTOM: ["BTM", "BOT", "BOTTM"],
36
+ BOULEVARD: ["BLVD", "BOUL", "BOULV"],
37
+ BRANCH: ["BR", "BRNCH"],
38
+ BRIDGE: ["BRG", "BRDGE"],
39
+ BROOK: ["BRK"],
40
+ BROOKS: ["BRKS"],
41
+ BURG: ["BG"],
42
+ BURGS: ["BGS"],
43
+ BYPASS: ["BYP", "BYPA", "BYPAS", "BYPS"],
44
+ CAMP: ["CP", "CMP"],
45
+ CANYON: ["CYN", "CANYN", "CNYN"],
46
+ CAPE: ["CPE"],
47
+ CAUSEWAY: ["CSWY", "CAUSWA"],
48
+ CENTER: ["CTR", "CEN", "CENT", "CENTR", "CENTRE", "CNTER", "CNTR"],
49
+ CENTERS: ["CTRS"],
50
+ CIRCLE: ["CIR", "CIRC", "CIRCL", "CRCL", "CRCLE"],
51
+ CIRCLES: ["CIRS"],
52
+ CLIFF: ["CLF"],
53
+ CLIFFS: ["CLFS"],
54
+ CLUB: ["CLB"],
55
+ COMMON: ["CMN"],
56
+ COMMONS: ["CMNS"],
57
+ CORNER: ["COR"],
58
+ CORNERS: ["CORS"],
59
+ COURSE: ["CRSE"],
60
+ COURT: ["CT"],
61
+ COURTS: ["CTS"],
62
+ COVE: ["CV"],
63
+ COVES: ["CVS"],
64
+ CREEK: ["CRK"],
65
+ CRESCENT: ["CRES", "CRSENT", "CRSNT"],
66
+ CREST: ["CRST"],
67
+ CROSSING: ["XING", "CRSSNG"],
68
+ CROSSROAD: ["XRD"],
69
+ CROSSROADS: ["XRDS"],
70
+ CURVE: ["CURV"],
71
+ DALE: ["DL"],
72
+ DAM: ["DM"],
73
+ DIVIDE: ["DV", "DIV", "DVD"],
74
+ DRIVE: ["DR", "DRIV", "DRV"],
75
+ DRIVES: ["DRS"],
76
+ ESTATE: ["EST"],
77
+ ESTATES: ["ESTS"],
78
+ EXPRESSWAY: ["EXPY", "EXP", "EXPR", "EXPRESS", "EXPW"],
79
+ EXTENSION: ["EXT", "EXTN", "EXTNSN"],
80
+ EXTENSIONS: ["EXTS"],
81
+ FALL: ["FALL"],
82
+ FALLS: ["FLS"],
83
+ FERRY: ["FRY", "FRRY"],
84
+ FIELD: ["FLD"],
85
+ FIELDS: ["FLDS"],
86
+ FLAT: ["FLT"],
87
+ FLATS: ["FLTS"],
88
+ FORD: ["FRD"],
89
+ FORDS: ["FRDS"],
90
+ FOREST: ["FRST", "FORESTS"],
91
+ FORGE: ["FRG", "FORG"],
92
+ FORGES: ["FRGS"],
93
+ FORK: ["FRK"],
94
+ FORKS: ["FRKS"],
95
+ FORT: ["FT", "FRT"],
96
+ FREEWAY: ["FWY", "FREEWY", "FRWAY", "FRWY"],
97
+ GARDEN: ["GDN", "GARDN", "GRDEN", "GRDN"],
98
+ GARDENS: ["GDNS", "GRDNS"],
99
+ GATEWAY: ["GTWY", "GATEWY", "GATWAY", "GTWAY"],
100
+ GLEN: ["GLN"],
101
+ GLENS: ["GLNS"],
102
+ GREEN: ["GRN"],
103
+ GREENS: ["GRNS"],
104
+ GROVE: ["GRV", "GROV"],
105
+ GROVES: ["GRVS"],
106
+ HARBOR: ["HBR", "HARB", "HARBR", "HRBOR"],
107
+ HARBORS: ["HBRS"],
108
+ HAVEN: ["HVN"],
109
+ HEIGHTS: ["HTS", "HT"],
110
+ HIGHWAY: ["HWY", "HIGHWY", "HIWAY", "HIWY", "HWAY"],
111
+ HILL: ["HL"],
112
+ HILLS: ["HLS"],
113
+ HOLLOW: ["HOLW", "HLLW", "HOLLOWS", "HOLWS"],
114
+ INLET: ["INLT"],
115
+ ISLAND: ["IS", "ISLND"],
116
+ ISLANDS: ["ISS", "ISLNDS"],
117
+ ISLE: ["ISLE", "ISLES"],
118
+ JUNCTION: ["JCT", "JCTION", "JCTN", "JUNCTN", "JUNCTON"],
119
+ JUNCTIONS: ["JCTS", "JCTNS"],
120
+ KEY: ["KY"],
121
+ KEYS: ["KYS"],
122
+ KNOLL: ["KNL", "KNOL"],
123
+ KNOLLS: ["KNLS"],
124
+ LAKE: ["LK"],
125
+ LAKES: ["LKS"],
126
+ LAND: ["LAND"],
127
+ LANDING: ["LNDG", "LNDNG"],
128
+ LANE: ["LN"],
129
+ LIGHT: ["LGT"],
130
+ LIGHTS: ["LGTS"],
131
+ LOAF: ["LF"],
132
+ LOCK: ["LCK"],
133
+ LOCKS: ["LCKS"],
134
+ LODGE: ["LDG", "LDGE", "LODG"],
135
+ LOOP: ["LOOP", "LOOPS"],
136
+ MALL: ["MALL"],
137
+ MANOR: ["MNR"],
138
+ MANORS: ["MNRS"],
139
+ MEADOW: ["MDW"],
140
+ MEADOWS: ["MDWS", "MDW", "MEDOWS"],
141
+ MEWS: ["MEWS"],
142
+ MILL: ["ML"],
143
+ MILLS: ["MLS"],
144
+ MISSION: ["MSN", "MISSN", "MSSN"],
145
+ MOTORWAY: ["MTWY"],
146
+ MOUNT: ["MT", "MNT"],
147
+ MOUNTAIN: ["MTN", "MNTAIN", "MNTN", "MOUNTIN", "MTIN"],
148
+ MOUNTAINS: ["MTNS", "MNTNS"],
149
+ NECK: ["NCK"],
150
+ ORCHARD: ["ORCH", "ORCHRD"],
151
+ OVAL: ["OVAL", "OVL"],
152
+ OVERPASS: ["OPAS"],
153
+ PARK: ["PARK", "PRK", "PARKS"],
154
+ PARKWAY: ["PKWY", "PARKWY", "PKWAY", "PKY"],
155
+ PARKWAYS: ["PKWY", "PKWYS"],
156
+ PASS: ["PASS"],
157
+ PASSAGE: ["PSGE"],
158
+ PATH: ["PATH", "PATHS"],
159
+ PIKE: ["PIKE", "PIKES"],
160
+ PINE: ["PNE"],
161
+ PINES: ["PNES"],
162
+ PLACE: ["PL"],
163
+ PLAIN: ["PLN"],
164
+ PLAINS: ["PLNS"],
165
+ PLAZA: ["PLZ", "PLZA"],
166
+ POINT: ["PT"],
167
+ POINTS: ["PTS"],
168
+ PORT: ["PRT"],
169
+ PORTS: ["PRTS"],
170
+ PRAIRIE: ["PR", "PRR"],
171
+ RADIAL: ["RADL", "RAD", "RADIEL"],
172
+ RAMP: ["RAMP"],
173
+ RANCH: ["RNCH", "RANCHES", "RNCHS"],
174
+ RAPID: ["RPD"],
175
+ RAPIDS: ["RPDS"],
176
+ REST: ["RST"],
177
+ RIDGE: ["RDG", "RDGE"],
178
+ RIDGES: ["RDGS"],
179
+ RIVER: ["RIV", "RVR", "RIVR"],
180
+ ROAD: ["RD"],
181
+ ROADS: ["RDS"],
182
+ ROUTE: ["RTE"],
183
+ ROW: ["ROW"],
184
+ RUE: ["RUE"],
185
+ RUN: ["RUN"],
186
+ SHOAL: ["SHL"],
187
+ SHOALS: ["SHLS"],
188
+ SHORE: ["SHR", "SHOAR"],
189
+ SHORES: ["SHRS", "SHOARS"],
190
+ SKYWAY: ["SKWY"],
191
+ SPRING: ["SPG", "SPNG", "SPRNG"],
192
+ SPRINGS: ["SPGS", "SPNGS", "SPRNGS"],
193
+ SPUR: ["SPUR"],
194
+ SPURS: ["SPUR"],
195
+ SQUARE: ["SQ", "SQR", "SQRE", "SQU"],
196
+ SQUARES: ["SQS", "SQRS"],
197
+ STATION: ["STA", "STATN", "STN"],
198
+ STRAVENUE: ["STRA", "STRAV", "STRAVEN", "STRAVN", "STRVN", "STRVNUE"],
199
+ STREAM: ["STRM", "STREME"],
200
+ STREET: ["ST", "STRT", "STR"],
201
+ STREETS: ["STS"],
202
+ SUMMIT: ["SMT", "SUMIT", "SUMITT"],
203
+ TERRACE: ["TER", "TERR"],
204
+ THROUGHWAY: ["TRWY"],
205
+ TRACE: ["TRCE", "TRACES"],
206
+ TRACK: ["TRAK", "TRACKS", "TRK", "TRKS"],
207
+ TRAFFICWAY: ["TRFY"],
208
+ TRAIL: ["TRL", "TRAILS", "TRLS"],
209
+ TRAILER: ["TRLR", "TRLRS"],
210
+ TUNNEL: ["TUNL", "TUNEL", "TUNLS", "TUNNELS", "TUNNL"],
211
+ TURNPIKE: ["TPKE", "TRNPK", "TURNPK"],
212
+ UNDERPASS: ["UPAS"],
213
+ UNION: ["UN"],
214
+ UNIONS: ["UNS"],
215
+ VALLEY: ["VLY", "VALLY", "VLLY"],
216
+ VALLEYS: ["VLYS"],
217
+ VIADUCT: ["VIA", "VDCT", "VIADCT"],
218
+ VIEW: ["VW"],
219
+ VIEWS: ["VWS"],
220
+ VILLAGE: ["VLG", "VILL", "VILLAG", "VILLG", "VILLIAGE"],
221
+ VILLAGES: ["VLGS"],
222
+ VILLE: ["VL"],
223
+ VISTA: ["VIS", "VIST", "VST", "VSTA"],
224
+ WALK: ["WALK"],
225
+ WALKS: ["WALK"],
226
+ WALL: ["WALL"],
227
+ WAY: ["WAY", "WY"],
228
+ WAYS: ["WAYS"],
229
+ WELL: ["WL"],
230
+ WELLS: ["WLS"],
231
+ };
232
+ /**
233
+ * Inverse lookup: every variant abbreviation OR full canonical word → its canonical key.
234
+ *
235
+ * Built once at module load. `STREET` → `"STREET"`, `ST` → `"STREET"`, `STRT` → `"STREET"`, etc.
236
+ * Built lowercase-keyed for case-insensitive matching.
237
+ */
238
+ export const US_STREET_SUFFIX_LOOKUP = (() => {
239
+ const out = new Map();
240
+ for (const canonical of Object.keys(US_STREET_SUFFIX_VARIANTS)) {
241
+ out.set(canonical.toLowerCase(), canonical);
242
+ for (const variant of US_STREET_SUFFIX_VARIANTS[canonical]) {
243
+ // Don't overwrite — first canonical that claims a variant wins (matches USPS Pub-28's
244
+ // ordering). E.g. "WALK" and "WALKS" both list "WALK" as a variant; "WALK" wins because
245
+ // it sorts first in `Object.keys`.
246
+ if (!out.has(variant.toLowerCase()))
247
+ out.set(variant.toLowerCase(), canonical);
248
+ }
249
+ }
250
+ return out;
251
+ })();
252
+ /** Preferred USPS abbreviation per canonical (`AVENUE → "AVE"`, `STREET → "ST"`). */
253
+ export const US_STREET_SUFFIX_PREFERRED_ABBR = Object.fromEntries(Object.keys(US_STREET_SUFFIX_VARIANTS).map((k) => [k, US_STREET_SUFFIX_VARIANTS[k][0]]));
254
+ /**
255
+ * Apply `target`'s letters in the same case-pattern as `reference`. Three patterns covered:
256
+ *
257
+ * - All-uppercase reference (`"AVE"`) → uppercase target (`"AVENUE"`).
258
+ * - All-lowercase reference (`"ave"`) → lowercase target (`"avenue"`).
259
+ * - Anything else (`"Ave"`, `"aVe"`) → title-case target (`"Avenue"`).
260
+ */
261
+ export function matchCase(target, reference) {
262
+ if (!reference)
263
+ return target;
264
+ if (reference === reference.toUpperCase())
265
+ return target.toUpperCase();
266
+ if (reference === reference.toLowerCase())
267
+ return target.toLowerCase();
268
+ return target.charAt(0).toUpperCase() + target.slice(1).toLowerCase();
269
+ }
270
+ /**
271
+ * If the last whitespace-separated word of `street` is a known USPS suffix variant, return the
272
+ * canonical key and the matched word. Returns null if the trailing word isn't a known suffix.
273
+ */
274
+ export function matchTrailingSuffix(street) {
275
+ const trimmed = street.trim();
276
+ if (!trimmed)
277
+ return null;
278
+ const parts = trimmed.split(/\s+/);
279
+ const last = parts[parts.length - 1];
280
+ const canonical = US_STREET_SUFFIX_LOOKUP.get(last.toLowerCase());
281
+ if (!canonical)
282
+ return null;
283
+ return { canonical, matched: last };
284
+ }
285
+ //# sourceMappingURL=us-street-suffix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"us-street-suffix.js","sourceRoot":"","sources":["../../../src/codex/us-street-suffix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Render a `ComponentTag`-keyed dict into a country-localized string.
7
+ *
8
+ * Phase 1's adapters carry ground-truth components but need a plausible `raw` string for the model
9
+ * to learn from. This module bridges Mailwoman's `ComponentTag` schema to OpenCage's
10
+ * `address-formatting` templates (vendored via `@fragaria/address-formatter`, MIT) so adapters
11
+ * can synthesize idiomatic per-country output without each one reinventing the template logic.
12
+ *
13
+ * `@fragaria/address-formatter` returns multi-line strings (newline-separated). This module honors
14
+ * that by default and exposes a `separator` option to coerce to single-line when an adapter wants
15
+ * `", "` joined output for the corpus.
16
+ *
17
+ * Limitations (documented, not blockers for Phase 1):
18
+ *
19
+ * - `unit`: OpenCage's vocabulary doesn't have a slot, so units are appended to the road line
20
+ * (`"Pennsylvania Ave NW Apt 4B"`). Phase 2 or beyond can change this if needed.
21
+ * - `intersection_a` / `intersection_b`: joined as `"<a> & <b>"` into the road field.
22
+ * - `cedex` (FR): folded into `postcode` (e.g. `"75008 CEDEX 08"`) so the FR template renders it in
23
+ * the right slot.
24
+ * - JP-specific tags (`prefecture`, `municipality`, ...): no mapping yet — left for Phase 6 when JP
25
+ * becomes a live locale.
26
+ */
27
+ import type { ComponentTag } from "@mailwoman/core/types";
28
+ /** Options accepted by `formatAddress`. */
29
+ export interface FormatAddressOptions {
30
+ /**
31
+ * Append the country name as a final line (`"USA"`, `"France"`). Default `false`: most corpus
32
+ * rows are intra-country and the country prefix is redundant noise.
33
+ */
34
+ appendCountry?: boolean;
35
+ /**
36
+ * Apply OpenCage's per-country abbreviation rules (e.g. `"Avenue"` → `"Ave"`, `"Boulevard"` →
37
+ * `"Blvd"`). Default `false`. Phase 1 prefers unabbreviated output because synthesis
38
+ * (`synthesize.ts`) handles abbreviation swaps as its own augmentation pass.
39
+ */
40
+ abbreviate?: boolean;
41
+ /**
42
+ * Replace the template's newlines with this separator. Default `undefined` (keep newlines). Use
43
+ * `", "` to get a single-line output, or `" "` to remove all internal punctuation.
44
+ */
45
+ separator?: string;
46
+ }
47
+ type ComponentDict = Partial<Record<ComponentTag, string>>;
48
+ /**
49
+ * After rendering, drop any component whose value isn't actually present in the formatted `raw`.
50
+ * OpenCage's per-country templates legitimately omit some inputs:
51
+ *
52
+ * - **FR**: regions are absorbed by the postcode and rarely render verbatim (`"75008 Paris, France"`
53
+ * — `"Île-de-France"` is dropped).
54
+ * - **US**: state names are abbreviated (`"Oregon"` → `"OR"`); the verbatim form may not survive.
55
+ *
56
+ * Alignment downstream requires `components[tag]` to occur in `raw` (within fuzzy-match tolerance).
57
+ * If a component was dropped or transformed beyond Levenshtein reach, keeping it in the dict
58
+ * guarantees a quarantine reject. Reconciliation prunes the dropouts up front so the row arrives at
59
+ * alignment with a self-consistent (`raw`, `components`) pair.
60
+ *
61
+ * Comparison is case- and whitespace-insensitive. The retained value in `components` is the
62
+ * **original** input — alignment will fuzzy-match it against the raw character span.
63
+ */
64
+ export declare function reconcileComponents(components: ComponentDict, raw: string): ComponentDict;
65
+ /**
66
+ * Render a component dict into an idiomatic per-country address string.
67
+ *
68
+ * Returns an empty string if `components` is empty after translation. Throws nothing — bad inputs
69
+ * (empty dict, unsupported tag) silently degrade to the longest meaningful prefix.
70
+ */
71
+ export declare function formatAddress(components: ComponentDict, country: string, opts?: FormatAddressOptions): string;
72
+ /**
73
+ * Translate a `ComponentTag` dict to the OpenCage vocabulary that `@fragaria/address-formatter`
74
+ * expects. Exported for testing and for adapters that want to pre-build the dict for batch
75
+ * formatting.
76
+ */
77
+ export declare function toOpenCageComponents(components: ComponentDict, country: string): Record<string, string>;
78
+ export {};
79
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,2CAA2C;AAC3C,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,KAAK,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;AAE1D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAWzF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,MAAM,CAWjH;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BvG"}