2025-04-01 10:38:02 +09:00

90 lines
2.5 KiB
TypeScript

import { ReplaySubject } from 'rxjs';
import { PluginExtensionAddedComponentConfig } from '@grafana/data';
import * as errors from '../errors';
import { isGrafanaDevMode, wrapWithPluginContext } from '../utils';
import { isAddedComponentMetaInfoMissing } from '../validators';
import { PluginExtensionConfigs, Registry, RegistryType } from './Registry';
const logPrefix = 'Could not register component extension. Reason:';
export type AddedComponentRegistryItem<Props = {}> = {
pluginId: string;
title: string;
description?: string;
component: React.ComponentType<Props>;
};
export class AddedComponentsRegistry extends Registry<
AddedComponentRegistryItem[],
PluginExtensionAddedComponentConfig
> {
constructor(
options: {
registrySubject?: ReplaySubject<RegistryType<AddedComponentRegistryItem[]>>;
initialState?: RegistryType<AddedComponentRegistryItem[]>;
} = {}
) {
super(options);
}
mapToRegistry(
registry: RegistryType<AddedComponentRegistryItem[]>,
item: PluginExtensionConfigs<PluginExtensionAddedComponentConfig>
): RegistryType<AddedComponentRegistryItem[]> {
const { pluginId, configs } = item;
for (const config of configs) {
const configLog = this.logger.child({
description: config.description,
title: config.title,
pluginId,
});
if (!config.title) {
configLog.error(`${logPrefix} ${errors.TITLE_MISSING}`);
continue;
}
if (
pluginId !== 'grafana' &&
isGrafanaDevMode() &&
isAddedComponentMetaInfoMissing(pluginId, config, configLog)
) {
continue;
}
const extensionPointIds = Array.isArray(config.targets) ? config.targets : [config.targets];
for (const extensionPointId of extensionPointIds) {
const pointIdLog = configLog.child({ extensionPointId });
const result = {
pluginId,
component: wrapWithPluginContext(pluginId, config.component, pointIdLog),
description: config.description,
title: config.title,
};
pointIdLog.debug('Added component extension successfully registered');
if (!(extensionPointId in registry)) {
registry[extensionPointId] = [result];
} else {
registry[extensionPointId].push(result);
}
}
}
return registry;
}
// Returns a read-only version of the registry.
readOnly() {
return new AddedComponentsRegistry({
registrySubject: this.registrySubject,
});
}
}