@leadcms/sdk 3.1.1 → 3.3.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 (72) hide show
  1. package/README.md +104 -50
  2. package/dist/cli/bin/generate-env.d.ts +1 -1
  3. package/dist/cli/bin/generate-env.d.ts.map +1 -1
  4. package/dist/cli/bin/generate-env.js +2 -2
  5. package/dist/cli/bin/generate-env.js.map +1 -1
  6. package/dist/cli/bin/pull-all.js +5 -1
  7. package/dist/cli/bin/pull-all.js.map +1 -1
  8. package/dist/cli/bin/pull-comments.js +3 -1
  9. package/dist/cli/bin/pull-comments.js.map +1 -1
  10. package/dist/cli/bin/pull-content.js +2 -1
  11. package/dist/cli/bin/pull-content.js.map +1 -1
  12. package/dist/cli/bin/pull-media.js +3 -1
  13. package/dist/cli/bin/pull-media.js.map +1 -1
  14. package/dist/cli/index.js +8 -4
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/cms.d.ts.map +1 -1
  21. package/dist/lib/cms.js +0 -38
  22. package/dist/lib/cms.js.map +1 -1
  23. package/dist/lib/content-merge.d.ts +80 -0
  24. package/dist/lib/content-merge.d.ts.map +1 -0
  25. package/dist/lib/content-merge.js +350 -0
  26. package/dist/lib/content-merge.js.map +1 -0
  27. package/dist/lib/content-transformation.d.ts +0 -10
  28. package/dist/lib/content-transformation.d.ts.map +1 -1
  29. package/dist/lib/content-transformation.js +18 -32
  30. package/dist/lib/content-transformation.js.map +1 -1
  31. package/dist/scripts/fetch-leadcms-comments.d.ts +6 -1
  32. package/dist/scripts/fetch-leadcms-comments.d.ts.map +1 -1
  33. package/dist/scripts/fetch-leadcms-comments.js +36 -8
  34. package/dist/scripts/fetch-leadcms-comments.js.map +1 -1
  35. package/dist/scripts/fetch-leadcms-content.d.ts +38 -1
  36. package/dist/scripts/fetch-leadcms-content.d.ts.map +1 -1
  37. package/dist/scripts/fetch-leadcms-content.js +337 -63
  38. package/dist/scripts/fetch-leadcms-content.js.map +1 -1
  39. package/dist/scripts/generate-env-js.d.ts +13 -1
  40. package/dist/scripts/generate-env-js.d.ts.map +1 -1
  41. package/dist/scripts/generate-env-js.js +33 -15
  42. package/dist/scripts/generate-env-js.js.map +1 -1
  43. package/dist/scripts/init-leadcms.d.ts +5 -1
  44. package/dist/scripts/init-leadcms.d.ts.map +1 -1
  45. package/dist/scripts/init-leadcms.js +11 -6
  46. package/dist/scripts/init-leadcms.js.map +1 -1
  47. package/dist/scripts/leadcms-helpers.d.ts +1 -6
  48. package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
  49. package/dist/scripts/leadcms-helpers.js.map +1 -1
  50. package/dist/scripts/pull-all.d.ts +23 -0
  51. package/dist/scripts/pull-all.d.ts.map +1 -1
  52. package/dist/scripts/pull-all.js +83 -2
  53. package/dist/scripts/pull-all.js.map +1 -1
  54. package/dist/scripts/pull-comments.d.ts +5 -1
  55. package/dist/scripts/pull-comments.d.ts.map +1 -1
  56. package/dist/scripts/pull-comments.js +8 -1
  57. package/dist/scripts/pull-comments.js.map +1 -1
  58. package/dist/scripts/pull-content.d.ts +2 -0
  59. package/dist/scripts/pull-content.d.ts.map +1 -1
  60. package/dist/scripts/pull-content.js +7 -1
  61. package/dist/scripts/pull-content.js.map +1 -1
  62. package/dist/scripts/pull-media.d.ts +5 -1
  63. package/dist/scripts/pull-media.d.ts.map +1 -1
  64. package/dist/scripts/pull-media.js +8 -1
  65. package/dist/scripts/pull-media.js.map +1 -1
  66. package/dist/scripts/push-leadcms-content.d.ts +38 -0
  67. package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
  68. package/dist/scripts/push-leadcms-content.js +17 -4
  69. package/dist/scripts/push-leadcms-content.js.map +1 -1
  70. package/dist/scripts/sse-watcher.d.ts.map +1 -1
  71. package/dist/scripts/sse-watcher.js.map +1 -1
  72. package/package.json +3 -2
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Three-way merge utilities for LeadCMS content
3
+ *
4
+ * Uses the node-diff3 library to perform git-style three-way merges between
5
+ * a base version, a local version, and a remote version of content files.
6
+ *
7
+ * For JSON content, a structural (field-level) merge is used instead of
8
+ * line-based diff to avoid false conflicts from adjacent line changes.
9
+ *
10
+ * The base version comes from the server via the sync API (the state of the
11
+ * content at the time of the client's last sync token). This avoids needing
12
+ * any local storage of base snapshots.
13
+ */
14
+ import { diff3Merge } from 'node-diff3';
15
+ /**
16
+ * Fields that are controlled by the server and should always take the remote
17
+ * value during merge, even if they differ between base and local.
18
+ * These fields are set/updated by the server automatically and should never
19
+ * be treated as meaningful local edits.
20
+ */
21
+ const SERVER_CONTROLLED_FIELDS = new Set([
22
+ 'updatedAt',
23
+ 'createdAt',
24
+ ]);
25
+ /**
26
+ * Regex to match a YAML frontmatter line for a server-controlled field.
27
+ * Matches lines like:
28
+ * updatedAt: "2026-02-01T00:00:00Z"
29
+ * createdAt: "2026-01-01T00:00:00Z"
30
+ * updatedAt: 2026-02-01T00:00:00Z
31
+ */
32
+ const SERVER_CONTROLLED_YAML_LINE = /^\s*(updatedAt|createdAt)\s*:/;
33
+ /**
34
+ * Perform a three-way merge between base, local, and remote content.
35
+ *
36
+ * This works like git merge:
37
+ * - Changes that don't overlap are merged automatically
38
+ * - Changes that modify the same lines produce conflict markers
39
+ * - Server-controlled fields (updatedAt, createdAt) in YAML frontmatter
40
+ * are auto-resolved to the remote value, never producing conflicts
41
+ *
42
+ * For JSON content, prefer threeWayMergeJson() which does structural merging
43
+ * and avoids false conflicts from adjacent line changes.
44
+ *
45
+ * @param base - The original content at the time of last sync (from server's baseItems)
46
+ * @param local - The current local file content (possibly user-modified)
47
+ * @param remote - The current remote content (fetched from server)
48
+ * @returns MergeResult with merged content and conflict information
49
+ */
50
+ export function threeWayMerge(base, local, remote) {
51
+ const baseLines = base.split('\n');
52
+ const localLines = local.split('\n');
53
+ const remoteLines = remote.split('\n');
54
+ const regions = diff3Merge(localLines, baseLines, remoteLines);
55
+ let conflictCount = 0;
56
+ const resultLines = [];
57
+ for (const region of regions) {
58
+ if ('ok' in region && region.ok) {
59
+ resultLines.push(...region.ok);
60
+ }
61
+ else if ('conflict' in region && region.conflict) {
62
+ const localConflictLines = region.conflict.a;
63
+ const remoteConflictLines = region.conflict.b;
64
+ // Try to auto-resolve server-controlled fields within the conflict
65
+ const resolved = resolveServerControlledConflict(localConflictLines, remoteConflictLines);
66
+ if (resolved.remainingConflict) {
67
+ // There are still real conflicts after extracting server-controlled fields
68
+ conflictCount++;
69
+ resultLines.push(...resolved.resolvedLines);
70
+ resultLines.push('<<<<<<< local');
71
+ resultLines.push(...resolved.remainingConflict.local);
72
+ resultLines.push('=======');
73
+ resultLines.push(...resolved.remainingConflict.remote);
74
+ resultLines.push('>>>>>>> remote');
75
+ }
76
+ else {
77
+ // All lines in this conflict were server-controlled → fully auto-resolved
78
+ resultLines.push(...resolved.resolvedLines);
79
+ }
80
+ }
81
+ }
82
+ const merged = resultLines.join('\n');
83
+ return {
84
+ success: conflictCount === 0,
85
+ merged,
86
+ hasConflicts: conflictCount > 0,
87
+ conflictCount,
88
+ };
89
+ }
90
+ /**
91
+ * Attempt to auto-resolve server-controlled fields within a conflict region.
92
+ *
93
+ * For each line in the conflict, if it's a server-controlled YAML field
94
+ * (updatedAt, createdAt), take the remote version. Non-server-controlled
95
+ * lines remain as conflicts.
96
+ *
97
+ * Returns:
98
+ * - resolvedLines: lines that were auto-resolved (server-controlled)
99
+ * - remainingConflict: null if fully resolved, or { local, remote } with
100
+ * the non-server-controlled lines that still conflict
101
+ */
102
+ function resolveServerControlledConflict(localLines, remoteLines) {
103
+ const resolvedLines = [];
104
+ const remainingLocal = [];
105
+ const remainingRemote = [];
106
+ // Separate server-controlled from non-server-controlled lines on each side
107
+ const localServerControlled = [];
108
+ const localOther = [];
109
+ for (const line of localLines) {
110
+ if (SERVER_CONTROLLED_YAML_LINE.test(line)) {
111
+ localServerControlled.push(line);
112
+ }
113
+ else {
114
+ localOther.push(line);
115
+ }
116
+ }
117
+ const remoteServerControlled = [];
118
+ const remoteOther = [];
119
+ for (const line of remoteLines) {
120
+ if (SERVER_CONTROLLED_YAML_LINE.test(line)) {
121
+ remoteServerControlled.push(line);
122
+ }
123
+ else {
124
+ remoteOther.push(line);
125
+ }
126
+ }
127
+ // Auto-resolve server-controlled fields: always take remote version
128
+ resolvedLines.push(...remoteServerControlled);
129
+ // Check if there are remaining non-server-controlled lines
130
+ if (localOther.length === 0 && remoteOther.length === 0) {
131
+ // Entire conflict was server-controlled → fully resolved
132
+ return { resolvedLines, remainingConflict: null };
133
+ }
134
+ // There are real conflicting lines remaining
135
+ return {
136
+ resolvedLines,
137
+ remainingConflict: { local: localOther, remote: remoteOther },
138
+ };
139
+ }
140
+ /**
141
+ * Perform a structural three-way merge on JSON content.
142
+ *
143
+ * Instead of doing a line-based diff (which produces false conflicts for
144
+ * adjacent field changes), this parses the JSON and merges field-by-field:
145
+ *
146
+ * - Fields changed only locally → keep local value
147
+ * - Fields changed only remotely → take remote value
148
+ * - Fields changed identically on both sides → take either (same value)
149
+ * - Fields changed differently on both sides → conflict
150
+ * - Server-controlled fields (updatedAt, createdAt) → always take remote
151
+ *
152
+ * For nested objects, the merge recurses into each level.
153
+ *
154
+ * @param base - The base JSON content (from server's baseItems, transformed to local format)
155
+ * @param local - The current local JSON file content
156
+ * @param remote - The current remote JSON content (transformed to local format)
157
+ * @returns MergeResult with the merged JSON string
158
+ */
159
+ export function threeWayMergeJson(base, local, remote) {
160
+ let baseObj;
161
+ let localObj;
162
+ let remoteObj;
163
+ try {
164
+ baseObj = JSON.parse(base);
165
+ localObj = JSON.parse(local);
166
+ remoteObj = JSON.parse(remote);
167
+ }
168
+ catch {
169
+ // If any version is not valid JSON, fall back to line-based merge
170
+ return threeWayMerge(base, local, remote);
171
+ }
172
+ const { value: mergedObj, conflicted, conflictCount } = mergeValues(baseObj, localObj, remoteObj);
173
+ const merged = JSON.stringify(mergedObj, null, 2);
174
+ return {
175
+ success: !conflicted,
176
+ merged,
177
+ hasConflicts: conflicted,
178
+ conflictCount,
179
+ };
180
+ }
181
+ /**
182
+ * Recursively merge three values (base, local, remote).
183
+ * Returns the merged value and whether any conflicts were found.
184
+ */
185
+ function mergeValues(base, local, remote) {
186
+ // If both local and remote are objects (not arrays), merge field by field
187
+ if (isPlainObject(base) && isPlainObject(local) && isPlainObject(remote)) {
188
+ return mergeObjects(base, local, remote);
189
+ }
190
+ // For non-object values (primitives, arrays, etc.): compare as JSON strings
191
+ const baseStr = JSON.stringify(base);
192
+ const localStr = JSON.stringify(local);
193
+ const remoteStr = JSON.stringify(remote);
194
+ if (baseStr === localStr && baseStr === remoteStr) {
195
+ // No changes
196
+ return { value: local, conflicted: false, conflictCount: 0 };
197
+ }
198
+ if (baseStr === localStr) {
199
+ // Only remote changed → take remote
200
+ return { value: remote, conflicted: false, conflictCount: 0 };
201
+ }
202
+ if (baseStr === remoteStr) {
203
+ // Only local changed → keep local
204
+ return { value: local, conflicted: false, conflictCount: 0 };
205
+ }
206
+ if (localStr === remoteStr) {
207
+ // Both changed identically → take either
208
+ return { value: local, conflicted: false, conflictCount: 0 };
209
+ }
210
+ // Both changed differently → conflict
211
+ // Use a special marker object that will be serialized with conflict info
212
+ return {
213
+ value: {
214
+ '<<<<<<< local': local,
215
+ '=======': '---',
216
+ '>>>>>>> remote': remote,
217
+ },
218
+ conflicted: true,
219
+ conflictCount: 1,
220
+ };
221
+ }
222
+ /**
223
+ * Merge three plain objects field by field.
224
+ */
225
+ function mergeObjects(base, local, remote) {
226
+ const allKeys = new Set([
227
+ ...Object.keys(base),
228
+ ...Object.keys(local),
229
+ ...Object.keys(remote),
230
+ ]);
231
+ const merged = {};
232
+ let hasConflict = false;
233
+ let totalConflicts = 0;
234
+ for (const key of allKeys) {
235
+ const inBase = key in base;
236
+ const inLocal = key in local;
237
+ const inRemote = key in remote;
238
+ // Server-controlled fields: always take remote value
239
+ if (SERVER_CONTROLLED_FIELDS.has(key)) {
240
+ if (inRemote) {
241
+ merged[key] = remote[key];
242
+ }
243
+ else if (inLocal) {
244
+ merged[key] = local[key];
245
+ }
246
+ // If only in base, it was deleted from both → omit
247
+ continue;
248
+ }
249
+ if (inBase && inLocal && inRemote) {
250
+ // Key exists in all three — merge the values
251
+ const result = mergeValues(base[key], local[key], remote[key]);
252
+ merged[key] = result.value;
253
+ if (result.conflicted) {
254
+ hasConflict = true;
255
+ totalConflicts += result.conflictCount;
256
+ }
257
+ }
258
+ else if (!inBase && inLocal && inRemote) {
259
+ // Key added by both sides
260
+ const result = mergeValues(undefined, local[key], remote[key]);
261
+ merged[key] = result.value;
262
+ if (result.conflicted) {
263
+ hasConflict = true;
264
+ totalConflicts += result.conflictCount;
265
+ }
266
+ }
267
+ else if (!inBase && inLocal && !inRemote) {
268
+ // Key added only locally → keep
269
+ merged[key] = local[key];
270
+ }
271
+ else if (!inBase && !inLocal && inRemote) {
272
+ // Key added only remotely → take
273
+ merged[key] = remote[key];
274
+ }
275
+ else if (inBase && !inLocal && inRemote) {
276
+ // Key deleted locally — check if remote also changed it
277
+ const baseStr = JSON.stringify(base[key]);
278
+ const remoteStr = JSON.stringify(remote[key]);
279
+ if (baseStr === remoteStr) {
280
+ // Remote didn't change it, local deleted it → keep deleted (omit)
281
+ }
282
+ else {
283
+ // Remote changed it but local deleted it → conflict, prefer remote
284
+ merged[key] = remote[key];
285
+ hasConflict = true;
286
+ totalConflicts++;
287
+ }
288
+ }
289
+ else if (inBase && inLocal && !inRemote) {
290
+ // Key deleted remotely — check if local also changed it
291
+ const baseStr = JSON.stringify(base[key]);
292
+ const localStr = JSON.stringify(local[key]);
293
+ if (baseStr === localStr) {
294
+ // Local didn't change it, remote deleted it → keep deleted (omit)
295
+ }
296
+ else {
297
+ // Local changed it but remote deleted it → conflict, prefer local
298
+ merged[key] = local[key];
299
+ hasConflict = true;
300
+ totalConflicts++;
301
+ }
302
+ }
303
+ else if (inBase && !inLocal && !inRemote) {
304
+ // Deleted by both sides → omit
305
+ }
306
+ }
307
+ return { value: merged, conflicted: hasConflict, conflictCount: totalConflicts };
308
+ }
309
+ /**
310
+ * Check if a value is a plain object (not array, null, Date, etc.)
311
+ */
312
+ function isPlainObject(value) {
313
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
314
+ }
315
+ /**
316
+ * Determine whether a local file has been modified compared to the base version.
317
+ *
318
+ * This is used to decide whether three-way merge is needed:
319
+ * - If local === base → local is unmodified, safe to overwrite with remote
320
+ * - If local !== base → local was modified, need three-way merge
321
+ *
322
+ * Uses timestamp normalization to avoid false positives from precision differences
323
+ * (e.g. server returns 7 decimal places but local file has 6).
324
+ *
325
+ * @param base - The base content (from server's baseItems, transformed to local format)
326
+ * @param local - The current local file content
327
+ * @returns true if local content differs from base
328
+ */
329
+ export function isLocallyModified(base, local) {
330
+ return normalizeForMergeComparison(base) !== normalizeForMergeComparison(local);
331
+ }
332
+ /**
333
+ * Normalize content for merge comparison.
334
+ * Handles trivial whitespace and timestamp precision differences that shouldn't
335
+ * trigger a merge.
336
+ */
337
+ function normalizeForMergeComparison(content) {
338
+ return content
339
+ .replace(/\r\n/g, '\n')
340
+ .replace(/\s+\n/g, '\n')
341
+ // Normalize ISO timestamp precision: truncate fractional seconds to 6 decimal
342
+ // places (microsecond precision) then strip trailing zeros.
343
+ // e.g. "2026-02-13T10:32:20.2939836Z" → "2026-02-13T10:32:20.293983Z"
344
+ // This prevents false diffs from servers returning 7-digit precision while
345
+ // local serializers use 6-digit precision.
346
+ .replace(/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{1,6})\d*Z/g, '$1Z')
347
+ .replace(/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+?)0+Z/g, '$1Z')
348
+ .trimEnd();
349
+ }
350
+ //# sourceMappingURL=content-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-merge.js","sourceRoot":"","sources":["../../src/lib/content-merge.ts"],"names":[],"mappings":"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"}
@@ -60,16 +60,6 @@ export declare function normalizeContentForComparison(content: string): string;
60
60
  * Returns true if contents are different
