From 52cd4d434fe66bd4976225276bc7aa205badc823 Mon Sep 17 00:00:00 2001 From: Marcus Andersson Date: Fri, 24 Oct 2025 08:31:55 +0200 Subject: [PATCH] Bugfix: Adding support for resolving panel plugins that expose a Promise (#112899) Fixed issue where panel plugin module returns an async function that resolves a panel plugin. --- .../plugins/importer/pluginImporter.test.ts | 19 +++++++++++++++++++ .../plugins/importer/pluginImporter.ts | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/public/app/features/plugins/importer/pluginImporter.test.ts b/public/app/features/plugins/importer/pluginImporter.test.ts index f5cb4738fa8..63061f8016d 100644 --- a/public/app/features/plugins/importer/pluginImporter.test.ts +++ b/public/app/features/plugins/importer/pluginImporter.test.ts @@ -47,6 +47,25 @@ describe('pluginImporter', () => { expect(result).toEqual({ ...panelPlugin, meta: { ...panelPlugin } }); }); + it('should import a panel plugin returning a Promise successfully', async () => { + const spy = jest + .spyOn(importPluginModule, 'importPluginModule') + .mockResolvedValue({ plugin: Promise.resolve({ ...panelPlugin }) }); + + const result = await pluginImporter.importPanel({ ...panelPlugin }); + + expect(spy).toHaveBeenCalledWith({ + path: 'public/plugins/test-plugin/module.js', + version: '1.0.0', + loadingStrategy: 'fetch', + pluginId: 'test-plugin', + moduleHash: 'cc3e6f370520e1efc6043f1874d735fabc710d4b', + translations: { 'en-US': 'public/plugins/test-plugin/locales/en-US/test-plugin.json' }, + }); + + expect(result).toEqual({ ...panelPlugin, meta: { ...panelPlugin } }); + }); + it('should set correct loading strategy', async () => { const spy = jest .spyOn(importPluginModule, 'importPluginModule') diff --git a/public/app/features/plugins/importer/pluginImporter.ts b/public/app/features/plugins/importer/pluginImporter.ts index 8566f665b94..cf2b407021b 100644 --- a/public/app/features/plugins/importer/pluginImporter.ts +++ b/public/app/features/plugins/importer/pluginImporter.ts @@ -48,7 +48,8 @@ const panelPluginPostImport: PostImportStrategy = const pluginExports = await module; if (pluginExports.plugin) { - const plugin: PanelPlugin = pluginExports.plugin; + // pluginExports.plugin can either be a Promise or a PanelPlugin + const plugin: PanelPlugin = await pluginExports.plugin; plugin.meta = meta; pluginsCache.set(meta.id, plugin); return plugin;