From 7648aaf48d629955acb6a65254c3b588fa119ea1 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 21 Aug 2023 14:26:30 +0200 Subject: [PATCH] app-next: add TODOs + some reorder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Co-authored-by: Johan Haals Co-authored-by: Vincenzo Scamporlino Co-authored-by: Philipp Hugenroth Co-authored-by: Camila Belo Signed-off-by: Patrik Oldsberg --- packages/app-next/src/App.tsx | 88 +++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 35 deletions(-) diff --git a/packages/app-next/src/App.tsx b/packages/app-next/src/App.tsx index 41e0aae48b..c21d13c088 100644 --- a/packages/app-next/src/App.tsx +++ b/packages/app-next/src/App.tsx @@ -24,6 +24,24 @@ import { BrowserRouter, useRoutes } from 'react-router-dom'; import mapValues from 'lodash/mapValues'; import { Config, ConfigReader } from '@backstage/config'; +/* + +# Notes + +TODO: + - proper createApp + - connect extensions and plugins, provide method? + - higher level API for creating standard extensions + higher order framework API for creating those? + - extension config schema + validation + - figure out how to resolve configured extension ref to runtime value, e.g. '@backstage/plugin-graphiql#GraphiqlPage' + - make sure all shorthands work + tests + - figure out package structure / how to ship, frontend-plugin-api/frontend-app-api + - figure out routing, useRouteRef in the new system + - Legacy plugins / interop + - dynamic updates, runtime API + +*/ + /* core */ // const discoverPackages = async () => { @@ -31,31 +49,20 @@ import { Config, ConfigReader } from '@backstage/config'; // return ['@backstage/plugin-graphiql']; // }; -interface ExtensionInstanceConfig { +interface ExtensionDataRef { id: string; - at: string; - extension: Extension; - config: unknown; + T: T; + $$type: 'extension-data'; } -interface BackstagePluginOptions { - id: string; - defaultExtensionInstances?: ExtensionInstanceConfig[]; +function createExtensionDataRef(id: string) { + return { id, $$type: 'extension-data' } as ExtensionDataRef; } -interface BackstagePlugin { - $$type: 'backstage-plugin'; - id: string; - defaultExtensionInstances: ExtensionInstanceConfig[]; -} - -function createPlugin(options: BackstagePluginOptions): BackstagePlugin { - return { - ...options, - $$type: 'backstage-plugin', - defaultExtensionInstances: options.defaultExtensionInstances ?? [], - }; -} +const coreExtensionData = { + reactComponent: createExtensionDataRef('core.reactComponent'), + routePath: createExtensionDataRef('core.routing.path'), +}; type AnyExtensionDataMap = Record>; @@ -102,21 +109,6 @@ function createExtension< return { ...options, $$type: 'extension', inputs: options.inputs ?? {} }; } -interface ExtensionDataRef { - id: string; - T: T; - $$type: 'extension-data'; -} - -function createExtensionDataRef(id: string) { - return { id, $$type: 'extension-data' } as ExtensionDataRef; -} - -const coreExtensionData = { - reactComponent: createExtensionDataRef('core.reactComponent'), - routePath: createExtensionDataRef('core.routing.path'), -}; - type ExtensionDataId = string; interface ExtensionInstance { @@ -151,6 +143,32 @@ function createExtensionInstance(options: { return { id: options.id, data: extensionData, $$type: 'extension-instance' }; } +interface ExtensionInstanceConfig { + id: string; + at: string; + extension: Extension; + config: unknown; +} + +interface BackstagePluginOptions { + id: string; + defaultExtensionInstances?: ExtensionInstanceConfig[]; +} + +interface BackstagePlugin { + $$type: 'backstage-plugin'; + id: string; + defaultExtensionInstances: ExtensionInstanceConfig[]; +} + +function createPlugin(options: BackstagePluginOptions): BackstagePlugin { + return { + ...options, + $$type: 'backstage-plugin', + defaultExtensionInstances: options.defaultExtensionInstances ?? [], + }; +} + /* core extensions */ const RouteExtension = createExtension({