@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.
Files changed (145) hide show
  1. package/dist/cli/bin/login.js +1 -1
  2. package/dist/cli/bin/login.js.map +1 -1
  3. package/dist/cli/bin/pull-all.js +4 -2
  4. package/dist/cli/bin/pull-all.js.map +1 -1
  5. package/dist/cli/bin/pull-comments.js +3 -1
  6. package/dist/cli/bin/pull-comments.js.map +1 -1
  7. package/dist/cli/bin/pull-content.js +4 -2
  8. package/dist/cli/bin/pull-content.js.map +1 -1
  9. package/dist/cli/bin/pull-email-templates.js +3 -1
  10. package/dist/cli/bin/pull-email-templates.js.map +1 -1
  11. package/dist/cli/bin/pull-media.js +3 -1
  12. package/dist/cli/bin/pull-media.js.map +1 -1
  13. package/dist/cli/bin/pull-settings.js +2 -0
  14. package/dist/cli/bin/pull-settings.js.map +1 -1
  15. package/dist/cli/bin/push-all.js +4 -1
  16. package/dist/cli/bin/push-all.js.map +1 -1
  17. package/dist/cli/bin/push-comments.js +2 -0
  18. package/dist/cli/bin/push-comments.js.map +1 -1
  19. package/dist/cli/bin/push-content.js +5 -3
  20. package/dist/cli/bin/push-content.js.map +1 -1
  21. package/dist/cli/bin/push-email-templates.js +3 -1
  22. package/dist/cli/bin/push-email-templates.js.map +1 -1
  23. package/dist/cli/bin/push-media.js +2 -0
  24. package/dist/cli/bin/push-media.js.map +1 -1
  25. package/dist/cli/bin/push-settings.js +2 -0
  26. package/dist/cli/bin/push-settings.js.map +1 -1
  27. package/dist/cli/bin/push.js +5 -3
  28. package/dist/cli/bin/push.js.map +1 -1
  29. package/dist/cli/bin/remote-flag.d.ts +17 -0
  30. package/dist/cli/bin/remote-flag.d.ts.map +1 -0
  31. package/dist/cli/bin/remote-flag.js +50 -0
  32. package/dist/cli/bin/remote-flag.js.map +1 -0
  33. package/dist/cli/bin/remote.d.ts +14 -0
  34. package/dist/cli/bin/remote.d.ts.map +1 -0
  35. package/dist/cli/bin/remote.js +291 -0
  36. package/dist/cli/bin/remote.js.map +1 -0
  37. package/dist/cli/bin/status-all.js +4 -2
  38. package/dist/cli/bin/status-all.js.map +1 -1
  39. package/dist/cli/bin/status-comments.js +2 -0
  40. package/dist/cli/bin/status-comments.js.map +1 -1
  41. package/dist/cli/bin/status-content.js +4 -2
  42. package/dist/cli/bin/status-content.js.map +1 -1
  43. package/dist/cli/bin/status-email-templates.js +3 -1
  44. package/dist/cli/bin/status-email-templates.js.map +1 -1
  45. package/dist/cli/bin/status-media.js +2 -0
  46. package/dist/cli/bin/status-media.js.map +1 -1
  47. package/dist/cli/bin/status-settings.js +2 -0
  48. package/dist/cli/bin/status-settings.js.map +1 -1
  49. package/dist/cli/bin/status.js +5 -2
  50. package/dist/cli/bin/status.js.map +1 -1
  51. package/dist/cli/bin/watch.js +6 -3
  52. package/dist/cli/bin/watch.js.map +1 -1
  53. package/dist/cli/index.js +47 -10
  54. package/dist/cli/index.js.map +1 -1
  55. package/dist/index.js +0 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/lib/auth.d.ts +1 -1
  58. package/dist/lib/auth.d.ts.map +1 -1
  59. package/dist/lib/auth.js +5 -5
  60. package/dist/lib/auth.js.map +1 -1
  61. package/dist/lib/config.d.ts +6 -1
  62. package/dist/lib/config.d.ts.map +1 -1
  63. package/dist/lib/config.js +37 -4
  64. package/dist/lib/config.js.map +1 -1
  65. package/dist/lib/content-transformation.d.ts +5 -0
  66. package/dist/lib/content-transformation.d.ts.map +1 -1
  67. package/dist/lib/content-transformation.js +49 -2
  68. package/dist/lib/content-transformation.js.map +1 -1
  69. package/dist/lib/data-service.d.ts +6 -0
  70. package/dist/lib/data-service.d.ts.map +1 -1
  71. package/dist/lib/data-service.js +11 -0
  72. package/dist/lib/data-service.js.map +1 -1
  73. package/dist/lib/remote-context.d.ts +98 -0
  74. package/dist/lib/remote-context.d.ts.map +1 -0
  75. package/dist/lib/remote-context.js +297 -0
  76. package/dist/lib/remote-context.js.map +1 -0
  77. package/dist/scripts/init-leadcms.d.ts.map +1 -1
  78. package/dist/scripts/init-leadcms.js +127 -15
  79. package/dist/scripts/init-leadcms.js.map +1 -1
  80. package/dist/scripts/leadcms-helpers.d.ts +16 -5
  81. package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
  82. package/dist/scripts/leadcms-helpers.js +31 -8
  83. package/dist/scripts/leadcms-helpers.js.map +1 -1
  84. package/dist/scripts/login-leadcms.d.ts +4 -1
  85. package/dist/scripts/login-leadcms.d.ts.map +1 -1
  86. package/dist/scripts/login-leadcms.js +45 -6
  87. package/dist/scripts/login-leadcms.js.map +1 -1
  88. package/dist/scripts/pull-all.d.ts +14 -6
  89. package/dist/scripts/pull-all.d.ts.map +1 -1
  90. package/dist/scripts/pull-all.js +86 -33
  91. package/dist/scripts/pull-all.js.map +1 -1
  92. package/dist/scripts/pull-comments.d.ts +3 -0
  93. package/dist/scripts/pull-comments.d.ts.map +1 -1
  94. package/dist/scripts/pull-comments.js +4 -4
  95. package/dist/scripts/pull-comments.js.map +1 -1
  96. package/dist/scripts/pull-content.d.ts +3 -0
  97. package/dist/scripts/pull-content.d.ts.map +1 -1
  98. package/dist/scripts/pull-content.js +7 -6
  99. package/dist/scripts/pull-content.js.map +1 -1
  100. package/dist/scripts/pull-email-templates.d.ts +3 -0
  101. package/dist/scripts/pull-email-templates.d.ts.map +1 -1
  102. package/dist/scripts/pull-email-templates.js +4 -4
  103. package/dist/scripts/pull-email-templates.js.map +1 -1
  104. package/dist/scripts/{fetch-leadcms-comments.d.ts → pull-leadcms-comments.d.ts} +7 -6
  105. package/dist/scripts/pull-leadcms-comments.d.ts.map +1 -0
  106. package/dist/scripts/{fetch-leadcms-comments.js → pull-leadcms-comments.js} +56 -28
  107. package/dist/scripts/pull-leadcms-comments.js.map +1 -0
  108. package/dist/scripts/{fetch-leadcms-content.d.ts → pull-leadcms-content.d.ts} +13 -19
  109. package/dist/scripts/pull-leadcms-content.d.ts.map +1 -0
  110. package/dist/scripts/{fetch-leadcms-content.js → pull-leadcms-content.js} +121 -250
  111. package/dist/scripts/pull-leadcms-content.js.map +1 -0
  112. package/dist/scripts/{fetch-leadcms-email-templates.d.ts → pull-leadcms-email-templates.d.ts} +5 -4
  113. package/dist/scripts/pull-leadcms-email-templates.d.ts.map +1 -0
  114. package/dist/scripts/{fetch-leadcms-email-templates.js → pull-leadcms-email-templates.js} +89 -11
  115. package/dist/scripts/pull-leadcms-email-templates.js.map +1 -0
  116. package/dist/scripts/pull-leadcms-media.d.ts +32 -0
  117. package/dist/scripts/pull-leadcms-media.d.ts.map +1 -0
  118. package/dist/scripts/pull-leadcms-media.js +229 -0
  119. package/dist/scripts/pull-leadcms-media.js.map +1 -0
  120. package/dist/scripts/pull-media.d.ts +4 -1
  121. package/dist/scripts/pull-media.d.ts.map +1 -1
  122. package/dist/scripts/pull-media.js +4 -4
  123. package/dist/scripts/pull-media.js.map +1 -1
  124. package/dist/scripts/push-comments.js +3 -3
  125. package/dist/scripts/push-comments.js.map +1 -1
  126. package/dist/scripts/push-email-templates.d.ts +6 -1
  127. package/dist/scripts/push-email-templates.d.ts.map +1 -1
  128. package/dist/scripts/push-email-templates.js +96 -21
  129. package/dist/scripts/push-email-templates.js.map +1 -1
  130. package/dist/scripts/push-leadcms-content.d.ts +9 -3
  131. package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
  132. package/dist/scripts/push-leadcms-content.js +110 -36
  133. package/dist/scripts/push-leadcms-content.js.map +1 -1
  134. package/dist/scripts/sse-watcher.d.ts +9 -8
  135. package/dist/scripts/sse-watcher.d.ts.map +1 -1
  136. package/dist/scripts/sse-watcher.js +59 -52
  137. package/dist/scripts/sse-watcher.js.map +1 -1
  138. package/leadcms.config.json.sample +12 -1
  139. package/package.json +2 -3
  140. package/dist/scripts/fetch-leadcms-comments.d.ts.map +0 -1
  141. package/dist/scripts/fetch-leadcms-comments.js.map +0 -1
  142. package/dist/scripts/fetch-leadcms-content.d.ts.map +0 -1
  143. package/dist/scripts/fetch-leadcms-content.js.map +0 -1
  144. package/dist/scripts/fetch-leadcms-email-templates.d.ts.map +0 -1
  145. 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 { downloadMediaFileDirect, leadCMSUrl, leadCMSApiKey, defaultLanguage, CONTENT_DIR, MEDIA_DIR, fetchContentTypes, } from "./leadcms-helpers.js";
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
- * Read media sync token. Checks new location first, then falls back to legacy.
66
- */
67
- async function readMediaSyncToken() {
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", leadCMSUrl);
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(`[FETCH_CONTENT_SYNC] Page ${page}, URL: ${url.toString()}`);
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(`[FETCH_CONTENT_SYNC] Got 204 No Content - ending sync`);
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(`[FETCH_CONTENT_SYNC] Page ${page} - Got ${data.items?.length || 0} items, ${data.deleted?.length || 0} deleted`);
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(`[FETCH_CONTENT_SYNC] Page ${page} - Got ${Object.keys(data.baseItems).length} base items for merge`);
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(`[FETCH_CONTENT_SYNC] Next sync token: ${newSyncToken}`);
122
+ logger.verbose(`[PULL_CONTENT_SYNC] Next sync token: ${newSyncToken}`);
128
123
  if (!newSyncToken || newSyncToken === token) {
129
124
  nextSyncToken = newSyncToken || token;
130
- logger.verbose(`[FETCH_CONTENT_SYNC] No new sync token - ending sync`);
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(`[FETCH_CONTENT_SYNC] Failed on page ${page}:`, error.message);
133
+ console.error(`[PULL_CONTENT_SYNC] Failed on page ${page}:`, error.message);
139
134
  throw error;
140
135
  }
141
136
  }
