renovate 40.30.1 → 40.31.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/versioning/pep440/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as pep440 from '@renovatebot/pep440';\nimport type { RangeStrategy } from '../../../types/versioning';\nimport type { VersioningApi } from '../types';\nimport { getNewValue, isLessThanRange } from './range';\n\nexport const id = 'pep440';\nexport const displayName = 'PEP440';\nexport const urls = ['https://www.python.org/dev/peps/pep-0440/'];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'pin',\n 'replace',\n];\n\nconst {\n compare: sortVersions,\n satisfies,\n valid,\n validRange,\n explain,\n gt: isGreaterThan,\n major: getMajor,\n minor: getMinor,\n patch: getPatch,\n eq,\n} = pep440;\n\nfunction isVersion(input: string | undefined | null): boolean {\n // @renovatebot/pep440 isn't strict null save\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return !!valid(input!);\n}\n\nconst isStable = (input: string): boolean => {\n const version = explain(input);\n if (!version) {\n return false;\n }\n return !version.is_prerelease;\n};\n\n// If this is left as an alias, inputs like \"17.04.0\" throw errors\nexport function isValid(input: string): boolean {\n return validRange(input) || isVersion(input);\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const found = pep440.filter(versions, range).sort(sortVersions);\n return found.length === 0 ? null : found[found.length - 1];\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const found = pep440.filter(versions, range).sort(sortVersions);\n return found.length === 0 ? null : found[0];\n}\n\nexport function isSingleVersion(constraint: string): boolean {\n return (\n isVersion(constraint) ||\n (constraint?.startsWith('==') && isVersion(constraint.substring(2).trim()))\n );\n}\n\nexport { isVersion, matches };\n\nconst equals = (version1: string, version2: string): boolean =>\n isVersion(version1) && isVersion(version2) && eq(version1, version2);\n\nfunction matches(version: string, range: string): boolean {\n if (!isVersion(version)) {\n return false;\n }\n if (isVersion(range)) {\n return equals(version, range);\n }\n return isValid(range) && satisfies(version, range);\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n isLessThanRange,\n};\n\nexport default api;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/versioning/pep440/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as pep440 from '@renovatebot/pep440';\nimport type { RangeStrategy } from '../../../types/versioning';\nimport type { VersioningApi } from '../types';\nimport { getNewValue, isLessThanRange } from './range';\n\nexport const id = 'pep440';\nexport const displayName = 'PEP440';\nexport const urls = ['https://www.python.org/dev/peps/pep-0440/'];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'pin',\n 'replace',\n];\n\nconst {\n compare: sortVersions,\n satisfies,\n valid,\n validRange,\n explain,\n gt: isGreaterThan,\n major: getMajor,\n minor: getMinor,\n patch: getPatch,\n eq,\n} = pep440;\n\nfunction isVersion(input: string | undefined | null): boolean {\n // @renovatebot/pep440 isn't strict null save\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return !!valid(input!);\n}\n\nconst isStable = (input: string): boolean => {\n const version = explain(input);\n if (!version) {\n return false;\n }\n return !version.is_prerelease;\n};\n\n// If this is left as an alias, inputs like \"17.04.0\" throw errors\nexport function isValid(input: string): boolean {\n return validRange(input) || isVersion(input);\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const found = pep440.filter(versions, range).sort(sortVersions);\n return found.length === 0 ? null : found[found.length - 1];\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n const found = pep440.filter(versions, range).sort(sortVersions);\n return found.length === 0 ? null : found[0];\n}\n\nexport function isSingleVersion(constraint: string): boolean {\n return (\n isVersion(constraint) ||\n (constraint?.startsWith('==') && isVersion(constraint.substring(2).trim()))\n );\n}\n\nexport { isVersion, matches };\n\nconst equals = (version1: string, version2: string): boolean =>\n isVersion(version1) && isVersion(version2) && eq(version1, version2);\n\nfunction matches(version: string, range: string): boolean {\n if (!isVersion(version)) {\n return false;\n }\n if (isVersion(range)) {\n return equals(version, range);\n }\n return isValid(range) && satisfies(version, range, { prereleases: true });\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isSingleVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions,\n isLessThanRange,\n};\n\nexport default api;\n"]}
@@ -4,4 +4,5 @@ import type { BranchConfig, SelectAllConfig } from '../types';
4
4
  import type { ConfigMigrationResult } from './config-migration';
5
5
  export declare function readDashboardBody(config: SelectAllConfig): Promise<void>;
6
6
  export declare function ensureDependencyDashboard(config: SelectAllConfig, allBranches: BranchConfig[], packageFiles: Record<string, PackageFile[]> | undefined, configMigrationRes: ConfigMigrationResult): Promise<void>;
7
+ export declare function getAbandonedPackagesMd(packageFiles: Record<string, PackageFile[]>): string;
7
8
  export declare function getDashboardMarkdownVulnerabilities(config: RenovateConfig, packageFiles: Record<string, PackageFile[]>): Promise<string>;
@@ -2,12 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.readDashboardBody = readDashboardBody;
4
4
  exports.ensureDependencyDashboard = ensureDependencyDashboard;
5
+ exports.getAbandonedPackagesMd = getAbandonedPackagesMd;
5
6
  exports.getDashboardMarkdownVulnerabilities = getDashboardMarkdownVulnerabilities;
6
7
  const tslib_1 = require("tslib");
7
8
  const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
9
+ const luxon_1 = require("luxon");
8
10
  const global_1 = require("../../config/global");
9
11
  const logger_1 = require("../../logger");
10
12
  const platform_1 = require("../../modules/platform");
13
+ const array_1 = require("../../util/array");
11
14
  const regex_1 = require("../../util/regex");
12
15
  const string_1 = require("../../util/string");
13
16
  const template = tslib_1.__importStar(require("../../util/template"));
@@ -245,6 +248,9 @@ async function ensureDependencyDashboard(config, allBranches, packageFiles = {},
245
248
  }
246
249
  issueBody += '\n';
247
250
  }
251
+ if (config.dependencyDashboardReportAbandonment) {
252
+ issueBody += getAbandonedPackagesMd(packageFiles);
253
+ }
248
254
  const pendingApprovals = branches.filter((branch) => branch.result === 'needs-approval');
249
255
  if (pendingApprovals.length) {
250
256
  issueBody += '## Pending Approval\n\n';
@@ -434,6 +440,47 @@ async function ensureDependencyDashboard(config, allBranches, packageFiles = {},
434
440
  });
435
441
  }
436
442
  }
