Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
diff --git a/dist/manager/plugin-manager.cjs.js b/dist/manager/plugin-manager.cjs.js
index 30e7e7fd4533086cf726478386b9515fb01cd754..61aaac52098bf90c05f34b3580c27b3a6d034d95 100644
--- a/dist/manager/plugin-manager.cjs.js
+++ b/dist/manager/plugin-manager.cjs.js
@@ -3,12 +3,15 @@
var types = require('./types.cjs.js');
var pluginScanner = require('../scanner/plugin-scanner.cjs.js');
var CommonJSModuleLoader = require('../loader/CommonJSModuleLoader.cjs.js');
+var path = require('node:path');
var url = require('node:url');
var backendPluginApi = require('@backstage/backend-plugin-api');
var cliNode = require('@backstage/cli-node');
var cliCommon = require('@backstage/cli-common');
var fs = require('node:fs');

+function _interopDefaultCompat(e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
+
function _interopNamespaceCompat(e) {
if (e && typeof e === 'object' && 'default' in e) return e;
var n = Object.create(null);
@@ -27,6 +30,7 @@ function _interopNamespaceCompat(e) {
return Object.freeze(n);
}

+var path__default = /*#__PURE__*/_interopDefaultCompat(path);
var url__namespace = /*#__PURE__*/_interopNamespaceCompat(url);
var fs__namespace = /*#__PURE__*/_interopNamespaceCompat(fs);

@@ -116,52 +120,53 @@ class DynamicPluginManager {
return loadedPlugins;
}
async loadBackendPlugin(plugin) {
- const usedPluginManifest = plugin.alphaManifest?.main ?? plugin.manifest.main;
- const usedPluginLocation = plugin.alphaManifest?.main ? `${plugin.location}/alpha` : plugin.location;
- const packagePath = url__namespace.fileURLToPath(
- `${usedPluginLocation}/${usedPluginManifest}`
- );
const dynamicPlugin = {
name: plugin.manifest.name,
version: plugin.manifest.version,
platform: "node",
role: plugin.manifest.backstage.role
};
- try {
- const pluginModule = await this.moduleLoader.load(packagePath);
- if (isBackendFeature(pluginModule.default)) {
- dynamicPlugin.installer = {
- kind: "new",
- install: () => pluginModule.default
- };
- } else if (isBackendFeatureFactory(pluginModule.default)) {
- dynamicPlugin.installer = {
- kind: "new",
- install: pluginModule.default
- };
- } else if (types.isBackendDynamicPluginInstaller(pluginModule.dynamicPluginInstaller)) {
- dynamicPlugin.installer = pluginModule.dynamicPluginInstaller;
- }
- if (dynamicPlugin.installer) {
- this.logger.info(
- `loaded dynamic backend plugin '${plugin.manifest.name}' from '${usedPluginLocation}'`
- );
- } else {
- dynamicPlugin.failure = `the module should either export a 'BackendFeature' or 'BackendFeatureFactory' as default export, or export a 'const dynamicPluginInstaller: BackendDynamicPluginInstaller' field as dynamic loading entrypoint.`;
- this.logger.error(
- `dynamic backend plugin '${plugin.manifest.name}' could not be loaded from '${usedPluginLocation}': ${dynamicPlugin.failure}`
+ let loadResult;
+ if (plugin.alphaManifest?.main) {
+ loadResult = await tryLoadBackendPluginEntry(
+ this.moduleLoader,
+ new URL("alpha", `${plugin.location}/`),
+ plugin.alphaManifest.main
+ );
+ if (loadResult.kind === "no-entrypoint") {
+ loadResult = await tryLoadBackendPluginEntry(
+ this.moduleLoader,
+ plugin.location,
+ plugin.manifest.main
);
}
+ } else {
+ loadResult = await tryLoadBackendPluginEntry(
+ this.moduleLoader,
+ plugin.location,
+ plugin.manifest.main
+ );
+ }
+ if (loadResult.kind === "success") {
+ dynamicPlugin.installer = loadResult.installer;
+ this.logger.info(
+ `loaded dynamic backend plugin '${plugin.manifest.name}' from '${loadResult.location}'`
+ );
return dynamicPlugin;
- } catch (error) {
- const typedError = typeof error === "object" && "message" in error && "name" in error ? error : new Error(error);
- dynamicPlugin.failure = `${typedError.name}: ${typedError.message}`;
+ }
+ if (loadResult.kind === "error") {
+ dynamicPlugin.failure = `${loadResult.error.name}: ${loadResult.error.message}`;
this.logger.error(
- `an error occurred while loading dynamic backend plugin '${plugin.manifest.name}' from '${usedPluginLocation}'`,
- typedError
+ `an error occurred while loading dynamic backend plugin '${plugin.manifest.name}' from '${loadResult.location}'`,
+ loadResult.error
);
return dynamicPlugin;
}
+ dynamicPlugin.failure = `the module should either export a 'BackendFeature' or 'BackendFeatureFactory' as default export, or export a 'const dynamicPluginInstaller: BackendDynamicPluginInstaller' field as dynamic loading entrypoint.`;
+ this.logger.error(
+ `dynamic backend plugin '${plugin.manifest.name}' could not be loaded from '${loadResult.location}': ${dynamicPlugin.failure}`
+ );
+ return dynamicPlugin;
}
backendPlugins(options) {
return this.plugins(options).filter(
@@ -245,6 +250,38 @@ const dynamicPluginsFeatureDiscoveryLoader = backendPluginApi.createBackendFeatu
return features;
}
});
+async function tryLoadBackendPluginEntry(moduleLoader, location, manifest) {
+ try {
+ const packagePath = path__default.default.resolve(url__namespace.fileURLToPath(location), manifest);
+ const pluginModule = await moduleLoader.load(packagePath);
+ const installer = resolveInstallerFromModule(pluginModule);
+ if (installer) {
+ return { kind: "success", location, installer };
+ }
+ return { kind: "no-entrypoint", location };
+ } catch (error) {
+ const typedError = typeof error === "object" && error !== null && "message" in error && "name" in error ? error : new Error(error);
+ return { kind: "error", location, error: typedError };
+ }
+}
+function resolveInstallerFromModule(pluginModule) {
+ if (isBackendFeature(pluginModule.default)) {
+ return {
+ kind: "new",
+ install: () => pluginModule.default
+ };
+ }
+ if (isBackendFeatureFactory(pluginModule.default)) {
+ return {
+ kind: "new",
+ install: pluginModule.default
+ };
+ }
+ if (types.isBackendDynamicPluginInstaller(pluginModule.dynamicPluginInstaller)) {
+ return pluginModule.dynamicPluginInstaller;
+ }
+ return void 0;
+}
function isBackendFeature(value) {
return !!value && (typeof value === "object" || typeof value === "function") && value.$$type === "@backstage/BackendFeature";
}
14 changes: 0 additions & 14 deletions packages/app-next/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,21 +50,7 @@
"@backstage/frontend-plugin-api": "0.15.1",
"@backstage/integration-react": "1.2.16",
"@backstage/plugin-app": "0.4.2",
"@backstage/plugin-app-visualizer": "0.2.1",
"@backstage/plugin-auth-react": "0.1.25",
"@backstage/plugin-catalog": "2.0.1",
"@backstage/plugin-catalog-common": "1.1.8",
"@backstage/plugin-catalog-graph": "0.6.0",
"@backstage/plugin-catalog-import": "0.13.11",
"@backstage/plugin-catalog-react": "2.1.1",
"@backstage/plugin-catalog-unprocessed-entities": "0.2.30",
"@backstage/plugin-permission-react": "0.4.41",
"@backstage/plugin-scaffolder": "1.36.1",
"@backstage/plugin-scaffolder-react": "1.20.0",
"@backstage/plugin-search": "1.7.0",
"@backstage/plugin-search-common": "1.2.22",
"@backstage/plugin-search-react": "1.11.0",
"@backstage/plugin-user-settings": "0.9.1",
"@backstage/theme": "0.7.2",
"@backstage/ui": "0.13.2",
"@material-ui/core": "4.12.4",
Expand Down
10 changes: 0 additions & 10 deletions packages/app-next/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,8 @@
import { createApp } from '@backstage/frontend-defaults';
import appVisualizerPlugin from '@backstage/plugin-app-visualizer';
import catalogPlugin from '@backstage/plugin-catalog/alpha';
import scaffolderPlugin from '@backstage/plugin-scaffolder/alpha';
import searchPlugin from '@backstage/plugin-search/alpha';
import userSettingsPlugin from '@backstage/plugin-user-settings/alpha';
import { dynamicFrontendFeaturesLoader } from '@backstage/frontend-dynamic-feature-loader';

const app = createApp({
features: [
appVisualizerPlugin,
catalogPlugin,
scaffolderPlugin,
searchPlugin,
userSettingsPlugin,
dynamicFrontendFeaturesLoader()
],
});
Expand Down
12 changes: 1 addition & 11 deletions packages/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,9 @@
"dependencies": {
"@backstage-community/plugin-rbac-backend": "7.12.5",
"@backstage-community/plugin-rbac-node": "1.20.1",
"@backstage-community/plugin-scaffolder-backend-module-annotator": "2.16.1",
"@backstage/backend-app-api": "1.6.0",
"@backstage/backend-defaults": "0.16.0",
"@backstage/backend-dynamic-feature-service": "0.8.0",
"@backstage/backend-dynamic-feature-service": "patch:@backstage/backend-dynamic-feature-service@npm%3A0.8.0#~/.yarn/patches/@backstage-backend-dynamic-feature-service-npm-0.8.0-92b2319b05.patch",
"@backstage/backend-plugin-api": "1.8.0",
"@backstage/catalog-client": "1.14.0",
"@backstage/catalog-model": "1.7.7",
Expand All @@ -51,19 +50,10 @@
"@backstage/plugin-auth-backend-module-okta-provider": "0.2.13",
"@backstage/plugin-auth-backend-module-onelogin-provider": "0.3.13",
"@backstage/plugin-auth-node": "0.6.14",
"@backstage/plugin-catalog-backend": "3.5.0",
"@backstage/plugin-catalog-backend-module-logs": "0.1.20",
"@backstage/plugin-catalog-backend-module-openapi": "0.2.20",
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.18",
"@backstage/plugin-events-backend": "0.6.0",
"@backstage/plugin-events-node": "0.4.20",
"@backstage/plugin-permission-backend": "0.7.10",
"@backstage/plugin-proxy-backend": "0.6.11",
"@backstage/plugin-scaffolder-backend": "3.3.0",
"@backstage/plugin-search-backend": "2.1.0",
"@backstage/plugin-search-backend-module-catalog": "0.3.13",
"@backstage/plugin-search-backend-module-pg": "0.5.53",
"@backstage/plugin-user-settings-backend": "0.4.1",
"@internal/plugin-dynamic-plugins-info-backend": "*",
"@internal/plugin-licensed-users-info-backend": "*",
"@internal/plugin-scalprum-backend": "*",
Expand Down
29 changes: 0 additions & 29 deletions packages/backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import {
pluginIDProviderService,
rbacDynamicPluginsProvider,
} from './modules';
import { userSettingsBackend } from './modules/userSettings';

// Create a logger to cover logging static initialization tasks
const staticLogger = WinstonLogger.create({
Expand Down Expand Up @@ -115,39 +114,13 @@ if (
backend.add(healthCheckPlugin);

backend.add(import('@backstage/plugin-app-backend'));
backend.add(
import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'),
);

// See https://backstage.io/docs/features/software-catalog/configuration#subscribing-to-catalog-errors
backend.add(import('@backstage/plugin-catalog-backend-module-logs'));

backend.add(import('@backstage/plugin-catalog-backend'));

// TODO: Probably we should now provide this as a dynamic plugin
backend.add(import('@backstage/plugin-catalog-backend-module-openapi'));

backend.add(import('@backstage/plugin-proxy-backend'));

// TODO: Check in the Scaffolder new backend plugin why the identity is not passed and the default is built instead.
backend.add(import('@backstage/plugin-scaffolder-backend'));

// search engine
// See https://backstage.io/docs/features/search/search-engines
backend.add(import('@backstage/plugin-search-backend-module-pg'));

// search collators
backend.add(import('@backstage/plugin-search-backend'));
backend.add(import('@backstage/plugin-search-backend-module-catalog'));

// TODO: We should test it more deeply. The structure is not exactly the same as the old backend implementation
backend.add(import('@backstage/plugin-events-backend'));

backend.add(import('@backstage/plugin-permission-backend'));
backend.add(import('@backstage-community/plugin-rbac-backend'));
backend.add(
import('@backstage-community/plugin-scaffolder-backend-module-annotator'),
);
backend.add(pluginIDProviderService);
backend.add(rbacDynamicPluginsProvider);

Expand All @@ -166,6 +139,4 @@ backend.add(
);
backend.add(import('@internal/plugin-licensed-users-info-backend'));

backend.add(userSettingsBackend);

backend.start();
3 changes: 3 additions & 0 deletions packages/backend/src/modules/userSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@
`Invalid config value for 'userSettings.persistence': "${persistence}". Must be either "database" or "browser".`,
);
}
/*
TODO - this whole file needs to be moved to the user-settings-backend dynamic plugin

Check warning on line 20 in packages/backend/src/modules/userSettings.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Complete the task associated to this "TODO" comment.

See more on https://sonarcloud.io/project/issues?id=redhat-developer_rhdh&issues=AZ6X7Nez_ZacooVmF6cP&open=AZ6X7Nez_ZacooVmF6cP&pullRequest=4922
if (persistence === 'database') {
return [import('@backstage/plugin-user-settings-backend')];
}
*/
// Opt-out: browser -> no backend feature
return [];
},
Expand Down
2 changes: 1 addition & 1 deletion plugins/dynamic-plugins-info-backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
},
"dependencies": {
"@backstage/backend-defaults": "0.16.0",
"@backstage/backend-dynamic-feature-service": "0.8.0",
"@backstage/backend-dynamic-feature-service": "patch:@backstage/backend-dynamic-feature-service@npm%3A0.8.0#~/.yarn/patches/@backstage-backend-dynamic-feature-service-npm-0.8.0-92b2319b05.patch",
"@backstage/backend-plugin-api": "1.8.0",
"@backstage/config": "1.3.6",
"express": "4.22.2",
Expand Down
2 changes: 1 addition & 1 deletion plugins/scalprum-backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
},
"dependencies": {
"@backstage/backend-defaults": "0.16.0",
"@backstage/backend-dynamic-feature-service": "0.8.0",
"@backstage/backend-dynamic-feature-service": "patch:@backstage/backend-dynamic-feature-service@npm%3A0.8.0#~/.yarn/patches/@backstage-backend-dynamic-feature-service-npm-0.8.0-92b2319b05.patch",
"@backstage/backend-plugin-api": "1.8.0",
"@backstage/config": "1.3.6",
"express": "4.22.2",
Expand Down
Loading
Loading