UNPKG

generate-custom-template-cli

Version:

自定义模板生成CLI工具

118 lines (99 loc) 3.28 kB
const { promisify } = require("util"); const figlet = promisify(require("figlet")); const path = require("path"); const fs = require("fs"); const program = require("commander"); const downloadRepo = promisify(require("download-git-repo")); const open = require("open"); const log = require("../utils/log"); const terminal = require("../utils/terminal"); const { ejsCompile, writeFile, mkdirSync } = require("../utils/file"); const repoConfig = require("../config/repo_config"); const createProject = async (project, otherArg) => { // 1.提示信息 const data = await figlet("GNT welcome you"); log.magentaLog(data); log.hint("gnt helps you create your project, please wait a moment~"); log.hint("The contributor of this scaffolding tools is Wanglm~"); log.hint("We will continuously optimize this architecture in the future~"); // 2.clone项目从仓库 await downloadRepo(repoConfig.vueGitRepo, project, { clone: true }); // 3.执行终端命令npm install // terminal.exec('npm install', {cwd: `./${project}`}); const npm = process.platform === "win32" ? "npm.cmd" : "npm"; await terminal.spawn(npm, ["install"], { cwd: `./${project}` , shell: true}); // 5.运行项目 terminal.spawn(npm, ["run", "start"], { cwd: `./${project}` , shell: true}); // 4.打开浏览器 open("http://localhost:8888/"); }; const handleEjsToFile = async (name, dest, template, filename) => { // 1.获取模块引擎的路径 const templatePath = path.resolve(__dirname, template); const cpnPath = dest.replace("router", "views").replace("src", "@") + `/${name}.vue`; const routePath = dest.replace("/router", "").replace("src", ""); const result = await ejsCompile(templatePath, { name, lowerName: name.toLowerCase(), cpnPath, routePath, }); // 2.写入文件中 // 判断文件不存在,那么就创建文件 mkdirSync(dest); const targetPath = path.resolve(dest, filename); writeFile(targetPath, result); }; const addComponent = async (name, dest) => { handleEjsToFile(name, dest, "../template/component.vue.ejs", `${name}.vue`); }; const addPage = async (name, dest) => { addComponent(name, dest); handleEjsToFile(name, dest, "../template/vue-router.js.ejs", "router.js"); }; const addVue3TSComponent = async (name, dest) => { handleEjsToFile( name, dest, "../template/component3_ts.vue.ejs", `${name}.vue` ); }; const addVue3Page = async (name, dest) => { addVue3TSComponent(name, dest); let routerDest = dest.replace("views", "router"); handleEjsToFile( name, routerDest, "../template/vue-router4.js.ejs", `${name}.ts` ); }; const addVue3PageSetup = async (name, dest) => { handleEjsToFile( name, dest, "../template/component3_ts_su.vue.ejs", `${name}.vue` ); let routerDest = dest.replace("views", "router"); handleEjsToFile( name, routerDest, "../template/vue-router4.js.ejs", `${name}.ts` ); }; const addStore = async (name, dest) => { handleEjsToFile(name, dest, "../template/vue-store.js.ejs", "index.js"); handleEjsToFile(name, dest, "../template/vue-types.js.ejs", "types.js"); }; module.exports = { createProject, addComponent, addPage, addVue3Page, addVue3PageSetup, addStore, };