import { LowCodePluginManager, } from '@alilc/lowcode-designer'; import { globalContext } from '@alilc/lowcode-editor-core'; import { IPublicApiPlugins, IPublicModelPluginInstance, IPublicTypePlugin, IPublicTypePluginRegisterOptions, IPublicTypePreferenceValueType, } from '@alilc/lowcode-types'; import { PluginInstance } from '../model/plugin-instance'; import { pluginsSymbol } from '../symbols'; const innerPluginsSymbol = Symbol('plugin'); export class Plugins implements IPublicApiPlugins { private readonly [innerPluginsSymbol]: LowCodePluginManager; get [pluginsSymbol](): LowCodePluginManager { if (this.workspaceMode) { return this[innerPluginsSymbol]; } const workspace = globalContext.get('workspace'); if (workspace.isActive) { return workspace.window.innerPlugins; } return this[innerPluginsSymbol]; } constructor(plugins: LowCodePluginManager, public workspaceMode: boolean = false) { this[innerPluginsSymbol] = plugins; } async register( pluginModel: IPublicTypePlugin, options?: any, registerOptions?: IPublicTypePluginRegisterOptions, ): Promise { await this[pluginsSymbol].register(pluginModel, options, registerOptions); } async init(registerOptions: any) { await this[pluginsSymbol].init(registerOptions); } getPluginPreference(pluginName: string): Record | null | undefined { return this[pluginsSymbol].getPluginPreference(pluginName); } get(pluginName: string): IPublicModelPluginInstance | null { const instance = this[pluginsSymbol].get(pluginName); if (instance) { return new PluginInstance(instance); } return null; } getAll() { return this[pluginsSymbol].getAll()?.map(d => new PluginInstance(d)); } has(pluginName: string) { return this[pluginsSymbol].has(pluginName); } delete(pluginName: string) { this[pluginsSymbol].delete(pluginName); } toProxy() { return new Proxy(this, { get(target, prop, receiver) { const _target = target[pluginsSymbol]; if (_target.pluginsMap.has(prop as string)) { // 禁用态的插件,直接返回 undefined if (_target.pluginsMap.get(prop as string)!.disabled) { return undefined; } return _target.pluginsMap.get(prop as string)?.toProxy(); } return Reflect.get(target, prop, receiver); }, }); } }