diff --git a/packages/frontend-app-api/src/tree/readAppExtensionsConfig.ts b/packages/frontend-app-api/src/tree/readAppExtensionsConfig.ts index e676e1ee41..cca7064add 100644 --- a/packages/frontend-app-api/src/tree/readAppExtensionsConfig.ts +++ b/packages/frontend-app-api/src/tree/readAppExtensionsConfig.ts @@ -16,7 +16,6 @@ import { Config } from '@backstage/config'; import { JsonValue } from '@backstage/types'; -import { FrontendFeature } from '../wiring'; export interface ExtensionParameters { id: string; @@ -27,34 +26,12 @@ export interface ExtensionParameters { const knownExtensionParameters = ['attachTo', 'disabled', 'config']; -/** - * Returns a filtered list of extensions based on what is discovered in the - * provided features. - */ -export const filterExtensionsByFeatures = ( - extensions: ExtensionParameters[], - features: FrontendFeature[], -): ExtensionParameters[] => { - // Get a list of all extension IDs discovered in the provided features. - const discoveredExtensionIds = features.flatMap(feature => - ('extensions' in feature && Array.isArray(feature.extensions) - ? feature.extensions - : [] - ).map((extension: { id: string }) => extension.id), - ); - - return extensions.filter(extension => - discoveredExtensionIds.includes(extension.id), - ); -}; - // Since we'll never merge arrays in config the config reader context // isn't too much of a help. Fall back to manual config reading logic // as the Config interface makes it quite hard for us otherwise. /** @internal */ export function readAppExtensionsConfig( rootConfig: Config, - features: FrontendFeature[] = [], ): ExtensionParameters[] { const arr = rootConfig.getOptional('app.extensions'); if (!Array.isArray(arr)) { @@ -66,11 +43,8 @@ export function readAppExtensionsConfig( return []; } - return filterExtensionsByFeatures( - arr.map((arrayEntry, arrayIndex) => - expandShorthandExtensionParameters(arrayEntry, arrayIndex), - ), - features, + return arr.map((arrayEntry, arrayIndex) => + expandShorthandExtensionParameters(arrayEntry, arrayIndex), ); } diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts index 0abbbb3560..cf28a80b6a 100644 --- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts +++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts @@ -33,12 +33,14 @@ export function resolveAppNodeSpecs(options: { builtinExtensions?: Extension[]; parameters?: Array; forbidden?: Set; + ignoreStaleExtensionConfig?: boolean; }): AppNodeSpec[] { const { builtinExtensions = [], parameters = [], forbidden = new Set(), features = [], + ignoreStaleExtensionConfig = false, } = options; const plugins = features.filter(OpaqueFrontendPlugin.isType); @@ -202,7 +204,7 @@ export function resolveAppNodeSpecs(options: { existing.params.disabled = Boolean(overrideParam.disabled); } order.set(extensionId, existing); - } else { + } else if (!ignoreStaleExtensionConfig) { throw new Error(`Extension ${extensionId} does not exist`); } } diff --git a/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx b/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx index 29d6b7a0b7..011773a1df 100644 --- a/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx +++ b/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx @@ -219,8 +219,11 @@ export function createSpecializedApp(options?: { builtinExtensions: [ resolveExtensionDefinition(Root, { namespace: 'root' }), ], - parameters: readAppExtensionsConfig(config, features), + parameters: readAppExtensionsConfig(config), forbidden: new Set(['root']), + ignoreStaleExtensionConfig: config.getOptionalBoolean( + 'app.ignoreStaleExtensionConfig', + ), }), );