feat: 插件注册增加override选项

This commit is contained in:
lianjie.lj 2021-11-03 17:53:14 +08:00 committed by lihao.ylh
parent 063d3493da
commit 19b9a7de0d
3 changed files with 59 additions and 1 deletions

View File

@ -31,7 +31,18 @@ export class LowCodePluginManager implements ILowCodePluginManager {
const config = pluginConfigCreator(ctx, pluginOptions);
invariant(config.name, `${config.name} required`, config);
ctx.setLogger(config);
invariant(!this.pluginsMap.has(config.name), `${config.name} already exists`, this.pluginsMap.get(config.name));
const allowOverride = options?.override === true;
if (this.pluginsMap.has(config.name)) {
if (!allowOverride) {
throw new Error(`Plugin with name ${config.name} exists`);
} else {
// clear existing plugin
const originalPlugin = this.pluginsMap.get(config.name);
logger.log('plugin override, originalPlugin with name ', config.name, ' will be destroyed, config:', originalPlugin?.config);
originalPlugin?.destroy();
this.pluginsMap.delete(config.name);
}
}
const plugin = new LowCodePlugin(this, config, pluginOptions);
if (options?.autoInit) {
await plugin.init();

View File

@ -79,4 +79,6 @@ export type ILowCodePluginManager = ILowCodePluginManagerCore & ILowCodePluginMa
export type LowCodeRegisterOptions = {
autoInit?: boolean;
// allow overriding existing plugin with same name when override === true
override?: boolean;
};

View File

@ -136,6 +136,51 @@ describe('plugin 测试', () => {
expect(mockFn).toHaveBeenCalledTimes(2);
});
it('默认情况不允许重复注册', async () => {
const mockFn = jest.fn();
const mockPlugin = (ctx: ILowCodePluginContext, options: any) => {
return {
name: 'demoDuplicated',
init: mockFn,
};
};
pluginManager.register(mockPlugin, { test: 1 });
pluginManager.register(mockPlugin, { test: 1 }).catch(e => {
expect(e).toEqual(new Error('Plugin with name demoDuplicated exists'));
});
await pluginManager.init();
});
it('插件增加 override 参数时可以重复注册', async () => {
const mockFn = jest.fn();
const mockPlugin = (ctx: ILowCodePluginContext, options: any) => {
return {
name: 'demoOverride',
init: mockFn,
};
};
pluginManager.register(mockPlugin, { test: 1 });
pluginManager.register(mockPlugin, { test: 1 }, { override: true });
await pluginManager.init();
});
it('插件增加 override 参数时可以重复注册, 被覆盖的如果已初始化,会被销毁', async () => {
const mockInitFn = jest.fn();
const mockDestroyFn = jest.fn();
const mockPlugin = (ctx: ILowCodePluginContext, options: any) => {
return {
name: 'demoOverride',
init: mockInitFn,
destroy: mockDestroyFn,
};
};
await pluginManager.register(mockPlugin, { test: 1 }, { autoInit: true });
expect(mockInitFn).toHaveBeenCalledTimes(1);
await pluginManager.register(mockPlugin, { test: 1 }, { override: true });
expect(mockDestroyFn).toHaveBeenCalledTimes(1);
await pluginManager.init();
});
it('内部事件机制', async () => {
const mockFn = jest.fn();
pluginManager.register((ctx: ILowCodePluginContext, options: any) => {