@mxpicture/tesla-superchargers-api 0.1.32 → 0.1.34

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 +1 @@
1
- {"version":3,"file":"ChargingProcessesApi.d.ts","sourceRoot":"","sources":["../../src/api/ChargingProcessesApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAEzF,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,qBAAa,oBAAqB,SAAQ,IAAI;IAC/B,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAmDrC,kBAAkB,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAIxD,WAAW,CACtB,SAAS,EAAE,mBAAmB,EAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,OAAO,CAAC,iBAAiB,CAAC;CAG9B;AAGD,eAAO,MAAM,oBAAoB,4BAA8C,CAAC"}
1
+ {"version":3,"file":"ChargingProcessesApi.d.ts","sourceRoot":"","sources":["../../src/api/ChargingProcessesApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAEzF,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,qBAAa,oBAAqB,SAAQ,IAAI;IAC/B,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAkErC,kBAAkB,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAIxD,WAAW,CACtB,SAAS,EAAE,mBAAmB,EAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,OAAO,CAAC,iBAAiB,CAAC;CAG9B;AAGD,eAAO,MAAM,oBAAoB,4BAA8C,CAAC"}
@@ -5,6 +5,7 @@ import { IApi } from "./IApi.js";
5
5
  import { chargingRate } from "../common/pricebooks.common.js";
6
6
  import { FAILURE_DEPRIORITIZE_THRESHOLD, PRICING_FETCH_CONCURRENCY, } from "../common/chargers.common.js";
7
7
  import { mapWithConcurrency } from "../common/concurrency.common.js";
8
+ import { BASE_CURRENCY, fxToEur } from "../common/fx.common.js";
8
9
  export class ChargingProcessesApi extends IApi {
9
10
  async runPricing() {
10
11
  const store = chargingProcessesStore();
@@ -31,7 +32,20 @@ export class ChargingProcessesApi extends IApi {
31
32
  item.failure_count = await store.incrementFailed(item.charge.id);
32
33
  return item;
33
34
  }
34
- const cost = Number((rate.rate * Number(energy)).toFixed(2));
35
+ // cost is written into TeslaMate's single-currency cost column, so a
36
+ // foreign-currency rate is converted to EUR at the charge's own date;
37
+ // an unresolvable rate leaves the charge unpriced rather than storing
38
+ // a wrong-currency number.
39
+ const local = rate.rate * Number(energy);
40
+ const fx = rate.currencyCode.toUpperCase() === BASE_CURRENCY
41
+ ? 1
42
+ : await fxToEur(rate.currencyCode, charge.start_date);
43
+ if (fx === null) {
44
+ item.topic = "noFxRate";
45
+ item.failure_count = await store.incrementFailed(item.charge.id);
46
+ return item;
47
+ }
48
+ const cost = Number((local * fx).toFixed(2));
35
49
  item.cost = cost;
36
50
  await chargingProcessesApi().updatePrice(charge.id, cost);
37
51
  item.topic = "chargeUpdated";
@@ -1 +1 @@
1
- {"version":3,"file":"ChargingProcessesApi.js","sourceRoot":"","sources":["../../src/api/ChargingProcessesApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChargingProcessesApi.js","sourceRoot":"","sources":["../../src/api/ChargingProcessesApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { IApi } from "./IApi.js";
2
+ import type { FxSyncSummary } from "../types/fx.types.js";
3
+ export declare class FxRatesApi extends IApi {
4
+ /**
5
+ * Fill the window's missing (date, currency) rates and prune everything
6
+ * outside it. A date the feed has not published yet is reported in
7
+ * `missingDates` and retried by the next run, never a failure.
8
+ */
9
+ sync(): Promise<FxSyncSummary>;
10
+ }
11
+ export declare const fxRatesApi: () => FxRatesApi;
12
+ //# sourceMappingURL=FxRatesApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FxRatesApi.d.ts","sourceRoot":"","sources":["../../src/api/FxRatesApi.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAY1D,qBAAa,UAAW,SAAQ,IAAI;IAClC;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;CA2D5C;AAGD,eAAO,MAAM,UAAU,kBAAoC,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Daily FX rate sync: the primary filler of `pic_fx_rates`. One request per
3
+ * UTC date against the base-EUR feed covers every currency the price history
4
+ * uses, so a window of `FX_SYNC_DAYS` days costs at most that many requests —
5
+ * and none at all once the window is fully cached. `fxToEur` keeps its lazy
6
+ * per-charge fetch as the fallback for what the window does not cover.
7
+ */
8
+ import { picFxRatesStore, picPricebooksStore, } from "@mxpicture/tesla-superchargers-mate/store";
9
+ import { IApi } from "./IApi.js";
10
+ import { BASE_CURRENCY, FX_SYNC_DAYS, fetchEurRates, rateToEur, } from "../common/fx.common.js";
11
+ const DAY_MS = 24 * 60 * 60 * 1000;
12
+ /** The last `days` UTC calendar days as `YYYY-MM-DD`, oldest first, today last. */
13
+ const utcDates = (days) => {
14
+ const today = Date.now();
15
+ return Array.from({ length: days }, (_, i) => new Date(today - (days - 1 - i) * DAY_MS).toISOString().slice(0, 10));
16
+ };
17
+ export class FxRatesApi extends IApi {
18
+ /**
19
+ * Fill the window's missing (date, currency) rates and prune everything
20
+ * outside it. A date the feed has not published yet is reported in
21
+ * `missingDates` and retried by the next run, never a failure.
22
+ */
23
+ async sync() {
24
+ const currencies = (await picPricebooksStore().getDistinctCurrencies()).filter((c) => c !== BASE_CURRENCY);
25
+ const dates = utcDates(FX_SYNC_DAYS);
26
+ const fromDate = dates[0];
27
+ const fetchedDates = [];
28
+ const missingDates = [];
29
+ const unknownCurrencies = new Set();
30
+ const rows = [];
31
+ if (currencies.length) {
32
+ const coverage = new Set((await picFxRatesStore().getCoverage(fromDate)).map((row) => `${row.rate_date.toISOString().slice(0, 10)} ${row.quote_currency.toUpperCase()}`));
33
+ for (const rateDate of dates) {
34
+ const missing = currencies.filter((c) => !coverage.has(`${rateDate} ${c}`));
35
+ if (!missing.length)
36
+ continue;
37
+ const rates = await fetchEurRates(rateDate);
38
+ if (!rates) {
39
+ missingDates.push(rateDate);
40
+ continue;
41
+ }
42
+ fetchedDates.push(rateDate);
43
+ for (const quoteCurrency of missing) {
44
+ const rate = rateToEur(rates[quoteCurrency.toLowerCase()]);
45
+ if (rate === null) {
46
+ unknownCurrencies.add(quoteCurrency);
47
+ continue;
48
+ }
49
+ rows.push({ rateDate, quoteCurrency, rateToEur: String(rate) });
50
+ }
51
+ }
52
+ }
53
+ return {
54
+ days: FX_SYNC_DAYS,
55
+ fromDate,
56
+ currencies,
57
+ fetchedDates,
58
+ missingDates,
59
+ unknownCurrencies: [...unknownCurrencies],
60
+ inserted: await picFxRatesStore().putRates(rows),
61
+ deleted: await picFxRatesStore().deleteStale(fromDate, currencies),
62
+ };
63
+ }
64
+ }
65
+ let _api = null;
66
+ export const fxRatesApi = () => (_api ??= new FxRatesApi());
67
+ //# sourceMappingURL=FxRatesApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FxRatesApi.js","sourceRoot":"","sources":["../../src/api/FxRatesApi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,eAAe,EACf,kBAAkB,GACnB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,wBAAwB,CAAC;AAGhC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,mFAAmF;AACnF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAY,EAAE;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3C,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CACrE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,OAAO,UAAW,SAAQ,IAAI;IAClC;;;;OAIG;IACI,KAAK,CAAC,IAAI;QACf,MAAM,UAAU,GAAG,CACjB,MAAM,kBAAkB,EAAE,CAAC,qBAAqB,EAAE,CACnD,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE1B,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC5C,MAAM,IAAI,GAIJ,EAAE,CAAC;QAET,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,CAAC,MAAM,eAAe,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CACjD,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CACpF,CACF,CAAC;YAEF,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAC,CACzC,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,MAAM;oBAAE,SAAS;gBAE9B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC5B,SAAS;gBACX,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE5B,KAAK,MAAM,aAAa,IAAI,OAAO,EAAE,CAAC;oBACpC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;oBAC3D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAClB,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBACrC,SAAS;oBACX,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ;YACR,UAAU;YACV,YAAY;YACZ,YAAY;YACZ,iBAAiB,EAAE,CAAC,GAAG,iBAAiB,CAAC;YACzC,QAAQ,EAAE,MAAM,eAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChD,OAAO,EAAE,MAAM,eAAe,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC;SACnE,CAAC;IACJ,CAAC;CACF;AAED,IAAI,IAAI,GAAsB,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from "./ChargersApi.js";
2
2
  export * from "./ChargingProcessesApi.js";
3
3
  export * from "./FailuresApi.js";
4
+ export * from "./FxRatesApi.js";
4
5
  export * from "./IApi.js";
5
6
  export * from "./InvoicesApi.js";
6
7
  export * from "./SlugsApi.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
package/dist/api/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  export * from "./ChargersApi.js";
3
3
  export * from "./ChargingProcessesApi.js";
4
4
  export * from "./FailuresApi.js";
5
+ export * from "./FxRatesApi.js";
5
6
  export * from "./IApi.js";
6
7
  export * from "./InvoicesApi.js";
7
8
  export * from "./SlugsApi.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** The currency TeslaMate's `cost` column is aggregated in. */
2
+ export declare const BASE_CURRENCY = "EUR";
3
+ /** How many UTC days back the daily sync covers, today included. */
4
+ export declare const FX_SYNC_DAYS = 7;
5
+ /**
6
+ * All quote-per-EUR rates for a date, primary host then mirror; null when the
7
+ * date is not published yet or both hosts fail. One request serves every
8
+ * currency of that day.
9
+ */
10
+ export declare const fetchEurRates: (rateDate: string) => Promise<Record<string, number> | null>;
11
+ /** Invert a quote-per-EUR rate into EUR per 1 unit; null when unusable. */
12
+ export declare const rateToEur: (quotePerEur: number | undefined) => number | null;
13
+ /**
14
+ * EUR per 1 unit of `currencyCode` on the day of `at` (UTC), or null when the
15
+ * rate can't be resolved. EUR returns 1 without any store or network access.
16
+ * A cache hit is returned directly; a miss fetches once (single-flighted) and
17
+ * caches the result before returning it.
18
+ */
19
+ export declare const fxToEur: (currencyCode: string, at: Date) => Promise<number | null>;
20
+ //# sourceMappingURL=fx.common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx.common.d.ts","sourceRoot":"","sources":["../../src/common/fx.common.ts"],"names":[],"mappings":"AAYA,+DAA+D;AAC/D,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC,oEAAoE;AACpE,eAAO,MAAM,YAAY,IAAI,CAAC;AAgB9B;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,UAAU,MAAM,KACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAevC,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,SAAS,GAAI,aAAa,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,IAK3D,CAAC;AAKX;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAClB,cAAc,MAAM,EACpB,IAAI,IAAI,KACP,OAAO,CAAC,MAAM,GAAG,IAAI,CAgBvB,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * FX conversion to the base currency for the charge-cost boundary. A charge's
3
+ * cost is written into TeslaMate's single-currency `charging_processes.cost`,
4
+ * so a foreign-currency rate must be converted to EUR first. Rates are looked
5
+ * up per the charge's own (UTC) date and cached write-once in `pic_fx_rates`;
6
+ * a EUR charge short-circuits before any store or network access. A rate that
7
+ * cannot be resolved returns null so the caller can leave the charge unpriced
8
+ * rather than store a wrong-currency cost.
9
+ */
10
+ import { picFxRatesStore } from "@mxpicture/tesla-superchargers-mate/store";
11
+ import { singleFlight } from "./concurrency.common.js";
12
+ /** The currency TeslaMate's `cost` column is aggregated in. */
13
+ export const BASE_CURRENCY = "EUR";
14
+ /** How many UTC days back the daily sync covers, today included. */
15
+ export const FX_SYNC_DAYS = 7;
16
+ /** Abort a stalled FX request rather than block a pricing pass on it. */
17
+ const FX_HTTP_TIMEOUT_MS = 10_000;
18
+ /**
19
+ * Historical daily rates from the keyless fawazahmed0/exchange-api. Primary is
20
+ * the jsDelivr CDN, with the pages.dev mirror as fallback. The base-EUR file's
21
+ * response is `{ "date": ..., "eur": { "czk": <number>, ... } }`, so `eur` maps
22
+ * every quote currency to the units of it worth 1 EUR.
23
+ */
24
+ const fxUrls = (rateDate, quoteLower) => [
25
+ `https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@${rateDate}/v1/currencies/${quoteLower}.json`,
26
+ `https://${rateDate}.currency-api.pages.dev/v1/currencies/${quoteLower}.json`,
27
+ ];
28
+ /**
29
+ * All quote-per-EUR rates for a date, primary host then mirror; null when the
30
+ * date is not published yet or both hosts fail. One request serves every
31
+ * currency of that day.
32
+ */
33
+ export const fetchEurRates = async (rateDate) => {
34
+ for (const url of fxUrls(rateDate, "eur")) {
35
+ try {
36
+ const res = await fetch(url, {
37
+ signal: AbortSignal.timeout(FX_HTTP_TIMEOUT_MS),
38
+ });
39
+ if (!res.ok)
40
+ continue;
41
+ const rates = (await res.json())?.eur;
42
+ if (rates && typeof rates === "object")
43
+ return rates;
44
+ }
45
+ catch {
46
+ // network error / timeout / bad JSON — try the next host
47
+ }
48
+ }
49
+ return null;
50
+ };
51
+ /** Invert a quote-per-EUR rate into EUR per 1 unit; null when unusable. */
52
+ export const rateToEur = (quotePerEur) => quotePerEur !== undefined &&
53
+ Number.isFinite(quotePerEur) &&
54
+ quotePerEur > 0
55
+ ? 1 / quotePerEur
56
+ : null;
57
+ /** Coalesce concurrent lookups sharing a (date, currency) into one fetch. */
58
+ const fxInFlight = singleFlight();
59
+ /**
60
+ * EUR per 1 unit of `currencyCode` on the day of `at` (UTC), or null when the
61
+ * rate can't be resolved. EUR returns 1 without any store or network access.
62
+ * A cache hit is returned directly; a miss fetches once (single-flighted) and
63
+ * caches the result before returning it.
64
+ */
65
+ export const fxToEur = async (currencyCode, at) => {
66
+ if (currencyCode.toUpperCase() === BASE_CURRENCY)
67
+ return 1;
68
+ const rateDate = at.toISOString().slice(0, 10);
69
+ const quote = currencyCode.toUpperCase();
70
+ const cached = await picFxRatesStore().getRate(rateDate, quote);
71
+ if (cached !== null)
72
+ return Number(cached);
73
+ return await fxInFlight(`${rateDate} ${quote}`, async () => {
74
+ const rates = await fetchEurRates(rateDate);
75
+ const rate = rates ? rateToEur(rates[quote.toLowerCase()]) : null;
76
+ if (rate === null)
77
+ return null;
78
+ await picFxRatesStore().putRate(rateDate, quote, String(rate));
79
+ return rate;
80
+ });
81
+ };
82
+ //# sourceMappingURL=fx.common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx.common.js","sourceRoot":"","sources":["../../src/common/fx.common.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export * from "./chargers.common.js";
2
2
  export * from "./concurrency.common.js";
3
3
  export * from "./failures.common.js";
4
+ export * from "./fx.common.js";
4
5
  export * from "./invoices.common.js";
5
6
  export * from "./invoicesCsv.common.js";
6
7
  export * from "./pricebooks.common.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AACA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AACA,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
@@ -2,6 +2,7 @@
2
2
  export * from "./chargers.common.js";
3
3
  export * from "./concurrency.common.js";
4
4
  export * from "./failures.common.js";
5
+ export * from "./fx.common.js";
5
6
  export * from "./invoices.common.js";
6
7
  export * from "./invoicesCsv.common.js";
7
8
  export * from "./pricebooks.common.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
@@ -2,7 +2,7 @@ import type { UnpricedChargingProcess } from "@mxpicture/tesla-superchargers-mat
2
2
  import type { ChargingRate } from "./pricebooks.types.js";
3
3
  export interface PricingSummaryItem {
4
4
  charge: UnpricedChargingProcess;
5
- topic: "chargeUpdated" | "noRate" | "noEnergyValue" | "failureLimitReached" | "unknown";
5
+ topic: "chargeUpdated" | "noRate" | "noEnergyValue" | "noFxRate" | "failureLimitReached" | "unknown";
6
6
  energy?: string | null;
7
7
  rate?: ChargingRate | null;
8
8
  cost?: number | null;
@@ -1 +1 @@
1
- {"version":3,"file":"charging.types.d.ts","sourceRoot":"","sources":["../../src/types/charging.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EACD,eAAe,GACf,QAAQ,GACR,eAAe,GACf,qBAAqB,GACrB,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B"}
1
+ {"version":3,"file":"charging.types.d.ts","sourceRoot":"","sources":["../../src/types/charging.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EACD,eAAe,GACf,QAAQ,GACR,eAAe,GACf,UAAU,GACV,qBAAqB,GACrB,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B"}
@@ -0,0 +1,17 @@
1
+ export interface FxSyncSummary {
2
+ /** length of the synced window in UTC days, today included */
3
+ days: number;
4
+ /** oldest date in the window; also the prune cut-off */
5
+ fromDate: string;
6
+ /** synced quote currencies (EUR excluded) */
7
+ currencies: string[];
8
+ /** dates an HTTP request was made for and parsed */
9
+ fetchedDates: string[];
10
+ /** dates not published yet / both hosts failed */
11
+ missingDates: string[];
12
+ /** requested but absent from the feed (deduped) */
13
+ unknownCurrencies: string[];
14
+ inserted: number;
15
+ deleted: number;
16
+ }
17
+ //# sourceMappingURL=fx.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx.types.d.ts","sourceRoot":"","sources":["../../src/types/fx.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oDAAoD;IACpD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kDAAkD;IAClD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fx.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fx.types.js","sourceRoot":"","sources":["../../src/types/fx.types.ts"],"names":[],"mappings":""}
@@ -1,6 +1,7 @@
1
1
  export * from "./chargers.types.js";
2
2
  export * from "./charging.types.js";
3
3
  export * from "./failures.types.js";
4
+ export * from "./fx.types.js";
4
5
  export * from "./invoices.types.js";
5
6
  export * from "./pricebooks.types.js";
6
7
  export * from "./pushover.types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC"}
@@ -2,6 +2,7 @@
2
2
  export * from "./chargers.types.js";
3
3
  export * from "./charging.types.js";
4
4
  export * from "./failures.types.js";
5
+ export * from "./fx.types.js";
5
6
  export * from "./invoices.types.js";
6
7
  export * from "./pricebooks.types.js";
7
8
  export * from "./pushover.types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxpicture/tesla-superchargers-api",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "description": "Fetch + store Tesla Supercharger locations and pricing",
5
5
  "type": "module",
6
6
  "author": "MXPicture",
@@ -44,9 +44,9 @@
44
44
  "access": "public"
45
45
  },
46
46
  "dependencies": {
47
- "@mxpicture/tesla-superchargers-generated": "^0.1.32",
48
- "@mxpicture/tesla-superchargers-mate": "^0.1.32",
49
- "@mxpicture/tesla-superchargers-cloud-store": "^0.1.32",
47
+ "@mxpicture/tesla-superchargers-generated": "^0.1.34",
48
+ "@mxpicture/tesla-superchargers-mate": "^0.1.34",
49
+ "@mxpicture/tesla-superchargers-cloud-store": "^0.1.34",
50
50
  "csv-parse": "^7.0.1",
51
51
  "json5": "^2.2.3",
52
52
  "zod": "^4.4.3"