@leadcms/sdk 3.5.4 β 3.5.8
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/content-status-args.js +0 -0
- package/dist/cli/bin/generate-env.js +0 -0
- package/dist/cli/bin/init.js +0 -0
- package/dist/cli/bin/login.js +0 -0
- package/dist/cli/bin/pull-all.js +0 -0
- package/dist/cli/bin/pull-comments.js +0 -0
- package/dist/cli/bin/pull-content.js +0 -0
- package/dist/cli/bin/pull-email-templates.js +0 -0
- package/dist/cli/bin/pull-media.js +0 -0
- 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 +26 -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 +26 -0
- package/dist/cli/bin/pull-sequences.js.map +1 -0
- package/dist/cli/bin/pull-settings.js +0 -0
- package/dist/cli/bin/push-all.js +18 -0
- package/dist/cli/bin/push-all.js.map +1 -1
- package/dist/cli/bin/push-comments.js +0 -0
- package/dist/cli/bin/push-content.js +0 -0
- package/dist/cli/bin/push-email-templates.js +0 -0
- package/dist/cli/bin/push-media.js +0 -0
- 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/push-settings.js +0 -0
- package/dist/cli/bin/push.js +0 -0
- package/dist/cli/bin/remote-flag.js +0 -0
- package/dist/cli/bin/remote.js +0 -0
- package/dist/cli/bin/status-all.js +134 -6
- package/dist/cli/bin/status-all.js.map +1 -1
- package/dist/cli/bin/status-comments.js +0 -0
- package/dist/cli/bin/status-content.js +0 -0
- package/dist/cli/bin/status-email-templates.js +0 -0
- package/dist/cli/bin/status-media.js +0 -0
- 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 +25 -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 +25 -0
- package/dist/cli/bin/status-sequences.js.map +1 -0
- package/dist/cli/bin/status-settings.js +0 -0
- package/dist/cli/bin/status.js +0 -0
- package/dist/cli/bin/watch.js +0 -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 +235 -0
- package/dist/lib/automation-types.d.ts.map +1 -0
- package/dist/lib/automation-types.js +150 -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/data-service.d.ts +38 -1
- package/dist/lib/data-service.d.ts.map +1 -1
- package/dist/lib/data-service.js +312 -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/lib/slugify.d.ts +9 -0
- package/dist/lib/slugify.d.ts.map +1 -0
- package/dist/lib/slugify.js +12 -0
- package/dist/lib/slugify.js.map +1 -0
- 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.map +1 -1
- package/dist/scripts/pull-leadcms-comments.js +9 -1
- package/dist/scripts/pull-leadcms-comments.js.map +1 -1
- package/dist/scripts/pull-leadcms-content.d.ts.map +1 -1
- package/dist/scripts/pull-leadcms-content.js +9 -1
- package/dist/scripts/pull-leadcms-content.js.map +1 -1
- package/dist/scripts/pull-leadcms-email-templates.d.ts.map +1 -1
- package/dist/scripts/pull-leadcms-email-templates.js +12 -10
- package/dist/scripts/pull-leadcms-email-templates.js.map +1 -1
- package/dist/scripts/pull-segments.d.ts +32 -0
- package/dist/scripts/pull-segments.d.ts.map +1 -0
- package/dist/scripts/pull-segments.js +215 -0
- package/dist/scripts/pull-segments.js.map +1 -0
- package/dist/scripts/pull-sequences.d.ts +32 -0
- package/dist/scripts/pull-sequences.d.ts.map +1 -0
- package/dist/scripts/pull-sequences.js +236 -0
- package/dist/scripts/pull-sequences.js.map +1 -0
- package/dist/scripts/push-email-templates.d.ts.map +1 -1
- package/dist/scripts/push-email-templates.js +1 -8
- package/dist/scripts/push-email-templates.js.map +1 -1
- package/dist/scripts/push-leadcms-content.js +1 -1
- package/dist/scripts/push-segments.d.ts +35 -0
- package/dist/scripts/push-segments.d.ts.map +1 -0
- package/dist/scripts/push-segments.js +318 -0
- package/dist/scripts/push-segments.js.map +1 -0
- package/dist/scripts/push-sequences.d.ts +36 -0
- package/dist/scripts/push-sequences.d.ts.map +1 -0
- package/dist/scripts/push-sequences.js +351 -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 +21 -21
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull segments from LeadCMS.
|
|
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 axios from "axios";
|
|
9
|
+
import { leadCMSUrl, leadCMSApiKey, SEGMENTS_DIR, } from "./leadcms-helpers.js";
|
|
10
|
+
import { syncTokenPath } from "../lib/remote-context.js";
|
|
11
|
+
import { resetSegmentsState } from "./pull-all.js";
|
|
12
|
+
import { logger } from "../lib/logger.js";
|
|
13
|
+
import { slugify } from "../lib/slugify.js";
|
|
14
|
+
import { stripNullsAndEmptyArrays } from "../lib/automation-types.js";
|
|
15
|
+
async function readFileOrUndefined(filePath) {
|
|
16
|
+
try {
|
|
17
|
+
return (await fs.readFile(filePath, "utf8")).trim() || undefined;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function readSyncToken(remoteCtx) {
|
|
24
|
+
if (remoteCtx) {
|
|
25
|
+
const tokenPath = syncTokenPath(remoteCtx, "segments");
|
|
26
|
+
return readFileOrUndefined(tokenPath);
|
|
27
|
+
}
|
|
28
|
+
return readFileOrUndefined(path.join(SEGMENTS_DIR, ".sync-token"));
|
|
29
|
+
}
|
|
30
|
+
async function writeSyncToken(token, remoteCtx) {
|
|
31
|
+
if (remoteCtx) {
|
|
32
|
+
const tokenPath = syncTokenPath(remoteCtx, "segments");
|
|
33
|
+
await fs.mkdir(path.dirname(tokenPath), { recursive: true });
|
|
34
|
+
await fs.writeFile(tokenPath, token, "utf8");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
await fs.mkdir(SEGMENTS_DIR, { recursive: true });
|
|
38
|
+
await fs.writeFile(path.join(SEGMENTS_DIR, ".sync-token"), token, "utf8");
|
|
39
|
+
}
|
|
40
|
+
async function pullSegmentSync(syncToken) {
|
|
41
|
+
if (!leadCMSUrl) {
|
|
42
|
+
throw new Error("LeadCMS URL is not configured.");
|
|
43
|
+
}
|
|
44
|
+
if (!leadCMSApiKey) {
|
|
45
|
+
throw new Error("LeadCMS API key is required to pull segments.");
|
|
46
|
+
}
|
|
47
|
+
let allItems = [];
|
|
48
|
+
let allDeleted = [];
|
|
49
|
+
let allBaseItems = {};
|
|
50
|
+
let token = syncToken || "";
|
|
51
|
+
let nextSyncToken = token;
|
|
52
|
+
while (true) {
|
|
53
|
+
const url = new URL("/api/segments/sync", leadCMSUrl);
|
|
54
|
+
url.searchParams.set("filter[limit]", "100");
|
|
55
|
+
url.searchParams.set("syncToken", token);
|
|
56
|
+
if (syncToken) {
|
|
57
|
+
url.searchParams.set("includeBase", "true");
|
|
58
|
+
}
|
|
59
|
+
const res = await axios.get(url.toString(), {
|
|
60
|
+
headers: { Authorization: `Bearer ${leadCMSApiKey}` },
|
|
61
|
+
});
|
|
62
|
+
if (res.status === 204)
|
|
63
|
+
break;
|
|
64
|
+
const data = res.data || {};
|
|
65
|
+
if (data.items && Array.isArray(data.items)) {
|
|
66
|
+
allItems.push(...data.items);
|
|
67
|
+
}
|
|
68
|
+
if (data.deleted && Array.isArray(data.deleted)) {
|
|
69
|
+
allDeleted.push(...data.deleted);
|
|
70
|
+
}
|
|
71
|
+
if (data.baseItems && typeof data.baseItems === "object") {
|
|
72
|
+
Object.assign(allBaseItems, data.baseItems);
|
|
73
|
+
}
|
|
74
|
+
const newSyncToken = res.headers["x-next-sync-token"] || token;
|
|
75
|
+
if (!newSyncToken || newSyncToken === token) {
|
|
76
|
+
nextSyncToken = newSyncToken || token;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
nextSyncToken = newSyncToken;
|
|
80
|
+
token = newSyncToken;
|
|
81
|
+
}
|
|
82
|
+
return { items: allItems, deleted: allDeleted, baseItems: allBaseItems, nextSyncToken };
|
|
83
|
+
}
|
|
84
|
+
/** Build a map of segment ID β file path from existing local files. */
|
|
85
|
+
async function buildSegmentIdIndex(dir) {
|
|
86
|
+
const index = new Map();
|
|
87
|
+
let entries;
|
|
88
|
+
try {
|
|
89
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return index;
|
|
93
|
+
}
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
if (!entry.isFile() || !entry.name.endsWith(".json"))
|
|
96
|
+
continue;
|
|
97
|
+
const fullPath = path.join(dir, entry.name);
|
|
98
|
+
try {
|
|
99
|
+
const content = JSON.parse(await fs.readFile(fullPath, "utf8"));
|
|
100
|
+
const id = content?._entityType === "segment" ? content?.data?.id : content?.id;
|
|
101
|
+
if (id != null) {
|
|
102
|
+
index.set(String(id), fullPath);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch { /* skip unreadable */ }
|
|
106
|
+
}
|
|
107
|
+
return index;
|
|
108
|
+
}
|
|
109
|
+
function getSegmentFilePath(segment) {
|
|
110
|
+
const slug = slugify(segment.name) || `segment-${segment.id}`;
|
|
111
|
+
return path.join(SEGMENTS_DIR, `${slug}.json`);
|
|
112
|
+
}
|
|
113
|
+
/** Strip runtime-only fields from a segment DTO for local persistence. */
|
|
114
|
+
function toLocalSegment(segment) {
|
|
115
|
+
const { contactCount, createdById, updatedById, createdByIp, createdByUserAgent, updatedByIp, updatedByUserAgent, contactIds, ...rest } = segment;
|
|
116
|
+
return stripNullsAndEmptyArrays(rest);
|
|
117
|
+
}
|
|
118
|
+
function saveSegmentFile(segment) {
|
|
119
|
+
const filePath = getSegmentFilePath(segment);
|
|
120
|
+
const local = toLocalSegment(segment);
|
|
121
|
+
return { filePath, content: JSON.stringify(local, null, 2) + "\n" };
|
|
122
|
+
}
|
|
123
|
+
export async function pullLeadCMSSegments(optionsOrRemoteCtx) {
|
|
124
|
+
// Support both old signature (RemoteContext) and new options object
|
|
125
|
+
let reset;
|
|
126
|
+
let remoteCtx;
|
|
127
|
+
if (optionsOrRemoteCtx && 'name' in optionsOrRemoteCtx && 'url' in optionsOrRemoteCtx) {
|
|
128
|
+
remoteCtx = optionsOrRemoteCtx;
|
|
129
|
+
}
|
|
130
|
+
else if (optionsOrRemoteCtx) {
|
|
131
|
+
const opts = optionsOrRemoteCtx;
|
|
132
|
+
reset = opts.reset;
|
|
133
|
+
remoteCtx = opts.remoteContext;
|
|
134
|
+
}
|
|
135
|
+
if (reset) {
|
|
136
|
+
console.log(`π Resetting segments state...\n`);
|
|
137
|
+
await resetSegmentsState(remoteCtx);
|
|
138
|
+
}
|
|
139
|
+
const lastSyncToken = await readSyncToken(remoteCtx);
|
|
140
|
+
const { items, deleted, nextSyncToken } = await pullSegmentSync(lastSyncToken);
|
|
141
|
+
// Filter out Static segments
|
|
142
|
+
const dynamicItems = items.filter(s => s.type !== "Static");
|
|
143
|
+
let metadataMap;
|
|
144
|
+
const rcModule = remoteCtx ? await import("../lib/remote-context.js") : undefined;
|
|
145
|
+
if (remoteCtx && rcModule) {
|
|
146
|
+
metadataMap = await rcModule.readMetadataMap(remoteCtx);
|
|
147
|
+
}
|
|
148
|
+
const idIndex = (dynamicItems.length > 0 || deleted.length > 0)
|
|
149
|
+
? await buildSegmentIdIndex(SEGMENTS_DIR)
|
|
150
|
+
: new Map();
|
|
151
|
+
let newCount = 0;
|
|
152
|
+
let updatedCount = 0;
|
|
153
|
+
for (const segment of dynamicItems) {
|
|
154
|
+
const idStr = segment.id != null ? String(segment.id) : undefined;
|
|
155
|
+
// Update per-remote metadata
|
|
156
|
+
if (remoteCtx && rcModule && metadataMap && segment.id != null) {
|
|
157
|
+
rcModule.setSegmentRemoteId(metadataMap, segment.name, segment.id);
|
|
158
|
+
rcModule.setMetadataForSegment(metadataMap, segment.name, {
|
|
159
|
+
id: segment.id,
|
|
160
|
+
createdAt: segment.createdAt,
|
|
161
|
+
updatedAt: segment.updatedAt ?? undefined,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// Remove old file if ID is already mapped to a different path
|
|
165
|
+
if (idStr && idIndex.has(idStr)) {
|
|
166
|
+
const oldPath = idIndex.get(idStr);
|
|
167
|
+
const newPath = getSegmentFilePath(segment);
|
|
168
|
+
if (oldPath !== newPath) {
|
|
169
|
+
try {
|
|
170
|
+
await fs.unlink(oldPath);
|
|
171
|
+
}
|
|
172
|
+
catch { /* ignore */ }
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const { filePath, content } = saveSegmentFile(segment);
|
|
176
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
177
|
+
const existed = idStr ? idIndex.has(idStr) : false;
|
|
178
|
+
await fs.writeFile(filePath, content, "utf8");
|
|
179
|
+
if (existed) {
|
|
180
|
+
updatedCount++;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
newCount++;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Handle deletions
|
|
187
|
+
for (const id of deleted) {
|
|
188
|
+
const filePath = idIndex.get(String(id));
|
|
189
|
+
if (filePath) {
|
|
190
|
+
try {
|
|
191
|
+
await fs.unlink(filePath);
|
|
192
|
+
}
|
|
193
|
+
catch { /* ignore */ }
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Persist metadata
|
|
197
|
+
if (remoteCtx && rcModule && metadataMap && dynamicItems.length > 0) {
|
|
198
|
+
await rcModule.writeMetadataMap(remoteCtx, metadataMap);
|
|
199
|
+
logger.verbose(`[PULL] Updated metadata-map for remote "${remoteCtx.name}"`);
|
|
200
|
+
}
|
|
201
|
+
if (nextSyncToken) {
|
|
202
|
+
await writeSyncToken(nextSyncToken, remoteCtx);
|
|
203
|
+
}
|
|
204
|
+
if (newCount > 0 || updatedCount > 0 || deleted.length > 0) {
|
|
205
|
+
console.log(`\nπ Segments sync summary:`);
|
|
206
|
+
if (newCount > 0)
|
|
207
|
+
console.log(` β¨ New: ${newCount}`);
|
|
208
|
+
if (updatedCount > 0)
|
|
209
|
+
console.log(` π Updated: ${updatedCount}`);
|
|
210
|
+
if (deleted.length > 0)
|
|
211
|
+
console.log(` ποΈ Deleted: ${deleted.length}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
export { pullSegmentSync, buildSegmentIdIndex, getSegmentFilePath, toLocalSegment, saveSegmentFile };
|
|
215
|
+
//# sourceMappingURL=pull-segments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-segments.js","sourceRoot":"","sources":["../../src/scripts/pull-segments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull sequences from LeadCMS.
|
|
3
|
+
* Transforms segment IDs β names and emailTemplateId β emailTemplateName
|
|
4
|
+
* for human-readable local files.
|
|
5
|
+
*/
|
|
6
|
+
import "dotenv/config";
|
|
7
|
+
import { type RemoteContext } from "../lib/remote-context.js";
|
|
8
|
+
import type { SequenceDetailsDto, LocalSequenceDto, SegmentIdNameMap, EmailTemplateIdNameMap } from "../lib/automation-types.js";
|
|
9
|
+
interface SequenceSyncResult {
|
|
10
|
+
items: SequenceDetailsDto[];
|
|
11
|
+
deleted: number[];
|
|
12
|
+
baseItems: Record<string, SequenceDetailsDto>;
|
|
13
|
+
nextSyncToken: string;
|
|
14
|
+
}
|
|
15
|
+
declare function pullSequenceSync(syncToken?: string): Promise<SequenceSyncResult>;
|
|
16
|
+
/** Build a map of sequence ID β file path from existing local files. */
|
|
17
|
+
declare function buildSequenceIdIndex(dir: string): Promise<Map<string, string>>;
|
|
18
|
+
declare function getSequenceFilePath(sequence: SequenceDetailsDto | LocalSequenceDto): string;
|
|
19
|
+
/** Build segment IDβname and email template IDβname lookup maps. */
|
|
20
|
+
declare function buildLookupMaps(): Promise<{
|
|
21
|
+
segmentMap: SegmentIdNameMap;
|
|
22
|
+
templateMap: EmailTemplateIdNameMap;
|
|
23
|
+
}>;
|
|
24
|
+
interface PullSequencesOptions {
|
|
25
|
+
/** When true, delete all local sequence files and sync token before pulling. */
|
|
26
|
+
reset?: boolean;
|
|
27
|
+
/** Optional remote context for multi-remote sync token isolation. */
|
|
28
|
+
remoteContext?: RemoteContext;
|
|
29
|
+
}
|
|
30
|
+
export declare function pullLeadCMSSequences(optionsOrRemoteCtx?: PullSequencesOptions | RemoteContext): Promise<void>;
|
|
31
|
+
export { pullSequenceSync, buildSequenceIdIndex, getSequenceFilePath, buildLookupMaps };
|
|
32
|
+
//# sourceMappingURL=pull-sequences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-sequences.d.ts","sourceRoot":"","sources":["../../src/scripts/pull-sequences.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,eAAe,CAAC;AAUvB,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI7E,OAAO,KAAK,EACV,kBAAkB,EAElB,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,4BAA4B,CAAC;AAIpC,UAAU,kBAAkB;IAC1B,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB;AA6BD,iBAAe,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoD/E;AAED,wEAAwE;AACxE,iBAAe,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuB7E;AAED,iBAAS,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,MAAM,CAGpF;AAED,oEAAoE;AACpE,iBAAe,eAAe,IAAI,OAAO,CAAC;IAAE,UAAU,EAAE,gBAAgB,CAAC;IAAC,WAAW,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAiB/G;AAED,UAAU,oBAAoB;IAC5B,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,wBAAsB,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,oBAAoB,GAAG,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGnH;AAED,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pull sequences from LeadCMS.
|
|
3
|
+
* Transforms segment IDs β names and emailTemplateId β emailTemplateName
|
|
4
|
+
* for human-readable local files.
|
|
5
|
+
*/
|
|
6
|
+
import "dotenv/config";
|
|
7
|
+
import fs from "fs/promises";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import axios from "axios";
|
|
10
|
+
import { leadCMSUrl, leadCMSApiKey, SEQUENCES_DIR, } from "./leadcms-helpers.js";
|
|
11
|
+
import { leadCMSDataService } from "../lib/data-service.js";
|
|
12
|
+
import { syncTokenPath } from "../lib/remote-context.js";
|
|
13
|
+
import { resetSequencesState } from "./pull-all.js";
|
|
14
|
+
import { logger } from "../lib/logger.js";
|
|
15
|
+
import { toLocalSequence } from "../lib/automation-types.js";
|
|
16
|
+
import { slugify } from "../lib/slugify.js";
|
|
17
|
+
async function readFileOrUndefined(filePath) {
|
|
18
|
+
try {
|
|
19
|
+
return (await fs.readFile(filePath, "utf8")).trim() || undefined;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function readSyncToken(remoteCtx) {
|
|
26
|
+
if (remoteCtx) {
|
|
27
|
+
const tokenPath = syncTokenPath(remoteCtx, "sequences");
|
|
28
|
+
return readFileOrUndefined(tokenPath);
|
|
29
|
+
}
|
|
30
|
+
return readFileOrUndefined(path.join(SEQUENCES_DIR, ".sync-token"));
|
|
31
|
+
}
|
|
32
|
+
async function writeSyncToken(token, remoteCtx) {
|
|
33
|
+
if (remoteCtx) {
|
|
34
|
+
const tokenPath = syncTokenPath(remoteCtx, "sequences");
|
|
35
|
+
await fs.mkdir(path.dirname(tokenPath), { recursive: true });
|
|
36
|
+
await fs.writeFile(tokenPath, token, "utf8");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
await fs.mkdir(SEQUENCES_DIR, { recursive: true });
|
|
40
|
+
await fs.writeFile(path.join(SEQUENCES_DIR, ".sync-token"), token, "utf8");
|
|
41
|
+
}
|
|
42
|
+
async function pullSequenceSync(syncToken) {
|
|
43
|
+
if (!leadCMSUrl) {
|
|
44
|
+
throw new Error("LeadCMS URL is not configured.");
|
|
45
|
+
}
|
|
46
|
+
if (!leadCMSApiKey) {
|
|
47
|
+
throw new Error("LeadCMS API key is required to pull sequences.");
|
|
48
|
+
}
|
|
49
|
+
let allItems = [];
|
|
50
|
+
let allDeleted = [];
|
|
51
|
+
let allBaseItems = {};
|
|
52
|
+
let token = syncToken || "";
|
|
53
|
+
let nextSyncToken = token;
|
|
54
|
+
while (true) {
|
|
55
|
+
const url = new URL("/api/sequences/sync", leadCMSUrl);
|
|
56
|
+
url.searchParams.set("filter[limit]", "100");
|
|
57
|
+
url.searchParams.set("filter[include]", "steps");
|
|
58
|
+
url.searchParams.set("syncToken", token);
|
|
59
|
+
if (syncToken) {
|
|
60
|
+
url.searchParams.set("includeBase", "true");
|
|
61
|
+
}
|
|
62
|
+
const res = await axios.get(url.toString(), {
|
|
63
|
+
headers: { Authorization: `Bearer ${leadCMSApiKey}` },
|
|
64
|
+
});
|
|
65
|
+
if (res.status === 204)
|
|
66
|
+
break;
|
|
67
|
+
const data = res.data || {};
|
|
68
|
+
if (data.items && Array.isArray(data.items)) {
|
|
69
|
+
allItems.push(...data.items);
|
|
70
|
+
}
|
|
71
|
+
if (data.deleted && Array.isArray(data.deleted)) {
|
|
72
|
+
allDeleted.push(...data.deleted);
|
|
73
|
+
}
|
|
74
|
+
if (data.baseItems && typeof data.baseItems === "object") {
|
|
75
|
+
Object.assign(allBaseItems, data.baseItems);
|
|
76
|
+
}
|
|
77
|
+
const newSyncToken = res.headers["x-next-sync-token"] || token;
|
|
78
|
+
if (!newSyncToken || newSyncToken === token) {
|
|
79
|
+
nextSyncToken = newSyncToken || token;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
nextSyncToken = newSyncToken;
|
|
83
|
+
token = newSyncToken;
|
|
84
|
+
}
|
|
85
|
+
return { items: allItems, deleted: allDeleted, baseItems: allBaseItems, nextSyncToken };
|
|
86
|
+
}
|
|
87
|
+
/** Build a map of sequence ID β file path from existing local files. */
|
|
88
|
+
async function buildSequenceIdIndex(dir) {
|
|
89
|
+
const index = new Map();
|
|
90
|
+
let entries;
|
|
91
|
+
try {
|
|
92
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return index;
|
|
96
|
+
}
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
if (!entry.isFile() || !entry.name.endsWith(".json"))
|
|
99
|
+
continue;
|
|
100
|
+
const fullPath = path.join(dir, entry.name);
|
|
101
|
+
try {
|
|
102
|
+
const content = JSON.parse(await fs.readFile(fullPath, "utf8"));
|
|
103
|
+
// Support both flat format and legacy _entityType wrapper
|
|
104
|
+
const id = content?._entityType === "sequence" ? content?.data?.id : content?.id;
|
|
105
|
+
if (id != null) {
|
|
106
|
+
index.set(String(id), fullPath);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch { /* skip unreadable */ }
|
|
110
|
+
}
|
|
111
|
+
return index;
|
|
112
|
+
}
|
|
113
|
+
function getSequenceFilePath(sequence) {
|
|
114
|
+
const slug = slugify(sequence.name) || `sequence-${sequence.id}`;
|
|
115
|
+
return path.join(SEQUENCES_DIR, `${slug}.json`);
|
|
116
|
+
}
|
|
117
|
+
/** Build segment IDβname and email template IDβname lookup maps. */
|
|
118
|
+
async function buildLookupMaps() {
|
|
119
|
+
const [segments, templates] = await Promise.all([
|
|
120
|
+
leadCMSDataService.getAllSegments(),
|
|
121
|
+
leadCMSDataService.getAllEmailTemplates(),
|
|
122
|
+
]);
|
|
123
|
+
const segmentMap = new Map();
|
|
124
|
+
for (const seg of segments) {
|
|
125
|
+
if (seg.id != null)
|
|
126
|
+
segmentMap.set(seg.id, seg.name);
|
|
127
|
+
}
|
|
128
|
+
const templateMap = new Map();
|
|
129
|
+
for (const tpl of templates) {
|
|
130
|
+
if (tpl.id != null && tpl.name)
|
|
131
|
+
templateMap.set(tpl.id, tpl.name);
|
|
132
|
+
}
|
|
133
|
+
return { segmentMap, templateMap };
|
|
134
|
+
}
|
|
135
|
+
export async function pullLeadCMSSequences(optionsOrRemoteCtx) {
|
|
136
|
+
// Support both old signature (RemoteContext) and new options object
|
|
137
|
+
let reset;
|
|
138
|
+
let remoteCtx;
|
|
139
|
+
if (optionsOrRemoteCtx && 'name' in optionsOrRemoteCtx && 'url' in optionsOrRemoteCtx) {
|
|
140
|
+
remoteCtx = optionsOrRemoteCtx;
|
|
141
|
+
}
|
|
142
|
+
else if (optionsOrRemoteCtx) {
|
|
143
|
+
const opts = optionsOrRemoteCtx;
|
|
144
|
+
reset = opts.reset;
|
|
145
|
+
remoteCtx = opts.remoteContext;
|
|
146
|
+
}
|
|
147
|
+
if (reset) {
|
|
148
|
+
console.log(`π Resetting sequences state...\n`);
|
|
149
|
+
await resetSequencesState(remoteCtx);
|
|
150
|
+
}
|
|
151
|
+
const lastSyncToken = await readSyncToken(remoteCtx);
|
|
152
|
+
const { items, deleted, nextSyncToken } = await pullSequenceSync(lastSyncToken);
|
|
153
|
+
let metadataMap;
|
|
154
|
+
const rcModule = remoteCtx ? await import("../lib/remote-context.js") : undefined;
|
|
155
|
+
if (remoteCtx && rcModule) {
|
|
156
|
+
metadataMap = await rcModule.readMetadataMap(remoteCtx);
|
|
157
|
+
}
|
|
158
|
+
const idIndex = (items.length > 0 || deleted.length > 0)
|
|
159
|
+
? await buildSequenceIdIndex(SEQUENCES_DIR)
|
|
160
|
+
: new Map();
|
|
161
|
+
// Build lookup maps for IDβname transformations
|
|
162
|
+
let segmentMap = new Map();
|
|
163
|
+
let templateMap = new Map();
|
|
164
|
+
if (items.length > 0) {
|
|
165
|
+
const maps = await buildLookupMaps();
|
|
166
|
+
segmentMap = maps.segmentMap;
|
|
167
|
+
templateMap = maps.templateMap;
|
|
168
|
+
}
|
|
169
|
+
let newCount = 0;
|
|
170
|
+
let updatedCount = 0;
|
|
171
|
+
for (const sequence of items) {
|
|
172
|
+
const idStr = sequence.id != null ? String(sequence.id) : undefined;
|
|
173
|
+
// Update per-remote metadata
|
|
174
|
+
if (remoteCtx && rcModule && metadataMap && sequence.id != null) {
|
|
175
|
+
rcModule.setSequenceRemoteId(metadataMap, sequence.name, sequence.id);
|
|
176
|
+
rcModule.setMetadataForSequence(metadataMap, sequence.name, {
|
|
177
|
+
id: sequence.id,
|
|
178
|
+
createdAt: sequence.createdAt,
|
|
179
|
+
updatedAt: sequence.updatedAt ?? undefined,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// Remove old file if ID maps to a different path (e.g. rename)
|
|
183
|
+
if (idStr && idIndex.has(idStr)) {
|
|
184
|
+
const oldPath = idIndex.get(idStr);
|
|
185
|
+
const newPath = getSequenceFilePath(sequence);
|
|
186
|
+
if (oldPath !== newPath) {
|
|
187
|
+
try {
|
|
188
|
+
await fs.unlink(oldPath);
|
|
189
|
+
}
|
|
190
|
+
catch { /* ignore */ }
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Transform to local shape
|
|
194
|
+
const localDto = toLocalSequence(sequence, segmentMap, templateMap);
|
|
195
|
+
const filePath = getSequenceFilePath(sequence);
|
|
196
|
+
const content = JSON.stringify(localDto, null, 2) + "\n";
|
|
197
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
198
|
+
const existed = idStr ? idIndex.has(idStr) : false;
|
|
199
|
+
await fs.writeFile(filePath, content, "utf8");
|
|
200
|
+
if (existed) {
|
|
201
|
+
updatedCount++;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
newCount++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Handle deletions
|
|
208
|
+
for (const id of deleted) {
|
|
209
|
+
const filePath = idIndex.get(String(id));
|
|
210
|
+
if (filePath) {
|
|
211
|
+
try {
|
|
212
|
+
await fs.unlink(filePath);
|
|
213
|
+
}
|
|
214
|
+
catch { /* ignore */ }
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Persist metadata
|
|
218
|
+
if (remoteCtx && rcModule && metadataMap && items.length > 0) {
|
|
219
|
+
await rcModule.writeMetadataMap(remoteCtx, metadataMap);
|
|
220
|
+
logger.verbose(`[PULL] Updated metadata-map for remote "${remoteCtx.name}"`);
|
|
221
|
+
}
|
|
222
|
+
if (nextSyncToken) {
|
|
223
|
+
await writeSyncToken(nextSyncToken, remoteCtx);
|
|
224
|
+
}
|
|
225
|
+
if (newCount > 0 || updatedCount > 0 || deleted.length > 0) {
|
|
226
|
+
console.log(`\nπ Sequences sync summary:`);
|
|
227
|
+
if (newCount > 0)
|
|
228
|
+
console.log(` β¨ New: ${newCount}`);
|
|
229
|
+
if (updatedCount > 0)
|
|
230
|
+
console.log(` π Updated: ${updatedCount}`);
|
|
231
|
+
if (deleted.length > 0)
|
|
232
|
+
console.log(` ποΈ Deleted: ${deleted.length}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export { pullSequenceSync, buildSequenceIdIndex, getSequenceFilePath, buildLookupMaps };
|
|
236
|
+
//# sourceMappingURL=pull-sequences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-sequences.js","sourceRoot":"","sources":["../../src/scripts/pull-sequences.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-email-templates.d.ts","sourceRoot":"","sources":["../../src/scripts/push-email-templates.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAoBvB,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE3E,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,uBAAuB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CACzC;AAED,UAAU,cAAc;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,+CAA+C;IAC/C,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAClD,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"push-email-templates.d.ts","sourceRoot":"","sources":["../../src/scripts/push-email-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,13 +10,6 @@ import { leadCMSDataService } from "../lib/data-service.js";
|
|
|
10
10
|
import { pullEmailTemplateSync } from "./pull-leadcms-email-templates.js";
|
|
11
11
|
import { colorConsole, statusColors, diffColors } from "../lib/console-colors.js";
|
|
12
12
|
import { logger } from "../lib/logger.js";
|
|
13
|
-
function slugifySegment(value) {
|
|
14
|
-
return value
|
|
15
|
-
.toLowerCase()
|
|
16
|
-
.trim()
|
|
17
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
18
|
-
.replace(/^-+|-+$/g, "");
|
|
19
|
-
}
|
|
20
13
|
async function isLocaleDirectory(dirPath, parentDir) {
|
|
21
14
|
if (parentDir !== EMAIL_TEMPLATES_DIR) {
|
|
22
15
|
return false;
|
|
@@ -607,7 +600,7 @@ export async function statusEmailTemplates(options = {}) {
|
|
|
607
600
|
const groupLabel = (op.local?.groupFolder || 'ungrouped').padEnd(12);
|
|
608
601
|
const localeLabel = `[${op.local?.locale || defaultLanguage}]`.padEnd(6);
|
|
609
602
|
const nameLabel = op.local?.metadata?.name || 'unknown';
|
|
610
|
-
colorConsole.log(` ${statusColors.created('new
|
|
603
|
+
colorConsole.log(` ${statusColors.created('new: ')} ${groupLabel} ${localeLabel} ${colorConsole.highlight(nameLabel)}`);
|
|
611
604
|
await printDiffPreview(op);
|
|
612
605
|
}
|
|
613
606
|
for (const op of updateOps) {
|