@secustor/backstage-plugin-renovate-backend 0.9.4 → 0.10.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,33 @@
1
1
  # @secustor/backstage-plugin-renovate-backend
2
2
 
3
+ ## 0.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#343](https://github.com/secustor/backstage-plugins/pull/343) [`c755655`](https://github.com/secustor/backstage-plugins/commit/c7556558e815f0c4fcf9671b8f919bee51b51e5a) Thanks [@secustor](https://github.com/secustor)! - Add global dependency overview, dependency api endpoint and dependency database
8
+
9
+ ### Patch Changes
10
+
11
+ - [#343](https://github.com/secustor/backstage-plugins/pull/343) [`c755655`](https://github.com/secustor/backstage-plugins/commit/c7556558e815f0c4fcf9671b8f919bee51b51e5a) Thanks [@secustor](https://github.com/secustor)! - Hide RenovateStarter by default allow to enable via props
12
+
13
+ - [`9c39a80`](https://github.com/secustor/backstage-plugins/commit/9c39a802bca087a06f2d5fc1d308d40689ba9fb1) Thanks [@secustor](https://github.com/secustor)! - Add packageFileUrl to dependencies API and show resovled link
14
+
15
+ - Updated dependencies [[`c755655`](https://github.com/secustor/backstage-plugins/commit/c7556558e815f0c4fcf9671b8f919bee51b51e5a), [`c755655`](https://github.com/secustor/backstage-plugins/commit/c7556558e815f0c4fcf9671b8f919bee51b51e5a)]:
16
+ - @secustor/backstage-plugin-renovate-common@0.6.0
17
+ - @secustor/backstage-plugin-renovate-node@0.3.6
18
+
19
+ ## 0.9.5
20
+
21
+ ### Patch Changes
22
+
23
+ - [#336](https://github.com/secustor/backstage-plugins/pull/336) [`0393e94`](https://github.com/secustor/backstage-plugins/commit/0393e94bf3e322306217e2b157cc5893bd7bc06f) Thanks [@secustor](https://github.com/secustor)! - Add config schemas
24
+
25
+ - [#333](https://github.com/secustor/backstage-plugins/pull/333) [`28e1ff6`](https://github.com/secustor/backstage-plugins/commit/28e1ff60fa1630f9be80add8951566bc2a2ca4f8) Thanks [@secustor](https://github.com/secustor)! - Upgrade Backstage to 1.30.4
26
+
27
+ - Updated dependencies [[`48ca691`](https://github.com/secustor/backstage-plugins/commit/48ca691ab1b66c7622d1b5ff67ea73922f9cf563), [`28e1ff6`](https://github.com/secustor/backstage-plugins/commit/28e1ff60fa1630f9be80add8951566bc2a2ca4f8)]:
28
+ - @secustor/backstage-plugin-renovate-common@0.5.5
29
+ - @secustor/backstage-plugin-renovate-node@0.3.5
30
+
3
31
  ## 0.9.4
4
32
 
5
33
  ### Patch Changes
package/README.md CHANGED
@@ -33,6 +33,11 @@ renovate:
33
33
  # -1 translates to never delete reports during maintenance tasks
34
34
  # x > 0 number of reports to maintain
35
35
  minimumReports: -1
36
+
37
+ # -1 translates to never delete dependencies during maintenance tasks
38
+ # x > 0 number of dependencies to maintain
39
+ dependencyHistory: -1
40
+
36
41
  schedules:
37
42
  cleanup:
38
43
  frequency: { minutes: 60 }
package/config.d.ts ADDED
@@ -0,0 +1,68 @@
1
+ import { SchedulerServiceTaskScheduleDefinition } from '@backstage/backend-plugin-api';
2
+ import { JsonObject } from '@backstage/types';
3
+
4
+ export interface Config {
5
+ renovate: {
6
+ cache: {
7
+ /**
8
+ * Allows turning off cache injection. You can still manually supply caches using the Renovate config
9
+ */
10
+ enabled: boolean;
11
+ };
12
+
13
+ cleanup: {
14
+ /**
15
+ * How many reports to keep in the database during cleanup tasks
16
+ * -1 translates to never delete reports during maintenance
17
+ * x > 0 number of reports to maintain
18
+ */
19
+ minimumReports: number;
20
+
21
+ /**
22
+ * How many dependency history entries to keep in the database during cleanup tasks
23
+ * -1 translates to never delete entries during maintenance
24
+ * x > 0 number of dependencies to maintain
25
+ */
26
+ dependencyHistory: number;
27
+ };
28
+
29
+ schedules: {
30
+ /**
31
+ * Schedule for the cleanup task
32
+ */
33
+ cleanup: SchedulerServiceTaskScheduleDefinition;
34
+
35
+ /**
36
+ * Schedule when a renovation of all repositories should be triggered
37
+ */
38
+ renovation: SchedulerServiceTaskScheduleDefinition;
39
+ };
40
+
41
+ /**
42
+ * Config for the renovate runtime
43
+ */
44
+ runtime: {
45
+ /**
46
+ * The runtime to use. The value references id of a runtime supplied by a module
47
+ * For module-specific configuration sees the relevant module
48
+ */
49
+ type: string;
50
+ };
51
+
52
+ /**
53
+ * Config for queues
54
+ */
55
+ queues: {
56
+ /**
57
+ * The queue to use. The value references id of a queue supplied by a module
58
+ * For module-specific configuration sees the relevant module
59
+ */
60
+ type: string;
61
+ };
62
+
63
+ /**
64
+ * Config for Renovate itself
65
+ */
66
+ config: JsonObject;
67
+ };
68
+ }
package/dist/index.cjs.js CHANGED
@@ -9,8 +9,8 @@ var zod = require('zod');
9
9
  var backstagePluginRenovateCommon = require('@secustor/backstage-plugin-renovate-common');
10
10
  var catalogClient = require('@backstage/catalog-client');
11
11
  var is = require('@sindresorhus/is');
12
- var backendPluginApi = require('@backstage/backend-plugin-api');
13
12
  var integration = require('@backstage/integration');
13
+ var backendPluginApi = require('@backstage/backend-plugin-api');
14
14
  var errors = require('@backstage/errors');
15
15
  var nanoid = require('nanoid');
16
16
  var backstagePluginRenovateNode = require('@secustor/backstage-plugin-renovate-node');
@@ -159,6 +159,120 @@ const spec = {
159
159
  }
160
160
  }
161
161
  },
162
+ "/dependencies": {
163
+ get: {
164
+ summary: "Get dependencies for host",
165
+ parameters: [
166
+ {
167
+ name: "datasource",
168
+ in: "query",
169
+ description: "filter by datasource",
170
+ schema: {
171
+ type: "array",
172
+ items: {
173
+ example: "npm,pypi",
174
+ type: "string"
175
+ }
176
+ }
177
+ },
178
+ {
179
+ name: "depName",
180
+ in: "query",
181
+ description: "filter by dependency name",
182
+ schema: {
183
+ type: "array",
184
+ items: {
185
+ example: "pdm,react",
186
+ type: "string"
187
+ }
188
+ }
189
+ },
190
+ {
191
+ name: "depType",
192
+ in: "query",
193
+ description: "filter by dependency type",
194
+ schema: {
195
+ type: "array",
196
+ items: {
197
+ example: "dev,prod",
198
+ type: "string"
199
+ }
200
+ }
201
+ },
202
+ {
203
+ name: "host",
204
+ in: "query",
205
+ schema: {
206
+ type: "array",
207
+ example: "github.com,gitlab.example.com",
208
+ items: {
209
+ type: "string"
210
+ }
211
+ }
212
+ },
213
+ {
214
+ name: "latestOnly",
215
+ in: "query",
216
+ description: "include only dependencies which have been found in the last extraction",
217
+ schema: {
218
+ type: "boolean"
219
+ }
220
+ },
221
+ {
222
+ name: "limit",
223
+ in: "query",
224
+ description: "limit the number of dependencies returned",
225
+ schema: {
226
+ type: "number",
227
+ default: 500
228
+ }
229
+ },
230
+ {
231
+ name: "manager",
232
+ in: "query",
233
+ description: "filter by manager",
234
+ schema: {
235
+ type: "array",
236
+ items: {
237
+ example: "npm,composer",
238
+ type: "string"
239
+ }
240
+ }
241
+ },
242
+ {
243
+ name: "packageFile",
244
+ in: "query",
245
+ description: "filter by package file",
246
+ schema: {
247
+ type: "array",
248
+ items: {
249
+ example: "package.json,composer.json",
250
+ type: "string"
251
+ }
252
+ }
253
+ },
254
+ {
255
+ name: "repository",
256
+ in: "query",
257
+ schema: {
258
+ type: "array",
259
+ example: "myOrg/myRepository,myOrg/myOtherRepository",
260
+ items: {
261
+ type: "string"
262
+ }
263
+ }
264
+ }
265
+ ],
266
+ responses: {
267
+ "200": {
268
+ $ref: "#/components/responses/dependencies"
269
+ },
270
+ "404": {
271
+ description: "unknown host"
272
+ }
273
+ }
274
+ }
275
+ },
162
276
  "/runs": {
163
277
  post: {
164
278
  summary: "Start or get Renovate runs",
@@ -228,6 +342,19 @@ const spec = {
228
342
  }
229
343
  },
230
344
  responses: {
345
+ dependencies: {
346
+ description: "Returns dependencies",
347
+ content: {
348
+ "application/json": {
349
+ schema: {
350
+ type: "array",
351
+ items: {
352
+ $ref: "#/components/schemas/dependency"
353
+ }
354
+ }
355
+ }
356
+ }
357
+ },
231
358
  "deleted-successful": {
232
359
  description: "Successful deleted",
233
360
  content: {
@@ -348,6 +475,79 @@ const spec = {
348
475
  }
349
476
  }
350
477
  }
478
+ },
479
+ dependency: {
480
+ type: "object",
481
+ additionalProperties: false,
482
+ required: [
483
+ "id",
484
+ "runID",
485
+ "host",
486
+ "repository",
487
+ "extractionTimestamp",
488
+ "manager",
489
+ "datasource",
490
+ "packageFile",
491
+ "depName"
492
+ ],
493
+ properties: {
494
+ id: {
495
+ type: "string"
496
+ },
497
+ runID: {
498
+ type: "string"
499
+ },
500
+ host: {
501
+ type: "string"
502
+ },
503
+ repository: {
504
+ type: "string"
505
+ },
506
+ extractionTimestamp: {
507
+ type: "string",
508
+ format: "date-time"
509
+ },
510
+ manager: {
511
+ type: "string"
512
+ },
513
+ datasource: {
514
+ type: "string"
515
+ },
516
+ packageFile: {
517
+ type: "string"
518
+ },
519
+ packageFileUrl: {
520
+ type: "string"
521
+ },
522
+ depName: {
523
+ type: "string"
524
+ },
525
+ packageName: {
526
+ type: "string"
527
+ },
528
+ depType: {
529
+ type: "string"
530
+ },
531
+ currentValue: {
532
+ type: "string"
533
+ },
534
+ currentVersion: {
535
+ type: "string"
536
+ },
537
+ currentVersionTimestamp: {
538
+ type: "string",
539
+ format: "date-time"
540
+ },
541
+ skipReason: {
542
+ type: "string"
543
+ },
544
+ registryUrl: {
545
+ type: "string"
546
+ },
547
+ sourceUrl: {
548
+ type: "string"
549
+ }
550
+ }
351
551
  }
352
552
  }
353
553
  }
@@ -359,6 +559,80 @@ const runRequestBody = zod.z.object({
359
559
  target
360
560
  });
361
561
 
562
+ async function getGithubToken(integrations, url) {
563
+ const cred = await integration.DefaultGithubCredentialsProvider.fromIntegrations(
564
+ integrations
565
+ ).getCredentials({ url });
566
+ return cred.token;
567
+ }
568
+
569
+ async function getPlatformEnvs(target, context) {
570
+ const { rootConfig, logger } = context;
571
+ const env = {};
572
+ const integrations = integration.ScmIntegrations.fromConfig(rootConfig);
573
+ const integration$1 = integrations.byHost(target.host);
574
+ if (is__default.default.nullOrUndefined(integration$1)) {
575
+ throw new Error(
576
+ `Could not identify platform for target ${target.host}/${target.repository}`
577
+ );
578
+ }
579
+ const errMsg = `No credentials could be found for url and '${integration$1.type}' type for host ${target.host}`;
580
+ const url = `https://${target.host}/${target.repository}`;
581
+ switch (integration$1.type) {
582
+ case "github": {
583
+ env.RENOVATE_PLATFORM = integration$1.type;
584
+ const token = await getGithubToken(integrations, url);
585
+ env.RENOVATE_TOKEN = requireConfigVariable(token, errMsg);
586
+ env.RENOVATE_REPOSITORIES = target.repository;
587
+ break;
588
+ }
589
+ case "gitlab":
590
+ {
591
+ const cred = await integration.DefaultGitlabCredentialsProvider.fromIntegrations(
592
+ integrations
593
+ ).getCredentials({ url });
594
+ const gitLabIntegrationConfig = requireConfigVariable(
595
+ integrations.gitlab.byHost(target.host)?.config,
596
+ errMsg
597
+ );
598
+ env.RENOVATE_PLATFORM = integration$1.type;
599
+ env.RENOVATE_ENDPOINT = gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;
600
+ env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);
601
+ env.RENOVATE_REPOSITORIES = target.repository;
602
+ }
603
+ break;
604
+ default:
605
+ throw new Error(`Unsupported platform type ${integration$1.type}`);
606
+ }
607
+ const githubComURL = "https://github.com";
608
+ const githubComIntegration = integrations.github.byUrl(githubComURL);
609
+ if (is__default.default.nullOrUndefined(githubComIntegration)) {
610
+ logger.warn(`No Github.com integration has been found`);
611
+ } else {
612
+ const githubComToken = await getGithubToken(integrations, githubComURL);
613
+ if (githubComToken) {
614
+ env.RENOVATE_GITHUB_COM = githubComToken;
615
+ } else {
616
+ logger.warn(
617
+ `Could not get token for Github.com token in the defined integrations`
618
+ );
619
+ }
620
+ }
621
+ return env;
622
+ }
623
+ function requireConfigVariable(input, errMessage) {
624
+ if (is__default.default.nullOrUndefined(input)) {
625
+ throw new Error(errMessage);
626
+ }
627
+ return input;
628
+ }
629
+ function getFileUrl(options) {
630
+ if (options.host.includes("github")) {
631
+ return `https://${options.host}/${options.repository}/blob/HEAD/${options.packageFile}`;
632
+ }
633
+ return null;
634
+ }
635
+
362
636
  async function createRouter(runner, options) {
363
637
  const {
364
638
  auth,
@@ -411,6 +685,17 @@ async function createRouter(runner, options) {
411
685
  );
412
686
  response.status(200).json({ modified });
413
687
  });
688
+ router.get("/dependencies", async (request, response) => {
689
+ const filter = request.query;
690
+ const dependencies = await databaseHandler.getDependencies(filter);
691
+ const massaged = dependencies.map((dep) => {
692
+ return {
693
+ ...dep,
694
+ packageFileUrl: getFileUrl(dep)
695
+ };
696
+ });
697
+ response.json(massaged);
698
+ });
414
699
  router.post("/runs", async (request, response) => {
415
700
  const body = runRequestBody.safeParse(request.body);
416
701
  if (!body.success) {
@@ -442,74 +727,6 @@ async function createRouter(runner, options) {
442
727
  return router;
443
728
  }
444
729
 
445
- async function getGithubToken(integrations, url) {
446
- const cred = await integration.DefaultGithubCredentialsProvider.fromIntegrations(
447
- integrations
448
- ).getCredentials({ url });
449
- return cred.token;
450
- }
451
-
452
- async function getPlatformEnvs(target, context) {
453
- const { rootConfig, logger } = context;
454
- const env = {};
455
- const integrations = integration.ScmIntegrations.fromConfig(rootConfig);
456
- const integration$1 = integrations.byHost(target.host);
457
- if (is__default.default.nullOrUndefined(integration$1)) {
458
- throw new Error(
459
- `Could not identify platform for target ${target.host}/${target.repository}`
460
- );
461
- }
462
- const errMsg = `No credentials could be found for url and '${integration$1.type}' type for host ${target.host}`;
463
- const url = `https://${target.host}/${target.repository}`;
464
- switch (integration$1.type) {
465
- case "github": {
466
- env.RENOVATE_PLATFORM = integration$1.type;
467
- const token = await getGithubToken(integrations, url);
468
- env.RENOVATE_TOKEN = requireConfigVariable(token, errMsg);
469
- env.RENOVATE_REPOSITORIES = target.repository;
470
- break;
471
- }
472
- case "gitlab":
473
- {
474
- const cred = await integration.DefaultGitlabCredentialsProvider.fromIntegrations(
475
- integrations
476
- ).getCredentials({ url });
477
- const gitLabIntegrationConfig = requireConfigVariable(
478
- integrations.gitlab.byHost(target.host)?.config,
479
- errMsg
480
- );
481
- env.RENOVATE_PLATFORM = integration$1.type;
482
- env.RENOVATE_ENDPOINT = gitLabIntegrationConfig.apiBaseUrl ?? `https://${target.host}/api/v4`;
483
- env.RENOVATE_TOKEN = requireConfigVariable(cred.token, errMsg);
484
- env.RENOVATE_REPOSITORIES = target.repository;
485
- }
486
- break;
487
- default:
488
- throw new Error(`Unsupported platform type ${integration$1.type}`);
489
- }
490
- const githubComURL = "https://github.com";
491
- const githubComIntegration = integrations.github.byUrl(githubComURL);
492
- if (is__default.default.nullOrUndefined(githubComIntegration)) {
493
- logger.warn(`No Github.com integration has been found`);
494
- } else {
495
- const githubComToken = await getGithubToken(integrations, githubComURL);
496
- if (githubComToken) {
497
- env.RENOVATE_GITHUB_COM = githubComToken;
498
- } else {
499
- logger.warn(
500
- `Could not get token for Github.com token in the defined integrations`
501
- );
502
- }
503
- }
504
- return env;
505
- }
506
- function requireConfigVariable(input, errMessage) {
507
- if (is__default.default.nullOrUndefined(input)) {
508
- throw new Error(errMessage);
509
- }
510
- return input;
511
- }
512
-
513
730
  const RENOVATE_ANNOTATION_KEEP_UPDATED = "renovate.secustor.dev/keep-updated";
514
731
  function getPluginConfig(rootConfig) {
515
732
  return rootConfig.getConfig("renovate");
@@ -722,18 +939,20 @@ class DatabaseHandler {
722
939
  async addReport(options) {
723
940
  const { runID, taskID, report, target } = options;
724
941
  const logger = options.logger ?? this.logger;
942
+ const timestamp = /* @__PURE__ */ new Date();
725
943
  const inserts = [];
726
944
  for (const [repository, value] of Object.entries(report.repositories)) {
727
945
  inserts.push({
728
946
  run_id: runID,
729
947
  task_id: taskID,
730
- timestamp: /* @__PURE__ */ new Date(),
948
+ timestamp,
731
949
  host: target.host,
732
950
  repository,
733
951
  report: value
734
952
  });
735
953
  }
736
954
  await this.client("reports").insert(inserts).catch((reason) => logger.error("Failed insert data", reason));
955
+ await this.updateDependencies(timestamp, options);
737
956
  }
738
957
  async getReports(query) {
739
958
  const builder = this.client.select();
@@ -757,12 +976,7 @@ class DatabaseHandler {
757
976
  return this.client.select().distinct("host", "repository").from("reports");
758
977
  }
759
978
  async deleteReportsByTarget({ host, repository }, options) {
760
- let offset = 0;
761
- if (is__default.default.nullOrUndefined(options?.keepLatest) || is__default.default.boolean(options?.keepLatest)) {
762
- offset = options?.keepLatest ? 1 : 0;
763
- } else {
764
- offset = options.keepLatest;
765
- }
979
+ const offset = getOffset(options);
766
980
  const toBeDeletedIDs = this.client("reports").select("run_id").where("host", host).andWhere("repository", repository).orderBy("timestamp", "DESC").offset(offset);
767
981
  return this.client("reports").delete().whereIn("run_id", [toBeDeletedIDs]);
768
982
  }
@@ -773,6 +987,105 @@ class DatabaseHandler {
773
987
  );
774
988
  return modified.reduce((a, b) => a + b, 0);
775
989
  }
990
+ async updateDependencies(timestamp, options) {
991
+ const { runID, report, target } = options;
992
+ const dependencies = [];
993
+ for (const [repository, repositoryContent] of Object.entries(
994
+ report.repositories
995
+ )) {
996
+ for (const [manager, packageFiles] of Object.entries(
997
+ repositoryContent.packageFiles
998
+ )) {
999
+ for (const packageFile of packageFiles) {
1000
+ const packageFilePath = packageFile.packageFile;
1001
+ for (const dependency of packageFile.deps) {
1002
+ const {
1003
+ packageName,
1004
+ depName,
1005
+ depType,
1006
+ datasource,
1007
+ currentValue,
1008
+ currentVersion,
1009
+ skipReason,
1010
+ registryUrl,
1011
+ sourceUrl,
1012
+ currentVersionTimestamp
1013
+ } = dependency;
1014
+ dependencies.push({
1015
+ run_id: runID,
1016
+ host: target.host,
1017
+ extractionTimestamp: timestamp,
1018
+ repository,
1019
+ manager,
1020
+ datasource: datasource ?? packageFile.datasource ?? "no-datasource",
1021
+ depName,
1022
+ packageName,
1023
+ packageFile: packageFilePath,
1024
+ depType,
1025
+ currentValue,
1026
+ currentVersion,
1027
+ currentVersionTimestamp,
1028
+ skipReason,
1029
+ registryUrl,
1030
+ sourceUrl
1031
+ });
1032
+ }
1033
+ }
1034
+ }
1035
+ }
1036
+ await this.client("dependencies").insert(dependencies);
1037
+ }
1038
+ async getDependencies(filters) {
1039
+ const builder = this.client("dependencies").select();
1040
+ if (filters.host) {
1041
+ builder.whereIn("host", filters.host);
1042
+ }
1043
+ if (filters.repository) {
1044
+ builder.whereIn("repository", filters.repository);
1045
+ }
1046
+ if (filters.manager) {
1047
+ builder.whereIn("manager", filters.manager);
1048
+ }
1049
+ if (filters.datasource) {
1050
+ builder.whereIn("datasource", filters.datasource);
1051
+ }
1052
+ if (filters.depName) {
1053
+ builder.whereIn("depName", filters.depName);
1054
+ }
1055
+ if (filters.latestOnly) {
1056
+ const runIDs = this.client("dependencies").select("d.run_id").from("dependencies as d").join(
1057
+ this.client("dependencies").select("host", "repository").max("extractionTimestamp as max_timestamp").groupBy("host", "repository").as("max_d"),
1058
+ // eslint-disable-next-line func-names
1059
+ function() {
1060
+ this.on("d.host", "=", "max_d.host").andOn("d.repository", "=", "max_d.repository").andOn("d.extractionTimestamp", "=", "max_d.max_timestamp");
1061
+ }
1062
+ ).distinct();
1063
+ builder.whereIn("run_id", runIDs);
1064
+ }
1065
+ return builder.limit(filters.limit ?? 500);
1066
+ }
1067
+ async deleteDependencies(options) {
1068
+ const targets = await this.getTargets();
1069
+ const modified = await Promise.all(
1070
+ targets.map((target) => this.deleteDependenciesByTarget(target, options))
1071
+ );
1072
+ return modified.reduce((a, b) => a + b, 0);
1073
+ }
1074
+ async deleteDependenciesByTarget({ host, repository }, options) {
1075
+ const offset = getOffset(options);
1076
+ const dependencies = this.client("dependencies").select("run_id", "extractionTimestamp").distinct("host", "repository").where("host", host).andWhere("repository", repository);
1077
+ const toBeDeletedIDs = this.client(dependencies).select("run_id").orderBy("extractionTimestamp", "DESC").offset(offset);
1078
+ return this.client("dependencies").delete().whereIn("run_id", [toBeDeletedIDs]);
1079
+ }
1080
+ }
1081
+ function getOffset(options) {
1082
+ let offset = 0;
1083
+ if (is__default.default.nullOrUndefined(options?.keepLatest) || is__default.default.boolean(options?.keepLatest)) {
1084
+ offset = options?.keepLatest ? 1 : 0;
1085
+ } else {
1086
+ offset = options.keepLatest;
1087
+ }
1088
+ return offset;
776
1089
  }
777
1090
 
778
1091
  async function scheduleJobSync(renovateRunner, routerOptions) {
@@ -814,6 +1127,7 @@ async function scheduleCleanupTask(routerOptions) {
814
1127
  const pluginConfig = getPluginConfig(rootConfig);
815
1128
  const schedule = getScheduleDefinition(pluginConfig, "cleanup");
816
1129
  const reportsToKeep = pluginConfig.getOptionalNumber("cleanup.minimumReports") ?? -1;
1130
+ const dependencyHistoryKeep = pluginConfig.getOptionalNumber("cleanup.dependencyHistory") ?? -1;
817
1131
  return scheduler.scheduleTask({
818
1132
  id: `renovate_report_cleanup`,
819
1133
  ...schedule,
@@ -825,6 +1139,15 @@ async function scheduleCleanupTask(routerOptions) {
825
1139
  });
826
1140
  logger.debug(`Report cleanup completed. ${modified} reports deleted`);
827
1141
  }
1142
+ if (dependencyHistoryKeep >= 0) {
1143
+ logger.debug("Running dependency history cleanup");
1144
+ const modified = await databaseHandler.deleteDependencies({
1145
+ keepLatest: dependencyHistoryKeep
1146
+ });
1147
+ logger.debug(
1148
+ `Dependency history cleanup completed. ${modified} dependencies deleted`
1149
+ );
1150
+ }
828
1151
  }
829
1152
  });
830
1153
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/schema/openapi.generated.ts","../src/service/schema.ts","../src/service/router.ts","../src/wrapper/platforms/github.ts","../src/wrapper/platforms/index.ts","../src/config/index.ts","../src/wrapper/utils.ts","../src/queue/factory.ts","../src/wrapper/renovateRunner.ts","../src/service/databaseHandler.ts","../src/service/jobSync.ts","../src/service/cleanupTask.ts","../src/plugin.ts"],"sourcesContent":["//\n\n// ******************************************************************\n// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. *\n// ******************************************************************\nimport { createValidatedOpenApiRouter } from '@backstage/backend-openapi-utils';\n\nexport const spec = {\n openapi: '3.0.0',\n info: {\n title: 'renovate',\n description: 'Backstage Renovate API',\n version: '0.1.0',\n },\n servers: [\n {\n description: 'local test setup',\n url: 'http://localhost:7007',\n },\n ],\n paths: {\n '/health': {\n get: {\n summary: 'Get health status of the plugin',\n responses: {\n '200': {\n description: 'health status is green',\n content: {\n 'application/json': {\n schema: {\n type: 'string',\n example: 'ok',\n },\n },\n },\n },\n },\n },\n },\n '/reports': {\n get: {\n summary: 'Get all reports',\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}': {\n get: {\n summary: 'Get reports for host',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown host',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}/{repository}': {\n get: {\n summary: 'Get reports for repository',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n {\n name: 'repository',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'myOrg/myRepository',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown repository',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/runs': {\n post: {\n summary: 'Start or get Renovate runs',\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['target'],\n properties: {\n target: {\n $ref: '#/components/schemas/target',\n },\n },\n },\n },\n },\n },\n responses: {\n '202': {\n description: 'Run has been scheduled',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n taskID: {\n description: 'id of the scheduler task',\n type: 'string',\n example: '9-d_CO9JlaEmd-OM9QfkI',\n },\n },\n },\n },\n },\n },\n '400': {\n description: 'Unexpected incoming data',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n error: {\n $ref: '#/components/schemas/error',\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n components: {\n parameters: {\n keepLatest: {\n name: 'keepLatest',\n description: 'how many reports of all targets should be kept',\n in: 'query',\n required: false,\n example: 3,\n schema: {\n type: 'number',\n },\n },\n },\n responses: {\n 'deleted-successful': {\n description: 'Successful deleted',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n deleted: {\n type: 'number',\n example: 15,\n description: 'Numbers of reports deleted',\n },\n },\n },\n },\n },\n },\n reports: {\n description: 'Returns reports',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n type: 'object',\n additionalProperties: false,\n required: [\n 'taskID',\n 'repository',\n 'host',\n 'timestamp',\n 'report',\n ],\n properties: {\n taskID: {\n type: 'string',\n },\n timestamp: {\n type: 'string',\n format: 'date-time',\n },\n host: {\n type: 'string',\n },\n repository: {\n type: 'string',\n },\n report: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n },\n },\n },\n },\n },\n },\n schemas: {\n error: {\n anyOf: [\n {\n type: 'object',\n example: {\n message: \"I'm an error\",\n code: 1111,\n },\n },\n {\n type: 'string',\n example: \"I'm an error\",\n },\n ],\n },\n target: {\n anyOf: [\n {\n type: 'string',\n description: 'URL to an repository',\n example: 'https://github.com/secustor/renovate-test',\n },\n {\n type: 'string',\n description:\n 'stringified Entity with SourceLocation URL annotation',\n example: 'component:default/backstage-plugins-example',\n },\n {\n type: 'string',\n description: 'host and path',\n example: 'secustor/backstage-plugins',\n },\n ],\n },\n repositoryReportList: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n repositoryReport: {\n description: 'report for a specific repository',\n type: 'object',\n additionalProperties: false,\n required: ['branches', 'packageFiles', 'problems'],\n properties: {\n branches: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n packageFiles: {\n type: 'object',\n },\n problems: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n },\n },\n },\n },\n} as const;\nexport const createOpenApiRouter = async (\n options?: Parameters<typeof createValidatedOpenApiRouter>['1'],\n) => createValidatedOpenApiRouter<typeof spec>(spec, options);\n","import { z } from 'zod';\nimport { targetRepo } from '@secustor/backstage-plugin-renovate-common';\n\nexport const target = z.string().or(targetRepo);\n\nexport const runRequestBody = z.object({\n target,\n});\n","import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport express from 'express';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { runRequestBody } from './schema';\nimport type { RouterOptions } from './types';\nimport {\n getTargetRepo,\n getTaskID,\n isEntityRef,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from '../wrapper';\nimport { CatalogClient } from '@backstage/catalog-client';\nimport type { Entity } from '@backstage/catalog-model';\nimport is from '@sindresorhus/is';\n\nexport async function createRouter(\n runner: RenovateRunner,\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n auth,\n rootConfig: config,\n logger,\n databaseHandler,\n discovery,\n } = options;\n\n const middlewareFactory = MiddlewareFactory.create({ logger, config });\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const router = await createOpenApiRouter();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.debug('healthcheck request');\n response.json('ok');\n });\n\n router.get('/reports', async (_request, response) => {\n const reports = await databaseHandler.getReports();\n response.status(200).json(reports);\n });\n\n router.delete('/reports', async (request, response) => {\n const modified = await databaseHandler.deleteReports({\n keepLatest: request.query.keepLatest,\n });\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host/:repository', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host/:repository', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.post('/runs', async (request, response) => {\n const body = runRequestBody.safeParse(request.body);\n if (!body.success) {\n response.status(400).json({ error: body.error.toString() });\n return;\n }\n let target: string | TargetRepo | Entity = body.data.target;\n\n // check if we got an entity ref and if yes get the entity\n if (is.string(target) && isEntityRef(target)) {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const result = await client.getEntityByRef(target, { token });\n if (result) {\n target = result;\n }\n }\n\n // trigger Renovate run\n const targetRepo = getTargetRepo(target);\n const id = getTaskID(targetRepo);\n const result = await runner.runNext(targetRepo);\n if (result.status === 'already-running') {\n logger.debug('Task already running', { taskID: id });\n response.status(423).json({ error: 'Task is already running' });\n return;\n }\n response.status(202).json({ taskID: id });\n });\n router.use(middlewareFactory.error());\n return router;\n}\n","import {\n DefaultGithubCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\n\nexport async function getGithubToken(\n integrations: ScmIntegrations,\n url: string,\n): Promise<string | undefined> {\n const cred = await DefaultGithubCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n return cred.token;\n}\n","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","import { Config } from '@backstage/config';\nimport {\n readSchedulerServiceTaskScheduleDefinitionFromConfig,\n SchedulerServiceTaskScheduleDefinition,\n} from '@backstage/backend-plugin-api';\nimport { JsonValue } from '@backstage/types';\n\nexport const RENOVATE_ANNOTATION_KEEP_UPDATED =\n 'renovate.secustor.dev/keep-updated';\n\nexport function getPluginConfig(rootConfig: Config): Config {\n return rootConfig.getConfig('renovate');\n}\n\nexport function getRenovateConfig(rootConfig: Config): JsonValue {\n const value = getPluginConfig(rootConfig).getOptional('config');\n return value ?? null;\n}\n\nexport function getRuntimeConfigs(rootConfig: Config): {\n runtime: string;\n config: Config | null;\n} {\n const runtimeConfig = getPluginConfig(rootConfig).getConfig('runtime');\n const runtime = runtimeConfig.getString('type');\n return {\n runtime,\n config: runtimeConfig.getConfig(runtime),\n };\n}\n\nexport function getScheduleDefinition(\n pluginConfig: Config,\n variant: 'renovation' | 'cleanup',\n): SchedulerServiceTaskScheduleDefinition {\n try {\n const scheduleConfig = pluginConfig.getConfig(`schedules.${variant}`);\n return readSchedulerServiceTaskScheduleDefinitionFromConfig(scheduleConfig);\n } catch (e) {\n return {\n scope: 'global',\n timeout: { minutes: 60 },\n frequency: { minutes: 60 },\n };\n }\n}\n","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","import { Config } from '@backstage/config';\nimport { getPluginConfig } from '../config';\nimport {\n QueueFactory,\n RenovateQueue,\n Runnable,\n} from '@secustor/backstage-plugin-renovate-node';\n\nexport function createQueue<T extends object>(\n queues: Map<string, QueueFactory<T>>,\n rootConfig: Config,\n runnable: Runnable<T>,\n): RenovateQueue<T> {\n const type = getPluginConfig(rootConfig).getString('queue.type');\n\n const factory = queues.get(type);\n if (!factory) {\n throw new Error(`Could not find Queue implementation ${type}`);\n }\n\n return factory(runnable);\n}\n","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","import { resolvePackagePath } from '@backstage/backend-plugin-api';\nimport { Knex } from 'knex';\nimport type {\n AddReportParameters,\n DatabaseCreationParameters,\n DeleteOptions,\n ReportQueryParameters,\n ReportsRow,\n ReportTargetQuery,\n} from './types';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport is from '@sindresorhus/is';\nimport { RepositoryReportResponse } from '@secustor/backstage-plugin-renovate-common';\n\nconst migrationsDir = resolvePackagePath(\n '@secustor/backstage-plugin-renovate-backend',\n 'migrations',\n);\n\nexport class DatabaseHandler {\n static async create(\n options: DatabaseCreationParameters,\n ): Promise<DatabaseHandler> {\n const { database, logger } = options;\n const client = await database.getClient();\n\n if (!database.migrations?.skip) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseHandler(client, logger);\n }\n\n private constructor(\n private client: Knex,\n private logger: LoggerService,\n ) {}\n\n async addReport(options: AddReportParameters): Promise<void> {\n const { runID, taskID, report, target } = options;\n const logger = options.logger ?? this.logger;\n\n const inserts: ReportsRow[] = [];\n for (const [repository, value] of Object.entries(report.repositories)) {\n inserts.push({\n run_id: runID,\n task_id: taskID,\n timestamp: new Date(),\n host: target.host,\n repository,\n report: value,\n });\n }\n // this.client.batchInsert<ReportsRow>('reports', inserts);\n await this.client('reports')\n .insert(inserts)\n .catch(reason => logger.error('Failed insert data', reason));\n }\n\n async getReports(\n query?: ReportQueryParameters,\n ): Promise<RepositoryReportResponse> {\n const builder = this.client.select<ReportsRow[]>();\n if (query) {\n builder.where(query);\n }\n const rows = await builder.from<ReportsRow[]>('reports');\n return rows.map(row => {\n return {\n runID: row.run_id,\n taskID: row.task_id,\n timestamp: row.timestamp.toISOString(),\n host: row.host,\n repository: row.repository,\n // if the JSON field has not been auto-parsed do it manually\n report: is.string(row.report) ? JSON.parse(row.report) : row.report,\n };\n });\n }\n\n async getTargets(): Promise<ReportTargetQuery[]> {\n return this.client\n .select()\n .distinct<ReportsRow[]>('host', 'repository')\n .from('reports');\n }\n\n async deleteReportsByTarget(\n { host, repository }: ReportTargetQuery,\n options?: DeleteOptions,\n ): Promise<number> {\n let offset = 0;\n if (\n is.nullOrUndefined(options?.keepLatest) ||\n is.boolean(options?.keepLatest)\n ) {\n offset = options?.keepLatest ? 1 : 0;\n } else {\n offset = options.keepLatest;\n }\n const toBeDeletedIDs = this.client('reports')\n .select('run_id')\n .where('host', host)\n .andWhere('repository', repository)\n .orderBy('timestamp', 'DESC')\n .offset(offset);\n\n return this.client('reports').delete().whereIn('run_id', [toBeDeletedIDs]);\n }\n\n async deleteReports(options?: DeleteOptions): Promise<number> {\n const targets = await this.getTargets();\n const modified = await Promise.all(\n targets.map(target => this.deleteReportsByTarget(target, options)),\n );\n // sum up\n return modified.reduce((a, b) => a + b, 0);\n }\n}\n","import {\n CATALOG_FILTER_EXISTS,\n CatalogClient,\n} from '@backstage/catalog-client';\nimport { ANNOTATION_SOURCE_LOCATION } from '@backstage/catalog-model';\nimport { RouterOptions } from './types';\nimport {\n getPluginConfig,\n getScheduleDefinition,\n RENOVATE_ANNOTATION_KEEP_UPDATED,\n} from '../config';\nimport { RenovateRunner } from '../wrapper';\n\nexport async function scheduleJobSync(\n renovateRunner: RenovateRunner,\n routerOptions: RouterOptions,\n): Promise<void> {\n const { scheduler, auth, rootConfig, discovery } = routerOptions;\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'renovation');\n\n return scheduler.scheduleTask({\n id: `renovate_scheduled_runs`,\n ...schedule,\n\n fn: async () => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const { items: entities } = await client.getEntities(\n {\n filter: {\n [`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]:\n CATALOG_FILTER_EXISTS,\n [`metadata.annotations.${ANNOTATION_SOURCE_LOCATION}`]:\n CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'kind',\n 'metadata.annotations',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n },\n { token },\n );\n\n await renovateRunner.addToQueue(...entities);\n },\n });\n}\n","import { RouterOptions } from './types';\nimport { getPluginConfig, getScheduleDefinition } from '../config';\n\nexport async function scheduleCleanupTask(routerOptions: RouterOptions) {\n const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'cleanup');\n const reportsToKeep =\n pluginConfig.getOptionalNumber('cleanup.minimumReports') ?? -1;\n\n return scheduler.scheduleTask({\n id: `renovate_report_cleanup`,\n ...schedule,\n fn: async () => {\n if (reportsToKeep >= 0) {\n logger.debug('Running report cleanup');\n const modified = await databaseHandler.deleteReports({\n keepLatest: reportsToKeep,\n });\n logger.debug(`Report cleanup completed. ${modified} reports deleted`);\n }\n },\n });\n}\n","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { RenovateWrapper } from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from './wrapper';\nimport { RouterOptions } from './service/types';\nimport { DatabaseHandler } from './service/databaseHandler';\nimport {\n QueueFactory,\n renovateQueueExtensionPoint,\n renovateRuntimeExtensionPoint,\n RunOptions,\n} from '@secustor/backstage-plugin-renovate-node';\nimport { scheduleJobSync } from './service/jobSync';\nimport { scheduleCleanupTask } from './service/cleanupTask';\n\n/**\n * Renovate backend plugin\n *\n * @public\n */\nexport const renovatePlugin = createBackendPlugin({\n pluginId: 'renovate',\n register(env) {\n // allow modules provide additional runtimes\n const runtimes = new Map<string, RenovateWrapper>();\n env.registerExtensionPoint(renovateRuntimeExtensionPoint, {\n addRuntime(id: string, runtime: RenovateWrapper) {\n if (runtimes.has(id)) {\n throw new Error(\n ` ${id} has been already registered. Only one wrapper with the same ID is allowed to be registered`,\n );\n }\n runtimes.set(id, runtime);\n },\n });\n\n const queueFactories = new Map<string, QueueFactory<RunOptions>>();\n env.registerExtensionPoint(renovateQueueExtensionPoint, {\n addQueueFactory(id: string, factory: QueueFactory<RunOptions>) {\n if (queueFactories.has(id)) {\n throw new Error(\n ` ${id} has been already registered. Only one queue with the same ID is allowed to be registered`,\n );\n }\n queueFactories.set(id, factory);\n },\n });\n\n env.registerInit({\n deps: {\n rootConfig: coreServices.rootConfig,\n logger: coreServices.logger,\n httpRouter: coreServices.httpRouter,\n database: coreServices.database,\n scheduler: coreServices.scheduler,\n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init(options) {\n const { database, httpRouter, logger } = options;\n\n const routerOptions: RouterOptions = {\n ...options,\n databaseHandler: await DatabaseHandler.create({ database, logger }),\n runtimes,\n queueFactories,\n };\n const renovateRunner = await RenovateRunner.from(routerOptions);\n\n await scheduleJobSync(renovateRunner, routerOptions);\n await scheduleCleanupTask(routerOptions);\n\n httpRouter.use(await createRouter(renovateRunner, routerOptions));\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createValidatedOpenApiRouter","z","targetRepo","MiddlewareFactory","CatalogClient","express","is","isEntityRef","result","getTargetRepo","getTaskID","DefaultGithubCredentialsProvider","ScmIntegrations","integration","DefaultGitlabCredentialsProvider","readSchedulerServiceTaskScheduleDefinitionFromConfig","nanoid","isError","resolvePackagePath","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION","createBackendPlugin","renovateRuntimeExtensionPoint","renovateQueueExtensionPoint","coreServices"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/schema/openapi.generated.ts","../src/service/schema.ts","../src/wrapper/platforms/github.ts","../src/wrapper/platforms/index.ts","../src/service/router.ts","../src/config/index.ts","../src/wrapper/utils.ts","../src/queue/factory.ts","../src/wrapper/renovateRunner.ts","../src/service/databaseHandler.ts","../src/service/jobSync.ts","../src/service/cleanupTask.ts","../src/plugin.ts"],"sourcesContent":["//\n\n// ******************************************************************\n// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. *\n// ******************************************************************\nimport { createValidatedOpenApiRouter } from '@backstage/backend-openapi-utils';\n\nexport const spec = {\n openapi: '3.0.0',\n info: {\n title: 'renovate',\n description: 'Backstage Renovate API',\n version: '0.1.0',\n },\n servers: [\n {\n description: 'local test setup',\n url: 'http://localhost:7007',\n },\n ],\n paths: {\n '/health': {\n get: {\n summary: 'Get health status of the plugin',\n responses: {\n '200': {\n description: 'health status is green',\n content: {\n 'application/json': {\n schema: {\n type: 'string',\n example: 'ok',\n },\n },\n },\n },\n },\n },\n },\n '/reports': {\n get: {\n summary: 'Get all reports',\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}': {\n get: {\n summary: 'Get reports for host',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown host',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/reports/{host}/{repository}': {\n get: {\n summary: 'Get reports for repository',\n parameters: [\n {\n name: 'host',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'github.com',\n },\n },\n {\n name: 'repository',\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n example: 'myOrg/myRepository',\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/reports',\n },\n '404': {\n description: 'unknown repository',\n },\n },\n },\n delete: {\n summary: 'Delete reports based on parameters',\n parameters: [\n {\n $ref: '#/components/parameters/keepLatest',\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/deleted-successful',\n },\n },\n },\n },\n '/dependencies': {\n get: {\n summary: 'Get dependencies for host',\n parameters: [\n {\n name: 'datasource',\n in: 'query',\n description: 'filter by datasource',\n schema: {\n type: 'array',\n items: {\n example: 'npm,pypi',\n type: 'string',\n },\n },\n },\n {\n name: 'depName',\n in: 'query',\n description: 'filter by dependency name',\n schema: {\n type: 'array',\n items: {\n example: 'pdm,react',\n type: 'string',\n },\n },\n },\n {\n name: 'depType',\n in: 'query',\n description: 'filter by dependency type',\n schema: {\n type: 'array',\n items: {\n example: 'dev,prod',\n type: 'string',\n },\n },\n },\n {\n name: 'host',\n in: 'query',\n schema: {\n type: 'array',\n example: 'github.com,gitlab.example.com',\n items: {\n type: 'string',\n },\n },\n },\n {\n name: 'latestOnly',\n in: 'query',\n description:\n 'include only dependencies which have been found in the last extraction',\n schema: {\n type: 'boolean',\n },\n },\n {\n name: 'limit',\n in: 'query',\n description: 'limit the number of dependencies returned',\n schema: {\n type: 'number',\n default: 500,\n },\n },\n {\n name: 'manager',\n in: 'query',\n description: 'filter by manager',\n schema: {\n type: 'array',\n items: {\n example: 'npm,composer',\n type: 'string',\n },\n },\n },\n {\n name: 'packageFile',\n in: 'query',\n description: 'filter by package file',\n schema: {\n type: 'array',\n items: {\n example: 'package.json,composer.json',\n type: 'string',\n },\n },\n },\n {\n name: 'repository',\n in: 'query',\n schema: {\n type: 'array',\n example: 'myOrg/myRepository,myOrg/myOtherRepository',\n items: {\n type: 'string',\n },\n },\n },\n ],\n responses: {\n '200': {\n $ref: '#/components/responses/dependencies',\n },\n '404': {\n description: 'unknown host',\n },\n },\n },\n },\n '/runs': {\n post: {\n summary: 'Start or get Renovate runs',\n requestBody: {\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['target'],\n properties: {\n target: {\n $ref: '#/components/schemas/target',\n },\n },\n },\n },\n },\n },\n responses: {\n '202': {\n description: 'Run has been scheduled',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n taskID: {\n description: 'id of the scheduler task',\n type: 'string',\n example: '9-d_CO9JlaEmd-OM9QfkI',\n },\n },\n },\n },\n },\n },\n '400': {\n description: 'Unexpected incoming data',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n error: {\n $ref: '#/components/schemas/error',\n },\n },\n },\n },\n },\n },\n },\n },\n },\n },\n components: {\n parameters: {\n keepLatest: {\n name: 'keepLatest',\n description: 'how many reports of all targets should be kept',\n in: 'query',\n required: false,\n example: 3,\n schema: {\n type: 'number',\n },\n },\n },\n responses: {\n dependencies: {\n description: 'Returns dependencies',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/dependency',\n },\n },\n },\n },\n },\n 'deleted-successful': {\n description: 'Successful deleted',\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n properties: {\n deleted: {\n type: 'number',\n example: 15,\n description: 'Numbers of reports deleted',\n },\n },\n },\n },\n },\n },\n reports: {\n description: 'Returns reports',\n content: {\n 'application/json': {\n schema: {\n type: 'array',\n items: {\n type: 'object',\n additionalProperties: false,\n required: [\n 'taskID',\n 'repository',\n 'host',\n 'timestamp',\n 'report',\n ],\n properties: {\n taskID: {\n type: 'string',\n },\n timestamp: {\n type: 'string',\n format: 'date-time',\n },\n host: {\n type: 'string',\n },\n repository: {\n type: 'string',\n },\n report: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n },\n },\n },\n },\n },\n },\n schemas: {\n error: {\n anyOf: [\n {\n type: 'object',\n example: {\n message: \"I'm an error\",\n code: 1111,\n },\n },\n {\n type: 'string',\n example: \"I'm an error\",\n },\n ],\n },\n target: {\n anyOf: [\n {\n type: 'string',\n description: 'URL to an repository',\n example: 'https://github.com/secustor/renovate-test',\n },\n {\n type: 'string',\n description:\n 'stringified Entity with SourceLocation URL annotation',\n example: 'component:default/backstage-plugins-example',\n },\n {\n type: 'string',\n description: 'host and path',\n example: 'secustor/backstage-plugins',\n },\n ],\n },\n repositoryReportList: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/repositoryReport',\n },\n },\n repositoryReport: {\n description: 'report for a specific repository',\n type: 'object',\n additionalProperties: false,\n required: ['branches', 'packageFiles', 'problems'],\n properties: {\n branches: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n packageFiles: {\n type: 'object',\n },\n problems: {\n type: 'array',\n items: {\n type: 'object',\n },\n },\n },\n },\n dependency: {\n type: 'object',\n additionalProperties: false,\n required: [\n 'id',\n 'runID',\n 'host',\n 'repository',\n 'extractionTimestamp',\n 'manager',\n 'datasource',\n 'packageFile',\n 'depName',\n ],\n properties: {\n id: {\n type: 'string',\n },\n runID: {\n type: 'string',\n },\n host: {\n type: 'string',\n },\n repository: {\n type: 'string',\n },\n extractionTimestamp: {\n type: 'string',\n format: 'date-time',\n },\n manager: {\n type: 'string',\n },\n datasource: {\n type: 'string',\n },\n packageFile: {\n type: 'string',\n },\n packageFileUrl: {\n type: 'string',\n },\n depName: {\n type: 'string',\n },\n packageName: {\n type: 'string',\n },\n depType: {\n type: 'string',\n },\n currentValue: {\n type: 'string',\n },\n currentVersion: {\n type: 'string',\n },\n currentVersionTimestamp: {\n type: 'string',\n format: 'date-time',\n },\n skipReason: {\n type: 'string',\n },\n registryUrl: {\n type: 'string',\n },\n sourceUrl: {\n type: 'string',\n },\n },\n },\n },\n },\n} as const;\nexport const createOpenApiRouter = async (\n options?: Parameters<typeof createValidatedOpenApiRouter>['1'],\n) => createValidatedOpenApiRouter<typeof spec>(spec, options);\n","import { z } from 'zod';\nimport { targetRepo } from '@secustor/backstage-plugin-renovate-common';\n\nexport const target = z.string().or(targetRepo);\n\nexport const runRequestBody = z.object({\n target,\n});\n","import {\n DefaultGithubCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\n\nexport async function getGithubToken(\n integrations: ScmIntegrations,\n url: string,\n): Promise<string | undefined> {\n const cred = await DefaultGithubCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n return cred.token;\n}\n","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","import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport express from 'express';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { runRequestBody } from './schema';\nimport { DependenciesFilter, RouterOptions } from './types';\nimport {\n getTargetRepo,\n getTaskID,\n isEntityRef,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from '../wrapper';\nimport { CatalogClient } from '@backstage/catalog-client';\nimport type { Entity } from '@backstage/catalog-model';\nimport is from '@sindresorhus/is';\nimport { getFileUrl } from '../wrapper/platforms';\n\nexport async function createRouter(\n runner: RenovateRunner,\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n auth,\n rootConfig: config,\n logger,\n databaseHandler,\n discovery,\n } = options;\n\n const middlewareFactory = MiddlewareFactory.create({ logger, config });\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const router = await createOpenApiRouter();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.debug('healthcheck request');\n response.json('ok');\n });\n\n router.get('/reports', async (_request, response) => {\n const reports = await databaseHandler.getReports();\n response.status(200).json(reports);\n });\n\n router.delete('/reports', async (request, response) => {\n const modified = await databaseHandler.deleteReports({\n keepLatest: request.query.keepLatest,\n });\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host/:repository', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host/:repository', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.get('/dependencies', async (request, response) => {\n const filter: DependenciesFilter = request.query;\n const dependencies = await databaseHandler.getDependencies(filter);\n\n const massaged = dependencies.map(dep => {\n return {\n ...dep,\n packageFileUrl: getFileUrl(dep),\n };\n });\n\n // openapi gen expects an empty array\n response.json(massaged as []);\n });\n\n router.post('/runs', async (request, response) => {\n const body = runRequestBody.safeParse(request.body);\n if (!body.success) {\n response.status(400).json({ error: body.error.toString() });\n return;\n }\n let target: string | TargetRepo | Entity = body.data.target;\n\n // check if we got an entity ref and if yes get the entity\n if (is.string(target) && isEntityRef(target)) {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const result = await client.getEntityByRef(target, { token });\n if (result) {\n target = result;\n }\n }\n\n // trigger Renovate run\n const targetRepo = getTargetRepo(target);\n const id = getTaskID(targetRepo);\n const result = await runner.runNext(targetRepo);\n if (result.status === 'already-running') {\n logger.debug('Task already running', { taskID: id });\n response.status(423).json({ error: 'Task is already running' });\n return;\n }\n response.status(202).json({ taskID: id });\n });\n router.use(middlewareFactory.error());\n return router;\n}\n","import { Config } from '@backstage/config';\nimport {\n readSchedulerServiceTaskScheduleDefinitionFromConfig,\n SchedulerServiceTaskScheduleDefinition,\n} from '@backstage/backend-plugin-api';\nimport { JsonValue } from '@backstage/types';\n\nexport const RENOVATE_ANNOTATION_KEEP_UPDATED =\n 'renovate.secustor.dev/keep-updated';\n\nexport function getPluginConfig(rootConfig: Config): Config {\n return rootConfig.getConfig('renovate');\n}\n\nexport function getRenovateConfig(rootConfig: Config): JsonValue {\n const value = getPluginConfig(rootConfig).getOptional('config');\n return value ?? null;\n}\n\nexport function getRuntimeConfigs(rootConfig: Config): {\n runtime: string;\n config: Config | null;\n} {\n const runtimeConfig = getPluginConfig(rootConfig).getConfig('runtime');\n const runtime = runtimeConfig.getString('type');\n return {\n runtime,\n config: runtimeConfig.getConfig(runtime),\n };\n}\n\nexport function getScheduleDefinition(\n pluginConfig: Config,\n variant: 'renovation' | 'cleanup',\n): SchedulerServiceTaskScheduleDefinition {\n try {\n const scheduleConfig = pluginConfig.getConfig(`schedules.${variant}`);\n return readSchedulerServiceTaskScheduleDefinitionFromConfig(scheduleConfig);\n } catch (e) {\n return {\n scope: 'global',\n timeout: { minutes: 60 },\n frequency: { minutes: 60 },\n };\n }\n}\n","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","import { Config } from '@backstage/config';\nimport { getPluginConfig } from '../config';\nimport {\n QueueFactory,\n RenovateQueue,\n Runnable,\n} from '@secustor/backstage-plugin-renovate-node';\n\nexport function createQueue<T extends object>(\n queues: Map<string, QueueFactory<T>>,\n rootConfig: Config,\n runnable: Runnable<T>,\n): RenovateQueue<T> {\n const type = getPluginConfig(rootConfig).getString('queue.type');\n\n const factory = queues.get(type);\n if (!factory) {\n throw new Error(`Could not find Queue implementation ${type}`);\n }\n\n return factory(runnable);\n}\n","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","import {\n LoggerService,\n resolvePackagePath,\n} from '@backstage/backend-plugin-api';\nimport { Knex } from 'knex';\nimport {\n AddReportParameters,\n DatabaseCreationParameters,\n DeleteOptions,\n DependenciesFilter,\n DependencyRow,\n ReportQueryParameters,\n ReportsRow,\n ReportTargetQuery,\n} from './types';\nimport is from '@sindresorhus/is';\nimport { RepositoryReportResponse } from '@secustor/backstage-plugin-renovate-common';\n\nconst migrationsDir = resolvePackagePath(\n '@secustor/backstage-plugin-renovate-backend',\n 'migrations',\n);\n\nexport class DatabaseHandler {\n static async create(\n options: DatabaseCreationParameters,\n ): Promise<DatabaseHandler> {\n const { database, logger } = options;\n const client = await database.getClient();\n\n if (!database.migrations?.skip) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseHandler(client, logger);\n }\n\n private constructor(\n private client: Knex,\n private logger: LoggerService,\n ) {}\n\n async addReport(options: AddReportParameters): Promise<void> {\n const { runID, taskID, report, target } = options;\n const logger = options.logger ?? this.logger;\n\n const timestamp = new Date();\n\n const inserts: ReportsRow[] = [];\n for (const [repository, value] of Object.entries(report.repositories)) {\n inserts.push({\n run_id: runID,\n task_id: taskID,\n timestamp,\n host: target.host,\n repository,\n report: value,\n });\n }\n // this.client.batchInsert<ReportsRow>('reports', inserts);\n await this.client('reports')\n .insert(inserts)\n .catch(reason => logger.error('Failed insert data', reason));\n\n await this.updateDependencies(timestamp, options);\n }\n\n async getReports(\n query?: ReportQueryParameters,\n ): Promise<RepositoryReportResponse> {\n const builder = this.client.select<ReportsRow[]>();\n if (query) {\n builder.where(query);\n }\n const rows = await builder.from<ReportsRow[]>('reports');\n return rows.map(row => {\n return {\n runID: row.run_id,\n taskID: row.task_id,\n timestamp: row.timestamp.toISOString(),\n host: row.host,\n repository: row.repository,\n // if the JSON field has not been auto-parsed do it manually\n report: is.string(row.report) ? JSON.parse(row.report) : row.report,\n };\n });\n }\n\n async getTargets(): Promise<ReportTargetQuery[]> {\n return this.client\n .select()\n .distinct<ReportsRow[]>('host', 'repository')\n .from('reports');\n }\n\n async deleteReportsByTarget(\n { host, repository }: ReportTargetQuery,\n options?: DeleteOptions,\n ): Promise<number> {\n const offset = getOffset(options);\n\n const toBeDeletedIDs = this.client('reports')\n .select('run_id')\n .where('host', host)\n .andWhere('repository', repository)\n .orderBy('timestamp', 'DESC')\n .offset(offset);\n\n return this.client('reports').delete().whereIn('run_id', [toBeDeletedIDs]);\n }\n\n async deleteReports(options?: DeleteOptions): Promise<number> {\n const targets = await this.getTargets();\n const modified = await Promise.all(\n targets.map(target => this.deleteReportsByTarget(target, options)),\n );\n // sum up\n return modified.reduce((a, b) => a + b, 0);\n }\n\n private async updateDependencies(\n timestamp: Date,\n options: AddReportParameters,\n ): Promise<void> {\n const { runID, report, target } = options;\n const dependencies: DependencyRow[] = [];\n for (const [repository, repositoryContent] of Object.entries(\n report.repositories,\n )) {\n for (const [manager, packageFiles] of Object.entries(\n repositoryContent.packageFiles,\n )) {\n for (const packageFile of packageFiles) {\n const packageFilePath = packageFile.packageFile;\n for (const dependency of packageFile.deps) {\n const {\n packageName,\n depName,\n depType,\n datasource,\n currentValue,\n currentVersion,\n skipReason,\n registryUrl,\n sourceUrl,\n currentVersionTimestamp,\n } = dependency;\n dependencies.push({\n run_id: runID,\n host: target.host,\n extractionTimestamp: timestamp,\n repository,\n manager,\n datasource:\n datasource ?? packageFile.datasource ?? 'no-datasource',\n depName,\n packageName,\n packageFile: packageFilePath,\n depType,\n currentValue,\n currentVersion,\n currentVersionTimestamp,\n skipReason,\n registryUrl,\n sourceUrl,\n });\n }\n }\n }\n }\n await this.client('dependencies').insert(dependencies);\n }\n\n async getDependencies(filters: DependenciesFilter): Promise<DependencyRow[]> {\n const builder = this.client('dependencies').select<DependencyRow[]>();\n\n if (filters.host) {\n builder.whereIn('host', filters.host);\n }\n if (filters.repository) {\n builder.whereIn('repository', filters.repository);\n }\n if (filters.manager) {\n builder.whereIn('manager', filters.manager);\n }\n if (filters.datasource) {\n builder.whereIn('datasource', filters.datasource);\n }\n if (filters.depName) {\n builder.whereIn('depName', filters.depName);\n }\n\n if (filters.latestOnly) {\n const runIDs = this.client('dependencies')\n .select('d.run_id')\n .from('dependencies as d')\n .join(\n this.client('dependencies')\n .select('host', 'repository')\n .max('extractionTimestamp as max_timestamp')\n .groupBy('host', 'repository')\n .as('max_d'),\n // eslint-disable-next-line func-names\n function () {\n this.on('d.host', '=', 'max_d.host')\n .andOn('d.repository', '=', 'max_d.repository')\n .andOn('d.extractionTimestamp', '=', 'max_d.max_timestamp');\n },\n )\n .distinct();\n\n builder.whereIn('run_id', runIDs);\n }\n\n return builder.limit(filters.limit ?? 500);\n }\n\n async deleteDependencies(options: DeleteOptions): Promise<number> {\n const targets = await this.getTargets();\n const modified = await Promise.all(\n targets.map(target => this.deleteDependenciesByTarget(target, options)),\n );\n // sum up\n return modified.reduce((a, b) => a + b, 0);\n }\n\n async deleteDependenciesByTarget(\n { host, repository }: ReportTargetQuery,\n options?: DeleteOptions,\n ): Promise<number> {\n const offset = getOffset(options);\n\n const dependencies = this.client('dependencies')\n .select('run_id', 'extractionTimestamp')\n .distinct('host', 'repository')\n .where('host', host)\n .andWhere('repository', repository);\n\n const toBeDeletedIDs = this.client(dependencies)\n .select('run_id')\n .orderBy('extractionTimestamp', 'DESC')\n .offset(offset);\n\n return this.client('dependencies')\n .delete()\n .whereIn('run_id', [toBeDeletedIDs]);\n }\n}\n\nfunction getOffset(options?: DeleteOptions): number {\n let offset = 0;\n if (\n is.nullOrUndefined(options?.keepLatest) ||\n is.boolean(options?.keepLatest)\n ) {\n offset = options?.keepLatest ? 1 : 0;\n } else {\n offset = options.keepLatest;\n }\n return offset;\n}\n","import {\n CATALOG_FILTER_EXISTS,\n CatalogClient,\n} from '@backstage/catalog-client';\nimport { ANNOTATION_SOURCE_LOCATION } from '@backstage/catalog-model';\nimport { RouterOptions } from './types';\nimport {\n getPluginConfig,\n getScheduleDefinition,\n RENOVATE_ANNOTATION_KEEP_UPDATED,\n} from '../config';\nimport { RenovateRunner } from '../wrapper';\n\nexport async function scheduleJobSync(\n renovateRunner: RenovateRunner,\n routerOptions: RouterOptions,\n): Promise<void> {\n const { scheduler, auth, rootConfig, discovery } = routerOptions;\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'renovation');\n\n return scheduler.scheduleTask({\n id: `renovate_scheduled_runs`,\n ...schedule,\n\n fn: async () => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const { items: entities } = await client.getEntities(\n {\n filter: {\n [`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]:\n CATALOG_FILTER_EXISTS,\n [`metadata.annotations.${ANNOTATION_SOURCE_LOCATION}`]:\n CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'kind',\n 'metadata.annotations',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n },\n { token },\n );\n\n await renovateRunner.addToQueue(...entities);\n },\n });\n}\n","import { RouterOptions } from './types';\nimport { getPluginConfig, getScheduleDefinition } from '../config';\n\nexport async function scheduleCleanupTask(routerOptions: RouterOptions) {\n const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'cleanup');\n const reportsToKeep =\n pluginConfig.getOptionalNumber('cleanup.minimumReports') ?? -1;\n\n const dependencyHistoryKeep =\n pluginConfig.getOptionalNumber('cleanup.dependencyHistory') ?? -1;\n\n return scheduler.scheduleTask({\n id: `renovate_report_cleanup`,\n ...schedule,\n fn: async () => {\n if (reportsToKeep >= 0) {\n logger.debug('Running report cleanup');\n const modified = await databaseHandler.deleteReports({\n keepLatest: reportsToKeep,\n });\n logger.debug(`Report cleanup completed. ${modified} reports deleted`);\n }\n if (dependencyHistoryKeep >= 0) {\n logger.debug('Running dependency history cleanup');\n const modified = await databaseHandler.deleteDependencies({\n keepLatest: dependencyHistoryKeep,\n });\n logger.debug(\n `Dependency history cleanup completed. ${modified} dependencies deleted`,\n );\n }\n },\n });\n}\n","import {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { RenovateWrapper } from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from './wrapper';\nimport { RouterOptions } from './service/types';\nimport { DatabaseHandler } from './service/databaseHandler';\nimport {\n QueueFactory,\n renovateQueueExtensionPoint,\n renovateRuntimeExtensionPoint,\n RunOptions,\n} from '@secustor/backstage-plugin-renovate-node';\nimport { scheduleJobSync } from './service/jobSync';\nimport { scheduleCleanupTask } from './service/cleanupTask';\n\n/**\n * Renovate backend plugin\n *\n * @public\n */\nexport const renovatePlugin = createBackendPlugin({\n pluginId: 'renovate',\n register(env) {\n // allow modules provide additional runtimes\n const runtimes = new Map<string, RenovateWrapper>();\n env.registerExtensionPoint(renovateRuntimeExtensionPoint, {\n addRuntime(id: string, runtime: RenovateWrapper) {\n if (runtimes.has(id)) {\n throw new Error(\n ` ${id} has been already registered. Only one wrapper with the same ID is allowed to be registered`,\n );\n }\n runtimes.set(id, runtime);\n },\n });\n\n const queueFactories = new Map<string, QueueFactory<RunOptions>>();\n env.registerExtensionPoint(renovateQueueExtensionPoint, {\n addQueueFactory(id: string, factory: QueueFactory<RunOptions>) {\n if (queueFactories.has(id)) {\n throw new Error(\n ` ${id} has been already registered. Only one queue with the same ID is allowed to be registered`,\n );\n }\n queueFactories.set(id, factory);\n },\n });\n\n env.registerInit({\n deps: {\n rootConfig: coreServices.rootConfig,\n logger: coreServices.logger,\n httpRouter: coreServices.httpRouter,\n database: coreServices.database,\n scheduler: coreServices.scheduler,\n discovery: coreServices.discovery,\n auth: coreServices.auth,\n },\n async init(options) {\n const { database, httpRouter, logger } = options;\n\n const routerOptions: RouterOptions = {\n ...options,\n databaseHandler: await DatabaseHandler.create({ database, logger }),\n runtimes,\n queueFactories,\n };\n const renovateRunner = await RenovateRunner.from(routerOptions);\n\n await scheduleJobSync(renovateRunner, routerOptions);\n await scheduleCleanupTask(routerOptions);\n\n httpRouter.use(await createRouter(renovateRunner, routerOptions));\n httpRouter.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createValidatedOpenApiRouter","z","targetRepo","DefaultGithubCredentialsProvider","ScmIntegrations","integration","is","DefaultGitlabCredentialsProvider","MiddlewareFactory","CatalogClient","express","isEntityRef","result","getTargetRepo","getTaskID","readSchedulerServiceTaskScheduleDefinitionFromConfig","nanoid","isError","resolvePackagePath","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION","createBackendPlugin","renovateRuntimeExtensionPoint","renovateQueueExtensionPoint","coreServices"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -16,6 +16,10 @@ declare class DatabaseHandler {
16
16
  getTargets(): Promise<ReportTargetQuery[]>;
17
17
  deleteReportsByTarget({ host, repository }: ReportTargetQuery, options?: DeleteOptions): Promise<number>;
18
18
  deleteReports(options?: DeleteOptions): Promise<number>;
19
+ private updateDependencies;
20
+ getDependencies(filters: DependenciesFilter): Promise<DependencyRow[]>;
21
+ deleteDependencies(options: DeleteOptions): Promise<number>;
22
+ deleteDependenciesByTarget({ host, repository }: ReportTargetQuery, options?: DeleteOptions): Promise<number>;
19
23
  }
20
24
 
21
25
  interface RouterOptions {
@@ -28,6 +32,26 @@ interface RouterOptions {
28
32
  scheduler: SchedulerService;
29
33
  discovery: DiscoveryService;
30
34
  }
35
+ interface DependencyRow {
36
+ id?: string;
37
+ run_id: string;
38
+ host: string;
39
+ repository: string;
40
+ extractionTimestamp: Date;
41
+ manager: string;
42
+ datasource: string;
43
+ packageFile: string;
44
+ depName: string;
45
+ packageName?: string;
46
+ depType?: string;
47
+ currentValue?: string;
48
+ currentVersion?: string;
49
+ currentVersionTimestamp?: Date;
50
+ skipReason?: string;
51
+ registryUrl?: string;
52
+ sourceUrl?: string;
53
+ currentVersionReleased?: Date;
54
+ }
31
55
  interface ReportTargetQuery {
32
56
  host?: string;
33
57
  repository?: string;
@@ -55,6 +79,17 @@ interface AddReportParameters {
55
79
  target: TargetRepo;
56
80
  logger?: LoggerService;
57
81
  }
82
+ interface DependenciesFilter {
83
+ datasource?: string[];
84
+ depName?: string[];
85
+ depType?: string[];
86
+ host?: string[];
87
+ latestOnly?: boolean;
88
+ limit?: number;
89
+ manager?: string[];
90
+ packageFile?: string[];
91
+ repository?: string[];
92
+ }
58
93
 
59
94
  declare class RenovateRunner implements Runnable<RunOptions> {
60
95
  private readonly databaseHandler;
@@ -0,0 +1,62 @@
1
+ // @ts-check
2
+
3
+ /**
4
+ * @param {import('knex').Knex} knex
5
+ */
6
+ exports.up = async function up(knex) {
7
+ await knex.schema.createTable('dependencies', table => {
8
+ table.comment('Table containing found dependencies');
9
+ table
10
+ .uuid('id', { primaryKey: true })
11
+ .comment('unique id of the dependency entry')
12
+ .defaultTo(knex.fn.uuid());
13
+ table
14
+ .string('run_id')
15
+ .notNullable()
16
+ .comment('unique id to find source of the dependency');
17
+ table.dateTime('extractionTimestamp').comment('Timestamp of the creation');
18
+ table
19
+ .text('host')
20
+ .notNullable()
21
+ .comment('host of the git service e.g. github.com');
22
+ table
23
+ .text('repository')
24
+ .notNullable()
25
+ .comment(
26
+ 'organization or full group with repository e.g. "myOrg/myRepository" for github',
27
+ );
28
+
29
+ table
30
+ .text('manager')
31
+ .notNullable()
32
+ .comment('Renovate manager which extracted the package');
33
+ table.text('datasource').notNullable().comment('Datasource of the package');
34
+ table.text('depName').notNullable().comment('Name of the package');
35
+ table.text('packageName').comment('Name of the package');
36
+ table
37
+ .text('packageFile')
38
+ .notNullable()
39
+ .comment('File where the package is defined');
40
+ table.text('depType').comment('Type of the dependency');
41
+ table.text('currentValue').comment('Current value of the dependency');
42
+ table.text('currentVersion').comment('Current version of the dependency');
43
+ table
44
+ .dateTime('currentVersionTimestamp')
45
+ .comment('Timestamp of the current version');
46
+ table.text('skipReason').comment('Reason why the dependency was skipped');
47
+ table.text('registryUrl').comment('Registry URL of the package');
48
+ table.text('sourceUrl').comment('Source URL of the package');
49
+
50
+ table.index(['host', 'repository'], 'repositoryIndex');
51
+ table.index(['host', 'repository', 'packageFile'], 'packageFileIndex');
52
+ table.index(['datasource', 'depName'], 'packageIndex');
53
+ table.index(['manager', 'depName'], 'packageIndex');
54
+ });
55
+ };
56
+
57
+ /**
58
+ * @param {import('knex').Knex} knex
59
+ */
60
+ exports.down = async function down(knex) {
61
+ await knex.schema.dropTable('dependencies');
62
+ };
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@secustor/backstage-plugin-renovate-backend",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "commonjs",
7
7
  "license": "LGPL-3.0-or-later",
8
+ "configSchema": "config.d.ts",
8
9
  "publishConfig": {
9
10
  "access": "public",
10
11
  "main": "dist/index.cjs.js",
@@ -47,18 +48,18 @@
47
48
  "postpack": "backstage-cli package postpack"
48
49
  },
49
50
  "dependencies": {
50
- "@backstage/backend-defaults": "^0.4.1",
51
- "@backstage/backend-openapi-utils": "^0.1.15",
52
- "@backstage/backend-plugin-api": "^0.7.0",
53
- "@backstage/backend-tasks": "^0.5.27",
54
- "@backstage/catalog-client": "^1.6.5",
55
- "@backstage/catalog-model": "^1.5.0",
51
+ "@backstage/backend-defaults": "^0.4.4",
52
+ "@backstage/backend-openapi-utils": "^0.1.17",
53
+ "@backstage/backend-plugin-api": "^0.8.1",
54
+ "@backstage/backend-tasks": "^0.6.1",
55
+ "@backstage/catalog-client": "^1.6.6",
56
+ "@backstage/catalog-model": "^1.6.0",
56
57
  "@backstage/config": "^1.2.0",
57
58
  "@backstage/errors": "^1.2.4",
58
- "@backstage/integration": "^1.13.0",
59
+ "@backstage/integration": "^1.14.0",
59
60
  "@backstage/types": "^1.1.1",
60
- "@secustor/backstage-plugin-renovate-common": "^0.5.4",
61
- "@secustor/backstage-plugin-renovate-node": "^0.3.4",
61
+ "@secustor/backstage-plugin-renovate-common": "^0.6.0",
62
+ "@secustor/backstage-plugin-renovate-node": "^0.3.6",
62
63
  "@sindresorhus/is": "^4.6.0",
63
64
  "@types/express": "*",
64
65
  "express": "^4.17.1",
@@ -72,10 +73,10 @@
72
73
  "zod": "^3.22.4"
73
74
  },
74
75
  "devDependencies": {
75
- "@backstage/backend-test-utils": "^0.4.4",
76
- "@backstage/cli": "^0.26.11",
77
- "@backstage/repo-tools": "^0.9.4",
78
- "@backstage/test-utils": "^1.5.8",
76
+ "@backstage/backend-test-utils": "^0.5.1",
77
+ "@backstage/cli": "^0.27.0",
78
+ "@backstage/repo-tools": "^0.9.6",
79
+ "@backstage/test-utils": "^1.5.10",
79
80
  "@types/supertest": "^6.0.0",
80
81
  "msw": "^2.0.0",
81
82
  "supertest": "^7.0.0"