@leadcms/sdk 3.5.3 → 3.5.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.
- package/dist/cli/bin/pull-segments.d.ts +6 -0
- package/dist/cli/bin/pull-segments.d.ts.map +1 -0
- package/dist/cli/bin/pull-segments.js +25 -0
- package/dist/cli/bin/pull-segments.js.map +1 -0
- package/dist/cli/bin/pull-sequences.d.ts +6 -0
- package/dist/cli/bin/pull-sequences.d.ts.map +1 -0
- package/dist/cli/bin/pull-sequences.js +25 -0
- package/dist/cli/bin/pull-sequences.js.map +1 -0
- package/dist/cli/bin/push-all.js +21 -1
- package/dist/cli/bin/push-all.js.map +1 -1
- package/dist/cli/bin/push-segments.d.ts +6 -0
- package/dist/cli/bin/push-segments.d.ts.map +1 -0
- package/dist/cli/bin/push-segments.js +30 -0
- package/dist/cli/bin/push-segments.js.map +1 -0
- package/dist/cli/bin/push-sequences.d.ts +6 -0
- package/dist/cli/bin/push-sequences.d.ts.map +1 -0
- package/dist/cli/bin/push-sequences.js +30 -0
- package/dist/cli/bin/push-sequences.js.map +1 -0
- package/dist/cli/bin/status-all.js +131 -3
- package/dist/cli/bin/status-all.js.map +1 -1
- package/dist/cli/bin/status-segments.d.ts +6 -0
- package/dist/cli/bin/status-segments.d.ts.map +1 -0
- package/dist/cli/bin/status-segments.js +24 -0
- package/dist/cli/bin/status-segments.js.map +1 -0
- package/dist/cli/bin/status-sequences.d.ts +6 -0
- package/dist/cli/bin/status-sequences.d.ts.map +1 -0
- package/dist/cli/bin/status-sequences.js +24 -0
- package/dist/cli/bin/status-sequences.js.map +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/automation-types.d.ts +232 -0
- package/dist/lib/automation-types.d.ts.map +1 -0
- package/dist/lib/automation-types.js +107 -0
- package/dist/lib/automation-types.js.map +1 -0
- package/dist/lib/cms-config-types.d.ts +8 -0
- package/dist/lib/cms-config-types.d.ts.map +1 -1
- package/dist/lib/cms-config-types.js +12 -0
- package/dist/lib/cms-config-types.js.map +1 -1
- package/dist/lib/cms.d.ts.map +1 -1
- package/dist/lib/cms.js +2 -0
- package/dist/lib/cms.js.map +1 -1
- package/dist/lib/config.d.ts +4 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +10 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/content-transformation.d.ts +1 -0
- package/dist/lib/content-transformation.d.ts.map +1 -1
- package/dist/lib/content-transformation.js +2 -1
- package/dist/lib/content-transformation.js.map +1 -1
- package/dist/lib/data-service.d.ts +38 -1
- package/dist/lib/data-service.d.ts.map +1 -1
- package/dist/lib/data-service.js +310 -0
- package/dist/lib/data-service.js.map +1 -1
- package/dist/lib/email-template-transformation.d.ts.map +1 -1
- package/dist/lib/email-template-transformation.js +1 -0
- package/dist/lib/email-template-transformation.js.map +1 -1
- package/dist/lib/remote-context.d.ts +19 -1
- package/dist/lib/remote-context.d.ts.map +1 -1
- package/dist/lib/remote-context.js +99 -1
- package/dist/lib/remote-context.js.map +1 -1
- package/dist/lib/settings-types.d.ts +53 -1
- package/dist/lib/settings-types.d.ts.map +1 -1
- package/dist/lib/settings-types.js +115 -1
- package/dist/lib/settings-types.js.map +1 -1
- package/dist/scripts/leadcms-helpers.d.ts +2 -0
- package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
- package/dist/scripts/leadcms-helpers.js +2 -0
- package/dist/scripts/leadcms-helpers.js.map +1 -1
- package/dist/scripts/pull-all.d.ts +9 -1
- package/dist/scripts/pull-all.d.ts.map +1 -1
- package/dist/scripts/pull-all.js +59 -5
- package/dist/scripts/pull-all.js.map +1 -1
- package/dist/scripts/pull-leadcms-comments.d.ts +3 -1
- package/dist/scripts/pull-leadcms-comments.d.ts.map +1 -1
- package/dist/scripts/pull-leadcms-comments.js +55 -3
- package/dist/scripts/pull-leadcms-comments.js.map +1 -1
- package/dist/scripts/pull-segments.d.ts +22 -0
- package/dist/scripts/pull-segments.d.ts.map +1 -0
- package/dist/scripts/pull-segments.js +207 -0
- package/dist/scripts/pull-segments.js.map +1 -0
- package/dist/scripts/pull-sequences.d.ts +26 -0
- package/dist/scripts/pull-sequences.d.ts.map +1 -0
- package/dist/scripts/pull-sequences.js +226 -0
- package/dist/scripts/pull-sequences.js.map +1 -0
- package/dist/scripts/push-comments.js +1 -1
- package/dist/scripts/push-comments.js.map +1 -1
- package/dist/scripts/push-segments.d.ts +34 -0
- package/dist/scripts/push-segments.d.ts.map +1 -0
- package/dist/scripts/push-segments.js +262 -0
- package/dist/scripts/push-segments.js.map +1 -0
- package/dist/scripts/push-sequences.d.ts +35 -0
- package/dist/scripts/push-sequences.d.ts.map +1 -0
- package/dist/scripts/push-sequences.js +290 -0
- package/dist/scripts/push-sequences.js.map +1 -0
- package/dist/scripts/push-settings.d.ts +3 -3
- package/dist/scripts/push-settings.js +8 -8
- package/dist/scripts/push-settings.js.map +1 -1
- package/dist/scripts/settings-manager.d.ts +5 -4
- package/dist/scripts/settings-manager.d.ts.map +1 -1
- package/dist/scripts/settings-manager.js +61 -55
- package/dist/scripts/settings-manager.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push and status for segments.
|
|
3
|
+
* Only Dynamic segments are synced; Static segments are excluded.
|
|
4
|
+
*/
|
|
5
|
+
import "dotenv/config";
|
|
6
|
+
import fs from "fs/promises";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import { SEGMENTS_DIR } from "./leadcms-helpers.js";
|
|
9
|
+
import { leadCMSDataService } from "../lib/data-service.js";
|
|
10
|
+
import { colorConsole, statusColors } from "../lib/console-colors.js";
|
|
11
|
+
import { logger } from "../lib/logger.js";
|
|
12
|
+
async function readLocalSegments() {
|
|
13
|
+
const results = [];
|
|
14
|
+
let entries;
|
|
15
|
+
try {
|
|
16
|
+
entries = await fs.readdir(SEGMENTS_DIR, { withFileTypes: true });
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return results;
|
|
20
|
+
}
|
|
21
|
+
for (const entry of entries) {
|
|
22
|
+
if (!entry.isFile() || !entry.name.endsWith(".json"))
|
|
23
|
+
continue;
|
|
24
|
+
const fullPath = path.join(SEGMENTS_DIR, entry.name);
|
|
25
|
+
try {
|
|
26
|
+
const raw = JSON.parse(await fs.readFile(fullPath, "utf8"));
|
|
27
|
+
const segment = raw?._entityType === "segment" ? raw.data : undefined;
|
|
28
|
+
if (segment) {
|
|
29
|
+
results.push({ filePath: fullPath, segment });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch { /* skip */ }
|
|
33
|
+
}
|
|
34
|
+
return results;
|
|
35
|
+
}
|
|
36
|
+
// ── Matching ────────────────────────────────────────────────────────────
|
|
37
|
+
function getRemoteMatch(local, remotes, metadataMap) {
|
|
38
|
+
// Priority 1: match by name
|
|
39
|
+
const nameMatch = remotes.find(r => r.name === local.name);
|
|
40
|
+
if (nameMatch)
|
|
41
|
+
return nameMatch;
|
|
42
|
+
// Priority 2: metadata-map ID
|
|
43
|
+
if (metadataMap?.segments) {
|
|
44
|
+
const entry = metadataMap.segments[local.name];
|
|
45
|
+
if (entry?.id != null) {
|
|
46
|
+
return remotes.find(r => r.id === entry.id);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Priority 3: local id
|
|
50
|
+
if (local.id != null) {
|
|
51
|
+
return remotes.find(r => r.id === local.id);
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
// ── Build payload ───────────────────────────────────────────────────────
|
|
56
|
+
function toCreatePayload(seg) {
|
|
57
|
+
return {
|
|
58
|
+
name: seg.name,
|
|
59
|
+
description: seg.description,
|
|
60
|
+
type: seg.type,
|
|
61
|
+
definition: seg.definition,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function toUpdatePayload(seg) {
|
|
65
|
+
return {
|
|
66
|
+
name: seg.name,
|
|
67
|
+
description: seg.description,
|
|
68
|
+
definition: seg.definition,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// ── Compare ─────────────────────────────────────────────────────────────
|
|
72
|
+
function hasSegmentChanges(local, remote) {
|
|
73
|
+
if (local.name !== remote.name)
|
|
74
|
+
return true;
|
|
75
|
+
if ((local.description ?? null) !== (remote.description ?? null))
|
|
76
|
+
return true;
|
|
77
|
+
if (JSON.stringify(local.definition ?? null) !== JSON.stringify(remote.definition ?? null))
|
|
78
|
+
return true;
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
// ── Update local file after push ────────────────────────────────────────
|
|
82
|
+
async function updateLocalFileAfterPush(filePath, response, remoteCtx) {
|
|
83
|
+
if (remoteCtx) {
|
|
84
|
+
try {
|
|
85
|
+
const rc = await import("../lib/remote-context.js");
|
|
86
|
+
const metaMap = await rc.readMetadataMap(remoteCtx);
|
|
87
|
+
rc.setSegmentRemoteId(metaMap, response.name, response.id);
|
|
88
|
+
rc.setMetadataForSegment(metaMap, response.name, {
|
|
89
|
+
id: response.id,
|
|
90
|
+
createdAt: response.createdAt,
|
|
91
|
+
updatedAt: response.updatedAt ?? undefined,
|
|
92
|
+
});
|
|
93
|
+
await rc.writeMetadataMap(remoteCtx, metaMap);
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
console.warn(`Failed to update remote metadata: ${e.message}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (remoteCtx && !remoteCtx.isDefault)
|
|
100
|
+
return;
|
|
101
|
+
try {
|
|
102
|
+
const { contactCount, createdById, updatedById, createdByIp, createdByUserAgent, updatedByIp, updatedByUserAgent, contactIds, ...rest } = response;
|
|
103
|
+
const local = {
|
|
104
|
+
_entityType: "segment",
|
|
105
|
+
data: rest,
|
|
106
|
+
};
|
|
107
|
+
await fs.writeFile(filePath, JSON.stringify(local, null, 2) + "\n", "utf8");
|
|
108
|
+
logger.verbose(`[PUSH] Updated local file: ${filePath}`);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
logger.verbose(`[PUSH] Failed to update local file ${filePath}: ${e.message}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// ── Status ──────────────────────────────────────────────────────────────
|
|
115
|
+
export async function buildSegmentStatus(options = {}) {
|
|
116
|
+
const { showDelete, remoteContext: remoteCtx } = options;
|
|
117
|
+
const operations = [];
|
|
118
|
+
const localFiles = await readLocalSegments();
|
|
119
|
+
const remoteSegments = (await leadCMSDataService.getAllSegments()).filter(s => s.type !== "Static");
|
|
120
|
+
let metadataMap;
|
|
121
|
+
if (remoteCtx) {
|
|
122
|
+
const rc = await import("../lib/remote-context.js");
|
|
123
|
+
metadataMap = await rc.readMetadataMap(remoteCtx);
|
|
124
|
+
}
|
|
125
|
+
for (const { filePath, segment } of localFiles) {
|
|
126
|
+
const match = getRemoteMatch(segment, remoteSegments, metadataMap);
|
|
127
|
+
if (!match) {
|
|
128
|
+
operations.push({ type: "create", local: segment, filePath });
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Conflict check: remote updated after local
|
|
132
|
+
const localUpdated = segment.updatedAt ? new Date(segment.updatedAt) : new Date(0);
|
|
133
|
+
const remoteUpdated = match.updatedAt ? new Date(match.updatedAt) : new Date(0);
|
|
134
|
+
if (!options.remoteContext && remoteUpdated > localUpdated) {
|
|
135
|
+
operations.push({
|
|
136
|
+
type: "conflict",
|
|
137
|
+
local: segment,
|
|
138
|
+
remote: match,
|
|
139
|
+
filePath,
|
|
140
|
+
reason: "Remote segment updated after local changes",
|
|
141
|
+
});
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (hasSegmentChanges(segment, match)) {
|
|
145
|
+
operations.push({ type: "update", local: segment, remote: match, filePath });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (showDelete) {
|
|
149
|
+
const localNames = new Set(localFiles.map(f => f.segment.name));
|
|
150
|
+
const localIds = new Set(localFiles.map(f => f.segment.id).filter((id) => id != null));
|
|
151
|
+
for (const remote of remoteSegments) {
|
|
152
|
+
if (!localNames.has(remote.name) && (remote.id == null || !localIds.has(remote.id))) {
|
|
153
|
+
operations.push({ type: "delete", remote });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
operations,
|
|
159
|
+
totalLocal: localFiles.length,
|
|
160
|
+
totalRemote: remoteSegments.length,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
export async function statusSegments(options = {}) {
|
|
164
|
+
if (!leadCMSDataService.isApiKeyConfigured()) {
|
|
165
|
+
console.log("\n📊 LeadCMS Segment Status");
|
|
166
|
+
console.log("");
|
|
167
|
+
console.log("⏭️ Segments require authentication — no API key configured, skipping");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const result = await buildSegmentStatus(options);
|
|
171
|
+
const { operations } = result;
|
|
172
|
+
colorConsole.important("\n📊 LeadCMS Segment Status");
|
|
173
|
+
colorConsole.log("");
|
|
174
|
+
if (operations.length === 0) {
|
|
175
|
+
colorConsole.success("✅ All segments are in sync!");
|
|
176
|
+
colorConsole.log("");
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
for (const op of operations) {
|
|
180
|
+
const nameLabel = op.local?.name || op.remote?.name || "unknown";
|
|
181
|
+
const idLabel = op.remote?.id ? `(ID: ${op.remote.id})` : "";
|
|
182
|
+
switch (op.type) {
|
|
183
|
+
case "create":
|
|
184
|
+
colorConsole.log(` ${statusColors.created("new: ")} ${colorConsole.highlight(nameLabel)}`);
|
|
185
|
+
break;
|
|
186
|
+
case "update":
|
|
187
|
+
colorConsole.log(` ${statusColors.modified("modified: ")} ${colorConsole.highlight(nameLabel)} ${colorConsole.gray(idLabel)}`);
|
|
188
|
+
break;
|
|
189
|
+
case "conflict":
|
|
190
|
+
colorConsole.log(` ${statusColors.conflict("conflict: ")} ${colorConsole.highlight(nameLabel)} ${colorConsole.gray(idLabel)}`);
|
|
191
|
+
if (op.reason)
|
|
192
|
+
colorConsole.log(` ${colorConsole.gray(op.reason)}`);
|
|
193
|
+
break;
|
|
194
|
+
case "delete":
|
|
195
|
+
colorConsole.log(` ${statusColors.conflict("deleted: ")} ${colorConsole.highlight(nameLabel)} ${colorConsole.gray(idLabel)}`);
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
colorConsole.log("");
|
|
200
|
+
}
|
|
201
|
+
// ── Push ────────────────────────────────────────────────────────────────
|
|
202
|
+
export async function pushSegments(options = {}) {
|
|
203
|
+
if (!leadCMSDataService.isApiKeyConfigured()) {
|
|
204
|
+
console.log("⏭️ Segments require authentication — no API key configured, skipping");
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const { force, dryRun, allowDelete, remoteContext: remoteCtx } = options;
|
|
208
|
+
if (remoteCtx) {
|
|
209
|
+
leadCMSDataService.configureForRemote(remoteCtx.url, remoteCtx.apiKey);
|
|
210
|
+
logger.verbose(`[PUSH] Using remote "${remoteCtx.name}" (${remoteCtx.url})`);
|
|
211
|
+
}
|
|
212
|
+
let metadataMap;
|
|
213
|
+
if (remoteCtx) {
|
|
214
|
+
const rc = await import("../lib/remote-context.js");
|
|
215
|
+
metadataMap = await rc.readMetadataMap(remoteCtx);
|
|
216
|
+
}
|
|
217
|
+
const localFiles = await readLocalSegments();
|
|
218
|
+
const remoteSegments = (await leadCMSDataService.getAllSegments()).filter(s => s.type !== "Static");
|
|
219
|
+
for (const { filePath, segment } of localFiles) {
|
|
220
|
+
const match = getRemoteMatch(segment, remoteSegments, metadataMap);
|
|
221
|
+
if (!match) {
|
|
222
|
+
if (dryRun) {
|
|
223
|
+
console.log(`🟡 [DRY RUN] Create segment: ${segment.name}`);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const created = await leadCMSDataService.createSegment(toCreatePayload(segment));
|
|
227
|
+
console.log(`✅ Created segment: ${segment.name}`);
|
|
228
|
+
await updateLocalFileAfterPush(filePath, created, remoteCtx);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const localUpdated = segment.updatedAt ? new Date(segment.updatedAt) : new Date(0);
|
|
232
|
+
const remoteUpdated = match.updatedAt ? new Date(match.updatedAt) : new Date(0);
|
|
233
|
+
if (!force && remoteUpdated > localUpdated) {
|
|
234
|
+
console.warn(`⚠️ Remote segment updated after local changes: ${segment.name} — skipping (use --force to override)`);
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (!hasSegmentChanges(segment, match))
|
|
238
|
+
continue;
|
|
239
|
+
if (dryRun) {
|
|
240
|
+
console.log(`🟡 [DRY RUN] Update segment: ${segment.name} (ID ${match.id})`);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const updated = await leadCMSDataService.updateSegment(match.id, toUpdatePayload(segment));
|
|
244
|
+
console.log(`✅ Updated segment: ${segment.name}`);
|
|
245
|
+
await updateLocalFileAfterPush(filePath, updated, remoteCtx);
|
|
246
|
+
}
|
|
247
|
+
if (!allowDelete)
|
|
248
|
+
return;
|
|
249
|
+
const localNames = new Set(localFiles.map(f => f.segment.name));
|
|
250
|
+
const localIds = new Set(localFiles.map(f => f.segment.id).filter((id) => id != null));
|
|
251
|
+
for (const remote of remoteSegments) {
|
|
252
|
+
if (localNames.has(remote.name) || (remote.id != null && localIds.has(remote.id)))
|
|
253
|
+
continue;
|
|
254
|
+
if (dryRun) {
|
|
255
|
+
console.log(`🟡 [DRY RUN] Delete segment: ${remote.name || remote.id}`);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
await leadCMSDataService.deleteSegment(remote.id);
|
|
259
|
+
console.log(`🗑️ Deleted segment: ${remote.name || remote.id}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=push-segments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-segments.js","sourceRoot":"","sources":["../../src/scripts/push-segments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push and status for sequences.
|
|
3
|
+
* Uses name-based references locally (segment names, email template names)
|
|
4
|
+
* and transforms to/from ID-based references for the API.
|
|
5
|
+
*/
|
|
6
|
+
import "dotenv/config";
|
|
7
|
+
import type { RemoteContext } from "../lib/remote-context.js";
|
|
8
|
+
import type { SequenceDetailsDto, LocalSequenceDto } from "../lib/automation-types.js";
|
|
9
|
+
interface PushOptions {
|
|
10
|
+
force?: boolean;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
allowDelete?: boolean;
|
|
13
|
+
remoteContext?: RemoteContext;
|
|
14
|
+
}
|
|
15
|
+
interface StatusOptions {
|
|
16
|
+
showDelete?: boolean;
|
|
17
|
+
remoteContext?: RemoteContext;
|
|
18
|
+
}
|
|
19
|
+
export interface SequenceOperation {
|
|
20
|
+
type: "create" | "update" | "delete" | "conflict";
|
|
21
|
+
local?: LocalSequenceDto;
|
|
22
|
+
remote?: SequenceDetailsDto;
|
|
23
|
+
filePath?: string;
|
|
24
|
+
reason?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SequenceStatusResult {
|
|
27
|
+
operations: SequenceOperation[];
|
|
28
|
+
totalLocal: number;
|
|
29
|
+
totalRemote: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function buildSequenceStatus(options?: StatusOptions): Promise<SequenceStatusResult>;
|
|
32
|
+
export declare function statusSequences(options?: StatusOptions): Promise<void>;
|
|
33
|
+
export declare function pushSequences(options?: PushOptions): Promise<void>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=push-sequences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-sequences.d.ts","sourceRoot":"","sources":["../../src/scripts/push-sequences.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,eAAe,CAAC;AAOvB,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EACR,kBAAkB,EAElB,gBAAgB,EAKnB,MAAM,4BAA4B,CAAC;AAKpC,UAAU,WAAW;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC;AAED,UAAU,aAAa;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAClD,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAkKD,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0DpG;AAED,wBAAsB,eAAe,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyChF;AAID,wBAAsB,aAAa,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqF5E"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push and status for sequences.
|
|
3
|
+
* Uses name-based references locally (segment names, email template names)
|
|
4
|
+
* and transforms to/from ID-based references for the API.
|
|
5
|
+
*/
|
|
6
|
+
import "dotenv/config";
|
|
7
|
+
import fs from "fs/promises";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { SEQUENCES_DIR } from "./leadcms-helpers.js";
|
|
10
|
+
import { leadCMSDataService } from "../lib/data-service.js";
|
|
11
|
+
import { colorConsole, statusColors } from "../lib/console-colors.js";
|
|
12
|
+
import { logger } from "../lib/logger.js";
|
|
13
|
+
import { toRemoteSequencePayload, toLocalSequence } from "../lib/automation-types.js";
|
|
14
|
+
async function readLocalSequences() {
|
|
15
|
+
const results = [];
|
|
16
|
+
let entries;
|
|
17
|
+
try {
|
|
18
|
+
entries = await fs.readdir(SEQUENCES_DIR, { withFileTypes: true });
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return results;
|
|
22
|
+
}
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
if (!entry.isFile() || !entry.name.endsWith(".json"))
|
|
25
|
+
continue;
|
|
26
|
+
const fullPath = path.join(SEQUENCES_DIR, entry.name);
|
|
27
|
+
try {
|
|
28
|
+
const raw = JSON.parse(await fs.readFile(fullPath, "utf8"));
|
|
29
|
+
// Support both flat format and legacy _entityType wrapper
|
|
30
|
+
const sequence = raw?._entityType === "sequence" ? raw.data : (raw?.name ? raw : undefined);
|
|
31
|
+
if (sequence) {
|
|
32
|
+
results.push({ filePath: fullPath, sequence });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch { /* skip */ }
|
|
36
|
+
}
|
|
37
|
+
return results;
|
|
38
|
+
}
|
|
39
|
+
// ── Lookup maps ─────────────────────────────────────────────────────────
|
|
40
|
+
async function buildNameToIdMaps() {
|
|
41
|
+
const [segments, templates] = await Promise.all([
|
|
42
|
+
leadCMSDataService.getAllSegments(),
|
|
43
|
+
leadCMSDataService.getAllEmailTemplates(),
|
|
44
|
+
]);
|
|
45
|
+
const segmentMap = new Map();
|
|
46
|
+
for (const seg of segments) {
|
|
47
|
+
if (seg.id != null)
|
|
48
|
+
segmentMap.set(seg.name, seg.id);
|
|
49
|
+
}
|
|
50
|
+
const templateMap = new Map();
|
|
51
|
+
for (const tpl of templates) {
|
|
52
|
+
if (tpl.id != null && tpl.name)
|
|
53
|
+
templateMap.set(tpl.name, tpl.id);
|
|
54
|
+
}
|
|
55
|
+
return { segmentMap, templateMap };
|
|
56
|
+
}
|
|
57
|
+
async function buildIdToNameMaps() {
|
|
58
|
+
const [segments, templates] = await Promise.all([
|
|
59
|
+
leadCMSDataService.getAllSegments(),
|
|
60
|
+
leadCMSDataService.getAllEmailTemplates(),
|
|
61
|
+
]);
|
|
62
|
+
const segmentMap = new Map();
|
|
63
|
+
for (const seg of segments) {
|
|
64
|
+
if (seg.id != null)
|
|
65
|
+
segmentMap.set(seg.id, seg.name);
|
|
66
|
+
}
|
|
67
|
+
const templateMap = new Map();
|
|
68
|
+
for (const tpl of templates) {
|
|
69
|
+
if (tpl.id != null && tpl.name)
|
|
70
|
+
templateMap.set(tpl.id, tpl.name);
|
|
71
|
+
}
|
|
72
|
+
return { segmentMap, templateMap };
|
|
73
|
+
}
|
|
74
|
+
// ── Matching ────────────────────────────────────────────────────────────
|
|
75
|
+
function getRemoteMatch(local, remotes, metadataMap) {
|
|
76
|
+
// Priority 1: name match
|
|
77
|
+
const nameMatch = remotes.find(r => r.name === local.name);
|
|
78
|
+
if (nameMatch)
|
|
79
|
+
return nameMatch;
|
|
80
|
+
// Priority 2: metadata-map ID
|
|
81
|
+
if (metadataMap?.sequences) {
|
|
82
|
+
const entry = metadataMap.sequences[local.name];
|
|
83
|
+
if (entry?.id != null) {
|
|
84
|
+
return remotes.find(r => r.id === entry.id);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Priority 3: local id
|
|
88
|
+
if (local.id != null) {
|
|
89
|
+
return remotes.find(r => r.id === local.id);
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
// ── Compare ─────────────────────────────────────────────────────────────
|
|
94
|
+
function hasSequenceChanges(local, remote, segmentIdNameMap, templateIdNameMap) {
|
|
95
|
+
// Compare using the local representation of the remote
|
|
96
|
+
const remoteAsLocal = toLocalSequence(remote, segmentIdNameMap, templateIdNameMap);
|
|
97
|
+
// Strip timestamps for comparison
|
|
98
|
+
const { createdAt: _lc, updatedAt: _lu, id: _lid, ...localComp } = local;
|
|
99
|
+
const { createdAt: _rc, updatedAt: _ru, id: _rid, ...remoteComp } = remoteAsLocal;
|
|
100
|
+
return JSON.stringify(localComp) !== JSON.stringify(remoteComp);
|
|
101
|
+
}
|
|
102
|
+
// ── Update local file after push ────────────────────────────────────────
|
|
103
|
+
async function updateLocalFileAfterPush(filePath, response, segmentIdNameMap, templateIdNameMap, remoteCtx) {
|
|
104
|
+
if (remoteCtx) {
|
|
105
|
+
try {
|
|
106
|
+
const rc = await import("../lib/remote-context.js");
|
|
107
|
+
const metaMap = await rc.readMetadataMap(remoteCtx);
|
|
108
|
+
rc.setSequenceRemoteId(metaMap, response.name, response.id);
|
|
109
|
+
rc.setMetadataForSequence(metaMap, response.name, {
|
|
110
|
+
id: response.id,
|
|
111
|
+
createdAt: response.createdAt,
|
|
112
|
+
updatedAt: response.updatedAt ?? undefined,
|
|
113
|
+
});
|
|
114
|
+
await rc.writeMetadataMap(remoteCtx, metaMap);
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
console.warn(`Failed to update remote metadata: ${e.message}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (remoteCtx && !remoteCtx.isDefault)
|
|
121
|
+
return;
|
|
122
|
+
try {
|
|
123
|
+
const localDto = toLocalSequence(response, segmentIdNameMap, templateIdNameMap);
|
|
124
|
+
await fs.writeFile(filePath, JSON.stringify(localDto, null, 2) + "\n", "utf8");
|
|
125
|
+
logger.verbose(`[PUSH] Updated local file: ${filePath}`);
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
logger.verbose(`[PUSH] Failed to update local file ${filePath}: ${e.message}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ── Status ──────────────────────────────────────────────────────────────
|
|
132
|
+
export async function buildSequenceStatus(options = {}) {
|
|
133
|
+
const { showDelete, remoteContext: remoteCtx } = options;
|
|
134
|
+
const operations = [];
|
|
135
|
+
const localFiles = await readLocalSequences();
|
|
136
|
+
const remoteSequences = await leadCMSDataService.getAllSequences();
|
|
137
|
+
const { segmentMap: segIdNameMap, templateMap: tplIdNameMap } = await buildIdToNameMaps();
|
|
138
|
+
let metadataMap;
|
|
139
|
+
if (remoteCtx) {
|
|
140
|
+
const rc = await import("../lib/remote-context.js");
|
|
141
|
+
metadataMap = await rc.readMetadataMap(remoteCtx);
|
|
142
|
+
}
|
|
143
|
+
for (const { filePath, sequence } of localFiles) {
|
|
144
|
+
const match = getRemoteMatch(sequence, remoteSequences, metadataMap);
|
|
145
|
+
if (!match) {
|
|
146
|
+
operations.push({ type: "create", local: sequence, filePath });
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const localUpdated = sequence.updatedAt ? new Date(sequence.updatedAt) : new Date(0);
|
|
150
|
+
const remoteUpdated = match.updatedAt ? new Date(match.updatedAt) : new Date(0);
|
|
151
|
+
if (!options.remoteContext && remoteUpdated > localUpdated) {
|
|
152
|
+
operations.push({
|
|
153
|
+
type: "conflict",
|
|
154
|
+
local: sequence,
|
|
155
|
+
remote: match,
|
|
156
|
+
filePath,
|
|
157
|
+
reason: "Remote sequence updated after local changes",
|
|
158
|
+
});
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (hasSequenceChanges(sequence, match, segIdNameMap, tplIdNameMap)) {
|
|
162
|
+
operations.push({ type: "update", local: sequence, remote: match, filePath });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (showDelete) {
|
|
166
|
+
const localNames = new Set(localFiles.map(f => f.sequence.name));
|
|
167
|
+
const localIds = new Set(localFiles.map(f => f.sequence.id).filter((id) => id != null));
|
|
168
|
+
for (const remote of remoteSequences) {
|
|
169
|
+
if (!localNames.has(remote.name) && (remote.id == null || !localIds.has(remote.id))) {
|
|
170
|
+
operations.push({ type: "delete", remote });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
operations,
|
|
176
|
+
totalLocal: localFiles.length,
|
|
177
|
+
totalRemote: remoteSequences.length,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
export async function statusSequences(options = {}) {
|
|
181
|
+
if (!leadCMSDataService.isApiKeyConfigured()) {
|
|
182
|
+
console.log("\n📊 LeadCMS Sequence Status");
|
|
183
|
+
console.log("");
|
|
184
|
+
console.log("⏭️ Sequences require authentication — no API key configured, skipping");
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const result = await buildSequenceStatus(options);
|
|
188
|
+
const { operations } = result;
|
|
189
|
+
colorConsole.important("\n📊 LeadCMS Sequence Status");
|
|
190
|
+
colorConsole.log("");
|
|
191
|
+
if (operations.length === 0) {
|
|
192
|
+
colorConsole.success("✅ All sequences are in sync!");
|
|
193
|
+
colorConsole.log("");
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
for (const op of operations) {
|
|
197
|
+
const nameLabel = op.local?.name || op.remote?.name || "unknown";
|
|
198
|
+
const idLabel = op.remote?.id ? `(ID: ${op.remote.id})` : "";
|
|
199
|
+
switch (op.type) {
|
|
200
|
+
case "create":
|
|
201
|
+
colorConsole.log(` ${statusColors.created("new: ")} ${colorConsole.highlight(nameLabel)}`);
|
|
202
|
+
break;
|
|
203
|
+
case "update":
|
|
204
|
+
colorConsole.log(` ${statusColors.modified("modified: ")} ${colorConsole.highlight(nameLabel)} ${colorConsole.gray(idLabel)}`);
|
|
205
|
+
break;
|
|
206
|
+
case "conflict":
|
|
207
|
+
colorConsole.log(` ${statusColors.conflict("conflict: ")} ${colorConsole.highlight(nameLabel)} ${colorConsole.gray(idLabel)}`);
|
|
208
|
+
if (op.reason)
|
|
209
|
+
colorConsole.log(` ${colorConsole.gray(op.reason)}`);
|
|
210
|
+
break;
|
|
211
|
+
case "delete":
|
|
212
|
+
colorConsole.log(` ${statusColors.conflict("deleted: ")} ${colorConsole.highlight(nameLabel)} ${colorConsole.gray(idLabel)}`);
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
colorConsole.log("");
|
|
217
|
+
}
|
|
218
|
+
// ── Push ────────────────────────────────────────────────────────────────
|
|
219
|
+
export async function pushSequences(options = {}) {
|
|
220
|
+
if (!leadCMSDataService.isApiKeyConfigured()) {
|
|
221
|
+
console.log("⏭️ Sequences require authentication — no API key configured, skipping");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const { force, dryRun, allowDelete, remoteContext: remoteCtx } = options;
|
|
225
|
+
if (remoteCtx) {
|
|
226
|
+
leadCMSDataService.configureForRemote(remoteCtx.url, remoteCtx.apiKey);
|
|
227
|
+
logger.verbose(`[PUSH] Using remote "${remoteCtx.name}" (${remoteCtx.url})`);
|
|
228
|
+
}
|
|
229
|
+
let metadataMap;
|
|
230
|
+
if (remoteCtx) {
|
|
231
|
+
const rc = await import("../lib/remote-context.js");
|
|
232
|
+
metadataMap = await rc.readMetadataMap(remoteCtx);
|
|
233
|
+
}
|
|
234
|
+
const localFiles = await readLocalSequences();
|
|
235
|
+
const remoteSequences = await leadCMSDataService.getAllSequences();
|
|
236
|
+
const { segmentMap: segNameIdMap, templateMap: tplNameIdMap } = await buildNameToIdMaps();
|
|
237
|
+
const { segmentMap: segIdNameMap, templateMap: tplIdNameMap } = await buildIdToNameMaps();
|
|
238
|
+
for (const { filePath, sequence } of localFiles) {
|
|
239
|
+
const match = getRemoteMatch(sequence, remoteSequences, metadataMap);
|
|
240
|
+
let payload;
|
|
241
|
+
try {
|
|
242
|
+
payload = toRemoteSequencePayload(sequence, segNameIdMap, tplNameIdMap);
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
console.warn(`⚠️ Skipping sequence "${sequence.name}": ${e.message}`);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (!match) {
|
|
249
|
+
if (dryRun) {
|
|
250
|
+
console.log(`🟡 [DRY RUN] Create sequence: ${sequence.name}`);
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
const created = await leadCMSDataService.createSequence(payload);
|
|
254
|
+
console.log(`✅ Created sequence: ${sequence.name}`);
|
|
255
|
+
await updateLocalFileAfterPush(filePath, created, segIdNameMap, tplIdNameMap, remoteCtx);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const localUpdated = sequence.updatedAt ? new Date(sequence.updatedAt) : new Date(0);
|
|
259
|
+
const remoteUpdated = match.updatedAt ? new Date(match.updatedAt) : new Date(0);
|
|
260
|
+
if (!force && remoteUpdated > localUpdated) {
|
|
261
|
+
console.warn(`⚠️ Remote sequence updated after local changes: ${sequence.name} — skipping (use --force to override)`);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (!hasSequenceChanges(sequence, match, segIdNameMap, tplIdNameMap))
|
|
265
|
+
continue;
|
|
266
|
+
if (dryRun) {
|
|
267
|
+
console.log(`🟡 [DRY RUN] Update sequence: ${sequence.name} (ID ${match.id})`);
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
// Sequences use PUT for full replace
|
|
271
|
+
const updated = await leadCMSDataService.updateSequence(match.id, payload);
|
|
272
|
+
console.log(`✅ Updated sequence: ${sequence.name}`);
|
|
273
|
+
await updateLocalFileAfterPush(filePath, updated, segIdNameMap, tplIdNameMap, remoteCtx);
|
|
274
|
+
}
|
|
275
|
+
if (!allowDelete)
|
|
276
|
+
return;
|
|
277
|
+
const localNames = new Set(localFiles.map(f => f.sequence.name));
|
|
278
|
+
const localIds = new Set(localFiles.map(f => f.sequence.id).filter((id) => id != null));
|
|
279
|
+
for (const remote of remoteSequences) {
|
|
280
|
+
if (localNames.has(remote.name) || (remote.id != null && localIds.has(remote.id)))
|
|
281
|
+
continue;
|
|
282
|
+
if (dryRun) {
|
|
283
|
+
console.log(`🟡 [DRY RUN] Delete sequence: ${remote.name || remote.id}`);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
await leadCMSDataService.deleteSequence(remote.id);
|
|
287
|
+
console.log(`🗑️ Deleted sequence: ${remote.name || remote.id}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=push-sequences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-sequences.js","sourceRoot":"","sources":["../../src/scripts/push-sequences.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,13 +41,13 @@ export declare function renderSettingsStatus(statusResult: SettingsStatusResult,
|
|
|
41
41
|
*/
|
|
42
42
|
export declare function formatSettingValue(key: string, value: string | null | undefined): string;
|
|
43
43
|
/**
|
|
44
|
-
* Format a diff description for a modified
|
|
44
|
+
* Format a diff description for a modified markdown setting.
|
|
45
45
|
* Returns e.g. "3 lines → 47 lines" or the normal "old" → "new" for short values.
|
|
46
46
|
*/
|
|
47
47
|
export declare function formatSettingDiff(key: string, remoteValue: string | null | undefined, localValue: string | null | undefined): string;
|
|
48
48
|
/**
|
|
49
|
-
* Render a colored line-by-line diff for
|
|
50
|
-
* For non-
|
|
49
|
+
* Render a colored line-by-line diff for a markdown setting.
|
|
50
|
+
* For non-markdown settings this is a no-op (returns false).
|
|
51
51
|
*
|
|
52
52
|
* @param indent Leading whitespace for each printed line
|
|
53
53
|
* @returns true if a diff was rendered, false if skipped
|