@backstage/backend-dynamic-feature-service 0.4.2-next.1 → 0.4.2

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.
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var schemas = require('./schemas.cjs.js');
5
+ var pluginAppNode = require('@backstage/plugin-app-node');
6
+
7
+ const dynamicPluginsFrontendSchemas = backendPluginApi.createBackendModule({
8
+ pluginId: "app",
9
+ moduleId: "core.dynamicplugins.frontendSchemas",
10
+ register(reg) {
11
+ reg.registerInit({
12
+ deps: {
13
+ config: backendPluginApi.coreServices.rootConfig,
14
+ schemas: schemas.dynamicPluginsSchemasServiceRef,
15
+ configSchemaExtension: pluginAppNode.configSchemaExtensionPoint
16
+ },
17
+ async init({ config, schemas, configSchemaExtension }) {
18
+ const appPackageName = config.getOptionalString("app.packageName") ?? "app";
19
+ const appDistDir = backendPluginApi.resolvePackagePath(appPackageName, "dist");
20
+ const compiledConfigSchema = await pluginAppNode.loadCompiledConfigSchema(appDistDir);
21
+ if (compiledConfigSchema) {
22
+ configSchemaExtension.setConfigSchema(
23
+ (await schemas.addDynamicPluginsSchemas(compiledConfigSchema)).schema
24
+ );
25
+ }
26
+ }
27
+ });
28
+ }
29
+ });
30
+
31
+ exports.dynamicPluginsFrontendSchemas = dynamicPluginsFrontendSchemas;
32
+ //# sourceMappingURL=frontend.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.cjs.js","sources":["../../src/schemas/frontend.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 coreServices,\n createBackendModule,\n resolvePackagePath,\n} from '@backstage/backend-plugin-api';\nimport { dynamicPluginsSchemasServiceRef } from './schemas';\nimport {\n configSchemaExtensionPoint,\n loadCompiledConfigSchema,\n} from '@backstage/plugin-app-node';\n\n/**\n * @public\n * @deprecated Use {@link dynamicPluginsFeatureLoader} instead, which gathers all services and features required for dynamic plugins.\n */\nexport const dynamicPluginsFrontendSchemas = createBackendModule({\n pluginId: 'app',\n moduleId: 'core.dynamicplugins.frontendSchemas',\n register(reg) {\n reg.registerInit({\n deps: {\n config: coreServices.rootConfig,\n schemas: dynamicPluginsSchemasServiceRef,\n configSchemaExtension: configSchemaExtensionPoint,\n },\n async init({ config, schemas, configSchemaExtension }) {\n const appPackageName =\n config.getOptionalString('app.packageName') ?? 'app';\n const appDistDir = resolvePackagePath(appPackageName, 'dist');\n const compiledConfigSchema = await loadCompiledConfigSchema(appDistDir);\n // TODO(davidfestal): Add dynamic pliugin config schemas even if the compiled schemas are empty.\n if (compiledConfigSchema) {\n configSchemaExtension.setConfigSchema(\n (await schemas.addDynamicPluginsSchemas(compiledConfigSchema))\n .schema,\n );\n }\n },\n });\n },\n});\n"],"names":["createBackendModule","coreServices","dynamicPluginsSchemasServiceRef","configSchemaExtensionPoint","resolvePackagePath","loadCompiledConfigSchema"],"mappings":";;;;;;AA+BO,MAAM,gCAAgCA,oCAAoB,CAAA;AAAA,EAC/D,QAAU,EAAA,KAAA;AAAA,EACV,QAAU,EAAA,qCAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,OAAS,EAAAC,uCAAA;AAAA,QACT,qBAAuB,EAAAC,wCAAA;AAAA,OACzB;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,MAAQ,EAAA,OAAA,EAAS,uBAAyB,EAAA;AACrD,QAAA,MAAM,cACJ,GAAA,MAAA,CAAO,iBAAkB,CAAA,iBAAiB,CAAK,IAAA,KAAA,CAAA;AACjD,QAAM,MAAA,UAAA,GAAaC,mCAAmB,CAAA,cAAA,EAAgB,MAAM,CAAA,CAAA;AAC5D,QAAM,MAAA,oBAAA,GAAuB,MAAMC,sCAAA,CAAyB,UAAU,CAAA,CAAA;AAEtE,QAAA,IAAI,oBAAsB,EAAA;AACxB,UAAsB,qBAAA,CAAA,eAAA;AAAA,YAAA,CACnB,MAAM,OAAA,CAAQ,wBAAyB,CAAA,oBAAoB,CACzD,EAAA,MAAA;AAAA,WACL,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;"}
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var rootLogger = require('@backstage/backend-defaults/rootLogger');
5
+ var rootConfig = require('@backstage/backend-defaults/rootConfig');
6
+ var winston = require('winston');
7
+ var configLoader = require('@backstage/config-loader');
8
+ var getPackages = require('@manypkg/get-packages');
9
+ var schemas = require('./schemas.cjs.js');
10
+
11
+ const dynamicPluginsRootLoggerServiceFactoryWithOptions = (options) => backendPluginApi.createServiceFactory({
12
+ service: backendPluginApi.coreServices.rootLogger,
13
+ deps: {
14
+ config: backendPluginApi.coreServices.rootConfig,
15
+ schemas: schemas.dynamicPluginsSchemasServiceRef
16
+ },
17
+ async factory({ config, schemas }) {
18
+ const logger = rootLogger.WinstonLogger.create({
19
+ level: process.env.LOG_LEVEL || "info",
20
+ format: process.env.NODE_ENV === "production" ? winston.format.json() : rootLogger.WinstonLogger.colorFormat(),
21
+ transports: [new winston.transports.Console()],
22
+ ...options,
23
+ meta: {
24
+ service: "backstage"
25
+ }
26
+ });
27
+ const configSchema = await configLoader.loadConfigSchema({
28
+ dependencies: (await getPackages.getPackages(process.cwd())).packages.map((p) => p.packageJson.name)
29
+ });
30
+ const secretEnumerator = await rootConfig.createConfigSecretEnumerator({
31
+ logger,
32
+ schema: (await schemas.addDynamicPluginsSchemas(configSchema)).schema
33
+ });
34
+ logger.addRedactions(secretEnumerator(config));
35
+ config.subscribe?.(() => logger.addRedactions(secretEnumerator(config)));
36
+ return logger;
37
+ }
38
+ });
39
+ const dynamicPluginsRootLoggerServiceFactory = Object.assign(
40
+ dynamicPluginsRootLoggerServiceFactoryWithOptions,
41
+ dynamicPluginsRootLoggerServiceFactoryWithOptions()
42
+ );
43
+
44
+ exports.dynamicPluginsRootLoggerServiceFactory = dynamicPluginsRootLoggerServiceFactory;
45
+ //# sourceMappingURL=rootLogger.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootLogger.cjs.js","sources":["../../src/schemas/rootLogger.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 createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport {\n WinstonLogger,\n WinstonLoggerOptions,\n} from '@backstage/backend-defaults/rootLogger';\nimport { createConfigSecretEnumerator } from '@backstage/backend-defaults/rootConfig';\nimport { transports, format } from 'winston';\nimport { loadConfigSchema } from '@backstage/config-loader';\nimport { getPackages } from '@manypkg/get-packages';\nimport { dynamicPluginsSchemasServiceRef } from './schemas';\n\n/**\n * @public\n */\nexport type DynamicPluginsRootLoggerFactoryOptions = Omit<\n WinstonLoggerOptions,\n 'meta'\n>;\n\nconst dynamicPluginsRootLoggerServiceFactoryWithOptions = (\n options?: DynamicPluginsRootLoggerFactoryOptions,\n) =>\n createServiceFactory({\n service: coreServices.rootLogger,\n deps: {\n config: coreServices.rootConfig,\n schemas: dynamicPluginsSchemasServiceRef,\n },\n async factory({ config, schemas }) {\n const logger = WinstonLogger.create({\n level: process.env.LOG_LEVEL || 'info',\n format:\n process.env.NODE_ENV === 'production'\n ? format.json()\n : WinstonLogger.colorFormat(),\n transports: [new transports.Console()],\n ...options,\n meta: {\n service: 'backstage',\n },\n });\n\n const configSchema = await loadConfigSchema({\n dependencies: (\n await getPackages(process.cwd())\n ).packages.map(p => p.packageJson.name),\n });\n\n const secretEnumerator = await createConfigSecretEnumerator({\n logger,\n schema: (await schemas.addDynamicPluginsSchemas(configSchema)).schema,\n });\n logger.addRedactions(secretEnumerator(config));\n config.subscribe?.(() => logger.addRedactions(secretEnumerator(config)));\n\n return logger;\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 dynamicPluginsRootLoggerServiceFactory = Object.assign(\n dynamicPluginsRootLoggerServiceFactoryWithOptions,\n dynamicPluginsRootLoggerServiceFactoryWithOptions(),\n);\n"],"names":["createServiceFactory","coreServices","dynamicPluginsSchemasServiceRef","WinstonLogger","format","transports","loadConfigSchema","getPackages","createConfigSecretEnumerator"],"mappings":";;;;;;;;;;AAsCA,MAAM,iDAAA,GAAoD,CACxD,OAAA,KAEAA,qCAAqB,CAAA;AAAA,EACnB,SAASC,6BAAa,CAAA,UAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACJ,QAAQA,6BAAa,CAAA,UAAA;AAAA,IACrB,OAAS,EAAAC,uCAAA;AAAA,GACX;AAAA,EACA,MAAM,OAAA,CAAQ,EAAE,MAAA,EAAQ,SAAW,EAAA;AACjC,IAAM,MAAA,MAAA,GAASC,yBAAc,MAAO,CAAA;AAAA,MAClC,KAAA,EAAO,OAAQ,CAAA,GAAA,CAAI,SAAa,IAAA,MAAA;AAAA,MAChC,MAAA,EACE,QAAQ,GAAI,CAAA,QAAA,KAAa,eACrBC,cAAO,CAAA,IAAA,EACP,GAAAD,wBAAA,CAAc,WAAY,EAAA;AAAA,MAChC,UAAY,EAAA,CAAC,IAAIE,kBAAA,CAAW,SAAS,CAAA;AAAA,MACrC,GAAG,OAAA;AAAA,MACH,IAAM,EAAA;AAAA,QACJ,OAAS,EAAA,WAAA;AAAA,OACX;AAAA,KACD,CAAA,CAAA;AAED,IAAM,MAAA,YAAA,GAAe,MAAMC,6BAAiB,CAAA;AAAA,MAC1C,YACE,EAAA,CAAA,MAAMC,uBAAY,CAAA,OAAA,CAAQ,GAAI,EAAC,CAC/B,EAAA,QAAA,CAAS,GAAI,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,WAAA,CAAY,IAAI,CAAA;AAAA,KACvC,CAAA,CAAA;AAED,IAAM,MAAA,gBAAA,GAAmB,MAAMC,uCAA6B,CAAA;AAAA,MAC1D,MAAA;AAAA,MACA,MAAS,EAAA,CAAA,MAAM,OAAQ,CAAA,wBAAA,CAAyB,YAAY,CAAG,EAAA,MAAA;AAAA,KAChE,CAAA,CAAA;AACD,IAAO,MAAA,CAAA,aAAA,CAAc,gBAAiB,CAAA,MAAM,CAAC,CAAA,CAAA;AAC7C,IAAA,MAAA,CAAO,YAAY,MAAM,MAAA,CAAO,cAAc,gBAAiB,CAAA,MAAM,CAAC,CAAC,CAAA,CAAA;AAEvE,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AACF,CAAC,CAAA,CAAA;AAMI,MAAM,yCAAyC,MAAO,CAAA,MAAA;AAAA,EAC3D,iDAAA;AAAA,EACA,iDAAkD,EAAA;AACpD;;;;"}
@@ -0,0 +1,133 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var cliCommon = require('@backstage/cli-common');
5
+ var fs = require('fs-extra');
6
+ var path = require('path');
7
+ var url = require('url');
8
+ var lodash = require('lodash');
9
+ var pluginScanner = require('../scanner/plugin-scanner.cjs.js');
10
+ var configLoader = require('@backstage/config-loader');
11
+
12
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
+
14
+ function _interopNamespaceCompat(e) {
15
+ if (e && typeof e === 'object' && 'default' in e) return e;
16
+ var n = Object.create(null);
17
+ if (e) {
18
+ Object.keys(e).forEach(function (k) {
19
+ if (k !== 'default') {
20
+ var d = Object.getOwnPropertyDescriptor(e, k);
21
+ Object.defineProperty(n, k, d.get ? d : {
22
+ enumerable: true,
23
+ get: function () { return e[k]; }
24
+ });
25
+ }
26
+ });
27
+ }
28
+ n.default = e;
29
+ return Object.freeze(n);
30
+ }
31
+
32
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
33
+ var path__namespace = /*#__PURE__*/_interopNamespaceCompat(path);
34
+ var url__namespace = /*#__PURE__*/_interopNamespaceCompat(url);
35
+
36
+ const dynamicPluginsSchemasServiceRef = backendPluginApi.createServiceRef({
37
+ id: "core.dynamicplugins.schemas",
38
+ scope: "root"
39
+ });
40
+ const dynamicPluginsSchemasServiceFactoryWithOptions = (options) => backendPluginApi.createServiceFactory({
41
+ service: dynamicPluginsSchemasServiceRef,
42
+ deps: {
43
+ config: backendPluginApi.coreServices.rootConfig
44
+ },
45
+ factory({ config }) {
46
+ let additionalSchemas;
47
+ return {
48
+ async addDynamicPluginsSchemas(configSchema) {
49
+ if (!additionalSchemas) {
50
+ const logger = {
51
+ ...console,
52
+ child() {
53
+ return this;
54
+ }
55
+ };
56
+ const scanner = pluginScanner.PluginScanner.create({
57
+ config,
58
+ logger,
59
+ // eslint-disable-next-line no-restricted-syntax
60
+ backstageRoot: cliCommon.findPaths(__dirname).targetRoot,
61
+ preferAlpha: true
62
+ });
63
+ const { packages } = await scanner.scanRoot();
64
+ additionalSchemas = await gatherDynamicPluginsSchemas(
65
+ packages,
66
+ logger,
67
+ options?.schemaLocator
68
+ );
69
+ }
70
+ const serialized = configSchema.serialize();
71
+ if (serialized?.backstageConfigSchemaVersion !== 1) {
72
+ throw new Error(
73
+ "Serialized configuration schema is invalid or has an invalid version number"
74
+ );
75
+ }
76
+ const schemas = serialized.schemas;
77
+ schemas.push(
78
+ ...Object.keys(additionalSchemas).map((context) => {
79
+ return {
80
+ path: context,
81
+ value: additionalSchemas[context]
82
+ };
83
+ })
84
+ );
85
+ serialized.schemas = schemas;
86
+ return {
87
+ schema: await configLoader.loadConfigSchema({
88
+ serialized
89
+ })
90
+ };
91
+ }
92
+ };
93
+ }
94
+ });
95
+ const dynamicPluginsSchemasServiceFactory = Object.assign(
96
+ dynamicPluginsSchemasServiceFactoryWithOptions,
97
+ dynamicPluginsSchemasServiceFactoryWithOptions()
98
+ );
99
+ async function gatherDynamicPluginsSchemas(packages, logger, schemaLocator = () => path__namespace.join("dist", "configSchema.json")) {
100
+ const allSchemas = {};
101
+ for (const pluginPackage of packages) {
102
+ let schemaLocation = schemaLocator(pluginPackage);
103
+ if (!path__namespace.isAbsolute(schemaLocation)) {
104
+ let pluginLocation = url__namespace.fileURLToPath(pluginPackage.location);
105
+ if (path__namespace.basename(pluginLocation) === "alpha") {
106
+ pluginLocation = path__namespace.dirname(pluginLocation);
107
+ }
108
+ schemaLocation = path__namespace.resolve(pluginLocation, schemaLocation);
109
+ }
110
+ if (!await fs__default.default.pathExists(schemaLocation)) {
111
+ continue;
112
+ }
113
+ const serialized = await fs__default.default.readJson(schemaLocation);
114
+ if (!serialized) {
115
+ continue;
116
+ }
117
+ if (lodash.isEmpty(serialized)) {
118
+ continue;
119
+ }
120
+ if (!serialized?.$schema || serialized?.type !== "object") {
121
+ logger.error(
122
+ `Serialized configuration schema is invalid for plugin ${pluginPackage.manifest.name}`
123
+ );
124
+ continue;
125
+ }
126
+ allSchemas[schemaLocation] = serialized;
127
+ }
128
+ return allSchemas;
129
+ }
130
+
131
+ exports.dynamicPluginsSchemasServiceFactory = dynamicPluginsSchemasServiceFactory;
132
+ exports.dynamicPluginsSchemasServiceRef = dynamicPluginsSchemasServiceRef;
133
+ //# sourceMappingURL=schemas.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.cjs.js","sources":["../../src/schemas/schemas.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 { ScannedPluginPackage } from '../scanner/types';\nimport {\n coreServices,\n createServiceFactory,\n createServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { findPaths } from '@backstage/cli-common';\n\nimport fs from 'fs-extra';\nimport * as path from 'path';\nimport * as url from 'url';\nimport { isEmpty } from 'lodash';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport { PluginScanner } from '../scanner/plugin-scanner';\nimport { ConfigSchema, loadConfigSchema } from '@backstage/config-loader';\nimport { dynamicPluginsFeatureLoader } from '../features';\n\n/**\n *\n * @public\n * */\nexport interface DynamicPluginsSchemasService {\n addDynamicPluginsSchemas(configSchema: ConfigSchema): Promise<{\n schema: ConfigSchema;\n }>;\n}\n\n/**\n * A service that provides the config schemas of scanned dynamic plugins.\n *\n * @public\n */\nexport const dynamicPluginsSchemasServiceRef =\n createServiceRef<DynamicPluginsSchemasService>({\n id: 'core.dynamicplugins.schemas',\n scope: 'root',\n });\n\n/**\n * @public\n */\nexport interface DynamicPluginsSchemasOptions {\n /**\n * Function that returns the path to the Json schema file for a given scanned plugin package.\n * The path is either absolute, or relative to the plugin package root directory.\n *\n * Default behavior is to look for the `dist/configSchema.json` relative path.\n *\n * @param pluginPackage - The scanned plugin package.\n * @returns the absolute or plugin-relative path to the Json schema file.\n */\n schemaLocator?: (pluginPackage: ScannedPluginPackage) => string;\n}\n\nconst dynamicPluginsSchemasServiceFactoryWithOptions = (\n options?: DynamicPluginsSchemasOptions,\n) =>\n createServiceFactory({\n service: dynamicPluginsSchemasServiceRef,\n deps: {\n config: coreServices.rootConfig,\n },\n factory({ config }) {\n let additionalSchemas: { [context: string]: JsonObject } | undefined;\n\n return {\n async addDynamicPluginsSchemas(configSchema: ConfigSchema): Promise<{\n schema: ConfigSchema;\n }> {\n if (!additionalSchemas) {\n const logger = {\n ...console,\n child() {\n return this;\n },\n };\n\n const scanner = PluginScanner.create({\n config,\n logger,\n // eslint-disable-next-line no-restricted-syntax\n backstageRoot: findPaths(__dirname).targetRoot,\n preferAlpha: true,\n });\n\n const { packages } = await scanner.scanRoot();\n\n additionalSchemas = await gatherDynamicPluginsSchemas(\n packages,\n logger,\n options?.schemaLocator,\n );\n }\n\n const serialized = configSchema.serialize();\n if (serialized?.backstageConfigSchemaVersion !== 1) {\n throw new Error(\n 'Serialized configuration schema is invalid or has an invalid version number',\n );\n }\n const schemas = serialized.schemas as {\n value: JsonObject;\n path: string;\n }[];\n\n schemas.push(\n ...Object.keys(additionalSchemas).map(context => {\n return {\n path: context,\n value: additionalSchemas![context],\n };\n }),\n );\n serialized.schemas = schemas;\n return {\n schema: await loadConfigSchema({\n serialized,\n }),\n };\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 dynamicPluginsSchemasServiceFactory = Object.assign(\n dynamicPluginsSchemasServiceFactoryWithOptions,\n dynamicPluginsSchemasServiceFactoryWithOptions(),\n);\n\n/** @internal */\nasync function gatherDynamicPluginsSchemas(\n packages: ScannedPluginPackage[],\n logger: LoggerService,\n schemaLocator: (pluginPackage: ScannedPluginPackage) => string = () =>\n path.join('dist', 'configSchema.json'),\n): Promise<{ [context: string]: JsonObject }> {\n const allSchemas: { [context: string]: JsonObject } = {};\n\n for (const pluginPackage of packages) {\n let schemaLocation = schemaLocator(pluginPackage);\n\n if (!path.isAbsolute(schemaLocation)) {\n let pluginLocation = url.fileURLToPath(pluginPackage.location);\n if (path.basename(pluginLocation) === 'alpha') {\n pluginLocation = path.dirname(pluginLocation);\n }\n schemaLocation = path.resolve(pluginLocation, schemaLocation);\n }\n\n if (!(await fs.pathExists(schemaLocation))) {\n continue;\n }\n\n const serialized = await fs.readJson(schemaLocation);\n if (!serialized) {\n continue;\n }\n\n if (isEmpty(serialized)) {\n continue;\n }\n\n if (!serialized?.$schema || serialized?.type !== 'object') {\n logger.error(\n `Serialized configuration schema is invalid for plugin ${pluginPackage.manifest.name}`,\n );\n continue;\n }\n\n allSchemas[schemaLocation] = serialized;\n }\n\n return allSchemas;\n}\n"],"names":["createServiceRef","createServiceFactory","coreServices","PluginScanner","findPaths","loadConfigSchema","path","url","fs","isEmpty"],"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.4.2-next.1",
3
+ "version": "0.4.2",
4
4
  "description": "Backstage dynamic feature service",
