renovate 44.37.0 → 44.37.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.
@@ -42,9 +42,13 @@ function getExpectedPrList(config, branches) {
42
42
  logger.trace({ config });
43
43
  let prDesc = `\n### What to Expect\n\n`;
44
44
  if (!branches.length) return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\n`;
45
+ const securityBranchCount = branches.filter((b) => b.isVulnerabilityAlert).length;
46
+ const throttledBranchCount = branches.length - securityBranchCount;
45
47
  const { limit: concurrentLimit, key: concurrentLimitKey } = resolveConcurrentLimit(config);
46
- if (concurrentLimit > 0 && concurrentLimit < branches.length) prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? "s" : ""}, up to a maximum of ${branches.length} over time (see [docs for \`${concurrentLimitKey}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimitKey.toLowerCase()})):\n\n`;
47
- else {
48
+ if (concurrentLimit > 0 && concurrentLimit < throttledBranchCount) {
49
+ const securityNote = securityBranchCount > 0 ? `, plus ${securityBranchCount} security update Pull Request${securityBranchCount > 1 ? "s" : ""} which ${securityBranchCount > 1 ? "are" : "is"} not subject to this limit` : "";
50
+ prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? "s" : ""}, up to a maximum of ${branches.length} over time (see [docs for \`${concurrentLimitKey}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimitKey.toLowerCase()}))${securityNote}:\n\n`;
51
+ } else {
48
52
  prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;
49
53
  prDesc += branches.length > 1 ? `s:\n\n` : `:\n\n`;
50
54
  }
@@ -76,8 +80,9 @@ function getExpectedPrList(config, branches) {
76
80
  }
77
81
  const prHourlyLimit = coerceNumber(config.prHourlyLimit);
78
82
  const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);
79
- if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < branches.length) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.\n\n`);
80
- else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < branches.length) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.\n\n`);
83
+ const securityBypassNote = securityBranchCount > 0 ? ` Security update Pull Request${securityBranchCount > 1 ? "s are" : " is"} not subject to this limit and will be created straight away.` : "";
84
+ if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < throttledBranchCount) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.${securityBypassNote}\n\n`);
85
+ else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < throttledBranchCount) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.${securityBypassNote}\n\n`);
81
86
  return prDesc;
82
87
  }
83
88
  function getBranchUpgradeTypes(branch) {
@@ -190,6 +195,7 @@ function getExpectedPrListSummary(config, branches) {
190
195
  const prHourlyLimit = coerceNumber(config.prHourlyLimit);
191
196
  const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);
192
197
  const concurrentLimit = resolveConcurrentLimit(config);
198
+ const securityCount = Object.keys(stats.securityGroups).length;
193
199
  if (hasMultipleBaseBranches) {
194
200
  let total = 0;
195
201
  const parts = sortedBases.map((base) => {
@@ -198,10 +204,10 @@ function getExpectedPrListSummary(config, branches) {
198
204
  const label = base ? `the \`${base}\` branch` : "the default branch";
199
205
  return `${count} Pull Request${count > 1 ? "s" : ""} to ${label}`;
200
206
  });
201
- const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, total);
207
+ const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, total - securityCount, securityCount);
202
208
  prDesc += `With your current configuration, Renovate will create ${parts.join(" and ")}${limitsNotice}:\n\n`;
203
209
  } else {
204
- const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, stats.prCount);
210
+ const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, stats.prCount - securityCount, securityCount);
205
211
  prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? "s" : ""}${limitsNotice}:\n\n`;
206
212
  }
207
213
  const categoryColumns = getCategoryColumns(stats.presentCategories);
@@ -226,22 +232,27 @@ function getExpectedPrListSummary(config, branches) {
226
232
  prDesc += `\n**Security updates**:\n\n`;
227
233
  for (const groupBranches of Object.values(stats.securityGroups)) prDesc += describeSecurityGroup(groupBranches);
228
234
  }
229
- if (concurrentLimit.limit > 0 && concurrentLimit.limit < stats.prCount) {
235
+ const throttledPrCount = stats.prCount - securityCount;
236
+ const securityBypassNote = securityCount > 0 ? ` Security update Pull Request${securityCount > 1 ? "s are" : " is"} not subject to this limit and will be created straight away.` : "";
237
+ if (concurrentLimit.limit > 0 && concurrentLimit.limit < throttledPrCount) {
230
238
  const notice = concurrentLimit.key === "branchConcurrentLimit" ? `Renovate will only work on ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? "es" : ""} at a time, so not all Pull Requests will be opened straight away` : `Renovate will only keep ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? "s" : ""} open at a time, so not all of the above will be opened straight away`;
231
- prDesc += emojify(`\n\n:children_crossing: ${notice}. See [docs for \`${concurrentLimit.key}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.\n\n`);
239
+ prDesc += emojify(`\n\n:children_crossing: ${notice}. See [docs for \`${concurrentLimit.key}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.${securityBypassNote}\n\n`);
232
240
  }
