@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.
- package/README.md +104 -50
- package/dist/cli/bin/generate-env.d.ts +1 -1
- package/dist/cli/bin/generate-env.d.ts.map +1 -1
- package/dist/cli/bin/generate-env.js +2 -2
- package/dist/cli/bin/generate-env.js.map +1 -1
- package/dist/cli/bin/pull-all.js +5 -1
- package/dist/cli/bin/pull-all.js.map +1 -1
- package/dist/cli/bin/pull-comments.js +3 -1
- package/dist/cli/bin/pull-comments.js.map +1 -1
- package/dist/cli/bin/pull-content.js +2 -1
- package/dist/cli/bin/pull-content.js.map +1 -1
- package/dist/cli/bin/pull-media.js +3 -1
- package/dist/cli/bin/pull-media.js.map +1 -1
- package/dist/cli/index.js +8 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/cms.d.ts.map +1 -1
- package/dist/lib/cms.js +0 -38
- package/dist/lib/cms.js.map +1 -1
- package/dist/lib/content-merge.d.ts +80 -0
- package/dist/lib/content-merge.d.ts.map +1 -0
- package/dist/lib/content-merge.js +350 -0
- package/dist/lib/content-merge.js.map +1 -0
- package/dist/lib/content-transformation.d.ts +0 -10
- package/dist/lib/content-transformation.d.ts.map +1 -1
- package/dist/lib/content-transformation.js +18 -32
- package/dist/lib/content-transformation.js.map +1 -1
- package/dist/scripts/fetch-leadcms-comments.d.ts +6 -1
- package/dist/scripts/fetch-leadcms-comments.d.ts.map +1 -1
- package/dist/scripts/fetch-leadcms-comments.js +36 -8
- package/dist/scripts/fetch-leadcms-comments.js.map +1 -1
- package/dist/scripts/fetch-leadcms-content.d.ts +38 -1
- package/dist/scripts/fetch-leadcms-content.d.ts.map +1 -1
- package/dist/scripts/fetch-leadcms-content.js +337 -63
- package/dist/scripts/fetch-leadcms-content.js.map +1 -1
- package/dist/scripts/generate-env-js.d.ts +13 -1
- package/dist/scripts/generate-env-js.d.ts.map +1 -1
- package/dist/scripts/generate-env-js.js +33 -15
- package/dist/scripts/generate-env-js.js.map +1 -1
- package/dist/scripts/init-leadcms.d.ts +5 -1
- package/dist/scripts/init-leadcms.d.ts.map +1 -1
- package/dist/scripts/init-leadcms.js +11 -6
- package/dist/scripts/init-leadcms.js.map +1 -1
- package/dist/scripts/leadcms-helpers.d.ts +1 -6
- package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
- package/dist/scripts/leadcms-helpers.js.map +1 -1
- package/dist/scripts/pull-all.d.ts +23 -0
- package/dist/scripts/pull-all.d.ts.map +1 -1
- package/dist/scripts/pull-all.js +83 -2
- package/dist/scripts/pull-all.js.map +1 -1
- package/dist/scripts/pull-comments.d.ts +5 -1
- package/dist/scripts/pull-comments.d.ts.map +1 -1
- package/dist/scripts/pull-comments.js +8 -1
- package/dist/scripts/pull-comments.js.map +1 -1
- package/dist/scripts/pull-content.d.ts +2 -0
- package/dist/scripts/pull-content.d.ts.map +1 -1
- package/dist/scripts/pull-content.js +7 -1
- package/dist/scripts/pull-content.js.map +1 -1
- package/dist/scripts/pull-media.d.ts +5 -1
- package/dist/scripts/pull-media.d.ts.map +1 -1
- package/dist/scripts/pull-media.js +8 -1
- package/dist/scripts/pull-media.js.map +1 -1
- package/dist/scripts/push-leadcms-content.d.ts +38 -0
- package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
- package/dist/scripts/push-leadcms-content.js +17 -4
- package/dist/scripts/push-leadcms-content.js.map +1 -1
- package/dist/scripts/sse-watcher.d.ts.map +1 -1
- package/dist/scripts/sse-watcher.js.map +1 -1
- 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;
|
|
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
|
|
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
|
-
//
|
|
63
|
-
let localFields;
|
|
64
|
+
// Validate that local content is parseable MDX, fall back to full transform if not
|
|
64
65
|
try {
|
|
65
|
-
|
|
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
|
-
//
|
|
94
|
-
//
|
|
95
|
-
|
|
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(
|
|
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
|
|
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
|
-
//
|
|
114
|
-
let localFields;
|
|
109
|
+
// Validate that local content is parseable JSON, fall back to full transform if not
|
|
115
110
|
try {
|
|
116
|
-
|
|
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)
|
|
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":"AAAA;;;;GAIG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAoBxC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAyB,EACzB,UAA0B,EAAE;IAE5B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IAElD,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAClC,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAyB,EACzB,YAAoB,EACpB,UAA0B,EAAE;IAE5B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IAElD,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,iCAAiC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAClC,OAAO,kCAAkC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|