import type {PLUGIN_LIST, TPlugin} from './types' export type TPluginsConfigMap = { [key in PLUGIN_LIST]: TPlugin } export type TPluginInstanceMap = { [key in PLUGIN_LIST]: Object } class PluginManager { public static pluginsConfig: TPluginsConfigMap = {} as TPluginsConfigMap public static pluginsInstance: TPluginInstanceMap = {} as TPluginInstanceMap static addPlugins(plugins: TPlugin[]) { plugins.forEach((plugin) => { PluginManager.pluginsConfig[plugin.name] = plugin }) } static async getPlugin(pluginName: PLUGIN_LIST): Promise { const p = (await PluginManager.pluginsConfig[pluginName]?.exec.init()) as T PluginManager.pluginsInstance[pluginName] = p as Object return p } static getPluginSync(pluginName: PLUGIN_LIST): T { const p = PluginManager.pluginsConfig[pluginName]?.exec.initSync() as T PluginManager.pluginsInstance[pluginName] = p as Object return p } static getPluginConfig(pluginName: PLUGIN_LIST): T | void { if ( PluginManager.pluginsConfig && PluginManager.pluginsConfig[pluginName] ) { return PluginManager.pluginsConfig[pluginName].config as T } } } export default PluginManager