@secustor/backstage-plugin-renovate-backend 0.18.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @secustor/backstage-plugin-renovate-backend
2
2
 
3
+ ## 0.18.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1025](https://github.com/secustor/backstage-plugins/pull/1025) [`9ef48fe`](https://github.com/secustor/backstage-plugins/commit/9ef48fed683c57b14279e68d2d868b43aa799fda) Thanks [@secustors-renovate](https://github.com/apps/secustors-renovate)! - Bump Backstage to 1.49.4
8
+
3
9
  ## 0.18.0
4
10
 
5
11
  ### Minor Changes
@@ -17,6 +17,8 @@ class DatabaseHandler {
17
17
  this.client = client;
18
18
  this.logger = logger;
19
19
  }
20
+ client;
21
+ logger;
20
22
  static async create(options) {
21
23
  const { database, logger } = options;
22
24
  const client = await database.getClient();
@@ -1 +1 @@
1
- {"version":3,"file":"databaseHandler.cjs.js","sources":["../../src/service/databaseHandler.ts"],"sourcesContent":["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,\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(\n table: 'reports' | 'dependencies' = 'reports',\n ): Promise<ReportTargetQuery[]> {\n return this.client\n .select()\n .distinct<ReportsRow[]>('host', 'repository')\n .from(table);\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?: Partial<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('dependencies');\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 .as('runs');\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"],"names":["resolvePackagePath","is","DependencyValueFiltersKeys"],"mappings":"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"}
1
+ {"version":3,"file":"databaseHandler.cjs.js","sources":["../../src/service/databaseHandler.ts"],"sourcesContent":["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,\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(\n table: 'reports' | 'dependencies' = 'reports',\n ): Promise<ReportTargetQuery[]> {\n return this.client\n .select()\n .distinct<ReportsRow[]>('host', 'repository')\n .from(table);\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?: Partial<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('dependencies');\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 .as('runs');\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"],"names":["resolvePackagePath","is","DependencyValueFiltersKeys"],"mappings":";;;;;;;;;;AAwBA,MAAM,aAAA,GAAgBA,mCAAA;AAAA,EACpB,6CAAA;AAAA,EACA;AACF,CAAA;AAEO,MAAM,eAAA,CAAgB;AAAA,EAgBnB,WAAA,CACE,QACA,MAAA,EACR;AAFQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACP;AAAA,EAFO,MAAA;AAAA,EACA,MAAA;AAAA,EAjBV,aAAa,OACX,OAAA,EAC0B;AAC1B,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,OAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,SAAA,EAAU;AAExC,IAAA,IAAI,CAAC,QAAA,CAAS,UAAA,EAAY,IAAA,EAAM;AAC9B,MAAA,MAAM,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,QAC1B,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,eAAA,CAAgB,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC3C;AAAA,EAOA,MAAM,UAAU,OAAA,EAA6C;AAC3D,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAO,GAAI,OAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,MAAA;AAEtC,IAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAE3B,IAAA,MAAM,UAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,CAAC,YAAY,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA,EAAG;AACrE,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,SAAA;AAAA,QACA,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,UAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CACxB,MAAA,CAAO,OAAO,CAAA,CACd,KAAA,CAAM,CAAA,MAAA,KAAU,MAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,MAAM,CAAC,CAAA;AAE7D,IAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,OAAO,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,WACJ,KAAA,EACmC;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,MAAA,EAAqB;AACjD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,CAAmB,SAAS,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,GAAA,KAAO;AACrB,MAAA,OAAO;AAAA,QACL,OAAO,GAAA,CAAI,MAAA;AAAA,QACX,QAAQ,GAAA,CAAI,OAAA;AAAA,QACZ,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,YAAY,GAAA,CAAI,UAAA;AAAA;AAAA,QAEhB,MAAA,EAAQC,mBAAA,CAAG,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,CAAI;AAAA,OAC/D;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAA,CACJ,KAAA,GAAoC,SAAA,EACN;AAC9B,IAAA,OAAO,IAAA,CAAK,OACT,MAAA,EAAO,CACP,SAAuB,MAAA,EAAQ,YAAY,CAAA,CAC3C,IAAA,CAAK,KAAK,CAAA;AAAA,EACf;AAAA,EAEA,MAAM,qBAAA,CACJ,EAAE,IAAA,EAAM,UAAA,IACR,OAAA,EACiB;AACjB,IAAA,MAAM,MAAA,GAAS,UAAU,OAAO,CAAA;AAEhC,IAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,CAAO,SAAS,EACzC,MAAA,CAAO,QAAQ,EACf,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAA,CAClB,QAAA,CAAS,cAAc,UAAU,CAAA,CACjC,QAAQ,WAAA,EAAa,MAAM,CAAA,CAC3B,MAAA,CAAO,MAAM,CAAA;AAEhB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAE,MAAA,GAAS,OAAA,CAAQ,QAAA,EAAU,CAAC,cAAc,CAAC,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,cAAc,OAAA,EAA0C;AAC5D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC7B,QAAQ,GAAA,CAAI,CAAA,MAAA,KAAU,KAAK,qBAAA,CAAsB,MAAA,EAAQ,OAAO,CAAC;AAAA,KACnE;AAEA,IAAA,OAAO,SAAS,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAc,kBAAA,CACZ,SAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO,GAAI,OAAA;AAClC,IAAA,MAAM,eAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,iBAAiB,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,MACnD,MAAA,CAAO;AAAA,KACT,EAAG;AACD,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,YAAY,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,QAC3C,iBAAA,CAAkB;AAAA,OACpB,EAAG;AACD,QAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,UAAA,MAAM,kBAAkB,WAAA,CAAY,WAAA;AACpC,UAAA,KAAA,MAAW,UAAA,IAAc,YAAY,IAAA,EAAM;AACzC,YAAA,MAAM;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;AAAA,aACF,GAAI,UAAA;AAGJ,YAAA,MAAM,kBAAkB,OAAA,IAAW,WAAA;AACnC,YAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,cAAA;AAAA,YACF;AAEA,YAAA,YAAA,CAAa,IAAA,CAAK;AAAA,cAChB,MAAA,EAAQ,KAAA;AAAA,cACR,MAAM,MAAA,CAAO,IAAA;AAAA,cACb,mBAAA,EAAqB,SAAA;AAAA,cACrB,UAAA;AAAA,cACA,OAAA;AAAA,cACA,UAAA,EACE,UAAA,IAAc,WAAA,CAAY,UAAA,IAAc,eAAA;AAAA,cAC1C,OAAA,EAAS,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;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,CAAE,OAAO,YAAY,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,eAAA,CACJ,OAAA,EACA,UAAA,EACsC;AACtC,IAAA,MAAM,IAAA,GAAO,YAAY,IAAA,IAAQ,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,YAAY,QAAA,IAAY,GAAA;AACzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,cAAc,EAAE,MAAA,EAAwB;AAEpE,IAAA,IAAA,CAAK,sBAAA,CAAuB,SAAS,OAAO,CAAA;AAE5C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAErD,IAAA,MAAM,SAAS,IAAA,GAAO,QAAA;AACtB,IAAA,OAAO;AAAA,MACL,QAAQ,MAAM,OAAA,CAAQ,OAAO,MAAM,CAAA,CAAE,MAAM,QAAQ,CAAA;AAAA,MACnD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,QAAQ;AAAA,KACvC;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,OAAA,EAA8C;AACvE,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,cAAc,EAAE,KAAA,CAAM,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA;AAEhE,IAAA,IAAA,CAAK,sBAAA,CAAuB,SAAS,OAAO,CAAA;AAE5C,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,QAAQ,KAAK,CAAA;AAChE,IAAA,IAAIA,mBAAA,CAAG,MAAA,CAAO,KAAK,CAAA,EAAG;AACpB,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,KAAA,IAAS,CAAA;AAAA,EAClB;AAAA,EAEQ,sBAAA,CACN,SACA,OAAA,EACM;AACN,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,IACtC;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,OAAA,CAAQ,YAAA,EAAc,OAAA,CAAQ,UAAU,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,OAAA,CAAQ,YAAA,EAAc,OAAA,CAAQ,UAAU,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,CACtC,OAAO,UAAU,CAAA,CACjB,IAAA,CAAK,mBAAmB,CAAA,CACxB,IAAA;AAAA,QACC,KAAK,MAAA,CAAO,cAAc,CAAA,CACvB,MAAA,CAAO,QAAQ,YAAY,CAAA,CAC3B,GAAA,CAAI,sCAAsC,EAC1C,OAAA,CAAQ,MAAA,EAAQ,YAAY,CAAA,CAC5B,GAAG,OAAO,CAAA;AAAA;AAAA,QAEb,WAAY;AACV,UAAA,IAAA,CAAK,EAAA,CAAG,QAAA,EAAU,GAAA,EAAK,YAAY,CAAA,CAChC,KAAA,CAAM,cAAA,EAAgB,GAAA,EAAK,kBAAkB,CAAA,CAC7C,KAAA,CAAM,uBAAA,EAAyB,KAAK,qBAAqB,CAAA;AAAA,QAC9D;AAAA,QAED,QAAA,EAAS;AAEZ,MAAA,OAAA,CAAQ,OAAA,CAAQ,UAAU,MAAM,CAAA;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBACJ,OAAA,EAC2B;AAC3B,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA;AAAA,MACvB;AAAA,KACF;AACA,IAAA,MAAM,oBAAA,GAAuB,YAAY,KAAA,EAAM;AAE/C,IAAA,MAAM,gBAA6C,EAAC;AACpD,IAAA,MAAM,oBAAiD,EAAC;AACxD,IAAA,KAAA,MAAW,aAAaC,gCAAA,EAA4B;AAClD,MAAA,MAAM,cAAA,GAAiB,UAAU,SAAS,CAAA;AAE1C,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,oBAAA,CAAqB,OAAA,CAAQ,WAAW,cAAc,CAAA;AACtD,QAAA,iBAAA,CAAkB,KAAK,SAAS,CAAA;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,MAAA,GAA2B;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;AAAC,KACf;AAEA,IAAA,MAAM,YAAY,aAAA,CAAc,GAAA;AAAA,MAC9B,OAAO,SAAA,KAAyC;AAE9C,QAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAClB,KAAA,EAAM,CACN,MAAA,CAAO,SAAS,CAAA,CAChB,QAAA,EAAS,CACT,KAAA,CAAM,SAAS,CAAA;AAClB,QAAA,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,CAAO,MAAA,CAAOD,oBAAG,MAAM,CAAA;AAAA,MAC7C;AAAA,KACF;AACA,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,GAAA,CAAI,OAAM,SAAA,KAAa;AAC7D,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAClB,KAAA,EAAM,CACN,MAAA,CAAO,SAAS,CAAA,CAChB,QAAA,EAAS,CACT,KAAA,CAAM,SAAS,CAAA;AAElB,MAAA,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,CAAO,MAAA,CAAOA,oBAAG,MAAM,CAAA;AAAA,IAC7C,CAAC,CAAA;AACD,IAAA,MAAM,QAAQ,GAAA,CAAI,CAAC,GAAG,SAAA,EAAW,GAAG,aAAa,CAAC,CAAA;AAClD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,OAAA,EAAyC;AAChE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC7B,QAAQ,GAAA,CAAI,CAAA,MAAA,KAAU,KAAK,0BAAA,CAA2B,MAAA,EAAQ,OAAO,CAAC;AAAA,KACxE;AAEA,IAAA,OAAO,SAAS,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,0BAAA,CACJ,EAAE,IAAA,EAAM,UAAA,IACR,OAAA,EACiB;AACjB,IAAA,MAAM,MAAA,GAAS,UAAU,OAAO,CAAA;AAEhC,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,cAAc,EAC5C,MAAA,CAAO,QAAA,EAAU,qBAAqB,CAAA,CACtC,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAA,CAC7B,KAAA,CAAM,QAAQ,IAAI,CAAA,CAClB,SAAS,YAAA,EAAc,UAAU,CAAA,CACjC,EAAA,CAAG,MAAM,CAAA;AAEZ,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA,CAC5C,MAAA,CAAO,QAAQ,CAAA,CACf,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA,CACrC,OAAO,MAAM,CAAA;AAEhB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,CAC9B,MAAA,GACA,OAAA,CAAQ,QAAA,EAAU,CAAC,cAAc,CAAC,CAAA;AAAA,EACvC;AACF;AAEA,SAAS,UAAU,OAAA,EAAiC;AAClD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IACEA,mBAAA,CAAG,gBAAgB,OAAA,EAAS,UAAU,KACtCA,mBAAA,CAAG,OAAA,CAAQ,OAAA,EAAS,UAAU,CAAA,EAC9B;AACA,IAAA,MAAA,GAAS,OAAA,EAAS,aAAa,CAAA,GAAI,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,OAAA,CAAQ,UAAA;AAAA,EACnB;AACA,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -21,7 +21,8 @@ async function getPlatformEnvs(target, context) {
21
21
  const errMsg = `No credentials could be found for url and '${integration$1.type}' type for host ${target.host}`;
22
22
  const url = `https://${target.host}/${target.repository}`;
23
23
  switch (integration$1.type) {
24
- case "bitbucket": {
24
+ case "bitbucket":
25
+ case "bitbucketServer": {
25
26
  const bitbucketServerIntegrationConfig = integrations.bitbucketServer.byHost(target.host);
26
27
  const config = bitbucketServerIntegrationConfig?.config;
27
28
  if (!config || !config.token) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/wrapper/platforms/index.ts"],"sourcesContent":["import {\n DefaultGitlabCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\nimport is from '@sindresorhus/is';\nimport { PlatformEnvsOptions } from './types';\nimport { TargetRepo } from '@secustor/backstage-plugin-renovate-common';\nimport { getGithubToken } from './github';\n\n/*\n Returns record of Renovate environment variables specific for the platform of targetUrl\n */\nexport async function getPlatformEnvs(\n target: TargetRepo,\n context: PlatformEnvsOptions,\n): Promise<Record<string, string>> {\n const { rootConfig, logger } = context;\n\n const env: Record<string, string> = {};\n // add Renovate platform and tokens\n const integrations = ScmIntegrations.fromConfig(rootConfig);\n const integration = integrations.byHost(target.host);\n if (is.nullOrUndefined(integration)) {\n throw new Error(\n `Could not identify platform for target ${target.host}/${target.repository}`,\n );\n }\n\n const errMsg = `No credentials could be found for url and '${integration.type}' type for host ${target.host}`;\n const url = `https://${target.host}/${target.repository}`;\n switch (integration.type) {\n case 'bitbucket': {\n const bitbucketServerIntegrationConfig =\n integrations.bitbucketServer.byHost(target.host);\n\n const config = bitbucketServerIntegrationConfig?.config;\n if (!config || !config.token) {\n throw new Error(\n `renovate on ${integration.type} requires token in configuration`,\n );\n }\n\n env.RENOVATE_PLATFORM = 'bitbucket-server';\n env.RENOVATE_REPOSITORIES = target.repository;\n env.RENOVATE_ENDPOINT = config.apiBaseUrl.replace(/([^\\/:]\\/).*$/, '$1');\n env.RENOVATE_TOKEN = config.token;\n break;\n }\n\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 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.GITHUB_COM_TOKEN = githubComToken;\n } else {\n logger.warn(\n `Could not get token for Github.com token in the defined integrations`,\n );\n }\n }\n return env;\n}\n\nfunction requireConfigVariable<T>(\n input: T | undefined | null,\n errMessage: string,\n): T {\n if (is.nullOrUndefined(input)) {\n throw new Error(errMessage);\n }\n return input;\n}\n\nexport function getFileUrl(options: {\n packageFile: string;\n host: string;\n repository: string;\n}): string | null {\n if (options.host.includes('github')) {\n return `https://${options.host}/${options.repository}/blob/HEAD/${options.packageFile}`;\n }\n return null;\n}\n"],"names":["ScmIntegrations","integration","is","getGithubToken","DefaultGitlabCredentialsProvider"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/wrapper/platforms/index.ts"],"sourcesContent":["import {\n DefaultGitlabCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\nimport is from '@sindresorhus/is';\nimport { PlatformEnvsOptions } from './types';\nimport { TargetRepo } from '@secustor/backstage-plugin-renovate-common';\nimport { getGithubToken } from './github';\n\n/*\n Returns record of Renovate environment variables specific for the platform of targetUrl\n */\nexport async function getPlatformEnvs(\n target: TargetRepo,\n context: PlatformEnvsOptions,\n): Promise<Record<string, string>> {\n const { rootConfig, logger } = context;\n\n const env: Record<string, string> = {};\n // add Renovate platform and tokens\n const integrations = ScmIntegrations.fromConfig(rootConfig);\n const integration = integrations.byHost(target.host);\n if (is.nullOrUndefined(integration)) {\n throw new Error(\n `Could not identify platform for target ${target.host}/${target.repository}`,\n );\n }\n\n const errMsg = `No credentials could be found for url and '${integration.type}' type for host ${target.host}`;\n const url = `https://${target.host}/${target.repository}`;\n switch (integration.type) {\n case 'bitbucket':\n case 'bitbucketServer': {\n const bitbucketServerIntegrationConfig =\n integrations.bitbucketServer.byHost(target.host);\n\n const config = bitbucketServerIntegrationConfig?.config;\n if (!config || !config.token) {\n throw new Error(\n `renovate on ${integration.type} requires token in configuration`,\n );\n }\n\n env.RENOVATE_PLATFORM = 'bitbucket-server';\n env.RENOVATE_REPOSITORIES = target.repository;\n env.RENOVATE_ENDPOINT = config.apiBaseUrl.replace(/([^\\/:]\\/).*$/, '$1');\n env.RENOVATE_TOKEN = config.token;\n break;\n }\n\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 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.GITHUB_COM_TOKEN = githubComToken;\n } else {\n logger.warn(\n `Could not get token for Github.com token in the defined integrations`,\n );\n }\n }\n return env;\n}\n\nfunction requireConfigVariable<T>(\n input: T | undefined | null,\n errMessage: string,\n): T {\n if (is.nullOrUndefined(input)) {\n throw new Error(errMessage);\n }\n return input;\n}\n\nexport function getFileUrl(options: {\n packageFile: string;\n host: string;\n repository: string;\n}): string | null {\n if (options.host.includes('github')) {\n return `https://${options.host}/${options.repository}/blob/HEAD/${options.packageFile}`;\n }\n return null;\n}\n"],"names":["ScmIntegrations","integration","is","getGithubToken","DefaultGitlabCredentialsProvider"],"mappings":"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"}
@@ -21,6 +21,10 @@ class RenovateRunner {
21
21
  this.runtimes = runtimes;
22
22
  this.queue = factory.createQueue(queueFactories, rootConfig, this);
23
23
  }
24
+ databaseHandler;
25
+ rootConfig;
26
+ logger;
27
+ runtimes;
24
28
  queue;
25
29
  static async from(options) {
26
30
  const { databaseHandler, rootConfig, runtimes, logger, queueFactories } = options;
@@ -1 +1 @@
1
- {"version":3,"file":"renovateRunner.cjs.js","sources":["../../src/wrapper/renovateRunner.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { getPlatformEnvs } from './platforms';\nimport { RouterOptions } from '../service/types';\nimport { extractReport, getCacheEnvs, getPassthroughEnvs } 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 ...getPassthroughEnvs(this.rootConfig, logger),\n };\n\n // read out renovate.config and write out to json file for consumption by Renovate\n // we are reading it at this place to allow dynamic configuration changes\n const renovateConfig = getRenovateConfig(this.rootConfig);\n\n const promise = wrapperRuntime.run({\n runID: id,\n env,\n renovateConfig,\n runtimeConfig,\n logger,\n });\n\n return promise.then(result => {\n return extractReport({\n logger,\n logStream: result.stdout,\n });\n });\n }\n}\n"],"names":["createQueue","getTaskID","getTargetRepo","nanoid","isError","getRuntimeConfigs","is","getPlatformEnvs","getCacheEnvs","getPassthroughEnvs","getRenovateConfig","extractReport"],"mappings":"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"}
1
+ {"version":3,"file":"renovateRunner.cjs.js","sources":["../../src/wrapper/renovateRunner.ts"],"sourcesContent":["import is from '@sindresorhus/is';\nimport { getPlatformEnvs } from './platforms';\nimport { RouterOptions } from '../service/types';\nimport { extractReport, getCacheEnvs, getPassthroughEnvs } 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 ...getPassthroughEnvs(this.rootConfig, logger),\n };\n\n // read out renovate.config and write out to json file for consumption by Renovate\n // we are reading it at this place to allow dynamic configuration changes\n const renovateConfig = getRenovateConfig(this.rootConfig);\n\n const promise = wrapperRuntime.run({\n runID: id,\n env,\n renovateConfig,\n runtimeConfig,\n logger,\n });\n\n return promise.then(result => {\n return extractReport({\n logger,\n logStream: result.stdout,\n });\n });\n }\n}\n"],"names":["createQueue","getTaskID","getTargetRepo","nanoid","isError","getRuntimeConfigs","is","getPlatformEnvs","getCacheEnvs","getPassthroughEnvs","getRenovateConfig","extractReport"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secustor/backstage-plugin-renovate-backend",
3
- "version": "0.18.0",
3
+ "version": "0.18.1",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "LGPL-3.0-or-later",
@@ -51,14 +51,14 @@
51
51
  "postpack": "backstage-cli package postpack"
52
52
  },
53
53
  "dependencies": {
54
- "@backstage/backend-defaults": "^0.15.0",
54
+ "@backstage/backend-defaults": "^0.16.0",
55
55
  "@backstage/backend-openapi-utils": "^0.6.4",
56
56
  "@backstage/backend-plugin-api": "^1.6.0",
57
57
  "@backstage/catalog-client": "^1.12.1",
58
58
  "@backstage/catalog-model": "^1.7.6",
59
59
  "@backstage/config": "^1.3.6",
60
60
  "@backstage/errors": "^1.2.7",
61
- "@backstage/integration": "^1.19.0",
61
+ "@backstage/integration": "^2.0.0",
62
62
  "@backstage/types": "^1.2.2",
63
63
  "@secustor/backstage-plugin-renovate-common": "^0.9.5",
64
64
  "@secustor/backstage-plugin-renovate-node": "^0.5.9",
@@ -75,10 +75,10 @@
75
75
  },
76
76
  "devDependencies": {
77
77
  "@backstage/backend-test-utils": "^1.10.2",
78
- "@backstage/cli": "^0.35.1",
79
- "@backstage/repo-tools": "^0.16.1",
78
+ "@backstage/cli": "^0.36.0",
79
+ "@backstage/repo-tools": "^0.17.0",
80
80
  "@backstage/test-utils": "^1.7.14",
81
- "@types/supertest": "^6.0.0",
81
+ "@types/supertest": "^7.0.0",
82
82
  "jest-mock-extended": "^4.0.0",
83
83
  "msw": "^2.0.0",
84
84
  "supertest": "^7.0.0"