cgreact-cli
Version:
CGReact脚手架工具项目:增加SpliteCommonChunk的配置
321 lines (320 loc) • 14 kB
JavaScript
#! node
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var FS = require("fs");
var Path = require("path");
var chalk = require("chalk");
var inquirer = require("inquirer");
var commander_1 = require("commander");
var child_process_1 = require("child_process");
var rootDir = Path.parse(__dirname).dir;
var PackageJson = JSON.parse(FS.readFileSync(Path.join(rootDir, "package.json"), "utf-8"));
var Logo = chalk.yellow(require("figlet").textSync('CGReact', {
horizontalLayout: 'full',
}));
var Version = chalk.red(" V" + PackageJson.version);
var Creator = " Create by " + chalk.cyan("chenguang@ciotc.org") + " on " + chalk.yellow("2021-07-22");
var Company = " Copyright @ " + chalk.blue('江苏中科西北星信息科技有限公司') + " " + chalk.blue('http://www.zkxbx.com/');
var MoreInfo = " \u66F4\u591A\u5185\u5BB9\u656C\u8BF7\u5173\u6CE8 " + chalk.blue('https://www.zkxbx.com');
var MainCommandHandler;
var InitAppCommandHandler;
var HelpFlag = process.argv.some(function (cur) { return cur == "-h" || cur == "--help"; });
(function main(argv) {
mainCommand();
initCommand();
MainCommandHandler.parse(argv);
})(process.argv);
function mainCommand() {
MainCommandHandler = new commander_1.Command().description('CGReact脚手架工具').option('-v, --version', '展示CGReact的当前版本')
.option('-h, --help', '展示"cgreact"命令的帮助信息').action(function (option) {
if (option.help || option.version || Object.keys(option).length == 0) {
console.log(Logo + Version);
if (option.help || Object.keys(option).length == 0) {
MainCommandHandler.outputHelp();
}
if (option.version || Object.keys(option).length == 0) {
console.log();
console.log(Creator);
console.log(Company);
console.log(MoreInfo);
}
}
});
}
function initCommand() {
InitAppCommandHandler = MainCommandHandler.command('init [app-name]').description('创建一个新的CGReact项目')
.option('-f, --force', '如果文件存在则覆盖原来的文件(请谨慎操作!)').option('-h, --help', '展示"cgreact init"命令的帮助信息')
.action(function (appName, option, command) {
HelpFlag && (option.help = true);
if (option.help) {
console.log(Logo + Version);
InitAppCommandHandler.outputHelp();
console.log();
console.log("app-name: 任意字符串作为项目名称(不传init的时候也会问)");
console.log();
return;
}
askAppConfig(appName, option.force);
});
}
function askAppConfig(appName, force) {
var appConfig = {};
appConfig.force = force;
inquirer.prompt([
{
name: 'author',
type: 'input',
message: '尊姓大名:',
validate: function (value) {
if (value.length) {
return true;
}
else {
return '您能输入一个人名吗:';
}
}
}
]).then(function (result) {
appConfig.author = result.author;
console.log(chalk.green(result.author + ",欢迎你使用CGReact"));
console.log();
return inquirer.prompt([
{
name: 'name',
type: 'input',
default: appName,
message: '输入项目名称' + chalk.gray('(例: Hello): '),
validate: function (value) {
if (value.length) {
return true;
}
else {
return '请输入您项目的名称:';
}
}
}
]);
}).then(function (result) {
appConfig.name = result.name;
console.log(chalk.green("您的项目名称是:" + result.name));
console.log();
return inquirer.prompt([
{
name: 'nodeName',
type: 'input',
default: "TestProject",
message: '输入node包的名称(注意不能包含中文)' + chalk.gray('(例: Test_Project): '),
validate: function (value) {
if (value.length && !/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
return true;
}
else {
return '请输入不包含中文的node文件名称:';
}
}
}
]);
}).then(function (result) {
appConfig.nodeName = result.nodeName;
console.log(chalk.green("您的node包名称是:" + result.nodeName));
console.log();
return inquirer.prompt([
{
name: 'description',
type: 'input',
default: appName,
message: '输入项目描述' + chalk.gray('(例: 测试程序一枚): '),
validate: function (value) {
if (value.length) {
return true;
}
else {
return '请输入您项目的描述:';
}
}
}
]);
}).then(function (result) {
appConfig.description = result.description;
console.log(chalk.green("这个项目是:" + result.description));
console.log();
return inquirer.prompt([
{
name: 'layui',
type: 'list',
message: '是否安装CGReact基于Layui的组件库cgreact-layui?: ',
choices: ["不了,我想自己引入样式和组件", "是的,我想使用CGReactLayui组件库"]
}
]);
}).then(function (result) {
if (result.layui == "不了,我想自己引入样式和组件") {
appConfig.layui = false;
console.log(chalk.green("不使用CGReactLayui组件库"));
}
else {
appConfig.layui = true;
console.log(chalk.green("使用CGReactLayui组件库"));
}
console.log();
return inquirer.prompt([
{
name: 'server',
type: 'confirm',
message: '是否集成后台服务: '
}
]);
}).then(function (result) {
appConfig.server = result.server;
console.log(chalk.green((result.server ? "" : "不") + "集成Maven和SpringBoot后台"));
console.log();
console.log(chalk.cyan("我们正在为您创建文件,请耐心等待...."));
if (makeAppDir(appConfig)) {
makePackageJSON(appConfig);
copyWebAppFile(appConfig);
console.log(chalk.green("项目文件创建好啦!"));
console.log();
return inquirer.prompt([
{
name: 'install',
type: 'list',
message: '让CGReactCli帮你安装一下子?: ',
choices: ["好的,马上安装", "不用了,我自己'npm install'"]
}
]);
}
}).then(function (result) {
if (result.install == "好的,马上安装") {
appConfig.install = true;
console.log(chalk.cyan("开始安装工程编译依赖包:"));
return new Promise(function (resolve, reject) {
var install = child_process_1.spawn('npm.cmd', ['install'], {
stdio: "inherit",
cwd: appConfig.name
});
install.on("close", function (code) {
if (code == 0) {
console.log(chalk.green("工程编译依赖包安装好啦!"));
console.log();
resolve(true);
}
else {
console.log();
console.log(chalk.red("哎呀呀,安装工程依赖失败了,检查一下你的Node环境配置是否正确?"));
}
});
}).then(function (result) {
console.log(chalk.cyan("继续安装CGReact核心库cgreact-core:"));
return new Promise(function (resolve, reject) {
var install = child_process_1.spawn('npm.cmd', ['install', 'cgreact-core'], {
stdio: "inherit",
cwd: appConfig.name
});
install.on("close", function (code) {
if (code == 0) {
console.log(chalk.green("CGReact核心包cgrect-core安装好啦!"));
console.log();
resolve(true);
}
else {
console.log();
console.log(chalk.red("哎呀呀,核心库cgeract-core安装失败了,请与管理员cheng@ciotc.org联系!"));
}
});
});
}).then(function (result) {
if (appConfig.layui) {
console.log(chalk.cyan("继续安装CGReact组件库cgreact-layui:"));
return new Promise(function (resolve, reject) {
var install = child_process_1.spawn('npm.cmd', ['install', 'cgreact-layui'], {
stdio: "inherit",
cwd: appConfig.name
});
install.on("close", function (code) {
if (code == 0) {
resolve(true);
}
else {
console.log();
console.log(chalk.red("哎呀呀,组件库cgeract-layui安装失败了,请与管理员cheng@ciotc.org联系!"));
}
});
});
}
else {
return true;
}
});
}
else {
console.log(chalk.green("好的,那就麻烦您自己用'npm install'来安装工程依赖!"));
return new Promise(function () { return undefined; });
}
}).then(function (result) {
return inquirer.prompt([
{
name: 'start',
type: 'list',
message: '让CGReactCli帮你启动起来吧?: ',
choices: ["好的", "不用了,我自己'npm run debug'来启动"]
}
]);
}).then(function (result) {
if (result.start == "好的") {
child_process_1.spawn('npm.cmd', ['run', 'debug'], {
stdio: "inherit",
cwd: appConfig.name
});
}
else {
console.log(chalk.green("好的,那就麻烦您自己用'npm run debug'来启动啦!"));
}
}).catch(function (error) {
});
}
function makeAppDir(config) {
var dirExist = FS.existsSync(config.name);
if (dirExist && !config.force) {
var error = chalk.red("指定的文件夹'" + config.name + "'已经存在,尝试使用-f参数强制创建app");
console.log(error);
return false;
}
dirExist && (FS.rmdirSync(config.name, { recursive: true }));
FS.mkdirSync(config.name);
return true;
}
function makePackageJSON(config) {
var packString = FS.readFileSync(Path.join(rootDir, "template/package.json"), "utf-8");
var packJSON = JSON.parse(packString);
packJSON.name = config.nodeName;
packJSON.author = config.author;
packJSON.description = config.description;
packJSON.dependencies = {};
packJSON.dependencies["cgreact-core"] = "latest";
config.layui && (packJSON.dependencies["cgreact-layui"] = "latest");
FS.writeFileSync(Path.join(config.name, "package.json"), JSON.stringify(packJSON), "utf-8");
}
function copyWebAppFile(config) {
var target = {
"tsconfig.json": Path.join(rootDir, "template/tsconfig.json"),
"webpack.config.ts": Path.join(rootDir, "template/webpack.config.ts"),
"src/web/assets/img/cgreact.svg": Path.join(rootDir, "template/src/web/assets/img/cgreact.svg"),
"src/web/page-cgreact/page-cgreact.css": Path.join(rootDir, "template/src/web/page-cgreact/page-cgreact.css"),
"src/web/page-cgreact/page-cgreact.tsx": Path.join(rootDir, "template/src/web/page-cgreact/page-cgreact.tsx"),
"src/web/page-my/page-my.css": Path.join(rootDir, "template/src/web/page-my/page-my.css"),
"src/web/page-my/page-my.tsx": Path.join(rootDir, "template/src/web/page-my/page-my.tsx"),
"src/web/main.tsx": Path.join(rootDir, "template/src/web/main.tsx")
};
Object.keys(target).map(function (name) {
var file = FS.readFileSync(target[name], "utf-8");
var make = [];
var targetDir = Path.parse(Path.join(config.name, name)).dir;
while (targetDir) {
(!FS.existsSync(targetDir)) && (make.push(targetDir));
targetDir = Path.parse(targetDir).dir;
}
while (make.length > 0) {
FS.mkdirSync(make.pop());
}
FS.writeFileSync(Path.join(config.name, name), file, "utf-8");
});
}