142
- logger.verbose(`[FETCH_CONTENT_SYNC] Completed - Total items: ${allItems.length}, deleted: ${allDeleted.length}, base items: ${Object.keys(allBaseItems).length}`);
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: ${leadCMSUrl}`);
345
- logger.verbose(`[ENV] LeadCMS API Key: ${leadCMSApiKey ? `${leadCMSApiKey.substring(0, 8)}...` : "NOT_SET"}`);
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
- logger.verbose(`[ENV] Media Dir: ${MEDIA_DIR}`);
349
- // Check supported entities
350
- logger.verbose(`\n🔍 Checking CMS configuration...`);
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
- let mediaItems = [], mediaDeleted = [], nextMediaSyncToken = "";
375
- // Sync content (only if supported)
376
- if (contentSupported) {
377
- try {
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
- catch (error) {
388
- console.error(`[MAIN] Failed to fetch content:`, error.message);
389
- if (error.response?.status === 401) {
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
- // Sync media (only if supported)
396
- if (mediaSupported) {
397
- try {
398
- if (lastMediaSyncToken) {
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(`Fetched ${items.length} content items, ${deleted.length} deleted.\x1b[0m`);
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(content, contentTypeMap);
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
- // Handle media sync results
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
- if (nextMediaSyncToken) {
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
- if (mediaTokenMigrated) {
604
- await cleanupLegacyMediaSyncToken();
605
- logger.verbose(`[SYNC] Removed legacy media sync token`);
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 fetchLeadCMSContent };
480
+ export { main as pullLeadCMSContent };
610
481
  // Export internal functions for testing
611
482
  export { findAndDeleteContentFile };
612
483
  export { buildContentIdIndex, deleteContentFilesById, extractContentId };
613
- //# sourceMappingURL=fetch-leadcms-content.js.map
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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"}
@@ -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 fetchEmailTemplateSync(syncToken?: string): Promise<EmailTemplateSyncResult>;
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 fetchLeadCMSEmailTemplates(): Promise<void>;
14
- export { buildEmailTemplateIdIndex, deleteEmailTemplateFilesById, saveEmailTemplateFile, fetchEmailTemplateSync };
15
- //# sourceMappingURL=fetch-leadcms-email-templates.d.ts.map
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"}