{"version":3,"file":"panels.cjs","sources":["../../../../src/services/pluginMeta/panels.ts"],"sourcesContent":["import { PluginType, type PanelPluginMeta } from '@grafana/data';\n\nimport { config } from '../../config';\nimport { getFeatureFlagClient } from '../../internal/openFeature';\nimport { FlagKeys } from '../../internal/openFeature/openfeature.gen';\nimport { getBackendSrv } from '../backendSrv';\n\nimport { FALLBACK_TO_BOOTDATA_WARNING } from './constants';\nimport { logPluginMetaDebug, logPluginMetaWarning } from './logging';\nimport { getPanelPluginMapper } from './mappers/mappers';\nimport { initPluginMetas, refetchPluginMetas } from './plugins';\nimport type { PanelPluginMetas, PluginMetasResponse } from './types';\n\nlet panels: PanelPluginMetas = {};\nlet panelsByAliasIDs: PanelPluginMetas = {};\n\nfunction initialized(): boolean {\n  return Boolean(Object.keys(panels).length);\n}\n\nfunction resolveAliasIDs(panels: PanelPluginMetas): PanelPluginMetas {\n  const keys = Object.keys(panels);\n  const panelsByAliasIDs: PanelPluginMetas = {};\n\n  for (let i = 0; i < keys.length; i++) {\n    const pluginId = keys[i];\n    const panel = panels[pluginId];\n    const aliases = panel?.aliasIDs;\n\n    if (!aliases?.length) {\n      continue;\n    }\n\n    for (let j = 0; j < aliases.length; j++) {\n      const alias = aliases[j];\n      panelsByAliasIDs[alias] = panel;\n    }\n  }\n\n  return panelsByAliasIDs;\n}\n\nfunction setPanelsAndAliases(input: PanelPluginMetas) {\n  panels = input;\n  panelsByAliasIDs = resolveAliasIDs(panels);\n}\n\nfunction setMetas(metas: PluginMetasResponse) {\n  if (!metas.items.length) {\n    // something failed while trying to fetch plugin meta\n    // fallback to config.panels from bootdata\n    // eslint-disable-next-line @grafana/no-config-panels\n    setPanelsAndAliases(config.panels);\n    logPluginMetaWarning(FALLBACK_TO_BOOTDATA_WARNING, { pluginType: PluginType.panel });\n    return;\n  }\n\n  const mapper = getPanelPluginMapper();\n  setPanelsAndAliases(mapper(metas));\n}\n\nasync function initPanelPluginMetas(): Promise<void> {\n  if (!getFeatureFlagClient().getBooleanValue(FlagKeys.PluginsUseMTPlugins, false)) {\n    // eslint-disable-next-line @grafana/no-config-panels\n    setPanelsAndAliases(config.panels);\n    logPluginMetaDebug('PluginMeta: initializing panel plugins cache with bootdata values', {});\n    return;\n  }\n\n  const metas = await initPluginMetas();\n  setMetas(metas);\n  logPluginMetaDebug('PluginMeta: initializing panel plugins cache with meta values', {});\n}\n\nfunction getListedPanels(panels: PanelPluginMeta[]): PanelPluginMeta[] {\n  return panels.filter((p) => p.hideFromList === false);\n}\n\nexport async function getPanelPluginMetas(): Promise<PanelPluginMeta[]> {\n  if (!initialized()) {\n    await initPanelPluginMetas();\n  }\n\n  return Object.values(structuredClone(panels));\n}\n\nexport async function getListedPanelPluginMetas(): Promise<PanelPluginMeta[]> {\n  const panels = await getPanelPluginMetas();\n  return getListedPanels(panels).sort((a, b) => a.sort - b.sort);\n}\n\nexport async function getPanelPluginMetasMap(): Promise<PanelPluginMetas> {\n  if (!initialized()) {\n    await initPanelPluginMetas();\n  }\n\n  return structuredClone(panels);\n}\n\n/**\n * Get a map of panel plugins keyed by plugin id.\n * This is a synchronous function that should only be used as an escape hatch in cases where the caller is guaranteed to be called after the panel plugins have been initialized.\n * In other cases, getPanelPluginMetasMap() should be used instead to ensure the panel plugins have been initialized before accessing them.\n * @throws Error if the panel plugins have not been initialized yet\n * @returns a map of panel plugins keyed by plugin id\n */\nexport function getPanelPluginMetasMapSync(): PanelPluginMetas {\n  if (!initialized() && process.env.NODE_ENV === 'development') {\n    throw new Error('getPanelPluginMetasMapSync() was called before panel plugins map was initialized!');\n  }\n  return structuredClone(panels);\n}\n\nexport async function getPanelPluginMeta(pluginId: string): Promise<PanelPluginMeta | null> {\n  if (!initialized()) {\n    await initPanelPluginMetas();\n  }\n\n  const panel = panels[pluginId];\n  if (panel) {\n    return structuredClone(panel);\n  }\n\n  // Check alias values before failing\n  const aliased = panelsByAliasIDs[pluginId];\n  if (aliased) {\n    return structuredClone(aliased);\n  }\n\n  return null;\n}\n\n/**\n * Check if a panel plugin is installed.\n * @param pluginId - The id of the panel plugin.\n * @returns True if the panel plugin is installed, false otherwise.\n */\nexport async function isPanelPluginInstalled(pluginId: string): Promise<boolean> {\n  const panel = await getPanelPluginMeta(pluginId);\n  return Boolean(panel);\n}\n\n/**\n * Get the version of a panel plugin.\n * @param pluginId - The id of the panel plugin.\n * @returns The version of the panel plugin, or null if the plugin is not installed.\n */\nexport async function getPanelPluginVersion(pluginId: string): Promise<string | null> {\n  const panel = await getPanelPluginMeta(pluginId);\n  return panel?.info.version ?? null;\n}\n\n/**\n * Get a list of panel plugin ids that are not hidden from list\n * @returns an array of panel plugin ids that are not hidden from list\n */\nexport async function getListedPanelPluginIds(): Promise<string[]> {\n  const panels = await getPanelPluginMetas();\n  return getListedPanels(panels).map((p) => p.id);\n}\n\nexport function setPanelPluginMetas(override: PanelPluginMetas): void {\n  if (process.env.NODE_ENV !== 'test') {\n    throw new Error('setPanelPluginMetas() function can only be called from tests.');\n  }\n\n  setPanelsAndAliases(structuredClone(override));\n}\n\nexport async function refetchPanelPluginMetas(): Promise<void> {\n  if (!getFeatureFlagClient().getBooleanValue(FlagKeys.PluginsUseMTPlugins, false)) {\n    const settings = await getBackendSrv().get('/api/frontend/settings');\n    setPanelsAndAliases(settings.panels);\n    return;\n  }\n\n  const metas = await refetchPluginMetas();\n  setMetas(metas);\n}\n"],"names":["panels","panelsByAliasIDs","config","logPluginMetaWarning","FALLBACK_TO_BOOTDATA_WARNING","PluginType","getPanelPluginMapper","getFeatureFlagClient","FlagKeys","logPluginMetaDebug","initPluginMetas","getBackendSrv","refetchPluginMetas"],"mappings":"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"}