071faa482c
纳入 AGC Cargo workspace 的统一 rustfmt 检查与格式化入口 完成项目 TypeScript/Prettier 与 Rust 全量格式化 修复 Pingora expected executable 门禁的空白敏感误报 同步开发运维文档与 AGC skill pack 格式化忽略规则
70 lines
1.9 KiB
JavaScript
70 lines
1.9 KiB
JavaScript
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)),
|
|
);
|
|
}
|