Files
2026-05-23 14:05:22 +08:00

75 lines
2.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @description 通用 Vite 开发启动脚本,先构建 Monaco DTS,再按指定 mode 启动 Vite。
*/
import { spawn } from 'node:child_process';
import { basename, dirname, resolve } from 'node:path';
import process from 'node:process';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const pkgRoot = resolve(__dirname, '..');
const cliArgs = process.argv.slice(2);
const modeFlagIndex = cliArgs.findIndex(arg => arg === '--mode');
const modeArg = modeFlagIndex >= 0 ? String(cliArgs[modeFlagIndex + 1] || '').trim() : '';
const mode = modeArg || String(process.env.BUSINESS_RULES_MODE || 'dev').trim() || 'dev';
/**
* @description 以继承输出的方式执行命令,并等待结束。
* @param {string} command 命令。
* @param {string[]} args 参数。
* @param {NodeJS.ProcessEnv} env 环境变量。
* @returns {Promise<void>}
*/
function runCommand(command, args, env) {
return new Promise((resolvePromise, rejectPromise) => {
const child = spawn(command, args, {
cwd: pkgRoot,
env,
stdio: 'inherit',
});
child.on('error', rejectPromise);
child.on('exit', (code, signal) => {
if (signal) {
rejectPromise(new Error(`${command} exited with signal ${signal}`));
return;
}
if (code !== 0) {
rejectPromise(new Error(`${command} ${args.join(' ')} exited with code ${code}`));
return;
}
resolvePromise();
});
});
}
/**
* @description 解析当前 pnpm runner。Windows 下裸 spawn('pnpm') 不会稳定命中 pnpm.cmd
* 优先复用 pnpm 注入的 npm_execpath,保证 Windows/macOS 都走同一个包管理器入口。
* @param {NodeJS.ProcessEnv} env 环境变量。
* @returns {{ command: string, args: string[] }} 可执行命令与预置参数。
*/
function resolvePnpmRunner(env) {
const npmExecPath = String(env.npm_execpath || '').trim();
const npmExecName = basename(npmExecPath).toLowerCase();
if (npmExecPath && npmExecName.includes('pnpm')) {
return {
command: process.execPath,
args: [npmExecPath],
};
}
return {
command: process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm',
args: [],
};
}
async function runPnpm(args, env) {
const runner = resolvePnpmRunner(env);
await runCommand(runner.command, [...runner.args, ...args], env);
}
await runCommand(process.execPath, ['./scripts/BuildMonacoDts.mjs'], process.env);
await runPnpm(['vite', '--mode', mode, '--force'], process.env);