@alova/wormhole
Version:
More modern openAPI generating solution for alova.js
165 lines (164 loc) • 6.03 kB
JavaScript
;
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();