From 120d60b39e71f37eff63256d959854c71d96ebc3 Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Wed, 30 Nov 2022 12:19:32 -0500 Subject: [PATCH] Update how we rewrite the relative config. Signed-off-by: Aramis Sennyey --- packages/app/src/App.test.tsx | 2 +- .../core-app-api/src/app/AppManager.test.tsx | 2 +- packages/core-app-api/src/app/AppManager.tsx | 66 +++++++++++-------- .../src/App.test.tsx | 3 +- 4 files changed, 44 insertions(+), 29 deletions(-) diff --git a/packages/app/src/App.test.tsx b/packages/app/src/App.test.tsx index 0c021a8f23..8c7cefeb2c 100644 --- a/packages/app/src/App.test.tsx +++ b/packages/app/src/App.test.tsx @@ -28,8 +28,8 @@ describe('App', () => { app: { title: 'Test', support: { url: 'http://localhost:7007/support' }, - baseUrl: 'http://localhost:3000', }, + backend: { baseUrl: 'http://localhost:7007' }, lighthouse: { baseUrl: 'http://localhost:3003', }, diff --git a/packages/core-app-api/src/app/AppManager.test.tsx b/packages/core-app-api/src/app/AppManager.test.tsx index dd77c9b4bf..02a9a6fbe0 100644 --- a/packages/core-app-api/src/app/AppManager.test.tsx +++ b/packages/core-app-api/src/app/AppManager.test.tsx @@ -614,7 +614,7 @@ describe('Integration Test', () => { ], [ [ - `http://test-front.com/backstage/instance`, + `${document.location.origin}/backstage/instance`, `http://test.com/backstage/instance`, ], { diff --git a/packages/core-app-api/src/app/AppManager.tsx b/packages/core-app-api/src/app/AppManager.tsx index fff061217c..1387130943 100644 --- a/packages/core-app-api/src/app/AppManager.tsx +++ b/packages/core-app-api/src/app/AppManager.tsx @@ -82,6 +82,7 @@ import { ApiRegistry } from '../apis/system/ApiRegistry'; import { resolveRouteBindings } from './resolveRouteBindings'; import { BackstageRouteObject } from '../routing/types'; import { isReactRouterBeta } from './isReactRouterBeta'; +import { JsonObject } from '@backstage/types'; type CompatiblePlugin = | BackstagePlugin @@ -155,12 +156,11 @@ function useConfigLoader( } let configReader; - /** * config.value can be undefined or empty. If it's either, don't bother overriding anything. */ if (config.value?.length) { - configReader = ConfigReader.fromConfigs(config.value); + const urlConfigReader = ConfigReader.fromConfigs(config.value); const resolveRelativeUrl = (relativeUrl: string) => new URL(relativeUrl, document.location.origin).href; @@ -172,32 +172,46 @@ function useConfigLoader( const getOrigin = (url: string) => new URL(url).origin; - const appBaseUrl = configReader.getString('app.baseUrl'); - const backendBaseUrl = configReader.getString('backend.baseUrl'); - const appOrigin = getOrigin(appBaseUrl); - const backendOrigin = getOrigin(backendBaseUrl); + const appBaseUrl = urlConfigReader.getOptionalString('app.baseUrl'); + const backendBaseUrl = urlConfigReader.getOptionalString('backend.baseUrl'); + let configs = config.value; + const relativeResolverConfig: { data: JsonObject; context: string } = { + data: {}, + context: 'relative-resolver', + }; + if (appBaseUrl && backendBaseUrl) { + const appOrigin = getOrigin(appBaseUrl); + const backendOrigin = getOrigin(backendBaseUrl); - /** - * We only want to override the URLs with the document origin when the URLs match - * and are defined. We use getOptionalString here to not throw when the app.baseUrl - * and backend.baseUrl are not defined. If they are defined but not well formatted URLs - * the above getRelativeUrl() method will throw. - */ - if (appOrigin === backendOrigin) { - config.value.push({ - data: { - app: { - baseUrl: resolveRelativeUrl(getRelativeUrl(appBaseUrl)), - }, - backend: { - baseUrl: resolveRelativeUrl(getRelativeUrl(backendBaseUrl)), - }, - }, - context: 'relative-resolver', - }); + /** + * We only want to override the URLs with the document origin when the URLs match + * and are defined. We use getOptionalString here to not throw when the app.baseUrl + * and backend.baseUrl are not defined. If they are defined but not well formatted URLs + * the above getRelativeUrl() method will throw. + */ + if (appOrigin === backendOrigin) { + relativeResolverConfig.data.backend = { + baseUrl: resolveRelativeUrl(getRelativeUrl(backendBaseUrl)), + }; + } } - - configReader = ConfigReader.fromConfigs(config.value); + if (appBaseUrl) { + /** + * Rewriting app.baseUrl to the current document should be a no-op. The + * document hosting the app should always be the same url as the app + * references. + */ + relativeResolverConfig.data.app = { + baseUrl: resolveRelativeUrl(getRelativeUrl(appBaseUrl)), + }; + } + /** + * Only add the relative config if there is actually data to add. + */ + if (Object.keys(relativeResolverConfig.data).length) { + configs = configs.concat([relativeResolverConfig]); + } + configReader = ConfigReader.fromConfigs(configs); } else { configReader = ConfigReader.fromConfigs([]); } diff --git a/packages/techdocs-cli-embedded-app/src/App.test.tsx b/packages/techdocs-cli-embedded-app/src/App.test.tsx index 8415388ca9..75658d271e 100644 --- a/packages/techdocs-cli-embedded-app/src/App.test.tsx +++ b/packages/techdocs-cli-embedded-app/src/App.test.tsx @@ -22,7 +22,8 @@ jest.mock('./config', () => ({ configLoader: async () => [ { data: { - app: { title: 'Test', baseUrl: 'http://localhost:3000' }, + app: { title: 'Test' }, + backend: { baseUrl: 'http://localhost:7007' }, techdocs: { storageUrl: 'http://localhost:7007/api/techdocs/static/docs', },