import {spawnSync} from 'node:child_process'; import {fileURLToPath} from 'node:url'; const viteCliPath = fileURLToPath(new URL('./vite-cli.mjs', import.meta.url)); const adminWebBuildPath = fileURLToPath(new URL('./admin-web-build.mjs', import.meta.url)); const forwardedArgs = process.argv.slice(2); const results = [ runBuildStep('web', [viteCliPath, 'build', ...forwardedArgs]), runBuildStep('admin-web', [adminWebBuildPath, 'build']), ]; const failedResult = results.find(result => result.error || result.signal || (result.status ?? 0) !== 0); if (failedResult) { if (failedResult.error) { console.error(`Build gate failed to start a build step: ${failedResult.error.message}`); } else if (failedResult.signal) { console.error(`Build gate step was terminated by signal ${failedResult.signal}`); } process.exit(failedResult.status ?? 1); } const warningLines = results.flatMap((result) => collectWarningLines(result)); if (warningLines.length > 0) { console.error('Build gate failed because warnings were emitted:'); [...new Set(warningLines)].forEach(line => console.error(`- ${line}`)); process.exit(1); } function runBuildStep(label, args) { console.log(`[build-gate] ${label}`); const result = spawnSync(process.execPath, args, { cwd: process.cwd(), encoding: 'utf8', }); if (result.stdout) { process.stdout.write(result.stdout); } if (result.stderr) { process.stderr.write(result.stderr); } return result; } function collectWarningLines(result) { const warningPattern = /\bwarn(?:ing)?\b/i; const ignoredWarningPatterns = [ /ExperimentalWarning/u, ]; return `${result.stdout ?? ''}\n${result.stderr ?? ''}` .split(/\r?\n/u) .map(line => line.trim()) .filter(line => line.length > 0) .filter(line => warningPattern.test(line)) .filter(line => !ignoredWarningPatterns.some(pattern => pattern.test(line))); }