{"version":3,"file":"datasources.cjs","sources":["../../../../src/services/pluginMeta/datasources.ts"],"sourcesContent":["import { type DataSourcePluginMeta, PluginType } 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 { getDatasourcePluginMapper } from './mappers/mappers';\nimport { initPluginMetas, refetchPluginMetas } from './plugins';\nimport type { DatasourcePluginMetas, FrontendSettings, PluginMetasResponse } from './types';\n\nlet datasources: DatasourcePluginMetas = {};\nlet datasourcesByAliasIDs: DatasourcePluginMetas = {};\n\nfunction initialized(): boolean {\n  return Boolean(Object.keys(datasources).length);\n}\n\nfunction resolveAliasIDs(input: DatasourcePluginMetas): DatasourcePluginMetas {\n  const keys = Object.keys(input);\n  const byAliasIDs: DatasourcePluginMetas = {};\n\n  for (let i = 0; i < keys.length; i++) {\n    const pluginId = keys[i];\n    const datasource = input[pluginId];\n    const aliases = datasource?.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      byAliasIDs[alias] = datasource;\n    }\n  }\n\n  return byAliasIDs;\n}\n\nfunction setDatasourcesAndAliases(input: DatasourcePluginMetas) {\n  datasources = input;\n  datasourcesByAliasIDs = resolveAliasIDs(input);\n}\n\nexport function getPluginIdFromDatasourceInstanceType(type: string, name: string) {\n  if (type !== 'datasource') {\n    return type;\n  }\n\n  if (name === '-- Dashboard --') {\n    return 'dashboard';\n  }\n\n  if (name === '-- Grafana --') {\n    return 'grafana';\n  }\n\n  if (name === '-- Mixed --') {\n    return 'mixed';\n  }\n\n  return '';\n}\n\nfunction extractFromConfig(\n  configDatasources: Record<string, { type: string; meta: DataSourcePluginMeta }>\n): DatasourcePluginMetas {\n  const seen: DatasourcePluginMetas = {};\n  for (const ds of Object.values(configDatasources)) {\n    const type = getPluginIdFromDatasourceInstanceType(ds.type, ds.meta.name);\n    if (!seen[type]) {\n      seen[type] = ds.meta;\n    }\n  }\n  return seen;\n}\n\nfunction setMetas(metas: PluginMetasResponse) {\n  if (!metas.items.length) {\n    // something failed while trying to fetch plugin meta\n    // fallback to config.datasources from bootdata\n    // eslint-disable-next-line no-restricted-syntax\n    setDatasourcesAndAliases(extractFromConfig(config.datasources));\n    logPluginMetaWarning(FALLBACK_TO_BOOTDATA_WARNING, { pluginType: PluginType.datasource });\n    return;\n  }\n\n  const mapper = getDatasourcePluginMapper();\n  setDatasourcesAndAliases(mapper(metas));\n}\n\nasync function initDatasourcePluginMetas(): Promise<void> {\n  if (!getFeatureFlagClient().getBooleanValue(FlagKeys.PluginsUseMTPlugins, false)) {\n    // eslint-disable-next-line no-restricted-syntax\n    setDatasourcesAndAliases(extractFromConfig(config.datasources));\n    logPluginMetaDebug('PluginMeta: initializing datasource plugins cache with bootdata values', {});\n    return;\n  }\n\n  const metas = await initPluginMetas();\n  setMetas(metas);\n  logPluginMetaDebug('PluginMeta: initializing datasource plugins cache with meta values', {});\n}\n\nexport async function getDatasourcePluginMetas(): Promise<DataSourcePluginMeta[]> {\n  if (!initialized()) {\n    await initDatasourcePluginMetas();\n  }\n\n  return Object.values(structuredClone(datasources));\n}\n\nexport async function getDatasourcePluginMeta(pluginId: string): Promise<DataSourcePluginMeta | null> {\n  if (!initialized()) {\n    await initDatasourcePluginMetas();\n  }\n\n  const datasource = datasources[pluginId];\n  if (datasource) {\n    return structuredClone(datasource);\n  }\n\n  // Check alias values before failing\n  const aliased = datasourcesByAliasIDs[pluginId];\n  if (aliased) {\n    return structuredClone(aliased);\n  }\n\n  return null;\n}\n\nexport function setDatasourcePluginMetas(override: DatasourcePluginMetas): void {\n  if (process.env.NODE_ENV !== 'test') {\n    throw new Error('setDatasourcePluginMetas() function can only be called from tests.');\n  }\n\n  setDatasourcesAndAliases(structuredClone(override));\n}\n\nexport async function refetchDatasourcePluginMetas(settings?: FrontendSettings): Promise<void> {\n  if (!getFeatureFlagClient().getBooleanValue(FlagKeys.PluginsUseMTPlugins, false)) {\n    const resolved = settings ?? (await getBackendSrv().get<FrontendSettings>('/api/frontend/settings'));\n    setDatasourcesAndAliases(extractFromConfig(resolved.datasources));\n    return;\n  }\n\n  const metas = await refetchPluginMetas();\n  setMetas(metas);\n}\n"],"names":["config","logPluginMetaWarning","FALLBACK_TO_BOOTDATA_WARNING","PluginType","getDatasourcePluginMapper","getFeatureFlagClient","FlagKeys","logPluginMetaDebug","initPluginMetas","getBackendSrv","refetchPluginMetas"],"mappings":"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"}