{"version":3,"file":"settings.mjs","sources":["../../../../src/services/dataSource/settings.ts"],"sourcesContent":["import {\n  type DataSourceInstanceListItem,\n  type DataSourceInstanceSettings,\n  type DataSourceRef,\n  type ScopedVars,\n  isObject,\n  matchPluginId,\n} from '@grafana/data';\n\nimport { isExpressionReference } from '../../utils/expressionRef';\nimport { getCachedPromise, invalidateCachedPromise } from '../../utils/getCachedPromise';\nimport { getBackendSrv } from '../backendSrv';\nimport { getDataSourceSrv, type GetDataSourceListFilters } from '../dataSourceSrv';\nimport { getTemplateSrv } from '../templateSrv';\n\nimport { FALLBACK_TO_LEGACY_LIST_WARNING, FALLBACK_TO_LEGACY_SETTINGS_WARNING } from './constants';\nimport { getExpressionDataSourceSettings, _resetForTests as resetExpressionDs } from './expressionDs';\nimport { describeRef, logDataSourceWarning } from './logging';\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 * In tests, use {@link setDataSourceInstanceSettings} instead.\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 * Test helper — the sanctioned way to seed the instance-settings cache in tests.\n * Fully resets all module state (including runtime and expression data sources),\n * then populates the cache from a clone of `settings` so test fixtures are never\n * mutated. When `defaultDatasourceName` is omitted, the entry flagged with\n * `isDefault: true` becomes the default. Should only be called from tests.\n *\n * @internal\n */\nexport function setDataSourceInstanceSettings(\n  settings: Record<string, DataSourceInstanceSettings>,\n  defaultDatasourceName?: string\n): void {\n  if (process.env.NODE_ENV !== 'test') {\n    throw new Error('setDataSourceInstanceSettings() function can only be called from tests.');\n  }\n\n  _resetForTests();\n  populateMaps(structuredClone(settings));\n  defaultName = defaultDatasourceName ?? Object.values(settings).find((ds) => ds.isDefault)?.name ?? '';\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  const result = lookupFromMaps(ref, scopedVars);\n  if (result) {\n    return result;\n  }\n  return getInstanceSettingsFallback(ref, scopedVars);\n}\n\n/**\n * Filters for {@link getDataSourceInstanceList} and {@link useDataSourceInstanceList}.\n *\n * Identical to {@link GetDataSourceListFilters} except the `filter` callback receives a\n * {@link DataSourceInstanceListItem} instead of the full {@link DataSourceInstanceSettings}.\n * This reflects the long-term data model: the list API will only expose the slim item shape,\n * so filter callbacks must not rely on settings-specific fields such as `jsonData` or `url`.\n *\n * @public\n */\nexport interface GetDataSourceInstanceListFilters extends Omit<GetDataSourceListFilters, 'filter'> {\n  /** Apply a function to filter the list. Receives a slim {@link DataSourceInstanceListItem}. */\n  filter?: (item: DataSourceInstanceListItem) => boolean;\n}\n\n/**\n * Search and filter data sources from the in-memory cache, returning a\n * lightweight view of each match. The heavy per-instance settings are not\n * included — fetch them on demand via {@link getDataSourceInstanceSettings}.\n *\n * @public\n */\nexport async function getDataSourceInstanceList(\n  filters?: GetDataSourceInstanceListFilters\n): Promise<DataSourceInstanceListItem[]> {\n  const { filter: itemFilter, ...settingsFilters } = filters ?? {};\n  // Wrap the slim filter into a settings-compatible callback so applyFilters applies\n  // it with the same semantics as the legacy getList(): checked on base items and on\n  // -- Grafana --, but NOT on -- Mixed -- or -- Dashboard -- (which are appended\n  // unconditionally). Passing it through here avoids a post-map filter pass that would\n  // incorrectly gate those built-ins.\n  const settingsFilter = itemFilter ? (ds: DataSourceInstanceSettings) => itemFilter(toListItem(ds)) : undefined;\n  const filtersWithAdapter = { ...settingsFilters, filter: settingsFilter };\n  const results = applyFilters(filtersWithAdapter);\n  return (results.length > 0 ? results : getInstanceSettingsListFallback(filtersWithAdapter)).map(toListItem);\n}\n\nfunction toListItem(settings: DataSourceInstanceSettings): DataSourceInstanceListItem {\n  return {\n    uid: settings.uid,\n    type: settings.type,\n    apiVersion: settings.apiVersion,\n    name: settings.name,\n    meta: settings.meta,\n    readOnly: settings.readOnly,\n    isDefault: settings.isDefault ?? false,\n  };\n}\n\n// getDataSourceInstanceList appends the built-in -- Grafana -- data source to most results.\n// It is suppressed when pluginId or alerting filters are set, when tracing is set, or when\n// a custom filter callback returns false for it. Callers that want only true instances of a\n// given type must re-check the type to guard against a false positive from that appended\n// built-in. Mirrors the type predicate used inside applyFilters (exact type or aliasID match).\nfunction matchesType(item: DataSourceInstanceListItem, type: string): boolean {\n  return item.type === type || (item.meta.aliasIDs?.includes(type) ?? false);\n}\n\n/**\n * Resolve the default data source instance of a given type. Returns the instance flagged\n * as default, otherwise the first instance of that type, or `undefined` when none exist.\n *\n * Covers the common \"get my data source\" pattern (`list.find(ds => ds.isDefault) ?? list[0]`)\n * without exposing the full list. The heavy per-instance settings are not included — fetch\n * them on demand via {@link getDataSourceInstanceSettings}.\n *\n * @public\n */\nexport async function getDefaultDataSourceInstance(type: string): Promise<DataSourceInstanceListItem | undefined> {\n  const allOfType = await getDataSourceInstanceList({ type, all: true });\n  const list = allOfType.filter((item) => matchesType(item, type));\n  const defaultInstance = list.find((item) => item.isDefault);\n  return defaultInstance ?? list[0];\n}\n\n/**\n * Check whether at least one data source instance of the given type is installed.\n *\n * Covers presence checks (`getList({ type }).length > 0`) without returning a list.\n *\n * @public\n */\nexport async function hasDataSourceInstance(type: string): Promise<boolean> {\n  const list = await getDataSourceInstanceList({ type, all: true });\n  return list.some((item) => matchesType(item, type));\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. The variable can\n  // sit anywhere in the string (e.g. `logs-${stage}-loki`), not only at the start; legacy\n  // DataSourceSrv.get() interpolates unconditionally. When interpolation changes nothing\n  // (a datasource name that merely contains `$`), fall through to the plain lookup.\n  if (nameOrUid.includes('$')) {\n    const interpolated = getTemplateSrv().replace(nameOrUid, scopedVars, variableInterpolation);\n    if (interpolated !== nameOrUid) {\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\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 * Last resort while the legacy `DataSourceSrv` still exists: the new in-memory cache found\n * nothing, so consult the legacy service. If it resolves what the new path missed, that's a\n * divergence worth tracking. Delete this (and its call site) once `DataSourceSrv` is gone.\n */\nfunction getInstanceSettingsFallback(\n  ref: DataSourceRef | string | null | undefined,\n  scopedVars: ScopedVars | undefined\n): DataSourceInstanceSettings | undefined {\n  const legacy = getDataSourceSrv()?.getInstanceSettings(ref, scopedVars);\n  if (legacy) {\n    logDataSourceWarning(FALLBACK_TO_LEGACY_SETTINGS_WARNING, { ref: describeRef(ref) });\n    return legacy;\n  }\n  return undefined;\n}\n\n/**\n * Last resort while the legacy `DataSourceSrv` still exists: the new in-memory cache produced\n * an empty list, so consult the legacy service. Delete this (and its call site) once\n * `DataSourceSrv` is gone.\n */\nfunction getInstanceSettingsListFallback(filters: GetDataSourceListFilters | undefined): DataSourceInstanceSettings[] {\n  const legacy = getDataSourceSrv()?.getList(filters) ?? [];\n  if (legacy.length > 0) {\n    logDataSourceWarning(FALLBACK_TO_LEGACY_LIST_WARNING, { filters: filtersForLog(filters) });\n    return legacy;\n  }\n  return [];\n}\n\nfunction filtersForLog(filters: GetDataSourceListFilters | undefined): string {\n  if (!filters) {\n    return 'none';\n  }\n  // The `filter` callback can't be serialized; the rest is enough to identify the query.\n  const { filter: _filter, ...rest } = filters;\n  return JSON.stringify(rest);\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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"}