UNPKG

@bingosoft/cli

Version:

bingo framework cli

141 lines (121 loc) 3.84 kB
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}` // } ]); }