443
+ function getAbandonedPackagesMd(packageFiles) {
444
+ const abandonedPackages = {};
445
+ let abandonedCount = 0;
446
+ for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {
447
+ for (const packageFile of managerPackageFiles) {
448
+ for (const dep of (0, array_1.coerceArray)(packageFile.deps)) {
449
+ if (dep.depName && dep.isAbandoned) {
450
+ abandonedCount++;
451
+ abandonedPackages[manager] = abandonedPackages[manager] || {};
452
+ abandonedPackages[manager][dep.depName] = dep.mostRecentTimestamp;
453
+ }
454
+ }
455
+ }
456
+ }
457
+ if (abandonedCount === 0) {
458
+ return '';
459
+ }
460
+ let abandonedMd = '> ℹ **Note**\n> \n';
461
+ abandonedMd +=
462
+ 'These dependencies have not received updates for an extended period and may be unmaintained:\n\n';
463
+ abandonedMd += '<details>\n';
464
+ abandonedMd += `<summary>View abandoned dependencies (${abandonedCount})</summary>\n\n`;
465
+ abandonedMd += '| Datasource | Name | Last Updated |\n';
466
+ abandonedMd += '|------------|------|-------------|\n';
467
+ for (const manager of Object.keys(abandonedPackages).sort()) {
468
+ const deps = abandonedPackages[manager];
469
+ for (const depName of Object.keys(deps).sort()) {
470
+ const mostRecentTimestamp = deps[depName];
471
+ const formattedDate = mostRecentTimestamp
472
+ ? luxon_1.DateTime.fromISO(mostRecentTimestamp).toFormat('yyyy-MM-dd')
473
+ : 'unknown';
474
+ abandonedMd += `| ${manager} | \`${depName}\` | \`${formattedDate}\` |\n`;
475
+ }
476
+ }
477
+ abandonedMd += '\n</details>\n\n';
478
+ abandonedMd +=
479
+ 'Packages are marked as abandoned when they exceed the [`abandonmentThreshold`](https://docs.renovatebot.com/configuration-options/#abandonmentthreshold) since their last release.\n';
480
+ abandonedMd +=
481
+ 'Unlike deprecated packages with official notices, abandonment is detected by release inactivity.\n\n';
482
+ return abandonedMd + '\n';
483
+ }
437
484
  function getFooter(config) {
438
485
  let footer = '';
439
486
  if (config.dependencyDashboardFooter?.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"dependency-dashboard.js","sourceRoot":"","sources":["../../../lib/workers/repository/dependency-dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { GlobalConfig } from '../../config/global';\nimport type { RenovateConfig } from '../../config/types';\nimport { logger } from '../../logger';\nimport type { PackageFile } from '../../modules/manager/types';\nimport { platform } from '../../modules/platform';\nimport { regEx } from '../../util/regex';\nimport { coerceString } from '../../util/string';\nimport * as template from '../../util/template';\nimport type { BranchConfig, SelectAllConfig } from '../types';\nimport { extractRepoProblems } from './common';\nimport type { ConfigMigrationResult } from './config-migration';\nimport { getDepWarningsDashboard } from './errors-warnings';\nimport { PackageFiles } from './package-files';\nimport type { Vulnerability } from './process/types';\nimport { Vulnerabilities } from './process/vulnerabilities';\n\ninterface DependencyDashboard {\n dependencyDashboardChecks: Record<string, string>;\n dependencyDashboardRebaseAllOpen: boolean;\n dependencyDashboardAllPending: boolean;\n dependencyDashboardAllRateLimited: boolean;\n}\n\nconst rateLimitedRe = regEx(\n ' - \\\\[ \\\\] <!-- unlimit-branch=([^\\\\s]+) -->',\n 'g',\n);\nconst pendingApprovalRe = regEx(\n ' - \\\\[ \\\\] <!-- approve-branch=([^\\\\s]+) -->',\n 'g',\n);\nconst generalBranchRe = regEx(' <!-- ([a-zA-Z]+)-branch=([^\\\\s]+) -->');\nconst markedBranchesRe = regEx(\n ' - \\\\[x\\\\] <!-- ([a-zA-Z]+)-branch=([^\\\\s]+) -->',\n 'g',\n);\n\nfunction checkOpenAllRateLimitedPR(issueBody: string): boolean {\n return issueBody.includes(' - [x] <!-- create-all-rate-limited-prs -->');\n}\n\nfunction checkApproveAllPendingPR(issueBody: string): boolean {\n return issueBody.includes(' - [x] <!-- approve-all-pending-prs -->');\n}\n\nfunction checkRebaseAll(issueBody: string): boolean {\n return issueBody.includes(' - [x] <!-- rebase-all-open-prs -->');\n}\n\nfunction getConfigMigrationCheckboxState(\n issueBody: string,\n): 'no-checkbox' | 'checked' | 'unchecked' | 'migration-pr-exists' {\n if (issueBody.includes('<!-- config-migration-pr-info -->')) {\n return 'migration-pr-exists';\n }\n\n if (issueBody.includes(' - [x] <!-- create-config-migration-pr -->')) {\n return 'checked';\n }\n\n if (issueBody.includes(' - [ ] <!-- create-config-migration-pr -->')) {\n return 'unchecked';\n }\n\n return 'no-checkbox';\n}\n\nfunction selectAllRelevantBranches(issueBody: string): string[] {\n const checkedBranches = [];\n if (checkOpenAllRateLimitedPR(issueBody)) {\n for (const match of issueBody.matchAll(rateLimitedRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkApproveAllPendingPR(issueBody)) {\n for (const match of issueBody.matchAll(pendingApprovalRe)) {\n checkedBranches.push(match[0]);\n }\n }\n return checkedBranches;\n}\n\nfunction getAllSelectedBranches(\n issueBody: string,\n dependencyDashboardChecks: Record<string, string>,\n): Record<string, string> {\n const allRelevantBranches = selectAllRelevantBranches(issueBody);\n for (const branch of allRelevantBranches) {\n const [, type, branchName] = generalBranchRe.exec(branch)!;\n dependencyDashboardChecks[branchName] = type;\n }\n return dependencyDashboardChecks;\n}\n\nfunction getCheckedBranches(issueBody: string): Record<string, string> {\n let dependencyDashboardChecks: Record<string, string> = {};\n for (const [, type, branchName] of issueBody.matchAll(markedBranchesRe)) {\n dependencyDashboardChecks[branchName] = type;\n }\n dependencyDashboardChecks = getAllSelectedBranches(\n issueBody,\n dependencyDashboardChecks,\n );\n return dependencyDashboardChecks;\n}\n\nfunction parseDashboardIssue(issueBody: string): DependencyDashboard {\n const dependencyDashboardChecks = getCheckedBranches(issueBody);\n const dependencyDashboardRebaseAllOpen = checkRebaseAll(issueBody);\n const dependencyDashboardAllPending = checkApproveAllPendingPR(issueBody);\n const dependencyDashboardAllRateLimited =\n checkOpenAllRateLimitedPR(issueBody);\n dependencyDashboardChecks.configMigrationCheckboxState =\n getConfigMigrationCheckboxState(issueBody);\n return {\n dependencyDashboardChecks,\n dependencyDashboardRebaseAllOpen,\n dependencyDashboardAllPending,\n dependencyDashboardAllRateLimited,\n };\n}\n\nexport async function readDashboardBody(\n config: SelectAllConfig,\n): Promise<void> {\n let dashboardChecks: DependencyDashboard = {\n dependencyDashboardChecks: {},\n dependencyDashboardAllPending: false,\n dependencyDashboardRebaseAllOpen: false,\n dependencyDashboardAllRateLimited: false,\n };\n const stringifiedConfig = JSON.stringify(config);\n if (\n config.dependencyDashboard === true ||\n stringifiedConfig.includes('\"dependencyDashboardApproval\":true') ||\n stringifiedConfig.includes('\"prCreation\":\"approval\"')\n ) {\n config.dependencyDashboardTitle =\n config.dependencyDashboardTitle ?? `Dependency Dashboard`;\n const issue = await platform.findIssue(config.dependencyDashboardTitle);\n if (issue) {\n config.dependencyDashboardIssue = issue.number;\n dashboardChecks = parseDashboardIssue(issue.body ?? '');\n }\n }\n\n if (config.checkedBranches) {\n const checkedBranchesRec: Record<string, string> = Object.fromEntries(\n config.checkedBranches.map((branchName) => [branchName, 'global-config']),\n );\n dashboardChecks.dependencyDashboardChecks = {\n ...dashboardChecks.dependencyDashboardChecks,\n ...checkedBranchesRec,\n };\n }\n\n Object.assign(config, dashboardChecks);\n}\n\nfunction getListItem(branch: BranchConfig, type: string): string {\n let item = ' - [ ] ';\n item += `<!-- ${type}-branch=${branch.branchName} -->`;\n if (branch.prNo) {\n // TODO: types (#22198)\n item += `[${branch.prTitle!}](../pull/${branch.prNo})`;\n } else {\n item += branch.prTitle;\n }\n const uniquePackages = [\n // TODO: types (#22198)\n ...new Set(branch.upgrades.map((upgrade) => `\\`${upgrade.depName!}\\``)),\n ];\n if (uniquePackages.length < 2) {\n return item + '\\n';\n }\n return item + ' (' + uniquePackages.join(', ') + ')\\n';\n}\n\nfunction appendRepoProblems(config: RenovateConfig, issueBody: string): string {\n let newIssueBody = issueBody;\n const repoProblems = extractRepoProblems(config.repository);\n if (repoProblems.size) {\n newIssueBody += '## Repository problems\\n\\n';\n const repoProblemsHeader =\n config.customizeDashboard?.repoProblemsHeader ??\n 'Renovate tried to run on this repository, but found these problems.';\n newIssueBody += template.compile(repoProblemsHeader, config) + '\\n\\n';\n\n for (const repoProblem of repoProblems) {\n newIssueBody += ` - ${repoProblem}\\n`;\n }\n newIssueBody += '\\n';\n }\n return newIssueBody;\n}\n\nexport async function ensureDependencyDashboard(\n config: SelectAllConfig,\n allBranches: BranchConfig[],\n packageFiles: Record<string, PackageFile[]> = {},\n configMigrationRes: ConfigMigrationResult,\n): Promise<void> {\n logger.debug('ensureDependencyDashboard()');\n if (config.mode === 'silent') {\n logger.debug(\n 'Dependency Dashboard issue is not created, updated or closed when mode=silent',\n );\n return;\n }\n // legacy/migrated issue\n const reuseTitle = 'Update Dependencies (Renovate Bot)';\n const branches = allBranches.filter(\n (branch) =>\n branch.result !== 'automerged' &&\n !branch.upgrades?.every((upgrade) => upgrade.remediationNotPossible),\n );\n if (\n !(\n config.dependencyDashboard === true ||\n config.dependencyDashboardApproval === true ||\n config.packageRules?.some((rule) => rule.dependencyDashboardApproval) ===\n true ||\n branches.some(\n (branch) =>\n !!branch.dependencyDashboardApproval ||\n !!branch.dependencyDashboardPrApproval,\n )\n )\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n // istanbul ignore if\n if (config.repoIsOnboarded === false) {\n logger.debug('Repo is onboarding - skipping dependency dashboard');\n return;\n }\n logger.debug('Ensuring Dependency Dashboard');\n\n // Check packageFiles for any deprecations\n let hasDeprecations = false;\n const deprecatedPackages: Record<string, Record<string, boolean>> = {};\n logger.debug('Checking packageFiles for deprecated packages');\n if (is.nonEmptyObject(packageFiles)) {\n for (const [manager, fileNames] of Object.entries(packageFiles)) {\n for (const fileName of fileNames) {\n for (const dep of fileName.deps) {\n const name = dep.packageName ?? dep.depName;\n const hasReplacement = !!dep.updates?.find(\n (updates) => updates.updateType === 'replacement',\n );\n if (name && (dep.deprecationMessage ?? hasReplacement)) {\n hasDeprecations = true;\n deprecatedPackages[manager] ??= {};\n deprecatedPackages[manager][name] ??= hasReplacement;\n }\n }\n }\n }\n }\n\n const hasBranches = is.nonEmptyArray(branches);\n if (config.dependencyDashboardAutoclose && !hasBranches && !hasDeprecations) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n let issueBody = '';\n\n if (config.dependencyDashboardHeader?.length) {\n issueBody +=\n template.compile(config.dependencyDashboardHeader, config) + '\\n\\n';\n }\n\n if (configMigrationRes.result === 'pr-exists') {\n issueBody +=\n '## Config Migration Needed\\n\\n' +\n `<!-- config-migration-pr-info --> See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'pr-modified') {\n issueBody +=\n '## Config Migration Needed (error)\\n\\n' +\n `<!-- config-migration-pr-info --> The Config Migration branch exists but has been modified by another user. Renovate will not push to this branch unless it is first deleted. \\n\\n See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'add-checkbox') {\n issueBody +=\n '## Config Migration Needed\\n\\n' +\n ' - [ ] <!-- create-config-migration-pr --> Select this checkbox to let Renovate create an automated Config Migration PR.' +\n '\\n\\n';\n }\n\n issueBody = appendRepoProblems(config, issueBody);\n\n if (hasDeprecations) {\n issueBody += '> ⚠ **Warning**\\n> \\n';\n issueBody += 'These dependencies are deprecated:\\n\\n';\n issueBody += '| Datasource | Name | Replacement PR? |\\n';\n issueBody += '|------------|------|--------------|\\n';\n for (const manager of Object.keys(deprecatedPackages).sort()) {\n const deps = deprecatedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const hasReplacement = deps[depName];\n issueBody += `| ${manager} | \\`${depName}\\` | ${\n hasReplacement\n ? '![Available](https://img.shields.io/badge/available-green?style=flat-square)'\n : '![Unavailable](https://img.shields.io/badge/unavailable-orange?style=flat-square)'\n } |\\n`;\n }\n }\n issueBody += '\\n';\n }\n\n const pendingApprovals = branches.filter(\n (branch) => branch.result === 'needs-approval',\n );\n if (pendingApprovals.length) {\n issueBody += '## Pending Approval\\n\\n';\n issueBody += `These branches will be created by Renovate only once you click their checkbox below.\\n\\n`;\n for (const branch of pendingApprovals) {\n issueBody += getListItem(branch, 'approve');\n }\n if (pendingApprovals.length > 1) {\n issueBody += ' - [ ] ';\n issueBody += '<!-- approve-all-pending-prs -->';\n issueBody += '🔐 **Create all pending approval PRs at once** 🔐\\n';\n }\n issueBody += '\\n';\n }\n const awaitingSchedule = branches.filter(\n (branch) => branch.result === 'not-scheduled',\n );\n if (awaitingSchedule.length) {\n issueBody += '## Awaiting Schedule\\n\\n';\n issueBody +=\n 'These updates are awaiting their schedule. Click on a checkbox to get an update now.\\n\\n';\n for (const branch of awaitingSchedule) {\n issueBody += getListItem(branch, 'unschedule');\n }\n issueBody += '\\n';\n }\n const rateLimited = branches.filter(\n (branch) =>\n branch.result === 'branch-limit-reached' ||\n branch.result === 'pr-limit-reached' ||\n branch.result === 'commit-limit-reached',\n );\n if (rateLimited.length) {\n issueBody += '## Rate-Limited\\n\\n';\n issueBody +=\n 'These updates are currently rate-limited. Click on a checkbox below to force their creation now.\\n\\n';\n for (const branch of rateLimited) {\n issueBody += getListItem(branch, 'unlimit');\n }\n if (rateLimited.length > 1) {\n issueBody += ' - [ ] ';\n issueBody += '<!-- create-all-rate-limited-prs -->';\n issueBody += '🔐 **Create all rate-limited PRs at once** 🔐\\n';\n }\n issueBody += '\\n';\n }\n const errorList = branches.filter((branch) => branch.result === 'error');\n if (errorList.length) {\n issueBody += '## Errored\\n\\n';\n issueBody +=\n 'These updates encountered an error and will be retried. Click on a checkbox below to force a retry now.\\n\\n';\n for (const branch of errorList) {\n issueBody += getListItem(branch, 'retry');\n }\n issueBody += '\\n';\n }\n const awaitingPr = branches.filter(\n (branch) => branch.result === 'needs-pr-approval',\n );\n if (awaitingPr.length) {\n issueBody += '## PR Creation Approval Required\\n\\n';\n issueBody +=\n \"These branches exist but PRs won't be created until you approve them by clicking on a checkbox.\\n\\n\";\n for (const branch of awaitingPr) {\n issueBody += getListItem(branch, 'approvePr');\n }\n issueBody += '\\n';\n }\n const prEdited = branches.filter((branch) => branch.result === 'pr-edited');\n if (prEdited.length) {\n issueBody += '## Edited/Blocked\\n\\n';\n issueBody += `These updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox.\\n\\n`;\n for (const branch of prEdited) {\n issueBody += getListItem(branch, 'rebase');\n }\n issueBody += '\\n';\n }\n const prPending = branches.filter((branch) => branch.result === 'pending');\n if (prPending.length) {\n issueBody += '## Pending Status Checks\\n\\n';\n issueBody += `These updates await pending status checks. To force their creation now, click the checkbox below.\\n\\n`;\n for (const branch of prPending) {\n issueBody += getListItem(branch, 'approvePr');\n }\n issueBody += '\\n';\n }\n const prPendingBranchAutomerge = branches.filter(\n (branch) => branch.prBlockedBy === 'BranchAutomerge',\n );\n if (prPendingBranchAutomerge.length) {\n issueBody += '## Pending Branch Automerge\\n\\n';\n issueBody += `These updates await pending status checks before automerging. Click on a checkbox to abort the branch automerge, and create a PR instead.\\n\\n`;\n for (const branch of prPendingBranchAutomerge) {\n issueBody += getListItem(branch, 'approvePr');\n }\n issueBody += '\\n';\n }\n\n const warn = getDepWarningsDashboard(packageFiles, config);\n if (warn) {\n issueBody += warn;\n issueBody += '\\n';\n }\n\n const otherRes = [\n 'pending',\n 'needs-approval',\n 'needs-pr-approval',\n 'not-scheduled',\n 'pr-limit-reached',\n 'commit-limit-reached',\n 'branch-limit-reached',\n 'already-existed',\n 'error',\n 'automerged',\n 'pr-edited',\n ];\n let inProgress = branches.filter(\n (branch) =>\n !otherRes.includes(branch.result!) &&\n branch.prBlockedBy !== 'BranchAutomerge',\n );\n const otherBranches = inProgress.filter(\n (branch) => !!branch.prBlockedBy || !branch.prNo,\n );\n // istanbul ignore if\n if (otherBranches.length) {\n issueBody += '## Other Branches\\n\\n';\n issueBody += `These updates are pending. To force PRs open, click the checkbox below.\\n\\n`;\n for (const branch of otherBranches) {\n issueBody += getListItem(branch, 'other');\n }\n issueBody += '\\n';\n }\n inProgress = inProgress.filter(\n (branch) => branch.prNo && !branch.prBlockedBy,\n );\n if (inProgress.length) {\n issueBody += '## Open\\n\\n';\n issueBody +=\n 'These updates have all been created already. Click a checkbox below to force a retry/rebase of any.\\n\\n';\n for (const branch of inProgress) {\n issueBody += getListItem(branch, 'rebase');\n }\n if (inProgress.length > 2) {\n issueBody += ' - [ ] ';\n issueBody += '<!-- rebase-all-open-prs -->';\n issueBody += '**Click on this checkbox to rebase all open PRs at once**';\n issueBody += '\\n';\n }\n issueBody += '\\n';\n }\n const alreadyExisted = branches.filter(\n (branch) => branch.result === 'already-existed',\n );\n if (alreadyExisted.length) {\n issueBody += '## Ignored or Blocked\\n\\n';\n issueBody +=\n 'These are blocked by an existing closed PR and will not be recreated unless you click a checkbox below.\\n\\n';\n for (const branch of alreadyExisted) {\n issueBody += getListItem(branch, 'recreate');\n }\n issueBody += '\\n';\n }\n\n if (!hasBranches) {\n issueBody +=\n 'This repository currently has no open or pending branches.\\n\\n';\n }\n\n // add CVE section\n issueBody += await getDashboardMarkdownVulnerabilities(config, packageFiles);\n\n // fit the detected dependencies section\n const footer = getFooter(config);\n issueBody += PackageFiles.getDashboardMarkdown(\n platform.maxBodyLength() - issueBody.length - footer.length,\n );\n\n issueBody += footer;\n\n if (config.dependencyDashboardIssue) {\n // If we're not changing the dashboard issue then we can skip checking if the user changed it\n // The cached issue we get back here will reflect its state at the _start_ of our run\n const cachedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n );\n if (cachedIssue?.body === issueBody) {\n logger.debug('No changes to dependency dashboard issue needed');\n return;\n }\n\n // Skip cache when getting the issue to ensure we get the latest body,\n // including any updates the user made after we started the run\n const updatedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n false,\n );\n if (updatedIssue) {\n const { dependencyDashboardChecks } = parseDashboardIssue(\n coerceString(updatedIssue.body),\n );\n for (const branchName of Object.keys(config.dependencyDashboardChecks!)) {\n delete dependencyDashboardChecks[branchName];\n }\n for (const branchName of Object.keys(dependencyDashboardChecks)) {\n const checkText = `- [ ] <!-- ${dependencyDashboardChecks[branchName]}-branch=${branchName} -->`;\n issueBody = issueBody.replace(\n checkText,\n checkText.replace('[ ]', '[x]'),\n );\n }\n }\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would ensure Dependency Dashboard',\n );\n } else {\n await platform.ensureIssue({\n title: config.dependencyDashboardTitle!,\n reuseTitle,\n body: platform.massageMarkdown(issueBody),\n labels: config.dependencyDashboardLabels,\n confidential: config.confidential,\n });\n }\n}\n\nfunction getFooter(config: RenovateConfig): string {\n let footer = '';\n if (config.dependencyDashboardFooter?.length) {\n footer +=\n '---\\n' +\n template.compile(config.dependencyDashboardFooter, config) +\n '\\n';\n }\n\n return footer;\n}\n\nexport async function getDashboardMarkdownVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<string> {\n let result = '';\n\n if (\n is.nullOrUndefined(config.dependencyDashboardOSVVulnerabilitySummary) ||\n config.dependencyDashboardOSVVulnerabilitySummary === 'none'\n ) {\n return result;\n }\n\n result += '## Vulnerabilities\\n\\n';\n\n const vulnerabilityFetcher = await Vulnerabilities.create();\n const vulnerabilities = await vulnerabilityFetcher.fetchVulnerabilities(\n config,\n packageFiles,\n );\n\n if (vulnerabilities.length === 0) {\n result +=\n 'Renovate has not found any CVEs on [osv.dev](https://osv.dev).\\n\\n';\n return result;\n }\n\n const unresolvedVulnerabilities = vulnerabilities.filter((value) =>\n is.nullOrUndefined(value.fixedVersion),\n );\n const resolvedVulnerabilitiesLength =\n vulnerabilities.length - unresolvedVulnerabilities.length;\n\n result += `\\`${resolvedVulnerabilitiesLength}\\`/\\`${vulnerabilities.length}\\``;\n if (is.truthy(config.osvVulnerabilityAlerts)) {\n result += ' CVEs have Renovate fixes.\\n';\n } else {\n result +=\n ' CVEs have possible Renovate fixes.\\nSee [`osvVulnerabilityAlerts`](https://docs.renovatebot.com/configuration-options/#osvvulnerabilityalerts) to allow Renovate to supply fixes.\\n';\n }\n\n let renderedVulnerabilities: Vulnerability[];\n switch (config.dependencyDashboardOSVVulnerabilitySummary) {\n // filter vulnerabilities to display based on configuration\n case 'unresolved':\n renderedVulnerabilities = unresolvedVulnerabilities;\n break;\n default:\n renderedVulnerabilities = vulnerabilities;\n }\n\n const managerRecords: Record<\n string,\n Record<string, Record<string, Vulnerability[]>>\n > = {};\n for (const vulnerability of renderedVulnerabilities) {\n const { manager, packageFile } = vulnerability.packageFileConfig;\n if (is.nullOrUndefined(managerRecords[manager!])) {\n managerRecords[manager!] = {};\n }\n if (is.nullOrUndefined(managerRecords[manager!][packageFile])) {\n managerRecords[manager!][packageFile] = {};\n }\n if (\n is.nullOrUndefined(\n managerRecords[manager!][packageFile][vulnerability.packageName],\n )\n ) {\n managerRecords[manager!][packageFile][vulnerability.packageName] = [];\n }\n managerRecords[manager!][packageFile][vulnerability.packageName].push(\n vulnerability,\n );\n }\n\n for (const [manager, packageFileRecords] of Object.entries(managerRecords)) {\n result += `<details><summary>${manager}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageFile, packageNameRecords] of Object.entries(\n packageFileRecords,\n )) {\n result += `<details><summary>${packageFile}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageName, cves] of Object.entries(packageNameRecords)) {\n result += `<details><summary>${packageName}</summary>\\n<blockquote>\\n\\n`;\n for (const vul of cves) {\n const id = vul.vulnerability.id;\n const suffix = is.nonEmptyString(vul.fixedVersion)\n ? ` (fixed in ${vul.fixedVersion})`\n : '';\n result += `- [${id}](https://osv.dev/vulnerability/${id})${suffix}\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n\n return result;\n}\n"]}
1
+ {"version":3,"file":"dependency-dashboard.js","sourceRoot":"","sources":["../../../lib/workers/repository/dependency-dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../config/global';\nimport type { RenovateConfig } from '../../config/types';\nimport { logger } from '../../logger';\nimport type { PackageFile } from '../../modules/manager/types';\nimport { platform } from '../../modules/platform';\nimport { coerceArray } from '../../util/array';\nimport { regEx } from '../../util/regex';\nimport { coerceString } from '../../util/string';\nimport * as template from '../../util/template';\nimport type { BranchConfig, SelectAllConfig } from '../types';\nimport { extractRepoProblems } from './common';\nimport type { ConfigMigrationResult } from './config-migration';\nimport { getDepWarningsDashboard } from './errors-warnings';\nimport { PackageFiles } from './package-files';\nimport type { Vulnerability } from './process/types';\nimport { Vulnerabilities } from './process/vulnerabilities';\n\ninterface DependencyDashboard {\n dependencyDashboardChecks: Record<string, string>;\n dependencyDashboardRebaseAllOpen: boolean;\n dependencyDashboardAllPending: boolean;\n dependencyDashboardAllRateLimited: boolean;\n}\n\nconst rateLimitedRe = regEx(\n ' - \\\\[ \\\\] <!-- unlimit-branch=([^\\\\s]+) -->',\n 'g',\n);\nconst pendingApprovalRe = regEx(\n ' - \\\\[ \\\\] <!-- approve-branch=([^\\\\s]+) -->',\n 'g',\n);\nconst generalBranchRe = regEx(' <!-- ([a-zA-Z]+)-branch=([^\\\\s]+) -->');\nconst markedBranchesRe = regEx(\n ' - \\\\[x\\\\] <!-- ([a-zA-Z]+)-branch=([^\\\\s]+) -->',\n 'g',\n);\n\nfunction checkOpenAllRateLimitedPR(issueBody: string): boolean {\n return issueBody.includes(' - [x] <!-- create-all-rate-limited-prs -->');\n}\n\nfunction checkApproveAllPendingPR(issueBody: string): boolean {\n return issueBody.includes(' - [x] <!-- approve-all-pending-prs -->');\n}\n\nfunction checkRebaseAll(issueBody: string): boolean {\n return issueBody.includes(' - [x] <!-- rebase-all-open-prs -->');\n}\n\nfunction getConfigMigrationCheckboxState(\n issueBody: string,\n): 'no-checkbox' | 'checked' | 'unchecked' | 'migration-pr-exists' {\n if (issueBody.includes('<!-- config-migration-pr-info -->')) {\n return 'migration-pr-exists';\n }\n\n if (issueBody.includes(' - [x] <!-- create-config-migration-pr -->')) {\n return 'checked';\n }\n\n if (issueBody.includes(' - [ ] <!-- create-config-migration-pr -->')) {\n return 'unchecked';\n }\n\n return 'no-checkbox';\n}\n\nfunction selectAllRelevantBranches(issueBody: string): string[] {\n const checkedBranches = [];\n if (checkOpenAllRateLimitedPR(issueBody)) {\n for (const match of issueBody.matchAll(rateLimitedRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkApproveAllPendingPR(issueBody)) {\n for (const match of issueBody.matchAll(pendingApprovalRe)) {\n checkedBranches.push(match[0]);\n }\n }\n return checkedBranches;\n}\n\nfunction getAllSelectedBranches(\n issueBody: string,\n dependencyDashboardChecks: Record<string, string>,\n): Record<string, string> {\n const allRelevantBranches = selectAllRelevantBranches(issueBody);\n for (const branch of allRelevantBranches) {\n const [, type, branchName] = generalBranchRe.exec(branch)!;\n dependencyDashboardChecks[branchName] = type;\n }\n return dependencyDashboardChecks;\n}\n\nfunction getCheckedBranches(issueBody: string): Record<string, string> {\n let dependencyDashboardChecks: Record<string, string> = {};\n for (const [, type, branchName] of issueBody.matchAll(markedBranchesRe)) {\n dependencyDashboardChecks[branchName] = type;\n }\n dependencyDashboardChecks = getAllSelectedBranches(\n issueBody,\n dependencyDashboardChecks,\n );\n return dependencyDashboardChecks;\n}\n\nfunction parseDashboardIssue(issueBody: string): DependencyDashboard {\n const dependencyDashboardChecks = getCheckedBranches(issueBody);\n const dependencyDashboardRebaseAllOpen = checkRebaseAll(issueBody);\n const dependencyDashboardAllPending = checkApproveAllPendingPR(issueBody);\n const dependencyDashboardAllRateLimited =\n checkOpenAllRateLimitedPR(issueBody);\n dependencyDashboardChecks.configMigrationCheckboxState =\n getConfigMigrationCheckboxState(issueBody);\n return {\n dependencyDashboardChecks,\n dependencyDashboardRebaseAllOpen,\n dependencyDashboardAllPending,\n dependencyDashboardAllRateLimited,\n };\n}\n\nexport async function readDashboardBody(\n config: SelectAllConfig,\n): Promise<void> {\n let dashboardChecks: DependencyDashboard = {\n dependencyDashboardChecks: {},\n dependencyDashboardAllPending: false,\n dependencyDashboardRebaseAllOpen: false,\n dependencyDashboardAllRateLimited: false,\n };\n const stringifiedConfig = JSON.stringify(config);\n if (\n config.dependencyDashboard === true ||\n stringifiedConfig.includes('\"dependencyDashboardApproval\":true') ||\n stringifiedConfig.includes('\"prCreation\":\"approval\"')\n ) {\n config.dependencyDashboardTitle =\n config.dependencyDashboardTitle ?? `Dependency Dashboard`;\n const issue = await platform.findIssue(config.dependencyDashboardTitle);\n if (issue) {\n config.dependencyDashboardIssue = issue.number;\n dashboardChecks = parseDashboardIssue(issue.body ?? '');\n }\n }\n\n if (config.checkedBranches) {\n const checkedBranchesRec: Record<string, string> = Object.fromEntries(\n config.checkedBranches.map((branchName) => [branchName, 'global-config']),\n );\n dashboardChecks.dependencyDashboardChecks = {\n ...dashboardChecks.dependencyDashboardChecks,\n ...checkedBranchesRec,\n };\n }\n\n Object.assign(config, dashboardChecks);\n}\n\nfunction getListItem(branch: BranchConfig, type: string): string {\n let item = ' - [ ] ';\n item += `<!-- ${type}-branch=${branch.branchName} -->`;\n if (branch.prNo) {\n // TODO: types (#22198)\n item += `[${branch.prTitle!}](../pull/${branch.prNo})`;\n } else {\n item += branch.prTitle;\n }\n const uniquePackages = [\n // TODO: types (#22198)\n ...new Set(branch.upgrades.map((upgrade) => `\\`${upgrade.depName!}\\``)),\n ];\n if (uniquePackages.length < 2) {\n return item + '\\n';\n }\n return item + ' (' + uniquePackages.join(', ') + ')\\n';\n}\n\nfunction appendRepoProblems(config: RenovateConfig, issueBody: string): string {\n let newIssueBody = issueBody;\n const repoProblems = extractRepoProblems(config.repository);\n if (repoProblems.size) {\n newIssueBody += '## Repository problems\\n\\n';\n const repoProblemsHeader =\n config.customizeDashboard?.repoProblemsHeader ??\n 'Renovate tried to run on this repository, but found these problems.';\n newIssueBody += template.compile(repoProblemsHeader, config) + '\\n\\n';\n\n for (const repoProblem of repoProblems) {\n newIssueBody += ` - ${repoProblem}\\n`;\n }\n newIssueBody += '\\n';\n }\n return newIssueBody;\n}\n\nexport async function ensureDependencyDashboard(\n config: SelectAllConfig,\n allBranches: BranchConfig[],\n packageFiles: Record<string, PackageFile[]> = {},\n configMigrationRes: ConfigMigrationResult,\n): Promise<void> {\n logger.debug('ensureDependencyDashboard()');\n if (config.mode === 'silent') {\n logger.debug(\n 'Dependency Dashboard issue is not created, updated or closed when mode=silent',\n );\n return;\n }\n // legacy/migrated issue\n const reuseTitle = 'Update Dependencies (Renovate Bot)';\n const branches = allBranches.filter(\n (branch) =>\n branch.result !== 'automerged' &&\n !branch.upgrades?.every((upgrade) => upgrade.remediationNotPossible),\n );\n if (\n !(\n config.dependencyDashboard === true ||\n config.dependencyDashboardApproval === true ||\n config.packageRules?.some((rule) => rule.dependencyDashboardApproval) ===\n true ||\n branches.some(\n (branch) =>\n !!branch.dependencyDashboardApproval ||\n !!branch.dependencyDashboardPrApproval,\n )\n )\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n // istanbul ignore if\n if (config.repoIsOnboarded === false) {\n logger.debug('Repo is onboarding - skipping dependency dashboard');\n return;\n }\n logger.debug('Ensuring Dependency Dashboard');\n\n // Check packageFiles for any deprecations\n let hasDeprecations = false;\n const deprecatedPackages: Record<string, Record<string, boolean>> = {};\n logger.debug('Checking packageFiles for deprecated packages');\n if (is.nonEmptyObject(packageFiles)) {\n for (const [manager, fileNames] of Object.entries(packageFiles)) {\n for (const fileName of fileNames) {\n for (const dep of fileName.deps) {\n const name = dep.packageName ?? dep.depName;\n const hasReplacement = !!dep.updates?.find(\n (updates) => updates.updateType === 'replacement',\n );\n if (name && (dep.deprecationMessage ?? hasReplacement)) {\n hasDeprecations = true;\n deprecatedPackages[manager] ??= {};\n deprecatedPackages[manager][name] ??= hasReplacement;\n }\n }\n }\n }\n }\n\n const hasBranches = is.nonEmptyArray(branches);\n if (config.dependencyDashboardAutoclose && !hasBranches && !hasDeprecations) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n let issueBody = '';\n\n if (config.dependencyDashboardHeader?.length) {\n issueBody +=\n template.compile(config.dependencyDashboardHeader, config) + '\\n\\n';\n }\n\n if (configMigrationRes.result === 'pr-exists') {\n issueBody +=\n '## Config Migration Needed\\n\\n' +\n `<!-- config-migration-pr-info --> See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'pr-modified') {\n issueBody +=\n '## Config Migration Needed (error)\\n\\n' +\n `<!-- config-migration-pr-info --> The Config Migration branch exists but has been modified by another user. Renovate will not push to this branch unless it is first deleted. \\n\\n See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'add-checkbox') {\n issueBody +=\n '## Config Migration Needed\\n\\n' +\n ' - [ ] <!-- create-config-migration-pr --> Select this checkbox to let Renovate create an automated Config Migration PR.' +\n '\\n\\n';\n }\n\n issueBody = appendRepoProblems(config, issueBody);\n\n if (hasDeprecations) {\n issueBody += '> ⚠ **Warning**\\n> \\n';\n issueBody += 'These dependencies are deprecated:\\n\\n';\n issueBody += '| Datasource | Name | Replacement PR? |\\n';\n issueBody += '|------------|------|--------------|\\n';\n for (const manager of Object.keys(deprecatedPackages).sort()) {\n const deps = deprecatedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const hasReplacement = deps[depName];\n issueBody += `| ${manager} | \\`${depName}\\` | ${\n hasReplacement\n ? '![Available](https://img.shields.io/badge/available-green?style=flat-square)'\n : '![Unavailable](https://img.shields.io/badge/unavailable-orange?style=flat-square)'\n } |\\n`;\n }\n }\n issueBody += '\\n';\n }\n\n if (config.dependencyDashboardReportAbandonment) {\n issueBody += getAbandonedPackagesMd(packageFiles);\n }\n\n const pendingApprovals = branches.filter(\n (branch) => branch.result === 'needs-approval',\n );\n if (pendingApprovals.length) {\n issueBody += '## Pending Approval\\n\\n';\n issueBody += `These branches will be created by Renovate only once you click their checkbox below.\\n\\n`;\n for (const branch of pendingApprovals) {\n issueBody += getListItem(branch, 'approve');\n }\n if (pendingApprovals.length > 1) {\n issueBody += ' - [ ] ';\n issueBody += '<!-- approve-all-pending-prs -->';\n issueBody += '🔐 **Create all pending approval PRs at once** 🔐\\n';\n }\n issueBody += '\\n';\n }\n const awaitingSchedule = branches.filter(\n (branch) => branch.result === 'not-scheduled',\n );\n if (awaitingSchedule.length) {\n issueBody += '## Awaiting Schedule\\n\\n';\n issueBody +=\n 'These updates are awaiting their schedule. Click on a checkbox to get an update now.\\n\\n';\n for (const branch of awaitingSchedule) {\n issueBody += getListItem(branch, 'unschedule');\n }\n issueBody += '\\n';\n }\n const rateLimited = branches.filter(\n (branch) =>\n branch.result === 'branch-limit-reached' ||\n branch.result === 'pr-limit-reached' ||\n branch.result === 'commit-limit-reached',\n );\n if (rateLimited.length) {\n issueBody += '## Rate-Limited\\n\\n';\n issueBody +=\n 'These updates are currently rate-limited. Click on a checkbox below to force their creation now.\\n\\n';\n for (const branch of rateLimited) {\n issueBody += getListItem(branch, 'unlimit');\n }\n if (rateLimited.length > 1) {\n issueBody += ' - [ ] ';\n issueBody += '<!-- create-all-rate-limited-prs -->';\n issueBody += '🔐 **Create all rate-limited PRs at once** 🔐\\n';\n }\n issueBody += '\\n';\n }\n const errorList = branches.filter((branch) => branch.result === 'error');\n if (errorList.length) {\n issueBody += '## Errored\\n\\n';\n issueBody +=\n 'These updates encountered an error and will be retried. Click on a checkbox below to force a retry now.\\n\\n';\n for (const branch of errorList) {\n issueBody += getListItem(branch, 'retry');\n }\n issueBody += '\\n';\n }\n const awaitingPr = branches.filter(\n (branch) => branch.result === 'needs-pr-approval',\n );\n if (awaitingPr.length) {\n issueBody += '## PR Creation Approval Required\\n\\n';\n issueBody +=\n \"These branches exist but PRs won't be created until you approve them by clicking on a checkbox.\\n\\n\";\n for (const branch of awaitingPr) {\n issueBody += getListItem(branch, 'approvePr');\n }\n issueBody += '\\n';\n }\n const prEdited = branches.filter((branch) => branch.result === 'pr-edited');\n if (prEdited.length) {\n issueBody += '## Edited/Blocked\\n\\n';\n issueBody += `These updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox.\\n\\n`;\n for (const branch of prEdited) {\n issueBody += getListItem(branch, 'rebase');\n }\n issueBody += '\\n';\n }\n const prPending = branches.filter((branch) => branch.result === 'pending');\n if (prPending.length) {\n issueBody += '## Pending Status Checks\\n\\n';\n issueBody += `These updates await pending status checks. To force their creation now, click the checkbox below.\\n\\n`;\n for (const branch of prPending) {\n issueBody += getListItem(branch, 'approvePr');\n }\n issueBody += '\\n';\n }\n const prPendingBranchAutomerge = branches.filter(\n (branch) => branch.prBlockedBy === 'BranchAutomerge',\n );\n if (prPendingBranchAutomerge.length) {\n issueBody += '## Pending Branch Automerge\\n\\n';\n issueBody += `These updates await pending status checks before automerging. Click on a checkbox to abort the branch automerge, and create a PR instead.\\n\\n`;\n for (const branch of prPendingBranchAutomerge) {\n issueBody += getListItem(branch, 'approvePr');\n }\n issueBody += '\\n';\n }\n\n const warn = getDepWarningsDashboard(packageFiles, config);\n if (warn) {\n issueBody += warn;\n issueBody += '\\n';\n }\n\n const otherRes = [\n 'pending',\n 'needs-approval',\n 'needs-pr-approval',\n 'not-scheduled',\n 'pr-limit-reached',\n 'commit-limit-reached',\n 'branch-limit-reached',\n 'already-existed',\n 'error',\n 'automerged',\n 'pr-edited',\n ];\n let inProgress = branches.filter(\n (branch) =>\n !otherRes.includes(branch.result!) &&\n branch.prBlockedBy !== 'BranchAutomerge',\n );\n const otherBranches = inProgress.filter(\n (branch) => !!branch.prBlockedBy || !branch.prNo,\n );\n // istanbul ignore if\n if (otherBranches.length) {\n issueBody += '## Other Branches\\n\\n';\n issueBody += `These updates are pending. To force PRs open, click the checkbox below.\\n\\n`;\n for (const branch of otherBranches) {\n issueBody += getListItem(branch, 'other');\n }\n issueBody += '\\n';\n }\n inProgress = inProgress.filter(\n (branch) => branch.prNo && !branch.prBlockedBy,\n );\n if (inProgress.length) {\n issueBody += '## Open\\n\\n';\n issueBody +=\n 'These updates have all been created already. Click a checkbox below to force a retry/rebase of any.\\n\\n';\n for (const branch of inProgress) {\n issueBody += getListItem(branch, 'rebase');\n }\n if (inProgress.length > 2) {\n issueBody += ' - [ ] ';\n issueBody += '<!-- rebase-all-open-prs -->';\n issueBody += '**Click on this checkbox to rebase all open PRs at once**';\n issueBody += '\\n';\n }\n issueBody += '\\n';\n }\n const alreadyExisted = branches.filter(\n (branch) => branch.result === 'already-existed',\n );\n if (alreadyExisted.length) {\n issueBody += '## Ignored or Blocked\\n\\n';\n issueBody +=\n 'These are blocked by an existing closed PR and will not be recreated unless you click a checkbox below.\\n\\n';\n for (const branch of alreadyExisted) {\n issueBody += getListItem(branch, 'recreate');\n }\n issueBody += '\\n';\n }\n\n if (!hasBranches) {\n issueBody +=\n 'This repository currently has no open or pending branches.\\n\\n';\n }\n\n // add CVE section\n issueBody += await getDashboardMarkdownVulnerabilities(config, packageFiles);\n\n // fit the detected dependencies section\n const footer = getFooter(config);\n issueBody += PackageFiles.getDashboardMarkdown(\n platform.maxBodyLength() - issueBody.length - footer.length,\n );\n\n issueBody += footer;\n\n if (config.dependencyDashboardIssue) {\n // If we're not changing the dashboard issue then we can skip checking if the user changed it\n // The cached issue we get back here will reflect its state at the _start_ of our run\n const cachedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n );\n if (cachedIssue?.body === issueBody) {\n logger.debug('No changes to dependency dashboard issue needed');\n return;\n }\n\n // Skip cache when getting the issue to ensure we get the latest body,\n // including any updates the user made after we started the run\n const updatedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n false,\n );\n if (updatedIssue) {\n const { dependencyDashboardChecks } = parseDashboardIssue(\n coerceString(updatedIssue.body),\n );\n for (const branchName of Object.keys(config.dependencyDashboardChecks!)) {\n delete dependencyDashboardChecks[branchName];\n }\n for (const branchName of Object.keys(dependencyDashboardChecks)) {\n const checkText = `- [ ] <!-- ${dependencyDashboardChecks[branchName]}-branch=${branchName} -->`;\n issueBody = issueBody.replace(\n checkText,\n checkText.replace('[ ]', '[x]'),\n );\n }\n }\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would ensure Dependency Dashboard',\n );\n } else {\n await platform.ensureIssue({\n title: config.dependencyDashboardTitle!,\n reuseTitle,\n body: platform.massageMarkdown(issueBody),\n labels: config.dependencyDashboardLabels,\n confidential: config.confidential,\n });\n }\n}\n\nexport function getAbandonedPackagesMd(\n packageFiles: Record<string, PackageFile[]>,\n): string {\n const abandonedPackages: Record<\n string,\n Record<string, string | undefined | null>\n > = {};\n let abandonedCount = 0;\n\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n for (const packageFile of managerPackageFiles) {\n for (const dep of coerceArray(packageFile.deps)) {\n if (dep.depName && dep.isAbandoned) {\n abandonedCount++;\n abandonedPackages[manager] = abandonedPackages[manager] || {};\n abandonedPackages[manager][dep.depName] = dep.mostRecentTimestamp;\n }\n }\n }\n }\n\n if (abandonedCount === 0) {\n return '';\n }\n\n let abandonedMd = '> ℹ **Note**\\n> \\n';\n abandonedMd +=\n 'These dependencies have not received updates for an extended period and may be unmaintained:\\n\\n';\n\n abandonedMd += '<details>\\n';\n abandonedMd += `<summary>View abandoned dependencies (${abandonedCount})</summary>\\n\\n`;\n abandonedMd += '| Datasource | Name | Last Updated |\\n';\n abandonedMd += '|------------|------|-------------|\\n';\n\n for (const manager of Object.keys(abandonedPackages).sort()) {\n const deps = abandonedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const mostRecentTimestamp = deps[depName];\n const formattedDate = mostRecentTimestamp\n ? DateTime.fromISO(mostRecentTimestamp).toFormat('yyyy-MM-dd')\n : 'unknown';\n abandonedMd += `| ${manager} | \\`${depName}\\` | \\`${formattedDate}\\` |\\n`;\n }\n }\n\n abandonedMd += '\\n</details>\\n\\n';\n abandonedMd +=\n 'Packages are marked as abandoned when they exceed the [`abandonmentThreshold`](https://docs.renovatebot.com/configuration-options/#abandonmentthreshold) since their last release.\\n';\n abandonedMd +=\n 'Unlike deprecated packages with official notices, abandonment is detected by release inactivity.\\n\\n';\n\n return abandonedMd + '\\n';\n}\n\nfunction getFooter(config: RenovateConfig): string {\n let footer = '';\n if (config.dependencyDashboardFooter?.length) {\n footer +=\n '---\\n' +\n template.compile(config.dependencyDashboardFooter, config) +\n '\\n';\n }\n\n return footer;\n}\n\nexport async function getDashboardMarkdownVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<string> {\n let result = '';\n\n if (\n is.nullOrUndefined(config.dependencyDashboardOSVVulnerabilitySummary) ||\n config.dependencyDashboardOSVVulnerabilitySummary === 'none'\n ) {\n return result;\n }\n\n result += '## Vulnerabilities\\n\\n';\n\n const vulnerabilityFetcher = await Vulnerabilities.create();\n const vulnerabilities = await vulnerabilityFetcher.fetchVulnerabilities(\n config,\n packageFiles,\n );\n\n if (vulnerabilities.length === 0) {\n result +=\n 'Renovate has not found any CVEs on [osv.dev](https://osv.dev).\\n\\n';\n return result;\n }\n\n const unresolvedVulnerabilities = vulnerabilities.filter((value) =>\n is.nullOrUndefined(value.fixedVersion),\n );\n const resolvedVulnerabilitiesLength =\n vulnerabilities.length - unresolvedVulnerabilities.length;\n\n result += `\\`${resolvedVulnerabilitiesLength}\\`/\\`${vulnerabilities.length}\\``;\n if (is.truthy(config.osvVulnerabilityAlerts)) {\n result += ' CVEs have Renovate fixes.\\n';\n } else {\n result +=\n ' CVEs have possible Renovate fixes.\\nSee [`osvVulnerabilityAlerts`](https://docs.renovatebot.com/configuration-options/#osvvulnerabilityalerts) to allow Renovate to supply fixes.\\n';\n }\n\n let renderedVulnerabilities: Vulnerability[];\n switch (config.dependencyDashboardOSVVulnerabilitySummary) {\n // filter vulnerabilities to display based on configuration\n case 'unresolved':\n renderedVulnerabilities = unresolvedVulnerabilities;\n break;\n default:\n renderedVulnerabilities = vulnerabilities;\n }\n\n const managerRecords: Record<\n string,\n Record<string, Record<string, Vulnerability[]>>\n > = {};\n for (const vulnerability of renderedVulnerabilities) {\n const { manager, packageFile } = vulnerability.packageFileConfig;\n if (is.nullOrUndefined(managerRecords[manager!])) {\n managerRecords[manager!] = {};\n }\n if (is.nullOrUndefined(managerRecords[manager!][packageFile])) {\n managerRecords[manager!][packageFile] = {};\n }\n if (\n is.nullOrUndefined(\n managerRecords[manager!][packageFile][vulnerability.packageName],\n )\n ) {\n managerRecords[manager!][packageFile][vulnerability.packageName] = [];\n }\n managerRecords[manager!][packageFile][vulnerability.packageName].push(\n vulnerability,\n );\n }\n\n for (const [manager, packageFileRecords] of Object.entries(managerRecords)) {\n result += `<details><summary>${manager}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageFile, packageNameRecords] of Object.entries(\n packageFileRecords,\n )) {\n result += `<details><summary>${packageFile}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageName, cves] of Object.entries(packageNameRecords)) {\n result += `<details><summary>${packageName}</summary>\\n<blockquote>\\n\\n`;\n for (const vul of cves) {\n const id = vul.vulnerability.id;\n const suffix = is.nonEmptyString(vul.fixedVersion)\n ? ` (fixed in ${vul.fixedVersion})`\n : '';\n result += `- [${id}](https://osv.dev/vulnerability/${id})${suffix}\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n\n return result;\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "40.30.1",
4
+ "version": "40.31.0",
5
5
  "type": "commonjs",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -333,7 +333,7 @@
333
333
  "husky": "9.1.7",
334
334
  "jest-extended": "4.0.2",
335
335
  "lint-staged": "15.5.2",
336
- "markdownlint-cli2": "0.17.2",
336
+ "markdownlint-cli2": "0.18.1",
337
337
  "memfs": "4.17.2",
338
338
  "nock": "14.0.4",
339
339
  "npm-run-all2": "7.0.2",
@@ -1055,6 +1055,11 @@
1055
1055
  ],
1056
1056
  "default": "none"
1057
1057
  },
1058
+ "dependencyDashboardReportAbandonment": {
1059
+ "description": "Controls whether abandoned packages are reported in the dependency dashboard.",
1060
+ "type": "boolean",
1061
+ "default": true
1062
+ },
1058
1063
  "dependencyDashboardTitle": {
1059
1064
  "description": "Title for the Dependency Dashboard issue.",
1060
1065
  "type": "string",