import prompts from "prompts"; import { file as fs } from "./file"; import ejs from "ejs"; import { join, resolve, sep } from "path"; import { warning } from "./console"; abstract class Generator { protected answers: {} | null = null; protected RUN: string; // RUN: 项目初始化目录 private dir: string; // dir: 项目运行目录 protected PATH: string; // PATH: 项目根目录 protected TPL: string; // TPL: 模板目录 protected constructor() { this.RUN = join(resolve(process.cwd()), sep); let dir = this.dir = join(resolve(__dirname)); let path = this.PATH = this.dir.substring(0, dir.lastIndexOf("extend")); this.TPL = join(path, "template/"); this.run().catch(() => { console.log(warning("🦠 项目创建失败,程序已自动退出")); }); } /* * 自动指令中枢: * @description 自动调用 CLI 过程中的5大阶段 */ private async run() { await this.Initialize(); await this.Prompting(); await this.Writing(); await this.Installing(); await this.Ending(); } // ---------------------------------------------------------------------- // 5 大阶段 protected Initialize() {} protected Prompting() {} protected Writing() {} protected Installing() {} protected Ending() {} // 5 大阶段 // ---------------------------------------------------------------------- protected easyCopy(file: string) { // @ts-ignore return fs.copy(join(this.TPL, file), join(this.RUN, this.answers.appName, file)); } protected async easyTpl(file: string) { // @ts-ignore const [compileContent] = await Promise.all([ejs.renderFile(join(this.TPL, file), this.answers)]); // @ts-ignore return fs.write(join(this.RUN, this.answers.appName, file), compileContent); } // 提问题,并传回问题答案 protected async prompt(question: prompts.PromptObject | prompts.PromptObject[]) { return this.answers = await prompts(question); } } export { Generator };