233
- if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < stats.prCount) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.\n\n`);
234
- else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < stats.prCount) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.\n\n`);
241
+ if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < throttledPrCount) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.${securityBypassNote}\n\n`);
242
+ else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < throttledPrCount) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.${securityBypassNote}\n\n`);
235
243
  return prDesc;
236
244
  }
237
- function determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, prCount) {
245
+ function determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, prCount, securityCount) {
238
246
  const clauses = [];
239
247
  if (concurrentLimit.limit > 0 && concurrentLimit.limit < prCount) clauses.push(concurrentLimit.key === "branchConcurrentLimit" ? `a maximum of ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? "es" : ""} open at a time` : `a maximum of ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? "s" : ""} open at a time`);
240
248
  if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < prCount) clauses.push(`a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? "s" : ""}/rebase${commitHourlyLimit > 1 ? "s" : ""} per hour`);
241
249
  else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < prCount) clauses.push(`a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? "s" : ""} per hour`);
242
- if (clauses.length) return emojify(` (at ${clauses.join(" and ")})`);
243
- if (commitHourlyLimit === 0 && prHourlyLimit === 0) return " (with no configured maximum of PRs per hour)";
244
- return "";
250
+ if (!clauses.length) {
251
+ if (commitHourlyLimit === 0 && prHourlyLimit === 0) return " (with no configured maximum of PRs per hour)";
252
+ return "";
253
+ }
254
+ const securityNote = securityCount > 0 ? `, plus ${securityCount} security update${securityCount > 1 ? "s" : ""} which ${securityCount > 1 ? "aren't" : "isn't"} subject to these limits` : "";
255
+ return emojify(` (at ${clauses.join(" and ")}${securityNote})`);
245
256
  }
246
257
  //#endregion
247
258
  export { getExpectedPrList, getExpectedPrListSummary };
