{"version":3,"file":"settings.mjs","sources":["../../../../src/services/dataSource/settings.ts"],"sourcesContent":["import {\n  type DataSourceInstanceSettings,\n  type DataSourceRef,\n  type ScopedVars,\n  isObject,\n  matchPluginId,\n} from '@grafana/data';\n\nimport { isExpressionReference } from '../../utils/DataSourceWithBackend';\nimport { getCachedPromise, invalidateCachedPromise } from '../../utils/getCachedPromise';\nimport { getBackendSrv } from '../backendSrv';\nimport { getDataSourceSrv, type GetDataSourceListFilters } from '../dataSourceSrv';\nimport { getTemplateSrv } from '../templateSrv';\n\nimport { getExpressionDataSourceSettings, _resetForTests as resetExpressionDs } from './expressionDs';\nimport { clearPluginCache } from './pluginCache';\n\nlet byName: Record<string, DataSourceInstanceSettings> = {};\nlet byUid: Record<string, DataSourceInstanceSettings> = {};\nlet byId: Record<string, DataSourceInstanceSettings> = {};\nlet runtimeByUid: Record<string, DataSourceInstanceSettings> = {};\nlet defaultName = '';\n\nfunction populateMaps(settings: Record<string, DataSourceInstanceSettings>) {\n  byName = {};\n  byUid = {};\n  byId = {};\n\n  for (const dsSettings of Object.values(settings)) {\n    if (!dsSettings.uid) {\n      dsSettings.uid = dsSettings.name; // e.g. -- Grafana --, -- Mixed --\n    }\n    byName[dsSettings.name] = dsSettings;\n    byUid[dsSettings.uid] = dsSettings;\n    if (dsSettings.id) {\n      byId[String(dsSettings.id)] = dsSettings;\n    }\n  }\n\n  // Re-apply any previously registered runtime data sources so they survive a refetch.\n  for (const ds of Object.values(runtimeByUid)) {\n    byUid[ds.uid] = ds;\n  }\n}\n\n/**\n * Populate the instance-settings cache from boot data. Intended to be called\n * exactly once at application startup via the `@grafana/runtime/internal` export.\n *\n * @internal\n */\nexport function initDataSourceInstanceSettings(\n  settings: Record<string, DataSourceInstanceSettings>,\n  defaultDsName: string\n): void {\n  defaultName = defaultDsName;\n  populateMaps(settings);\n}\n\n/**\n * Clear the instance-settings cache and refetch from the backend. Resolves\n * when the refresh is complete.\n *\n * @public\n */\nconst RELOAD_CACHE_KEY = 'grafana-runtime:ds-reload';\n\nasync function fetchAndPopulate(): Promise<void> {\n  const settings = await getBackendSrv().get('/api/frontend/settings');\n  populateMaps(settings.datasources);\n  defaultName = settings.defaultDatasource;\n}\n\nasync function performReload(): Promise<void> {\n  const srv = getDataSourceSrv();\n  if (srv) {\n    await srv.reload();\n    return;\n  }\n  clearPluginCache();\n  await fetchAndPopulate();\n}\n\nexport async function reloadDataSourceInstanceSettings(): Promise<void> {\n  // Coalesce concurrent reloads into a single in-flight request via the shared promise\n  // cache, then invalidate so a later call refetches rather than returning a stale result.\n  try {\n    await getCachedPromise(performReload, { cacheKey: RELOAD_CACHE_KEY });\n  } finally {\n    invalidateCachedPromise(RELOAD_CACHE_KEY);\n  }\n}\n\ninterface SyncDataSourceSettings {\n  datasources: Record<string, DataSourceInstanceSettings>;\n  defaultDatasource: string;\n}\n\n/**\n * Sync the instance-settings cache from an already-fetched `/api/frontend/settings`\n * payload, without issuing another backend request. Built-in (e.g. expression) and\n * runtime data sources survive because `populateMaps` re-applies them.\n *\n * Transition-period helper: while both the legacy `DataSourceSrv` and the new async\n * datasource APIs exist, `DataSourceSrv.reload()` calls this so a single fetch updates\n * both caches. Remove once `DataSourceSrv` is gone.\n *\n * @internal\n */\nexport function syncDataSourceInstanceSettings(settings: SyncDataSourceSettings): void {\n  clearPluginCache();\n  populateMaps(settings.datasources);\n  defaultName = settings.defaultDatasource;\n}\n\n/**\n * Look up the instance settings for a data source from the in-memory cache\n * populated at boot. Call {@link reloadDataSourceInstanceSettings} to refresh\n * the cache from the backend.\n *\n * `scopedVars` are used when `ref` contains a template variable (e.g. `$ds`).\n *\n * @public\n */\nexport async function getDataSourceInstanceSettings(\n  ref?: DataSourceRef | string | null,\n  scopedVars?: ScopedVars\n): Promise<DataSourceInstanceSettings | undefined> {\n  return lookupFromMaps(ref, scopedVars);\n}\n\n/**\n * Search and filter data source instance settings from the in-memory cache.\n *\n * @internal\n */\nexport async function getDataSourceInstanceSettingsList(\n  filters?: GetDataSourceListFilters\n): Promise<DataSourceInstanceSettings[]> {\n  return applyFilters(filters);\n}\n\n/**\n * Register the instance settings for a runtime data source so it is returned\n * by future lookups. Throws if the uid is already in use.\n *\n * @internal\n */\nexport function upsertRuntimeDataSourceInstanceSettings(settings: DataSourceInstanceSettings): void {\n  if (runtimeByUid[settings.uid] || byUid[settings.uid]) {\n    throw new Error(`A data source with uid ${settings.uid} has already been registered`);\n  }\n  runtimeByUid[settings.uid] = settings;\n  byUid[settings.uid] = settings;\n}\n\nfunction lookupFromMaps(\n  ref: DataSourceRef | string | null | undefined,\n  scopedVars: ScopedVars | undefined\n): DataSourceInstanceSettings | undefined {\n  if (isExpressionReference(ref)) {\n    return getExpressionDataSourceSettings();\n  }\n\n  const nameOrUid = getNameOrUid(ref);\n\n  if (nameOrUid == null || nameOrUid === 'default') {\n    if (isDataSourceRef(ref) && ref.type) {\n      const byType = findByType(ref.type);\n      if (byType) {\n        return byType;\n      }\n    }\n    return byUid[defaultName] ?? byName[defaultName];\n  }\n\n  // Template variable reference — interpolate and preserve the raw ref.\n  if (nameOrUid[0] === '$') {\n    const interpolated = getTemplateSrv().replace(nameOrUid, scopedVars, variableInterpolation);\n    const resolved = interpolated === 'default' ? byName[defaultName] : (byUid[interpolated] ?? byName[interpolated]);\n    if (!resolved) {\n      return undefined;\n    }\n    return {\n      ...resolved,\n      isDefault: false,\n      name: nameOrUid,\n      uid: nameOrUid,\n      rawRef: { type: resolved.type, uid: resolved.uid },\n    };\n  }\n\n  return byUid[nameOrUid] ?? byName[nameOrUid] ?? byId[nameOrUid];\n}\n\nfunction findByType(type: string): DataSourceInstanceSettings | undefined {\n  const matches = applyFilters({ type });\n  if (!matches.length) {\n    return undefined;\n  }\n  return matches.find((s) => s.isDefault) ?? matches[0];\n}\n\nfunction applyFilters(filters: GetDataSourceListFilters = {}): DataSourceInstanceSettings[] {\n  const base = Object.values(byName).filter((x) => {\n    if (x.meta.id === 'grafana' || x.meta.id === 'mixed' || x.meta.id === 'dashboard') {\n      return false;\n    }\n    if (filters.metrics && !x.meta.metrics) {\n      return false;\n    }\n    if (filters.tracing && !x.meta.tracing) {\n      return false;\n    }\n    if (filters.logs && x.meta.category !== 'logging' && !x.meta.logs) {\n      return false;\n    }\n    if (filters.annotations && !x.meta.annotations) {\n      return false;\n    }\n    if (filters.alerting && !x.meta.alerting) {\n      return false;\n    }\n    if (filters.pluginId && !matchPluginId(filters.pluginId, x.meta)) {\n      return false;\n    }\n    if (filters.filter && !filters.filter(x)) {\n      return false;\n    }\n    if (filters.type) {\n      if (Array.isArray(filters.type)) {\n        if (!filters.type.includes(x.type)) {\n          return false;\n        }\n      } else if (!(x.type === filters.type || x.meta.aliasIDs?.includes(filters.type))) {\n        return false;\n      }\n    }\n    if (\n      !filters.all &&\n      x.meta.metrics !== true &&\n      x.meta.annotations !== true &&\n      x.meta.tracing !== true &&\n      x.meta.logs !== true &&\n      x.meta.alerting !== true\n    ) {\n      return false;\n    }\n    return true;\n  });\n\n  if (filters.variables) {\n    for (const variable of getTemplateSrv().getVariables()) {\n      if (variable.type !== 'datasource') {\n        continue;\n      }\n      let dsValue = variable.current.value === 'default' ? defaultName : variable.current.value;\n      if (Array.isArray(dsValue)) {\n        dsValue = dsValue[0];\n      }\n      const dsSettings = !Array.isArray(dsValue) && (byName[dsValue] || byUid[dsValue]);\n      if (dsSettings) {\n        const key = `\\${${variable.name}}`;\n        base.push({\n          ...dsSettings,\n          isDefault: false,\n          name: key,\n          uid: key,\n        });\n      }\n    }\n  }\n\n  const results = base.sort((a, b) => {\n    if (a.name.toLowerCase() > b.name.toLowerCase()) {\n      return 1;\n    }\n    if (a.name.toLowerCase() < b.name.toLowerCase()) {\n      return -1;\n    }\n    return 0;\n  });\n\n  if (!filters.pluginId && !filters.alerting) {\n    if (filters.mixed) {\n      const mixed = byName['-- Mixed --'] ?? byUid['-- Mixed --'];\n      if (mixed) {\n        results.push(mixed);\n      }\n    }\n    if (filters.dashboard) {\n      const dashboard = byName['-- Dashboard --'] ?? byUid['-- Dashboard --'];\n      if (dashboard) {\n        results.push(dashboard);\n      }\n    }\n    if (!filters.tracing) {\n      const grafana = byName['-- Grafana --'] ?? byUid['-- Grafana --'];\n      if (grafana && filters.filter?.(grafana) !== false) {\n        results.push(grafana);\n      }\n    }\n  }\n\n  return results;\n}\n\nfunction getNameOrUid(ref: DataSourceRef | string | null | undefined): string | undefined {\n  if (ref == null) {\n    return undefined;\n  }\n  return typeof ref === 'string' ? ref : ref.uid;\n}\n\nfunction isDataSourceRef(ref: DataSourceRef | string | null | undefined): ref is DataSourceRef {\n  return ref != null && isObject(ref) && 'type' in ref;\n}\n\nfunction variableInterpolation<T>(value: T | T[]): T {\n  if (Array.isArray(value)) {\n    return value[0];\n  }\n  return value;\n}\n\n/**\n * Test helper — resets all module state. Should only be called from tests.\n *\n * @internal\n */\nexport function _resetForTests(): void {\n  if (process.env.NODE_ENV !== 'test') {\n    throw new Error('_resetForTests must only be called from tests');\n  }\n  byName = {};\n  byUid = {};\n  byId = {};\n  runtimeByUid = {};\n  defaultName = '';\n  resetExpressionDs();\n}\n"],"names":["_a","resetExpressionDs"],"mappings":"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"}