@mxpicture/teslamate-extended-cli 2.1.63 → 3.1.3

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.
@@ -1,56 +1,38 @@
1
1
  import { Option } from "@commander-js/extra-typings";
2
- import { type FetchOptions, type FetchScope } from "@mxpicture/teslamate-extended-api/api";
3
2
  import { type IStore } from "@mxpicture/teslamate-extended-api/store";
4
3
  /** Reads the CLI package version from its package.json. */
5
4
  export declare const readVersion: () => string;
6
- /** One day in milliseconds — the schedule interval. */
5
+ /** One day in milliseconds — the schedule interval and the cadence clock unit. */
7
6
  export declare const DAY_MS: number;
8
7
  /**
9
- * Match radius (km) for `--charged`: a TeslaMate charge location counts as a
10
- * given Supercharger when it sits within this distance of it. ~300 m comfortably
11
- * covers the gap between where the car parks and the site's listed point while
12
- * staying well under the spacing between distinct sites.
8
+ * Match radius (km) for the outdated-price determination: a TeslaMate charge
9
+ * location maps to a given Supercharger when it sits within this distance of it.
10
+ * ~300 m comfortably covers the gap between where the car parks and the site's
11
+ * listed point while staying well under the spacing between distinct sites.
13
12
  */
14
13
  export declare const CHARGED_MATCH_KM = 0.3;
15
- /** Parses a non-negative float (e.g. --delay). */
14
+ /** Parses a non-negative float (e.g. --delay, --radius). */
16
15
  export declare const parseFloatArg: (v: string) => number;
17
16
  /** Parses a non-negative integer (e.g. --limit). */
18
17
  export declare const parseIntArg: (v: string) => number;
18
+ /** Parses a positive integer number of days (e.g. --*-every, --outdated-age). */
19
+ export declare const parseDaysArg: (v: string) => number;
19
20
  /** Validates an HH:MM (24h) time string (e.g. --at). */
20
21
  export declare const parseTime: (v: string) => string;
21
- /** Parses a "lat,lon" coordinate pair (e.g. --near). */
22
- export declare const parseNear: (v: string) => {
23
- lat: number;
24
- lon: number;
25
- };
26
- /** One schedule tier: fetch within `radiusKm` of home every `everyDays` days. */
27
- export interface Tier {
28
- radiusKm: number;
29
- everyDays: number;
30
- }
31
- /** Collects a repeatable --tier "radiusKm:everyDays" value onto the previous list. */
32
- export declare const parseTier: (v: string, prev: Tier[]) => Tier[];
22
+ /** Commander option: radius (km) around the TeslaMate "Home" geofence. */
23
+ export declare const radiusOption: Option<"-r, --radius <km>", undefined, undefined, number, false, undefined>;
24
+ /** Commander option: cadence (days) for the radius determination. */
25
+ export declare const radiusEveryOption: Option<"--radius-every <days>", undefined, 7, number, false, undefined>;
33
26
  /** Commander option: restrict to a single country. */
34
27
  export declare const countryOption: Option<"-c, --country <name>", undefined, undefined, undefined, false, undefined>;
35
- /** Commander option: restrict to a single region. */
36
- export declare const regionOption: Option<"-R, --region <name>", undefined, undefined, undefined, false, undefined>;
37
- /** Commander option: all Superchargers worldwide. */
38
- export declare const allOption: Option<"-a, --all", undefined, undefined, undefined, false, undefined>;
39
- /** Commander option: center coordinate "lat,lon" for a radius scope. */
40
- export declare const nearOption: Option<"--near <lat,lon>", undefined, undefined, {
41
- lat: number;
42
- lon: number;
43
- }, false, undefined>;
44
- /** Commander option: radius in km around --near. */
45
- export declare const radiusOption: Option<"--radius <km>", undefined, undefined, number, false, undefined>;
46
- /** Commander option (schedule): repeatable tier "radiusKm:everyDays". */
47
- export declare const tierOption: Option<"--tier <km:everyDays>", undefined, Tier[], Tier[], false, undefined>;
48
- /** Commander option: scope = the Superchargers you've charged at (TeslaMate DB). */
49
- export declare const chargedOption: Option<"--charged", undefined, undefined, undefined, false, undefined>;
50
- /** Commander option: center the radius scope on the TeslaMate "Home" geofence. */
51
- export declare const homeFromTeslamateOption: Option<"--home-from-teslamate", undefined, undefined, undefined, false, undefined>;
52
- /** Commander option: also upsert each fetched Supercharger as a TeslaMate geofence. */
53
- export declare const geofencesOption: Option<"--teslamate-geofences", undefined, undefined, undefined, false, undefined>;
28
+ /** Commander option: cadence (days) for the country determination. */
29
+ export declare const countryEveryOption: Option<"--country-every <days>", undefined, 30, number, false, undefined>;
30
+ /** Commander option: enable the missing/outdated-price determination. */
31
+ export declare const outdatedOption: Option<"--outdated", undefined, undefined, undefined, false, undefined>;
32
+ /** Commander option: cadence (days) for the outdated determination. */
33
+ export declare const outdatedEveryOption: Option<"--outdated-every <days>", undefined, 1, number, false, undefined>;
34
+ /** Commander option: age (days) past which a managed geofence's price is "outdated". */
35
+ export declare const outdatedAgeOption: Option<"--outdated-age <days>", undefined, 30, number, false, undefined>;
54
36
  /** Commander option: pricing locale. */
55
37
  export declare const localeOption: Option<"-l, --locale <locale>", undefined, "en-US", undefined, false, undefined>;
56
38
  /** Commander option: politeness delay between requests (seconds). */
@@ -69,27 +51,32 @@ export declare const httpUrlOption: Option<"--http-url <url>", undefined, undefi
69
51
  export declare const httpUserOption: Option<"--http-user <user>", undefined, undefined, undefined, false, undefined>;
70
52
  /** Commander option: Basic-auth password for --http-url. */
71
53
  export declare const httpPasswordOption: Option<"--http-password <password>", undefined, undefined, undefined, false, undefined>;
72
- /** Commander option: daily run time for `schedule` (24h, local). */
73
- export declare const atOption: Option<"-t, --at <HH:MM>", undefined, "03:30", string, false, undefined>;
54
+ /** Commander option: also upsert each fetched Supercharger as a TeslaMate geofence. */
55
+ export declare const geofencesOption: Option<"--teslamate-geofences", undefined, undefined, undefined, false, undefined>;
56
+ /** Commander option: backfill TeslaMate charge costs from the managed geofence prices. */
57
+ export declare const chargesOption: Option<"--teslamate-charges", undefined, undefined, undefined, false, undefined>;
58
+ /** Commander option: after the run, alert (Pushover) when Supercharger charges remain unpriced. */
59
+ export declare const alertUnpricedChargesOption: Option<"--alert-unpriced-charges", undefined, undefined, undefined, false, undefined>;
74
60
  /**
75
61
  * Commander option: route tesla.com requests through a proxy. Sets
76
62
  * HTTPS_PROXY/ALL_PROXY for the curl subprocess (which already honors them when
77
63
  * set in the environment). Use this to escape datacenter IPs Akamai 403s.
78
64
  */
