@backstage/plugin-devtools-backend 0.3.4 → 0.3.5-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # @backstage/plugin-devtools-backend
2
2
 
3
+ ## 0.3.5-next.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @backstage/backend-plugin-api@0.6.19-next.1
9
+ - @backstage/plugin-permission-node@0.7.30-next.1
10
+ - @backstage/backend-common@0.23.0-next.1
11
+ - @backstage/config-loader@1.8.0
12
+
13
+ ## 0.3.5-next.0
14
+
15
+ ### Patch Changes
16
+
17
+ - 8869b8e: Updated local development setup.
18
+ - Updated dependencies
19
+ - @backstage/backend-common@0.22.1-next.0
20
+ - @backstage/backend-plugin-api@0.6.19-next.0
21
+ - @backstage/plugin-permission-node@0.7.30-next.0
22
+ - @backstage/config-loader@1.8.0
23
+ - @backstage/cli-common@0.1.13
24
+ - @backstage/config@1.2.0
25
+ - @backstage/errors@1.2.4
26
+ - @backstage/types@1.1.1
27
+ - @backstage/plugin-devtools-common@0.1.9
28
+ - @backstage/plugin-permission-common@0.7.13
29
+
3
30
  ## 0.3.4
4
31
 
5
32
  ### Patch Changes
package/dist/index.cjs.js CHANGED
@@ -76,7 +76,6 @@ class Lockfile {
76
76
  this.legacy = legacy;
77
77
  }
