UNPKG

@wuapi/processor

Version:
178 lines (171 loc) 6.39 kB
"use strict"; // vim: set ts=2 sw=2: var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.WuApi = void 0; const Build_1 = require("./Build"); const dedent_js_1 = __importDefault(require("dedent-js")); const generator_1 = require("@wuapi/generator"); const path_1 = __importDefault(require("path")); const lodash_1 = __importDefault(require("lodash")); const Log_1 = require("./Log"); const Web_1 = require("./Web"); /** * Main class of */ class WuApi { /** * Constructor. * * Add default generators. */ constructor() { this.VERSION = "1.0.1"; this.generators = new Map(); this.use(new generator_1.RepositoryPlugin()); this.use(new Web_1.WebPlugin()); } /** * Register a generator. * @param generator */ use(generator) { const desc = generator.getDescription(); if (desc.abbreviation.length > 1) { (0, Log_1.error)(`Got invalid abbreviation: "${desc.abbreviation}" of generator "${desc.name}"`); (0, Log_1.error)("generator abbreviation must be ONE letter only!"); throw "generator abbreviation must be ONE letter only!"; } if (this.generators.get(desc.abbreviation)) { const oldDesc = this.generators.get(desc.abbreviation)?.getDescription(); (0, Log_1.info)(`replacing old generator named "${oldDesc?.name}" at "-${desc.abbreviation}" with a new one, named "${desc.name}".`); } this.generators.set(desc.abbreviation, generator); } version() { console.log(String.raw ` __ __ _ _ ___ ___ ___ \ \ / /| | | | / \| _ \|_ _| \ \/\/ / | |_| | | - || _/ | | \_/\_/ \___/ |_|_||_| |___| `, ` version: ${this.VERSION} `); console.log("Plugins:"); for (let g of this.generators.values()) { const desc = g.getDescription(); console.log((0, dedent_js_1.default) ` ${desc.name} ==================== abbreviation: ${desc.abbreviation} version: ${desc.version} description: ${desc.description} `); } } usage() { console.log((0, dedent_js_1.default) ` Usage: node script [options] <action> Options: -o <dir> : Specify output dir. -h : Display this help message. -V : Display project version. Actions: -D : Dump the whole project as JSON. `); for (let g of this.generators.values()) { const desc = g.getDescription(); console.log(` -${desc.abbreviation} : ${desc.description} `); let tags = lodash_1.default.map(desc.arguments, (a) => ` --${desc.abbreviation}-${a.tag} ${a.withValue ? "<value>" : ""}`); let max = lodash_1.default.max(lodash_1.default.map(tags, (a) => a.length)) ?? 0; for (let i = 0; i < desc.arguments.length; i++) { const padding = " ".repeat(max - tags[i].length); console.log(`${tags[i]}${padding} : ${desc.arguments[i].description}`); } } } main(args, project) { const prj = (0, Build_1.buildProject)(project); if ((0, Build_1.verifyProject)(prj)) { console.error("\n"); (0, Log_1.succeed)("Building succeeded!"); } else { console.error("\n"); (0, Log_1.error)("Building succeeded!"); } console.error("\n"); let outDir = path_1.default.join(process.cwd(), 'out'); let gens = {}; var i = 2; while (i < args.length) { switch (args[i]) { case '-o': i++; outDir = args[i]; break; case '-h': this.usage(); return; case '-D': console.log(JSON.stringify(prj, undefined, 2)); return; case '-v': this.version(); return; case '-V': console.log(`Project: ${prj.name}`); console.log(`version: ${prj.version}`); return; default: { const m1 = args[i].match(/^-([a-zA-Z])$/); const m2 = args[i].match(/^--([a-zA-Z])-([a-zA-Z0-9]+)$/); if (m1) { const key = m1[1]; const generator = this.generators.get(key); if (generator) { gens[key] = { generator: generator, args: {}, }; } else { (0, Log_1.error)(`Unknown plugin "${args[i]}"`); this.usage(); return; } } else if (m2) { const key = m2[1]; const arg = m2[2]; const argConf = lodash_1.default.find(gens[key].generator.getDescription().arguments, (a) => a.tag == arg); if (argConf) { let value = argConf.withValue ? args[++i] : ""; gens[key].args[arg] = value; } else { (0, Log_1.error)(`Unknown plugin argument "${args[i]}"`); this.usage(); return; } } else { (0, Log_1.error)(`Unknown option "${args[i]}"`); this.usage(); return; } } } i++; } // Do execute plugin. for (let key in gens) { let gen = gens[key]; gen.generator.process(prj, outDir, gen.args); } } } exports.WuApi = WuApi;