@hanserena/cabala-cli
Version:
个人开发的基础脚手架工具,提供一些方便自己开发的项目模板
118 lines (107 loc) • 4.61 kB
JavaScript
/*
* @Author: maggot-code
* @Date: 2020-12-24 12:42:16
* @LastEditors: maggot-code
* @LastEditTime: 2021-01-04 16:59:39
* @Description: file content
*/
// 👍🚀👏🔥
const path = require('path');
const fs = require('fs');
const package = require('../package.json');
const chalk = require('chalk');
const semver = require('semver');
const inquirer = require('inquirer');
const validateProjectName = require('validate-npm-package-name');
const { cd, exec } = require('shelljs');
const { copyTemplate } = require('../template/copyTemplate');
const { updateCabala } = require('./updateCabala');
const { shellRun } = require('./utils');
async function create(type, projectName, options) {
// 友好提示
console.log(chalk.green(`Wait for check ${chalk.yellow('@hanserena/cabala-cli')} version ... (。-ω-)zzz\r\n`));
const onLineVersion = shellRun(`npm view @hanserena/cabala-cli version`);
if (!semver.satisfies(package.version, onLineVersion)) {
// 检查版本需要更新
console.log(chalk.yellow(`
Local @hanserena/cabala-cli version ${chalk.red(package.version)}
Find new version ${chalk.green(onLineVersion)}
o(╥﹏╥)o
`));
// 提示是否更新
const { ok } = await inquirer.prompt([
{
name: "ok",
type: "confirm",
message: `You can update ${chalk.yellow('@hanserena/cabala-cli')} version to ${chalk.red(package.version)} => ${chalk.green(onLineVersion)} ?`
}
])
if (!ok) {
return Promise.reject(chalk.yellow(`You cancel (^_−)☆`));
} else {
updateCabala();
}
} else {
// 检查是否存在该模板
if (package.template.indexOf(type) === -1) {
const typeList = package.template.map(item => `${item}\r`);
return Promise.reject(`You choice type => "${chalk.yellow(type)}" is Not found o(╥﹏╥)o \ntype select:
${chalk.green(typeList.join(' '))}`);
}
// 获取node进程的工作目录
const cwd = process.cwd();
// 判断是否是当前目录
const inCurrentDir = projectName === '.';
// 获取项目名(当前目录 or 指定的项目名)
const name = inCurrentDir ? path.relative('../', cwd) : projectName;
// 真正的目录地址
const targetDir = path.resolve(cwd, projectName);
// 校验项目名(包名)是否合法
const validateResult = validateProjectName(name);
if (!validateResult.validForNewPackages) {
// 打印出错误以及警告
console.error(`(O_o)?? Invalid project name is: ${chalk.red(name)}`);
validateResult.errors &&
validateResult.errors.forEach(error => {
console.error(chalk.red.dim(`Error: ${error}`));
});
validateResult.warnings &&
validateResult.warnings.forEach(warn => {
console.error(chalk.yellow.dim(`Warning: ${warn}`));
});
process.exit(1);
}
/**
* @step1 判断目录是否存在
* @step2 如果存在 -> 中止程序,提示用户
* @step3 如果不存在 -> 创建目录 -> copy模板到该目录下
* @step4 copy模板到该目录下
* @step5 安装成功!友好提示
*/
if (fs.existsSync(targetDir)) {
return Promise.reject(`${chalk.yellow(cwd)} exist ${chalk.red(`"${name}"`)} dir! o(╥﹏╥)o`);
} else {
const { ok } = await inquirer.prompt([
{
name: "ok",
type: "confirm",
message: `✨ You confirm dir create ${chalk.green(`${type} template`)} "${name}" ?`
}
])
if (!ok) {
return Promise.reject(chalk.yellow(`You cancel (^_−)☆`))
} else {
return copyTemplate(type, targetDir).then(res => {
console.log(res);
console.log(`You can into ${chalk.yellow(targetDir)} execute "${chalk.green('npm install')}"\r`);
}).catch(error => error)
}
}
}
}
module.exports = (type, projectName, ...args) => {
return create(type, projectName, ...args).catch(error => {
console.error(error);
process.exit(1);
})
}