{"version":3,"file":"apps.mjs","sources":["../../../../src/services/pluginMeta/apps.ts"],"sourcesContent":["import { type AppPluginConfig, PluginType } from '@grafana/data';\n\nimport { config } from '../../config';\nimport { getFeatureFlagClient } from '../../internal/openFeature';\n\nimport { FALLBACK_TO_BOOTDATA_WARNING } from './constants';\nimport { logPluginMetaWarning } from './logging';\nimport { getAppPluginMapper } from './mappers/mappers';\nimport { initPluginMetas } from './plugins';\nimport type { AppPluginMetas, PluginMetasResponse } from './types';\n\nlet apps: AppPluginMetas = {};\n\nfunction initialized(): boolean {\n  return Boolean(Object.keys(apps).length);\n}\n\nfunction setApps(input: AppPluginMetas) {\n  apps = input;\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-apps\n    setApps(config.apps);\n    logPluginMetaWarning(FALLBACK_TO_BOOTDATA_WARNING, PluginType.app);\n    return;\n  }\n\n  const mapper = getAppPluginMapper();\n  setApps(mapper(metas));\n}\n\nasync function initAppPluginMetas(): Promise<void> {\n  if (!getFeatureFlagClient().getBooleanValue('useMTPlugins', false)) {\n    // eslint-disable-next-line @grafana/no-config-apps\n    setApps(config.apps);\n    return;\n  }\n\n  const metas = await initPluginMetas();\n  setMetas(metas);\n}\n\nexport async function getAppPluginMetas(): Promise<AppPluginConfig[]> {\n  if (!initialized()) {\n    await initAppPluginMetas();\n  }\n\n  return Object.values(structuredClone(apps));\n}\n\nexport async function getAppPluginMeta(pluginId: string): Promise<AppPluginConfig | null> {\n  if (!initialized()) {\n    await initAppPluginMetas();\n  }\n\n  const app = apps[pluginId];\n  return app ? structuredClone(app) : null;\n}\n\n/**\n * Check if an app plugin is installed. The function does not check if the app plugin is enabled.\n * @param pluginId - The id of the app plugin.\n * @returns True if the app plugin is installed, false otherwise.\n */\nexport async function isAppPluginInstalled(pluginId: string): Promise<boolean> {\n  const app = await getAppPluginMeta(pluginId);\n  return Boolean(app);\n}\n\n/**\n * Get the version of an app plugin.\n * @param pluginId - The id of the app plugin.\n * @returns The version of the app plugin, or null if the plugin is not installed.\n */\nexport async function getAppPluginVersion(pluginId: string): Promise<string | null> {\n  const app = await getAppPluginMeta(pluginId);\n  return app?.version ?? null;\n}\n\nexport function setAppPluginMetas(override: AppPluginMetas): void {\n  if (process.env.NODE_ENV !== 'test') {\n    throw new Error('setAppPluginMetas() function can only be called from tests.');\n  }\n\n  setApps(structuredClone(override));\n}\n"],"names":[],"mappings":";;;;;;;;;AAWA,IAAI,OAAuB,EAAC;AAE5B,SAAS,WAAA,GAAuB;AAC9B,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,MAAM,CAAA;AACzC;AAEA,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,IAAA,GAAO,KAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAA4B;AAC5C,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AAIvB,IAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AACnB,IAAA,oBAAA,CAAqB,4BAAA,EAA8B,WAAW,GAAG,CAAA;AACjE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,kBAAA,EAAmB;AAClC,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AACvB;AAEA,eAAe,kBAAA,GAAoC;AACjD,EAAA,IAAI,CAAC,oBAAA,EAAqB,CAAE,eAAA,CAAgB,cAAA,EAAgB,KAAK,CAAA,EAAG;AAElE,IAAA,OAAA,CAAQ,OAAO,IAAI,CAAA;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,EAAgB;AACpC,EAAA,QAAA,CAAS,KAAK,CAAA;AAChB;AAEA,eAAsB,iBAAA,GAAgD;AACpE,EAAA,IAAI,CAAC,aAAY,EAAG;AAClB,IAAA,MAAM,kBAAA,EAAmB;AAAA,EAC3B;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,eAAA,CAAgB,IAAI,CAAC,CAAA;AAC5C;AAEA,eAAsB,iBAAiB,QAAA,EAAmD;AACxF,EAAA,IAAI,CAAC,aAAY,EAAG;AAClB,IAAA,MAAM,kBAAA,EAAmB;AAAA,EAC3B;AAEA,EAAA,MAAM,GAAA,GAAM,KAAK,QAAQ,CAAA;AACzB,EAAA,OAAO,GAAA,GAAM,eAAA,CAAgB,GAAG,CAAA,GAAI,IAAA;AACtC;AAOA,eAAsB,qBAAqB,QAAA,EAAoC;AAC7E,EAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,CAAiB,QAAQ,CAAA;AAC3C,EAAA,OAAO,QAAQ,GAAG,CAAA;AACpB;AAOA,eAAsB,oBAAoB,QAAA,EAA0C;AA9EpF,EAAA,IAAA,EAAA;AA+EE,EAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,CAAiB,QAAQ,CAAA;AAC3C,EAAA,OAAA,CAAO,EAAA,GAAA,GAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAK,YAAL,IAAA,GAAA,EAAA,GAAgB,IAAA;AACzB;AAEO,SAAS,kBAAkB,QAAA,EAAgC;AAChE,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,MAAA,EAAQ;AACnC,IAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAA,CAAQ,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACnC;;;;"}