@leadcms/sdk 3.4.0 → 3.5.0
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/login.js +1 -1
- package/dist/cli/bin/login.js.map +1 -1
- package/dist/cli/bin/pull-all.js +4 -2
- package/dist/cli/bin/pull-all.js.map +1 -1
- package/dist/cli/bin/pull-comments.js +3 -1
- package/dist/cli/bin/pull-comments.js.map +1 -1
- package/dist/cli/bin/pull-content.js +4 -2
- package/dist/cli/bin/pull-content.js.map +1 -1
- package/dist/cli/bin/pull-email-templates.js +3 -1
- package/dist/cli/bin/pull-email-templates.js.map +1 -1
- package/dist/cli/bin/pull-media.js +3 -1
- package/dist/cli/bin/pull-media.js.map +1 -1
- package/dist/cli/bin/pull-settings.js +2 -0
- package/dist/cli/bin/pull-settings.js.map +1 -1
- package/dist/cli/bin/push-all.js +4 -1
- package/dist/cli/bin/push-all.js.map +1 -1
- package/dist/cli/bin/push-comments.js +2 -0
- package/dist/cli/bin/push-comments.js.map +1 -1
- package/dist/cli/bin/push-content.js +5 -3
- package/dist/cli/bin/push-content.js.map +1 -1
- package/dist/cli/bin/push-email-templates.js +3 -1
- package/dist/cli/bin/push-email-templates.js.map +1 -1
- package/dist/cli/bin/push-media.js +2 -0
- package/dist/cli/bin/push-media.js.map +1 -1
- package/dist/cli/bin/push-settings.js +2 -0
- package/dist/cli/bin/push-settings.js.map +1 -1
- package/dist/cli/bin/push.js +5 -3
- package/dist/cli/bin/push.js.map +1 -1
- package/dist/cli/bin/remote-flag.d.ts +17 -0
- package/dist/cli/bin/remote-flag.d.ts.map +1 -0
- package/dist/cli/bin/remote-flag.js +50 -0
- package/dist/cli/bin/remote-flag.js.map +1 -0
- package/dist/cli/bin/remote.d.ts +14 -0
- package/dist/cli/bin/remote.d.ts.map +1 -0
- package/dist/cli/bin/remote.js +291 -0
- package/dist/cli/bin/remote.js.map +1 -0
- package/dist/cli/bin/status-all.js +4 -2
- package/dist/cli/bin/status-all.js.map +1 -1
- package/dist/cli/bin/status-comments.js +2 -0
- package/dist/cli/bin/status-comments.js.map +1 -1
- package/dist/cli/bin/status-content.js +4 -2
- package/dist/cli/bin/status-content.js.map +1 -1
- package/dist/cli/bin/status-email-templates.js +3 -1
- package/dist/cli/bin/status-email-templates.js.map +1 -1
- package/dist/cli/bin/status-media.js +2 -0
- package/dist/cli/bin/status-media.js.map +1 -1
- package/dist/cli/bin/status-settings.js +2 -0
- package/dist/cli/bin/status-settings.js.map +1 -1
- package/dist/cli/bin/status.js +5 -2
- package/dist/cli/bin/status.js.map +1 -1
- package/dist/cli/bin/watch.js +6 -3
- package/dist/cli/bin/watch.js.map +1 -1
- package/dist/cli/index.js +47 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/auth.d.ts +1 -1
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +5 -5
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config.d.ts +6 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +37 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/content-transformation.d.ts +5 -0
- package/dist/lib/content-transformation.d.ts.map +1 -1
- package/dist/lib/content-transformation.js +49 -2
- package/dist/lib/content-transformation.js.map +1 -1
- package/dist/lib/data-service.d.ts +6 -0
- package/dist/lib/data-service.d.ts.map +1 -1
- package/dist/lib/data-service.js +11 -0
- package/dist/lib/data-service.js.map +1 -1
- package/dist/lib/remote-context.d.ts +98 -0
- package/dist/lib/remote-context.d.ts.map +1 -0
- package/dist/lib/remote-context.js +297 -0
- package/dist/lib/remote-context.js.map +1 -0
- package/dist/scripts/init-leadcms.d.ts.map +1 -1
- package/dist/scripts/init-leadcms.js +127 -15
- package/dist/scripts/init-leadcms.js.map +1 -1
- package/dist/scripts/leadcms-helpers.d.ts +16 -5
- package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
- package/dist/scripts/leadcms-helpers.js +31 -8
- package/dist/scripts/leadcms-helpers.js.map +1 -1
- package/dist/scripts/login-leadcms.d.ts +4 -1
- package/dist/scripts/login-leadcms.d.ts.map +1 -1
- package/dist/scripts/login-leadcms.js +45 -6
- package/dist/scripts/login-leadcms.js.map +1 -1
- package/dist/scripts/pull-all.d.ts +14 -6
- package/dist/scripts/pull-all.d.ts.map +1 -1
- package/dist/scripts/pull-all.js +86 -33
- package/dist/scripts/pull-all.js.map +1 -1
- package/dist/scripts/pull-comments.d.ts +3 -0
- package/dist/scripts/pull-comments.d.ts.map +1 -1
- package/dist/scripts/pull-comments.js +4 -4
- package/dist/scripts/pull-comments.js.map +1 -1
- package/dist/scripts/pull-content.d.ts +3 -0
- package/dist/scripts/pull-content.d.ts.map +1 -1
- package/dist/scripts/pull-content.js +7 -6
- package/dist/scripts/pull-content.js.map +1 -1
- package/dist/scripts/pull-email-templates.d.ts +3 -0
- package/dist/scripts/pull-email-templates.d.ts.map +1 -1
- package/dist/scripts/pull-email-templates.js +4 -4
- package/dist/scripts/pull-email-templates.js.map +1 -1
- package/dist/scripts/{fetch-leadcms-comments.d.ts → pull-leadcms-comments.d.ts} +7 -6
- package/dist/scripts/pull-leadcms-comments.d.ts.map +1 -0
- package/dist/scripts/{fetch-leadcms-comments.js → pull-leadcms-comments.js} +56 -28
- package/dist/scripts/pull-leadcms-comments.js.map +1 -0
- package/dist/scripts/{fetch-leadcms-content.d.ts → pull-leadcms-content.d.ts} +13 -19
- package/dist/scripts/pull-leadcms-content.d.ts.map +1 -0
- package/dist/scripts/{fetch-leadcms-content.js → pull-leadcms-content.js} +121 -250
- package/dist/scripts/pull-leadcms-content.js.map +1 -0
- package/dist/scripts/{fetch-leadcms-email-templates.d.ts → pull-leadcms-email-templates.d.ts} +5 -4
- package/dist/scripts/pull-leadcms-email-templates.d.ts.map +1 -0
- package/dist/scripts/{fetch-leadcms-email-templates.js → pull-leadcms-email-templates.js} +89 -11
- package/dist/scripts/pull-leadcms-email-templates.js.map +1 -0
- package/dist/scripts/pull-leadcms-media.d.ts +32 -0
- package/dist/scripts/pull-leadcms-media.d.ts.map +1 -0
- package/dist/scripts/pull-leadcms-media.js +229 -0
- package/dist/scripts/pull-leadcms-media.js.map +1 -0
- package/dist/scripts/pull-media.d.ts +4 -1
- package/dist/scripts/pull-media.d.ts.map +1 -1
- package/dist/scripts/pull-media.js +4 -4
- package/dist/scripts/pull-media.js.map +1 -1
- package/dist/scripts/push-comments.js +3 -3
- package/dist/scripts/push-comments.js.map +1 -1
- package/dist/scripts/push-email-templates.d.ts +6 -1
- package/dist/scripts/push-email-templates.d.ts.map +1 -1
- package/dist/scripts/push-email-templates.js +96 -21
- package/dist/scripts/push-email-templates.js.map +1 -1
- package/dist/scripts/push-leadcms-content.d.ts +9 -3
- package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
- package/dist/scripts/push-leadcms-content.js +110 -36
- package/dist/scripts/push-leadcms-content.js.map +1 -1
- package/dist/scripts/sse-watcher.d.ts +9 -8
- package/dist/scripts/sse-watcher.d.ts.map +1 -1
- package/dist/scripts/sse-watcher.js +59 -52
- package/dist/scripts/sse-watcher.js.map +1 -1
- package/leadcms.config.json.sample +12 -1
- package/package.json +2 -3
- package/dist/scripts/fetch-leadcms-comments.d.ts.map +0 -1
- package/dist/scripts/fetch-leadcms-comments.js.map +0 -1
- package/dist/scripts/fetch-leadcms-content.d.ts.map +0 -1
- package/dist/scripts/fetch-leadcms-content.js.map +0 -1
- package/dist/scripts/fetch-leadcms-email-templates.d.ts.map +0 -1
- package/dist/scripts/fetch-leadcms-email-templates.js.map +0 -1
|
@@ -2,21 +2,19 @@ import "dotenv/config";
|
|
|
2
2
|
import fs from "fs/promises";
|
|
3
3
|
import path from "path";
|
|
4
4
|
import axios from "axios";
|
|
5
|
-
import {
|
|
5
|
+
import { leadCMSUrl, defaultLanguage, CONTENT_DIR, fetchContentTypes, } from "./leadcms-helpers.js";
|
|
6
6
|
import { saveContentFile, transformRemoteToLocalFormat } from "../lib/content-transformation.js";
|
|
7
7
|
import { threeWayMerge, threeWayMergeJson, isLocallyModified } from "../lib/content-merge.js";
|
|
8
8
|
import { getConfig } from "../lib/config.js";
|
|
9
9
|
import { logger } from "../lib/logger.js";
|
|
10
|
+
import { syncTokenPath } from "../lib/remote-context.js";
|
|
10
11
|
const CONTENT_PROGRESS_LOG_INTERVAL = 25;
|
|
11
|
-
const MEDIA_PROGRESS_LOG_INTERVAL = 5;
|
|
12
12
|
// ── Sync token paths ───────────────────────────────────────────────────
|
|
13
13
|
// New location: tokens live *inside* the corresponding data directory.
|
|
14
14
|
const SYNC_TOKEN_PATH = path.join(CONTENT_DIR, ".sync-token");
|
|
15
|
-
const MEDIA_SYNC_TOKEN_PATH = path.join(MEDIA_DIR, ".sync-token");
|
|
16
15
|
// Legacy location (SDK ≤ 3.2): tokens lived in the parent of contentDir.
|
|
17
16
|
// We check these once for migration and then delete them after a successful pull.
|
|
18
17
|
const LEGACY_SYNC_TOKEN_PATH = path.join(path.dirname(CONTENT_DIR), "sync-token.txt");
|
|
19
|
-
const LEGACY_MEDIA_SYNC_TOKEN_PATH = path.join(path.dirname(CONTENT_DIR), "media-sync-token.txt");
|
|
20
18
|
/**
|
|
21
19
|
* Read a file and return its trimmed contents, or undefined if it doesn't exist.
|
|
22
20
|
*/
|
|
@@ -39,8 +37,22 @@ async function unlinkSafe(filePath) {
|
|
|
39
37
|
}
|
|
40
38
|
/**
|
|
41
39
|
* Read content sync token. Checks new location first, then falls back to legacy.
|
|
40
|
+
* When remoteCtx is provided, reads from the remote-specific state directory.
|
|
42
41
|
*/
|
|
43
|
-
async function readSyncToken() {
|
|
42
|
+
async function readSyncToken(remoteCtx) {
|
|
43
|
+
if (remoteCtx) {
|
|
44
|
+
const tokenPath = syncTokenPath(remoteCtx, "content");
|
|
45
|
+
const token = await readFileOrUndefined(tokenPath);
|
|
46
|
+
if (token)
|
|
47
|
+
return { token, migrated: false };
|
|
48
|
+
// Migration: check old single-remote path and move to per-remote path
|
|
49
|
+
const legacyToken = await readFileOrUndefined(SYNC_TOKEN_PATH);
|
|
50
|
+
if (legacyToken) {
|
|
51
|
+
logger.verbose(`[SYNC] Migrating content sync token to remote "${remoteCtx.name}"`);
|
|
52
|
+
return { token: legacyToken, migrated: true };
|
|
53
|
+
}
|
|
54
|
+
return { token: undefined, migrated: false };
|
|
55
|
+
}
|
|
44
56
|
const token = await readFileOrUndefined(SYNC_TOKEN_PATH);
|
|
45
57
|
if (token)
|
|
46
58
|
return { token, migrated: false };
|
|
@@ -51,7 +63,13 @@ async function readSyncToken() {
|
|
|
51
63
|
}
|
|
52
64
|
return { token: undefined, migrated: false };
|
|
53
65
|
}
|
|
54
|
-
async function writeSyncToken(token) {
|
|
66
|
+
async function writeSyncToken(token, remoteCtx) {
|
|
67
|
+
if (remoteCtx) {
|
|
68
|
+
const tokenPath = syncTokenPath(remoteCtx, "content");
|
|
69
|
+
await fs.mkdir(path.dirname(tokenPath), { recursive: true });
|
|
70
|
+
await fs.writeFile(tokenPath, token, "utf8");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
55
73
|
await fs.mkdir(path.dirname(SYNC_TOKEN_PATH), { recursive: true });
|
|
56
74
|
await fs.writeFile(SYNC_TOKEN_PATH, token, "utf8");
|
|
57
75
|
}
|
|
@@ -61,33 +79,10 @@ async function writeSyncToken(token) {
|
|
|
61
79
|
async function cleanupLegacySyncToken() {
|
|
62
80
|
await unlinkSafe(LEGACY_SYNC_TOKEN_PATH);
|
|
63
81
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const token = await readFileOrUndefined(MEDIA_SYNC_TOKEN_PATH);
|
|
69
|
-
if (token)
|
|
70
|
-
return { token, migrated: false };
|
|
71
|
-
const legacy = await readFileOrUndefined(LEGACY_MEDIA_SYNC_TOKEN_PATH);
|
|
72
|
-
if (legacy) {
|
|
73
|
-
logger.verbose(`[SYNC] Migrating media sync token from legacy location`);
|
|
74
|
-
return { token: legacy, migrated: true };
|
|
75
|
-
}
|
|
76
|
-
return { token: undefined, migrated: false };
|
|
77
|
-
}
|
|
78
|
-
async function writeMediaSyncToken(token) {
|
|
79
|
-
await fs.mkdir(path.dirname(MEDIA_SYNC_TOKEN_PATH), { recursive: true });
|
|
80
|
-
await fs.writeFile(MEDIA_SYNC_TOKEN_PATH, token, "utf8");
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Clean up legacy media sync token after successful migration.
|
|
84
|
-
*/
|
|
85
|
-
async function cleanupLegacyMediaSyncToken() {
|
|
86
|
-
await unlinkSafe(LEGACY_MEDIA_SYNC_TOKEN_PATH);
|
|
87
|
-
}
|
|
88
|
-
async function fetchContentSync(syncToken) {
|
|
89
|
-
logger.verbose(`[FETCH_CONTENT_SYNC] Starting with syncToken: ${syncToken || "NONE"}`);
|
|
90
|
-
logger.verbose(`[FETCH_CONTENT_SYNC] Fetching public content (no authentication)`);
|
|
82
|
+
async function pullContentSync(syncToken, baseUrl) {
|
|
83
|
+
const effectiveUrl = baseUrl || leadCMSUrl;
|
|
84
|
+
logger.verbose(`[PULL_CONTENT_SYNC] Starting with syncToken: ${syncToken || "NONE"}`);
|
|
85
|
+
logger.verbose(`[PULL_CONTENT_SYNC] Pulling public content (no authentication)`);
|
|
91
86
|
let allItems = [];
|
|
92
87
|
let allDeleted = [];
|
|
93
88
|
let allBaseItems = {};
|
|
@@ -95,24 +90,24 @@ async function fetchContentSync(syncToken) {
|
|
|
95
90
|
let nextSyncToken = undefined;
|
|
96
91
|
let page = 0;
|
|
97
92
|
while (true) {
|
|
98
|
-
const url = new URL("/api/content/sync",
|
|
93
|
+
const url = new URL("/api/content/sync", effectiveUrl);
|
|
99
94
|
url.searchParams.set("filter[limit]", "100");
|
|
100
95
|
url.searchParams.set("syncToken", token);
|
|
101
96
|
// Request base versions for three-way merge when doing incremental sync
|
|
102
97
|
if (syncToken) {
|
|
103
98
|
url.searchParams.set("includeBase", "true");
|
|
104
99
|
}
|
|
105
|
-
logger.verbose(`[
|
|
100
|
+
logger.verbose(`[PULL_CONTENT_SYNC] Page ${page}, URL: ${url.toString()}`);
|
|
106
101
|
try {
|
|
107
102
|
// SECURITY: Never send API key for read operations
|
|
108
103
|
// Content sync should only return public data
|
|
109
104
|
const res = await axios.get(url.toString());
|
|
110
105
|
if (res.status === 204) {
|
|
111
|
-
logger.verbose(`[
|
|
106
|
+
logger.verbose(`[PULL_CONTENT_SYNC] Got 204 No Content - ending sync`);
|
|
112
107
|
break;
|
|
113
108
|
}
|
|
114
109
|
const data = res.data;
|
|
115
|
-
logger.verbose(`[
|
|
110
|
+
logger.verbose(`[PULL_CONTENT_SYNC] Page ${page} - Got ${data.items?.length || 0} items, ${data.deleted?.length || 0} deleted`);
|
|
116
111
|
if (data.items && Array.isArray(data.items))
|
|
117
112
|
allItems.push(...data.items);
|
|
118
113
|
if (data.deleted && Array.isArray(data.deleted)) {
|
|
@@ -121,13 +116,13 @@ async function fetchContentSync(syncToken) {
|
|
|
121
116
|
// Collect base items for three-way merge support
|
|
122
117
|
if (data.baseItems && typeof data.baseItems === 'object') {
|
|
123
118
|
Object.assign(allBaseItems, data.baseItems);
|
|
124
|
-
logger.verbose(`[
|
|
119
|
+
logger.verbose(`[PULL_CONTENT_SYNC] Page ${page} - Got ${Object.keys(data.baseItems).length} base items for merge`);
|
|
125
120
|
}
|
|
126
121
|
const newSyncToken = res.headers["x-next-sync-token"] || token;
|
|
127
|
-
logger.verbose(`[
|
|
122
|
+
logger.verbose(`[PULL_CONTENT_SYNC] Next sync token: ${newSyncToken}`);
|
|
128
123
|
if (!newSyncToken || newSyncToken === token) {
|
|
129
124
|
nextSyncToken = newSyncToken || token;
|
|
130
|
-
logger.verbose(`[
|
|
125
|
+
logger.verbose(`[PULL_CONTENT_SYNC] No new sync token - ending sync`);
|
|
131
126
|
break;
|
|
132
127
|
}
|
|
133
128
|
nextSyncToken = newSyncToken;
|
|
@@ -135,11 +130,11 @@ async function fetchContentSync(syncToken) {
|
|
|
135
130
|
page++;
|
|
136
131
|
}
|
|
137
132
|
catch (error) {
|
|
138
|
-
console.error(`[
|
|
133
|
+
console.error(`[PULL_CONTENT_SYNC] Failed on page ${page}:`, error.message);
|
|
139
134
|
throw error;
|
|
140
135
|
}
|
|
141
136
|
}
|
|
142
|
-
logger.verbose(`[
|
|
137
|
+
logger.verbose(`[PULL_CONTENT_SYNC] Completed - Total items: ${allItems.length}, deleted: ${allDeleted.length}, base items: ${Object.keys(allBaseItems).length}`);
|
|
143
138
|
return {
|
|
144
139
|
items: allItems,
|
|
145
140
|
deleted: allDeleted,
|
|
@@ -147,79 +142,6 @@ async function fetchContentSync(syncToken) {
|
|
|
147
142
|
nextSyncToken: nextSyncToken || token,
|
|
148
143
|
};
|
|
149
144
|
}
|
|
150
|
-
async function fetchMediaSync(syncToken) {
|
|
151
|
-
logger.verbose(`[FETCH_MEDIA_SYNC] Starting with syncToken: ${syncToken || "NONE"}`);
|
|
152
|
-
logger.verbose(`[FETCH_MEDIA_SYNC] Fetching public media (no authentication)`);
|
|
153
|
-
let allItems = [];
|
|
154
|
-
let allDeleted = [];
|
|
155
|
-
let token = syncToken || "";
|
|
156
|
-
let nextSyncToken = undefined;
|
|
157
|
-
let page = 0;
|
|
158
|
-
while (true) {
|
|
159
|
-
const url = new URL("/api/media/sync", leadCMSUrl);
|
|
160
|
-
url.searchParams.set("filter[limit]", "100");
|
|
161
|
-
url.searchParams.set("syncToken", token);
|
|
162
|
-
logger.verbose(`[FETCH_MEDIA_SYNC] Page ${page}, URL: ${url.toString()}`);
|
|
163
|
-
try {
|
|
164
|
-
// SECURITY: Never send API key for read operations
|
|
165
|
-
// Media sync should only return public files
|
|
166
|
-
const res = await axios.get(url.toString());
|
|
167
|
-
if (res.status === 204) {
|
|
168
|
-
logger.verbose(`[FETCH_MEDIA_SYNC] Got 204 No Content - ending sync`);
|
|
169
|
-
break;
|
|
170
|
-
}
|
|
171
|
-
const data = res.data;
|
|
172
|
-
logger.verbose(`[FETCH_MEDIA_SYNC] Page ${page} - Got ${data.items?.length || 0} items, ${data.deleted?.length || 0} deleted`);
|
|
173
|
-
if (data.items && Array.isArray(data.items))
|
|
174
|
-
allItems.push(...data.items);
|
|
175
|
-
if (data.deleted && Array.isArray(data.deleted)) {
|
|
176
|
-
allDeleted.push(...data.deleted);
|
|
177
|
-
}
|
|
178
|
-
const newSyncToken = res.headers["x-next-sync-token"] || token;
|
|
179
|
-
logger.verbose(`[FETCH_MEDIA_SYNC] Next sync token: ${newSyncToken}`);
|
|
180
|
-
if (!newSyncToken || newSyncToken === token) {
|
|
181
|
-
nextSyncToken = newSyncToken || token;
|
|
182
|
-
logger.verbose(`[FETCH_MEDIA_SYNC] No new sync token - ending sync`);
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
nextSyncToken = newSyncToken;
|
|
186
|
-
token = newSyncToken;
|
|
187
|
-
page++;
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
console.error(`[FETCH_MEDIA_SYNC] Failed on page ${page}:`, error.message);
|
|
191
|
-
throw error;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
logger.verbose(`[FETCH_MEDIA_SYNC] Completed - Total items: ${allItems.length}, deleted: ${allDeleted.length}`);
|
|
195
|
-
return {
|
|
196
|
-
items: allItems,
|
|
197
|
-
deleted: allDeleted,
|
|
198
|
-
nextSyncToken: nextSyncToken || token,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Fetch CMS config to check supported entities
|
|
203
|
-
*/
|
|
204
|
-
async function fetchCMSConfigForEntities() {
|
|
205
|
-
try {
|
|
206
|
-
const { setCMSConfig, isContentSupported, isMediaSupported } = await import('../lib/cms-config-types.js');
|
|
207
|
-
const configUrl = new URL('/api/config', leadCMSUrl).toString();
|
|
208
|
-
const response = await axios.get(configUrl, { timeout: 10000 });
|
|
209
|
-
if (response.data) {
|
|
210
|
-
setCMSConfig(response.data);
|
|
211
|
-
return {
|
|
212
|
-
content: isContentSupported(),
|
|
213
|
-
media: isMediaSupported()
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
catch (error) {
|
|
218
|
-
console.warn(`[FETCH_CONTENT_SYNC] Could not fetch CMS config: ${error.message}`);
|
|
219
|
-
console.warn(`[FETCH_CONTENT_SYNC] Assuming content and media are supported (backward compatibility)`);
|
|
220
|
-
}
|
|
221
|
-
return { content: false, media: false };
|
|
222
|
-
}
|
|
223
145
|
/**
|
|
224
146
|
* Build an index mapping content IDs to their local file paths.
|
|
225
147
|
* Walks the directory tree once and parses every content file to extract its ID,
|
|
@@ -339,82 +261,37 @@ async function findAndDeleteContentFile(dir, idStr) {
|
|
|
339
261
|
}
|
|
340
262
|
}
|
|
341
263
|
async function main(options = {}) {
|
|
342
|
-
const { forceOverwrite = false } = options;
|
|
264
|
+
const { forceOverwrite = false, remoteContext: remoteCtx } = options;
|
|
265
|
+
const effectiveUrl = remoteCtx?.url || leadCMSUrl;
|
|
343
266
|
// Log environment configuration for debugging
|
|
344
|
-
logger.verbose(`[ENV] LeadCMS URL: ${
|
|
345
|
-
|
|
267
|
+
logger.verbose(`[ENV] LeadCMS URL: ${effectiveUrl}`);
|
|
268
|
+
if (remoteCtx) {
|
|
269
|
+
logger.verbose(`[ENV] Remote: ${remoteCtx.name}`);
|
|
270
|
+
}
|
|
346
271
|
logger.verbose(`[ENV] Default Language: ${defaultLanguage}`);
|
|
347
272
|
logger.verbose(`[ENV] Content Dir: ${CONTENT_DIR}`);
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
const { content: contentSupported, media: mediaSupported } = await fetchCMSConfigForEntities();
|
|
352
|
-
if (!contentSupported && !mediaSupported) {
|
|
353
|
-
logger.verbose(`⏭️ Neither Content nor Media entities are supported by this LeadCMS instance - skipping sync`);
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
if (!contentSupported) {
|
|
357
|
-
logger.verbose(`⏭️ Content entity not supported - skipping content sync`);
|
|
358
|
-
}
|
|
359
|
-
if (!mediaSupported) {
|
|
360
|
-
logger.verbose(`⏭️ Media entity not supported - skipping media sync`);
|
|
361
|
-
}
|
|
362
|
-
logger.verbose(`✅ Proceeding with sync\n`);
|
|
363
|
-
// Only create directories for supported entity types
|
|
364
|
-
if (contentSupported) {
|
|
365
|
-
await fs.mkdir(CONTENT_DIR, { recursive: true });
|
|
366
|
-
}
|
|
367
|
-
if (mediaSupported) {
|
|
368
|
-
await fs.mkdir(MEDIA_DIR, { recursive: true });
|
|
369
|
-
}
|
|
370
|
-
const typeMap = await fetchContentTypes();
|
|
371
|
-
const { token: lastSyncToken, migrated: contentTokenMigrated } = await readSyncToken();
|
|
372
|
-
const { token: lastMediaSyncToken, migrated: mediaTokenMigrated } = await readMediaSyncToken();
|
|
273
|
+
await fs.mkdir(CONTENT_DIR, { recursive: true });
|
|
274
|
+
const typeMap = await fetchContentTypes(effectiveUrl);
|
|
275
|
+
const { token: lastSyncToken, migrated: contentTokenMigrated } = await readSyncToken(remoteCtx);
|
|
373
276
|
let items = [], deleted = [], baseItems = {}, nextSyncToken = "";
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
if (lastSyncToken) {
|
|
379
|
-
logger.verbose(`Syncing content from LeadCMS using sync token: ${lastSyncToken}`);
|
|
380
|
-
({ items, deleted, baseItems, nextSyncToken } = await fetchContentSync(lastSyncToken));
|
|
381
|
-
}
|
|
382
|
-
else {
|
|
383
|
-
logger.verbose("No content sync token found. Doing full fetch from LeadCMS...");
|
|
384
|
-
({ items, deleted, baseItems, nextSyncToken } = await fetchContentSync(undefined));
|
|
385
|
-
}
|
|
277
|
+
try {
|
|
278
|
+
if (lastSyncToken) {
|
|
279
|
+
logger.verbose(`Syncing content from LeadCMS using sync token: ${lastSyncToken}`);
|
|
280
|
+
({ items, deleted, baseItems, nextSyncToken } = await pullContentSync(lastSyncToken, effectiveUrl));
|
|
386
281
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
console.error(`[MAIN] Authentication failed - check your LEADCMS_API_KEY`);
|
|
391
|
-
}
|
|
392
|
-
throw error;
|
|
282
|
+
else {
|
|
283
|
+
logger.verbose("No content sync token found. Doing full pull from LeadCMS...");
|
|
284
|
+
({ items, deleted, baseItems, nextSyncToken } = await pullContentSync(undefined, effectiveUrl));
|
|
393
285
|
}
|
|
394
286
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
logger.verbose(`Syncing media from LeadCMS using sync token: ${lastMediaSyncToken}`);
|
|
400
|
-
({ items: mediaItems, deleted: mediaDeleted, nextSyncToken: nextMediaSyncToken } = await fetchMediaSync(lastMediaSyncToken));
|
|
401
|
-
}
|
|
402
|
-
else {
|
|
403
|
-
logger.verbose("No media sync token found. Doing full fetch from LeadCMS...");
|
|
404
|
-
({ items: mediaItems, deleted: mediaDeleted, nextSyncToken: nextMediaSyncToken } = await fetchMediaSync(undefined));
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
catch (error) {
|
|
408
|
-
console.error(`[MAIN] Failed to fetch media:`, error.message);
|
|
409
|
-
if (error.response?.status === 401) {
|
|
410
|
-
console.error(`[MAIN] Authentication failed - check your LEADCMS_API_KEY`);
|
|
411
|
-
}
|
|
412
|
-
// Don't throw here, continue with content sync even if media sync fails
|
|
413
|
-
console.warn(`[MAIN] Continuing without media sync...`);
|
|
287
|
+
catch (error) {
|
|
288
|
+
console.error(`[MAIN] Failed to pull content:`, error.message);
|
|
289
|
+
if (error.response?.status === 401) {
|
|
290
|
+
console.error(`[MAIN] Authentication failed - check your LEADCMS_API_KEY`);
|
|
414
291
|
}
|
|
292
|
+
throw error;
|
|
415
293
|
}
|
|
416
|
-
logger.verbose(`
|
|
417
|
-
logger.verbose(`Fetched ${mediaItems.length} media items, ${mediaDeleted.length} deleted.\x1b[0m`);
|
|
294
|
+
logger.verbose(`Pulled ${items.length} content items, ${deleted.length} deleted.\x1b[0m`);
|
|
418
295
|
// Build an ID→filepath index once instead of walking the tree per item.
|
|
419
296
|
// This turns O(items × files) disk reads into O(files + items).
|
|
420
297
|
const contentIdIndex = (items.length > 0 || deleted.length > 0)
|
|
@@ -432,10 +309,52 @@ async function main(options = {}) {
|
|
|
432
309
|
contentTypeMap[key] = value === 'JSON' ? 'JSON' : 'MDX';
|
|
433
310
|
}
|
|
434
311
|
console.log(`📄 Processing content sync (${items.length} updates, ${deleted.length} deletions)...`);
|
|
312
|
+
// Load per-remote metadata for multi-remote support
|
|
313
|
+
let metadataMap;
|
|
314
|
+
const rcModule = remoteCtx ? await import('../lib/remote-context.js') : undefined;
|
|
315
|
+
if (remoteCtx && rcModule) {
|
|
316
|
+
metadataMap = await rcModule.readMetadataMap(remoteCtx);
|
|
317
|
+
}
|
|
318
|
+
// Load defaultRemote's maps so frontmatter always reflects the default
|
|
319
|
+
// remote's ids and timestamps, even when pulling from another remote.
|
|
320
|
+
let defaultMetadataMap;
|
|
321
|
+
if (remoteCtx && !remoteCtx.isDefault && rcModule) {
|
|
322
|
+
const cfg = getConfig();
|
|
323
|
+
if (cfg.defaultRemote) {
|
|
324
|
+
const defaultCtx = rcModule.resolveRemote(cfg.defaultRemote, cfg);
|
|
325
|
+
defaultMetadataMap = await rcModule.readMetadataMap(defaultCtx);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
435
328
|
let processedContent = 0;
|
|
436
329
|
for (const content of items) {
|
|
437
330
|
if (content && typeof content === "object") {
|
|
438
331
|
const idStr = content.id != null ? String(content.id) : undefined;
|
|
332
|
+
// Update per-remote metadata with this content item's data
|
|
333
|
+
if (remoteCtx && rcModule && metadataMap && content.slug && content.language) {
|
|
334
|
+
if (content.id != null) {
|
|
335
|
+
rcModule.setRemoteId(metadataMap, content.language || defaultLanguage, content.slug, content.id);
|
|
336
|
+
}
|
|
337
|
+
rcModule.setMetadataForContent(metadataMap, content.language || defaultLanguage, content.slug, {
|
|
338
|
+
createdAt: content.createdAt,
|
|
339
|
+
updatedAt: content.updatedAt,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
// For non-default remotes, replace server-generated fields with the
|
|
343
|
+
// defaultRemote's values so frontmatter always reflects prod ids/dates.
|
|
344
|
+
// The current remote's values are already stored in its per-remote maps.
|
|
345
|
+
let contentToSave = content;
|
|
346
|
+
if (remoteCtx && !remoteCtx.isDefault) {
|
|
347
|
+
const { id, createdAt, updatedAt, ...rest } = content;
|
|
348
|
+
const lang = content.language || defaultLanguage;
|
|
349
|
+
const defaultId = defaultMetadataMap?.content[lang]?.[content.slug]?.id;
|
|
350
|
+
const defaultMeta = defaultMetadataMap?.content[lang]?.[content.slug];
|
|
351
|
+
contentToSave = {
|
|
352
|
+
...(defaultId != null ? { id: defaultId } : {}),
|
|
353
|
+
...(defaultMeta?.createdAt ? { createdAt: defaultMeta.createdAt } : {}),
|
|
354
|
+
...(defaultMeta?.updatedAt ? { updatedAt: defaultMeta.updatedAt } : {}),
|
|
355
|
+
...rest,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
439
358
|
// Determine the file path where this content would be saved
|
|
440
359
|
const contentConfig = getConfig();
|
|
441
360
|
const contentLanguage = content.language || contentConfig.defaultLanguage;
|
|
@@ -465,12 +384,14 @@ async function main(options = {}) {
|
|
|
465
384
|
// In forceOverwrite mode (watch/SSE), skip merge entirely to avoid conflicts
|
|
466
385
|
const baseContent = idStr ? baseItems[idStr] : undefined;
|
|
467
386
|
if (!forceOverwrite && localContent && baseContent && hasBaseItems) {
|
|
468
|
-
// Transform both base and remote to local file format for comparison
|
|
387
|
+
// Transform both base and remote to local file format for comparison.
|
|
388
|
+
// Use contentToSave (which may have id/timestamps stripped for non-default remotes)
|
|
389
|
+
// so the merge result matches what will actually be written.
|
|
469
390
|
const baseTransformed = await transformRemoteToLocalFormat(baseContent, contentTypeMap);
|
|
470
|
-
const remoteTransformed = await transformRemoteToLocalFormat(
|
|
391
|
+
const remoteTransformed = await transformRemoteToLocalFormat(contentToSave, contentTypeMap);
|
|
471
392
|
if (!isLocallyModified(baseTransformed, localContent)) {
|
|
472
393
|
// Local file is unchanged from base — safe to overwrite with remote
|
|
473
|
-
await saveContentFile({ content, typeMap, contentDir: CONTENT_DIR });
|
|
394
|
+
await saveContentFile({ content: contentToSave, typeMap, contentDir: CONTENT_DIR });
|
|
474
395
|
overwrittenCount++;
|
|
475
396
|
}
|
|
476
397
|
else {
|
|
@@ -498,7 +419,7 @@ async function main(options = {}) {
|
|
|
498
419
|
}
|
|
499
420
|
else {
|
|
500
421
|
// No base available, file is new, or forceOverwrite — overwrite with remote
|
|
501
|
-
await saveContentFile({ content, typeMap, contentDir: CONTENT_DIR });
|
|
422
|
+
await saveContentFile({ content: contentToSave, typeMap, contentDir: CONTENT_DIR });
|
|
502
423
|
if (localContent) {
|
|
503
424
|
overwrittenCount++;
|
|
504
425
|
}
|
|
@@ -525,6 +446,11 @@ async function main(options = {}) {
|
|
|
525
446
|
if (conflictCount > 0)
|
|
526
447
|
console.log(` ⚠️ Conflicts (need manual resolution): ${conflictCount}`);
|
|
527
448
|
}
|
|
449
|
+
// Persist per-remote metadata after processing all content items
|
|
450
|
+
if (remoteCtx && rcModule && metadataMap && items.length > 0) {
|
|
451
|
+
await rcModule.writeMetadataMap(remoteCtx, metadataMap);
|
|
452
|
+
logger.verbose(`[PULL] Updated metadata-map for remote "${remoteCtx.name}"`);
|
|
453
|
+
}
|
|
528
454
|
// Remove deleted content files from all language directories
|
|
529
455
|
if (deleted.length > 0) {
|
|
530
456
|
console.log(`🗑️ Removing deleted content files (${deleted.length})...`);
|
|
@@ -535,79 +461,24 @@ async function main(options = {}) {
|
|
|
535
461
|
if (items.length === 0 && deleted.length === 0) {
|
|
536
462
|
console.log(`No content changes detected.`);
|
|
537
463
|
}
|
|
538
|
-
//
|
|
539
|
-
console.log(`🖼️ Processing media sync (${mediaItems.length} downloads, ${mediaDeleted.length} deletions)...`);
|
|
540
|
-
if (mediaItems.length > 0) {
|
|
541
|
-
logger.verbose(`\nProcessing media changes...`);
|
|
542
|
-
// Download new/updated media files
|
|
543
|
-
let downloaded = 0;
|
|
544
|
-
let attemptedDownloads = 0;
|
|
545
|
-
for (const mediaItem of mediaItems) {
|
|
546
|
-
if (mediaItem.location) {
|
|
547
|
-
attemptedDownloads++;
|
|
548
|
-
if (attemptedDownloads === 1
|
|
549
|
-
|| attemptedDownloads % MEDIA_PROGRESS_LOG_INTERVAL === 0
|
|
550
|
-
|| attemptedDownloads === mediaItems.length) {
|
|
551
|
-
console.log(` ⬇️ Media download progress: ${attemptedDownloads}/${mediaItems.length}`);
|
|
552
|
-
}
|
|
553
|
-
const relPath = mediaItem.location.replace(/^\/api\/media\//, "");
|
|
554
|
-
const destPath = path.join(MEDIA_DIR, relPath);
|
|
555
|
-
const didDownload = await downloadMediaFileDirect(mediaItem.location, destPath, leadCMSUrl || "", leadCMSApiKey || "");
|
|
556
|
-
if (didDownload) {
|
|
557
|
-
logger.verbose(`Downloaded: ${mediaItem.location} -> ${destPath}`);
|
|
558
|
-
downloaded++;
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
console.log(`Done. ${downloaded} media files downloaded.`);
|
|
563
|
-
}
|
|
564
|
-
else if (mediaDeleted.length === 0) {
|
|
565
|
-
console.log(`No media changes detected.`);
|
|
566
|
-
}
|
|
567
|
-
// Remove deleted media files from local filesystem
|
|
568
|
-
if (mediaDeleted.length > 0) {
|
|
569
|
-
console.log(`Removing ${mediaDeleted.length} deleted media files...`);
|
|
570
|
-
let removedCount = 0;
|
|
571
|
-
for (const deletedMedia of mediaDeleted) {
|
|
572
|
-
const relPath = deletedMedia.scopeUid
|
|
573
|
-
? path.join(deletedMedia.scopeUid, deletedMedia.name)
|
|
574
|
-
: deletedMedia.name;
|
|
575
|
-
const fullPath = path.join(MEDIA_DIR, relPath);
|
|
576
|
-
try {
|
|
577
|
-
await fs.unlink(fullPath);
|
|
578
|
-
logger.verbose(`Deleted media: ${fullPath}`);
|
|
579
|
-
removedCount++;
|
|
580
|
-
}
|
|
581
|
-
catch (err) {
|
|
582
|
-
if (err.code !== 'ENOENT') {
|
|
583
|
-
console.warn(`Warning: Could not delete media file ${fullPath}:`, err.message);
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
console.log(`Done. ${removedCount} media files removed.`);
|
|
588
|
-
}
|
|
589
|
-
// Save new sync tokens
|
|
464
|
+
// Save new sync token
|
|
590
465
|
if (nextSyncToken) {
|
|
591
|
-
await writeSyncToken(nextSyncToken);
|
|
466
|
+
await writeSyncToken(nextSyncToken, remoteCtx);
|
|
592
467
|
logger.verbose(`Content sync token updated: ${nextSyncToken}`);
|
|
593
468
|
}
|
|
594
|
-
|
|
595
|
-
await writeMediaSyncToken(nextMediaSyncToken);
|
|
596
|
-
logger.verbose(`Media sync token updated: ${nextMediaSyncToken}`);
|
|
597
|
-
}
|
|
598
|
-
// Clean up legacy sync tokens after a successful pull
|
|
469
|
+
// Clean up legacy sync token after a successful pull
|
|
599
470
|
if (contentTokenMigrated) {
|
|
600
471
|
await cleanupLegacySyncToken();
|
|
601
472
|
logger.verbose(`[SYNC] Removed legacy content sync token`);
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
473
|
+
// Also clean up old single-remote path when migrating to multi-remote
|
|
474
|
+
if (remoteCtx) {
|
|
475
|
+
await unlinkSafe(SYNC_TOKEN_PATH);
|
|
476
|
+
}
|
|
606
477
|
}
|
|
607
478
|
}
|
|
608
479
|
// Export the main function so it can be imported by other modules
|
|
609
|
-
export { main as
|
|
480
|
+
export { main as pullLeadCMSContent };
|
|
610
481
|
// Export internal functions for testing
|
|
611
482
|
export { findAndDeleteContentFile };
|
|
612
483
|
export { buildContentIdIndex, deleteContentFilesById, extractContentId };
|
|
613
|
-
//# sourceMappingURL=
|
|
484
|
+
//# sourceMappingURL=pull-leadcms-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-leadcms-content.js","sourceRoot":"","sources":["../../src/scripts/pull-leadcms-content.ts"],"names":[],"mappings":"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"}
|
package/dist/scripts/{fetch-leadcms-email-templates.d.ts → pull-leadcms-email-templates.d.ts}
RENAMED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import "dotenv/config";
|
|
2
2
|
import { type EmailTemplateRemoteData } from "../lib/email-template-transformation.js";
|
|
3
|
+
import { type RemoteContext } from "../lib/remote-context.js";
|
|
3
4
|
interface EmailTemplateSyncResult {
|
|
4
5
|
items: EmailTemplateRemoteData[];
|
|
5
6
|
deleted: number[];
|
|
6
7
|
baseItems: Record<string, EmailTemplateRemoteData>;
|
|
7
8
|
nextSyncToken: string;
|
|
8
9
|
}
|
|
9
|
-
declare function
|
|
10
|
+
declare function pullEmailTemplateSync(syncToken?: string): Promise<EmailTemplateSyncResult>;
|
|
10
11
|
declare function saveEmailTemplateFile(template: EmailTemplateRemoteData): Promise<string>;
|
|
11
12
|
declare function buildEmailTemplateIdIndex(dir: string): Promise<Map<string, string[]>>;
|
|
12
13
|
declare function deleteEmailTemplateFilesById(index: Map<string, string[]>, id: string): Promise<void>;
|
|
13
|
-
export declare function
|
|
14
|
-
export { buildEmailTemplateIdIndex, deleteEmailTemplateFilesById, saveEmailTemplateFile,
|
|
15
|
-
//# sourceMappingURL=
|
|
14
|
+
export declare function pullLeadCMSEmailTemplates(remoteCtx?: RemoteContext): Promise<void>;
|
|
15
|
+
export { buildEmailTemplateIdIndex, deleteEmailTemplateFilesById, saveEmailTemplateFile, pullEmailTemplateSync };
|
|
16
|
+
//# sourceMappingURL=pull-leadcms-email-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-leadcms-email-templates.d.ts","sourceRoot":"","sources":["../../src/scripts/pull-leadcms-email-templates.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAUvB,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAW7E,UAAU,uBAAuB;IAC/B,KAAK,EAAE,uBAAuB,EAAE,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACnD,aAAa,EAAE,MAAM,CAAC;CACvB;AA8CD,iBAAe,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA8DzF;AA+CD,iBAAe,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMvF;AAED,iBAAe,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAyCpF;AAED,iBAAe,4BAA4B,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAanG;AAED,wBAAsB,yBAAyB,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4JxF;AAED,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,CAAC"}
|