2023-04-03 03:42:15 -05:00
|
|
|
import type { PluginPreloadResult } from '../pluginPreloader';
|
|
|
|
|
|
|
|
import type { PluginExtensionRegistryItem, PluginExtensionRegistry } from './types';
|
|
|
|
import { deepFreeze, logWarning } from './utils';
|
|
|
|
import { isPluginExtensionConfigValid } from './validators';
|
|
|
|
|
|
|
|
export function createPluginExtensionRegistry(pluginPreloadResults: PluginPreloadResult[]): PluginExtensionRegistry {
|
|
|
|
const registry: PluginExtensionRegistry = {};
|
|
|
|
|
|
|
|
for (const { pluginId, extensionConfigs, error } of pluginPreloadResults) {
|
|
|
|
if (error) {
|
|
|
|
logWarning(`"${pluginId}" plugin failed to load, skip registering its extensions.`);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const extensionConfig of extensionConfigs) {
|
2023-04-03 10:59:54 -05:00
|
|
|
const { extensionPointId } = extensionConfig;
|
2023-04-03 03:42:15 -05:00
|
|
|
|
|
|
|
if (!extensionConfig || !isPluginExtensionConfigValid(pluginId, extensionConfig)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
let registryItem: PluginExtensionRegistryItem = {
|
|
|
|
config: extensionConfig,
|
|
|
|
|
|
|
|
// Additional meta information about the extension
|
|
|
|
pluginId,
|
|
|
|
};
|
|
|
|
|
2023-04-03 10:59:54 -05:00
|
|
|
if (!Array.isArray(registry[extensionPointId])) {
|
|
|
|
registry[extensionPointId] = [registryItem];
|
2023-04-03 03:42:15 -05:00
|
|
|
} else {
|
2023-04-03 10:59:54 -05:00
|
|
|
registry[extensionPointId].push(registryItem);
|
2023-04-03 03:42:15 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return deepFreeze(registry);
|
|
|
|
}
|