@soutech/fe-cli
Version:
soutech fe cli
447 lines (445 loc) • 12.3 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
// src/init.js
var import_axios = __toESM(require("axios"));
var { existsSync, mkdir, readFile, writeFile } = require("fs-extra");
var ora = require("ora");
var chalk = require("chalk");
var semver = require("semver");
var program = require("commander");
var inquirer = require("inquirer");
var { exec } = require("child_process");
var download = require("download-git-repo");
program.parse(process.argv);
var sfeInit = class {
constructor() {
this.prompt = [];
this.answers = {
projectName: "",
projectDesc: "",
projectAuthor: "",
platForm: "",
frameWork: "",
testPort: "",
prodPort: ""
};
}
checkNodeVersion() {
const unSupportedVer = semver.lt(process.version, "v20.0.0");
if (unSupportedVer) {
throw new Error("Node.js 版本过低,推荐升级 Node.js 至 v20+");
}
this.init();
}
init() {
console.log(chalk.green(`🔥 即将创建新的项目 ...`));
console.log();
this.askProjectName();
this.askProjectDesc();
this.askProjectAuthor();
this.askPlatForm();
this.askFrameWork();
}
askProjectName() {
this.prompt.push({
type: "input",
name: "projectName",
message: "请输入项目的名称",
validate: async (input) => {
if (!input) {
return "项目名称不能为空";
}
if (existsSync(input)) {
return "当前目录名称重复";
}
try {
const response = await import_axios.default.get("https://node.lingxingkj.com/web-infra/api/v1", { params: { name: input } });
if (!response.data.success) {
return JSON.stringify(response.data.data);
}
return true;
} catch (error) {
return "项目名称检验异常";
}
}
});
}
askProjectDesc() {
this.prompt.push({
type: "input",
name: "projectDesc",
message: "请输入项目的介绍",
validate(input) {
if (!input) {
return "项目介绍不能为空";
}
return true;
}
});
}
askProjectAuthor() {
this.prompt.push({
type: "list",
name: "projectAuthor",
message: "请选择项目的作者",
choices: [
{
name: "张玉山",
value: "张玉山"
},
{
name: "张良",
value: "张良"
},
{
name: "魏健",
value: "魏健"
}
]
});
}
askPlatForm() {
this.prompt.push({
type: "list",
name: "platForm",
message: "请选择项目的类型",
choices: [
{
name: "移动端",
value: "h5"
},
{
name: "服务端",
value: "node"
},
{
name: "小程序",
value: "mp"
},
{
name: "桌面端",
value: "pc"
},
{
name: "客户端",
value: "app"
},
{
name: "模版库",
value: "tmpl"
},
{
name: "工具库",
value: "tools"
},
{
name: "运维库",
value: "devops"
}
]
});
}
async askFrameWork() {
this.answers = await inquirer.prompt(this.prompt);
this.prompt = [];
switch (this.answers.platForm) {
case "h5":
this.prompt.push({
type: "list",
name: "frameWork",
message: "请选择开发的框架",
choices: [
{
name: "Umi4",
value: "umi4"
}
]
});
break;
case "pc":
this.prompt.push({
type: "list",
name: "frameWork",
message: "请选择开发的框架",
choices: [
{
name: "Umi3",
value: "umi3"
}
]
});
break;
case "mp":
this.prompt.push({
type: "list",
name: "frameWork",
message: "请选择开发的框架",
choices: [
{
name: "Taro3",
value: "taro3"
}
]
});
break;
case "node":
this.prompt.push({
type: "list",
name: "frameWork",
message: "请选择开发的框架",
choices: [
{
name: "Next15",
value: "next15"
}
]
});
this.prompt.push({
type: "input",
name: "testPort",
message: "请配置测试的端口",
validate(input) {
if (!input) {
return "测试端口不能为空";
}
if (!input.startsWith("3")) {
return "测试端口要以 3 开头";
}
if (input.length !== 4) {
return "测试端口应为 4 位数";
}
return true;
}
});
this.prompt.push({
type: "input",
name: "prodPort",
message: "请配置正式的端口",
validate(input) {
if (!input) {
return "正式端口不能为空";
}
if (!input.startsWith("4")) {
return "正式端口要以 4 开头";
}
if (input.length !== 4) {
return "正式端口应为 4 位数";
}
return true;
}
});
break;
case "app":
this.prompt.push({
type: "list",
name: "frameWork",
message: "请选择开发的框架",
choices: [
{
name: "Flutter3",
value: "flutter3"
}
]
});
break;
case "tools":
this.prompt.push({
type: "list",
name: "frameWork",
message: "请选择开发的框架",
choices: [
{
name: "Father4",
value: "father4"
}
]
});
break;
case "tmpl":
this.prompt.push({
type: "list",
name: "frameWork",
message: "请选择开发的框架",
choices: [
{
name: "Tmpl",
value: "tmpl"
}
]
});
break;
case "devops":
this.prompt.push({
type: "list",
name: "frameWork",
message: "请选择开发的框架",
choices: [
{
name: "Jenkins",
value: "jenkins"
}
]
});
break;
}
this.create();
}
async create() {
const { projectName, projectDesc, projectAuthor, platForm } = this.answers;
const {
frameWork,
testPort = 3e3,
prodPort = 4e3
} = await inquirer.prompt(this.prompt);
this.answers = {
projectName,
projectDesc,
projectAuthor,
platForm,
frameWork,
testPort,
prodPort
};
await this.fetchTemplate();
await this.updateProjectPackage();
this.installProjectPackage();
}
fetchTemplate() {
return new Promise((resolve) => {
console.log();
const blank = " ";
const { projectName, projectDesc, platForm, frameWork } = this.answers;
switch (platForm) {
case "app":
exit("Flutter3");
break;
case "tmpl":
exit("Tmpl");
break;
case "devops":
exit("Jenkins");
break;
}
function exit(frameWork2) {
console.log(chalk.red(`🎃${blank}${frameWork2} coming soon`));
process.exit(1);
}
mkdir(projectName);
console.log(`${chalk.green("✔ ")}${chalk.grey("正在创建你的项目 ...")}`);
const templateSource = frameWork === "next15" ? `https://fgitlab.lingxingkj.cn:sfe/node/${platForm}-${frameWork}#main` : `https://fgitlab.lingxingkj.cn:sfe/tmpl/${platForm}-${frameWork}#main`;
const spinner = ora(`正在拉取远程模板 ...`).start();
download(
templateSource,
`./${projectName}`,
{ clone: true },
async (error) => {
if (error) {
spinner.color = "chalk.red";
spinner.fail(chalk.red(`拉取远程模板失败 ...
${error}`));
return resolve();
}
spinner.color = "chalk.green";
spinner.succeed(`${chalk.grey("拉取远程模板成功 ...")}`);
resolve();
}
);
});
}
updateProjectPackage() {
const { projectName, projectDesc, projectAuthor, platForm, testPort, prodPort } = this.answers;
if (platForm === "tools")
return Promise.resolve();
return new Promise((resolve) => {
const spinner = ora("正在导入配置信息 ...").start();
readFile(`./${projectName}/package.json`, (err, data) => {
if (err) {
spinner.color = "chalk.red";
spinner.fail(
chalk.red(`${projectName}/package.json 读取失败,请检查`)
);
process.exit(1);
}
const templatePackage = JSON.parse(String(data));
templatePackage.name = projectName;
templatePackage.author = projectAuthor;
templatePackage.description = projectDesc;
if (platForm === "node") {
templatePackage.testPort = testPort;
templatePackage.prodPort = prodPort;
}
writeFile(
`./${projectName}/package.json`,
JSON.stringify(templatePackage, "", " "),
(err2) => {
if (err2) {
spinner.color = "chalk.red";
spinner.fail(
chalk.red(`${projectName}/package.json 写入失败,请检查`)
);
process.exit(1);
}
spinner.color = "chalk.green";
spinner.succeed(`${chalk.grey("导入配置信息成功 ...")}`);
resolve();
}
);
});
});
}
installProjectPackage() {
const { projectName, platForm } = this.answers;
process.chdir(`${projectName}`);
const command = "pnpm install";
const installSpinner = ora(
`正在安装项目依赖 ...`
).start();
exec(command, (error, stdout, stderr) => {
if (error) {
installSpinner.color = "chalk.red";
installSpinner.fail(chalk.red("安装项目依赖失败 ..."));
console.log(error);
} else {
installSpinner.color = "chalk.green";
installSpinner.succeed(`${chalk.grey("安装项目依赖成功 ...")}`);
}
callSuccess();
});
const callSuccess = () => {
console.log(
`${chalk.green("✔ ")}${chalk.gray(
`你的项目创建成功 ...`
)}`
);
console.log();
console.log(`😃 ${chalk.bold.green(`cd ${projectName} && pnpm dev`)}`);
console.log();
if (typeof cb === "function") {
cb();
}
};
}
};
var SfeInit = new sfeInit();
SfeInit.checkNodeVersion();