diff --git a/packages/grafana-runtime/src/services/plugins.ts b/packages/grafana-runtime/src/services/plugins.ts index 03a377c2b38..1e10560be7d 100644 --- a/packages/grafana-runtime/src/services/plugins.ts +++ b/packages/grafana-runtime/src/services/plugins.ts @@ -23,8 +23,13 @@ export function getAppPluginMetas(): AppPluginMetas { return cloneDeep(apps); } -export function getAppPluginMeta(id: string): AppPluginConfig { - return getAppPluginMetas()[id]; +export function getAppPluginMeta(id: string): AppPluginConfig | undefined { + if (!apps[id]) { + console.error(`Plugin meta missing for plugin with id: ${id}`); + return undefined; + } + + return cloneDeep(apps[id]); } export function setAppPluginMetas(override: AppPluginMetas) { diff --git a/public/app/features/plugins/extensions/registry/AddedComponentsRegistry.test.ts b/public/app/features/plugins/extensions/registry/AddedComponentsRegistry.test.ts index 9fe21b37eae..bdd0e49a8ba 100644 --- a/public/app/features/plugins/extensions/registry/AddedComponentsRegistry.test.ts +++ b/public/app/features/plugins/extensions/registry/AddedComponentsRegistry.test.ts @@ -449,8 +449,10 @@ describe('AddedComponentsRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedComponents: [] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedComponents: [] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ @@ -500,8 +502,10 @@ describe('AddedComponentsRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedComponents: [] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedComponents: [] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ @@ -528,8 +532,10 @@ describe('AddedComponentsRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedComponents: [componentConfig] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedComponents: [componentConfig] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ diff --git a/public/app/features/plugins/extensions/registry/AddedFunctionsRegistry.test.ts b/public/app/features/plugins/extensions/registry/AddedFunctionsRegistry.test.ts index 158ea38f874..2f05570f1b0 100644 --- a/public/app/features/plugins/extensions/registry/AddedFunctionsRegistry.test.ts +++ b/public/app/features/plugins/extensions/registry/AddedFunctionsRegistry.test.ts @@ -641,8 +641,10 @@ describe('addedFunctionsRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedFunctions: [] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedFunctions: [] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ @@ -692,8 +694,10 @@ describe('addedFunctionsRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedFunctions: [] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedFunctions: [] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ @@ -720,8 +724,10 @@ describe('addedFunctionsRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedFunctions: [fnConfig] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedFunctions: [fnConfig] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ diff --git a/public/app/features/plugins/extensions/registry/AddedLinksRegistry.test.ts b/public/app/features/plugins/extensions/registry/AddedLinksRegistry.test.ts index 8c84fb3b6ea..62558be0070 100644 --- a/public/app/features/plugins/extensions/registry/AddedLinksRegistry.test.ts +++ b/public/app/features/plugins/extensions/registry/AddedLinksRegistry.test.ts @@ -623,8 +623,10 @@ describe('AddedLinksRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedLinks: [] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedLinks: [] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ @@ -676,8 +678,10 @@ describe('AddedLinksRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedLinks: [] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedLinks: [] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ @@ -705,8 +709,10 @@ describe('AddedLinksRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedLinks: [linkConfig] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedLinks: [linkConfig] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ diff --git a/public/app/features/plugins/extensions/registry/ExposedComponentsRegistry.test.ts b/public/app/features/plugins/extensions/registry/ExposedComponentsRegistry.test.ts index 122588ac55b..1834fc34de0 100644 --- a/public/app/features/plugins/extensions/registry/ExposedComponentsRegistry.test.ts +++ b/public/app/features/plugins/extensions/registry/ExposedComponentsRegistry.test.ts @@ -422,8 +422,10 @@ describe('ExposedComponentsRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, exposedComponents: [] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, exposedComponents: [] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ @@ -473,8 +475,10 @@ describe('ExposedComponentsRegistry', () => { }; // Make sure that the meta-info is empty - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, exposedComponents: [] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, exposedComponents: [] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ @@ -500,8 +504,10 @@ describe('ExposedComponentsRegistry', () => { component: () => React.createElement('div', null, 'Hello World1'), }; - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, exposedComponents: [componentConfig] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, exposedComponents: [componentConfig] } }; setAppPluginMetas({ [pluginId]: config }); registry.register({ diff --git a/public/app/features/plugins/extensions/usePluginComponents.test.tsx b/public/app/features/plugins/extensions/usePluginComponents.test.tsx index 9fca0e89482..fc0aead9640 100644 --- a/public/app/features/plugins/extensions/usePluginComponents.test.tsx +++ b/public/app/features/plugins/extensions/usePluginComponents.test.tsx @@ -511,7 +511,9 @@ describe('usePluginComponents()', () => { // The `AddedComponentsRegistry` is validating if the link is registered in the plugin metadata. const meta = getAppPluginMeta(pluginId); - const config = { ...meta, extensions: { ...meta.extensions, addedComponents: [componentConfig] } }; + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedComponents: [componentConfig] } }; setAppPluginMetas({ [pluginId]: config }); wrapper = ({ children }: { children: React.ReactNode }) => ( diff --git a/public/app/features/plugins/extensions/usePluginFunctions.test.tsx b/public/app/features/plugins/extensions/usePluginFunctions.test.tsx index f022b0f9e9f..0f9e70dcb15 100644 --- a/public/app/features/plugins/extensions/usePluginFunctions.test.tsx +++ b/public/app/features/plugins/extensions/usePluginFunctions.test.tsx @@ -332,8 +332,10 @@ describe('usePluginFunctions()', () => { }; // The `AddedFunctionsRegistry` is validating if the function is registered in the plugin metadata. - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedFunctions: [functionConfig] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedFunctions: [functionConfig] } }; setAppPluginMetas({ [pluginId]: config }); wrapper = ({ children }: { children: React.ReactNode }) => ( diff --git a/public/app/features/plugins/extensions/usePluginLinks.test.tsx b/public/app/features/plugins/extensions/usePluginLinks.test.tsx index 707623bbcee..dd95672a896 100644 --- a/public/app/features/plugins/extensions/usePluginLinks.test.tsx +++ b/public/app/features/plugins/extensions/usePluginLinks.test.tsx @@ -269,8 +269,10 @@ describe('usePluginLinks()', () => { }; // The `AddedLinksRegistry` is validating if the link is registered in the plugin metadata (config.apps). - const plugin = getAppPluginMeta(pluginId); - const config = { ...plugin, extensions: { ...plugin.extensions, addedLinks: [linkConfig] } }; + const meta = getAppPluginMeta(pluginId); + expect(meta).toBeDefined(); + + const config = { ...meta!, extensions: { ...meta!.extensions, addedLinks: [linkConfig] } }; setAppPluginMetas({ [pluginId]: config }); wrapper = ({ children }: { children: React.ReactNode }) => ( diff --git a/public/app/features/plugins/extensions/utils.tsx b/public/app/features/plugins/extensions/utils.tsx index 18868bbb93a..55a072ff9db 100644 --- a/public/app/features/plugins/extensions/utils.tsx +++ b/public/app/features/plugins/extensions/utils.tsx @@ -683,7 +683,8 @@ export const getExposedComponentPluginDependencies = (exposedComponentId: string // metadata field. (For example the plugins that expose components that the app depends on.) // Heads up! This is a recursive function. export const getAppPluginDependencies = (pluginId: string, visited: string[] = []): string[] => { - if (!getAppPluginMeta(pluginId)) { + const app = getAppPluginMeta(pluginId); + if (!app) { return []; } @@ -692,9 +693,7 @@ export const getAppPluginDependencies = (pluginId: string, visited: string[] = [ return []; } - const pluginIdDependencies = getAppPluginMeta(pluginId).dependencies.extensions.exposedComponents.map( - getAppPluginIdFromExposedComponentId - ); + const pluginIdDependencies = app.dependencies.extensions.exposedComponents.map(getAppPluginIdFromExposedComponentId); return ( pluginIdDependencies