frontengineerplugin
Version:
前端工程化脚手架.集成eslint,husky,prettier,eslint,npmrc,CICD,testCase,node_proxy,readme生成 9个主要功能
284 lines (247 loc) • 8.33 kB
JavaScript
#!/usr/bin/env node
// 请在项目根路径下面使用
// Object.defineProperty(exports, "__esModule", { value: true });
const execSync = require('child_process').execSync;
const path = require('path');
const handleEvent = require(path.join(__dirname, 'util', 'handleEvent'));
const fs = require('fs'); // console.log 的 颜色
const { program } = require('commander'); // 命令行
const inquirer = require('inquirer'); // 输入
const ora = require('ora'); // loading 效果
const chalk = require('chalk'); // console.log 的 颜色
// frontengineerplugin install husky prettier gitignore
const log = (msg) => console.log(`frontengineerplugin - ${msg}`);
let [, , cmd, ...args] = process.argv;
if(!cmd){
log("script 中 添加 frontengineerplugin gui 运行 | 或者直接运行 frontengineerplugin gui ")
process.exit(1);
}
cmd = cmd.toLowerCase();
args.map((v) => {
return v.toLowerCase();
});
// 第一种方式 :命令行
const cmdGroup = {
install: () => {
if (args.includes('husky')) {
handleEvent.gitFn();
}
if (args.includes('eslint')) {
handleEvent.eslintFn();
}
if (args.includes('prettier')) {
handleEvent.prettierFn();
}
if (args.includes('npm')) {
handleEvent.npmFn();
}
if (args.includes('env')) {
handleEvent.envFn();
}
if(args.includes("cicd")){
handleEvent.CICDFn()
}
if(args.includes("cor")){
handleEvent.corFn()
}
},
gui: () => {
guiFn({
gitFn: handleEvent.gitFn,
eslintFn: handleEvent.eslintFn,
prettierFn: handleEvent.prettierFn,
npmFn: handleEvent.npmFn,
envFn: handleEvent.envFn,
CICDFn:handleEvent.CICDFn,
corFn:handleEvent.corFn,
testFn:handleEvent.testFn,
readmeFn:handleEvent.readmeFn
});
},
['-v']: () => {
log(require(path.join(__dirname, 'package.json')).version);
},
};
try {
cmdGroup[cmd] ? cmdGroup[cmd]() : help(0);
} catch (e) {
console.error(e instanceof Error ? `frontengineerplugin - ${e.message}` : e);
process.exit(1);
}
// 第二种方式 : 用户选择
function guiFn({ gitFn, prettierFn, eslintFn, npmFn, envFn,CICDFn,corFn ,testFn,readmeFn}) {
let version = require(path.join(__dirname, 'package.json')).version;
// console.log(version, '2');
program
.version(version)
.command('gui')
.description('Electrolux 的 工程化配置')
.action((name) => {
inquirer
.prompt([
{
type: 'checkbox',
name: 'useChoices',
pageSize: 20,
message: '前端工程化配置选项:',
choices: [
{
name: 'git(husky) | 提交规范',
},
{
name: 'prettier | 代码美化工具',
},
{
name: 'eslint | 代码统一工具',
},
{
name: 'npm_source | 代码源管理',
},
{
name: 'test dev pro | 环境区分',
},
{
name: 'CICD | 各种脚本示例',
},
{
name: 'Test case | jest 通用测试用例',
},
{
name: 'cors | nginx && express(写plugin的工具)',
},
{
name: 'README | 生成标准格式的README',
},
],
},
])
.then(async(paramater) => {
//{ description: 'sss', author: 'dfd' }
// console.log(paramater);
const spinner = ora('工程化配置中^.^ ' + '\n');
spinner.start();
// console.log(paramater['useChoices']);
execSync("npm install chalk@4 commander@9 inquirer@7 ora@4 -D")
if (paramater['useChoices'].includes('prettier | 代码美化工具')) {
prettierFn();
}
if (paramater['useChoices'].includes('eslint | 代码统一工具')) {
eslintFn();
}
if (paramater['useChoices'].includes('npm_source | 代码源管理')) {
npmFn();
}
if (paramater['useChoices'].includes('git(husky) | 提交规范')) {
gitFn();
}
if (paramater['useChoices'].includes('test dev pro | 环境区分')) {
envFn();
}
if (paramater['useChoices'].includes('CICD | 各种脚本示例')) {
CICDFn();
}
if (paramater['useChoices'].includes('cors | nginx && express(写plugin的工具)')) {
corFn();
}
if (paramater['useChoices'].includes('Test case | jest 通用测试用例')) {
testFn();
}
if (paramater['useChoices'].includes('README | 生成标准格式的README')) {
let res = await readmeFn();
console.log(chalk.green("frontengineerplugin - ",res ) + '\n');
}
console.log(chalk.grey(`package.json中可以添加如下字段
"label":[
{
"frontName": "Bili",
"behindName": "Electrolux",
"src": "https://space.bilibili.com/286773126",
"color": "pink"
}
]
`))
if (!fs.existsSync(path.resolve(process.cwd(), '.gitignore'))) {
console.log(`.gitignore 不存在 | 自动帮你添加`);
fs.writeFileSync(
path.resolve(process.cwd(), '.gitignore'),
JSON.stringify("node_modules", null, '\t')
);
}
// spinner.fail(); spinner.succeed();
spinner.succeed();
console.log(chalk.green('success! 项目初始化成功 - 使用请参考 https://www.npmjs.com/package/frontengineerplugin | https://gitee.com/electrolux/front-engineer-plugin') + '\n');
});
});
program.parse(process.argv); // 解析变量
}
// 0.写入json
/*
const packageJsonStr = fs.readFileSync('./package.json').toString()
try {
const packageJson = JSON.parse(packageJsonStr)
// 升级版本号
const arr = packageJson.version.split('.')
if (arr[2] < 9) {
arr[2] = +arr[2] + 1
} else if (arr[1] < 9) {
arr[1] = +arr[1] + 1
arr[2] = 0
} else {
arr[0] = +arr[0] + 1
arr[1] = 0
arr[2] = 0
}
const newVersion = arr.join('.')
packageJson.version = newVersion
fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, '\t'))
// add new package.json
execSync(`git add package.json`)
} catch (e) {
console.error('处理package.json失败,请重试', e.message);
process.exit(1)
}
*/
// 1.复制
// if (fs.existsSync("test")) {
// // 1.1 复制单个文件
// fs.cp('./project.js', './test/te.js',()=>{
// });
// return
// } else {
// // 1.2 { recursive: true } 加上这个就可以复制整一个目录
// // 若 dest 目录不存在,则会自动创建(无论几级目录);
// fs.mkdirSync(`test`);
// fs.cp('./', './test/',{ recursive: true }, (err) => {
// if (err) {
// console.error(err);
// }
// });
// }
// 2.删除
// child.exec('ls', function(err, sto) {
// console.log(sto);//sto才是真正的输出,要不要打印到控制台,由你自己啊
// })
// 删除文件夹
// function deleteFolder(filePath,param) {
// if(param.isDir==false){
// fs.unlinkSync(filePath);
// return
// }
// const files = []
// if (fs.existsSync(filePath)) {
// const files = fs.readdirSync(filePath)
// files.forEach((file) => {
// const nextFilePath = `${filePath}/${file}`
// const states = fs.statSync(nextFilePath)
// if (states.isDirectory()) {
// //recurse
// deleteFolder(nextFilePath)
// } else {
// //delete file
// fs.unlinkSync(nextFilePath)
// }
// })
// fs.rmdirSync(filePath)
// }
// }
// deleteFolder("test.txt",{isDir:false})