@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 +27 -0
- package/dist/index.cjs.js +13 -19
- package/dist/index.cjs.js.map +1 -1
- package/package.json +8 -7
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] =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
288
|
-
error: error
|
|
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
|
|
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
|
-
|
|
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
|
|
393
|
-
resourceUtilization: resources
|
|
394
|
-
nodeJsVersion: nodeJsVersion
|
|
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
|
};
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
32
|
-
"@backstage/backend-plugin-api": "^0.6.
|
|
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.
|
|
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
|
|
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-
|
|
56
|
-
"@backstage/
|
|
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",
|