From 4c89e4759d183aeb15964f30ae6cc7362681ea48 Mon Sep 17 00:00:00 2001 From: David Festal Date: Mon, 7 Oct 2024 13:33:44 +0200 Subject: [PATCH] refactor(backend-dynamic-feature-service): allow passing an async module loader in the `DynamicPluginsFeatureLoaderOptions`. Signed-off-by: David Festal --- .changeset/lemon-badgers-share.md | 5 +++++ .../src/loader/CommonJSModuleLoader.ts | 13 ++++++++----- .../src/manager/plugin-manager.ts | 6 +++--- 3 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 .changeset/lemon-badgers-share.md diff --git a/.changeset/lemon-badgers-share.md b/.changeset/lemon-badgers-share.md new file mode 100644 index 0000000000..c00b43c403 --- /dev/null +++ b/.changeset/lemon-badgers-share.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-dynamic-feature-service': patch +--- + +Allow passing an async module loader in the `DynamicPluginsFeatureLoaderOptions`. diff --git a/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts b/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts index 66af367cea..f9d4a48a44 100644 --- a/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts +++ b/packages/backend-dynamic-feature-service/src/loader/CommonJSModuleLoader.ts @@ -18,7 +18,11 @@ import { LoggerService } from '@backstage/backend-plugin-api'; import path from 'path'; export class CommonJSModuleLoader implements ModuleLoader { - constructor(public readonly logger: LoggerService) {} + private module: any; + + constructor(public readonly logger: LoggerService) { + this.module = require('node:module'); + } async bootstrap( backstageRoot: string, @@ -28,9 +32,8 @@ export class CommonJSModuleLoader implements ModuleLoader { const dynamicNodeModulesPaths = [ ...dynamicPluginsPaths.map(p => path.resolve(p, 'node_modules')), ]; - const Module = require('module'); - const oldNodeModulePaths = Module._nodeModulePaths; - Module._nodeModulePaths = (from: string): string[] => { + const oldNodeModulePaths = this.module._nodeModulePaths; + this.module._nodeModulePaths = (from: string): string[] => { const result: string[] = oldNodeModulePaths(from); if (!dynamicPluginsPaths.some(p => from.startsWith(p))) { return result; @@ -49,6 +52,6 @@ export class CommonJSModuleLoader implements ModuleLoader { } async load(packagePath: string): Promise { - return await require(/* webpackIgnore: true */ packagePath); + return await this.module.prototype.require(packagePath); } } diff --git a/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts index 87ff4334ed..a3b4bfbf98 100644 --- a/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts +++ b/packages/backend-dynamic-feature-service/src/manager/plugin-manager.ts @@ -88,7 +88,7 @@ export class DynamicPluginManager implements DynamicPluginProvider { ), ); - moduleLoader.bootstrap(backstageRoot, dynamicPluginsPaths); + await moduleLoader.bootstrap(backstageRoot, dynamicPluginsPaths); scanner.subscribeToRootDirectoryChange(async () => { manager._availablePackages = (await scanner.scanRoot()).packages; @@ -262,7 +262,7 @@ export const dynamicPluginsServiceRef = createServiceRef( * @public */ export interface DynamicPluginsFactoryOptions { - moduleLoader?(logger: LoggerService): ModuleLoader; + moduleLoader?(logger: LoggerService): ModuleLoader | Promise; } /** @@ -283,7 +283,7 @@ export const dynamicPluginsServiceFactoryWithOptions = ( config, logger, preferAlpha: true, - moduleLoader: options?.moduleLoader?.(logger), + moduleLoader: await options?.moduleLoader?.(logger), }); }, });