@embeddables/cli 0.9.6 → 0.11.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 (85) hide show
  1. package/.prompts/embeddables-cli.md +66 -3
  2. package/README.md +1 -0
  3. package/dist/assets-manifest.d.ts +31 -0
  4. package/dist/assets-manifest.d.ts.map +1 -0
  5. package/dist/assets-manifest.js +59 -0
  6. package/dist/assets-manifest.js.map +1 -0
  7. package/dist/cli.js +119 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/command-history.d.ts +13 -0
  10. package/dist/command-history.d.ts.map +1 -0
  11. package/dist/command-history.js +35 -0
  12. package/dist/command-history.js.map +1 -0
  13. package/dist/commands/assets-sync.d.ts +6 -0
  14. package/dist/commands/assets-sync.d.ts.map +1 -0
  15. package/dist/commands/assets-sync.js +35 -0
  16. package/dist/commands/assets-sync.js.map +1 -0
  17. package/dist/commands/assets-upload.d.ts +13 -0
  18. package/dist/commands/assets-upload.d.ts.map +1 -0
  19. package/dist/commands/assets-upload.js +475 -0
  20. package/dist/commands/assets-upload.js.map +1 -0
  21. package/dist/commands/diff.d.ts +90 -0
  22. package/dist/commands/diff.d.ts.map +1 -0
  23. package/dist/commands/diff.js +738 -0
  24. package/dist/commands/diff.js.map +1 -0
  25. package/dist/commands/experiments-connect.js +22 -19
  26. package/dist/commands/experiments-connect.js.map +1 -1
  27. package/dist/commands/feedback.d.ts +29 -0
  28. package/dist/commands/feedback.d.ts.map +1 -0
  29. package/dist/commands/feedback.js +275 -0
  30. package/dist/commands/feedback.js.map +1 -0
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +11 -90
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/commands/pull.d.ts.map +1 -1
  35. package/dist/commands/pull.js +3 -0
  36. package/dist/commands/pull.js.map +1 -1
  37. package/dist/compiler/errors.d.ts +7 -0
  38. package/dist/compiler/errors.d.ts.map +1 -1
  39. package/dist/compiler/errors.js +10 -0
  40. package/dist/compiler/errors.js.map +1 -1
  41. package/dist/compiler/index.d.ts.map +1 -1
  42. package/dist/compiler/index.js +4 -2
  43. package/dist/compiler/index.js.map +1 -1
  44. package/dist/constants/defaultTagStylesV4.d.ts +6 -0
  45. package/dist/constants/defaultTagStylesV4.d.ts.map +1 -0
  46. package/dist/constants/defaultTagStylesV4.js +659 -0
  47. package/dist/constants/defaultTagStylesV4.js.map +1 -0
  48. package/dist/constants.d.ts +2 -0
  49. package/dist/constants.d.ts.map +1 -1
  50. package/dist/constants.js +2 -0
  51. package/dist/constants.js.map +1 -1
  52. package/dist/group-context.d.ts +2 -0
  53. package/dist/group-context.d.ts.map +1 -0
  54. package/dist/group-context.js +29 -0
  55. package/dist/group-context.js.map +1 -0
  56. package/dist/helpers/typeStubs.d.ts +25 -0
  57. package/dist/helpers/typeStubs.d.ts.map +1 -0
  58. package/dist/helpers/typeStubs.js +153 -0
  59. package/dist/helpers/typeStubs.js.map +1 -0
  60. package/dist/logger.d.ts +5 -2
  61. package/dist/logger.d.ts.map +1 -1
  62. package/dist/logger.js +33 -12
  63. package/dist/logger.js.map +1 -1
  64. package/dist/prompts/experiments.d.ts +3 -1
  65. package/dist/prompts/experiments.d.ts.map +1 -1
  66. package/dist/prompts/experiments.js +12 -5
  67. package/dist/prompts/experiments.js.map +1 -1
  68. package/dist/stdout.d.ts +4 -0
  69. package/dist/stdout.d.ts.map +1 -1
  70. package/dist/stdout.js +33 -3
  71. package/dist/stdout.js.map +1 -1
  72. package/dist/workbench/FieldEditorPanel.d.ts +2 -1
  73. package/dist/workbench/FieldEditorPanel.d.ts.map +1 -1
  74. package/dist/workbench/FieldEditorPanel.js +21 -10
  75. package/dist/workbench/FieldEditorPanel.js.map +1 -1
  76. package/dist/workbench/UserDataPanel.d.ts.map +1 -1
  77. package/dist/workbench/UserDataPanel.js +103 -3
  78. package/dist/workbench/UserDataPanel.js.map +1 -1
  79. package/dist/{commands/build-workbench.d.ts → workbench/build.d.ts} +1 -1
  80. package/dist/workbench/build.d.ts.map +1 -0
  81. package/dist/{commands/build-workbench.js → workbench/build.js} +1 -1
  82. package/dist/workbench/build.js.map +1 -0
  83. package/package.json +1 -1
  84. package/dist/commands/build-workbench.d.ts.map +0 -1
  85. package/dist/commands/build-workbench.js.map +0 -1