79
65
  export declare const proxyOption: Option<"--proxy <url>", undefined, undefined, undefined, false, undefined>;
66
+ /** Commander option: daily run time for `schedule` (24h, local). */
67
+ export declare const atOption: Option<"-t, --at <HH:MM>", undefined, "03:30", string, false, undefined>;
80
68
  /** Options common to `fetch` and `schedule`. */
81
69
  export interface CommonOpts {
82
- country?: string;
83
- region?: string;
84
- all?: boolean;
85
- near?: {
86
- lat: number;
87
- lon: number;
88
- };
89
70
  radius?: number;
90
- charged?: boolean;
91
- homeFromTeslamate?: boolean;
71
+ radiusEvery: number;
72
+ country?: string;
73
+ countryEvery: number;
74
+ outdated?: boolean;
75
+ outdatedEvery: number;
76
+ outdatedAge: number;
92
77
  teslamateGeofences?: boolean;
78
+ teslamateCharges?: boolean;
79
+ alertUnpricedCharges?: boolean;
93
80
  locale: string;
94
81
  delay: number;
95
82
  limit: number;
@@ -101,25 +88,10 @@ export interface CommonOpts {
101
88
  httpPassword?: string;
102
89
  proxy?: string;
103
90
  }
104
- /** `schedule` options: the common ones plus the daily run time and tiers. */
91
+ /** `schedule` options: the common ones plus the daily run time. */
105
92
  export type ScheduleOpts = CommonOpts & {
106
93
  at: string;
107
- tier: Tier[];
108
94
  };
109
- /** Resolves the single scope flag (exactly one of country/region/all/near). */
110
- export declare const toScope: (o: CommonOpts) => FetchScope;
111
- /** The radius center: --near, or the TeslaMate "Home" geofence (--home-from-teslamate). */
112
- export declare const resolveCenter: (o: CommonOpts) => Promise<{
113
- lat: number;
114
- lon: number;
115
- }>;
116
- /**
117
- * Resolves the fetch scope, including the TeslaMate-backed ones. Exactly one of
118
- * --country / --region / --all / --near|--home-from-teslamate / --charged.
119
- */
120
- export declare const resolveFetchScope: (o: CommonOpts) => Promise<FetchScope>;
121
- /** Maps CLI options to the api fetch options, optionally with an explicit scope. */
122
- export declare const toFetchOptions: (o: CommonOpts, scope?: FetchScope) => FetchOptions;
123
95
  /** Builds the sinks the user asked for (CLI flag or env). At least one required. */
124
96
  export declare const buildStores: (o: CommonOpts) => IStore[];
125
97
  /**
@@ -128,21 +100,36 @@ export declare const buildStores: (o: CommonOpts) => IStore[];
128
100
  * env the process already has is left untouched.
129
101
  */
130
102
  export declare const applyProxy: (o: CommonOpts) => void;
131
- /** Fetches one snapshot, stores it, and closes the sinks. */
132
- export declare const runOnce: (o: CommonOpts, scope?: FetchScope) => Promise<void>;
133
- /** `fetch` command: resolve the (possibly TeslaMate-backed) scope, then run once. */
103
+ /** A Supercharger-selection method and how often (in days) it runs. */
104
+ export type DeterminationKind = "radius" | "country" | "outdated";
105
+ /** One enabled determination with its day-based cadence. */
106
+ export interface Determination {
107
+ kind: DeterminationKind;
108
+ everyDays: number;
109
+ }
110
+ /** The determinations the user enabled (at least one is required). */
111
+ export declare const buildDeterminations: (o: CommonOpts) => Determination[];
112
+ /**
113
+ * True when a determination with this cadence is due on `date`. Cadence is
114
+ * date-driven — `epochDay % everyDays === 0`, where epochDay is whole days since
115
+ * the Unix epoch (UTC) — so it survives restarts, with `7` landing on a fixed
116
+ * weekday and `30` meaning every 30 days.
117
+ */
118
+ export declare const isDue: (everyDays: number, date: Date) => boolean;
119
+ /** The subset of `dets` whose cadence is due on `date`. */
120
+ export declare const dueDeterminations: (dets: Determination[], date: Date) => Determination[];
121
+ /**
122
+ * Run the given determinations as ONE snapshot: take the union of their target
123
+ * Superchargers (selected from the cached master list), fetch each site's pricing
124
+ * once, then fan the records out to the configured sinks. The union + de-dupe is
125
+ * what keeps requests down — a site several determinations want is fetched once.
126
+ */
127
+ export declare const runDeterminations: (o: CommonOpts, dets: Determination[]) => Promise<void>;
128
+ /** `fetch` command: run every enabled determination once (ignoring cadence), then exit. */
134
129
  export declare const runFetch: (o: CommonOpts) => Promise<void>;
135
130
  /** ms from now until the next HH:MM (local); rolls to tomorrow if already passed. */
136
131
  export declare const msUntil: (at: string) => number;
137
- /**
138
- * The largest tier radius whose cadence is due on `date`, or null if none is.
139
- * A tier is "due" when `epochDay % everyDays === 0` (epochDay = whole days since
140
- * the Unix epoch, UTC) — date-driven so it survives restarts, with `7` landing on
141
- * a fixed weekday and `30` meaning every 30 days. Cumulative: the chosen radius
142
- * already covers every smaller tier, so one fetch at it satisfies all due tiers.
143
- */
144
- export declare const dueRadiusKm: (tiers: Tier[], date: Date) => number | null;
145
- /** Runs once on start, then every day at o.at — keeping the process alive. */
132
+ /** Runs the due determinations on start, then every day at o.at — keeping the process alive. */
146
133
  export declare const scheduleDaily: (o: ScheduleOpts) => Promise<void>;
147
134
  /** Prints the countries and regions that have Superchargers. */
148
135
  export declare const listCountries: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"cli.common.d.ts","sourceRoot":"","sources":["../src/cli.common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.common.d.ts","sourceRoot":"","sources":["../src/cli.common.ts"],"names":[],"mappings":"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"}
@@ -3,23 +3,24 @@ import { readFileSync } from "node:fs";
3
3
  import { dirname, resolve } from "node:path";
4
4
  import { env, exit } from "node:process";
5
5
  import { fileURLToPath } from "node:url";
6
- import { fetchAllLocations, fetchChargeSiteCoords, fetchHomeGeofence, isSupercharger, } from "@mxpicture/teslamate-extended-api/api";
7
- import { HttpStore, ingestSuperchargers, JsonFileStore, PostgresStore, TeslaMateGeofenceStore, } from "@mxpicture/teslamate-extended-api/store";
6
+ import { countUnpricedSuperchargerCharges, fetchAllLocations, fetchHomeGeofence, fetchOutdatedChargeSites, fetchRecordsForLocations, inScope, isSupercharger, } from "@mxpicture/teslamate-extended-api/api";
7
+ import { HttpStore, ingestRecords, JsonFileStore, PostgresStore, TeslaMateChargeStore, TeslaMateGeofenceStore, } from "@mxpicture/teslamate-extended-api/store";
8
+ import { notifyFetchErrors, notifyUnpricedCharges } from "./notify.js";
8
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
9
10
  /** Reads the CLI package version from its package.json. */
10
11
  export const readVersion = () => JSON.parse(readFileSync(resolve(__dirname, "../package.json"), "utf8"))
11
12
  .version;
12
- /** One day in milliseconds — the schedule interval. */
13
+ /** One day in milliseconds — the schedule interval and the cadence clock unit. */
13
14
  export const DAY_MS = 24 * 60 * 60 * 1000;
14
15
  /**
15
- * Match radius (km) for `--charged`: a TeslaMate charge location counts as a
16
- * given Supercharger when it sits within this distance of it. ~300 m comfortably
17
- * covers the gap between where the car parks and the site's listed point while
18
- * staying well under the spacing between distinct sites.
16
+ * Match radius (km) for the outdated-price determination: a TeslaMate charge
17
+ * location maps to a given Supercharger when it sits within this distance of it.
18
+ * ~300 m comfortably covers the gap between where the car parks and the site's
19
+ * listed point while staying well under the spacing between distinct sites.
19
20
  */
20
21
  export const CHARGED_MATCH_KM = 0.3;
21
22
  // ---------- argument parsers ----------
22
- /** Parses a non-negative float (e.g. --delay). */
23
+ /** Parses a non-negative float (e.g. --delay, --radius). */
23
24
  export const parseFloatArg = (v) => {
24
25
  const n = Number(v);
25
26
  if (!Number.isFinite(n) || n < 0)
@@ -33,54 +34,46 @@ export const parseIntArg = (v) => {
33
34
  throw new InvalidArgumentError("must be a non-negative integer");
34
35
  return n;
35
36
  };
37
+ /** Parses a positive integer number of days (e.g. --*-every, --outdated-age). */
38
+ export const parseDaysArg = (v) => {
39
+ const n = parseInt(v, 10);
40
+ if (!Number.isInteger(n) || n < 1)
41
+ throw new InvalidArgumentError("must be a positive integer (>= 1)");
42
+ return n;
43
+ };
36
44
  /** Validates an HH:MM (24h) time string (e.g. --at). */
37
45
  export const parseTime = (v) => {
38
46
  if (!/^([01]\d|2[0-3]):[0-5]\d$/.test(v))
39
47
  throw new InvalidArgumentError("expected HH:MM (24h)");
40
48
  return v;
41
49
  };
42
- /** Parses a "lat,lon" coordinate pair (e.g. --near). */
43
- export const parseNear = (v) => {
44
- const parts = v.split(",").map((s) => Number(s.trim()));
45
- if (parts.length !== 2 || !parts.every((n) => Number.isFinite(n)))
46
- throw new InvalidArgumentError("expected 'lat,lon' (e.g. 48.137,11.575)");
47
- const [lat, lon] = parts;
48
- if (lat < -90 || lat > 90 || lon < -180 || lon > 180)
49
- throw new InvalidArgumentError("lat must be -90..90 and lon -180..180");
50
- return { lat, lon };
51
- };
52
- /** Collects a repeatable --tier "radiusKm:everyDays" value onto the previous list. */
53
- export const parseTier = (v, prev) => {
54
- const [kmStr, daysStr] = v.split(":");
55
- const radiusKm = Number(kmStr);
56
- const everyDays = parseInt(daysStr ?? "", 10);
57
- if (!Number.isFinite(radiusKm) || radiusKm <= 0)
58
- throw new InvalidArgumentError("radius (km) must be a positive number");
59
- if (!Number.isInteger(everyDays) || everyDays <= 0)
60
- throw new InvalidArgumentError("everyDays must be a positive integer");
61
- return [...prev, { radiusKm, everyDays }];
62
- };
63
50
  // ---------- commander options ----------
51
+ // --- determination: radius from the TeslaMate Home geofence ---
52
+ /** Commander option: radius (km) around the TeslaMate "Home" geofence. */
53
+ export const radiusOption = new Option("-r, --radius <km>", "Determination: fetch Superchargers within this many km of the TeslaMate 'Home' geofence").argParser(parseFloatArg);
54
+ /** Commander option: cadence (days) for the radius determination. */
55
+ export const radiusEveryOption = new Option("--radius-every <days>", "Run the radius determination every N days")
56
+ .default(7)
57
+ .argParser(parseDaysArg);
58
+ // --- determination: by country ---
64
59
  /** Commander option: restrict to a single country. */
65
- export const countryOption = new Option("-c, --country <name>", "Only this country");
66
- /** Commander option: restrict to a single region. */
67
- export const regionOption = new Option("-R, --region <name>", "Only this region");
68
- /** Commander option: all Superchargers worldwide. */
69
- export const allOption = new Option("-a, --all", "All Superchargers worldwide");
70
- /** Commander option: center coordinate "lat,lon" for a radius scope. */
71
- export const nearOption = new Option("--near <lat,lon>", "Center coordinate for a radius scope, e.g. 48.137,11.575").argParser(parseNear);
72
- /** Commander option: radius in km around --near. */
73
- export const radiusOption = new Option("--radius <km>", "Radius in km around --near").argParser(parseFloatArg);
74
- /** Commander option (schedule): repeatable tier "radiusKm:everyDays". */
75
- export const tierOption = new Option("--tier <km:everyDays>", "Schedule tier 'radiusKm:everyDays' (repeatable); fetch within radiusKm every everyDays days")
76
- .default([])
77
- .argParser(parseTier);
78
- /** Commander option: scope = the Superchargers you've charged at (TeslaMate DB). */
79
- export const chargedOption = new Option("--charged", "Only Superchargers you've charged at (read from the TeslaMate DB); needs --postgres-url");
80
- /** Commander option: center the radius scope on the TeslaMate "Home" geofence. */
81
- export const homeFromTeslamateOption = new Option("--home-from-teslamate", "Center --near/--tier on the TeslaMate 'Home' geofence instead of a coordinate; needs --postgres-url");
82
- /** Commander option: also upsert each fetched Supercharger as a TeslaMate geofence. */
83
- export const geofencesOption = new Option("--teslamate-geofences", "Also upsert each fetched Supercharger as a TeslaMate geofence (name + price); needs --postgres-url");
60
+ export const countryOption = new Option("-c, --country <name>", "Determination: fetch Superchargers in this country");
61
+ /** Commander option: cadence (days) for the country determination. */
62
+ export const countryEveryOption = new Option("--country-every <days>", "Run the country determination every N days")
63
+ .default(30)
64
+ .argParser(parseDaysArg);
65
+ // --- determination: missing/outdated price ---
66
+ /** Commander option: enable the missing/outdated-price determination. */
67
+ export const outdatedOption = new Option("--outdated", "Determination: fetch Superchargers whose TeslaMate price is missing or outdated; needs --postgres-url");
68
+ /** Commander option: cadence (days) for the outdated determination. */
69
+ export const outdatedEveryOption = new Option("--outdated-every <days>", "Run the outdated-price determination every N days")
70
+ .default(1)
71
+ .argParser(parseDaysArg);
72
+ /** Commander option: age (days) past which a managed geofence's price is "outdated". */
73
+ export const outdatedAgeOption = new Option("--outdated-age <days>", "A managed geofence's price counts as outdated once older than this many days")
74
+ .default(30)
75
+ .argParser(parseDaysArg);
76
+ // --- pricing / pacing ---
84
77
  /** Commander option: pricing locale. */
85
78
  export const localeOption = new Option("-l, --locale <locale>", "Locale for pricing").default("en-US");
86
79
  /** Commander option: politeness delay between requests (seconds). */
@@ -91,6 +84,7 @@ export const delayOption = new Option("-d, --delay <seconds>", "Delay between re
91
84
  export const limitOption = new Option("-n, --limit <count>", "Cap number of sites")
92
85
  .default(0)
93
86
  .argParser(parseIntArg);
87
+ // --- sinks ---
94
88
  /** Commander option: JSON snapshot output directory. */
95
89
  export const outOption = new Option("-o, --out <dir>", "Write JSON snapshots to this directory (env SUPERCHARGERS_OUT_DIR)");
96
90
  /** Commander option: Postgres connection URL. */
@@ -103,37 +97,23 @@ export const httpUrlOption = new Option("--http-url <url>", "Push snapshots to t
103
97
  export const httpUserOption = new Option("--http-user <user>", "Basic-auth username for --http-url (env SUPERCHARGERS_HTTP_USER)");
104
98
  /** Commander option: Basic-auth password for --http-url. */
105
99
  export const httpPasswordOption = new Option("--http-password <password>", "Basic-auth password for --http-url (env SUPERCHARGERS_HTTP_PASSWORD)");
106
- /** Commander option: daily run time for `schedule` (24h, local). */
107
- export const atOption = new Option("-t, --at <HH:MM>", "Daily run time (24h, local)")
108
- .default("03:30")
109
- .argParser(parseTime);
100
+ /** Commander option: also upsert each fetched Supercharger as a TeslaMate geofence. */
101
+ export const geofencesOption = new Option("--teslamate-geofences", "Upsert each fetched Supercharger as a TeslaMate geofence (name + price); needs --postgres-url");
102
+ /** Commander option: backfill TeslaMate charge costs from the managed geofence prices. */
103
+ export const chargesOption = new Option("--teslamate-charges", "Backfill TeslaMate charge costs from the managed geofence prices (implies --teslamate-geofences); needs --postgres-url");
104
+ /** Commander option: after the run, alert (Pushover) when Supercharger charges remain unpriced. */
105
+ export const alertUnpricedChargesOption = new Option("--alert-unpriced-charges", "After the run, send a Pushover alert if TeslaMate has Supercharger charges with no price; needs --postgres-url and PUSHOVER_API_TOKEN/PUSHOVER_USER_KEY");
106
+ // --- transport / scheduling ---
110
107
  /**
111
108
  * Commander option: route tesla.com requests through a proxy. Sets
112
109
  * HTTPS_PROXY/ALL_PROXY for the curl subprocess (which already honors them when
113
110
  * set in the environment). Use this to escape datacenter IPs Akamai 403s.
114
111
  */
115
112
  export const proxyOption = new Option("--proxy <url>", "Route requests through this proxy (env HTTPS_PROXY / ALL_PROXY also honored)");
116
- /** Resolves the single scope flag (exactly one of country/region/all/near). */
117
- export const toScope = (o) => {
118
- const picked = [
119
- o.country,
120
- o.region,
121
- o.all ? "all" : undefined,
122
- o.near ? "near" : undefined,
123
- ].filter(Boolean);
124
- if (picked.length !== 1) {
125
- console.error("Pick exactly one scope: --country | --region | --all | --near.");
126
- exit(1);
127
- }
128
- if (o.near) {
129
- if (o.radius === undefined) {
130
- console.error("--near requires --radius <km>.");
131
- exit(1);
132
- }
133
- return { near: { lat: o.near.lat, lon: o.near.lon, radiusKm: o.radius } };
134
- }
135
- return { country: o.country, region: o.region, all: o.all };
136
- };
113
+ /** Commander option: daily run time for `schedule` (24h, local). */
114
+ export const atOption = new Option("-t, --at <HH:MM>", "Daily run time (24h, local)")
115
+ .default("03:30")
116
+ .argParser(parseTime);
137
117
  /** pgUrl from --postgres-url or env; errors out when a flag needs it and it's absent. */
138
118
  const requirePgUrl = (o, flag) => {
139
119
  const pgUrl = o.postgresUrl ?? env.SUPERCHARGERS_PG_URL;
@@ -143,64 +123,8 @@ const requirePgUrl = (o, flag) => {
143
123
  }
144
124
  return pgUrl;
145
125
  };
146
- /** The radius center: --near, or the TeslaMate "Home" geofence (--home-from-teslamate). */
147
- export const resolveCenter = async (o) => {
148
- if (o.near && o.homeFromTeslamate) {
149
- console.error("Pass either --near or --home-from-teslamate, not both.");
150
- exit(1);
151
- }
152
- if (o.near)
153
- return o.near;
154
- const home = await fetchHomeGeofence(requirePgUrl(o, "--home-from-teslamate"));
155
- if (!home) {
156
- console.error("No TeslaMate 'Home' geofence found (name ILIKE 'home').");
157
- exit(1);
158
- }
159
- console.log(`Home geofence center: ${home.lat},${home.lon}.`);
160
- return home;
161
- };
162
- /**
163
- * Resolves the fetch scope, including the TeslaMate-backed ones. Exactly one of
164
- * --country / --region / --all / --near|--home-from-teslamate / --charged.
165
- */
166
- export const resolveFetchScope = async (o) => {
167
- const nearScope = o.near || o.homeFromTeslamate;
168
- const picked = [
169
- o.country,
170
- o.region,
171
- o.all ? "all" : undefined,
172
- nearScope ? "near" : undefined,
173
- o.charged ? "charged" : undefined,
174
- ].filter(Boolean);
175
- if (picked.length !== 1) {
176
- console.error("Pick exactly one scope: --country | --region | --all | --near | --home-from-teslamate | --charged.");
177
- exit(1);
178
- }
179
- if (o.charged) {
180
- const points = await fetchChargeSiteCoords(requirePgUrl(o, "--charged"));
181
- console.log(`Found ${points.length} charge locations in TeslaMate.`);
182
- return { nearAny: { points, radiusKm: CHARGED_MATCH_KM } };
183
- }
184
- if (nearScope) {
185
- if (o.radius === undefined) {
186
- console.error("--near/--home-from-teslamate requires --radius <km>.");
187
- exit(1);
188
- }
189
- const c = await resolveCenter(o);
190
- return { near: { lat: c.lat, lon: c.lon, radiusKm: o.radius } };
191
- }
192
- return { country: o.country, region: o.region, all: o.all };
193
- };
194
- /** Maps CLI options to the api fetch options, optionally with an explicit scope. */
195
- export const toFetchOptions = (o, scope) => {
196
- return {
197
- scope: scope ?? toScope(o),
198
- locale: o.locale,
199
- delayMs: o.delay * 1000,
200
- limit: o.limit,
201
- logger: (m) => console.log(m),
202
- };
203
- };
126
+ /** Directory the ~30 MB /all-locations download is cached in (so it's read monthly). */
127
+ const cacheDir = (o) => env.SUPERCHARGERS_CACHE_DIR ?? o.out ?? env.SUPERCHARGERS_OUT_DIR;
204
128
  /** Builds the sinks the user asked for (CLI flag or env). At least one required. */
205
129
  export const buildStores = (o) => {
206
130
  const stores = [];
@@ -217,14 +141,20 @@ export const buildStores = (o) => {
217
141
  username: o.httpUser ?? env.SUPERCHARGERS_HTTP_USER,
218
142
  password: o.httpPassword ?? env.SUPERCHARGERS_HTTP_PASSWORD,
219
143
  }));
220
- if (o.teslamateGeofences)
144
+ // --teslamate-charges costs charges from the managed geofence prices, so it
145
+ // implies --teslamate-geofences; the geofence store must also run first.
146
+ if (o.teslamateGeofences || o.teslamateCharges)
221
147
  stores.push(new TeslaMateGeofenceStore({
222
148
  connectionString: requirePgUrl(o, "--teslamate-geofences"),
223
149
  }));
150
+ if (o.teslamateCharges)
151
+ stores.push(new TeslaMateChargeStore({
152
+ connectionString: requirePgUrl(o, "--teslamate-charges"),
153
+ }));
224
154
  if (stores.length === 0) {
225
- console.error("No output configured. Pass --out <dir>, --postgres-url <url>, and/or " +
226
- "--http-url <url> (or set SUPERCHARGERS_OUT_DIR / SUPERCHARGERS_PG_URL " +
227
- "/ SUPERCHARGERS_HTTP_URL).");
155
+ console.error("No output configured. Pass --out <dir>, --postgres-url <url>, " +
156
+ "--http-url <url>, --teslamate-geofences and/or --teslamate-charges " +
157
+ "(or set SUPERCHARGERS_OUT_DIR / SUPERCHARGERS_PG_URL / SUPERCHARGERS_HTTP_URL).");
228
158
  exit(1);
229
159
  }
230
160
  return stores;
@@ -240,24 +170,129 @@ export const applyProxy = (o) => {
240
170
  env.HTTPS_PROXY = o.proxy;
241
171
  env.ALL_PROXY = o.proxy;
242
172
  };
243
- /** Fetches one snapshot, stores it, and closes the sinks. */
244
- export const runOnce = async (o, scope) => {
173
+ /** The determinations the user enabled (at least one is required). */
174
+ export const buildDeterminations = (o) => {
175
+ const dets = [];
176
+ if (o.radius !== undefined)
177
+ dets.push({ kind: "radius", everyDays: o.radiusEvery });
178
+ if (o.country)
179
+ dets.push({ kind: "country", everyDays: o.countryEvery });
180
+ if (o.outdated)
181
+ dets.push({ kind: "outdated", everyDays: o.outdatedEvery });
182
+ if (dets.length === 0) {
183
+ console.error("Enable at least one determination: --radius <km>, --country <name>, and/or --outdated.");
184
+ exit(1);
185
+ }
186
+ return dets;
187
+ };
188
+ /**
189
+ * True when a determination with this cadence is due on `date`. Cadence is
190
+ * date-driven — `epochDay % everyDays === 0`, where epochDay is whole days since
191
+ * the Unix epoch (UTC) — so it survives restarts, with `7` landing on a fixed
192
+ * weekday and `30` meaning every 30 days.
193
+ */
194
+ export const isDue = (everyDays, date) => Math.floor(date.getTime() / DAY_MS) % everyDays === 0;
195
+ /** The subset of `dets` whose cadence is due on `date`. */
196
+ export const dueDeterminations = (dets, date) => dets.filter((d) => isDue(d.everyDays, date));
197
+ /**
198
+ * The fetch scope for one determination, or null to skip it this run:
199
+ * - radius: centered on the TeslaMate "Home" geofence; skipped with a warning
200
+ * when no Home geofence exists (radius-based selection is ignored).
201
+ * - country: a plain country match.
202
+ * - outdated: the charge sites whose managed price is missing/outdated, matched
203
+ * to Superchargers (skipped when there are none).
204
+ */
205
+ const scopeForDetermination = async (det, o) => {
206
+ if (det.kind === "country")
207
+ return { country: o.country };
208
+ if (det.kind === "radius") {
209
+ if (o.radius === undefined)
210
+ return null;
211
+ const home = await fetchHomeGeofence(requirePgUrl(o, "--radius"));
212
+ if (!home) {
213
+ console.warn("No TeslaMate 'Home' geofence found (name ILIKE 'home'); skipping the radius determination.");
214
+ return null;
215
+ }
216
+ console.log(`Home geofence center: ${home.lat},${home.lon}.`);
217
+ return { near: { lat: home.lat, lon: home.lon, radiusKm: o.radius } };
218
+ }
219
+ // outdated
220
+ const sites = await fetchOutdatedChargeSites(requirePgUrl(o, "--outdated"), {
221
+ outdatedAgeDays: o.outdatedAge,
222
+ });
223
+ console.log(`Found ${sites.length} charge sites with missing/outdated pricing.`);
224
+ if (sites.length === 0)
225
+ return null;
226
+ return { nearAny: { points: sites, radiusKm: CHARGED_MATCH_KM } };
227
+ };
228
+ /**
229
+ * Run the given determinations as ONE snapshot: take the union of their target
230
+ * Superchargers (selected from the cached master list), fetch each site's pricing
231
+ * once, then fan the records out to the configured sinks. The union + de-dupe is
232
+ * what keeps requests down — a site several determinations want is fetched once.
233
+ */
234
+ export const runDeterminations = async (o, dets) => {
245
235
  applyProxy(o);
246
- const fetchOpts = toFetchOptions(o, scope);
236
+ // Build (and thereby validate) the sinks up front — before the expensive
237
+ // fetch — so a misconfigured run fails fast instead of after downloading
238
+ // everything; the `finally` always closes them.
247
239
  const stores = buildStores(o);
240
+ const logger = (m) => console.log(m);
248
241
  try {
249
- const res = await ingestSuperchargers(fetchOpts, stores);
242
+ const dir = cacheDir(o);
243
+ const all = (await fetchAllLocations(logger, dir ? { cacheDir: dir } : undefined)).filter(isSupercharger);
244
+ logger(` -> ${all.length} are Superchargers.`);
245
+ const targets = new Map();
246
+ for (const det of dets) {
247
+ const scope = await scopeForDetermination(det, o);
248
+ if (!scope)
249
+ continue;
250
+ let n = 0;
251
+ for (const loc of all) {
252
+ if (!inScope(loc, scope))
253
+ continue;
254
+ targets.set(loc.location_id ?? `${loc.latitude},${loc.longitude}`, loc);
255
+ n++;
256
+ }
257
+ logger(`Determination '${det.kind}': ${n} Superchargers.`);
258
+ }
259
+ let list = [...targets.values()];
260
+ if (o.limit)
261
+ list = list.slice(0, o.limit);
262
+ if (list.length === 0) {
263
+ logger("No Superchargers to fetch; nothing to do.");
264
+ return;
265
+ }
266
+ const summary = await fetchRecordsForLocations(list, {
267
+ locale: o.locale,
268
+ delayMs: o.delay * 1000,
269
+ logger,
270
+ });
271
+ const res = await ingestRecords(summary.records, stores);
250
272
  console.log(`Saved ${res.count} Superchargers (run ${res.runId}, ` +
251
273
  `${res.fetchedAt.toISOString()}).`);
274
+ // Opt-in Pushover alerts (no-ops unless PUSHOVER_* env is set).
275
+ await notifyFetchErrors(summary, logger);
276
+ if (o.alertUnpricedCharges) {
277
+ const pgUrl = o.postgresUrl ?? env.SUPERCHARGERS_PG_URL;
278
+ if (!pgUrl) {
279
+ logger("--alert-unpriced-charges needs --postgres-url (or env SUPERCHARGERS_PG_URL); skipping the unpriced-charge alert.");
280
+ }
281
+ else {
282
+ const unpriced = await countUnpricedSuperchargerCharges(pgUrl);
283
+ logger(`Unpriced Supercharger charges: ${unpriced}.`);
284
+ await notifyUnpricedCharges(unpriced, logger);
285
+ }
286
+ }
252
287
  }
253
288
  finally {
254
289
  for (const s of stores)
255
290
  await s.close?.();
256
291
  }
257
292
  };
258
- /** `fetch` command: resolve the (possibly TeslaMate-backed) scope, then run once. */
293
+ /** `fetch` command: run every enabled determination once (ignoring cadence), then exit. */
259
294
  export const runFetch = async (o) => {
260
- await runOnce(o, await resolveFetchScope(o));
295
+ await runDeterminations(o, buildDeterminations(o));
261
296
  };
262
297
  /** ms from now until the next HH:MM (local); rolls to tomorrow if already passed. */
263
298
  export const msUntil = (at) => {
@@ -269,47 +304,18 @@ export const msUntil = (at) => {
269
304
  next.setTime(next.getTime() + DAY_MS);
270
305
  return next.getTime() - now.getTime();
271
306
  };
272
- /**
273
- * The largest tier radius whose cadence is due on `date`, or null if none is.
274
- * A tier is "due" when `epochDay % everyDays === 0` (epochDay = whole days since
275
- * the Unix epoch, UTC) — date-driven so it survives restarts, with `7` landing on
276
- * a fixed weekday and `30` meaning every 30 days. Cumulative: the chosen radius
277
- * already covers every smaller tier, so one fetch at it satisfies all due tiers.
278
- */
279
- export const dueRadiusKm = (tiers, date) => {
280
- const epochDay = Math.floor(date.getTime() / DAY_MS);
281
- const due = tiers.filter((t) => epochDay % t.everyDays === 0);
282
- if (due.length === 0)
283
- return null;
284
- return Math.max(...due.map((t) => t.radiusKm));
285
- };
286
- /** Runs once on start, then every day at o.at — keeping the process alive. */
307
+ /** Runs the due determinations on start, then every day at o.at — keeping the process alive. */
287
308
  export const scheduleDaily = async (o) => {
288
- const tiers = o.tier;
289
- if (tiers.length > 0 && !o.near && !o.homeFromTeslamate) {
290
- console.error("--tier requires --near <lat,lon> or --home-from-teslamate.");
291
- exit(1);
292
- }
293
- // Resolve the tier center once (a coordinate, or the TeslaMate "Home" geofence).
294
- const center = tiers.length > 0 ? await resolveCenter(o) : undefined;
309
+ const dets = buildDeterminations(o);
295
310
  const safeRun = async () => {
311
+ const due = dueDeterminations(dets, new Date());
312
+ if (due.length === 0) {
313
+ console.log("No determination due today; skipping run.");
314
+ return;
315
+ }
316
+ console.log(`Determinations due today: ${due.map((d) => d.kind).join(", ")}.`);
296
317
  try {
297
- if (tiers.length > 0 && center) {
298
- const radiusKm = dueRadiusKm(tiers, new Date());
299
- if (radiusKm === null) {
300
- console.log("No tier due today; skipping run.");
301
- return;
302
- }
303
- console.log(`Tier due: fetching within ${radiusKm} km of ${center.lat},${center.lon}.`);
304
- await runOnce(o, {
305
- near: { lat: center.lat, lon: center.lon, radiusKm },
306
- });
307
- }
308
- else {
309
- // No tiers: country/region/all, --near, --home-from-teslamate, or --charged
310
- // (re-resolved each fire so new charge locations are picked up over time).
311
- await runOnce(o, await resolveFetchScope(o));
312
- }
318
+ await runDeterminations(o, due);
313
319
  }
314
320
  catch (e) {
315
321
  console.error("Run failed:", e instanceof Error ? e.message : e);
@@ -328,7 +334,8 @@ export const scheduleDaily = async (o) => {
328
334
  };
329
335
  /** Prints the countries and regions that have Superchargers. */
330
336
  export const listCountries = async () => {
331
- const locations = (await fetchAllLocations()).filter(isSupercharger);
337
+ const dir = env.SUPERCHARGERS_CACHE_DIR ?? env.SUPERCHARGERS_OUT_DIR;
338
+ const locations = (await fetchAllLocations(undefined, dir ? { cacheDir: dir } : undefined)).filter(isSupercharger);
332
339
  const countries = [
333
340
  ...new Set(locations.map((l) => l.country).filter(Boolean)),
334
341
  ].sort();
@@ -1 +1 @@
1
- {"version":3,"file":"cli.common.js","sourceRoot":"","sources":["../src/cli.common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.common.js","sourceRoot":"","sources":["../src/cli.common.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -2,17 +2,23 @@
2
2
  /**
3
3
  * teslamate-superchargers
4
4
  * =======================
5
- * Fetch all Tesla Supercharger locations + pricing (via the public tesla.com
5
+ * Fetch Tesla Supercharger locations + pricing (via the public tesla.com
6
6
  * endpoints, see `@mxpicture/teslamate-extended-api`) and persist each run as a
7
- * dated snapshot — to JSON files and/or PostgreSQL. Because every run is stored
8
- * under its own timestamp, repeated runs build a price history.
7
+ * dated snapshot — to JSON files, PostgreSQL and/or TeslaMate. Because every run
8
+ * is stored under its own timestamp, repeated runs build a price history.
9
9
  *
10
- * teslamate-superchargers fetch --all --out ./data --postgres-url "$PG_URL"
11
- * teslamate-superchargers schedule --all --postgres-url "$PG_URL" --at 03:30
10
+ * Which Superchargers to fetch is chosen by one or more "determinations", each
11
+ * with its own day-based cadence:
12
+ * --radius <km> within km of the TeslaMate "Home" geofence (--radius-every)
13
+ * --country <name> every Supercharger in a country (--country-every)
14
+ * --outdated sites whose TeslaMate price is missing/old (--outdated-every)
15
+ *
16
+ * teslamate-superchargers fetch --country Germany --out ./data
17
+ * teslamate-superchargers schedule --radius 100 --outdated --postgres-url "$PG_URL"
12
18
  * teslamate-superchargers list-countries
13
19
  *
14
- * The `schedule` command runs once on start and then daily at --at, keeping the
15
- * process alive — so a single container is enough to refresh the data every day.
20
+ * The `schedule` command runs the due determinations on start and then daily at
21
+ * --at, keeping the process alive — so a single container refreshes the data.
16
22
  */
17
23
  export {};
18
24
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG"}
package/dist/cli.js CHANGED
@@ -2,36 +2,44 @@
2
2
  /**
3
3
  * teslamate-superchargers
4
4
  * =======================
5
- * Fetch all Tesla Supercharger locations + pricing (via the public tesla.com
5
+ * Fetch Tesla Supercharger locations + pricing (via the public tesla.com
6
6
  * endpoints, see `@mxpicture/teslamate-extended-api`) and persist each run as a
7
- * dated snapshot — to JSON files and/or PostgreSQL. Because every run is stored
8
- * under its own timestamp, repeated runs build a price history.
7
+ * dated snapshot — to JSON files, PostgreSQL and/or TeslaMate. Because every run
8
+ * is stored under its own timestamp, repeated runs build a price history.
9
9
  *
10
- * teslamate-superchargers fetch --all --out ./data --postgres-url "$PG_URL"
11
- * teslamate-superchargers schedule --all --postgres-url "$PG_URL" --at 03:30
10
+ * Which Superchargers to fetch is chosen by one or more "determinations", each
11
+ * with its own day-based cadence:
12
+ * --radius <km> within km of the TeslaMate "Home" geofence (--radius-every)
13
+ * --country <name> every Supercharger in a country (--country-every)
14
+ * --outdated sites whose TeslaMate price is missing/old (--outdated-every)
15
+ *
16
+ * teslamate-superchargers fetch --country Germany --out ./data
17
+ * teslamate-superchargers schedule --radius 100 --outdated --postgres-url "$PG_URL"
12
18
  * teslamate-superchargers list-countries
13
19
  *
14
- * The `schedule` command runs once on start and then daily at --at, keeping the
15
- * process alive — so a single container is enough to refresh the data every day.
20
+ * The `schedule` command runs the due determinations on start and then daily at
21
+ * --at, keeping the process alive — so a single container refreshes the data.
16
22
  */
17
23
  import { program } from "@commander-js/extra-typings";
18
24
  import { argv, exit } from "node:process";
19
- import { allOption, atOption, chargedOption, countryOption, delayOption, geofencesOption, homeFromTeslamateOption, httpPasswordOption, httpUrlOption, httpUserOption, limitOption, listCountries, localeOption, nearOption, outOption, pgTableOption, postgresUrlOption, proxyOption, radiusOption, readVersion, regionOption, runFetch, scheduleDaily, tierOption, } from "./cli.common.js";
25
+ import { alertUnpricedChargesOption, atOption, chargesOption, countryEveryOption, countryOption, delayOption, geofencesOption, httpPasswordOption, httpUrlOption, httpUserOption, limitOption, listCountries, localeOption, outdatedAgeOption, outdatedEveryOption, outdatedOption, outOption, pgTableOption, postgresUrlOption, proxyOption, radiusEveryOption, radiusOption, readVersion, runFetch, scheduleDaily, } from "./cli.common.js";
20
26
  program
21
27
  .name("teslamate-superchargers")
22
28
  .version(readVersion())
23
29
  .description("Fetch + store Tesla Supercharger locations and pricing");
24
30
  program
25
31
  .command("fetch")
26
- .description("Fetch one snapshot and store it, then exit")
27
- .addOption(countryOption)
28
- .addOption(regionOption)
29
- .addOption(allOption)
30
- .addOption(nearOption)
32
+ .description("Run every enabled determination once and store it, then exit")
31
33
  .addOption(radiusOption)
32
- .addOption(chargedOption)
33
- .addOption(homeFromTeslamateOption)
34
+ .addOption(radiusEveryOption)
35
+ .addOption(countryOption)
36
+ .addOption(countryEveryOption)
37
+ .addOption(outdatedOption)
38
+ .addOption(outdatedEveryOption)
39
+ .addOption(outdatedAgeOption)
34
40
  .addOption(geofencesOption)
41
+ .addOption(chargesOption)
42
+ .addOption(alertUnpricedChargesOption)
35
43
  .addOption(localeOption)
36
44
  .addOption(delayOption)
37
45
  .addOption(limitOption)
@@ -45,16 +53,17 @@ program
45
53
  .action((o) => runFetch(o));
46
54
  program
47
55
  .command("schedule")
48
- .description("Fetch now, then refresh once a day at --at (keeps running)")
49
- .addOption(countryOption)
50
- .addOption(regionOption)
51
- .addOption(allOption)
52
- .addOption(nearOption)
56
+ .description("Run the due determinations now, then daily at --at (keeps running)")
53
57
  .addOption(radiusOption)
54
- .addOption(tierOption)
55
- .addOption(chargedOption)
56
- .addOption(homeFromTeslamateOption)
58
+ .addOption(radiusEveryOption)
59
+ .addOption(countryOption)
60
+ .addOption(countryEveryOption)
61
+ .addOption(outdatedOption)
62
+ .addOption(outdatedEveryOption)
63
+ .addOption(outdatedAgeOption)
57
64
  .addOption(geofencesOption)
65
+ .addOption(chargesOption)
66
+ .addOption(alertUnpricedChargesOption)
58
67
  .addOption(localeOption)
59
68
  .addOption(delayOption)
60
69
  .addOption(limitOption)
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,SAAS,EACT,QAAQ,EACR,aAAa,EACb,aAAa,EACb,WAAW,EACX,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,EACV,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,UAAU,GACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO;KACJ,IAAI,CAAC,yBAAyB,CAAC;KAC/B,OAAO,CAAC,WAAW,EAAE,CAAC;KACtB,WAAW,CAAC,wDAAwD,CAAC,CAAC;AAEzE,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,4CAA4C,CAAC;KACzD,SAAS,CAAC,aAAa,CAAC;KACxB,SAAS,CAAC,YAAY,CAAC;KACvB,SAAS,CAAC,SAAS,CAAC;KACpB,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,YAAY,CAAC;KACvB,SAAS,CAAC,aAAa,CAAC;KACxB,SAAS,CAAC,uBAAuB,CAAC;KAClC,SAAS,CAAC,eAAe,CAAC;KAC1B,SAAS,CAAC,YAAY,CAAC;KACvB,SAAS,CAAC,WAAW,CAAC;KACtB,SAAS,CAAC,WAAW,CAAC;KACtB,SAAS,CAAC,SAAS,CAAC;KACpB,SAAS,CAAC,iBAAiB,CAAC;KAC5B,SAAS,CAAC,aAAa,CAAC;KACxB,SAAS,CAAC,aAAa,CAAC;KACxB,SAAS,CAAC,cAAc,CAAC;KACzB,SAAS,CAAC,kBAAkB,CAAC;KAC7B,SAAS,CAAC,WAAW,CAAC;KACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,4DAA4D,CAAC;KACzE,SAAS,CAAC,aAAa,CAAC;KACxB,SAAS,CAAC,YAAY,CAAC;KACvB,SAAS,CAAC,SAAS,CAAC;KACpB,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,YAAY,CAAC;KACvB,SAAS,CAAC,UAAU,CAAC;KACrB,SAAS,CAAC,aAAa,CAAC;KACxB,SAAS,CAAC,uBAAuB,CAAC;KAClC,SAAS,CAAC,eAAe,CAAC;KAC1B,SAAS,CAAC,YAAY,CAAC;KACvB,SAAS,CAAC,WAAW,CAAC;KACtB,SAAS,CAAC,WAAW,CAAC;KACtB,SAAS,CAAC,SAAS,CAAC;KACpB,SAAS,CAAC,iBAAiB,CAAC;KAC5B,SAAS,CAAC,aAAa,CAAC;KACxB,SAAS,CAAC,aAAa,CAAC;KACxB,SAAS,CAAC,cAAc,CAAC;KACzB,SAAS,CAAC,kBAAkB,CAAC;KAC7B,SAAS,CAAC,WAAW,CAAC;KACtB,SAAS,CAAC,QAAQ,CAAC;KACnB,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACnC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjB,IAAI,CAAC,CAAC,CAAC,CAAC;AACV,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Pushover alerts for a scraper run. Both helpers are no-ops when
3
+ * PUSHOVER_API_TOKEN / PUSHOVER_USER_KEY are unset, so alerting is opt-in via
4
+ * the environment (the deployment injects the same creds the health-watch /
5
+ * backup scripts use). Sending never throws (see {@link sendPushover}).
6
+ */
7
+ import { type FetchRunSummary } from "@mxpicture/teslamate-extended-api/api";
8
+ /**
9
+ * Alert when a fetch run had hard failures (`fail > 0`). City-mismatch warnings
10
+ * are reported in the body for context but never trigger an alert on their own.
11
+ */
12
+ export declare const notifyFetchErrors: (summary: FetchRunSummary, logger?: (m: string) => void) => Promise<void>;
13
+ /** Alert when Supercharger charges remain unpriced after the run. */
14
+ export declare const notifyUnpricedCharges: (count: number, logger?: (m: string) => void) => Promise<void>;
15
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,uCAAuC,CAAC;AAK/C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,eAAe,EACxB,SAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,IAAkB,KACxC,OAAO,CAAC,IAAI,CAuBd,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,GAChC,OAAO,MAAM,EACb,SAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,IAAkB,KACxC,OAAO,CAAC,IAAI,CAYd,CAAC"}
package/dist/notify.js ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Pushover alerts for a scraper run. Both helpers are no-ops when
3
+ * PUSHOVER_API_TOKEN / PUSHOVER_USER_KEY are unset, so alerting is opt-in via
4
+ * the environment (the deployment injects the same creds the health-watch /
5
+ * backup scripts use). Sending never throws (see {@link sendPushover}).
6
+ */
7
+ import { pushoverConfigFromEnv, sendPushover, } from "@mxpicture/teslamate-extended-api/api";
8
+ /** Max failed-site lines to include in an alert body before truncating. */
9
+ const MAX_LISTED = 10;
10
+ /**
11
+ * Alert when a fetch run had hard failures (`fail > 0`). City-mismatch warnings
12
+ * are reported in the body for context but never trigger an alert on their own.
13
+ */
14
+ export const notifyFetchErrors = async (summary, logger = console.log) => {
15
+ if (summary.fail <= 0)
16
+ return;
17
+ const cfg = pushoverConfigFromEnv();
18
+ if (!cfg)
19
+ return;
20
+ const total = summary.ok + summary.warn + summary.fail;
21
+ const listed = summary.failures
22
+ .slice(0, MAX_LISTED)
23
+ .map((f) => `• ${f.label}: ${f.reason}`)
24
+ .join("\n");
25
+ const more = summary.failures.length > MAX_LISTED
26
+ ? `\n…and ${summary.failures.length - MAX_LISTED} more.`
27
+ : "";
28
+ const message = `${summary.fail} of ${total} Superchargers failed ` +
29
+ `(ok=${summary.ok}, warn=${summary.warn}).\n${listed}${more}`;
30
+ await sendPushover(cfg, { title: "⚠️ Supercharger fetch errors", message, priority: 1 }, logger);
31
+ };
32
+ /** Alert when Supercharger charges remain unpriced after the run. */
33
+ export const notifyUnpricedCharges = async (count, logger = console.log) => {
34
+ if (count <= 0)
35
+ return;
36
+ const cfg = pushoverConfigFromEnv();
37
+ if (!cfg)
38
+ return;
39
+ await sendPushover(cfg, {
40
+ title: "⚠️ Unpriced Supercharger charges",
41
+ message: `${count} Supercharger charge(s) in TeslaMate still have no price.`,
42
+ }, logger);
43
+ };
44
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,qBAAqB,EACrB,YAAY,GAEb,MAAM,uCAAuC,CAAC;AAE/C,2EAA2E;AAC3E,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,OAAwB,EACxB,SAA8B,OAAO,CAAC,GAAG,EAC1B,EAAE;IACjB,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO;IAC9B,MAAM,GAAG,GAAG,qBAAqB,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ;SAC5B,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;SACvC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,UAAU;QAClC,CAAC,CAAC,UAAU,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,UAAU,QAAQ;QACxD,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,OAAO,GACX,GAAG,OAAO,CAAC,IAAI,OAAO,KAAK,wBAAwB;QACnD,OAAO,OAAO,CAAC,EAAE,UAAU,OAAO,CAAC,IAAI,OAAO,MAAM,GAAG,IAAI,EAAE,CAAC;IAEhE,MAAM,YAAY,CAChB,GAAG,EACH,EAAE,KAAK,EAAE,8BAA8B,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAC/D,MAAM,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,KAAa,EACb,SAA8B,OAAO,CAAC,GAAG,EAC1B,EAAE;IACjB,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO;IACvB,MAAM,GAAG,GAAG,qBAAqB,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,YAAY,CAChB,GAAG,EACH;QACE,KAAK,EAAE,kCAAkC;QACzC,OAAO,EAAE,GAAG,KAAK,2DAA2D;KAC7E,EACD,MAAM,CACP,CAAC;AACJ,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxpicture/teslamate-extended-cli",
3
- "version": "2.1.63",
3
+ "version": "3.1.3",
4
4
  "description": "CLI to fetch + store Tesla Supercharger locations and pricing",
5
5
  "type": "module",
6
6
  "author": "MXPicture",
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@commander-js/extra-typings": "^14.0.0",
39
- "@mxpicture/teslamate-extended-api": "^2.1.63",
39
+ "@mxpicture/teslamate-extended-api": "^3.1.3",
40
40
  "commander": "^14.0.3"
41
41
  },
42
42
  "devDependencies": {