vap-cli
Version:
个人常用项目模板
91 lines (86 loc) • 2.97 kB
JavaScript
const program = require('commander');
const download = require('download-git-repo');
const ora = require('ora');
const chalk = require('chalk');
const symbols = require('log-symbols');
const fs = require('fs');
var inquirer = require('inquirer');
const config = require('./config').config
const path = require('path')
const version = require('./package.json').version
program.version(version, '-v, --version')
.command('init <name>')
.action((name) => {
if (fs.existsSync(name)) {
inquirer.prompt([
{
type: 'confirm',
message: `${name}目录已存在,是否覆盖此目录?`,
name: 'rm'
}
]).then(answers => {
console.log(answers)
if (!answers.rm) {
console.log(symbols.error, chalk.red('请使用其他目录名称'));
return
}
rmdirAsync(name).then((err) => {
if (err) {
console.log(chalk.red(err))
return
}
downloadTmpl(name)
}).catch(err => {
console.log(chalk.red(err))
console.log(symbols.error, chalk.red('目录删除失败,请手动删除再重试'));
})
})
return
}
downloadTmpl(name)
});
program.parse(process.argv);
async function rmdirAsync(filePath) {
let stat = await fs.statSync(filePath)
if (stat.isFile()) {
await fs.unlinkSync(filePath)
} else {
let dirs = await fs.readdirSync(filePath)
dirs = dirs.map(dir => rmdirAsync(path.join(filePath, dir)))
await Promise.all(dirs)
await fs.rmdirSync(filePath)
}
}
function downloadTmpl(name) {
const promptList = [
{
type: 'list',
message: '请选择要下载的模板',
name: 'tmplName',
choices: Object.keys(config)
}
]
inquirer
.prompt(promptList)
.then(answers => {
const spinner = ora('正在下载模板...');
spinner.start();
download(config[answers.tmplName], name, { clone: true }, (err) => {
if (err) {
spinner.fail();
console.log(symbols.error, chalk.red(err));
return
}
spinner.succeed();
console.log(symbols.success, chalk.green('项目初始化完成'));
})
})
.catch(error => {
if (error.isTtyError) {
// Prompt couldn't be rendered in the current environment
} else {
// Something else when wrong
}
});
}