// scripts/ci/build-all.mjs // Local Full CI Pipeline Verification Runner import { spawn } from 'node:child_process'; import process from 'node:process'; function runStep(name, cmd, args) { return new Promise((resolve, reject) => { console.log(`\n==================================================`); console.log(`ā–¶ STEP: ${name} (${cmd} ${args.join(' ')})`); console.log(`==================================================`); const start = Date.now(); const isWindows = process.platform === 'win32'; const actualCmd = isWindows && cmd === 'npm' ? 'npm.cmd' : cmd; const proc = spawn(actualCmd, args, { stdio: 'inherit', shell: isWindows }); proc.on('close', (code) => { const duration = ((Date.now() - start) / 1000).toFixed(2); if (code === 0) { console.log(`āœ” SUCCESS: ${name} (took ${duration}s)`); resolve(); } else { console.error(`āœ– FAILED: ${name} (exit code ${code})`); reject(new Error(`Step failed: ${name}`)); } }); }); } async function main() { const totalStart = Date.now(); console.log('šŸš€ Starting Full CI/CD Build & Verification Pipeline...\n'); try { await runStep('Typecheck All Workspaces', 'npm', ['run', 'typecheck']); await runStep('Run Vitest Test Suites', 'npm', ['test']); await runStep('Build Desktop App (Renderer + Main + Preload)', 'npm', ['run', 'build', '--workspace=@d3ro/desktop']); await runStep('Build Admin Dashboard (Next.js 14)', 'npm', ['run', 'build', '--workspace=@d3ro/admin']); const totalDuration = ((Date.now() - totalStart) / 1000).toFixed(2); console.log(`\n==================================================`); console.log(`šŸŽ‰ ALL CI/CD STEPS PASSED SUCCESSFULLY! (Total: ${totalDuration}s)`); console.log(`==================================================\n`); } catch (err) { console.error(`\nāŒ CI/CD Pipeline execution aborted: ${err.message}`); process.exit(1); } } main();