@backstage/backend-dynamic-feature-service 0.5.4-next.1 → 0.6.0-next.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/dist/index.cjs.js +0 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -7
- package/dist/manager/plugin-manager.cjs.js +10 -27
- package/dist/manager/plugin-manager.cjs.js.map +1 -1
- package/package.json +16 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# @backstage/backend-dynamic-feature-service
|
|
2
2
|
|
|
3
|
+
## 0.6.0-next.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @backstage/plugin-permission-node@0.8.8-next.2
|
|
9
|
+
- @backstage/plugin-catalog-backend@1.31.0-next.3
|
|
10
|
+
- @backstage/plugin-scaffolder-node@0.7.0-next.2
|
|
11
|
+
- @backstage/backend-defaults@0.8.0-next.3
|
|
12
|
+
- @backstage/backend-plugin-api@1.2.0-next.2
|
|
13
|
+
- @backstage/cli-node@0.2.13-next.1
|
|
14
|
+
- @backstage/config-loader@1.9.6-next.0
|
|
15
|
+
- @backstage/plugin-auth-node@0.6.0-next.2
|
|
16
|
+
- @backstage/plugin-events-backend@0.4.2-next.3
|
|
17
|
+
- @backstage/plugin-events-node@0.4.8-next.2
|
|
18
|
+
- @backstage/plugin-search-backend-node@1.3.8-next.2
|
|
19
|
+
- @backstage/cli-common@0.1.15
|
|
20
|
+
- @backstage/config@1.3.2
|
|
21
|
+
- @backstage/errors@1.2.7
|
|
22
|
+
- @backstage/types@1.2.1
|
|
23
|
+
- @backstage/plugin-app-node@0.1.30-next.2
|
|
24
|
+
- @backstage/plugin-permission-common@0.8.4
|
|
25
|
+
- @backstage/plugin-search-common@1.2.17
|
|
26
|
+
|
|
27
|
+
## 0.6.0-next.2
|
|
28
|
+
|
|
29
|
+
### Minor Changes
|
|
30
|
+
|
|
31
|
+
- 92a56f6: **BREAKING**: removed the deprecated `dynamicPluginsFeatureDiscoveryServiceFactory`.
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- Updated dependencies
|
|
36
|
+
- @backstage/backend-plugin-api@1.2.0-next.1
|
|
37
|
+
- @backstage/plugin-search-backend-node@1.3.8-next.1
|
|
38
|
+
- @backstage/plugin-auth-node@0.6.0-next.1
|
|
39
|
+
- @backstage/cli-node@0.2.13-next.1
|
|
40
|
+
- @backstage/backend-defaults@0.8.0-next.2
|
|
41
|
+
- @backstage/cli-common@0.1.15
|
|
42
|
+
- @backstage/config@1.3.2
|
|
43
|
+
- @backstage/config-loader@1.9.6-next.0
|
|
44
|
+
- @backstage/errors@1.2.7
|
|
45
|
+
- @backstage/types@1.2.1
|
|
46
|
+
- @backstage/plugin-app-node@0.1.30-next.1
|
|
47
|
+
- @backstage/plugin-catalog-backend@1.31.0-next.2
|
|
48
|
+
- @backstage/plugin-events-backend@0.4.2-next.2
|
|
49
|
+
- @backstage/plugin-events-node@0.4.8-next.1
|
|
50
|
+
- @backstage/plugin-permission-common@0.8.4
|
|
51
|
+
- @backstage/plugin-permission-node@0.8.8-next.1
|
|
52
|
+
- @backstage/plugin-scaffolder-node@0.7.0-next.1
|
|
53
|
+
- @backstage/plugin-search-common@1.2.17
|
|
54
|
+
|
|
3
55
|
## 0.5.4-next.1
|
|
4
56
|
|
|
5
57
|
### Patch Changes
|
package/dist/index.cjs.js
CHANGED
|
@@ -14,7 +14,6 @@ exports.CommonJSModuleLoader = CommonJSModuleLoader.CommonJSModuleLoader;
|
|
|
14
14
|
exports.isBackendDynamicPluginInstaller = types.isBackendDynamicPluginInstaller;
|
|
15
15
|
exports.DynamicPluginManager = pluginManager.DynamicPluginManager;
|
|
16
16
|
exports.dynamicPluginsFeatureDiscoveryLoader = pluginManager.dynamicPluginsFeatureDiscoveryLoader;
|
|
17
|
-
exports.dynamicPluginsFeatureDiscoveryServiceFactory = pluginManager.dynamicPluginsFeatureDiscoveryServiceFactory;
|
|
18
17
|
exports.dynamicPluginsServiceFactory = pluginManager.dynamicPluginsServiceFactory;
|
|
19
18
|
exports.dynamicPluginsServiceFactoryWithOptions = pluginManager.dynamicPluginsServiceFactoryWithOptions;
|
|
20
19
|
exports.dynamicPluginsServiceRef = pluginManager.dynamicPluginsServiceRef;
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,7 +13,6 @@ import { TemplateAction } from '@backstage/plugin-scaffolder-node';
|
|
|
13
13
|
import { IndexBuilder } from '@backstage/plugin-search-backend-node';
|
|
14
14
|
import { EventsBackend } from '@backstage/plugin-events-backend';
|
|
15
15
|
import { PermissionPolicy } from '@backstage/plugin-permission-node';
|
|
16
|
-
import { FeatureDiscoveryService } from '@backstage/backend-plugin-api/alpha';
|
|
17
16
|
import { ConfigSchema } from '@backstage/config-loader';
|
|
18
17
|
import { WinstonLoggerOptions } from '@backstage/backend-defaults/rootLogger';
|
|
19
18
|
|
|
@@ -236,11 +235,6 @@ declare const dynamicPluginsServiceFactoryWithOptions: (options?: DynamicPlugins
|
|
|
236
235
|
* @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.
|
|
237
236
|
*/
|
|
238
237
|
declare const dynamicPluginsServiceFactory: ((options?: DynamicPluginsFactoryOptions) => _backstage_backend_plugin_api.ServiceFactory<DynamicPluginProvider, "root", "singleton">) & _backstage_backend_plugin_api.ServiceFactory<DynamicPluginProvider, "root", "singleton">;
|
|
239
|
-
/**
|
|
240
|
-
* @public
|
|
241
|
-
* @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.
|
|
242
|
-
*/
|
|
243
|
-
declare const dynamicPluginsFeatureDiscoveryServiceFactory: _backstage_backend_plugin_api.ServiceFactory<FeatureDiscoveryService, "root", "singleton">;
|
|
244
238
|
/**
|
|
245
239
|
* @public
|
|
246
240
|
* @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.
|
|
@@ -344,4 +338,4 @@ type DynamicPluginsFeatureLoaderOptions = DynamicPluginsFactoryOptions & Dynamic
|
|
|
344
338
|
*/
|
|
345
339
|
declare const dynamicPluginsFeatureLoader: ((options?: DynamicPluginsFeatureLoaderOptions) => _backstage_backend_plugin_api.BackendFeature) & _backstage_backend_plugin_api.BackendFeature;
|
|
346
340
|
|
|
347
|
-
export { type BackendDynamicPlugin, type BackendDynamicPluginInstaller, type BackendPluginProvider, type BaseDynamicPlugin, CommonJSModuleLoader, type CommonJSModuleLoaderOptions, type DynamicPlugin, DynamicPluginManager, type DynamicPluginManagerOptions, type DynamicPluginProvider, type DynamicPluginsFactoryOptions, type DynamicPluginsFeatureLoaderOptions, type DynamicPluginsRootLoggerFactoryOptions, type DynamicPluginsSchemasOptions, type DynamicPluginsSchemasService, type FrontendDynamicPlugin, type FrontendPluginProvider, type LegacyBackendPluginInstaller, type LegacyPluginEnvironment, type ModuleLoader, type NewBackendPluginInstaller, type ScannedPluginManifest, type ScannedPluginPackage, dynamicPluginsFeatureDiscoveryLoader,
|
|
341
|
+
export { type BackendDynamicPlugin, type BackendDynamicPluginInstaller, type BackendPluginProvider, type BaseDynamicPlugin, CommonJSModuleLoader, type CommonJSModuleLoaderOptions, type DynamicPlugin, DynamicPluginManager, type DynamicPluginManagerOptions, type DynamicPluginProvider, type DynamicPluginsFactoryOptions, type DynamicPluginsFeatureLoaderOptions, type DynamicPluginsRootLoggerFactoryOptions, type DynamicPluginsSchemasOptions, type DynamicPluginsSchemasService, type FrontendDynamicPlugin, type FrontendPluginProvider, type LegacyBackendPluginInstaller, type LegacyPluginEnvironment, type ModuleLoader, type NewBackendPluginInstaller, type ScannedPluginManifest, type ScannedPluginPackage, dynamicPluginsFeatureDiscoveryLoader, dynamicPluginsFeatureLoader, dynamicPluginsFrontendSchemas, dynamicPluginsRootLoggerServiceFactory, dynamicPluginsSchemasServiceFactory, dynamicPluginsServiceFactory, dynamicPluginsServiceFactoryWithOptions, dynamicPluginsServiceRef, isBackendDynamicPluginInstaller };
|
|
@@ -8,7 +8,6 @@ var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
|
8
8
|
var cliNode = require('@backstage/cli-node');
|
|
9
9
|
var cliCommon = require('@backstage/cli-common');
|
|
10
10
|
var fs = require('fs');
|
|
11
|
-
var alpha = require('@backstage/backend-plugin-api/alpha');
|
|
12
11
|
|
|
13
12
|
function _interopNamespaceCompat(e) {
|
|
14
13
|
if (e && typeof e === 'object' && 'default' in e) return e;
|
|
@@ -212,39 +211,24 @@ const dynamicPluginsServiceFactory = Object.assign(
|
|
|
212
211
|
dynamicPluginsServiceFactoryWithOptions()
|
|
213
212
|
);
|
|
214
213
|
class DynamicPluginsEnabledFeatureDiscoveryService {
|
|
215
|
-
constructor(dynamicPlugins
|
|
214
|
+
constructor(dynamicPlugins) {
|
|
216
215
|
this.dynamicPlugins = dynamicPlugins;
|
|
217
|
-
this.featureDiscoveryService = featureDiscoveryService;
|
|
218
216
|
}
|
|
219
217
|
async getBackendFeatures() {
|
|
220
|
-
const staticFeatures = (await this.featureDiscoveryService?.getBackendFeatures())?.features ?? [];
|
|
221
218
|
return {
|
|
222
|
-
features:
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
return installed;
|
|
228
|
-
}
|
|
229
|
-
return [installed];
|
|
219
|
+
features: this.dynamicPlugins.backendPlugins().flatMap((plugin) => {
|
|
220
|
+
if (plugin.installer?.kind === "new") {
|
|
221
|
+
const installed = plugin.installer.install();
|
|
222
|
+
if (Array.isArray(installed)) {
|
|
223
|
+
return installed;
|
|
230
224
|
}
|
|
231
|
-
return [];
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
|
|
225
|
+
return [installed];
|
|
226
|
+
}
|
|
227
|
+
return [];
|
|
228
|
+
})
|
|
235
229
|
};
|
|
236
230
|
}
|
|
237
231
|
}
|
|
238
|
-
const dynamicPluginsFeatureDiscoveryServiceFactory = backendPluginApi.createServiceFactory({
|
|
239
|
-
service: alpha.featureDiscoveryServiceRef,
|
|
240
|
-
deps: {
|
|
241
|
-
config: backendPluginApi.coreServices.rootConfig,
|
|
242
|
-
dynamicPlugins: dynamicPluginsServiceRef
|
|
243
|
-
},
|
|
244
|
-
factory({ dynamicPlugins }) {
|
|
245
|
-
return new DynamicPluginsEnabledFeatureDiscoveryService(dynamicPlugins);
|
|
246
|
-
}
|
|
247
|
-
});
|
|
248
232
|
const dynamicPluginsFeatureDiscoveryLoader = backendPluginApi.createBackendFeatureLoader({
|
|
249
233
|
deps: {
|
|
250
234
|
dynamicPlugins: dynamicPluginsServiceRef
|
|
@@ -266,7 +250,6 @@ function isBackendFeatureFactory(value) {
|
|
|
266
250
|
|
|
267
251
|
exports.DynamicPluginManager = DynamicPluginManager;
|
|
268
252
|
exports.dynamicPluginsFeatureDiscoveryLoader = dynamicPluginsFeatureDiscoveryLoader;
|
|
269
|
-
exports.dynamicPluginsFeatureDiscoveryServiceFactory = dynamicPluginsFeatureDiscoveryServiceFactory;
|
|
270
253
|
exports.dynamicPluginsServiceFactory = dynamicPluginsServiceFactory;
|
|
271
254
|
exports.dynamicPluginsServiceFactoryWithOptions = dynamicPluginsServiceFactoryWithOptions;
|
|
272
255
|
exports.dynamicPluginsServiceRef = dynamicPluginsServiceRef;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-manager.cjs.js","sources":["../../src/manager/plugin-manager.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Config } from '@backstage/config';\nimport {\n DynamicPluginProvider,\n BackendDynamicPlugin,\n isBackendDynamicPluginInstaller,\n DynamicPlugin,\n FrontendDynamicPlugin,\n} from './types';\nimport { ScannedPluginPackage } from '../scanner';\nimport { PluginScanner } from '../scanner/plugin-scanner';\nimport { ModuleLoader } from '../loader';\nimport { CommonJSModuleLoader } from '../loader/CommonJSModuleLoader';\nimport * as url from 'url';\nimport {\n BackendFeature,\n LoggerService,\n coreServices,\n createBackendFeatureLoader,\n createServiceFactory,\n createServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { PackageRole, PackageRoles } from '@backstage/cli-node';\nimport { findPaths } from '@backstage/cli-common';\nimport * as fs from 'fs';\nimport {\n FeatureDiscoveryService,\n featureDiscoveryServiceRef,\n} from '@backstage/backend-plugin-api/alpha';\n\n/**\n * @public\n */\nexport interface DynamicPluginManagerOptions {\n config: Config;\n logger: LoggerService;\n preferAlpha?: boolean;\n moduleLoader?: ModuleLoader;\n}\n\n/**\n * @public\n */\nexport class DynamicPluginManager implements DynamicPluginProvider {\n static async create(\n options: DynamicPluginManagerOptions,\n ): Promise<DynamicPluginManager> {\n /* eslint-disable-next-line no-restricted-syntax */\n const backstageRoot = findPaths(__dirname).targetRoot;\n const scanner = PluginScanner.create({\n config: options.config,\n logger: options.logger,\n backstageRoot,\n preferAlpha: options.preferAlpha,\n });\n const scannedPlugins = (await scanner.scanRoot()).packages;\n await scanner.trackChanges();\n const moduleLoader =\n options.moduleLoader ||\n new CommonJSModuleLoader({ logger: options.logger });\n const manager = new DynamicPluginManager(\n options.logger,\n scannedPlugins,\n moduleLoader,\n );\n\n const scannedPluginManifestsPerRealPath = new Map(\n scannedPlugins.map(p => [\n fs.realpathSync(url.fileURLToPath(p.location)),\n p.manifest,\n ]),\n );\n\n await moduleLoader.bootstrap(\n backstageRoot,\n [...scannedPluginManifestsPerRealPath.keys()],\n scannedPluginManifestsPerRealPath,\n );\n\n scanner.subscribeToRootDirectoryChange(async () => {\n manager._availablePackages = (await scanner.scanRoot()).packages;\n // TODO: do not store _scannedPlugins again, but instead store a diff of the changes\n });\n manager._plugins.push(...(await manager.loadPlugins()));\n\n return manager;\n }\n\n private readonly _plugins: DynamicPlugin[];\n private _availablePackages: ScannedPluginPackage[];\n\n private constructor(\n private readonly logger: LoggerService,\n private readonly packages: ScannedPluginPackage[],\n private readonly moduleLoader: ModuleLoader,\n ) {\n this._plugins = [];\n this._availablePackages = packages;\n }\n\n get availablePackages(): ScannedPluginPackage[] {\n return this._availablePackages;\n }\n\n addBackendPlugin(plugin: BackendDynamicPlugin): void {\n this._plugins.push(plugin);\n }\n\n private async loadPlugins(): Promise<DynamicPlugin[]> {\n const loadedPlugins: DynamicPlugin[] = [];\n\n for (const scannedPlugin of this.packages) {\n const role = scannedPlugin.manifest.backstage.role;\n const platform = PackageRoles.getRoleInfo(role).platform;\n const isPlugin =\n role.endsWith('-plugin') ||\n role.endsWith('-plugin-module') ||\n role === ('frontend-dynamic-container' as PackageRole);\n\n if (!isPlugin) {\n this.logger.info(\n `skipping dynamic plugin package '${scannedPlugin.manifest.name}' from '${scannedPlugin.location}': incompatible role '${role}'`,\n );\n continue;\n }\n\n switch (platform) {\n case 'node':\n loadedPlugins.push(await this.loadBackendPlugin(scannedPlugin));\n break;\n\n case 'web':\n loadedPlugins.push({\n name: scannedPlugin.manifest.name,\n version: scannedPlugin.manifest.version,\n role: scannedPlugin.manifest.backstage.role,\n platform: 'web',\n // TODO(davidfestal): add required front-end plugin information here.\n });\n break;\n\n default:\n this.logger.info(\n `skipping dynamic plugin package '${scannedPlugin.manifest.name}' from '${scannedPlugin.location}': unrelated platform '${platform}'`,\n );\n }\n }\n return loadedPlugins;\n }\n\n private async loadBackendPlugin(\n plugin: ScannedPluginPackage,\n ): Promise<BackendDynamicPlugin> {\n const usedPluginManifest =\n plugin.alphaManifest?.main ?? plugin.manifest.main;\n const usedPluginLocation = plugin.alphaManifest?.main\n ? `${plugin.location}/alpha`\n : plugin.location;\n const packagePath = url.fileURLToPath(\n `${usedPluginLocation}/${usedPluginManifest}`,\n );\n const dynamicPlugin: BackendDynamicPlugin = {\n name: plugin.manifest.name,\n version: plugin.manifest.version,\n platform: 'node',\n role: plugin.manifest.backstage.role,\n };\n\n try {\n const pluginModule = await this.moduleLoader.load(packagePath);\n\n if (isBackendFeature(pluginModule.default)) {\n dynamicPlugin.installer = {\n kind: 'new',\n install: () => pluginModule.default,\n };\n } else if (isBackendFeatureFactory(pluginModule.default)) {\n dynamicPlugin.installer = {\n kind: 'new',\n install: pluginModule.default,\n };\n } else if (\n isBackendDynamicPluginInstaller(pluginModule.dynamicPluginInstaller)\n ) {\n dynamicPlugin.installer = pluginModule.dynamicPluginInstaller;\n }\n if (dynamicPlugin.installer) {\n this.logger.info(\n `loaded dynamic backend plugin '${plugin.manifest.name}' from '${usedPluginLocation}'`,\n );\n } else {\n 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.`;\n this.logger.error(\n `dynamic backend plugin '${plugin.manifest.name}' could not be loaded from '${usedPluginLocation}': ${dynamicPlugin.failure}`,\n );\n }\n return dynamicPlugin;\n } catch (error) {\n const typedError =\n typeof error === 'object' && 'message' in error && 'name' in error\n ? error\n : new Error(error);\n dynamicPlugin.failure = `${typedError.name}: ${typedError.message}`;\n this.logger.error(\n `an error occurred while loading dynamic backend plugin '${plugin.manifest.name}' from '${usedPluginLocation}'`,\n typedError,\n );\n return dynamicPlugin;\n }\n }\n\n backendPlugins(options?: {\n includeFailed?: boolean;\n }): BackendDynamicPlugin[] {\n return this.plugins(options).filter(\n (p): p is BackendDynamicPlugin => p.platform === 'node',\n );\n }\n\n frontendPlugins(options?: {\n includeFailed?: boolean;\n }): FrontendDynamicPlugin[] {\n return this.plugins(options).filter(\n (p): p is FrontendDynamicPlugin => p.platform === 'web',\n );\n }\n\n plugins(options?: { includeFailed?: boolean }): DynamicPlugin[] {\n return this._plugins.filter(p => options?.includeFailed || !p.failure);\n }\n\n getScannedPackage(plugin: DynamicPlugin): ScannedPluginPackage {\n const pkg = this.packages.find(\n p =>\n p.manifest.name === plugin.name &&\n p.manifest.version === plugin.version,\n );\n if (pkg === undefined) {\n throw new Error(\n `The scanned package of a dynamic plugin should always be available: ${plugin.name}/${plugin.version}`,\n );\n }\n return pkg;\n }\n}\n\n/**\n * @public\n */\nexport const dynamicPluginsServiceRef = createServiceRef<DynamicPluginProvider>(\n {\n id: 'core.dynamicplugins',\n scope: 'root',\n },\n);\n\n/**\n * @public\n */\nexport interface DynamicPluginsFactoryOptions {\n moduleLoader?(logger: LoggerService): ModuleLoader | Promise<ModuleLoader>;\n}\n\n/**\n * @public\n * @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.\n */\nexport const dynamicPluginsServiceFactoryWithOptions = (\n options?: DynamicPluginsFactoryOptions,\n) =>\n createServiceFactory({\n service: dynamicPluginsServiceRef,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.rootLogger,\n },\n async factory({ config, logger }) {\n return await DynamicPluginManager.create({\n config,\n logger,\n preferAlpha: true,\n moduleLoader: await options?.moduleLoader?.(logger),\n });\n },\n });\n\n/**\n * @public\n * @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.\n */\nexport const dynamicPluginsServiceFactory = Object.assign(\n dynamicPluginsServiceFactoryWithOptions,\n dynamicPluginsServiceFactoryWithOptions(),\n);\n\nclass DynamicPluginsEnabledFeatureDiscoveryService\n implements FeatureDiscoveryService\n{\n constructor(\n private readonly dynamicPlugins: DynamicPluginProvider,\n private readonly featureDiscoveryService?: FeatureDiscoveryService,\n ) {}\n\n async getBackendFeatures(): Promise<{ features: Array<BackendFeature> }> {\n const staticFeatures =\n (await this.featureDiscoveryService?.getBackendFeatures())?.features ??\n [];\n\n return {\n features: [\n ...this.dynamicPlugins\n .backendPlugins()\n .flatMap((plugin): BackendFeature[] => {\n if (plugin.installer?.kind === 'new') {\n const installed = plugin.installer.install();\n if (Array.isArray(installed)) {\n return installed;\n }\n return [installed];\n }\n return [];\n }),\n ...staticFeatures,\n ],\n };\n }\n}\n\n/**\n * @public\n * @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.\n */\nexport const dynamicPluginsFeatureDiscoveryServiceFactory =\n createServiceFactory({\n service: featureDiscoveryServiceRef,\n deps: {\n config: coreServices.rootConfig,\n dynamicPlugins: dynamicPluginsServiceRef,\n },\n factory({ dynamicPlugins }) {\n return new DynamicPluginsEnabledFeatureDiscoveryService(dynamicPlugins);\n },\n });\n\n/**\n * @public\n * @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.\n */\nexport const dynamicPluginsFeatureDiscoveryLoader = createBackendFeatureLoader({\n deps: {\n dynamicPlugins: dynamicPluginsServiceRef,\n },\n async loader({ dynamicPlugins }) {\n const service = new DynamicPluginsEnabledFeatureDiscoveryService(\n dynamicPlugins,\n );\n const { features } = await service.getBackendFeatures();\n return features;\n },\n});\n\nfunction isBackendFeature(value: unknown): value is BackendFeature {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n (value as BackendFeature).$$type === '@backstage/BackendFeature'\n );\n}\n\nfunction isBackendFeatureFactory(\n value: unknown,\n): value is () => BackendFeature {\n return (\n !!value &&\n typeof value === 'function' &&\n (value as any).$$type === '@backstage/BackendFeatureFactory'\n );\n}\n"],"names":["findPaths","PluginScanner","CommonJSModuleLoader","fs","url","PackageRoles","isBackendDynamicPluginInstaller","createServiceRef","createServiceFactory","coreServices","featureDiscoveryServiceRef","createBackendFeatureLoader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin-manager.cjs.js","sources":["../../src/manager/plugin-manager.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Config } from '@backstage/config';\nimport {\n DynamicPluginProvider,\n BackendDynamicPlugin,\n isBackendDynamicPluginInstaller,\n DynamicPlugin,\n FrontendDynamicPlugin,\n} from './types';\nimport { ScannedPluginPackage } from '../scanner';\nimport { PluginScanner } from '../scanner/plugin-scanner';\nimport { ModuleLoader } from '../loader';\nimport { CommonJSModuleLoader } from '../loader/CommonJSModuleLoader';\nimport * as url from 'url';\nimport {\n BackendFeature,\n LoggerService,\n coreServices,\n createBackendFeatureLoader,\n createServiceFactory,\n createServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { PackageRole, PackageRoles } from '@backstage/cli-node';\nimport { findPaths } from '@backstage/cli-common';\nimport * as fs from 'fs';\n\n/**\n * @public\n */\nexport interface DynamicPluginManagerOptions {\n config: Config;\n logger: LoggerService;\n preferAlpha?: boolean;\n moduleLoader?: ModuleLoader;\n}\n\n/**\n * @public\n */\nexport class DynamicPluginManager implements DynamicPluginProvider {\n static async create(\n options: DynamicPluginManagerOptions,\n ): Promise<DynamicPluginManager> {\n /* eslint-disable-next-line no-restricted-syntax */\n const backstageRoot = findPaths(__dirname).targetRoot;\n const scanner = PluginScanner.create({\n config: options.config,\n logger: options.logger,\n backstageRoot,\n preferAlpha: options.preferAlpha,\n });\n const scannedPlugins = (await scanner.scanRoot()).packages;\n await scanner.trackChanges();\n const moduleLoader =\n options.moduleLoader ||\n new CommonJSModuleLoader({ logger: options.logger });\n const manager = new DynamicPluginManager(\n options.logger,\n scannedPlugins,\n moduleLoader,\n );\n\n const scannedPluginManifestsPerRealPath = new Map(\n scannedPlugins.map(p => [\n fs.realpathSync(url.fileURLToPath(p.location)),\n p.manifest,\n ]),\n );\n\n await moduleLoader.bootstrap(\n backstageRoot,\n [...scannedPluginManifestsPerRealPath.keys()],\n scannedPluginManifestsPerRealPath,\n );\n\n scanner.subscribeToRootDirectoryChange(async () => {\n manager._availablePackages = (await scanner.scanRoot()).packages;\n // TODO: do not store _scannedPlugins again, but instead store a diff of the changes\n });\n manager._plugins.push(...(await manager.loadPlugins()));\n\n return manager;\n }\n\n private readonly _plugins: DynamicPlugin[];\n private _availablePackages: ScannedPluginPackage[];\n\n private constructor(\n private readonly logger: LoggerService,\n private readonly packages: ScannedPluginPackage[],\n private readonly moduleLoader: ModuleLoader,\n ) {\n this._plugins = [];\n this._availablePackages = packages;\n }\n\n get availablePackages(): ScannedPluginPackage[] {\n return this._availablePackages;\n }\n\n addBackendPlugin(plugin: BackendDynamicPlugin): void {\n this._plugins.push(plugin);\n }\n\n private async loadPlugins(): Promise<DynamicPlugin[]> {\n const loadedPlugins: DynamicPlugin[] = [];\n\n for (const scannedPlugin of this.packages) {\n const role = scannedPlugin.manifest.backstage.role;\n const platform = PackageRoles.getRoleInfo(role).platform;\n const isPlugin =\n role.endsWith('-plugin') ||\n role.endsWith('-plugin-module') ||\n role === ('frontend-dynamic-container' as PackageRole);\n\n if (!isPlugin) {\n this.logger.info(\n `skipping dynamic plugin package '${scannedPlugin.manifest.name}' from '${scannedPlugin.location}': incompatible role '${role}'`,\n );\n continue;\n }\n\n switch (platform) {\n case 'node':\n loadedPlugins.push(await this.loadBackendPlugin(scannedPlugin));\n break;\n\n case 'web':\n loadedPlugins.push({\n name: scannedPlugin.manifest.name,\n version: scannedPlugin.manifest.version,\n role: scannedPlugin.manifest.backstage.role,\n platform: 'web',\n // TODO(davidfestal): add required front-end plugin information here.\n });\n break;\n\n default:\n this.logger.info(\n `skipping dynamic plugin package '${scannedPlugin.manifest.name}' from '${scannedPlugin.location}': unrelated platform '${platform}'`,\n );\n }\n }\n return loadedPlugins;\n }\n\n private async loadBackendPlugin(\n plugin: ScannedPluginPackage,\n ): Promise<BackendDynamicPlugin> {\n const usedPluginManifest =\n plugin.alphaManifest?.main ?? plugin.manifest.main;\n const usedPluginLocation = plugin.alphaManifest?.main\n ? `${plugin.location}/alpha`\n : plugin.location;\n const packagePath = url.fileURLToPath(\n `${usedPluginLocation}/${usedPluginManifest}`,\n );\n const dynamicPlugin: BackendDynamicPlugin = {\n name: plugin.manifest.name,\n version: plugin.manifest.version,\n platform: 'node',\n role: plugin.manifest.backstage.role,\n };\n\n try {\n const pluginModule = await this.moduleLoader.load(packagePath);\n\n if (isBackendFeature(pluginModule.default)) {\n dynamicPlugin.installer = {\n kind: 'new',\n install: () => pluginModule.default,\n };\n } else if (isBackendFeatureFactory(pluginModule.default)) {\n dynamicPlugin.installer = {\n kind: 'new',\n install: pluginModule.default,\n };\n } else if (\n isBackendDynamicPluginInstaller(pluginModule.dynamicPluginInstaller)\n ) {\n dynamicPlugin.installer = pluginModule.dynamicPluginInstaller;\n }\n if (dynamicPlugin.installer) {\n this.logger.info(\n `loaded dynamic backend plugin '${plugin.manifest.name}' from '${usedPluginLocation}'`,\n );\n } else {\n 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.`;\n this.logger.error(\n `dynamic backend plugin '${plugin.manifest.name}' could not be loaded from '${usedPluginLocation}': ${dynamicPlugin.failure}`,\n );\n }\n return dynamicPlugin;\n } catch (error) {\n const typedError =\n typeof error === 'object' && 'message' in error && 'name' in error\n ? error\n : new Error(error);\n dynamicPlugin.failure = `${typedError.name}: ${typedError.message}`;\n this.logger.error(\n `an error occurred while loading dynamic backend plugin '${plugin.manifest.name}' from '${usedPluginLocation}'`,\n typedError,\n );\n return dynamicPlugin;\n }\n }\n\n backendPlugins(options?: {\n includeFailed?: boolean;\n }): BackendDynamicPlugin[] {\n return this.plugins(options).filter(\n (p): p is BackendDynamicPlugin => p.platform === 'node',\n );\n }\n\n frontendPlugins(options?: {\n includeFailed?: boolean;\n }): FrontendDynamicPlugin[] {\n return this.plugins(options).filter(\n (p): p is FrontendDynamicPlugin => p.platform === 'web',\n );\n }\n\n plugins(options?: { includeFailed?: boolean }): DynamicPlugin[] {\n return this._plugins.filter(p => options?.includeFailed || !p.failure);\n }\n\n getScannedPackage(plugin: DynamicPlugin): ScannedPluginPackage {\n const pkg = this.packages.find(\n p =>\n p.manifest.name === plugin.name &&\n p.manifest.version === plugin.version,\n );\n if (pkg === undefined) {\n throw new Error(\n `The scanned package of a dynamic plugin should always be available: ${plugin.name}/${plugin.version}`,\n );\n }\n return pkg;\n }\n}\n\n/**\n * @public\n */\nexport const dynamicPluginsServiceRef = createServiceRef<DynamicPluginProvider>(\n {\n id: 'core.dynamicplugins',\n scope: 'root',\n },\n);\n\n/**\n * @public\n */\nexport interface DynamicPluginsFactoryOptions {\n moduleLoader?(logger: LoggerService): ModuleLoader | Promise<ModuleLoader>;\n}\n\n/**\n * @public\n * @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.\n */\nexport const dynamicPluginsServiceFactoryWithOptions = (\n options?: DynamicPluginsFactoryOptions,\n) =>\n createServiceFactory({\n service: dynamicPluginsServiceRef,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.rootLogger,\n },\n async factory({ config, logger }) {\n return await DynamicPluginManager.create({\n config,\n logger,\n preferAlpha: true,\n moduleLoader: await options?.moduleLoader?.(logger),\n });\n },\n });\n\n/**\n * @public\n * @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.\n */\nexport const dynamicPluginsServiceFactory = Object.assign(\n dynamicPluginsServiceFactoryWithOptions,\n dynamicPluginsServiceFactoryWithOptions(),\n);\n\nclass DynamicPluginsEnabledFeatureDiscoveryService {\n constructor(private readonly dynamicPlugins: DynamicPluginProvider) {}\n\n async getBackendFeatures(): Promise<{ features: Array<BackendFeature> }> {\n return {\n features: this.dynamicPlugins\n .backendPlugins()\n .flatMap((plugin): BackendFeature[] => {\n if (plugin.installer?.kind === 'new') {\n const installed = plugin.installer.install();\n if (Array.isArray(installed)) {\n return installed;\n }\n return [installed];\n }\n return [];\n }),\n };\n }\n}\n\n/**\n * @public\n * @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.\n */\nexport const dynamicPluginsFeatureDiscoveryLoader = createBackendFeatureLoader({\n deps: {\n dynamicPlugins: dynamicPluginsServiceRef,\n },\n async loader({ dynamicPlugins }) {\n const service = new DynamicPluginsEnabledFeatureDiscoveryService(\n dynamicPlugins,\n );\n const { features } = await service.getBackendFeatures();\n return features;\n },\n});\n\nfunction isBackendFeature(value: unknown): value is BackendFeature {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n (value as BackendFeature).$$type === '@backstage/BackendFeature'\n );\n}\n\nfunction isBackendFeatureFactory(\n value: unknown,\n): value is () => BackendFeature {\n return (\n !!value &&\n typeof value === 'function' &&\n (value as any).$$type === '@backstage/BackendFeatureFactory'\n );\n}\n"],"names":["findPaths","PluginScanner","CommonJSModuleLoader","fs","url","PackageRoles","isBackendDynamicPluginInstaller","createServiceRef","createServiceFactory","coreServices","createBackendFeatureLoader"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-dynamic-feature-service",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0-next.3",
|
|
4
4
|
"description": "Backstage dynamic feature service",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library"
|
|
@@ -49,24 +49,23 @@
|
|
|
49
49
|
"test": "backstage-cli package test"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@backstage/backend-app-api": "1.1.2-next.1",
|
|
53
52
|
"@backstage/backend-common": "^0.25.0",
|
|
54
|
-
"@backstage/backend-defaults": "0.8.0-next.
|
|
55
|
-
"@backstage/backend-plugin-api": "1.2.0-next.
|
|
53
|
+
"@backstage/backend-defaults": "0.8.0-next.3",
|
|
54
|
+
"@backstage/backend-plugin-api": "1.2.0-next.2",
|
|
56
55
|
"@backstage/cli-common": "0.1.15",
|
|
57
|
-
"@backstage/cli-node": "0.2.13-next.
|
|
56
|
+
"@backstage/cli-node": "0.2.13-next.1",
|
|
58
57
|
"@backstage/config": "1.3.2",
|
|
59
58
|
"@backstage/config-loader": "1.9.6-next.0",
|
|
60
59
|
"@backstage/errors": "1.2.7",
|
|
61
|
-
"@backstage/plugin-app-node": "0.1.30-next.
|
|
62
|
-
"@backstage/plugin-auth-node": "0.
|
|
63
|
-
"@backstage/plugin-catalog-backend": "1.31.0-next.
|
|
64
|
-
"@backstage/plugin-events-backend": "0.4.2-next.
|
|
65
|
-
"@backstage/plugin-events-node": "0.4.8-next.
|
|
60
|
+
"@backstage/plugin-app-node": "0.1.30-next.2",
|
|
61
|
+
"@backstage/plugin-auth-node": "0.6.0-next.2",
|
|
62
|
+
"@backstage/plugin-catalog-backend": "1.31.0-next.3",
|
|
63
|
+
"@backstage/plugin-events-backend": "0.4.2-next.3",
|
|
64
|
+
"@backstage/plugin-events-node": "0.4.8-next.2",
|
|
66
65
|
"@backstage/plugin-permission-common": "0.8.4",
|
|
67
|
-
"@backstage/plugin-permission-node": "0.8.8-next.
|
|
68
|
-
"@backstage/plugin-scaffolder-node": "0.7.0-next.
|
|
69
|
-
"@backstage/plugin-search-backend-node": "1.3.8-next.
|
|
66
|
+
"@backstage/plugin-permission-node": "0.8.8-next.2",
|
|
67
|
+
"@backstage/plugin-scaffolder-node": "0.7.0-next.2",
|
|
68
|
+
"@backstage/plugin-search-backend-node": "1.3.8-next.2",
|
|
70
69
|
"@backstage/plugin-search-common": "1.2.17",
|
|
71
70
|
"@backstage/types": "1.2.1",
|
|
72
71
|
"@manypkg/get-packages": "^1.1.3",
|
|
@@ -78,9 +77,10 @@
|
|
|
78
77
|
"winston": "^3.2.1"
|
|
79
78
|
},
|
|
80
79
|
"devDependencies": {
|
|
81
|
-
"@backstage/backend-
|
|
82
|
-
"@backstage/
|
|
83
|
-
"@backstage/
|
|
80
|
+
"@backstage/backend-app-api": "1.2.0-next.3",
|
|
81
|
+
"@backstage/backend-test-utils": "1.3.0-next.3",
|
|
82
|
+
"@backstage/cli": "0.30.0-next.3",
|
|
83
|
+
"@backstage/plugin-app-backend": "0.4.5-next.2",
|
|
84
84
|
"triple-beam": "^1.4.1",
|
|
85
85
|
"wait-for-expect": "^3.0.2"
|
|
86
86
|
}
|