From 18509cea1d27506bface247121dccb37cfbc694d Mon Sep 17 00:00:00 2001 From: Camila Belo Date: Fri, 8 Aug 2025 10:20:38 +0200 Subject: [PATCH] refactor: apply review suggestions Signed-off-by: Camila Belo --- .changeset/fluffy-otters-cry.md | 2 +- .changeset/thirty-eagles-run.md | 2 +- .../src/tree/instantiateAppNodeTree.test.ts | 2 +- .../src/tree/resolveAppNodeSpecs.test.ts | 56 +++++++++---------- .../src/tree/resolveAppNodeSpecs.ts | 12 ++-- .../src/tree/resolveAppTree.test.ts | 2 +- packages/frontend-plugin-api/report.api.md | 2 +- 7 files changed, 41 insertions(+), 37 deletions(-) diff --git a/.changeset/fluffy-otters-cry.md b/.changeset/fluffy-otters-cry.md index 2798473c2f..fd24a0bb47 100644 --- a/.changeset/fluffy-otters-cry.md +++ b/.changeset/fluffy-otters-cry.md @@ -2,4 +2,4 @@ '@backstage/frontend-app-api': minor --- -Use an empty root plugin for built-in extension app node specs. +Use an app plugin for built-in extension app node specs. diff --git a/.changeset/thirty-eagles-run.md b/.changeset/thirty-eagles-run.md index af2809e3f4..10ca1af381 100644 --- a/.changeset/thirty-eagles-run.md +++ b/.changeset/thirty-eagles-run.md @@ -2,4 +2,4 @@ '@backstage/frontend-app-api': minor --- -**BREAKING:** The `AppNodeSpec.plugin` property is now required. +The `AppNodeSpec.plugin` property is now required. diff --git a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts index 794a2a3671..ebe8d95263 100644 --- a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts +++ b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts @@ -57,7 +57,7 @@ function makeSpec( attachTo: extension.attachTo, disabled: extension.disabled, extension: extension as Extension, - plugin: createFrontendPlugin({ pluginId: 'root' }), + plugin: createFrontendPlugin({ pluginId: 'app' }), ...spec, }; } diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts index 276f47c9d8..83abcf3dc4 100644 --- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts +++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts @@ -20,7 +20,7 @@ import { Extension, ExtensionDefinition, } from '@backstage/frontend-plugin-api'; -import { resolveAppNodeSpecs, rootPlugin } from './resolveAppNodeSpecs'; +import { resolveAppNodeSpecs } from './resolveAppNodeSpecs'; function makeExt( id: string, @@ -62,15 +62,15 @@ describe('resolveAppNodeSpecs', () => { builtinExtensions: [a], parameters: [], }), - ).toStrictEqual([ + ).toEqual([ { id: 'a', extension: a, attachTo: { id: 'root', input: 'default' }, disabled: true, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, ]); }); @@ -91,8 +91,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'b', @@ -100,8 +100,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, ]); }); @@ -130,8 +130,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'derp', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'test/a', @@ -217,8 +217,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'a', @@ -226,8 +226,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, ]); }); @@ -257,8 +257,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'd', @@ -266,8 +266,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'c', @@ -275,8 +275,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'a', @@ -284,8 +284,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: true, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'b', @@ -293,8 +293,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'f', @@ -302,8 +302,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: false, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, { id: 'g', @@ -311,8 +311,8 @@ describe('resolveAppNodeSpecs', () => { attachTo: { id: 'root', input: 'default' }, disabled: true, config: undefined, - plugin: rootPlugin, - source: rootPlugin, + plugin: expect.any(Object), + source: expect.any(Object), }, ]); }); diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts index 46a6042729..f9ce7387c2 100644 --- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts +++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts @@ -30,8 +30,6 @@ import { // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { toInternalExtension } from '../../../frontend-plugin-api/src/wiring/resolveExtensionDefinition'; -export const rootPlugin = createFrontendPlugin({ pluginId: 'root' }); - /** @internal */ export function resolveAppNodeSpecs(options: { features?: FrontendFeature[]; @@ -93,6 +91,12 @@ export function resolveAppNodeSpecs(options: { ); } + const appPlugin = + plugins.find(plugin => plugin.id === 'app') ?? + createFrontendPlugin({ + pluginId: 'app', + }); + const configuredExtensions = [ ...pluginExtensions.map(({ plugin, ...extension }) => { const internalExtension = toInternalExtension(extension); @@ -112,8 +116,8 @@ export function resolveAppNodeSpecs(options: { return { extension: internalExtension, params: { - source: rootPlugin, - plugin: rootPlugin, + source: appPlugin, + plugin: appPlugin, attachTo: internalExtension.attachTo, disabled: internalExtension.disabled, config: undefined as unknown, diff --git a/packages/frontend-app-api/src/tree/resolveAppTree.test.ts b/packages/frontend-app-api/src/tree/resolveAppTree.test.ts index 3efd500a78..f1161b202e 100644 --- a/packages/frontend-app-api/src/tree/resolveAppTree.test.ts +++ b/packages/frontend-app-api/src/tree/resolveAppTree.test.ts @@ -38,7 +38,7 @@ const baseSpec = { extension, attachTo: { id: 'nonexistent', input: 'nonexistent' }, disabled: false, - plugin: createFrontendPlugin({ pluginId: 'root' }), + plugin: createFrontendPlugin({ pluginId: 'app' }), }; describe('buildAppTree', () => { diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index 9dfc5cd7d7..9b9f337f4a 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -268,7 +268,7 @@ export interface AppNodeSpec { // (undocumented) readonly id: string; // (undocumented) - readonly plugin?: FrontendPlugin; + readonly plugin: FrontendPlugin; } // @public