5
5
  "backstage": {
6
6
  "role": "node-library"
@@ -42,26 +42,26 @@
42
42
  "test": "backstage-cli package test"
43
43
  },
44
44
  "dependencies": {
45
- "@backstage/backend-app-api": "1.0.1-next.0",
45
+ "@backstage/backend-app-api": "^1.0.1",
46
46
  "@backstage/backend-common": "^0.25.0",
47
- "@backstage/backend-defaults": "0.5.1-next.1",
48
- "@backstage/backend-plugin-api": "1.0.1-next.0",
49
- "@backstage/cli-common": "0.1.14",
50
- "@backstage/cli-node": "0.2.8",
51
- "@backstage/config": "1.2.0",
52
- "@backstage/config-loader": "1.9.1",
53
- "@backstage/errors": "1.2.4",
54
- "@backstage/plugin-app-node": "0.1.26-next.0",
55
- "@backstage/plugin-auth-node": "0.5.3-next.0",
56
- "@backstage/plugin-catalog-backend": "1.26.2-next.1",
57
- "@backstage/plugin-events-backend": "0.3.13-next.0",
58
- "@backstage/plugin-events-node": "0.4.1-next.0",
59
- "@backstage/plugin-permission-common": "0.8.1",
60
- "@backstage/plugin-permission-node": "0.8.4-next.0",
61
- "@backstage/plugin-scaffolder-node": "0.5.0-next.1",
62
- "@backstage/plugin-search-backend-node": "1.3.3-next.1",
63
- "@backstage/plugin-search-common": "1.2.14",
64
- "@backstage/types": "1.1.1",
47
+ "@backstage/backend-defaults": "^0.5.1",
48
+ "@backstage/backend-plugin-api": "^1.0.1",
49
+ "@backstage/cli-common": "^0.1.14",
50
+ "@backstage/cli-node": "^0.2.9",
51
+ "@backstage/config": "^1.2.0",
52
+ "@backstage/config-loader": "^1.9.1",
53
+ "@backstage/errors": "^1.2.4",
54
+ "@backstage/plugin-app-node": "^0.1.26",
55
+ "@backstage/plugin-auth-node": "^0.5.3",
56
+ "@backstage/plugin-catalog-backend": "^1.27.0",
57
+ "@backstage/plugin-events-backend": "^0.3.13",
58
+ "@backstage/plugin-events-node": "^0.4.1",
59
+ "@backstage/plugin-permission-common": "^0.8.1",
60
+ "@backstage/plugin-permission-node": "^0.8.4",
61
+ "@backstage/plugin-scaffolder-node": "^0.5.0",
62
+ "@backstage/plugin-search-backend-node": "^1.3.3",
63
+ "@backstage/plugin-search-common": "^1.2.14",
64
+ "@backstage/types": "^1.1.1",
65
65
  "@manypkg/get-packages": "^1.1.3",
66
66
  "@types/express": "^4.17.6",
67
67
  "chokidar": "^3.5.3",
@@ -71,8 +71,10 @@
71
71
  "winston": "^3.2.1"
72
72
  },
73
73
  "devDependencies": {
74
- "@backstage/backend-test-utils": "1.0.1-next.1",
75
- "@backstage/cli": "0.28.0-next.1",
74
+ "@backstage/backend-test-utils": "^1.0.1",
75
+ "@backstage/cli": "^0.28.0",
76
+ "@backstage/plugin-app-backend": "^0.3.76",
77
+ "triple-beam": "^1.4.1",
76
78
  "wait-for-expect": "^3.0.2"
77
79
  }
78
80
  }