From 4ee429584b35963b5ce4560c0deb61fc31f7ba1d Mon Sep 17 00:00:00 2001 From: chenos Date: Mon, 16 Mar 2026 07:18:11 +0800 Subject: [PATCH] feat: improve pm add logic (#8875) * feat: improve pm add logic * fix: test error * fix: throw error --- packages/core/server/src/__tests__/pm.test.ts | 2 +- .../src/plugin-manager/plugin-manager.ts | 63 ++++++++----------- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/packages/core/server/src/__tests__/pm.test.ts b/packages/core/server/src/__tests__/pm.test.ts index a703fa96a8f..0fff98e52fb 100644 --- a/packages/core/server/src/__tests__/pm.test.ts +++ b/packages/core/server/src/__tests__/pm.test.ts @@ -151,7 +151,7 @@ describe('pm', () => { test('enable', async () => { app = mockServer(); await app.load(); - await expect(() => app.pm.enable('Plugin0')).rejects.toThrow('Plugin0 plugin load error'); + await expect(() => app.pm.enable('Plugin0')).rejects.toThrowError(); }); test('enable', async () => { const loadFn = vi.fn(); diff --git a/packages/core/server/src/plugin-manager/plugin-manager.ts b/packages/core/server/src/plugin-manager/plugin-manager.ts index 733cff47fc4..52a664e7f4d 100644 --- a/packages/core/server/src/plugin-manager/plugin-manager.ts +++ b/packages/core/server/src/plugin-manager/plugin-manager.ts @@ -321,45 +321,30 @@ export class PluginManager { await tsxRerunning(); } - async add(plugin?: string | typeof Plugin, options: any = {}, insert = false, isUpgrade = false) { + async addOrThrow(plugin?: string | typeof Plugin, options: any = {}, insert = false, isUpgrade = false) { if (!isUpgrade && this.has(plugin)) { const name = typeof plugin === 'string' ? plugin : plugin.name; - this.app.log.warn(`plugin [${name}] added`); - return; + throw new Error(`plugin [${name}] already added`); } if (!options.name && typeof plugin === 'string') { options.name = plugin; } - try { - if (typeof plugin === 'string' && options.name && !options.packageName) { - const packageName = await PluginManager.getPackageName(options.name); - if (packageName) { - options['packageName'] = packageName; - } + if (typeof plugin === 'string' && options.name && !options.packageName) { + const packageName = await PluginManager.getPackageName(options.name); + if (packageName) { + options['packageName'] = packageName; } - - if (options.packageName) { - const packageJson = await PluginManager.getPackageJson(options.packageName); - options['packageJson'] = packageJson; - options['version'] = packageJson.version; - } - } catch (error) { - this.app.log.error(error); - console.error(error); - // empty } - this.app.log.trace(`adding plugin [${options.name}]`, { - method: 'add', - submodule: 'plugin-manager', - name: options.name, - options, - }); - let P: any; - try { - P = await PluginManager.resolvePlugin(options.packageName || plugin, isUpgrade, !!options.packageName); - } catch (error) { - this.app.log.warn('plugin not found', error); - return; + if (options.packageName) { + const packageJson = await PluginManager.getPackageJson(options.packageName); + options['packageJson'] = packageJson; + options['version'] = packageJson.version; + } + + const P = await PluginManager.resolvePlugin(options.packageName || plugin, isUpgrade, !!options.packageName); + + if (!P) { + throw new Error(`plugin [${options?.name || 'unknown'}] load error`); } const instance: Plugin = new P(createAppProxy(this.app), options); @@ -372,12 +357,14 @@ export class PluginManager { this.pluginAliases.set(options.packageName, instance); } await instance.afterAdd(); - this.app.log.trace(`added plugin [${options.name}]`, { - method: 'add', - submodule: 'plugin-manager', - name: instance.name, - options: instance.options, - }); + } + + async add(plugin?: string | typeof Plugin, options: any = {}, insert = false, isUpgrade = false) { + try { + await this.addOrThrow(plugin, options, insert, isUpgrade); + } catch (error) { + this.app.log.error(error); + } } /** @@ -573,7 +560,7 @@ export class PluginManager { added[pluginName] = true; continue; } - await this.add(pluginName); + await this.addOrThrow(pluginName); } for (const name of pluginNames) { const { name: pluginName } = await PluginManager.parseName(name);