UNPKG

@opra/cli

Version:
116 lines (115 loc) 5.15 kB
"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; })();