2023-04-03 03:42:15 -05:00
import type { PluginPreloadResult } from '../pluginPreloader' ;
2023-04-03 10:59:54 -05:00
import { MAX_EXTENSIONS_PER_POINT } from './constants' ;
import { ExtensionsPerPlugin } from './extensionsPerPlugin' ;
2023-04-03 03:42:15 -05:00
import type { PluginExtensionRegistryItem , PluginExtensionRegistry } from './types' ;
import { deepFreeze , logWarning } from './utils' ;
import { isPluginExtensionConfigValid } from './validators' ;
export function createPluginExtensionRegistry ( pluginPreloadResults : PluginPreloadResult [ ] ) : PluginExtensionRegistry {
const registry : PluginExtensionRegistry = { } ;
2023-04-03 10:59:54 -05:00
const extensionsPerPlugin = new ExtensionsPerPlugin ( ) ;
2023-04-03 03:42:15 -05:00
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
2023-04-03 10:59:54 -05:00
if ( ! extensionsPerPlugin . allowedToAdd ( extensionConfig ) ) {
2023-04-03 03:42:15 -05:00
logWarning (
2023-04-03 10:59:54 -05:00
` " ${ pluginId } " plugin has reached the limit of ${ MAX_EXTENSIONS_PER_POINT } for " ${ extensionPointId } ", skip registering extension " ${ extensionConfig . title } ". `
2023-04-03 03:42:15 -05:00
) ;
continue ;
}
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 ) ;
}