@bingosoft/cli
Version:
bingo framework cli
141 lines (121 loc) • 3.84 kB
JavaScript
const path = require("path");
const fs = require("fs");
const chalk = require("chalk");
const inquirer = require("inquirer");
const program = require("commander");
const logSymbols = require("log-symbols");
const glob = require("glob");
const list = glob.sync("*");
const download = require("../lib/download");
const { downloadParams } = require("../config");
program.usage("<project-name>").parse(process.argv);
const rootName = path.basename(process.cwd());
let projectName = "";
let templateName = "";
if (program.args.length === 2) {
templateName = program.args[0];
projectName = program.args[1];
} else {
projectName = program.args[0];
}
if (!projectName) {
program.help();
return;
}
checkProjectName().then(async (projectRoot) => {
if (!projectRoot) return;
try {
let projectMsg = await getProjcetMessage();
let downloadItem = null;
if (templateName) {
downloadItem = downloadParams.find(({ value }) => value === templateName);
}
if (!downloadItem) {
downloadItem = await getTemplateName();
}
if (projectRoot !== ".") {
fs.mkdirSync(projectRoot);
}
const downloadRoot = await download(projectRoot, downloadItem.url);
const packagejsonPath = `${projectRoot}/package.json`;
if (fs.existsSync(packagejsonPath)) {
let packageJson = JSON.parse(fs.readFileSync(packagejsonPath));
packageJson.version = projectMsg.projectVersion;
packageJson.name = projectMsg.projectName;
fs.writeFileSync(packagejsonPath, JSON.stringify(packageJson, null, 4));
}
console.log(logSymbols.success, chalk.yellow("下载成功:)"));
console.log(chalk.green(" cd " + downloadRoot), "\n");
const readmePath = `${projectRoot}/README.md`;
if (fs.existsSync(readmePath)) {
let readmeStr = fs.readFileSync(readmePath, "utf8");
console.log(chalk.whiteBright(readmeStr));
}
} catch (err) {
console.error(logSymbols.error, chalk.red(`${err}`));
}
});
function checkProjectName() {
let next = null;
if (list.length) {
if (
list.filter((name) => {
const fileName = path.resolve(process.cwd(), path.join(".", name));
const isDir = fs.statSync(fileName).isDirectory();
return name.indexOf(projectName) !== -1 && isDir;
}).length !== 0
) {
console.error(logSymbols.error, chalk.red(`项目${projectName}已经存在`));
return Promise.resolve(false);
}
next = Promise.resolve(projectName);
} else if (rootName === projectName) {
next = inquirer
.prompt([
{
name: "buildInCurrent",
message:
"当前目录为空,且目录名称和项目名称相同,是否直接在当前目录下创建新项目?",
type: "confirm",
default: true,
},
])
.then((answer) => {
return Promise.resolve(answer.buildInCurrent ? "." : projectName);
});
} else {
next = Promise.resolve(projectName);
}
return next;
}
function getTemplateName() {
return inquirer
.prompt({
type: "list",
name: "template",
message: "请选择模板",
choices: downloadParams,
})
.then(({ template = "" }) => {
return downloadParams.find(({ value }) => value === template);
});
}
function getProjcetMessage() {
return inquirer.prompt([
{
name: "projectName",
message: "项目名称",
default: projectName,
},
{
name: "projectVersion",
message: "项目版本号",
default: "1.0.0",
},
// {
// name:"projectDescription",
// message:'项目简介',
// default:`A project named ${projectName}`
// }
]);
}