@backstage/backend-app-api 0.6.0-next.2 → 0.6.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 CHANGED
@@ -1,5 +1,55 @@
1
1
  # @backstage/backend-app-api
2
2
 
3
+ ## 0.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - de1f45d: Temporarily revert the rate limiting
8
+ - Updated dependencies
9
+ - @backstage/backend-common@0.21.5
10
+ - @backstage/plugin-auth-node@0.4.10
11
+ - @backstage/backend-tasks@0.5.20
12
+ - @backstage/plugin-permission-node@0.7.26
13
+ - @backstage/backend-plugin-api@0.6.15
14
+ - @backstage/cli-common@0.1.13
15
+ - @backstage/cli-node@0.2.4
16
+ - @backstage/config@1.2.0
17
+ - @backstage/config-loader@1.7.0
18
+ - @backstage/errors@1.2.4
19
+ - @backstage/types@1.1.1
20
+
21
+ ## 0.6.0
22
+
23
+ ### Minor Changes
24
+
25
+ - 4a3d434: **BREAKING**: For users that have migrated to the new backend system, incoming requests will now be rejected if they are not properly authenticated (e.g. with a Backstage bearer token or a backend token). Please see the [Auth Service Migration tutorial](https://backstage.io/docs/tutorials/auth-service-migration) for more information on how to circumvent this behavior in the short term and how to properly leverage it in the longer term.
26
+
27
+ Added service factories for the new [`auth`](https://backstage.io/docs/backend-system/core-services/auth/), [`httpAuth`](https://backstage.io/docs/backend-system/core-services/http-auth), and [`userInfo`](https://backstage.io/docs/backend-system/core-services/user-info) services that were created as part of [BEP-0003](https://github.com/backstage/backstage/tree/master/beps/0003-auth-architecture-evolution).
28
+
29
+ ### Patch Changes
30
+
31
+ - 999224f: Bump dependency `minimatch` to v9
32
+ - 81e0120: Fixed an issue where configuration schema for the purpose of redacting secrets from logs was not being read correctly.
33
+ - 15fda44: Provide some sane defaults for `WinstonLogger.create` making some of the arguments optional
34
+ - 0502d82: Updated the `permissionsServiceFactory` to forward the `AuthService` to the implementation.
35
+ - 9d91128: Add the possibility to disable watching files in the new backend system
36
+ - a5d341e: Adds an initial rate-limiting implementation so that any incoming requests that have a `'none'` principal are rate-limited automatically.
37
+ - 9802004: Made the `DefaultUserInfoService` claims check stricter
38
+ - f235ca7: Make sure to not filter out schemas in `createConfigSecretEnumerator`
39
+ - af5f7a6: The experimental feature discovery service exported at the `/alpha` sub-path will no longer attempt to load packages that are not Backstage backend packages.
40
+ - Updated dependencies
41
+ - @backstage/backend-common@0.21.4
42
+ - @backstage/plugin-auth-node@0.4.9
43
+ - @backstage/config@1.2.0
44
+ - @backstage/errors@1.2.4
45
+ - @backstage/backend-plugin-api@0.6.14
46
+ - @backstage/config-loader@1.7.0
47
+ - @backstage/backend-tasks@0.5.19
48
+ - @backstage/plugin-permission-node@0.7.25
49
+ - @backstage/cli-node@0.2.4
50
+ - @backstage/cli-common@0.1.13
51
+ - @backstage/types@1.1.1
52
+
3
53
  ## 0.6.0-next.2
4
54
 
5
55
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/backend-app-api",
3
- "version": "0.6.0-next.2",
3
+ "version": "0.6.1",
4
4
  "main": "../dist/alpha.cjs.js",
5
5
  "types": "../dist/alpha.d.ts"
6
6
  }
package/dist/alpha.cjs.js CHANGED
@@ -1,21 +1,25 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  var backendPluginApi = require('@backstage/backend-plugin-api');
6
4
  var alpha = require('@backstage/backend-plugin-api/alpha');
7
5
  var path = require('path');
8
6
  var fs = require('fs-extra');
9
7
 
10
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
11
9
 
12
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
10
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
13
11
 
12
+ const DETECTED_PACKAGE_ROLES = [
13
+ "node-library",
14
+ "backend",
15
+ "backend-plugin",
16
+ "backend-plugin-module"
17
+ ];
14
18
  async function findClosestPackageDir(searchDir) {
15
19
  let path$1 = searchDir;
16
20
  for (let i = 0; i < 1e3; i++) {
17
21
  const packagePath = path.resolve(path$1, "package.json");
18
- const exists = await fs__default["default"].pathExists(packagePath);
22
+ const exists = await fs__default.default.pathExists(packagePath);
19
23
  if (exists) {
20
24
  return path$1;
21
25
  }
@@ -68,7 +72,7 @@ class PackageDiscoveryService {
68
72
  const depPkg = require(require.resolve(`${name}/package.json`, {
69
73
  paths: [packageDir]
70
74
  }));
71
- if (!(depPkg == null ? void 0 : depPkg.backstage) || ((_a = depPkg == null ? void 0 : depPkg.backstage) == null ? void 0 : _a.role) === "cli") {
75
+ if (!((_a = depPkg == null ? void 0 : depPkg.backstage) == null ? void 0 : _a.role) || !DETECTED_PACKAGE_ROLES.includes(depPkg.backstage.role)) {
72
76
  continue;
73
77
  }
74
78
  const exportedModulePaths = [
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.cjs.js","sources":["../src/alpha/featureDiscoveryServiceFactory.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 {\n BackendFeature,\n RootConfigService,\n RootLoggerService,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport {\n featureDiscoveryServiceRef,\n FeatureDiscoveryService,\n} from '@backstage/backend-plugin-api/alpha';\nimport { resolve as resolvePath, dirname } from 'path';\nimport fs from 'fs-extra';\nimport { BackstagePackageJson } from '@backstage/cli-node';\n\n/** @internal */\nasync function findClosestPackageDir(\n searchDir: string,\n): Promise<string | undefined> {\n let path = searchDir;\n\n // Some confidence check to avoid infinite loop\n for (let i = 0; i < 1000; i++) {\n const packagePath = resolvePath(path, 'package.json');\n const exists = await fs.pathExists(packagePath);\n if (exists) {\n return path;\n }\n\n const newPath = dirname(path);\n if (newPath === path) {\n return undefined;\n }\n path = newPath;\n }\n\n throw new Error(\n `Iteration limit reached when searching for root package.json at ${searchDir}`,\n );\n}\n\n/** @internal */\nclass PackageDiscoveryService implements FeatureDiscoveryService {\n constructor(\n private readonly config: RootConfigService,\n private readonly logger: RootLoggerService,\n ) {}\n\n getDependencyNames(path: string) {\n const { dependencies } = require(path) as BackstagePackageJson;\n const packagesConfig = this.config.getOptional('backend.packages');\n\n const dependencyNames = Object.keys(dependencies || {});\n\n if (packagesConfig === 'all') {\n return dependencyNames;\n }\n\n const includedPackagesConfig = this.config.getOptionalStringArray(\n 'backend.packages.include',\n );\n\n const includedPackages = includedPackagesConfig\n ? new Set(includedPackagesConfig)\n : dependencyNames;\n const excludedPackagesSet = new Set(\n this.config.getOptionalStringArray('backend.packages.exclude'),\n );\n\n return [...includedPackages].filter(name => !excludedPackagesSet.has(name));\n }\n\n async getBackendFeatures(): Promise<{ features: Array<BackendFeature> }> {\n const packagesConfig = this.config.getOptional('backend.packages');\n if (!packagesConfig || Object.keys(packagesConfig).length === 0) {\n return { features: [] };\n }\n\n const packageDir = await findClosestPackageDir(process.argv[1]);\n if (!packageDir) {\n throw new Error('Package discovery failed to find package.json');\n }\n const dependencyNames = this.getDependencyNames(\n resolvePath(packageDir, 'package.json'),\n );\n\n const features: BackendFeature[] = [];\n\n for (const name of dependencyNames) {\n const depPkg = require(require.resolve(`${name}/package.json`, {\n paths: [packageDir],\n })) as BackstagePackageJson;\n if (!depPkg?.backstage || depPkg?.backstage?.role === 'cli') {\n continue; // Not a backstage package, ignore\n }\n\n const exportedModulePaths = [\n require.resolve(name, {\n paths: [packageDir],\n }),\n ];\n\n // Find modules exported as alpha\n try {\n exportedModulePaths.push(\n require.resolve(`${name}/alpha`, { paths: [packageDir] }),\n );\n } catch {\n /* ignore */\n }\n\n for (const modulePath of exportedModulePaths) {\n const mod = require(modulePath);\n\n if (isBackendFeature(mod.default)) {\n this.logger.info(`Detected: ${name}`);\n features.push(mod.default);\n }\n if (isBackendFeatureFactory(mod.default)) {\n this.logger.info(`Detected: ${name}`);\n features.push(mod.default());\n }\n }\n }\n\n return { features };\n }\n}\n\n/** @alpha */\nexport const featureDiscoveryServiceFactory = createServiceFactory({\n service: featureDiscoveryServiceRef,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.rootLogger,\n },\n factory({ config, logger }) {\n return new PackageDiscoveryService(config, logger);\n },\n});\n\nfunction isBackendFeature(value: unknown): value is BackendFeature {\n return (\n !!value &&\n typeof value === 'object' &&\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":["path","resolvePath","fs","dirname","createServiceFactory","featureDiscoveryServiceRef","coreServices"],"mappings":"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"}
1
+ {"version":3,"file":"alpha.cjs.js","sources":["../src/alpha/featureDiscoveryServiceFactory.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 {\n BackendFeature,\n RootConfigService,\n RootLoggerService,\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport {\n featureDiscoveryServiceRef,\n FeatureDiscoveryService,\n} from '@backstage/backend-plugin-api/alpha';\nimport { resolve as resolvePath, dirname } from 'path';\nimport fs from 'fs-extra';\nimport { BackstagePackageJson } from '@backstage/cli-node';\n\nconst DETECTED_PACKAGE_ROLES = [\n 'node-library',\n 'backend',\n 'backend-plugin',\n 'backend-plugin-module',\n];\n\n/** @internal */\nasync function findClosestPackageDir(\n searchDir: string,\n): Promise<string | undefined> {\n let path = searchDir;\n\n // Some confidence check to avoid infinite loop\n for (let i = 0; i < 1000; i++) {\n const packagePath = resolvePath(path, 'package.json');\n const exists = await fs.pathExists(packagePath);\n if (exists) {\n return path;\n }\n\n const newPath = dirname(path);\n if (newPath === path) {\n return undefined;\n }\n path = newPath;\n }\n\n throw new Error(\n `Iteration limit reached when searching for root package.json at ${searchDir}`,\n );\n}\n\n/** @internal */\nclass PackageDiscoveryService implements FeatureDiscoveryService {\n constructor(\n private readonly config: RootConfigService,\n private readonly logger: RootLoggerService,\n ) {}\n\n getDependencyNames(path: string) {\n const { dependencies } = require(path) as BackstagePackageJson;\n const packagesConfig = this.config.getOptional('backend.packages');\n\n const dependencyNames = Object.keys(dependencies || {});\n\n if (packagesConfig === 'all') {\n return dependencyNames;\n }\n\n const includedPackagesConfig = this.config.getOptionalStringArray(\n 'backend.packages.include',\n );\n\n const includedPackages = includedPackagesConfig\n ? new Set(includedPackagesConfig)\n : dependencyNames;\n const excludedPackagesSet = new Set(\n this.config.getOptionalStringArray('backend.packages.exclude'),\n );\n\n return [...includedPackages].filter(name => !excludedPackagesSet.has(name));\n }\n\n async getBackendFeatures(): Promise<{ features: Array<BackendFeature> }> {\n const packagesConfig = this.config.getOptional('backend.packages');\n if (!packagesConfig || Object.keys(packagesConfig).length === 0) {\n return { features: [] };\n }\n\n const packageDir = await findClosestPackageDir(process.argv[1]);\n if (!packageDir) {\n throw new Error('Package discovery failed to find package.json');\n }\n const dependencyNames = this.getDependencyNames(\n resolvePath(packageDir, 'package.json'),\n );\n\n const features: BackendFeature[] = [];\n\n for (const name of dependencyNames) {\n const depPkg = require(require.resolve(`${name}/package.json`, {\n paths: [packageDir],\n })) as BackstagePackageJson;\n if (\n !depPkg?.backstage?.role ||\n !DETECTED_PACKAGE_ROLES.includes(depPkg.backstage.role)\n ) {\n continue; // Not a backstage backend package, ignore\n }\n\n const exportedModulePaths = [\n require.resolve(name, {\n paths: [packageDir],\n }),\n ];\n\n // Find modules exported as alpha\n try {\n exportedModulePaths.push(\n require.resolve(`${name}/alpha`, { paths: [packageDir] }),\n );\n } catch {\n /* ignore */\n }\n\n for (const modulePath of exportedModulePaths) {\n const mod = require(modulePath);\n\n if (isBackendFeature(mod.default)) {\n this.logger.info(`Detected: ${name}`);\n features.push(mod.default);\n }\n if (isBackendFeatureFactory(mod.default)) {\n this.logger.info(`Detected: ${name}`);\n features.push(mod.default());\n }\n }\n }\n\n return { features };\n }\n}\n\n/** @alpha */\nexport const featureDiscoveryServiceFactory = createServiceFactory({\n service: featureDiscoveryServiceRef,\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.rootLogger,\n },\n factory({ config, logger }) {\n return new PackageDiscoveryService(config, logger);\n },\n});\n\nfunction isBackendFeature(value: unknown): value is BackendFeature {\n return (\n !!value &&\n typeof value === 'object' &&\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":["path","resolvePath","fs","dirname","createServiceFactory","featureDiscoveryServiceRef","coreServices"],"mappings":";;;;;;;;;;;AA+BA,MAAM,sBAAyB,GAAA;AAAA,EAC7B,cAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,uBAAA;AACF,CAAA,CAAA;AAGA,eAAe,sBACb,SAC6B,EAAA;AAC7B,EAAA,IAAIA,MAAO,GAAA,SAAA,CAAA;AAGX,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,EAAM,CAAK,EAAA,EAAA;AAC7B,IAAM,MAAA,WAAA,GAAcC,YAAY,CAAAD,MAAA,EAAM,cAAc,CAAA,CAAA;AACpD,IAAA,MAAM,MAAS,GAAA,MAAME,mBAAG,CAAA,UAAA,CAAW,WAAW,CAAA,CAAA;AAC9C,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAAF,MAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,OAAA,GAAUG,aAAQH,MAAI,CAAA,CAAA;AAC5B,IAAA,IAAI,YAAYA,MAAM,EAAA;AACpB,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACT;AACA,IAAOA,MAAA,GAAA,OAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,mEAAmE,SAAS,CAAA,CAAA;AAAA,GAC9E,CAAA;AACF,CAAA;AAGA,MAAM,uBAA2D,CAAA;AAAA,EAC/D,WAAA,CACmB,QACA,MACjB,EAAA;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAAA,GAChB;AAAA,EAEH,mBAAmB,IAAc,EAAA;AAC/B,IAAA,MAAM,EAAE,YAAA,EAAiB,GAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AACrC,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,kBAAkB,CAAA,CAAA;AAEjE,IAAA,MAAM,eAAkB,GAAA,MAAA,CAAO,IAAK,CAAA,YAAA,IAAgB,EAAE,CAAA,CAAA;AAEtD,IAAA,IAAI,mBAAmB,KAAO,EAAA;AAC5B,MAAO,OAAA,eAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,sBAAA,GAAyB,KAAK,MAAO,CAAA,sBAAA;AAAA,MACzC,0BAAA;AAAA,KACF,CAAA;AAEA,IAAA,MAAM,gBAAmB,GAAA,sBAAA,GACrB,IAAI,GAAA,CAAI,sBAAsB,CAC9B,GAAA,eAAA,CAAA;AACJ,IAAA,MAAM,sBAAsB,IAAI,GAAA;AAAA,MAC9B,IAAA,CAAK,MAAO,CAAA,sBAAA,CAAuB,0BAA0B,CAAA;AAAA,KAC/D,CAAA;AAEA,IAAO,OAAA,CAAC,GAAG,gBAAgB,CAAE,CAAA,MAAA,CAAO,UAAQ,CAAC,mBAAA,CAAoB,GAAI,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,GAC5E;AAAA,EAEA,MAAM,kBAAmE,GAAA;AA/F3E,IAAA,IAAA,EAAA,CAAA;AAgGI,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,kBAAkB,CAAA,CAAA;AACjE,IAAA,IAAI,CAAC,cAAkB,IAAA,MAAA,CAAO,KAAK,cAAc,CAAA,CAAE,WAAW,CAAG,EAAA;AAC/D,MAAO,OAAA,EAAE,QAAU,EAAA,EAAG,EAAA,CAAA;AAAA,KACxB;AAEA,IAAA,MAAM,aAAa,MAAM,qBAAA,CAAsB,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAC9D,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAM,MAAA,IAAI,MAAM,+CAA+C,CAAA,CAAA;AAAA,KACjE;AACA,IAAA,MAAM,kBAAkB,IAAK,CAAA,kBAAA;AAAA,MAC3BC,YAAA,CAAY,YAAY,cAAc,CAAA;AAAA,KACxC,CAAA;AAEA,IAAA,MAAM,WAA6B,EAAC,CAAA;AAEpC,IAAA,KAAA,MAAW,QAAQ,eAAiB,EAAA;AAClC,MAAA,MAAM,SAAS,OAAQ,CAAA,OAAA,CAAQ,OAAQ,CAAA,CAAA,EAAG,IAAI,CAAiB,aAAA,CAAA,EAAA;AAAA,QAC7D,KAAA,EAAO,CAAC,UAAU,CAAA;AAAA,OACnB,CAAC,CAAA,CAAA;AACF,MACE,IAAA,EAAA,CAAC,EAAQ,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,SAAA,KAAR,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IACpB,CAAC,sBAAA,CAAuB,QAAS,CAAA,MAAA,CAAO,SAAU,CAAA,IAAI,CACtD,EAAA;AACA,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,MAAM,mBAAsB,GAAA;AAAA,QAC1B,OAAA,CAAQ,QAAQ,IAAM,EAAA;AAAA,UACpB,KAAA,EAAO,CAAC,UAAU,CAAA;AAAA,SACnB,CAAA;AAAA,OACH,CAAA;AAGA,MAAI,IAAA;AACF,QAAoB,mBAAA,CAAA,IAAA;AAAA,UAClB,OAAA,CAAQ,OAAQ,CAAA,CAAA,EAAG,IAAI,CAAA,MAAA,CAAA,EAAU,EAAE,KAAO,EAAA,CAAC,UAAU,CAAA,EAAG,CAAA;AAAA,SAC1D,CAAA;AAAA,OACM,CAAA,MAAA;AAAA,OAER;AAEA,MAAA,KAAA,MAAW,cAAc,mBAAqB,EAAA;AAC5C,QAAM,MAAA,GAAA,GAAM,QAAQ,UAAU,CAAA,CAAA;AAE9B,QAAI,IAAA,gBAAA,CAAiB,GAAI,CAAA,OAAO,CAAG,EAAA;AACjC,UAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,CAAa,UAAA,EAAA,IAAI,CAAE,CAAA,CAAA,CAAA;AACpC,UAAS,QAAA,CAAA,IAAA,CAAK,IAAI,OAAO,CAAA,CAAA;AAAA,SAC3B;AACA,QAAI,IAAA,uBAAA,CAAwB,GAAI,CAAA,OAAO,CAAG,EAAA;AACxC,UAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,CAAa,UAAA,EAAA,IAAI,CAAE,CAAA,CAAA,CAAA;AACpC,UAAS,QAAA,CAAA,IAAA,CAAK,GAAI,CAAA,OAAA,EAAS,CAAA,CAAA;AAAA,SAC7B;AAAA,OACF;AAAA,KACF;AAEA,IAAA,OAAO,EAAE,QAAS,EAAA,CAAA;AAAA,GACpB;AACF,CAAA;AAGO,MAAM,iCAAiCG,qCAAqB,CAAA;AAAA,EACjE,OAAS,EAAAC,gCAAA;AAAA,EACT,IAAM,EAAA;AAAA,IACJ,QAAQC,6BAAa,CAAA,UAAA;AAAA,IACrB,QAAQA,6BAAa,CAAA,UAAA;AAAA,GACvB;AAAA,EACA,OAAQ,CAAA,EAAE,MAAQ,EAAA,MAAA,EAAU,EAAA;AAC1B,IAAO,OAAA,IAAI,uBAAwB,CAAA,MAAA,EAAQ,MAAM,CAAA,CAAA;AAAA,GACnD;AACF,CAAC,EAAA;AAED,SAAS,iBAAiB,KAAyC,EAAA;AACjE,EAAA,OACE,CAAC,CAAC,KAAA,IACF,OAAO,KAAU,KAAA,QAAA,IAChB,MAAyB,MAAW,KAAA,2BAAA,CAAA;AAEzC,CAAA;AAEA,SAAS,wBACP,KAC+B,EAAA;AAC/B,EAAA,OACE,CAAC,CAAC,KAAA,IACF,OAAO,KAAU,KAAA,UAAA,IAChB,MAAc,MAAW,KAAA,kCAAA,CAAA;AAE9B;;;;"}
package/dist/index.cjs.js CHANGED
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  var path = require('path');
6
4
  var parseArgs = require('minimist');
7
5
  var cliCommon = require('@backstage/cli-common');
@@ -36,10 +34,10 @@ var express = require('express');
36
34
  var trimEnd = require('lodash/trimEnd');
37
35
  var backendTasks = require('@backstage/backend-tasks');
38
36
 
39
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
37
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
40
38
 
41
- function _interopNamespace(e) {
42
- if (e && e.__esModule) return e;
39
+ function _interopNamespaceCompat(e) {
40
+ if (e && typeof e === 'object' && 'default' in e) return e;
43
41
  var n = Object.create(null);
44
42
  if (e) {
45
43
  Object.keys(e).forEach(function (k) {
@@ -52,23 +50,23 @@ function _interopNamespace(e) {
52
50
  }
53
51
  });
54
52
  }
55
- n["default"] = e;
53
+ n.default = e;
56
54
  return Object.freeze(n);
57
55
  }
58
56
 
59
- var parseArgs__default = /*#__PURE__*/_interopDefaultLegacy(parseArgs);
60
- var http__namespace = /*#__PURE__*/_interopNamespace(http);
61
- var https__namespace = /*#__PURE__*/_interopNamespace(https);
62
- var stoppableServer__default = /*#__PURE__*/_interopDefaultLegacy(stoppableServer);
63
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
64
- var forge__default = /*#__PURE__*/_interopDefaultLegacy(forge);
65
- var cors__default = /*#__PURE__*/_interopDefaultLegacy(cors);
66
- var helmet__default = /*#__PURE__*/_interopDefaultLegacy(helmet);
67
- var morgan__default = /*#__PURE__*/_interopDefaultLegacy(morgan);
68
- var compression__default = /*#__PURE__*/_interopDefaultLegacy(compression);
69
- var PromiseRouter__default = /*#__PURE__*/_interopDefaultLegacy(PromiseRouter);
70
- var express__default = /*#__PURE__*/_interopDefaultLegacy(express);
71
- var trimEnd__default = /*#__PURE__*/_interopDefaultLegacy(trimEnd);
57
+ var parseArgs__default = /*#__PURE__*/_interopDefaultCompat(parseArgs);
58
+ var http__namespace = /*#__PURE__*/_interopNamespaceCompat(http);
59
+ var https__namespace = /*#__PURE__*/_interopNamespaceCompat(https);
60
+ var stoppableServer__default = /*#__PURE__*/_interopDefaultCompat(stoppableServer);
61
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
62
+ var forge__default = /*#__PURE__*/_interopDefaultCompat(forge);
63
+ var cors__default = /*#__PURE__*/_interopDefaultCompat(cors);
64
+ var helmet__default = /*#__PURE__*/_interopDefaultCompat(helmet);
65
+ var morgan__default = /*#__PURE__*/_interopDefaultCompat(morgan);
66
+ var compression__default = /*#__PURE__*/_interopDefaultCompat(compression);
67
+ var PromiseRouter__default = /*#__PURE__*/_interopDefaultCompat(PromiseRouter);
68
+ var express__default = /*#__PURE__*/_interopDefaultCompat(express);
69
+ var trimEnd__default = /*#__PURE__*/_interopDefaultCompat(trimEnd);
72
70
 
73
71
  var __defProp = Object.defineProperty;
74
72
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -223,7 +221,7 @@ async function createConfigSecretEnumerator(options) {
223
221
  }
224
222
  async function loadBackendConfig(options) {
225
223
  var _a, _b;
226
- const args = parseArgs__default["default"](options.argv);
224
+ const args = parseArgs__default.default(options.argv);
227
225
  const configTargets = [(_a = args.config) != null ? _a : []].flat().map((arg) => isValidUrl(arg) ? { url: arg } : { path: path.resolve(arg) });
228
226
  const paths = cliCommon.findPaths(__dirname);
229
227
  let currentCancelFunc = void 0;
@@ -329,20 +327,20 @@ function readHttpsOptions(config) {
329
327
  const FIVE_DAYS_IN_MS = 5 * 24 * 60 * 60 * 1e3;
330
328
  const IP_HOSTNAME_REGEX = /:|^\d+\.\d+\.\d+\.\d+$/;
331
329
  async function getGeneratedCertificate(hostname, logger) {
332
- const hasModules = await fs__default["default"].pathExists("node_modules");
330
+ const hasModules = await fs__default.default.pathExists("node_modules");
333
331
  let certPath;
334
332
  if (hasModules) {
335
333
  certPath = path.resolve(
336
334
  "node_modules/.cache/backstage-backend/dev-cert.pem"
337
335
  );
338
- await fs__default["default"].ensureDir(path.dirname(certPath));
336
+ await fs__default.default.ensureDir(path.dirname(certPath));
339
337
  } else {
340
338
  certPath = path.resolve(".dev-cert.pem");
341
339
  }
342
- if (await fs__default["default"].pathExists(certPath)) {
340
+ if (await fs__default.default.pathExists(certPath)) {
343
341
  try {
344
- const cert = await fs__default["default"].readFile(certPath);
345
- const crt = forge__default["default"].pki.certificateFromPem(cert.toString());
342
+ const cert = await fs__default.default.readFile(certPath);
343
+ const crt = forge__default.default.pki.certificateFromPem(cert.toString());
346
344
  const remainingMs = crt.validity.notAfter.getTime() - Date.now();
347
345
  if (remainingMs > FIVE_DAYS_IN_MS) {
348
346
  logger.info("Using existing self-signed certificate");
@@ -357,7 +355,7 @@ async function getGeneratedCertificate(hostname, logger) {
357
355
  }
358
356
  logger.info("Generating new self-signed certificate");
359
357
  const newCert = await generateCertificate(hostname);
360
- await fs__default["default"].writeFile(certPath, newCert.cert + newCert.key, "utf8");
358
+ await fs__default.default.writeFile(certPath, newCert.cert + newCert.key, "utf8");
361
359
  return newCert;
362
360
  }
363
361
  async function generateCertificate(hostname) {
@@ -445,7 +443,7 @@ async function generateCertificate(hostname) {
445
443
 
446
444
  async function createHttpServer(listener, options, deps) {
447
445
  const server = await createServer(listener, options, deps);
448
- const stopper = stoppableServer__default["default"](server, 0);
446
+ const stopper = stoppableServer__default.default(server, 0);
449
447
  const stopServer = stopper.stop.bind(stopper);
450
448
  return Object.assign(server, {
451
449
  start() {
@@ -531,7 +529,7 @@ function readCspDirectives(config) {
531
529
  return result;
532
530
  }
533
531
  function applyCspDirectives(directives) {
534
- const result = helmet__default["default"].contentSecurityPolicy.getDefaultDirectives();
532
+ const result = helmet__default.default.contentSecurityPolicy.getDefaultDirectives();
535
533
  result["script-src"] = ["'self'", "'unsafe-eval'"];
536
534
  delete result["form-action"];
537
535
  if (directives) {
@@ -668,7 +666,7 @@ const _MiddlewareFactory = class _MiddlewareFactory {
668
666
  * that traverse through the middleware.
669
667
  */
670
668
  compression() {
671
- return compression__default["default"]();
669
+ return compression__default.default();
672
670
  }
673
671
  /**
674
672
  * Returns a request logging middleware.
@@ -685,7 +683,7 @@ const _MiddlewareFactory = class _MiddlewareFactory {
685
683
  const logger = __privateGet$9(this, _logger).child({
686
684
  type: "incomingRequest"
687
685
  });
688
- return morgan__default["default"]("combined", {
686
+ return morgan__default.default("combined", {
689
687
  stream: {
690
688
  write(message) {
691
689
  logger.info(message.trimEnd());
@@ -706,7 +704,7 @@ const _MiddlewareFactory = class _MiddlewareFactory {
706
704
  * @returns An Express request handler
707
705
  */
708
706
  helmet() {
709
- return helmet__default["default"](readHelmetOptions(__privateGet$9(this, _config).getOptionalConfig("backend")));
707
+ return helmet__default.default(readHelmetOptions(__privateGet$9(this, _config).getOptionalConfig("backend")));
710
708
  }
711
709
  /**
712
710
  * Returns a middleware that implements the cors library.
@@ -721,7 +719,7 @@ const _MiddlewareFactory = class _MiddlewareFactory {
721
719
  * @returns An Express request handler
722
720
  */
723
721
  cors() {
724
- return cors__default["default"](readCorsOptions(__privateGet$9(this, _config).getOptionalConfig("backend")));
722
+ return cors__default.default(readCorsOptions(__privateGet$9(this, _config).getOptionalConfig("backend")));
725
723
  }
726
724
  /**
727
725
  * Express middleware to handle errors during request processing.
@@ -2565,7 +2563,7 @@ const httpRouterServiceFactory = backendPluginApi.createServiceFactory(
2565
2563
  var _a;
2566
2564
  const getPath = (_a = options == null ? void 0 : options.getPath) != null ? _a : (id) => `/api/${id}`;
2567
2565
  const path = getPath(plugin.getId());
2568
- const router = PromiseRouter__default["default"]();
2566
+ const router = PromiseRouter__default.default();
2569
2567
  rootHttpRouter.use(path, router);
2570
2568
  const credentialsBarrier = createCredentialsBarrier({ httpAuth, config });
2571
2569
  router.use(createLifecycleMiddleware({ lifecycle }));
@@ -2646,7 +2644,7 @@ var __privateMethod = (obj, member, method) => {
2646
2644
  };
2647
2645
  var _indexPath, _router, _namedRoutes, _indexRouter, _existingPaths, _findConflictingPath, findConflictingPath_fn;
2648
2646
  function normalizePath(path) {
2649
- return `${trimEnd__default["default"](path, "/")}/`;
2647
+ return `${trimEnd__default.default(path, "/")}/`;
2650
2648
  }
2651
2649
  const _DefaultRootHttpRouter = class _DefaultRootHttpRouter {
2652
2650
  constructor(indexPath) {
@@ -2737,7 +2735,7 @@ const rootHttpRouterServiceFactory = backendPluginApi.createServiceFactory(
2737
2735
  async factory({ config, rootLogger, lifecycle }) {
2738
2736
  const { indexPath, configure = defaultConfigure } = options != null ? options : {};
2739
2737
  const logger = rootLogger.child({ service: "rootHttpRouter" });
2740
- const app = express__default["default"]();
2738
+ const app = express__default.default();
2741
2739
  const router = DefaultRootHttpRouter.create({ indexPath });
2742
2740
  const middleware = MiddlewareFactory.create({ config, logger });
2743
2741
  configure({