import { toPairs } from 'lodash';
import type { IStageTypeConfig } from '../domain';
import { HelpContentsRegistry } from '../help';
import type { IManagedDeliveryPlugin, IResourceKindConfig } from '../managed';
import { registerManagedDeliveryPlugin } from '../managed';
import { Registry } from '../registry';
import type { SearchResultType } from '../search';
import { searchResultTypeRegistry } from '../search';
export interface IDeckPlugin {
/** Custom Stage UI (configuration and execution details) */
stages?: IStageTypeConfig[];
/** Custom Preconfigured Job Stage UI (configuration and execution details) */
preconfiguredJobStages?: IStageTypeConfig[];
/** DEPRECATED - Custom managed resource kinds */
resourceKinds?: IResourceKindConfig[];
/** Managed Delivery hooks */
managedDelivery?: IManagedDeliveryPlugin;
/** Help Text for use in */
help?: { [helpKey: string]: string };
/** Custom global search types */
search?: SearchResultType[];
initialize?(plugin: IDeckPlugin): void;
}
/** Given a plugin, registers the plugin's extensions with Deck registries */
export function registerPluginExtensions(plugin: IDeckPlugin): PromiseLike {
plugin.stages?.forEach((stage) => Registry.pipeline.registerStage(stage));
plugin.preconfiguredJobStages?.forEach((stage) => Registry.pipeline.registerPreconfiguredJobStage(stage));
toPairs(plugin.help ?? {}).forEach(([key, value]) => HelpContentsRegistry.register(key, value));
plugin.search?.forEach((search) => searchResultTypeRegistry.register(search));
if (plugin.managedDelivery || plugin.resourceKinds) {
const managedDeliveryPlugin: IManagedDeliveryPlugin = {
...plugin.managedDelivery,
resources: plugin.resourceKinds || plugin.managedDelivery?.resources,
};
registerManagedDeliveryPlugin(managedDeliveryPlugin);
}
// Run arbitrary plugin initialization code
return Promise.resolve(plugin.initialize?.(plugin));
}