const { spawn } = require('child_process'); const fs = require('fs'); const path = require('path'); const PROJECT_DIR = process.env.PROJECT_DIR || path.resolve(__dirname, '..', '..'); const DIST_TARGET_DIR = process.env.DIST_TARGET_DIR || ''; function copyDirRecursive(src, dest) { fs.mkdirSync(dest, { recursive: true }); for (const entry of fs.readdirSync(src, { withFileTypes: true })) { const srcPath = path.join(src, entry.name); const destPath = path.join(dest, entry.name); if (entry.isDirectory()) { copyDirRecursive(srcPath, destPath); } else { fs.copyFileSync(srcPath, destPath); } } } /** Runs `npm run build` in the Astro project and, if configured, publishes * the resulting dist/ into the shared volume nginx serves from. */ function runBuild() { return new Promise((resolve) => { let child; try { child = spawn('npm', ['run', 'build'], { cwd: PROJECT_DIR, shell: true }); } catch (err) { resolve({ ok: false, output: '', error: `Build konnte nicht gestartet werden: ${err.message}` }); return; } let output = ''; child.stdout.on('data', (chunk) => (output += chunk.toString())); child.stderr.on('data', (chunk) => (output += chunk.toString())); child.on('error', (err) => { resolve({ ok: false, output, error: `Build konnte nicht gestartet werden: ${err.message}` }); }); child.on('close', (code) => { if (code !== 0) { resolve({ ok: false, output, error: `Build fehlgeschlagen (Exit-Code ${code}).` }); return; } if (DIST_TARGET_DIR) { try { const distDir = path.join(PROJECT_DIR, 'dist'); copyDirRecursive(distDir, DIST_TARGET_DIR); } catch (err) { resolve({ ok: false, output, error: `Build ok, aber Kopieren fehlgeschlagen: ${err.message}` }); return; } } resolve({ ok: true, output }); }); }); } module.exports = { runBuild };