@secustor/backstage-plugin-renovate-backend 0.12.0 → 0.13.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.
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ var integration = require('@backstage/integration');
4
+ var is = require('@sindresorhus/is');
5
+ var github = require('./github.cjs.js');
6
+
7
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
8
+
9
+ var is__default = /*#__PURE__*/_interopDefaultCompat(is);
10
+
11
+ async function getPlatformEnvs(target, context) {
12
+ const { rootConfig, logger } = context;
13
+ const env = {};
14
+ const integrations = integration.ScmIntegrations.fromConfig(rootConfig);
15
+ const integration$1 = integrations.byHost(target.host);
16
+ if (is__default.default.nullOrUndefined(integration$1)) {
17
+ throw new Error(
18
+ `Could not identify platform for target ${target.host}/${target.repository}`
19
+ );
20
+ }
21
+ const errMsg = `No credentials could be found for url and '${integration$1.type}' type for host ${target.host}`;
22
+ const url = `https://${target.host}/${target.repository}`;
23
+ switch (integration$1.type) {
24
+ case "github": {
25
+ env.RENOVATE_PLATFORM = integration$1.type;
26
+ const token = await github.getGithubToken(integrations, url);
27
+ env.RENOVATE_TOKEN = requireConfigVariable(token, errMsg);
28
+ env.RENOVATE_REPOSITORIES = target.repository;
29
+ break;
30
+ }
31
+ case "gitlab":
32
+ {
33
+ const cred = await integration.DefaultGitlabCredentialsProvider.fromIntegrations(
34
+ integrations
35
+ ).getCredentials({ url });
36
+ const gitLabIntegrationConfig = requireConfigVariable(
37
+ integrations.gitlab.byHost(target.host)?.config,
38
+ errMsg
39
+ );
40
+ env.RENOVATE_PLATFORM = integration$1.type;
41
+ env.RENOVATE_ENDPOINT = gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;
42
+ env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);
43
+ env.RENOVATE_REPOSITORIES = target.repository;
44
+ }
45
+ break;
46
+ default:
47
+ throw new Error(`Unsupported platform type ${integration$1.type}`);
48
+ }
49
+ const githubComURL = "https://github.com";
50
+ const githubComIntegration = integrations.github.byUrl(githubComURL);
51
+ if (is__default.default.nullOrUndefined(githubComIntegration)) {
52
+ logger.warn(`No Github.com integration has been found`);
53
+ } else {
54
+ const githubComToken = await github.getGithubToken(integrations, githubComURL);
55
+ if (githubComToken) {
56
+ env.RENOVATE_GITHUB_COM = githubComToken;
57
+ } else {
58
+ logger.warn(
59
+ `Could not get token for Github.com token in the defined integrations`
60
+ );
61
+ }
62
+ }
63
+ return env;
64
+ }
65
+ function requireConfigVariable(input, errMessage) {
66
+ if (is__default.default.nullOrUndefined(input)) {
67
+ throw new Error(errMessage);
68
+ }
69
+ return input;
70
+ }
71
+ function getFileUrl(options) {
72
+ if (options.host.includes("github")) {
73
+ return `https://${options.host}/${options.repository}/blob/HEAD/${options.packageFile}`;
74
+ }
75
+ return null;
76
+ }
77
+
78
+ exports.getFileUrl = getFileUrl;
79
+ exports.getPlatformEnvs = getPlatformEnvs;
80
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/wrapper/platforms/index.ts"],"sourcesContent":["import {\n DefaultGitlabCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\nimport is from '@sindresorhus/is';\nimport { PlatformEnvsOptions } from './types';\nimport { TargetRepo } from '@secustor/backstage-plugin-renovate-common';\nimport { getGithubToken } from './github';\n\n/*\n Returns record of Renovate environment variables specific for the platform of targetUrl\n */\nexport async function getPlatformEnvs(\n target: TargetRepo,\n context: PlatformEnvsOptions,\n): Promise<Record<string, string>> {\n const { rootConfig, logger } = context;\n\n const env: Record<string, string> = {};\n // add Renovate platform and tokens\n const integrations = ScmIntegrations.fromConfig(rootConfig);\n const integration = integrations.byHost(target.host);\n if (is.nullOrUndefined(integration)) {\n throw new Error(\n `Could not identify platform for target ${target.host}/${target.repository}`,\n );\n }\n\n const errMsg = `No credentials could be found for url and '${integration.type}' type for host ${target.host}`;\n const url = `https://${target.host}/${target.repository}`;\n switch (integration.type) {\n case 'github': {\n env.RENOVATE_PLATFORM = integration.type;\n const token = await getGithubToken(integrations, url);\n env.RENOVATE_TOKEN = requireConfigVariable(token, errMsg);\n env.RENOVATE_REPOSITORIES = target.repository;\n break;\n }\n case 'gitlab':\n {\n const cred = await DefaultGitlabCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n const gitLabIntegrationConfig = requireConfigVariable(\n integrations.gitlab.byHost(target.host)?.config,\n errMsg,\n );\n env.RENOVATE_PLATFORM = integration.type;\n env.RENOVATE_ENDPOINT =\n gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;\n env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);\n env.RENOVATE_REPOSITORIES = target.repository;\n }\n break;\n default:\n throw new Error(`Unsupported platform type ${integration.type}`);\n }\n\n const githubComURL = 'https://github.com';\n const githubComIntegration = integrations.github.byUrl(githubComURL);\n if (is.nullOrUndefined(githubComIntegration)) {\n logger.warn(`No Github.com integration has been found`);\n } else {\n const githubComToken = await getGithubToken(integrations, githubComURL);\n if (githubComToken) {\n env.RENOVATE_GITHUB_COM = githubComToken;\n } else {\n logger.warn(\n `Could not get token for Github.com token in the defined integrations`,\n );\n }\n }\n\n return env;\n}\n\nfunction requireConfigVariable<T>(\n input: T | undefined | null,\n errMessage: string,\n): T {\n if (is.nullOrUndefined(input)) {\n throw new Error(errMessage);\n }\n return input;\n}\n\nexport function getFileUrl(options: {\n packageFile: string;\n host: string;\n repository: string;\n}): string | null {\n if (options.host.includes('github')) {\n return `https://${options.host}/${options.repository}/blob/HEAD/${options.packageFile}`;\n }\n return null;\n}\n"],"names":["ScmIntegrations","integration","is","getGithubToken","DefaultGitlabCredentialsProvider"],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ var is = require('@sindresorhus/is');
4
+ var index$1 = require('./platforms/index.cjs.js');
5
+ var utils = require('./utils.cjs.js');
6
+ var backstagePluginRenovateCommon = require('@secustor/backstage-plugin-renovate-common');
7
+ var index = require('../config/index.cjs.js');
8
+ var errors = require('@backstage/errors');
9
+ var nanoid = require('nanoid');
10
+ var factory = require('../queue/factory.cjs.js');
11
+
12
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
+
14
+ var is__default = /*#__PURE__*/_interopDefaultCompat(is);
15
+
16
+ class RenovateRunner {
17
+ constructor(queueFactories, databaseHandler, rootConfig, logger, runtimes) {
18
+ this.databaseHandler = databaseHandler;
19
+ this.rootConfig = rootConfig;
20
+ this.logger = logger;
21
+ this.runtimes = runtimes;
22
+ this.queue = factory.createQueue(queueFactories, rootConfig, this);
23
+ }
24
+ queue;
25
+ static async from(options) {
26
+ const { databaseHandler, rootConfig, runtimes, logger, queueFactories } = options;
27
+ return new RenovateRunner(
28
+ queueFactories,
29
+ databaseHandler,
30
+ rootConfig,
31
+ logger,
32
+ runtimes
33
+ );
34
+ }
35
+ async addToQueue(...targets) {
36
+ const props = targets.map((target) => {
37
+ const jobId = backstagePluginRenovateCommon.getTaskID(target);
38
+ const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
39
+ return {
40
+ jobId,
41
+ data: {
42
+ id: jobId,
43
+ target: targetRepo
44
+ }
45
+ };
46
+ });
47
+ return await this.queue.addBulk(props);
48
+ }
49
+ async runNext(target) {
50
+ const jobId = backstagePluginRenovateCommon.getTaskID(target);
51
+ const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
52
+ return await this.queue.add(
53
+ jobId,
54
+ { id: jobId, target: targetRepo },
55
+ {
56
+ force: true,
57
+ insertInFront: true
58
+ }
59
+ );
60
+ }
61
+ async run(props) {
62
+ const { id, target } = props;
63
+ const runID = nanoid.nanoid();
64
+ const logger = this.logger.child({ runID, jobID: id, ...target });
65
+ try {
66
+ logger.info("Renovate run starting");
67
+ const report = await this.renovate(props, logger);
68
+ await this.databaseHandler.addReport({
69
+ runID,
70
+ taskID: id,
71
+ report,
72
+ target,
73
+ logger
74
+ });
75
+ logger.info("Renovate run successfully finished");
76
+ } catch (e) {
77
+ logger.error("Renovate failed", errors.isError(e) ? e : {});
78
+ }
79
+ }
80
+ async renovate({ id, target }, logger) {
81
+ const { runtime, config: runtimeConfig } = index.getRuntimeConfigs(
82
+ this.rootConfig
83
+ );
84
+ const wrapperRuntime = this.runtimes.get(runtime);
85
+ if (is__default.default.nullOrUndefined(wrapperRuntime)) {
86
+ throw new Error(`Unknown runtime type '${runtime}'`);
87
+ }
88
+ const env = {
89
+ // setup logging
90
+ LOG_FORMAT: "json",
91
+ LOG_LEVEL: "debug",
92
+ LOG_CONTEXT: id,
93
+ RENOVATE_REPORT_TYPE: "logging",
94
+ // setup platform specifics
95
+ ...await index$1.getPlatformEnvs(target, {
96
+ logger,
97
+ rootConfig: this.rootConfig
98
+ }),
99
+ ...utils.getCacheEnvs(this.rootConfig, logger)
100
+ };
101
+ const renovateConfig = index.getRenovateConfig(this.rootConfig);
102
+ const promise = wrapperRuntime.run({
103
+ runID: id,
104
+ env,
105
+ renovateConfig,
106
+ runtimeConfig,
107
+ logger
108
+ });
109
+ return promise.then((result) => {
110
+ return utils.extractReport({
111
+ logger,
112
+ logStream: result.stdout
113
+ });
114
+ });
115
+ }
116
+ }
117
+
118
+ exports.RenovateRunner = RenovateRunner;
119
+ //# sourceMappingURL=renovateRunner.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renovateRunner.cjs.js","sources":["../../src/wrapper/renovateRunner.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { getPlatformEnvs } from './platforms';\nimport { RouterOptions } from '../service/types';\nimport { extractReport, getCacheEnvs } from './utils';\nimport {\n getTargetRepo,\n getTaskID,\n RenovateReport,\n RenovateWrapper,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { Config } from '@backstage/config';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { getRenovateConfig, getRuntimeConfigs } from '../config';\nimport { DatabaseHandler } from '../service/databaseHandler';\nimport { isError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { nanoid } from 'nanoid';\nimport { createQueue } from '../queue';\nimport {\n AddResult,\n QueueFactory,\n RenovateQueue,\n Runnable,\n RunOptions,\n} from '@secustor/backstage-plugin-renovate-node';\n\nexport class RenovateRunner implements Runnable<RunOptions> {\n private readonly queue: RenovateQueue<RunOptions>;\n\n constructor(\n queueFactories: Map<string, QueueFactory<RunOptions>>,\n private readonly databaseHandler: DatabaseHandler,\n private readonly rootConfig: Config,\n readonly logger: LoggerService,\n private readonly runtimes: Map<string, RenovateWrapper>,\n ) {\n this.queue = createQueue(queueFactories, rootConfig, this);\n }\n\n static async from(options: RouterOptions): Promise<RenovateRunner> {\n const { databaseHandler, rootConfig, runtimes, logger, queueFactories } =\n options;\n\n return new RenovateRunner(\n queueFactories,\n databaseHandler,\n rootConfig,\n logger,\n runtimes,\n );\n }\n\n async addToQueue(\n ...targets: (string | Entity | TargetRepo)[]\n ): Promise<AddResult[]> {\n const props = targets.map(target => {\n const jobId = getTaskID(target);\n const targetRepo = getTargetRepo(target);\n return {\n jobId,\n data: {\n id: jobId,\n target: targetRepo,\n },\n };\n });\n\n return await this.queue.addBulk(props);\n }\n\n async runNext(target: string | Entity | TargetRepo): Promise<AddResult> {\n const jobId = getTaskID(target);\n const targetRepo = getTargetRepo(target);\n\n return await this.queue.add(\n jobId,\n { id: jobId, target: targetRepo },\n {\n force: true,\n insertInFront: true,\n },\n );\n }\n\n async run(props: RunOptions): Promise<void> {\n const { id, target } = props;\n const runID = nanoid();\n const logger = this.logger.child({ runID, jobID: id, ...target });\n try {\n logger.info('Renovate run starting');\n const report = await this.renovate(props, logger);\n await this.databaseHandler.addReport({\n runID,\n taskID: id,\n report,\n target,\n logger,\n });\n logger.info('Renovate run successfully finished');\n } catch (e) {\n logger.error('Renovate failed', isError(e) ? e : {});\n }\n }\n\n async renovate(\n { id, target }: RunOptions,\n logger: LoggerService,\n ): Promise<RenovateReport> {\n const { runtime, config: runtimeConfig } = getRuntimeConfigs(\n this.rootConfig,\n );\n const wrapperRuntime = this.runtimes.get(runtime);\n if (is.nullOrUndefined(wrapperRuntime)) {\n throw new Error(`Unknown runtime type '${runtime}'`);\n }\n\n const env: Record<string, string> = {\n // setup logging\n LOG_FORMAT: 'json',\n LOG_LEVEL: 'debug',\n LOG_CONTEXT: id,\n RENOVATE_REPORT_TYPE: 'logging',\n // setup platform specifics\n ...(await getPlatformEnvs(target, {\n logger,\n rootConfig: this.rootConfig,\n })),\n ...getCacheEnvs(this.rootConfig, logger),\n };\n\n // read out renovate.config and write out to json file for consumption by Renovate\n // we are reading it at this place to allow dynamic configuration changes\n const renovateConfig = getRenovateConfig(this.rootConfig);\n\n const promise = wrapperRuntime.run({\n runID: id,\n env,\n renovateConfig,\n runtimeConfig,\n logger,\n });\n\n return promise.then(result => {\n return extractReport({\n logger,\n logStream: result.stdout,\n });\n });\n }\n}\n"],"names":["createQueue","getTaskID","getTargetRepo","nanoid","isError","getRuntimeConfigs","is","getPlatformEnvs","getCacheEnvs","getRenovateConfig","extractReport"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ 'use strict';
2
+
3
+ var is = require('@sindresorhus/is');
4
+ var index = require('../config/index.cjs.js');
5
+
6
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
7
+
8
+ var is__default = /*#__PURE__*/_interopDefaultCompat(is);
9
+
10
+ async function extractReport(opts) {
11
+ const { logStream, logger } = opts;
12
+ return new Promise((resolve) => {
13
+ let uncompletedText = "";
14
+ logStream.on("data", (chunk) => {
15
+ const text = uncompletedText.concat(chunk.toString());
16
+ const logLines = text.split("\n");
17
+ uncompletedText = logLines.pop() ?? "";
18
+ for (const logLine of logLines) {
19
+ const log = JSON.parse(logLine);
20
+ if (log.report) {
21
+ const report = log.report;
22
+ resolve(report);
23
+ }
24
+ const msg = log.msg;
25
+ delete log.msg;
26
+ delete log.logContext;
27
+ logger.debug(msg, log);
28
+ }
29
+ });
30
+ });
31
+ }
32
+ function getCacheEnvs(config, logger) {
33
+ const cacheEnabled = index.getPluginConfig(config).getOptionalBoolean("cache.enabled") ?? true;
34
+ if (!cacheEnabled) {
35
+ logger.debug("Cache has been disabled in plugin configuration");
36
+ return {};
37
+ }
38
+ const cacheConfig = config.getOptionalConfig("backend.cache");
39
+ if (is__default.default.nullOrUndefined(cacheConfig)) {
40
+ logger.debug("No cache configured");
41
+ return {};
42
+ }
43
+ const store = cacheConfig.getString("store");
44
+ if (store !== "redis") {
45
+ logger.debug(`Unsupported cache store '${store}' detected`);
46
+ return {};
47
+ }
48
+ const connection = cacheConfig.getOptionalString("connection");
49
+ if (is__default.default.nullOrUndefined(connection)) {
50
+ logger.debug("No connection string for redis cache configured in backend");
51
+ return {};
52
+ }
53
+ logger.debug("Injecting Redis cache into Renovate");
54
+ return {
55
+ RENOVATE_REDIS_PREFIX: "renovate_",
56
+ RENOVATE_REDIS_URL: connection
57
+ };
58
+ }
59
+
60
+ exports.extractReport = extractReport;
61
+ exports.getCacheEnvs = getCacheEnvs;
62
+ //# sourceMappingURL=utils.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.cjs.js","sources":["../../src/wrapper/utils.ts"],"sourcesContent":["import { RenovateReport } from '@secustor/backstage-plugin-renovate-common';\nimport { ExtractReportOptions } from './types';\nimport { Config } from '@backstage/config';\nimport is from '@sindresorhus/is';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { getPluginConfig } from '../config';\n\nexport async function extractReport(\n opts: ExtractReportOptions,\n): Promise<RenovateReport> {\n const { logStream, logger } = opts;\n return new Promise(resolve => {\n let uncompletedText = '';\n logStream.on('data', (chunk: Buffer) => {\n const text = uncompletedText.concat(chunk.toString());\n const logLines = text.split('\\n');\n\n // if the last element is an empty string, then we have a complete json line so we reset it.\n // else we save it to\n uncompletedText = logLines.pop() ?? '';\n\n for (const logLine of logLines) {\n const log = JSON.parse(logLine);\n if (log.report) {\n // TODO use schema and reject if report does not fit expectation\n const report = log.report as RenovateReport;\n // do not forward the report to logging\n resolve(report);\n }\n const msg = log.msg;\n delete log.msg;\n // delete logContext as it is the same as runID\n delete log.logContext;\n logger.debug(msg, log);\n }\n });\n });\n}\n\nexport function getCacheEnvs(\n config: Config,\n logger: LoggerService,\n): Record<string, string> {\n const cacheEnabled =\n getPluginConfig(config).getOptionalBoolean('cache.enabled') ?? true;\n if (!cacheEnabled) {\n logger.debug('Cache has been disabled in plugin configuration');\n return {};\n }\n\n const cacheConfig = config.getOptionalConfig('backend.cache');\n if (is.nullOrUndefined(cacheConfig)) {\n logger.debug('No cache configured');\n return {};\n }\n\n const store = cacheConfig.getString('store');\n if (store !== 'redis') {\n logger.debug(`Unsupported cache store '${store}' detected`);\n return {};\n }\n\n const connection = cacheConfig.getOptionalString('connection');\n if (is.nullOrUndefined(connection)) {\n logger.debug('No connection string for redis cache configured in backend');\n return {};\n }\n\n logger.debug('Injecting Redis cache into Renovate');\n return {\n RENOVATE_REDIS_PREFIX: 'renovate_',\n RENOVATE_REDIS_URL: connection,\n };\n}\n"],"names":["getPluginConfig","is"],"mappings":";;;;;;;;;AAOA,eAAsB,cACpB,IACyB,EAAA;AACzB,EAAM,MAAA,EAAE,SAAW,EAAA,MAAA,EAAW,GAAA,IAAA,CAAA;AAC9B,EAAO,OAAA,IAAI,QAAQ,CAAW,OAAA,KAAA;AAC5B,IAAA,IAAI,eAAkB,GAAA,EAAA,CAAA;AACtB,IAAU,SAAA,CAAA,EAAA,CAAG,MAAQ,EAAA,CAAC,KAAkB,KAAA;AACtC,MAAA,MAAM,IAAO,GAAA,eAAA,CAAgB,MAAO,CAAA,KAAA,CAAM,UAAU,CAAA,CAAA;AACpD,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAIhC,MAAkB,eAAA,GAAA,QAAA,CAAS,KAAS,IAAA,EAAA,CAAA;AAEpC,MAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC9B,QAAM,MAAA,GAAA,GAAM,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAC9B,QAAA,IAAI,IAAI,MAAQ,EAAA;AAEd,UAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AAEnB,UAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,SAChB;AACA,QAAA,MAAM,MAAM,GAAI,CAAA,GAAA,CAAA;AAChB,QAAA,OAAO,GAAI,CAAA,GAAA,CAAA;AAEX,QAAA,OAAO,GAAI,CAAA,UAAA,CAAA;AACX,QAAO,MAAA,CAAA,KAAA,CAAM,KAAK,GAAG,CAAA,CAAA;AAAA,OACvB;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,MACwB,EAAA;AACxB,EAAA,MAAM,eACJA,qBAAgB,CAAA,MAAM,CAAE,CAAA,kBAAA,CAAmB,eAAe,CAAK,IAAA,IAAA,CAAA;AACjE,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,MAAA,CAAO,MAAM,iDAAiD,CAAA,CAAA;AAC9D,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,iBAAA,CAAkB,eAAe,CAAA,CAAA;AAC5D,EAAI,IAAAC,mBAAA,CAAG,eAAgB,CAAA,WAAW,CAAG,EAAA;AACnC,IAAA,MAAA,CAAO,MAAM,qBAAqB,CAAA,CAAA;AAClC,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAC3C,EAAA,IAAI,UAAU,OAAS,EAAA;AACrB,IAAO,MAAA,CAAA,KAAA,CAAM,CAA4B,yBAAA,EAAA,KAAK,CAAY,UAAA,CAAA,CAAA,CAAA;AAC1D,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAM,MAAA,UAAA,GAAa,WAAY,CAAA,iBAAA,CAAkB,YAAY,CAAA,CAAA;AAC7D,EAAI,IAAAA,mBAAA,CAAG,eAAgB,CAAA,UAAU,CAAG,EAAA;AAClC,IAAA,MAAA,CAAO,MAAM,4DAA4D,CAAA,CAAA;AACzE,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAA,MAAA,CAAO,MAAM,qCAAqC,CAAA,CAAA;AAClD,EAAO,OAAA;AAAA,IACL,qBAAuB,EAAA,WAAA;AAAA,IACvB,kBAAoB,EAAA,UAAA;AAAA,GACtB,CAAA;AACF;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secustor/backstage-plugin-renovate-backend",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "commonjs",
@@ -48,18 +48,18 @@
48
48
  "postpack": "backstage-cli package postpack"
49
49
  },
50
50
  "dependencies": {
51
- "@backstage/backend-defaults": "^0.5.0",
52
- "@backstage/backend-openapi-utils": "^0.1.18",
53
- "@backstage/backend-plugin-api": "^1.0.0",
51
+ "@backstage/backend-defaults": "^0.5.1",
52
+ "@backstage/backend-openapi-utils": "^0.2.0",
53
+ "@backstage/backend-plugin-api": "^1.0.1",
54
54
  "@backstage/backend-tasks": "^0.6.1",
55
- "@backstage/catalog-client": "^1.7.0",
55
+ "@backstage/catalog-client": "^1.7.1",
56
56
  "@backstage/catalog-model": "^1.7.0",
57
57
  "@backstage/config": "^1.2.0",
58
58
  "@backstage/errors": "^1.2.4",
59
- "@backstage/integration": "^1.15.0",
59
+ "@backstage/integration": "^1.15.1",
60
60
  "@backstage/types": "^1.1.1",
61
- "@secustor/backstage-plugin-renovate-common": "^0.6.2",
62
- "@secustor/backstage-plugin-renovate-node": "^0.3.8",
61
+ "@secustor/backstage-plugin-renovate-common": "^0.7.0",
62
+ "@secustor/backstage-plugin-renovate-node": "^0.4.0",
63
63
  "@sindresorhus/is": "^4.6.0",
64
64
  "@types/express": "*",
65
65
  "express": "^4.17.1",
@@ -73,10 +73,10 @@
73
73
  "zod": "^3.22.4"
74
74
  },
75
75
  "devDependencies": {
76
- "@backstage/backend-test-utils": "^1.0.0",
77
- "@backstage/cli": "^0.27.1",
78
- "@backstage/repo-tools": "^0.9.7",
79
- "@backstage/test-utils": "^1.6.0",
76
+ "@backstage/backend-test-utils": "^1.0.1",
77
+ "@backstage/cli": "^0.28.0",
78
+ "@backstage/repo-tools": "^0.10.0",
79
+ "@backstage/test-utils": "^1.7.0",
80
80
  "@types/supertest": "^6.0.0",
81
81
  "msw": "^2.0.0",
82
82
  "supertest": "^7.0.0"