61
61
  */
62
62
  export declare function hasContentDifferences(content1: string, content2: string): boolean;
63
- /**
64
- * System fields that should be excluded from local files
65
- * These are truly internal fields, not user content fields
66
- */
67
- export declare const SYSTEM_FIELDS: readonly ["body", "isLocal"];
68
- /**
69
- * User content fields that should be preserved in local files
70
- * These are timestamp fields that represent user content metadata
71
- */
72
- export declare const USER_CONTENT_FIELDS: readonly ["createdAt", "updatedAt", "publishedAt"];
73
63
  /**
74
64
  * Options for saving content files
75
65
  */
@@ -1 +1 @@
1
- {"version":3,"file":"content-transformation.d.ts","sourceRoot":"","sources":["../../src/lib/content-transformation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAcjB;AA+KD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAelD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAepD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIjF;AAgBD;;;GAGG;AACH,eAAO,MAAM,aAAa,8BAA+B,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,mBAAmB,oDAAqD,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,OAAY,EACZ,UAAU,EACV,WAAW,EACZ,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4CtD"}
1
+ {"version":3,"file":"content-transformation.d.ts","sourceRoot":"","sources":["../../src/lib/content-transformation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAcjB;AAyKD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAelD;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAepD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIjF;AAgBD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,OAAY,EACZ,UAAU,EACV,WAAW,EACZ,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4CtD"}
@@ -56,17 +56,16 @@ export async function transformRemoteForComparison(remote, localContent, typeMap
56
56
  }
57
57
  }
58
58
  /**
59
- * Transform remote content to MDX format, but only include fields present in local content
59
+ * Transform remote content to MDX format for comparison with local content.
60
+ * Includes ALL non-system remote fields so that field removals in local content
61
+ * are properly detected as changes.
60
62
  */
61
63
  function transformToMDXFormatForComparison(remote, localContent) {
62
- // Parse local content to see which fields it has
63
- let localFields;
64
+ // Validate that local content is parseable MDX, fall back to full transform if not
64
65
  try {
65
- const parsed = matter(localContent);
66
- localFields = new Set(Object.keys(parsed.data));
66
+ matter(localContent);
67
67
  }
68
68
  catch (error) {
69
- // If we can't parse local content, fall back to including all fields
70
69
  return transformToMDXFormat(remote);
71
70
  }
72
71
  let body = remote.body || "";
@@ -90,16 +89,11 @@ function transformToMDXFormatForComparison(remote, localContent) {
90
89
  // Exclude system/internal fields that should not appear in local files
91
90
  const systemFields = ['body', 'isLocal'];
92
91
  systemFields.forEach(field => delete mergedFrontmatter[field]);
93
- // IMPORTANT: Only include fields that exist in the local file
94
- // This prevents false positives when remote has additional fields like updatedAt
95
- const localFieldsOnlyFrontmatter = {};
96
- for (const [key, value] of Object.entries(mergedFrontmatter)) {
97
- if (localFields.has(key)) {
98
- localFieldsOnlyFrontmatter[key] = value;
99
- }
100
- }
92
+ // Include ALL non-system remote fields so that field removals are detected.
93
+ // The timestamp check in matchContent already prevents false positives from
94
+ // server-side field additions (remote newer → conflict, not comparison).
101
95
  // Filter out null and undefined values to prevent them from appearing in frontmatter
102
- const filteredFrontmatter = filterNullValues(localFieldsOnlyFrontmatter);
96
+ const filteredFrontmatter = filterNullValues(mergedFrontmatter);
103
97
  // Apply media path replacements to both frontmatter and body content
104
98
  const cleanedFrontmatter = replaceApiMediaPaths(filteredFrontmatter);
105
99
  const cleanedContent = replaceApiMediaPaths(bodyContent);
@@ -107,17 +101,16 @@ function transformToMDXFormatForComparison(remote, localContent) {
107
101
  return matter.stringify(`\n${cleanedContent.trim()}`, cleanedFrontmatter);
108
102
  }
109
103
  /**
110
- * Transform remote content to JSON format, but only include fields present in local content
104
+ * Transform remote content to JSON format for comparison with local content.
105
+ * Includes ALL non-system remote fields so that field removals in local content
106
+ * are properly detected as changes.
111
107
  */
112
108
  function transformToJSONFormatForComparison(remote, localContent) {
113
- // Parse local content to see which fields it has
114
- let localFields;
109
+ // Validate that local content is parseable JSON, fall back to full transform if not
115
110
  try {
116
- const localData = JSON.parse(localContent);
117
- localFields = new Set(Object.keys(localData));
111
+ JSON.parse(localContent);
118
112
  }
119
113
  catch (error) {
120
- // If we can't parse local content, fall back to including all fields
121
114
  return transformToJSONFormat(remote);
122
115
  }
123
116
  let bodyObj = {};
@@ -132,8 +125,11 @@ function transformToJSONFormatForComparison(remote, localContent) {
132
125
  const merged = { ...transformedBodyObj };
133
126
  // Exclude system/internal fields that should not appear in local files
134
127
  const systemFields = ['body', 'isLocal'];
128
+ // Include ALL non-system remote fields so that field removals are detected.
129
+ // The timestamp check in matchContent already prevents false positives from
130
+ // server-side field additions (remote newer → conflict, not comparison).
135
131
  for (const [k, v] of Object.entries(remote)) {
136
- if (!systemFields.includes(k) && localFields.has(k)) {
132
+ if (!systemFields.includes(k)) {
137
133
  merged[k] = replaceApiMediaPaths(v);
138
134
  }
139
135
  }
@@ -279,16 +275,6 @@ function filterNullValues(obj) {
279
275
  }
280
276
  return filtered;
281
277
  }
282
- /**
283
- * System fields that should be excluded from local files
284
- * These are truly internal fields, not user content fields
285
- */
286
- export const SYSTEM_FIELDS = ['body', 'isLocal'];
287
- /**
288
- * User content fields that should be preserved in local files
289
- * These are timestamp fields that represent user content metadata
290
- */
291
- export const USER_CONTENT_FIELDS = ['createdAt', 'updatedAt', 'publishedAt'];
292
278
  /**
293
279
  * Save content file using shared transformation logic
294
280
  * This function combines transformation and file writing operations
@@ -1 +1 @@
1
- {"version":3,"file":"content-transformation.js","sourceRoot":"","sources":["../../src/lib/content-transformation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-transformation.js","sourceRoot":"","sources":["../../src/lib/content-transformation.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,11 @@ declare function loadCommentsForEntity(commentableType: string, commentableId: n
12
12
  * Save comments for a specific entity to disk
13
13
  */
14
14
  declare function saveCommentsForEntity(commentableType: string, commentableId: number, language: string, comments: StoredComment[]): Promise<void>;
15
+ /**
16
+ * Delete a specific comment by ID (used internally during sync)
17
+ * Searches through all comment files to find and remove the comment
18
+ */
19
+ declare function deleteComment(commentId: number): Promise<void>;
15
20
  /**
16
21
  * Group comments by their commentable entity and language
17
22
  */
@@ -21,6 +26,6 @@ declare function groupCommentsByEntityAndLanguage(comments: Comment[]): Map<stri
21
26
  */
22
27
  export declare function main(): Promise<void>;
23
28
  export { main as fetchLeadCMSComments };
24
- export { loadCommentsForEntity, saveCommentsForEntity, groupCommentsByEntityAndLanguage, toStoredComment, };
29
+ export { loadCommentsForEntity, saveCommentsForEntity, groupCommentsByEntityAndLanguage, toStoredComment, deleteComment, };
25
30
  export type { CommentSyncResult };
26
31
  //# sourceMappingURL=fetch-leadcms-comments.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-leadcms-comments.d.ts","sourceRoot":"","sources":["../../src/scripts/fetch-leadcms-comments.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAQvB,OAAO,KAAK,EACV,OAAO,EAEP,iBAAiB,EACjB,aAAa,EAEd,MAAM,yBAAyB,CAAC;AAoHjC;;GAEG;AACH,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAGxD;AAqBD;;GAEG;AACH,iBAAe,qBAAqB,CAClC,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,EAAE,CAAC,CAS1B;AAED;;GAEG;AACH,iBAAe,qBAAqB,CAClC,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAwBf;AA+ED;;GAEG;AACH,iBAAS,gCAAgC,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAYrF;AA0BD;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA2F1C;AAGD,OAAO,EAAE,IAAI,IAAI,oBAAoB,EAAE,CAAC;AAMxC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gCAAgC,EAChC,eAAe,GAChB,CAAC;AAGF,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"fetch-leadcms-comments.d.ts","sourceRoot":"","sources":["../../src/scripts/fetch-leadcms-comments.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAQvB,OAAO,KAAK,EACV,OAAO,EAEP,iBAAiB,EACjB,aAAa,EACd,MAAM,yBAAyB,CAAC;AA4IjC;;GAEG;AACH,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAGxD;AAqBD;;GAEG;AACH,iBAAe,qBAAqB,CAClC,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,EAAE,CAAC,CAS1B;AAED;;GAEG;AACH,iBAAe,qBAAqB,CAClC,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;GAGG;AACH,iBAAe,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC7D;AAgCD;;GAEG;AACH,iBAAS,gCAAgC,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAYrF;AA0BD;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAiG1C;AAGD,OAAO,EAAE,IAAI,IAAI,oBAAoB,EAAE,CAAC;AAMxC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,gCAAgC,EAChC,eAAe,EACf,aAAa,GACd,CAAC;AAGF,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
@@ -8,25 +8,48 @@ import { isValidLocaleCode } from "../lib/locale-utils.js";
8
8
  // Load config to get commentsDir
9
9
  const config = getConfig();
10
10
  const COMMENTS_DIR = path.resolve(config.commentsDir);
11
- const COMMENT_SYNC_TOKEN_PATH = path.resolve(".leadcms/comment-sync-token.txt");
11
+ // ── Comment sync token paths ──────────────────────────────────────────
12
+ // New location: token lives inside the commentsDir.
13
+ const COMMENT_SYNC_TOKEN_PATH = path.join(COMMENTS_DIR, ".sync-token");
14
+ // Legacy location (SDK ≤ 3.2): token lived in the parent of commentsDir.
15
+ const LEGACY_COMMENT_SYNC_TOKEN_PATH = path.join(path.dirname(COMMENTS_DIR), "comment-sync-token.txt");
12
16
  /**
13
- * Read the last comment sync token from disk
17
+ * Read the last comment sync token from disk.
18
+ * Checks new location first, then falls back to legacy for migration.
14
19
  */
15
20
  async function readCommentSyncToken() {
16
21
  try {
17
- return (await fs.readFile(COMMENT_SYNC_TOKEN_PATH, "utf8")).trim();
22
+ const token = (await fs.readFile(COMMENT_SYNC_TOKEN_PATH, "utf8")).trim();
23
+ if (token)
24
+ return { token, migrated: false };
18
25
  }
19
- catch {
20
- return undefined;
26
+ catch { /* not found */ }
27
+ try {
28
+ const legacy = (await fs.readFile(LEGACY_COMMENT_SYNC_TOKEN_PATH, "utf8")).trim();
29
+ if (legacy) {
30
+ console.log(`[SYNC] Migrating comment sync token from legacy location`);
31
+ return { token: legacy, migrated: true };
32
+ }
21
33
  }
34
+ catch { /* not found */ }
35
+ return { token: undefined, migrated: false };
22
36
  }
23
37
  /**
24
- * Write the comment sync token to disk
38
+ * Write the comment sync token to disk (new location inside commentsDir)
25
39
  */
26
40
  async function writeCommentSyncToken(token) {
27
41
  await fs.mkdir(path.dirname(COMMENT_SYNC_TOKEN_PATH), { recursive: true });
28
42
  await fs.writeFile(COMMENT_SYNC_TOKEN_PATH, token, "utf8");
29
43
  }
44
+ /**
45
+ * Clean up legacy comment sync token after successful migration.
46
+ */
47
+ async function cleanupLegacyCommentSyncToken() {
48
+ try {
49
+ await fs.unlink(LEGACY_COMMENT_SYNC_TOKEN_PATH);
50
+ }
51
+ catch { /* not found — ok */ }
52
+ }
30
53
  /**
31
54
  * Fetch comments from LeadCMS sync endpoint
32
55
  * Handles pagination automatically
@@ -279,7 +302,7 @@ export async function main() {
279
302
  }
280
303
  console.log(`✅ Comments supported - proceeding with sync\n`);
281
304
  await fs.mkdir(COMMENTS_DIR, { recursive: true });
282
- const lastSyncToken = await readCommentSyncToken();
305
+ const { token: lastSyncToken, migrated: commentTokenMigrated } = await readCommentSyncToken();
283
306
  let items = [], deleted = [], nextSyncToken = "";
284
307
  try {
285
308
  if (lastSyncToken) {
@@ -335,6 +358,11 @@ export async function main() {
335
358
  await writeCommentSyncToken(nextSyncToken);
336
359
  console.log(`Comment sync token updated: ${nextSyncToken}`);
337
360
  }
361
+ // Clean up legacy sync token after successful migration
362
+ if (commentTokenMigrated) {
363
+ await cleanupLegacyCommentSyncToken();
364
+ console.log(`[SYNC] Removed legacy comment sync token`);
365
+ }
338
366
  console.log(`\nComment sync completed successfully.`);
339
367
  }
340
368
  // Export the main function so it can be imported by other modules
@@ -342,5 +370,5 @@ export { main as fetchLeadCMSComments };
342
370
  // Note: CLI execution moved to CLI entry points
343
371
  // This file now only exports the function for programmatic use
344
372
  // Export helper functions for testing
345
- export { loadCommentsForEntity, saveCommentsForEntity, groupCommentsByEntityAndLanguage, toStoredComment, };
373
+ export { loadCommentsForEntity, saveCommentsForEntity, groupCommentsByEntityAndLanguage, toStoredComment, deleteComment, };
346
374
  //# sourceMappingURL=fetch-leadcms-comments.js.map