@mxpicture/tesla-superchargers-api 0.1.3 → 0.1.5

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.
Files changed (53) hide show
  1. package/dist/api/ChargersApi.d.ts +1 -1
  2. package/dist/api/ChargersApi.d.ts.map +1 -1
  3. package/dist/api/ChargersApi.js +6 -17
  4. package/dist/api/ChargersApi.js.map +1 -1
  5. package/dist/api/InvoicesApi.d.ts +27 -0
  6. package/dist/api/InvoicesApi.d.ts.map +1 -0
  7. package/dist/api/InvoicesApi.js +94 -0
  8. package/dist/api/InvoicesApi.js.map +1 -0
  9. package/dist/api/SlugsApi.d.ts +1 -1
  10. package/dist/api/SlugsApi.d.ts.map +1 -1
  11. package/dist/api/SlugsApi.js +4 -15
  12. package/dist/api/SlugsApi.js.map +1 -1
  13. package/dist/api/index.d.ts +1 -0
  14. package/dist/api/index.d.ts.map +1 -1
  15. package/dist/api/index.js +1 -0
  16. package/dist/api/index.js.map +1 -1
  17. package/dist/common/index.d.ts +1 -0
  18. package/dist/common/index.d.ts.map +1 -1
  19. package/dist/common/index.js +1 -0
  20. package/dist/common/index.js.map +1 -1
  21. package/dist/common/invoicesCsv.common.d.ts +87 -0
  22. package/dist/common/invoicesCsv.common.d.ts.map +1 -0
  23. package/dist/common/invoicesCsv.common.js +193 -0
  24. package/dist/common/invoicesCsv.common.js.map +1 -0
  25. package/dist/common/sync.common.d.ts +1 -48
  26. package/dist/common/sync.common.d.ts.map +1 -1
  27. package/dist/common/sync.common.js +1 -97
  28. package/dist/common/sync.common.js.map +1 -1
  29. package/dist/sync/ChargersSync.d.ts +13 -0
  30. package/dist/sync/ChargersSync.d.ts.map +1 -0
  31. package/dist/sync/ChargersSync.js +25 -0
  32. package/dist/sync/ChargersSync.js.map +1 -0
  33. package/dist/sync/ISyncHandler.d.ts +40 -0
  34. package/dist/sync/ISyncHandler.d.ts.map +1 -0
  35. package/dist/sync/ISyncHandler.js +67 -0
  36. package/dist/sync/ISyncHandler.js.map +1 -0
  37. package/dist/sync/ISyncPlanHandler.d.ts +25 -0
  38. package/dist/sync/ISyncPlanHandler.d.ts.map +1 -0
  39. package/dist/sync/ISyncPlanHandler.js +62 -0
  40. package/dist/sync/ISyncPlanHandler.js.map +1 -0
  41. package/dist/sync/InvoicesSync.d.ts +8 -0
  42. package/dist/sync/InvoicesSync.d.ts.map +1 -0
  43. package/dist/sync/InvoicesSync.js +21 -0
  44. package/dist/sync/InvoicesSync.js.map +1 -0
  45. package/dist/sync/SlugsSync.d.ts +9 -0
  46. package/dist/sync/SlugsSync.d.ts.map +1 -0
  47. package/dist/sync/SlugsSync.js +18 -0
  48. package/dist/sync/SlugsSync.js.map +1 -0
  49. package/dist/sync/index.d.ts +6 -0
  50. package/dist/sync/index.d.ts.map +1 -0
  51. package/dist/sync/index.js +7 -0
  52. package/dist/sync/index.js.map +1 -0
  53. package/package.json +11 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoicesCsv.common.js","sourceRoot":"","sources":["../../src/common/invoicesCsv.common.ts"],"names":[],"mappings":"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"}
@@ -1,51 +1,4 @@
1
- import type { KeyParams } from "@mxpicture/tesla-superchargers-generated/public";
2
- import type { Meta } from "@mxpicture/tesla-superchargers-mate/types";
3
- import type { SyncDbRow, SyncPlan, SyncSummary } from "../types/sync.types.js";
4
- import { type IMateStore } from "@mxpicture/tesla-superchargers-mate/store";
5
1
  /** Abort the sync when the feed shrinks below this share of the active rows. */
6
2
  export declare const CIRCUIT_BREAKER_MIN_RATIO = 0.5;