78
78
  static async load(path) {
79
- var _a;
80
79
  const lockfileContents = await fs__default.default.readFile(path, "utf8");
81
80
  const legacy = LEGACY_REGEX.test(lockfileContents);
82
81
  const lockfile = parseLockfile(lockfileContents);
@@ -88,7 +87,7 @@ class Lockfile {
88
87
  for (const [key, value] of Object.entries(data)) {
89
88
  if (SPECIAL_OBJECT_KEYS.includes(key))
90
89
  continue;
91
- const [, name, range] = (_a = ENTRY_PATTERN.exec(key)) != null ? _a : [];
90
+ const [, name, range] = ENTRY_PATTERN.exec(key) ?? [];
92
91
  if (!name) {
93
92
  throw new Error(`Failed to parse yarn.lock entry '${key}'`);
94
93
  }
@@ -111,8 +110,7 @@ class Lockfile {
111
110
  }
112
111
  /** Analyzes the lockfile to identify possible actions and warnings for the entries */
113
112
  analyze(options) {
114
- var _a;
115
- const { filter } = options != null ? options : {};
113
+ const { filter } = options ?? {};
116
114
  const result = {
117
115
  invalidRanges: [],
118
116
  newVersions: [],
@@ -158,7 +156,7 @@ class Lockfile {
158
156
  continue;
159
157
  }
160
158
  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;
159
+ const maxEntry = 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]?.e;
162
160
  if (!maxEntry) {
163
161
  throw new Error(
164
162
  `No entry found that satisfies max version '${maxVersion}'`
@@ -180,11 +178,10 @@ class Lockfile {
180
178
  return result;
181
179
  }
182
180
  remove(name, range) {
183
- var _a;
184
181
  const query = `${name}@${range}`;
185
182
  const existed = Boolean(this.data[query]);
186
183
  delete this.data[query];
187
- const newEntries = (_a = this.packages.get(name)) == null ? void 0 : _a.filter((e) => e.range !== range);
184
+ const newEntries = this.packages.get(name)?.filter((e) => e.range !== range);
188
185
  if (newEntries) {
189
186
  this.packages.set(name, newEntries);
190
187
  }
@@ -192,7 +189,6 @@ class Lockfile {
192
189
  }
193
190
  /** Modifies the lockfile by bumping packages to the suggested versions */
194
191
  replaceVersions(results) {
195
- var _a;
196
192
  for (const { name, range, oldVersion, newVersion } of results) {
197
193
  const query = `${name}@${range}`;
198
194
  const entryData = this.data[query];
@@ -213,7 +209,7 @@ class Lockfile {
213
209
  );
214
210
  }
215
211
  this.data[query] = matchingEntry[1];
216
- const entry = (_a = this.packages.get(name)) == null ? void 0 : _a.find((e) => e.range === range);
212
+ const entry = this.packages.get(name)?.find((e) => e.range === range);
217
213
  if (!entry) {
218
214
  throw new Error(`No entry data for ${query}`);
219
215
  }
@@ -239,7 +235,6 @@ class DevToolsBackendApi {
239
235
  this.config = config;
240
236
  }
241
237
  async listExternalDependencyDetails() {
242
- var _a;
243
238
  const result = [];
244
239
  const endpoints = this.config.getOptional(
245
240
  "devTools.externalDependencies.endpoints"
@@ -248,7 +243,7 @@ class DevToolsBackendApi {
248
243
  return result;
249
244
  }
250
245
  for (const endpoint of endpoints) {
251
- (_a = this.logger) == null ? void 0 : _a.info(
246
+ this.logger?.info(
252
247
  `Checking external dependency "${endpoint.name}" at "${endpoint.target}"`
253
248
  );
254
249
  switch (endpoint.type) {
@@ -284,8 +279,8 @@ class DevToolsBackendApi {
284
279
  name: endpoint.name,
285
280
  type: endpoint.type,
286
281
  target: endpoint.target,
287
- status: status != null ? status : pluginDevtoolsCommon.ExternalDependencyStatus.unhealthy,
288
- error: error != null ? error : void 0
282
+ status: status ?? pluginDevtoolsCommon.ExternalDependencyStatus.unhealthy,
283
+ error: error ?? void 0
289
284
  };
290
285
  return result;
291
286
  }
@@ -306,7 +301,7 @@ class DevToolsBackendApi {
306
301
  type: endpoint.type,
307
302
  target: endpoint.target,
308
303
  status: pingResult.alive ? pluginDevtoolsCommon.ExternalDependencyStatus.healthy : pluginDevtoolsCommon.ExternalDependencyStatus.unhealthy,
309
- error: error != null ? error : void 0
304
+ error: error ?? void 0
310
305
  };
311
306
  return result;
312
307
  }
@@ -357,7 +352,6 @@ class DevToolsBackendApi {
357
352
  return configInfo;
358
353
  }
359
354
  async listInfo() {
360
- var _a;
361
355
  const operatingSystem = `${os__default.default.hostname()}: ${os__default.default.type} ${os__default.default.release} - ${os__default.default.platform}/${os__default.default.arch}`;
362
356
  const usedMem = Math.floor((os__default.default.totalmem() - os__default.default.freemem()) / (1024 * 1024));
363
357
  const resources = `Memory: ${usedMem}/${Math.floor(
@@ -374,7 +368,7 @@ class DevToolsBackendApi {
374
368
  const lockfilePath = paths.resolveTargetRoot("yarn.lock");
375
369
  const lockfile = await Lockfile.load(lockfilePath);
376
370
  const prefixes = ["@backstage", "@internal"].concat(
377
- (_a = this.config.getOptionalStringArray("devTools.info.packagePrefixes")) != null ? _a : []
371
+ this.config.getOptionalStringArray("devTools.info.packagePrefixes") ?? []
378
372
  );
379
373
  const deps = [...lockfile.keys()].filter(
380
374
  (n) => prefixes.some((prefix) => n.startsWith(prefix))
@@ -389,9 +383,9 @@ class DevToolsBackendApi {
389
383
  infoDependencies.push(infoDependency);
390
384
  }
391
385
  const info = {
392
- operatingSystem: operatingSystem != null ? operatingSystem : "N/A",
393
- resourceUtilization: resources != null ? resources : "N/A",
394
- nodeJsVersion: nodeJsVersion != null ? nodeJsVersion : "N/A",
386
+ operatingSystem: operatingSystem ?? "N/A",
387
+ resourceUtilization: resources ?? "N/A",
388
+ nodeJsVersion: nodeJsVersion ?? "N/A",
395
389
  backstageVersion: backstageJson && backstageJson.version ? backstageJson.version : "N/A",
396
390
  dependencies: infoDependencies
397
391
  };
@@ -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 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';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\n/** @public */\nexport class DevToolsBackendApi {\n public constructor(\n private readonly logger: LoggerService,\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 { 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 LoggerService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport interface RouterOptions {\n devToolsBackendApi?: DevToolsBackendApi;\n logger: LoggerService;\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 {\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,\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"],"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 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';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\n/** @public */\nexport class DevToolsBackendApi {\n public constructor(\n private readonly logger: LoggerService,\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 { 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 LoggerService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport interface RouterOptions {\n devToolsBackendApi?: DevToolsBackendApi;\n logger: LoggerService;\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 {\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,\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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-devtools-backend",
3
- "version": "0.3.4",
3
+ "version": "0.3.5-next.1",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -28,20 +28,20 @@
28
28
  "postpack": "backstage-cli package postpack"
29
29
  },
30
30
  "dependencies": {
31
- "@backstage/backend-common": "^0.22.0",
32
- "@backstage/backend-plugin-api": "^0.6.18",
31
+ "@backstage/backend-common": "^0.23.0-next.1",
32
+ "@backstage/backend-plugin-api": "^0.6.19-next.1",
33
33
  "@backstage/cli-common": "^0.1.13",
34
34
  "@backstage/config": "^1.2.0",
35
35
  "@backstage/config-loader": "^1.8.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.29",
39
+ "@backstage/plugin-permission-node": "^0.7.30-next.1",
40
40
  "@backstage/types": "^1.1.1",
41
41
  "@manypkg/get-packages": "^1.1.3",
42
42
  "@types/express": "*",
43
43
  "@yarnpkg/lockfile": "^1.1.0",
44
- "@yarnpkg/parsers": "^3.0.0-rc.4",
44
+ "@yarnpkg/parsers": "^3.0.0",
45
45
  "express": "^4.18.1",
46
46
  "express-promise-router": "^4.1.0",
47
47
  "fs-extra": "^11.0.0",
@@ -52,8 +52,9 @@
52
52
  "yn": "^4.0.0"
53
53
  },
54
54
  "devDependencies": {
55
- "@backstage/backend-test-utils": "^0.3.8",
56
- "@backstage/cli": "^0.26.5",
55
+ "@backstage/backend-defaults": "^0.3.0-next.1",
56
+ "@backstage/backend-test-utils": "^0.4.0-next.1",
57
+ "@backstage/cli": "^0.26.7-next.1",
57
58
  "@types/ping": "^0.4.1",
58
59
  "@types/supertest": "^2.0.8",
59
60
  "@types/yarnpkg__lockfile": "^1.1.4",