@@ -1 +1 @@
1
- {"version":3,"file":"pr-list.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/pr/pr-list.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type RenovateConfig,\n type UpdateType,\n UpdateTypesOptions,\n} from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { calcLimit } from '../../../global/limits.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\n\n/**\n * The different categories of dependency updates to output, when providing the summary view.\n *\n * - `security`: if the upgrade is driven by a vulnerability alert\n * - `${updateType}`: if it's set. I.e. `major`\n * - `lockfileUpdate` when `isLockfileUpdate` is true, without an `updateType`\n * - `other`: otherwise\n */\ntype SummaryCategory = UpdateType | 'security' | 'other';\n\n/** Priority order when rendering the `SummaryCategory`s in the summary view.\n *\n * NOTE that this is not exhaustive - this is only the priority order for rendering, and other categories, such as `other` are placed after.\n */\nconst SUMMARY_CATEGORY_PRIORITY_ORDER: readonly SummaryCategory[] = [\n 'security',\n ...UpdateTypesOptions,\n // ... anything else\n];\n\ninterface ConcurrentLimit {\n limit: number;\n key: 'prConcurrentLimit' | 'branchConcurrentLimit';\n}\n\n/**\n * Resolves the concurrent limit that governs how many of the expected Pull Requests can be open at once,\n * reusing the same `calcLimit()` used to enforce these limits (see `lib/workers/global/limits.ts`).\n *\n * `branchConcurrentLimit` only takes priority when it's been explicitly configured (it's `null` by default,\n * in which case `calcLimit()` silently inherits the value of `prConcurrentLimit`) and is actually more\n * restrictive - otherwise we'd misattribute the limit to a setting the user never touched.\n */\nfunction resolveConcurrentLimit(config: RenovateConfig): ConcurrentLimit {\n const configAsUpgrade: BranchUpgradeConfig = {\n branchName: '',\n manager: '',\n prConcurrentLimit: config.prConcurrentLimit,\n branchConcurrentLimit: config.branchConcurrentLimit,\n };\n const prConcurrentLimit = calcLimit([configAsUpgrade], 'prConcurrentLimit');\n const branchConcurrentLimit = calcLimit(\n [configAsUpgrade],\n 'branchConcurrentLimit',\n );\n\n if (\n typeof config.branchConcurrentLimit === 'number' &&\n branchConcurrentLimit > 0 &&\n (prConcurrentLimit === 0 || branchConcurrentLimit < prConcurrentLimit)\n ) {\n return {\n limit: branchConcurrentLimit,\n key: 'branchConcurrentLimit',\n };\n }\n\n return { limit: prConcurrentLimit, key: 'prConcurrentLimit' };\n}\n\nexport function getExpectedPrList(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrList()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n const { limit: concurrentLimit, key: concurrentLimitKey } =\n resolveConcurrentLimit(config);\n if (concurrentLimit > 0 && concurrentLimit < branches.length) {\n prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? 's' : ''}, up to a maximum of ${branches.length} over time (see [docs for \\`${concurrentLimitKey}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimitKey.toLowerCase()})):\\n\\n`;\n } else {\n prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;\n prDesc += branches.length > 1 ? `s:\\n\\n` : `:\\n\\n`;\n }\n\n for (const branch of branches) {\n const prTitleRe = regEx(/@([a-z]+\\/[a-z]+)/);\n // TODO #22198\n prDesc += `<details>\\n<summary>${branch.prTitle!.replace(\n prTitleRe,\n '@&#8203;$1',\n )}</summary>\\n\\n`;\n if (branch.schedule?.length) {\n prDesc += ` - Schedule: ${JSON.stringify(branch.schedule)}\\n`;\n }\n prDesc += ` - Branch name: \\`${branch.branchName}\\`\\n`;\n prDesc += branch.baseBranch\n ? ` - Merge into: \\`${branch.baseBranch}\\`\\n`\n : '';\n const seen: string[] = [];\n for (const upgrade of branch.upgrades) {\n let text = '';\n if (upgrade.updateType === 'lockFileMaintenance') {\n text += ' - Regenerate lock files to use latest dependency versions';\n } else {\n if (upgrade.updateType === 'pin') {\n text += ' - Pin ';\n } else {\n text += ' - Upgrade ';\n }\n if (upgrade.sourceUrl) {\n // TODO: types (#22198)\n text += `[${upgrade.depName!}](${upgrade.sourceUrl})`;\n } else {\n text += upgrade.depName!.replace(prTitleRe, '@&#8203;$1');\n }\n // TODO: types (#22198)\n text += upgrade.isLockfileUpdate\n ? ` to \\`${upgrade.newVersion!}\\``\n : ` to \\`${upgrade.newDigest ?? upgrade.newValue!}\\``;\n text += '\\n';\n }\n if (!seen.includes(text)) {\n prDesc += text;\n seen.push(text);\n }\n }\n prDesc += '\\n\\n';\n prDesc += '</details>\\n\\n';\n }\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < branches.length\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < branches.length\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction getBranchUpgradeTypes(branch: BranchConfig): Set<SummaryCategory> {\n if (branch.isVulnerabilityAlert) {\n return new Set(['security']);\n }\n const types = new Set<SummaryCategory>();\n for (const upgrade of branch.upgrades) {\n if (upgrade.updateType) {\n types.add(upgrade.updateType);\n } else if (upgrade.isLockfileUpdate) {\n types.add('lockfileUpdate');\n } else {\n types.add('other');\n }\n }\n return types;\n}\n\n// Sort: default branch (empty string) first, then named branches alphabetically.\nfunction sortBaseBranches(bases: Iterable<string>): string[] {\n return [...bases].sort((a, b) => {\n if (a === b) {\n /* v8 ignore next -- base branches are unique Record keys; equal comparison cannot occur */\n return 0;\n }\n if (a === '') {\n return -1;\n }\n if (b === '') {\n return 1;\n }\n return a.localeCompare(b);\n });\n}\n\nfunction describeSecurityGroup(groupBranches: BranchConfig[]): string {\n const firstUpgrade = groupBranches[0].upgrades[0];\n const depName = firstUpgrade?.depName ?? groupBranches[0].prTitle ?? '';\n const updateType = firstUpgrade?.updateType ?? 'unknown';\n const packageFiles = groupBranches\n .map((b) => ({ file: b.packageFile ?? '', manager: b.manager }))\n .filter((f) => f.file);\n const uniqueManagers = new Set(packageFiles.map((f) => f.manager));\n\n // Vulnerability alerts can match on datasource + packageName without a specific file (e.g. GitHub vulnerability alerts),\n // so we need to handle an absent packageFile\n if (packageFiles.length === 0) {\n const branchManagers = new Set(groupBranches.map((b) => b.manager));\n if (branchManagers.size === 1) {\n return `- \\`${depName}\\`, (${[...branchManagers][0]}, ${updateType})\\n`;\n }\n\n return `- \\`${depName}\\`, (${updateType}): ${[...branchManagers].sort().join(', ')}\\n`;\n }\n\n if (packageFiles.length === 1) {\n const file = packageFiles[0].file;\n const [manager] = uniqueManagers;\n return `- \\`${depName}\\`, (${manager}, ${updateType}): \\`${file}\\`\\n`;\n }\n\n if (uniqueManagers.size === 1) {\n const manager = [...uniqueManagers][0];\n const fileLines = packageFiles\n .map(({ file }) => ` - \\`${file}\\`\\n`)\n .join('');\n return `- \\`${depName}\\`, (${manager}, ${updateType}):\\n${fileLines}`;\n }\n\n const fileLines = packageFiles\n .map(({ file, manager }) => ` - \\`${file}\\` (${manager})\\n`)\n .join('');\n return `- \\`${depName}\\`, (${updateType}):\\n${fileLines}`;\n}\n\ninterface BranchStats {\n // PR count per base branch, deduplicated by branchName.\n prCountByBase: Record<string, number>;\n // base -> manager -> type -> count, deduplicated by branchName+manager+type.\n tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n >;\n // All upgrade types seen anywhere — drives the table columns.\n presentCategories: Set<SummaryCategory>;\n // Security branches grouped by branchName.\n securityGroups: Record<string, BranchConfig[]>;\n prCount: number;\n}\n\nfunction collectBranchStats(branches: BranchConfig[]): BranchStats {\n const prCountByBase: Record<string, number> = {};\n const tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n > = {};\n const presentTypes = new Set<SummaryCategory>();\n const securityGroups: Record<string, BranchConfig[]> = {};\n const seenPrs = new Set<string>();\n const seenTableKeys = new Set<string>();\n\n for (const branch of branches) {\n const base = branch.baseBranch ?? '';\n const { manager, branchName } = branch;\n const branchTypes = getBranchUpgradeTypes(branch);\n\n for (const type of branchTypes) {\n presentTypes.add(type);\n }\n\n if (!seenPrs.has(branchName)) {\n seenPrs.add(branchName);\n prCountByBase[base] = (prCountByBase[base] ?? 0) + 1;\n }\n\n tableStats[base] ??= {};\n const baseStats = tableStats[base];\n baseStats[manager] ??= {};\n const managerStats = baseStats[manager];\n for (const type of branchTypes) {\n const key = `${branchName}:${manager}:${type}`;\n if (seenTableKeys.has(key)) {\n continue;\n }\n seenTableKeys.add(key);\n managerStats[type] ??= 0;\n managerStats[type]++;\n }\n\n if (branch.isVulnerabilityAlert) {\n securityGroups[branchName] ??= [];\n securityGroups[branchName].push(branch);\n }\n }\n\n return {\n prCountByBase,\n tableStats,\n presentCategories: presentTypes,\n securityGroups,\n prCount: seenPrs.size,\n };\n}\n\nfunction getCategoryColumns(\n presentTypes: Set<SummaryCategory>,\n): SummaryCategory[] {\n const cols: SummaryCategory[] = SUMMARY_CATEGORY_PRIORITY_ORDER.filter((t) =>\n presentTypes.has(t),\n );\n // Append any present types not in the standard display order\n // (e.g. lockfileUpdate, bump).\n for (const t of presentTypes) {\n if (t !== 'other' && !cols.includes(t)) {\n cols.push(t);\n }\n }\n\n if (presentTypes.has('other')) {\n cols.push('other');\n }\n\n return cols;\n}\n\nfunction categoriesToColumnHeaders(cols: readonly string[]): string {\n /* v8 ignore next -- branches always have at least one upgrade, so cols is never empty in practice */\n if (cols.length === 0) {\n return '';\n }\n return ` | ${cols.join(' | ')}`;\n}\n\nfunction renderRowCounts(\n typeColumns: readonly SummaryCategory[],\n typeCounts: Partial<Record<SummaryCategory, number>>,\n): string {\n return categoriesToColumnHeaders(\n typeColumns.map((t) => `${typeCounts[t] ?? 0}`),\n );\n}\n\nfunction sumCategoryCounts(\n rows: Partial<Record<SummaryCategory, number>>[],\n categoryColumns: readonly SummaryCategory[],\n): Partial<Record<SummaryCategory, number>> {\n const sum: Partial<Record<SummaryCategory, number>> = {};\n for (const categoryCounts of rows) {\n for (const category of categoryColumns) {\n sum[category] = (sum[category] ?? 0) + (categoryCounts[category] ?? 0);\n }\n }\n return sum;\n}\n\nexport function getExpectedPrListSummary(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrListSummary()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n\n const stats = collectBranchStats(branches);\n const sortedBases = sortBaseBranches(Object.keys(stats.prCountByBase));\n const hasMultipleBaseBranches = sortedBases.length > 1;\n\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n const concurrentLimit = resolveConcurrentLimit(config);\n\n if (hasMultipleBaseBranches) {\n let total = 0;\n const parts = sortedBases.map((base) => {\n const count = stats.prCountByBase[base];\n total += count;\n const label = base ? `the \\`${base}\\` branch` : 'the default branch';\n return `${count} Pull Request${count > 1 ? 's' : ''} to ${label}`;\n });\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n total,\n );\n prDesc += `With your current configuration, Renovate will create ${parts.join(' and ')}${limitsNotice}:\\n\\n`;\n } else {\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n stats.prCount,\n );\n prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? 's' : ''}${limitsNotice}:\\n\\n`;\n }\n\n const categoryColumns = getCategoryColumns(stats.presentCategories);\n if (hasMultipleBaseBranches) {\n prDesc += `| Branch | Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| --- | ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const base of sortedBases) {\n const label = base || '$default';\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[base],\n )) {\n prDesc += `| ${label} | ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats).flatMap((b) => Object.values(b)),\n categoryColumns,\n );\n prDesc += `| **Total** | ${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n } else {\n prDesc += `| Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[sortedBases[0]],\n )) {\n prDesc += `| ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats[sortedBases[0]]),\n categoryColumns,\n );\n prDesc += `| **Total**${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n }\n\n prDesc += `\\n<small>Note that a single PR can update multiple files and/or managers, so the above rows may not align with the number of PRs being listed above.</small>\\n`;\n\n // provide a summary of the given security updates, as they're likely more important to the user\n if (Object.keys(stats.securityGroups).length) {\n prDesc += `\\n**Security updates**:\\n\\n`;\n for (const groupBranches of Object.values(stats.securityGroups)) {\n prDesc += describeSecurityGroup(groupBranches);\n }\n }\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < stats.prCount) {\n const notice =\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `Renovate will only work on ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} at a time, so not all Pull Requests will be opened straight away`\n : `Renovate will only keep ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time, so not all of the above will be opened straight away`;\n prDesc += emojify(\n `\\n\\n:children_crossing: ${notice}. See [docs for \\`${concurrentLimit.key}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.\\n\\n`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < stats.prCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < stats.prCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction determineLimitsNotice(\n concurrentLimit: ConcurrentLimit,\n prHourlyLimit: number,\n commitHourlyLimit: number,\n prCount: number,\n): string {\n const clauses: string[] = [];\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < prCount) {\n clauses.push(\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `a maximum of ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} open at a time`\n : `a maximum of ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? 's' : ''}/rebase${commitHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n }\n\n if (clauses.length) {\n return emojify(` (at ${clauses.join(' and ')})`);\n }\n\n if (commitHourlyLimit === 0 && prHourlyLimit === 0) {\n return ' (with no configured maximum of PRs per hour)';\n }\n\n return '';\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pr-list.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/pr/pr-list.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type RenovateConfig,\n type UpdateType,\n UpdateTypesOptions,\n} from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { calcLimit } from '../../../global/limits.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\n\n/**\n * The different categories of dependency updates to output, when providing the summary view.\n *\n * - `security`: if the upgrade is driven by a vulnerability alert\n * - `${updateType}`: if it's set. I.e. `major`\n * - `lockfileUpdate` when `isLockfileUpdate` is true, without an `updateType`\n * - `other`: otherwise\n */\ntype SummaryCategory = UpdateType | 'security' | 'other';\n\n/** Priority order when rendering the `SummaryCategory`s in the summary view.\n *\n * NOTE that this is not exhaustive - this is only the priority order for rendering, and other categories, such as `other` are placed after.\n */\nconst SUMMARY_CATEGORY_PRIORITY_ORDER: readonly SummaryCategory[] = [\n 'security',\n ...UpdateTypesOptions,\n // ... anything else\n];\n\ninterface ConcurrentLimit {\n limit: number;\n key: 'prConcurrentLimit' | 'branchConcurrentLimit';\n}\n\n/**\n * Resolves the concurrent limit that governs how many of the expected Pull Requests can be open at once,\n * reusing the same `calcLimit()` used to enforce these limits (see `lib/workers/global/limits.ts`).\n *\n * `branchConcurrentLimit` only takes priority when it's been explicitly configured (it's `null` by default,\n * in which case `calcLimit()` silently inherits the value of `prConcurrentLimit`) and is actually more\n * restrictive - otherwise we'd misattribute the limit to a setting the user never touched.\n */\nfunction resolveConcurrentLimit(config: RenovateConfig): ConcurrentLimit {\n const configAsUpgrade: BranchUpgradeConfig = {\n branchName: '',\n manager: '',\n prConcurrentLimit: config.prConcurrentLimit,\n branchConcurrentLimit: config.branchConcurrentLimit,\n };\n const prConcurrentLimit = calcLimit([configAsUpgrade], 'prConcurrentLimit');\n const branchConcurrentLimit = calcLimit(\n [configAsUpgrade],\n 'branchConcurrentLimit',\n );\n\n if (\n typeof config.branchConcurrentLimit === 'number' &&\n branchConcurrentLimit > 0 &&\n (prConcurrentLimit === 0 || branchConcurrentLimit < prConcurrentLimit)\n ) {\n return {\n limit: branchConcurrentLimit,\n key: 'branchConcurrentLimit',\n };\n }\n\n return { limit: prConcurrentLimit, key: 'prConcurrentLimit' };\n}\n\nexport function getExpectedPrList(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrList()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n // Vulnerability alert branches bypass all rate/concurrency limits, so they shouldn't count towards them.\n const securityBranchCount = branches.filter(\n (b) => b.isVulnerabilityAlert,\n ).length;\n const throttledBranchCount = branches.length - securityBranchCount;\n\n const { limit: concurrentLimit, key: concurrentLimitKey } =\n resolveConcurrentLimit(config);\n if (concurrentLimit > 0 && concurrentLimit < throttledBranchCount) {\n const securityNote =\n securityBranchCount > 0\n ? `, plus ${securityBranchCount} security update Pull Request${securityBranchCount > 1 ? 's' : ''} which ${securityBranchCount > 1 ? 'are' : 'is'} not subject to this limit`\n : '';\n prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? 's' : ''}, up to a maximum of ${branches.length} over time (see [docs for \\`${concurrentLimitKey}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimitKey.toLowerCase()}))${securityNote}:\\n\\n`;\n } else {\n prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;\n prDesc += branches.length > 1 ? `s:\\n\\n` : `:\\n\\n`;\n }\n\n for (const branch of branches) {\n const prTitleRe = regEx(/@([a-z]+\\/[a-z]+)/);\n // TODO #22198\n prDesc += `<details>\\n<summary>${branch.prTitle!.replace(\n prTitleRe,\n '@&#8203;$1',\n )}</summary>\\n\\n`;\n if (branch.schedule?.length) {\n prDesc += ` - Schedule: ${JSON.stringify(branch.schedule)}\\n`;\n }\n prDesc += ` - Branch name: \\`${branch.branchName}\\`\\n`;\n prDesc += branch.baseBranch\n ? ` - Merge into: \\`${branch.baseBranch}\\`\\n`\n : '';\n const seen: string[] = [];\n for (const upgrade of branch.upgrades) {\n let text = '';\n if (upgrade.updateType === 'lockFileMaintenance') {\n text += ' - Regenerate lock files to use latest dependency versions';\n } else {\n if (upgrade.updateType === 'pin') {\n text += ' - Pin ';\n } else {\n text += ' - Upgrade ';\n }\n if (upgrade.sourceUrl) {\n // TODO: types (#22198)\n text += `[${upgrade.depName!}](${upgrade.sourceUrl})`;\n } else {\n text += upgrade.depName!.replace(prTitleRe, '@&#8203;$1');\n }\n // TODO: types (#22198)\n text += upgrade.isLockfileUpdate\n ? ` to \\`${upgrade.newVersion!}\\``\n : ` to \\`${upgrade.newDigest ?? upgrade.newValue!}\\``;\n text += '\\n';\n }\n if (!seen.includes(text)) {\n prDesc += text;\n seen.push(text);\n }\n }\n prDesc += '\\n\\n';\n prDesc += '</details>\\n\\n';\n }\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n const securityBypassNote =\n securityBranchCount > 0\n ? ` Security update Pull Request${securityBranchCount > 1 ? 's are' : ' is'} not subject to this limit and will be created straight away.`\n : '';\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < throttledBranchCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.${securityBypassNote}\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < throttledBranchCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.${securityBypassNote}\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction getBranchUpgradeTypes(branch: BranchConfig): Set<SummaryCategory> {\n if (branch.isVulnerabilityAlert) {\n return new Set(['security']);\n }\n const types = new Set<SummaryCategory>();\n for (const upgrade of branch.upgrades) {\n if (upgrade.updateType) {\n types.add(upgrade.updateType);\n } else if (upgrade.isLockfileUpdate) {\n types.add('lockfileUpdate');\n } else {\n types.add('other');\n }\n }\n return types;\n}\n\n// Sort: default branch (empty string) first, then named branches alphabetically.\nfunction sortBaseBranches(bases: Iterable<string>): string[] {\n return [...bases].sort((a, b) => {\n if (a === b) {\n /* v8 ignore next -- base branches are unique Record keys; equal comparison cannot occur */\n return 0;\n }\n if (a === '') {\n return -1;\n }\n if (b === '') {\n return 1;\n }\n return a.localeCompare(b);\n });\n}\n\nfunction describeSecurityGroup(groupBranches: BranchConfig[]): string {\n const firstUpgrade = groupBranches[0].upgrades[0];\n const depName = firstUpgrade?.depName ?? groupBranches[0].prTitle ?? '';\n const updateType = firstUpgrade?.updateType ?? 'unknown';\n const packageFiles = groupBranches\n .map((b) => ({ file: b.packageFile ?? '', manager: b.manager }))\n .filter((f) => f.file);\n const uniqueManagers = new Set(packageFiles.map((f) => f.manager));\n\n // Vulnerability alerts can match on datasource + packageName without a specific file (e.g. GitHub vulnerability alerts),\n // so we need to handle an absent packageFile\n if (packageFiles.length === 0) {\n const branchManagers = new Set(groupBranches.map((b) => b.manager));\n if (branchManagers.size === 1) {\n return `- \\`${depName}\\`, (${[...branchManagers][0]}, ${updateType})\\n`;\n }\n\n return `- \\`${depName}\\`, (${updateType}): ${[...branchManagers].sort().join(', ')}\\n`;\n }\n\n if (packageFiles.length === 1) {\n const file = packageFiles[0].file;\n const [manager] = uniqueManagers;\n return `- \\`${depName}\\`, (${manager}, ${updateType}): \\`${file}\\`\\n`;\n }\n\n if (uniqueManagers.size === 1) {\n const manager = [...uniqueManagers][0];\n const fileLines = packageFiles\n .map(({ file }) => ` - \\`${file}\\`\\n`)\n .join('');\n return `- \\`${depName}\\`, (${manager}, ${updateType}):\\n${fileLines}`;\n }\n\n const fileLines = packageFiles\n .map(({ file, manager }) => ` - \\`${file}\\` (${manager})\\n`)\n .join('');\n return `- \\`${depName}\\`, (${updateType}):\\n${fileLines}`;\n}\n\ninterface BranchStats {\n // PR count per base branch, deduplicated by branchName.\n prCountByBase: Record<string, number>;\n // base -> manager -> type -> count, deduplicated by branchName+manager+type.\n tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n >;\n // All upgrade types seen anywhere — drives the table columns.\n presentCategories: Set<SummaryCategory>;\n // Security branches grouped by branchName.\n securityGroups: Record<string, BranchConfig[]>;\n prCount: number;\n}\n\nfunction collectBranchStats(branches: BranchConfig[]): BranchStats {\n const prCountByBase: Record<string, number> = {};\n const tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n > = {};\n const presentTypes = new Set<SummaryCategory>();\n const securityGroups: Record<string, BranchConfig[]> = {};\n const seenPrs = new Set<string>();\n const seenTableKeys = new Set<string>();\n\n for (const branch of branches) {\n const base = branch.baseBranch ?? '';\n const { manager, branchName } = branch;\n const branchTypes = getBranchUpgradeTypes(branch);\n\n for (const type of branchTypes) {\n presentTypes.add(type);\n }\n\n if (!seenPrs.has(branchName)) {\n seenPrs.add(branchName);\n prCountByBase[base] = (prCountByBase[base] ?? 0) + 1;\n }\n\n tableStats[base] ??= {};\n const baseStats = tableStats[base];\n baseStats[manager] ??= {};\n const managerStats = baseStats[manager];\n for (const type of branchTypes) {\n const key = `${branchName}:${manager}:${type}`;\n if (seenTableKeys.has(key)) {\n continue;\n }\n seenTableKeys.add(key);\n managerStats[type] ??= 0;\n managerStats[type]++;\n }\n\n if (branch.isVulnerabilityAlert) {\n securityGroups[branchName] ??= [];\n securityGroups[branchName].push(branch);\n }\n }\n\n return {\n prCountByBase,\n tableStats,\n presentCategories: presentTypes,\n securityGroups,\n prCount: seenPrs.size,\n };\n}\n\nfunction getCategoryColumns(\n presentTypes: Set<SummaryCategory>,\n): SummaryCategory[] {\n const cols: SummaryCategory[] = SUMMARY_CATEGORY_PRIORITY_ORDER.filter((t) =>\n presentTypes.has(t),\n );\n // Append any present types not in the standard display order\n // (e.g. lockfileUpdate, bump).\n for (const t of presentTypes) {\n if (t !== 'other' && !cols.includes(t)) {\n cols.push(t);\n }\n }\n\n if (presentTypes.has('other')) {\n cols.push('other');\n }\n\n return cols;\n}\n\nfunction categoriesToColumnHeaders(cols: readonly string[]): string {\n /* v8 ignore next -- branches always have at least one upgrade, so cols is never empty in practice */\n if (cols.length === 0) {\n return '';\n }\n return ` | ${cols.join(' | ')}`;\n}\n\nfunction renderRowCounts(\n typeColumns: readonly SummaryCategory[],\n typeCounts: Partial<Record<SummaryCategory, number>>,\n): string {\n return categoriesToColumnHeaders(\n typeColumns.map((t) => `${typeCounts[t] ?? 0}`),\n );\n}\n\nfunction sumCategoryCounts(\n rows: Partial<Record<SummaryCategory, number>>[],\n categoryColumns: readonly SummaryCategory[],\n): Partial<Record<SummaryCategory, number>> {\n const sum: Partial<Record<SummaryCategory, number>> = {};\n for (const categoryCounts of rows) {\n for (const category of categoryColumns) {\n sum[category] = (sum[category] ?? 0) + (categoryCounts[category] ?? 0);\n }\n }\n return sum;\n}\n\nexport function getExpectedPrListSummary(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrListSummary()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n\n const stats = collectBranchStats(branches);\n const sortedBases = sortBaseBranches(Object.keys(stats.prCountByBase));\n const hasMultipleBaseBranches = sortedBases.length > 1;\n\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n const concurrentLimit = resolveConcurrentLimit(config);\n // Vulnerability alert branches bypass all rate/concurrency limits, so they shouldn't count towards them.\n const securityCount = Object.keys(stats.securityGroups).length;\n\n if (hasMultipleBaseBranches) {\n let total = 0;\n const parts = sortedBases.map((base) => {\n const count = stats.prCountByBase[base];\n total += count;\n const label = base ? `the \\`${base}\\` branch` : 'the default branch';\n return `${count} Pull Request${count > 1 ? 's' : ''} to ${label}`;\n });\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n total - securityCount,\n securityCount,\n );\n prDesc += `With your current configuration, Renovate will create ${parts.join(' and ')}${limitsNotice}:\\n\\n`;\n } else {\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n stats.prCount - securityCount,\n securityCount,\n );\n prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? 's' : ''}${limitsNotice}:\\n\\n`;\n }\n\n const categoryColumns = getCategoryColumns(stats.presentCategories);\n if (hasMultipleBaseBranches) {\n prDesc += `| Branch | Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| --- | ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const base of sortedBases) {\n const label = base || '$default';\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[base],\n )) {\n prDesc += `| ${label} | ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats).flatMap((b) => Object.values(b)),\n categoryColumns,\n );\n prDesc += `| **Total** | ${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n } else {\n prDesc += `| Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[sortedBases[0]],\n )) {\n prDesc += `| ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats[sortedBases[0]]),\n categoryColumns,\n );\n prDesc += `| **Total**${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n }\n\n prDesc += `\\n<small>Note that a single PR can update multiple files and/or managers, so the above rows may not align with the number of PRs being listed above.</small>\\n`;\n\n // provide a summary of the given security updates, as they're likely more important to the user\n if (Object.keys(stats.securityGroups).length) {\n prDesc += `\\n**Security updates**:\\n\\n`;\n for (const groupBranches of Object.values(stats.securityGroups)) {\n prDesc += describeSecurityGroup(groupBranches);\n }\n }\n\n const throttledPrCount = stats.prCount - securityCount;\n const securityBypassNote =\n securityCount > 0\n ? ` Security update Pull Request${securityCount > 1 ? 's are' : ' is'} not subject to this limit and will be created straight away.`\n : '';\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < throttledPrCount) {\n const notice =\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `Renovate will only work on ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} at a time, so not all Pull Requests will be opened straight away`\n : `Renovate will only keep ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time, so not all of the above will be opened straight away`;\n prDesc += emojify(\n `\\n\\n:children_crossing: ${notice}. See [docs for \\`${concurrentLimit.key}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.${securityBypassNote}\\n\\n`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < throttledPrCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.${securityBypassNote}\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < throttledPrCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.${securityBypassNote}\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction determineLimitsNotice(\n concurrentLimit: ConcurrentLimit,\n prHourlyLimit: number,\n commitHourlyLimit: number,\n prCount: number,\n securityCount: number,\n): string {\n const clauses: string[] = [];\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < prCount) {\n clauses.push(\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `a maximum of ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} open at a time`\n : `a maximum of ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? 's' : ''}/rebase${commitHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n }\n\n if (!clauses.length) {\n if (commitHourlyLimit === 0 && prHourlyLimit === 0) {\n return ' (with no configured maximum of PRs per hour)';\n }\n return '';\n }\n\n const securityNote =\n securityCount > 0\n ? `, plus ${securityCount} security update${securityCount > 1 ? 's' : ''} which ${securityCount > 1 ? \"aren't\" : \"isn't\"} subject to these limits`\n : '';\n\n return emojify(` (at ${clauses.join(' and ')}${securityNote})`);\n}\n"],"mappings":"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"}
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": "44.37.0",
4
+ "version": "44.37.1",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.37.0 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.37.1 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.37.0",
5
+ "x-renovate-version": "44.37.1",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {