From 8723c5a4da06ca7c11f84f3bbc9ae91527fd6499 Mon Sep 17 00:00:00 2001 From: David Festal Date: Thu, 25 Jan 2024 16:21:45 +0100 Subject: [PATCH] Fix wrong `alpha` support in dynamic plugins support The `alpha` sub-package should not be required for the dynamic plugins to be loaded under the new backend system. Signed-off-by: David Festal --- .changeset/calm-cups-rule.md | 5 +++ .../src/scanner/plugin-scanner.test.ts | 31 ++++++++++++++++++ .../src/scanner/plugin-scanner.ts | 32 ++++++++++--------- 3 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 .changeset/calm-cups-rule.md diff --git a/.changeset/calm-cups-rule.md b/.changeset/calm-cups-rule.md new file mode 100644 index 0000000000..48cb8a2012 --- /dev/null +++ b/.changeset/calm-cups-rule.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-dynamic-feature-service': patch +--- + +Fix wrong `alpha` support in dynamic plugins support: the `alpha` sub-package should not be required for the dynamic plugins to be loaded under the new backend system. diff --git a/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.test.ts b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.test.ts index e52eee87c4..1abd7c234c 100644 --- a/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.test.ts +++ b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.test.ts @@ -484,6 +484,37 @@ Please add '${mockDir.resolve( ], }, }, + { + name: "alpha manifest preferred but skipped because the `alpha` sub-directory doesn't exist", + preferAlpha: true, + fileSystem: { + backstageRoot: { + 'dist-dynamic': { + 'test-backend-plugin': { + 'package.json': JSON.stringify({ + name: 'test-backend-plugin-dynamic', + version: '0.0.0', + main: 'dist/index.cjs.js', + backstage: { role: 'backend-plugin' }, + }), + }, + }, + }, + }, + expectedPluginPackages: [ + { + location: url.pathToFileURL( + mockDir.resolve('backstageRoot/dist-dynamic/test-backend-plugin'), + ), + manifest: { + name: 'test-backend-plugin-dynamic', + version: '0.0.0', + main: 'dist/index.cjs.js', + backstage: { role: 'backend-plugin' }, + }, + }, + ], + }, { name: 'invalid alpha package.json', preferAlpha: true, diff --git a/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts index 25e0d614dd..af1144f019 100644 --- a/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts +++ b/packages/backend-dynamic-feature-service/src/scanner/plugin-scanner.ts @@ -16,7 +16,7 @@ import { Config } from '@backstage/config'; import { ScannedPluginPackage, ScannedPluginManifest } from './types'; import * as fs from 'fs/promises'; -import { Stats, lstatSync } from 'fs'; +import { Stats, lstatSync, existsSync } from 'fs'; import * as chokidar from 'chokidar'; import * as path from 'path'; import * as url from 'url'; @@ -178,22 +178,24 @@ export class PluginScanner { if (platform === 'node') { if (this.preferAlpha) { const pluginHomeAlpha = path.resolve(pluginHome, 'alpha'); - if ((await fs.lstat(pluginHomeAlpha)).isDirectory()) { - const backstage = scannedPlugin.manifest.backstage; - try { - scannedPlugin = await this.scanDir(pluginHomeAlpha); - } catch (e) { - this.logger.error( - `failed to load dynamic plugin manifest from '${pluginHomeAlpha}'`, - e, + if (existsSync(pluginHomeAlpha)) { + if ((await fs.lstat(pluginHomeAlpha)).isDirectory()) { + const backstage = scannedPlugin.manifest.backstage; + try { + scannedPlugin = await this.scanDir(pluginHomeAlpha); + } catch (e) { + this.logger.error( + `failed to load dynamic plugin manifest from '${pluginHomeAlpha}'`, + e, + ); + continue; + } + scannedPlugin.manifest.backstage = backstage; + } else { + this.logger.warn( + `skipping '${pluginHomeAlpha}' since it is not a directory`, ); - continue; } - scannedPlugin.manifest.backstage = backstage; - } else { - this.logger.warn( - `skipping '${pluginHomeAlpha}' since it is not a directory`, - ); } } }