@leadcms/sdk 3.3.12 → 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 (165) hide show
  1. package/README.md +2 -1
  2. package/dist/cli/bin/content-status-args.d.ts +7 -0
  3. package/dist/cli/bin/content-status-args.d.ts.map +1 -0
  4. package/dist/cli/bin/content-status-args.js +27 -0
  5. package/dist/cli/bin/content-status-args.js.map +1 -0
  6. package/dist/cli/bin/login.js +1 -1
  7. package/dist/cli/bin/login.js.map +1 -1
  8. package/dist/cli/bin/pull-all.js +4 -2
  9. package/dist/cli/bin/pull-all.js.map +1 -1
  10. package/dist/cli/bin/pull-comments.js +3 -1
  11. package/dist/cli/bin/pull-comments.js.map +1 -1
  12. package/dist/cli/bin/pull-content.js +6 -2
  13. package/dist/cli/bin/pull-content.js.map +1 -1
  14. package/dist/cli/bin/pull-email-templates.js +3 -1
  15. package/dist/cli/bin/pull-email-templates.js.map +1 -1
  16. package/dist/cli/bin/pull-media.js +3 -1
  17. package/dist/cli/bin/pull-media.js.map +1 -1
  18. package/dist/cli/bin/pull-settings.js +2 -0
  19. package/dist/cli/bin/pull-settings.js.map +1 -1
  20. package/dist/cli/bin/push-all.js +12 -1
  21. package/dist/cli/bin/push-all.js.map +1 -1
  22. package/dist/cli/bin/push-comments.d.ts +6 -0
  23. package/dist/cli/bin/push-comments.d.ts.map +1 -0
  24. package/dist/cli/bin/push-comments.js +35 -0
  25. package/dist/cli/bin/push-comments.js.map +1 -0
  26. package/dist/cli/bin/push-content.js +7 -4
  27. package/dist/cli/bin/push-content.js.map +1 -1
  28. package/dist/cli/bin/push-email-templates.js +3 -1
  29. package/dist/cli/bin/push-email-templates.js.map +1 -1
  30. package/dist/cli/bin/push-media.js +2 -0
  31. package/dist/cli/bin/push-media.js.map +1 -1
  32. package/dist/cli/bin/push-settings.js +2 -0
  33. package/dist/cli/bin/push-settings.js.map +1 -1
  34. package/dist/cli/bin/push.js +5 -3
  35. package/dist/cli/bin/push.js.map +1 -1
  36. package/dist/cli/bin/remote-flag.d.ts +17 -0
  37. package/dist/cli/bin/remote-flag.d.ts.map +1 -0
  38. package/dist/cli/bin/remote-flag.js +50 -0
  39. package/dist/cli/bin/remote-flag.js.map +1 -0
  40. package/dist/cli/bin/remote.d.ts +14 -0
  41. package/dist/cli/bin/remote.d.ts.map +1 -0
  42. package/dist/cli/bin/remote.js +291 -0
  43. package/dist/cli/bin/remote.js.map +1 -0
  44. package/dist/cli/bin/status-all.js +67 -4
  45. package/dist/cli/bin/status-all.js.map +1 -1
  46. package/dist/cli/bin/status-comments.d.ts +6 -0
  47. package/dist/cli/bin/status-comments.d.ts.map +1 -0
  48. package/dist/cli/bin/status-comments.js +30 -0
  49. package/dist/cli/bin/status-comments.js.map +1 -0
  50. package/dist/cli/bin/status-content.js +6 -2
  51. package/dist/cli/bin/status-content.js.map +1 -1
  52. package/dist/cli/bin/status-email-templates.js +3 -1
  53. package/dist/cli/bin/status-email-templates.js.map +1 -1
  54. package/dist/cli/bin/status-media.js +2 -0
  55. package/dist/cli/bin/status-media.js.map +1 -1
  56. package/dist/cli/bin/status-settings.js +2 -0
  57. package/dist/cli/bin/status-settings.js.map +1 -1
  58. package/dist/cli/bin/status.js +5 -2
  59. package/dist/cli/bin/status.js.map +1 -1
  60. package/dist/cli/bin/watch.js +6 -3
  61. package/dist/cli/bin/watch.js.map +1 -1
  62. package/dist/cli/index.js +65 -10
  63. package/dist/cli/index.js.map +1 -1
  64. package/dist/index.js +0 -1
  65. package/dist/index.js.map +1 -1
  66. package/dist/lib/auth.d.ts +1 -1
  67. package/dist/lib/auth.d.ts.map +1 -1
  68. package/dist/lib/auth.js +5 -5
  69. package/dist/lib/auth.js.map +1 -1
  70. package/dist/lib/cms.d.ts +7 -7
  71. package/dist/lib/cms.d.ts.map +1 -1
  72. package/dist/lib/cms.js +41 -7
  73. package/dist/lib/cms.js.map +1 -1
  74. package/dist/lib/comment-types.d.ts +4 -0
  75. package/dist/lib/comment-types.d.ts.map +1 -1
  76. package/dist/lib/config.d.ts +6 -1
  77. package/dist/lib/config.d.ts.map +1 -1
  78. package/dist/lib/config.js +37 -8
  79. package/dist/lib/config.js.map +1 -1
  80. package/dist/lib/content-merge.d.ts.map +1 -1
  81. package/dist/lib/content-merge.js +102 -19
  82. package/dist/lib/content-merge.js.map +1 -1
  83. package/dist/lib/content-transformation.d.ts +5 -0
  84. package/dist/lib/content-transformation.d.ts.map +1 -1
  85. package/dist/lib/content-transformation.js +49 -2
  86. package/dist/lib/content-transformation.js.map +1 -1
  87. package/dist/lib/data-service.d.ts +47 -1
  88. package/dist/lib/data-service.d.ts.map +1 -1
  89. package/dist/lib/data-service.js +143 -0
  90. package/dist/lib/data-service.js.map +1 -1
  91. package/dist/lib/remote-context.d.ts +98 -0
  92. package/dist/lib/remote-context.d.ts.map +1 -0
  93. package/dist/lib/remote-context.js +297 -0
  94. package/dist/lib/remote-context.js.map +1 -0
  95. package/dist/scripts/init-leadcms.d.ts.map +1 -1
  96. package/dist/scripts/init-leadcms.js +127 -15
  97. package/dist/scripts/init-leadcms.js.map +1 -1
  98. package/dist/scripts/leadcms-helpers.d.ts +16 -5
  99. package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
  100. package/dist/scripts/leadcms-helpers.js +31 -8
  101. package/dist/scripts/leadcms-helpers.js.map +1 -1
  102. package/dist/scripts/login-leadcms.d.ts +4 -1
  103. package/dist/scripts/login-leadcms.d.ts.map +1 -1
  104. package/dist/scripts/login-leadcms.js +45 -6
  105. package/dist/scripts/login-leadcms.js.map +1 -1
  106. package/dist/scripts/pull-all.d.ts +14 -6
  107. package/dist/scripts/pull-all.d.ts.map +1 -1
  108. package/dist/scripts/pull-all.js +86 -33
  109. package/dist/scripts/pull-all.js.map +1 -1
  110. package/dist/scripts/pull-comments.d.ts +3 -0
  111. package/dist/scripts/pull-comments.d.ts.map +1 -1
  112. package/dist/scripts/pull-comments.js +4 -4
  113. package/dist/scripts/pull-comments.js.map +1 -1
  114. package/dist/scripts/pull-content.d.ts +14 -0
  115. package/dist/scripts/pull-content.d.ts.map +1 -1
  116. package/dist/scripts/pull-content.js +85 -8
  117. package/dist/scripts/pull-content.js.map +1 -1
  118. package/dist/scripts/pull-email-templates.d.ts +3 -0
  119. package/dist/scripts/pull-email-templates.d.ts.map +1 -1
  120. package/dist/scripts/pull-email-templates.js +4 -4
  121. package/dist/scripts/pull-email-templates.js.map +1 -1
  122. package/dist/scripts/{fetch-leadcms-comments.d.ts → pull-leadcms-comments.d.ts} +10 -4
  123. package/dist/scripts/pull-leadcms-comments.d.ts.map +1 -0
  124. package/dist/scripts/{fetch-leadcms-comments.js → pull-leadcms-comments.js} +62 -32
  125. package/dist/scripts/pull-leadcms-comments.js.map +1 -0
  126. package/dist/scripts/{fetch-leadcms-content.d.ts → pull-leadcms-content.d.ts} +13 -19
  127. package/dist/scripts/pull-leadcms-content.d.ts.map +1 -0
  128. package/dist/scripts/{fetch-leadcms-content.js → pull-leadcms-content.js} +121 -250
  129. package/dist/scripts/pull-leadcms-content.js.map +1 -0
  130. package/dist/scripts/{fetch-leadcms-email-templates.d.ts → pull-leadcms-email-templates.d.ts} +5 -4
  131. package/dist/scripts/pull-leadcms-email-templates.d.ts.map +1 -0
  132. package/dist/scripts/{fetch-leadcms-email-templates.js → pull-leadcms-email-templates.js} +89 -11
  133. package/dist/scripts/pull-leadcms-email-templates.js.map +1 -0
  134. package/dist/scripts/pull-leadcms-media.d.ts +32 -0
  135. package/dist/scripts/pull-leadcms-media.d.ts.map +1 -0
  136. package/dist/scripts/pull-leadcms-media.js +229 -0
  137. package/dist/scripts/pull-leadcms-media.js.map +1 -0
  138. package/dist/scripts/pull-media.d.ts +4 -1
  139. package/dist/scripts/pull-media.d.ts.map +1 -1
  140. package/dist/scripts/pull-media.js +4 -4
  141. package/dist/scripts/pull-media.js.map +1 -1
  142. package/dist/scripts/push-comments.d.ts +48 -0
  143. package/dist/scripts/push-comments.d.ts.map +1 -0
  144. package/dist/scripts/push-comments.js +433 -0
  145. package/dist/scripts/push-comments.js.map +1 -0
  146. package/dist/scripts/push-email-templates.d.ts +6 -1
  147. package/dist/scripts/push-email-templates.d.ts.map +1 -1
  148. package/dist/scripts/push-email-templates.js +96 -21
  149. package/dist/scripts/push-email-templates.js.map +1 -1
  150. package/dist/scripts/push-leadcms-content.d.ts +24 -8
  151. package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
  152. package/dist/scripts/push-leadcms-content.js +192 -56
  153. package/dist/scripts/push-leadcms-content.js.map +1 -1
  154. package/dist/scripts/sse-watcher.d.ts +9 -8
  155. package/dist/scripts/sse-watcher.d.ts.map +1 -1
  156. package/dist/scripts/sse-watcher.js +59 -52
  157. package/dist/scripts/sse-watcher.js.map +1 -1
  158. package/leadcms.config.json.sample +12 -1
  159. package/package.json +2 -3
  160. package/dist/scripts/fetch-leadcms-comments.d.ts.map +0 -1
  161. package/dist/scripts/fetch-leadcms-comments.js.map +0 -1
  162. package/dist/scripts/fetch-leadcms-content.d.ts.map +0 -1
  163. package/dist/scripts/fetch-leadcms-content.js.map +0 -1
  164. package/dist/scripts/fetch-leadcms-email-templates.d.ts.map +0 -1
  165. package/dist/scripts/fetch-leadcms-email-templates.js.map +0 -1
