From 2bb9517d4d22203a3766bb4d02e26e4f3f6ca6a7 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 27 Aug 2024 11:23:51 +0200 Subject: [PATCH] chore: install the `@backstage/plugin-app` by default now Signed-off-by: blam --- .changeset/fresh-apes-dress.md | 8 +++++++ packages/frontend-app-api/package.json | 2 +- .../src/wiring/createApp.test.tsx | 23 +++++++++++++++++++ .../frontend-app-api/src/wiring/createApp.tsx | 5 +++- 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 .changeset/fresh-apes-dress.md diff --git a/.changeset/fresh-apes-dress.md b/.changeset/fresh-apes-dress.md new file mode 100644 index 0000000000..6e20e53bcd --- /dev/null +++ b/.changeset/fresh-apes-dress.md @@ -0,0 +1,8 @@ +--- +'@backstage/frontend-plugin-api': patch +'@backstage/frontend-test-utils': patch +'@backstage/frontend-app-api': patch +'@backstage/plugin-app': minor +--- + +Introduce the `@backstage/plugin-app` package to hold all of the built-in extensions for easy consumption and overriding. diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 43cd9e53dd..b901896b6a 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -38,6 +38,7 @@ "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", + "@backstage/plugin-app": "workspace:^", "@backstage/theme": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", @@ -48,7 +49,6 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@backstage/plugin-app": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^15.0.0" diff --git a/packages/frontend-app-api/src/wiring/createApp.test.tsx b/packages/frontend-app-api/src/wiring/createApp.test.tsx index 2e54aadf58..91bbde2991 100644 --- a/packages/frontend-app-api/src/wiring/createApp.test.tsx +++ b/packages/frontend-app-api/src/wiring/createApp.test.tsx @@ -359,4 +359,27 @@ describe('createApp', () => { expect(screen.queryByText('Custom loading message')).toBeNull(); }); + + it('should allow overriding the app plugin', async () => { + const app = createApp({ + configLoader: () => new Promise(() => {}), + features: [ + appPlugin.withOverrides({ + extensions: [ + appPlugin.getExtension('app/root').override({ + factory: () => [ + coreExtensionData.reactElement( +
Custom app root element
, + ), + ], + }), + ], + }), + ], + }); + + await renderWithEffects(app.createRoot()); + + expect(screen.queryByText('Custom app root element')).toBeNull(); + }); }); diff --git a/packages/frontend-app-api/src/wiring/createApp.tsx b/packages/frontend-app-api/src/wiring/createApp.tsx index 63dae872b9..9148ffe527 100644 --- a/packages/frontend-app-api/src/wiring/createApp.tsx +++ b/packages/frontend-app-api/src/wiring/createApp.tsx @@ -76,6 +76,7 @@ import { ApiRegistry } from '../../../core-app-api/src/apis/system/ApiRegistry'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { AppIdentityProxy } from '../../../core-app-api/src/apis/implementations/IdentityApi/AppIdentityProxy'; import { BackstageRouteObject } from '../routing/types'; +import appPlugin from '@backstage/plugin-app'; function deduplicateFeatures( allFeatures: FrontendFeature[], @@ -269,10 +270,12 @@ export function createSpecializedApp(options?: { bindRoutes?(context: { bind: CreateAppRouteBinder }): void; }): { createRoot(): JSX.Element } { const { - features: duplicatedFeatures = [], + features: featuresWithoutApp = [], config = new ConfigReader({}, 'empty-config'), } = options ?? {}; + const duplicatedFeatures = [appPlugin, ...featuresWithoutApp]; + const features = deduplicateFeatures(duplicatedFeatures); const tree = resolveAppTree(