UNPKG

@alova/wormhole

Version:

More modern openAPI generating solution for alova.js

165 lines (164 loc) 6.03 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generatorHelper = exports.GeneratorHelper = void 0; const node_path_1 = __importDefault(require("node:path")); const lodash_1 = require("lodash"); const zod_validation_error_1 = require("zod-validation-error"); const parser_1 = require("../../core/parser"); const getAlovaVersion_1 = __importDefault(require("../../functions/getAlovaVersion")); const getAutoTemplateType_1 = __importDefault(require("../../functions/getAutoTemplateType")); const prepareConfig_1 = __importDefault(require("../../functions/prepareConfig")); const helper_1 = require("../../helper"); const utils_1 = require("../../utils"); const zType_1 = require("./zType"); class GeneratorHelper { constructor() { this.defaultConfig = Object.freeze({ input: '', output: '', responseMediaType: 'application/json', bodyMediaType: 'application/json', type: 'auto', global: 'Apis', globalHost: 'globalThis', useImportType: false, defaultRequire: false, }); } static getInstance() { if (!GeneratorHelper.instance) { GeneratorHelper.instance = new GeneratorHelper(); } return GeneratorHelper.instance; } static load(config) { const ins = new GeneratorHelper(); return ins.load(config); } getConfig() { return this.readConfig; } getDefaultConfig() { return this.defaultConfig; } async load(config) { // 合并配置 const mergedConfig = { ...this.defaultConfig, ...config }; // 验证配置 const validatedConfig = await GeneratorHelper.validateConfig(mergedConfig); // 更新配置 this.config = validatedConfig; this.readConfig = Object.freeze(this.config); helper_1.logger.debug('GeneratorConfig loaded successfully', this.config); return this; } getAlovaVersion(projectPath) { return GeneratorHelper.getAlovaVersion(this.config, projectPath); } getTemplateType(projectPath) { return GeneratorHelper.getTemplateType(this.config, projectPath); } openApiData(projectPath) { return GeneratorHelper.openApiData(this.config, projectPath); } static async validateConfig(config) { let result = config; try { result = zType_1.zGeneratorConfig.parse(config); } catch (error) { const zError = (0, zod_validation_error_1.fromError)(error); throw helper_1.logger.throwError(zError.message, zError.details); } return result; } static getAlovaVersion(config, projectPath) { const configVersion = Number(config.version); return Number.isNaN(configVersion) ? (0, getAlovaVersion_1.default)(projectPath) : `v${configVersion}`; } static getTemplateType(config, projectPath) { let type; const configType = config.type ?? 'auto'; // Determine the template type based on the type in the configuration file switch (configType) { case 'ts': case 'typescript': type = 'typescript'; break; case 'module': type = 'module'; break; case 'auto': type = (0, getAutoTemplateType_1.default)(projectPath); break; default: type = 'commonjs'; break; } return type; } static openApiData(config, projectPath) { return parser_1.openApiParser.parse(config.input, { projectPath, platformType: config.platform, }); } static async generate(config, options) { // ! test config = (0, prepareConfig_1.default)(config); const document = await this.openApiData(config, options.projectPath); if (!document) { return false; } const output = node_path_1.default.resolve(options.projectPath, config.output); const version = GeneratorHelper.getAlovaVersion(config, options.projectPath); const templateHelper = helper_1.TemplateHelper.load({ type: this.getTemplateType(config, options.projectPath), version, }); const templateData = await new parser_1.TemplateParser().parse(document, { projectPath: options.projectPath, generatorConfig: config, }); // Do you need to generate api files? if (!options.force && (0, lodash_1.isEqual)(templateData, helper_1.TemplateHelper.getData(options.projectPath, config.output))) { return false; } await helper_1.TemplateHelper.setData(templateData, options.projectPath, config.output); const generateFiles = [ { fileName: 'createApis', data: templateData, output, }, { fileName: 'apiDefinitions', data: templateData, output, root: true, hasVersion: false, }, { fileName: 'globals.d', data: templateData, output, ext: '.ts', root: true, }, ]; if (!(await (0, utils_1.existsPromise)(node_path_1.default.join(output, `index${templateHelper.getExt()}`)))) { generateFiles.push({ fileName: 'index', data: templateData, output, }); } await templateHelper.outputFiles(generateFiles); return true; } } exports.GeneratorHelper = GeneratorHelper; exports.generatorHelper = GeneratorHelper.getInstance();