@@ -6,6 +6,9 @@ import { leadCMSUrl, leadCMSApiKey, defaultLanguage, EMAIL_TEMPLATES_DIR, } from
6
6
  import { parseEmailTemplateFileContent, transformEmailTemplateRemoteToLocalFormat, } from "../lib/email-template-transformation.js";
7
7
  import { threeWayMerge, isLocallyModified } from "../lib/content-merge.js";
8
8
  import { leadCMSDataService } from "../lib/data-service.js";
9
+ import { syncTokenPath } from "../lib/remote-context.js";
10
+ import { getConfig } from "../lib/config.js";
11
+ import { logger } from "../lib/logger.js";
9
12
  const SYNC_TOKEN_PATH = path.join(EMAIL_TEMPLATES_DIR, ".sync-token");
10
13
  async function readFileOrUndefined(filePath) {
11
14
  try {
@@ -15,16 +18,43 @@ async function readFileOrUndefined(filePath) {
15
18
  return undefined;
16
19
  }
17
20
  }
18
- async function writeSyncToken(token) {
21
+ /**
22
+ * Read the email-templates sync token.
23
+ * When remoteCtx is provided, reads from the remote-specific state directory.
24
+ */
25
+ async function readSyncToken(remoteCtx) {
26
+ if (remoteCtx) {
27
+ const tokenPath = syncTokenPath(remoteCtx, "email-templates");
28
+ const token = await readFileOrUndefined(tokenPath);
29
+ if (token)
30
+ return { token, migrated: false };
31
+ // Migration: check old single-remote path
32
+ const legacyToken = await readFileOrUndefined(SYNC_TOKEN_PATH);
33
+ if (legacyToken) {
34
+ logger.verbose(`[SYNC] Migrating email-templates sync token to remote "${remoteCtx.name}"`);
35
+ return { token: legacyToken, migrated: true };
36
+ }
37
+ return { token: undefined, migrated: false };
38
+ }
39
+ const token = await readFileOrUndefined(SYNC_TOKEN_PATH);
40
+ return { token, migrated: false };
41
+ }
42
+ async function writeSyncToken(token, remoteCtx) {
43
+ if (remoteCtx) {
44
+ const tokenPath = syncTokenPath(remoteCtx, "email-templates");
45
+ await fs.mkdir(path.dirname(tokenPath), { recursive: true });
46
+ await fs.writeFile(tokenPath, token, "utf8");
47
+ return;
48
+ }
19
49
  await fs.mkdir(path.dirname(SYNC_TOKEN_PATH), { recursive: true });
20
50
  await fs.writeFile(SYNC_TOKEN_PATH, token, "utf8");
21
51
  }
22
- async function fetchEmailTemplateSync(syncToken) {
52
+ async function pullEmailTemplateSync(syncToken) {
23
53
  if (!leadCMSUrl) {
24
54
  throw new Error("LeadCMS URL is not configured.");
25
55
  }
26
56
  if (!leadCMSApiKey) {
27
- throw new Error("LeadCMS API key is required to fetch email templates.");
57
+ throw new Error("LeadCMS API key is required to pull email templates.");
28
58
  }
29
59
  let allItems = [];
30
60
  let allDeleted = [];
@@ -171,9 +201,25 @@ async function deleteEmailTemplateFilesById(index, id) {
171
201
  }
172
202
  index.delete(id);
173
203
  }
174
- export async function fetchLeadCMSEmailTemplates() {
175
- const lastSyncToken = await readFileOrUndefined(SYNC_TOKEN_PATH);
176
- const { items, deleted, baseItems, nextSyncToken } = await fetchEmailTemplateSync(lastSyncToken);
204
+ export async function pullLeadCMSEmailTemplates(remoteCtx) {
205
+ const { token: lastSyncToken } = await readSyncToken(remoteCtx);
206
+ const { items, deleted, baseItems, nextSyncToken } = await pullEmailTemplateSync(lastSyncToken);
207
+ // Load per-remote metadata for multi-remote support
208
+ let metadataMap;
209
+ const rcModule = remoteCtx ? await import('../lib/remote-context.js') : undefined;
210
+ if (remoteCtx && rcModule) {
211
+ metadataMap = await rcModule.readMetadataMap(remoteCtx);
212
+ }
213
+ // Load defaultRemote's maps so frontmatter always reflects the default
214
+ // remote's ids and timestamps, even when pulling from another remote.
215
+ let defaultMetadataMap;
216
+ if (remoteCtx && !remoteCtx.isDefault && rcModule) {
217
+ const cfg = getConfig();
218
+ if (cfg.defaultRemote) {
219
+ const defaultCtx = rcModule.resolveRemote(cfg.defaultRemote, cfg);
220
+ defaultMetadataMap = await rcModule.readMetadataMap(defaultCtx);
221
+ }
222
+ }
177
223
  // The sync API returns emailGroup: null — resolve from the groups endpoint
178
224
  if (items.length > 0) {
179
225
  const emailGroups = await leadCMSDataService.getAllEmailGroups();
@@ -207,6 +253,33 @@ export async function fetchLeadCMSEmailTemplates() {
207
253
  for (const template of items) {
208
254
  const idStr = template.id != null ? String(template.id) : undefined;
209
255
  const filePath = getEmailTemplateFilePath(template);
256
+ // Update per-remote metadata with this template's data
257
+ if (remoteCtx && rcModule && metadataMap && template.name && template.language) {
258
+ if (template.id != null) {
259
+ rcModule.setEmailTemplateRemoteId(metadataMap, template.language || defaultLanguage, template.name, template.id);
260
+ }
261
+ rcModule.setMetadataForEmailTemplate(metadataMap, template.language || defaultLanguage, template.name, {
262
+ createdAt: template.createdAt,
263
+ updatedAt: template.updatedAt ?? undefined,
264
+ });
265
+ }
266
+ // For non-default remotes, replace server-generated fields with the
267
+ // defaultRemote's values so frontmatter always reflects prod ids/dates.
268
+ // The current remote's values are already stored in its per-remote maps.
269
+ let templateToSave = template;
270
+ if (remoteCtx && !remoteCtx.isDefault) {
271
+ const { id, createdAt, updatedAt, ...rest } = template;
272
+ const lang = template.language || defaultLanguage;
273
+ const name = template.name || '';
274
+ const defaultId = defaultMetadataMap?.emailTemplates?.[lang]?.[name]?.id;
275
+ const defaultMeta = defaultMetadataMap?.emailTemplates?.[lang]?.[name];
276
+ templateToSave = {
277
+ ...(defaultId != null ? { id: defaultId } : {}),
278
+ ...(defaultMeta?.createdAt ? { createdAt: defaultMeta.createdAt } : {}),
279
+ ...(defaultMeta?.updatedAt ? { updatedAt: defaultMeta.updatedAt } : {}),
280
+ ...rest,
281
+ };
282
+ }
210
283
  let localContent = null;
211
284
  try {
212
285
  localContent = await fs.readFile(filePath, "utf8");
@@ -220,7 +293,7 @@ export async function fetchLeadCMSEmailTemplates() {
220
293
  const baseTemplate = idStr ? baseItems[idStr] : undefined;
221
294
  if (localContent && baseTemplate && hasBaseItems) {
222
295
  const baseTransformed = transformEmailTemplateRemoteToLocalFormat(baseTemplate);
223
- const remoteTransformed = transformEmailTemplateRemoteToLocalFormat(template);
296
+ const remoteTransformed = transformEmailTemplateRemoteToLocalFormat(templateToSave);
224
297
  if (!isLocallyModified(baseTransformed, localContent)) {
225
298
  await fs.mkdir(path.dirname(filePath), { recursive: true });
226
299
  await fs.writeFile(filePath, remoteTransformed, "utf8");
@@ -241,7 +314,7 @@ export async function fetchLeadCMSEmailTemplates() {
241
314
  }
242
315
  }
243
316
  else {
244
- await saveEmailTemplateFile(template);
317
+ await saveEmailTemplateFile(templateToSave);
245
318
  if (localContent) {
246
319
  overwrittenCount++;
247
320
  }
@@ -264,9 +337,14 @@ export async function fetchLeadCMSEmailTemplates() {
264
337
  for (const id of deleted) {
265
338
  await deleteEmailTemplateFilesById(idIndex, String(id));
266
339
  }
340
+ // Persist per-remote metadata after processing all templates
341
+ if (remoteCtx && rcModule && metadataMap && items.length > 0) {
342
+ await rcModule.writeMetadataMap(remoteCtx, metadataMap);
343
+ logger.verbose(`[PULL] Updated metadata-map for remote "${remoteCtx.name}"`);
344
+ }
267
345
  if (nextSyncToken) {
268
- await writeSyncToken(nextSyncToken);
346
+ await writeSyncToken(nextSyncToken, remoteCtx);
269
347
  }
270
348
  }
271
- export { buildEmailTemplateIdIndex, deleteEmailTemplateFilesById, saveEmailTemplateFile, fetchEmailTemplateSync };
272
- //# sourceMappingURL=fetch-leadcms-email-templates.js.map
349
+ export { buildEmailTemplateIdIndex, deleteEmailTemplateFilesById, saveEmailTemplateFile, pullEmailTemplateSync };
350
+ //# sourceMappingURL=pull-leadcms-email-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-leadcms-email-templates.js","sourceRoot":"","sources":["../../src/scripts/pull-leadcms-email-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import "dotenv/config";
2
+ import type { RemoteContext } from "../lib/remote-context.js";
3
+ /**
4
+ * Options for pullLeadCMSMedia.
5
+ */
6
+ export interface PullMediaOptions {
7
+ /**
8
+ * Remote context for multi-remote support. When provided, sync tokens and
9
+ * API calls use this remote's URL and per-remote state directory.
10
+ * When omitted, falls back to single-remote behavior (backward compat).
11
+ */
12
+ remoteContext?: RemoteContext;
13
+ }
14
+ export interface MediaItem {
15
+ location?: string;
16
+ [key: string]: any;
17
+ }
18
+ export interface MediaDeletedItem {
19
+ scopeUid: string;
20
+ name: string;
21
+ }
22
+ export interface MediaSyncResult {
23
+ items: MediaItem[];
24
+ deleted: MediaDeletedItem[];
25
+ nextSyncToken: string;
26
+ }
27
+ /**
28
+ * Pull and sync media files from LeadCMS.
29
+ */
30
+ declare function main(options?: PullMediaOptions): Promise<void>;
31
+ export { main as pullLeadCMSMedia };
32
+ //# sourceMappingURL=pull-leadcms-media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-leadcms-media.d.ts","sourceRoot":"","sources":["../../src/scripts/pull-leadcms-media.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAWvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAGD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAgJD;;GAEG;AACH,iBAAe,IAAI,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyGjE;AAED,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,229 @@
1
+ import "dotenv/config";
2
+ import fs from "fs/promises";
3
+ import path from "path";
4
+ import axios from "axios";
5
+ import { downloadMediaFileDirect, leadCMSUrl, leadCMSApiKey, MEDIA_DIR, } from "./leadcms-helpers.js";
6
+ import { logger } from "../lib/logger.js";
7
+ import { syncTokenPath } from "../lib/remote-context.js";
8
+ const MEDIA_PROGRESS_LOG_INTERVAL = 5;
9
+ // ── Sync token paths ───────────────────────────────────────────────────
10
+ const MEDIA_SYNC_TOKEN_PATH = path.join(MEDIA_DIR, ".sync-token");
11
+ // Legacy location (SDK ≤ 3.2): tokens lived in the parent of mediaDir.
12
+ const LEGACY_MEDIA_SYNC_TOKEN_PATH = path.join(path.dirname(MEDIA_DIR), "media-sync-token.txt");
13
+ /**
14
+ * Read a file and return its trimmed contents, or undefined if it doesn't exist.
15
+ */
16
+ async function readFileOrUndefined(filePath) {
17
+ try {
18
+ return (await fs.readFile(filePath, "utf8")).trim() || undefined;
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ }
24
+ /**
25
+ * Silently delete a file (no-op if missing).
26
+ */
27
+ async function unlinkSafe(filePath) {
28
+ try {
29
+ await fs.unlink(filePath);
30
+ }
31
+ catch { /* not found — ok */ }
32
+ }
33
+ /**
34
+ * Read media sync token. Checks new location first, then falls back to legacy.
35
+ * When remoteCtx is provided, reads from the remote-specific state directory.
36
+ */
37
+ async function readMediaSyncToken(remoteCtx) {
38
+ if (remoteCtx) {
39
+ const tokenPath = syncTokenPath(remoteCtx, "media");
40
+ const token = await readFileOrUndefined(tokenPath);
41
+ if (token)
42
+ return { token, migrated: false };
43
+ // Migration: check old single-remote path
44
+ const legacyToken = await readFileOrUndefined(MEDIA_SYNC_TOKEN_PATH);
45
+ if (legacyToken) {
46
+ logger.verbose(`[SYNC] Migrating media sync token to remote "${remoteCtx.name}"`);
47
+ return { token: legacyToken, migrated: true };
48
+ }
49
+ return { token: undefined, migrated: false };
50
+ }
51
+ const token = await readFileOrUndefined(MEDIA_SYNC_TOKEN_PATH);
52
+ if (token)
53
+ return { token, migrated: false };
54
+ const legacy = await readFileOrUndefined(LEGACY_MEDIA_SYNC_TOKEN_PATH);
55
+ if (legacy) {
56
+ logger.verbose(`[SYNC] Migrating media sync token from legacy location`);
57
+ return { token: legacy, migrated: true };
58
+ }
59
+ return { token: undefined, migrated: false };
60
+ }
61
+ async function writeMediaSyncToken(token, remoteCtx) {
62
+ if (remoteCtx) {
63
+ const tokenPath = syncTokenPath(remoteCtx, "media");
64
+ await fs.mkdir(path.dirname(tokenPath), { recursive: true });
65
+ await fs.writeFile(tokenPath, token, "utf8");
66
+ return;
67
+ }
68
+ await fs.mkdir(path.dirname(MEDIA_SYNC_TOKEN_PATH), { recursive: true });
69
+ await fs.writeFile(MEDIA_SYNC_TOKEN_PATH, token, "utf8");
70
+ }
71
+ /**
72
+ * Clean up legacy media sync token after successful migration.
73
+ */
74
+ async function cleanupLegacyMediaSyncToken() {
75
+ await unlinkSafe(LEGACY_MEDIA_SYNC_TOKEN_PATH);
76
+ }
77
+ async function pullMediaSync(syncToken, baseUrl) {
78
+ const effectiveUrl = baseUrl || leadCMSUrl;
79
+ logger.verbose(`[PULL_MEDIA_SYNC] Starting with syncToken: ${syncToken || "NONE"}`);
80
+ logger.verbose(`[PULL_MEDIA_SYNC] Pulling public media (no authentication)`);
81
+ let allItems = [];
82
+ let allDeleted = [];
83
+ let token = syncToken || "";
84
+ let nextSyncToken = undefined;
85
+ let page = 0;
86
+ while (true) {
87
+ const url = new URL("/api/media/sync", effectiveUrl);
88
+ url.searchParams.set("filter[limit]", "100");
89
+ url.searchParams.set("syncToken", token);
90
+ logger.verbose(`[PULL_MEDIA_SYNC] Page ${page}, URL: ${url.toString()}`);
91
+ try {
92
+ // SECURITY: Never send API key for read operations
93
+ // Media sync should only return public files
94
+ const res = await axios.get(url.toString());
95
+ if (res.status === 204) {
96
+ logger.verbose(`[PULL_MEDIA_SYNC] Got 204 No Content - ending sync`);
97
+ break;
98
+ }
99
+ const data = res.data;
100
+ logger.verbose(`[PULL_MEDIA_SYNC] Page ${page} - Got ${data.items?.length || 0} items, ${data.deleted?.length || 0} deleted`);
101
+ if (data.items && Array.isArray(data.items))
102
+ allItems.push(...data.items);
103
+ if (data.deleted && Array.isArray(data.deleted)) {
104
+ allDeleted.push(...data.deleted);
105
+ }
106
+ const newSyncToken = res.headers["x-next-sync-token"] || token;
107
+ logger.verbose(`[PULL_MEDIA_SYNC] Next sync token: ${newSyncToken}`);
108
+ if (!newSyncToken || newSyncToken === token) {
109
+ nextSyncToken = newSyncToken || token;
110
+ logger.verbose(`[PULL_MEDIA_SYNC] No new sync token - ending sync`);
111
+ break;
112
+ }
113
+ nextSyncToken = newSyncToken;
114
+ token = newSyncToken;
115
+ page++;
116
+ }
117
+ catch (error) {
118
+ console.error(`[PULL_MEDIA_SYNC] Failed on page ${page}:`, error.message);
119
+ throw error;
120
+ }
121
+ }
122
+ logger.verbose(`[PULL_MEDIA_SYNC] Completed - Total items: ${allItems.length}, deleted: ${allDeleted.length}`);
123
+ return {
124
+ items: allItems,
125
+ deleted: allDeleted,
126
+ nextSyncToken: nextSyncToken || token,
127
+ };
128
+ }
129
+ /**
130
+ * Pull and sync media files from LeadCMS.
131
+ */
132
+ async function main(options = {}) {
133
+ const { remoteContext: remoteCtx } = options;
134
+ const effectiveUrl = remoteCtx?.url || leadCMSUrl;
135
+ const effectiveApiKey = remoteCtx?.apiKey || leadCMSApiKey;
136
+ logger.verbose(`[PULL_MEDIA] LeadCMS URL: ${effectiveUrl}`);
137
+ logger.verbose(`[PULL_MEDIA] Media Dir: ${MEDIA_DIR}`);
138
+ if (remoteCtx) {
139
+ logger.verbose(`[PULL_MEDIA] Remote: ${remoteCtx.name}`);
140
+ }
141
+ await fs.mkdir(MEDIA_DIR, { recursive: true });
142
+ const { token: lastMediaSyncToken, migrated: mediaTokenMigrated } = await readMediaSyncToken(remoteCtx);
143
+ let mediaItems = [];
144
+ let mediaDeleted = [];
145
+ let nextMediaSyncToken = "";
146
+ try {
147
+ if (lastMediaSyncToken) {
148
+ logger.verbose(`Syncing media from LeadCMS using sync token: ${lastMediaSyncToken}`);
149
+ ({ items: mediaItems, deleted: mediaDeleted, nextSyncToken: nextMediaSyncToken } = await pullMediaSync(lastMediaSyncToken, effectiveUrl));
150
+ }
151
+ else {
152
+ logger.verbose("No media sync token found. Doing full pull from LeadCMS...");
153
+ ({ items: mediaItems, deleted: mediaDeleted, nextSyncToken: nextMediaSyncToken } = await pullMediaSync(undefined, effectiveUrl));
154
+ }
155
+ }
156
+ catch (error) {
157
+ console.error(`[PULL_MEDIA] Failed to pull media:`, error.message);
158
+ if (error.response?.status === 401) {
159
+ console.error(`[PULL_MEDIA] Authentication failed - check your LEADCMS_API_KEY`);
160
+ }
161
+ throw error;
162
+ }
163
+ logger.verbose(`Pulled ${mediaItems.length} media items, ${mediaDeleted.length} deleted.\x1b[0m`);
164
+ // Download new/updated media files
165
+ console.log(`🖼️ Processing media sync (${mediaItems.length} downloads, ${mediaDeleted.length} deletions)...`);
166
+ if (mediaItems.length > 0) {
167
+ logger.verbose(`\nProcessing media changes...`);
168
+ let downloaded = 0;
169
+ let attemptedDownloads = 0;
170
+ for (const mediaItem of mediaItems) {
171
+ if (mediaItem.location) {
172
+ attemptedDownloads++;
173
+ if (attemptedDownloads === 1
174
+ || attemptedDownloads % MEDIA_PROGRESS_LOG_INTERVAL === 0
175
+ || attemptedDownloads === mediaItems.length) {
176
+ console.log(` ⬇️ Media download progress: ${attemptedDownloads}/${mediaItems.length}`);
177
+ }
178
+ const relPath = mediaItem.location.replace(/^\/api\/media\//, "");
179
+ const destPath = path.join(MEDIA_DIR, relPath);
180
+ const didDownload = await downloadMediaFileDirect(mediaItem.location, destPath, effectiveUrl || "", effectiveApiKey || "");
181
+ if (didDownload) {
182
+ logger.verbose(`Downloaded: ${mediaItem.location} -> ${destPath}`);
183
+ downloaded++;
184
+ }
185
+ }
186
+ }
187
+ console.log(`Done. ${downloaded} media files downloaded.`);
188
+ }
189
+ else if (mediaDeleted.length === 0) {
190
+ console.log(`No media changes detected.`);
191
+ }
192
+ // Remove deleted media files from local filesystem
193
+ if (mediaDeleted.length > 0) {
194
+ console.log(`Removing ${mediaDeleted.length} deleted media files...`);
195
+ let removedCount = 0;
196
+ for (const deletedMedia of mediaDeleted) {
197
+ const relPath = deletedMedia.scopeUid
198
+ ? path.join(deletedMedia.scopeUid, deletedMedia.name)
199
+ : deletedMedia.name;
200
+ const fullPath = path.join(MEDIA_DIR, relPath);
201
+ try {
202
+ await fs.unlink(fullPath);
203
+ logger.verbose(`Deleted media: ${fullPath}`);
204
+ removedCount++;
205
+ }
206
+ catch (err) {
207
+ if (err.code !== 'ENOENT') {
208
+ console.warn(`Warning: Could not delete media file ${fullPath}:`, err.message);
209
+ }
210
+ }
211
+ }
212
+ console.log(`Done. ${removedCount} media files removed.`);
213
+ }
214
+ // Save sync token
215
+ if (nextMediaSyncToken) {
216
+ await writeMediaSyncToken(nextMediaSyncToken, remoteCtx);
217
+ logger.verbose(`Media sync token updated: ${nextMediaSyncToken}`);
218
+ }
219
+ // Clean up legacy sync token after successful migration
220
+ if (mediaTokenMigrated) {
221
+ await cleanupLegacyMediaSyncToken();
222
+ logger.verbose(`[SYNC] Removed legacy media sync token`);
223
+ if (remoteCtx) {
224
+ await unlinkSafe(MEDIA_SYNC_TOKEN_PATH);
225
+ }
226
+ }
227
+ }
228
+ export { main as pullLeadCMSMedia };
229
+ //# sourceMappingURL=pull-leadcms-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-leadcms-media.js","sourceRoot":"","sources":["../../src/scripts/pull-leadcms-media.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,aAAa,EACb,SAAS,GACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqCzD,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,0EAA0E;AAC1E,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAElE,uEAAuE;AACvE,MAAM,4BAA4B,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAEhG;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,kBAAkB,CAAC,SAAyB;IACzD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,KAAK;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAE7C,0CAA0C;QAC1C,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QACrE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,OAAO,CAAC,gDAAgD,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;YAClF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;IAC/D,IAAI,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAE7C,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IACvE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC;QACzE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAAa,EAAE,SAAyB;IACzE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,2BAA2B;IACxC,MAAM,UAAU,CAAC,4BAA4B,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAAkB,EAAE,OAAgB;IAC/D,MAAM,YAAY,GAAG,OAAO,IAAI,UAAU,CAAC;IAC3C,MAAM,CAAC,OAAO,CAAC,8CAA8C,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;IACpF,MAAM,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;IAC7E,IAAI,QAAQ,GAAgB,EAAE,CAAC;IAC/B,IAAI,UAAU,GAAuB,EAAE,CAAC;IACxC,IAAI,KAAK,GAAG,SAAS,IAAI,EAAE,CAAC;IAC5B,IAAI,aAAa,GAAuB,SAAS,CAAC;IAClD,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QACrD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEzC,MAAM,CAAC,OAAO,CAAC,0BAA0B,IAAI,UAAU,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEzE,IAAI,CAAC;YACH,mDAAmD;YACnD,6CAA6C;YAC7C,MAAM,GAAG,GAAqC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE9E,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC;gBACrE,MAAM;YACR,CAAC;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,MAAM,CAAC,OAAO,CACZ,0BAA0B,IAAI,UAAU,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,CAC9G,CAAC;YAEF,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAE1E,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChD,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;YAErE,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;gBAC5C,aAAa,GAAG,YAAY,IAAI,KAAK,CAAC;gBACtC,MAAM,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;gBACpE,MAAM;YACR,CAAC;YAED,aAAa,GAAG,YAAY,CAAC;YAC7B,KAAK,GAAG,YAAY,CAAC;YACrB,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,oCAAoC,IAAI,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAO,CACZ,8CAA8C,QAAQ,CAAC,MAAM,cAAc,UAAU,CAAC,MAAM,EAAE,CAC/F,CAAC;IACF,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,UAAU;QACnB,aAAa,EAAE,aAAa,IAAI,KAAK;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI,CAAC,UAA4B,EAAE;IAChD,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,YAAY,GAAG,SAAS,EAAE,GAAG,IAAI,UAAU,CAAC;IAClD,MAAM,eAAe,GAAG,SAAS,EAAE,MAAM,IAAI,aAAa,CAAC;IAE3D,MAAM,CAAC,OAAO,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,OAAO,CAAC,2BAA2B,SAAS,EAAE,CAAC,CAAC;IACvD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,OAAO,CAAC,wBAAwB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAExG,IAAI,UAAU,GAAgB,EAAE,CAAC;IACjC,IAAI,YAAY,GAAuB,EAAE,CAAC;IAC1C,IAAI,kBAAkB,GAAW,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,CAAC,gDAAgD,kBAAkB,EAAE,CAAC,CAAC;YACrF,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,MAAM,aAAa,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5I,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;YAC7E,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACnI,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,UAAU,UAAU,CAAC,MAAM,iBAAiB,YAAY,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAElG,mCAAmC;IACnC,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,CAAC,MAAM,eAAe,YAAY,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAChH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAEhD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACvB,kBAAkB,EAAE,CAAC;gBACrB,IACE,kBAAkB,KAAK,CAAC;uBACrB,kBAAkB,GAAG,2BAA2B,KAAK,CAAC;uBACtD,kBAAkB,KAAK,UAAU,CAAC,MAAM,EAC3C,CAAC;oBACD,OAAO,CAAC,GAAG,CAAC,mCAAmC,kBAAkB,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5F,CAAC;gBAED,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;gBAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC/C,MAAM,WAAW,GAAG,MAAM,uBAAuB,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,IAAI,EAAE,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC;gBAC3H,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,CAAC,OAAO,CAAC,eAAe,SAAS,CAAC,QAAQ,OAAO,QAAQ,EAAE,CAAC,CAAC;oBACnE,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,0BAA0B,CAAC,CAAC;IAC7D,CAAC;SAAM,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;IAED,mDAAmD;IACnD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,CAAC,MAAM,yBAAyB,CAAC,CAAC;QACtE,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,YAAY,IAAI,YAAY,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ;gBACnC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC;gBACrD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,MAAM,CAAC,OAAO,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;gBAC7C,YAAY,EAAE,CAAC;YACjB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1B,OAAO,CAAC,IAAI,CAAC,wCAAwC,QAAQ,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,SAAS,YAAY,uBAAuB,CAAC,CAAC;IAC5D,CAAC;IAED,kBAAkB;IAClB,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,mBAAmB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,6BAA6B,kBAAkB,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,wDAAwD;IACxD,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,2BAA2B,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,CAAC,qBAAqB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,CAAC"}
@@ -3,12 +3,15 @@
3
3
  * Pull only media from LeadCMS (no content, no comments)
4
4
  */
5
5
  import "dotenv/config";
6
+ import type { RemoteContext } from "../lib/remote-context.js";
6
7
  interface PullMediaOptions {
7
8
  /** When true, delete all local media files and sync tokens before pulling, effectively doing a fresh pull. */
8
9
  reset?: boolean;
10
+ /** Remote context for multi-remote support. */
11
+ remoteContext?: RemoteContext;
9
12
  }
10
13
  /**
11
- * Main function - currently media is fetched as part of content sync
14
+ * Main function - currently media is pulled as part of content sync
12
15
  * This is a placeholder for future dedicated media sync
13
16
  */
14
17
  declare function main(options?: PullMediaOptions): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"pull-media.d.ts","sourceRoot":"","sources":["../../src/scripts/pull-media.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,eAAe,CAAC;AAOvB,UAAU,gBAAgB;IACxB,8GAA8G;IAC9G,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,iBAAe,IAAI,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCjE;AAKD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"pull-media.d.ts","sourceRoot":"","sources":["../../src/scripts/pull-media.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,eAAe,CAAC;AAOvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,UAAU,gBAAgB;IACxB,8GAA8G;IAC9G,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;GAGG;AACH,iBAAe,IAAI,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCjE;AAKD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC"}
@@ -9,7 +9,7 @@ import { setCMSConfig, isMediaSupported } from "../lib/cms-config-types.js";
9
9
  import { resetMediaState } from "./pull-all.js";
10
10
  import { logger } from "../lib/logger.js";
11
11
  /**
12
- * Main function - currently media is fetched as part of content sync
12
+ * Main function - currently media is pulled as part of content sync
13
13
  * This is a placeholder for future dedicated media sync
14
14
  */
15
15
  async function main(options = {}) {
@@ -38,9 +38,9 @@ async function main(options = {}) {
38
38
  console.warn(`⚠️ Could not fetch CMS config: ${error.message}`);
39
39
  console.warn(`⚠️ Assuming media is supported (backward compatibility)\n`);
40
40
  }
41
- // Import and run content fetch (which includes media)
42
- const { fetchLeadCMSContent } = await import('./fetch-leadcms-content.js');
43
- await fetchLeadCMSContent();
41
+ // Pull media
42
+ const { pullLeadCMSMedia } = await import('./pull-leadcms-media.js');
43
+ await pullLeadCMSMedia({ remoteContext: options.remoteContext });
44
44
  console.log(`\n✨ Media pull completed!\n`);
45
45
  }
46
46
  // Note: CLI execution moved to src/cli/bin/pull-media.ts
@@ -1 +1 @@
1
- {"version":3,"file":"pull-media.js","sourceRoot":"","sources":["../../src/scripts/pull-media.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAO1C;;;GAGG;AACH,KAAK,UAAU,IAAI,CAAC,UAA4B,EAAE;IAChD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,kDAAkD;IAClD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,eAAe,EAAE,CAAC;IAC1B,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE5B,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YAED,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC7E,CAAC;IAED,sDAAsD;IACtD,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAC3E,MAAM,mBAAmB,EAAE,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC7C,CAAC;AAED,yDAAyD;AACzD,+DAA+D;AAE/D,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"pull-media.js","sourceRoot":"","sources":["../../src/scripts/pull-media.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAW1C;;;GAGG;AACH,KAAK,UAAU,IAAI,CAAC,UAA4B,EAAE;IAChD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,kDAAkD;IAClD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,eAAe,EAAE,CAAC;IAC1B,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE5B,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YAED,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC7E,CAAC;IAED,aAAa;IACb,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACrE,MAAM,gBAAgB,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC7C,CAAC;AAED,yDAAyD;AACzD,+DAA+D;AAE/D,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ import 'dotenv/config';
2
+ import type { Comment, StoredComment } from '../lib/comment-types.js';
3
+ type EditableComment = Omit<StoredComment, 'id'> & {
4
+ id?: number;
5
+ };
6
+ type CommentOperationType = 'create' | 'update' | 'delete' | 'conflict';
7
+ interface LocalCommentFile {
8
+ filePath: string;
9
+ commentableType: string;
10
+ commentableId: number;
11
+ language: string;
12
+ comments: EditableComment[];
13
+ }
14
+ interface LocalCommentItem {
15
+ file: LocalCommentFile;
16
+ filePath: string;
17
+ locale: string;
18
+ comment: EditableComment;
19
+ }
20
+ interface RemoteCommentItem extends Comment {
21
+ }
22
+ interface CommentOperation {
23
+ type: CommentOperationType;
24
+ local?: LocalCommentItem;
25
+ remote?: RemoteCommentItem;
26
+ reason?: string;
27
+ }
28
+ interface CommentStatusOptions {
29
+ showDelete?: boolean;
30
+ targetId?: string;
31
+ showDetailedPreview?: boolean;
32
+ }
33
+ interface PushCommentsOptions {
34
+ force?: boolean;
35
+ dryRun?: boolean;
36
+ allowDelete?: boolean;
37
+ targetId?: string;
38
+ }
39
+ export interface CommentStatusResult {
40
+ operations: CommentOperation[];
41
+ totalLocal: number;
42
+ totalRemote: number;
43
+ }
44
+ export declare function buildCommentStatus(options?: CommentStatusOptions): Promise<CommentStatusResult>;
45
+ export declare function statusComments(options?: CommentStatusOptions): Promise<void>;
46
+ export declare function pushComments(options?: PushCommentsOptions): Promise<void>;
47
+ export type { CommentOperation, LocalCommentItem, RemoteCommentItem, PushCommentsOptions, CommentStatusOptions };
48
+ //# sourceMappingURL=push-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-comments.d.ts","sourceRoot":"","sources":["../../src/scripts/push-comments.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAavB,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAOtE,KAAK,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,KAAK,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,UAAU,iBAAkB,SAAQ,OAAO;CAAI;AAE/C,UAAU,gBAAgB;IACxB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,oBAAoB;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AA4MD,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoEzG;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHtF;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FnF;AAED,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,CAAC"}