@@ -0,0 +1,475 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import pc from 'picocolors';
4
+ import * as Sentry from '@sentry/node';
5
+ import { getAuthenticatedSupabaseClient, isLoggedIn } from '../auth/index.js';
6
+ import { readAssetsManifest, syncAssetsManifest } from '../assets-manifest.js';
7
+ import { ASSETS_UPLOAD_WORKER_BASE_URL } from '../constants.js';
8
+ import { resolveGroupId } from '../group-context.js';
9
+ import { captureException, createLogger, exit } from '../logger.js';
10
+ import { promptForLocalEmbeddable } from '../prompts/index.js';
11
+ import { getSentryContextFromEmbeddableConfig, getSentryContextFromProjectConfig, setSentryContext, } from '../sentry-context.js';
12
+ import * as stdout from '../stdout.js';
13
+ import { inferEmbeddableFromCwd } from '../helpers/utils.js';
14
+ import { withSpan } from '../tracing.js';
15
+ const ALLOWED_EXTENSIONS = new Set([
16
+ '.png',
17
+ '.jpg',
18
+ '.jpeg',
19
+ '.gif',
20
+ '.webp',
21
+ '.svg',
22
+ '.ico',
23
+ '.bmp',
24
+ '.tiff',
25
+ '.tif',
26
+ '.avif',
27
+ '.mp4',
28
+ '.webm',
29
+ '.ogg',
30
+ '.mp3',
31
+ '.wav',
32
+ '.pdf',
33
+ '.json',
34
+ '.woff',
35
+ '.woff2',
36
+ '.ttf',
37
+ '.otf',
38
+ '.eot',
39
+ '.css',
40
+ '.js',
41
+ ]);
42
+ const EXTENSION_TO_MIME = {
43
+ '.png': 'image/png',
44
+ '.jpg': 'image/jpeg',
45
+ '.jpeg': 'image/jpeg',
46
+ '.gif': 'image/gif',
47
+ '.webp': 'image/webp',
48
+ '.svg': 'image/svg+xml',
49
+ '.ico': 'image/x-icon',
50
+ '.bmp': 'image/bmp',
51
+ '.tiff': 'image/tiff',
52
+ '.tif': 'image/tiff',
53
+ '.avif': 'image/avif',
54
+ '.mp4': 'video/mp4',
55
+ '.webm': 'video/webm',
56
+ '.ogg': 'audio/ogg',
57
+ '.mp3': 'audio/mpeg',
58
+ '.wav': 'audio/wav',
59
+ '.pdf': 'application/pdf',
60
+ '.json': 'application/json',
61
+ '.woff': 'font/woff',
62
+ '.woff2': 'font/woff2',
63
+ '.ttf': 'font/ttf',
64
+ '.otf': 'font/otf',
65
+ '.eot': 'application/vnd.ms-fontobject',
66
+ '.css': 'text/css',
67
+ '.js': 'text/javascript',
68
+ };
69
+ function getMimeType(filePath) {
70
+ const ext = path.extname(filePath).toLowerCase();
71
+ return EXTENSION_TO_MIME[ext] ?? 'application/octet-stream';
72
+ }
73
+ function isAllowedFile(filePath) {
74
+ const ext = path.extname(filePath).toLowerCase();
75
+ return ALLOWED_EXTENSIONS.has(ext);
76
+ }
77
+ /** Recursively collect all files from a directory. */
78
+ function collectFiles(dir, recursive) {
79
+ const results = [];
80
+ if (!fs.existsSync(dir))
81
+ return results;
82
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
83
+ for (const entry of entries) {
84
+ const fullPath = path.join(dir, entry.name);
85
+ if (entry.isDirectory()) {
86
+ if (recursive) {
87
+ results.push(...collectFiles(fullPath, recursive));
88
+ }
89
+ }
90
+ else if (entry.isFile()) {
91
+ results.push(fullPath);
92
+ }
93
+ }
94
+ return results;
95
+ }
96
+ /** Apply include/exclude glob filters to a list of file paths. */
97
+ async function applyGlobFilters(files, include, exclude) {
98
+ if (!include && !exclude)
99
+ return files;
100
+ const { default: fg } = await import('fast-glob');
101
+ let filtered = files;
102
+ if (include) {
103
+ const patterns = include.split(',').map((p) => p.trim());
104
+ const matched = new Set(await fg(patterns, { absolute: true }));
105
+ filtered = filtered.filter((f) => matched.has(path.resolve(f)));
106
+ }
107
+ if (exclude) {
108
+ const patterns = exclude.split(',').map((p) => p.trim());
109
+ const excluded = new Set(await fg(patterns, { absolute: true }));
110
+ filtered = filtered.filter((f) => !excluded.has(path.resolve(f)));
111
+ }
112
+ return filtered;
113
+ }
114
+ const MAX_FILE_SIZE = 50 * 1024 * 1024; // 50 MB
115
+ function normalizeRelativePath(relativePath) {
116
+ return relativePath.replace(/\\/g, '/').replace(/^\.?\//, '');
117
+ }
118
+ async function uploadSingleFile(filePath) {
119
+ const fileBuffer = fs.readFileSync(filePath);
120
+ const fileName = path.basename(filePath);
121
+ const mimeType = getMimeType(filePath);
122
+ const parsed = path.parse(fileName);
123
+ const safeBaseName = parsed.name.replace(/[^a-zA-Z0-9-_.]/g, '') || 'asset';
124
+ const workerFileName = `${safeBaseName}_${Math.random().toString(36).slice(2, 8)}${parsed.ext}`;
125
+ const uploadUrl = `${ASSETS_UPLOAD_WORKER_BASE_URL}/${encodeURIComponent(workerFileName)}`;
126
+ const response = await fetch(uploadUrl, {
127
+ method: 'POST',
128
+ headers: {
129
+ 'Content-Type': mimeType,
130
+ },
131
+ body: fileBuffer,
132
+ });
133
+ if (response.status === 413) {
134
+ throw new Error(`File too large: ${fileName}`);
135
+ }
136
+ if (!response.ok) {
137
+ let errorMessage = `HTTP ${response.status}`;
138
+ try {
139
+ const bodyText = await response.text();
140
+ if (bodyText.trim().length > 0)
141
+ errorMessage = `${errorMessage}: ${bodyText.trim()}`;
142
+ }
143
+ catch {
144
+ // use default HTTP status message
145
+ }
146
+ throw new Error(errorMessage);
147
+ }
148
+ let uploadedUrl = '';
149
+ try {
150
+ const result = (await response.json());
151
+ uploadedUrl = result?.data?.url ?? '';
152
+ }
153
+ catch {
154
+ // If the worker returns no JSON body, return the canonical object URL.
155
+ uploadedUrl = `${ASSETS_UPLOAD_WORKER_BASE_URL}/${workerFileName}`;
156
+ }
157
+ return { url: uploadedUrl };
158
+ }
159
+ export async function runAssetsUpload(opts) {
160
+ const logger = createLogger('runAssetsUpload');
161
+ const uploadStart = performance.now();
162
+ try {
163
+ await runAssetsUploadInner(opts);
164
+ Sentry.metrics.distribution('cli.assets_upload.duration', performance.now() - uploadStart, {
165
+ unit: 'millisecond',
166
+ attributes: { embeddableId: opts.id ?? 'unknown' },
167
+ });
168
+ }
169
+ catch (error) {
170
+ Sentry.metrics.count('cli.assets_upload.failed', 1, {
171
+ attributes: { embeddableId: opts.id ?? 'unknown' },
172
+ });
173
+ captureException(error, 'Assets upload failed');
174
+ if (error instanceof Error) {
175
+ stdout.error(`Assets upload failed: ${error.message}`);
176
+ }
177
+ else {
178
+ stdout.error('Assets upload failed with an unexpected error.');
179
+ }
180
+ logger.error('assets upload failed', {
181
+ message: error instanceof Error ? error.message : 'unexpected error',
182
+ });
183
+ await exit(1);
184
+ }
185
+ }
186
+ async function runAssetsUploadInner(opts) {
187
+ const logger = createLogger('runAssetsUpload');
188
+ // 1. Check login
189
+ if (!isLoggedIn()) {
190
+ stdout.warn('Not logged in.');
191
+ stdout.dim('Run "embeddables login" first.');
192
+ logger.error('not logged in');
193
+ await exit(1);
194
+ return;
195
+ }
196
+ // 2. Resolve embeddable ID / project-level mode
197
+ const inferred = inferEmbeddableFromCwd();
198
+ let embeddableId = opts.id ?? inferred?.embeddableId;
199
+ if (inferred && !opts.id && embeddableId) {
200
+ process.chdir(inferred.projectRoot);
201
+ }
202
+ setSentryContext(getSentryContextFromProjectConfig());
203
+ const projectLevelUpload = opts.project === true || opts.dir === 'assets';
204
+ if (!projectLevelUpload && !embeddableId) {
205
+ const selected = await promptForLocalEmbeddable({
206
+ message: 'Select an embeddable to upload assets for:',
207
+ });
208
+ if (!selected) {
209
+ await exit(1);
210
+ return;
211
+ }
212
+ embeddableId = selected;
213
+ stdout.gap();
214
+ }
215
+ if (embeddableId) {
216
+ const embeddableCtx = getSentryContextFromEmbeddableConfig(embeddableId);
217
+ setSentryContext({
218
+ embeddable: { id: embeddableId },
219
+ ...embeddableCtx,
220
+ });
221
+ }
222
+ // 4. Resolve group ID
223
+ const groupId = await resolveGroupId(opts.groupId);
224
+ if (!groupId) {
225
+ stdout.error('Could not determine group ID for this project.');
226
+ stdout.dim('Set `org_id` in embeddables.json or pass `--group-id`.');
227
+ await exit(1);
228
+ return;
229
+ }
230
+ // 5. Resolve asset directory
231
+ const assetDir = opts.dir ?? (projectLevelUpload ? 'assets' : path.join('embeddables', embeddableId, 'assets'));
232
+ const resolvedDir = path.resolve(assetDir);
233
+ if (!fs.existsSync(resolvedDir)) {
234
+ stdout.error(`Asset directory not found: ${resolvedDir}`);
235
+ stdout.dim('Create the directory and add files, or use --dir to specify a different path.');
236
+ logger.error('asset directory not found', { dir: resolvedDir });
237
+ await exit(1);
238
+ return;
239
+ }
240
+ if (!fs.statSync(resolvedDir).isDirectory()) {
241
+ stdout.error(`Not a directory: ${resolvedDir}`);
242
+ logger.error('path is not a directory', { dir: resolvedDir });
243
+ await exit(1);
244
+ return;
245
+ }
246
+ // 6. Enumerate files
247
+ const recursive = opts.recursive ?? false;
248
+ const allFiles = collectFiles(resolvedDir, recursive);
249
+ if (allFiles.length === 0) {
250
+ stdout.warn(`No files found in ${resolvedDir}`);
251
+ if (!recursive) {
252
+ stdout.dim('Use --recursive to include files in subdirectories.');
253
+ }
254
+ logger.info('no files found', { dir: resolvedDir, recursive });
255
+ await exit(0);
256
+ return;
257
+ }
258
+ // Apply glob filters
259
+ let files = await applyGlobFilters(allFiles, opts.include, opts.exclude);
260
+ if (files.length === 0) {
261
+ stdout.warn('No files match the include/exclude filters.');
262
+ logger.info('no files after filtering');
263
+ await exit(0);
264
+ return;
265
+ }
266
+ // 7. Validate files and split into uploadable vs skipped
267
+ const toUpload = [];
268
+ const results = [];
269
+ const manifestPath = path.resolve('assets.json');
270
+ const existingManifest = readAssetsManifest(manifestPath);
271
+ const existingRelativePaths = new Set((existingManifest?.assets ?? [])
272
+ .filter((asset) => {
273
+ if (!asset.relativePath)
274
+ return false;
275
+ if (projectLevelUpload)
276
+ return asset.flow_id === null;
277
+ return asset.flow_id === embeddableId;
278
+ })
279
+ .map((asset) => normalizeRelativePath(asset.relativePath)));
280
+ for (const file of files) {
281
+ const relativePath = normalizeRelativePath(path.relative(resolvedDir, file));
282
+ if (!isAllowedFile(file)) {
283
+ results.push({
284
+ file: relativePath,
285
+ status: 'skipped',
286
+ reason: `Unsupported file type: ${path.extname(file) || '(no extension)'}`,
287
+ });
288
+ continue;
289
+ }
290
+ const stat = fs.statSync(file);
291
+ if (stat.size > MAX_FILE_SIZE) {
292
+ results.push({
293
+ file: relativePath,
294
+ status: 'skipped',
295
+ reason: `File too large (${(stat.size / 1024 / 1024).toFixed(1)} MB, max ${MAX_FILE_SIZE / 1024 / 1024} MB)`,
296
+ });
297
+ continue;
298
+ }
299
+ if (stat.size === 0) {
300
+ results.push({
301
+ file: relativePath,
302
+ status: 'skipped',
303
+ reason: 'Empty file',
304
+ });
305
+ continue;
306
+ }
307
+ if (existingRelativePaths.has(relativePath)) {
308
+ results.push({
309
+ file: relativePath,
310
+ status: 'skipped',
311
+ reason: 'Already uploaded (tracked in assets.json)',
312
+ });
313
+ continue;
314
+ }
315
+ toUpload.push(file);
316
+ }
317
+ const totalDiscovered = files.length;
318
+ const skippedCount = results.filter((r) => r.status === 'skipped').length;
319
+ stdout.gap();
320
+ stdout.step(`Found ${totalDiscovered} file${totalDiscovered !== 1 ? 's' : ''} in ${pc.cyan(assetDir)}${skippedCount > 0 ? ` (${skippedCount} skipped)` : ''}`);
321
+ if (skippedCount > 0) {
322
+ for (const r of results.filter((r) => r.status === 'skipped')) {
323
+ stdout.dim(` Skipped: ${r.file} — ${r.reason}`);
324
+ }
325
+ }
326
+ if (toUpload.length === 0) {
327
+ stdout.warn('No files to upload after validation.');
328
+ logger.info('no uploadable files');
329
+ await exit(0);
330
+ return;
331
+ }
332
+ // 8. Dry run mode
333
+ if (opts.dryRun) {
334
+ stdout.gap();
335
+ stdout.step(`Dry run — ${toUpload.length} file${toUpload.length !== 1 ? 's' : ''} would be uploaded:`);
336
+ for (const file of toUpload) {
337
+ const relPath = path.relative(resolvedDir, file);
338
+ const mime = getMimeType(file);
339
+ const size = fs.statSync(file).size;
340
+ const sizeStr = size >= 1024 * 1024
341
+ ? `${(size / 1024 / 1024).toFixed(1)} MB`
342
+ : `${(size / 1024).toFixed(1)} KB`;
343
+ stdout.dim(` ${relPath} (${mime}, ${sizeStr})`);
344
+ }
345
+ stdout.gap();
346
+ stdout.successBox(`Dry run complete. ${toUpload.length} file${toUpload.length !== 1 ? 's' : ''} would be uploaded.`, { title: 'Dry Run' });
347
+ stdout.gap();
348
+ return;
349
+ }
350
+ // 9. Upload files with concurrency
351
+ const concurrency = Math.max(1, Math.min(20, parseInt(opts.concurrency ?? '5', 10) || 5));
352
+ let uploadedCount = 0;
353
+ let failedCount = 0;
354
+ const uploadedByUrl = new Map();
355
+ await stdout.withSpinner(`Uploading ${toUpload.length} file${toUpload.length !== 1 ? 's' : ''}…`, async (s) => {
356
+ await withSpan('assets_upload.upload_all', 'cli.assets_upload', async () => {
357
+ const queue = [...toUpload];
358
+ const workers = Array.from({ length: Math.min(concurrency, queue.length) }, async () => {
359
+ while (queue.length > 0) {
360
+ const file = queue.shift();
361
+ const relPath = path.relative(resolvedDir, file);
362
+ try {
363
+ const result = await uploadSingleFile(file);
364
+ results.push({ file: relPath, status: 'uploaded', url: result.url });
365
+ if (result.url)
366
+ uploadedByUrl.set(result.url, normalizeRelativePath(relPath));
367
+ uploadedCount++;
368
+ }
369
+ catch (err) {
370
+ const message = err instanceof Error ? err.message : String(err);
371
+ results.push({ file: relPath, status: 'failed', reason: message });
372
+ failedCount++;
373
+ logger.warn('file upload failed', { file: relPath, error: message });
374
+ }
375
+ s.text = `Uploading… (${uploadedCount + failedCount}/${toUpload.length})`;
376
+ }
377
+ });
378
+ await Promise.all(workers);
379
+ }, { embeddableId: embeddableId ?? 'project_assets', groupId, fileCount: toUpload.length });
380
+ }, {
381
+ successText: `Uploaded ${uploadedCount} file${uploadedCount !== 1 ? 's' : ''}${failedCount > 0 ? ` (${failedCount} failed)` : ''}`,
382
+ failText: 'Upload failed',
383
+ });
384
+ // 10. Print summary
385
+ Sentry.metrics.count('cli.assets_upload.completed', 1, {
386
+ attributes: {
387
+ embeddableId: embeddableId ?? 'project_assets',
388
+ uploaded: uploadedCount,
389
+ failed: failedCount,
390
+ skipped: skippedCount,
391
+ },
392
+ });
393
+ stdout.gap();
394
+ if (failedCount > 0) {
395
+ stdout.warn(`${failedCount} file${failedCount !== 1 ? 's' : ''} failed to upload:`);
396
+ for (const r of results.filter((r) => r.status === 'failed')) {
397
+ stdout.dim(` ${r.file} — ${r.reason}`);
398
+ }
399
+ stdout.gap();
400
+ }
401
+ const uploadedResults = results.filter((r) => r.status === 'uploaded');
402
+ if (uploadedResults.length > 0) {
403
+ stdout.step('Uploaded URLs:');
404
+ for (const r of uploadedResults) {
405
+ stdout.dim(` ${r.file} → ${r.url || '(no URL returned)'}`);
406
+ }
407
+ stdout.gap();
408
+ }
409
+ const successfulAssets = uploadedResults
410
+ .map((r) => ({ file: r.file, url: r.url ?? '', name: path.basename(r.file) }))
411
+ .filter((asset) => asset.url.length > 0);
412
+ if (successfulAssets.length > 0) {
413
+ const supabase = await getAuthenticatedSupabaseClient();
414
+ if (!supabase) {
415
+ stdout.warn('Could not sync assets metadata (not authenticated Supabase client).');
416
+ stdout.dim('Run "embeddables login" and then "embeddables assets sync".');
417
+ }
418
+ else {
419
+ const flowId = projectLevelUpload ? null : embeddableId;
420
+ const rows = successfulAssets.map((asset) => ({
421
+ group_id: groupId,
422
+ flow_id: flowId,
423
+ name: asset.name,
424
+ url: asset.url,
425
+ archived: false,
426
+ }));
427
+ const { error: insertError } = await supabase.from('assets').insert(rows);
428
+ if (insertError) {
429
+ stdout.warn(`Uploaded files, but failed to write metadata: ${insertError.message}`);
430
+ stdout.dim('You can run "embeddables assets sync" after fixing permissions.');
431
+ }
432
+ else {
433
+ try {
434
+ await syncAssetsManifest({
435
+ supabase,
436
+ groupId,
437
+ outFilePath: manifestPath,
438
+ relativePathByUrl: uploadedByUrl,
439
+ });
440
+ stdout.success(`Synced ${path.basename(manifestPath)} after upload.`);
441
+ }
442
+ catch (syncError) {
443
+ const message = syncError instanceof Error ? syncError.message : String(syncError);
444
+ stdout.warn(`Uploaded files, but failed to sync assets.json: ${message}`);
445
+ }
446
+ }
447
+ }
448
+ }
449
+ const summaryLines = [
450
+ `${pc.bold('Discovered:')} ${totalDiscovered}`,
451
+ `${pc.bold('Uploaded:')} ${uploadedCount}`,
452
+ `${pc.bold('Skipped:')} ${skippedCount}`,
453
+ `${pc.bold('Failed:')} ${failedCount}`,
454
+ ];
455
+ if (failedCount > 0) {
456
+ stdout.box(summaryLines.join('\n'), {
457
+ title: 'Upload Summary',
458
+ borderColor: 'yellow',
459
+ });
460
+ }
461
+ else {
462
+ stdout.successBox(summaryLines.join('\n'), { title: 'Upload Complete' });
463
+ }
464
+ stdout.gap();
465
+ logger.info('assets upload complete', {
466
+ discovered: totalDiscovered,
467
+ uploaded: uploadedCount,
468
+ skipped: skippedCount,
469
+ failed: failedCount,
470
+ });
471
+ if (failedCount > 0) {
472
+ await exit(1);
473
+ }
474
+ }
475
+ //# sourceMappingURL=assets-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets-upload.js","sourceRoot":"","sources":["../../src/commands/assets-upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * JSON.stringify with sorted object keys at every nesting level.
3
+ * Produces identical output for semantically equal objects regardless of
4
+ * property insertion order, while preserving array element order.
5
+ */
6
+ export declare function stableStringify(value: unknown): string;
7
+ export type DiffDepth = 'pages' | 'components' | 'props';
8
+ export type RunDiffOptions = {
9
+ id?: string;
10
+ from?: string;
11
+ to?: string;
12
+ depth?: DiffDepth;
13
+ color?: boolean;
14
+ engine?: string;
15
+ branch?: string;
16
+ page?: string;
17
+ component?: string;
18
+ };
19
+ export interface PageDiff {
20
+ key: string;
21
+ title?: string;
22
+ status: 'added' | 'removed' | 'modified';
23
+ components?: ComponentDiff[];
24
+ }
25
+ export interface ComponentDiff {
26
+ id: string;
27
+ key?: string;
28
+ type?: string;
29
+ status: 'added' | 'removed' | 'modified';
30
+ props?: PropDiff[];
31
+ }
32
+ export interface PropDiff {
33
+ name: string;
34
+ status: 'added' | 'removed' | 'changed';
35
+ from?: unknown;
36
+ to?: unknown;
37
+ }
38
+ export interface SectionDiff {
39
+ name: string;
40
+ status: 'added' | 'removed' | 'modified';
41
+ from?: unknown;
42
+ to?: unknown;
43
+ }
44
+ export interface DiffSummary {
45
+ pagesAdded: number;
46
+ pagesRemoved: number;
47
+ pagesModified: number;
48
+ componentsAdded: number;
49
+ componentsRemoved: number;
50
+ componentsModified: number;
51
+ propsAdded: number;
52
+ propsRemoved: number;
53
+ propsChanged: number;
54
+ }
55
+ export interface DiffResult {
56
+ pages: PageDiff[];
57
+ globalComponents: ComponentDiff[];
58
+ sections: SectionDiff[];
59
+ summary: DiffSummary;
60
+ }
61
+ type DiffFilters = {
62
+ page: Set<string> | null;
63
+ component: Set<string> | null;
64
+ };
65
+ type Colorizer = {
66
+ red: (s: string) => string;
67
+ green: (s: string) => string;
68
+ yellow: (s: string) => string;
69
+ gray: (s: string) => string;
70
+ bold: (s: string) => string;
71
+ cyan: (s: string) => string;
72
+ dim: (s: string) => string;
73
+ white: (s: string) => string;
74
+ };
75
+ export interface ParsedVersionSpec {
76
+ version: string;
77
+ branch?: string;
78
+ }
79
+ export declare function parseVersionSpecifier(spec: string): ParsedVersionSpec;
80
+ export declare function versionLabel(spec: ParsedVersionSpec): string;
81
+ export declare function resolveLocalVersion(embeddableId: string): Promise<Record<string, unknown>>;
82
+ export declare function fetchCloudVersion(embeddableId: string, version: string, opts: {
83
+ engine?: string;
84
+ branch?: string;
85
+ }): Promise<Record<string, unknown>>;
86
+ export declare function computeDiff(from: Record<string, unknown>, to: Record<string, unknown>, depth: DiffDepth, filters?: DiffFilters): DiffResult;
87
+ export declare function renderDiff(diff: DiffResult, depth: DiffDepth, c: Colorizer): string[];
88
+ export declare function runDiff(opts: RunDiffOptions): Promise<void>;
89
+ export {};
90
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}