renovate 44.181.2 → 44.181.3

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,4 +1,6 @@
1
+ import { coerceObject } from "../../../util/object.js";
1
2
  import { addMeta, logger, removeMeta } from "../../../logger/index.js";
3
+ import { isToolName } from "../../../util/exec/types.js";
2
4
  import { instrument } from "../../../instrumentation/index.js";
3
5
  import { getCache } from "../../../util/cache/repository/index.js";
4
6
  import { incCountValue, setCount } from "../../global/limits.js";
@@ -17,9 +19,12 @@ function generateCommitFingerprintConfig(branch) {
17
19
  return branch.upgrades.map((upgrade) => {
18
20
  const filteredUpgrade = {};
19
21
  for (const field of upgradeFingerprintFields) filteredUpgrade[field] = upgrade[field];
22
+ const toolConstraints = Object.entries(coerceObject(upgrade.constraints)).filter(([name]) => isToolName(name));
23
+ if (toolConstraints.length) filteredUpgrade.constraints = Object.fromEntries(toolConstraints);
20
24
  if (upgrade.postUpgradeTasks) filteredUpgrade.postUpgradeTasks = {
21
25
  commands: upgrade.postUpgradeTasks.commands,
22
- fileFilters: upgrade.postUpgradeTasks.fileFilters
26
+ fileFilters: upgrade.postUpgradeTasks.fileFilters,
27
+ installTools: upgrade.postUpgradeTasks.installTools
23
28
  };
24
29
  return filteredUpgrade;
25
30
  });
@@ -1 +1 @@
1
- {"version":3,"file":"write.js","names":[],"sources":["../../../../lib/workers/repository/process/write.ts"],"sourcesContent":["import {\n ATTR_VCS_REF_BASE_TYPE,\n ATTR_VCS_REF_HEAD_NAME,\n ATTR_VCS_REF_TYPE,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { isString } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { addMeta, logger, removeMeta } from '../../../logger/index.ts';\nimport { hashMap } from '../../../modules/manager/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { BranchCache } from '../../../util/cache/repository/types.ts';\nimport { fingerprint } from '../../../util/fingerprint.ts';\nimport { setBranchNewCommit } from '../../../util/git/set-branch-commit.ts';\nimport { incCountValue, setCount } from '../../global/limits.ts';\nimport type {\n BranchConfig,\n CacheFingerprintMatchResult,\n UpgradeFingerprintConfig,\n} from '../../types.ts';\nimport { processBranch } from '../update/branch/index.ts';\nimport { upgradeFingerprintFields } from './fingerprint-fields.ts';\nimport {\n getCommitsHourlyCount,\n getConcurrentBranchesCount,\n getConcurrentPrsCount,\n getPrHourlyCount,\n} from './limits.ts';\n\nexport type WriteUpdateResult = 'done' | 'automerged';\n\nexport function generateCommitFingerprintConfig(\n branch: BranchConfig,\n): UpgradeFingerprintConfig[] {\n const res = branch.upgrades.map((upgrade) => {\n const filteredUpgrade = {} as UpgradeFingerprintConfig;\n for (const field of upgradeFingerprintFields) {\n // TS cannot narrow the type here\n filteredUpgrade[field] = upgrade[field]!;\n }\n if (upgrade.postUpgradeTasks) {\n filteredUpgrade.postUpgradeTasks = {\n commands: upgrade.postUpgradeTasks.commands,\n fileFilters: upgrade.postUpgradeTasks.fileFilters,\n };\n }\n return filteredUpgrade;\n });\n\n return res;\n}\n\nexport function compareCacheFingerprint(\n branchState: BranchCache,\n commitFingerprint: string,\n): CacheFingerprintMatchResult {\n if (!branchState.commitFingerprint) {\n logger.trace('branch.isUpToDate(): no fingerprint');\n return 'no-fingerprint';\n }\n\n if (commitFingerprint !== branchState.commitFingerprint) {\n logger.debug('branch.isUpToDate(): needs recalculation');\n return 'no-match';\n }\n\n logger.debug('branch.isUpToDate(): using cached result \"true\"');\n return 'matched';\n}\n\nexport async function syncBranchState(\n branchName: string,\n baseBranch: string,\n): Promise<BranchCache> {\n logger.debug('syncBranchState()');\n const branchSha = await scm.getBranchCommit(branchName);\n const baseBranchSha = await scm.getBranchCommit(baseBranch);\n\n const cache = getCache();\n cache.branches ??= [];\n const { branches: cachedBranches } = cache;\n let branchState = cachedBranches.find((br) => br.branchName === branchName);\n if (!branchState) {\n logger.debug(\n 'syncBranchState(): Branch cache not found, creating minimal branchState',\n );\n // create a minimal branch state\n branchState = {\n branchName,\n sha: branchSha,\n baseBranch,\n baseBranchSha,\n } as BranchCache;\n cachedBranches.push(branchState);\n }\n\n // if base branch name has changed invalidate cached isModified state\n if (baseBranch !== branchState.baseBranch) {\n logger.debug('syncBranchState(): update baseBranch name');\n branchState.baseBranch = baseBranch;\n delete branchState.isModified;\n branchState.pristine = false;\n }\n\n // if base branch sha has changed invalidate cached isBehindBase state\n if (baseBranchSha !== branchState.baseBranchSha) {\n logger.debug('syncBranchState(): update baseBranchSha');\n delete branchState.isBehindBase;\n delete branchState.isConflicted;\n\n // update cached branchSha\n branchState.baseBranchSha = baseBranchSha;\n branchState.pristine = false;\n }\n\n // if branch sha has changed invalidate all cached states\n if (branchSha !== branchState.sha) {\n logger.debug('syncBranchState(): update branchSha');\n delete branchState.isBehindBase;\n delete branchState.isConflicted;\n delete branchState.isModified;\n delete branchState.commitFingerprint;\n\n // Update commit timestamp when SHA changes\n const commitDate = await scm.getBranchUpdateDate(branchName);\n if (commitDate) {\n branchState.commitTimestamp = commitDate.toISO()!;\n }\n\n // update cached branchSha\n branchState.sha = branchSha;\n branchState.pristine = false;\n }\n\n return branchState;\n}\n\nexport async function writeUpdates(\n config: RenovateConfig,\n allBranches: BranchConfig[],\n): Promise<WriteUpdateResult> {\n const branches = allBranches;\n logger.debug(\n `Processing ${branches.length} branch${\n branches.length === 1 ? '' : 'es'\n }: ${branches\n .map((b) => b.branchName)\n .sort()\n .join(', ')}`,\n );\n\n // vulnerability alerts are counted separately so that they get their own limit budget\n const vulnerabilityBranches = branches.filter((b) => b.isVulnerabilityAlert);\n const otherBranches = branches.filter((b) => !b.isVulnerabilityAlert);\n\n setCount('ConcurrentPRs', await getConcurrentPrsCount(config, otherBranches));\n setCount(\n 'VulnerabilityConcurrentPRs',\n await getConcurrentPrsCount(config, vulnerabilityBranches),\n );\n\n setCount('Branches', await getConcurrentBranchesCount(otherBranches));\n setCount(\n 'VulnerabilityBranches',\n await getConcurrentBranchesCount(vulnerabilityBranches),\n );\n\n const prsThisHourCount = await getPrHourlyCount(config);\n setCount('HourlyPRs', prsThisHourCount);\n\n const commitsThisHourCount = await getCommitsHourlyCount(branches);\n setCount('HourlyCommits', commitsThisHourCount);\n\n for (const branch of branches) {\n const { baseBranch, branchName } = branch;\n const res = await instrument(\n branchName,\n async () => {\n const meta: Record<string, string> = { branch: branchName };\n if (config.baseBranchPatterns?.length && baseBranch) {\n meta.baseBranch = baseBranch;\n }\n addMeta(meta);\n const branchExisted = await scm.branchExists(branchName);\n const branchState = await syncBranchState(branchName, baseBranch);\n\n const managers = [\n ...new Set(\n branch.upgrades\n .map((upgrade) => hashMap.get(upgrade.manager) ?? upgrade.manager)\n .filter(isString),\n ),\n ].sort();\n const commitFingerprint = fingerprint({\n commitFingerprintConfig: generateCommitFingerprintConfig(branch),\n managers,\n });\n branch.cacheFingerprintMatch = compareCacheFingerprint(\n branchState,\n commitFingerprint,\n );\n\n const res = await processBranch(branch);\n branch.prBlockedBy = res?.prBlockedBy;\n branch.prNo = res?.prNo;\n branch.result = res?.result;\n branch.commitFingerprint = res?.updatesVerified\n ? commitFingerprint\n : branchState.commitFingerprint;\n\n if (res?.commitSha) {\n // Get the commit timestamp for the new commit\n const commitDate = await scm.getBranchUpdateDate(branchName);\n setBranchNewCommit(branchName, baseBranch, res.commitSha, commitDate);\n }\n if (\n branch.result === 'automerged' &&\n branch.automergeType !== 'pr-comment'\n ) {\n // Stop processing other branches because base branch has been changed\n return 'automerged';\n }\n if (!branchExisted && (await scm.branchExists(branch.branchName))) {\n incCountValue(\n branch.isVulnerabilityAlert ? 'VulnerabilityBranches' : 'Branches',\n );\n }\n },\n {\n attributes: {\n [ATTR_VCS_REF_TYPE]: 'branch',\n [ATTR_VCS_REF_BASE_TYPE]: 'branch',\n [ATTR_VCS_REF_HEAD_NAME]: branchName,\n },\n },\n );\n\n if (res !== undefined) {\n return res;\n }\n }\n removeMeta(['branch', 'baseBranch']);\n return 'done';\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"write.js","names":[],"sources":["../../../../lib/workers/repository/process/write.ts"],"sourcesContent":["import {\n ATTR_VCS_REF_BASE_TYPE,\n ATTR_VCS_REF_HEAD_NAME,\n ATTR_VCS_REF_TYPE,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { isString } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { addMeta, logger, removeMeta } from '../../../logger/index.ts';\nimport { hashMap } from '../../../modules/manager/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { BranchCache } from '../../../util/cache/repository/types.ts';\nimport { isToolName } from '../../../util/exec/types.ts';\nimport { fingerprint } from '../../../util/fingerprint.ts';\nimport { setBranchNewCommit } from '../../../util/git/set-branch-commit.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { incCountValue, setCount } from '../../global/limits.ts';\nimport type {\n BranchConfig,\n CacheFingerprintMatchResult,\n UpgradeFingerprintConfig,\n} from '../../types.ts';\nimport { processBranch } from '../update/branch/index.ts';\nimport { upgradeFingerprintFields } from './fingerprint-fields.ts';\nimport {\n getCommitsHourlyCount,\n getConcurrentBranchesCount,\n getConcurrentPrsCount,\n getPrHourlyCount,\n} from './limits.ts';\n\nexport type WriteUpdateResult = 'done' | 'automerged';\n\nexport function generateCommitFingerprintConfig(\n branch: BranchConfig,\n): UpgradeFingerprintConfig[] {\n const res = branch.upgrades.map((upgrade) => {\n const filteredUpgrade = {} as UpgradeFingerprintConfig;\n for (const field of upgradeFingerprintFields) {\n // TS cannot narrow the type here\n filteredUpgrade[field] = upgrade[field]!;\n }\n // only tools' constraints, as others (i.e. the default `ghActionsLock`) are set for every upgrade\n const toolConstraints = Object.entries(\n coerceObject(upgrade.constraints),\n ).filter(([name]) => isToolName(name));\n if (toolConstraints.length) {\n filteredUpgrade.constraints = Object.fromEntries(toolConstraints);\n }\n if (upgrade.postUpgradeTasks) {\n filteredUpgrade.postUpgradeTasks = {\n commands: upgrade.postUpgradeTasks.commands,\n fileFilters: upgrade.postUpgradeTasks.fileFilters,\n installTools: upgrade.postUpgradeTasks.installTools,\n };\n }\n return filteredUpgrade;\n });\n\n return res;\n}\n\nexport function compareCacheFingerprint(\n branchState: BranchCache,\n commitFingerprint: string,\n): CacheFingerprintMatchResult {\n if (!branchState.commitFingerprint) {\n logger.trace('branch.isUpToDate(): no fingerprint');\n return 'no-fingerprint';\n }\n\n if (commitFingerprint !== branchState.commitFingerprint) {\n logger.debug('branch.isUpToDate(): needs recalculation');\n return 'no-match';\n }\n\n logger.debug('branch.isUpToDate(): using cached result \"true\"');\n return 'matched';\n}\n\nexport async function syncBranchState(\n branchName: string,\n baseBranch: string,\n): Promise<BranchCache> {\n logger.debug('syncBranchState()');\n const branchSha = await scm.getBranchCommit(branchName);\n const baseBranchSha = await scm.getBranchCommit(baseBranch);\n\n const cache = getCache();\n cache.branches ??= [];\n const { branches: cachedBranches } = cache;\n let branchState = cachedBranches.find((br) => br.branchName === branchName);\n if (!branchState) {\n logger.debug(\n 'syncBranchState(): Branch cache not found, creating minimal branchState',\n );\n // create a minimal branch state\n branchState = {\n branchName,\n sha: branchSha,\n baseBranch,\n baseBranchSha,\n } as BranchCache;\n cachedBranches.push(branchState);\n }\n\n // if base branch name has changed invalidate cached isModified state\n if (baseBranch !== branchState.baseBranch) {\n logger.debug('syncBranchState(): update baseBranch name');\n branchState.baseBranch = baseBranch;\n delete branchState.isModified;\n branchState.pristine = false;\n }\n\n // if base branch sha has changed invalidate cached isBehindBase state\n if (baseBranchSha !== branchState.baseBranchSha) {\n logger.debug('syncBranchState(): update baseBranchSha');\n delete branchState.isBehindBase;\n delete branchState.isConflicted;\n\n // update cached branchSha\n branchState.baseBranchSha = baseBranchSha;\n branchState.pristine = false;\n }\n\n // if branch sha has changed invalidate all cached states\n if (branchSha !== branchState.sha) {\n logger.debug('syncBranchState(): update branchSha');\n delete branchState.isBehindBase;\n delete branchState.isConflicted;\n delete branchState.isModified;\n delete branchState.commitFingerprint;\n\n // Update commit timestamp when SHA changes\n const commitDate = await scm.getBranchUpdateDate(branchName);\n if (commitDate) {\n branchState.commitTimestamp = commitDate.toISO()!;\n }\n\n // update cached branchSha\n branchState.sha = branchSha;\n branchState.pristine = false;\n }\n\n return branchState;\n}\n\nexport async function writeUpdates(\n config: RenovateConfig,\n allBranches: BranchConfig[],\n): Promise<WriteUpdateResult> {\n const branches = allBranches;\n logger.debug(\n `Processing ${branches.length} branch${\n branches.length === 1 ? '' : 'es'\n }: ${branches\n .map((b) => b.branchName)\n .sort()\n .join(', ')}`,\n );\n\n // vulnerability alerts are counted separately so that they get their own limit budget\n const vulnerabilityBranches = branches.filter((b) => b.isVulnerabilityAlert);\n const otherBranches = branches.filter((b) => !b.isVulnerabilityAlert);\n\n setCount('ConcurrentPRs', await getConcurrentPrsCount(config, otherBranches));\n setCount(\n 'VulnerabilityConcurrentPRs',\n await getConcurrentPrsCount(config, vulnerabilityBranches),\n );\n\n setCount('Branches', await getConcurrentBranchesCount(otherBranches));\n setCount(\n 'VulnerabilityBranches',\n await getConcurrentBranchesCount(vulnerabilityBranches),\n );\n\n const prsThisHourCount = await getPrHourlyCount(config);\n setCount('HourlyPRs', prsThisHourCount);\n\n const commitsThisHourCount = await getCommitsHourlyCount(branches);\n setCount('HourlyCommits', commitsThisHourCount);\n\n for (const branch of branches) {\n const { baseBranch, branchName } = branch;\n const res = await instrument(\n branchName,\n async () => {\n const meta: Record<string, string> = { branch: branchName };\n if (config.baseBranchPatterns?.length && baseBranch) {\n meta.baseBranch = baseBranch;\n }\n addMeta(meta);\n const branchExisted = await scm.branchExists(branchName);\n const branchState = await syncBranchState(branchName, baseBranch);\n\n const managers = [\n ...new Set(\n branch.upgrades\n .map((upgrade) => hashMap.get(upgrade.manager) ?? upgrade.manager)\n .filter(isString),\n ),\n ].sort();\n const commitFingerprint = fingerprint({\n commitFingerprintConfig: generateCommitFingerprintConfig(branch),\n managers,\n });\n branch.cacheFingerprintMatch = compareCacheFingerprint(\n branchState,\n commitFingerprint,\n );\n\n const res = await processBranch(branch);\n branch.prBlockedBy = res?.prBlockedBy;\n branch.prNo = res?.prNo;\n branch.result = res?.result;\n branch.commitFingerprint = res?.updatesVerified\n ? commitFingerprint\n : branchState.commitFingerprint;\n\n if (res?.commitSha) {\n // Get the commit timestamp for the new commit\n const commitDate = await scm.getBranchUpdateDate(branchName);\n setBranchNewCommit(branchName, baseBranch, res.commitSha, commitDate);\n }\n if (\n branch.result === 'automerged' &&\n branch.automergeType !== 'pr-comment'\n ) {\n // Stop processing other branches because base branch has been changed\n return 'automerged';\n }\n if (!branchExisted && (await scm.branchExists(branch.branchName))) {\n incCountValue(\n branch.isVulnerabilityAlert ? 'VulnerabilityBranches' : 'Branches',\n );\n }\n },\n {\n attributes: {\n [ATTR_VCS_REF_TYPE]: 'branch',\n [ATTR_VCS_REF_BASE_TYPE]: 'branch',\n [ATTR_VCS_REF_HEAD_NAME]: branchName,\n },\n },\n );\n\n if (res !== undefined) {\n return res;\n }\n }\n removeMeta(['branch', 'baseBranch']);\n return 'done';\n}\n"],"mappings":"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"}
@@ -4,6 +4,7 @@ import { coerceArray } from "../../../util/array.js";
4
4
  import { sanitize } from "../../../util/sanitize.js";
5
5
  import { safeStringify } from "../../../util/stringify.js";
6
6
  import { logger } from "../../../logger/index.js";
7
+ import { isConstraintName } from "../../../util/exec/types.js";
7
8
  import { withoutUrlCredentials } from "../../../util/url.js";
8
9
  import { mergeChildConfig } from "../../../config/utils.js";
9
10
  import { compile } from "../../../util/template/index.js";
@@ -257,6 +258,15 @@ function generateBranchConfig(upgrades) {
257
258
  // istanbul ignore if: should never happen
258
259
  if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) logger.warn("Grouping lockfile maintenance with other update types is not supported");
259
260
  }
261
+ const constraintUpdates = config.upgrades.flatMap(({ manager, depType, depName, currentValue, newValue }) => manager === "renovate-config" && depType === "tool-constraint" && isConstraintName(depName) && newValue ? [{
262
+ depName,
263
+ currentValue,
264
+ newValue
265
+ }] : []);
266
+ for (const upgrade of config.upgrades) for (const { depName, currentValue, newValue } of constraintUpdates) if (upgrade.constraints?.[depName] === currentValue) upgrade.constraints = {
267
+ ...upgrade.constraints,
268
+ [depName]: newValue
269
+ };
260
270
  config.constraints = {};
261
271
  config.extractedConstraints = {};
262
272
  for (const upgrade of config.upgrades) {
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","names":["template.compile","template\n .compile"],"sources":["../../../../lib/workers/repository/updates/generate.ts"],"sourcesContent":["import { isArray, isNonEmptyString, isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { markdownTable } from 'markdown-table';\nimport semver from 'semver';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { safeStringify } from '../../../util/stringify.ts';\nimport * as template from '../../../util/template/index.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { uniq } from '../../../util/uniq.ts';\nimport { withoutUrlCredentials } from '../../../util/url.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types.ts';\nimport { CommitMessage } from '../model/commit-message.ts';\n\nfunction prettifyVersion(version: string): string {\n if (regEx(/^\\d/).test(version)) {\n return `v${version}`;\n }\n\n return version;\n}\n\nfunction isTypesGroup(branchUpgrades: BranchUpgradeConfig[]): boolean {\n return (\n branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) &&\n new Set(\n branchUpgrades.map(({ depName }) =>\n depName?.replace(regEx(/^@types\\//), ''),\n ),\n ).size === 1\n );\n}\n\nfunction sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {\n function isTypesUpgrade({ depName }: BranchUpgradeConfig): boolean {\n return !!depName?.startsWith('@types/');\n }\n const regularUpgrades = upgrades.filter(\n (upgrade) => !isTypesUpgrade(upgrade),\n );\n const typesUpgrades = upgrades.filter(isTypesUpgrade);\n upgrades.splice(0, upgrades.length);\n upgrades.push(...regularUpgrades, ...typesUpgrades);\n}\n\nfunction getTableValues(upgrade: BranchUpgradeConfig): string[] | null {\n if (!upgrade.commitBodyTable) {\n return null;\n }\n const { datasource, packageName, depName, currentVersion, newVersion } =\n upgrade;\n if (datasource && packageName && currentVersion && newVersion) {\n return [datasource, packageName, currentVersion, newVersion];\n }\n logger.trace(\n {\n datasource,\n packageName,\n depName,\n currentVersion,\n newVersion,\n },\n 'Cannot determine table values',\n );\n return null;\n}\n\nfunction compileCommitMessage(upgrade: BranchUpgradeConfig): string {\n if (upgrade.semanticCommits === 'enabled' && !upgrade.commitMessagePrefix) {\n logger.trace('Upgrade has semantic commits enabled');\n let semanticPrefix = upgrade.semanticCommitType;\n if (upgrade.semanticCommitScope) {\n semanticPrefix += `(${template.compile(\n upgrade.semanticCommitScope,\n upgrade,\n )})`;\n }\n upgrade.commitMessagePrefix = CommitMessage.formatPrefix(semanticPrefix!);\n upgrade.toLowerCase =\n regEx(/[A-Z]/).exec(upgrade.semanticCommitType!) === null &&\n !upgrade.semanticCommitType!.startsWith(':');\n }\n\n // Compile a few times in case there are nested templates\n upgrade.commitMessage = template.compile(\n upgrade.commitMessage ?? '',\n upgrade,\n );\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n upgrade.commitMessage = withoutUrlCredentials(\n template.compile(upgrade.commitMessage, upgrade),\n );\n // istanbul ignore if\n if (upgrade.commitMessage !== sanitize(upgrade.commitMessage)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets exposed in commit message',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n upgrade.commitMessage = upgrade.commitMessage.trim(); // Trim exterior whitespace\n upgrade.commitMessage = upgrade.commitMessage.replace(regEx(/\\s+/g), ' '); // Trim extra whitespace inside string\n upgrade.commitMessage = upgrade.commitMessage.replace(\n regEx(/to vv(?<digit>\\d)/),\n 'to v$<digit>',\n );\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n // We only need to lowercase the first line\n const splitMessage = upgrade.commitMessage.split(newlineRegex);\n splitMessage[0] = splitMessage[0].toLowerCase();\n upgrade.commitMessage = splitMessage.join('\\n');\n }\n\n logger.trace(`commitMessage: ${JSON.stringify(upgrade.commitMessage)}`);\n return upgrade.commitMessage;\n}\n\nfunction compilePrTitle(\n upgrade: BranchUpgradeConfig,\n commitMessage: string,\n): void {\n if (upgrade.prTitle) {\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = withoutUrlCredentials(\n template\n .compile(upgrade.prTitle, upgrade)\n .trim()\n .replace(regEx(/\\s+/g), ' '),\n );\n // istanbul ignore if\n if (upgrade.prTitle !== sanitize(upgrade.prTitle)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets were exposed in PR title',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n upgrade.prTitle = upgrade.prTitle.toLowerCase();\n }\n } else {\n [upgrade.prTitle] = commitMessage.split(newlineRegex);\n }\n if (!upgrade.prTitleStrict) {\n upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';\n if (upgrade.isGroup) {\n const hasVersionInTitle = !!semver.coerce(\n template.compile(upgrade.commitMessageExtra ?? '', upgrade),\n );\n if (!hasVersionInTitle) {\n upgrade.prTitle +=\n upgrade.updateType === 'major' && upgrade.separateMajorMinor\n ? ' (major)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'minor' && upgrade.separateMinorPatch\n ? ' (minor)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'patch' && upgrade.separateMinorPatch\n ? ' (patch)'\n : '';\n }\n }\n }\n // Compile again to allow for nested templates\n upgrade.prTitle = withoutUrlCredentials(\n template.compile(upgrade.prTitle, upgrade),\n );\n logger.trace(`prTitle: ${JSON.stringify(upgrade.prTitle)}`);\n}\n\nfunction getMinimumGroupSize(upgrades: BranchUpgradeConfig[]): number {\n let minimumGroupSize = 1;\n const groupSizes = new Set<number>();\n\n for (const upg of upgrades) {\n if (upg.minimumGroupSize) {\n groupSizes.add(upg.minimumGroupSize);\n if (minimumGroupSize < upg.minimumGroupSize) {\n minimumGroupSize = upg.minimumGroupSize;\n }\n }\n }\n\n if (groupSizes.size > 1) {\n logger.debug(\n 'Multiple minimumGroupSize values found for this branch, using highest.',\n );\n }\n\n return minimumGroupSize;\n}\n\n// Sorted by priority, from low to high\nconst semanticCommitTypeByPriority = ['chore', 'ci', 'build', 'fix', 'feat'];\n\nexport function generateBranchConfig(\n upgrades: BranchUpgradeConfig[],\n): BranchConfig {\n let branchUpgrades = upgrades;\n if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {\n // If the branch isn't pending, then remove any upgrades within which *are*\n logger.debug(\n { branch: branchUpgrades[0].branchName },\n 'Branch is not pending, removing pending upgrades',\n );\n branchUpgrades = branchUpgrades.filter((upgrade) => !upgrade.pendingChecks);\n }\n logger.trace({ config: branchUpgrades }, 'generateBranchConfig');\n let config: BranchConfig = {\n upgrades: [],\n } as any;\n const hasGroupName = branchUpgrades[0].groupName !== null;\n logger.trace(`hasGroupName: ${hasGroupName}`);\n // Use group settings only if multiple upgrades or lazy grouping is disabled\n const depNames: string[] = [];\n const newValue: string[] = [];\n const toVersions: string[] = [];\n const toValues = new Set<string>();\n const depTypes = new Set<string>();\n for (const upg of branchUpgrades) {\n upg.recreateClosed = upg.recreateWhen === 'always';\n\n if (upg.currentDigest) {\n upg.currentDigestShort =\n upg.currentDigestShort ??\n upg.currentDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.newDigest) {\n upg.newDigestShort =\n upg.newDigestShort ??\n upg.newDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.isDigest || upg.isPinDigest) {\n upg.displayFrom = upg.currentDigestShort;\n upg.displayTo = upg.newDigestShort;\n } else if (upg.isLockfileUpdate) {\n upg.displayFrom = upg.currentVersion;\n upg.displayTo = upg.newVersion;\n } else if (!upg.isLockFileMaintenance) {\n upg.displayFrom = upg.currentValue;\n upg.displayTo = upg.newValue;\n }\n\n if (upg.isLockFileMaintenance) {\n upg.recreateClosed = upg.recreateWhen !== 'never';\n }\n upg.displayFrom ??= '';\n upg.displayTo ??= '';\n if (!depNames.includes(upg.depName!)) {\n depNames.push(upg.depName!);\n }\n if (!toVersions.includes(upg.newVersion!)) {\n toVersions.push(upg.newVersion!);\n }\n toValues.add(upg.newValue!);\n if (upg.depType) {\n depTypes.add(upg.depType);\n }\n // prettify newVersion and newMajor for printing\n if (upg.newVersion) {\n upg.prettyNewVersion = prettifyVersion(upg.newVersion);\n }\n if (upg.newMajor) {\n upg.prettyNewMajor = `v${upg.newMajor}`;\n }\n if (upg.commitMessageExtra) {\n const extra = template.compile(upg.commitMessageExtra, upg);\n if (!newValue.includes(extra)) {\n newValue.push(extra);\n }\n }\n }\n const groupEligible =\n depNames.length > 1 ||\n toVersions.length > 1 ||\n (!toVersions[0] && newValue.length > 1);\n\n const typesGroup =\n depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades);\n logger.trace(`groupEligible: ${groupEligible}`);\n const singleUpdateGroup =\n hasGroupName && !groupEligible && !branchUpgrades[0].sharedVariableName;\n logger.trace(`singleUpdateGroup: ${singleUpdateGroup}`);\n const useGroupSettings =\n hasGroupName &&\n (groupEligible ||\n (singleUpdateGroup && branchUpgrades[0].groupSingleUpdates === true));\n logger.trace(`useGroupSettings: ${useGroupSettings}`);\n let releaseTimestamp: Timestamp;\n\n if (depTypes.size) {\n config.depTypes = Array.from(depTypes).sort();\n }\n\n for (const branchUpgrade of branchUpgrades) {\n let upgrade: BranchUpgradeConfig = { ...branchUpgrade };\n\n upgrade.depTypes = config.depTypes;\n\n // needs to be done for each upgrade, as we reorder them below\n if (newValue.length > 1 && !groupEligible) {\n upgrade.commitMessageExtra = `to v${toVersions[0]}`;\n }\n\n const pendingVersionsLength = upgrade.pendingVersions?.length;\n if (pendingVersionsLength) {\n upgrade.displayPending = `\\`${upgrade.pendingVersions!.at(-1)!}\\``;\n if (pendingVersionsLength > 1) {\n upgrade.displayPending += ` (+${pendingVersionsLength - 1})`;\n }\n } else {\n upgrade.displayPending = '';\n }\n upgrade.prettyDepType =\n upgrade.prettyDepType ?? upgrade.depType ?? 'dependency';\n if (useGroupSettings) {\n // Now overwrite original config with group config\n upgrade = mergeChildConfig(upgrade, upgrade.group);\n upgrade.isGroup = true;\n if (singleUpdateGroup) {\n // Single update using group name instead of dependency name,\n // so remove version from commit message.\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n }\n } else {\n delete upgrade.groupName;\n }\n // Delete group config regardless of whether it was applied\n delete upgrade.group;\n\n if (\n toVersions.length > 1 &&\n toValues.size > 1 &&\n newValue.length > 1 &&\n !typesGroup\n ) {\n logger.trace({ toVersions });\n logger.trace({ toValues });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (\n newValue.length > 1 &&\n (upgrade.isDigest || upgrade.isPinDigest)\n ) {\n logger.trace({ newValue });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (semver.valid(toVersions[0])) {\n upgrade.isRange = false;\n }\n config.upgrades.push(upgrade);\n if (upgrade.releaseTimestamp) {\n if (releaseTimestamp!) {\n const existingStamp = DateTime.fromISO(releaseTimestamp);\n const upgradeStamp = DateTime.fromISO(upgrade.releaseTimestamp);\n if (upgradeStamp > existingStamp) {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n } else {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n }\n }\n\n if (typesGroup) {\n if (config.upgrades[0].depName?.startsWith('@types/')) {\n logger.debug('Found @types - reversing upgrades to use depName in PR');\n sortTypesGroup(config.upgrades);\n config.upgrades[0].recreateClosed = false;\n config.hasTypes = true;\n }\n } else {\n config.upgrades.sort((a, b) => {\n if (a.fileReplacePosition && b.fileReplacePosition) {\n // This is because we need to replace from the bottom of the file up\n return a.fileReplacePosition > b.fileReplacePosition ? -1 : 1;\n }\n\n // make sure that ordering is consistent :\n // items without position will be first in the list.\n if (a.fileReplacePosition) {\n return 1;\n }\n if (b.fileReplacePosition) {\n return -1;\n }\n\n if (a.depName! < b.depName!) {\n return -1;\n }\n if (a.depName! > b.depName!) {\n return 1;\n }\n return 0;\n });\n }\n // Now assign first upgrade's config as branch config\n config = {\n ...config,\n ...config.upgrades[0],\n releaseTimestamp: releaseTimestamp!,\n }; // TODO: fixme (#9666)\n\n // Enable `semanticCommits` if one of the branches has it enabled\n if (\n config.upgrades.some((upgrade) => upgrade.semanticCommits === 'enabled')\n ) {\n config.semanticCommits = 'enabled';\n // Calculate the highest priority `semanticCommitType`\n let highestIndex = -1;\n for (const upgrade of config.upgrades) {\n if (upgrade.semanticCommits === 'enabled' && upgrade.semanticCommitType) {\n const priorityIndex = semanticCommitTypeByPriority.indexOf(\n upgrade.semanticCommitType,\n );\n\n if (priorityIndex > highestIndex) {\n highestIndex = priorityIndex;\n }\n }\n }\n\n if (highestIndex > -1) {\n config.semanticCommitType = semanticCommitTypeByPriority[highestIndex];\n }\n }\n\n // Use templates to generate strings\n const commitMessage = compileCommitMessage(config);\n compilePrTitle(config, commitMessage);\n\n config.dependencyDashboardApproval = config.upgrades.some(\n (upgrade) => upgrade.dependencyDashboardApproval,\n );\n config.dependencyDashboardPrApproval = config.upgrades.some(\n (upgrade) => upgrade.prCreation === 'approval',\n );\n config.prBodyColumns = [\n ...new Set(\n config.upgrades.reduce(\n (existing: string[], upgrade) =>\n existing.concat(upgrade.prBodyColumns!),\n [],\n ),\n ),\n ].filter(isNonEmptyString);\n // combine excludeCommitPaths for multiple manager experience\n const hasExcludeCommitPaths = config.upgrades.some(\n (u) => u.excludeCommitPaths && u.excludeCommitPaths.length > 0,\n );\n if (hasExcludeCommitPaths) {\n config.excludeCommitPaths = Object.keys(\n config.upgrades.reduce((acc: Record<string, boolean>, upgrade) => {\n if (upgrade.excludeCommitPaths) {\n upgrade.excludeCommitPaths.forEach((p) => {\n acc[p] = true;\n });\n }\n\n return acc;\n }, {}),\n );\n }\n\n config.automerge = config.upgrades.every((upgrade) => upgrade.automerge);\n // combine all labels\n config.labels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => coerceArray(upgrade.labels))\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n config.addLabels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => coerceArray(upgrade.addLabels))\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n\n if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {\n config.updateType = 'major';\n }\n\n config.isBreaking = config.upgrades.some((upgrade) => upgrade.isBreaking);\n\n // explicit set `isLockFileMaintenance` for the branch for groups\n if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n config.isLockFileMaintenance = true;\n // istanbul ignore if: should never happen\n if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {\n logger.warn(\n 'Grouping lockfile maintenance with other update types is not supported',\n );\n }\n }\n\n config.constraints = {};\n config.extractedConstraints = {};\n for (const upgrade of config.upgrades) {\n if (upgrade.constraints) {\n config.constraints = { ...config.constraints, ...upgrade.constraints };\n }\n if (upgrade.extractedConstraints) {\n config.extractedConstraints = {\n ...config.extractedConstraints,\n ...upgrade.extractedConstraints,\n };\n }\n }\n\n config.minimumGroupSize = getMinimumGroupSize(config.upgrades);\n // Set skipInstalls to false if any upgrade in the branch has it false\n config.skipInstalls = config.upgrades.every(\n (upgrade) => upgrade.skipInstalls !== false,\n );\n\n // Artifact updating will only be skipped if every upgrade wants to skip it.\n config.skipArtifactsUpdate = config.upgrades.every(\n (upgrade) => upgrade.skipArtifactsUpdate,\n );\n if (\n !config.skipArtifactsUpdate &&\n config.upgrades.some((upgrade) => upgrade.skipArtifactsUpdate)\n ) {\n logger.debug(\n {\n upgrades: config.upgrades.map((upgrade) => ({\n depName: upgrade.depName,\n skipArtifactsUpdate: upgrade.skipArtifactsUpdate,\n })),\n },\n 'Mixed `skipArtifactsUpdate` values in upgrades. Artifacts will be updated.',\n );\n }\n\n const tableRows = config.upgrades\n .map(getTableValues)\n .filter((x): x is string[] => isArray(x, isString));\n\n if (tableRows.length) {\n const table: string[][] = [];\n table.push(['datasource', 'package', 'from', 'to']);\n\n const seenRows = new Set<string>();\n\n for (const row of tableRows) {\n const key = safeStringify(row);\n if (seenRows.has(key)) {\n continue;\n }\n seenRows.add(key);\n table.push(row);\n }\n config.commitMessage += `\\n\\n${withoutUrlCredentials(markdownTable(table))}\\n`;\n }\n const additionalReviewers = uniq(\n config.upgrades\n .map((upgrade) => upgrade.additionalReviewers)\n .flat()\n .filter(isNonEmptyString),\n );\n if (additionalReviewers.length > 0) {\n config.additionalReviewers = additionalReviewers;\n }\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,SAAS,gBAAgB,SAAyB;CAChD,IAAI,MAAM,KAAK,CAAC,CAAC,KAAK,OAAO,GAC3B,OAAO,IAAI;CAGb,OAAO;AACT;AAEA,SAAS,aAAa,gBAAgD;CACpE,OACE,eAAe,MAAM,EAAE,cAAc,SAAS,WAAW,SAAS,CAAC,KACnE,IAAI,IACF,eAAe,KAAK,EAAE,cACpB,SAAS,QAAQ,MAAM,WAAW,GAAG,EAAE,CACzC,CACF,CAAC,CAAC,SAAS;AAEf;AAEA,SAAS,eAAe,UAAuC;CAC7D,SAAS,eAAe,EAAE,WAAyC;EACjE,OAAO,CAAC,CAAC,SAAS,WAAW,SAAS;CACxC;CACA,MAAM,kBAAkB,SAAS,QAC9B,YAAY,CAAC,eAAe,OAAO,CACtC;CACA,MAAM,gBAAgB,SAAS,OAAO,cAAc;CACpD,SAAS,OAAO,GAAG,SAAS,MAAM;CAClC,SAAS,KAAK,GAAG,iBAAiB,GAAG,aAAa;AACpD;AAEA,SAAS,eAAe,SAA+C;CACrE,IAAI,CAAC,QAAQ,iBACX,OAAO;CAET,MAAM,EAAE,YAAY,aAAa,SAAS,gBAAgB,eACxD;CACF,IAAI,cAAc,eAAe,kBAAkB,YACjD,OAAO;EAAC;EAAY;EAAa;EAAgB;CAAU;CAE7D,OAAO,MACL;EACE;EACA;EACA;EACA;EACA;CACF,GACA,+BACF;CACA,OAAO;AACT;AAEA,SAAS,qBAAqB,SAAsC;CAClE,IAAI,QAAQ,oBAAoB,aAAa,CAAC,QAAQ,qBAAqB;EACzE,OAAO,MAAM,sCAAsC;EACnD,IAAI,iBAAiB,QAAQ;EAC7B,IAAI,QAAQ,qBACV,kBAAkB,IAAIA,QACpB,QAAQ,qBACR,OACF,EAAE;EAEJ,QAAQ,sBAAsB,cAAc,aAAa,cAAe;EACxE,QAAQ,cACN,MAAM,OAAO,CAAC,CAAC,KAAK,QAAQ,kBAAmB,MAAM,QACrD,CAAC,QAAQ,mBAAoB,WAAW,GAAG;CAC/C;CAGA,QAAQ,gBAAgBA,QACtB,QAAQ,iBAAiB,IACzB,OACF;CACA,QAAQ,gBAAgBA,QAAiB,QAAQ,eAAe,OAAO;CACvE,QAAQ,gBAAgB,sBACtBA,QAAiB,QAAQ,eAAe,OAAO,CACjD;;CAEA,IAAI,QAAQ,kBAAkB,SAAS,QAAQ,aAAa,GAAG;EAC7D,OAAO,MACL,EAAE,YAAY,QAAQ,WAAW,GACjC,mCACF;EACA,MAAM,IAAI,MAAM,sBAAsB;CACxC;CACA,QAAQ,gBAAgB,QAAQ,cAAc,KAAK;CACnD,QAAQ,gBAAgB,QAAQ,cAAc,QAAQ,MAAM,MAAM,GAAG,GAAG;CACxE,QAAQ,gBAAgB,QAAQ,cAAc,QAC5C,MAAM,mBAAmB,GACzB,cACF;CACA,IAAI,QAAQ,eAAe,QAAQ,2BAA2B,SAAS;EAErE,MAAM,eAAe,QAAQ,cAAc,MAAM,YAAY;EAC7D,aAAa,KAAK,aAAa,EAAE,CAAC,YAAY;EAC9C,QAAQ,gBAAgB,aAAa,KAAK,IAAI;CAChD;CAEA,OAAO,MAAM,kBAAkB,KAAK,UAAU,QAAQ,aAAa,GAAG;CACtE,OAAO,QAAQ;AACjB;AAEA,SAAS,eACP,SACA,eACM;CACN,IAAI,QAAQ,SAAS;EACnB,QAAQ,UAAUA,QAAiB,QAAQ,SAAS,OAAO;EAC3D,QAAQ,UAAUA,QAAiB,QAAQ,SAAS,OAAO;EAC3D,QAAQ,UAAU,sBAChBC,QACW,QAAQ,SAAS,OAAO,CAAC,CACjC,KAAK,CAAC,CACN,QAAQ,MAAM,MAAM,GAAG,GAAG,CAC/B;;EAEA,IAAI,QAAQ,YAAY,SAAS,QAAQ,OAAO,GAAG;GACjD,OAAO,MACL,EAAE,YAAY,QAAQ,WAAW,GACjC,kCACF;GACA,MAAM,IAAI,MAAM,sBAAsB;EACxC;EACA,IAAI,QAAQ,eAAe,QAAQ,2BAA2B,SAC5D,QAAQ,UAAU,QAAQ,QAAQ,YAAY;CAElD,OACE,CAAC,QAAQ,WAAW,cAAc,MAAM,YAAY;CAEtD,IAAI,CAAC,QAAQ,eAAe;EAC1B,QAAQ,WAAW,QAAQ,kBAAkB,sBAAsB;EACnE,IAAI,QAAQ,SAIN;OAAA,CAAC,CAHsB,CAAC,OAAO,OACjCD,QAAiB,QAAQ,sBAAsB,IAAI,OAAO,CAC5D,GACwB;IACtB,QAAQ,WACN,QAAQ,eAAe,WAAW,QAAQ,qBACtC,aACA;IACN,QAAQ,WACN,QAAQ,eAAe,WAAW,QAAQ,qBACtC,aACA;IACN,QAAQ,WACN,QAAQ,eAAe,WAAW,QAAQ,qBACtC,aACA;GACR;;CAEJ;CAEA,QAAQ,UAAU,sBAChBA,QAAiB,QAAQ,SAAS,OAAO,CAC3C;CACA,OAAO,MAAM,YAAY,KAAK,UAAU,QAAQ,OAAO,GAAG;AAC5D;AAEA,SAAS,oBAAoB,UAAyC;CACpE,IAAI,mBAAmB;CACvB,MAAM,6BAAa,IAAI,IAAY;CAEnC,KAAK,MAAM,OAAO,UAChB,IAAI,IAAI,kBAAkB;EACxB,WAAW,IAAI,IAAI,gBAAgB;EACnC,IAAI,mBAAmB,IAAI,kBACzB,mBAAmB,IAAI;CAE3B;CAGF,IAAI,WAAW,OAAO,GACpB,OAAO,MACL,wEACF;CAGF,OAAO;AACT;AAGA,MAAM,+BAA+B;CAAC;CAAS;CAAM;CAAS;CAAO;AAAM;AAE3E,SAAgB,qBACd,UACc;CACd,IAAI,iBAAiB;CACrB,IAAI,CAAC,eAAe,OAAO,YAAY,QAAQ,aAAa,GAAG;EAE7D,OAAO,MACL,EAAE,QAAQ,eAAe,EAAE,CAAC,WAAW,GACvC,kDACF;EACA,iBAAiB,eAAe,QAAQ,YAAY,CAAC,QAAQ,aAAa;CAC5E;CACA,OAAO,MAAM,EAAE,QAAQ,eAAe,GAAG,sBAAsB;CAC/D,IAAI,SAAuB,EACzB,UAAU,CAAC,EACb;CACA,MAAM,eAAe,eAAe,EAAE,CAAC,cAAc;CACrD,OAAO,MAAM,iBAAiB,cAAc;CAE5C,MAAM,WAAqB,CAAC;CAC5B,MAAM,WAAqB,CAAC;CAC5B,MAAM,aAAuB,CAAC;CAC9B,MAAM,2BAAW,IAAI,IAAY;CACjC,MAAM,2BAAW,IAAI,IAAY;CACjC,KAAK,MAAM,OAAO,gBAAgB;EAChC,IAAI,iBAAiB,IAAI,iBAAiB;EAE1C,IAAI,IAAI,eACN,IAAI,qBACF,IAAI,sBACJ,IAAI,cAAc,QAAQ,WAAW,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC;EAE3D,IAAI,IAAI,WACN,IAAI,iBACF,IAAI,kBACJ,IAAI,UAAU,QAAQ,WAAW,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC;EAEvD,IAAI,IAAI,YAAY,IAAI,aAAa;GACnC,IAAI,cAAc,IAAI;GACtB,IAAI,YAAY,IAAI;EACtB,OAAO,IAAI,IAAI,kBAAkB;GAC/B,IAAI,cAAc,IAAI;GACtB,IAAI,YAAY,IAAI;EACtB,OAAO,IAAI,CAAC,IAAI,uBAAuB;GACrC,IAAI,cAAc,IAAI;GACtB,IAAI,YAAY,IAAI;EACtB;EAEA,IAAI,IAAI,uBACN,IAAI,iBAAiB,IAAI,iBAAiB;EAE5C,IAAI,gBAAgB;EACpB,IAAI,cAAc;EAClB,IAAI,CAAC,SAAS,SAAS,IAAI,OAAQ,GACjC,SAAS,KAAK,IAAI,OAAQ;EAE5B,IAAI,CAAC,WAAW,SAAS,IAAI,UAAW,GACtC,WAAW,KAAK,IAAI,UAAW;EAEjC,SAAS,IAAI,IAAI,QAAS;EAC1B,IAAI,IAAI,SACN,SAAS,IAAI,IAAI,OAAO;EAG1B,IAAI,IAAI,YACN,IAAI,mBAAmB,gBAAgB,IAAI,UAAU;EAEvD,IAAI,IAAI,UACN,IAAI,iBAAiB,IAAI,IAAI;EAE/B,IAAI,IAAI,oBAAoB;GAC1B,MAAM,QAAQA,QAAiB,IAAI,oBAAoB,GAAG;GAC1D,IAAI,CAAC,SAAS,SAAS,KAAK,GAC1B,SAAS,KAAK,KAAK;EAEvB;CACF;CACA,MAAM,gBACJ,SAAS,SAAS,KAClB,WAAW,SAAS,KACnB,CAAC,WAAW,MAAM,SAAS,SAAS;CAEvC,MAAM,aACJ,SAAS,SAAS,KAAK,CAAC,gBAAgB,aAAa,cAAc;CACrE,OAAO,MAAM,kBAAkB,eAAe;CAC9C,MAAM,oBACJ,gBAAgB,CAAC,iBAAiB,CAAC,eAAe,EAAE,CAAC;CACvD,OAAO,MAAM,sBAAsB,mBAAmB;CACtD,MAAM,mBACJ,iBACC,iBACE,qBAAqB,eAAe,EAAE,CAAC,uBAAuB;CACnE,OAAO,MAAM,qBAAqB,kBAAkB;CACpD,IAAI;CAEJ,IAAI,SAAS,MACX,OAAO,WAAW,MAAM,KAAK,QAAQ,CAAC,CAAC,KAAK;CAG9C,KAAK,MAAM,iBAAiB,gBAAgB;EAC1C,IAAI,UAA+B,EAAE,GAAG,cAAc;EAEtD,QAAQ,WAAW,OAAO;EAG1B,IAAI,SAAS,SAAS,KAAK,CAAC,eAC1B,QAAQ,qBAAqB,OAAO,WAAW;EAGjD,MAAM,wBAAwB,QAAQ,iBAAiB;EACvD,IAAI,uBAAuB;GACzB,QAAQ,iBAAiB,KAAK,QAAQ,gBAAiB,GAAG,EAAE,EAAG;GAC/D,IAAI,wBAAwB,GAC1B,QAAQ,kBAAkB,MAAM,wBAAwB,EAAE;EAE9D,OACE,QAAQ,iBAAiB;EAE3B,QAAQ,gBACN,QAAQ,iBAAiB,QAAQ,WAAW;EAC9C,IAAI,kBAAkB;GAEpB,UAAU,iBAAiB,SAAS,QAAQ,KAAK;GACjD,QAAQ,UAAU;GAClB,IAAI,mBAAmB;IAGrB,OAAO,QAAQ;IACf,QAAQ,iBAAiB,QAAQ,iBAAiB;GACpD;EACF,OACE,OAAO,QAAQ;EAGjB,OAAO,QAAQ;EAEf,IACE,WAAW,SAAS,KACpB,SAAS,OAAO,KAChB,SAAS,SAAS,KAClB,CAAC,YACD;GACA,OAAO,MAAM,EAAE,WAAW,CAAC;GAC3B,OAAO,MAAM,EAAE,SAAS,CAAC;GACzB,OAAO,QAAQ;GACf,QAAQ,iBAAiB,QAAQ,iBAAiB;EACpD,OAAO,IACL,SAAS,SAAS,MACjB,QAAQ,YAAY,QAAQ,cAC7B;GACA,OAAO,MAAM,EAAE,SAAS,CAAC;GACzB,OAAO,QAAQ;GACf,QAAQ,iBAAiB,QAAQ,iBAAiB;EACpD,OAAO,IAAI,OAAO,MAAM,WAAW,EAAE,GACnC,QAAQ,UAAU;EAEpB,OAAO,SAAS,KAAK,OAAO;EAC5B,IAAI,QAAQ,kBAAkB;GAC5B,IAAI,kBAAmB;IACrB,MAAM,gBAAgB,SAAS,QAAQ,gBAAgB;IAEvD,IADqB,SAAS,QAAQ,QAAQ,gBAC/B,IAAI,eACjB,mBAAmB,QAAQ;GAE/B,OACE,mBAAmB,QAAQ;EAE/B;CACF;CAEA,IAAI,YACE;MAAA,OAAO,SAAS,EAAE,CAAC,SAAS,WAAW,SAAS,GAAG;GACrD,OAAO,MAAM,wDAAwD;GACrE,eAAe,OAAO,QAAQ;GAC9B,OAAO,SAAS,EAAE,CAAC,iBAAiB;GACpC,OAAO,WAAW;EACpB;QAEA,OAAO,SAAS,MAAM,GAAG,MAAM;EAC7B,IAAI,EAAE,uBAAuB,EAAE,qBAE7B,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,KAAK;EAK9D,IAAI,EAAE,qBACJ,OAAO;EAET,IAAI,EAAE,qBACJ,OAAO;EAGT,IAAI,EAAE,UAAW,EAAE,SACjB,OAAO;EAET,IAAI,EAAE,UAAW,EAAE,SACjB,OAAO;EAET,OAAO;CACT,CAAC;CAGH,SAAS;EACP,GAAG;EACH,GAAG,OAAO,SAAS;EACD;CACpB;CAGA,IACE,OAAO,SAAS,MAAM,YAAY,QAAQ,oBAAoB,SAAS,GACvE;EACA,OAAO,kBAAkB;EAEzB,IAAI,eAAe;EACnB,KAAK,MAAM,WAAW,OAAO,UAC3B,IAAI,QAAQ,oBAAoB,aAAa,QAAQ,oBAAoB;GACvE,MAAM,gBAAgB,6BAA6B,QACjD,QAAQ,kBACV;GAEA,IAAI,gBAAgB,cAClB,eAAe;EAEnB;EAGF,IAAI,eAAe,IACjB,OAAO,qBAAqB,6BAA6B;CAE7D;CAGA,MAAM,gBAAgB,qBAAqB,MAAM;CACjD,eAAe,QAAQ,aAAa;CAEpC,OAAO,8BAA8B,OAAO,SAAS,MAClD,YAAY,QAAQ,2BACvB;CACA,OAAO,gCAAgC,OAAO,SAAS,MACpD,YAAY,QAAQ,eAAe,UACtC;CACA,OAAO,gBAAgB,CACrB,GAAG,IAAI,IACL,OAAO,SAAS,QACb,UAAoB,YACnB,SAAS,OAAO,QAAQ,aAAc,GACxC,CAAC,CACH,CACF,CACF,CAAC,CAAC,OAAO,gBAAgB;CAKzB,IAH8B,OAAO,SAAS,MAC3C,MAAM,EAAE,sBAAsB,EAAE,mBAAmB,SAAS,CAEvC,GACtB,OAAO,qBAAqB,OAAO,KACjC,OAAO,SAAS,QAAQ,KAA8B,YAAY;EAChE,IAAI,QAAQ,oBACV,QAAQ,mBAAmB,SAAS,MAAM;GACxC,IAAI,KAAK;EACX,CAAC;EAGH,OAAO;CACT,GAAG,CAAC,CAAC,CACP;CAGF,OAAO,YAAY,OAAO,SAAS,OAAO,YAAY,QAAQ,SAAS;CAEvE,OAAO,SAAS,CACd,GAAG,IAAI,IACL,OAAO,SACJ,KAAK,YAAY,YAAY,QAAQ,MAAM,CAAC,CAAC,CAC7C,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CACrC,CACF;CACA,OAAO,YAAY,CACjB,GAAG,IAAI,IACL,OAAO,SACJ,KAAK,YAAY,YAAY,QAAQ,SAAS,CAAC,CAAC,CAChD,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CACrC,CACF;CAEA,IAAI,OAAO,SAAS,MAAM,YAAY,QAAQ,eAAe,OAAO,GAClE,OAAO,aAAa;CAGtB,OAAO,aAAa,OAAO,SAAS,MAAM,YAAY,QAAQ,UAAU;CAGxE,IAAI,OAAO,SAAS,MAAM,YAAY,QAAQ,qBAAqB,GAAG;EACpE,OAAO,wBAAwB;;EAE/B,IAAI,OAAO,SAAS,MAAM,YAAY,CAAC,QAAQ,qBAAqB,GAClE,OAAO,KACL,wEACF;CAEJ;CAEA,OAAO,cAAc,CAAC;CACtB,OAAO,uBAAuB,CAAC;CAC/B,KAAK,MAAM,WAAW,OAAO,UAAU;EACrC,IAAI,QAAQ,aACV,OAAO,cAAc;GAAE,GAAG,OAAO;GAAa,GAAG,QAAQ;EAAY;EAEvE,IAAI,QAAQ,sBACV,OAAO,uBAAuB;GAC5B,GAAG,OAAO;GACV,GAAG,QAAQ;EACb;CAEJ;CAEA,OAAO,mBAAmB,oBAAoB,OAAO,QAAQ;CAE7D,OAAO,eAAe,OAAO,SAAS,OACnC,YAAY,QAAQ,iBAAiB,KACxC;CAGA,OAAO,sBAAsB,OAAO,SAAS,OAC1C,YAAY,QAAQ,mBACvB;CACA,IACE,CAAC,OAAO,uBACR,OAAO,SAAS,MAAM,YAAY,QAAQ,mBAAmB,GAE7D,OAAO,MACL,EACE,UAAU,OAAO,SAAS,KAAK,aAAa;EAC1C,SAAS,QAAQ;EACjB,qBAAqB,QAAQ;CAC/B,EAAE,EACJ,GACA,4EACF;CAGF,MAAM,YAAY,OAAO,SACtB,IAAI,cAAc,CAAC,CACnB,QAAQ,MAAqB,QAAQ,GAAG,QAAQ,CAAC;CAEpD,IAAI,UAAU,QAAQ;EACpB,MAAM,QAAoB,CAAC;EAC3B,MAAM,KAAK;GAAC;GAAc;GAAW;GAAQ;EAAI,CAAC;EAElD,MAAM,2BAAW,IAAI,IAAY;EAEjC,KAAK,MAAM,OAAO,WAAW;GAC3B,MAAM,MAAM,cAAc,GAAG;GAC7B,IAAI,SAAS,IAAI,GAAG,GAClB;GAEF,SAAS,IAAI,GAAG;GAChB,MAAM,KAAK,GAAG;EAChB;EACA,OAAO,iBAAiB,OAAO,sBAAsB,cAAc,KAAK,CAAC,EAAE;CAC7E;CACA,MAAM,sBAAsB,KAC1B,OAAO,SACJ,KAAK,YAAY,QAAQ,mBAAmB,CAAC,CAC7C,KAAK,CAAC,CACN,OAAO,gBAAgB,CAC5B;CACA,IAAI,oBAAoB,SAAS,GAC/B,OAAO,sBAAsB;CAE/B,OAAO;AACT"}
1
+ {"version":3,"file":"generate.js","names":["template.compile","template\n .compile"],"sources":["../../../../lib/workers/repository/updates/generate.ts"],"sourcesContent":["import { isArray, isNonEmptyString, isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { markdownTable } from 'markdown-table';\nimport semver from 'semver';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { isConstraintName } from '../../../util/exec/types.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { safeStringify } from '../../../util/stringify.ts';\nimport * as template from '../../../util/template/index.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { uniq } from '../../../util/uniq.ts';\nimport { withoutUrlCredentials } from '../../../util/url.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types.ts';\nimport { CommitMessage } from '../model/commit-message.ts';\n\nfunction prettifyVersion(version: string): string {\n if (regEx(/^\\d/).test(version)) {\n return `v${version}`;\n }\n\n return version;\n}\n\nfunction isTypesGroup(branchUpgrades: BranchUpgradeConfig[]): boolean {\n return (\n branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) &&\n new Set(\n branchUpgrades.map(({ depName }) =>\n depName?.replace(regEx(/^@types\\//), ''),\n ),\n ).size === 1\n );\n}\n\nfunction sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {\n function isTypesUpgrade({ depName }: BranchUpgradeConfig): boolean {\n return !!depName?.startsWith('@types/');\n }\n const regularUpgrades = upgrades.filter(\n (upgrade) => !isTypesUpgrade(upgrade),\n );\n const typesUpgrades = upgrades.filter(isTypesUpgrade);\n upgrades.splice(0, upgrades.length);\n upgrades.push(...regularUpgrades, ...typesUpgrades);\n}\n\nfunction getTableValues(upgrade: BranchUpgradeConfig): string[] | null {\n if (!upgrade.commitBodyTable) {\n return null;\n }\n const { datasource, packageName, depName, currentVersion, newVersion } =\n upgrade;\n if (datasource && packageName && currentVersion && newVersion) {\n return [datasource, packageName, currentVersion, newVersion];\n }\n logger.trace(\n {\n datasource,\n packageName,\n depName,\n currentVersion,\n newVersion,\n },\n 'Cannot determine table values',\n );\n return null;\n}\n\nfunction compileCommitMessage(upgrade: BranchUpgradeConfig): string {\n if (upgrade.semanticCommits === 'enabled' && !upgrade.commitMessagePrefix) {\n logger.trace('Upgrade has semantic commits enabled');\n let semanticPrefix = upgrade.semanticCommitType;\n if (upgrade.semanticCommitScope) {\n semanticPrefix += `(${template.compile(\n upgrade.semanticCommitScope,\n upgrade,\n )})`;\n }\n upgrade.commitMessagePrefix = CommitMessage.formatPrefix(semanticPrefix!);\n upgrade.toLowerCase =\n regEx(/[A-Z]/).exec(upgrade.semanticCommitType!) === null &&\n !upgrade.semanticCommitType!.startsWith(':');\n }\n\n // Compile a few times in case there are nested templates\n upgrade.commitMessage = template.compile(\n upgrade.commitMessage ?? '',\n upgrade,\n );\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n upgrade.commitMessage = withoutUrlCredentials(\n template.compile(upgrade.commitMessage, upgrade),\n );\n // istanbul ignore if\n if (upgrade.commitMessage !== sanitize(upgrade.commitMessage)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets exposed in commit message',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n upgrade.commitMessage = upgrade.commitMessage.trim(); // Trim exterior whitespace\n upgrade.commitMessage = upgrade.commitMessage.replace(regEx(/\\s+/g), ' '); // Trim extra whitespace inside string\n upgrade.commitMessage = upgrade.commitMessage.replace(\n regEx(/to vv(?<digit>\\d)/),\n 'to v$<digit>',\n );\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n // We only need to lowercase the first line\n const splitMessage = upgrade.commitMessage.split(newlineRegex);\n splitMessage[0] = splitMessage[0].toLowerCase();\n upgrade.commitMessage = splitMessage.join('\\n');\n }\n\n logger.trace(`commitMessage: ${JSON.stringify(upgrade.commitMessage)}`);\n return upgrade.commitMessage;\n}\n\nfunction compilePrTitle(\n upgrade: BranchUpgradeConfig,\n commitMessage: string,\n): void {\n if (upgrade.prTitle) {\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = withoutUrlCredentials(\n template\n .compile(upgrade.prTitle, upgrade)\n .trim()\n .replace(regEx(/\\s+/g), ' '),\n );\n // istanbul ignore if\n if (upgrade.prTitle !== sanitize(upgrade.prTitle)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets were exposed in PR title',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n upgrade.prTitle = upgrade.prTitle.toLowerCase();\n }\n } else {\n [upgrade.prTitle] = commitMessage.split(newlineRegex);\n }\n if (!upgrade.prTitleStrict) {\n upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';\n if (upgrade.isGroup) {\n const hasVersionInTitle = !!semver.coerce(\n template.compile(upgrade.commitMessageExtra ?? '', upgrade),\n );\n if (!hasVersionInTitle) {\n upgrade.prTitle +=\n upgrade.updateType === 'major' && upgrade.separateMajorMinor\n ? ' (major)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'minor' && upgrade.separateMinorPatch\n ? ' (minor)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'patch' && upgrade.separateMinorPatch\n ? ' (patch)'\n : '';\n }\n }\n }\n // Compile again to allow for nested templates\n upgrade.prTitle = withoutUrlCredentials(\n template.compile(upgrade.prTitle, upgrade),\n );\n logger.trace(`prTitle: ${JSON.stringify(upgrade.prTitle)}`);\n}\n\nfunction getMinimumGroupSize(upgrades: BranchUpgradeConfig[]): number {\n let minimumGroupSize = 1;\n const groupSizes = new Set<number>();\n\n for (const upg of upgrades) {\n if (upg.minimumGroupSize) {\n groupSizes.add(upg.minimumGroupSize);\n if (minimumGroupSize < upg.minimumGroupSize) {\n minimumGroupSize = upg.minimumGroupSize;\n }\n }\n }\n\n if (groupSizes.size > 1) {\n logger.debug(\n 'Multiple minimumGroupSize values found for this branch, using highest.',\n );\n }\n\n return minimumGroupSize;\n}\n\n// Sorted by priority, from low to high\nconst semanticCommitTypeByPriority = ['chore', 'ci', 'build', 'fix', 'feat'];\n\nexport function generateBranchConfig(\n upgrades: BranchUpgradeConfig[],\n): BranchConfig {\n let branchUpgrades = upgrades;\n if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {\n // If the branch isn't pending, then remove any upgrades within which *are*\n logger.debug(\n { branch: branchUpgrades[0].branchName },\n 'Branch is not pending, removing pending upgrades',\n );\n branchUpgrades = branchUpgrades.filter((upgrade) => !upgrade.pendingChecks);\n }\n logger.trace({ config: branchUpgrades }, 'generateBranchConfig');\n let config: BranchConfig = {\n upgrades: [],\n } as any;\n const hasGroupName = branchUpgrades[0].groupName !== null;\n logger.trace(`hasGroupName: ${hasGroupName}`);\n // Use group settings only if multiple upgrades or lazy grouping is disabled\n const depNames: string[] = [];\n const newValue: string[] = [];\n const toVersions: string[] = [];\n const toValues = new Set<string>();\n const depTypes = new Set<string>();\n for (const upg of branchUpgrades) {\n upg.recreateClosed = upg.recreateWhen === 'always';\n\n if (upg.currentDigest) {\n upg.currentDigestShort =\n upg.currentDigestShort ??\n upg.currentDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.newDigest) {\n upg.newDigestShort =\n upg.newDigestShort ??\n upg.newDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.isDigest || upg.isPinDigest) {\n upg.displayFrom = upg.currentDigestShort;\n upg.displayTo = upg.newDigestShort;\n } else if (upg.isLockfileUpdate) {\n upg.displayFrom = upg.currentVersion;\n upg.displayTo = upg.newVersion;\n } else if (!upg.isLockFileMaintenance) {\n upg.displayFrom = upg.currentValue;\n upg.displayTo = upg.newValue;\n }\n\n if (upg.isLockFileMaintenance) {\n upg.recreateClosed = upg.recreateWhen !== 'never';\n }\n upg.displayFrom ??= '';\n upg.displayTo ??= '';\n if (!depNames.includes(upg.depName!)) {\n depNames.push(upg.depName!);\n }\n if (!toVersions.includes(upg.newVersion!)) {\n toVersions.push(upg.newVersion!);\n }\n toValues.add(upg.newValue!);\n if (upg.depType) {\n depTypes.add(upg.depType);\n }\n // prettify newVersion and newMajor for printing\n if (upg.newVersion) {\n upg.prettyNewVersion = prettifyVersion(upg.newVersion);\n }\n if (upg.newMajor) {\n upg.prettyNewMajor = `v${upg.newMajor}`;\n }\n if (upg.commitMessageExtra) {\n const extra = template.compile(upg.commitMessageExtra, upg);\n if (!newValue.includes(extra)) {\n newValue.push(extra);\n }\n }\n }\n const groupEligible =\n depNames.length > 1 ||\n toVersions.length > 1 ||\n (!toVersions[0] && newValue.length > 1);\n\n const typesGroup =\n depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades);\n logger.trace(`groupEligible: ${groupEligible}`);\n const singleUpdateGroup =\n hasGroupName && !groupEligible && !branchUpgrades[0].sharedVariableName;\n logger.trace(`singleUpdateGroup: ${singleUpdateGroup}`);\n const useGroupSettings =\n hasGroupName &&\n (groupEligible ||\n (singleUpdateGroup && branchUpgrades[0].groupSingleUpdates === true));\n logger.trace(`useGroupSettings: ${useGroupSettings}`);\n let releaseTimestamp: Timestamp;\n\n if (depTypes.size) {\n config.depTypes = Array.from(depTypes).sort();\n }\n\n for (const branchUpgrade of branchUpgrades) {\n let upgrade: BranchUpgradeConfig = { ...branchUpgrade };\n\n upgrade.depTypes = config.depTypes;\n\n // needs to be done for each upgrade, as we reorder them below\n if (newValue.length > 1 && !groupEligible) {\n upgrade.commitMessageExtra = `to v${toVersions[0]}`;\n }\n\n const pendingVersionsLength = upgrade.pendingVersions?.length;\n if (pendingVersionsLength) {\n upgrade.displayPending = `\\`${upgrade.pendingVersions!.at(-1)!}\\``;\n if (pendingVersionsLength > 1) {\n upgrade.displayPending += ` (+${pendingVersionsLength - 1})`;\n }\n } else {\n upgrade.displayPending = '';\n }\n upgrade.prettyDepType =\n upgrade.prettyDepType ?? upgrade.depType ?? 'dependency';\n if (useGroupSettings) {\n // Now overwrite original config with group config\n upgrade = mergeChildConfig(upgrade, upgrade.group);\n upgrade.isGroup = true;\n if (singleUpdateGroup) {\n // Single update using group name instead of dependency name,\n // so remove version from commit message.\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n }\n } else {\n delete upgrade.groupName;\n }\n // Delete group config regardless of whether it was applied\n delete upgrade.group;\n\n if (\n toVersions.length > 1 &&\n toValues.size > 1 &&\n newValue.length > 1 &&\n !typesGroup\n ) {\n logger.trace({ toVersions });\n logger.trace({ toValues });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (\n newValue.length > 1 &&\n (upgrade.isDigest || upgrade.isPinDigest)\n ) {\n logger.trace({ newValue });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (semver.valid(toVersions[0])) {\n upgrade.isRange = false;\n }\n config.upgrades.push(upgrade);\n if (upgrade.releaseTimestamp) {\n if (releaseTimestamp!) {\n const existingStamp = DateTime.fromISO(releaseTimestamp);\n const upgradeStamp = DateTime.fromISO(upgrade.releaseTimestamp);\n if (upgradeStamp > existingStamp) {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n } else {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n }\n }\n\n if (typesGroup) {\n if (config.upgrades[0].depName?.startsWith('@types/')) {\n logger.debug('Found @types - reversing upgrades to use depName in PR');\n sortTypesGroup(config.upgrades);\n config.upgrades[0].recreateClosed = false;\n config.hasTypes = true;\n }\n } else {\n config.upgrades.sort((a, b) => {\n if (a.fileReplacePosition && b.fileReplacePosition) {\n // This is because we need to replace from the bottom of the file up\n return a.fileReplacePosition > b.fileReplacePosition ? -1 : 1;\n }\n\n // make sure that ordering is consistent :\n // items without position will be first in the list.\n if (a.fileReplacePosition) {\n return 1;\n }\n if (b.fileReplacePosition) {\n return -1;\n }\n\n if (a.depName! < b.depName!) {\n return -1;\n }\n if (a.depName! > b.depName!) {\n return 1;\n }\n return 0;\n });\n }\n // Now assign first upgrade's config as branch config\n config = {\n ...config,\n ...config.upgrades[0],\n releaseTimestamp: releaseTimestamp!,\n }; // TODO: fixme (#9666)\n\n // Enable `semanticCommits` if one of the branches has it enabled\n if (\n config.upgrades.some((upgrade) => upgrade.semanticCommits === 'enabled')\n ) {\n config.semanticCommits = 'enabled';\n // Calculate the highest priority `semanticCommitType`\n let highestIndex = -1;\n for (const upgrade of config.upgrades) {\n if (upgrade.semanticCommits === 'enabled' && upgrade.semanticCommitType) {\n const priorityIndex = semanticCommitTypeByPriority.indexOf(\n upgrade.semanticCommitType,\n );\n\n if (priorityIndex > highestIndex) {\n highestIndex = priorityIndex;\n }\n }\n }\n\n if (highestIndex > -1) {\n config.semanticCommitType = semanticCommitTypeByPriority[highestIndex];\n }\n }\n\n // Use templates to generate strings\n const commitMessage = compileCommitMessage(config);\n compilePrTitle(config, commitMessage);\n\n config.dependencyDashboardApproval = config.upgrades.some(\n (upgrade) => upgrade.dependencyDashboardApproval,\n );\n config.dependencyDashboardPrApproval = config.upgrades.some(\n (upgrade) => upgrade.prCreation === 'approval',\n );\n config.prBodyColumns = [\n ...new Set(\n config.upgrades.reduce(\n (existing: string[], upgrade) =>\n existing.concat(upgrade.prBodyColumns!),\n [],\n ),\n ),\n ].filter(isNonEmptyString);\n // combine excludeCommitPaths for multiple manager experience\n const hasExcludeCommitPaths = config.upgrades.some(\n (u) => u.excludeCommitPaths && u.excludeCommitPaths.length > 0,\n );\n if (hasExcludeCommitPaths) {\n config.excludeCommitPaths = Object.keys(\n config.upgrades.reduce((acc: Record<string, boolean>, upgrade) => {\n if (upgrade.excludeCommitPaths) {\n upgrade.excludeCommitPaths.forEach((p) => {\n acc[p] = true;\n });\n }\n\n return acc;\n }, {}),\n );\n }\n\n config.automerge = config.upgrades.every((upgrade) => upgrade.automerge);\n // combine all labels\n config.labels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => coerceArray(upgrade.labels))\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n config.addLabels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => coerceArray(upgrade.addLabels))\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n\n if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {\n config.updateType = 'major';\n }\n\n config.isBreaking = config.upgrades.some((upgrade) => upgrade.isBreaking);\n\n // explicit set `isLockFileMaintenance` for the branch for groups\n if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n config.isLockFileMaintenance = true;\n // istanbul ignore if: should never happen\n if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {\n logger.warn(\n 'Grouping lockfile maintenance with other update types is not supported',\n );\n }\n }\n\n // a branch which updates a tool constraint should use its new value, i.e. when installing tools for `postUpgradeTasks` or artifact updates\n const constraintUpdates = config.upgrades.flatMap(\n ({ manager, depType, depName, currentValue, newValue }) =>\n manager === 'renovate-config' &&\n depType === 'tool-constraint' &&\n isConstraintName(depName) &&\n newValue\n ? [{ depName, currentValue, newValue }]\n : [],\n );\n for (const upgrade of config.upgrades) {\n for (const { depName, currentValue, newValue } of constraintUpdates) {\n // only replace the constraint being updated, not a different value which may have been configured i.e. via `packageRules`\n if (upgrade.constraints?.[depName] === currentValue) {\n upgrade.constraints = { ...upgrade.constraints, [depName]: newValue };\n }\n }\n }\n\n config.constraints = {};\n config.extractedConstraints = {};\n for (const upgrade of config.upgrades) {\n if (upgrade.constraints) {\n config.constraints = { ...config.constraints, ...upgrade.constraints };\n }\n if (upgrade.extractedConstraints) {\n config.extractedConstraints = {\n ...config.extractedConstraints,\n ...upgrade.extractedConstraints,\n };\n }\n }\n\n config.minimumGroupSize = getMinimumGroupSize(config.upgrades);\n // Set skipInstalls to false if any upgrade in the branch has it false\n config.skipInstalls = config.upgrades.every(\n (upgrade) => upgrade.skipInstalls !== false,\n );\n\n // Artifact updating will only be skipped if every upgrade wants to skip it.\n config.skipArtifactsUpdate = config.upgrades.every(\n (upgrade) => upgrade.skipArtifactsUpdate,\n );\n if (\n !config.skipArtifactsUpdate &&\n config.upgrades.some((upgrade) => upgrade.skipArtifactsUpdate)\n ) {\n logger.debug(\n {\n upgrades: config.upgrades.map((upgrade) => ({\n depName: upgrade.depName,\n skipArtifactsUpdate: upgrade.skipArtifactsUpdate,\n })),\n },\n 'Mixed `skipArtifactsUpdate` values in upgrades. Artifacts will be updated.',\n );\n }\n\n const tableRows = config.upgrades\n .map(getTableValues)\n .filter((x): x is string[] => isArray(x, isString));\n\n if (tableRows.length) {\n const table: string[][] = [];\n table.push(['datasource', 'package', 'from', 'to']);\n\n const seenRows = new Set<string>();\n\n for (const row of tableRows) {\n const key = safeStringify(row);\n if (seenRows.has(key)) {\n continue;\n }\n seenRows.add(key);\n table.push(row);\n }\n config.commitMessage += `\\n\\n${withoutUrlCredentials(markdownTable(table))}\\n`;\n }\n const additionalReviewers = uniq(\n config.upgrades\n .map((upgrade) => upgrade.additionalReviewers)\n .flat()\n .filter(isNonEmptyString),\n );\n if (additionalReviewers.length > 0) {\n config.additionalReviewers = additionalReviewers;\n }\n return config;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ConstraintName } from "../util/exec/types.js";
1
+ import { ConstraintName, ToolName } from "../util/exec/types.js";
2
2
  import { Timestamp } from "../util/timestamp.js";
3
3
  import { Release } from "../modules/datasource/types.js";
4
4
  import { RegexManagerConfig } from "../modules/manager/custom/regex/types.js";
@@ -10,7 +10,7 @@ import { BranchStatus } from "../types/branch-status.js";
10
10
  import "../types/index.js";
11
11
  import { ArtifactError, ArtifactNotice, ExtractConfig, LookupUpdate, PackageDependency, PackageFile } from "../modules/manager/types.js";
12
12
  import { JSONataManagerConfig } from "../modules/manager/custom/jsonata/types.js";
13
- import { GroupConfig, LegacyAdminConfig, RenovateConfig, RenovateSharedConfig, UpdateType, ValidationMessage } from "../config/types.js";
13
+ import { GroupConfig, LegacyAdminConfig, PostUpgradeTasks, RenovateConfig, RenovateSharedConfig, UpdateType, ValidationMessage } from "../config/types.js";
14
14
  import { Merge } from "type-fest";
15
15
  //#region lib/workers/types.d.ts
16
16
  export type ReleaseWithNotes = Release & Partial<ChangeLogRelease>;
@@ -212,9 +212,11 @@ export interface UpgradeFingerprintConfig {
212
212
  newVersion?: string;
213
213
  packageFile?: string;
214
214
  replaceString?: string;
215
+ constraints?: Partial<Record<ToolName, string>>;
215
216
  postUpgradeTasks?: {
216
217
  commands?: string[];
217
218
  fileFilters?: string[];
219
+ installTools?: PostUpgradeTasks['installTools'];
218
220
  };
219
221
  }
220
222
  export interface ExtractResult {
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.181.2",
4
+ "version": "44.181.3",
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.181.2 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.181.3 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.181.2",
5
+ "x-renovate-version": "44.181.3",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {