@backstage/plugin-devtools-backend 0.3.0 → 0.3.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # @backstage/plugin-devtools-backend
2
2
 
3
+ ## 0.3.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @backstage/backend-common@0.21.6
9
+ - @backstage/backend-plugin-api@0.6.16
10
+ - @backstage/plugin-permission-node@0.7.27
11
+ - @backstage/cli-common@0.1.13
12
+ - @backstage/config@1.2.0
13
+ - @backstage/config-loader@1.7.0
14
+ - @backstage/errors@1.2.4
15
+ - @backstage/types@1.1.1
16
+ - @backstage/plugin-devtools-common@0.1.9
17
+ - @backstage/plugin-permission-common@0.7.13
18
+
19
+ ## 0.3.1
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies
24
+ - @backstage/backend-common@0.21.5
25
+ - @backstage/plugin-permission-node@0.7.26
26
+ - @backstage/backend-plugin-api@0.6.15
27
+ - @backstage/cli-common@0.1.13
28
+ - @backstage/config@1.2.0
29
+ - @backstage/config-loader@1.7.0
30
+ - @backstage/errors@1.2.4
31
+ - @backstage/types@1.1.1
32
+ - @backstage/plugin-devtools-common@0.1.9
33
+ - @backstage/plugin-permission-common@0.7.13
34
+
3
35
  ## 0.3.0
4
36
 
5
37
  ### Minor Changes
package/dist/index.cjs.js CHANGED
@@ -23,15 +23,15 @@ var express = require('express');
23
23
  var pluginPermissionNode = require('@backstage/plugin-permission-node');
24
24
  var backendPluginApi = require('@backstage/backend-plugin-api');
25
25
 
26
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
26
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
27
27
 
28
- var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch);
29
- var ping__default = /*#__PURE__*/_interopDefaultLegacy(ping);
30
- var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
31
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
32
- var semver__default = /*#__PURE__*/_interopDefaultLegacy(semver);
33
- var Router__default = /*#__PURE__*/_interopDefaultLegacy(Router);
34
- var express__default = /*#__PURE__*/_interopDefaultLegacy(express);
28
+ var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
29
+ var ping__default = /*#__PURE__*/_interopDefaultCompat(ping);
30
+ var os__default = /*#__PURE__*/_interopDefaultCompat(os);
31
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
32
+ var semver__default = /*#__PURE__*/_interopDefaultCompat(semver);
33
+ var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
34
+ var express__default = /*#__PURE__*/_interopDefaultCompat(express);
35
35
 
36
36
  const ENTRY_PATTERN = /^((?:@[^/]+\/)?[^@/]+)@(.+)$/;
