Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions src/api/endpoints.js
Original file line number Diff line number Diff line change
Expand Up @@ -333,18 +333,15 @@ export async function finalizeParallelBuild(client, parallelId) {
* @returns {Promise<Object>} Upload result with preview URL
*/
export async function uploadPreviewZip(client, buildId, zipBuffer) {
// Create form data with the ZIP file
let FormData = (await import('form-data')).default;
// Use native FormData (Node 18+) with Blob for proper fetch compatibility
let formData = new FormData();
formData.append('file', zipBuffer, {
filename: 'preview.zip',
contentType: 'application/zip',
});
let blob = new Blob([zipBuffer], { type: 'application/zip' });
formData.append('file', blob, 'preview.zip');

return client.request(`/api/sdk/builds/${buildId}/preview/upload-zip`, {
method: 'POST',
body: formData,
headers: formData.getHeaders(),
// Let fetch set the Content-Type with boundary automatically
});
}

Expand Down
26 changes: 25 additions & 1 deletion src/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -572,14 +572,38 @@ program
program
.command('preview')
.description('Upload static files as a preview for a build')
.argument('<path>', 'Path to static files (dist/, build/, out/)')
.argument('[path]', 'Path to static files (dist/, build/, out/)')
.option('-b, --build <id>', 'Build ID to attach preview to')
.option('-p, --parallel-id <id>', 'Look up build by parallel ID')
.option('--base <path>', 'Override auto-detected base path')
.option('--open', 'Open preview URL in browser after upload')
.option('--dry-run', 'Show what would be uploaded without uploading')
.option(
'-x, --exclude <pattern>',
'Exclude files/dirs (repeatable, e.g. -x "*.log" -x "temp/")',
(val, prev) => (prev ? [...prev, val] : [val])
)
.option(
'-i, --include <pattern>',
'Override default exclusions (repeatable, e.g. -i package.json -i tests/)',
(val, prev) => (prev ? [...prev, val] : [val])
)
.action(async (path, options) => {
const globalOptions = program.opts();

// Show helpful error if path is missing
if (!path) {
output.error('Path to static files is required');
output.blank();
output.print(' Upload your build output directory:');
output.blank();
output.print(' vizzly preview ./dist');
output.print(' vizzly preview ./build');
output.print(' vizzly preview ./out');
output.blank();
process.exit(1);
}

// Validate options
const validationErrors = validatePreviewOptions(path, options);
if (validationErrors.length > 0) {
Expand Down
Loading