@opra/cli
Version:
Opra CLI tools
116 lines (115 loc) • 5.15 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TsGenerator = void 0;
const tslib_1 = require("tslib");
const node_events_1 = require("node:events");
const node_fs_1 = tslib_1.__importDefault(require("node:fs"));
const node_path_1 = tslib_1.__importDefault(require("node:path"));
const node_process_1 = tslib_1.__importDefault(require("node:process"));
const ansi_colors_1 = tslib_1.__importDefault(require("ansi-colors"));
const file_writer_js_1 = require("../file-writer.js");
const clean_directory_js_1 = require("./generators/clean-directory.js");
const generate_data_type_js_1 = require("./generators/generate-data-type.js");
const generate_document_js_1 = require("./generators/generate-document.js");
const generate_http_api_js_1 = require("./generators/generate-http-api.js");
const generate_http_controller_js_1 = require("./generators/generate-http-controller.js");
const ts_file_js_1 = require("./ts-file.js");
/**
* @class TsGenerator
*/
class TsGenerator extends node_events_1.EventEmitter {
/**
*
* @constructor
*/
constructor(init) {
super();
this._files = {};
this._started = false;
this.serviceUrl = init.serviceUrl;
this.cwd = init.cwd || node_process_1.default.cwd();
this.outDir = init.outDir ? node_path_1.default.resolve(this.cwd, init.outDir) : this.cwd;
this.fileHeader = init.fileHeader || '';
this.writer = init.writer || new file_writer_js_1.FileWriter();
this.options = {
importExt: !!init.importExt,
referenceNamespaces: init.referenceNamespaces,
};
this._documentsMap = new Map();
this._filesMap = new WeakMap();
this.on('log', (message, ...args) => init.logger?.log?.(message, ...args));
this.on('error', (message, ...args) => init.logger?.error?.(message, ...args));
this.on('debug', (message, ...args) => init.logger?.debug?.(message, ...args));
this.on('warn', (message, ...args) => init.logger?.warn?.(message, ...args));
this.on('verbose', (message, ...args) => init.logger?.verbose?.(message, ...args));
}
async generate() {
if (this._started)
return;
this.emit('start');
try {
this._started = true;
this.emit('log', ansi_colors_1.default.cyan('Removing old files..'));
this.cleanDirectory(this.outDir);
this._apiPath = '/api';
this._typesRoot = '/models';
await this.generateDocument();
const { importExt } = this.options;
// Write files
for (const file of Object.values(this._files)) {
const filename = node_path_1.default.join(this.outDir, file.filename);
const targetDir = node_path_1.default.dirname(filename);
node_fs_1.default.mkdirSync(targetDir, { recursive: true });
await this.writer.writeFile(filename, file.generate({ importExt }));
}
}
catch (e) {
this.emit('error', e);
throw e;
}
finally {
this.emit('finish');
}
}
getFile(filePath) {
return this._files[filePath];
}
addFile(filePath, returnExists) {
if (!(filePath.startsWith('.') || filePath.startsWith('/')))
filePath = './' + filePath;
let file = this.getFile(filePath);
if (file) {
if (returnExists)
return file;
throw new Error(`File "${filePath}" already exists`);
}
file = new ts_file_js_1.TsFile(filePath);
file.code.header =
this.fileHeader +
(this._fileHeaderDocInfo ? '\n' + this._fileHeaderDocInfo : '') +
'\n\n';
this._files[file.filename] = file;
return file;
}
extend() {
const instance = {
options: { ...this.options },
};
Object.setPrototypeOf(instance, this);
return instance;
}
}
exports.TsGenerator = TsGenerator;
(() => {
TsGenerator.prototype.cleanDirectory = clean_directory_js_1.cleanDirectory;
TsGenerator.prototype.generateDocument = generate_document_js_1.generateDocument;
TsGenerator.prototype.generateDataType = generate_data_type_js_1.generateDataType;
TsGenerator.prototype._generateTypeCode = generate_data_type_js_1._generateTypeCode;
TsGenerator.prototype._generateEnumTypeCode = generate_data_type_js_1._generateEnumTypeCode;
TsGenerator.prototype._generateComplexTypeCode = generate_data_type_js_1._generateComplexTypeCode;
TsGenerator.prototype._generateSimpleTypeCode = generate_data_type_js_1._generateSimpleTypeCode;
TsGenerator.prototype._generateMappedTypeCode = generate_data_type_js_1._generateMappedTypeCode;
TsGenerator.prototype._generateMixinTypeCode = generate_data_type_js_1._generateMixinTypeCode;
TsGenerator.prototype.generateHttpApi = generate_http_api_js_1.generateHttpApi;
TsGenerator.prototype.generateHttpController = generate_http_controller_js_1.generateHttpController;
})();