@gulibs/vgrove-core
Version:
VGrove CLI - A unified development tool for React applications with auto-routes and i18n
80 lines (79 loc) • 2.43 kB
JavaScript
import { program } from 'commander';
import chalk from 'chalk';
import { loadConfig } from '../config/index.js';
import { startDevServer } from '../core/dev-server.js';
import { buildProject } from '../core/build.js';
// 设置 CLI 程序
program
.name('vgrove')
.description('VGrove CLI - A unified development tool for React applications')
.version('0.0.1');
// dev 命令
program
.command('dev')
.description('Start development server')
.option('-p, --port <port>', 'Port to run the dev server on')
.option('-o, --open', 'Open browser on server start')
.action(async (options) => {
try {
const config = await loadConfig();
// 覆盖端口配置
if (options.port) {
config.vite.server = {
...config.vite.server,
port: parseInt(options.port, 10)
};
}
// 覆盖自动打开浏览器配置
if (options.open) {
config.vite.server = {
...config.vite.server,
open: true
};
}
await startDevServer(config);
}
catch (error) {
console.error(chalk.red('Failed to start dev server:'), error);
process.exit(1);
}
});
// build 命令
program
.command('build')
.description('Build for production')
.option('--outDir <dir>', 'Output directory')
.option('--sourcemap', 'Generate sourcemap')
.option('--no-minify', 'Disable minification')
.action(async (options) => {
try {
const config = await loadConfig();
// 覆盖构建配置
if (options.outDir) {
config.vgrove.build.outDir = options.outDir;
}
if (options.sourcemap !== undefined) {
config.vgrove.build.sourcemap = options.sourcemap;
}
if (options.minify === false) {
config.vgrove.build.minify = false;
}
await buildProject(config);
}
catch (error) {
console.error(chalk.red('Build failed:'), error);
process.exit(1);
}
});
// 处理未捕获的异常
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
process.exit(1);
});
process.on('uncaughtException', (error) => {
console.error('Uncaught Exception:', error);
process.exit(1);
});
// 解析命令行参数
program.parse();