@wuapi/processor
Version:
Processor of typscript to form WU-API entities
178 lines (171 loc) • 6.39 kB
JavaScript
;
// 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;