@secustor/backstage-plugin-renovate-backend 0.10.1 → 0.11.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 +28 -0
- package/dist/index.cjs.js +213 -20
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +25 -10
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @secustor/backstage-plugin-renovate-backend
|
|
2
2
|
|
|
3
|
+
## 0.11.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#356](https://github.com/secustor/backstage-plugins/pull/356) [`b00ea62`](https://github.com/secustor/backstage-plugins/commit/b00ea623e29804f2cb1860fa9fa6aabb9c81bf49) Thanks [@secustor](https://github.com/secustor)! - Breaking Change to the new Dependencies API!
|
|
8
|
+
The dependencies' endpoint does no longer return an array but rather an object with the field `dependencies`.
|
|
9
|
+
This is to allow adding other data such as available filter options
|
|
10
|
+
|
|
11
|
+
- [#356](https://github.com/secustor/backstage-plugins/pull/356) [`b00ea62`](https://github.com/secustor/backstage-plugins/commit/b00ea623e29804f2cb1860fa9fa6aabb9c81bf49) Thanks [@secustor](https://github.com/secustor)! - Add DependencyTableV2 using MUI Datagrid
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [#356](https://github.com/secustor/backstage-plugins/pull/356) [`b00ea62`](https://github.com/secustor/backstage-plugins/commit/b00ea623e29804f2cb1860fa9fa6aabb9c81bf49) Thanks [@secustor](https://github.com/secustor)! - Add backend pagination options for the dependencies endpoint
|
|
16
|
+
|
|
17
|
+
- [#356](https://github.com/secustor/backstage-plugins/pull/356) [`b00ea62`](https://github.com/secustor/backstage-plugins/commit/b00ea623e29804f2cb1860fa9fa6aabb9c81bf49) Thanks [@secustor](https://github.com/secustor)! - Allow to filter for depTypes in dependencies API
|
|
18
|
+
|
|
19
|
+
- [#356](https://github.com/secustor/backstage-plugins/pull/356) [`b00ea62`](https://github.com/secustor/backstage-plugins/commit/b00ea623e29804f2cb1860fa9fa6aabb9c81bf49) Thanks [@secustor](https://github.com/secustor)! - Added a X-Total-Count header to dependency endpoint for knowing what the maximum requests would be
|
|
20
|
+
|
|
21
|
+
## 0.10.2
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- [#347](https://github.com/secustor/backstage-plugins/pull/347) [`bc22208`](https://github.com/secustor/backstage-plugins/commit/bc2220832518951e71969b1d2a81ba9e7e63552f) Thanks [@secustor](https://github.com/secustor)! - Make skip entries which contain no packageName and not a depName
|
|
26
|
+
|
|
27
|
+
- Updated dependencies [[`bc22208`](https://github.com/secustor/backstage-plugins/commit/bc2220832518951e71969b1d2a81ba9e7e63552f)]:
|
|
28
|
+
- @secustor/backstage-plugin-renovate-common@0.6.1
|
|
29
|
+
- @secustor/backstage-plugin-renovate-node@0.3.7
|
|
30
|
+
|
|
3
31
|
## 0.10.1
|
|
4
32
|
|
|
5
33
|
### Patch Changes
|
package/dist/index.cjs.js
CHANGED
|
@@ -26,7 +26,7 @@ const spec = {
|
|
|
26
26
|
info: {
|
|
27
27
|
title: "renovate",
|
|
28
28
|
description: "Backstage Renovate API",
|
|
29
|
-
version: "0.
|
|
29
|
+
version: "0.2.0"
|
|
30
30
|
},
|
|
31
31
|
servers: [
|
|
32
32
|
{
|
|
@@ -163,6 +163,31 @@ const spec = {
|
|
|
163
163
|
get: {
|
|
164
164
|
summary: "Get dependencies for host",
|
|
165
165
|
parameters: [
|
|
166
|
+
{
|
|
167
|
+
name: "pageSize",
|
|
168
|
+
in: "query",
|
|
169
|
+
description: "size of the page",
|
|
170
|
+
schema: {
|
|
171
|
+
type: "number",
|
|
172
|
+
default: 100
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: "page",
|
|
177
|
+
in: "query",
|
|
178
|
+
description: "page number. starting with 0",
|
|
179
|
+
schema: {
|
|
180
|
+
type: "number"
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
name: "availableValues",
|
|
185
|
+
in: "query",
|
|
186
|
+
description: "if set to true, the response will include all available values for the filters",
|
|
187
|
+
schema: {
|
|
188
|
+
type: "boolean"
|
|
189
|
+
}
|
|
190
|
+
},
|
|
166
191
|
{
|
|
167
192
|
name: "datasource",
|
|
168
193
|
in: "query",
|
|
@@ -218,15 +243,6 @@ const spec = {
|
|
|
218
243
|
type: "boolean"
|
|
219
244
|
}
|
|
220
245
|
},
|
|
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
246
|
{
|
|
231
247
|
name: "manager",
|
|
232
248
|
in: "query",
|
|
@@ -344,12 +360,92 @@ const spec = {
|
|
|
344
360
|
responses: {
|
|
345
361
|
dependencies: {
|
|
346
362
|
description: "Returns dependencies",
|
|
363
|
+
headers: {
|
|
364
|
+
"X-Total-Count": {
|
|
365
|
+
schema: {
|
|
366
|
+
type: "integer",
|
|
367
|
+
description: "Total number of entries"
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
"X-Page-Count": {
|
|
371
|
+
schema: {
|
|
372
|
+
type: "integer",
|
|
373
|
+
description: "Total number of pages"
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
"X-Page": {
|
|
377
|
+
schema: {
|
|
378
|
+
type: "integer",
|
|
379
|
+
description: "Current page"
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
"X-Page-Size": {
|
|
383
|
+
schema: {
|
|
384
|
+
type: "integer",
|
|
385
|
+
description: "Number of entries per page"
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
},
|
|
347
389
|
content: {
|
|
348
390
|
"application/json": {
|
|
349
391
|
schema: {
|
|
350
|
-
type: "
|
|
351
|
-
|
|
352
|
-
|
|
392
|
+
type: "object",
|
|
393
|
+
required: ["dependencies"],
|
|
394
|
+
properties: {
|
|
395
|
+
dependencies: {
|
|
396
|
+
type: "array",
|
|
397
|
+
items: {
|
|
398
|
+
$ref: "#/components/schemas/dependency"
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
availableValues: {
|
|
402
|
+
type: "object",
|
|
403
|
+
description: "Will only be part of the response if `availableValues` is true. Returns all available values for the applied filters\n",
|
|
404
|
+
properties: {
|
|
405
|
+
datasource: {
|
|
406
|
+
type: "array",
|
|
407
|
+
items: {
|
|
408
|
+
type: "string"
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
depName: {
|
|
412
|
+
type: "array",
|
|
413
|
+
items: {
|
|
414
|
+
type: "string"
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
depType: {
|
|
418
|
+
type: "array",
|
|
419
|
+
items: {
|
|
420
|
+
type: "string"
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
host: {
|
|
424
|
+
type: "array",
|
|
425
|
+
items: {
|
|
426
|
+
type: "string"
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
manager: {
|
|
430
|
+
type: "array",
|
|
431
|
+
items: {
|
|
432
|
+
type: "string"
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
packageFile: {
|
|
436
|
+
type: "array",
|
|
437
|
+
items: {
|
|
438
|
+
type: "string"
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
repository: {
|
|
442
|
+
type: "array",
|
|
443
|
+
items: {
|
|
444
|
+
type: "string"
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
353
449
|
}
|
|
354
450
|
}
|
|
355
451
|
}
|
|
@@ -687,14 +783,29 @@ async function createRouter(runner, options) {
|
|
|
687
783
|
});
|
|
688
784
|
router.get("/dependencies", async (request, response) => {
|
|
689
785
|
const filter = request.query;
|
|
690
|
-
const
|
|
691
|
-
const massaged =
|
|
786
|
+
const { result, total, pageCount, page, pageSize } = await databaseHandler.getDependencies(filter, filter);
|
|
787
|
+
const massaged = result.map((dep) => {
|
|
692
788
|
return {
|
|
693
789
|
...dep,
|
|
694
|
-
|
|
790
|
+
id: dep.id,
|
|
791
|
+
runID: dep.run_id,
|
|
792
|
+
extractionTimestamp: dep.extractionTimestamp?.toISOString(),
|
|
793
|
+
currentVersionTimestamp: dep.currentVersionTimestamp?.toISOString(),
|
|
794
|
+
packageFileUrl: getFileUrl(dep) ?? void 0
|
|
695
795
|
};
|
|
696
796
|
});
|
|
697
|
-
|
|
797
|
+
let availableValues;
|
|
798
|
+
if (request.query.availableValues) {
|
|
799
|
+
availableValues = await databaseHandler.getDependenciesValues(filter);
|
|
800
|
+
}
|
|
801
|
+
response.setHeader("X-Total-Count", total);
|
|
802
|
+
response.setHeader("X-Page-Count", pageCount);
|
|
803
|
+
response.setHeader("X-Page", page);
|
|
804
|
+
response.setHeader("X-Page-Size", pageSize);
|
|
805
|
+
response.json({
|
|
806
|
+
dependencies: massaged,
|
|
807
|
+
availableValues
|
|
808
|
+
});
|
|
698
809
|
});
|
|
699
810
|
router.post("/runs", async (request, response) => {
|
|
700
811
|
const body = runRequestBody.safeParse(request.body);
|
|
@@ -917,6 +1028,16 @@ class RenovateRunner {
|
|
|
917
1028
|
}
|
|
918
1029
|
}
|
|
919
1030
|
|
|
1031
|
+
const DependencyValueFiltersKeys = [
|
|
1032
|
+
"datasource",
|
|
1033
|
+
"depName",
|
|
1034
|
+
"depType",
|
|
1035
|
+
"host",
|
|
1036
|
+
"manager",
|
|
1037
|
+
"packageFile",
|
|
1038
|
+
"repository"
|
|
1039
|
+
];
|
|
1040
|
+
|
|
920
1041
|
const migrationsDir = backendPluginApi.resolvePackagePath(
|
|
921
1042
|
"@secustor/backstage-plugin-renovate-backend",
|
|
922
1043
|
"migrations"
|
|
@@ -1011,6 +1132,10 @@ class DatabaseHandler {
|
|
|
1011
1132
|
sourceUrl,
|
|
1012
1133
|
currentVersionTimestamp
|
|
1013
1134
|
} = dependency;
|
|
1135
|
+
const massagedDepName = depName ?? packageName;
|
|
1136
|
+
if (!massagedDepName) {
|
|
1137
|
+
continue;
|
|
1138
|
+
}
|
|
1014
1139
|
dependencies.push({
|
|
1015
1140
|
run_id: runID,
|
|
1016
1141
|
host: target.host,
|
|
@@ -1018,7 +1143,7 @@ class DatabaseHandler {
|
|
|
1018
1143
|
repository,
|
|
1019
1144
|
manager,
|
|
1020
1145
|
datasource: datasource ?? packageFile.datasource ?? "no-datasource",
|
|
1021
|
-
depName,
|
|
1146
|
+
depName: massagedDepName,
|
|
1022
1147
|
packageName,
|
|
1023
1148
|
packageFile: packageFilePath,
|
|
1024
1149
|
depType,
|
|
@@ -1035,8 +1160,31 @@ class DatabaseHandler {
|
|
|
1035
1160
|
}
|
|
1036
1161
|
await this.client("dependencies").insert(dependencies);
|
|
1037
1162
|
}
|
|
1038
|
-
async getDependencies(filters) {
|
|
1163
|
+
async getDependencies(filters, pagination) {
|
|
1164
|
+
const page = pagination?.page ?? 0;
|
|
1165
|
+
const pageSize = pagination?.pageSize ?? 500;
|
|
1039
1166
|
const builder = this.client("dependencies").select();
|
|
1167
|
+
this.applyDependencyFilters(builder, filters);
|
|
1168
|
+
const total = await this.getDependenciesCount(filters);
|
|
1169
|
+
const offset = page * pageSize;
|
|
1170
|
+
return {
|
|
1171
|
+
result: await builder.offset(offset).limit(pageSize),
|
|
1172
|
+
total,
|
|
1173
|
+
page,
|
|
1174
|
+
pageSize,
|
|
1175
|
+
pageCount: Math.ceil(total / pageSize)
|
|
1176
|
+
};
|
|
1177
|
+
}
|
|
1178
|
+
async getDependenciesCount(filters) {
|
|
1179
|
+
const builder = this.client("dependencies").count({ count: "*" });
|
|
1180
|
+
this.applyDependencyFilters(builder, filters);
|
|
1181
|
+
const count = await builder.first().then((result) => result?.count);
|
|
1182
|
+
if (is__default.default.string(count)) {
|
|
1183
|
+
return Number.parseInt(count, 10);
|
|
1184
|
+
}
|
|
1185
|
+
return count ?? 0;
|
|
1186
|
+
}
|
|
1187
|
+
applyDependencyFilters(builder, filters) {
|
|
1040
1188
|
if (filters.host) {
|
|
1041
1189
|
builder.whereIn("host", filters.host);
|
|
1042
1190
|
}
|
|
@@ -1052,6 +1200,9 @@ class DatabaseHandler {
|
|
|
1052
1200
|
if (filters.depName) {
|
|
1053
1201
|
builder.whereIn("depName", filters.depName);
|
|
1054
1202
|
}
|
|
1203
|
+
if (filters.depType) {
|
|
1204
|
+
builder.whereIn("depType", filters.depType);
|
|
1205
|
+
}
|
|
1055
1206
|
if (filters.latestOnly) {
|
|
1056
1207
|
const runIDs = this.client("dependencies").select("d.run_id").from("dependencies as d").join(
|
|
1057
1208
|
this.client("dependencies").select("host", "repository").max("extractionTimestamp as max_timestamp").groupBy("host", "repository").as("max_d"),
|
|
@@ -1062,7 +1213,49 @@ class DatabaseHandler {
|
|
|
1062
1213
|
).distinct();
|
|
1063
1214
|
builder.whereIn("run_id", runIDs);
|
|
1064
1215
|
}
|
|
1065
|
-
|
|
1216
|
+
}
|
|
1217
|
+
/**
|
|
1218
|
+
* Gets the available values for the dependencies stored in the database.
|
|
1219
|
+
* If filters are supplied, OTHER values are filtered accordingly, if a filter is supplied, all values are returned
|
|
1220
|
+
* @param filters
|
|
1221
|
+
*/
|
|
1222
|
+
async getDependenciesValues(filters) {
|
|
1223
|
+
const baseBuilder = this.client(
|
|
1224
|
+
"dependencies"
|
|
1225
|
+
);
|
|
1226
|
+
const limitedValuesBuilder = baseBuilder.clone();
|
|
1227
|
+
const allValuesKeys = [];
|
|
1228
|
+
const limitedValuesKeys = [];
|
|
1229
|
+
for (const filterKey of DependencyValueFiltersKeys) {
|
|
1230
|
+
const suppliedFilter = filters?.[filterKey];
|
|
1231
|
+
if (suppliedFilter) {
|
|
1232
|
+
limitedValuesBuilder.whereIn(filterKey, suppliedFilter);
|
|
1233
|
+
limitedValuesKeys.push(filterKey);
|
|
1234
|
+
continue;
|
|
1235
|
+
}
|
|
1236
|
+
allValuesKeys.push(filterKey);
|
|
1237
|
+
}
|
|
1238
|
+
const result = {
|
|
1239
|
+
datasource: [],
|
|
1240
|
+
manager: [],
|
|
1241
|
+
depType: [],
|
|
1242
|
+
depName: [],
|
|
1243
|
+
host: [],
|
|
1244
|
+
packageFile: [],
|
|
1245
|
+
repository: []
|
|
1246
|
+
};
|
|
1247
|
+
const allValues = allValuesKeys.map(
|
|
1248
|
+
async (filterKey) => {
|
|
1249
|
+
const values = await limitedValuesBuilder.clone().select(filterKey).distinct().pluck(filterKey);
|
|
1250
|
+
result[filterKey] = values.filter(is__default.default.string);
|
|
1251
|
+
}
|
|
1252
|
+
);
|
|
1253
|
+
const limitedValues = limitedValuesKeys.map(async (filterKey) => {
|
|
1254
|
+
const values = await baseBuilder.clone().select(filterKey).distinct().pluck(filterKey);
|
|
1255
|
+
result[filterKey] = values.filter(is__default.default.string);
|
|
1256
|
+
});
|
|
1257
|
+
await Promise.all([...allValues, ...limitedValues]);
|
|
1258
|
+
return result;
|
|
1066
1259
|
}
|
|
1067
1260
|
async deleteDependencies(options) {
|
|
1068
1261
|
const targets = await this.getTargets();
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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/types.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.2.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: 'pageSize',\n in: 'query',\n description: 'size of the page',\n schema: {\n type: 'number',\n default: 100,\n },\n },\n {\n name: 'page',\n in: 'query',\n description: 'page number. starting with 0',\n schema: {\n type: 'number',\n },\n },\n {\n name: 'availableValues',\n in: 'query',\n description:\n 'if set to true, the response will include all available values for the filters',\n schema: {\n type: 'boolean',\n },\n },\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: '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 headers: {\n 'X-Total-Count': {\n schema: {\n type: 'integer',\n description: 'Total number of entries',\n },\n },\n 'X-Page-Count': {\n schema: {\n type: 'integer',\n description: 'Total number of pages',\n },\n },\n 'X-Page': {\n schema: {\n type: 'integer',\n description: 'Current page',\n },\n },\n 'X-Page-Size': {\n schema: {\n type: 'integer',\n description: 'Number of entries per page',\n },\n },\n },\n content: {\n 'application/json': {\n schema: {\n type: 'object',\n required: ['dependencies'],\n properties: {\n dependencies: {\n type: 'array',\n items: {\n $ref: '#/components/schemas/dependency',\n },\n },\n availableValues: {\n type: 'object',\n description:\n 'Will only be part of the response if `availableValues` is true. Returns all available values for the applied filters\\n',\n properties: {\n datasource: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n depName: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n depType: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n host: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n manager: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n packageFile: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n repository: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n },\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 { 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 = request.query;\n const { result, total, pageCount, page, pageSize } =\n await databaseHandler.getDependencies(filter, filter);\n\n const massaged = result.map(dep => {\n return {\n ...dep,\n id: dep.id!,\n runID: dep.run_id,\n extractionTimestamp: dep.extractionTimestamp?.toISOString(),\n currentVersionTimestamp: dep.currentVersionTimestamp?.toISOString(),\n packageFileUrl: getFileUrl(dep) ?? undefined,\n };\n });\n\n let availableValues: Record<string, string[]> | undefined;\n if (request.query.availableValues) {\n availableValues = await databaseHandler.getDependenciesValues(filter);\n }\n\n response.setHeader('X-Total-Count', total);\n response.setHeader('X-Page-Count', pageCount);\n response.setHeader('X-Page', page);\n response.setHeader('X-Page-Size', pageSize);\n // openapi gen expects an empty array\n response.json({\n dependencies: massaged,\n availableValues,\n });\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 { Config } from '@backstage/config';\nimport {\n AuthService,\n DatabaseService,\n DiscoveryService,\n LoggerService,\n SchedulerService,\n} from '@backstage/backend-plugin-api';\nimport {\n RenovateReport,\n RenovateWrapper,\n RepositoryReport,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { DatabaseHandler } from './databaseHandler';\nimport {\n QueueFactory,\n RunOptions,\n} from '@secustor/backstage-plugin-renovate-node';\n\nexport interface RouterOptions {\n auth: AuthService;\n rootConfig: Config;\n logger: LoggerService;\n databaseHandler: DatabaseHandler;\n runtimes: Map<string, RenovateWrapper>;\n queueFactories: Map<string, QueueFactory<RunOptions>>;\n scheduler: SchedulerService;\n discovery: DiscoveryService;\n}\n\nexport interface ReportsRow {\n run_id: string;\n task_id: string;\n timestamp: Date;\n host: string;\n repository: string;\n report: RepositoryReport;\n}\n\nexport interface DependencyRow {\n id?: string;\n run_id: string;\n host: string;\n repository: string;\n extractionTimestamp: Date;\n manager: string;\n datasource: string;\n packageFile: string;\n depName: string;\n packageName?: string;\n depType?: string;\n currentValue?: string;\n currentVersion?: string;\n currentVersionTimestamp?: Date;\n skipReason?: string;\n registryUrl?: string;\n sourceUrl?: string;\n currentVersionReleased?: Date;\n}\n\nexport interface ReportTargetQuery {\n host?: string;\n repository?: string;\n}\n\nexport interface DeleteOptions {\n /**\n * If falsely (0, false or undefined) delete all reports\n * If keepLatest is a number keep this number of records.\n * In case it is boolean true, the behaviour is identical to 1\n */\n keepLatest?: boolean | number;\n}\n\nexport interface DatabaseCreationParameters {\n database: DatabaseService;\n logger: LoggerService;\n}\n\nexport interface ReportQueryParameters {\n host?: string;\n repository?: string;\n}\n\nexport interface AddReportParameters {\n runID: string;\n taskID: string;\n report: RenovateReport;\n target: TargetRepo;\n logger?: LoggerService;\n}\n\nexport interface DependenciesFilter extends DependencyValueFilters {\n latestOnly?: boolean;\n}\n\nexport const DependencyValueFiltersKeys = [\n 'datasource',\n 'depName',\n 'depType',\n 'host',\n 'manager',\n 'packageFile',\n 'repository',\n] as const;\nexport type DependencyValueFiltersKey =\n (typeof DependencyValueFiltersKeys)[number];\n\nexport type DependencyValueFilters = Record<\n DependencyValueFiltersKey,\n string[]\n>;\n\nexport type DependencyValues = Record<DependencyValueFiltersKey, string[]>;\n\nexport interface PaginationOptions {\n page: number;\n pageSize: number;\n}\n\nexport interface Pagination<T> {\n result: T;\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\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 DependencyValueFilters,\n DependencyValueFiltersKey,\n DependencyValueFiltersKeys,\n DependencyValues,\n Pagination,\n PaginationOptions,\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\n // TODO remove this once Renovate enforces packageName\n const massagedDepName = depName ?? packageName;\n if (!massagedDepName) {\n continue;\n }\n\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: massagedDepName,\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(\n filters: DependenciesFilter,\n pagination?: PaginationOptions,\n ): Promise<Pagination<DependencyRow[]>> {\n const page = pagination?.page ?? 0;\n const pageSize = pagination?.pageSize ?? 500;\n const builder = this.client('dependencies').select<DependencyRow[]>();\n\n this.applyDependencyFilters(builder, filters);\n\n const total = await this.getDependenciesCount(filters);\n\n const offset = page * pageSize;\n return {\n result: await builder.offset(offset).limit(pageSize),\n total,\n page,\n pageSize,\n pageCount: Math.ceil(total / pageSize),\n };\n }\n\n async getDependenciesCount(filters: DependenciesFilter): Promise<number> {\n const builder = this.client('dependencies').count({ count: '*' });\n\n this.applyDependencyFilters(builder, filters);\n\n const count = await builder.first().then(result => result?.count);\n if (is.string(count)) {\n return Number.parseInt(count, 10);\n }\n return count ?? 0;\n }\n\n private applyDependencyFilters(\n builder: Knex.QueryBuilder,\n filters: DependenciesFilter,\n ): void {\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 if (filters.depType) {\n builder.whereIn('depType', filters.depType);\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\n /**\n * Gets the available values for the dependencies stored in the database.\n * If filters are supplied, OTHER values are filtered accordingly, if a filter is supplied, all values are returned\n * @param filters\n */\n async getDependenciesValues(\n filters?: DependencyValueFilters,\n ): Promise<DependencyValues> {\n const baseBuilder = this.client<DependencyRow, DependencyValueFilters>(\n 'dependencies',\n );\n const limitedValuesBuilder = baseBuilder.clone();\n\n const allValuesKeys: DependencyValueFiltersKey[] = [];\n const limitedValuesKeys: DependencyValueFiltersKey[] = [];\n for (const filterKey of DependencyValueFiltersKeys) {\n const suppliedFilter = filters?.[filterKey];\n // if no filter is supplied, return all values\n if (suppliedFilter) {\n limitedValuesBuilder.whereIn(filterKey, suppliedFilter);\n limitedValuesKeys.push(filterKey);\n continue;\n }\n\n allValuesKeys.push(filterKey);\n }\n\n const result: DependencyValues = {\n datasource: [],\n manager: [],\n depType: [],\n depName: [],\n host: [],\n packageFile: [],\n repository: [],\n };\n\n const allValues = allValuesKeys.map(\n async (filterKey: DependencyValueFiltersKey) => {\n // get all unique values for the column and do not return as object but list\n const values = await limitedValuesBuilder\n .clone()\n .select(filterKey)\n .distinct()\n .pluck(filterKey);\n result[filterKey] = values.filter(is.string);\n },\n );\n const limitedValues = limitedValuesKeys.map(async filterKey => {\n const values = await baseBuilder\n .clone()\n .select(filterKey)\n .distinct()\n .pluck(filterKey);\n\n result[filterKey] = values.filter(is.string);\n });\n await Promise.all([...allValues, ...limitedValues]);\n return result;\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":";;;;;;;;;;;;;;;;;;;;;;;AAOO,MAAM,IAAO,GAAA;AAAA,EAClB,OAAS,EAAA,OAAA;AAAA,EACT,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,UAAA;AAAA,IACP,WAAa,EAAA,wBAAA;AAAA,IACb,OAAS,EAAA,OAAA;AAAA,GACX;AAAA,EACA,OAAS,EAAA;AAAA,IACP;AAAA,MACE,WAAa,EAAA,kBAAA;AAAA,MACb,GAAK,EAAA,uBAAA;AAAA,KACP;AAAA,GACF;AAAA,EACA,KAAO,EAAA;AAAA,IACL,SAAW,EAAA;AAAA,MACT,GAAK,EAAA;AAAA,QACH,OAAS,EAAA,iCAAA;AAAA,QACT,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,WAAa,EAAA,wBAAA;AAAA,YACb,OAAS,EAAA;AAAA,cACP,kBAAoB,EAAA;AAAA,gBAClB,MAAQ,EAAA;AAAA,kBACN,IAAM,EAAA,QAAA;AAAA,kBACN,OAAS,EAAA,IAAA;AAAA,iBACX;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,UAAY,EAAA;AAAA,MACV,GAAK,EAAA;AAAA,QACH,OAAS,EAAA,iBAAA;AAAA,QACT,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,gCAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,OAAS,EAAA,oCAAA;AAAA,QACT,UAAY,EAAA;AAAA,UACV;AAAA,YACE,IAAM,EAAA,oCAAA;AAAA,WACR;AAAA,SACF;AAAA,QACA,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,2CAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,iBAAmB,EAAA;AAAA,MACjB,GAAK,EAAA;AAAA,QACH,OAAS,EAAA,sBAAA;AAAA,QACT,UAAY,EAAA;AAAA,UACV;AAAA,YACE,IAAM,EAAA,MAAA;AAAA,YACN,EAAI,EAAA,MAAA;AAAA,YACJ,QAAU,EAAA,IAAA;AAAA,YACV,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,QAAA;AAAA,cACN,OAAS,EAAA,YAAA;AAAA,aACX;AAAA,WACF;AAAA,SACF;AAAA,QACA,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,gCAAA;AAAA,WACR;AAAA,UACA,KAAO,EAAA;AAAA,YACL,WAAa,EAAA,cAAA;AAAA,WACf;AAAA,SACF;AAAA,OACF;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,OAAS,EAAA,oCAAA;AAAA,QACT,UAAY,EAAA;AAAA,UACV;AAAA,YACE,IAAM,EAAA,oCAAA;AAAA,WACR;AAAA,SACF;AAAA,QACA,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,2CAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,8BAAgC,EAAA;AAAA,MAC9B,GAAK,EAAA;AAAA,QACH,OAAS,EAAA,4BAAA;AAAA,QACT,UAAY,EAAA;AAAA,UACV;AAAA,YACE,IAAM,EAAA,MAAA;AAAA,YACN,EAAI,EAAA,MAAA;AAAA,YACJ,QAAU,EAAA,IAAA;AAAA,YACV,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,QAAA;AAAA,cACN,OAAS,EAAA,YAAA;AAAA,aACX;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,YAAA;AAAA,YACN,EAAI,EAAA,MAAA;AAAA,YACJ,QAAU,EAAA,IAAA;AAAA,YACV,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,QAAA;AAAA,cACN,OAAS,EAAA,oBAAA;AAAA,aACX;AAAA,WACF;AAAA,SACF;AAAA,QACA,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,gCAAA;AAAA,WACR;AAAA,UACA,KAAO,EAAA;AAAA,YACL,WAAa,EAAA,oBAAA;AAAA,WACf;AAAA,SACF;AAAA,OACF;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,OAAS,EAAA,oCAAA;AAAA,QACT,UAAY,EAAA;AAAA,UACV;AAAA,YACE,IAAM,EAAA,oCAAA;AAAA,WACR;AAAA,SACF;AAAA,QACA,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,2CAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,eAAiB,EAAA;AAAA,MACf,GAAK,EAAA;AAAA,QACH,OAAS,EAAA,2BAAA;AAAA,QACT,UAAY,EAAA;AAAA,UACV;AAAA,YACE,IAAM,EAAA,UAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WAAa,EAAA,kBAAA;AAAA,YACb,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,QAAA;AAAA,cACN,OAAS,EAAA,GAAA;AAAA,aACX;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,MAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WAAa,EAAA,8BAAA;AAAA,YACb,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,QAAA;AAAA,aACR;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,iBAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WACE,EAAA,gFAAA;AAAA,YACF,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,SAAA;AAAA,aACR;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,YAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WAAa,EAAA,sBAAA;AAAA,YACb,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,OAAA;AAAA,cACN,KAAO,EAAA;AAAA,gBACL,OAAS,EAAA,UAAA;AAAA,gBACT,IAAM,EAAA,QAAA;AAAA,eACR;AAAA,aACF;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,SAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WAAa,EAAA,2BAAA;AAAA,YACb,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,OAAA;AAAA,cACN,KAAO,EAAA;AAAA,gBACL,OAAS,EAAA,WAAA;AAAA,gBACT,IAAM,EAAA,QAAA;AAAA,eACR;AAAA,aACF;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,SAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WAAa,EAAA,2BAAA;AAAA,YACb,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,OAAA;AAAA,cACN,KAAO,EAAA;AAAA,gBACL,OAAS,EAAA,UAAA;AAAA,gBACT,IAAM,EAAA,QAAA;AAAA,eACR;AAAA,aACF;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,MAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,OAAA;AAAA,cACN,OAAS,EAAA,+BAAA;AAAA,cACT,KAAO,EAAA;AAAA,gBACL,IAAM,EAAA,QAAA;AAAA,eACR;AAAA,aACF;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,YAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WACE,EAAA,wEAAA;AAAA,YACF,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,SAAA;AAAA,aACR;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,SAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WAAa,EAAA,mBAAA;AAAA,YACb,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,OAAA;AAAA,cACN,KAAO,EAAA;AAAA,gBACL,OAAS,EAAA,cAAA;AAAA,gBACT,IAAM,EAAA,QAAA;AAAA,eACR;AAAA,aACF;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,aAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,WAAa,EAAA,wBAAA;AAAA,YACb,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,OAAA;AAAA,cACN,KAAO,EAAA;AAAA,gBACL,OAAS,EAAA,4BAAA;AAAA,gBACT,IAAM,EAAA,QAAA;AAAA,eACR;AAAA,aACF;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,YAAA;AAAA,YACN,EAAI,EAAA,OAAA;AAAA,YACJ,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,OAAA;AAAA,cACN,OAAS,EAAA,4CAAA;AAAA,cACT,KAAO,EAAA;AAAA,gBACL,IAAM,EAAA,QAAA;AAAA,eACR;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,QACA,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,qCAAA;AAAA,WACR;AAAA,UACA,KAAO,EAAA;AAAA,YACL,WAAa,EAAA,cAAA;AAAA,WACf;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,OAAS,EAAA;AAAA,MACP,IAAM,EAAA;AAAA,QACJ,OAAS,EAAA,4BAAA;AAAA,QACT,WAAa,EAAA;AAAA,UACX,OAAS,EAAA;AAAA,YACP,kBAAoB,EAAA;AAAA,cAClB,MAAQ,EAAA;AAAA,gBACN,IAAM,EAAA,QAAA;AAAA,gBACN,QAAA,EAAU,CAAC,QAAQ,CAAA;AAAA,gBACnB,UAAY,EAAA;AAAA,kBACV,MAAQ,EAAA;AAAA,oBACN,IAAM,EAAA,6BAAA;AAAA,mBACR;AAAA,iBACF;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,QACA,SAAW,EAAA;AAAA,UACT,KAAO,EAAA;AAAA,YACL,WAAa,EAAA,wBAAA;AAAA,YACb,OAAS,EAAA;AAAA,cACP,kBAAoB,EAAA;AAAA,gBAClB,MAAQ,EAAA;AAAA,kBACN,IAAM,EAAA,QAAA;AAAA,kBACN,UAAY,EAAA;AAAA,oBACV,MAAQ,EAAA;AAAA,sBACN,WAAa,EAAA,0BAAA;AAAA,sBACb,IAAM,EAAA,QAAA;AAAA,sBACN,OAAS,EAAA,uBAAA;AAAA,qBACX;AAAA,mBACF;AAAA,iBACF;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA,UACA,KAAO,EAAA;AAAA,YACL,WAAa,EAAA,0BAAA;AAAA,YACb,OAAS,EAAA;AAAA,cACP,kBAAoB,EAAA;AAAA,gBAClB,MAAQ,EAAA;AAAA,kBACN,IAAM,EAAA,QAAA;AAAA,kBACN,UAAY,EAAA;AAAA,oBACV,KAAO,EAAA;AAAA,sBACL,IAAM,EAAA,4BAAA;AAAA,qBACR;AAAA,mBACF;AAAA,iBACF;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA,EACA,UAAY,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,MACV,UAAY,EAAA;AAAA,QACV,IAAM,EAAA,YAAA;AAAA,QACN,WAAa,EAAA,gDAAA;AAAA,QACb,EAAI,EAAA,OAAA;AAAA,QACJ,QAAU,EAAA,KAAA;AAAA,QACV,OAAS,EAAA,CAAA;AAAA,QACT,MAAQ,EAAA;AAAA,UACN,IAAM,EAAA,QAAA;AAAA,SACR;AAAA,OACF;AAAA,KACF;AAAA,IACA,SAAW,EAAA;AAAA,MACT,YAAc,EAAA;AAAA,QACZ,WAAa,EAAA,sBAAA;AAAA,QACb,OAAS,EAAA;AAAA,UACP,eAAiB,EAAA;AAAA,YACf,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,SAAA;AAAA,cACN,WAAa,EAAA,yBAAA;AAAA,aACf;AAAA,WACF;AAAA,UACA,cAAgB,EAAA;AAAA,YACd,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,SAAA;AAAA,cACN,WAAa,EAAA,uBAAA;AAAA,aACf;AAAA,WACF;AAAA,UACA,QAAU,EAAA;AAAA,YACR,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,SAAA;AAAA,cACN,WAAa,EAAA,cAAA;AAAA,aACf;AAAA,WACF;AAAA,UACA,aAAe,EAAA;AAAA,YACb,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,SAAA;AAAA,cACN,WAAa,EAAA,4BAAA;AAAA,aACf;AAAA,WACF;AAAA,SACF;AAAA,QACA,OAAS,EAAA;AAAA,UACP,kBAAoB,EAAA;AAAA,YAClB,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,QAAA;AAAA,cACN,QAAA,EAAU,CAAC,cAAc,CAAA;AAAA,cACzB,UAAY,EAAA;AAAA,gBACV,YAAc,EAAA;AAAA,kBACZ,IAAM,EAAA,OAAA;AAAA,kBACN,KAAO,EAAA;AAAA,oBACL,IAAM,EAAA,iCAAA;AAAA,mBACR;AAAA,iBACF;AAAA,gBACA,eAAiB,EAAA;AAAA,kBACf,IAAM,EAAA,QAAA;AAAA,kBACN,WACE,EAAA,wHAAA;AAAA,kBACF,UAAY,EAAA;AAAA,oBACV,UAAY,EAAA;AAAA,sBACV,IAAM,EAAA,OAAA;AAAA,sBACN,KAAO,EAAA;AAAA,wBACL,IAAM,EAAA,QAAA;AAAA,uBACR;AAAA,qBACF;AAAA,oBACA,OAAS,EAAA;AAAA,sBACP,IAAM,EAAA,OAAA;AAAA,sBACN,KAAO,EAAA;AAAA,wBACL,IAAM,EAAA,QAAA;AAAA,uBACR;AAAA,qBACF;AAAA,oBACA,OAAS,EAAA;AAAA,sBACP,IAAM,EAAA,OAAA;AAAA,sBACN,KAAO,EAAA;AAAA,wBACL,IAAM,EAAA,QAAA;AAAA,uBACR;AAAA,qBACF;AAAA,oBACA,IAAM,EAAA;AAAA,sBACJ,IAAM,EAAA,OAAA;AAAA,sBACN,KAAO,EAAA;AAAA,wBACL,IAAM,EAAA,QAAA;AAAA,uBACR;AAAA,qBACF;AAAA,oBACA,OAAS,EAAA;AAAA,sBACP,IAAM,EAAA,OAAA;AAAA,sBACN,KAAO,EAAA;AAAA,wBACL,IAAM,EAAA,QAAA;AAAA,uBACR;AAAA,qBACF;AAAA,oBACA,WAAa,EAAA;AAAA,sBACX,IAAM,EAAA,OAAA;AAAA,sBACN,KAAO,EAAA;AAAA,wBACL,IAAM,EAAA,QAAA;AAAA,uBACR;AAAA,qBACF;AAAA,oBACA,UAAY,EAAA;AAAA,sBACV,IAAM,EAAA,OAAA;AAAA,sBACN,KAAO,EAAA;AAAA,wBACL,IAAM,EAAA,QAAA;AAAA,uBACR;AAAA,qBACF;AAAA,mBACF;AAAA,iBACF;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,MACA,oBAAsB,EAAA;AAAA,QACpB,WAAa,EAAA,oBAAA;AAAA,QACb,OAAS,EAAA;AAAA,UACP,kBAAoB,EAAA;AAAA,YAClB,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,QAAA;AAAA,cACN,UAAY,EAAA;AAAA,gBACV,OAAS,EAAA;AAAA,kBACP,IAAM,EAAA,QAAA;AAAA,kBACN,OAAS,EAAA,EAAA;AAAA,kBACT,WAAa,EAAA,4BAAA;AAAA,iBACf;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,MACA,OAAS,EAAA;AAAA,QACP,WAAa,EAAA,iBAAA;AAAA,QACb,OAAS,EAAA;AAAA,UACP,kBAAoB,EAAA;AAAA,YAClB,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA,OAAA;AAAA,cACN,KAAO,EAAA;AAAA,gBACL,IAAM,EAAA,QAAA;AAAA,gBACN,oBAAsB,EAAA,KAAA;AAAA,gBACtB,QAAU,EAAA;AAAA,kBACR,QAAA;AAAA,kBACA,YAAA;AAAA,kBACA,MAAA;AAAA,kBACA,WAAA;AAAA,kBACA,QAAA;AAAA,iBACF;AAAA,gBACA,UAAY,EAAA;AAAA,kBACV,MAAQ,EAAA;AAAA,oBACN,IAAM,EAAA,QAAA;AAAA,mBACR;AAAA,kBACA,SAAW,EAAA;AAAA,oBACT,IAAM,EAAA,QAAA;AAAA,oBACN,MAAQ,EAAA,WAAA;AAAA,mBACV;AAAA,kBACA,IAAM,EAAA;AAAA,oBACJ,IAAM,EAAA,QAAA;AAAA,mBACR;AAAA,kBACA,UAAY,EAAA;AAAA,oBACV,IAAM,EAAA,QAAA;AAAA,mBACR;AAAA,kBACA,MAAQ,EAAA;AAAA,oBACN,IAAM,EAAA,uCAAA;AAAA,mBACR;AAAA,iBACF;AAAA,eACF;AAAA,aACF;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IACA,OAAS,EAAA;AAAA,MACP,KAAO,EAAA;AAAA,QACL,KAAO,EAAA;AAAA,UACL;AAAA,YACE,IAAM,EAAA,QAAA;AAAA,YACN,OAAS,EAAA;AAAA,cACP,OAAS,EAAA,cAAA;AAAA,cACT,IAAM,EAAA,IAAA;AAAA,aACR;AAAA,WACF;AAAA,UACA;AAAA,YACE,IAAM,EAAA,QAAA;AAAA,YACN,OAAS,EAAA,cAAA;AAAA,WACX;AAAA,SACF;AAAA,OACF;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,KAAO,EAAA;AAAA,UACL;AAAA,YACE,IAAM,EAAA,QAAA;AAAA,YACN,WAAa,EAAA,sBAAA;AAAA,YACb,OAAS,EAAA,2CAAA;AAAA,WACX;AAAA,UACA;AAAA,YACE,IAAM,EAAA,QAAA;AAAA,YACN,WACE,EAAA,uDAAA;AAAA,YACF,OAAS,EAAA,6CAAA;AAAA,WACX;AAAA,UACA;AAAA,YACE,IAAM,EAAA,QAAA;AAAA,YACN,WAAa,EAAA,eAAA;AAAA,YACb,OAAS,EAAA,4BAAA;AAAA,WACX;AAAA,SACF;AAAA,OACF;AAAA,MACA,oBAAsB,EAAA;AAAA,QACpB,IAAM,EAAA,OAAA;AAAA,QACN,KAAO,EAAA;AAAA,UACL,IAAM,EAAA,uCAAA;AAAA,SACR;AAAA,OACF;AAAA,MACA,gBAAkB,EAAA;AAAA,QAChB,WAAa,EAAA,kCAAA;AAAA,QACb,IAAM,EAAA,QAAA;AAAA,QACN,oBAAsB,EAAA,KAAA;AAAA,QACtB,QAAU,EAAA,CAAC,UAAY,EAAA,cAAA,EAAgB,UAAU,CAAA;AAAA,QACjD,UAAY,EAAA;AAAA,UACV,QAAU,EAAA;AAAA,YACR,IAAM,EAAA,OAAA;AAAA,YACN,KAAO,EAAA;AAAA,cACL,IAAM,EAAA,QAAA;AAAA,aACR;AAAA,WACF;AAAA,UACA,YAAc,EAAA;AAAA,YACZ,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,QAAU,EAAA;AAAA,YACR,IAAM,EAAA,OAAA;AAAA,YACN,KAAO,EAAA;AAAA,cACL,IAAM,EAAA,QAAA;AAAA,aACR;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,MACA,UAAY,EAAA;AAAA,QACV,IAAM,EAAA,QAAA;AAAA,QACN,oBAAsB,EAAA,KAAA;AAAA,QACtB,QAAU,EAAA;AAAA,UACR,IAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA;AAAA,UACA,qBAAA;AAAA,UACA,SAAA;AAAA,UACA,YAAA;AAAA,UACA,aAAA;AAAA,UACA,SAAA;AAAA,SACF;AAAA,QACA,UAAY,EAAA;AAAA,UACV,EAAI,EAAA;AAAA,YACF,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,KAAO,EAAA;AAAA,YACL,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,IAAM,EAAA;AAAA,YACJ,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,UAAY,EAAA;AAAA,YACV,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,mBAAqB,EAAA;AAAA,YACnB,IAAM,EAAA,QAAA;AAAA,YACN,MAAQ,EAAA,WAAA;AAAA,WACV;AAAA,UACA,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,UAAY,EAAA;AAAA,YACV,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,WAAa,EAAA;AAAA,YACX,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,cAAgB,EAAA;AAAA,YACd,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,WAAa,EAAA;AAAA,YACX,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,YAAc,EAAA;AAAA,YACZ,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,cAAgB,EAAA;AAAA,YACd,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,uBAAyB,EAAA;AAAA,YACvB,IAAM,EAAA,QAAA;AAAA,YACN,MAAQ,EAAA,WAAA;AAAA,WACV;AAAA,UACA,UAAY,EAAA;AAAA,YACV,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,WAAa,EAAA;AAAA,YACX,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,UACA,SAAW,EAAA;AAAA,YACT,IAAM,EAAA,QAAA;AAAA,WACR;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AACF,CAAA,CAAA;AACO,MAAM,mBAAsB,GAAA,OACjC,OACG,KAAAA,gDAAA,CAA0C,MAAM,OAAO,CAAA;;AC7nBrD,MAAM,MAAS,GAAAC,KAAA,CAAE,MAAO,EAAA,CAAE,GAAGC,wCAAU,CAAA,CAAA;AAEjC,MAAA,cAAA,GAAiBD,MAAE,MAAO,CAAA;AAAA,EACrC,MAAA;AACF,CAAC,CAAA;;ACFqB,eAAA,cAAA,CACpB,cACA,GAC6B,EAAA;AAC7B,EAAM,MAAA,IAAA,GAAO,MAAME,4CAAiC,CAAA,gBAAA;AAAA,IAClD,YAAA;AAAA,GACA,CAAA,cAAA,CAAe,EAAE,GAAA,EAAK,CAAA,CAAA;AACxB,EAAA,OAAO,IAAK,CAAA,KAAA,CAAA;AACd;;ACDsB,eAAA,eAAA,CACpB,QACA,OACiC,EAAA;AACjC,EAAM,MAAA,EAAE,UAAY,EAAA,MAAA,EAAW,GAAA,OAAA,CAAA;AAE/B,EAAA,MAAM,MAA8B,EAAC,CAAA;AAErC,EAAM,MAAA,YAAA,GAAeC,2BAAgB,CAAA,UAAA,CAAW,UAAU,CAAA,CAAA;AAC1D,EAAA,MAAMC,aAAc,GAAA,YAAA,CAAa,MAAO,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AACnD,EAAI,IAAAC,mBAAA,CAAG,eAAgB,CAAAD,aAAW,CAAG,EAAA;AACnC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAA0C,uCAAA,EAAA,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AAAA,KAC5E,CAAA;AAAA,GACF;AAEA,EAAA,MAAM,SAAS,CAA8C,2CAAA,EAAAA,aAAA,CAAY,IAAI,CAAA,gBAAA,EAAmB,OAAO,IAAI,CAAA,CAAA,CAAA;AAC3G,EAAA,MAAM,MAAM,CAAW,QAAA,EAAA,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA,CAAA;AACvD,EAAA,QAAQA,cAAY,IAAM;AAAA,IACxB,KAAK,QAAU,EAAA;AACb,MAAA,GAAA,CAAI,oBAAoBA,aAAY,CAAA,IAAA,CAAA;AACpC,MAAA,MAAM,KAAQ,GAAA,MAAM,cAAe,CAAA,YAAA,EAAc,GAAG,CAAA,CAAA;AACpD,MAAI,GAAA,CAAA,cAAA,GAAiB,qBAAsB,CAAA,KAAA,EAAO,MAAM,CAAA,CAAA;AACxD,MAAA,GAAA,CAAI,wBAAwB,MAAO,CAAA,UAAA,CAAA;AACnC,MAAA,MAAA;AAAA,KACF;AAAA,IACA,KAAK,QAAA;AACH,MAAA;AACE,QAAM,MAAA,IAAA,GAAO,MAAME,4CAAiC,CAAA,gBAAA;AAAA,UAClD,YAAA;AAAA,SACA,CAAA,cAAA,CAAe,EAAE,GAAA,EAAK,CAAA,CAAA;AACxB,QAAA,MAAM,uBAA0B,GAAA,qBAAA;AAAA,UAC9B,YAAa,CAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA,MAAA;AAAA,UACzC,MAAA;AAAA,SACF,CAAA;AACA,QAAA,GAAA,CAAI,oBAAoBF,aAAY,CAAA,IAAA,CAAA;AACpC,QAAA,GAAA,CAAI,iBACF,GAAA,uBAAA,CAAwB,UAAc,IAAA,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,OAAA,CAAA,CAAA;AAC9D,QAAA,GAAA,CAAI,cAAiB,GAAA,qBAAA,CAAsB,IAAK,CAAA,KAAA,EAAO,MAAM,CAAA,CAAA;AAC7D,QAAA,GAAA,CAAI,wBAAwB,MAAO,CAAA,UAAA,CAAA;AAAA,OACrC;AACA,MAAA,MAAA;AAAA,IACF;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAA6B,0BAAA,EAAAA,aAAA,CAAY,IAAI,CAAE,CAAA,CAAA,CAAA;AAAA,GACnE;AAEA,EAAA,MAAM,YAAe,GAAA,oBAAA,CAAA;AACrB,EAAA,MAAM,oBAAuB,GAAA,YAAA,CAAa,MAAO,CAAA,KAAA,CAAM,YAAY,CAAA,CAAA;AACnE,EAAI,IAAAC,mBAAA,CAAG,eAAgB,CAAA,oBAAoB,CAAG,EAAA;AAC5C,IAAA,MAAA,CAAO,KAAK,CAA0C,wCAAA,CAAA,CAAA,CAAA;AAAA,GACjD,MAAA;AACL,IAAA,MAAM,cAAiB,GAAA,MAAM,cAAe,CAAA,YAAA,EAAc,YAAY,CAAA,CAAA;AACtE,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,GAAA,CAAI,mBAAsB,GAAA,cAAA,CAAA;AAAA,KACrB,MAAA;AACL,MAAO,MAAA,CAAA,IAAA;AAAA,QACL,CAAA,oEAAA,CAAA;AAAA,OACF,CAAA;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,GAAA,CAAA;AACT,CAAA;AAEA,SAAS,qBAAA,CACP,OACA,UACG,EAAA;AACH,EAAI,IAAAA,mBAAA,CAAG,eAAgB,CAAA,KAAK,CAAG,EAAA;AAC7B,IAAM,MAAA,IAAI,MAAM,UAAU,CAAA,CAAA;AAAA,GAC5B;AACA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AAEO,SAAS,WAAW,OAIT,EAAA;AAChB,EAAA,IAAI,OAAQ,CAAA,IAAA,CAAK,QAAS,CAAA,QAAQ,CAAG,EAAA;AACnC,IAAO,OAAA,CAAA,QAAA,EAAW,QAAQ,IAAI,CAAA,CAAA,EAAI,QAAQ,UAAU,CAAA,WAAA,EAAc,QAAQ,WAAW,CAAA,CAAA,CAAA;AAAA,GACvF;AACA,EAAO,OAAA,IAAA,CAAA;AACT;;AC9EsB,eAAA,YAAA,CACpB,QACA,OACyB,EAAA;AACzB,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA,UAAY,EAAA,MAAA;AAAA,IACZ,MAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,GACE,GAAA,OAAA,CAAA;AAEJ,EAAA,MAAM,oBAAoBE,gCAAkB,CAAA,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAQ,CAAA,CAAA;AAErE,EAAA,MAAM,SAAS,IAAIC,2BAAA,CAAc,EAAE,YAAA,EAAc,WAAW,CAAA,CAAA;AAE5D,EAAM,MAAA,MAAA,GAAS,MAAM,mBAAoB,EAAA,CAAA;AACzC,EAAO,MAAA,CAAA,GAAA,CAAIC,wBAAQ,CAAA,IAAA,EAAM,CAAA,CAAA;AAEzB,EAAA,MAAA,CAAO,GAAI,CAAA,SAAA,EAAW,CAAC,CAAA,EAAG,QAAa,KAAA;AACrC,IAAA,MAAA,CAAO,MAAM,qBAAqB,CAAA,CAAA;AAClC,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA,CAAA;AAAA,GACnB,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,UAAA,EAAY,OAAO,QAAA,EAAU,QAAa,KAAA;AACnD,IAAM,MAAA,OAAA,GAAU,MAAM,eAAA,CAAgB,UAAW,EAAA,CAAA;AACjD,IAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,GAClC,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,MAAO,CAAA,UAAA,EAAY,OAAO,OAAA,EAAS,QAAa,KAAA;AACrD,IAAM,MAAA,QAAA,GAAW,MAAM,eAAA,CAAgB,aAAc,CAAA;AAAA,MACnD,UAAA,EAAY,QAAQ,KAAM,CAAA,UAAA;AAAA,KAC3B,CAAA,CAAA;AACD,IAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAE,IAAK,CAAA,EAAE,UAAU,CAAA,CAAA;AAAA,GACvC,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,gBAAA,EAAkB,OAAO,OAAA,EAAS,QAAa,KAAA;AACxD,IAAM,MAAA,OAAA,GAAU,MAAM,eAAA,CAAgB,UAAW,CAAA;AAAA,MAC/C,GAAG,OAAQ,CAAA,MAAA;AAAA,KACZ,CAAA,CAAA;AACD,IAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,GAClC,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,MAAO,CAAA,gBAAA,EAAkB,OAAO,OAAA,EAAS,QAAa,KAAA;AAC3D,IAAM,MAAA,QAAA,GAAW,MAAM,eAAgB,CAAA,qBAAA;AAAA,MACrC,OAAQ,CAAA,MAAA;AAAA,MACR,EAAE,UAAA,EAAY,OAAQ,CAAA,KAAA,CAAM,UAAW,EAAA;AAAA,KACzC,CAAA;AACA,IAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAE,IAAK,CAAA,EAAE,UAAU,CAAA,CAAA;AAAA,GACvC,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,4BAAA,EAA8B,OAAO,OAAA,EAAS,QAAa,KAAA;AACpE,IAAM,MAAA,OAAA,GAAU,MAAM,eAAA,CAAgB,UAAW,CAAA;AAAA,MAC/C,GAAG,OAAQ,CAAA,MAAA;AAAA,KACZ,CAAA,CAAA;AACD,IAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,GAClC,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,MAAO,CAAA,4BAAA,EAA8B,OAAO,OAAA,EAAS,QAAa,KAAA;AACvE,IAAM,MAAA,QAAA,GAAW,MAAM,eAAgB,CAAA,qBAAA;AAAA,MACrC,OAAQ,CAAA,MAAA;AAAA,MACR,EAAE,UAAA,EAAY,OAAQ,CAAA,KAAA,CAAM,UAAW,EAAA;AAAA,KACzC,CAAA;AACA,IAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAE,IAAK,CAAA,EAAE,UAAU,CAAA,CAAA;AAAA,GACvC,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,eAAA,EAAiB,OAAO,OAAA,EAAS,QAAa,KAAA;AACvD,IAAA,MAAM,SAAS,OAAQ,CAAA,KAAA,CAAA;AACvB,IAAM,MAAA,EAAE,MAAQ,EAAA,KAAA,EAAO,SAAW,EAAA,IAAA,EAAM,QAAS,EAAA,GAC/C,MAAM,eAAA,CAAgB,eAAgB,CAAA,MAAA,EAAQ,MAAM,CAAA,CAAA;AAEtD,IAAM,MAAA,QAAA,GAAW,MAAO,CAAA,GAAA,CAAI,CAAO,GAAA,KAAA;AACjC,MAAO,OAAA;AAAA,QACL,GAAG,GAAA;AAAA,QACH,IAAI,GAAI,CAAA,EAAA;AAAA,QACR,OAAO,GAAI,CAAA,MAAA;AAAA,QACX,mBAAA,EAAqB,GAAI,CAAA,mBAAA,EAAqB,WAAY,EAAA;AAAA,QAC1D,uBAAA,EAAyB,GAAI,CAAA,uBAAA,EAAyB,WAAY,EAAA;AAAA,QAClE,cAAA,EAAgB,UAAW,CAAA,GAAG,CAAK,IAAA,KAAA,CAAA;AAAA,OACrC,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAI,IAAA,eAAA,CAAA;AACJ,IAAI,IAAA,OAAA,CAAQ,MAAM,eAAiB,EAAA;AACjC,MAAkB,eAAA,GAAA,MAAM,eAAgB,CAAA,qBAAA,CAAsB,MAAM,CAAA,CAAA;AAAA,KACtE;AAEA,IAAS,QAAA,CAAA,SAAA,CAAU,iBAAiB,KAAK,CAAA,CAAA;AACzC,IAAS,QAAA,CAAA,SAAA,CAAU,gBAAgB,SAAS,CAAA,CAAA;AAC5C,IAAS,QAAA,CAAA,SAAA,CAAU,UAAU,IAAI,CAAA,CAAA;AACjC,IAAS,QAAA,CAAA,SAAA,CAAU,eAAe,QAAQ,CAAA,CAAA;AAE1C,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACZ,YAAc,EAAA,QAAA;AAAA,MACd,eAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,IAAK,CAAA,OAAA,EAAS,OAAO,OAAA,EAAS,QAAa,KAAA;AAChD,IAAA,MAAM,IAAO,GAAA,cAAA,CAAe,SAAU,CAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAClD,IAAI,IAAA,CAAC,KAAK,OAAS,EAAA;AACjB,MAAS,QAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA,EAAE,OAAO,IAAK,CAAA,KAAA,CAAM,QAAS,EAAA,EAAG,CAAA,CAAA;AAC1D,MAAA,OAAA;AAAA,KACF;AACA,IAAI,IAAA,MAAA,GAAuC,KAAK,IAAK,CAAA,MAAA,CAAA;AAGrD,IAAA,IAAIJ,oBAAG,MAAO,CAAA,MAAM,CAAK,IAAAK,yCAAA,CAAY,MAAM,CAAG,EAAA;AAC5C,MAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAM,KAAK,qBAAsB,CAAA;AAAA,QACjD,UAAA,EAAY,MAAM,IAAA,CAAK,wBAAyB,EAAA;AAAA,QAChD,cAAgB,EAAA,SAAA;AAAA,OACjB,CAAA,CAAA;AACD,MAAA,MAAMC,UAAS,MAAM,MAAA,CAAO,eAAe,MAAQ,EAAA,EAAE,OAAO,CAAA,CAAA;AAC5D,MAAA,IAAIA,OAAQ,EAAA;AACV,QAASA,MAAAA,GAAAA,OAAAA,CAAAA;AAAA,OACX;AAAA,KACF;AAGA,IAAM,MAAA,UAAA,GAAaC,4CAAc,MAAM,CAAA,CAAA;AACvC,IAAM,MAAA,EAAA,GAAKC,wCAAU,UAAU,CAAA,CAAA;AAC/B,IAAA,MAAM,MAAS,GAAA,MAAM,MAAO,CAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AAC9C,IAAI,IAAA,MAAA,CAAO,WAAW,iBAAmB,EAAA;AACvC,MAAA,MAAA,CAAO,KAAM,CAAA,sBAAA,EAAwB,EAAE,MAAA,EAAQ,IAAI,CAAA,CAAA;AACnD,MAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,2BAA2B,CAAA,CAAA;AAC9D,MAAA,OAAA;AAAA,KACF;AACA,IAAA,QAAA,CAAS,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,MAAA,EAAQ,IAAI,CAAA,CAAA;AAAA,GACzC,CAAA,CAAA;AACD,EAAO,MAAA,CAAA,GAAA,CAAI,iBAAkB,CAAA,KAAA,EAAO,CAAA,CAAA;AACpC,EAAO,OAAA,MAAA,CAAA;AACT;;AC7IO,MAAM,gCACX,GAAA,oCAAA,CAAA;AAEK,SAAS,gBAAgB,UAA4B,EAAA;AAC1D,EAAO,OAAA,UAAA,CAAW,UAAU,UAAU,CAAA,CAAA;AACxC,CAAA;AAEO,SAAS,kBAAkB,UAA+B,EAAA;AAC/D,EAAA,MAAM,KAAQ,GAAA,eAAA,CAAgB,UAAU,CAAA,CAAE,YAAY,QAAQ,CAAA,CAAA;AAC9D,EAAA,OAAO,KAAS,IAAA,IAAA,CAAA;AAClB,CAAA;AAEO,SAAS,kBAAkB,UAGhC,EAAA;AACA,EAAA,MAAM,aAAgB,GAAA,eAAA,CAAgB,UAAU,CAAA,CAAE,UAAU,SAAS,CAAA,CAAA;AACrE,EAAM,MAAA,OAAA,GAAU,aAAc,CAAA,SAAA,CAAU,MAAM,CAAA,CAAA;AAC9C,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,aAAc,CAAA,SAAA,CAAU,OAAO,CAAA;AAAA,GACzC,CAAA;AACF,CAAA;AAEgB,SAAA,qBAAA,CACd,cACA,OACwC,EAAA;AACxC,EAAI,IAAA;AACF,IAAA,MAAM,cAAiB,GAAA,YAAA,CAAa,SAAU,CAAA,CAAA,UAAA,EAAa,OAAO,CAAE,CAAA,CAAA,CAAA;AACpE,IAAA,OAAOC,sEAAqD,cAAc,CAAA,CAAA;AAAA,WACnE,CAAG,EAAA;AACV,IAAO,OAAA;AAAA,MACL,KAAO,EAAA,QAAA;AAAA,MACP,OAAA,EAAS,EAAE,OAAA,EAAS,EAAG,EAAA;AAAA,MACvB,SAAA,EAAW,EAAE,OAAA,EAAS,EAAG,EAAA;AAAA,KAC3B,CAAA;AAAA,GACF;AACF;;ACtCA,eAAsB,cACpB,IACyB,EAAA;AACzB,EAAM,MAAA,EAAE,SAAW,EAAA,MAAA,EAAW,GAAA,IAAA,CAAA;AAC9B,EAAO,OAAA,IAAI,QAAQ,CAAW,OAAA,KAAA;AAC5B,IAAA,IAAI,eAAkB,GAAA,EAAA,CAAA;AACtB,IAAU,SAAA,CAAA,EAAA,CAAG,MAAQ,EAAA,CAAC,KAAkB,KAAA;AACtC,MAAA,MAAM,IAAO,GAAA,eAAA,CAAgB,MAAO,CAAA,KAAA,CAAM,UAAU,CAAA,CAAA;AACpD,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAIhC,MAAkB,eAAA,GAAA,QAAA,CAAS,KAAS,IAAA,EAAA,CAAA;AAEpC,MAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC9B,QAAM,MAAA,GAAA,GAAM,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAC9B,QAAA,IAAI,IAAI,MAAQ,EAAA;AAEd,UAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AAEnB,UAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,SAChB;AACA,QAAA,MAAM,MAAM,GAAI,CAAA,GAAA,CAAA;AAChB,QAAA,OAAO,GAAI,CAAA,GAAA,CAAA;AAEX,QAAA,OAAO,GAAI,CAAA,UAAA,CAAA;AACX,QAAO,MAAA,CAAA,KAAA,CAAM,KAAK,GAAG,CAAA,CAAA;AAAA,OACvB;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,MACwB,EAAA;AACxB,EAAA,MAAM,eACJ,eAAgB,CAAA,MAAM,CAAE,CAAA,kBAAA,CAAmB,eAAe,CAAK,IAAA,IAAA,CAAA;AACjE,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,MAAA,CAAO,MAAM,iDAAiD,CAAA,CAAA;AAC9D,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,iBAAA,CAAkB,eAAe,CAAA,CAAA;AAC5D,EAAI,IAAAT,mBAAA,CAAG,eAAgB,CAAA,WAAW,CAAG,EAAA;AACnC,IAAA,MAAA,CAAO,MAAM,qBAAqB,CAAA,CAAA;AAClC,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAC3C,EAAA,IAAI,UAAU,OAAS,EAAA;AACrB,IAAO,MAAA,CAAA,KAAA,CAAM,CAA4B,yBAAA,EAAA,KAAK,CAAY,UAAA,CAAA,CAAA,CAAA;AAC1D,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAM,MAAA,UAAA,GAAa,WAAY,CAAA,iBAAA,CAAkB,YAAY,CAAA,CAAA;AAC7D,EAAI,IAAAA,mBAAA,CAAG,eAAgB,CAAA,UAAU,CAAG,EAAA;AAClC,IAAA,MAAA,CAAO,MAAM,4DAA4D,CAAA,CAAA;AACzE,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAEA,EAAA,MAAA,CAAO,MAAM,qCAAqC,CAAA,CAAA;AAClD,EAAO,OAAA;AAAA,IACL,qBAAuB,EAAA,WAAA;AAAA,IACvB,kBAAoB,EAAA,UAAA;AAAA,GACtB,CAAA;AACF;;ACjEgB,SAAA,WAAA,CACd,MACA,EAAA,UAAA,EACA,QACkB,EAAA;AAClB,EAAA,MAAM,IAAO,GAAA,eAAA,CAAgB,UAAU,CAAA,CAAE,UAAU,YAAY,CAAA,CAAA;AAE/D,EAAM,MAAA,OAAA,GAAU,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAC/B,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuC,oCAAA,EAAA,IAAI,CAAE,CAAA,CAAA,CAAA;AAAA,GAC/D;AAEA,EAAA,OAAO,QAAQ,QAAQ,CAAA,CAAA;AACzB;;ACMO,MAAM,cAA+C,CAAA;AAAA,EAG1D,WACE,CAAA,cAAA,EACiB,eACA,EAAA,UAAA,EACR,QACQ,QACjB,EAAA;AAJiB,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA,CAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA,CAAA;AACR,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACQ,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAEjB,IAAA,IAAA,CAAK,KAAQ,GAAA,WAAA,CAAY,cAAgB,EAAA,UAAA,EAAY,IAAI,CAAA,CAAA;AAAA,GAC3D;AAAA,EAViB,KAAA,CAAA;AAAA,EAYjB,aAAa,KAAK,OAAiD,EAAA;AACjE,IAAA,MAAM,EAAE,eAAiB,EAAA,UAAA,EAAY,QAAU,EAAA,MAAA,EAAQ,gBACrD,GAAA,OAAA,CAAA;AAEF,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,cAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,cACD,OACmB,EAAA;AACtB,IAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,GAAA,CAAI,CAAU,MAAA,KAAA;AAClC,MAAM,MAAA,KAAA,GAAQQ,wCAAU,MAAM,CAAA,CAAA;AAC9B,MAAM,MAAA,UAAA,GAAaD,4CAAc,MAAM,CAAA,CAAA;AACvC,MAAO,OAAA;AAAA,QACL,KAAA;AAAA,QACA,IAAM,EAAA;AAAA,UACJ,EAAI,EAAA,KAAA;AAAA,UACJ,MAAQ,EAAA,UAAA;AAAA,SACV;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAO,MAAM,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,GACvC;AAAA,EAEA,MAAM,QAAQ,MAA0D,EAAA;AACtE,IAAM,MAAA,KAAA,GAAQC,wCAAU,MAAM,CAAA,CAAA;AAC9B,IAAM,MAAA,UAAA,GAAaD,4CAAc,MAAM,CAAA,CAAA;AAEvC,IAAO,OAAA,MAAM,KAAK,KAAM,CAAA,GAAA;AAAA,MACtB,KAAA;AAAA,MACA,EAAE,EAAA,EAAI,KAAO,EAAA,MAAA,EAAQ,UAAW,EAAA;AAAA,MAChC;AAAA,QACE,KAAO,EAAA,IAAA;AAAA,QACP,aAAe,EAAA,IAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,IAAI,KAAkC,EAAA;AAC1C,IAAM,MAAA,EAAE,EAAI,EAAA,MAAA,EAAW,GAAA,KAAA,CAAA;AACvB,IAAA,MAAM,QAAQG,aAAO,EAAA,CAAA;AACrB,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,MAAA,CAAO,KAAM,CAAA,EAAE,OAAO,KAAO,EAAA,EAAA,EAAI,GAAG,MAAA,EAAQ,CAAA,CAAA;AAChE,IAAI,IAAA;AACF,MAAA,MAAA,CAAO,KAAK,uBAAuB,CAAA,CAAA;AACnC,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,OAAO,MAAM,CAAA,CAAA;AAChD,MAAM,MAAA,IAAA,CAAK,gBAAgB,SAAU,CAAA;AAAA,QACnC,KAAA;AAAA,QACA,MAAQ,EAAA,EAAA;AAAA,QACR,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,OACD,CAAA,CAAA;AACD,MAAA,MAAA,CAAO,KAAK,oCAAoC,CAAA,CAAA;AAAA,aACzC,CAAG,EAAA;AACV,MAAA,MAAA,CAAO,MAAM,iBAAmB,EAAAC,cAAA,CAAQ,CAAC,CAAI,GAAA,CAAA,GAAI,EAAE,CAAA,CAAA;AAAA,KACrD;AAAA,GACF;AAAA,EAEA,MAAM,QACJ,CAAA,EAAE,EAAI,EAAA,MAAA,IACN,MACyB,EAAA;AACzB,IAAA,MAAM,EAAE,OAAA,EAAS,MAAQ,EAAA,aAAA,EAAkB,GAAA,iBAAA;AAAA,MACzC,IAAK,CAAA,UAAA;AAAA,KACP,CAAA;AACA,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,QAAS,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAChD,IAAI,IAAAX,mBAAA,CAAG,eAAgB,CAAA,cAAc,CAAG,EAAA;AACtC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAyB,sBAAA,EAAA,OAAO,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,KACrD;AAEA,IAAA,MAAM,GAA8B,GAAA;AAAA;AAAA,MAElC,UAAY,EAAA,MAAA;AAAA,MACZ,SAAW,EAAA,OAAA;AAAA,MACX,WAAa,EAAA,EAAA;AAAA,MACb,oBAAsB,EAAA,SAAA;AAAA;AAAA,MAEtB,GAAI,MAAM,eAAA,CAAgB,MAAQ,EAAA;AAAA,QAChC,MAAA;AAAA,QACA,YAAY,IAAK,CAAA,UAAA;AAAA,OAClB,CAAA;AAAA,MACD,GAAG,YAAA,CAAa,IAAK,CAAA,UAAA,EAAY,MAAM,CAAA;AAAA,KACzC,CAAA;AAIA,IAAM,MAAA,cAAA,GAAiB,iBAAkB,CAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAExD,IAAM,MAAA,OAAA,GAAU,eAAe,GAAI,CAAA;AAAA,MACjC,KAAO,EAAA,EAAA;AAAA,MACP,GAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,OAAA,CAAQ,KAAK,CAAU,MAAA,KAAA;AAC5B,MAAA,OAAO,aAAc,CAAA;AAAA,QACnB,MAAA;AAAA,QACA,WAAW,MAAO,CAAA,MAAA;AAAA,OACnB,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACH;AACF;;ACrDO,MAAM,0BAA6B,GAAA;AAAA,EACxC,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AACF,CAAA;;ACjFA,MAAM,aAAgB,GAAAY,mCAAA;AAAA,EACpB,6CAAA;AAAA,EACA,YAAA;AACF,CAAA,CAAA;AAEO,MAAM,eAAgB,CAAA;AAAA,EAgBnB,WAAA,CACE,QACA,MACR,EAAA;AAFQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAAA,GACP;AAAA,EAlBH,aAAa,OACX,OAC0B,EAAA;AAC1B,IAAM,MAAA,EAAE,QAAU,EAAA,MAAA,EAAW,GAAA,OAAA,CAAA;AAC7B,IAAM,MAAA,MAAA,GAAS,MAAM,QAAA,CAAS,SAAU,EAAA,CAAA;AAExC,IAAI,IAAA,CAAC,QAAS,CAAA,UAAA,EAAY,IAAM,EAAA;AAC9B,MAAM,MAAA,MAAA,CAAO,QAAQ,MAAO,CAAA;AAAA,QAC1B,SAAW,EAAA,aAAA;AAAA,OACZ,CAAA,CAAA;AAAA,KACH;AAEA,IAAO,OAAA,IAAI,eAAgB,CAAA,MAAA,EAAQ,MAAM,CAAA,CAAA;AAAA,GAC3C;AAAA,EAOA,MAAM,UAAU,OAA6C,EAAA;AAC3D,IAAA,MAAM,EAAE,KAAA,EAAO,MAAQ,EAAA,MAAA,EAAQ,QAAW,GAAA,OAAA,CAAA;AAC1C,IAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,MAAA,IAAU,IAAK,CAAA,MAAA,CAAA;AAEtC,IAAM,MAAA,SAAA,uBAAgB,IAAK,EAAA,CAAA;AAE3B,IAAA,MAAM,UAAwB,EAAC,CAAA;AAC/B,IAAW,KAAA,MAAA,CAAC,YAAY,KAAK,CAAA,IAAK,OAAO,OAAQ,CAAA,MAAA,CAAO,YAAY,CAAG,EAAA;AACrE,MAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,QACX,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA,MAAA;AAAA,QACT,SAAA;AAAA,QACA,MAAM,MAAO,CAAA,IAAA;AAAA,QACb,UAAA;AAAA,QACA,MAAQ,EAAA,KAAA;AAAA,OACT,CAAA,CAAA;AAAA,KACH;AAEA,IAAA,MAAM,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA,CACxB,MAAO,CAAA,OAAO,CACd,CAAA,KAAA,CAAM,CAAU,MAAA,KAAA,MAAA,CAAO,KAAM,CAAA,oBAAA,EAAsB,MAAM,CAAC,CAAA,CAAA;AAE7D,IAAM,MAAA,IAAA,CAAK,kBAAmB,CAAA,SAAA,EAAW,OAAO,CAAA,CAAA;AAAA,GAClD;AAAA,EAEA,MAAM,WACJ,KACmC,EAAA;AACnC,IAAM,MAAA,OAAA,GAAU,IAAK,CAAA,MAAA,CAAO,MAAqB,EAAA,CAAA;AACjD,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AAAA,KACrB;AACA,IAAA,MAAM,IAAO,GAAA,MAAM,OAAQ,CAAA,IAAA,CAAmB,SAAS,CAAA,CAAA;AACvD,IAAO,OAAA,IAAA,CAAK,IAAI,CAAO,GAAA,KAAA;AACrB,MAAO,OAAA;AAAA,QACL,OAAO,GAAI,CAAA,MAAA;AAAA,QACX,QAAQ,GAAI,CAAA,OAAA;AAAA,QACZ,SAAA,EAAW,GAAI,CAAA,SAAA,CAAU,WAAY,EAAA;AAAA,QACrC,MAAM,GAAI,CAAA,IAAA;AAAA,QACV,YAAY,GAAI,CAAA,UAAA;AAAA;AAAA,QAEhB,MAAA,EAAQZ,mBAAG,CAAA,MAAA,CAAO,GAAI,CAAA,MAAM,CAAI,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,MAAM,CAAA,GAAI,GAAI,CAAA,MAAA;AAAA,OAC/D,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAM,UAA2C,GAAA;AAC/C,IAAO,OAAA,IAAA,CAAK,OACT,MAAO,EAAA,CACP,SAAuB,MAAQ,EAAA,YAAY,CAC3C,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,GACnB;AAAA,EAEA,MAAM,qBACJ,CAAA,EAAE,IAAM,EAAA,UAAA,IACR,OACiB,EAAA;AACjB,IAAM,MAAA,MAAA,GAAS,UAAU,OAAO,CAAA,CAAA;AAEhC,IAAM,MAAA,cAAA,GAAiB,KAAK,MAAO,CAAA,SAAS,EACzC,MAAO,CAAA,QAAQ,EACf,KAAM,CAAA,MAAA,EAAQ,IAAI,CAClB,CAAA,QAAA,CAAS,cAAc,UAAU,CAAA,CACjC,QAAQ,WAAa,EAAA,MAAM,CAC3B,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAEhB,IAAO,OAAA,IAAA,CAAK,MAAO,CAAA,SAAS,CAAE,CAAA,MAAA,GAAS,OAAQ,CAAA,QAAA,EAAU,CAAC,cAAc,CAAC,CAAA,CAAA;AAAA,GAC3E;AAAA,EAEA,MAAM,cAAc,OAA0C,EAAA;AAC5D,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA,CAAA;AACtC,IAAM,MAAA,QAAA,GAAW,MAAM,OAAQ,CAAA,GAAA;AAAA,MAC7B,QAAQ,GAAI,CAAA,CAAA,MAAA,KAAU,KAAK,qBAAsB,CAAA,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,KACnE,CAAA;AAEA,IAAA,OAAO,SAAS,MAAO,CAAA,CAAC,GAAG,CAAM,KAAA,CAAA,GAAI,GAAG,CAAC,CAAA,CAAA;AAAA,GAC3C;AAAA,EAEA,MAAc,kBACZ,CAAA,SAAA,EACA,OACe,EAAA;AACf,IAAA,MAAM,EAAE,KAAA,EAAO,MAAQ,EAAA,MAAA,EAAW,GAAA,OAAA,CAAA;AAClC,IAAA,MAAM,eAAgC,EAAC,CAAA;AACvC,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,iBAAiB,CAAA,IAAK,MAAO,CAAA,OAAA;AAAA,MACnD,MAAO,CAAA,YAAA;AAAA,KACN,EAAA;AACD,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,YAAY,CAAA,IAAK,MAAO,CAAA,OAAA;AAAA,QAC3C,iBAAkB,CAAA,YAAA;AAAA,OACjB,EAAA;AACD,QAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,UAAA,MAAM,kBAAkB,WAAY,CAAA,WAAA,CAAA;AACpC,UAAW,KAAA,MAAA,UAAA,IAAc,YAAY,IAAM,EAAA;AACzC,YAAM,MAAA;AAAA,cACJ,WAAA;AAAA,cACA,OAAA;AAAA,cACA,OAAA;AAAA,cACA,UAAA;AAAA,cACA,YAAA;AAAA,cACA,cAAA;AAAA,cACA,UAAA;AAAA,cACA,WAAA;AAAA,cACA,SAAA;AAAA,cACA,uBAAA;AAAA,aACE,GAAA,UAAA,CAAA;AAGJ,YAAA,MAAM,kBAAkB,OAAW,IAAA,WAAA,CAAA;AACnC,YAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,cAAA,SAAA;AAAA,aACF;AAEA,YAAA,YAAA,CAAa,IAAK,CAAA;AAAA,cAChB,MAAQ,EAAA,KAAA;AAAA,cACR,MAAM,MAAO,CAAA,IAAA;AAAA,cACb,mBAAqB,EAAA,SAAA;AAAA,cACrB,UAAA;AAAA,cACA,OAAA;AAAA,cACA,UAAA,EACE,UAAc,IAAA,WAAA,CAAY,UAAc,IAAA,eAAA;AAAA,cAC1C,OAAS,EAAA,eAAA;AAAA,cACT,WAAA;AAAA,cACA,WAAa,EAAA,eAAA;AAAA,cACb,OAAA;AAAA,cACA,YAAA;AAAA,cACA,cAAA;AAAA,cACA,uBAAA;AAAA,cACA,UAAA;AAAA,cACA,WAAA;AAAA,cACA,SAAA;AAAA,aACD,CAAA,CAAA;AAAA,WACH;AAAA,SACF;AAAA,OACF;AAAA,KACF;AACA,IAAA,MAAM,IAAK,CAAA,MAAA,CAAO,cAAc,CAAA,CAAE,OAAO,YAAY,CAAA,CAAA;AAAA,GACvD;AAAA,EAEA,MAAM,eACJ,CAAA,OAAA,EACA,UACsC,EAAA;AACtC,IAAM,MAAA,IAAA,GAAO,YAAY,IAAQ,IAAA,CAAA,CAAA;AACjC,IAAM,MAAA,QAAA,GAAW,YAAY,QAAY,IAAA,GAAA,CAAA;AACzC,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,MAAO,CAAA,cAAc,EAAE,MAAwB,EAAA,CAAA;AAEpE,IAAK,IAAA,CAAA,sBAAA,CAAuB,SAAS,OAAO,CAAA,CAAA;AAE5C,IAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,oBAAA,CAAqB,OAAO,CAAA,CAAA;AAErD,IAAA,MAAM,SAAS,IAAO,GAAA,QAAA,CAAA;AACtB,IAAO,OAAA;AAAA,MACL,QAAQ,MAAM,OAAA,CAAQ,OAAO,MAAM,CAAA,CAAE,MAAM,QAAQ,CAAA;AAAA,MACnD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAW,EAAA,IAAA,CAAK,IAAK,CAAA,KAAA,GAAQ,QAAQ,CAAA;AAAA,KACvC,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,qBAAqB,OAA8C,EAAA;AACvE,IAAM,MAAA,OAAA,GAAU,KAAK,MAAO,CAAA,cAAc,EAAE,KAAM,CAAA,EAAE,KAAO,EAAA,GAAA,EAAK,CAAA,CAAA;AAEhE,IAAK,IAAA,CAAA,sBAAA,CAAuB,SAAS,OAAO,CAAA,CAAA;AAE5C,IAAM,MAAA,KAAA,GAAQ,MAAM,OAAQ,CAAA,KAAA,GAAQ,IAAK,CAAA,CAAA,MAAA,KAAU,QAAQ,KAAK,CAAA,CAAA;AAChE,IAAI,IAAAA,mBAAA,CAAG,MAAO,CAAA,KAAK,CAAG,EAAA;AACpB,MAAO,OAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA,CAAA;AAAA,KAClC;AACA,IAAA,OAAO,KAAS,IAAA,CAAA,CAAA;AAAA,GAClB;AAAA,EAEQ,sBAAA,CACN,SACA,OACM,EAAA;AACN,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAQ,OAAA,CAAA,OAAA,CAAQ,MAAQ,EAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,KACtC;AACA,IAAA,IAAI,QAAQ,UAAY,EAAA;AACtB,MAAQ,OAAA,CAAA,OAAA,CAAQ,YAAc,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AAAA,KAClD;AACA,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAQ,OAAA,CAAA,OAAA,CAAQ,SAAW,EAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,KAC5C;AACA,IAAA,IAAI,QAAQ,UAAY,EAAA;AACtB,MAAQ,OAAA,CAAA,OAAA,CAAQ,YAAc,EAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AAAA,KAClD;AACA,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAQ,OAAA,CAAA,OAAA,CAAQ,SAAW,EAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,KAC5C;AACA,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAQ,OAAA,CAAA,OAAA,CAAQ,SAAW,EAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,KAC5C;AAEA,IAAA,IAAI,QAAQ,UAAY,EAAA;AACtB,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,MAAA,CAAO,cAAc,CAAA,CACtC,OAAO,UAAU,CAAA,CACjB,IAAK,CAAA,mBAAmB,CACxB,CAAA,IAAA;AAAA,QACC,KAAK,MAAO,CAAA,cAAc,CACvB,CAAA,MAAA,CAAO,QAAQ,YAAY,CAAA,CAC3B,GAAI,CAAA,sCAAsC,EAC1C,OAAQ,CAAA,MAAA,EAAQ,YAAY,CAAA,CAC5B,GAAG,OAAO,CAAA;AAAA;AAAA,QAEb,WAAY;AACV,UAAA,IAAA,CAAK,EAAG,CAAA,QAAA,EAAU,GAAK,EAAA,YAAY,CAChC,CAAA,KAAA,CAAM,cAAgB,EAAA,GAAA,EAAK,kBAAkB,CAAA,CAC7C,KAAM,CAAA,uBAAA,EAAyB,KAAK,qBAAqB,CAAA,CAAA;AAAA,SAC9D;AAAA,QAED,QAAS,EAAA,CAAA;AAEZ,MAAQ,OAAA,CAAA,OAAA,CAAQ,UAAU,MAAM,CAAA,CAAA;AAAA,KAClC;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBACJ,OAC2B,EAAA;AAC3B,IAAA,MAAM,cAAc,IAAK,CAAA,MAAA;AAAA,MACvB,cAAA;AAAA,KACF,CAAA;AACA,IAAM,MAAA,oBAAA,GAAuB,YAAY,KAAM,EAAA,CAAA;AAE/C,IAAA,MAAM,gBAA6C,EAAC,CAAA;AACpD,IAAA,MAAM,oBAAiD,EAAC,CAAA;AACxD,IAAA,KAAA,MAAW,aAAa,0BAA4B,EAAA;AAClD,MAAM,MAAA,cAAA,GAAiB,UAAU,SAAS,CAAA,CAAA;AAE1C,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAqB,oBAAA,CAAA,OAAA,CAAQ,WAAW,cAAc,CAAA,CAAA;AACtD,QAAA,iBAAA,CAAkB,KAAK,SAAS,CAAA,CAAA;AAChC,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,aAAA,CAAc,KAAK,SAAS,CAAA,CAAA;AAAA,KAC9B;AAEA,IAAA,MAAM,MAA2B,GAAA;AAAA,MAC/B,YAAY,EAAC;AAAA,MACb,SAAS,EAAC;AAAA,MACV,SAAS,EAAC;AAAA,MACV,SAAS,EAAC;AAAA,MACV,MAAM,EAAC;AAAA,MACP,aAAa,EAAC;AAAA,MACd,YAAY,EAAC;AAAA,KACf,CAAA;AAEA,IAAA,MAAM,YAAY,aAAc,CAAA,GAAA;AAAA,MAC9B,OAAO,SAAyC,KAAA;AAE9C,QAAM,MAAA,MAAA,GAAS,MAAM,oBAAA,CAClB,KAAM,EAAA,CACN,MAAO,CAAA,SAAS,CAChB,CAAA,QAAA,EACA,CAAA,KAAA,CAAM,SAAS,CAAA,CAAA;AAClB,QAAA,MAAA,CAAO,SAAS,CAAA,GAAI,MAAO,CAAA,MAAA,CAAOA,oBAAG,MAAM,CAAA,CAAA;AAAA,OAC7C;AAAA,KACF,CAAA;AACA,IAAA,MAAM,aAAgB,GAAA,iBAAA,CAAkB,GAAI,CAAA,OAAM,SAAa,KAAA;AAC7D,MAAM,MAAA,MAAA,GAAS,MAAM,WAAA,CAClB,KAAM,EAAA,CACN,MAAO,CAAA,SAAS,CAChB,CAAA,QAAA,EACA,CAAA,KAAA,CAAM,SAAS,CAAA,CAAA;AAElB,MAAA,MAAA,CAAO,SAAS,CAAA,GAAI,MAAO,CAAA,MAAA,CAAOA,oBAAG,MAAM,CAAA,CAAA;AAAA,KAC5C,CAAA,CAAA;AACD,IAAA,MAAM,QAAQ,GAAI,CAAA,CAAC,GAAG,SAAW,EAAA,GAAG,aAAa,CAAC,CAAA,CAAA;AAClD,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAM,mBAAmB,OAAyC,EAAA;AAChE,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAW,EAAA,CAAA;AACtC,IAAM,MAAA,QAAA,GAAW,MAAM,OAAQ,CAAA,GAAA;AAAA,MAC7B,QAAQ,GAAI,CAAA,CAAA,MAAA,KAAU,KAAK,0BAA2B,CAAA,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,KACxE,CAAA;AAEA,IAAA,OAAO,SAAS,MAAO,CAAA,CAAC,GAAG,CAAM,KAAA,CAAA,GAAI,GAAG,CAAC,CAAA,CAAA;AAAA,GAC3C;AAAA,EAEA,MAAM,0BACJ,CAAA,EAAE,IAAM,EAAA,UAAA,IACR,OACiB,EAAA;AACjB,IAAM,MAAA,MAAA,GAAS,UAAU,OAAO,CAAA,CAAA;AAEhC,IAAA,MAAM,eAAe,IAAK,CAAA,MAAA,CAAO,cAAc,CAC5C,CAAA,MAAA,CAAO,UAAU,qBAAqB,CAAA,CACtC,SAAS,MAAQ,EAAA,YAAY,EAC7B,KAAM,CAAA,MAAA,EAAQ,IAAI,CAClB,CAAA,QAAA,CAAS,cAAc,UAAU,CAAA,CAAA;AAEpC,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,MAAO,CAAA,YAAY,CAC5C,CAAA,MAAA,CAAO,QAAQ,CAAA,CACf,OAAQ,CAAA,qBAAA,EAAuB,MAAM,CAAA,CACrC,OAAO,MAAM,CAAA,CAAA;AAEhB,IAAO,OAAA,IAAA,CAAK,MAAO,CAAA,cAAc,CAC9B,CAAA,MAAA,GACA,OAAQ,CAAA,QAAA,EAAU,CAAC,cAAc,CAAC,CAAA,CAAA;AAAA,GACvC;AACF,CAAA;AAEA,SAAS,UAAU,OAAiC,EAAA;AAClD,EAAA,IAAI,MAAS,GAAA,CAAA,CAAA;AACb,EACE,IAAAA,mBAAA,CAAG,gBAAgB,OAAS,EAAA,UAAU,KACtCA,mBAAG,CAAA,OAAA,CAAQ,OAAS,EAAA,UAAU,CAC9B,EAAA;AACA,IAAS,MAAA,GAAA,OAAA,EAAS,aAAa,CAAI,GAAA,CAAA,CAAA;AAAA,GAC9B,MAAA;AACL,IAAA,MAAA,GAAS,OAAQ,CAAA,UAAA,CAAA;AAAA,GACnB;AACA,EAAO,OAAA,MAAA,CAAA;AACT;;ACvWsB,eAAA,eAAA,CACpB,gBACA,aACe,EAAA;AACf,EAAA,MAAM,EAAE,SAAA,EAAW,IAAM,EAAA,UAAA,EAAY,WAAc,GAAA,aAAA,CAAA;AAEnD,EAAA,MAAM,SAAS,IAAIG,2BAAA,CAAc,EAAE,YAAA,EAAc,WAAW,CAAA,CAAA;AAE5D,EAAM,MAAA,YAAA,GAAe,gBAAgB,UAAU,CAAA,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAW,qBAAsB,CAAA,YAAA,EAAc,YAAY,CAAA,CAAA;AAEjE,EAAA,OAAO,UAAU,YAAa,CAAA;AAAA,IAC5B,EAAI,EAAA,CAAA,uBAAA,CAAA;AAAA,IACJ,GAAG,QAAA;AAAA,IAEH,IAAI,YAAY;AACd,MAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAM,KAAK,qBAAsB,CAAA;AAAA,QACjD,UAAA,EAAY,MAAM,IAAA,CAAK,wBAAyB,EAAA;AAAA,QAChD,cAAgB,EAAA,SAAA;AAAA,OACjB,CAAA,CAAA;AACD,MAAA,MAAM,EAAE,KAAA,EAAO,QAAS,EAAA,GAAI,MAAM,MAAO,CAAA,WAAA;AAAA,QACvC;AAAA,UACE,MAAQ,EAAA;AAAA,YACN,CAAC,CAAA,qBAAA,EAAwB,gCAAgC,CAAA,CAAE,GACzDU,mCAAA;AAAA,YACF,CAAC,CAAA,qBAAA,EAAwBC,uCAA0B,CAAA,CAAE,GACnDD,mCAAA;AAAA,WACJ;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,MAAA;AAAA,YACA,sBAAA;AAAA,YACA,eAAA;AAAA,YACA,oBAAA;AAAA,YACA,gBAAA;AAAA,WACF;AAAA,SACF;AAAA,QACA,EAAE,KAAM,EAAA;AAAA,OACV,CAAA;AAEA,MAAM,MAAA,cAAA,CAAe,UAAW,CAAA,GAAG,QAAQ,CAAA,CAAA;AAAA,KAC7C;AAAA,GACD,CAAA,CAAA;AACH;;ACpDA,eAAsB,oBAAoB,aAA8B,EAAA;AACtE,EAAA,MAAM,EAAE,SAAA,EAAW,UAAY,EAAA,eAAA,EAAiB,QAAW,GAAA,aAAA,CAAA;AAC3D,EAAM,MAAA,YAAA,GAAe,gBAAgB,UAAU,CAAA,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAW,qBAAsB,CAAA,YAAA,EAAc,SAAS,CAAA,CAAA;AAC9D,EAAA,MAAM,aACJ,GAAA,YAAA,CAAa,iBAAkB,CAAA,wBAAwB,CAAK,IAAA,CAAA,CAAA,CAAA;AAE9D,EAAA,MAAM,qBACJ,GAAA,YAAA,CAAa,iBAAkB,CAAA,2BAA2B,CAAK,IAAA,CAAA,CAAA,CAAA;AAEjE,EAAA,OAAO,UAAU,YAAa,CAAA;AAAA,IAC5B,EAAI,EAAA,CAAA,uBAAA,CAAA;AAAA,IACJ,GAAG,QAAA;AAAA,IACH,IAAI,YAAY;AACd,MAAA,IAAI,iBAAiB,CAAG,EAAA;AACtB,QAAA,MAAA,CAAO,MAAM,wBAAwB,CAAA,CAAA;AACrC,QAAM,MAAA,QAAA,GAAW,MAAM,eAAA,CAAgB,aAAc,CAAA;AAAA,UACnD,UAAY,EAAA,aAAA;AAAA,SACb,CAAA,CAAA;AACD,QAAO,MAAA,CAAA,KAAA,CAAM,CAA6B,0BAAA,EAAA,QAAQ,CAAkB,gBAAA,CAAA,CAAA,CAAA;AAAA,OACtE;AACA,MAAA,IAAI,yBAAyB,CAAG,EAAA;AAC9B,QAAA,MAAA,CAAO,MAAM,oCAAoC,CAAA,CAAA;AACjD,QAAM,MAAA,QAAA,GAAW,MAAM,eAAA,CAAgB,kBAAmB,CAAA;AAAA,UACxD,UAAY,EAAA,qBAAA;AAAA,SACb,CAAA,CAAA;AACD,QAAO,MAAA,CAAA,KAAA;AAAA,UACL,yCAAyC,QAAQ,CAAA,qBAAA,CAAA;AAAA,SACnD,CAAA;AAAA,OACF;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AACH;;ACZO,MAAM,iBAAiBE,oCAAoB,CAAA;AAAA,EAChD,QAAU,EAAA,UAAA;AAAA,EACV,SAAS,GAAK,EAAA;AAEZ,IAAM,MAAA,QAAA,uBAAe,GAA6B,EAAA,CAAA;AAClD,IAAA,GAAA,CAAI,uBAAuBC,yDAA+B,EAAA;AAAA,MACxD,UAAA,CAAW,IAAY,OAA0B,EAAA;AAC/C,QAAI,IAAA,QAAA,CAAS,GAAI,CAAA,EAAE,CAAG,EAAA;AACpB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,IAAI,EAAE,CAAA,2FAAA,CAAA;AAAA,WACR,CAAA;AAAA,SACF;AACA,QAAS,QAAA,CAAA,GAAA,CAAI,IAAI,OAAO,CAAA,CAAA;AAAA,OAC1B;AAAA,KACD,CAAA,CAAA;AAED,IAAM,MAAA,cAAA,uBAAqB,GAAsC,EAAA,CAAA;AACjE,IAAA,GAAA,CAAI,uBAAuBC,uDAA6B,EAAA;AAAA,MACtD,eAAA,CAAgB,IAAY,OAAmC,EAAA;AAC7D,QAAI,IAAA,cAAA,CAAe,GAAI,CAAA,EAAE,CAAG,EAAA;AAC1B,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,IAAI,EAAE,CAAA,yFAAA,CAAA;AAAA,WACR,CAAA;AAAA,SACF;AACA,QAAe,cAAA,CAAA,GAAA,CAAI,IAAI,OAAO,CAAA,CAAA;AAAA,OAChC;AAAA,KACD,CAAA,CAAA;AAED,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,YAAYC,6BAAa,CAAA,UAAA;AAAA,QACzB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,YAAYA,6BAAa,CAAA,UAAA;AAAA,QACzB,UAAUA,6BAAa,CAAA,QAAA;AAAA,QACvB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,MAAMA,6BAAa,CAAA,IAAA;AAAA,OACrB;AAAA,MACA,MAAM,KAAK,OAAS,EAAA;AAClB,QAAA,MAAM,EAAE,QAAA,EAAU,UAAY,EAAA,MAAA,EAAW,GAAA,OAAA,CAAA;AAEzC,QAAA,MAAM,aAA+B,GAAA;AAAA,UACnC,GAAG,OAAA;AAAA,UACH,iBAAiB,MAAM,eAAA,CAAgB,OAAO,EAAE,QAAA,EAAU,QAAQ,CAAA;AAAA,UAClE,QAAA;AAAA,UACA,cAAA;AAAA,SACF,CAAA;AACA,QAAA,MAAM,cAAiB,GAAA,MAAM,cAAe,CAAA,IAAA,CAAK,aAAa,CAAA,CAAA;AAE9D,QAAM,MAAA,eAAA,CAAgB,gBAAgB,aAAa,CAAA,CAAA;AACnD,QAAA,MAAM,oBAAoB,aAAa,CAAA,CAAA;AAEvC,QAAA,UAAA,CAAW,GAAI,CAAA,MAAM,YAAa,CAAA,cAAA,EAAgB,aAAa,CAAC,CAAA,CAAA;AAChE,QAAA,UAAA,CAAW,aAAc,CAAA;AAAA,UACvB,IAAM,EAAA,SAAA;AAAA,UACN,KAAO,EAAA,iBAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACH;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -17,7 +17,15 @@ declare class DatabaseHandler {
|
|
|
17
17
|
deleteReportsByTarget({ host, repository }: ReportTargetQuery, options?: DeleteOptions): Promise<number>;
|
|
18
18
|
deleteReports(options?: DeleteOptions): Promise<number>;
|
|
19
19
|
private updateDependencies;
|
|
20
|
-
getDependencies(filters: DependenciesFilter): Promise<DependencyRow[]
|
|
20
|
+
getDependencies(filters: DependenciesFilter, pagination?: PaginationOptions): Promise<Pagination<DependencyRow[]>>;
|
|
21
|
+
getDependenciesCount(filters: DependenciesFilter): Promise<number>;
|
|
22
|
+
private applyDependencyFilters;
|
|
23
|
+
/**
|
|
24
|
+
* Gets the available values for the dependencies stored in the database.
|
|
25
|
+
* If filters are supplied, OTHER values are filtered accordingly, if a filter is supplied, all values are returned
|
|
26
|
+
* @param filters
|
|
27
|
+
*/
|
|
28
|
+
getDependenciesValues(filters?: DependencyValueFilters): Promise<DependencyValues>;
|
|
21
29
|
deleteDependencies(options: DeleteOptions): Promise<number>;
|
|
22
30
|
deleteDependenciesByTarget({ host, repository }: ReportTargetQuery, options?: DeleteOptions): Promise<number>;
|
|
23
31
|
}
|
|
@@ -79,16 +87,23 @@ interface AddReportParameters {
|
|
|
79
87
|
target: TargetRepo;
|
|
80
88
|
logger?: LoggerService;
|
|
81
89
|
}
|
|
82
|
-
interface DependenciesFilter {
|
|
83
|
-
datasource?: string[];
|
|
84
|
-
depName?: string[];
|
|
85
|
-
depType?: string[];
|
|
86
|
-
host?: string[];
|
|
90
|
+
interface DependenciesFilter extends DependencyValueFilters {
|
|
87
91
|
latestOnly?: boolean;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
+
}
|
|
93
|
+
declare const DependencyValueFiltersKeys: readonly ["datasource", "depName", "depType", "host", "manager", "packageFile", "repository"];
|
|
94
|
+
type DependencyValueFiltersKey = (typeof DependencyValueFiltersKeys)[number];
|
|
95
|
+
type DependencyValueFilters = Record<DependencyValueFiltersKey, string[]>;
|
|
96
|
+
type DependencyValues = Record<DependencyValueFiltersKey, string[]>;
|
|
97
|
+
interface PaginationOptions {
|
|
98
|
+
page: number;
|
|
99
|
+
pageSize: number;
|
|
100
|
+
}
|
|
101
|
+
interface Pagination<T> {
|
|
102
|
+
result: T;
|
|
103
|
+
page: number;
|
|
104
|
+
pageSize: number;
|
|
105
|
+
pageCount: number;
|
|
106
|
+
total: number;
|
|
92
107
|
}
|
|
93
108
|
|
|
94
109
|
declare class RenovateRunner implements Runnable<RunOptions> {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@secustor/backstage-plugin-renovate-backend",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"main": "dist/index.cjs.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
"@backstage/errors": "^1.2.4",
|
|
59
59
|
"@backstage/integration": "^1.14.0",
|
|
60
60
|
"@backstage/types": "^1.1.1",
|
|
61
|
-
"@secustor/backstage-plugin-renovate-common": "^0.6.
|
|
62
|
-
"@secustor/backstage-plugin-renovate-node": "^0.3.
|
|
61
|
+
"@secustor/backstage-plugin-renovate-common": "^0.6.1",
|
|
62
|
+
"@secustor/backstage-plugin-renovate-node": "^0.3.7",
|
|
63
63
|
"@sindresorhus/is": "^4.6.0",
|
|
64
64
|
"@types/express": "*",
|
|
65
65
|
"express": "^4.17.1",
|