From 2949a8154fbe189673cafd419ca548bf75b6effa Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Mon, 11 Sep 2023 16:26:58 +0200 Subject: [PATCH 1/5] frontend-app-api: Internal restructure Co-authored-by: Patrik Oldsberg Co-authored-by: Philipp Hugenroth Signed-off-by: Johan Haals --- packages/frontend-app-api/src/index.ts | 2 +- .../src/{ => wiring}/createApp.tsx | 26 +++++++++---------- .../{ => wiring}/createExtensionInstance.ts | 0 packages/frontend-app-api/src/wiring/index.ts | 17 ++++++++++++ 4 files changed, 31 insertions(+), 14 deletions(-) rename packages/frontend-app-api/src/{ => wiring}/createApp.tsx (91%) rename packages/frontend-app-api/src/{ => wiring}/createExtensionInstance.ts (100%) create mode 100644 packages/frontend-app-api/src/wiring/index.ts diff --git a/packages/frontend-app-api/src/index.ts b/packages/frontend-app-api/src/index.ts index 9674eb345d..f2dfa0f029 100644 --- a/packages/frontend-app-api/src/index.ts +++ b/packages/frontend-app-api/src/index.ts @@ -20,4 +20,4 @@ * @packageDocumentation */ -export { createApp } from './createApp'; +export * from './wiring'; diff --git a/packages/frontend-app-api/src/createApp.tsx b/packages/frontend-app-api/src/wiring/createApp.tsx similarity index 91% rename from packages/frontend-app-api/src/createApp.tsx rename to packages/frontend-app-api/src/wiring/createApp.tsx index 4882191206..decf0a657e 100644 --- a/packages/frontend-app-api/src/createApp.tsx +++ b/packages/frontend-app-api/src/wiring/createApp.tsx @@ -20,10 +20,10 @@ import { BackstagePlugin, coreExtensionData, } from '@backstage/frontend-plugin-api'; -import { Core } from './extensions/Core'; -import { CoreRoutes } from './extensions/CoreRoutes'; -import { CoreLayout } from './extensions/CoreLayout'; -import { CoreNav } from './extensions/CoreNav'; +import { Core } from '../extensions/Core'; +import { CoreRoutes } from '../extensions/CoreRoutes'; +import { CoreLayout } from '../extensions/CoreLayout'; +import { CoreNav } from '../extensions/CoreNav'; import { createExtensionInstance, ExtensionInstance, @@ -32,8 +32,8 @@ import { ExtensionInstanceParameters, mergeExtensionParameters, readAppExtensionParameters, -} from './wiring/parameters'; -import { RoutingProvider } from './routing/RoutingContext'; +} from './parameters'; +import { RoutingProvider } from '../routing/RoutingContext'; import { AnyApiFactory, ApiHolder, @@ -47,7 +47,7 @@ import { BackstagePlugin as LegacyBackstagePlugin, featureFlagsApiRef, } from '@backstage/core-plugin-api'; -import { getAvailablePlugins } from './wiring/discovery'; +import { getAvailablePlugins } from './discovery'; import { ApiFactoryRegistry, ApiProvider, @@ -57,22 +57,22 @@ import { // TODO: Get rid of all of these // eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { AppThemeProvider } from '../../core-app-api/src/app/AppThemeProvider'; +import { AppThemeProvider } from '../../../core-app-api/src/app/AppThemeProvider'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { AppContextProvider } from '../../core-app-api/src/app/AppContext'; +import { AppContextProvider } from '../../../core-app-api/src/app/AppContext'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { LocalStorageFeatureFlags } from '../../core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags'; +import { LocalStorageFeatureFlags } from '../../../core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { defaultConfigLoaderSync } from '../../core-app-api/src/app/defaultConfigLoader'; +import { defaultConfigLoaderSync } from '../../../core-app-api/src/app/defaultConfigLoader'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports -import { overrideBaseUrlConfigs } from '../../core-app-api/src/app/overrideBaseUrlConfigs'; +import { overrideBaseUrlConfigs } from '../../../core-app-api/src/app/overrideBaseUrlConfigs'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { apis as defaultApis, components as defaultComponents, icons as defaultIcons, themes as defaultThemes, -} from '../../app-defaults/src/defaults'; +} from '../../../app-defaults/src/defaults'; import { BrowserRouter } from 'react-router-dom'; /** @public */ diff --git a/packages/frontend-app-api/src/createExtensionInstance.ts b/packages/frontend-app-api/src/wiring/createExtensionInstance.ts similarity index 100% rename from packages/frontend-app-api/src/createExtensionInstance.ts rename to packages/frontend-app-api/src/wiring/createExtensionInstance.ts diff --git a/packages/frontend-app-api/src/wiring/index.ts b/packages/frontend-app-api/src/wiring/index.ts new file mode 100644 index 0000000000..a43cd73df2 --- /dev/null +++ b/packages/frontend-app-api/src/wiring/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { createApp } from './createApp'; From 34ffe5654c5ed7d790e1821a03341306db0ef656 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Mon, 11 Sep 2023 16:42:55 +0200 Subject: [PATCH 2/5] frontend-app-api: Add getData method to ExtensionInstance Co-authored-by: Patrik Oldsberg Co-authored-by: Philipp Hugenroth Signed-off-by: Johan Haals --- .../frontend-app-api/src/wiring/createApp.tsx | 24 +++++-------------- .../src/wiring/createExtensionInstance.ts | 17 +++++++++---- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/packages/frontend-app-api/src/wiring/createApp.tsx b/packages/frontend-app-api/src/wiring/createApp.tsx index decf0a657e..9a4f5bc303 100644 --- a/packages/frontend-app-api/src/wiring/createApp.tsx +++ b/packages/frontend-app-api/src/wiring/createApp.tsx @@ -174,13 +174,8 @@ export function createApp(options: { return { createRoot() { const rootComponents = rootInstances - .map( - e => - e.data.get( - coreExtensionData.reactComponent.id, - ) as typeof coreExtensionData.reactComponent.T, - ) - .filter(Boolean); + .map(e => e.getData(coreExtensionData.reactComponent)) + .filter((x): x is React.ComponentType => !!x); return ( @@ -254,13 +249,8 @@ function createApiHolder( const apiFactories = coreExtension.attachments .get('apis') - ?.map( - e => - e.data.get( - coreExtensionData.apiFactory.id, - ) as typeof coreExtensionData.apiFactory.T, - ) - .filter(Boolean) ?? []; + ?.map(e => e.getData(coreExtensionData.apiFactory)) + .filter((x): x is AnyApiFactory => !!x) ?? []; for (const factory of apiFactories) { factoryRegistry.register('default', factory); @@ -307,10 +297,8 @@ export function extractRouteInfoFromInstanceTree( const results = new Map(); function visit(current: ExtensionInstance, basePath: string) { - const routePath = current.data.get(coreExtensionData.routePath.id) ?? ''; - const routeRef = current.data.get( - coreExtensionData.routeRef.id, - ) as RouteRef; + const routePath = current.getData(coreExtensionData.routePath) ?? ''; + const routeRef = current.getData(coreExtensionData.routeRef); // TODO: join paths in a more robust way const fullPath = basePath + routePath; diff --git a/packages/frontend-app-api/src/wiring/createExtensionInstance.ts b/packages/frontend-app-api/src/wiring/createExtensionInstance.ts index d767f21d58..2cae60c1e6 100644 --- a/packages/frontend-app-api/src/wiring/createExtensionInstance.ts +++ b/packages/frontend-app-api/src/wiring/createExtensionInstance.ts @@ -14,16 +14,20 @@ * limitations under the License. */ -import { BackstagePlugin, Extension } from '@backstage/frontend-plugin-api'; +import { + BackstagePlugin, + Extension, + ExtensionDataRef, +} from '@backstage/frontend-plugin-api'; import mapValues from 'lodash/mapValues'; /** @internal */ export interface ExtensionInstance { readonly id: string; /** - * Maps extension data ref IDs to extensions produced. + * Get concrete value for the given extension data reference. Returns undefined if no value is available. */ - readonly data: Map; + getData(ref: ExtensionDataRef): T | undefined; /** * Maps input names to the actual instances given to them. */ @@ -70,7 +74,7 @@ export function createExtensionInstance(options: { ({ extensionData: pointData }, inputName) => { // TODO: validation return (attachments.get(inputName) ?? []).map(attachment => - mapValues(pointData, ref => attachment.data.get(ref.id)), + mapValues(pointData, ref => attachment.getData(ref)), ); }, ), @@ -83,7 +87,10 @@ export function createExtensionInstance(options: { return { id: options.extension.id, - data: extensionData, + getData(ref: ExtensionDataRef): T | undefined { + return extensionData.get(ref.id) as T | undefined; + }, + attachments, $$type: 'extension-instance', }; From 1cfe070efdd1bea7824442f6350e0b4cdd281d81 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Mon, 11 Sep 2023 16:48:01 +0200 Subject: [PATCH 3/5] frontend-app-api: Rename `$$type` to conform with backend types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Patrik Oldsberg Co-authored-by: Philipp Hugenroth Co-authored-by: Fredrik Adelöw Signed-off-by: Johan Haals --- .../frontend-app-api/src/wiring/createExtensionInstance.ts | 5 +++-- packages/frontend-plugin-api/api-report.md | 6 +++--- packages/frontend-plugin-api/src/wiring/createExtension.ts | 2 +- .../src/wiring/createExtensionDataRef.ts | 4 ++-- packages/frontend-plugin-api/src/wiring/createPlugin.ts | 4 ++-- packages/frontend-plugin-api/src/wiring/types.ts | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/frontend-app-api/src/wiring/createExtensionInstance.ts b/packages/frontend-app-api/src/wiring/createExtensionInstance.ts index 2cae60c1e6..52afe95121 100644 --- a/packages/frontend-app-api/src/wiring/createExtensionInstance.ts +++ b/packages/frontend-app-api/src/wiring/createExtensionInstance.ts @@ -23,6 +23,8 @@ import mapValues from 'lodash/mapValues'; /** @internal */ export interface ExtensionInstance { + readonly $$type: '@backstage/ExtensionInstance'; + readonly id: string; /** * Get concrete value for the given extension data reference. Returns undefined if no value is available. @@ -32,7 +34,6 @@ export interface ExtensionInstance { * Maps input names to the actual instances given to them. */ readonly attachments: Map; - readonly $$type: 'extension-instance'; } /** @internal */ @@ -86,12 +87,12 @@ export function createExtensionInstance(options: { } return { + $$type: '@backstage/ExtensionInstance', id: options.extension.id, getData(ref: ExtensionDataRef): T | undefined { return extensionData.get(ref.id) as T | undefined; }, attachments, - $$type: 'extension-instance', }; } diff --git a/packages/frontend-plugin-api/api-report.md b/packages/frontend-plugin-api/api-report.md index 2959dcb92e..3a0a3bf357 100644 --- a/packages/frontend-plugin-api/api-report.md +++ b/packages/frontend-plugin-api/api-report.md @@ -24,7 +24,7 @@ export type AnyExtensionDataMap = { // @public (undocumented) export interface BackstagePlugin { // (undocumented) - $$type: 'backstage-plugin'; + $$type: '@backstage/BackstagePlugin'; // (undocumented) extensions: Extension[]; // (undocumented) @@ -176,7 +176,7 @@ export function createSchemaFromZod( // @public (undocumented) export interface Extension { // (undocumented) - $$type: 'extension'; + $$type: '@backstage/Extension'; // (undocumented) at: string; // (undocumented) @@ -268,7 +268,7 @@ export type ExtensionDataRef< id: string; T: TData; config: TConfig; - $$type: 'extension-data'; + $$type: '@backstage/ExtensionDataRef'; }; // @public (undocumented) diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index bcea03595b..1a7e02804e 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -87,7 +87,7 @@ export function createExtension< return { ...options, disabled: options.disabled ?? false, - $$type: 'extension', + $$type: '@backstage/Extension', inputs: options.inputs ?? {}, factory({ bind, config, inputs }) { // TODO: Simplify this, but TS wouldn't infer the input type for some reason diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts b/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts index 6d6309bee4..d0d96e85f9 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionDataRef.ts @@ -22,7 +22,7 @@ export type ExtensionDataRef< id: string; T: TData; config: TConfig; - $$type: 'extension-data'; + $$type: '@backstage/ExtensionDataRef'; }; /** @public */ @@ -40,7 +40,7 @@ export function createExtensionDataRef( ): ConfigurableExtensionDataRef { return { id, - $$type: 'extension-data', + $$type: '@backstage/ExtensionDataRef', config: {}, optional() { return { ...this, config: { ...this.config, optional: true } }; diff --git a/packages/frontend-plugin-api/src/wiring/createPlugin.ts b/packages/frontend-plugin-api/src/wiring/createPlugin.ts index 7f7e44ff03..bb372f63c1 100644 --- a/packages/frontend-plugin-api/src/wiring/createPlugin.ts +++ b/packages/frontend-plugin-api/src/wiring/createPlugin.ts @@ -24,7 +24,7 @@ export interface PluginOptions { /** @public */ export interface BackstagePlugin { - $$type: 'backstage-plugin'; + $$type: '@backstage/BackstagePlugin'; id: string; extensions: Extension[]; } @@ -33,7 +33,7 @@ export interface BackstagePlugin { export function createPlugin(options: PluginOptions): BackstagePlugin { return { ...options, - $$type: 'backstage-plugin', + $$type: '@backstage/BackstagePlugin', extensions: options.extensions ?? [], }; } diff --git a/packages/frontend-plugin-api/src/wiring/types.ts b/packages/frontend-plugin-api/src/wiring/types.ts index dbe4633ff5..46b76e30f4 100644 --- a/packages/frontend-plugin-api/src/wiring/types.ts +++ b/packages/frontend-plugin-api/src/wiring/types.ts @@ -26,7 +26,7 @@ export type AnyExtensionDataMap = { /** @public */ export interface Extension { - $$type: 'extension'; + $$type: '@backstage/Extension'; id: string; at: string; disabled: boolean; From 9404609953c69eb2f442d9088bffc73de8c3fe60 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Tue, 12 Sep 2023 10:11:29 +0200 Subject: [PATCH 4/5] frontend-app-api: Update package discovery type name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Patrik Oldsberg Co-authored-by: Philipp Hugenroth Co-authored-by: Fredrik Adelöw Signed-off-by: Johan Haals --- packages/frontend-app-api/src/wiring/discovery.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend-app-api/src/wiring/discovery.ts b/packages/frontend-app-api/src/wiring/discovery.ts index d872ae4441..6d0b9282ea 100644 --- a/packages/frontend-app-api/src/wiring/discovery.ts +++ b/packages/frontend-app-api/src/wiring/discovery.ts @@ -35,7 +35,7 @@ export function getAvailablePlugins(): BackstagePlugin[] { function isBackstagePlugin(obj: unknown): obj is BackstagePlugin { if (obj !== null && typeof obj === 'object' && '$$type' in obj) { - return obj.$$type === 'backstage-plugin'; + return obj.$$type === '@backstage/BackstagePlugin'; } return false; } From 5019f29a178a8c3edc154773d5a1db833a4867f5 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Tue, 12 Sep 2023 10:34:16 +0200 Subject: [PATCH 5/5] frontend-app-api: Update tests Signed-off-by: Johan Haals --- .../src/extensions/createApiExtension.test.ts | 10 +++++----- .../src/extensions/createPageExtension.test.tsx | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/frontend-plugin-api/src/extensions/createApiExtension.test.ts b/packages/frontend-plugin-api/src/extensions/createApiExtension.test.ts index fadb814d4f..7426edb766 100644 --- a/packages/frontend-plugin-api/src/extensions/createApiExtension.test.ts +++ b/packages/frontend-plugin-api/src/extensions/createApiExtension.test.ts @@ -31,7 +31,7 @@ describe('createApiExtension', () => { }); expect(extension).toEqual({ - $$type: 'extension', + $$type: '@backstage/Extension', id: 'apis.test', at: 'core/apis', disabled: false, @@ -39,7 +39,7 @@ describe('createApiExtension', () => { inputs: {}, output: { api: expect.objectContaining({ - $$type: 'extension-data', + $$type: '@backstage/ExtensionDataRef', id: 'core.api.factory', config: {}, }), @@ -63,9 +63,9 @@ describe('createApiExtension', () => { }); }, }); - + // boo expect(extension).toEqual({ - $$type: 'extension', + $$type: '@backstage/Extension', id: 'apis.test', at: 'core/apis', disabled: false, @@ -73,7 +73,7 @@ describe('createApiExtension', () => { inputs: {}, output: { api: expect.objectContaining({ - $$type: 'extension-data', + $$type: '@backstage/ExtensionDataRef', id: 'core.api.factory', config: {}, }), diff --git a/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx b/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx index 71f6c87374..1014a1283d 100644 --- a/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx +++ b/packages/frontend-plugin-api/src/extensions/createPageExtension.test.tsx @@ -33,7 +33,7 @@ describe('createPageExtension', () => { component: async () =>
, }), ).toEqual({ - $$type: 'extension', + $$type: '@backstage/Extension', id: 'test', at: 'core.routes/routes', configSchema: expect.anything(), @@ -61,7 +61,7 @@ describe('createPageExtension', () => { component: async () =>
, }), ).toEqual({ - $$type: 'extension', + $$type: '@backstage/Extension', id: 'test', at: 'other/place', configSchema: expect.anything(), @@ -86,7 +86,7 @@ describe('createPageExtension', () => { component: async () =>
, }), ).toEqual({ - $$type: 'extension', + $$type: '@backstage/Extension', id: 'test', at: 'core.routes/routes', configSchema: expect.anything(),