37
37
  function parseLockfile(lockfileContents) {
@@ -77,7 +77,7 @@ class Lockfile {
77
77
  }
78
78
  static async load(path) {
79
79
  var _a;
80
- const lockfileContents = await fs__default["default"].readFile(path, "utf8");
80
+ const lockfileContents = await fs__default.default.readFile(path, "utf8");
81
81
  const legacy = LEGACY_REGEX.test(lockfileContents);
82
82
  const lockfile = parseLockfile(lockfileContents);
83
83
  if (lockfile.type !== "success") {
@@ -122,23 +122,23 @@ class Lockfile {
122
122
  if (filter && !filter(name)) {
123
123
  continue;
124
124
  }
125
- const invalid = allEntries.filter((e) => !semver__default["default"].validRange(e.range));
125
+ const invalid = allEntries.filter((e) => !semver__default.default.validRange(e.range));
126
126
  result.invalidRanges.push(
127
127
  ...invalid.map(({ range }) => ({ name, range }))
128
128
  );
129
- const entries = allEntries.filter((e) => semver__default["default"].validRange(e.range));
129
+ const entries = allEntries.filter((e) => semver__default.default.validRange(e.range));
130
130
  if (entries.length < 2) {
131
131
  continue;
132
132
  }
133
133
  const versions = Array.from(new Set(entries.map((e) => e.version))).sort(
134
- (v1, v2) => semver__default["default"].rcompare(v1, v2)
134
+ (v1, v2) => semver__default.default.rcompare(v1, v2)
135
135
  );
136
136
  if (versions.length < 2) {
137
137
  continue;
138
138
  }
139
139
  const acceptedVersions = /* @__PURE__ */ new Set();
140
140
  for (const { version, range } of entries) {
141
- const acceptedVersion = versions.find((v) => semver__default["default"].satisfies(v, range));
141
+ const acceptedVersion = versions.find((v) => semver__default.default.satisfies(v, range));
142
142
  if (!acceptedVersion) {
143
143
  throw new Error(
144
144
  `No existing version was accepted for range ${range}, searching through ${versions}, for package ${name}`
@@ -157,15 +157,15 @@ class Lockfile {
157
157
  if (acceptedVersions.size === 1) {
158
158
  continue;
159
159
  }
160
- const maxVersion = Array.from(acceptedVersions).sort(semver__default["default"].rcompare)[0];
161
- const maxEntry = (_a = entries.filter((e) => semver__default["default"].satisfies(maxVersion, e.range)).map((e) => ({ e, min: semver__default["default"].minVersion(e.range) })).filter((p) => p.min).sort((a, b) => semver__default["default"].rcompare(a.min, b.min))[0]) == null ? void 0 : _a.e;
160
+ const maxVersion = Array.from(acceptedVersions).sort(semver__default.default.rcompare)[0];
161
+ const maxEntry = (_a = entries.filter((e) => semver__default.default.satisfies(maxVersion, e.range)).map((e) => ({ e, min: semver__default.default.minVersion(e.range) })).filter((p) => p.min).sort((a, b) => semver__default.default.rcompare(a.min, b.min))[0]) == null ? void 0 : _a.e;
162
162
  if (!maxEntry) {
163
163
  throw new Error(
164
164
  `No entry found that satisfies max version '${maxVersion}'`
165
165
  );
166
166
  }
167
167
  for (const { version, range } of entries) {
168
- if (semver__default["default"].satisfies(maxVersion, range)) {
168
+ if (semver__default.default.satisfies(maxVersion, range)) {
169
169
  continue;
170
170
  }
171
171
  result.newRanges.push({
@@ -226,7 +226,7 @@ class Lockfile {
226
226
  }
227
227
  }
228
228
  async save() {
229
- await fs__default["default"].writeFile(this.path, this.toString(), "utf8");
229
+ await fs__default.default.writeFile(this.path, this.toString(), "utf8");
230
230
  }
231
231
  toString() {
232
232
  return stringifyLockfile(this.data, this.legacy);
@@ -271,7 +271,7 @@ class DevToolsBackendApi {
271
271
  async fetchExternalDependency(endpoint) {
272
272
  let status;
273
273
  let error;
274
- await fetch__default["default"](endpoint.target).then((res) => {
274
+ await fetch__default.default(endpoint.target).then((res) => {
275
275
  status = res.status === 200 ? pluginDevtoolsCommon.ExternalDependencyStatus.healthy : pluginDevtoolsCommon.ExternalDependencyStatus.unhealthy;
276
276
  this.logger.debug(
277
277
  `Fetch for ${endpoint.name} resulted in status code "${res.status}"`
@@ -290,7 +290,7 @@ class DevToolsBackendApi {
290
290
  return result;
291
291
  }
292
292
  async pingExternalDependency(endpoint) {
293
- const pingResult = await ping__default["default"].promise.probe(endpoint.target);
293
+ const pingResult = await ping__default.default.promise.probe(endpoint.target);
294
294
  let error;
295
295
  if (pingResult.packetLoss === "100.000" || pingResult.packetLoss === "unknown") {
296
296
  this.logger.error(
@@ -358,17 +358,17 @@ class DevToolsBackendApi {
358
358
  }
359
359
  async listInfo() {
360
360
  var _a;
361
- const operatingSystem = `${os__default["default"].hostname()}: ${os__default["default"].type} ${os__default["default"].release} - ${os__default["default"].platform}/${os__default["default"].arch}`;
362
- const usedMem = Math.floor((os__default["default"].totalmem() - os__default["default"].freemem()) / (1024 * 1024));
361
+ const operatingSystem = `${os__default.default.hostname()}: ${os__default.default.type} ${os__default.default.release} - ${os__default.default.platform}/${os__default.default.arch}`;
362
+ const usedMem = Math.floor((os__default.default.totalmem() - os__default.default.freemem()) / (1024 * 1024));
363
363
  const resources = `Memory: ${usedMem}/${Math.floor(
364
- os__default["default"].totalmem() / (1024 * 1024)
365
- )}MB - Load: ${os__default["default"].loadavg().map((v) => v.toFixed(2)).join("/")}`;
364
+ os__default.default.totalmem() / (1024 * 1024)
365
+ )}MB - Load: ${os__default.default.loadavg().map((v) => v.toFixed(2)).join("/")}`;
366
366
  const nodeJsVersion = process.version;
367
367
  const paths = cliCommon.findPaths(__dirname);
368
368
  const backstageFile = paths.resolveTargetRoot("backstage.json");
369
369
  let backstageJson = void 0;
370
- if (fs__default["default"].existsSync(backstageFile)) {
371
- const buffer = await fs__default["default"].readFile(backstageFile);
370
+ if (fs__default.default.existsSync(backstageFile)) {
371
+ const buffer = await fs__default.default.readFile(backstageFile);
372
372
  backstageJson = JSON.parse(buffer.toString());
373
373
  }
374
374
  const lockfilePath = paths.resolveTargetRoot("yarn.lock");
@@ -403,8 +403,8 @@ async function createRouter(options) {
403
403
  const { logger, config, permissions } = options;
404
404
  const { httpAuth } = backendCommon.createLegacyAuthAdapters(options);
405
405
  const devToolsBackendApi = options.devToolsBackendApi || new DevToolsBackendApi(logger, config);
406
- const router = Router__default["default"]();
407
- router.use(express__default["default"].json());
406
+ const router = Router__default.default();
407
+ router.use(express__default.default.json());
408
408
  router.use(
409
409
  pluginPermissionNode.createPermissionIntegrationRouter({
410
410
  permissions: pluginDevtoolsCommon.devToolsPermissions
@@ -490,5 +490,5 @@ const devtoolsPlugin = backendPluginApi.createBackendPlugin({
490
490
 
491
491
  exports.DevToolsBackendApi = DevToolsBackendApi;
492
492
  exports.createRouter = createRouter;
493
- exports["default"] = devtoolsPlugin;
493
+ exports.default = devtoolsPlugin;
494
494
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/util/Lockfile.ts","../src/api/DevToolsBackendApi.ts","../src/service/router.ts","../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2022 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 fs from 'fs-extra';\nimport semver from 'semver';\nimport { parseSyml, stringifySyml } from '@yarnpkg/parsers';\nimport { stringify as legacyStringifyLockfile } from '@yarnpkg/lockfile';\n\nconst ENTRY_PATTERN = /^((?:@[^/]+\\/)?[^@/]+)@(.+)$/;\n\ntype LockfileData = {\n [entry: string]: {\n version: string;\n resolved?: string;\n integrity?: string;\n dependencies?: { [name: string]: string };\n };\n};\n\ntype LockfileQueryEntry = {\n range: string;\n version: string;\n};\n\n/** Entries that have an invalid version range, for example an npm tag */\ntype AnalyzeResultInvalidRange = {\n name: string;\n range: string;\n};\n\n/** Entries that can be deduplicated by bumping to an existing higher version */\ntype AnalyzeResultNewVersion = {\n name: string;\n range: string;\n oldVersion: string;\n newVersion: string;\n};\n\n/** Entries that would need a dependency update in package.json to be deduplicated */\ntype AnalyzeResultNewRange = {\n name: string;\n oldRange: string;\n newRange: string;\n oldVersion: string;\n newVersion: string;\n};\n\ntype AnalyzeResult = {\n invalidRanges: AnalyzeResultInvalidRange[];\n newVersions: AnalyzeResultNewVersion[];\n newRanges: AnalyzeResultNewRange[];\n};\n\nfunction parseLockfile(lockfileContents: string) {\n try {\n return {\n object: parseSyml(lockfileContents),\n type: 'success',\n };\n } catch (err) {\n return {\n object: null,\n type: err,\n };\n }\n}\n\n// the new yarn header is handled out of band of the parsing\n// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-core/sources/Project.ts#L1741-L1746\nconst NEW_HEADER = `${[\n `# This file is generated by running \"yarn install\" inside your project.\\n`,\n `# Manual changes might be lost - proceed with caution!\\n`,\n].join(``)}\\n`;\n\nfunction stringifyLockfile(data: LockfileData, legacy: boolean) {\n return legacy\n ? legacyStringifyLockfile(data)\n : NEW_HEADER + stringifySyml(data);\n}\n// taken from yarn parser package\n// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-parsers/sources/syml.ts#L136\nconst LEGACY_REGEX = /^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i;\n\n// these are special top level yarn keys.\n// https://github.com/yarnpkg/berry/blob/9bd61fbffb83d0b8166a9cc26bec3a58743aa453/packages/yarnpkg-parsers/sources/syml.ts#L9\nconst SPECIAL_OBJECT_KEYS = [\n `__metadata`,\n `version`,\n `resolution`,\n `dependencies`,\n `peerDependencies`,\n `dependenciesMeta`,\n `peerDependenciesMeta`,\n `binaries`,\n];\n\nexport class Lockfile {\n static async load(path: string) {\n const lockfileContents = await fs.readFile(path, 'utf8');\n const legacy = LEGACY_REGEX.test(lockfileContents);\n const lockfile = parseLockfile(lockfileContents);\n if (lockfile.type !== 'success') {\n throw new Error(`Failed yarn.lock parse with ${lockfile.type}`);\n }\n\n const data = lockfile.object as LockfileData;\n const packages = new Map<string, LockfileQueryEntry[]>();\n\n for (const [key, value] of Object.entries(data)) {\n if (SPECIAL_OBJECT_KEYS.includes(key)) continue;\n\n const [, name, range] = ENTRY_PATTERN.exec(key) ?? [];\n if (!name) {\n throw new Error(`Failed to parse yarn.lock entry '${key}'`);\n }\n\n let queries = packages.get(name);\n if (!queries) {\n queries = [];\n packages.set(name, queries);\n }\n queries.push({ range, version: value.version });\n }\n\n return new Lockfile(path, packages, data, legacy);\n }\n\n private constructor(\n private readonly path: string,\n private readonly packages: Map<string, LockfileQueryEntry[]>,\n private readonly data: LockfileData,\n private readonly legacy: boolean = false,\n ) {}\n\n /** Get the entries for a single package in the lockfile */\n get(name: string): LockfileQueryEntry[] | undefined {\n return this.packages.get(name);\n }\n\n /** Returns the name of all packages available in the lockfile */\n keys(): IterableIterator<string> {\n return this.packages.keys();\n }\n\n /** Analyzes the lockfile to identify possible actions and warnings for the entries */\n analyze(options?: { filter?: (name: string) => boolean }): AnalyzeResult {\n const { filter } = options ?? {};\n const result: AnalyzeResult = {\n invalidRanges: [],\n newVersions: [],\n newRanges: [],\n };\n\n for (const [name, allEntries] of this.packages) {\n if (filter && !filter(name)) {\n continue;\n }\n\n // Get rid of and signal any invalid ranges upfront\n const invalid = allEntries.filter(e => !semver.validRange(e.range));\n result.invalidRanges.push(\n ...invalid.map(({ range }) => ({ name, range })),\n );\n\n // Grab all valid entries, if there aren't at least 2 different valid ones we're done\n const entries = allEntries.filter(e => semver.validRange(e.range));\n if (entries.length < 2) {\n continue;\n }\n\n // Find all versions currently in use\n const versions = Array.from(new Set(entries.map(e => e.version))).sort(\n (v1, v2) => semver.rcompare(v1, v2),\n );\n\n // If we're not using at least 2 different versions we're done\n if (versions.length < 2) {\n continue;\n }\n\n const acceptedVersions = new Set<string>();\n for (const { version, range } of entries) {\n // Finds the highest matching version from the the known versions\n // TODO(Rugvip): We may want to select the version that satisfies the most ranges rather than the highest one\n const acceptedVersion = versions.find(v => semver.satisfies(v, range));\n if (!acceptedVersion) {\n throw new Error(\n `No existing version was accepted for range ${range}, searching through ${versions}, for package ${name}`,\n );\n }\n\n if (acceptedVersion !== version) {\n result.newVersions.push({\n name,\n range,\n newVersion: acceptedVersion,\n oldVersion: version,\n });\n }\n\n acceptedVersions.add(acceptedVersion);\n }\n\n // If all ranges were able to accept the same version, we're done\n if (acceptedVersions.size === 1) {\n continue;\n }\n\n // Find the max version that we may want bump older packages to\n const maxVersion = Array.from(acceptedVersions).sort(semver.rcompare)[0];\n // Find all existing ranges that satisfy the new max version, and pick the one that\n // results in the highest minimum allowed version, usually being the more specific one\n const maxEntry = entries\n .filter(e => semver.satisfies(maxVersion, e.range))\n .map(e => ({ e, min: semver.minVersion(e.range) }))\n .filter(p => p.min)\n .sort((a, b) => semver.rcompare(a.min!, b.min!))[0]?.e;\n if (!maxEntry) {\n throw new Error(\n `No entry found that satisfies max version '${maxVersion}'`,\n );\n }\n\n // Find all entries that don't satisfy the max version\n for (const { version, range } of entries) {\n if (semver.satisfies(maxVersion, range)) {\n continue;\n }\n\n result.newRanges.push({\n name,\n oldRange: range,\n newRange: maxEntry.range,\n oldVersion: version,\n newVersion: maxVersion,\n });\n }\n }\n\n return result;\n }\n\n remove(name: string, range: string): boolean {\n const query = `${name}@${range}`;\n const existed = Boolean(this.data[query]);\n delete this.data[query];\n\n const newEntries = this.packages.get(name)?.filter(e => e.range !== range);\n if (newEntries) {\n this.packages.set(name, newEntries);\n }\n\n return existed;\n }\n\n /** Modifies the lockfile by bumping packages to the suggested versions */\n replaceVersions(results: AnalyzeResultNewVersion[]) {\n for (const { name, range, oldVersion, newVersion } of results) {\n const query = `${name}@${range}`;\n\n // Update the backing data\n const entryData = this.data[query];\n if (!entryData) {\n throw new Error(`No entry data for ${query}`);\n }\n if (entryData.version !== oldVersion) {\n throw new Error(\n `Expected existing version data for ${query} to be ${oldVersion}, was ${entryData.version}`,\n );\n }\n\n // Modifying the data in the entry is not enough, we need to reference an existing version object\n const matchingEntry = Object.entries(this.data).find(\n ([q, e]) => q.startsWith(`${name}@`) && e.version === newVersion,\n );\n if (!matchingEntry) {\n throw new Error(\n `No matching entry found for ${name} at version ${newVersion}`,\n );\n }\n this.data[query] = matchingEntry[1];\n\n // Update our internal data structure\n const entry = this.packages.get(name)?.find(e => e.range === range);\n if (!entry) {\n throw new Error(`No entry data for ${query}`);\n }\n if (entry.version !== oldVersion) {\n throw new Error(\n `Expected existing version data for ${query} to be ${oldVersion}, was ${entryData.version}`,\n );\n }\n entry.version = newVersion;\n }\n }\n\n async save() {\n await fs.writeFile(this.path, this.toString(), 'utf8');\n }\n\n toString() {\n return stringifyLockfile(this.data, this.legacy);\n }\n}\n","/*\n * Copyright 2022 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 { Config, ConfigReader } from '@backstage/config';\nimport { loadConfigSchema } from '@backstage/config-loader';\nimport {\n ConfigInfo,\n DevToolsInfo,\n Endpoint,\n ExternalDependency,\n ExternalDependencyStatus,\n PackageDependency,\n} from '@backstage/plugin-devtools-common';\n\nimport { JsonObject } from '@backstage/types';\nimport { Logger } from 'winston';\nimport fetch from 'node-fetch';\nimport { findPaths } from '@backstage/cli-common';\nimport { getPackages } from '@manypkg/get-packages';\nimport ping from 'ping';\nimport os from 'os';\nimport fs from 'fs-extra';\nimport { Lockfile } from '../util/Lockfile';\nimport { memoize } from 'lodash';\nimport { assertError } from '@backstage/errors';\n\n/** @public */\nexport class DevToolsBackendApi {\n public constructor(\n private readonly logger: Logger,\n private readonly config: Config,\n ) {}\n\n public async listExternalDependencyDetails(): Promise<ExternalDependency[]> {\n const result: ExternalDependency[] = [];\n\n const endpoints = this.config.getOptional<Endpoint[]>(\n 'devTools.externalDependencies.endpoints',\n );\n if (!endpoints) {\n // No external dependency endpoints configured\n return result;\n }\n for (const endpoint of endpoints) {\n this.logger?.info(\n `Checking external dependency \"${endpoint.name}\" at \"${endpoint.target}\"`,\n );\n\n switch (endpoint.type) {\n case 'ping': {\n const pingResult = await this.pingExternalDependency(endpoint);\n result.push(pingResult);\n break;\n }\n case 'fetch': {\n const fetchResult = await this.fetchExternalDependency(endpoint);\n result.push(fetchResult);\n break;\n }\n default:\n return result;\n }\n }\n\n return result;\n }\n\n private async fetchExternalDependency(\n endpoint: Endpoint,\n ): Promise<ExternalDependency> {\n let status;\n let error;\n\n await fetch(endpoint.target)\n .then(res => {\n status =\n res.status === 200\n ? ExternalDependencyStatus.healthy\n : ExternalDependencyStatus.unhealthy;\n this.logger.debug(\n `Fetch for ${endpoint.name} resulted in status code \"${res.status}\"`,\n );\n })\n .catch((err: Error) => {\n this.logger.error(`Fetch failed for ${endpoint.name} - ${err.message}`);\n error = err.message;\n });\n\n const result: ExternalDependency = {\n name: endpoint.name,\n type: endpoint.type,\n target: endpoint.target,\n status: status ?? ExternalDependencyStatus.unhealthy,\n error: error ?? undefined,\n };\n\n return result;\n }\n\n private async pingExternalDependency(\n endpoint: Endpoint,\n ): Promise<ExternalDependency> {\n const pingResult = await ping.promise.probe(endpoint.target);\n\n let error;\n if (\n pingResult.packetLoss === '100.000' ||\n pingResult.packetLoss === 'unknown'\n ) {\n this.logger.error(\n `Ping failed for ${endpoint.name} - ${pingResult.output}`,\n );\n error =\n pingResult.output === ''\n ? `${endpoint.target} - Unknown`\n : pingResult.output;\n }\n\n this.logger.debug(\n `Ping results for ${endpoint.name}: ${pingResult.output}`,\n );\n\n const result: ExternalDependency = {\n name: endpoint.name,\n type: endpoint.type,\n target: endpoint.target,\n status: pingResult.alive\n ? ExternalDependencyStatus.healthy\n : ExternalDependencyStatus.unhealthy,\n error: error ?? undefined,\n };\n\n return result;\n }\n\n public async listConfig(): Promise<ConfigInfo> {\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n\n const { packages } = await getPackages(paths.targetDir);\n const schemaFunc = async () => {\n return await loadConfigSchema({\n dependencies: packages.map(p => p.packageJson.name),\n });\n };\n\n const schemaMemo = memoize(schemaFunc);\n const schema = await schemaMemo();\n\n const configInfo: ConfigInfo = {\n config: undefined,\n error: undefined,\n };\n try {\n const config = {\n data: this.config.get() as JsonObject,\n context: 'inline',\n };\n const sanitizedConfigs = schema.process([config], {\n ignoreSchemaErrors: false,\n valueTransform: (value, context) =>\n context.visibility === 'secret' ? '<secret>' : value,\n });\n\n const data = ConfigReader.fromConfigs(sanitizedConfigs).get();\n configInfo.config = data;\n } catch (error) {\n assertError(error);\n // The config is not valid for some reason but we want to be able to see it still\n const config = {\n data: this.config.get() as JsonObject,\n context: 'inline',\n };\n const sanitizedConfigs = schema.process([config], {\n ignoreSchemaErrors: true,\n valueTransform: (value, context) =>\n context.visibility === 'secret' ? '<secret>' : value,\n });\n\n const data = ConfigReader.fromConfigs(sanitizedConfigs).get();\n configInfo.config = data;\n configInfo.error = {\n name: error.name,\n message: error.message,\n messages: error.messages as string[] | undefined,\n stack: error.stack,\n };\n }\n\n return configInfo;\n }\n\n public async listInfo(): Promise<DevToolsInfo> {\n const operatingSystem = `${os.hostname()}: ${os.type} ${os.release} - ${\n os.platform\n }/${os.arch}`;\n const usedMem = Math.floor((os.totalmem() - os.freemem()) / (1024 * 1024));\n const resources = `Memory: ${usedMem}/${Math.floor(\n os.totalmem() / (1024 * 1024),\n )}MB - Load: ${os\n .loadavg()\n .map(v => v.toFixed(2))\n .join('/')}`;\n const nodeJsVersion = process.version;\n\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n const backstageFile = paths.resolveTargetRoot('backstage.json');\n let backstageJson = undefined;\n if (fs.existsSync(backstageFile)) {\n const buffer = await fs.readFile(backstageFile);\n backstageJson = JSON.parse(buffer.toString());\n }\n\n const lockfilePath = paths.resolveTargetRoot('yarn.lock');\n const lockfile = await Lockfile.load(lockfilePath);\n\n const prefixes = ['@backstage', '@internal'].concat(\n this.config.getOptionalStringArray('devTools.info.packagePrefixes') ?? [],\n );\n const deps = [...lockfile.keys()].filter(n =>\n prefixes.some(prefix => n.startsWith(prefix)),\n );\n\n const infoDependencies: PackageDependency[] = [];\n for (const dep of deps) {\n const versions = new Set(lockfile.get(dep)!.map(i => i.version));\n const infoDependency: PackageDependency = {\n name: dep,\n versions: [...versions].join(', '),\n };\n infoDependencies.push(infoDependency);\n }\n\n const info: DevToolsInfo = {\n operatingSystem: operatingSystem ?? 'N/A',\n resourceUtilization: resources ?? 'N/A',\n nodeJsVersion: nodeJsVersion ?? 'N/A',\n backstageVersion:\n backstageJson && backstageJson.version ? backstageJson.version : 'N/A',\n dependencies: infoDependencies,\n };\n\n return info;\n }\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n","/*\n * Copyright 2022 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 { AuthorizeResult } from '@backstage/plugin-permission-common';\nimport {\n devToolsConfigReadPermission,\n devToolsExternalDependenciesReadPermission,\n devToolsInfoReadPermission,\n devToolsPermissions,\n} from '@backstage/plugin-devtools-common';\n\nimport { Config } from '@backstage/config';\nimport { DevToolsBackendApi } from '../api';\nimport { Logger } from 'winston';\nimport { NotAllowedError } from '@backstage/errors';\nimport Router from 'express-promise-router';\nimport {\n createLegacyAuthAdapters,\n errorHandler,\n} from '@backstage/backend-common';\nimport express from 'express';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport {\n DiscoveryService,\n HttpAuthService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport interface RouterOptions {\n devToolsBackendApi?: DevToolsBackendApi;\n logger: Logger;\n config: Config;\n permissions: PermissionsService;\n discovery: DiscoveryService;\n httpAuth?: HttpAuthService;\n}\n\n/** @public */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, config, permissions } = options;\n\n const { httpAuth } = createLegacyAuthAdapters(options);\n\n const devToolsBackendApi =\n options.devToolsBackendApi || new DevToolsBackendApi(logger, config);\n\n const router = Router();\n router.use(express.json());\n router.use(\n createPermissionIntegrationRouter({\n permissions: devToolsPermissions,\n }),\n );\n\n router.get('/health', (_req, res) => {\n res.status(200).json({ status: 'ok' });\n });\n\n router.get('/info', async (req, response) => {\n const decision = (\n await permissions.authorize(\n [{ permission: devToolsInfoReadPermission }],\n { credentials: await httpAuth.credentials(req) },\n )\n )[0];\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const info = await devToolsBackendApi.listInfo();\n\n response.status(200).json(info);\n });\n\n router.get('/config', async (req, response) => {\n const decision = (\n await permissions.authorize(\n [{ permission: devToolsConfigReadPermission }],\n { credentials: await httpAuth.credentials(req) },\n )\n )[0];\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const configList = await devToolsBackendApi.listConfig();\n\n response.status(200).json(configList);\n });\n\n router.get('/external-dependencies', async (req, response) => {\n const decision = (\n await permissions.authorize(\n [{ permission: devToolsExternalDependenciesReadPermission }],\n { credentials: await httpAuth.credentials(req) },\n )\n )[0];\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const health = await devToolsBackendApi.listExternalDependencyDetails();\n\n response.status(200).json(health);\n });\n\n router.use(errorHandler());\n return router;\n}\n","/*\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 { loggerToWinstonLogger } from '@backstage/backend-common';\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\n\n/**\n * DevTools backend plugin\n *\n * @public\n */\nexport const devtoolsPlugin = createBackendPlugin({\n pluginId: 'devtools',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n permissions: coreServices.permissions,\n httpRouter: coreServices.httpRouter,\n discovery: coreServices.discovery,\n httpAuth: coreServices.httpAuth,\n },\n async init({\n config,\n logger,\n permissions,\n httpRouter,\n discovery,\n httpAuth,\n }) {\n httpRouter.use(\n await createRouter({\n config,\n logger: loggerToWinstonLogger(logger),\n permissions,\n discovery,\n httpAuth,\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["parseSyml","legacyStringifyLockfile","stringifySyml","fs","semver","fetch","ExternalDependencyStatus","ping","findPaths","getPackages","loadConfigSchema","memoize","config","ConfigReader","assertError","os","createLegacyAuthAdapters","Router","express","createPermissionIntegrationRouter","devToolsPermissions","devToolsInfoReadPermission","AuthorizeResult","NotAllowedError","devToolsConfigReadPermission","devToolsExternalDependenciesReadPermission","errorHandler","createBackendPlugin","coreServices","loggerToWinstonLogger"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/util/Lockfile.ts","../src/api/DevToolsBackendApi.ts","../src/service/router.ts","../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2022 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 fs from 'fs-extra';\nimport semver from 'semver';\nimport { parseSyml, stringifySyml } from '@yarnpkg/parsers';\nimport { stringify as legacyStringifyLockfile } from '@yarnpkg/lockfile';\n\nconst ENTRY_PATTERN = /^((?:@[^/]+\\/)?[^@/]+)@(.+)$/;\n\ntype LockfileData = {\n [entry: string]: {\n version: string;\n resolved?: string;\n integrity?: string;\n dependencies?: { [name: string]: string };\n };\n};\n\ntype LockfileQueryEntry = {\n range: string;\n version: string;\n};\n\n/** Entries that have an invalid version range, for example an npm tag */\ntype AnalyzeResultInvalidRange = {\n name: string;\n range: string;\n};\n\n/** Entries that can be deduplicated by bumping to an existing higher version */\ntype AnalyzeResultNewVersion = {\n name: string;\n range: string;\n oldVersion: string;\n newVersion: string;\n};\n\n/** Entries that would need a dependency update in package.json to be deduplicated */\ntype AnalyzeResultNewRange = {\n name: string;\n oldRange: string;\n newRange: string;\n oldVersion: string;\n newVersion: string;\n};\n\ntype AnalyzeResult = {\n invalidRanges: AnalyzeResultInvalidRange[];\n newVersions: AnalyzeResultNewVersion[];\n newRanges: AnalyzeResultNewRange[];\n};\n\nfunction parseLockfile(lockfileContents: string) {\n try {\n return {\n object: parseSyml(lockfileContents),\n type: 'success',\n };\n } catch (err) {\n return {\n object: null,\n type: err,\n };\n }\n}\n\n// the new yarn header is handled out of band of the parsing\n// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-core/sources/Project.ts#L1741-L1746\nconst NEW_HEADER = `${[\n `# This file is generated by running \"yarn install\" inside your project.\\n`,\n `# Manual changes might be lost - proceed with caution!\\n`,\n].join(``)}\\n`;\n\nfunction stringifyLockfile(data: LockfileData, legacy: boolean) {\n return legacy\n ? legacyStringifyLockfile(data)\n : NEW_HEADER + stringifySyml(data);\n}\n// taken from yarn parser package\n// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-parsers/sources/syml.ts#L136\nconst LEGACY_REGEX = /^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i;\n\n// these are special top level yarn keys.\n// https://github.com/yarnpkg/berry/blob/9bd61fbffb83d0b8166a9cc26bec3a58743aa453/packages/yarnpkg-parsers/sources/syml.ts#L9\nconst SPECIAL_OBJECT_KEYS = [\n `__metadata`,\n `version`,\n `resolution`,\n `dependencies`,\n `peerDependencies`,\n `dependenciesMeta`,\n `peerDependenciesMeta`,\n `binaries`,\n];\n\nexport class Lockfile {\n static async load(path: string) {\n const lockfileContents = await fs.readFile(path, 'utf8');\n const legacy = LEGACY_REGEX.test(lockfileContents);\n const lockfile = parseLockfile(lockfileContents);\n if (lockfile.type !== 'success') {\n throw new Error(`Failed yarn.lock parse with ${lockfile.type}`);\n }\n\n const data = lockfile.object as LockfileData;\n const packages = new Map<string, LockfileQueryEntry[]>();\n\n for (const [key, value] of Object.entries(data)) {\n if (SPECIAL_OBJECT_KEYS.includes(key)) continue;\n\n const [, name, range] = ENTRY_PATTERN.exec(key) ?? [];\n if (!name) {\n throw new Error(`Failed to parse yarn.lock entry '${key}'`);\n }\n\n let queries = packages.get(name);\n if (!queries) {\n queries = [];\n packages.set(name, queries);\n }\n queries.push({ range, version: value.version });\n }\n\n return new Lockfile(path, packages, data, legacy);\n }\n\n private constructor(\n private readonly path: string,\n private readonly packages: Map<string, LockfileQueryEntry[]>,\n private readonly data: LockfileData,\n private readonly legacy: boolean = false,\n ) {}\n\n /** Get the entries for a single package in the lockfile */\n get(name: string): LockfileQueryEntry[] | undefined {\n return this.packages.get(name);\n }\n\n /** Returns the name of all packages available in the lockfile */\n keys(): IterableIterator<string> {\n return this.packages.keys();\n }\n\n /** Analyzes the lockfile to identify possible actions and warnings for the entries */\n analyze(options?: { filter?: (name: string) => boolean }): AnalyzeResult {\n const { filter } = options ?? {};\n const result: AnalyzeResult = {\n invalidRanges: [],\n newVersions: [],\n newRanges: [],\n };\n\n for (const [name, allEntries] of this.packages) {\n if (filter && !filter(name)) {\n continue;\n }\n\n // Get rid of and signal any invalid ranges upfront\n const invalid = allEntries.filter(e => !semver.validRange(e.range));\n result.invalidRanges.push(\n ...invalid.map(({ range }) => ({ name, range })),\n );\n\n // Grab all valid entries, if there aren't at least 2 different valid ones we're done\n const entries = allEntries.filter(e => semver.validRange(e.range));\n if (entries.length < 2) {\n continue;\n }\n\n // Find all versions currently in use\n const versions = Array.from(new Set(entries.map(e => e.version))).sort(\n (v1, v2) => semver.rcompare(v1, v2),\n );\n\n // If we're not using at least 2 different versions we're done\n if (versions.length < 2) {\n continue;\n }\n\n const acceptedVersions = new Set<string>();\n for (const { version, range } of entries) {\n // Finds the highest matching version from the the known versions\n // TODO(Rugvip): We may want to select the version that satisfies the most ranges rather than the highest one\n const acceptedVersion = versions.find(v => semver.satisfies(v, range));\n if (!acceptedVersion) {\n throw new Error(\n `No existing version was accepted for range ${range}, searching through ${versions}, for package ${name}`,\n );\n }\n\n if (acceptedVersion !== version) {\n result.newVersions.push({\n name,\n range,\n newVersion: acceptedVersion,\n oldVersion: version,\n });\n }\n\n acceptedVersions.add(acceptedVersion);\n }\n\n // If all ranges were able to accept the same version, we're done\n if (acceptedVersions.size === 1) {\n continue;\n }\n\n // Find the max version that we may want bump older packages to\n const maxVersion = Array.from(acceptedVersions).sort(semver.rcompare)[0];\n // Find all existing ranges that satisfy the new max version, and pick the one that\n // results in the highest minimum allowed version, usually being the more specific one\n const maxEntry = entries\n .filter(e => semver.satisfies(maxVersion, e.range))\n .map(e => ({ e, min: semver.minVersion(e.range) }))\n .filter(p => p.min)\n .sort((a, b) => semver.rcompare(a.min!, b.min!))[0]?.e;\n if (!maxEntry) {\n throw new Error(\n `No entry found that satisfies max version '${maxVersion}'`,\n );\n }\n\n // Find all entries that don't satisfy the max version\n for (const { version, range } of entries) {\n if (semver.satisfies(maxVersion, range)) {\n continue;\n }\n\n result.newRanges.push({\n name,\n oldRange: range,\n newRange: maxEntry.range,\n oldVersion: version,\n newVersion: maxVersion,\n });\n }\n }\n\n return result;\n }\n\n remove(name: string, range: string): boolean {\n const query = `${name}@${range}`;\n const existed = Boolean(this.data[query]);\n delete this.data[query];\n\n const newEntries = this.packages.get(name)?.filter(e => e.range !== range);\n if (newEntries) {\n this.packages.set(name, newEntries);\n }\n\n return existed;\n }\n\n /** Modifies the lockfile by bumping packages to the suggested versions */\n replaceVersions(results: AnalyzeResultNewVersion[]) {\n for (const { name, range, oldVersion, newVersion } of results) {\n const query = `${name}@${range}`;\n\n // Update the backing data\n const entryData = this.data[query];\n if (!entryData) {\n throw new Error(`No entry data for ${query}`);\n }\n if (entryData.version !== oldVersion) {\n throw new Error(\n `Expected existing version data for ${query} to be ${oldVersion}, was ${entryData.version}`,\n );\n }\n\n // Modifying the data in the entry is not enough, we need to reference an existing version object\n const matchingEntry = Object.entries(this.data).find(\n ([q, e]) => q.startsWith(`${name}@`) && e.version === newVersion,\n );\n if (!matchingEntry) {\n throw new Error(\n `No matching entry found for ${name} at version ${newVersion}`,\n );\n }\n this.data[query] = matchingEntry[1];\n\n // Update our internal data structure\n const entry = this.packages.get(name)?.find(e => e.range === range);\n if (!entry) {\n throw new Error(`No entry data for ${query}`);\n }\n if (entry.version !== oldVersion) {\n throw new Error(\n `Expected existing version data for ${query} to be ${oldVersion}, was ${entryData.version}`,\n );\n }\n entry.version = newVersion;\n }\n }\n\n async save() {\n await fs.writeFile(this.path, this.toString(), 'utf8');\n }\n\n toString() {\n return stringifyLockfile(this.data, this.legacy);\n }\n}\n","/*\n * Copyright 2022 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 { Config, ConfigReader } from '@backstage/config';\nimport { loadConfigSchema } from '@backstage/config-loader';\nimport {\n ConfigInfo,\n DevToolsInfo,\n Endpoint,\n ExternalDependency,\n ExternalDependencyStatus,\n PackageDependency,\n} from '@backstage/plugin-devtools-common';\n\nimport { JsonObject } from '@backstage/types';\nimport { Logger } from 'winston';\nimport fetch from 'node-fetch';\nimport { findPaths } from '@backstage/cli-common';\nimport { getPackages } from '@manypkg/get-packages';\nimport ping from 'ping';\nimport os from 'os';\nimport fs from 'fs-extra';\nimport { Lockfile } from '../util/Lockfile';\nimport { memoize } from 'lodash';\nimport { assertError } from '@backstage/errors';\n\n/** @public */\nexport class DevToolsBackendApi {\n public constructor(\n private readonly logger: Logger,\n private readonly config: Config,\n ) {}\n\n public async listExternalDependencyDetails(): Promise<ExternalDependency[]> {\n const result: ExternalDependency[] = [];\n\n const endpoints = this.config.getOptional<Endpoint[]>(\n 'devTools.externalDependencies.endpoints',\n );\n if (!endpoints) {\n // No external dependency endpoints configured\n return result;\n }\n for (const endpoint of endpoints) {\n this.logger?.info(\n `Checking external dependency \"${endpoint.name}\" at \"${endpoint.target}\"`,\n );\n\n switch (endpoint.type) {\n case 'ping': {\n const pingResult = await this.pingExternalDependency(endpoint);\n result.push(pingResult);\n break;\n }\n case 'fetch': {\n const fetchResult = await this.fetchExternalDependency(endpoint);\n result.push(fetchResult);\n break;\n }\n default:\n return result;\n }\n }\n\n return result;\n }\n\n private async fetchExternalDependency(\n endpoint: Endpoint,\n ): Promise<ExternalDependency> {\n let status;\n let error;\n\n await fetch(endpoint.target)\n .then(res => {\n status =\n res.status === 200\n ? ExternalDependencyStatus.healthy\n : ExternalDependencyStatus.unhealthy;\n this.logger.debug(\n `Fetch for ${endpoint.name} resulted in status code \"${res.status}\"`,\n );\n })\n .catch((err: Error) => {\n this.logger.error(`Fetch failed for ${endpoint.name} - ${err.message}`);\n error = err.message;\n });\n\n const result: ExternalDependency = {\n name: endpoint.name,\n type: endpoint.type,\n target: endpoint.target,\n status: status ?? ExternalDependencyStatus.unhealthy,\n error: error ?? undefined,\n };\n\n return result;\n }\n\n private async pingExternalDependency(\n endpoint: Endpoint,\n ): Promise<ExternalDependency> {\n const pingResult = await ping.promise.probe(endpoint.target);\n\n let error;\n if (\n pingResult.packetLoss === '100.000' ||\n pingResult.packetLoss === 'unknown'\n ) {\n this.logger.error(\n `Ping failed for ${endpoint.name} - ${pingResult.output}`,\n );\n error =\n pingResult.output === ''\n ? `${endpoint.target} - Unknown`\n : pingResult.output;\n }\n\n this.logger.debug(\n `Ping results for ${endpoint.name}: ${pingResult.output}`,\n );\n\n const result: ExternalDependency = {\n name: endpoint.name,\n type: endpoint.type,\n target: endpoint.target,\n status: pingResult.alive\n ? ExternalDependencyStatus.healthy\n : ExternalDependencyStatus.unhealthy,\n error: error ?? undefined,\n };\n\n return result;\n }\n\n public async listConfig(): Promise<ConfigInfo> {\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n\n const { packages } = await getPackages(paths.targetDir);\n const schemaFunc = async () => {\n return await loadConfigSchema({\n dependencies: packages.map(p => p.packageJson.name),\n });\n };\n\n const schemaMemo = memoize(schemaFunc);\n const schema = await schemaMemo();\n\n const configInfo: ConfigInfo = {\n config: undefined,\n error: undefined,\n };\n try {\n const config = {\n data: this.config.get() as JsonObject,\n context: 'inline',\n };\n const sanitizedConfigs = schema.process([config], {\n ignoreSchemaErrors: false,\n valueTransform: (value, context) =>\n context.visibility === 'secret' ? '<secret>' : value,\n });\n\n const data = ConfigReader.fromConfigs(sanitizedConfigs).get();\n configInfo.config = data;\n } catch (error) {\n assertError(error);\n // The config is not valid for some reason but we want to be able to see it still\n const config = {\n data: this.config.get() as JsonObject,\n context: 'inline',\n };\n const sanitizedConfigs = schema.process([config], {\n ignoreSchemaErrors: true,\n valueTransform: (value, context) =>\n context.visibility === 'secret' ? '<secret>' : value,\n });\n\n const data = ConfigReader.fromConfigs(sanitizedConfigs).get();\n configInfo.config = data;\n configInfo.error = {\n name: error.name,\n message: error.message,\n messages: error.messages as string[] | undefined,\n stack: error.stack,\n };\n }\n\n return configInfo;\n }\n\n public async listInfo(): Promise<DevToolsInfo> {\n const operatingSystem = `${os.hostname()}: ${os.type} ${os.release} - ${\n os.platform\n }/${os.arch}`;\n const usedMem = Math.floor((os.totalmem() - os.freemem()) / (1024 * 1024));\n const resources = `Memory: ${usedMem}/${Math.floor(\n os.totalmem() / (1024 * 1024),\n )}MB - Load: ${os\n .loadavg()\n .map(v => v.toFixed(2))\n .join('/')}`;\n const nodeJsVersion = process.version;\n\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n const backstageFile = paths.resolveTargetRoot('backstage.json');\n let backstageJson = undefined;\n if (fs.existsSync(backstageFile)) {\n const buffer = await fs.readFile(backstageFile);\n backstageJson = JSON.parse(buffer.toString());\n }\n\n const lockfilePath = paths.resolveTargetRoot('yarn.lock');\n const lockfile = await Lockfile.load(lockfilePath);\n\n const prefixes = ['@backstage', '@internal'].concat(\n this.config.getOptionalStringArray('devTools.info.packagePrefixes') ?? [],\n );\n const deps = [...lockfile.keys()].filter(n =>\n prefixes.some(prefix => n.startsWith(prefix)),\n );\n\n const infoDependencies: PackageDependency[] = [];\n for (const dep of deps) {\n const versions = new Set(lockfile.get(dep)!.map(i => i.version));\n const infoDependency: PackageDependency = {\n name: dep,\n versions: [...versions].join(', '),\n };\n infoDependencies.push(infoDependency);\n }\n\n const info: DevToolsInfo = {\n operatingSystem: operatingSystem ?? 'N/A',\n resourceUtilization: resources ?? 'N/A',\n nodeJsVersion: nodeJsVersion ?? 'N/A',\n backstageVersion:\n backstageJson && backstageJson.version ? backstageJson.version : 'N/A',\n dependencies: infoDependencies,\n };\n\n return info;\n }\n}\n\nexport function isValidUrl(url: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n","/*\n * Copyright 2022 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 { AuthorizeResult } from '@backstage/plugin-permission-common';\nimport {\n devToolsConfigReadPermission,\n devToolsExternalDependenciesReadPermission,\n devToolsInfoReadPermission,\n devToolsPermissions,\n} from '@backstage/plugin-devtools-common';\n\nimport { Config } from '@backstage/config';\nimport { DevToolsBackendApi } from '../api';\nimport { Logger } from 'winston';\nimport { NotAllowedError } from '@backstage/errors';\nimport Router from 'express-promise-router';\nimport {\n createLegacyAuthAdapters,\n errorHandler,\n} from '@backstage/backend-common';\nimport express from 'express';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport {\n DiscoveryService,\n HttpAuthService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport interface RouterOptions {\n devToolsBackendApi?: DevToolsBackendApi;\n logger: Logger;\n config: Config;\n permissions: PermissionsService;\n discovery: DiscoveryService;\n httpAuth?: HttpAuthService;\n}\n\n/** @public */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, config, permissions } = options;\n\n const { httpAuth } = createLegacyAuthAdapters(options);\n\n const devToolsBackendApi =\n options.devToolsBackendApi || new DevToolsBackendApi(logger, config);\n\n const router = Router();\n router.use(express.json());\n router.use(\n createPermissionIntegrationRouter({\n permissions: devToolsPermissions,\n }),\n );\n\n router.get('/health', (_req, res) => {\n res.status(200).json({ status: 'ok' });\n });\n\n router.get('/info', async (req, response) => {\n const decision = (\n await permissions.authorize(\n [{ permission: devToolsInfoReadPermission }],\n { credentials: await httpAuth.credentials(req) },\n )\n )[0];\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const info = await devToolsBackendApi.listInfo();\n\n response.status(200).json(info);\n });\n\n router.get('/config', async (req, response) => {\n const decision = (\n await permissions.authorize(\n [{ permission: devToolsConfigReadPermission }],\n { credentials: await httpAuth.credentials(req) },\n )\n )[0];\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const configList = await devToolsBackendApi.listConfig();\n\n response.status(200).json(configList);\n });\n\n router.get('/external-dependencies', async (req, response) => {\n const decision = (\n await permissions.authorize(\n [{ permission: devToolsExternalDependenciesReadPermission }],\n { credentials: await httpAuth.credentials(req) },\n )\n )[0];\n\n if (decision.result === AuthorizeResult.DENY) {\n throw new NotAllowedError('Unauthorized');\n }\n\n const health = await devToolsBackendApi.listExternalDependencyDetails();\n\n response.status(200).json(health);\n });\n\n router.use(errorHandler());\n return router;\n}\n","/*\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 { loggerToWinstonLogger } from '@backstage/backend-common';\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\n\n/**\n * DevTools backend plugin\n *\n * @public\n */\nexport const devtoolsPlugin = createBackendPlugin({\n pluginId: 'devtools',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n permissions: coreServices.permissions,\n httpRouter: coreServices.httpRouter,\n discovery: coreServices.discovery,\n httpAuth: coreServices.httpAuth,\n },\n async init({\n config,\n logger,\n permissions,\n httpRouter,\n discovery,\n httpAuth,\n }) {\n httpRouter.use(\n await createRouter({\n config,\n logger: loggerToWinstonLogger(logger),\n permissions,\n discovery,\n httpAuth,\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["parseSyml","legacyStringifyLockfile","stringifySyml","fs","semver","fetch","ExternalDependencyStatus","ping","findPaths","getPackages","loadConfigSchema","memoize","config","ConfigReader","assertError","os","createLegacyAuthAdapters","Router","express","createPermissionIntegrationRouter","devToolsPermissions","devToolsInfoReadPermission","AuthorizeResult","NotAllowedError","devToolsConfigReadPermission","devToolsExternalDependenciesReadPermission","errorHandler","createBackendPlugin","coreServices","loggerToWinstonLogger"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -36,4 +36,4 @@ declare function createRouter(options: RouterOptions): Promise<express.Router>;
36
36
  */
37
37
  declare const devtoolsPlugin: () => _backstage_backend_plugin_api.BackendFeature;
38
38
 
39
- export { DevToolsBackendApi, RouterOptions, createRouter, devtoolsPlugin as default };
39
+ export { DevToolsBackendApi, type RouterOptions, createRouter, devtoolsPlugin as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-devtools-backend",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -28,15 +28,15 @@
28
28
  "postpack": "backstage-cli package postpack"
29
29
  },
30
30
  "dependencies": {
31
- "@backstage/backend-common": "^0.21.4",
32
- "@backstage/backend-plugin-api": "^0.6.14",
31
+ "@backstage/backend-common": "^0.21.6",
32
+ "@backstage/backend-plugin-api": "^0.6.16",
33
33
  "@backstage/cli-common": "^0.1.13",
34
34
  "@backstage/config": "^1.2.0",
35
35
  "@backstage/config-loader": "^1.7.0",
36
36
  "@backstage/errors": "^1.2.4",
37
37
  "@backstage/plugin-devtools-common": "^0.1.9",
38
38
  "@backstage/plugin-permission-common": "^0.7.13",
39
- "@backstage/plugin-permission-node": "^0.7.25",
39
+ "@backstage/plugin-permission-node": "^0.7.27",
40
40
  "@backstage/types": "^1.1.1",
41
41
  "@manypkg/get-packages": "^1.1.3",
42
42
  "@types/express": "*",
@@ -53,8 +53,8 @@
53
53
  "yn": "^4.0.0"
54
54
  },
55
55
  "devDependencies": {
56
- "@backstage/backend-test-utils": "^0.3.4",
57
- "@backstage/cli": "^0.26.0",
56
+ "@backstage/backend-test-utils": "^0.3.6",
57
+ "@backstage/cli": "^0.26.2",
58
58
  "@types/ping": "^0.4.1",
59
59
  "@types/supertest": "^2.0.8",
60
60
  "@types/yarnpkg__lockfile": "^1.1.4",