@mxpicture/tesla-superchargers-http 0.1.63 → 0.1.65
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/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +46 -2
- package/dist/commands.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/params.d.ts +29 -1
- package/dist/params.d.ts.map +1 -1
- package/dist/params.js +73 -0
- package/dist/params.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +18 -7
- package/dist/server.js.map +1 -1
- package/dist/ui/additional-costs.d.ts +11 -0
- package/dist/ui/additional-costs.d.ts.map +1 -0
- package/dist/ui/additional-costs.js +286 -0
- package/dist/ui/additional-costs.js.map +1 -0
- package/dist/ui/commands.d.ts +12 -0
- package/dist/ui/commands.d.ts.map +1 -0
- package/dist/ui/commands.js +168 -0
- package/dist/ui/commands.js.map +1 -0
- package/dist/ui/favourites.d.ts +12 -0
- package/dist/ui/favourites.d.ts.map +1 -0
- package/dist/ui/favourites.js +219 -0
- package/dist/ui/favourites.js.map +1 -0
- package/dist/ui/shell.d.ts +42 -0
- package/dist/ui/shell.d.ts.map +1 -0
- package/dist/ui/shell.js +184 -0
- package/dist/ui/shell.js.map +1 -0
- package/package.json +3 -3
- package/dist/ui.d.ts +0 -17
- package/dist/ui.d.ts.map +0 -1
- package/dist/ui.js +0 -496
- package/dist/ui.js.map +0 -1
package/dist/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,YAAY,CAAC;AAmD1D;;;;GAIG;AACH,eAAO,MAAM,aAAa,QAAO,eA4I/B,CAAC"}
|
package/dist/commands.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { chargersApi, chargingProcessesApi, clustersApi, failuresApi, invoicesApi, refsApi, slugsApi, zipCodesApi, } from "@mxpicture/tesla-superchargers-api/api";
|
|
1
|
+
import { additionalCostsApi, carsApi, chargersApi, chargingProcessesApi, clustersApi, failuresApi, invoicesApi, refsApi, slugsApi, zipCodesApi, } from "@mxpicture/tesla-superchargers-api/api";
|
|
2
2
|
import { HttpError } from "./errors.js";
|
|
3
|
-
import { chargerSelector, coordinate, countries, favourite, flag, id, locale, maxFetches, optString, optTimestamp, radiusKm, source, threshold, } from "./params.js";
|
|
3
|
+
import { carId, category, chargerSelector, coordinate, cost, countries, description, favourite, flag, id, isoDate, locale, maxFetches, optIsoDate, optString, optTimestamp, radiusKm, recurrence, source, threshold, } from "./params.js";
|
|
4
4
|
/** reset-failures: exactly one of `id` (a single row) or `all` (the source). */
|
|
5
5
|
const resetFailures = async (params) => {
|
|
6
6
|
const src = source(params);
|
|
@@ -16,6 +16,30 @@ const resetFailures = async (params) => {
|
|
|
16
16
|
}
|
|
17
17
|
return await failuresApi().resetAllFailed(src);
|
|
18
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* One additional-cost row from a JSON body. The two `end_date` rules are
|
|
21
|
+
* checked here rather than left to the table's own CHECK, so a wrong
|
|
22
|
+
* combination comes back as a readable 400 instead of a 500; the constraint
|
|
23
|
+
* stays the backstop.
|
|
24
|
+
*/
|
|
25
|
+
const additionalCost = (params) => {
|
|
26
|
+
const date = isoDate(params, "date");
|
|
27
|
+
const end_date = optIsoDate(params, "end_date");
|
|
28
|
+
const every = recurrence(params);
|
|
29
|
+
if (end_date !== null && every !== "monthly")
|
|
30
|
+
throw new HttpError(400, "'end_date' requires recurrence 'monthly'");
|
|
31
|
+
if (end_date !== null && end_date < date)
|
|
32
|
+
throw new HttpError(400, "'end_date' must not be before 'date'");
|
|
33
|
+
return {
|
|
34
|
+
car_id: carId(params),
|
|
35
|
+
category: category(params),
|
|
36
|
+
date,
|
|
37
|
+
description: description(params),
|
|
38
|
+
cost: cost(params),
|
|
39
|
+
recurrence: every,
|
|
40
|
+
end_date,
|
|
41
|
+
};
|
|
42
|
+
};
|
|
19
43
|
/**
|
|
20
44
|
* The HTTP command registry, each entry wired to the api layer directly (never
|
|
21
45
|
* the CLI). Read-only lookups answer GET with query-string params; the
|
|
@@ -46,6 +70,26 @@ export const buildCommands = () => ({
|
|
|
46
70
|
method: "POST",
|
|
47
71
|
run: (p) => chargersApi().updateFavourite(id(p), favourite(p)),
|
|
48
72
|
},
|
|
73
|
+
"query-additional-costs": {
|
|
74
|
+
method: "GET",
|
|
75
|
+
run: () => additionalCostsApi().query(),
|
|
76
|
+
},
|
|
77
|
+
"create-additional-cost": {
|
|
78
|
+
method: "POST",
|
|
79
|
+
run: (p) => additionalCostsApi().create(additionalCost(p)),
|
|
80
|
+
},
|
|
81
|
+
"update-additional-cost": {
|
|
82
|
+
method: "POST",
|
|
83
|
+
run: (p) => additionalCostsApi().update(id(p), additionalCost(p)),
|
|
84
|
+
},
|
|
85
|
+
"delete-additional-cost": {
|
|
86
|
+
method: "POST",
|
|
87
|
+
run: (p) => additionalCostsApi().remove(id(p)),
|
|
88
|
+
},
|
|
89
|
+
"query-cars": {
|
|
90
|
+
method: "GET",
|
|
91
|
+
run: () => carsApi().query(),
|
|
92
|
+
},
|
|
49
93
|
"fetch-charger": {
|
|
50
94
|
method: "GET",
|
|
51
95
|
run: (p) => {
|
package/dist/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,GACZ,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
* POST /notify-failures body: { threshold? }
|
|
19
19
|
* POST /notify-unmatched-invoices
|
|
20
20
|
* GET / (the web UI — a static page driving the above)
|
|
21
|
+
* GET /favourites (the web UI — the charger favourites table)
|
|
22
|
+
* GET /additional-costs (the web UI — the additional-costs table)
|
|
21
23
|
* GET /health (unauthenticated liveness probe)
|
|
22
24
|
*
|
|
23
25
|
* The database connection comes from the standard `PG*` environment variables;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,CAAC,KAAK,CACX,qEAAqE,CACtE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AACnD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC,CAAC;AAE5E,qEAAqE;AACrE,MAAM,QAAQ,GAAG,GAAS,EAAE;IAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC"}
|
package/dist/params.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { COST_CATEGORIES, COST_RECURRENCES, type FailureSource } from "@mxpicture/tesla-superchargers-api/types";
|
|
2
2
|
import type { Params } from "./types.js";
|
|
3
3
|
export declare const boolValue: (params: Params, key: string) => boolean;
|
|
4
4
|
export declare const stringValue: (params: Params, key: string) => string;
|
|
@@ -41,4 +41,32 @@ export declare const threshold: (params: Params) => number;
|
|
|
41
41
|
export declare const maxFetches: (params: Params) => number;
|
|
42
42
|
/** A boolean flag: true only for an explicit true / "true" / "1". */
|
|
43
43
|
export declare const flag: (params: Params, key: string) => boolean;
|
|
44
|
+
/** The `car_id` an entry is booked against: a positive integer. */
|
|
45
|
+
export declare const carId: (params: Params) => number;
|
|
46
|
+
/** The cost category; anything outside the `pic_cost_category` enum → 400. */
|
|
47
|
+
export declare const category: (params: Params) => (typeof COST_CATEGORIES)[number];
|
|
48
|
+
/** The recurrence; anything outside the `pic_cost_recurrence` enum → 400. */
|
|
49
|
+
export declare const recurrence: (params: Params) => (typeof COST_RECURRENCES)[number];
|
|
50
|
+
/**
|
|
51
|
+
* A calendar day as `YYYY-MM-DD`, the shape the store binds straight to a
|
|
52
|
+
* `DATE` — never a JS `Date`, which would carry a time zone the column has no
|
|
53
|
+
* room for. The round-trip through `Date.UTC` is what rejects an impossible
|
|
54
|
+
* day like 2026-02-31, which the pattern alone accepts.
|
|
55
|
+
*/
|
|
56
|
+
export declare const isoDate: (params: Params, key: string) => string;
|
|
57
|
+
/** The same, but absent or empty means "no end date" rather than a 400. */
|
|
58
|
+
export declare const optIsoDate: (params: Params, key: string) => string | null;
|
|
59
|
+
/**
|
|
60
|
+
* The entry's label. Non-blank mirrors the table's own CHECK, so an empty one
|
|
61
|
+
* fails as a readable 400 instead of a 500 from a constraint violation.
|
|
62
|
+
*/
|
|
63
|
+
export declare const description: (params: Params) => string;
|
|
64
|
+
/**
|
|
65
|
+
* The amount in EUR, as the NUMERIC(10,2) string the store binds. Any sign: a
|
|
66
|
+
* refund or a `funding` credit is negative. Bounded like the column, for the
|
|
67
|
+
* same reason {@link description} mirrors its CHECK: the cost field is a plain
|
|
68
|
+
* number input, so an extra digit is a plausible typo and a 400 says more than
|
|
69
|
+
* "internal error". Rounded first, since that is the value Postgres sees.
|
|
70
|
+
*/
|
|
71
|
+
export declare const cost: (params: Params) => string;
|
|
44
72
|
//# sourceMappingURL=params.d.ts.map
|
package/dist/params.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EAEf,gBAAgB,EAChB,KAAK,aAAa,EACnB,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAMzC,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,OASvD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,MAOzD,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,SAOhE,CAAC;AAqBF,0EAA0E;AAC1E,eAAO,MAAM,UAAU,GACrB,QAAQ,MAAM,KACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAGtC,CAAC;AAEH,eAAO,MAAM,EAAE,GAAI,QAAQ,MAAM,WAA8B,CAAC;AAEhE,iEAAiE;AACjE,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,WAAqC,CAAC;AAE9E,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG,eAgBhD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,YAAmC,CAAC;AAE5E,qFAAqF;AACrF,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SACpB,CAAC;AAEhC,eAAO,MAAM,MAAM,GAAI,QAAQ,MAAM,KAAG,MACF,CAAC;AAEvC,qEAAqE;AACrE,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,IAAI,GAAG,SASjE,CAAC;AAIF,uEAAuE;AACvE,eAAO,MAAM,MAAM,GAAI,QAAQ,MAAM,KAAG,aAAa,GAAG,KAMvD,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,KAAG,MAQ1C,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG,MAQ3C,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,IAAI,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,OAGlD,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,KAAK,GAAI,QAAQ,MAAM,KAAG,MAMtC,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,KAAG,CAAC,OAAO,eAAe,EAAE,MAAM,CAQxE,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,UAAU,GACrB,QAAQ,MAAM,KACb,CAAC,OAAO,gBAAgB,EAAE,MAAM,CAQlC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,MAarD,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,IAIjE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG,MAI5C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,GAAI,QAAQ,MAAM,KAAG,MAKrC,CAAC"}
|
package/dist/params.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { FAILURE_DEPRIORITIZE_THRESHOLD, MAX_CHARGER_FETCHES, } from "@mxpicture/tesla-superchargers-api/common";
|
|
2
|
+
import { COST_CATEGORIES, COST_MAX, COST_RECURRENCES, } from "@mxpicture/tesla-superchargers-api/types";
|
|
2
3
|
import { HttpError } from "./errors.js";
|
|
3
4
|
const bad = (message) => {
|
|
4
5
|
throw new HttpError(400, message);
|
|
@@ -126,4 +127,76 @@ export const flag = (params, key) => {
|
|
|
126
127
|
const value = params[key];
|
|
127
128
|
return value === true || value === "true" || value === "1";
|
|
128
129
|
};
|
|
130
|
+
/** The `car_id` an entry is booked against: a positive integer. */
|
|
131
|
+
export const carId = (params) => {
|
|
132
|
+
const value = params["car_id"];
|
|
133
|
+
const n = typeof value === "number" ? value : Number(value);
|
|
134
|
+
if (!Number.isInteger(n) || n <= 0)
|
|
135
|
+
return bad("'car_id' must be a positive integer");
|
|
136
|
+
return n;
|
|
137
|
+
};
|
|
138
|
+
/** The cost category; anything outside the `pic_cost_category` enum → 400. */
|
|
139
|
+
export const category = (params) => {
|
|
140
|
+
const value = optString(params, "category");
|
|
141
|
+
if (value !== undefined &&
|
|
142
|
+
COST_CATEGORIES.includes(value))
|
|
143
|
+
return value;
|
|
144
|
+
return bad(`'category' must be one of ${COST_CATEGORIES.join(", ")}`);
|
|
145
|
+
};
|
|
146
|
+
/** The recurrence; anything outside the `pic_cost_recurrence` enum → 400. */
|
|
147
|
+
export const recurrence = (params) => {
|
|
148
|
+
const value = optString(params, "recurrence");
|
|
149
|
+
if (value !== undefined &&
|
|
150
|
+
COST_RECURRENCES.includes(value))
|
|
151
|
+
return value;
|
|
152
|
+
return bad(`'recurrence' must be one of ${COST_RECURRENCES.join(", ")}`);
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* A calendar day as `YYYY-MM-DD`, the shape the store binds straight to a
|
|
156
|
+
* `DATE` — never a JS `Date`, which would carry a time zone the column has no
|
|
157
|
+
* room for. The round-trip through `Date.UTC` is what rejects an impossible
|
|
158
|
+
* day like 2026-02-31, which the pattern alone accepts.
|
|
159
|
+
*/
|
|
160
|
+
export const isoDate = (params, key) => {
|
|
161
|
+
const value = optString(params, key);
|
|
162
|
+
if (value === undefined || !/^\d{4}-\d{2}-\d{2}$/.test(value))
|
|
163
|
+
return bad(`'${key}' must be a date as YYYY-MM-DD`);
|
|
164
|
+
const [year, month, day] = value.split("-").map(Number);
|
|
165
|
+
const parsed = new Date(Date.UTC(year, month - 1, day));
|
|
166
|
+
if (parsed.getUTCFullYear() !== year ||
|
|
167
|
+
parsed.getUTCMonth() !== month - 1 ||
|
|
168
|
+
parsed.getUTCDate() !== day)
|
|
169
|
+
return bad(`'${key}' is not a real date`);
|
|
170
|
+
return value;
|
|
171
|
+
};
|
|
172
|
+
/** The same, but absent or empty means "no end date" rather than a 400. */
|
|
173
|
+
export const optIsoDate = (params, key) => {
|
|
174
|
+
const value = params[key];
|
|
175
|
+
if (value === undefined || value === null || value === "")
|
|
176
|
+
return null;
|
|
177
|
+
return isoDate(params, key);
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* The entry's label. Non-blank mirrors the table's own CHECK, so an empty one
|
|
181
|
+
* fails as a readable 400 instead of a 500 from a constraint violation.
|
|
182
|
+
*/
|
|
183
|
+
export const description = (params) => {
|
|
184
|
+
const value = stringValue(params, "description");
|
|
185
|
+
if (value.trim() === "")
|
|
186
|
+
return bad("'description' must not be blank");
|
|
187
|
+
return value;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* The amount in EUR, as the NUMERIC(10,2) string the store binds. Any sign: a
|
|
191
|
+
* refund or a `funding` credit is negative. Bounded like the column, for the
|
|
192
|
+
* same reason {@link description} mirrors its CHECK: the cost field is a plain
|
|
193
|
+
* number input, so an extra digit is a plausible typo and a 400 says more than
|
|
194
|
+
* "internal error". Rounded first, since that is the value Postgres sees.
|
|
195
|
+
*/
|
|
196
|
+
export const cost = (params) => {
|
|
197
|
+
const rounded = numberValue(params, "cost").toFixed(2);
|
|
198
|
+
if (Math.abs(Number(rounded)) > COST_MAX)
|
|
199
|
+
return bad(`'cost' must be between -${COST_MAX} and ${COST_MAX}`);
|
|
200
|
+
return rounded;
|
|
201
|
+
};
|
|
129
202
|
//# sourceMappingURL=params.js.map
|
package/dist/params.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"params.js","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,mBAAmB,GACpB,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EAEZ,MAAM,WAAW,CAAC;AAGnB,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EAEZ,MAAM,WAAW,CAAC;AAGnB,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,YAAY,CAAC;AAqB1D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAoED,mFAAmF;AACnF,eAAO,MAAM,YAAY,GAAI,MAAM,aAAa,KAAG,MAmB/C,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { createServer as createHttpServer, } from "node:http";
|
|
2
2
|
import { isAuthorized } from "./auth.js";
|
|
3
3
|
import { HttpError } from "./errors.js";
|
|
4
|
-
import {
|
|
4
|
+
import { ADDITIONAL_COSTS_HTML } from "./ui/additional-costs.js";
|
|
5
|
+
import { COMMANDS_HTML } from "./ui/commands.js";
|
|
6
|
+
import { FAVOURITES_HTML } from "./ui/favourites.js";
|
|
5
7
|
/** Reject bodies larger than this (bytes) before buffering them. */
|
|
6
8
|
const MAX_BODY_BYTES = 1_000_000;
|
|
9
|
+
/**
|
|
10
|
+
* The web UI: a static, secret-free page per path. Served unauthenticated —
|
|
11
|
+
* behind Caddy the SSO portal gates the browser before it reaches here, and a
|
|
12
|
+
* page's own command calls carry the Caddy-injected bearer token; the pages
|
|
13
|
+
* hold nothing sensitive on their own.
|
|
14
|
+
*/
|
|
15
|
+
const PAGES = {
|
|
16
|
+
"/": COMMANDS_HTML,
|
|
17
|
+
"/index.html": COMMANDS_HTML,
|
|
18
|
+
"/favourites": FAVOURITES_HTML,
|
|
19
|
+
"/additional-costs": ADDITIONAL_COSTS_HTML,
|
|
20
|
+
};
|
|
7
21
|
const sendJson = (res, status, payload) => {
|
|
8
22
|
res.writeHead(status, { "content-type": "application/json" });
|
|
9
23
|
res.end(JSON.stringify(payload ?? null));
|
|
@@ -36,13 +50,10 @@ const handle = async (req, res, opts) => {
|
|
|
36
50
|
// unauthenticated liveness probe
|
|
37
51
|
if (req.method === "GET" && url.pathname === "/health")
|
|
38
52
|
return sendJson(res, 200, { status: "ok" });
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
// command calls carry the Caddy-injected bearer token; the page holds nothing
|
|
42
|
-
// sensitive on its own.
|
|
43
|
-
if (req.method === "GET" && (url.pathname === "/" || url.pathname === "/index.html")) {
|
|
53
|
+
const page = req.method === "GET" ? PAGES[url.pathname] : undefined;
|
|
54
|
+
if (page !== undefined) {
|
|
44
55
|
res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
|
|
45
|
-
res.end(
|
|
56
|
+
res.end(page);
|
|
46
57
|
return;
|
|
47
58
|
}
|
|
48
59
|
if (!isAuthorized(req.headers.authorization, opts.token))
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,IAAI,gBAAgB,GAIjC,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,IAAI,gBAAgB,GAIjC,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,oEAAoE;AACpE,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,KAAK,GAA2B;IACpC,GAAG,EAAE,aAAa;IAClB,aAAa,EAAE,aAAa;IAC5B,aAAa,EAAE,eAAe;IAC9B,mBAAmB,EAAE,qBAAqB;CAC3C,CAAC;AAOF,MAAM,QAAQ,GAAG,CACf,GAAmB,EACnB,MAAc,EACd,OAAgB,EACV,EAAE;IACR,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,mFAAmF;AACnF,MAAM,YAAY,GAAG,KAAK,EAAE,GAAoB,EAAmB,EAAE;IACnE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAA4B,EAAE,CAAC;QACvD,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;QACrB,IAAI,IAAI,GAAG,cAAc;YACvB,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACxE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,oCAAoC,CAAC,CAAC;IACjE,OAAO,MAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,KAAK,EAClB,GAAoB,EACpB,GAAmB,EACnB,IAAmB,EACJ,EAAE;IACjB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAExD,iCAAiC;IACjC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QACpD,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC;QACtD,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM;QAC/B,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAE7D,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,KAAK,KAAK;QACtB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAE9B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,mFAAmF;AACnF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAmB,EAAU,EAAE,CAC1D,gBAAgB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC5B,yEAAyE;IACzE,sEAAsE;IACtE,yEAAyE;IACzE,+BAA+B;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO;QAClC,OAAO,CAAC,GAAG,CACT,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC9C,IAAI,KAAK,YAAY,SAAS;YAC5B,OAAO,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The additional-costs page, served at `GET /additional-costs`.
|
|
3
|
+
*
|
|
4
|
+
* The costs TeslaMate never sees — service, repairs, tyres, insurance, tax,
|
|
5
|
+
* subsidies — added, edited inline and deleted straight from the table.
|
|
6
|
+
*
|
|
7
|
+
* Its endpoints are not command cards on `/` either: the generic grid's
|
|
8
|
+
* confirm-on-every-POST would fire on every inline save.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ADDITIONAL_COSTS_HTML: string;
|
|
11
|
+
//# sourceMappingURL=additional-costs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"additional-costs.d.ts","sourceRoot":"","sources":["../../src/ui/additional-costs.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,QAiRhC,CAAC"}
|