7
- /**
8
- * Pure planning step of a snapshot sync: match feed docs to db rows by the
9
- * semantic key (deduplicating the feed, first wins) and track which db ids
10
- * were seen so the caller can delete the absent rest.
11
- * Throws (before anything is written) when the feed looks truncated.
12
- */
13
- export declare const planSync: <CLIENT, DB extends SyncDbRow, INITIALZER>(p: {
14
- clientDocs: CLIENT[];
15
- dbDocs: DB[];
16
- toInitializer: (clientDoc: CLIENT) => INITIALZER;
17
- keyOfInit: (doc: INITIALZER) => string | null;
18
- keyOfDb: (doc: DB) => string | null;
19
- }) => SyncPlan<INITIALZER>;
20
- /**
21
- * Upsert column lists from the generated initializer keys: compared columns
22
- * are the feed content plus — on soft-delete tables — `deleted_at` (so
23
- * returning sites resurrect even when unchanged); updated columns add the
24
- * fetch meta. `failure_count`/`failure_notified_at` stay out of both — the
25
- * chargers pipeline owns them after the initial insert.
26
- */
27
- export declare const syncColumns: <T extends object>(initializerKeys: KeyParams<T>[]) => {
28
- updateColumns: string[];
29
- compareColumns: string[];
30
- };
31
- /**
32
- * Snapshot sync: plan in memory, then — in one advisory-locked transaction —
33
- * delete the rows absent from the feed (`deleteAbsent`: "soft" keeps them
34
- * with `deleted_at` set, "hard" removes them — the table mirrors the feed)
35
- * and upsert the rest (value-compared via IS DISTINCT FROM). The delete runs
36
- * first so rows the upsert is about to insert cannot be caught by the
37
- * absence check.
38
- */
39
- export declare const syncSnapshot: <CLIENT, DB extends SyncDbRow, INITIALZER extends object>(p: {
40
- store: IMateStore<string, DB, INITIALZER, any>;
41
- clientDocs: CLIENT[];
42
- meta: Meta;
43
- toInitializer: (clientDoc: CLIENT) => INITIALZER;
44
- keyOfInit: (doc: INITIALZER) => string | null;
45
- keyOfDb: (doc: DB) => string | null;
46
- deleteAbsent: "hard" | "soft";
47
- conflictColumn: string;
48
- updateColumns: string[];
49
- compareColumns: string[];
50
- }) => Promise<SyncSummary>;
3
+ export declare const SYNC_META_COLUMNS: string[];
51
4
  //# sourceMappingURL=sync.common.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.common.d.ts","sourceRoot":"","sources":["../../src/common/sync.common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iDAAiD,CAAC;AACjF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2CAA2C,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,2CAA2C,CAAC;AAEnD,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,EAAE,EAAE,SAAS,SAAS,EAAE,UAAU,EAAE,GAAG;IACpE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,EAAE,EAAE,CAAC;IACb,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,UAAU,CAAC;IACjD,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC;CACrC,KAAG,QAAQ,CAAC,UAAU,CA6CtB,CAAC;AAUF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAC1C,iBAAiB,SAAS,CAAC,CAAC,CAAC,EAAE,KAC9B;IAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAUrD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,EACN,EAAE,SAAS,SAAS,EACpB,UAAU,SAAS,MAAM,EACzB,GAAG;IAEH,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,UAAU,CAAC;IACjD,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC;IACpC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,KAAG,OAAO,CAAC,WAAW,CAiCnB,CAAC"}
