mailwoman 4.6.0 → 4.8.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/geocode.d.ts.map +1 -0
- package/out/commands/geocode.js +221 -0
- package/out/commands/geocode.js.map +1 -0
- package/out/commands/reverse.d.ts.map +1 -0
- package/out/commands/reverse.js +144 -0
- package/out/commands/reverse.js.map +1 -0
- package/out/commands/serve.d.ts.map +1 -1
- package/out/commands/serve.js +5 -2
- package/out/commands/serve.js.map +1 -1
- package/out/data-release.d.ts.map +1 -0
- package/out/data-release.js +49 -0
- package/out/data-release.js.map +1 -0
- package/out/geocode-core.d.ts.map +1 -0
- package/out/geocode-core.js +235 -0
- package/out/geocode-core.js.map +1 -0
- package/out/interp-calibration.d.ts.map +1 -0
- package/out/interp-calibration.js +50 -0
- package/out/interp-calibration.js.map +1 -0
- package/out/server/GeocodeRouter.d.ts.map +1 -0
- package/out/server/GeocodeRouter.js +224 -0
- package/out/server/GeocodeRouter.js.map +1 -0
- package/out/server/HealthRouter.d.ts.map +1 -0
- package/out/server/HealthRouter.js +94 -0
- package/out/server/HealthRouter.js.map +1 -0
- package/out/server/index.d.ts.map +1 -1
- package/out/server/index.js +2 -0
- package/out/server/index.js.map +1 -1
- package/out/server/metrics.d.ts.map +1 -0
- package/out/server/metrics.js +74 -0
- package/out/server/metrics.js.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geocode.d.ts","sourceRoot":"","sources":["../../commands/geocode.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH,OAAO,GAAG,MAAM,KAAK,CAAA;AAGrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAOrD,QAAA,MAAM,eAAe,6BAA4E,CAAA;AACjG,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,aAAa,IAAI,OAAO,EAAE,CAAA;AAE5D,QAAA,MAAM,aAAa;;;;;;;;;;;;qBAuDjB,CAAA;AAqHF,QAAA,MAAM,cAAc,EAAE,gBAAgB,CAAC,OAAO,aAAa,EAAE,OAAO,eAAe,CAgClF,CAAA;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,221 @@
|
|
|
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 geocode "<address>" [flags]` — end-to-end street-level geocoder.
|
|
8
|
+
*
|
|
9
|
+
* Pipeline:
|
|
10
|
+
*
|
|
11
|
+
* 1. Parse the address with the neural classifier (same path as `parse` command).
|
|
12
|
+
* 2. Resolve admin hierarchy via `createWofResolver(WofSqlitePlaceLookup)`.
|
|
13
|
+
* 3. Augment with per-state address-point (situs) + interpolation shards, selected from the resolved
|
|
14
|
+
* region. Both are optional — absent shards degrade gracefully to admin-only.
|
|
15
|
+
* 4. Extract the best available coordinate + resolution tier from the resolved tree and emit a flat
|
|
16
|
+
* geocode result object.
|
|
17
|
+
*
|
|
18
|
+
* Resolution tiers (best → worst):
|
|
19
|
+
*
|
|
20
|
+
* - `address_point` — exact situs coordinate from the address-points shard
|
|
21
|
+
* - `interpolated` — house-number estimate from the interpolation shard
|
|
22
|
+
* - `admin` — admin centroid from the WOF gazetteer
|
|
23
|
+
*
|
|
24
|
+
* Exit-code contract:
|
|
25
|
+
*
|
|
26
|
+
* - 0 successful geocode (including admin-only degradation when shards are absent)
|
|
27
|
+
* - 1 bad arguments, missing required DB, or fatal parse/resolve error
|
|
28
|
+
*/
|
|
29
|
+
import { Spinner } from "@inkjs/ui";
|
|
30
|
+
import { createWofResolver } from "@mailwoman/core/resolver";
|
|
31
|
+
import { NeuralAddressClassifier } from "@mailwoman/neural";
|
|
32
|
+
import { Text } from "ink";
|
|
33
|
+
import { setImmediate } from "node:timers/promises";
|
|
34
|
+
import { useEffect, useState } from "react";
|
|
35
|
+
import zod from "zod";
|
|
36
|
+
import { geocodeAddress, ShardProvider } from "../geocode-core.js";
|
|
37
|
+
import { INTERP_RADIUS_CALIBRATION } from "../interp-calibration.js";
|
|
38
|
+
import { resolverDefaultCountry } from "./parse.js";
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// CLI contract — args + options
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
const ArgumentsSchema = zod.array(zod.string().describe("A formatted postal address to geocode"));
|
|
43
|
+
export { ArgumentsSchema as args, OptionsSchema as options };
|
|
44
|
+
const OptionsSchema = zod.object({
|
|
45
|
+
locale: zod
|
|
46
|
+
.string()
|
|
47
|
+
.regex(/^[a-z]{2}(-[A-Z]{2})?$/u, "Expected a BCP-47 tag like en-US or fr-FR")
|
|
48
|
+
.optional()
|
|
49
|
+
.default("en-US")
|
|
50
|
+
.describe("Locale tag matching a weights package (en-US, fr-FR). Default en-US."),
|
|
51
|
+
defaultCountry: zod
|
|
52
|
+
.string()
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("ISO-3166 country to scope the WOF resolver. Defaults from --locale's region subtag (en-US → US). " +
|
|
55
|
+
"Pass 'none' to disable the country filter."),
|
|
56
|
+
resolveDb: zod
|
|
57
|
+
.string()
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("Path to a WOF admin SQLite distribution. Defaults to $MAILWOMAN_WOF_DB; errors if neither is set."),
|
|
60
|
+
dataRoot: zod
|
|
61
|
+
.string()
|
|
62
|
+
.optional()
|
|
63
|
+
.default("/mnt/playpen/mailwoman-data")
|
|
64
|
+
.describe("Root directory for per-state address-point and interpolation shards. " +
|
|
65
|
+
"Shards are expected at <dataRoot>/address-points/address-points-us-<state>.db " +
|
|
66
|
+
"and <dataRoot>/interpolation/interpolation-us-<state>.db. Default: /mnt/playpen/mailwoman-data."),
|
|
67
|
+
addressPointsDb: zod
|
|
68
|
+
.string()
|
|
69
|
+
.optional()
|
|
70
|
+
.describe("Explicit path to an address-points (situs) SQLite shard. Bypasses the per-state shard selection " +
|
|
71
|
+
"from the resolved region. Use when you already know the right shard or are testing a specific file."),
|
|
72
|
+
interpolationDb: zod
|
|
73
|
+
.string()
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("Explicit path to an interpolation SQLite shard. Bypasses the per-state shard selection. " +
|
|
76
|
+
"Use when you already know the right shard or are testing a specific file."),
|
|
77
|
+
interpCalibration: zod
|
|
78
|
+
.number()
|
|
79
|
+
.optional()
|
|
80
|
+
.describe("Conformal calibration multiplier for the interpolation tier's reported uncertainty_m (#374). " +
|
|
81
|
+
"The raw half-segment radius covers only ~72% of true errors. Default (unset): the per-region " +
|
|
82
|
+
"table (#584) selects by parsed region — 1.44 (DC) … 3.12 (AZ), 1.95 for unmeasured states — " +
|
|
83
|
+
"for a ~90% bound. Pass an explicit number to force a single multiplier everywhere (1 = raw)."),
|
|
84
|
+
format: zod
|
|
85
|
+
.enum(["json", "text"])
|
|
86
|
+
.optional()
|
|
87
|
+
.default("json")
|
|
88
|
+
.describe('Output format. "json" (default) emits a machine-readable object; "text" prints a human summary.'),
|
|
89
|
+
});
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Path helpers
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
function resolveWofPath(options) {
|
|
94
|
+
const path = options.resolveDb ?? process.env["MAILWOMAN_WOF_DB"];
|
|
95
|
+
if (!path) {
|
|
96
|
+
throw new Error("geocode needs a WOF admin SQLite path. Set $MAILWOMAN_WOF_DB or pass --resolve-db <path>. " +
|
|
97
|
+
"Build one with `mailwoman-wof-build-slim` + `mailwoman-wof-build-fts`.");
|
|
98
|
+
}
|
|
99
|
+
return path;
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Core geocode logic
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
async function runGeocode(input, options) {
|
|
105
|
+
// Resolve the WOF admin path FIRST — it's the most common missing prerequisite and the cheapest to
|
|
106
|
+
// check, so surface that error before the (slower) weights load. (Order matters for the CLI contract:
|
|
107
|
+
// a missing WOF DB must report the WOF error even when the weights are also absent.)
|
|
108
|
+
const wofPath = resolveWofPath(options);
|
|
109
|
+
// Load the neural classifier (required for street-level; weights must be present).
|
|
110
|
+
let classifier;
|
|
111
|
+
try {
|
|
112
|
+
classifier = await NeuralAddressClassifier.loadFromWeights({ locale: options.locale });
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new Error("geocode requires the neural weights. Install @mailwoman/neural-weights-en-us (or pass --locale with installed weights).");
|
|
116
|
+
}
|
|
117
|
+
// Open the WOF admin resolver + the situs/interpolation shard provider.
|
|
118
|
+
let mod;
|
|
119
|
+
try {
|
|
120
|
+
mod = await import("@mailwoman/resolver-wof-sqlite");
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
throw new Error("geocode requires `@mailwoman/resolver-wof-sqlite` to be installed. " +
|
|
124
|
+
"Run `npm install @mailwoman/resolver-wof-sqlite` and try again.");
|
|
125
|
+
}
|
|
126
|
+
const lookup = new mod.WofSqlitePlaceLookup({ databasePath: wofPath });
|
|
127
|
+
const shardProvider = new ShardProvider(mod, options.dataRoot);
|
|
128
|
+
// Explicit --address-points-db / --interpolation-db flags override per-state selection (testing a
|
|
129
|
+
// specific file); an unset tier still falls back to the region-derived per-state shard.
|
|
130
|
+
const explicitAp = options.addressPointsDb ? new mod.AddressPointSqliteLookup(options.addressPointsDb) : undefined;
|
|
131
|
+
const explicitIp = options.interpolationDb
|
|
132
|
+
? new mod.StreetInterpolator({ dbPath: options.interpolationDb })
|
|
133
|
+
: undefined;
|
|
134
|
+
const shards = explicitAp || explicitIp
|
|
135
|
+
? (slug) => {
|
|
136
|
+
const base = explicitAp && explicitIp ? {} : shardProvider.for(slug);
|
|
137
|
+
return { addressPoints: explicitAp ?? base.addressPoints, interpolation: explicitIp ?? base.interpolation };
|
|
138
|
+
}
|
|
139
|
+
: shardProvider.for;
|
|
140
|
+
try {
|
|
141
|
+
const resolver = createWofResolver(lookup);
|
|
142
|
+
const result = await geocodeAddress(input, {
|
|
143
|
+
classifier,
|
|
144
|
+
resolver,
|
|
145
|
+
shards,
|
|
146
|
+
defaultCountry: resolverDefaultCountry(options) || undefined,
|
|
147
|
+
// Explicit --interp-calibration forces a single multiplier; unset → the per-region table (#584).
|
|
148
|
+
interpCalibration: options.interpCalibration ?? INTERP_RADIUS_CALIBRATION,
|
|
149
|
+
});
|
|
150
|
+
return options.format === "text" ? formatText(result) : JSON.stringify(result, null, 2);
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
explicitAp?.close();
|
|
154
|
+
explicitIp?.close();
|
|
155
|
+
shardProvider.close();
|
|
156
|
+
lookup.close();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Text formatter
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
function formatText(result) {
|
|
163
|
+
const lines = [];
|
|
164
|
+
lines.push(`input: ${result.input}`);
|
|
165
|
+
lines.push(`resolution_tier: ${result.resolution_tier}`);
|
|
166
|
+
if (result.lat != null && result.lon != null) {
|
|
167
|
+
lines.push(`coordinate: ${result.lat.toFixed(6)}, ${result.lon.toFixed(6)}`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
lines.push(`coordinate: (unresolved)`);
|
|
171
|
+
}
|
|
172
|
+
if (result.uncertainty_m != null) {
|
|
173
|
+
lines.push(`uncertainty_m: ${result.uncertainty_m}`);
|
|
174
|
+
}
|
|
175
|
+
if (result.locality)
|
|
176
|
+
lines.push(`locality: ${result.locality}`);
|
|
177
|
+
if (result.region)
|
|
178
|
+
lines.push(`region: ${result.region}`);
|
|
179
|
+
if (result.postcode)
|
|
180
|
+
lines.push(`postcode: ${result.postcode}`);
|
|
181
|
+
if (result.hierarchy.length > 0) {
|
|
182
|
+
lines.push("hierarchy:");
|
|
183
|
+
for (const h of result.hierarchy) {
|
|
184
|
+
const coord = h.lat != null ? ` (${h.lat.toFixed(4)}, ${h.lon.toFixed(4)})` : "";
|
|
185
|
+
const id = h.placeId ? ` [${h.placeId}]` : "";
|
|
186
|
+
lines.push(` ${h.tag.padEnd(20)} ${h.value}${id}${coord}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return lines.join("\n");
|
|
190
|
+
}
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
// React command component
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
const GeocodeCommand = ({ args, options }) => {
|
|
195
|
+
const [output, setOutput] = useState();
|
|
196
|
+
const [error, setError] = useState();
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
if (error) {
|
|
199
|
+
setImmediate().then(() => process.exit(1));
|
|
200
|
+
}
|
|
201
|
+
}, [error]);
|
|
202
|
+
useEffect(() => {
|
|
203
|
+
const input = args[0];
|
|
204
|
+
if (!input || input.trim().length === 0) {
|
|
205
|
+
setError('geocode requires a positional address argument (e.g. mailwoman geocode "350 5th Ave, New York, NY")');
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
runGeocode(input.trim(), options)
|
|
209
|
+
.then(setOutput)
|
|
210
|
+
.catch((err) => setError(err.message));
|
|
211
|
+
}, [args, options]);
|
|
212
|
+
if (error) {
|
|
213
|
+
return _jsx(Text, { color: "red", children: error });
|
|
214
|
+
}
|
|
215
|
+
if (!output) {
|
|
216
|
+
return _jsx(Spinner, {});
|
|
217
|
+
}
|
|
218
|
+
return _jsx(Text, { children: output });
|
|
219
|
+
};
|
|
220
|
+
export default GeocodeCommand;
|
|
221
|
+
//# sourceMappingURL=geocode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geocode.js","sourceRoot":"","sources":["../../commands/geocode.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse.d.ts","sourceRoot":"","sources":["../../commands/reverse.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,QAAA,MAAM,eAAe,6BAEuE,CAAA;AAE5F,QAAA,MAAM,aAAa;;;;;;;qBAqBjB,CAAA;AAEF,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,aAAa,IAAI,OAAO,EAAE,CAAA;AA0E5D,QAAA,MAAM,cAAc,EAAE,gBAAgB,CAAC,OAAO,aAAa,EAAE,OAAO,eAAe,CA6ClF,CAAA;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,144 @@
|
|
|
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 reverse <lat> <lon>` — resolve a WGS-84 coordinate to its containing admin hierarchy
|
|
8
|
+
* via the WofReverseGeocoder (#484).
|
|
9
|
+
*
|
|
10
|
+
* Falls back to the MAILWOMAN_WOF_ADMIN_DB / MAILWOMAN_WOF_POLYGONS_DB env vars when the
|
|
11
|
+
* corresponding flags are absent. Prints a JSON object with the resolved hierarchy and the
|
|
12
|
+
* containment kind (polygon | approximate) so callers can gauge result quality.
|
|
13
|
+
*
|
|
14
|
+
* Exit-code contract:
|
|
15
|
+
*
|
|
16
|
+
* - 0 successful reverse-geocode (including "open ocean" empty-hierarchy)
|
|
17
|
+
* - 1 bad arguments or DB path missing / wrong
|
|
18
|
+
*/
|
|
19
|
+
import { Spinner } from "@inkjs/ui";
|
|
20
|
+
import { Text } from "ink";
|
|
21
|
+
import { setImmediate } from "node:timers/promises";
|
|
22
|
+
import { useEffect, useState } from "react";
|
|
23
|
+
import zod from "zod";
|
|
24
|
+
const ArgumentsSchema = zod
|
|
25
|
+
.array(zod.string())
|
|
26
|
+
.describe("Positional args: <lat> <lon> — WGS-84 decimal degrees (e.g. 40.7128 -74.0060).");
|
|
27
|
+
const OptionsSchema = zod.object({
|
|
28
|
+
adminDb: zod
|
|
29
|
+
.string()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Path to the admin gazetteer SQLite DB (must carry the package-built place_bbox R*Tree). " +
|
|
32
|
+
"Defaults to $MAILWOMAN_WOF_ADMIN_DB."),
|
|
33
|
+
polygonsDb: zod
|
|
34
|
+
.string()
|
|
35
|
+
.optional()
|
|
36
|
+
.describe("Path to the polygon sidecar DB (wof-polygons.db, table polygons(id, geom)). " +
|
|
37
|
+
"Without it every result is containment: approximate. " +
|
|
38
|
+
"Defaults to $MAILWOMAN_WOF_POLYGONS_DB."),
|
|
39
|
+
format: zod
|
|
40
|
+
.enum(["json", "text"])
|
|
41
|
+
.optional()
|
|
42
|
+
.default("json")
|
|
43
|
+
.describe('Output format. "json" emits a machine-readable object; "text" prints a human-readable hierarchy.'),
|
|
44
|
+
});
|
|
45
|
+
export { ArgumentsSchema as args, OptionsSchema as options };
|
|
46
|
+
function resolveAdminDbPath(options) {
|
|
47
|
+
const path = options.adminDb ?? process.env["MAILWOMAN_WOF_ADMIN_DB"];
|
|
48
|
+
if (!path) {
|
|
49
|
+
throw new Error("reverse needs an admin DB path. Set $MAILWOMAN_WOF_ADMIN_DB or pass --admin-db <path>. " +
|
|
50
|
+
"Build one with `mailwoman-wof-build-fts <path-to-wof.db>` after building the WOF SQLite " +
|
|
51
|
+
"distribution with `mailwoman-wof-build-slim`.");
|
|
52
|
+
}
|
|
53
|
+
return path;
|
|
54
|
+
}
|
|
55
|
+
function resolvePolygonsDbPath(options) {
|
|
56
|
+
return options.polygonsDb ?? process.env["MAILWOMAN_WOF_POLYGONS_DB"];
|
|
57
|
+
}
|
|
58
|
+
async function runReverse(lat, lon, options) {
|
|
59
|
+
let mod;
|
|
60
|
+
try {
|
|
61
|
+
mod = await import("@mailwoman/resolver-wof-sqlite");
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new Error("reverse requires `@mailwoman/resolver-wof-sqlite` to be installed. " +
|
|
65
|
+
"Run `npm install @mailwoman/resolver-wof-sqlite` and try again.");
|
|
66
|
+
}
|
|
67
|
+
const adminDbPath = resolveAdminDbPath(options);
|
|
68
|
+
const polygonDbPath = resolvePolygonsDbPath(options);
|
|
69
|
+
const geocoder = new mod.WofReverseGeocoder({ adminDbPath, polygonDbPath });
|
|
70
|
+
try {
|
|
71
|
+
const result = await geocoder.reverseGeocode(lat, lon);
|
|
72
|
+
if (options.format === "text") {
|
|
73
|
+
const lines = [];
|
|
74
|
+
lines.push(`containment: ${result.containment}`);
|
|
75
|
+
if (result.hierarchy.length === 0) {
|
|
76
|
+
lines.push("(no admin hierarchy — point may be in open ocean or outside the gazetteer coverage)");
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
for (const place of result.hierarchy) {
|
|
80
|
+
const distStr = place.distanceKm !== undefined ? ` (~${place.distanceKm.toFixed(1)} km from centroid)` : "";
|
|
81
|
+
lines.push(` ${place.placetype.padEnd(16)} ${place.name} [wof:${place.id}]${distStr}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return lines.join("\n");
|
|
85
|
+
}
|
|
86
|
+
// JSON: emit a tidy object — the full hierarchy array + containment at the top level.
|
|
87
|
+
return JSON.stringify({
|
|
88
|
+
lat,
|
|
89
|
+
lon,
|
|
90
|
+
containment: result.containment,
|
|
91
|
+
hierarchy: result.hierarchy.map((p) => ({
|
|
92
|
+
id: p.id,
|
|
93
|
+
name: p.name,
|
|
94
|
+
placetype: p.placetype,
|
|
95
|
+
country: p.country,
|
|
96
|
+
lat: p.lat,
|
|
97
|
+
lon: p.lon,
|
|
98
|
+
...(p.distanceKm !== undefined ? { distanceKm: p.distanceKm } : {}),
|
|
99
|
+
})),
|
|
100
|
+
}, null, 2);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
geocoder.close();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const ReverseCommand = ({ args, options }) => {
|
|
107
|
+
const [output, setOutput] = useState();
|
|
108
|
+
const [error, setError] = useState();
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
if (error) {
|
|
111
|
+
setImmediate().then(() => process.exit(1));
|
|
112
|
+
}
|
|
113
|
+
}, [error]);
|
|
114
|
+
useEffect(() => {
|
|
115
|
+
const rawLat = args[0];
|
|
116
|
+
const rawLon = args[1];
|
|
117
|
+
if (!rawLat || !rawLon) {
|
|
118
|
+
setError("reverse requires two positional arguments: <lat> <lon> (e.g. mailwoman reverse 40.7128 -74.0060)");
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const lat = Number(rawLat);
|
|
122
|
+
const lon = Number(rawLon);
|
|
123
|
+
if (!Number.isFinite(lat) || Math.abs(lat) > 90) {
|
|
124
|
+
setError(`Invalid latitude ${JSON.stringify(rawLat)} — must be a number in [-90, 90].`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (!Number.isFinite(lon) || Math.abs(lon) > 180) {
|
|
128
|
+
setError(`Invalid longitude ${JSON.stringify(rawLon)} — must be a number in [-180, 180].`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
runReverse(lat, lon, options)
|
|
132
|
+
.then(setOutput)
|
|
133
|
+
.catch((err) => setError(err.message));
|
|
134
|
+
}, [args, options]);
|
|
135
|
+
if (error) {
|
|
136
|
+
return _jsx(Text, { color: "red", children: error });
|
|
137
|
+
}
|
|
138
|
+
if (!output) {
|
|
139
|
+
return _jsx(Spinner, {});
|
|
140
|
+
}
|
|
141
|
+
return _jsx(Text, { children: output });
|
|
142
|
+
};
|
|
143
|
+
export default ReverseCommand;
|
|
144
|
+
//# sourceMappingURL=reverse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse.js","sourceRoot":"","sources":["../../commands/reverse.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../commands/serve.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../commands/serve.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AA8HrD,eAAO,MAAM,OAAO;;;;qBAAqB,CAAA;AAEzC,QAAA,MAAM,YAAY;;;;sBAAmD,CAAA;AAErE,eAAe,YAAY,CAAA"}
|
package/out/commands/serve.js
CHANGED
|
@@ -14,7 +14,7 @@ import * as process from "node:process";
|
|
|
14
14
|
import { fileURLToPath } from "node:url";
|
|
15
15
|
import { useEffect, useState } from "react";
|
|
16
16
|
import zod from "zod";
|
|
17
|
-
import { AddressRouter, ResolveRouter } from "../server/index.js";
|
|
17
|
+
import { AddressRouter, GeocodeRouter, HealthRouter, ResolveRouter } from "../server/index.js";
|
|
18
18
|
const ClusterManager = ({ options: { cpus = availableParallelism() }, }) => {
|
|
19
19
|
const [workers, setWorkers] = useState();
|
|
20
20
|
useEffect(() => {
|
|
@@ -71,8 +71,11 @@ const WorkerStatus = ({ worker }) => {
|
|
|
71
71
|
const ChildThread = ({ options: { port, host } }) => {
|
|
72
72
|
useEffect(() => {
|
|
73
73
|
const app = express();
|
|
74
|
-
|
|
74
|
+
// 2mb body cap accommodates a full /api/batch (up to MAILWOMAN_BATCH_MAX addresses).
|
|
75
|
+
app.use(express.json({ limit: "2mb" }));
|
|
76
|
+
app.use(HealthRouter);
|
|
75
77
|
app.use(AddressRouter);
|
|
78
|
+
app.use(GeocodeRouter);
|
|
76
79
|
app.use(ResolveRouter);
|
|
77
80
|
// `mailwoman/server/static/` lives next to the compiled `mailwoman/out/commands/serve.js`,
|
|
78
81
|
// so resolve relative to this file rather than relying on a repo-root path builder that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../commands/serve.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,GAAG,MAAM,KAAK,CAAA;AAErB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../commands/serve.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-release.d.ts","sourceRoot":"","sources":["../data-release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,iGAAiG;AACjG,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAExD,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAYhF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAClC,MAAM,GAAG,IAAI,CAQf"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Versioned data-artifact addressing + atomic switchover (#485 piece 4). Shard DBs are addressed as
|
|
7
|
+
* `<family>/<family>-us-<slug>-<version>.db`, with a `releases.json` manifest at the data root
|
|
8
|
+
* pinning each family to its current version. So a new build publishes ALONGSIDE the old,
|
|
9
|
+
* flipping the manifest (one atomic file write) cuts traffic over, and the build provenance (the
|
|
10
|
+
* version) travels in the filename — "what data is deployed" is a read of one JSON.
|
|
11
|
+
*
|
|
12
|
+
* Back-compat: with no manifest (or a family unlisted) resolution falls back to the legacy
|
|
13
|
+
* unversioned `<family>-us-<slug>.db`, so the current national build output works unchanged.
|
|
14
|
+
*
|
|
15
|
+
* Example `releases.json`: { "address-points": "2026-05-20.0", "interpolation": "TIGER2023" }
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
18
|
+
/** Read `<dataRoot>/releases.json`. Returns null (legacy mode) when absent or malformed. */
|
|
19
|
+
export function readReleaseManifest(dataRoot) {
|
|
20
|
+
try {
|
|
21
|
+
const raw = JSON.parse(readFileSync(`${dataRoot}/releases.json`, "utf8"));
|
|
22
|
+
if (!raw || typeof raw !== "object")
|
|
23
|
+
return null;
|
|
24
|
+
const out = {};
|
|
25
|
+
for (const [family, version] of Object.entries(raw)) {
|
|
26
|
+
if (typeof version === "string" && version)
|
|
27
|
+
out[family] = version;
|
|
28
|
+
}
|
|
29
|
+
return Object.keys(out).length > 0 ? out : null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve a shard's on-disk path: the manifest-pinned `<family>-us-<slug>-<version>.db` when
|
|
37
|
+
* present, else the legacy unversioned `<family>-us-<slug>.db`, else null if neither exists.
|
|
38
|
+
*/
|
|
39
|
+
export function resolveShardPath(dataRoot, family, slug, manifest) {
|
|
40
|
+
const version = manifest?.[family];
|
|
41
|
+
if (version) {
|
|
42
|
+
const versioned = `${dataRoot}/${family}/${family}-us-${slug}-${version}.db`;
|
|
43
|
+
if (existsSync(versioned))
|
|
44
|
+
return versioned;
|
|
45
|
+
}
|
|
46
|
+
const legacy = `${dataRoot}/${family}/${family}-us-${slug}.db`;
|
|
47
|
+
return existsSync(legacy) ? legacy : null;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data-release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-release.js","sourceRoot":"","sources":["../data-release.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAKlD,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IACnD,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,QAAQ,gBAAgB,EAAE,MAAM,CAAC,CAAY,CAAA;QACpF,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QAChD,MAAM,GAAG,GAAwB,EAAE,CAAA;QACnC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAChF,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO;gBAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAA;QAClE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC/B,QAAgB,EAChB,MAAc,EACd,IAAY,EACZ,QAAoC;IAEpC,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAA;IAClC,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,MAAM,IAAI,MAAM,OAAO,IAAI,IAAI,OAAO,KAAK,CAAA;QAC5E,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAC5C,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,QAAQ,IAAI,MAAM,IAAI,MAAM,OAAO,IAAI,KAAK,CAAA;IAC9D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geocode-core.d.ts","sourceRoot":"","sources":["../geocode-core.ts"],"names":[],"mappings":"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"}
|