bunny-cli/bin/utils.js

114 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const chalk = require('chalk'); // 终端输出颜色变化
const inquirer = require('inquirer'); // 交互选项
const ora = require('ora'); // loading效果
const gitClone = require('git-clone/promise'); // 拉取项目
const fs = require('fs-extra'); // 操作文件
const path = require('path'); // 引入操作路径
const { question, projectList } = require('./config');
module.exports = {
/**
* 判断文件是否存在
* 是否需要覆盖
*/
async fileIsExist(targetPath, name) {
if (fs.existsSync(targetPath, name)) {
const awsaner = await inquirer.prompt({
type: 'confirm',
message: '是否覆盖文件夹❓',
default: false,
name: 'overWrite',
});
// 用户选择是则删除文件夹
if (awsaner.overWrite) {
fs.remove(targetPath);
console.log(chalk.green('✅删除成功'));
return true;
} else {
console.log(chalk.yellow('❌程序退出'));
return false;
}
}
return true;
},
/**
* 创建文项目
*/
async createProject() {
// 选择框架和语言
const frame = await inquirer.prompt(question.frame);
const frameType = `${frame.type}`;
// 如果选择的react框架
if (frame.type === 'react') {
const awsaner = await inquirer.prompt(question.react);
const key = `${frameType}&${awsaner.router}`;
return projectList[key]; // 匹配选择内容
}
// 如果选择是vue框架
else if (frame.type === 'vue') {
const awsaner = await inquirer.prompt(question.vue);
const key = `${frameType}&${awsaner.router}`;
return projectList[key]; // 匹配选择内容
}
// 大屏模板
else if (frame.type === 'large') {
const awsaner = await inquirer.prompt(question.large);
const key = `${frameType}&${awsaner.large}`;
return projectList[key]; // 匹配选择内容
}
// 后台管理
else if (frame.type === 'admin') {
const awsaner = await inquirer.prompt(question.admin);
const key = `${frameType}&${awsaner.admin}`;
console.log(key);
console.log(projectList[key]);
return projectList[key]; // 匹配选择内容
}
// java模板
else if (frame.type === 'java') {
const awsaner = await inquirer.prompt(question.java);
const key = `${frameType}&${awsaner.java}`;
return projectList[key]; // 匹配选择内容
}
},
/**
* 从仓库clone项目
*/
async downloadProject(targetPath, key, name) {
const spinner = ora('由于无法输出子进程所以看不到下载进度\n下载中...\n').start();
try {
await gitClone(key, name, { checkout: 'master' });
spinner.succeed('😄下载成功');
// 如果有git删除原有的git
if (fs.existsSync(targetPath, '.git')) {
fs.remove(path.join(targetPath, '.git'));
}
const overText = `
⚓ 1. vue大屏默认pinia仓库安装Vue-ECharts使用rem、vwvh、rem+vwvh、scale布局
⚓ 2. vue开发模版使用vite
⚓ 3. 后台模板使用vite,,三种版本可以选择
⚓ 4. React模板3种方式
⚓ 5. Java单体开发模版
⚓ 6. Java微服务开发模版
📄 请查看 README.md...
🎉 成功创建项目 ${name}
👉 快速使用编辑器或命令行开始开发吧`;
console.log(overText);
console.log(chalk.whiteBright('Happy hacking!'));
} catch (error) {
spinner.fail('😭下载失败,请稍后重试');
}
},
};