1
+ {"version":3,"file":"sync.common.d.ts","sourceRoot":"","sources":["../../src/common/sync.common.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,eAAO,MAAM,iBAAiB,UAM7B,CAAC"}
@@ -1,106 +1,10 @@
1
- import { transaction, } from "@mxpicture/tesla-superchargers-mate/store";
2
1
  /** Abort the sync when the feed shrinks below this share of the active rows. */
3
2
  export const CIRCUIT_BREAKER_MIN_RATIO = 0.5;
4
- /**
5
- * Pure planning step of a snapshot sync: match feed docs to db rows by the
6
- * semantic key (deduplicating the feed, first wins) and track which db ids
7
- * were seen so the caller can delete the absent rest.
8
- * Throws (before anything is written) when the feed looks truncated.
9
- */
10
- export const planSync = (p) => {
11
- const activeCount = p.dbDocs.filter((doc) => doc.deleted_at == null).length;
12
- if (activeCount > 0 &&
13
- p.clientDocs.length < activeCount * CIRCUIT_BREAKER_MIN_RATIO)
14
- throw new Error(`sync aborted: feed has ${p.clientDocs.length} docs for ${activeCount} active rows` +
15
- ` (circuit breaker ratio ${CIRCUIT_BREAKER_MIN_RATIO}) — refusing to mass soft-delete`);
16
- const dbByKey = new Map();
17
- for (const dbDoc of p.dbDocs) {
18
- const key = p.keyOfDb(dbDoc);
19
- if (key !== null)
20
- dbByKey.set(key, dbDoc);
21
- }
22
- const plan = {
23
- upserts: [],
24
- seenIds: [],
25
- feedDuplicates: 0,
26
- feedNullKeys: 0,
27
- };
28
- const seenKeys = new Set();
29
- for (const clientDoc of p.clientDocs) {
30
- const newDoc = p.toInitializer(clientDoc);
31
- const key = p.keyOfInit(newDoc);
32
- if (key === null) {
33
- plan.feedNullKeys++;
34
- continue;
35
- }
36
- if (seenKeys.has(key)) {
37
- plan.feedDuplicates++;
38
- continue;
39
- }
40
- seenKeys.add(key);
41
- const dbDoc = dbByKey.get(key);
42
- if (dbDoc !== undefined)
43
- plan.seenIds.push(dbDoc.id);
44
- plan.upserts.push(newDoc);
45
- }
46
- return plan;
47
- };
48
- const SYNC_META_COLUMNS = [
3
+ export const SYNC_META_COLUMNS = [
49
4
  "fetched_at",
50
5
  "last_fetch_uuid",
51
6
  "failure_count",
52
7
  "failure_notified_at",
53
8
  "deleted_at",
54
9
  ];
55
- /**
56
- * Upsert column lists from the generated initializer keys: compared columns
57
- * are the feed content plus — on soft-delete tables — `deleted_at` (so
58
- * returning sites resurrect even when unchanged); updated columns add the
59
- * fetch meta. `failure_count`/`failure_notified_at` stay out of both — the
60
- * chargers pipeline owns them after the initial insert.
61
- */
62
- export const syncColumns = (initializerKeys) => {
63
- const names = initializerKeys.map((key) => key.name);
64
- const content = names.filter((name) => !SYNC_META_COLUMNS.includes(name));
65
- const compareColumns = names.includes("deleted_at")
66
- ? [...content, "deleted_at"]
67
- : content;
68
- return {
69
- compareColumns,
70
- updateColumns: [...compareColumns, "fetched_at", "last_fetch_uuid"],
71
- };
72
- };
73
- /**
74
- * Snapshot sync: plan in memory, then — in one advisory-locked transaction —
75
- * delete the rows absent from the feed (`deleteAbsent`: "soft" keeps them
76
- * with `deleted_at` set, "hard" removes them — the table mirrors the feed)
77
- * and upsert the rest (value-compared via IS DISTINCT FROM). The delete runs
78
- * first so rows the upsert is about to insert cannot be caught by the
79
- * absence check.
80
- */
81
- export const syncSnapshot = async (p) => await transaction(p.store.table, async (tx) => {
82
- const dbDocs = await p.store.query(undefined, tx);
83
- const plan = planSync({
84
- clientDocs: p.clientDocs,
85
- dbDocs,
86
- toInitializer: p.toInitializer,
87
- keyOfInit: p.keyOfInit,
88
- keyOfDb: p.keyOfDb,
89
- });
90
- const deleted = p.deleteAbsent === "hard"
91
- ? await p.store.deleteWhereIdNotIn(plan.seenIds, tx)
92
- : await p.store.softDeleteWhereIdNotIn(plan.seenIds, p.meta, tx);
93
- const upserted = await p.store.upsertMany(plan.upserts, {
94
- conflictColumn: p.conflictColumn,
95
- updateColumns: p.updateColumns,
96
- compareColumns: p.compareColumns,
97
- }, tx);
98
- return {
99
- feedCount: p.clientDocs.length,
100
- feedDuplicates: plan.feedDuplicates,
101
- feedNullKeys: plan.feedNullKeys,
102
- upserted,
103
- deleted,
104
- };
105
- });
106
10
  //# sourceMappingURL=sync.common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.common.js","sourceRoot":"","sources":["../../src/common/sync.common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.common.js","sourceRoot":"","sources":["../../src/common/sync.common.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAE7C,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,iBAAiB;IACjB,eAAe;IACf,qBAAqB;IACrB,YAAY;CACb,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type PicChargers, type PicChargersInitializer } from "@mxpicture/tesla-superchargers-generated/public";
2
+ import { ISyncHandler } from "./ISyncHandler.js";
3
+ import type { TeslaClientCharger } from "@mxpicture/tesla-superchargers-mate/client";
4
+ import type { Meta } from "@mxpicture/tesla-superchargers-mate/types";
5
+ export declare class ChargersSync extends ISyncHandler<TeslaClientCharger, PicChargers, PicChargersInitializer> {
6
+ constructor();
7
+ columns(): {
8
+ updateColumns: string[];
9
+ compareColumns: string[];
10
+ };
11
+ protected toInitializer(charger: TeslaClientCharger, meta: Meta): PicChargersInitializer;
12
+ }
13
+ //# sourceMappingURL=ChargersSync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChargersSync.d.ts","sourceRoot":"","sources":["../../src/sync/ChargersSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC5B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAErF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2CAA2C,CAAC;AAItE,qBAAa,YAAa,SAAQ,YAAY,CAC5C,kBAAkB,EAClB,WAAW,EACX,sBAAsB,CACvB;;IAUiB,OAAO,IAAI;QACzB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B;cAOkB,aAAa,CAC9B,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,IAAI,GACT,sBAAsB;CAG1B"}
@@ -0,0 +1,25 @@
1
+ import { picChargersInitializerKeys, } from "@mxpicture/tesla-superchargers-generated/public";
2
+ import { ISyncHandler } from "./ISyncHandler.js";
3
+ import { chargerToInitializer } from "@mxpicture/tesla-superchargers-mate/transform";
4
+ import { picChargersStore } from "@mxpicture/tesla-superchargers-mate/store";
5
+ import { withoutFkColumns } from "../common/chargers.common.js";
6
+ export class ChargersSync extends ISyncHandler {
7
+ constructor() {
8
+ super({
9
+ store: picChargersStore(),
10
+ conflictColumn: "location_guid",
11
+ deleteAbsent: "soft",
12
+ initializerKeys: picChargersInitializerKeys,
13
+ });
14
+ }
15
+ columns() {
16
+ const cols = super.columns();
17
+ cols.compareColumns = withoutFkColumns(cols.compareColumns);
18
+ cols.updateColumns = withoutFkColumns(cols.updateColumns);
19
+ return cols;
20
+ }
21
+ toInitializer(charger, meta) {
22
+ return chargerToInitializer({ charger, meta });
23
+ }
24
+ }
25
+ //# sourceMappingURL=ChargersSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChargersSync.js","sourceRoot":"","sources":["../../src/sync/ChargersSync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,GAG3B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,OAAO,YAAa,SAAQ,YAIjC;IACC;QACE,KAAK,CAAC;YACJ,KAAK,EAAE,gBAAgB,EAAE;YACzB,cAAc,EAAE,eAAe;YAC/B,YAAY,EAAE,MAAM;YACpB,eAAe,EAAE,0BAA0B;SAC5C,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QAIrB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAEkB,aAAa,CAC9B,OAA2B,EAC3B,IAAU;QAEV,OAAO,oBAAoB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ import { type IMateStore } from "@mxpicture/tesla-superchargers-mate/store";
2
+ import type { SyncDbRow, SyncSummary } from "../types/sync.types.js";
3
+ import type { Meta } from "@mxpicture/tesla-superchargers-mate/types";
4
+ import type { KeyParams } from "@mxpicture/tesla-superchargers-generated/public";
5
+ import { ISyncPlanHandler } from "./ISyncPlanHandler.js";
6
+ export interface SyncHandlerParams<DB extends SyncDbRow, INITIALZER extends object> {
7
+ store: IMateStore<string, DB, INITIALZER, any>;
8
+ initializerKeys: KeyParams<INITIALZER>[];
9
+ deleteAbsent: "hard" | "soft" | "never";
10
+ conflictColumn: keyof DB & keyof INITIALZER;
11
+ }
12
+ export declare abstract class ISyncHandler<DOC, DB extends SyncDbRow, INITIALZER extends object> extends ISyncPlanHandler<DOC, DB, INITIALZER> {
13
+ protected readonly params: SyncHandlerParams<DB, INITIALZER>;
14
+ constructor(p: SyncHandlerParams<DB, INITIALZER>);
15
+ /**
16
+ * Snapshot sync: plan in memory, then — in one advisory-locked transaction —
17
+ * delete the rows absent from the feed (`deleteAbsent`: "soft" keeps them
18
+ * with `deleted_at` set, "hard" removes them — the table mirrors the feed;
19
+ * "never" keeps absent rows untouched and also disables the truncation
20
+ * circuit breaker, since partial feeds are expected then) and upsert the
21
+ * rest (value-compared via IS DISTINCT FROM). The delete runs first so rows
22
+ * the upsert is about to insert cannot be caught by the absence check.
23
+ */
24
+ snapshot(p: {
25
+ docs: DOC[];
26
+ meta: Meta;
27
+ }): Promise<SyncSummary>;
28
+ /**
29
+ * Upsert column lists from the generated initializer keys: compared columns
30
+ * are the feed content plus — on soft-delete tables — `deleted_at` (so
31
+ * returning sites resurrect even when unchanged); updated columns add the
32
+ * fetch meta. `failure_count`/`failure_notified_at` stay out of both — the
33
+ * chargers pipeline owns them after the initial insert.
34
+ */
35
+ columns(): {
36
+ updateColumns: string[];
37
+ compareColumns: string[];
38
+ };
39
+ }
40
+ //# sourceMappingURL=ISyncHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISyncHandler.d.ts","sourceRoot":"","sources":["../../src/sync/ISyncHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2CAA2C,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iDAAiD,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,WAAW,iBAAiB,CAChC,EAAE,SAAS,SAAS,EACpB,UAAU,SAAS,MAAM;IAGzB,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/C,eAAe,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACxC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC;CAC7C;AAED,8BAAsB,YAAY,CAChC,GAAG,EACH,EAAE,SAAS,SAAS,EACpB,UAAU,SAAS,MAAM,CACzB,SAAQ,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,UAAU,CAAC;IAC7C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;gBAE1C,CAAC,EAAE,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC;IAKvD;;;;;;;;OAQG;IACU,QAAQ,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA2C3E;;;;;;OAMG;IACI,OAAO,IAAI;QAChB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B;CAWF"}
@@ -0,0 +1,67 @@
1
+ import { transaction, } from "@mxpicture/tesla-superchargers-mate/store";
2
+ import { ISyncPlanHandler } from "./ISyncPlanHandler.js";
3
+ import { SYNC_META_COLUMNS } from "../common/sync.common.js";
4
+ export class ISyncHandler extends ISyncPlanHandler {
5
+ params;
6
+ constructor(p) {
7
+ super(p.conflictColumn);
8
+ this.params = { ...p };
9
+ }
10
+ /**
11
+ * Snapshot sync: plan in memory, then — in one advisory-locked transaction —
12
+ * delete the rows absent from the feed (`deleteAbsent`: "soft" keeps them
13
+ * with `deleted_at` set, "hard" removes them — the table mirrors the feed;
14
+ * "never" keeps absent rows untouched and also disables the truncation
15
+ * circuit breaker, since partial feeds are expected then) and upsert the
16
+ * rest (value-compared via IS DISTINCT FROM). The delete runs first so rows
17
+ * the upsert is about to insert cannot be caught by the absence check.
18
+ */
19
+ async snapshot(p) {
20
+ return await transaction(this.params.store.table, async (tx) => {
21
+ const dbDocs = await this.params.store.query(undefined, tx);
22
+ const plan = this.plan({
23
+ docs: p.docs,
24
+ dbDocs,
25
+ meta: p.meta,
26
+ skipCircuitBreaker: this.params.deleteAbsent === "never",
27
+ });
28
+ const deleted = this.params.deleteAbsent === "never"
29
+ ? 0
30
+ : this.params.deleteAbsent === "hard"
31
+ ? await this.params.store.deleteWhereIdNotIn(plan.seenIds, tx)
32
+ : await this.params.store.softDeleteWhereIdNotIn(plan.seenIds, p.meta, tx);
33
+ const { compareColumns, updateColumns } = this.columns();
34
+ const upserted = await this.params.store.upsertMany(plan.upserts, {
35
+ conflictColumn: this.params.conflictColumn.toString(),
36
+ updateColumns: updateColumns,
37
+ compareColumns: compareColumns,
38
+ }, tx);
39
+ return {
40
+ feedCount: p.docs.length,
41
+ feedDuplicates: plan.feedDuplicates,
42
+ feedNullKeys: plan.feedNullKeys,
43
+ upserted,
44
+ deleted,
45
+ };
46
+ });
47
+ }
48
+ /**
49
+ * Upsert column lists from the generated initializer keys: compared columns
50
+ * are the feed content plus — on soft-delete tables — `deleted_at` (so
51
+ * returning sites resurrect even when unchanged); updated columns add the
52
+ * fetch meta. `failure_count`/`failure_notified_at` stay out of both — the
53
+ * chargers pipeline owns them after the initial insert.
54
+ */
55
+ columns() {
56
+ const names = this.params.initializerKeys.map((key) => key.name);
57
+ const content = names.filter((name) => !SYNC_META_COLUMNS.includes(name));
58
+ const compareColumns = names.includes("deleted_at")
59
+ ? [...content, "deleted_at"]
60
+ : content;
61
+ return {
62
+ compareColumns,
63
+ updateColumns: [...compareColumns, "fetched_at", "last_fetch_uuid"],
64
+ };
65
+ }
66
+ }
67
+ //# sourceMappingURL=ISyncHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISyncHandler.js","sourceRoot":"","sources":["../../src/sync/ISyncHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAEZ,MAAM,2CAA2C,CAAC;AAInD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAa7D,MAAM,OAAgB,YAIpB,SAAQ,gBAAqC;IAC1B,MAAM,CAAoC;IAE7D,YAAmB,CAAoC;QACrD,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACzB,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,QAAQ,CAAC,CAA8B;QAClD,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAE5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACrB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM;gBACN,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,OAAO;aACzD,CAAC,CAAC;YAEH,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,OAAO;gBAClC,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,MAAM;oBACnC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC9D,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAC5C,IAAI,CAAC,OAAO,EACZ,CAAC,CAAC,IAAI,EACN,EAAE,CACH,CAAC;YAEV,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CACjD,IAAI,CAAC,OAAO,EACZ;gBACE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE;gBACrD,aAAa,EAAE,aAAa;gBAC5B,cAAc,EAAE,cAAc;aAC/B,EACD,EAAE,CACH,CAAC;YAEF,OAAO;gBACL,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;gBACxB,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,QAAQ;gBACR,OAAO;aACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACI,OAAO;QAIZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1E,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;YACjD,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,YAAY,CAAC;YAC5B,CAAC,CAAC,OAAO,CAAC;QACZ,OAAO;YACL,cAAc;YACd,aAAa,EAAE,CAAC,GAAG,cAAc,EAAE,YAAY,EAAE,iBAAiB,CAAC;SACpE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { SyncDbRow, SyncPlan } from "../types/sync.types.js";
2
+ import type { Meta } from "@mxpicture/tesla-superchargers-mate/types";
3
+ export declare abstract class ISyncPlanHandler<DOC, DB extends SyncDbRow, INITIALZER extends object> {
4
+ readonly conflictColumn: keyof DB & keyof INITIALZER;
5
+ constructor(conflictColumn: keyof DB & keyof INITIALZER);
6
+ protected abstract toInitializer(doc: DOC, meta: Meta): INITIALZER;
7
+ protected keyOfInit(doc: INITIALZER): string | null;
8
+ protected keyOfDb(doc: DB): string | null;
9
+ /**
10
+ * Pure planning step of a snapshot sync: match feed docs to db rows by the
11
+ * semantic key (deduplicating the feed, first wins) and track which db ids
12
+ * were seen so the caller can delete the absent rest.
13
+ * Throws (before anything is written) when the feed looks truncated —
14
+ * unless `skipCircuitBreaker` is set: syncs that never delete absent rows
15
+ * (`deleteAbsent: "never"`) feed partial snapshots by design, so a small
16
+ * feed is expected there, not a truncation signal.
17
+ */
18
+ plan(p: {
19
+ docs: DOC[];
20
+ dbDocs: DB[];
21
+ meta: Meta;
22
+ skipCircuitBreaker?: boolean;
23
+ }): SyncPlan<INITIALZER>;
24
+ }
25
+ //# sourceMappingURL=ISyncPlanHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISyncPlanHandler.d.ts","sourceRoot":"","sources":["../../src/sync/ISyncPlanHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2CAA2C,CAAC;AAGtE,8BAAsB,gBAAgB,CACpC,GAAG,EACH,EAAE,SAAS,SAAS,EACpB,UAAU,SAAS,MAAM;aAGP,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU;gBAA3C,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU;IAG7D,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,UAAU;IAElE,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAGnD,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI;IAIzC;;;;;;;;OAQG;IACI,IAAI,CAAC,CAAC,EAAE;QACb,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,MAAM,EAAE,EAAE,EAAE,CAAC;QACb,IAAI,EAAE,IAAI,CAAC;QACX,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GAAG,QAAQ,CAAC,UAAU,CAAC;CA+CzB"}
@@ -0,0 +1,62 @@
1
+ import { CIRCUIT_BREAKER_MIN_RATIO } from "../common/sync.common.js";
2
+ export class ISyncPlanHandler {
3
+ conflictColumn;
4
+ constructor(conflictColumn) {
5
+ this.conflictColumn = conflictColumn;
6
+ }
7
+ keyOfInit(doc) {
8
+ return (doc[this.conflictColumn] ?? null);
9
+ }
10
+ keyOfDb(doc) {
11
+ return doc[this.conflictColumn];
12
+ }
13
+ /**
14
+ * Pure planning step of a snapshot sync: match feed docs to db rows by the
15
+ * semantic key (deduplicating the feed, first wins) and track which db ids
16
+ * were seen so the caller can delete the absent rest.
17
+ * Throws (before anything is written) when the feed looks truncated —
18
+ * unless `skipCircuitBreaker` is set: syncs that never delete absent rows
19
+ * (`deleteAbsent: "never"`) feed partial snapshots by design, so a small
20
+ * feed is expected there, not a truncation signal.
21
+ */
22
+ plan(p) {
23
+ const activeCount = p.dbDocs.filter((doc) => doc.deleted_at == null).length;
24
+ if (!p.skipCircuitBreaker &&
25
+ activeCount > 0 &&
26
+ p.docs.length < activeCount * CIRCUIT_BREAKER_MIN_RATIO)
27
+ throw new Error(`sync aborted: feed has ${p.docs.length} docs for ${activeCount} active rows` +
28
+ ` (circuit breaker ratio ${CIRCUIT_BREAKER_MIN_RATIO}) — refusing to mass soft-delete`);
29
+ const dbByKey = new Map();
30
+ for (const dbDoc of p.dbDocs) {
31
+ const key = this.keyOfDb(dbDoc);
32
+ if (key !== null)
33
+ dbByKey.set(key, dbDoc);
34
+ }
35
+ const plan = {
36
+ upserts: [],
37
+ seenIds: [],
38
+ feedDuplicates: 0,
39
+ feedNullKeys: 0,
40
+ };
41
+ const seenKeys = new Set();
42
+ for (const clientDoc of p.docs) {
43
+ const newDoc = this.toInitializer(clientDoc, p.meta);
44
+ const key = this.keyOfInit(newDoc);
45
+ if (key === null) {
46
+ plan.feedNullKeys++;
47
+ continue;
48
+ }
49
+ if (seenKeys.has(key)) {
50
+ plan.feedDuplicates++;
51
+ continue;
52
+ }
53
+ seenKeys.add(key);
54
+ const dbDoc = dbByKey.get(key);
55
+ if (dbDoc !== undefined)
56
+ plan.seenIds.push(dbDoc.id);
57
+ plan.upserts.push(newDoc);
58
+ }
59
+ return plan;
60
+ }
61
+ }
62
+ //# sourceMappingURL=ISyncPlanHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISyncPlanHandler.js","sourceRoot":"","sources":["../../src/sync/ISyncPlanHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,OAAgB,gBAAgB;IAMlB;IADlB,YACkB,cAA2C;QAA3C,mBAAc,GAAd,cAAc,CAA6B;IAC1D,CAAC;IAIM,SAAS,CAAC,GAAe;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAkB,CAAC;IAC7D,CAAC;IACS,OAAO,CAAC,GAAO;QACvB,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,CAAkB,CAAC;IACnD,CAAC;IAED;;;;;;;;OAQG;IACI,IAAI,CAAC,CAKX;QACC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;QAC5E,IACE,CAAC,CAAC,CAAC,kBAAkB;YACrB,WAAW,GAAG,CAAC;YACf,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,GAAG,yBAAyB;YAEvD,MAAM,IAAI,KAAK,CACb,0BAA0B,CAAC,CAAC,IAAI,CAAC,MAAM,aAAa,WAAW,cAAc;gBAC3E,2BAA2B,yBAAyB,kCAAkC,CACzF,CAAC;QAEJ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAc,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,IAAI,GAAyB;YACjC,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE;YACX,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,CAAC;SAChB,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QAEnC,KAAK,MAAM,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAEnC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAElB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { type PicInvoices, type PicInvoicesInitializer } from "@mxpicture/tesla-superchargers-generated/public";
2
+ import { ISyncHandler } from "./ISyncHandler.js";
3
+ import type { Invoice, Meta } from "@mxpicture/tesla-superchargers-mate/types";
4
+ export declare class InvoicesSync extends ISyncHandler<Invoice, PicInvoices, PicInvoicesInitializer> {
5
+ constructor();
6
+ protected toInitializer(invoice: Invoice, meta: Meta): PicInvoicesInitializer;
7
+ }
8
+ //# sourceMappingURL=InvoicesSync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvoicesSync.d.ts","sourceRoot":"","sources":["../../src/sync/InvoicesSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC5B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,2CAA2C,CAAC;AAG/E,qBAAa,YAAa,SAAQ,YAAY,CAC5C,OAAO,EACP,WAAW,EACX,sBAAsB,CACvB;;cAUoB,aAAa,CAC9B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,GACT,sBAAsB;CAM1B"}
@@ -0,0 +1,21 @@
1
+ import { picInvoicesInitializerKeys, } from "@mxpicture/tesla-superchargers-generated/public";
2
+ import { ISyncHandler } from "./ISyncHandler.js";
3
+ import { invoiceToInitializer } from "@mxpicture/tesla-superchargers-mate/transform";
4
+ import { picInvoicesStore } from "@mxpicture/tesla-superchargers-mate/store";
5
+ export class InvoicesSync extends ISyncHandler {
6
+ constructor() {
7
+ super({
8
+ store: picInvoicesStore(),
9
+ conflictColumn: "invoice_number",
10
+ deleteAbsent: "never",
11
+ initializerKeys: picInvoicesInitializerKeys,
12
+ });
13
+ }
14
+ toInitializer(invoice, meta) {
15
+ return invoiceToInitializer({
16
+ invoice,
17
+ meta,
18
+ });
19
+ }
20
+ }
21
+ //# sourceMappingURL=InvoicesSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvoicesSync.js","sourceRoot":"","sources":["../../src/sync/InvoicesSync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,GAG3B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAErF,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAE7E,MAAM,OAAO,YAAa,SAAQ,YAIjC;IACC;QACE,KAAK,CAAC;YACJ,KAAK,EAAE,gBAAgB,EAAE;YACzB,cAAc,EAAE,gBAAgB;YAChC,YAAY,EAAE,OAAO;YACrB,eAAe,EAAE,0BAA0B;SAC5C,CAAC,CAAC;IACL,CAAC;IAEkB,aAAa,CAC9B,OAAgB,EAChB,IAAU;QAEV,OAAO,oBAAoB,CAAC;YAC1B,OAAO;YACP,IAAI;SACL,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { type PicSlugs, type PicSlugsInitializer } from "@mxpicture/tesla-superchargers-generated/public";
2
+ import { ISyncHandler } from "./ISyncHandler.js";
3
+ import type { TeslaClientSlug } from "@mxpicture/tesla-superchargers-mate/client";
4
+ import type { Meta } from "@mxpicture/tesla-superchargers-mate/types";
5
+ export declare class SlugsSync extends ISyncHandler<TeslaClientSlug, PicSlugs, PicSlugsInitializer> {
6
+ constructor();
7
+ protected toInitializer(slug: TeslaClientSlug, meta: Meta): PicSlugsInitializer;
8
+ }
9
+ //# sourceMappingURL=SlugsSync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlugsSync.d.ts","sourceRoot":"","sources":["../../src/sync/SlugsSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACzB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAElF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2CAA2C,CAAC;AAGtE,qBAAa,SAAU,SAAQ,YAAY,CACzC,eAAe,EACf,QAAQ,EACR,mBAAmB,CACpB;;cAUoB,aAAa,CAC9B,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,IAAI,GACT,mBAAmB;CAGvB"}
@@ -0,0 +1,18 @@
1
+ import { picSlugsInitializerKeys, } from "@mxpicture/tesla-superchargers-generated/public";
2
+ import { ISyncHandler } from "./ISyncHandler.js";
3
+ import { slugToInitializer } from "@mxpicture/tesla-superchargers-mate/transform";
4
+ import { picSlugsStore } from "@mxpicture/tesla-superchargers-mate/store";
5
+ export class SlugsSync extends ISyncHandler {
6
+ constructor() {
7
+ super({
8
+ store: picSlugsStore(),
9
+ conflictColumn: "tesla_uuid",
10
+ deleteAbsent: "hard",
11
+ initializerKeys: picSlugsInitializerKeys,
12
+ });
13
+ }
14
+ toInitializer(slug, meta) {
15
+ return slugToInitializer({ slug, meta });
16
+ }
17
+ }
18
+ //# sourceMappingURL=SlugsSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlugsSync.js","sourceRoot":"","sources":["../../src/sync/SlugsSync.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAGxB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE1E,MAAM,OAAO,SAAU,SAAQ,YAI9B;IACC;QACE,KAAK,CAAC;YACJ,KAAK,EAAE,aAAa,EAAE;YACtB,cAAc,EAAE,YAAY;YAC5B,YAAY,EAAE,MAAM;YACpB,eAAe,EAAE,uBAAuB;SACzC,CAAC,CAAC;IACL,CAAC;IAEkB,aAAa,CAC9B,IAAqB,EACrB,IAAU;QAEV,OAAO,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export * from "./ChargersSync.js";
2
+ export * from "./ISyncHandler.js";
3
+ export * from "./ISyncPlanHandler.js";
4
+ export * from "./InvoicesSync.js";
5
+ export * from "./SlugsSync.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // This file is auto-generated by build-cli. Do not edit manually.
2
+ export * from "./ChargersSync.js";
3
+ export * from "./ISyncHandler.js";
4
+ export * from "./ISyncPlanHandler.js";
5
+ export * from "./InvoicesSync.js";
6
+ export * from "./SlugsSync.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxpicture/tesla-superchargers-api",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Fetch + store Tesla Supercharger locations and pricing",
5
5
  "type": "module",
6
6
  "author": "MXPicture",
@@ -19,6 +19,10 @@
19
19
  "types": "./src/common/index.ts",
20
20
  "default": "./dist/common/index.js"
21
21
  },
22
+ "./sync": {
23
+ "types": "./src/sync/index.ts",
24
+ "default": "./dist/sync/index.js"
25
+ },
22
26
  "./types": {
23
27
  "types": "./src/types/index.ts",
24
28
  "default": "./dist/types/index.js"
@@ -40,9 +44,12 @@
40
44
  "access": "public"
41
45
  },
42
46
  "dependencies": {
43
- "@mxpicture/tesla-superchargers-generated": "^0.1.3",
44
- "@mxpicture/tesla-superchargers-mate": "^0.1.3",
45
- "json5": "^2.2.3"
47
+ "@mxpicture/tesla-superchargers-generated": "^0.1.5",
48
+ "@mxpicture/tesla-superchargers-mate": "^0.1.5",
49
+ "@mxpicture/tesla-superchargers-cloud-store": "^0.1.5",
50
+ "csv-parse": "^7.0.1",
51
+ "json5": "^2.2.3",
52
+ "zod": "^4.4.3"
46
53
  },
47
54
  "devDependencies": {
48
55
  "@types/node": "^25.2.3",