@lonu/stc
Version:
A tool for converting OpenApi/Swagger/Apifox into code.
67 lines (66 loc) • 2.82 kB
JavaScript
import Logs from "../console.js";
import { getT } from "../i18n/index.js";
import { TypeScriptPlugin } from "./typescript/index.js";
import { JavaScriptPlugin } from "./javascript/index.js";
import { DartPlugin } from "./dart/index.js";
import { setupTemplate, validTemplate } from "./common.js";
// import { SwiftPlugin } from "./swift/index.ts";
export class PluginManager {
constructor() {
Object.defineProperty(this, "plugins", {
enumerable: true,
configurable: true,
writable: true,
value: [
TypeScriptPlugin,
JavaScriptPlugin,
DartPlugin,
// SwiftPlugin,
]
});
}
register(plugin) {
this.plugins = [
...this.plugins,
...(Array.isArray(plugin) ? plugin : [plugin]),
];
}
async setupAll(context) {
const _options = context.options;
for (const plugin of this.plugins) {
// 加载指定 lang 的插件
const _langs = Array.isArray(plugin.lang) ? plugin.lang : [plugin.lang];
if (!_langs.includes(_options.lang ?? "")) {
continue;
}
Logs.info(getT("$t(plugin.name)", { name: plugin.name }));
if (!plugin.setup) {
Logs.warn(getT("$t(plugin.noSetupMethod)", { name: plugin.name }));
continue;
}
// 执行插件 setup 方法
const pluginSetup = await plugin.setup(context);
context.options.unknownType = pluginSetup.unknownType;
context.options.typeMap = pluginSetup.typeMap;
context.options.template = pluginSetup.template;
context.options.langDirectoryName = pluginSetup.langDirectoryName;
context.options.templatePath = pluginSetup.templatePath;
validTemplate(pluginSetup.template);
setupTemplate(context.options, {
langDirectoryName: pluginSetup.langDirectoryName,
path: pluginSetup.templatePath,
});
// 触发插件 onload 事件
context.onLoad = (data) => plugin.onLoad?.(data, context.options);
// 触发插件 onDefinition 事件
context.onDefinition = (data) => plugin.onDefinition?.(data, context.options);
// 触发插件 onAction 事件
context.onAction = (data) => plugin.onAction?.(data, context.options);
// 触发插件 onTransform 事件
context.onTransform = (def, action) => plugin.onTransform?.(def, action, context.options);
// 触发插件 onEnd 事件
context.onEnd = () => plugin.onEnd?.(context.options);
}
Logs.info(getT("$t(plugin.allSetupDone)"));
}
}