grafana_bak/public/app/features/plugins/pluginPreloader.ts
2025-04-01 10:38:02 +09:00

41 lines
1.4 KiB
TypeScript

import type { PluginExtensionAddedLinkConfig, PluginExtensionExposedComponentConfig } from '@grafana/data';
import { PluginExtensionAddedComponentConfig } from '@grafana/data/src/types/pluginExtensions';
import type { AppPluginConfig } from '@grafana/runtime';
import { getPluginSettings } from 'app/features/plugins/pluginSettings';
import { importAppPlugin } from './plugin_loader';
export type PluginPreloadResult = {
pluginId: string;
error?: unknown;
exposedComponentConfigs: PluginExtensionExposedComponentConfig[];
addedComponentConfigs?: PluginExtensionAddedComponentConfig[];
addedLinkConfigs?: PluginExtensionAddedLinkConfig[];
};
const preloadedAppPlugins = new Set<string>();
const isNotYetPreloaded = ({ id }: AppPluginConfig) => !preloadedAppPlugins.has(id);
const markAsPreloaded = (apps: AppPluginConfig[]) => apps.forEach(({ id }) => preloadedAppPlugins.add(id));
export async function preloadPlugins(apps: AppPluginConfig[] = []) {
const appPluginsToPreload = apps.filter(isNotYetPreloaded);
if (appPluginsToPreload.length === 0) {
return;
}
markAsPreloaded(apps);
await Promise.all(appPluginsToPreload.map(preload));
}
async function preload(config: AppPluginConfig) {
try {
const meta = await getPluginSettings(config.id);
await importAppPlugin(meta);
} catch (error) {
console.error(`[Plugins] Failed to preload plugin: ${config.path} (version: ${config.version})`, error);
}
}