renovate 44.231.0 → 44.232.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/migrations/custom/dependency-dashboard-migration.js +38 -0
- package/dist/config/migrations/custom/dependency-dashboard-migration.js.map +1 -0
- package/dist/config/migrations/migrations-service.js +3 -1
- package/dist/config/migrations/migrations-service.js.map +1 -1
- package/dist/config/options/index.js +81 -60
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/internal/default.preset.js +2 -2
- package/dist/config/presets/internal/default.preset.js.map +1 -1
- package/dist/config/types.d.ts +13 -10
- package/dist/config/types.js +1 -0
- package/dist/config/types.js.map +1 -1
- package/dist/config/validation.js +2 -1
- package/dist/config/validation.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/workers/global/config/parse/cli.js +1 -1
- package/dist/workers/global/config/parse/cli.js.map +1 -1
- package/dist/workers/global/config/parse/env.js +26 -11
- package/dist/workers/global/config/parse/env.js.map +1 -1
- package/dist/workers/repository/dependency-dashboard.js +21 -19
- package/dist/workers/repository/dependency-dashboard.js.map +1 -1
- package/dist/workers/repository/update/pr/body/index.js +1 -1
- package/dist/workers/repository/update/pr/body/index.js.map +1 -1
- package/package.json +4 -4
- package/renovate-schema.json +118 -91
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/env.ts"],"sourcesContent":["import { isArray, isPlainObject } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { getEnvName } from '../../../../config/options/env.ts';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig, RenovateOptions } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { parseJson } from '../../../../util/common.ts';\nimport { coersions } from './coersions.ts';\nimport { migrateAndValidateConfig } from './util.ts';\n\nfunction normalizePrefixes(\n env: NodeJS.ProcessEnv,\n prefix: string | undefined,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n if (prefix) {\n for (const [key, val] of Object.entries(result)) {\n if (key.startsWith(prefix)) {\n const newKey = key.replace(prefix, 'RENOVATE_');\n result[newKey] = val;\n delete result[key];\n }\n }\n }\n return result;\n}\n\nconst renameKeys = {\n aliases: 'registryAliases',\n azureAutoComplete: 'platformAutomerge', // migrate: azureAutoComplete\n gitLabAutomerge: 'platformAutomerge', // migrate: gitLabAutomerge\n mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint',\n mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources',\n allowedPostUpgradeCommands: 'allowedCommands',\n baseBranches: 'baseBranchPatterns',\n};\n\nfunction renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [from, to] of Object.entries(renameKeys)) {\n const fromKey = getEnvName({ name: from });\n const toKey = getEnvName({ name: to });\n if (env[fromKey]) {\n result[toKey] = env[fromKey];\n delete result[fromKey];\n }\n }\n return result;\n}\n\nconst migratedKeysWithValues = [\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'true',\n to: 'always',\n },\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'false',\n to: 'auto',\n },\n];\n\nfunction massageEnvKeyValues(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const { oldName, newName, from, to } of migratedKeysWithValues) {\n const key = getEnvName({ name: oldName });\n if (env[key] !== undefined && result[key] === from) {\n delete result[key];\n result[getEnvName({ name: newName })] = to;\n }\n }\n return result;\n}\n\ninterface ConvertedExperimentalEnvVar {\n optionName: string;\n // Normalize the raw env var value before passing it through, if needed.\n normalizeValue?: (value: string) => string;\n}\n\n// Maps RENOVATE_X_ env vars that have been promoted to regular config options\n// to the option name they now correspond to.\nexport const convertedExperimentalEnvVars: ReadonlyMap<\n string,\n ConvertedExperimentalEnvVar\n> = new Map([\n ['RENOVATE_X_AUTODISCOVER_REPO_SORT', { optionName: 'autodiscoverRepoSort' }],\n [\n 'RENOVATE_X_AUTODISCOVER_REPO_ORDER',\n { optionName: 'autodiscoverRepoOrder' },\n ],\n ['RENOVATE_X_DOCKER_MAX_PAGES', { optionName: 'dockerMaxPages' }],\n ['RENOVATE_X_DELETE_CONFIG_FILE', { optionName: 'deleteConfigFile' }],\n ['RENOVATE_X_S3_ENDPOINT', { optionName: 's3Endpoint' }],\n ['RENOVATE_X_S3_PATH_STYLE', { optionName: 's3PathStyle' }],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL',\n { optionName: 'mergeConfidenceEndpoint' },\n ],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_SUPPORTED_DATASOURCES',\n { optionName: 'mergeConfidenceDatasources' },\n ],\n [\n 'RENOVATE_X_REPO_CACHE_FORCE_LOCAL',\n {\n optionName: 'repositoryCacheForceLocal',\n // The old env var was treated as a flag: any non-empty value meant true.\n normalizeValue: (v: string) => (v ? 'true' : v),\n },\n ],\n]);\n\n/**\n * Massages the experimental env vars which have been converted to config options\n *\n * e.g. RENOVATE_X_AUTODISCOVER_REPO_SORT -> RENOVATE_AUTODISCOVER_REPO_SORT\n */\nfunction massageConvertedExperimentalVars(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [\n oldKey,\n { optionName, normalizeValue },\n ] of convertedExperimentalEnvVars) {\n if (env[oldKey] !== undefined) {\n const newKey = getEnvName({ name: optionName });\n result[newKey] = normalizeValue\n ? normalizeValue(env[oldKey])\n : env[oldKey];\n delete result[oldKey];\n }\n }\n return result;\n}\n\n/**\n * Combines an env value with the value from `RENOVATE_CONFIG`: mergeable lists are appended, mergeable objects are shallow-merged, anything else is replaced.\n */\nfunction mergeEnvValue(\n option: Readonly<RenovateOptions>,\n existing: unknown,\n value: unknown,\n): unknown {\n if (option.mergeable) {\n if (isArray(existing) && isArray(value)) {\n return [...existing, ...value];\n }\n if (isPlainObject(existing) && isPlainObject(value)) {\n return { ...existing, ...value };\n }\n }\n return value;\n}\n\nexport async function getConfig(\n inputEnv: NodeJS.ProcessEnv,\n configEnvKey = 'RENOVATE_CONFIG',\n): Promise<AllConfig> {\n const env = prepareEnv(inputEnv);\n const config = await parseAndValidateOrExit(env, configEnvKey);\n\n const options = getOptions();\n config.hostRules ??= [];\n\n for (const option of options) {\n if (option.env === false) {\n continue;\n }\n\n const envName = getEnvName(option);\n const envVal = env[envName];\n if (!envVal) {\n continue;\n }\n\n if (option.type === 'array' && option.subType === 'object') {\n try {\n const parsed = JSON5.parse(envVal);\n if (isArray(parsed)) {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = mergeEnvValue(\n option,\n config[option.name as keyof AllConfig],\n parsed,\n );\n } else {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse object array',\n );\n }\n } catch {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse environment variable',\n );\n }\n } else {\n const coerce = coersions[option.type];\n try {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = mergeEnvValue(\n option,\n config[option.name as keyof AllConfig],\n coerce(envVal),\n );\n } catch (e) {\n throw new Error(`${envName} was invalid: ${e}`);\n }\n\n if (option.name === 'dryRun') {\n if ((config[option.name] as string) === 'true') {\n logger.warn('env config dryRun property has been changed to full');\n config[option.name] = 'full';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn('env config dryRun property has been changed to null');\n delete config[option.name];\n } else if ((config[option.name] as string) === 'null') {\n delete config[option.name];\n }\n }\n\n if (option.name === 'requireConfig') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n\n if (option.name === 'platformCommit') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config platformCommit property has been changed to enabled',\n );\n config[option.name] = 'enabled';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config platformCommit property has been changed to disabled',\n );\n config[option.name] = 'disabled';\n }\n }\n }\n }\n\n const githubComToken = env.GITHUB_COM_TOKEN ?? env.RENOVATE_GITHUB_COM_TOKEN;\n if (githubComToken) {\n logger.debug(`Converting GITHUB_COM_TOKEN into a global host rule`);\n config.hostRules.push({\n hostType: 'github',\n matchHost: 'github.com',\n token: githubComToken,\n });\n }\n\n // These env vars are deprecated and deleted to make sure they're not used\n const unsupportedEnv = [\n 'BITBUCKET_TOKEN',\n 'BITBUCKET_USERNAME',\n 'BITBUCKET_PASSWORD',\n 'GITHUB_ENDPOINT',\n 'GITHUB_TOKEN',\n 'GITLAB_ENDPOINT',\n 'GITLAB_TOKEN',\n 'VSTS_ENDPOINT',\n 'VSTS_TOKEN',\n ];\n\n for (const val of unsupportedEnv) {\n delete env[val];\n }\n\n return config;\n}\n\nexport function prepareEnv(inputEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n let env = normalizePrefixes(inputEnv, inputEnv.ENV_PREFIX);\n env = massageConvertedExperimentalVars(env);\n env = renameEnvKeys(env);\n // massage the values of migrated configuration keys\n return massageEnvKeyValues(env);\n}\n\nexport async function parseAndValidateOrExit(\n env: NodeJS.ProcessEnv,\n configEnvKey: string,\n): Promise<AllConfig> {\n if (!env[configEnvKey]) {\n return {};\n }\n\n try {\n const config = parseJson(\n env[configEnvKey],\n `${configEnvKey}.env.json5`,\n ) as AllConfig;\n logger.debug({ config }, `Detected config in env ${configEnvKey}`);\n\n return await migrateAndValidateConfig(config, `${configEnvKey}`);\n } catch (err) {\n logger.fatal(\n { err, configEnvKey },\n 'Could not parse config environment variable',\n );\n process.exit(1);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"env.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/env.ts"],"sourcesContent":["import { isArray, isPlainObject } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { getEnvName } from '../../../../config/options/env.ts';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig, RenovateOptions } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { parseJson } from '../../../../util/common.ts';\nimport { coersions } from './coersions.ts';\nimport { migrateAndValidateConfig } from './util.ts';\n\nfunction normalizePrefixes(\n env: NodeJS.ProcessEnv,\n prefix: string | undefined,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n if (prefix) {\n for (const [key, val] of Object.entries(result)) {\n if (key.startsWith(prefix)) {\n const newKey = key.replace(prefix, 'RENOVATE_');\n result[newKey] = val;\n delete result[key];\n }\n }\n }\n return result;\n}\n\nconst renameKeys = {\n aliases: 'registryAliases',\n azureAutoComplete: 'platformAutomerge', // migrate: azureAutoComplete\n gitLabAutomerge: 'platformAutomerge', // migrate: gitLabAutomerge\n mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint',\n mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources',\n allowedPostUpgradeCommands: 'allowedCommands',\n baseBranches: 'baseBranchPatterns',\n};\n\nfunction renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [from, to] of Object.entries(renameKeys)) {\n const fromKey = getEnvName({ name: from });\n const toKey = getEnvName({ name: to });\n if (env[fromKey]) {\n result[toKey] = env[fromKey];\n delete result[fromKey];\n }\n }\n return result;\n}\n\nconst migratedKeysWithValues = [\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'true',\n to: 'always',\n },\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'false',\n to: 'auto',\n },\n {\n oldName: 'dependencyDashboard',\n newName: 'dependencyDashboard',\n from: 'true',\n to: '{\"enabled\":true}',\n },\n {\n oldName: 'dependencyDashboard',\n newName: 'dependencyDashboard',\n from: 'false',\n to: '{\"enabled\":false}',\n },\n];\n\nfunction massageEnvKeyValues(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const { oldName, newName, from, to } of migratedKeysWithValues) {\n const key = getEnvName({ name: oldName });\n if (env[key] !== undefined && result[key] === from) {\n delete result[key];\n result[getEnvName({ name: newName })] = to;\n }\n }\n return result;\n}\n\ninterface ConvertedExperimentalEnvVar {\n optionName: string;\n // Normalize the raw env var value before passing it through, if needed.\n normalizeValue?: (value: string) => string;\n}\n\n// Maps RENOVATE_X_ env vars that have been promoted to regular config options\n// to the option name they now correspond to.\nexport const convertedExperimentalEnvVars: ReadonlyMap<\n string,\n ConvertedExperimentalEnvVar\n> = new Map([\n ['RENOVATE_X_AUTODISCOVER_REPO_SORT', { optionName: 'autodiscoverRepoSort' }],\n [\n 'RENOVATE_X_AUTODISCOVER_REPO_ORDER',\n { optionName: 'autodiscoverRepoOrder' },\n ],\n ['RENOVATE_X_DOCKER_MAX_PAGES', { optionName: 'dockerMaxPages' }],\n ['RENOVATE_X_DELETE_CONFIG_FILE', { optionName: 'deleteConfigFile' }],\n ['RENOVATE_X_S3_ENDPOINT', { optionName: 's3Endpoint' }],\n ['RENOVATE_X_S3_PATH_STYLE', { optionName: 's3PathStyle' }],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL',\n { optionName: 'mergeConfidenceEndpoint' },\n ],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_SUPPORTED_DATASOURCES',\n { optionName: 'mergeConfidenceDatasources' },\n ],\n [\n 'RENOVATE_X_REPO_CACHE_FORCE_LOCAL',\n {\n optionName: 'repositoryCacheForceLocal',\n // The old env var was treated as a flag: any non-empty value meant true.\n normalizeValue: (v: string) => (v ? 'true' : v),\n },\n ],\n]);\n\n/**\n * Massages the experimental env vars which have been converted to config options\n *\n * e.g. RENOVATE_X_AUTODISCOVER_REPO_SORT -> RENOVATE_AUTODISCOVER_REPO_SORT\n */\nfunction massageConvertedExperimentalVars(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [\n oldKey,\n { optionName, normalizeValue },\n ] of convertedExperimentalEnvVars) {\n if (env[oldKey] !== undefined) {\n const newKey = getEnvName({ name: optionName });\n result[newKey] = normalizeValue\n ? normalizeValue(env[oldKey])\n : env[oldKey];\n delete result[oldKey];\n }\n }\n return result;\n}\n\n/**\n * Combines an env value with the value from `RENOVATE_CONFIG`: mergeable lists are appended, mergeable objects are shallow-merged, anything else is replaced.\n */\nfunction mergeEnvValue(\n option: Readonly<RenovateOptions>,\n existing: unknown,\n value: unknown,\n): unknown {\n if (option.mergeable) {\n if (isArray(existing) && isArray(value)) {\n return [...existing, ...value];\n }\n if (isPlainObject(existing) && isPlainObject(value)) {\n return { ...existing, ...value };\n }\n }\n return value;\n}\n\nexport async function getConfig(\n inputEnv: NodeJS.ProcessEnv,\n configEnvKey = 'RENOVATE_CONFIG',\n): Promise<AllConfig> {\n const env = prepareEnv(inputEnv);\n const config = await parseAndValidateOrExit(env, configEnvKey);\n\n const options = getOptions();\n config.hostRules ??= [];\n\n for (const option of options) {\n if (option.env === false) {\n continue;\n }\n\n const envName = getEnvName(option);\n const envVal = env[envName];\n if (!envVal) {\n continue;\n }\n\n if (option.type === 'array' && option.subType === 'object') {\n try {\n const parsed = JSON5.parse(envVal);\n if (isArray(parsed)) {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = mergeEnvValue(\n option,\n config[option.name as keyof AllConfig],\n parsed,\n );\n } else {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse object array',\n );\n }\n } catch {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse environment variable',\n );\n }\n } else {\n const coerce = coersions[option.type];\n try {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = mergeEnvValue(\n option,\n config[option.name as keyof AllConfig],\n coerce(envVal),\n );\n } catch (e) {\n throw new Error(`${envName} was invalid: ${e}`);\n }\n\n if (option.name === 'dryRun') {\n if ((config[option.name] as string) === 'true') {\n logger.warn('env config dryRun property has been changed to full');\n config[option.name] = 'full';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn('env config dryRun property has been changed to null');\n delete config[option.name];\n } else if ((config[option.name] as string) === 'null') {\n delete config[option.name];\n }\n }\n\n if (option.name === 'requireConfig') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n\n if (option.name === 'platformCommit') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config platformCommit property has been changed to enabled',\n );\n config[option.name] = 'enabled';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config platformCommit property has been changed to disabled',\n );\n config[option.name] = 'disabled';\n }\n }\n }\n }\n\n const githubComToken = env.GITHUB_COM_TOKEN ?? env.RENOVATE_GITHUB_COM_TOKEN;\n if (githubComToken) {\n logger.debug(`Converting GITHUB_COM_TOKEN into a global host rule`);\n config.hostRules.push({\n hostType: 'github',\n matchHost: 'github.com',\n token: githubComToken,\n });\n }\n\n // These env vars are deprecated and deleted to make sure they're not used\n const unsupportedEnv = [\n 'BITBUCKET_TOKEN',\n 'BITBUCKET_USERNAME',\n 'BITBUCKET_PASSWORD',\n 'GITHUB_ENDPOINT',\n 'GITHUB_TOKEN',\n 'GITLAB_ENDPOINT',\n 'GITLAB_TOKEN',\n 'VSTS_ENDPOINT',\n 'VSTS_TOKEN',\n ];\n\n for (const val of unsupportedEnv) {\n delete env[val];\n }\n\n return config;\n}\n\nexport function prepareEnv(inputEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n let env = normalizePrefixes(inputEnv, inputEnv.ENV_PREFIX);\n env = massageConvertedExperimentalVars(env);\n env = renameEnvKeys(env);\n // massage the values of migrated configuration keys\n return massageEnvKeyValues(env);\n}\n\nexport async function parseAndValidateOrExit(\n env: NodeJS.ProcessEnv,\n configEnvKey: string,\n): Promise<AllConfig> {\n if (!env[configEnvKey]) {\n return {};\n }\n\n try {\n const config = parseJson(\n env[configEnvKey],\n `${configEnvKey}.env.json5`,\n ) as AllConfig;\n logger.debug({ config }, `Detected config in env ${configEnvKey}`);\n\n return await migrateAndValidateConfig(config, `${configEnvKey}`);\n } catch (err) {\n logger.fatal(\n { err, configEnvKey },\n 'Could not parse config environment variable',\n );\n process.exit(1);\n }\n}\n"],"mappings":"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"}
|
|
@@ -100,9 +100,8 @@ async function readDashboardBody(config) {
|
|
|
100
100
|
};
|
|
101
101
|
const stringifiedConfig = JSON.stringify(config);
|
|
102
102
|
if (config.mode === "silent") logger.debug("Ignoring Dependency Dashboard checkboxes when mode=silent");
|
|
103
|
-
else if (config.dependencyDashboard === true || stringifiedConfig.includes("\"dependencyDashboardApproval\":true") || stringifiedConfig.includes("\"prCreation\":\"approval\"")) {
|
|
104
|
-
|
|
105
|
-
const issue = await platform.findIssue(config.dependencyDashboardTitle);
|
|
103
|
+
else if (config.dependencyDashboard?.enabled === true || stringifiedConfig.includes("\"dependencyDashboardApproval\":true") || stringifiedConfig.includes("\"prCreation\":\"approval\"")) {
|
|
104
|
+
const issue = await platform.findIssue(getDashboardTitle(config));
|
|
106
105
|
if (issue) {
|
|
107
106
|
config.dependencyDashboardIssue = issue.number;
|
|
108
107
|
dashboardChecks = parseDashboardIssue(issue.body ?? "");
|
|
@@ -122,6 +121,9 @@ async function readDashboardBody(config) {
|
|
|
122
121
|
function needsDashboardApproval(branch) {
|
|
123
122
|
return !!branch.dependencyDashboardApproval || !!branch.dependencyDashboardPrApproval;
|
|
124
123
|
}
|
|
124
|
+
function getDashboardTitle(config) {
|
|
125
|
+
return config.dependencyDashboard?.title ?? "Dependency Dashboard";
|
|
126
|
+
}
|
|
125
127
|
function formatAsMarkdownLink(name, url) {
|
|
126
128
|
return url ? `[${name}](${url})` : `\`${name}\``;
|
|
127
129
|
}
|
|
@@ -191,7 +193,7 @@ function appendRepoProblems(config, issueBody) {
|
|
|
191
193
|
const repoProblems = extractRepoProblems(config.repository);
|
|
192
194
|
if (repoProblems.size) {
|
|
193
195
|
newIssueBody += "## Repository Problems\n\n";
|
|
194
|
-
const repoProblemsHeader = config.
|
|
196
|
+
const repoProblemsHeader = config.dependencyDashboard?.customize?.repoProblemsHeader ?? "Renovate tried to run on this repository, but found these problems.";
|
|
195
197
|
newIssueBody += `${compile(repoProblemsHeader, config)}\n\n`;
|
|
196
198
|
for (const repoProblem of repoProblems) newIssueBody += ` - ${repoProblem}\n`;
|
|
197
199
|
newIssueBody += "\n";
|
|
@@ -206,11 +208,11 @@ async function ensureDependencyDashboard(config, allBranches, packageFiles = {},
|
|
|
206
208
|
}
|
|
207
209
|
const reuseTitle = "Update Dependencies (Renovate Bot)";
|
|
208
210
|
const branches = allBranches.filter((branch) => branch.result !== "automerged" && !branch.upgrades?.every((upgrade) => upgrade.remediationNotPossible));
|
|
209
|
-
if (!(config.dependencyDashboard === true || config.dependencyDashboardApproval === true || config.packageRules?.some((rule) => rule.dependencyDashboardApproval) === true || branches.some(needsDashboardApproval))) {
|
|
210
|
-
if (GlobalConfig.get("dryRun")) logger.info({ title: config
|
|
211
|
+
if (!(config.dependencyDashboard?.enabled === true || config.dependencyDashboardApproval === true || config.packageRules?.some((rule) => rule.dependencyDashboardApproval) === true || branches.some(needsDashboardApproval))) {
|
|
212
|
+
if (GlobalConfig.get("dryRun")) logger.info({ title: getDashboardTitle(config) }, "DRY-RUN: Would close Dependency Dashboard");
|
|
211
213
|
else {
|
|
212
214
|
logger.debug("Closing Dependency Dashboard");
|
|
213
|
-
await platform.ensureIssueClosing(config
|
|
215
|
+
await platform.ensureIssueClosing(getDashboardTitle(config));
|
|
214
216
|
delete config.dependencyDashboardIssue;
|
|
215
217
|
}
|
|
216
218
|
return;
|
|
@@ -240,17 +242,17 @@ async function ensureDependencyDashboard(config, allBranches, packageFiles = {},
|
|
|
240
242
|
}
|
|
241
243
|
}
|
|
242
244
|
const hasBranches = isNonEmptyArray(branches);
|
|
243
|
-
if (config.
|
|
244
|
-
if (GlobalConfig.get("dryRun")) logger.info({ title: config
|
|
245
|
+
if (config.dependencyDashboard?.autoclose && !hasBranches && !hasDeprecationsOrReplacements) {
|
|
246
|
+
if (GlobalConfig.get("dryRun")) logger.info({ title: getDashboardTitle(config) }, "DRY-RUN: Would close Dependency Dashboard");
|
|
245
247
|
else {
|
|
246
248
|
logger.debug("Closing Dependency Dashboard");
|
|
247
|
-
await platform.ensureIssueClosing(config
|
|
249
|
+
await platform.ensureIssueClosing(getDashboardTitle(config));
|
|
248
250
|
delete config.dependencyDashboardIssue;
|
|
249
251
|
}
|
|
250
252
|
return;
|
|
251
253
|
}
|
|
252
254
|
let issueBody = "";
|
|
253
|
-
if (config.
|
|
255
|
+
if (config.dependencyDashboard?.header?.length) issueBody += `${compile(config.dependencyDashboard.header, config)}\n\n`;
|
|
254
256
|
if (configMigrationRes.result === "pr-exists") issueBody += `## Config Migration Needed\n\n${getMarkdownComment(configMigrationPrInfo)} See Config Migration PR: #${configMigrationRes.prNumber}.\n\n`;
|
|
255
257
|
else if (configMigrationRes?.result === "pr-modified") issueBody += `## Config Migration Needed (Blocked)\n\n${getMarkdownComment(configMigrationPrInfo)} The Config Migration branch exists but has been modified by another user. Renovate will not push to this branch unless it is first deleted. \n\n See Config Migration PR: #${configMigrationRes.prNumber}.\n\n`;
|
|
256
258
|
else if (configMigrationRes?.result === "add-checkbox") issueBody += `## Config Migration Needed\n\n${getCheckbox(createConfigMigrationPr)} Select this checkbox to let Renovate create an automated Config Migration PR.\n\n`;
|
|
@@ -271,7 +273,7 @@ async function ensureDependencyDashboard(config, allBranches, packageFiles = {},
|
|
|
271
273
|
}
|
|
272
274
|
issueBody += "\n";
|
|
273
275
|
}
|
|
274
|
-
if (config.
|
|
276
|
+
if (config.dependencyDashboard?.reportAbandonment) issueBody += getAbandonedPackagesMd(config, packageFiles);
|
|
275
277
|
issueBody += getBranchesListMd(branches, (branch) => branch.result === "needs-approval", "Pending Approval", "The following branches are pending approval. To create them, click on a checkbox below.", "approve", approveAllPendingPrs, "Create all pending approval PRs at once", "🔐");
|
|
276
278
|
issueBody += getBranchesListMd(branches, (branch) => branch.result === "minimum-group-size-not-met", "Group Size Not Met", "The following branches have not met their minimum group size. To create them, click on a checkbox below.", "approveGroup");
|
|
277
279
|
issueBody += getBranchesListMd(branches, (branch) => branch.result === "not-scheduled", "Awaiting Schedule", "The following updates are awaiting their schedule. To get an update now, click on a checkbox below.", "unschedule", createAllAwaitingSchedulePrs, "Create all awaiting schedule PRs at once", "🔐");
|
|
@@ -325,14 +327,14 @@ async function ensureDependencyDashboard(config, allBranches, packageFiles = {},
|
|
|
325
327
|
}
|
|
326
328
|
}
|
|
327
329
|
}
|
|
328
|
-
if (GlobalConfig.get("dryRun")) logger.info({ title: config
|
|
330
|
+
if (GlobalConfig.get("dryRun")) logger.info({ title: getDashboardTitle(config) }, "DRY-RUN: Would ensure Dependency Dashboard");
|
|
329
331
|
else if (await platform.ensureIssue({
|
|
330
|
-
title: config
|
|
332
|
+
title: getDashboardTitle(config),
|
|
331
333
|
reuseTitle,
|
|
332
334
|
body: platform.massageMarkdown(issueBody, config.rebaseLabel),
|
|
333
|
-
labels: config.
|
|
335
|
+
labels: config.dependencyDashboard?.labels?.map((label) => compile(label, config)),
|
|
334
336
|
confidential: config.confidential
|
|
335
|
-
}) && !config.dependencyDashboardIssue) config.dependencyDashboardIssue = (await platform.findIssue(config
|
|
337
|
+
}) && !config.dependencyDashboardIssue) config.dependencyDashboardIssue = (await platform.findIssue(getDashboardTitle(config)))?.number;
|
|
336
338
|
}
|
|
337
339
|
function getAbandonedPackagesMd(config, packageFiles) {
|
|
338
340
|
const abandonedPackages = {};
|
|
@@ -369,12 +371,12 @@ function getAbandonedPackagesMd(config, packageFiles) {
|
|
|
369
371
|
}
|
|
370
372
|
function getFooter(config) {
|
|
371
373
|
let footer = "";
|
|
372
|
-
if (config.
|
|
374
|
+
if (config.dependencyDashboard?.footer?.length) footer += `---\n${compile(config.dependencyDashboard.footer, config)}\n`;
|
|
373
375
|
return footer;
|
|
374
376
|
}
|
|
375
377
|
async function getDashboardMarkdownVulnerabilities(config, packageFiles) {
|
|
376
378
|
let result = "";
|
|
377
|
-
if (isNullOrUndefined(config.
|
|
379
|
+
if (isNullOrUndefined(config.dependencyDashboard?.osvVulnerabilitySummary) || config.dependencyDashboard.osvVulnerabilitySummary === "none") return result;
|
|
378
380
|
result += "## Vulnerabilities\n\n";
|
|
379
381
|
let vulnerabilities;
|
|
380
382
|
try {
|
|
@@ -395,7 +397,7 @@ async function getDashboardMarkdownVulnerabilities(config, packageFiles) {
|
|
|
395
397
|
if (isTruthy(config.osvVulnerabilityAlerts)) result += " CVEs have Renovate fixes.\n\n";
|
|
396
398
|
else result += ` CVEs have possible Renovate fixes.\n> See [\`osvVulnerabilityAlerts\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#osvvulnerabilityalerts) to allow Renovate to supply fixes.\n\n`;
|
|
397
399
|
let renderedVulnerabilities;
|
|
398
|
-
switch (config.
|
|
400
|
+
switch (config.dependencyDashboard?.osvVulnerabilitySummary) {
|
|
399
401
|
case "unresolved":
|
|
400
402
|
renderedVulnerabilities = unresolvedVulnerabilities;
|
|
401
403
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-dashboard.js","names":["template.compile"],"sources":["../../../lib/workers/repository/dependency-dashboard.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n isNonEmptyObject,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport type { PackageFile } from '../../modules/manager/types.ts';\nimport { platform } from '../../modules/platform/index.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport { emojify } from '../../util/emoji.ts';\nimport { regEx } from '../../util/regex.ts';\nimport { coerceString } from '../../util/string.ts';\nimport * as template from '../../util/template/index.ts';\nimport type { BranchConfig, SelectAllConfig } from '../types.ts';\nimport { extractRepoProblems, replacementAlreadyExists } from './common.ts';\nimport type { ConfigMigrationResult } from './config-migration/index.ts';\nimport { getDepWarningsDashboard } from './errors-warnings.ts';\nimport { PackageFiles } from './package-files.ts';\nimport type { Vulnerability } from './process/types.ts';\nimport { Vulnerabilities } from './process/vulnerabilities.ts';\nimport type {\n DependencyDashboardCheck,\n DependencyDashboardListItemType,\n} from './types.ts';\n\ninterface DependencyDashboard {\n dependencyDashboardChecks: Record<string, string>;\n dependencyDashboardRebaseAllOpen: boolean;\n dependencyDashboardAllPending: boolean;\n dependencyDashboardAllRateLimited: boolean;\n dependencyDashboardAllAwaitingSchedule: boolean;\n}\n\nconst rateLimitedRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('unlimit-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst pendingApprovalRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('approve-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst awaitingScheduleRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('unschedule-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst generalBranchRe = regEx(\n ` ${getMarkdownComment('([a-zA-Z]+)-branch=([^\\\\s]+)')}`,\n);\nconst markedBranchesRe = regEx(\n ` - \\\\[x\\\\] ${getMarkdownComment('([a-zA-Z]+)-branch=([^\\\\s]+)')}`,\n 'g',\n);\n\nconst approveAllPendingPrs = 'approve-all-pending-prs';\nconst createAllRateLimitedPrs = 'create-all-rate-limited-prs';\nconst createAllAwaitingSchedulePrs = 'create-all-awaiting-schedule-prs';\nconst createConfigMigrationPr = 'create-config-migration-pr';\nconst configMigrationPrInfo = 'config-migration-pr-info';\nconst rebaseAllOpenPrs = 'rebase-all-open-prs';\n\nfunction getMarkdownComment(comment: string): string {\n return `<!-- ${comment} -->`;\n}\n\nfunction isBoxChecked(issueBody: string, type: string): boolean {\n return issueBody.includes(getCheckbox(type, true));\n}\n\nfunction isBoxUnchecked(issueBody: string, type: string): boolean {\n return issueBody.includes(getCheckbox(type));\n}\n\nfunction getCheckbox(type: string, checked = false): string {\n return ` - [${checked ? 'x' : ' '}] ${getMarkdownComment(type)}`;\n}\n\nfunction checkOpenAllRateLimitedPR(issueBody: string): boolean {\n return isBoxChecked(issueBody, createAllRateLimitedPrs);\n}\n\nfunction checkOpenAllAwaitingSchedulePR(issueBody: string): boolean {\n return isBoxChecked(issueBody, createAllAwaitingSchedulePrs);\n}\n\nfunction checkApproveAllPendingPR(issueBody: string): boolean {\n return isBoxChecked(issueBody, approveAllPendingPrs);\n}\n\nfunction checkRebaseAll(issueBody: string): boolean {\n return isBoxChecked(issueBody, rebaseAllOpenPrs);\n}\n\nfunction getConfigMigrationCheckboxState(\n issueBody: string,\n): 'no-checkbox' | 'checked' | 'unchecked' | 'migration-pr-exists' {\n if (issueBody.includes(getMarkdownComment(configMigrationPrInfo))) {\n return 'migration-pr-exists';\n }\n\n if (isBoxChecked(issueBody, createConfigMigrationPr)) {\n return 'checked';\n }\n\n if (isBoxUnchecked(issueBody, createConfigMigrationPr)) {\n return 'unchecked';\n }\n\n return 'no-checkbox';\n}\n\nfunction selectAllRelevantBranches(issueBody: string): string[] {\n const checkedBranches = [];\n if (checkOpenAllRateLimitedPR(issueBody)) {\n for (const match of issueBody.matchAll(rateLimitedRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkOpenAllAwaitingSchedulePR(issueBody)) {\n for (const match of issueBody.matchAll(awaitingScheduleRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkApproveAllPendingPR(issueBody)) {\n for (const match of issueBody.matchAll(pendingApprovalRe)) {\n checkedBranches.push(match[0]);\n }\n }\n return checkedBranches;\n}\n\nfunction getAllSelectedBranches(\n issueBody: string,\n dependencyDashboardChecks: Record<string, string>,\n): Record<string, string> {\n const allRelevantBranches = selectAllRelevantBranches(issueBody);\n for (const branch of allRelevantBranches) {\n const [, type, branchName] = generalBranchRe.exec(branch)!;\n dependencyDashboardChecks[branchName] = type;\n }\n return dependencyDashboardChecks;\n}\n\nfunction getCheckedBranches(issueBody: string): Record<string, string> {\n let dependencyDashboardChecks: Record<string, string> = {};\n for (const [, type, branchName] of issueBody.matchAll(markedBranchesRe)) {\n dependencyDashboardChecks[branchName] = type;\n }\n dependencyDashboardChecks = getAllSelectedBranches(\n issueBody,\n dependencyDashboardChecks,\n );\n return dependencyDashboardChecks;\n}\n\nfunction parseDashboardIssue(issueBody: string): DependencyDashboard {\n const dependencyDashboardChecks = getCheckedBranches(issueBody);\n const dependencyDashboardRebaseAllOpen = checkRebaseAll(issueBody);\n const dependencyDashboardAllAwaitingSchedule =\n checkOpenAllAwaitingSchedulePR(issueBody);\n const dependencyDashboardAllPending = checkApproveAllPendingPR(issueBody);\n const dependencyDashboardAllRateLimited =\n checkOpenAllRateLimitedPR(issueBody);\n dependencyDashboardChecks.configMigrationCheckboxState =\n getConfigMigrationCheckboxState(issueBody);\n return {\n dependencyDashboardChecks,\n dependencyDashboardRebaseAllOpen,\n dependencyDashboardAllAwaitingSchedule,\n dependencyDashboardAllPending,\n dependencyDashboardAllRateLimited,\n };\n}\n\nexport async function readDashboardBody(\n config: SelectAllConfig,\n): Promise<void> {\n let dashboardChecks: DependencyDashboard = {\n dependencyDashboardChecks: {},\n dependencyDashboardRebaseAllOpen: false,\n dependencyDashboardAllAwaitingSchedule: false,\n dependencyDashboardAllPending: false,\n dependencyDashboardAllRateLimited: false,\n };\n const stringifiedConfig = JSON.stringify(config);\n // mode=silent never updates the dashboard, so checkboxes left on an existing one would never be cleared\n if (config.mode === 'silent') {\n logger.debug('Ignoring Dependency Dashboard checkboxes when mode=silent');\n } else if (\n config.dependencyDashboard === true ||\n stringifiedConfig.includes('\"dependencyDashboardApproval\":true') ||\n stringifiedConfig.includes('\"prCreation\":\"approval\"')\n ) {\n config.dependencyDashboardTitle =\n config.dependencyDashboardTitle ?? `Dependency Dashboard`;\n const issue = await platform.findIssue(config.dependencyDashboardTitle);\n if (issue) {\n config.dependencyDashboardIssue = issue.number;\n dashboardChecks = parseDashboardIssue(issue.body ?? '');\n }\n }\n\n const checkedBranches = GlobalConfig.get('checkedBranches');\n if (isNonEmptyArray(checkedBranches)) {\n const checkedBranchesRec: Record<string, DependencyDashboardCheck> =\n Object.fromEntries(\n checkedBranches.map((branchName) => [branchName, 'global-config']),\n );\n dashboardChecks.dependencyDashboardChecks = {\n ...dashboardChecks.dependencyDashboardChecks,\n ...checkedBranchesRec,\n };\n }\n\n if (GlobalConfig.get('rebaseAllOpenBranches')) {\n dashboardChecks.dependencyDashboardRebaseAllOpen = true;\n }\n\n Object.assign(config, dashboardChecks);\n}\n\nfunction needsDashboardApproval(branch: BranchConfig): boolean {\n return (\n !!branch.dependencyDashboardApproval ||\n !!branch.dependencyDashboardPrApproval\n );\n}\n\nfunction formatAsMarkdownLink(name: string, url?: string | null): string {\n return url ? `[${name}](${url})` : `\\`${name}\\``;\n}\n\nfunction getListItem(\n branch: BranchConfig,\n type: DependencyDashboardListItemType,\n): string {\n let item = getCheckbox(`${type}-branch=${branch.branchName}`);\n if (branch.prNo) {\n // TODO: types (#22198)\n item += `[${branch.prTitle!}](../pull/${branch.prNo})`;\n } else {\n item += branch.prTitle;\n }\n const uniquePackages = [\n // TODO: types (#22198)\n ...new Set(branch.upgrades.map((upgrade) => `\\`${upgrade.depName!}\\``)),\n ];\n if (uniquePackages.length < 2) {\n return `${item}\\n`;\n }\n return `${item} (${uniquePackages.join(', ')})\\n`;\n}\n\nfunction splitBranchesByCategory(filteredBranches: BranchConfig[]): {\n categories: Record<string, BranchConfig[]>;\n uncategorized: BranchConfig[];\n hasCategorized: boolean;\n hasUncategorized: boolean;\n} {\n const categories: Record<string, BranchConfig[]> = {};\n const uncategorized: BranchConfig[] = [];\n let hasCategorized = false;\n let hasUncategorized = false;\n for (const branch of filteredBranches) {\n if (branch.dependencyDashboardCategory) {\n categories[branch.dependencyDashboardCategory] ??= [];\n categories[branch.dependencyDashboardCategory].push(branch);\n hasCategorized = true;\n continue;\n }\n uncategorized.push(branch);\n hasUncategorized = true;\n }\n return { categories, uncategorized, hasCategorized, hasUncategorized };\n}\n\nfunction getBranchList(\n branches: BranchConfig[],\n listItemType: DependencyDashboardListItemType,\n): string {\n return branches\n .map((branch: BranchConfig): string => getListItem(branch, listItemType))\n .join('');\n}\n\nfunction getBranchesListMd(\n branches: BranchConfig[],\n predicate: (\n value: BranchConfig,\n index: number,\n array: BranchConfig[],\n ) => unknown,\n title: string,\n description: string,\n listItemType: DependencyDashboardListItemType = 'approvePr',\n bulkComment?: string,\n bulkMessage?: string,\n bulkIcon?: '🔐',\n): string {\n const filteredBranches = branches.filter(predicate);\n if (filteredBranches.length === 0) {\n return '';\n }\n let result = `## ${title}\\n\\n${description}\\n\\n`;\n const { categories, uncategorized, hasCategorized, hasUncategorized } =\n splitBranchesByCategory(filteredBranches);\n if (hasCategorized) {\n for (const [category, branches] of Object.entries(categories).sort(\n ([keyA], [keyB]) =>\n keyA.localeCompare(keyB, undefined, { numeric: true }),\n )) {\n result = `${result.trimEnd()}\\n\\n`;\n result += `### ${category}\\n\\n`;\n result += getBranchList(branches, listItemType);\n }\n if (hasUncategorized) {\n result = `${result.trimEnd()}\\n\\n`;\n result += `### Others`;\n }\n }\n result = `${result.trimEnd()}\\n\\n`;\n result += getBranchList(uncategorized, listItemType);\n\n if (bulkComment && bulkMessage && filteredBranches.length > 1) {\n if (hasCategorized) {\n result = `${result.trimEnd()}\\n\\n`;\n result += '### All\\n\\n';\n }\n result += getCheckbox(bulkComment);\n result += `${bulkIcon ? `${bulkIcon} ` : ''}**${bulkMessage}**${bulkIcon ? ` ${bulkIcon}` : ''}`;\n }\n return `${result.trimEnd()}\\n\\n`;\n}\n\nfunction appendRepoProblems(config: RenovateConfig, issueBody: string): string {\n let newIssueBody = issueBody;\n const repoProblems = extractRepoProblems(config.repository);\n if (repoProblems.size) {\n newIssueBody += '## Repository Problems\\n\\n';\n const repoProblemsHeader =\n config.customizeDashboard?.repoProblemsHeader ??\n 'Renovate tried to run on this repository, but found these problems.';\n newIssueBody += `${template.compile(repoProblemsHeader, config)}\\n\\n`;\n\n for (const repoProblem of repoProblems) {\n newIssueBody += ` - ${repoProblem}\\n`;\n }\n newIssueBody += '\\n';\n }\n return newIssueBody;\n}\n\nexport async function ensureDependencyDashboard(\n config: SelectAllConfig,\n allBranches: BranchConfig[],\n packageFiles: Record<string, PackageFile[]> = {},\n configMigrationRes: ConfigMigrationResult,\n): Promise<void> {\n logger.debug('ensureDependencyDashboard()');\n if (config.mode === 'silent') {\n logger.debug(\n 'Dependency Dashboard issue is not created, updated or closed when mode=silent',\n );\n return;\n }\n // legacy/migrated issue\n const reuseTitle = 'Update Dependencies (Renovate Bot)';\n const branches = allBranches.filter(\n (branch) =>\n branch.result !== 'automerged' &&\n !branch.upgrades?.every((upgrade) => upgrade.remediationNotPossible),\n );\n if (!(\n config.dependencyDashboard === true ||\n config.dependencyDashboardApproval === true ||\n config.packageRules?.some((rule) => rule.dependencyDashboardApproval) ===\n true ||\n branches.some(needsDashboardApproval)\n )) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n delete config.dependencyDashboardIssue;\n }\n return;\n }\n // istanbul ignore if\n if (config.repoIsOnboarded === false) {\n logger.debug('Repo is onboarding - skipping dependency dashboard');\n return;\n }\n logger.debug('Ensuring Dependency Dashboard');\n\n // Check packageFiles for any deprecations or replacements\n let hasDeprecationsOrReplacements = false;\n const deprecatedPackages: Record<\n string,\n Record<\n string,\n { hasActionableReplacement: boolean; sourceUrl?: string | null }\n >\n > = {};\n logger.debug('Checking packageFiles for deprecated or replacement packages');\n if (isNonEmptyObject(packageFiles)) {\n for (const [manager, fileNames] of Object.entries(packageFiles)) {\n for (const fileName of fileNames) {\n for (const dep of fileName.deps) {\n const name = dep.packageName;\n const replacementUpdate = dep.updates?.find(\n (update) => update.updateType === 'replacement',\n );\n const hasAnyReplacement = !!replacementUpdate;\n const hasActionableReplacement =\n hasAnyReplacement &&\n !(\n replacementUpdate.newName &&\n replacementAlreadyExists(\n fileName.deps,\n dep,\n replacementUpdate.newName,\n )\n );\n const deprecationOrReplacement =\n dep.deprecationMessage ?? hasAnyReplacement;\n if (name && deprecationOrReplacement) {\n hasDeprecationsOrReplacements = true;\n deprecatedPackages[manager] ??= {};\n deprecatedPackages[manager][name] ??= {\n hasActionableReplacement,\n sourceUrl: dep.sourceUrl,\n };\n }\n }\n }\n }\n }\n\n const hasBranches = isNonEmptyArray(branches);\n if (\n config.dependencyDashboardAutoclose &&\n !hasBranches &&\n !hasDeprecationsOrReplacements\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n delete config.dependencyDashboardIssue;\n }\n return;\n }\n let issueBody = '';\n\n if (config.dependencyDashboardHeader?.length) {\n issueBody += `${template.compile(config.dependencyDashboardHeader, config)}\\n\\n`;\n }\n\n if (configMigrationRes.result === 'pr-exists') {\n issueBody += `## Config Migration Needed\\n\\n${getMarkdownComment(configMigrationPrInfo)} See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'pr-modified') {\n issueBody += `## Config Migration Needed (Blocked)\\n\\n${getMarkdownComment(configMigrationPrInfo)} The Config Migration branch exists but has been modified by another user. Renovate will not push to this branch unless it is first deleted. \\n\\n See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'add-checkbox') {\n issueBody += `## Config Migration Needed\\n\\n${getCheckbox(createConfigMigrationPr)} Select this checkbox to let Renovate create an automated Config Migration PR.\\n\\n`;\n }\n\n issueBody = appendRepoProblems(config, issueBody);\n\n if (hasDeprecationsOrReplacements) {\n issueBody += '## Deprecations / Replacements\\n';\n issueBody += emojify('> :warning: **Warning**\\n> \\n');\n issueBody +=\n '> The following dependencies are either deprecated or have replacements available.\\n\\n';\n issueBody += '| Datasource | Package | Replacement PR? |\\n';\n issueBody += '|------------|------|--------------|\\n';\n for (const manager of Object.keys(deprecatedPackages).sort()) {\n const deps = deprecatedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const { hasActionableReplacement, sourceUrl } = deps[depName];\n const packageName = formatAsMarkdownLink(depName, sourceUrl);\n\n issueBody += `| ${manager} | ${packageName} | ${\n hasActionableReplacement\n ? ''\n : ''\n } |\\n`;\n }\n }\n issueBody += '\\n';\n }\n\n if (config.dependencyDashboardReportAbandonment) {\n issueBody += getAbandonedPackagesMd(config, packageFiles);\n }\n\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'needs-approval',\n 'Pending Approval',\n 'The following branches are pending approval. To create them, click on a checkbox below.',\n 'approve',\n approveAllPendingPrs,\n 'Create all pending approval PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'minimum-group-size-not-met',\n 'Group Size Not Met',\n 'The following branches have not met their minimum group size. To create them, click on a checkbox below.',\n 'approveGroup',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'not-scheduled',\n 'Awaiting Schedule',\n 'The following updates are awaiting their schedule. To get an update now, click on a checkbox below.',\n 'unschedule',\n createAllAwaitingSchedulePrs,\n 'Create all awaiting schedule PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) =>\n branch.result === 'branch-limit-reached' ||\n branch.result === 'pr-limit-reached' ||\n branch.result === 'commit-per-run-limit-reached' ||\n branch.result === 'commit-hourly-limit-reached',\n 'Rate-Limited',\n 'The following updates are currently rate-limited. To force their creation now, click on a checkbox below.',\n 'unlimit',\n createAllRateLimitedPrs,\n 'Create all rate-limited PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'error',\n 'Errored',\n 'The following updates encountered an error and will be retried. To force a retry now, click on a checkbox below.',\n 'retry',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'needs-pr-approval',\n 'PR Creation Approval Required',\n 'The following branches exist but PR creation requires approval. To approve PR creation, click on a checkbox below.',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'pr-edited',\n 'PR Edited (Blocked)',\n 'The following updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox below.',\n 'rebase',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'pending',\n 'Pending Status Checks',\n 'The following updates await pending status checks. To force their creation now, click on a checkbox below.',\n 'unpend',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.prBlockedBy === 'BranchAutomerge',\n 'Pending Branch Automerge',\n 'The following updates await pending status checks before automerging. To abort the branch automerge and create a PR instead, click on a checkbox below.',\n );\n\n const warn = getDepWarningsDashboard(packageFiles, config);\n if (warn) {\n issueBody += warn;\n issueBody += '\\n';\n }\n\n const otherRes = [\n 'pending',\n 'needs-approval',\n 'needs-pr-approval',\n 'not-scheduled',\n 'pr-limit-reached',\n 'commit-per-run-limit-reached',\n 'commit-hourly-limit-reached',\n 'branch-limit-reached',\n 'already-existed',\n 'error',\n 'automerged',\n 'pr-edited',\n 'minimum-group-size-not-met',\n ];\n const inProgress = branches.filter(\n (branch) =>\n !otherRes.includes(branch.result!) &&\n branch.prBlockedBy !== 'BranchAutomerge',\n );\n issueBody += getBranchesListMd(\n inProgress,\n (branch) => !!branch.prBlockedBy || !branch.prNo,\n 'Other Branches',\n 'The following updates are pending. To force the creation of a PR, click on a checkbox below.',\n 'other',\n );\n issueBody += getBranchesListMd(\n inProgress,\n (branch) => branch.prNo && !branch.prBlockedBy,\n 'Open',\n 'The following updates have all been created. To force a retry/rebase of any, click on a checkbox below.',\n 'rebase',\n rebaseAllOpenPrs,\n 'Click on this checkbox to rebase all open PRs at once',\n );\n\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'already-existed',\n 'PR Closed (Blocked)',\n 'The following updates are blocked by an existing closed PR. To recreate the PR, click on a checkbox below.',\n 'recreate',\n );\n\n if (!hasBranches) {\n issueBody +=\n 'This repository currently has no open or pending branches.\\n\\n';\n }\n\n // add CVE section\n issueBody += await getDashboardMarkdownVulnerabilities(config, packageFiles);\n\n // fit the detected dependencies section\n const footer = getFooter(config);\n issueBody += PackageFiles.getDashboardMarkdown(\n platform.maxBodyLength() - issueBody.length - footer.length,\n );\n\n issueBody += footer;\n\n if (config.dependencyDashboardIssue) {\n // If we're not changing the dashboard issue, then we can skip checking if the user changed it.\n // The cached issue we get back here will reflect its state at the _start_ of our run\n const cachedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n );\n if (cachedIssue?.body === issueBody) {\n logger.debug('No changes to dependency dashboard issue needed');\n return;\n }\n\n // Skip cache when getting the issue to ensure we get the latest body,\n // including any updates the user made after we started the run\n const updatedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n false,\n );\n if (updatedIssue) {\n const { dependencyDashboardChecks } = parseDashboardIssue(\n coerceString(updatedIssue.body),\n );\n for (const branchName of Object.keys(config.dependencyDashboardChecks!)) {\n delete dependencyDashboardChecks[branchName];\n }\n for (const branchName of Object.keys(dependencyDashboardChecks)) {\n const checkText = getCheckbox(\n `${dependencyDashboardChecks[branchName]}-branch=${branchName}`,\n );\n issueBody = issueBody.replace(\n checkText,\n checkText.replace('[ ]', '[x]'),\n );\n }\n }\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would ensure Dependency Dashboard',\n );\n } else {\n const result = await platform.ensureIssue({\n title: config.dependencyDashboardTitle!,\n reuseTitle,\n body: platform.massageMarkdown(issueBody, config.rebaseLabel),\n labels: config.dependencyDashboardLabels,\n confidential: config.confidential,\n });\n // ensureIssue doesn't return the issue, so a newly created (or renamed)\n // dashboard needs a lookup to record its number\n if (result && !config.dependencyDashboardIssue) {\n const issue = await platform.findIssue(config.dependencyDashboardTitle!);\n config.dependencyDashboardIssue = issue?.number;\n }\n }\n}\n\nexport function getAbandonedPackagesMd(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): string {\n const abandonedPackages: Record<\n string,\n Record<\n string,\n { mostRecentTimestamp?: string | null; sourceUrl?: string | null }\n >\n > = {};\n let abandonedCount = 0;\n\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n for (const packageFile of managerPackageFiles) {\n for (const dep of coerceArray(packageFile.deps)) {\n if (dep.depName && dep.isAbandoned) {\n abandonedCount++;\n abandonedPackages[manager] = abandonedPackages[manager] || {};\n abandonedPackages[manager][dep.depName] = {\n mostRecentTimestamp: dep.mostRecentTimestamp,\n sourceUrl: dep.sourceUrl,\n };\n }\n }\n }\n }\n\n if (abandonedCount === 0) {\n return '';\n }\n\n let abandonedMd = '## Abandoned Dependencies\\n\\n';\n abandonedMd +=\n 'The following dependencies have not received updates for an extended period and may be unmaintained.\\n\\n';\n\n // Keep the note outside the `<details>` block: GitHub only renders alert\n // callouts at the top level of a body, not inside collapsible sections.\n abandonedMd += emojify('> :information_source: **Note**\\n> \\n');\n abandonedMd += `> Packages are marked as abandoned when they exceed the [\\`abandonmentThreshold\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#abandonmentthreshold) since their last release. `;\n abandonedMd +=\n 'Unlike deprecated packages with official notices, abandonment is detected by release inactivity.\\n> \\n';\n\n abandonedMd += '<details>\\n';\n abandonedMd += `<summary>View abandoned dependencies (${abandonedCount})</summary>\\n\\n`;\n\n abandonedMd += '| Datasource | Package | Last Updated |\\n';\n abandonedMd += '|------------|------|-------------|\\n';\n\n for (const manager of Object.keys(abandonedPackages).sort()) {\n const deps = abandonedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const { mostRecentTimestamp, sourceUrl } = deps[depName];\n const formattedDate = mostRecentTimestamp\n ? DateTime.fromISO(mostRecentTimestamp).toFormat('yyyy-MM-dd')\n : 'unknown';\n const packageName = formatAsMarkdownLink(depName, sourceUrl);\n abandonedMd += `| ${manager} | ${packageName} | \\`${formattedDate}\\` |\\n`;\n }\n }\n\n abandonedMd += '\\n</details>\\n\\n\\n';\n\n return abandonedMd;\n}\n\nfunction getFooter(config: RenovateConfig): string {\n let footer = '';\n if (config.dependencyDashboardFooter?.length) {\n footer += `---\\n${template.compile(config.dependencyDashboardFooter, config)}\\n`;\n }\n\n return footer;\n}\n\nexport async function getDashboardMarkdownVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<string> {\n let result = '';\n\n if (\n isNullOrUndefined(config.dependencyDashboardOSVVulnerabilitySummary) ||\n config.dependencyDashboardOSVVulnerabilitySummary === 'none'\n ) {\n return result;\n }\n\n result += '## Vulnerabilities\\n\\n';\n\n let vulnerabilities: Vulnerability[];\n try {\n const vulnerabilityFetcher = await Vulnerabilities.create();\n vulnerabilities = await vulnerabilityFetcher.fetchVulnerabilities(\n config,\n packageFiles,\n );\n } catch (err) {\n logger.warn({ err }, 'Unable to read vulnerability information');\n result +=\n 'Renovate was unable to fetch CVE information from [osv.dev](https://osv.dev) this run.\\n\\n';\n return result;\n }\n\n if (vulnerabilities.length === 0) {\n result +=\n 'Renovate has not found any CVEs on [osv.dev](https://osv.dev).\\n\\n';\n return result;\n }\n\n const unresolvedVulnerabilities = vulnerabilities.filter((value) =>\n isNullOrUndefined(value.fixedVersion),\n );\n const resolvedVulnerabilitiesLength =\n vulnerabilities.length - unresolvedVulnerabilities.length;\n\n result += emojify('> :exclamation: **Important**\\n> \\n');\n result += `> \\`${resolvedVulnerabilitiesLength}\\`/\\`${vulnerabilities.length}\\``;\n if (isTruthy(config.osvVulnerabilityAlerts)) {\n result += ' CVEs have Renovate fixes.\\n\\n';\n } else {\n result += ` CVEs have possible Renovate fixes.\\n> See [\\`osvVulnerabilityAlerts\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#osvvulnerabilityalerts) to allow Renovate to supply fixes.\\n\\n`;\n }\n\n let renderedVulnerabilities: Vulnerability[];\n switch (config.dependencyDashboardOSVVulnerabilitySummary) {\n // filter vulnerabilities to display based on configuration\n case 'unresolved':\n renderedVulnerabilities = unresolvedVulnerabilities;\n break;\n default:\n renderedVulnerabilities = vulnerabilities;\n }\n\n const managerRecords: Record<\n string,\n Record<string, Record<string, Vulnerability[]>>\n > = {};\n for (const vulnerability of renderedVulnerabilities) {\n const { manager, packageFile } = vulnerability.packageFileConfig;\n if (isNullOrUndefined(managerRecords[manager!])) {\n managerRecords[manager!] = {};\n }\n if (isNullOrUndefined(managerRecords[manager!][packageFile])) {\n managerRecords[manager!][packageFile] = {};\n }\n if (\n isNullOrUndefined(\n managerRecords[manager!][packageFile][vulnerability.packageName],\n )\n ) {\n managerRecords[manager!][packageFile][vulnerability.packageName] = [];\n }\n managerRecords[manager!][packageFile][vulnerability.packageName].push(\n vulnerability,\n );\n }\n\n for (const [manager, packageFileRecords] of Object.entries(managerRecords)) {\n result += `<details><summary>${manager}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageFile, packageNameRecords] of Object.entries(\n packageFileRecords,\n )) {\n result += `<details><summary>${packageFile}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageName, cves] of Object.entries(packageNameRecords)) {\n result += `<details><summary>${packageName}</summary>\\n<blockquote>\\n\\n`;\n for (const vul of cves) {\n const id = vul.vulnerability.id;\n const suffix = isNonEmptyString(vul.fixedVersion)\n ? ` (fixed in ${vul.fixedVersion})`\n : '';\n result += `- [${id}](https://osv.dev/vulnerability/${id})${suffix}\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dependency-dashboard.js","names":["template.compile"],"sources":["../../../lib/workers/repository/dependency-dashboard.ts"],"sourcesContent":["import {\n isNonEmptyArray,\n isNonEmptyObject,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport type { PackageFile } from '../../modules/manager/types.ts';\nimport { platform } from '../../modules/platform/index.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport { emojify } from '../../util/emoji.ts';\nimport { regEx } from '../../util/regex.ts';\nimport { coerceString } from '../../util/string.ts';\nimport * as template from '../../util/template/index.ts';\nimport type { BranchConfig, SelectAllConfig } from '../types.ts';\nimport { extractRepoProblems, replacementAlreadyExists } from './common.ts';\nimport type { ConfigMigrationResult } from './config-migration/index.ts';\nimport { getDepWarningsDashboard } from './errors-warnings.ts';\nimport { PackageFiles } from './package-files.ts';\nimport type { Vulnerability } from './process/types.ts';\nimport { Vulnerabilities } from './process/vulnerabilities.ts';\nimport type {\n DependencyDashboardCheck,\n DependencyDashboardListItemType,\n} from './types.ts';\n\ninterface DependencyDashboard {\n dependencyDashboardChecks: Record<string, string>;\n dependencyDashboardRebaseAllOpen: boolean;\n dependencyDashboardAllPending: boolean;\n dependencyDashboardAllRateLimited: boolean;\n dependencyDashboardAllAwaitingSchedule: boolean;\n}\n\nconst rateLimitedRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('unlimit-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst pendingApprovalRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('approve-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst awaitingScheduleRe = regEx(\n ` - \\\\[ \\\\] ${getMarkdownComment('unschedule-branch=([^\\\\s]+)')}`,\n 'g',\n);\nconst generalBranchRe = regEx(\n ` ${getMarkdownComment('([a-zA-Z]+)-branch=([^\\\\s]+)')}`,\n);\nconst markedBranchesRe = regEx(\n ` - \\\\[x\\\\] ${getMarkdownComment('([a-zA-Z]+)-branch=([^\\\\s]+)')}`,\n 'g',\n);\n\nconst approveAllPendingPrs = 'approve-all-pending-prs';\nconst createAllRateLimitedPrs = 'create-all-rate-limited-prs';\nconst createAllAwaitingSchedulePrs = 'create-all-awaiting-schedule-prs';\nconst createConfigMigrationPr = 'create-config-migration-pr';\nconst configMigrationPrInfo = 'config-migration-pr-info';\nconst rebaseAllOpenPrs = 'rebase-all-open-prs';\n\nfunction getMarkdownComment(comment: string): string {\n return `<!-- ${comment} -->`;\n}\n\nfunction isBoxChecked(issueBody: string, type: string): boolean {\n return issueBody.includes(getCheckbox(type, true));\n}\n\nfunction isBoxUnchecked(issueBody: string, type: string): boolean {\n return issueBody.includes(getCheckbox(type));\n}\n\nfunction getCheckbox(type: string, checked = false): string {\n return ` - [${checked ? 'x' : ' '}] ${getMarkdownComment(type)}`;\n}\n\nfunction checkOpenAllRateLimitedPR(issueBody: string): boolean {\n return isBoxChecked(issueBody, createAllRateLimitedPrs);\n}\n\nfunction checkOpenAllAwaitingSchedulePR(issueBody: string): boolean {\n return isBoxChecked(issueBody, createAllAwaitingSchedulePrs);\n}\n\nfunction checkApproveAllPendingPR(issueBody: string): boolean {\n return isBoxChecked(issueBody, approveAllPendingPrs);\n}\n\nfunction checkRebaseAll(issueBody: string): boolean {\n return isBoxChecked(issueBody, rebaseAllOpenPrs);\n}\n\nfunction getConfigMigrationCheckboxState(\n issueBody: string,\n): 'no-checkbox' | 'checked' | 'unchecked' | 'migration-pr-exists' {\n if (issueBody.includes(getMarkdownComment(configMigrationPrInfo))) {\n return 'migration-pr-exists';\n }\n\n if (isBoxChecked(issueBody, createConfigMigrationPr)) {\n return 'checked';\n }\n\n if (isBoxUnchecked(issueBody, createConfigMigrationPr)) {\n return 'unchecked';\n }\n\n return 'no-checkbox';\n}\n\nfunction selectAllRelevantBranches(issueBody: string): string[] {\n const checkedBranches = [];\n if (checkOpenAllRateLimitedPR(issueBody)) {\n for (const match of issueBody.matchAll(rateLimitedRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkOpenAllAwaitingSchedulePR(issueBody)) {\n for (const match of issueBody.matchAll(awaitingScheduleRe)) {\n checkedBranches.push(match[0]);\n }\n }\n if (checkApproveAllPendingPR(issueBody)) {\n for (const match of issueBody.matchAll(pendingApprovalRe)) {\n checkedBranches.push(match[0]);\n }\n }\n return checkedBranches;\n}\n\nfunction getAllSelectedBranches(\n issueBody: string,\n dependencyDashboardChecks: Record<string, string>,\n): Record<string, string> {\n const allRelevantBranches = selectAllRelevantBranches(issueBody);\n for (const branch of allRelevantBranches) {\n const [, type, branchName] = generalBranchRe.exec(branch)!;\n dependencyDashboardChecks[branchName] = type;\n }\n return dependencyDashboardChecks;\n}\n\nfunction getCheckedBranches(issueBody: string): Record<string, string> {\n let dependencyDashboardChecks: Record<string, string> = {};\n for (const [, type, branchName] of issueBody.matchAll(markedBranchesRe)) {\n dependencyDashboardChecks[branchName] = type;\n }\n dependencyDashboardChecks = getAllSelectedBranches(\n issueBody,\n dependencyDashboardChecks,\n );\n return dependencyDashboardChecks;\n}\n\nfunction parseDashboardIssue(issueBody: string): DependencyDashboard {\n const dependencyDashboardChecks = getCheckedBranches(issueBody);\n const dependencyDashboardRebaseAllOpen = checkRebaseAll(issueBody);\n const dependencyDashboardAllAwaitingSchedule =\n checkOpenAllAwaitingSchedulePR(issueBody);\n const dependencyDashboardAllPending = checkApproveAllPendingPR(issueBody);\n const dependencyDashboardAllRateLimited =\n checkOpenAllRateLimitedPR(issueBody);\n dependencyDashboardChecks.configMigrationCheckboxState =\n getConfigMigrationCheckboxState(issueBody);\n return {\n dependencyDashboardChecks,\n dependencyDashboardRebaseAllOpen,\n dependencyDashboardAllAwaitingSchedule,\n dependencyDashboardAllPending,\n dependencyDashboardAllRateLimited,\n };\n}\n\nexport async function readDashboardBody(\n config: SelectAllConfig,\n): Promise<void> {\n let dashboardChecks: DependencyDashboard = {\n dependencyDashboardChecks: {},\n dependencyDashboardRebaseAllOpen: false,\n dependencyDashboardAllAwaitingSchedule: false,\n dependencyDashboardAllPending: false,\n dependencyDashboardAllRateLimited: false,\n };\n const stringifiedConfig = JSON.stringify(config);\n // mode=silent never updates the dashboard, so checkboxes left on an existing one would never be cleared\n if (config.mode === 'silent') {\n logger.debug('Ignoring Dependency Dashboard checkboxes when mode=silent');\n } else if (\n config.dependencyDashboard?.enabled === true ||\n stringifiedConfig.includes('\"dependencyDashboardApproval\":true') ||\n stringifiedConfig.includes('\"prCreation\":\"approval\"')\n ) {\n const issue = await platform.findIssue(getDashboardTitle(config));\n if (issue) {\n config.dependencyDashboardIssue = issue.number;\n dashboardChecks = parseDashboardIssue(issue.body ?? '');\n }\n }\n\n const checkedBranches = GlobalConfig.get('checkedBranches');\n if (isNonEmptyArray(checkedBranches)) {\n const checkedBranchesRec: Record<string, DependencyDashboardCheck> =\n Object.fromEntries(\n checkedBranches.map((branchName) => [branchName, 'global-config']),\n );\n dashboardChecks.dependencyDashboardChecks = {\n ...dashboardChecks.dependencyDashboardChecks,\n ...checkedBranchesRec,\n };\n }\n\n if (GlobalConfig.get('rebaseAllOpenBranches')) {\n dashboardChecks.dependencyDashboardRebaseAllOpen = true;\n }\n\n Object.assign(config, dashboardChecks);\n}\n\nfunction needsDashboardApproval(branch: BranchConfig): boolean {\n return (\n !!branch.dependencyDashboardApproval ||\n !!branch.dependencyDashboardPrApproval\n );\n}\n\nfunction getDashboardTitle(config: RenovateConfig): string {\n return config.dependencyDashboard?.title ?? 'Dependency Dashboard';\n}\n\nfunction formatAsMarkdownLink(name: string, url?: string | null): string {\n return url ? `[${name}](${url})` : `\\`${name}\\``;\n}\n\nfunction getListItem(\n branch: BranchConfig,\n type: DependencyDashboardListItemType,\n): string {\n let item = getCheckbox(`${type}-branch=${branch.branchName}`);\n if (branch.prNo) {\n // TODO: types (#22198)\n item += `[${branch.prTitle!}](../pull/${branch.prNo})`;\n } else {\n item += branch.prTitle;\n }\n const uniquePackages = [\n // TODO: types (#22198)\n ...new Set(branch.upgrades.map((upgrade) => `\\`${upgrade.depName!}\\``)),\n ];\n if (uniquePackages.length < 2) {\n return `${item}\\n`;\n }\n return `${item} (${uniquePackages.join(', ')})\\n`;\n}\n\nfunction splitBranchesByCategory(filteredBranches: BranchConfig[]): {\n categories: Record<string, BranchConfig[]>;\n uncategorized: BranchConfig[];\n hasCategorized: boolean;\n hasUncategorized: boolean;\n} {\n const categories: Record<string, BranchConfig[]> = {};\n const uncategorized: BranchConfig[] = [];\n let hasCategorized = false;\n let hasUncategorized = false;\n for (const branch of filteredBranches) {\n if (branch.dependencyDashboardCategory) {\n categories[branch.dependencyDashboardCategory] ??= [];\n categories[branch.dependencyDashboardCategory].push(branch);\n hasCategorized = true;\n continue;\n }\n uncategorized.push(branch);\n hasUncategorized = true;\n }\n return { categories, uncategorized, hasCategorized, hasUncategorized };\n}\n\nfunction getBranchList(\n branches: BranchConfig[],\n listItemType: DependencyDashboardListItemType,\n): string {\n return branches\n .map((branch: BranchConfig): string => getListItem(branch, listItemType))\n .join('');\n}\n\nfunction getBranchesListMd(\n branches: BranchConfig[],\n predicate: (\n value: BranchConfig,\n index: number,\n array: BranchConfig[],\n ) => unknown,\n title: string,\n description: string,\n listItemType: DependencyDashboardListItemType = 'approvePr',\n bulkComment?: string,\n bulkMessage?: string,\n bulkIcon?: '🔐',\n): string {\n const filteredBranches = branches.filter(predicate);\n if (filteredBranches.length === 0) {\n return '';\n }\n let result = `## ${title}\\n\\n${description}\\n\\n`;\n const { categories, uncategorized, hasCategorized, hasUncategorized } =\n splitBranchesByCategory(filteredBranches);\n if (hasCategorized) {\n for (const [category, branches] of Object.entries(categories).sort(\n ([keyA], [keyB]) =>\n keyA.localeCompare(keyB, undefined, { numeric: true }),\n )) {\n result = `${result.trimEnd()}\\n\\n`;\n result += `### ${category}\\n\\n`;\n result += getBranchList(branches, listItemType);\n }\n if (hasUncategorized) {\n result = `${result.trimEnd()}\\n\\n`;\n result += `### Others`;\n }\n }\n result = `${result.trimEnd()}\\n\\n`;\n result += getBranchList(uncategorized, listItemType);\n\n if (bulkComment && bulkMessage && filteredBranches.length > 1) {\n if (hasCategorized) {\n result = `${result.trimEnd()}\\n\\n`;\n result += '### All\\n\\n';\n }\n result += getCheckbox(bulkComment);\n result += `${bulkIcon ? `${bulkIcon} ` : ''}**${bulkMessage}**${bulkIcon ? ` ${bulkIcon}` : ''}`;\n }\n return `${result.trimEnd()}\\n\\n`;\n}\n\nfunction appendRepoProblems(config: RenovateConfig, issueBody: string): string {\n let newIssueBody = issueBody;\n const repoProblems = extractRepoProblems(config.repository);\n if (repoProblems.size) {\n newIssueBody += '## Repository Problems\\n\\n';\n const repoProblemsHeader =\n config.dependencyDashboard?.customize?.repoProblemsHeader ??\n 'Renovate tried to run on this repository, but found these problems.';\n newIssueBody += `${template.compile(repoProblemsHeader, config)}\\n\\n`;\n\n for (const repoProblem of repoProblems) {\n newIssueBody += ` - ${repoProblem}\\n`;\n }\n newIssueBody += '\\n';\n }\n return newIssueBody;\n}\n\nexport async function ensureDependencyDashboard(\n config: SelectAllConfig,\n allBranches: BranchConfig[],\n packageFiles: Record<string, PackageFile[]> = {},\n configMigrationRes: ConfigMigrationResult,\n): Promise<void> {\n logger.debug('ensureDependencyDashboard()');\n if (config.mode === 'silent') {\n logger.debug(\n 'Dependency Dashboard issue is not created, updated or closed when mode=silent',\n );\n return;\n }\n // legacy/migrated issue\n const reuseTitle = 'Update Dependencies (Renovate Bot)';\n const branches = allBranches.filter(\n (branch) =>\n branch.result !== 'automerged' &&\n !branch.upgrades?.every((upgrade) => upgrade.remediationNotPossible),\n );\n if (!(\n config.dependencyDashboard?.enabled === true ||\n config.dependencyDashboardApproval === true ||\n config.packageRules?.some((rule) => rule.dependencyDashboardApproval) ===\n true ||\n branches.some(needsDashboardApproval)\n )) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: getDashboardTitle(config) },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(getDashboardTitle(config));\n delete config.dependencyDashboardIssue;\n }\n return;\n }\n // istanbul ignore if\n if (config.repoIsOnboarded === false) {\n logger.debug('Repo is onboarding - skipping dependency dashboard');\n return;\n }\n logger.debug('Ensuring Dependency Dashboard');\n\n // Check packageFiles for any deprecations or replacements\n let hasDeprecationsOrReplacements = false;\n const deprecatedPackages: Record<\n string,\n Record<\n string,\n { hasActionableReplacement: boolean; sourceUrl?: string | null }\n >\n > = {};\n logger.debug('Checking packageFiles for deprecated or replacement packages');\n if (isNonEmptyObject(packageFiles)) {\n for (const [manager, fileNames] of Object.entries(packageFiles)) {\n for (const fileName of fileNames) {\n for (const dep of fileName.deps) {\n const name = dep.packageName;\n const replacementUpdate = dep.updates?.find(\n (update) => update.updateType === 'replacement',\n );\n const hasAnyReplacement = !!replacementUpdate;\n const hasActionableReplacement =\n hasAnyReplacement &&\n !(\n replacementUpdate.newName &&\n replacementAlreadyExists(\n fileName.deps,\n dep,\n replacementUpdate.newName,\n )\n );\n const deprecationOrReplacement =\n dep.deprecationMessage ?? hasAnyReplacement;\n if (name && deprecationOrReplacement) {\n hasDeprecationsOrReplacements = true;\n deprecatedPackages[manager] ??= {};\n deprecatedPackages[manager][name] ??= {\n hasActionableReplacement,\n sourceUrl: dep.sourceUrl,\n };\n }\n }\n }\n }\n }\n\n const hasBranches = isNonEmptyArray(branches);\n if (\n config.dependencyDashboard?.autoclose &&\n !hasBranches &&\n !hasDeprecationsOrReplacements\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: getDashboardTitle(config) },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(getDashboardTitle(config));\n delete config.dependencyDashboardIssue;\n }\n return;\n }\n let issueBody = '';\n\n if (config.dependencyDashboard?.header?.length) {\n issueBody += `${template.compile(config.dependencyDashboard.header, config)}\\n\\n`;\n }\n\n if (configMigrationRes.result === 'pr-exists') {\n issueBody += `## Config Migration Needed\\n\\n${getMarkdownComment(configMigrationPrInfo)} See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'pr-modified') {\n issueBody += `## Config Migration Needed (Blocked)\\n\\n${getMarkdownComment(configMigrationPrInfo)} The Config Migration branch exists but has been modified by another user. Renovate will not push to this branch unless it is first deleted. \\n\\n See Config Migration PR: #${configMigrationRes.prNumber}.\\n\\n`;\n } else if (configMigrationRes?.result === 'add-checkbox') {\n issueBody += `## Config Migration Needed\\n\\n${getCheckbox(createConfigMigrationPr)} Select this checkbox to let Renovate create an automated Config Migration PR.\\n\\n`;\n }\n\n issueBody = appendRepoProblems(config, issueBody);\n\n if (hasDeprecationsOrReplacements) {\n issueBody += '## Deprecations / Replacements\\n';\n issueBody += emojify('> :warning: **Warning**\\n> \\n');\n issueBody +=\n '> The following dependencies are either deprecated or have replacements available.\\n\\n';\n issueBody += '| Datasource | Package | Replacement PR? |\\n';\n issueBody += '|------------|------|--------------|\\n';\n for (const manager of Object.keys(deprecatedPackages).sort()) {\n const deps = deprecatedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const { hasActionableReplacement, sourceUrl } = deps[depName];\n const packageName = formatAsMarkdownLink(depName, sourceUrl);\n\n issueBody += `| ${manager} | ${packageName} | ${\n hasActionableReplacement\n ? ''\n : ''\n } |\\n`;\n }\n }\n issueBody += '\\n';\n }\n\n if (config.dependencyDashboard?.reportAbandonment) {\n issueBody += getAbandonedPackagesMd(config, packageFiles);\n }\n\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'needs-approval',\n 'Pending Approval',\n 'The following branches are pending approval. To create them, click on a checkbox below.',\n 'approve',\n approveAllPendingPrs,\n 'Create all pending approval PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'minimum-group-size-not-met',\n 'Group Size Not Met',\n 'The following branches have not met their minimum group size. To create them, click on a checkbox below.',\n 'approveGroup',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'not-scheduled',\n 'Awaiting Schedule',\n 'The following updates are awaiting their schedule. To get an update now, click on a checkbox below.',\n 'unschedule',\n createAllAwaitingSchedulePrs,\n 'Create all awaiting schedule PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) =>\n branch.result === 'branch-limit-reached' ||\n branch.result === 'pr-limit-reached' ||\n branch.result === 'commit-per-run-limit-reached' ||\n branch.result === 'commit-hourly-limit-reached',\n 'Rate-Limited',\n 'The following updates are currently rate-limited. To force their creation now, click on a checkbox below.',\n 'unlimit',\n createAllRateLimitedPrs,\n 'Create all rate-limited PRs at once',\n '🔐',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'error',\n 'Errored',\n 'The following updates encountered an error and will be retried. To force a retry now, click on a checkbox below.',\n 'retry',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'needs-pr-approval',\n 'PR Creation Approval Required',\n 'The following branches exist but PR creation requires approval. To approve PR creation, click on a checkbox below.',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'pr-edited',\n 'PR Edited (Blocked)',\n 'The following updates have been manually edited so Renovate will no longer make changes. To discard all commits and start over, click on a checkbox below.',\n 'rebase',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'pending',\n 'Pending Status Checks',\n 'The following updates await pending status checks. To force their creation now, click on a checkbox below.',\n 'unpend',\n );\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.prBlockedBy === 'BranchAutomerge',\n 'Pending Branch Automerge',\n 'The following updates await pending status checks before automerging. To abort the branch automerge and create a PR instead, click on a checkbox below.',\n );\n\n const warn = getDepWarningsDashboard(packageFiles, config);\n if (warn) {\n issueBody += warn;\n issueBody += '\\n';\n }\n\n const otherRes = [\n 'pending',\n 'needs-approval',\n 'needs-pr-approval',\n 'not-scheduled',\n 'pr-limit-reached',\n 'commit-per-run-limit-reached',\n 'commit-hourly-limit-reached',\n 'branch-limit-reached',\n 'already-existed',\n 'error',\n 'automerged',\n 'pr-edited',\n 'minimum-group-size-not-met',\n ];\n const inProgress = branches.filter(\n (branch) =>\n !otherRes.includes(branch.result!) &&\n branch.prBlockedBy !== 'BranchAutomerge',\n );\n issueBody += getBranchesListMd(\n inProgress,\n (branch) => !!branch.prBlockedBy || !branch.prNo,\n 'Other Branches',\n 'The following updates are pending. To force the creation of a PR, click on a checkbox below.',\n 'other',\n );\n issueBody += getBranchesListMd(\n inProgress,\n (branch) => branch.prNo && !branch.prBlockedBy,\n 'Open',\n 'The following updates have all been created. To force a retry/rebase of any, click on a checkbox below.',\n 'rebase',\n rebaseAllOpenPrs,\n 'Click on this checkbox to rebase all open PRs at once',\n );\n\n issueBody += getBranchesListMd(\n branches,\n (branch) => branch.result === 'already-existed',\n 'PR Closed (Blocked)',\n 'The following updates are blocked by an existing closed PR. To recreate the PR, click on a checkbox below.',\n 'recreate',\n );\n\n if (!hasBranches) {\n issueBody +=\n 'This repository currently has no open or pending branches.\\n\\n';\n }\n\n // add CVE section\n issueBody += await getDashboardMarkdownVulnerabilities(config, packageFiles);\n\n // fit the detected dependencies section\n const footer = getFooter(config);\n issueBody += PackageFiles.getDashboardMarkdown(\n platform.maxBodyLength() - issueBody.length - footer.length,\n );\n\n issueBody += footer;\n\n if (config.dependencyDashboardIssue) {\n // If we're not changing the dashboard issue, then we can skip checking if the user changed it.\n // The cached issue we get back here will reflect its state at the _start_ of our run\n const cachedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n );\n if (cachedIssue?.body === issueBody) {\n logger.debug('No changes to dependency dashboard issue needed');\n return;\n }\n\n // Skip cache when getting the issue to ensure we get the latest body,\n // including any updates the user made after we started the run\n const updatedIssue = await platform.getIssue?.(\n config.dependencyDashboardIssue,\n false,\n );\n if (updatedIssue) {\n const { dependencyDashboardChecks } = parseDashboardIssue(\n coerceString(updatedIssue.body),\n );\n for (const branchName of Object.keys(config.dependencyDashboardChecks!)) {\n delete dependencyDashboardChecks[branchName];\n }\n for (const branchName of Object.keys(dependencyDashboardChecks)) {\n const checkText = getCheckbox(\n `${dependencyDashboardChecks[branchName]}-branch=${branchName}`,\n );\n issueBody = issueBody.replace(\n checkText,\n checkText.replace('[ ]', '[x]'),\n );\n }\n }\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: getDashboardTitle(config) },\n 'DRY-RUN: Would ensure Dependency Dashboard',\n );\n } else {\n const result = await platform.ensureIssue({\n title: getDashboardTitle(config),\n reuseTitle,\n body: platform.massageMarkdown(issueBody, config.rebaseLabel),\n labels: config.dependencyDashboard?.labels?.map((label) =>\n template.compile(label, config),\n ),\n confidential: config.confidential,\n });\n // ensureIssue doesn't return the issue, so a newly created (or renamed)\n // dashboard needs a lookup to record its number\n if (result && !config.dependencyDashboardIssue) {\n const issue = await platform.findIssue(getDashboardTitle(config));\n config.dependencyDashboardIssue = issue?.number;\n }\n }\n}\n\nexport function getAbandonedPackagesMd(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): string {\n const abandonedPackages: Record<\n string,\n Record<\n string,\n { mostRecentTimestamp?: string | null; sourceUrl?: string | null }\n >\n > = {};\n let abandonedCount = 0;\n\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n for (const packageFile of managerPackageFiles) {\n for (const dep of coerceArray(packageFile.deps)) {\n if (dep.depName && dep.isAbandoned) {\n abandonedCount++;\n abandonedPackages[manager] = abandonedPackages[manager] || {};\n abandonedPackages[manager][dep.depName] = {\n mostRecentTimestamp: dep.mostRecentTimestamp,\n sourceUrl: dep.sourceUrl,\n };\n }\n }\n }\n }\n\n if (abandonedCount === 0) {\n return '';\n }\n\n let abandonedMd = '## Abandoned Dependencies\\n\\n';\n abandonedMd +=\n 'The following dependencies have not received updates for an extended period and may be unmaintained.\\n\\n';\n\n // Keep the note outside the `<details>` block: GitHub only renders alert\n // callouts at the top level of a body, not inside collapsible sections.\n abandonedMd += emojify('> :information_source: **Note**\\n> \\n');\n abandonedMd += `> Packages are marked as abandoned when they exceed the [\\`abandonmentThreshold\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#abandonmentthreshold) since their last release. `;\n abandonedMd +=\n 'Unlike deprecated packages with official notices, abandonment is detected by release inactivity.\\n> \\n';\n\n abandonedMd += '<details>\\n';\n abandonedMd += `<summary>View abandoned dependencies (${abandonedCount})</summary>\\n\\n`;\n\n abandonedMd += '| Datasource | Package | Last Updated |\\n';\n abandonedMd += '|------------|------|-------------|\\n';\n\n for (const manager of Object.keys(abandonedPackages).sort()) {\n const deps = abandonedPackages[manager];\n for (const depName of Object.keys(deps).sort()) {\n const { mostRecentTimestamp, sourceUrl } = deps[depName];\n const formattedDate = mostRecentTimestamp\n ? DateTime.fromISO(mostRecentTimestamp).toFormat('yyyy-MM-dd')\n : 'unknown';\n const packageName = formatAsMarkdownLink(depName, sourceUrl);\n abandonedMd += `| ${manager} | ${packageName} | \\`${formattedDate}\\` |\\n`;\n }\n }\n\n abandonedMd += '\\n</details>\\n\\n\\n';\n\n return abandonedMd;\n}\n\nfunction getFooter(config: RenovateConfig): string {\n let footer = '';\n if (config.dependencyDashboard?.footer?.length) {\n footer += `---\\n${template.compile(config.dependencyDashboard.footer, config)}\\n`;\n }\n\n return footer;\n}\n\nexport async function getDashboardMarkdownVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<string> {\n let result = '';\n\n if (\n isNullOrUndefined(config.dependencyDashboard?.osvVulnerabilitySummary) ||\n config.dependencyDashboard.osvVulnerabilitySummary === 'none'\n ) {\n return result;\n }\n\n result += '## Vulnerabilities\\n\\n';\n\n let vulnerabilities: Vulnerability[];\n try {\n const vulnerabilityFetcher = await Vulnerabilities.create();\n vulnerabilities = await vulnerabilityFetcher.fetchVulnerabilities(\n config,\n packageFiles,\n );\n } catch (err) {\n logger.warn({ err }, 'Unable to read vulnerability information');\n result +=\n 'Renovate was unable to fetch CVE information from [osv.dev](https://osv.dev) this run.\\n\\n';\n return result;\n }\n\n if (vulnerabilities.length === 0) {\n result +=\n 'Renovate has not found any CVEs on [osv.dev](https://osv.dev).\\n\\n';\n return result;\n }\n\n const unresolvedVulnerabilities = vulnerabilities.filter((value) =>\n isNullOrUndefined(value.fixedVersion),\n );\n const resolvedVulnerabilitiesLength =\n vulnerabilities.length - unresolvedVulnerabilities.length;\n\n result += emojify('> :exclamation: **Important**\\n> \\n');\n result += `> \\`${resolvedVulnerabilitiesLength}\\`/\\`${vulnerabilities.length}\\``;\n if (isTruthy(config.osvVulnerabilityAlerts)) {\n result += ' CVEs have Renovate fixes.\\n\\n';\n } else {\n result += ` CVEs have possible Renovate fixes.\\n> See [\\`osvVulnerabilityAlerts\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#osvvulnerabilityalerts) to allow Renovate to supply fixes.\\n\\n`;\n }\n\n let renderedVulnerabilities: Vulnerability[];\n switch (config.dependencyDashboard?.osvVulnerabilitySummary) {\n // filter vulnerabilities to display based on configuration\n case 'unresolved':\n renderedVulnerabilities = unresolvedVulnerabilities;\n break;\n default:\n renderedVulnerabilities = vulnerabilities;\n }\n\n const managerRecords: Record<\n string,\n Record<string, Record<string, Vulnerability[]>>\n > = {};\n for (const vulnerability of renderedVulnerabilities) {\n const { manager, packageFile } = vulnerability.packageFileConfig;\n if (isNullOrUndefined(managerRecords[manager!])) {\n managerRecords[manager!] = {};\n }\n if (isNullOrUndefined(managerRecords[manager!][packageFile])) {\n managerRecords[manager!][packageFile] = {};\n }\n if (\n isNullOrUndefined(\n managerRecords[manager!][packageFile][vulnerability.packageName],\n )\n ) {\n managerRecords[manager!][packageFile][vulnerability.packageName] = [];\n }\n managerRecords[manager!][packageFile][vulnerability.packageName].push(\n vulnerability,\n );\n }\n\n for (const [manager, packageFileRecords] of Object.entries(managerRecords)) {\n result += `<details><summary>${manager}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageFile, packageNameRecords] of Object.entries(\n packageFileRecords,\n )) {\n result += `<details><summary>${packageFile}</summary>\\n<blockquote>\\n\\n`;\n for (const [packageName, cves] of Object.entries(packageNameRecords)) {\n result += `<details><summary>${packageName}</summary>\\n<blockquote>\\n\\n`;\n for (const vul of cves) {\n const id = vul.vulnerability.id;\n const suffix = isNonEmptyString(vul.fixedVersion)\n ? ` (fixed in ${vul.fixedVersion})`\n : '';\n result += `- [${id}](https://osv.dev/vulnerability/${id})${suffix}\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n result += `</blockquote>\\n</details>\\n\\n`;\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -50,7 +50,7 @@ function getPrBody(branchConfig, prBodyConfig, config) {
|
|
|
50
50
|
massageUpdateMetadata(branchConfig);
|
|
51
51
|
let warnings = "";
|
|
52
52
|
warnings += getWarnings(branchConfig);
|
|
53
|
-
if (branchConfig.packageFiles) warnings += getDepWarningsPR(branchConfig.packageFiles, config, branchConfig.dependencyDashboard);
|
|
53
|
+
if (branchConfig.packageFiles) warnings += getDepWarningsPR(branchConfig.packageFiles, config, branchConfig.dependencyDashboard?.enabled);
|
|
54
54
|
const content = {
|
|
55
55
|
header: getPrHeader(branchConfig),
|
|
56
56
|
table: getPrUpdatesTable(branchConfig),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../../lib/workers/repository/update/pr/body/index.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../../../config/types.ts';\nimport { PLATFORM_FAMILIES } from '../../../../../constants/index.ts';\nimport type { PrDebugData } from '../../../../../modules/platform/index.ts';\nimport { platform } from '../../../../../modules/platform/index.ts';\nimport { detectPlatform } from '../../../../../util/common.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { toBase64 } from '../../../../../util/string.ts';\nimport * as template from '../../../../../util/template/index.ts';\nimport { joinUrlParts } from '../../../../../util/url.ts';\nimport type { BranchConfig } from '../../../../types.ts';\nimport { getDepWarningsPR, getWarnings } from '../../../errors-warnings.ts';\nimport { getChangelogs } from './changelogs.ts';\nimport { getPrConfigDescription } from './config-description.ts';\nimport { getControls } from './controls.ts';\nimport { getPrFooter } from './footer.ts';\nimport { getPrHeader } from './header.ts';\nimport { getPrExtraNotes, getPrNotes } from './notes.ts';\nimport { getPrUpdatesTable } from './updates-table.ts';\n\nfunction massageUpdateMetadata(config: BranchConfig): void {\n config.upgrades.forEach((upgrade) => {\n const {\n homepage,\n sourceUrl,\n sourceDirectory,\n changelogUrl,\n dependencyUrl,\n } = upgrade;\n // TODO: types (#22198)\n let depNameLinked = upgrade.depName!;\n let newNameLinked = upgrade.newName!;\n const primaryLink = homepage ?? sourceUrl ?? dependencyUrl;\n if (primaryLink) {\n depNameLinked = `[${depNameLinked}](${primaryLink})`;\n newNameLinked = `[${newNameLinked}](${primaryLink})`;\n }\n\n const sourcePlatform = sourceUrl ? detectPlatform(sourceUrl) : null;\n const sourceRootPath = sourcePlatform\n ? PLATFORM_FAMILIES[sourcePlatform].webDirPath\n : 'tree/HEAD';\n\n const otherLinks = [];\n const hasSourceDirectoryOrHomepage = !!sourceDirectory || homepage;\n if (sourceUrl && hasSourceDirectoryOrHomepage) {\n otherLinks.push(\n `[source](${getFullSourceUrl(sourceUrl, sourceRootPath, sourceDirectory)})`,\n );\n }\n const templatedChangelogUrl = changelogUrl\n ? template.compile(changelogUrl, upgrade, true)\n : undefined;\n if (templatedChangelogUrl) {\n otherLinks.push(`[changelog](${templatedChangelogUrl})`);\n }\n if (otherLinks.length) {\n depNameLinked += ` (${otherLinks.join(', ')})`;\n }\n upgrade.depNameLinked = depNameLinked;\n upgrade.newNameLinked = newNameLinked;\n const references: string[] = [];\n if (homepage) {\n references.push(`[homepage](${homepage})`);\n }\n if (sourceUrl) {\n references.push(\n `[source](${getFullSourceUrl(sourceUrl, sourceRootPath, sourceDirectory)})`,\n );\n }\n if (templatedChangelogUrl) {\n references.push(`[changelog](${templatedChangelogUrl})`);\n }\n upgrade.references = references.join(', ');\n });\n}\n\nfunction getFullSourceUrl(\n sourceUrl: string,\n sourceRootPath: string,\n sourceDirectory?: string,\n): string {\n let fullUrl = sourceUrl;\n if (sourceDirectory) {\n fullUrl = joinUrlParts(sourceUrl, sourceRootPath, sourceDirectory);\n }\n\n return fullUrl;\n}\n\ninterface PrBodyConfig {\n appendExtra?: string | null | undefined;\n rebasingNotice?: string;\n debugData: PrDebugData;\n}\n\nconst rebasingRegex = regEx(/\\*\\*Rebasing\\*\\*: .*/);\n\n// TODO: `branchConfig` and `config`are the same object\nexport function getPrBody(\n branchConfig: BranchConfig,\n prBodyConfig: PrBodyConfig,\n config: RenovateConfig,\n): string {\n massageUpdateMetadata(branchConfig);\n let warnings = '';\n warnings += getWarnings(branchConfig);\n if (branchConfig.packageFiles) {\n warnings += getDepWarningsPR(\n branchConfig.packageFiles,\n config,\n branchConfig.dependencyDashboard,\n );\n }\n const content = {\n header: getPrHeader(branchConfig),\n table: getPrUpdatesTable(branchConfig),\n warnings,\n notes: getPrNotes(branchConfig) + getPrExtraNotes(branchConfig),\n changelogs: getChangelogs(branchConfig),\n configDescription: getPrConfigDescription(branchConfig),\n controls: getControls(),\n footer: getPrFooter(branchConfig),\n };\n\n let prBody = '';\n if (branchConfig.prBodyTemplate) {\n const prBodyTemplate = branchConfig.prBodyTemplate;\n prBody = template.compile(prBodyTemplate, content, false);\n prBody = prBody.trim();\n prBody = prBody.replace(regEx(/\\n\\n\\n+/g), '\\n\\n');\n const prDebugData64 = toBase64(JSON.stringify(prBodyConfig.debugData));\n prBody += `\\n<!--renovate-debug:${prDebugData64}-->\\n`;\n prBody = platform.massageMarkdown(prBody, config.rebaseLabel);\n\n if (prBodyConfig?.rebasingNotice) {\n prBody = prBody.replace(\n rebasingRegex,\n `**Rebasing**: ${prBodyConfig.rebasingNotice}`,\n );\n }\n }\n return prBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,SAAS,sBAAsB,QAA4B;CACzD,OAAO,SAAS,SAAS,YAAY;EACnC,MAAM,EACJ,UACA,WACA,iBACA,cACA,kBACE;EAEJ,IAAI,gBAAgB,QAAQ;EAC5B,IAAI,gBAAgB,QAAQ;EAC5B,MAAM,cAAc,YAAY,aAAa;EAC7C,IAAI,aAAa;GACf,gBAAgB,IAAI,cAAc,IAAI,YAAY;GAClD,gBAAgB,IAAI,cAAc,IAAI,YAAY;EACpD;EAEA,MAAM,iBAAiB,YAAY,eAAe,SAAS,IAAI;EAC/D,MAAM,iBAAiB,iBACnB,kBAAkB,eAAe,CAAC,aAClC;EAEJ,MAAM,aAAa,CAAC;EAEpB,IAAI,cADiC,CAAC,CAAC,mBAAmB,WAExD,WAAW,KACT,YAAY,iBAAiB,WAAW,gBAAgB,eAAe,EAAE,EAC3E;EAEF,MAAM,wBAAwB,eAC1BA,QAAiB,cAAc,SAAS,IAAI,IAC5C,KAAA;EACJ,IAAI,uBACF,WAAW,KAAK,eAAe,sBAAsB,EAAE;EAEzD,IAAI,WAAW,QACb,iBAAiB,KAAK,WAAW,KAAK,IAAI,EAAE;EAE9C,QAAQ,gBAAgB;EACxB,QAAQ,gBAAgB;EACxB,MAAM,aAAuB,CAAC;EAC9B,IAAI,UACF,WAAW,KAAK,cAAc,SAAS,EAAE;EAE3C,IAAI,WACF,WAAW,KACT,YAAY,iBAAiB,WAAW,gBAAgB,eAAe,EAAE,EAC3E;EAEF,IAAI,uBACF,WAAW,KAAK,eAAe,sBAAsB,EAAE;EAEzD,QAAQ,aAAa,WAAW,KAAK,IAAI;CAC3C,CAAC;AACH;AAEA,SAAS,iBACP,WACA,gBACA,iBACQ;CACR,IAAI,UAAU;CACd,IAAI,iBACF,UAAU,aAAa,WAAW,gBAAgB,eAAe;CAGnE,OAAO;AACT;AAQA,MAAM,gBAAgB,MAAM,sBAAsB;AAGlD,SAAgB,UACd,cACA,cACA,QACQ;CACR,sBAAsB,YAAY;CAClC,IAAI,WAAW;CACf,YAAY,YAAY,YAAY;CACpC,IAAI,aAAa,cACf,YAAY,iBACV,aAAa,cACb,QACA,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../../lib/workers/repository/update/pr/body/index.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../../../config/types.ts';\nimport { PLATFORM_FAMILIES } from '../../../../../constants/index.ts';\nimport type { PrDebugData } from '../../../../../modules/platform/index.ts';\nimport { platform } from '../../../../../modules/platform/index.ts';\nimport { detectPlatform } from '../../../../../util/common.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { toBase64 } from '../../../../../util/string.ts';\nimport * as template from '../../../../../util/template/index.ts';\nimport { joinUrlParts } from '../../../../../util/url.ts';\nimport type { BranchConfig } from '../../../../types.ts';\nimport { getDepWarningsPR, getWarnings } from '../../../errors-warnings.ts';\nimport { getChangelogs } from './changelogs.ts';\nimport { getPrConfigDescription } from './config-description.ts';\nimport { getControls } from './controls.ts';\nimport { getPrFooter } from './footer.ts';\nimport { getPrHeader } from './header.ts';\nimport { getPrExtraNotes, getPrNotes } from './notes.ts';\nimport { getPrUpdatesTable } from './updates-table.ts';\n\nfunction massageUpdateMetadata(config: BranchConfig): void {\n config.upgrades.forEach((upgrade) => {\n const {\n homepage,\n sourceUrl,\n sourceDirectory,\n changelogUrl,\n dependencyUrl,\n } = upgrade;\n // TODO: types (#22198)\n let depNameLinked = upgrade.depName!;\n let newNameLinked = upgrade.newName!;\n const primaryLink = homepage ?? sourceUrl ?? dependencyUrl;\n if (primaryLink) {\n depNameLinked = `[${depNameLinked}](${primaryLink})`;\n newNameLinked = `[${newNameLinked}](${primaryLink})`;\n }\n\n const sourcePlatform = sourceUrl ? detectPlatform(sourceUrl) : null;\n const sourceRootPath = sourcePlatform\n ? PLATFORM_FAMILIES[sourcePlatform].webDirPath\n : 'tree/HEAD';\n\n const otherLinks = [];\n const hasSourceDirectoryOrHomepage = !!sourceDirectory || homepage;\n if (sourceUrl && hasSourceDirectoryOrHomepage) {\n otherLinks.push(\n `[source](${getFullSourceUrl(sourceUrl, sourceRootPath, sourceDirectory)})`,\n );\n }\n const templatedChangelogUrl = changelogUrl\n ? template.compile(changelogUrl, upgrade, true)\n : undefined;\n if (templatedChangelogUrl) {\n otherLinks.push(`[changelog](${templatedChangelogUrl})`);\n }\n if (otherLinks.length) {\n depNameLinked += ` (${otherLinks.join(', ')})`;\n }\n upgrade.depNameLinked = depNameLinked;\n upgrade.newNameLinked = newNameLinked;\n const references: string[] = [];\n if (homepage) {\n references.push(`[homepage](${homepage})`);\n }\n if (sourceUrl) {\n references.push(\n `[source](${getFullSourceUrl(sourceUrl, sourceRootPath, sourceDirectory)})`,\n );\n }\n if (templatedChangelogUrl) {\n references.push(`[changelog](${templatedChangelogUrl})`);\n }\n upgrade.references = references.join(', ');\n });\n}\n\nfunction getFullSourceUrl(\n sourceUrl: string,\n sourceRootPath: string,\n sourceDirectory?: string,\n): string {\n let fullUrl = sourceUrl;\n if (sourceDirectory) {\n fullUrl = joinUrlParts(sourceUrl, sourceRootPath, sourceDirectory);\n }\n\n return fullUrl;\n}\n\ninterface PrBodyConfig {\n appendExtra?: string | null | undefined;\n rebasingNotice?: string;\n debugData: PrDebugData;\n}\n\nconst rebasingRegex = regEx(/\\*\\*Rebasing\\*\\*: .*/);\n\n// TODO: `branchConfig` and `config`are the same object\nexport function getPrBody(\n branchConfig: BranchConfig,\n prBodyConfig: PrBodyConfig,\n config: RenovateConfig,\n): string {\n massageUpdateMetadata(branchConfig);\n let warnings = '';\n warnings += getWarnings(branchConfig);\n if (branchConfig.packageFiles) {\n warnings += getDepWarningsPR(\n branchConfig.packageFiles,\n config,\n branchConfig.dependencyDashboard?.enabled,\n );\n }\n const content = {\n header: getPrHeader(branchConfig),\n table: getPrUpdatesTable(branchConfig),\n warnings,\n notes: getPrNotes(branchConfig) + getPrExtraNotes(branchConfig),\n changelogs: getChangelogs(branchConfig),\n configDescription: getPrConfigDescription(branchConfig),\n controls: getControls(),\n footer: getPrFooter(branchConfig),\n };\n\n let prBody = '';\n if (branchConfig.prBodyTemplate) {\n const prBodyTemplate = branchConfig.prBodyTemplate;\n prBody = template.compile(prBodyTemplate, content, false);\n prBody = prBody.trim();\n prBody = prBody.replace(regEx(/\\n\\n\\n+/g), '\\n\\n');\n const prDebugData64 = toBase64(JSON.stringify(prBodyConfig.debugData));\n prBody += `\\n<!--renovate-debug:${prDebugData64}-->\\n`;\n prBody = platform.massageMarkdown(prBody, config.rebaseLabel);\n\n if (prBodyConfig?.rebasingNotice) {\n prBody = prBody.replace(\n rebasingRegex,\n `**Rebasing**: ${prBodyConfig.rebasingNotice}`,\n );\n }\n }\n return prBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,SAAS,sBAAsB,QAA4B;CACzD,OAAO,SAAS,SAAS,YAAY;EACnC,MAAM,EACJ,UACA,WACA,iBACA,cACA,kBACE;EAEJ,IAAI,gBAAgB,QAAQ;EAC5B,IAAI,gBAAgB,QAAQ;EAC5B,MAAM,cAAc,YAAY,aAAa;EAC7C,IAAI,aAAa;GACf,gBAAgB,IAAI,cAAc,IAAI,YAAY;GAClD,gBAAgB,IAAI,cAAc,IAAI,YAAY;EACpD;EAEA,MAAM,iBAAiB,YAAY,eAAe,SAAS,IAAI;EAC/D,MAAM,iBAAiB,iBACnB,kBAAkB,eAAe,CAAC,aAClC;EAEJ,MAAM,aAAa,CAAC;EAEpB,IAAI,cADiC,CAAC,CAAC,mBAAmB,WAExD,WAAW,KACT,YAAY,iBAAiB,WAAW,gBAAgB,eAAe,EAAE,EAC3E;EAEF,MAAM,wBAAwB,eAC1BA,QAAiB,cAAc,SAAS,IAAI,IAC5C,KAAA;EACJ,IAAI,uBACF,WAAW,KAAK,eAAe,sBAAsB,EAAE;EAEzD,IAAI,WAAW,QACb,iBAAiB,KAAK,WAAW,KAAK,IAAI,EAAE;EAE9C,QAAQ,gBAAgB;EACxB,QAAQ,gBAAgB;EACxB,MAAM,aAAuB,CAAC;EAC9B,IAAI,UACF,WAAW,KAAK,cAAc,SAAS,EAAE;EAE3C,IAAI,WACF,WAAW,KACT,YAAY,iBAAiB,WAAW,gBAAgB,eAAe,EAAE,EAC3E;EAEF,IAAI,uBACF,WAAW,KAAK,eAAe,sBAAsB,EAAE;EAEzD,QAAQ,aAAa,WAAW,KAAK,IAAI;CAC3C,CAAC;AACH;AAEA,SAAS,iBACP,WACA,gBACA,iBACQ;CACR,IAAI,UAAU;CACd,IAAI,iBACF,UAAU,aAAa,WAAW,gBAAgB,eAAe;CAGnE,OAAO;AACT;AAQA,MAAM,gBAAgB,MAAM,sBAAsB;AAGlD,SAAgB,UACd,cACA,cACA,QACQ;CACR,sBAAsB,YAAY;CAClC,IAAI,WAAW;CACf,YAAY,YAAY,YAAY;CACpC,IAAI,aAAa,cACf,YAAY,iBACV,aAAa,cACb,QACA,aAAa,qBAAqB,OACpC;CAEF,MAAM,UAAU;EACd,QAAQ,YAAY,YAAY;EAChC,OAAO,kBAAkB,YAAY;EACrC;EACA,OAAO,WAAW,YAAY,IAAI,gBAAgB,YAAY;EAC9D,YAAY,cAAc,YAAY;EACtC,mBAAmB,uBAAuB,YAAY;EACtD,UAAU,YAAY;EACtB,QAAQ,YAAY,YAAY;CAClC;CAEA,IAAI,SAAS;CACb,IAAI,aAAa,gBAAgB;EAC/B,MAAM,iBAAiB,aAAa;EACpC,SAASA,QAAiB,gBAAgB,SAAS,KAAK;EACxD,SAAS,OAAO,KAAK;EACrB,SAAS,OAAO,QAAQ,MAAM,UAAU,GAAG,MAAM;EACjD,MAAM,gBAAgB,SAAS,KAAK,UAAU,aAAa,SAAS,CAAC;EACrE,UAAU,wBAAwB,cAAc;EAChD,SAAS,SAAS,gBAAgB,QAAQ,OAAO,WAAW;EAE5D,IAAI,cAAc,gBAChB,SAAS,OAAO,QACd,eACA,iBAAiB,aAAa,gBAChC;CAEJ;CACA,OAAO;AACT"}
|
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.
|
|
4
|
+
"version": "44.232.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -118,12 +118,12 @@
|
|
|
118
118
|
"@pnpm/parse-overrides": "1001.0.4",
|
|
119
119
|
"@qnighy/marshal": "0.1.3",
|
|
120
120
|
"@redis/client": "6.3.1",
|
|
121
|
-
"@renovatebot/base-image": "13.164.
|
|
121
|
+
"@renovatebot/base-image": "13.164.1",
|
|
122
122
|
"@renovatebot/detect-tools": "5.0.0",
|
|
123
123
|
"@renovatebot/good-enough-parser": "4.0.3",
|
|
124
124
|
"@renovatebot/osv-offline": "4.5.10",
|
|
125
125
|
"@renovatebot/pep440": "6.0.0",
|
|
126
|
-
"@renovatebot/pgp": "2.0.
|
|
126
|
+
"@renovatebot/pgp": "2.0.6",
|
|
127
127
|
"@renovatebot/ruby-semver": "6.0.0",
|
|
128
128
|
"@sindresorhus/is": "8.1.0",
|
|
129
129
|
"@yarnpkg/core": "4.9.1",
|
|
@@ -215,7 +215,7 @@
|
|
|
215
215
|
"re2": "1.27.0"
|
|
216
216
|
},
|
|
217
217
|
"devDependencies": {
|
|
218
|
-
"@biomejs/biome": "2.6.
|
|
218
|
+
"@biomejs/biome": "2.6.5",
|
|
219
219
|
"@commander-js/extra-typings": "15.0.0",
|
|
220
220
|
"@containerbase/istanbul-reports-html": "2.0.24",
|
|
221
221
|
"@containerbase/semantic-release-pnpm": "1.4.4",
|