@backstage/backend-dynamic-feature-service 0.6.2 → 0.7.0-next.1
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 +56 -0
- package/dist/index.d.ts +9 -63
- package/dist/loader/CommonJSModuleLoader.cjs.js.map +1 -1
- package/dist/manager/types.cjs.js.map +1 -1
- package/dist/server/frontendRemotesServer.cjs.js.map +1 -1
- package/dist/server/router.cjs.js +1 -1
- package/dist/server/router.cjs.js.map +1 -1
- package/package.json +26 -26
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,61 @@
|
|
|
1
1
|
# @backstage/backend-dynamic-feature-service
|
|
2
2
|
|
|
3
|
+
## 0.7.0-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 72d019d: Fixed various typos.
|
|
8
|
+
`FrontendRemoteResolver`'s misspelled `getAdditionaRemoteInfo` has been deprecated. Use the correct spelling `getAdditionalRemoteInfo` instead.
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
- @backstage/plugin-catalog-backend@2.0.0-next.1
|
|
11
|
+
- @backstage/backend-defaults@0.10.0-next.1
|
|
12
|
+
- @backstage/plugin-auth-node@0.6.3-next.1
|
|
13
|
+
- @backstage/backend-plugin-api@1.3.1-next.1
|
|
14
|
+
- @backstage/plugin-permission-common@0.9.0-next.0
|
|
15
|
+
- @backstage/plugin-permission-node@0.10.0-next.1
|
|
16
|
+
- @backstage/plugin-scaffolder-node@0.8.2-next.1
|
|
17
|
+
- @backstage/config-loader@1.10.1-next.0
|
|
18
|
+
- @backstage/plugin-events-backend@0.5.2-next.1
|
|
19
|
+
- @backstage/plugin-search-backend-node@1.3.11-next.1
|
|
20
|
+
- @backstage/backend-openapi-utils@0.5.3-next.1
|
|
21
|
+
- @backstage/cli-common@0.1.15
|
|
22
|
+
- @backstage/cli-node@0.2.13
|
|
23
|
+
- @backstage/config@1.3.2
|
|
24
|
+
- @backstage/errors@1.2.7
|
|
25
|
+
- @backstage/types@1.2.1
|
|
26
|
+
- @backstage/plugin-app-node@0.1.33-next.1
|
|
27
|
+
- @backstage/plugin-events-node@0.4.11-next.1
|
|
28
|
+
- @backstage/plugin-search-common@1.2.18-next.0
|
|
29
|
+
|
|
30
|
+
## 0.7.0-next.0
|
|
31
|
+
|
|
32
|
+
### Minor Changes
|
|
33
|
+
|
|
34
|
+
- 10f693c: **BREAKING** Removed support for the legacy backend, please migrate to the new backend system
|
|
35
|
+
|
|
36
|
+
### Patch Changes
|
|
37
|
+
|
|
38
|
+
- Updated dependencies
|
|
39
|
+
- @backstage/backend-defaults@0.9.1-next.0
|
|
40
|
+
- @backstage/plugin-catalog-backend@1.32.2-next.0
|
|
41
|
+
- @backstage/plugin-scaffolder-node@0.8.2-next.0
|
|
42
|
+
- @backstage/backend-plugin-api@1.3.1-next.0
|
|
43
|
+
- @backstage/cli-node@0.2.13
|
|
44
|
+
- @backstage/config-loader@1.10.0
|
|
45
|
+
- @backstage/plugin-auth-node@0.6.3-next.0
|
|
46
|
+
- @backstage/plugin-events-backend@0.5.2-next.0
|
|
47
|
+
- @backstage/plugin-events-node@0.4.11-next.0
|
|
48
|
+
- @backstage/plugin-permission-node@0.9.2-next.0
|
|
49
|
+
- @backstage/plugin-search-backend-node@1.3.11-next.0
|
|
50
|
+
- @backstage/backend-openapi-utils@0.5.3-next.0
|
|
51
|
+
- @backstage/cli-common@0.1.15
|
|
52
|
+
- @backstage/config@1.3.2
|
|
53
|
+
- @backstage/errors@1.2.7
|
|
54
|
+
- @backstage/types@1.2.1
|
|
55
|
+
- @backstage/plugin-app-node@0.1.33-next.0
|
|
56
|
+
- @backstage/plugin-permission-common@0.8.4
|
|
57
|
+
- @backstage/plugin-search-common@1.2.17
|
|
58
|
+
|
|
3
59
|
## 0.6.2
|
|
4
60
|
|
|
5
61
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
import { BackstagePackageJson, PackageRole, PackagePlatform } from '@backstage/cli-node';
|
|
2
2
|
import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
|
|
3
|
-
import { LoggerService,
|
|
4
|
-
import { Logger } from 'winston';
|
|
3
|
+
import { LoggerService, BackendFeature } from '@backstage/backend-plugin-api';
|
|
5
4
|
import { Config } from '@backstage/config';
|
|
6
|
-
import { Router } from 'express';
|
|
7
|
-
import { IdentityApi } from '@backstage/plugin-auth-node';
|
|
8
|
-
import { PermissionEvaluator } from '@backstage/plugin-permission-common';
|
|
9
|
-
import { EventBroker, EventsService, HttpPostIngressOptions } from '@backstage/plugin-events-node';
|
|
10
|
-
import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
|
|
11
|
-
import { TemplateAction } from '@backstage/plugin-scaffolder-node';
|
|
12
|
-
import { IndexBuilder } from '@backstage/plugin-search-backend-node';
|
|
13
|
-
import { PermissionPolicy } from '@backstage/plugin-permission-node';
|
|
14
5
|
import { ConfigSchema } from '@backstage/config-loader';
|
|
15
6
|
import { WinstonLoggerOptions } from '@backstage/backend-defaults/rootLogger';
|
|
16
7
|
import { JsonObject } from '@backstage/types';
|
|
@@ -59,31 +50,6 @@ declare class CommonJSModuleLoader implements ModuleLoader {
|
|
|
59
50
|
load(packagePath: string): Promise<any>;
|
|
60
51
|
}
|
|
61
52
|
|
|
62
|
-
/**
|
|
63
|
-
* @public
|
|
64
|
-
*
|
|
65
|
-
* @deprecated
|
|
66
|
-
*
|
|
67
|
-
* Support for the legacy backend system will be removed in the future.
|
|
68
|
-
*
|
|
69
|
-
* When adding a legacy plugin installer entrypoint in your plugin,
|
|
70
|
-
* you should always take the opportunity to also implement support
|
|
71
|
-
* for the new backend system if not already done.
|
|
72
|
-
*
|
|
73
|
-
*/
|
|
74
|
-
type LegacyPluginEnvironment = {
|
|
75
|
-
logger: Logger;
|
|
76
|
-
database: DatabaseService;
|
|
77
|
-
config: Config;
|
|
78
|
-
reader: UrlReaderService;
|
|
79
|
-
discovery: DiscoveryService;
|
|
80
|
-
permissions: PermissionEvaluator;
|
|
81
|
-
scheduler: SchedulerService;
|
|
82
|
-
identity: IdentityApi;
|
|
83
|
-
eventBroker: EventBroker;
|
|
84
|
-
events: EventsService;
|
|
85
|
-
pluginProvider: BackendPluginProvider;
|
|
86
|
-
};
|
|
87
53
|
/**
|
|
88
54
|
* @public
|
|
89
55
|
*/
|
|
@@ -139,7 +105,7 @@ interface BackendDynamicPlugin extends BaseDynamicPlugin {
|
|
|
139
105
|
/**
|
|
140
106
|
* @public
|
|
141
107
|
*/
|
|
142
|
-
type BackendDynamicPluginInstaller =
|
|
108
|
+
type BackendDynamicPluginInstaller = NewBackendPluginInstaller;
|
|
143
109
|
/**
|
|
144
110
|
* @public
|
|
145
111
|
*/
|
|
@@ -147,31 +113,6 @@ interface NewBackendPluginInstaller {
|
|
|
147
113
|
kind: 'new';
|
|
148
114
|
install(): BackendFeature | BackendFeature[];
|
|
149
115
|
}
|
|
150
|
-
/**
|
|
151
|
-
* @public
|
|
152
|
-
* @deprecated
|
|
153
|
-
*
|
|
154
|
-
* Support for the legacy backend system will be removed in the future.
|
|
155
|
-
*
|
|
156
|
-
* When adding a legacy plugin installer entrypoint in your plugin,
|
|
157
|
-
* you should always take the opportunity to also implement support
|
|
158
|
-
* for the new backend system if not already done.
|
|
159
|
-
*
|
|
160
|
-
*/
|
|
161
|
-
interface LegacyBackendPluginInstaller {
|
|
162
|
-
kind: 'legacy';
|
|
163
|
-
router?: {
|
|
164
|
-
pluginID: string;
|
|
165
|
-
createPlugin(env: LegacyPluginEnvironment): Promise<Router>;
|
|
166
|
-
};
|
|
167
|
-
catalog?(builder: CatalogBuilder, env: LegacyPluginEnvironment): void;
|
|
168
|
-
scaffolder?(env: LegacyPluginEnvironment): TemplateAction<any>[];
|
|
169
|
-
search?(indexBuilder: IndexBuilder, schedule: SchedulerServiceTaskRunner, env: LegacyPluginEnvironment): void;
|
|
170
|
-
events?(env: LegacyPluginEnvironment): HttpPostIngressOptions[];
|
|
171
|
-
permissions?: {
|
|
172
|
-
policy?: PermissionPolicy;
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
116
|
/**
|
|
176
117
|
* @public
|
|
177
118
|
*/
|
|
@@ -368,7 +309,7 @@ type AdditionalRemoteInfo = Omit<RemoteInfo, 'name' | 'entry'>;
|
|
|
368
309
|
* */
|
|
369
310
|
type FrontendRemoteResolver = {
|
|
370
311
|
/**
|
|
371
|
-
* Relative path to the module federation assets folder from
|
|
312
|
+
* Relative path to the module federation assets folder from the root folder of the plugin package.
|
|
372
313
|
* Default value is `dist`.
|
|
373
314
|
*/
|
|
374
315
|
assetsPathFromPackage?: string;
|
|
@@ -385,6 +326,11 @@ type FrontendRemoteResolver = {
|
|
|
385
326
|
/**
|
|
386
327
|
* Additional module federation fields, which might be required if the remote entry type is 'javascript'.
|
|
387
328
|
*/
|
|
329
|
+
getAdditionalRemoteInfo?: (manifestContent: JsonObject) => AdditionalRemoteInfo;
|
|
330
|
+
/**
|
|
331
|
+
* Additional module federation fields, which might be required if the remote entry type is 'javascript'.
|
|
332
|
+
* @deprecated Use `getAdditionalRemoteInfo` instead.
|
|
333
|
+
*/
|
|
388
334
|
getAdditionaRemoteInfo?: (manifestContent: JsonObject) => AdditionalRemoteInfo;
|
|
389
335
|
/**
|
|
390
336
|
* Overrides the list of exposed modules. By default the exposed modules are read from the manifest file.
|
|
@@ -418,4 +364,4 @@ interface DynamicPluginsFrontendRemotesService {
|
|
|
418
364
|
*/
|
|
419
365
|
declare const dynamicPluginsFrontendServiceRef: _backstage_backend_plugin_api.ServiceRef<DynamicPluginsFrontendRemotesService, "root", "singleton">;
|
|
420
366
|
|
|
421
|
-
export { type AdditionalRemoteInfo, type BackendDynamicPlugin, type BackendDynamicPluginInstaller, type BackendPluginProvider, type BaseDynamicPlugin, CommonJSModuleLoader, type CommonJSModuleLoaderOptions, type DynamicPlugin, DynamicPluginManager, type DynamicPluginManagerOptions, type DynamicPluginProvider, type DynamicPluginsFactoryOptions, type DynamicPluginsFeatureLoaderOptions, type DynamicPluginsFrontendRemotesService, type DynamicPluginsRootLoggerFactoryOptions, type DynamicPluginsSchemasOptions, type DynamicPluginsSchemasService, type FrontendDynamicPlugin, type FrontendPluginProvider, type FrontendRemoteResolver, type FrontendRemoteResolverProvider, type
|
|
367
|
+
export { type AdditionalRemoteInfo, type BackendDynamicPlugin, type BackendDynamicPluginInstaller, type BackendPluginProvider, type BaseDynamicPlugin, CommonJSModuleLoader, type CommonJSModuleLoaderOptions, type DynamicPlugin, DynamicPluginManager, type DynamicPluginManagerOptions, type DynamicPluginProvider, type DynamicPluginsFactoryOptions, type DynamicPluginsFeatureLoaderOptions, type DynamicPluginsFrontendRemotesService, type DynamicPluginsRootLoggerFactoryOptions, type DynamicPluginsSchemasOptions, type DynamicPluginsSchemasService, type FrontendDynamicPlugin, type FrontendPluginProvider, type FrontendRemoteResolver, type FrontendRemoteResolverProvider, type ModuleLoader, type NewBackendPluginInstaller, type RemoteInfo, type RemoteInfoTypeEnum, type ScannedPluginManifest, type ScannedPluginPackage, dynamicPluginsFeatureDiscoveryLoader, dynamicPluginsFeatureLoader, dynamicPluginsFrontendSchemas, dynamicPluginsFrontendServiceRef, dynamicPluginsRootLoggerServiceFactory, dynamicPluginsSchemasServiceFactory, dynamicPluginsServiceFactory, dynamicPluginsServiceFactoryWithOptions, dynamicPluginsServiceRef, isBackendDynamicPluginInstaller };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommonJSModuleLoader.cjs.js","sources":["../../src/loader/CommonJSModuleLoader.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 { ModuleLoader } from './types';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport path from 'path';\nimport { ScannedPluginManifest } from '../scanner';\n\n/**\n * @public\n */\nexport type CommonJSModuleLoaderOptions = {\n logger: LoggerService;\n dynamicPluginPackageNameSuffixes?: String[];\n customResolveDynamicPackage?: (\n logger: LoggerService,\n searchedPackageName: string,\n scannedPluginManifests: Map<string, ScannedPluginManifest>,\n ) => string | undefined;\n};\n\n/**\n * @public\n */\nexport class CommonJSModuleLoader implements ModuleLoader {\n private module: any;\n\n constructor(public readonly options: CommonJSModuleLoaderOptions) {\n this.module = require('node:module');\n }\n\n async bootstrap(\n backstageRoot: string,\n dynamicPluginsPaths: string[],\n scannedPluginManifests: Map<string, ScannedPluginManifest>,\n ): Promise<void> {\n const backstageRootNodeModulesPath = `${backstageRoot}/node_modules`;\n const dynamicNodeModulesPaths = [\n ...dynamicPluginsPaths.map(p => path.resolve(p, 'node_modules')),\n ];\n const oldNodeModulePaths = this.module._nodeModulePaths;\n this.module._nodeModulePaths = (from: string): string[] => {\n const result: string[] = oldNodeModulePaths(from);\n if (!dynamicPluginsPaths.some(p => from.startsWith(p))) {\n return result;\n }\n const filtered = result.filter(nodeModulePath => {\n return (\n nodeModulePath === backstageRootNodeModulesPath ||\n dynamicNodeModulesPaths.some(p => nodeModulePath.startsWith(p))\n );\n });\n this.options.logger.debug(\n `Overriding node_modules search path for dynamic plugin ${from} to: ${filtered}`,\n );\n return filtered;\n };\n\n // The whole piece of code below is a way to
|
|
1
|
+
{"version":3,"file":"CommonJSModuleLoader.cjs.js","sources":["../../src/loader/CommonJSModuleLoader.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 { ModuleLoader } from './types';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport path from 'path';\nimport { ScannedPluginManifest } from '../scanner';\n\n/**\n * @public\n */\nexport type CommonJSModuleLoaderOptions = {\n logger: LoggerService;\n dynamicPluginPackageNameSuffixes?: String[];\n customResolveDynamicPackage?: (\n logger: LoggerService,\n searchedPackageName: string,\n scannedPluginManifests: Map<string, ScannedPluginManifest>,\n ) => string | undefined;\n};\n\n/**\n * @public\n */\nexport class CommonJSModuleLoader implements ModuleLoader {\n private module: any;\n\n constructor(public readonly options: CommonJSModuleLoaderOptions) {\n this.module = require('node:module');\n }\n\n async bootstrap(\n backstageRoot: string,\n dynamicPluginsPaths: string[],\n scannedPluginManifests: Map<string, ScannedPluginManifest>,\n ): Promise<void> {\n const backstageRootNodeModulesPath = `${backstageRoot}/node_modules`;\n const dynamicNodeModulesPaths = [\n ...dynamicPluginsPaths.map(p => path.resolve(p, 'node_modules')),\n ];\n const oldNodeModulePaths = this.module._nodeModulePaths;\n this.module._nodeModulePaths = (from: string): string[] => {\n const result: string[] = oldNodeModulePaths(from);\n if (!dynamicPluginsPaths.some(p => from.startsWith(p))) {\n return result;\n }\n const filtered = result.filter(nodeModulePath => {\n return (\n nodeModulePath === backstageRootNodeModulesPath ||\n dynamicNodeModulesPaths.some(p => nodeModulePath.startsWith(p))\n );\n });\n this.options.logger.debug(\n `Overriding node_modules search path for dynamic plugin ${from} to: ${filtered}`,\n );\n return filtered;\n };\n\n // The whole piece of code below is a way to accommodate the limitations of\n // the current `resolvePackagePath` implementation, which cannot be provided\n // some custom locations where it should find the assets of some given packages.\n //\n // Since the packages for dynamic plugins are not located in the main backstage\n // monorepo structure, and since dynamic plugins could also be repackaged\n // (typically renamed with a `-dynamic` suffix), for now we have to customize\n // module file name resolution here to support these use-cases.\n //\n // This might not be necessary anymore according to future enhancements to the\n // `resolvePackagePath` feature.\n const oldResolveFileName = this.module._resolveFilename;\n this.module._resolveFilename = (\n request: string,\n mod: NodeModule,\n _: boolean,\n options: any,\n ): any => {\n let errorToThrow: any;\n try {\n return oldResolveFileName(request, mod, _, options);\n } catch (e) {\n errorToThrow = e;\n this.options.logger.debug(\n `Could not resolve '${request}' inside the Core backstage backend application`,\n e instanceof Error ? e : undefined,\n );\n }\n\n // Are we trying to resolve a `package.json` from an originating module of the core backstage application\n // (this is mostly done by calling `@backstage/backend-plugin-api/resolvePackagePath`).\n const resolvingPackageJsonFromBackstageApplication =\n request?.endsWith('/package.json') &&\n mod?.path &&\n !dynamicPluginsPaths.some(p => mod.path.startsWith(p));\n\n // If not, we don't need the dedicated specific case below.\n if (!resolvingPackageJsonFromBackstageApplication) {\n throw errorToThrow;\n }\n\n this.options.logger.info(\n `Resolving '${request}' in the dynamic backend plugins`,\n );\n const searchedPackageName = request.replace(/\\/package.json$/, '');\n\n // First search for a dynamic plugin package matching the expected package name,\n // taking in account accepted dynamic plugin package name suffixes\n // (suffix accepted by default is '-dynamic').\n const searchedPackageNamesWithSuffixes = (\n this.options.dynamicPluginPackageNameSuffixes ?? ['-dynamic']\n ).map(s => `${searchedPackageName}${s}`);\n for (const [realPath, pkg] of scannedPluginManifests.entries()) {\n if (\n [searchedPackageName, ...searchedPackageNamesWithSuffixes].includes(\n pkg.name,\n )\n ) {\n const resolvedPath = path.resolve(realPath, 'package.json');\n this.options.logger.info(`Resolved '${request}' at ${resolvedPath}`);\n return resolvedPath;\n }\n }\n\n // If a custom resolution is provided, use it.\n // This allows accommodating alternate ways to package dynamic plugins:\n // static plugin package wrapped inside a distinct dynamic plugin package for example.\n if (this.options.customResolveDynamicPackage) {\n const resolvedPath = this.options.customResolveDynamicPackage(\n this.options.logger,\n searchedPackageName,\n scannedPluginManifests,\n );\n if (resolvedPath) {\n return resolvedPath;\n }\n }\n throw errorToThrow;\n };\n }\n\n async load(packagePath: string): Promise<any> {\n return await this.module.prototype.require(packagePath);\n }\n}\n"],"names":["path"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs.js","sources":["../../src/manager/types.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 */\n\nimport {
|
|
1
|
+
{"version":3,"file":"types.cjs.js","sources":["../../src/manager/types.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 */\n\nimport { BackendFeature } from '@backstage/backend-plugin-api';\nimport { PackagePlatform, PackageRole } from '@backstage/cli-node';\nimport { ScannedPluginPackage } from '../scanner';\n\n/**\n * @public\n */\nexport interface DynamicPluginProvider\n extends FrontendPluginProvider,\n BackendPluginProvider {\n plugins(options?: { includeFailed?: boolean }): DynamicPlugin[];\n getScannedPackage(plugin: DynamicPlugin): ScannedPluginPackage;\n}\n\n/**\n * @public\n */\nexport interface BackendPluginProvider {\n backendPlugins(options?: { includeFailed?: boolean }): BackendDynamicPlugin[];\n}\n\n/**\n * @public\n */\nexport interface FrontendPluginProvider {\n frontendPlugins(options?: {\n includeFailed?: boolean;\n }): FrontendDynamicPlugin[];\n}\n\n/**\n * @public\n */\nexport interface BaseDynamicPlugin {\n name: string;\n version: string;\n role: PackageRole;\n platform: PackagePlatform;\n failure?: string;\n}\n\n/**\n * @public\n */\nexport type DynamicPlugin = FrontendDynamicPlugin | BackendDynamicPlugin;\n\n/**\n * @public\n */\nexport interface FrontendDynamicPlugin extends BaseDynamicPlugin {\n platform: 'web';\n}\n\n/**\n * @public\n */\nexport interface BackendDynamicPlugin extends BaseDynamicPlugin {\n platform: 'node';\n installer?: BackendDynamicPluginInstaller;\n}\n\n/**\n * @public\n */\nexport type BackendDynamicPluginInstaller = NewBackendPluginInstaller;\n\n/**\n * @public\n */\nexport interface NewBackendPluginInstaller {\n kind: 'new';\n\n install(): BackendFeature | BackendFeature[];\n}\n\n/**\n * @public\n */\nexport function isBackendDynamicPluginInstaller(\n obj: any,\n): obj is BackendDynamicPluginInstaller {\n return (\n obj !== undefined &&\n 'kind' in obj &&\n (obj.kind === 'new' || obj.kind === 'legacy')\n );\n}\n"],"names":[],"mappings":";;AA8FO,SAAS,gCACd,GACsC,EAAA;AACtC,EACE,OAAA,GAAA,KAAQ,UACR,MAAU,IAAA,GAAA,KACT,IAAI,IAAS,KAAA,KAAA,IAAS,IAAI,IAAS,KAAA,QAAA,CAAA;AAExC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontendRemotesServer.cjs.js","sources":["../../src/server/frontendRemotesServer.ts"],"sourcesContent":["/*\n * Copyright 2024 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 {\n coreServices,\n createServiceFactory,\n createServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './router';\nimport { dynamicPluginsServiceRef } from '@backstage/backend-dynamic-feature-service';\nimport { spec } from '../schema/openapi';\nimport { ManifestFileName } from '@module-federation/sdk';\nimport { RemoteInfo } from '../schema/openapi/generated/models';\nimport { JsonObject } from '@backstage/types';\n\n/**\n *\n * @public\n * */\nexport type AdditionalRemoteInfo = Omit<RemoteInfo, 'name' | 'entry'>;\n\n/**\n *\n * @public\n * */\nexport type FrontendRemoteResolver = {\n /**\n * Relative path to the module federation assets folder from
|
|
1
|
+
{"version":3,"file":"frontendRemotesServer.cjs.js","sources":["../../src/server/frontendRemotesServer.ts"],"sourcesContent":["/*\n * Copyright 2024 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 {\n coreServices,\n createServiceFactory,\n createServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './router';\nimport { dynamicPluginsServiceRef } from '@backstage/backend-dynamic-feature-service';\nimport { spec } from '../schema/openapi';\nimport { ManifestFileName } from '@module-federation/sdk';\nimport { RemoteInfo } from '../schema/openapi/generated/models';\nimport { JsonObject } from '@backstage/types';\n\n/**\n *\n * @public\n * */\nexport type AdditionalRemoteInfo = Omit<RemoteInfo, 'name' | 'entry'>;\n\n/**\n *\n * @public\n * */\nexport type FrontendRemoteResolver = {\n /**\n * Relative path to the module federation assets folder from the root folder of the plugin package.\n * Default value is `dist`.\n */\n assetsPathFromPackage?: string;\n\n /**\n * File name of the module federation manifest inside the module federation assets folder.\n * Default value is `mf-manifest.json`.\n */\n manifestFileName?: string;\n\n /**\n * Type of the remote entry returned in the RemoteInfo for this remote.\n * Default value is `manifest`.\n */\n getRemoteEntryType?: (\n manifestContent: JsonObject,\n ) => 'manifest' | 'javascript';\n\n /**\n * Additional module federation fields, which might be required if the remote entry type is 'javascript'.\n */\n getAdditionalRemoteInfo?: (\n manifestContent: JsonObject,\n ) => AdditionalRemoteInfo;\n\n /**\n * Additional module federation fields, which might be required if the remote entry type is 'javascript'.\n * @deprecated Use `getAdditionalRemoteInfo` instead.\n */\n getAdditionaRemoteInfo?: (\n manifestContent: JsonObject,\n ) => AdditionalRemoteInfo;\n\n /**\n * Overrides the list of exposed modules. By default the exposed modules are read from the manifest file.\n */\n overrideExposedModules?: (\n exposedModules: string[],\n manifestContent: JsonObject,\n ) => string[];\n\n /**\n * Customizes the manifest before returning it as the remote entry.\n */\n customizeManifest?: (content: JsonObject) => JsonObject;\n};\n\n/**\n *\n * @public\n * */\nexport type FrontendRemoteResolverProvider = {\n for(\n pluginName: string,\n pluginPackagePath: string,\n ): Partial<FrontendRemoteResolver> | undefined;\n};\n\n/**\n *\n * @public\n * */\nexport interface DynamicPluginsFrontendRemotesService {\n setResolverProvider(provider: FrontendRemoteResolverProvider): void;\n}\n\n/**\n * A service that serves the frontend module federation remotes,\n * and allows a plugin to customize the way remotes are served,\n * by setting a ResolverProvider.\n *\n * @public\n */\nexport const dynamicPluginsFrontendServiceRef =\n createServiceRef<DynamicPluginsFrontendRemotesService>({\n id: 'core.dynamicplugins.frontendRemotes',\n scope: 'root',\n });\n\nexport type FrontendRemoteResolvers = {\n default: FrontendRemoteResolver &\n Required<\n Pick<\n FrontendRemoteResolver,\n 'assetsPathFromPackage' | 'manifestFileName' | 'getRemoteEntryType'\n >\n >;\n provider?: FrontendRemoteResolverProvider;\n};\n\nexport const frontendRemotesServerService = createServiceFactory({\n service: dynamicPluginsFrontendServiceRef,\n deps: {\n logger: coreServices.rootLogger,\n rootHttpRouter: coreServices.rootHttpRouter,\n config: coreServices.rootConfig,\n dynamicPlugins: dynamicPluginsServiceRef,\n lifecycle: coreServices.rootLifecycle,\n },\n async factory({ logger, rootHttpRouter, config, dynamicPlugins, lifecycle }) {\n const resolvers: FrontendRemoteResolvers = {\n default: {\n assetsPathFromPackage: 'dist',\n manifestFileName: ManifestFileName,\n getRemoteEntryType: () => 'manifest',\n },\n provider: undefined,\n };\n\n lifecycle.addStartupHook(async () => {\n rootHttpRouter.use(\n `/${spec.info.title}`,\n await createRouter({\n logger,\n config,\n dynamicPlugins,\n resolvers,\n }),\n );\n });\n\n return {\n setResolverProvider(resolver) {\n logger.info('Setting resolver provider');\n if (resolvers.provider) {\n throw new Error(\n 'Attempted to install a frontend remote resolver provider twice',\n );\n }\n resolvers.provider = resolver;\n },\n };\n },\n});\n"],"names":["createServiceRef","createServiceFactory","coreServices","dynamicPluginsServiceRef","ManifestFileName","spec","createRouter"],"mappings":";;;;;;;;AAiHO,MAAM,mCACXA,iCAAuD,CAAA;AAAA,EACrD,EAAI,EAAA,qCAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAC;AAaI,MAAM,+BAA+BC,qCAAqB,CAAA;AAAA,EAC/D,OAAS,EAAA,gCAAA;AAAA,EACT,IAAM,EAAA;AAAA,IACJ,QAAQC,6BAAa,CAAA,UAAA;AAAA,IACrB,gBAAgBA,6BAAa,CAAA,cAAA;AAAA,IAC7B,QAAQA,6BAAa,CAAA,UAAA;AAAA,IACrB,cAAgB,EAAAC,qDAAA;AAAA,IAChB,WAAWD,6BAAa,CAAA;AAAA,GAC1B;AAAA,EACA,MAAM,QAAQ,EAAE,MAAA,EAAQ,gBAAgB,MAAQ,EAAA,cAAA,EAAgB,WAAa,EAAA;AAC3E,IAAA,MAAM,SAAqC,GAAA;AAAA,MACzC,OAAS,EAAA;AAAA,QACP,qBAAuB,EAAA,MAAA;AAAA,QACvB,gBAAkB,EAAAE,oBAAA;AAAA,QAClB,oBAAoB,MAAM;AAAA,OAC5B;AAAA,MACA,QAAU,EAAA,KAAA;AAAA,KACZ;AAEA,IAAA,SAAA,CAAU,eAAe,YAAY;AACnC,MAAe,cAAA,CAAA,GAAA;AAAA,QACb,CAAA,CAAA,EAAIC,WAAK,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,QACnB,MAAMC,qBAAa,CAAA;AAAA,UACjB,MAAA;AAAA,UACA,MAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACD;AAAA,OACH;AAAA,KACD,CAAA;AAED,IAAO,OAAA;AAAA,MACL,oBAAoB,QAAU,EAAA;AAC5B,QAAA,MAAA,CAAO,KAAK,2BAA2B,CAAA;AACvC,QAAA,IAAI,UAAU,QAAU,EAAA;AACtB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA;AAEF,QAAA,SAAA,CAAU,QAAW,GAAA,QAAA;AAAA;AACvB,KACF;AAAA;AAEJ,CAAC;;;;;"}
|
|
@@ -92,7 +92,7 @@ async function createRouter({
|
|
|
92
92
|
);
|
|
93
93
|
continue;
|
|
94
94
|
}
|
|
95
|
-
const getAdditionalRemoteInfo = providedResolver?.getAdditionaRemoteInfo ?? defaultResolver.getAdditionaRemoteInfo;
|
|
95
|
+
const getAdditionalRemoteInfo = providedResolver?.getAdditionalRemoteInfo ?? providedResolver?.getAdditionaRemoteInfo ?? defaultResolver.getAdditionalRemoteInfo ?? defaultResolver?.getAdditionaRemoteInfo;
|
|
96
96
|
const getRemoteEntryType = providedResolver?.getRemoteEntryType ?? defaultResolver.getRemoteEntryType;
|
|
97
97
|
const remoteEntryType = getRemoteEntryType(manifest);
|
|
98
98
|
let remoteEntryAsset = manifestFileName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.cjs.js","sources":["../../src/server/router.ts"],"sourcesContent":["/*\n * Copyright 2024 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 */\n\nimport {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport express from 'express';\nimport { createOpenApiRouter, spec } from '../schema/openapi';\nimport { DynamicPluginProvider } from '@backstage/backend-dynamic-feature-service';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { FrontendRemoteResolvers } from './frontendRemotesServer';\nimport { Remote } from '../schema/openapi/generated/models';\nimport { JsonObject } from '@backstage/types';\n\nexport async function createRouter({\n logger,\n config,\n dynamicPlugins,\n resolvers,\n}: {\n logger: LoggerService;\n config: RootConfigService;\n dynamicPlugins: DynamicPluginProvider;\n resolvers: FrontendRemoteResolvers;\n}): Promise<express.Router> {\n const externalBaseUrl = `${config.getString('backend.baseUrl')}/${\n spec.info.title\n }`;\n\n const typedRouter = await createOpenApiRouter();\n\n const frontendPluginRemotes: Remote[] = [];\n\n const { default: defaultResolver, provider: resolverProvider } = resolvers;\n for (const plugin of dynamicPlugins.frontendPlugins()) {\n try {\n const pluginScannedPackage = dynamicPlugins.getScannedPackage(plugin);\n const pluginScannedPackagePath = path.resolve(\n url.fileURLToPath(pluginScannedPackage.location),\n );\n const providedResolver = resolverProvider?.for(\n plugin.name,\n pluginScannedPackagePath,\n );\n\n const assetsPath = path.resolve(\n pluginScannedPackagePath,\n providedResolver?.assetsPathFromPackage ??\n defaultResolver.assetsPathFromPackage,\n );\n\n const manifestFileName =\n providedResolver?.manifestFileName ?? defaultResolver.manifestFileName;\n const manifestLocation = path.resolve(assetsPath, manifestFileName);\n if (!fs.existsSync(manifestLocation)) {\n logger.error(\n `Could not find manifest '${manifestLocation}' for frontend plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n let manifest: JsonObject;\n try {\n manifest = JSON.parse(fs.readFileSync(manifestLocation).toString());\n } catch (error) {\n logger.error(\n `Dynamic frontend plugin manifest '${manifestLocation}' could not be parsed for plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n if (!manifest.name || typeof manifest.name !== 'string') {\n logger.error(\n `Error in manifest '${manifestLocation}' for plugin ${plugin.name}@${plugin.version}: module name not found`,\n );\n continue;\n }\n if (\n !manifest.metaData ||\n typeof manifest.metaData !== 'object' ||\n !('remoteEntry' in manifest.metaData) ||\n !manifest.metaData.remoteEntry ||\n typeof manifest.metaData.remoteEntry !== 'object' ||\n !('name' in manifest.metaData.remoteEntry) ||\n typeof manifest.metaData.remoteEntry.name !== 'string'\n ) {\n logger.error(\n `Could not find remote entry asset in the manifest '${manifestLocation}' for plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n if (\n !manifest.exposes ||\n !Array.isArray(manifest.exposes) ||\n !manifest.exposes.every<{ name: string }>(\n (i): i is { name: string } =>\n i !== null && typeof i === 'object' && 'name' in i,\n )\n ) {\n logger.error(\n `Could not find the exposes field in the manifest '${manifestLocation}' for plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n const getAdditionalRemoteInfo =\n providedResolver?.getAdditionaRemoteInfo ??\n defaultResolver.getAdditionaRemoteInfo;\n const getRemoteEntryType =\n providedResolver?.getRemoteEntryType ??\n defaultResolver.getRemoteEntryType;\n const remoteEntryType = getRemoteEntryType(manifest);\n\n let remoteEntryAsset = manifestFileName;\n if (remoteEntryType === 'javascript') {\n remoteEntryAsset = manifest.metaData.remoteEntry.name;\n }\n\n const remoteEntryAssetLocation = path.resolve(\n assetsPath,\n remoteEntryAsset,\n );\n if (!fs.existsSync(remoteEntryAssetLocation)) {\n logger.error(\n `Could not find remote entry asset '${remoteEntryAssetLocation}' for frontend plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n const remoteAssetsPrefix = `/remotes/${plugin.name}`;\n const remoteEntryPath = `${remoteAssetsPrefix}/${remoteEntryAsset}`;\n\n const overrideExposedModules =\n providedResolver?.overrideExposedModules ??\n defaultResolver.overrideExposedModules;\n\n const exposedModules = manifest.exposes.map(e => e.name);\n\n frontendPluginRemotes.push({\n packageName: plugin.name,\n remoteInfo: {\n name: manifest.name,\n entry: `${externalBaseUrl}${remoteEntryPath}`,\n ...getAdditionalRemoteInfo?.(manifest),\n },\n exposedModules:\n overrideExposedModules?.(exposedModules, manifest) ?? exposedModules,\n });\n\n const customizeManifest =\n providedResolver?.customizeManifest ??\n defaultResolver.customizeManifest;\n if (remoteEntryType === 'manifest' && customizeManifest) {\n const customizedContent = customizeManifest(manifest);\n typedRouter.use(`${remoteEntryPath}`, (_, res) => {\n res.json(customizedContent);\n });\n }\n typedRouter.use(remoteAssetsPrefix, express.static(assetsPath));\n logger.info(\n `Exposed dynamic frontend plugin '${plugin.name}' from '${assetsPath}' `,\n );\n } catch (error) {\n logger.error(\n `Unexpected error when exposing dynamic frontend plugin '${plugin.name}@${plugin.version}'`,\n error,\n );\n continue;\n }\n }\n\n logger.info(`/remotes => ${JSON.stringify(frontendPluginRemotes)}`);\n typedRouter.get('/remotes', (_, res) => {\n res.status(200).json(frontendPluginRemotes);\n });\n\n return typedRouter;\n}\n"],"names":["spec","createOpenApiRouter","path","url","fs","express"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.cjs.js","sources":["../../src/server/router.ts"],"sourcesContent":["/*\n * Copyright 2024 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 */\n\nimport {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport express from 'express';\nimport { createOpenApiRouter, spec } from '../schema/openapi';\nimport { DynamicPluginProvider } from '@backstage/backend-dynamic-feature-service';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { FrontendRemoteResolvers } from './frontendRemotesServer';\nimport { Remote } from '../schema/openapi/generated/models';\nimport { JsonObject } from '@backstage/types';\n\nexport async function createRouter({\n logger,\n config,\n dynamicPlugins,\n resolvers,\n}: {\n logger: LoggerService;\n config: RootConfigService;\n dynamicPlugins: DynamicPluginProvider;\n resolvers: FrontendRemoteResolvers;\n}): Promise<express.Router> {\n const externalBaseUrl = `${config.getString('backend.baseUrl')}/${\n spec.info.title\n }`;\n\n const typedRouter = await createOpenApiRouter();\n\n const frontendPluginRemotes: Remote[] = [];\n\n const { default: defaultResolver, provider: resolverProvider } = resolvers;\n for (const plugin of dynamicPlugins.frontendPlugins()) {\n try {\n const pluginScannedPackage = dynamicPlugins.getScannedPackage(plugin);\n const pluginScannedPackagePath = path.resolve(\n url.fileURLToPath(pluginScannedPackage.location),\n );\n const providedResolver = resolverProvider?.for(\n plugin.name,\n pluginScannedPackagePath,\n );\n\n const assetsPath = path.resolve(\n pluginScannedPackagePath,\n providedResolver?.assetsPathFromPackage ??\n defaultResolver.assetsPathFromPackage,\n );\n\n const manifestFileName =\n providedResolver?.manifestFileName ?? defaultResolver.manifestFileName;\n const manifestLocation = path.resolve(assetsPath, manifestFileName);\n if (!fs.existsSync(manifestLocation)) {\n logger.error(\n `Could not find manifest '${manifestLocation}' for frontend plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n let manifest: JsonObject;\n try {\n manifest = JSON.parse(fs.readFileSync(manifestLocation).toString());\n } catch (error) {\n logger.error(\n `Dynamic frontend plugin manifest '${manifestLocation}' could not be parsed for plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n if (!manifest.name || typeof manifest.name !== 'string') {\n logger.error(\n `Error in manifest '${manifestLocation}' for plugin ${plugin.name}@${plugin.version}: module name not found`,\n );\n continue;\n }\n if (\n !manifest.metaData ||\n typeof manifest.metaData !== 'object' ||\n !('remoteEntry' in manifest.metaData) ||\n !manifest.metaData.remoteEntry ||\n typeof manifest.metaData.remoteEntry !== 'object' ||\n !('name' in manifest.metaData.remoteEntry) ||\n typeof manifest.metaData.remoteEntry.name !== 'string'\n ) {\n logger.error(\n `Could not find remote entry asset in the manifest '${manifestLocation}' for plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n if (\n !manifest.exposes ||\n !Array.isArray(manifest.exposes) ||\n !manifest.exposes.every<{ name: string }>(\n (i): i is { name: string } =>\n i !== null && typeof i === 'object' && 'name' in i,\n )\n ) {\n logger.error(\n `Could not find the exposes field in the manifest '${manifestLocation}' for plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n const getAdditionalRemoteInfo =\n providedResolver?.getAdditionalRemoteInfo ??\n providedResolver?.getAdditionaRemoteInfo ??\n defaultResolver.getAdditionalRemoteInfo ??\n defaultResolver?.getAdditionaRemoteInfo;\n const getRemoteEntryType =\n providedResolver?.getRemoteEntryType ??\n defaultResolver.getRemoteEntryType;\n const remoteEntryType = getRemoteEntryType(manifest);\n\n let remoteEntryAsset = manifestFileName;\n if (remoteEntryType === 'javascript') {\n remoteEntryAsset = manifest.metaData.remoteEntry.name;\n }\n\n const remoteEntryAssetLocation = path.resolve(\n assetsPath,\n remoteEntryAsset,\n );\n if (!fs.existsSync(remoteEntryAssetLocation)) {\n logger.error(\n `Could not find remote entry asset '${remoteEntryAssetLocation}' for frontend plugin ${plugin.name}@${plugin.version}`,\n );\n continue;\n }\n\n const remoteAssetsPrefix = `/remotes/${plugin.name}`;\n const remoteEntryPath = `${remoteAssetsPrefix}/${remoteEntryAsset}`;\n\n const overrideExposedModules =\n providedResolver?.overrideExposedModules ??\n defaultResolver.overrideExposedModules;\n\n const exposedModules = manifest.exposes.map(e => e.name);\n\n frontendPluginRemotes.push({\n packageName: plugin.name,\n remoteInfo: {\n name: manifest.name,\n entry: `${externalBaseUrl}${remoteEntryPath}`,\n ...getAdditionalRemoteInfo?.(manifest),\n },\n exposedModules:\n overrideExposedModules?.(exposedModules, manifest) ?? exposedModules,\n });\n\n const customizeManifest =\n providedResolver?.customizeManifest ??\n defaultResolver.customizeManifest;\n if (remoteEntryType === 'manifest' && customizeManifest) {\n const customizedContent = customizeManifest(manifest);\n typedRouter.use(`${remoteEntryPath}`, (_, res) => {\n res.json(customizedContent);\n });\n }\n typedRouter.use(remoteAssetsPrefix, express.static(assetsPath));\n logger.info(\n `Exposed dynamic frontend plugin '${plugin.name}' from '${assetsPath}' `,\n );\n } catch (error) {\n logger.error(\n `Unexpected error when exposing dynamic frontend plugin '${plugin.name}@${plugin.version}'`,\n error,\n );\n continue;\n }\n }\n\n logger.info(`/remotes => ${JSON.stringify(frontendPluginRemotes)}`);\n typedRouter.get('/remotes', (_, res) => {\n res.status(200).json(frontendPluginRemotes);\n });\n\n return typedRouter;\n}\n"],"names":["spec","createOpenApiRouter","path","url","fs","express"],"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.7.0-next.1",
|
|
4
4
|
"description": "Backstage dynamic feature service",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library"
|
|
@@ -52,28 +52,27 @@
|
|
|
52
52
|
"test": "backstage-cli package test"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@backstage/backend-defaults": "
|
|
56
|
-
"@backstage/backend-openapi-utils": "
|
|
57
|
-
"@backstage/backend-plugin-api": "
|
|
58
|
-
"@backstage/cli-common": "
|
|
59
|
-
"@backstage/cli-node": "
|
|
60
|
-
"@backstage/config": "
|
|
61
|
-
"@backstage/config-loader": "
|
|
62
|
-
"@backstage/errors": "
|
|
63
|
-
"@backstage/plugin-app-node": "
|
|
64
|
-
"@backstage/plugin-auth-node": "
|
|
65
|
-
"@backstage/plugin-catalog-backend": "
|
|
66
|
-
"@backstage/plugin-events-backend": "
|
|
67
|
-
"@backstage/plugin-events-node": "
|
|
68
|
-
"@backstage/plugin-permission-common": "
|
|
69
|
-
"@backstage/plugin-permission-node": "
|
|
70
|
-
"@backstage/plugin-scaffolder-node": "
|
|
71
|
-
"@backstage/plugin-search-backend-node": "
|
|
72
|
-
"@backstage/plugin-search-common": "
|
|
73
|
-
"@backstage/types": "
|
|
55
|
+
"@backstage/backend-defaults": "0.10.0-next.1",
|
|
56
|
+
"@backstage/backend-openapi-utils": "0.5.3-next.1",
|
|
57
|
+
"@backstage/backend-plugin-api": "1.3.1-next.1",
|
|
58
|
+
"@backstage/cli-common": "0.1.15",
|
|
59
|
+
"@backstage/cli-node": "0.2.13",
|
|
60
|
+
"@backstage/config": "1.3.2",
|
|
61
|
+
"@backstage/config-loader": "1.10.1-next.0",
|
|
62
|
+
"@backstage/errors": "1.2.7",
|
|
63
|
+
"@backstage/plugin-app-node": "0.1.33-next.1",
|
|
64
|
+
"@backstage/plugin-auth-node": "0.6.3-next.1",
|
|
65
|
+
"@backstage/plugin-catalog-backend": "2.0.0-next.1",
|
|
66
|
+
"@backstage/plugin-events-backend": "0.5.2-next.1",
|
|
67
|
+
"@backstage/plugin-events-node": "0.4.11-next.1",
|
|
68
|
+
"@backstage/plugin-permission-common": "0.9.0-next.0",
|
|
69
|
+
"@backstage/plugin-permission-node": "0.10.0-next.1",
|
|
70
|
+
"@backstage/plugin-scaffolder-node": "0.8.2-next.1",
|
|
71
|
+
"@backstage/plugin-search-backend-node": "1.3.11-next.1",
|
|
72
|
+
"@backstage/plugin-search-common": "1.2.18-next.0",
|
|
73
|
+
"@backstage/types": "1.2.1",
|
|
74
74
|
"@manypkg/get-packages": "^1.1.3",
|
|
75
75
|
"@module-federation/sdk": "^0.9.0",
|
|
76
|
-
"@types/express": "^4.17.6",
|
|
77
76
|
"chokidar": "^3.5.3",
|
|
78
77
|
"express": "^4.17.1",
|
|
79
78
|
"express-promise-router": "^4.1.0",
|
|
@@ -82,11 +81,12 @@
|
|
|
82
81
|
"winston": "^3.2.1"
|
|
83
82
|
},
|
|
84
83
|
"devDependencies": {
|
|
85
|
-
"@backstage/backend-app-api": "
|
|
86
|
-
"@backstage/backend-test-utils": "
|
|
87
|
-
"@backstage/cli": "
|
|
88
|
-
"@backstage/plugin-app-backend": "
|
|
89
|
-
"@backstage/repo-tools": "
|
|
84
|
+
"@backstage/backend-app-api": "1.2.3-next.1",
|
|
85
|
+
"@backstage/backend-test-utils": "1.5.0-next.1",
|
|
86
|
+
"@backstage/cli": "0.32.1-next.1",
|
|
87
|
+
"@backstage/plugin-app-backend": "0.5.2-next.1",
|
|
88
|
+
"@backstage/repo-tools": "0.13.3-next.1",
|
|
89
|
+
"@types/express": "^4.17.6",
|
|
90
90
|
"triple-beam": "^1.4.1",
|
|
91
91
|
"wait-for-expect": "^3.0.2"
|
|
92
92
|
},
|