@leadcms/sdk 3.0.2 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/bin/generate-env.js +0 -0
- package/dist/cli/bin/init.js +0 -0
- package/dist/cli/bin/login.js +0 -0
- package/dist/cli/bin/pull-all.js +13 -1
- package/dist/cli/bin/pull-all.js.map +1 -1
- package/dist/cli/bin/pull-comments.js +0 -0
- package/dist/cli/bin/pull-content.js +13 -1
- package/dist/cli/bin/pull-content.js.map +1 -1
- package/dist/cli/bin/pull-media.js +0 -0
- package/dist/cli/bin/push-all.d.ts +7 -0
- package/dist/cli/bin/push-all.d.ts.map +1 -0
- package/dist/cli/bin/push-all.js +59 -0
- package/dist/cli/bin/push-all.js.map +1 -0
- package/dist/cli/bin/push-content.d.ts +6 -0
- package/dist/cli/bin/push-content.d.ts.map +1 -0
- package/dist/cli/bin/push-content.js +27 -0
- package/dist/cli/bin/push-content.js.map +1 -0
- package/dist/cli/bin/push-media.d.ts +6 -0
- package/dist/cli/bin/push-media.d.ts.map +1 -0
- package/dist/cli/bin/push-media.js +21 -0
- package/dist/cli/bin/push-media.js.map +1 -0
- package/dist/cli/bin/push.js +0 -0
- package/dist/cli/bin/status-all.d.ts +7 -0
- package/dist/cli/bin/status-all.d.ts.map +1 -0
- package/dist/cli/bin/status-all.js +56 -0
- package/dist/cli/bin/status-all.js.map +1 -0
- package/dist/cli/bin/status-content.d.ts +6 -0
- package/dist/cli/bin/status-content.d.ts.map +1 -0
- package/dist/cli/bin/status-content.js +30 -0
- package/dist/cli/bin/status-content.js.map +1 -0
- package/dist/cli/bin/status-media.d.ts +6 -0
- package/dist/cli/bin/status-media.d.ts.map +1 -0
- package/dist/cli/bin/status-media.js +20 -0
- package/dist/cli/bin/status-media.js.map +1 -0
- package/dist/cli/bin/status.js +0 -0
- package/dist/cli/bin/watch.js +0 -0
- package/dist/cli/index.js +38 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/data-service.d.ts +42 -0
- package/dist/lib/data-service.d.ts.map +1 -1
- package/dist/lib/data-service.js +316 -6
- package/dist/lib/data-service.js.map +1 -1
- package/dist/scripts/pull-all.d.ts +5 -1
- package/dist/scripts/pull-all.d.ts.map +1 -1
- package/dist/scripts/pull-all.js +9 -1
- package/dist/scripts/pull-all.js.map +1 -1
- package/dist/scripts/pull-content.d.ts +5 -1
- package/dist/scripts/pull-content.d.ts.map +1 -1
- package/dist/scripts/pull-content.js +48 -1
- package/dist/scripts/pull-content.js.map +1 -1
- package/dist/scripts/push-leadcms-content.d.ts +5 -0
- package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
- package/dist/scripts/push-leadcms-content.js +98 -15
- package/dist/scripts/push-leadcms-content.js.map +1 -1
- package/dist/scripts/push-media.d.ts +136 -0
- package/dist/scripts/push-media.d.ts.map +1 -0
- package/dist/scripts/push-media.js +531 -0
- package/dist/scripts/push-media.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import readline from 'readline';
|
|
4
|
+
import FormData from 'form-data';
|
|
5
|
+
import { leadCMSDataService } from '../lib/data-service.js';
|
|
6
|
+
import { loadConfig } from '../lib/config.js';
|
|
7
|
+
import { success, error, warn, info } from '../lib/console-colors.js';
|
|
8
|
+
/**
|
|
9
|
+
* Default dependencies using real implementations
|
|
10
|
+
*/
|
|
11
|
+
function getDefaultDependencies() {
|
|
12
|
+
// Create readline interface for user prompts
|
|
13
|
+
let rl = null;
|
|
14
|
+
const getReadline = () => {
|
|
15
|
+
if (!rl) {
|
|
16
|
+
rl = readline.createInterface({
|
|
17
|
+
input: process.stdin,
|
|
18
|
+
output: process.stdout
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return rl;
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
fetchRemoteMedia: () => leadCMSDataService.getAllMedia(),
|
|
25
|
+
uploadMedia: (formData) => leadCMSDataService.uploadMedia(formData),
|
|
26
|
+
updateMedia: (formData) => leadCMSDataService.updateMedia(formData),
|
|
27
|
+
deleteMedia: (pathToFile) => leadCMSDataService.deleteMedia(pathToFile),
|
|
28
|
+
logInfo: info,
|
|
29
|
+
logWarn: warn,
|
|
30
|
+
logError: error,
|
|
31
|
+
logSuccess: success,
|
|
32
|
+
promptConfirmation: async (message) => {
|
|
33
|
+
const readline = getReadline();
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
readline.question(message, (answer) => {
|
|
36
|
+
readline.close();
|
|
37
|
+
rl = null;
|
|
38
|
+
const confirmed = answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
|
|
39
|
+
resolve(confirmed);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Maximum file sizes by type (in bytes)
|
|
47
|
+
*/
|
|
48
|
+
const MAX_FILE_SIZES = {
|
|
49
|
+
image: 10 * 1024 * 1024, // 10MB for images
|
|
50
|
+
video: 100 * 1024 * 1024, // 100MB for videos
|
|
51
|
+
document: 25 * 1024 * 1024, // 25MB for documents
|
|
52
|
+
other: 10 * 1024 * 1024 // 10MB for other files
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* File extensions by category
|
|
56
|
+
*/
|
|
57
|
+
const FILE_CATEGORIES = {
|
|
58
|
+
image: ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.avif', '.bmp', '.ico'],
|
|
59
|
+
video: ['.mp4', '.webm', '.ogg', '.mov', '.avi'],
|
|
60
|
+
document: ['.pdf', '.doc', '.docx', '.txt', '.md']
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Get MIME type from file extension
|
|
64
|
+
*/
|
|
65
|
+
export function getMimeType(extension) {
|
|
66
|
+
const mimeTypes = {
|
|
67
|
+
'.jpg': 'image/jpeg',
|
|
68
|
+
'.jpeg': 'image/jpeg',
|
|
69
|
+
'.png': 'image/png',
|
|
70
|
+
'.gif': 'image/gif',
|
|
71
|
+
'.webp': 'image/webp',
|
|
72
|
+
'.svg': 'image/svg+xml',
|
|
73
|
+
'.avif': 'image/avif',
|
|
74
|
+
'.bmp': 'image/bmp',
|
|
75
|
+
'.ico': 'image/x-icon',
|
|
76
|
+
'.mp4': 'video/mp4',
|
|
77
|
+
'.webm': 'video/webm',
|
|
78
|
+
'.ogg': 'video/ogg',
|
|
79
|
+
'.pdf': 'application/pdf',
|
|
80
|
+
'.txt': 'text/plain',
|
|
81
|
+
'.md': 'text/markdown'
|
|
82
|
+
};
|
|
83
|
+
return mimeTypes[extension.toLowerCase()] || 'application/octet-stream';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get file category from extension
|
|
87
|
+
*/
|
|
88
|
+
export function getFileCategory(extension) {
|
|
89
|
+
const lowerExt = extension.toLowerCase();
|
|
90
|
+
if (FILE_CATEGORIES.image.includes(lowerExt))
|
|
91
|
+
return 'image';
|
|
92
|
+
if (FILE_CATEGORIES.video.includes(lowerExt))
|
|
93
|
+
return 'video';
|
|
94
|
+
if (FILE_CATEGORIES.document.includes(lowerExt))
|
|
95
|
+
return 'document';
|
|
96
|
+
return 'other';
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Validate file size against limits
|
|
100
|
+
*/
|
|
101
|
+
export function validateFileSize(file) {
|
|
102
|
+
const category = getFileCategory(file.extension);
|
|
103
|
+
const maxSize = MAX_FILE_SIZES[category];
|
|
104
|
+
if (file.size > maxSize) {
|
|
105
|
+
return {
|
|
106
|
+
valid: false,
|
|
107
|
+
message: `File size ${(file.size / 1024 / 1024).toFixed(2)}MB exceeds ${category} limit of ${(maxSize / 1024 / 1024).toFixed(0)}MB`
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
return { valid: true };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if a file should be ignored (system files, hidden files, etc.)
|
|
114
|
+
*/
|
|
115
|
+
function shouldIgnoreFile(filename) {
|
|
116
|
+
const ignoredPatterns = [
|
|
117
|
+
'.DS_Store', // macOS
|
|
118
|
+
'Thumbs.db', // Windows
|
|
119
|
+
'desktop.ini', // Windows
|
|
120
|
+
'.gitkeep', // Git placeholder
|
|
121
|
+
'.gitignore', // Git
|
|
122
|
+
'.htaccess', // Apache
|
|
123
|
+
'~$', // Office temp files (prefix)
|
|
124
|
+
'.tmp', // Temp files
|
|
125
|
+
'.temp', // Temp files
|
|
126
|
+
'.bak', // Backup files
|
|
127
|
+
'.swp', // Vim swap files
|
|
128
|
+
'.swo', // Vim swap files
|
|
129
|
+
];
|
|
130
|
+
// Check if filename matches any ignored pattern
|
|
131
|
+
for (const pattern of ignoredPatterns) {
|
|
132
|
+
if (pattern.startsWith('~') && filename.startsWith(pattern.slice(1))) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
if (filename === pattern || filename.endsWith(pattern)) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Ignore hidden files (starting with dot) except common media files
|
|
140
|
+
if (filename.startsWith('.')) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Recursively scan directory for media files
|
|
147
|
+
*/
|
|
148
|
+
export function scanLocalMedia(mediaDir, config) {
|
|
149
|
+
const files = [];
|
|
150
|
+
if (!fs.existsSync(mediaDir)) {
|
|
151
|
+
return files;
|
|
152
|
+
}
|
|
153
|
+
function scanDirectory(currentDir, relativePath = '') {
|
|
154
|
+
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
155
|
+
for (const entry of entries) {
|
|
156
|
+
// Skip ignored files and directories
|
|
157
|
+
if (shouldIgnoreFile(entry.name)) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
161
|
+
const relPath = relativePath ? path.join(relativePath, entry.name) : entry.name;
|
|
162
|
+
if (entry.isDirectory()) {
|
|
163
|
+
scanDirectory(fullPath, relPath);
|
|
164
|
+
}
|
|
165
|
+
else if (entry.isFile()) {
|
|
166
|
+
const ext = path.extname(entry.name);
|
|
167
|
+
const stats = fs.statSync(fullPath);
|
|
168
|
+
// Parse scopeUid from path structure
|
|
169
|
+
// Format: mediaDir/scopeUid/filename or mediaDir/scope/uid/filename
|
|
170
|
+
const scopeUid = path.dirname(relPath).replace(/\\/g, '/');
|
|
171
|
+
const localFile = {
|
|
172
|
+
filePath: relPath.replace(/\\/g, '/'),
|
|
173
|
+
absolutePath: fullPath,
|
|
174
|
+
scopeUid,
|
|
175
|
+
name: entry.name,
|
|
176
|
+
size: stats.size,
|
|
177
|
+
extension: ext,
|
|
178
|
+
mimeType: getMimeType(ext)
|
|
179
|
+
};
|
|
180
|
+
files.push(localFile);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
scanDirectory(mediaDir);
|
|
185
|
+
return files;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Match local and remote media files to determine operations
|
|
189
|
+
*/
|
|
190
|
+
export function matchMediaFiles(localFiles, remoteFiles, allowDelete = false) {
|
|
191
|
+
const operations = [];
|
|
192
|
+
// Create map of remote files by scopeUid + name
|
|
193
|
+
const remoteMap = new Map();
|
|
194
|
+
for (const remote of remoteFiles) {
|
|
195
|
+
const key = `${remote.scopeUid}/${remote.name}`;
|
|
196
|
+
remoteMap.set(key, remote);
|
|
197
|
+
}
|
|
198
|
+
// Create map of local files by scopeUid + name
|
|
199
|
+
const localMap = new Map();
|
|
200
|
+
for (const local of localFiles) {
|
|
201
|
+
const key = `${local.scopeUid}/${local.name}`;
|
|
202
|
+
localMap.set(key, local);
|
|
203
|
+
}
|
|
204
|
+
// Check local files against remote
|
|
205
|
+
for (const local of localFiles) {
|
|
206
|
+
const key = `${local.scopeUid}/${local.name}`;
|
|
207
|
+
const remote = remoteMap.get(key);
|
|
208
|
+
if (!remote) {
|
|
209
|
+
// New file - needs to be uploaded
|
|
210
|
+
operations.push({
|
|
211
|
+
type: 'create',
|
|
212
|
+
local,
|
|
213
|
+
reason: 'New file not present remotely'
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else if (local.size !== remote.size) {
|
|
217
|
+
// File size changed - needs update
|
|
218
|
+
operations.push({
|
|
219
|
+
type: 'update',
|
|
220
|
+
local,
|
|
221
|
+
remote,
|
|
222
|
+
reason: `File size changed (local: ${local.size}, remote: ${remote.size})`
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// No changes detected
|
|
227
|
+
operations.push({
|
|
228
|
+
type: 'skip',
|
|
229
|
+
local,
|
|
230
|
+
remote,
|
|
231
|
+
reason: 'No changes detected'
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Check for deleted files (remote but not local) if deletion is allowed
|
|
236
|
+
if (allowDelete) {
|
|
237
|
+
for (const remote of remoteFiles) {
|
|
238
|
+
const key = `${remote.scopeUid}/${remote.name}`;
|
|
239
|
+
if (!localMap.has(key)) {
|
|
240
|
+
operations.push({
|
|
241
|
+
type: 'delete',
|
|
242
|
+
remote,
|
|
243
|
+
reason: 'File removed locally'
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return operations;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Display media status in formatted output
|
|
252
|
+
*/
|
|
253
|
+
export function displayMediaStatus(operations, dryRun = false, showDelete = false, deps) {
|
|
254
|
+
const log = deps?.logInfo || info;
|
|
255
|
+
const logWarning = deps?.logWarn || warn;
|
|
256
|
+
const logErr = deps?.logError || error;
|
|
257
|
+
const logOk = deps?.logSuccess || success;
|
|
258
|
+
const creates = operations.filter(op => op.type === 'create');
|
|
259
|
+
const updates = operations.filter(op => op.type === 'update');
|
|
260
|
+
const deletes = showDelete ? operations.filter(op => op.type === 'delete') : [];
|
|
261
|
+
const skips = operations.filter(op => op.type === 'skip');
|
|
262
|
+
console.log('\n📊 Media Status:');
|
|
263
|
+
console.log('─'.repeat(80));
|
|
264
|
+
if (creates.length > 0) {
|
|
265
|
+
log(`\n✨ ${creates.length} file(s) to upload:`);
|
|
266
|
+
creates.forEach(op => {
|
|
267
|
+
const sizeKB = ((op.local.size / 1024).toFixed(2));
|
|
268
|
+
console.log(` + ${op.local.scopeUid}/${op.local.name} (${sizeKB}KB)`);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
if (updates.length > 0) {
|
|
272
|
+
logWarning(`\n📝 ${updates.length} file(s) to update:`);
|
|
273
|
+
updates.forEach(op => {
|
|
274
|
+
const sizeKB = ((op.local.size / 1024).toFixed(2));
|
|
275
|
+
console.log(` ↻ ${op.local.scopeUid}/${op.local.name} (${sizeKB}KB)`);
|
|
276
|
+
console.log(` ${op.reason}`);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
if (deletes.length > 0) {
|
|
280
|
+
logErr(`\n🗑️ ${deletes.length} file(s) to delete:`);
|
|
281
|
+
deletes.forEach(op => {
|
|
282
|
+
console.log(` - ${op.remote.scopeUid}/${op.remote.name}`);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
if (skips.length > 0) {
|
|
286
|
+
log(`\n✓ ${skips.length} file(s) up to date`);
|
|
287
|
+
}
|
|
288
|
+
console.log('\n' + '─'.repeat(80));
|
|
289
|
+
const totalOperations = creates.length + updates.length + deletes.length;
|
|
290
|
+
if (totalOperations === 0) {
|
|
291
|
+
logOk('All media files are in sync! ✨');
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
if (dryRun) {
|
|
295
|
+
log(`\nDry run complete. Run without --dry-run to apply ${totalOperations} change(s).`);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
log(`\nReady to apply ${totalOperations} change(s).`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
console.log('');
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Execute media push operations and return detailed results
|
|
305
|
+
*/
|
|
306
|
+
export async function executeMediaPush(operations, dryRun = false, deps) {
|
|
307
|
+
const defaults = getDefaultDependencies();
|
|
308
|
+
const uploadMedia = deps?.uploadMedia || defaults.uploadMedia;
|
|
309
|
+
const updateMedia = deps?.updateMedia || defaults.updateMedia;
|
|
310
|
+
const deleteMedia = deps?.deleteMedia || defaults.deleteMedia;
|
|
311
|
+
const logErr = deps?.logError || defaults.logError;
|
|
312
|
+
const logOk = deps?.logSuccess || defaults.logSuccess;
|
|
313
|
+
const logWarning = deps?.logWarn || defaults.logWarn;
|
|
314
|
+
const result = {
|
|
315
|
+
operations,
|
|
316
|
+
executed: { successful: 0, failed: 0, skipped: 0 },
|
|
317
|
+
errors: []
|
|
318
|
+
};
|
|
319
|
+
if (dryRun) {
|
|
320
|
+
displayMediaStatus(operations, true, true, deps);
|
|
321
|
+
result.executed.skipped = operations.length;
|
|
322
|
+
return result;
|
|
323
|
+
}
|
|
324
|
+
const creates = operations.filter(op => op.type === 'create');
|
|
325
|
+
const updates = operations.filter(op => op.type === 'update');
|
|
326
|
+
const deletes = operations.filter(op => op.type === 'delete');
|
|
327
|
+
const skips = operations.filter(op => op.type === 'skip');
|
|
328
|
+
result.executed.skipped = skips.length;
|
|
329
|
+
// Upload new files
|
|
330
|
+
for (const op of creates) {
|
|
331
|
+
try {
|
|
332
|
+
const validation = validateFileSize(op.local);
|
|
333
|
+
if (!validation.valid) {
|
|
334
|
+
logErr(`✗ ${op.local.scopeUid}/${op.local.name}: ${validation.message}`);
|
|
335
|
+
result.executed.failed++;
|
|
336
|
+
result.errors.push({ operation: op, error: validation.message });
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
const formData = new FormData();
|
|
340
|
+
formData.append('File', fs.createReadStream(op.local.absolutePath));
|
|
341
|
+
formData.append('ScopeUid', op.local.scopeUid);
|
|
342
|
+
await uploadMedia(formData);
|
|
343
|
+
logOk(`✓ Uploaded ${op.local.scopeUid}/${op.local.name}`);
|
|
344
|
+
result.executed.successful++;
|
|
345
|
+
}
|
|
346
|
+
catch (err) {
|
|
347
|
+
logErr(`✗ Failed to upload ${op.local.scopeUid}/${op.local.name}: ${err.message}`);
|
|
348
|
+
result.executed.failed++;
|
|
349
|
+
result.errors.push({ operation: op, error: err.message });
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// Update modified files
|
|
353
|
+
for (const op of updates) {
|
|
354
|
+
try {
|
|
355
|
+
const validation = validateFileSize(op.local);
|
|
356
|
+
if (!validation.valid) {
|
|
357
|
+
logErr(`✗ ${op.local.scopeUid}/${op.local.name}: ${validation.message}`);
|
|
358
|
+
result.executed.failed++;
|
|
359
|
+
result.errors.push({ operation: op, error: validation.message });
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
const formData = new FormData();
|
|
363
|
+
formData.append('File', fs.createReadStream(op.local.absolutePath));
|
|
364
|
+
formData.append('ScopeUid', op.local.scopeUid);
|
|
365
|
+
formData.append('FileName', op.local.name);
|
|
366
|
+
await updateMedia(formData);
|
|
367
|
+
logOk(`✓ Updated ${op.local.scopeUid}/${op.local.name}`);
|
|
368
|
+
result.executed.successful++;
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
logErr(`✗ Failed to update ${op.local.scopeUid}/${op.local.name}: ${err.message}`);
|
|
372
|
+
result.executed.failed++;
|
|
373
|
+
result.errors.push({ operation: op, error: err.message });
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// Delete removed files
|
|
377
|
+
for (const op of deletes) {
|
|
378
|
+
try {
|
|
379
|
+
const pathToFile = `${op.remote.scopeUid}/${op.remote.name}`;
|
|
380
|
+
await deleteMedia(pathToFile);
|
|
381
|
+
logOk(`✓ Deleted ${pathToFile}`);
|
|
382
|
+
result.executed.successful++;
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
logErr(`✗ Failed to delete ${op.remote.scopeUid}/${op.remote.name}: ${err.message}`);
|
|
386
|
+
result.executed.failed++;
|
|
387
|
+
result.errors.push({ operation: op, error: err.message });
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Summary
|
|
391
|
+
console.log('\n' + '─'.repeat(80));
|
|
392
|
+
if (result.executed.failed === 0) {
|
|
393
|
+
logOk(`\n✨ Media push complete! ${result.executed.successful} operation(s) successful.`);
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
logWarning(`\n⚠️ Media push completed with errors: ${result.executed.successful} succeeded, ${result.executed.failed} failed.`);
|
|
397
|
+
}
|
|
398
|
+
console.log('');
|
|
399
|
+
return result;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Status-only function (no modifications) - returns results for testing
|
|
403
|
+
*/
|
|
404
|
+
export async function statusMedia(options = {}, deps) {
|
|
405
|
+
const defaults = getDefaultDependencies();
|
|
406
|
+
const fetchRemoteMedia = deps?.fetchRemoteMedia || defaults.fetchRemoteMedia;
|
|
407
|
+
const logInfoFn = deps?.logInfo || defaults.logInfo;
|
|
408
|
+
const logWarnFn = deps?.logWarn || defaults.logWarn;
|
|
409
|
+
const logErrFn = deps?.logError || defaults.logError;
|
|
410
|
+
try {
|
|
411
|
+
const config = loadConfig();
|
|
412
|
+
// Use provided mediaDir or resolve from config
|
|
413
|
+
const mediaDir = options.mediaDir || path.resolve(process.cwd(), config.mediaDir || 'media');
|
|
414
|
+
logInfoFn(`Scanning local media: ${mediaDir}`);
|
|
415
|
+
const localFiles = scanLocalMedia(mediaDir, config);
|
|
416
|
+
if (localFiles.length === 0) {
|
|
417
|
+
logWarnFn('No media files found locally.');
|
|
418
|
+
return {
|
|
419
|
+
operations: [],
|
|
420
|
+
localFiles: [],
|
|
421
|
+
remoteFiles: [],
|
|
422
|
+
summary: { creates: 0, updates: 0, deletes: 0, skips: 0, total: 0 }
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
logInfoFn(`Fetching remote media from LeadCMS...`);
|
|
426
|
+
const remoteFiles = await fetchRemoteMedia();
|
|
427
|
+
let filteredLocal = localFiles;
|
|
428
|
+
let filteredRemote = remoteFiles;
|
|
429
|
+
if (options.scopeUid) {
|
|
430
|
+
filteredLocal = localFiles.filter(f => f.scopeUid === options.scopeUid);
|
|
431
|
+
filteredRemote = remoteFiles.filter(f => f.scopeUid === options.scopeUid);
|
|
432
|
+
}
|
|
433
|
+
// Show deletes only if showDelete flag is provided
|
|
434
|
+
const operations = matchMediaFiles(filteredLocal, filteredRemote, options.showDelete || false);
|
|
435
|
+
displayMediaStatus(operations, false, options.showDelete || false, deps);
|
|
436
|
+
const creates = operations.filter(op => op.type === 'create').length;
|
|
437
|
+
const updates = operations.filter(op => op.type === 'update').length;
|
|
438
|
+
const deletes = operations.filter(op => op.type === 'delete').length;
|
|
439
|
+
const skips = operations.filter(op => op.type === 'skip').length;
|
|
440
|
+
return {
|
|
441
|
+
operations,
|
|
442
|
+
localFiles: filteredLocal,
|
|
443
|
+
remoteFiles: filteredRemote,
|
|
444
|
+
summary: {
|
|
445
|
+
creates,
|
|
446
|
+
updates,
|
|
447
|
+
deletes,
|
|
448
|
+
skips,
|
|
449
|
+
total: creates + updates + deletes
|
|
450
|
+
}
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
catch (err) {
|
|
454
|
+
logErrFn(`Media status check failed: ${err.message}`);
|
|
455
|
+
throw err;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Main function to push media files to LeadCMS - returns results for testing
|
|
460
|
+
*/
|
|
461
|
+
export async function pushMedia(options = {}, deps) {
|
|
462
|
+
const defaults = getDefaultDependencies();
|
|
463
|
+
const fetchRemoteMedia = deps?.fetchRemoteMedia || defaults.fetchRemoteMedia;
|
|
464
|
+
const logInfoFn = deps?.logInfo || defaults.logInfo;
|
|
465
|
+
const logWarnFn = deps?.logWarn || defaults.logWarn;
|
|
466
|
+
const logErrFn = deps?.logError || defaults.logError;
|
|
467
|
+
const promptConfirmation = deps?.promptConfirmation || defaults.promptConfirmation;
|
|
468
|
+
try {
|
|
469
|
+
const config = loadConfig();
|
|
470
|
+
// Use provided mediaDir or resolve from config
|
|
471
|
+
const mediaDir = options.mediaDir || path.resolve(process.cwd(), config.mediaDir || 'media');
|
|
472
|
+
logInfoFn(`Scanning local media: ${mediaDir}`);
|
|
473
|
+
const localFiles = scanLocalMedia(mediaDir, config);
|
|
474
|
+
if (localFiles.length === 0) {
|
|
475
|
+
logWarnFn('No media files found locally.');
|
|
476
|
+
return {
|
|
477
|
+
operations: [],
|
|
478
|
+
executed: { successful: 0, failed: 0, skipped: 0 },
|
|
479
|
+
errors: []
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
logInfoFn(`Fetching remote media from LeadCMS...`);
|
|
483
|
+
const remoteFiles = await fetchRemoteMedia();
|
|
484
|
+
// Filter by scopeUid if specified
|
|
485
|
+
let filteredLocal = localFiles;
|
|
486
|
+
let filteredRemote = remoteFiles;
|
|
487
|
+
if (options.scopeUid) {
|
|
488
|
+
filteredLocal = localFiles.filter(f => f.scopeUid === options.scopeUid);
|
|
489
|
+
filteredRemote = remoteFiles.filter(f => f.scopeUid === options.scopeUid);
|
|
490
|
+
logInfoFn(`Filtering by scope: ${options.scopeUid}`);
|
|
491
|
+
}
|
|
492
|
+
// Match and determine operations
|
|
493
|
+
const operations = matchMediaFiles(filteredLocal, filteredRemote, options.allowDelete || false);
|
|
494
|
+
// Display and execute (always show deletes in push mode)
|
|
495
|
+
displayMediaStatus(operations, options.dryRun, true, deps);
|
|
496
|
+
if (options.dryRun) {
|
|
497
|
+
return {
|
|
498
|
+
operations,
|
|
499
|
+
executed: { successful: 0, failed: 0, skipped: operations.length },
|
|
500
|
+
errors: []
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
const totalOps = operations.filter(op => op.type !== 'skip').length;
|
|
504
|
+
if (totalOps === 0) {
|
|
505
|
+
return {
|
|
506
|
+
operations,
|
|
507
|
+
executed: { successful: 0, failed: 0, skipped: operations.length },
|
|
508
|
+
errors: []
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
// Confirm changes unless --force is used
|
|
512
|
+
if (!options.force) {
|
|
513
|
+
const confirmMsg = `\nProceed with applying ${totalOps} change(s) to LeadCMS? (y/N): `;
|
|
514
|
+
const confirmed = await promptConfirmation(confirmMsg);
|
|
515
|
+
if (!confirmed) {
|
|
516
|
+
console.log('🚫 Push cancelled.');
|
|
517
|
+
return {
|
|
518
|
+
operations,
|
|
519
|
+
executed: { successful: 0, failed: 0, skipped: operations.length },
|
|
520
|
+
errors: []
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
return await executeMediaPush(operations, false, deps);
|
|
525
|
+
}
|
|
526
|
+
catch (err) {
|
|
527
|
+
logErrFn(`Media push failed: ${err.message}`);
|
|
528
|
+
throw err;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
//# sourceMappingURL=push-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-media.js","sourceRoot":"","sources":["../../src/scripts/push-media.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leadcms/sdk",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Official SDK and CLI tools for LeadCMS - framework-agnostic content management for static site generators",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
16
|
"build": "npm run clean && npm run compile",
|
|
17
|
-
"compile": "tsc && cp -r src/templates dist/ && chmod +x dist/cli/index.js",
|
|
17
|
+
"compile": "tsc && cp -r src/templates dist/ && chmod +x dist/cli/index.js dist/cli/bin/*.js",
|
|
18
18
|
"clean": "rm -rf dist",
|
|
19
19
|
"dev": "npm run build && tsc --watch",
|
|
20
20
|
"test": "jest",
|