From b07bff44eb58c946d2918ad7e975486965373830 Mon Sep 17 00:00:00 2001 From: David Festal Date: Wed, 22 Jan 2025 19:58:09 +0100 Subject: [PATCH] Update default schema locator for frontend plugins... ... to match the frontend location of plugins built as module federation remotes. Signed-off-by: David Festal --- .../test-dynamic/dist/.config-schema.json | 27 +++++++++++++++++++ .../test-dynamic/dist/configSchema.json | 18 ------------- .../src/schemas/schemas.ts | 27 ++++++++++++++++--- 3 files changed, 50 insertions(+), 22 deletions(-) create mode 100644 packages/backend-dynamic-feature-service/src/features/__fixtures__/dynamic-plugins-root/test-dynamic/dist/.config-schema.json delete mode 100644 packages/backend-dynamic-feature-service/src/features/__fixtures__/dynamic-plugins-root/test-dynamic/dist/configSchema.json diff --git a/packages/backend-dynamic-feature-service/src/features/__fixtures__/dynamic-plugins-root/test-dynamic/dist/.config-schema.json b/packages/backend-dynamic-feature-service/src/features/__fixtures__/dynamic-plugins-root/test-dynamic/dist/.config-schema.json new file mode 100644 index 0000000000..d93ef25f0e --- /dev/null +++ b/packages/backend-dynamic-feature-service/src/features/__fixtures__/dynamic-plugins-root/test-dynamic/dist/.config-schema.json @@ -0,0 +1,27 @@ +{ + "schemas": [ + { + "packageName": "plugin-test-dynamic", + "path": "./test-dynamic", + "value": { + "type": "object", + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "test-frontend": { + "type": "object", + "required": [ + "frontendValue" + ], + "properties": { + "frontendValue": { + "type": "string", + "visibility": "frontend" + } + } + } + } + } + } + ], + "backstageConfigSchemaVersion": 1 +} diff --git a/packages/backend-dynamic-feature-service/src/features/__fixtures__/dynamic-plugins-root/test-dynamic/dist/configSchema.json b/packages/backend-dynamic-feature-service/src/features/__fixtures__/dynamic-plugins-root/test-dynamic/dist/configSchema.json deleted file mode 100644 index a1f22b0374..0000000000 --- a/packages/backend-dynamic-feature-service/src/features/__fixtures__/dynamic-plugins-root/test-dynamic/dist/configSchema.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "object", - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "test-frontend": { - "type": "object", - "required": [ - "frontendValue" - ], - "properties": { - "frontendValue": { - "type": "string", - "visibility": "frontend" - } - } - } - } -} diff --git a/packages/backend-dynamic-feature-service/src/schemas/schemas.ts b/packages/backend-dynamic-feature-service/src/schemas/schemas.ts index 0e873e986c..ab4f39a13a 100644 --- a/packages/backend-dynamic-feature-service/src/schemas/schemas.ts +++ b/packages/backend-dynamic-feature-service/src/schemas/schemas.ts @@ -29,8 +29,13 @@ import { isEmpty } from 'lodash'; import { LoggerService } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { PluginScanner } from '../scanner/plugin-scanner'; -import { ConfigSchema, loadConfigSchema } from '@backstage/config-loader'; +import { + ConfigSchema, + loadConfigSchema, + mergeConfigSchemas, +} from '@backstage/config-loader'; import { dynamicPluginsFeatureLoader } from '../features'; +import { PackageRoles } from '@backstage/cli-node'; /** * @@ -152,8 +157,16 @@ export const dynamicPluginsSchemasServiceFactory = Object.assign( async function gatherDynamicPluginsSchemas( packages: ScannedPluginPackage[], logger: LoggerService, - schemaLocator: (pluginPackage: ScannedPluginPackage) => string = () => - path.join('dist', 'configSchema.json'), + schemaLocator: ( + pluginPackage: ScannedPluginPackage, + ) => string = pluginPackage => + path.join( + 'dist', + PackageRoles.getRoleInfo(pluginPackage.manifest.backstage.role) + .platform === 'node' + ? 'configSchema.json' + : '.config-schema.json', + ), ): Promise<{ [context: string]: JsonObject }> { const allSchemas: { [context: string]: JsonObject } = {}; @@ -169,7 +182,7 @@ async function gatherDynamicPluginsSchemas( continue; } - const serialized = await fs.readJson(schemaLocation); + let serialized = await fs.readJson(schemaLocation); if (!serialized) { continue; } @@ -178,6 +191,12 @@ async function gatherDynamicPluginsSchemas( continue; } + if (serialized?.backstageConfigSchemaVersion === 1) { + serialized = mergeConfigSchemas( + (serialized?.schemas as JsonObject[]).map(_ => _.value as any), + ); + } + if (!serialized?.$schema || serialized?.type !== 'object') { logger.error( `Serialized configuration schema is invalid for plugin ${pluginPackage.manifest.name}`,