@backstage/plugin-devtools-backend 0.3.8 → 0.3.9-next.0
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 +17 -0
- package/dist/index.cjs.js +2 -121
- package/dist/index.cjs.js.map +1 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @backstage/plugin-devtools-backend
|
|
2
2
|
|
|
3
|
+
## 0.3.9-next.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 32a38e1: Removed unused code for lockfile analysis.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/backend-common@0.23.4-next.0
|
|
10
|
+
- @backstage/config-loader@1.8.2-next.0
|
|
11
|
+
- @backstage/backend-plugin-api@0.7.1-next.0
|
|
12
|
+
- @backstage/cli-common@0.1.14
|
|
13
|
+
- @backstage/config@1.2.0
|
|
14
|
+
- @backstage/errors@1.2.4
|
|
15
|
+
- @backstage/types@1.1.1
|
|
16
|
+
- @backstage/plugin-devtools-common@0.1.11
|
|
17
|
+
- @backstage/plugin-permission-common@0.8.0
|
|
18
|
+
- @backstage/plugin-permission-node@0.8.1-next.0
|
|
19
|
+
|
|
3
20
|
## 0.3.8
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/dist/index.cjs.js
CHANGED
|
@@ -11,7 +11,6 @@ var getPackages = require('@manypkg/get-packages');
|
|
|
11
11
|
var ping = require('ping');
|
|
12
12
|
var os = require('os');
|
|
13
13
|
var fs = require('fs-extra');
|
|
14
|
-
var semver = require('semver');
|
|
15
14
|
var parsers = require('@yarnpkg/parsers');
|
|
16
15
|
var lockfile = require('@yarnpkg/lockfile');
|
|
17
16
|
var lodash = require('lodash');
|
|
@@ -29,7 +28,6 @@ var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
|
|
|
29
28
|
var ping__default = /*#__PURE__*/_interopDefaultCompat(ping);
|
|
30
29
|
var os__default = /*#__PURE__*/_interopDefaultCompat(os);
|
|
31
30
|
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
32
|
-
var semver__default = /*#__PURE__*/_interopDefaultCompat(semver);
|
|
33
31
|
var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
|
|
34
32
|
var express__default = /*#__PURE__*/_interopDefaultCompat(express);
|
|
35
33
|
|
|
@@ -69,8 +67,7 @@ const SPECIAL_OBJECT_KEYS = [
|
|
|
69
67
|
`binaries`
|
|
70
68
|
];
|
|
71
69
|
class Lockfile {
|
|
72
|
-
constructor(
|
|
73
|
-
this.path = path;
|
|
70
|
+
constructor(packages, data, legacy = false) {
|
|
74
71
|
this.packages = packages;
|
|
75
72
|
this.data = data;
|
|
76
73
|
this.legacy = legacy;
|
|
@@ -97,7 +94,7 @@ class Lockfile {
|
|
|
97
94
|
}
|
|
98
95
|
queries.push({ range, version: value.version });
|
|
99
96
|
}
|
|
100
|
-
return new Lockfile(
|
|
97
|
+
return new Lockfile(packages, data, legacy);
|
|
101
98
|
}
|
|
102
99
|
/** Get the entries for a single package in the lockfile */
|
|
103
100
|
get(name) {
|
|
@@ -107,122 +104,6 @@ class Lockfile {
|
|
|
107
104
|
keys() {
|
|
108
105
|
return this.packages.keys();
|
|
109
106
|
}
|
|
110
|
-
/** Analyzes the lockfile to identify possible actions and warnings for the entries */
|
|
111
|
-
analyze(options) {
|
|
112
|
-
const { filter } = options ?? {};
|
|
113
|
-
const result = {
|
|
114
|
-
invalidRanges: [],
|
|
115
|
-
newVersions: [],
|
|
116
|
-
newRanges: []
|
|
117
|
-
};
|
|
118
|
-
for (const [name, allEntries] of this.packages) {
|
|
119
|
-
if (filter && !filter(name)) {
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
const invalid = allEntries.filter((e) => !semver__default.default.validRange(e.range));
|
|
123
|
-
result.invalidRanges.push(
|
|
124
|
-
...invalid.map(({ range }) => ({ name, range }))
|
|
125
|
-
);
|
|
126
|
-
const entries = allEntries.filter((e) => semver__default.default.validRange(e.range));
|
|
127
|
-
if (entries.length < 2) {
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
const versions = Array.from(new Set(entries.map((e) => e.version))).sort(
|
|
131
|
-
(v1, v2) => semver__default.default.rcompare(v1, v2)
|
|
132
|
-
);
|
|
133
|
-
if (versions.length < 2) {
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
const acceptedVersions = /* @__PURE__ */ new Set();
|
|
137
|
-
for (const { version, range } of entries) {
|
|
138
|
-
const acceptedVersion = versions.find((v) => semver__default.default.satisfies(v, range));
|
|
139
|
-
if (!acceptedVersion) {
|
|
140
|
-
throw new Error(
|
|
141
|
-
`No existing version was accepted for range ${range}, searching through ${versions}, for package ${name}`
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
if (acceptedVersion !== version) {
|
|
145
|
-
result.newVersions.push({
|
|
146
|
-
name,
|
|
147
|
-
range,
|
|
148
|
-
newVersion: acceptedVersion,
|
|
149
|
-
oldVersion: version
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
acceptedVersions.add(acceptedVersion);
|
|
153
|
-
}
|
|
154
|
-
if (acceptedVersions.size === 1) {
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
const maxVersion = Array.from(acceptedVersions).sort(semver__default.default.rcompare)[0];
|
|
158
|
-
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;
|
|
159
|
-
if (!maxEntry) {
|
|
160
|
-
throw new Error(
|
|
161
|
-
`No entry found that satisfies max version '${maxVersion}'`
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
for (const { version, range } of entries) {
|
|
165
|
-
if (semver__default.default.satisfies(maxVersion, range)) {
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
result.newRanges.push({
|
|
169
|
-
name,
|
|
170
|
-
oldRange: range,
|
|
171
|
-
newRange: maxEntry.range,
|
|
172
|
-
oldVersion: version,
|
|
173
|
-
newVersion: maxVersion
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return result;
|
|
178
|
-
}
|
|
179
|
-
remove(name, range) {
|
|
180
|
-
const query = `${name}@${range}`;
|
|
181
|
-
const existed = Boolean(this.data[query]);
|
|
182
|
-
delete this.data[query];
|
|
183
|
-
const newEntries = this.packages.get(name)?.filter((e) => e.range !== range);
|
|
184
|
-
if (newEntries) {
|
|
185
|
-
this.packages.set(name, newEntries);
|
|
186
|
-
}
|
|
187
|
-
return existed;
|
|
188
|
-
}
|
|
189
|
-
/** Modifies the lockfile by bumping packages to the suggested versions */
|
|
190
|
-
replaceVersions(results) {
|
|
191
|
-
for (const { name, range, oldVersion, newVersion } of results) {
|
|
192
|
-
const query = `${name}@${range}`;
|
|
193
|
-
const entryData = this.data[query];
|
|
194
|
-
if (!entryData) {
|
|
195
|
-
throw new Error(`No entry data for ${query}`);
|
|
196
|
-
}
|
|
197
|
-
if (entryData.version !== oldVersion) {
|
|
198
|
-
throw new Error(
|
|
199
|
-
`Expected existing version data for ${query} to be ${oldVersion}, was ${entryData.version}`
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
const matchingEntry = Object.entries(this.data).find(
|
|
203
|
-
([q, e]) => q.startsWith(`${name}@`) && e.version === newVersion
|
|
204
|
-
);
|
|
205
|
-
if (!matchingEntry) {
|
|
206
|
-
throw new Error(
|
|
207
|
-
`No matching entry found for ${name} at version ${newVersion}`
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
this.data[query] = matchingEntry[1];
|
|
211
|
-
const entry = this.packages.get(name)?.find((e) => e.range === range);
|
|
212
|
-
if (!entry) {
|
|
213
|
-
throw new Error(`No entry data for ${query}`);
|
|
214
|
-
}
|
|
215
|
-
if (entry.version !== oldVersion) {
|
|
216
|
-
throw new Error(
|
|
217
|
-
`Expected existing version data for ${query} to be ${oldVersion}, was ${entryData.version}`
|
|
218
|
-
);
|
|
219
|
-
}
|
|
220
|
-
entry.version = newVersion;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
async save() {
|
|
224
|
-
await fs__default.default.writeFile(this.path, this.toString(), "utf8");
|
|
225
|
-
}
|
|
226
107
|
toString() {
|
|
227
108
|
return stringifyLockfile(this.data, this.legacy);
|
|
228
109
|
}
|
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 { 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\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(packages, data, legacy);\n }\n\n private constructor(\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 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","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.9-next.0",
|
|
4
4
|
"backstage": {
|
|
5
5
|
"role": "backend-plugin",
|
|
6
6
|
"pluginId": "devtools",
|
|
@@ -38,15 +38,15 @@
|
|
|
38
38
|
"test": "backstage-cli package test"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@backstage/backend-common": "^0.23.
|
|
42
|
-
"@backstage/backend-plugin-api": "^0.7.0",
|
|
41
|
+
"@backstage/backend-common": "^0.23.4-next.0",
|
|
42
|
+
"@backstage/backend-plugin-api": "^0.7.1-next.0",
|
|
43
43
|
"@backstage/cli-common": "^0.1.14",
|
|
44
44
|
"@backstage/config": "^1.2.0",
|
|
45
|
-
"@backstage/config-loader": "^1.8.
|
|
45
|
+
"@backstage/config-loader": "^1.8.2-next.0",
|
|
46
46
|
"@backstage/errors": "^1.2.4",
|
|
47
47
|
"@backstage/plugin-devtools-common": "^0.1.11",
|
|
48
48
|
"@backstage/plugin-permission-common": "^0.8.0",
|
|
49
|
-
"@backstage/plugin-permission-node": "^0.8.0",
|
|
49
|
+
"@backstage/plugin-permission-node": "^0.8.1-next.0",
|
|
50
50
|
"@backstage/types": "^1.1.1",
|
|
51
51
|
"@manypkg/get-packages": "^1.1.3",
|
|
52
52
|
"@types/express": "*",
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
"yn": "^4.0.0"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
|
-
"@backstage/backend-defaults": "^0.4.0",
|
|
66
|
-
"@backstage/backend-test-utils": "^0.4.
|
|
67
|
-
"@backstage/cli": "^0.
|
|
65
|
+
"@backstage/backend-defaults": "^0.4.2-next.0",
|
|
66
|
+
"@backstage/backend-test-utils": "^0.4.5-next.0",
|
|
67
|
+
"@backstage/cli": "^0.27.0-next.0",
|
|
68
68
|
"@types/ping": "^0.4.1",
|
|
69
69
|
"@types/supertest": "^2.0.8",
|
|
70
70
|
"@types/yarnpkg__lockfile": "^1.1.4",
|