mailwoman 4.9.0 → 4.10.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.
- package/out/commands/registry.d.ts.map +1 -0
- package/out/commands/registry.js +326 -0
- package/out/commands/registry.js.map +1 -0
- package/out/geocode-core.d.ts.map +1 -1
- package/out/geocode-core.js +2 -1
- package/out/geocode-core.js.map +1 -1
- package/out/region-recognition.d.ts.map +1 -0
- package/out/region-recognition.js +192 -0
- package/out/region-recognition.js.map +1 -0
- package/package.json +11 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../commands/registry.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,EAQN,KAAK,aAAa,EAGlB,MAAM,qBAAqB,CAAA;AAK5B,OAAO,GAAG,MAAM,KAAK,CAAA;AAGrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAOrD,QAAA,MAAM,eAAe,8CAG+E,CAAA;AAEpG,QAAA,MAAM,aAAa;;;;;;;;;;;;;;qBAuEjB,CAAA;AAEF,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,aAAa,IAAI,OAAO,EAAE,CAAA;AAM5D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,aAO7B,CAAA;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,GAAE,aAA+B,GACnC,aAAa,CAWf;AAiED;;;GAGG;AACH,UAAU,eAAe;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;IAC3B,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;iBACgB;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,CAY7D;AAmGD,QAAA,MAAM,eAAe,EAAE,gBAAgB,CAAC,OAAO,aAAa,EAAE,OAAO,eAAe,CAuCnF,CAAA;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @copyright Sister Software
|
|
4
|
+
* @license AGPL-3.0
|
|
5
|
+
* @author Teffen Ellis, et al.
|
|
6
|
+
*
|
|
7
|
+
* `mailwoman registry <csv>` — the geocode-first record matcher, end to end (#613).
|
|
8
|
+
*
|
|
9
|
+
* This is the integration that runs `@mailwoman/registry`'s cascade on real data: it constructs the
|
|
10
|
+
* heavy geocoder (neural parser + WOF resolver + per-state situs/interp shards — the same wiring
|
|
11
|
+
* as `geocode`) and injects it into the matcher's `GeocodeAddress` seam, so the registry package
|
|
12
|
+
* itself never imports the runtime. Then:
|
|
13
|
+
*
|
|
14
|
+
* CSV → ingest (column-map + normalize) → geocode (the seam) → resolveEntities (block →
|
|
15
|
+
* Fellegi-Sunter score, EM-trained label-free → cluster) → GeoJSON.
|
|
16
|
+
*
|
|
17
|
+
* The thesis it grades: two rows reading `123 Main St` and `123 Main Street Apt 2` — different
|
|
18
|
+
* strings — collapse to one entity because they resolve to the same place. Blocking is
|
|
19
|
+
* geographic, not textual. Needs the weights + shards in hand, so the real run is
|
|
20
|
+
* operator-verifiable (not CI).
|
|
21
|
+
*/
|
|
22
|
+
import { Spinner } from "@inkjs/ui";
|
|
23
|
+
import { decodeAsJson } from "@mailwoman/core/decoder";
|
|
24
|
+
import { createWofResolver } from "@mailwoman/core/resolver";
|
|
25
|
+
import { NeuralAddressClassifier } from "@mailwoman/neural";
|
|
26
|
+
import { geocodeAddressVia, inferMapping, ingestRows, parseCsv, resolveEntities, streamRows, toGeoJSON, } from "@mailwoman/registry";
|
|
27
|
+
import { Text } from "ink";
|
|
28
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
29
|
+
import { setImmediate } from "node:timers/promises";
|
|
30
|
+
import { useEffect, useState } from "react";
|
|
31
|
+
import zod from "zod";
|
|
32
|
+
import { geocodeAddress, ShardProvider } from "../geocode-core.js";
|
|
33
|
+
import { INTERP_RADIUS_CALIBRATION } from "../interp-calibration.js";
|
|
34
|
+
import { resolverDefaultCountry } from "./parse.js";
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// CLI contract — args + options
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
const ArgumentsSchema = zod
|
|
39
|
+
.array(zod.string().describe("Path to a CSV file of contact / organization records"))
|
|
40
|
+
.optional()
|
|
41
|
+
.describe("CSV path(s). Optional when --sources is given (multi-source mode supplies the inputs).");
|
|
42
|
+
const OptionsSchema = zod.object({
|
|
43
|
+
mapping: zod
|
|
44
|
+
.string()
|
|
45
|
+
.optional()
|
|
46
|
+
.describe("Column mapping: a path to a JSON file (or inline JSON) of { id?, source?, name?, organization?, address?, " +
|
|
47
|
+
"phone?, email? }, where each field names the CSV column(s) to draw from. Merged over the base (the built-in " +
|
|
48
|
+
"default, or --infer-mapping's inference); column names are matched case-sensitively."),
|
|
49
|
+
inferMapping: zod
|
|
50
|
+
.boolean()
|
|
51
|
+
.optional()
|
|
52
|
+
.default(false)
|
|
53
|
+
.describe("Infer the column mapping from the header by keyword (best-effort — point it at any reasonably-named CSV). " +
|
|
54
|
+
"Used as the base instead of the built-in default; an explicit --mapping still merges on top. Single-CSV mode."),
|
|
55
|
+
sources: zod
|
|
56
|
+
.string()
|
|
57
|
+
.optional()
|
|
58
|
+
.describe("Multi-source mode: a path to a JSON file (or inline JSON) of [{ path, delimiter?, mapping, source?, limit? }] " +
|
|
59
|
+
"— each dataset gets its own column mapping + provenance label, all resolved into ONE entity set across " +
|
|
60
|
+
"sources with no shared key. An entity spanning ≥2 sources is a cross-dataset link. The positional CSV is " +
|
|
61
|
+
"ignored when --sources is set. Inputs are streamed as UNQUOTED delimited files (tab inferred from .tsv) — " +
|
|
62
|
+
"right for the big government TSVs; convert a quoted CSV first or use the single-CSV path for those."),
|
|
63
|
+
out: zod.string().optional().describe("Write the GeoJSON FeatureCollection here. Default: print to stdout."),
|
|
64
|
+
trainEm: zod
|
|
65
|
+
.boolean()
|
|
66
|
+
.optional()
|
|
67
|
+
.default(true)
|
|
68
|
+
.describe("Fit the Fellegi-Sunter m/u + prior to the data with EM (label-free) before scoring. --no-train-em uses the seeds."),
|
|
69
|
+
threshold: zod
|
|
70
|
+
.number()
|
|
71
|
+
.optional()
|
|
72
|
+
.default(0)
|
|
73
|
+
.describe("Link two records into one entity at or above this match weight (bits). Higher = stricter. Default 0."),
|
|
74
|
+
maxBlockSize: zod
|
|
75
|
+
.number()
|
|
76
|
+
.optional()
|
|
77
|
+
.describe("Skip + report blocks larger than this rather than scanning them (recall vs cost). Default: scan all."),
|
|
78
|
+
source: zod.string().optional().describe("A provenance label stamped on every record (e.g. the dataset name)."),
|
|
79
|
+
locale: zod
|
|
80
|
+
.string()
|
|
81
|
+
.regex(/^[a-z]{2}(-[A-Z]{2})?$/u, "Expected a BCP-47 tag like en-US or fr-FR")
|
|
82
|
+
.optional()
|
|
83
|
+
.default("en-US")
|
|
84
|
+
.describe("Locale tag matching an installed weights package. Default en-US."),
|
|
85
|
+
defaultCountry: zod
|
|
86
|
+
.string()
|
|
87
|
+
.optional()
|
|
88
|
+
.describe("ISO-3166 country to scope the resolver. Defaults from --locale's region subtag (en-US → US)."),
|
|
89
|
+
placeCountry: zod
|
|
90
|
+
.boolean()
|
|
91
|
+
.optional()
|
|
92
|
+
.default(true)
|
|
93
|
+
.describe("The #244 coarse-placer soft country prior (on by default). --no-place-country disables it."),
|
|
94
|
+
resolveDb: zod
|
|
95
|
+
.string()
|
|
96
|
+
.optional()
|
|
97
|
+
.describe("Path to a WOF admin SQLite distribution. Defaults to $MAILWOMAN_WOF_DB; errors if neither is set."),
|
|
98
|
+
dataRoot: zod
|
|
99
|
+
.string()
|
|
100
|
+
.optional()
|
|
101
|
+
.default("/mnt/playpen/mailwoman-data")
|
|
102
|
+
.describe("Root directory for per-state address-point + interpolation shards. Default: /mnt/playpen/mailwoman-data."),
|
|
103
|
+
});
|
|
104
|
+
export { ArgumentsSchema as args, OptionsSchema as options };
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Column mapping
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
/**
|
|
109
|
+
* Built-in best-effort mapping for tidy contact/org CSVs. Multi-column fields are joined (so a CSV
|
|
110
|
+
* that splits the address across columns composes one string). Real datasets with bespoke headers
|
|
111
|
+
* (e.g. NPPES "Provider First Line Business Practice Location Address") pass an explicit --mapping;
|
|
112
|
+
* inferring it from the header is the #603 fast-follow.
|
|
113
|
+
*/
|
|
114
|
+
export const DEFAULT_MAPPING = {
|
|
115
|
+
id: "id",
|
|
116
|
+
name: ["name", "full_name", "first_name", "last_name"],
|
|
117
|
+
organization: ["organization", "org", "company"],
|
|
118
|
+
address: ["address", "address1", "street", "city", "state", "zip", "postal_code"],
|
|
119
|
+
phone: "phone",
|
|
120
|
+
email: "email",
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Resolve --mapping (a file path or inline JSON) and merge it over `base` (default
|
|
124
|
+
* {@link DEFAULT_MAPPING}).
|
|
125
|
+
*/
|
|
126
|
+
export function loadMapping(option, source, base = DEFAULT_MAPPING) {
|
|
127
|
+
let provided = {};
|
|
128
|
+
if (option) {
|
|
129
|
+
const text = option.trim().startsWith("{") ? option : readFileSync(option, "utf8");
|
|
130
|
+
try {
|
|
131
|
+
provided = JSON.parse(text);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
throw new Error(`--mapping is neither a readable file nor valid JSON: ${err.message}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return { ...base, ...provided, ...(source ? { source } : {}) };
|
|
138
|
+
}
|
|
139
|
+
function resolveWofPath(options) {
|
|
140
|
+
const path = options.resolveDb ?? process.env["MAILWOMAN_WOF_DB"];
|
|
141
|
+
if (!path) {
|
|
142
|
+
throw new Error("registry needs a WOF admin SQLite path. Set $MAILWOMAN_WOF_DB or pass --resolve-db <path>.");
|
|
143
|
+
}
|
|
144
|
+
return path;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Construct the heavy geocoder once (neural parser + WOF resolver + per-state shards) and wire it
|
|
148
|
+
* into the matcher's {@link GeocodeAddress} seam. Returns the seam plus a `close` to release the DB
|
|
149
|
+
* handles. Shared by the single-CSV and multi-source paths.
|
|
150
|
+
*/
|
|
151
|
+
async function buildGeocoder(options) {
|
|
152
|
+
const wofPath = resolveWofPath(options);
|
|
153
|
+
let classifier;
|
|
154
|
+
try {
|
|
155
|
+
classifier = await NeuralAddressClassifier.loadFromWeights({ locale: options.locale });
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
throw new Error("registry requires the neural weights. Install @mailwoman/neural-weights-en-us (or a --locale match).");
|
|
159
|
+
}
|
|
160
|
+
let mod;
|
|
161
|
+
try {
|
|
162
|
+
mod = await import("@mailwoman/resolver-wof-sqlite");
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
throw new Error("registry requires `@mailwoman/resolver-wof-sqlite` to be installed.");
|
|
166
|
+
}
|
|
167
|
+
const lookup = new mod.WofSqlitePlaceLookup({ databasePath: wofPath });
|
|
168
|
+
const shardProvider = new ShardProvider(mod, options.dataRoot);
|
|
169
|
+
const shards = shardProvider.for;
|
|
170
|
+
const defaultCountry = resolverDefaultCountry(options) || undefined;
|
|
171
|
+
const resolver = createWofResolver(lookup);
|
|
172
|
+
const seam = geocodeAddressVia({
|
|
173
|
+
parse: async (raw) => decodeAsJson(await classifier.parse(raw, { postcodeRepair: true })),
|
|
174
|
+
geocode: (raw) => geocodeAddress(raw, {
|
|
175
|
+
classifier,
|
|
176
|
+
resolver,
|
|
177
|
+
shards,
|
|
178
|
+
defaultCountry,
|
|
179
|
+
interpCalibration: INTERP_RADIUS_CALIBRATION,
|
|
180
|
+
...(options.placeCountry ? {} : { placeCountry: false }),
|
|
181
|
+
}),
|
|
182
|
+
country: defaultCountry,
|
|
183
|
+
});
|
|
184
|
+
return {
|
|
185
|
+
seam,
|
|
186
|
+
close: () => {
|
|
187
|
+
shardProvider.close();
|
|
188
|
+
lookup.close();
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/** Parse `--sources` (a file path or inline JSON) into specs. */
|
|
193
|
+
export function loadSources(option) {
|
|
194
|
+
const text = /^[[{]/.test(option.trim()) ? option : readFileSync(option, "utf8");
|
|
195
|
+
let parsed;
|
|
196
|
+
try {
|
|
197
|
+
parsed = JSON.parse(text);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
throw new Error(`--sources is neither a readable file nor valid JSON: ${err.message}`);
|
|
201
|
+
}
|
|
202
|
+
if (!Array.isArray(parsed) || parsed.some((s) => !s || typeof s.path !== "string")) {
|
|
203
|
+
throw new Error("--sources must be a JSON array of { path, mapping, source?, delimiter?, limit? }.");
|
|
204
|
+
}
|
|
205
|
+
return parsed;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Multi-source mode (#618): stream each dataset under its own mapping + provenance label into ONE
|
|
209
|
+
* combined record set, geocode, resolve, and report the entities that span ≥2 sources — the
|
|
210
|
+
* cross-dataset links. No shared key required; geography is the join.
|
|
211
|
+
*/
|
|
212
|
+
async function runMultiSource(specs, options) {
|
|
213
|
+
const { seam, close } = await buildGeocoder(options);
|
|
214
|
+
try {
|
|
215
|
+
const records = [];
|
|
216
|
+
const perSource = [];
|
|
217
|
+
for (const spec of specs) {
|
|
218
|
+
const label = spec.source ?? spec.path;
|
|
219
|
+
const mapping = { ...spec.mapping, source: label };
|
|
220
|
+
let read = 0;
|
|
221
|
+
const rows = (async function* () {
|
|
222
|
+
for await (const row of streamRows(spec.path, spec.delimiter ? { delimiter: spec.delimiter } : {})) {
|
|
223
|
+
if (spec.limit !== undefined && read >= spec.limit)
|
|
224
|
+
break;
|
|
225
|
+
read++;
|
|
226
|
+
yield row;
|
|
227
|
+
}
|
|
228
|
+
})();
|
|
229
|
+
const recs = await ingestRows(rows, mapping, { geocodeAddress: seam });
|
|
230
|
+
for (const record of recs)
|
|
231
|
+
record.id = `${label}:${record.id}`; // namespace ids so cross-source ids never collide
|
|
232
|
+
records.push(...recs);
|
|
233
|
+
perSource.push(`${label} ${recs.length}`);
|
|
234
|
+
}
|
|
235
|
+
// learnedScorer:false — multi-source is CROSS-dataset link discovery (recall-oriented): the same
|
|
236
|
+
// facility under different operational names across sources is the signal we want. The default GBT is
|
|
237
|
+
// dedup-calibrated and rejects exactly that (it learned "same place + name drift = distinct"), so the
|
|
238
|
+
// cross-dataset path uses the FS spine. (Single-CSV dedup below keeps the GBT default.)
|
|
239
|
+
const result = resolveEntities(records, {
|
|
240
|
+
trainEM: options.trainEm,
|
|
241
|
+
threshold: options.threshold,
|
|
242
|
+
learnedScorer: false,
|
|
243
|
+
...(options.maxBlockSize !== undefined ? { maxBlockSize: options.maxBlockSize } : {}),
|
|
244
|
+
});
|
|
245
|
+
const geojson = toGeoJSON(result.entities);
|
|
246
|
+
const crossSource = result.entities.filter((e) => new Set(e.records.map((r) => r.source).filter(Boolean)).size >= 2).length;
|
|
247
|
+
const geocoded = records.filter((r) => r.address?.geocode).length;
|
|
248
|
+
const summary = `registry --sources: ${specs.length} sources (${perSource.join(", ")}) → ${records.length} records ` +
|
|
249
|
+
`(${geocoded} geocoded) → ${result.entities.length} entities; ${crossSource} span ≥2 sources (cross-dataset links)`;
|
|
250
|
+
if (options.out) {
|
|
251
|
+
writeFileSync(options.out, JSON.stringify(geojson, null, 2));
|
|
252
|
+
return `${summary}\nwrote ${geojson.features.length} features → ${options.out}`;
|
|
253
|
+
}
|
|
254
|
+
return JSON.stringify(geojson, null, 2);
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
close();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
// Core
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
async function runRegistry(csvPath, options) {
|
|
264
|
+
const rows = parseCsv(readFileSync(csvPath, "utf8"));
|
|
265
|
+
// --infer-mapping reads the header (the first row's keys) and guesses the mapping; an explicit --mapping
|
|
266
|
+
// still merges on top of it. Otherwise the base is the built-in default.
|
|
267
|
+
const base = options.inferMapping && rows[0] ? inferMapping(Object.keys(rows[0])) : DEFAULT_MAPPING;
|
|
268
|
+
const mapping = loadMapping(options.mapping, options.source, base);
|
|
269
|
+
const { seam, close } = await buildGeocoder(options);
|
|
270
|
+
try {
|
|
271
|
+
const records = await ingestRows(rows, mapping, { geocodeAddress: seam });
|
|
272
|
+
const result = resolveEntities(records, {
|
|
273
|
+
trainEM: options.trainEm,
|
|
274
|
+
threshold: options.threshold,
|
|
275
|
+
...(options.maxBlockSize !== undefined ? { maxBlockSize: options.maxBlockSize } : {}),
|
|
276
|
+
});
|
|
277
|
+
const geojson = toGeoJSON(result.entities);
|
|
278
|
+
const geocoded = records.filter((r) => r.address?.geocode).length;
|
|
279
|
+
const summary = `registry: ${rows.length} rows → ${records.length} records (${geocoded} geocoded) → ` +
|
|
280
|
+
`${result.entities.length} entities ` +
|
|
281
|
+
`(${result.candidatePairs} candidate pairs${result.droppedBlocks.length ? `, ${result.droppedBlocks.length} oversized blocks skipped` : ""})`;
|
|
282
|
+
if (options.out) {
|
|
283
|
+
writeFileSync(options.out, JSON.stringify(geojson, null, 2));
|
|
284
|
+
return `${summary}\nwrote ${geojson.features.length} features → ${options.out}`;
|
|
285
|
+
}
|
|
286
|
+
return JSON.stringify(geojson, null, 2);
|
|
287
|
+
}
|
|
288
|
+
finally {
|
|
289
|
+
close();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
// React command component
|
|
294
|
+
// ---------------------------------------------------------------------------
|
|
295
|
+
const RegistryCommand = ({ args, options }) => {
|
|
296
|
+
const [output, setOutput] = useState();
|
|
297
|
+
const [error, setError] = useState();
|
|
298
|
+
useEffect(() => {
|
|
299
|
+
if (error) {
|
|
300
|
+
setImmediate().then(() => process.exit(1));
|
|
301
|
+
}
|
|
302
|
+
}, [error]);
|
|
303
|
+
useEffect(() => {
|
|
304
|
+
// `loadSources` can throw on a malformed config — wrap so its error routes to the same handler.
|
|
305
|
+
const task = options.sources
|
|
306
|
+
? Promise.resolve().then(() => runMultiSource(loadSources(options.sources), options))
|
|
307
|
+
: (() => {
|
|
308
|
+
const csv = args?.[0];
|
|
309
|
+
if (!csv || csv.trim().length === 0) {
|
|
310
|
+
return Promise.reject(new Error("registry requires a positional CSV path (or --sources <config.json> for multi-source). " +
|
|
311
|
+
"e.g. mailwoman registry contacts.csv --out entities.geojson"));
|
|
312
|
+
}
|
|
313
|
+
return runRegistry(csv.trim(), options);
|
|
314
|
+
})();
|
|
315
|
+
task.then(setOutput).catch((err) => setError(err.message));
|
|
316
|
+
}, [args, options]);
|
|
317
|
+
if (error) {
|
|
318
|
+
return _jsx(Text, { color: "red", children: error });
|
|
319
|
+
}
|
|
320
|
+
if (!output) {
|
|
321
|
+
return _jsx(Spinner, {});
|
|
322
|
+
}
|
|
323
|
+
return _jsx(Text, { children: output });
|
|
324
|
+
};
|
|
325
|
+
export default RegistryCommand;
|
|
326
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../commands/registry.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geocode-core.d.ts","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAe,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAG9G,OAAO,EAAE,KAAK,mBAAmB,EAAyC,MAAM,mBAAmB,CAAA;AACnG,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAClF,OAAO,EAA8B,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"geocode-core.d.ts","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"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"}
|
package/out/geocode-core.js
CHANGED
|
@@ -25,6 +25,7 @@ import { existsSync } from "node:fs";
|
|
|
25
25
|
import { readReleaseManifest, resolveShardPath } from "./data-release.js";
|
|
26
26
|
import { loadDefaultPlaceCountry } from "./default-placer.js";
|
|
27
27
|
import { interpCalibrationForRegion } from "./interp-calibration.js";
|
|
28
|
+
import { recognizeUsRegions } from "./region-recognition.js";
|
|
28
29
|
/**
|
|
29
30
|
* Anchor weight for the coarse-placer's country prior. Matches the runtime-pipeline default — a
|
|
30
31
|
* whole-string country guess is broader/softer than a postcode anchor (2.0), so it blends gently.
|
|
@@ -157,7 +158,7 @@ export class ShardProvider {
|
|
|
157
158
|
* parse/resolve error — callers doing batch work should catch per-row.
|
|
158
159
|
*/
|
|
159
160
|
export async function geocodeAddress(input, deps) {
|
|
160
|
-
const tree = await deps.classifier.parse(input, { postcodeRepair: true });
|
|
161
|
+
const tree = recognizeUsRegions(await deps.classifier.parse(input, { postcodeRepair: true }));
|
|
161
162
|
const stateSlug = regionSlugFromTree(tree);
|
|
162
163
|
const { addressPoints, interpolation } = deps.shards?.(stateSlug) ?? {};
|
|
163
164
|
const opts = {};
|
package/out/geocode-core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geocode-core.js","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAA4B,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACnG,OAAO,EAAE,uBAAuB,EAAuB,MAAM,qBAAqB,CAAA;AAClF,OAAO,EAAE,0BAA0B,EAA+B,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"geocode-core.js","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAA4B,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACnG,OAAO,EAAE,uBAAuB,EAAuB,MAAM,qBAAqB,CAAA;AAClF,OAAO,EAAE,0BAA0B,EAA+B,MAAM,yBAAyB,CAAA;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAyE5D;;;GAGG;AACH,MAAM,2BAA2B,GAAG,GAAG,CAAA;AAEvC,2FAA2F;AAC3F,MAAM,UAAU,iBAAiB,CAChC,WAAsC,EACtC,YAAuC;IAEvC,KAAK,MAAM,SAAS,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,SAAS;YAAE,SAAQ;QACxB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAChC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC,WAAW,EAAE,CAAA;IAChE,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAiB;IACnD,IAAI,WAAW,GAAkB,IAAI,CAAA;IACrC,IAAI,kBAAkB,GAAkB,IAAI,CAAA;IAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACzB,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAA;YACvC,kBAAkB,GAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAwB,IAAI,IAAI,CAAA;QACtF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,iBAAiB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,SAAwB;IAC/E,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAC3B,MAAM,SAAS,GAAG,GAAG,QAAQ,qCAAqC,SAAS,KAAK,CAAA;IAChF,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AAChD,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,SAAwB;IAC/E,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAC3B,MAAM,SAAS,GAAG,GAAG,QAAQ,mCAAmC,SAAS,KAAK,CAAA;IAC9E,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AAChD,CAAC;AAgBD;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IAChB,QAAQ,CAAoB;IAC5B,SAAS,CAAQ;IACjB,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAA;IACpD,sGAAsG;IACtG,QAAQ,GAA6B,EAAE,CAAA;IACvC,SAAS,CAA4B;IAErC,YAAY,OAA2B,EAAE,QAAgB;QACxD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,SAAiB;QACtB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAC5F,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3F,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAClF,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACxF,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAClF,CAAC;IAEQ,GAAG,GAAkB,CAAC,SAAS,EAAE,EAAE;QAC3C,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAA;QACzB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAA;IAClF,CAAC,CAAA;IAED,+FAA+F;IAC/F,QAAQ;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IACrD,CAAC;IAED;;;;;OAKG;IACH,MAAM;QACL,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,CAAC,CAAC,KAAK,EAAE,CAAA;QACxC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACpD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACvF,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACtF,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM;gBAAE,SAAQ,CAAC,mCAAmC;YAChG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YACvC,IAAI,GAAG,CAAC,GAAG;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACxC,IAAI,GAAG,CAAC,GAAG;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACzC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;IACvB,CAAC;IAED,KAAK;QACJ,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAA;YACd,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAA;QACf,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,CAAC,CAAC,KAAK,EAAE,CAAA;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;IACnB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,IAAiB;IACpE,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC7F,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IAEvE,MAAM,IAAI,GAAgB,EAAE,CAAA;IAC5B,IAAI,IAAI,CAAC,cAAc;QAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;IAClE,mGAAmG;IACnG,4FAA4F;IAC5F,oGAAoG;IACpG,MAAM,YAAY,GACjB,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,uBAAuB,EAAE,CAAC,CAAC,CAAA;IAC9F,IAAI,YAAY,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QAClC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3E,8FAA8F;YAC9F,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,CAAA;YAClF,IAAI,CAAC,YAAY,GAAG,2BAA2B,CAAA;QAChD,CAAC;IACF,CAAC;IACD,IAAI,aAAa;QAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACrD,IAAI,aAAa,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,iGAAiG;QACjG,iFAAiF;QACjF,MAAM,WAAW,GAChB,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ;YACzC,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC;YAC/D,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAA;QAC1B,IAAI,WAAW,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,8BAA8B,GAAG,WAAW,CAAA;QAClD,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC5D,OAAO,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,IAAiB;IACpE,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAClC,MAAM,OAAO,GAAG,CAAC,KAA6B,EAAE,EAAE;QACjD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QACpB,CAAC;IACF,CAAC,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEnB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAA;IAE3D,IAAI,GAAG,GAAkB,IAAI,CAAA;IAC7B,IAAI,GAAG,GAAkB,IAAI,CAAA;IAC7B,IAAI,IAAI,GAAmB,OAAO,CAAA;IAClC,IAAI,YAAY,GAAkB,IAAI,CAAA;IAEtC,IAAI,UAAU,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,KAAK,eAAe,EAAE,CAAC;QACnE,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAA6C,CAAA;QAC3F,IAAI,EAAE,EAAE,CAAC;YACR,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;YACZ,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;YACZ,IAAI,GAAG,eAAe,CAAA;YACtB,YAAY,GAAG,CAAC,CAAA,CAAC,2CAA2C;QAC7D,CAAC;IACF,CAAC;IAED,IAAI,IAAI,KAAK,eAAe,IAAI,UAAU,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,KAAK,cAAc,EAAE,CAAC;QAC9F,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAA6C,CAAA;QAChG,IAAI,EAAE,EAAE,CAAC;YACR,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;YACZ,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;YACZ,IAAI,GAAG,cAAc,CAAA;YACrB,YAAY,GAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAwB,IAAI,IAAI,CAAA;QACpF,CAAC;IACF,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACtB,MAAM,aAAa,GAA0B,CAAC,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;QACpG,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;YAClF,IAAI,IAAI,EAAE,CAAC;gBACV,GAAG,GAAG,IAAI,CAAC,GAAI,CAAA;gBACf,GAAG,GAAG,IAAI,CAAC,GAAI,CAAA;gBACf,MAAK;YACN,CAAC;QACF,CAAC;IACF,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IACpH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IAElF,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,oBAAoB,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC3F,MAAM,SAAS,GAAG,QAAQ;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;SAC7E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC7E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACZ,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QACrB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC,CAAA;IAEJ,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;AACtH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-recognition.d.ts","sourceRoot":"","sources":["../region-recognition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAe,WAAW,EAAgB,MAAM,yBAAyB,CAAA;AA2DrF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxD;AAuFD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAGjE"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* US region recognition (#642) — a rule-based parse-tree correction for the case the neural parser
|
|
7
|
+
* under-handles: a postcode-less "City, State" string. Without a postcode/street anchor the model
|
|
8
|
+
* mis-tags the state — it labels "Texas" a `locality` ("Dublin, Texas" → two localities), or
|
|
9
|
+
* merges the whole string into one locality ("Dublin, TX" / "Athens, Texas"). With no `region`
|
|
10
|
+
* node, the resolver can't scope the locality to its state, so "Dublin, Texas" resolves to the
|
|
11
|
+
* more-populous Dublin, OHIO (the #619 admin-tier >1000 km tail).
|
|
12
|
+
*
|
|
13
|
+
* This is a legitimate atlas/conventions correction: the US states are a CLOSED, known gazetteer,
|
|
14
|
+
* so we can confidently re-tag a state token the grammar missed. It restructures the affected
|
|
15
|
+
* nodes into `region → locality` NESTING, which the resolver's existing parent-scoping then
|
|
16
|
+
* constrains correctly (no resolver change). Two shapes are handled:
|
|
17
|
+
*
|
|
18
|
+
* - A `locality` whose WHOLE value is a US state → it becomes a `region`, and sibling `locality`
|
|
19
|
+
* (city) nodes are nested under it;
|
|
20
|
+
* - A `locality` whose value is a merged `"City, ST"` → split into `region(ST) → locality(City)`.
|
|
21
|
+
*
|
|
22
|
+
* US-scoped by design (the gazetteer is US states). The principled long-term fix is the model
|
|
23
|
+
* recognizing the region; this closes the gap for the bare-`City, State` class today.
|
|
24
|
+
*/
|
|
25
|
+
/** Canonical 2-letter slug for a US state/territory NAME or 2-letter abbreviation, else null. */
|
|
26
|
+
const STATE_NAME_TO_SLUG = {
|
|
27
|
+
alabama: "al",
|
|
28
|
+
alaska: "ak",
|
|
29
|
+
arizona: "az",
|
|
30
|
+
arkansas: "ar",
|
|
31
|
+
california: "ca",
|
|
32
|
+
colorado: "co",
|
|
33
|
+
connecticut: "ct",
|
|
34
|
+
delaware: "de",
|
|
35
|
+
"district of columbia": "dc",
|
|
36
|
+
florida: "fl",
|
|
37
|
+
georgia: "ga",
|
|
38
|
+
hawaii: "hi",
|
|
39
|
+
idaho: "id",
|
|
40
|
+
illinois: "il",
|
|
41
|
+
indiana: "in",
|
|
42
|
+
iowa: "ia",
|
|
43
|
+
kansas: "ks",
|
|
44
|
+
kentucky: "ky",
|
|
45
|
+
louisiana: "la",
|
|
46
|
+
maine: "me",
|
|
47
|
+
maryland: "md",
|
|
48
|
+
massachusetts: "ma",
|
|
49
|
+
michigan: "mi",
|
|
50
|
+
minnesota: "mn",
|
|
51
|
+
mississippi: "ms",
|
|
52
|
+
missouri: "mo",
|
|
53
|
+
montana: "mt",
|
|
54
|
+
nebraska: "ne",
|
|
55
|
+
nevada: "nv",
|
|
56
|
+
"new hampshire": "nh",
|
|
57
|
+
"new jersey": "nj",
|
|
58
|
+
"new mexico": "nm",
|
|
59
|
+
"new york": "ny",
|
|
60
|
+
"north carolina": "nc",
|
|
61
|
+
"north dakota": "nd",
|
|
62
|
+
ohio: "oh",
|
|
63
|
+
oklahoma: "ok",
|
|
64
|
+
oregon: "or",
|
|
65
|
+
pennsylvania: "pa",
|
|
66
|
+
"rhode island": "ri",
|
|
67
|
+
"south carolina": "sc",
|
|
68
|
+
"south dakota": "sd",
|
|
69
|
+
tennessee: "tn",
|
|
70
|
+
texas: "tx",
|
|
71
|
+
utah: "ut",
|
|
72
|
+
vermont: "vt",
|
|
73
|
+
virginia: "va",
|
|
74
|
+
washington: "wa",
|
|
75
|
+
"west virginia": "wv",
|
|
76
|
+
wisconsin: "wi",
|
|
77
|
+
wyoming: "wy",
|
|
78
|
+
"puerto rico": "pr",
|
|
79
|
+
};
|
|
80
|
+
const STATE_SLUGS = new Set(Object.values(STATE_NAME_TO_SLUG));
|
|
81
|
+
/**
|
|
82
|
+
* Is `value` exactly a US state — its full name (e.g. "Texas") or 2-letter abbreviation (e.g.
|
|
83
|
+
* "TX")? Returns the canonical 2-letter slug, else null. Whitespace/case-insensitive; rejects
|
|
84
|
+
* anything with extra tokens (so a city literally named after a state is only matched when it's the
|
|
85
|
+
* WHOLE value).
|
|
86
|
+
*/
|
|
87
|
+
export function usStateSlug(value) {
|
|
88
|
+
const v = value.trim().toLowerCase();
|
|
89
|
+
if (!v)
|
|
90
|
+
return null;
|
|
91
|
+
if (STATE_NAME_TO_SLUG[v])
|
|
92
|
+
return STATE_NAME_TO_SLUG[v];
|
|
93
|
+
if (/^[a-z]{2}$/.test(v) && STATE_SLUGS.has(v))
|
|
94
|
+
return v;
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/** Build a region node covering the state token, carrying a (lightly-confident) provenance marker. */
|
|
98
|
+
function makeRegionNode(value, start, end, confidence) {
|
|
99
|
+
return {
|
|
100
|
+
tag: "region",
|
|
101
|
+
value,
|
|
102
|
+
start,
|
|
103
|
+
end,
|
|
104
|
+
confidence,
|
|
105
|
+
children: [],
|
|
106
|
+
metadata: { region_recognition: "us-state" },
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Correct one container (an array of sibling nodes — the tree roots, or a node's children) for the
|
|
111
|
+
* two mis-tag shapes, producing `region → locality` nesting. Returns the rewritten sibling list.
|
|
112
|
+
*/
|
|
113
|
+
function correctSiblings(siblings) {
|
|
114
|
+
// --- Pass 1: split a merged "City, ST" locality into region(ST) → locality(City). ---
|
|
115
|
+
const afterSplit = [];
|
|
116
|
+
for (const node of siblings) {
|
|
117
|
+
const split = node.tag === "locality" ? splitMergedCityState(node) : null;
|
|
118
|
+
afterSplit.push(split ?? node);
|
|
119
|
+
}
|
|
120
|
+
// --- Pass 2: a locality whose WHOLE value is a state becomes a region; sibling city localities
|
|
121
|
+
// nest under it. Only fires when there's exactly one state-name locality in the container (the
|
|
122
|
+
// unambiguous "City, State" shape) — avoids reparenting in a multi-locality list we don't model. ---
|
|
123
|
+
const stateIdxs = afterSplit
|
|
124
|
+
.map((n, i) => (n.tag === "locality" && usStateSlug(n.value) ? i : -1))
|
|
125
|
+
.filter((i) => i >= 0);
|
|
126
|
+
if (stateIdxs.length !== 1)
|
|
127
|
+
return afterSplit;
|
|
128
|
+
const si = stateIdxs[0];
|
|
129
|
+
const stateNode = afterSplit[si];
|
|
130
|
+
const region = makeRegionNode(stateNode.value, stateNode.start, stateNode.end, stateNode.confidence);
|
|
131
|
+
const out = [];
|
|
132
|
+
for (let i = 0; i < afterSplit.length; i++) {
|
|
133
|
+
if (i === si)
|
|
134
|
+
continue;
|
|
135
|
+
const n = afterSplit[i];
|
|
136
|
+
if (n.tag === "locality")
|
|
137
|
+
region.children.push(n); // nest sibling cities under the region
|
|
138
|
+
else
|
|
139
|
+
out.push(n);
|
|
140
|
+
}
|
|
141
|
+
// Only convert when there's a sibling city to nest — the unambiguous "City, State" shape. A LONE
|
|
142
|
+
// state-name locality ("Washington", "Florida") is genuinely a city in this context as often as a
|
|
143
|
+
// state, so leave it untouched rather than risk a mis-fire.
|
|
144
|
+
if (region.children.length === 0)
|
|
145
|
+
return afterSplit;
|
|
146
|
+
out.push(region);
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Split a `locality` whose value is `"City, ST"` (state in the LAST comma segment) into
|
|
151
|
+
* region(ST) → locality(City). Returns null when the tail isn't a US state.
|
|
152
|
+
*/
|
|
153
|
+
function splitMergedCityState(node) {
|
|
154
|
+
const comma = node.value.lastIndexOf(",");
|
|
155
|
+
if (comma < 0)
|
|
156
|
+
return null;
|
|
157
|
+
const head = node.value.slice(0, comma).trim();
|
|
158
|
+
const tail = node.value.slice(comma + 1).trim();
|
|
159
|
+
const slug = usStateSlug(tail);
|
|
160
|
+
if (!slug || !head)
|
|
161
|
+
return null;
|
|
162
|
+
// Offsets: the region covers the tail's char span; the locality the head's (relative to node.start).
|
|
163
|
+
const tailStart = node.start + node.value.indexOf(tail, comma);
|
|
164
|
+
const region = makeRegionNode(tail, tailStart, node.end, node.confidence);
|
|
165
|
+
region.children.push({
|
|
166
|
+
tag: "locality",
|
|
167
|
+
value: head,
|
|
168
|
+
start: node.start,
|
|
169
|
+
end: node.start + head.length,
|
|
170
|
+
confidence: node.confidence,
|
|
171
|
+
children: node.children, // keep any real children (rare for a locality)
|
|
172
|
+
...(node.metadata ? { metadata: node.metadata } : {}),
|
|
173
|
+
});
|
|
174
|
+
return region;
|
|
175
|
+
}
|
|
176
|
+
/** Recursively correct a node's children. */
|
|
177
|
+
function correctNode(node) {
|
|
178
|
+
if (node.children.length > 0) {
|
|
179
|
+
node.children = correctSiblings(node.children).map(correctNode);
|
|
180
|
+
}
|
|
181
|
+
return node;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Recognize US regions the parser missed and restructure `"City, State"` into `region → locality`
|
|
185
|
+
* nesting so the resolver scopes the locality to its state (#642). Mutates + returns the tree. A
|
|
186
|
+
* no-op when no US state token is found mis-tagged — byte-stable for already-correct parses.
|
|
187
|
+
*/
|
|
188
|
+
export function recognizeUsRegions(tree) {
|
|
189
|
+
tree.roots = correctSiblings(tree.roots).map(correctNode);
|
|
190
|
+
return tree;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=region-recognition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-recognition.js","sourceRoot":"","sources":["../region-recognition.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mailwoman",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.10.0",
|
|
4
4
|
"description": "Utilities for working with contacts for email, phone, and postal addresses.",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"contributors": [
|
|
@@ -33,15 +33,16 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@fragaria/address-formatter": "^6.7.1",
|
|
35
35
|
"@inkjs/ui": "^2.0.0",
|
|
36
|
-
"@mailwoman/classifiers": "4.
|
|
37
|
-
"@mailwoman/core": "4.
|
|
38
|
-
"@mailwoman/corpus": "4.
|
|
39
|
-
"@mailwoman/kind-classifier": "4.
|
|
40
|
-
"@mailwoman/locale-gate": "4.
|
|
41
|
-
"@mailwoman/neural": "4.
|
|
42
|
-
"@mailwoman/normalize": "4.
|
|
43
|
-
"@mailwoman/phrase-grouper": "4.
|
|
44
|
-
"@mailwoman/query-shape": "4.
|
|
36
|
+
"@mailwoman/classifiers": "4.10.0",
|
|
37
|
+
"@mailwoman/core": "4.10.0",
|
|
38
|
+
"@mailwoman/corpus": "4.10.0",
|
|
39
|
+
"@mailwoman/kind-classifier": "4.10.0",
|
|
40
|
+
"@mailwoman/locale-gate": "4.10.0",
|
|
41
|
+
"@mailwoman/neural": "4.10.0",
|
|
42
|
+
"@mailwoman/normalize": "4.10.0",
|
|
43
|
+
"@mailwoman/phrase-grouper": "4.10.0",
|
|
44
|
+
"@mailwoman/query-shape": "4.10.0",
|
|
45
|
+
"@mailwoman/registry": "4.10.0",
|
|
45
46
|
"chalk": "^5.6.2",
|
|
46
47
|
"change-case": "^5.4.4",
|
|
47
48
|
"d3-scale-chromatic": "^3.1.0",
|