@backstage/plugin-devtools-backend 0.5.8-next.0 → 0.5.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 CHANGED
@@ -1,5 +1,23 @@
1
1
  # @backstage/plugin-devtools-backend
2
2
 
3
+ ## 0.5.9-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @backstage/backend-defaults@0.12.1-next.0
9
+ - @backstage/backend-plugin-api@1.4.3-next.0
10
+ - @backstage/plugin-permission-node@0.10.4-next.0
11
+
12
+ ## 0.5.8
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies
17
+ - @backstage/backend-defaults@0.12.0
18
+ - @backstage/plugin-permission-node@0.10.3
19
+ - @backstage/backend-plugin-api@1.4.2
20
+
3
21
  ## 0.5.8-next.0
4
22
 
5
23
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsBackendApi.cjs.js","sources":["../../src/api/DevToolsBackendApi.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 { 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';\nimport { JsonObject } from '@backstage/types';\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"],"names":["ExternalDependencyStatus","ping","findPaths","getPackages","loadConfigSchema","memoize","config","ConfigReader","assertError","os","fs","Lockfile"],"mappings":"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"}
1
+ {"version":3,"file":"DevToolsBackendApi.cjs.js","sources":["../../src/api/DevToolsBackendApi.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 { 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';\nimport { JsonObject } from '@backstage/types';\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"],"names":["ExternalDependencyStatus","ping","findPaths","getPackages","loadConfigSchema","memoize","config","ConfigReader","assertError","os","fs","Lockfile"],"mappings":";;;;;;;;;;;;;;;;;;;;AAsCO,MAAM,kBAAA,CAAmB;AAAA,EACvB,WAAA,CACY,QACA,MAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAChB;AAAA,EAEH,MAAa,6BAAA,GAA+D;AAC1E,IAAA,MAAM,SAA+B,EAAC;AAEtC,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,WAAA;AAAA,MAC5B;AAAA,KACF;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AAEd,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,MAAA,EAAQ,IAAA;AAAA,QACX,CAAA,8BAAA,EAAiC,QAAA,CAAS,IAAI,CAAA,MAAA,EAAS,SAAS,MAAM,CAAA,CAAA;AAAA,OACxE;AAEA,MAAA,QAAQ,SAAS,IAAA;AAAM,QACrB,KAAK,MAAA,EAAQ;AACX,UAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,sBAAA,CAAuB,QAAQ,CAAA;AAC7D,UAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AACtB,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA,EAAS;AACZ,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAA;AAC/D,UAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AACvB,UAAA;AAAA,QACF;AAAA,QACA;AACE,UAAA,OAAO,MAAA;AAAA;AACX,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,wBACZ,QAAA,EAC6B;AAC7B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,KAAA;AAEJ,IAAA,MAAM,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,CACxB,KAAK,CAAA,GAAA,KAAO;AACX,MAAA,MAAA,GACE,GAAA,CAAI,MAAA,KAAW,GAAA,GACXA,6CAAA,CAAyB,UACzBA,6CAAA,CAAyB,SAAA;AAC/B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,UAAA,EAAa,QAAA,CAAS,IAAI,CAAA,0BAAA,EAA6B,IAAI,MAAM,CAAA,CAAA;AAAA,OACnE;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAe;AACrB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,iBAAA,EAAoB,QAAA,CAAS,IAAI,CAAA,GAAA,EAAM,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACtE,MAAA,KAAA,GAAQ,GAAA,CAAI,OAAA;AAAA,IACd,CAAC,CAAA;AAEH,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,MAAA,EAAQ,UAAUA,6CAAA,CAAyB,SAAA;AAAA,MAC3C,OAAO,KAAA,IAAS;AAAA,KAClB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,uBACZ,QAAA,EAC6B;AAC7B,IAAA,MAAM,aAAa,MAAMC,qBAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,SAAS,MAAM,CAAA;AAE3D,IAAA,IAAI,KAAA;AACJ,IAAA,IACE,UAAA,CAAW,UAAA,KAAe,SAAA,IAC1B,UAAA,CAAW,eAAe,SAAA,EAC1B;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,CAAA,gBAAA,EAAmB,QAAA,CAAS,IAAI,CAAA,GAAA,EAAM,WAAW,MAAM,CAAA;AAAA,OACzD;AACA,MAAA,KAAA,GACE,WAAW,MAAA,KAAW,EAAA,GAClB,GAAG,QAAA,CAAS,MAAM,eAClB,UAAA,CAAW,MAAA;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,iBAAA,EAAoB,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,WAAW,MAAM,CAAA;AAAA,KACzD;AAEA,IAAA,MAAM,MAAA,GAA6B;AAAA,MACjC,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,MAAA,EAAQ,UAAA,CAAW,KAAA,GACfD,6CAAA,CAAyB,UACzBA,6CAAA,CAAyB,SAAA;AAAA,MAC7B,OAAO,KAAA,IAAS;AAAA,KAClB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,UAAA,GAAkC;AAE7C,IAAA,MAAM,KAAA,GAAQE,oBAAU,SAAS,CAAA;AAEjC,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAMC,uBAAA,CAAY,MAAM,SAAS,CAAA;AACtD,IAAA,MAAM,aAAa,YAAY;AAC7B,MAAA,OAAO,MAAMC,6BAAA,CAAiB;AAAA,QAC5B,cAAc,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,IAAI;AAAA,OACnD,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,UAAA,GAAaC,eAAQ,UAAU,CAAA;AACrC,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAEhC,IAAA,MAAM,UAAA,GAAyB;AAAA,MAC7B,MAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AACA,IAAA,IAAI;AACF,MAAA,MAAMC,QAAA,GAAS;AAAA,QACb,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,GAAA,EAAI;AAAA,QACtB,OAAA,EAAS;AAAA,OACX;AACA,MAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,CAACA,QAAM,CAAA,EAAG;AAAA,QAChD,kBAAA,EAAoB,KAAA;AAAA,QACpB,gBAAgB,CAAC,KAAA,EAAO,YACtB,OAAA,CAAQ,UAAA,KAAe,WAAW,UAAA,GAAa;AAAA,OAClD,CAAA;AAED,MAAA,MAAM,IAAA,GAAOC,mBAAA,CAAa,WAAA,CAAY,gBAAgB,EAAE,GAAA,EAAI;AAC5D,MAAA,UAAA,CAAW,MAAA,GAAS,IAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AACd,MAAAC,kBAAA,CAAY,KAAK,CAAA;AAEjB,MAAA,MAAMF,QAAA,GAAS;AAAA,QACb,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,GAAA,EAAI;AAAA,QACtB,OAAA,EAAS;AAAA,OACX;AACA,MAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,CAACA,QAAM,CAAA,EAAG;AAAA,QAChD,kBAAA,EAAoB,IAAA;AAAA,QACpB,gBAAgB,CAAC,KAAA,EAAO,YACtB,OAAA,CAAQ,UAAA,KAAe,WAAW,UAAA,GAAa;AAAA,OAClD,CAAA;AAED,MAAA,MAAM,IAAA,GAAOC,mBAAA,CAAa,WAAA,CAAY,gBAAgB,EAAE,GAAA,EAAI;AAC5D,MAAA,UAAA,CAAW,MAAA,GAAS,IAAA;AACpB,MAAA,UAAA,CAAW,KAAA,GAAQ;AAAA,QACjB,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,OAAO,KAAA,CAAM;AAAA,OACf;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAa,QAAA,GAAkC;AAC7C,IAAA,MAAM,kBAAkB,CAAA,EAAGE,mBAAA,CAAG,QAAA,EAAU,KAAKA,mBAAA,CAAG,IAAI,CAAA,CAAA,EAAIA,mBAAA,CAAG,OAAO,CAAA,GAAA,EAChEA,mBAAA,CAAG,QACL,CAAA,CAAA,EAAIA,oBAAG,IAAI,CAAA,CAAA;AACX,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAA,CAAOA,mBAAA,CAAG,QAAA,KAAaA,mBAAA,CAAG,OAAA,EAAQ,KAAM,IAAA,GAAO,IAAA,CAAK,CAAA;AACzE,IAAA,MAAM,SAAA,GAAY,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA;AAAA,MAC3CA,mBAAA,CAAG,QAAA,EAAS,IAAK,IAAA,GAAO,IAAA;AAAA,KACzB,CAAA,WAAA,EAAcA,mBAAA,CACZ,OAAA,GACA,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CACrB,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACZ,IAAA,MAAM,gBAAgB,OAAA,CAAQ,OAAA;AAG9B,IAAA,MAAM,KAAA,GAAQP,oBAAU,SAAS,CAAA;AACjC,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,iBAAA,CAAkB,gBAAgB,CAAA;AAC9D,IAAA,IAAI,aAAA,GAAgB,MAAA;AACpB,IAAA,IAAIQ,mBAAA,CAAG,UAAA,CAAW,aAAa,CAAA,EAAG;AAChC,MAAA,MAAM,MAAA,GAAS,MAAMA,mBAAA,CAAG,QAAA,CAAS,aAAa,CAAA;AAC9C,MAAA,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,iBAAA,CAAkB,WAAW,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,MAAMC,iBAAA,CAAS,IAAA,CAAK,YAAY,CAAA;AAEjD,IAAA,MAAM,QAAA,GAAW,CAAC,YAAA,EAAc,WAAW,CAAA,CAAE,MAAA;AAAA,MAC3C,IAAA,CAAK,MAAA,CAAO,sBAAA,CAAuB,+BAA+B,KAAK;AAAC,KAC1E;AACA,IAAA,MAAM,OAAO,CAAC,GAAG,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,MAAA;AAAA,MAAO,OACvC,QAAA,CAAS,IAAA,CAAK,YAAU,CAAA,CAAE,UAAA,CAAW,MAAM,CAAC;AAAA,KAC9C;AAEA,IAAA,MAAM,mBAAwC,EAAC;AAC/C,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,CAAG,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA;AAC/D,MAAA,MAAM,cAAA,GAAoC;AAAA,QACxC,IAAA,EAAM,GAAA;AAAA,QACN,UAAU,CAAC,GAAG,QAAQ,CAAA,CAAE,KAAK,IAAI;AAAA,OACnC;AACA,MAAA,gBAAA,CAAiB,KAAK,cAAc,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,IAAA,GAAqB;AAAA,MACzB,iBAAiB,eAAA,IAAmB,KAAA;AAAA,MACpC,qBAAqB,SAAA,IAAa,KAAA;AAAA,MAClC,eAAe,aAAA,IAAiB,KAAA;AAAA,MAChC,gBAAA,EACE,aAAA,IAAiB,aAAA,CAAc,OAAA,GAAU,cAAc,OAAA,GAAU,KAAA;AAAA,MACnE,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;;"}
@@ -31,7 +31,6 @@ const devtoolsPlugin = backendPluginApi.createBackendPlugin({
31
31
  config,
32
32
  logger,
33
33
  permissions,
34
- discovery,
35
34
  httpAuth
36
35
  })
37
36
  );
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { devToolsPermissions } from '@backstage/plugin-devtools-common';\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 permissionsRegistry: coreServices.permissionsRegistry,\n },\n async init({\n config,\n logger,\n permissions,\n httpRouter,\n discovery,\n httpAuth,\n permissionsRegistry,\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 permissionsRegistry.addPermissions(devToolsPermissions);\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","createRouter","devToolsPermissions"],"mappings":";;;;;;AA4BO,MAAM,iBAAiBA,oCAAoB,CAAA;AAAA,EAChD,QAAU,EAAA,UAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,aAAaA,6BAAa,CAAA,WAAA;AAAA,QAC1B,YAAYA,6BAAa,CAAA,UAAA;AAAA,QACzB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,UAAUA,6BAAa,CAAA,QAAA;AAAA,QACvB,qBAAqBA,6BAAa,CAAA;AAAA,OACpC;AAAA,MACA,MAAM,IAAK,CAAA;AAAA,QACT,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACC,EAAA;AACD,QAAW,UAAA,CAAA,GAAA;AAAA,UACT,MAAMC,mBAAa,CAAA;AAAA,YACjB,MAAA;AAAA,YACA,MAAA;AAAA,YACA,WAAA;AAAA,YACA,SAAA;AAAA,YACA;AAAA,WACD;AAAA,SACH;AACA,QAAA,UAAA,CAAW,aAAc,CAAA;AAAA,UACvB,IAAM,EAAA,SAAA;AAAA,UACN,KAAO,EAAA;AAAA,SACR,CAAA;AACD,QAAA,mBAAA,CAAoB,eAAeC,wCAAmB,CAAA;AAAA;AACxD,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
1
+ {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { devToolsPermissions } from '@backstage/plugin-devtools-common';\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 permissionsRegistry: coreServices.permissionsRegistry,\n },\n async init({\n config,\n logger,\n permissions,\n httpRouter,\n discovery,\n httpAuth,\n permissionsRegistry,\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 permissionsRegistry.addPermissions(devToolsPermissions);\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","createRouter","devToolsPermissions"],"mappings":";;;;;;AA4BO,MAAM,iBAAiBA,oCAAA,CAAoB;AAAA,EAChD,QAAA,EAAU,UAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,UAAA;AAAA,QACrB,QAAQA,6BAAA,CAAa,MAAA;AAAA,QACrB,aAAaA,6BAAA,CAAa,WAAA;AAAA,QAC1B,YAAYA,6BAAA,CAAa,UAAA;AAAA,QACzB,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,UAAUA,6BAAA,CAAa,QAAA;AAAA,QACvB,qBAAqBA,6BAAA,CAAa;AAAA,OACpC;AAAA,MACA,MAAM,IAAA,CAAK;AAAA,QACT,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF,EAAG;AACD,QAAA,UAAA,CAAW,GAAA;AAAA,UACT,MAAMC,mBAAA,CAAa;AAAA,YACjB,MAAA;AAAA,YACA,MAAA;AAAA,YACA,WAAA;AAAA,YAEA;AAAA,WACD;AAAA,SACH;AACA,QAAA,UAAA,CAAW,aAAA,CAAc;AAAA,UACvB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,mBAAA,CAAoB,eAAeC,wCAAmB,CAAA;AAAA,MACxD;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 { AuthorizeResult } from '@backstage/plugin-permission-common';\nimport {\n devToolsConfigReadPermission,\n devToolsExternalDependenciesReadPermission,\n devToolsInfoReadPermission,\n} from '@backstage/plugin-devtools-common';\nimport { DevToolsBackendApi } from '../api';\nimport { NotAllowedError } from '@backstage/errors';\nimport Router from 'express-promise-router';\nimport express from 'express';\nimport {\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\n\n/**\n * @internal\n */\nexport interface RouterOptions {\n devToolsBackendApi?: DevToolsBackendApi;\n logger: LoggerService;\n config: RootConfigService;\n permissions: PermissionsService;\n discovery: DiscoveryService;\n httpAuth: HttpAuthService;\n}\n\n/**\n * @internal\n * */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, config, permissions, httpAuth } = options;\n\n const devToolsBackendApi =\n options.devToolsBackendApi || new DevToolsBackendApi(logger, config);\n\n const router = Router();\n router.use(express.json());\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 return router;\n}\n"],"names":["DevToolsBackendApi","Router","express","devToolsInfoReadPermission","AuthorizeResult","NotAllowedError","devToolsConfigReadPermission","devToolsExternalDependenciesReadPermission"],"mappings":";;;;;;;;;;;;;;AAiDA,eAAsB,aACpB,OACyB,EAAA;AACzB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAQ,EAAA,WAAA,EAAa,UAAa,GAAA,OAAA;AAElD,EAAA,MAAM,qBACJ,OAAQ,CAAA,kBAAA,IAAsB,IAAIA,qCAAA,CAAmB,QAAQ,MAAM,CAAA;AAErE,EAAA,MAAM,SAASC,uBAAO,EAAA;AACtB,EAAO,MAAA,CAAA,GAAA,CAAIC,wBAAQ,CAAA,IAAA,EAAM,CAAA;AAEzB,EAAA,MAAA,CAAO,GAAI,CAAA,SAAA,EAAW,CAAC,IAAA,EAAM,GAAQ,KAAA;AACnC,IAAA,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,GACtC,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,OAAA,EAAS,OAAO,GAAA,EAAK,QAAa,KAAA;AAC3C,IAAM,MAAA,QAAA,GAAA,CACJ,MAAM,WAAY,CAAA,SAAA;AAAA,MAChB,CAAC,EAAE,UAAY,EAAAC,+CAAA,EAA4B,CAAA;AAAA,MAC3C,EAAE,WAAa,EAAA,MAAM,QAAS,CAAA,WAAA,CAAY,GAAG,CAAE;AAAA,OAEjD,CAAC,CAAA;AAEH,IAAI,IAAA,QAAA,CAAS,MAAW,KAAAC,sCAAA,CAAgB,IAAM,EAAA;AAC5C,MAAM,MAAA,IAAIC,uBAAgB,cAAc,CAAA;AAAA;AAG1C,IAAM,MAAA,IAAA,GAAO,MAAM,kBAAA,CAAmB,QAAS,EAAA;AAE/C,IAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,GAC/B,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,SAAA,EAAW,OAAO,GAAA,EAAK,QAAa,KAAA;AAC7C,IAAM,MAAA,QAAA,GAAA,CACJ,MAAM,WAAY,CAAA,SAAA;AAAA,MAChB,CAAC,EAAE,UAAY,EAAAC,iDAAA,EAA8B,CAAA;AAAA,MAC7C,EAAE,WAAa,EAAA,MAAM,QAAS,CAAA,WAAA,CAAY,GAAG,CAAE;AAAA,OAEjD,CAAC,CAAA;AAEH,IAAI,IAAA,QAAA,CAAS,MAAW,KAAAF,sCAAA,CAAgB,IAAM,EAAA;AAC5C,MAAM,MAAA,IAAIC,uBAAgB,cAAc,CAAA;AAAA;AAG1C,IAAM,MAAA,UAAA,GAAa,MAAM,kBAAA,CAAmB,UAAW,EAAA;AAEvD,IAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,UAAU,CAAA;AAAA,GACrC,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,wBAAA,EAA0B,OAAO,GAAA,EAAK,QAAa,KAAA;AAC5D,IAAM,MAAA,QAAA,GAAA,CACJ,MAAM,WAAY,CAAA,SAAA;AAAA,MAChB,CAAC,EAAE,UAAY,EAAAE,+DAAA,EAA4C,CAAA;AAAA,MAC3D,EAAE,WAAa,EAAA,MAAM,QAAS,CAAA,WAAA,CAAY,GAAG,CAAE;AAAA,OAEjD,CAAC,CAAA;AAEH,IAAI,IAAA,QAAA,CAAS,MAAW,KAAAH,sCAAA,CAAgB,IAAM,EAAA;AAC5C,MAAM,MAAA,IAAIC,uBAAgB,cAAc,CAAA;AAAA;AAG1C,IAAM,MAAA,MAAA,GAAS,MAAM,kBAAA,CAAmB,6BAA8B,EAAA;AAEtE,IAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA,GACjC,CAAA;AAED,EAAO,OAAA,MAAA;AACT;;;;"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 { AuthorizeResult } from '@backstage/plugin-permission-common';\nimport {\n devToolsConfigReadPermission,\n devToolsExternalDependenciesReadPermission,\n devToolsInfoReadPermission,\n} from '@backstage/plugin-devtools-common';\nimport { DevToolsBackendApi } from '../api';\nimport { NotAllowedError } from '@backstage/errors';\nimport Router from 'express-promise-router';\nimport express from 'express';\nimport {\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\n\n/**\n * @internal\n */\nexport interface RouterOptions {\n devToolsBackendApi?: DevToolsBackendApi;\n logger: LoggerService;\n config: RootConfigService;\n permissions: PermissionsService;\n discovery: DiscoveryService;\n httpAuth: HttpAuthService;\n}\n\n/**\n * @internal\n * */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, config, permissions, httpAuth } = options;\n\n const devToolsBackendApi =\n options.devToolsBackendApi || new DevToolsBackendApi(logger, config);\n\n const router = Router();\n router.use(express.json());\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 return router;\n}\n"],"names":["DevToolsBackendApi","Router","express","devToolsInfoReadPermission","AuthorizeResult","NotAllowedError","devToolsConfigReadPermission","devToolsExternalDependenciesReadPermission"],"mappings":";;;;;;;;;;;;;;AAiDA,eAAsB,aACpB,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,UAAS,GAAI,OAAA;AAElD,EAAA,MAAM,qBACJ,OAAA,CAAQ,kBAAA,IAAsB,IAAIA,qCAAA,CAAmB,QAAQ,MAAM,CAAA;AAErE,EAAA,MAAM,SAASC,uBAAA,EAAO;AACtB,EAAA,MAAA,CAAO,GAAA,CAAIC,wBAAA,CAAQ,IAAA,EAAM,CAAA;AAEzB,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,CAAC,IAAA,EAAM,GAAA,KAAQ;AACnC,IAAA,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACvC,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAO,GAAA,EAAK,QAAA,KAAa;AAC3C,IAAA,MAAM,QAAA,GAAA,CACJ,MAAM,WAAA,CAAY,SAAA;AAAA,MAChB,CAAC,EAAE,UAAA,EAAYC,+CAAA,EAA4B,CAAA;AAAA,MAC3C,EAAE,WAAA,EAAa,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAAE,OAEjD,CAAC,CAAA;AAEH,IAAA,IAAI,QAAA,CAAS,MAAA,KAAWC,sCAAA,CAAgB,IAAA,EAAM;AAC5C,MAAA,MAAM,IAAIC,uBAAgB,cAAc,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,QAAA,EAAS;AAE/C,IAAA,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,EAChC,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,OAAO,GAAA,EAAK,QAAA,KAAa;AAC7C,IAAA,MAAM,QAAA,GAAA,CACJ,MAAM,WAAA,CAAY,SAAA;AAAA,MAChB,CAAC,EAAE,UAAA,EAAYC,iDAAA,EAA8B,CAAA;AAAA,MAC7C,EAAE,WAAA,EAAa,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAAE,OAEjD,CAAC,CAAA;AAEH,IAAA,IAAI,QAAA,CAAS,MAAA,KAAWF,sCAAA,CAAgB,IAAA,EAAM;AAC5C,MAAA,MAAM,IAAIC,uBAAgB,cAAc,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,UAAA,EAAW;AAEvD,IAAA,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,UAAU,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,wBAAA,EAA0B,OAAO,GAAA,EAAK,QAAA,KAAa;AAC5D,IAAA,MAAM,QAAA,GAAA,CACJ,MAAM,WAAA,CAAY,SAAA;AAAA,MAChB,CAAC,EAAE,UAAA,EAAYE,+DAAA,EAA4C,CAAA;AAAA,MAC3D,EAAE,WAAA,EAAa,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAAE,OAEjD,CAAC,CAAA;AAEH,IAAA,IAAI,QAAA,CAAS,MAAA,KAAWH,sCAAA,CAAgB,IAAA,EAAM;AAC5C,MAAA,MAAM,IAAIC,uBAAgB,cAAc,CAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,6BAAA,EAA8B;AAEtE,IAAA,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Lockfile.cjs.js","sources":["../../src/util/Lockfile.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"],"names":["parseSyml","legacyStringifyLockfile","stringifySyml","fs"],"mappings":"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"}
1
+ {"version":3,"file":"Lockfile.cjs.js","sources":["../../src/util/Lockfile.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"],"names":["parseSyml","legacyStringifyLockfile","stringifySyml","fs"],"mappings":";;;;;;;;;;AAoBA,MAAM,aAAA,GAAgB,8BAAA;AAgBtB,SAAS,cAAc,gBAAA,EAA0B;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQA,kBAAU,gBAAgB,CAAA;AAAA,MAClC,IAAA,EAAM;AAAA,KACR;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACF;AAIA,MAAM,aAAa,CAAA,EAAG;AAAA,EACpB,CAAA;AAAA,CAAA;AAAA,EACA,CAAA;AAAA;AACF,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA,CAAA;AAEV,SAAS,iBAAA,CAAkB,MAAoB,MAAA,EAAiB;AAC9D,EAAA,OAAO,SACHC,kBAAA,CAAwB,IAAI,CAAA,GAC5B,UAAA,GAAaC,sBAAc,IAAI,CAAA;AACrC;AAGA,MAAM,YAAA,GAAe,+CAAA;AAIrB,MAAM,mBAAA,GAAsB;AAAA,EAC1B,CAAA,UAAA,CAAA;AAAA,EACA,CAAA,OAAA,CAAA;AAAA,EACA,CAAA,UAAA,CAAA;AAAA,EACA,CAAA,YAAA,CAAA;AAAA,EACA,CAAA,gBAAA,CAAA;AAAA,EACA,CAAA,gBAAA,CAAA;AAAA,EACA,CAAA,oBAAA,CAAA;AAAA,EACA,CAAA,QAAA;AACF,CAAA;AAEO,MAAM,QAAA,CAAS;AAAA,EA+BZ,WAAA,CACW,QAAA,EACA,IAAA,EACA,MAAA,GAAkB,KAAA,EACnC;AAHiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAChB;AAAA,EAlCH,aAAa,KAAK,IAAA,EAAc;AAC9B,IAAA,MAAM,gBAAA,GAAmB,MAAMC,mBAAA,CAAG,QAAA,CAAS,MAAM,MAAM,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,cAAc,gBAAgB,CAAA;AAC/C,IAAA,IAAI,QAAA,CAAS,SAAS,SAAA,EAAW;AAC/B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,OAAO,QAAA,CAAS,MAAA;AACtB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAkC;AAEvD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,mBAAA,CAAoB,QAAA,CAAS,GAAG,CAAA,EAAG;AAEvC,MAAA,MAAM,GAAG,IAAA,EAAM,KAAK,IAAI,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,IAAK,EAAC;AACpD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MAC5D;AAEA,MAAA,IAAI,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAC/B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,EAAC;AACX,QAAA,QAAA,CAAS,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,MAC5B;AACA,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,IAAI,QAAA,CAAS,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA,EASA,IAAI,IAAA,EAAgD;AAClD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,EAC5B;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EACjD;AACF;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-devtools-backend",
3
- "version": "0.5.8-next.0",
3
+ "version": "0.5.9-next.0",
4
4
  "backstage": {
5
5
  "role": "backend-plugin",
6
6
  "pluginId": "devtools",
@@ -41,15 +41,15 @@
41
41
  "test": "backstage-cli package test"
42
42
  },
43
43
  "dependencies": {
44
- "@backstage/backend-defaults": "0.11.2-next.0",
45
- "@backstage/backend-plugin-api": "1.4.2-next.0",
44
+ "@backstage/backend-defaults": "0.12.1-next.0",
45
+ "@backstage/backend-plugin-api": "1.4.3-next.0",
46
46
  "@backstage/cli-common": "0.1.15",
47
47
  "@backstage/config": "1.3.3",
48
48
  "@backstage/config-loader": "1.10.2",
49
49
  "@backstage/errors": "1.2.7",
50
50
  "@backstage/plugin-devtools-common": "0.1.17",
51
51
  "@backstage/plugin-permission-common": "0.9.1",
52
- "@backstage/plugin-permission-node": "0.10.3-next.0",
52
+ "@backstage/plugin-permission-node": "0.10.4-next.0",
53
53
  "@backstage/types": "1.2.1",
54
54
  "@manypkg/get-packages": "^1.1.3",
55
55
  "@yarnpkg/lockfile": "^1.1.0",
@@ -63,9 +63,9 @@
63
63
  "yn": "^4.0.0"
64
64
  },
65
65
  "devDependencies": {
66
- "@backstage/backend-defaults": "0.11.2-next.0",
67
- "@backstage/backend-test-utils": "1.7.1-next.0",
68
- "@backstage/cli": "0.33.2-next.0",
66
+ "@backstage/backend-defaults": "0.12.1-next.0",
67
+ "@backstage/backend-test-utils": "1.9.0-next.1",
68
+ "@backstage/cli": "0.34.2-next.1",
69
69
  "@types/express": "^4.17.6",
70
70
  "@types/ping": "^0.4.1",
71
71
  "@types/supertest": "^2.0.8",