UNPKG

@soutech/fe-cli

Version:

soutech fe cli

447 lines (445 loc) 12.3 kB
#! /usr/bin/env node 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();