const path = require('path'); const { spawn } = require('child_process'); function outputProgress(data) { if (!data.status) { data = { status: 'running', ...data }; } console.log(JSON.stringify(data)); } function runScript(scriptPath) { return new Promise((resolve, reject) => { const child = spawn('node', [scriptPath], { stdio: ['inherit', 'pipe', 'pipe'] }); let output = ''; child.stdout.on('data', (data) => { const lines = data.toString().split('\n'); lines.filter(line => line.trim()).forEach(line => { try { console.log(line); // Pass through the JSON output output += line + '\n'; } catch (e) { console.log(line); // If not JSON, just log it directly } }); }); child.stderr.on('data', (data) => { console.error(data.toString()); }); child.on('close', (code) => { if (code !== 0) { reject(new Error(`Script ${scriptPath} exited with code ${code}`)); } else { resolve(output); } }); child.on('error', (err) => { reject(err); }); }); } async function fullUpdate() { try { // Step 1: Import from Production outputProgress({ operation: 'Starting full update', message: 'Step 1/2: Importing from production...' }); await runScript(path.join(__dirname, 'import-from-prod.js')); outputProgress({ status: 'complete', operation: 'Import step complete', message: 'Import finished, moving to metrics calculation...' }); // Step 2: Calculate Metrics outputProgress({ operation: 'Starting metrics calculation', message: 'Step 2/2: Calculating metrics...' }); await runScript(path.join(__dirname, 'calculate-metrics.js')); outputProgress({ status: 'complete', operation: 'Metrics step complete', message: 'Metrics calculation finished' }); // Final completion message outputProgress({ status: 'complete', operation: 'Full update complete', message: 'Successfully completed all steps: import and metrics calculation' }); } catch (error) { outputProgress({ status: 'error', operation: 'Full update failed', error: error.message, stack: error.stack }); process.exit(1); } } // Run if called directly if (require.main === module) { fullUpdate(); } module.exports = fullUpdate;