UNPKG

jspurefix

Version:
195 lines 8.54 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const standard_snippet_1 = require("./standard-snippet"); const dict_primitive_1 = require("../dict-primitive"); const compiler_type_1 = require("./compiler-type"); const collections_1 = require("../../collections"); const buffer_1 = require("../../buffer"); const fs = require("fs"); const Util = require("util"); const Path = require("path"); const fields_dispatch_1 = require("../fields-dispatch"); const set_reduce_1 = require("../set-reduce"); class MsgCompiler { constructor(definitions, settings) { this.definitions = definitions; this.settings = settings; this.queue = []; this.buffer = new buffer_1.ElasticBuffer(); this.completed = new collections_1.Dictionary(); this.snippets = new standard_snippet_1.StandardSnippet(this.settings); } generate() { return __awaiter(this, void 0, void 0, function* () { const types = this.settings.types || this.definitions.message.keys(); return this.createTypes(types); }); } getFileName(compilerType) { const settings = this.settings; const fileName = `${compilerType.snaked}.ts`; return Path.join(settings.output, fileName); } createTypes(types) { return __awaiter(this, void 0, void 0, function* () { const definitions = this.definitions; types.forEach((type) => { const definition = definitions.containedSet(type); if (!definition) { throw new Error(`no type ${type} defined`); } const ct = new compiler_type_1.CompilerType(this.definitions, definition, definition.name); this.enqueue(ct); }); yield this.work(); yield this.index(); }); } work() { return __awaiter(this, void 0, void 0, function* () { const q = this.queue; const writeFile = Util.promisify(fs.writeFile); while (q.length > 0) { const compilerType = q.pop(); const api = this.generateMessages(compilerType); const fullName = this.getFileName(compilerType); yield writeFile(fullName, api, { encoding: 'utf8' }); } }); } index() { return __awaiter(this, void 0, void 0, function* () { const writeFile = Util.promisify(fs.writeFile); const settings = this.settings; const fileName = 'index.ts'; const done = this.completed.values(); const exports = done.reduce((prev, current) => { prev.push(`export * from '${current.snaked}'`); return prev; }, [`export * from './enum'`]); const newLine = require('os').EOL; exports.sort(); exports.push(''); const api = exports.join(newLine); const fullName = Path.join(settings.output, fileName); yield writeFile(fullName, api, { encoding: 'utf8' }); }); } generateMessages(compilerType) { const definition = compilerType.set; const buffer = this.buffer; buffer.reset(); const snippets = this.snippets; const newLine = require('os').EOL; let ptr = this.imports(compilerType); if (ptr > 0) { buffer.writeString(newLine); buffer.writeString(newLine); } if (this.settings.comment && definition.description) { const comment = snippets.commentBox(definition.description); buffer.writeString(snippets.startBlockComment(0)); buffer.writeString(newLine); buffer.writeString(comment); buffer.writeString(newLine); buffer.writeString(snippets.endBlockComment(0)); buffer.writeString(newLine); } buffer.writeString(snippets.interface(compilerType.qualifiedName, 0)); buffer.writeChar(buffer_1.Ascii.Space); buffer.writeString(snippets.startBlock(0)); buffer.writeString(newLine); this.fields(compilerType); buffer.writeString(snippets.endBlock(0)); buffer.writeString(newLine); return buffer.toString(); } enqueue(ct) { const completed = this.completed; const fullName = this.getFileName(ct); if (completed.get(fullName)) { return; } this.queue.push(ct); completed.addUpdate(fullName, ct); } fieldSimple(simple) { const snippets = this.snippets; const settings = this.settings; const buffer = this.buffer; const newLine = require('os').EOL; const len = buffer.writeString(snippets.simple(simple.name, buffer_1.Tags.toJSType(simple), simple.required, 1)); if (settings.tags) { buffer.writeString(snippets.commentLine(`${simple.definition.tag}`, 50 - len)); } buffer.writeString(newLine); } fieldGroup(groupField, compilerType) { const newLine = require('os').EOL; const buffer = this.buffer; const snippets = this.snippets; const extended = compilerType.getExtended(groupField); buffer.writeString(snippets.group(compilerType.getFieldGroupName(groupField), extended, groupField.required, 1)); this.enqueue(new compiler_type_1.CompilerType(this.definitions, groupField.definition, extended)); buffer.writeString(newLine); } fieldComponent(componentField, compilerType) { const newLine = require('os').EOL; const buffer = this.buffer; const snippets = this.snippets; const extended = compilerType.getExtended(componentField); buffer.writeString(snippets.component(extended, componentField.required, 1)); this.enqueue(new compiler_type_1.CompilerType(this.definitions, componentField.definition, extended)); buffer.writeString(newLine); } fields(compilerType) { this.attributes(compilerType); fields_dispatch_1.dispatchFields(compilerType.set.fields, { group: (g) => this.fieldGroup(g, compilerType), simple: (simple) => this.fieldSimple(simple), component: (c) => this.fieldComponent(c, compilerType) }); } attributes(compilerType) { const settings = this.settings; const newLine = require('os').EOL; const snippets = this.snippets; const buffer = this.buffer; compilerType.set.localAttribute.forEach((simple) => { const len = buffer.writeString(snippets.simple(simple.definition.name, buffer_1.Tags.toJSType(simple), simple.required, 1)); if (settings.tags) { buffer.writeString(snippets.commentLine(`${simple.definition.tag}`, 50 - len)); } buffer.writeString(newLine); }); } imports(compilerType) { const isMsg = compilerType.set.type === dict_primitive_1.ContainedSetType.Msg; const snippets = this.snippets; const imports = set_reduce_1.reduceSet(compilerType.set, { component: (a, c) => { a.push(`${snippets.import(compilerType.getExtended(c), isMsg, 0)}`); return a; }, group: (a, g) => { a.push(`${snippets.import(compilerType.getExtended(g), isMsg, 0)}`); return a; } }, []); return this.buffer.writeString(imports.join(require('os').EOL)); } } exports.MsgCompiler = MsgCompiler; //# sourceMappingURL=msg-compiler.js.map