renovate 44.176.2 → 44.176.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/validation.js +9 -3
- package/dist/config/validation.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +1 -1
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/github-actions/artifacts.js +1 -1
- package/dist/modules/manager/github-actions/artifacts.js.map +1 -1
- package/dist/workers/repository/dependency-dashboard.js +2 -1
- package/dist/workers/repository/dependency-dashboard.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -2,7 +2,7 @@ import { regEx } from "../util/regex.js";
|
|
|
2
2
|
import { getConfigFileNames } from "./app-strings.js";
|
|
3
3
|
import { GlobalConfig } from "./global.js";
|
|
4
4
|
import { coerceArray } from "../util/array.js";
|
|
5
|
-
import { anyMatchRegexOrGlobList, getRegexPredicate, isRegexMatch, matchRegexOrGlobList } from "../util/string-match.js";
|
|
5
|
+
import { anyMatchRegexOrGlobList, getRegexOrGlobPredicate, getRegexPredicate, isRegexMatch, matchRegexOrGlobList } from "../util/string-match.js";
|
|
6
6
|
import { logger } from "../logger/index.js";
|
|
7
7
|
import { clone } from "../util/clone.js";
|
|
8
8
|
import { AllManagersListLiteral } from "../manager-list.generated.js";
|
|
@@ -783,13 +783,19 @@ function describeAllowedValues(option) {
|
|
|
783
783
|
}
|
|
784
784
|
return `allowedValues: ${JSON.stringify(allowedValues)}`;
|
|
785
785
|
}
|
|
786
|
+
function isAllowedValue(option, allowedValues, val) {
|
|
787
|
+
if (allowedValues.includes(val)) return true;
|
|
788
|
+
if (!option.patternMatch) return false;
|
|
789
|
+
const predicate = getRegexOrGlobPredicate(val.startsWith("!") ? val.slice(1) : val);
|
|
790
|
+
return allowedValues.some((allowed) => predicate(allowed));
|
|
791
|
+
}
|
|
786
792
|
function validateAllowedValues(key, val, currentPath, errors) {
|
|
787
793
|
const option = optionsByName.get(key);
|
|
788
794
|
if (!option) return;
|
|
789
795
|
const allowedValues = option.allowedValues;
|
|
790
796
|
if (allowedValues?.length) {
|
|
791
797
|
if (val === null && option.default === null) {} else if (isArray(val, isString)) {
|
|
792
|
-
const invalidOptions = val.filter((v) => !allowedValues
|
|
798
|
+
const invalidOptions = val.filter((v) => !isAllowedValue(option, allowedValues, v));
|
|
793
799
|
if (invalidOptions.length) errors.push({
|
|
794
800
|
topic: ConfigValidationTopic.Error,
|
|
795
801
|
message: `Invalid ${currentPath}: ${option.name} had invalid values \`${JSON.stringify(invalidOptions)}\` which are not part of the ${describeAllowedValues(option)}`
|
|
@@ -800,7 +806,7 @@ function validateAllowedValues(key, val, currentPath, errors) {
|
|
|
800
806
|
topic: ConfigValidationTopic.Error,
|
|
801
807
|
message: `Invalid ${currentPath}: ${option.name} had invalid value \`${JSON.stringify(val)}\`. ${option.name} can only be a known versioning scheme, or be a string starting with \`regex:\` for custom regular expression versioning`
|
|
802
808
|
});
|
|
803
|
-
} else if (!allowedValues
|
|
809
|
+
} else if (!isAllowedValue(option, allowedValues, val) && !(option.supportsTemplating && val.includes("{{"))) errors.push({
|
|
804
810
|
topic: ConfigValidationTopic.Error,
|
|
805
811
|
message: `Invalid ${currentPath}: ${option.name} had a value \`${JSON.stringify(val)}\` which was not part of the ${describeAllowedValues(option)}`
|
|
806
812
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","names":["managerList","regexOrGlobValidator.check","matchBaseBranchesValidator.check"],"sources":["../../lib/config/validation.ts"],"sourcesContent":["import is, {\n isArray,\n isBoolean,\n isEmptyString,\n isNonEmptyArray,\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isObject,\n isPlainObject,\n isString,\n isUndefined,\n} from '@sindresorhus/is';\nimport type { PlatformId } from '../constants/index.ts';\nimport { instrument } from '../instrumentation/index.ts';\nimport { logger } from '../logger/index.ts';\nimport { AllManagersListLiteral } from '../manager-list.generated.ts';\nimport { isCustomManager } from '../modules/manager/custom/index.ts';\nimport type { CustomManager } from '../modules/manager/custom/types.ts';\nimport type { HostRule } from '../types/index.ts';\nimport { coerceArray } from '../util/array.ts';\nimport { packageCacheNamespaces } from '../util/cache/package/namespaces.ts';\nimport { clone } from '../util/clone.ts';\nimport { getToolConfig } from '../util/exec/containerbase.ts';\nimport { isConstraintName, isToolName } from '../util/exec/types.ts';\nimport { isValidCommitTrailer } from '../util/git/commit-trailers.ts';\nimport { getExpression } from '../util/jsonata.ts';\nimport { regEx } from '../util/regex.ts';\nimport {\n anyMatchRegexOrGlobList,\n getRegexPredicate,\n isRegexMatch,\n matchRegexOrGlobList,\n} from '../util/string-match.ts';\nimport * as template from '../util/template/index.ts';\nimport { parseUrl } from '../util/url.ts';\nimport {\n AllVersioningsListLiteral,\n type VersioningName,\n} from '../versioning-list.generated.ts';\nimport {\n hasValidSchedule,\n hasValidTimezone,\n} from '../workers/repository/update/branch/schedule.ts';\nimport { getConfigFileNames } from './app-strings.ts';\nimport { GlobalConfig } from './global.ts';\nimport { migrateConfig } from './migration.ts';\nimport { getOptions } from './options/index.ts';\nimport {\n describeAllowedLocations,\n getAllowedParents,\n} from './options/scopes.ts';\nimport { resolveConfigPresets } from './presets/index.ts';\nimport { isRelativePresetReference, parsePreset } from './presets/parse.ts';\nimport type {\n AllConfig,\n AllowedParents,\n RenovateConfig,\n RenovateOptions,\n StatusCheckKey,\n StatusCheckWhen,\n ValidationMessage,\n ValidationResult,\n} from './types.ts';\nimport {\n allowedStatusCheckStrings,\n allowedStatusCheckWhenValues,\n} from './types.ts';\nimport * as matchBaseBranchesValidator from './validation-helpers/match-base-branches.ts';\nimport * as regexOrGlobValidator from './validation-helpers/regex-glob-matchers.ts';\nimport { ConfigValidationTopic } from './validation-helpers/types.ts';\nimport {\n getParentName,\n isFalseGlobal,\n validateJSONataManagerFields,\n validateNumber,\n validatePlainObject,\n validateRegexManagerFields,\n} from './validation-helpers/utils.ts';\n\nconst options = getOptions();\n\nlet optionsInitialized = false;\nlet optionTypes: Record<string, RenovateOptions['type']>;\nlet optionParents: Record<string, AllowedParents[]>;\nlet optionLocations: Record<string, string>;\nlet optionGlobals: Set<string>;\nlet optionInherits: Set<string>;\nlet optionRegexOrGlob: Set<string>;\nlet optionAllowsNegativeIntegers: Set<string>;\nlet optionSupportsTemplating: Set<string>;\nlet optionsByName: Map<string, RenovateOptions>;\n\nconst managerList: readonly string[] = AllManagersListLiteral;\n\nconst topLevelObjects = [...managerList, 'env'];\n\nconst ignoredNodes = [\n '$schema',\n 'headers',\n 'depType',\n 'npmToken',\n 'packageFile',\n 'forkToken',\n 'repository',\n 'vulnerabilityAlertsOnly',\n 'vulnerabilityAlert',\n 'isVulnerabilityAlert',\n 'vulnerabilityFixVersion', // not intended to be used by end users but may be by Mend apps\n 'copyLocalLibs', // deprecated - functionality is now enabled by default\n 'prBody', // deprecated\n 'minimumConfidence', // undocumented feature flag\n];\nconst tzRe = regEx(/^:timezone\\((?<timezone>.+)\\)$/);\nconst rulesRe = regEx(/p.*Rules\\[\\d+\\]$/);\nconst repoEntryRe = regEx(/^repositories\\[\\d+\\]$/);\n\nfunction isIgnored(key: string): boolean {\n return ignoredNodes.includes(key);\n}\n\nfunction getDeprecationMessage(option: string): string | undefined {\n const deprecatedOptions: Record<string, string | undefined> = {\n branchName: `Direct editing of branchName is now deprecated. Please edit branchPrefix, additionalBranchPrefix, or branchTopic instead`,\n commitMessage: `Direct editing of commitMessage is now deprecated. Please edit commitMessage's subcomponents instead.`,\n prTitle: `Direct editing of prTitle is now deprecated. Please edit commitMessage subcomponents instead as they will be passed through to prTitle.`,\n };\n if (deprecatedOptions[option]) {\n return deprecatedOptions[option];\n }\n\n const found = options.find((o) => o.name === option);\n if (!found) {\n return undefined;\n }\n\n if (!found.deprecationMsg) {\n return undefined;\n }\n\n return `The '${option}' option is deprecated: ${found.deprecationMsg}`;\n}\n\nfunction isInhertConfigOption(key: string): boolean {\n return optionInherits.has(key);\n}\n\nfunction isRegexOrGlobOption(key: string): boolean {\n return optionRegexOrGlob.has(key);\n}\n\nfunction isGlobalOption(key: string): boolean {\n return optionGlobals.has(key);\n}\n\nfunction initOptions(): void {\n if (optionsInitialized) {\n return;\n }\n\n optionParents = {};\n optionLocations = {};\n optionInherits = new Set();\n optionTypes = {};\n optionRegexOrGlob = new Set();\n optionGlobals = new Set();\n optionAllowsNegativeIntegers = new Set();\n optionSupportsTemplating = new Set();\n optionsByName = new Map();\n\n for (const option of options) {\n optionTypes[option.name] = option.type;\n\n optionsByName.set(option.name, option);\n\n const parents = getAllowedParents(option);\n if (parents) {\n optionParents[option.name] = parents;\n // TODO: types (#22198)\n optionLocations[option.name] = describeAllowedLocations(option)!;\n }\n\n if (option.inheritConfigSupport) {\n optionInherits.add(option.name);\n }\n\n if (option.patternMatch) {\n optionRegexOrGlob.add(option.name);\n }\n\n if (option.globalOnly) {\n optionGlobals.add(option.name);\n }\n\n if (option.allowNegative) {\n optionAllowsNegativeIntegers.add(option.name);\n }\n\n if (option.supportsTemplating) {\n optionSupportsTemplating.add(option.name);\n }\n }\n\n optionsInitialized = true;\n}\n\n/**\n * Removes every relative preset reference from a deep copy of the given\n * `packageRules` entry, at any nesting depth.\n *\n * Relative references are only resolvable while the preset which contains them\n * is fetched, so they must not be passed to `resolveConfigPresets()` during\n * validation. They are still syntax checked by the `extends` validation.\n */\nfunction stripRelativePresets(packageRule: RenovateConfig): {\n rule: RenovateConfig;\n hasRelativePresets: boolean;\n} {\n const rule = clone(packageRule);\n const hasRelativePresets = stripRelativePresetsFromValue(rule);\n return { rule, hasRelativePresets };\n}\n\nfunction stripRelativePresetsFromValue(value: unknown): boolean {\n if (isArray(value)) {\n let stripped = false;\n for (const element of value) {\n stripped = stripRelativePresetsFromValue(element) || stripped;\n }\n return stripped;\n }\n\n if (!isPlainObject(value)) {\n return false;\n }\n\n let stripped = false;\n for (const [key, val] of Object.entries(value)) {\n if (key === 'extends' && isArray(val)) {\n const remaining = val.filter(\n (preset) => !(isString(preset) && isRelativePresetReference(preset)),\n );\n if (remaining.length !== val.length) {\n value[key] = remaining;\n stripped = true;\n }\n continue;\n }\n\n stripped = stripRelativePresetsFromValue(val) || stripped;\n }\n return stripped;\n}\n\ntype ConfigType = 'global' | 'inherit' | 'repo';\n\n/**\n * Whether a `hostRules` `allowInternal` is honored from this kind of config.\n *\n * Only the self-hosted administrator's own configuration may grant access to internal hosts. The inherited config repository belongs to the organization rather than to them, so its rules only count where the administrator has opted into trusting them with `inheritConfigTrusted`.\n */\nfunction mayGrantInternalHostAccess(configType: ConfigType): boolean {\n if (configType === 'global') {\n return true;\n }\n if (configType === 'inherit') {\n return GlobalConfig.get('inheritConfigTrusted');\n }\n return false;\n}\n\nfunction allowInternalNotAllowedMessage(configType: ConfigType): string {\n if (configType === 'inherit') {\n return 'hostRules `allowInternal` is not allowed in inherited config, as this Renovate instance has not set `inheritConfigTrusted=true`. The administrator can either set it, or move the rule to their global config or a `repositories[]` entry.';\n }\n return `hostRules \\`allowInternal\\` is only allowed in the self-hosted administrator's own configuration.`;\n}\n\nexport async function validateConfig(\n configType: ConfigType,\n config: AllConfig,\n isPreset?: boolean,\n parentPath?: string,\n // the name of the option that `config` is a value of, for when it can't be derived from `parentPath` (i.e. the name of a `customDatasources` entry is the user's choice)\n parentOptionName?: string,\n): Promise<ValidationResult> {\n return instrument(\n `validateConfig(${configType}, ${JSON.stringify(parentPath)})`,\n async () => {\n initOptions();\n\n let errors: ValidationMessage[] = [];\n let warnings: ValidationMessage[] = [];\n\n for (const [key, val] of Object.entries(config)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n /* v8 ignore next -- TODO: add test */\n if (key === '__proto__') {\n errors.push({\n topic: ConfigValidationTopic.Security,\n message: '__proto__',\n });\n continue;\n }\n if (\n parentPath &&\n parentPath !== 'onboardingConfig' &&\n !repoEntryRe.test(parentPath) &&\n topLevelObjects.includes(key)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `The \"${key}\" object can only be configured at the top level of a config but was found inside \"${parentPath}\"`,\n });\n }\n\n if (isGlobalOption(key)) {\n if (configType === 'global') {\n await validateGlobalConfig(\n key,\n val,\n optionTypes[key],\n warnings,\n errors,\n currentPath,\n config,\n );\n continue;\n } else if (\n !isFalseGlobal(key, parentPath) &&\n !(configType === 'inherit' && isInhertConfigOption(key))\n ) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `The \"${key}\" option is a global option reserved only for Renovate's global configuration and cannot be configured within a repository's config file.`,\n });\n continue;\n }\n }\n if (key === 'registryUrls' && !parentPath && isNonEmptyArray(val)) {\n warnings.push({\n topic: ConfigValidationTopic.Warning,\n message:\n 'Setting `registryUrls` at the top level of your config will apply it to all managers and datasources, which can cause the wrong registry URL to be used for some packages. Use `registryUrls` inside `packageRules` to target specific managers or packages.',\n });\n }\n if (\n key === 'defaultRegistryUrls' &&\n !parentPath &&\n isNonEmptyArray(val)\n ) {\n warnings.push({\n topic: ConfigValidationTopic.Warning,\n message:\n 'Setting `defaultRegistryUrls` at the top level of your config will apply it to all managers and datasources, which can cause the wrong registry URL to be used for some packages. Use `defaultRegistryUrls` inside `packageRules` to target specific managers or packages.',\n });\n }\n if (\n !isIgnored(key) && // We need to ignore some reserved keys\n !(is as any).function(val) // Ignore all functions\n ) {\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: ConfigValidationTopic.Deprecation,\n message: getDeprecationMessage(key)!,\n });\n }\n if (optionSupportsTemplating.has(key) && val) {\n try {\n // TODO: types (#22198)\n template.validate((val as string).toString());\n } catch {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid template in config path: ${currentPath}`,\n });\n }\n }\n const parentName =\n parentOptionName ??\n (parentPath &&\n (parentPath === 'onboardingConfig' || repoEntryRe.test(parentPath))\n ? '.'\n : getParentName(parentPath));\n if (\n !isPreset &&\n parentName &&\n optionParents[key] &&\n !optionParents[key].includes(parentName as AllowedParents) &&\n /* an object which may only be top-level is already reported above, with a message which says so more precisely */\n !topLevelObjects.includes(key)\n ) {\n const usedIn =\n parentName === '.'\n ? 'at the top level of a config'\n : `in \"${parentName}\"`;\n const message = `\"${key}\" can't be used ${usedIn}, as it can only be used ${optionLocations[key]}.`;\n warnings.push({\n topic: `${parentPath ? `${parentPath}.` : ''}${key}`,\n message,\n });\n }\n\n // v8 ignore else -- intentionally unhandled - if we knew what was to be covered here, we'd add validation\n if (!optionTypes[key]) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid configuration option: ${currentPath}`,\n });\n } else if (key === 'schedule' && isArray(val, isString)) {\n const [validSchedule, errorMessage] = hasValidSchedule(val);\n if (!validSchedule) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid ${currentPath}: \\`${errorMessage}\\``,\n });\n }\n } else if (\n [\n 'allowedVersions',\n 'matchCurrentVersion',\n 'matchCurrentValue',\n 'matchNewValue',\n ].includes(key) &&\n isRegexMatch(val)\n ) {\n if (!getRegexPredicate(val)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid regExp for ${currentPath}: \\`${val}\\``,\n });\n }\n } else if (key === 'timezone' && val !== null) {\n const [validTimezone, errorMessage] = hasValidTimezone(\n val as string,\n );\n if (!validTimezone) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n } else if (val !== null) {\n const type = optionTypes[key];\n if (type === 'boolean') {\n if (val !== true && val !== false) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be boolean. Found: ${JSON.stringify(\n val,\n )} (${typeof val})`,\n });\n }\n } else if (type === 'integer') {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n errors.push(\n ...validateNumber(key, val, allowsNegative, currentPath),\n );\n } else if (type === 'array' && val) {\n if (isArray(val)) {\n validateStringArray(key, val, currentPath, errors);\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n configType,\n subval,\n isPreset,\n `${currentPath}[${subIndex}]`,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n }\n if (isRegexOrGlobOption(key)) {\n errors.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath,\n }),\n );\n }\n if (key === 'extends') {\n for (const subval of val) {\n if (isString(subval)) {\n if (\n configType !== 'global' &&\n subval.startsWith('global:')\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: you cannot extend from \"global:\" presets in a repository config's \"extends\"`,\n });\n }\n\n if (\n parentName === 'packageRules' &&\n subval.startsWith('group:')\n ) {\n warnings.push({\n topic: ConfigValidationTopic.Warning,\n message: `${currentPath}: you should not extend \"group:\" presets`,\n });\n }\n if (tzRe.test(subval)) {\n const [, timezone] = tzRe.exec(subval)!;\n const [validTimezone, errorMessage] =\n hasValidTimezone(timezone);\n if (!validTimezone) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n }\n if (!subval.includes('{{')) {\n try {\n parsePreset(subval);\n } catch {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: preset \"${subval}\" is not valid`,\n });\n }\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: preset value is not a string`,\n });\n }\n }\n }\n\n if (key === 'commitTrailers') {\n for (const subval of val) {\n if (!isValidCommitTrailer(subval)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid commit trailer: \\`${JSON.stringify(\n subval,\n )}\\`. Must be a single-line string in the form \\`Key: value\\`, where the key contains only letters, digits and \\`-\\`.`,\n });\n }\n }\n }\n\n const selectors = [\n 'matchFileNames',\n 'matchLanguages',\n 'matchCategories',\n 'matchBaseBranches',\n 'matchManagers',\n 'matchDatasources',\n 'matchDepTypes',\n 'matchDepNames',\n 'matchPackageNames',\n 'matchCurrentValue',\n 'matchCurrentVersion',\n 'matchSourceUrls',\n 'matchRegistryUrls',\n 'matchUpdateTypes',\n 'matchIsBreaking',\n 'matchConfidence',\n 'matchCurrentAge',\n 'matchRepositories',\n 'matchNewValue',\n 'matchJsonata',\n ];\n if (key === 'packageRules') {\n for (const [subIndex, packageRule] of val.entries()) {\n if (isObject(packageRule)) {\n const { rule, hasRelativePresets } =\n stripRelativePresets(packageRule);\n const { config: resolved } = await resolveConfigPresets(\n rule,\n config,\n );\n const resolvedRule = migrateConfig({\n packageRules: [resolved],\n }).migratedConfig.packageRules![0];\n warnings.push(\n ...matchBaseBranchesValidator.check({\n resolvedRule,\n currentPath: `${currentPath}[${subIndex}]`,\n baseBranchPatterns: config.baseBranchPatterns!,\n }),\n );\n const selectorLength = Object.keys(resolvedRule).filter(\n (ruleKey) => selectors.includes(ruleKey),\n ).length;\n if (!selectorLength) {\n if (hasRelativePresets) {\n // the stripped relative preset may still provide the\n // missing selectors, so this cannot be an error\n const message = `${currentPath}[${subIndex}]: this rule extends a relative preset that cannot be resolved during validation, so its selectors could not be checked. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message,\n });\n } else {\n const message = `${currentPath}[${subIndex}]: Each packageRule must contain at least one match* or exclude* selector. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: ConfigValidationTopic.Error,\n message,\n });\n }\n }\n if (\n // the stripped relative preset legitimately provides\n // the non-selector field\n !hasRelativePresets &&\n selectorLength === Object.keys(resolvedRule).length\n ) {\n const message = `${currentPath}[${subIndex}]: Each packageRule must contain at least one non-match* or non-exclude* field. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message,\n });\n }\n // It's too late to apply any of these options once you already have updates determined\n const preLookupOptions = [\n 'allowedVersions',\n 'extractVersion',\n 'followTag',\n 'ignoreDeps',\n 'ignoreUnstable',\n 'rangeStrategy',\n 'registryUrls',\n 'respectLatest',\n 'rollbackPrs',\n 'separateMajorMinor',\n 'separateMinorPatch',\n 'separateMultipleMajor',\n 'separateMultipleMinor',\n 'versioning',\n ] as const;\n // These selectors are only known after the lookup\n const postLookupSelectors: string[] = [];\n if (isNonEmptyArray(resolvedRule.matchUpdateTypes)) {\n postLookupSelectors.push('matchUpdateTypes');\n }\n if (isBoolean(resolvedRule.matchIsBreaking)) {\n postLookupSelectors.push('matchIsBreaking');\n }\n for (const selector of postLookupSelectors) {\n for (const option of preLookupOptions) {\n if (resolvedRule[option] !== undefined) {\n const message = `${currentPath}[${subIndex}]: packageRules cannot combine both ${selector} and ${option}. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: ConfigValidationTopic.Error,\n message,\n });\n }\n }\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath} must contain JSON objects`,\n });\n }\n }\n }\n if (key === 'customManagers') {\n const allowedKeys = [\n 'customType',\n 'description',\n 'fileFormat',\n 'managerFilePatterns',\n 'matchStrings',\n 'matchStringsStrategy',\n 'depNameTemplate',\n 'packageNameTemplate',\n 'datasourceTemplate',\n 'versioningTemplate',\n 'registryUrlTemplate',\n 'currentValueTemplate',\n 'extractVersionTemplate',\n 'autoReplaceStringTemplate',\n 'depTypeTemplate',\n ];\n for (const customManager of val as CustomManager[]) {\n if (\n Object.keys(customManager).some(\n (k) => !allowedKeys.includes(k),\n )\n ) {\n const disallowedKeys = Object.keys(customManager).filter(\n (k) => !allowedKeys.includes(k),\n );\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Custom Manager contains disallowed fields: ${disallowedKeys.join(\n ', ',\n )}`,\n });\n } else if (\n isNonEmptyString(customManager.customType) &&\n isCustomManager(customManager.customType)\n ) {\n if (isNonEmptyArray(customManager.managerFilePatterns)) {\n switch (customManager.customType) {\n case 'regex':\n validateRegexManagerFields(\n customManager,\n currentPath,\n errors,\n );\n break;\n case 'jsonata':\n validateJSONataManagerFields(\n customManager,\n currentPath,\n errors,\n );\n break;\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Each Custom Manager must contain a non-empty managerFilePatterns array`,\n });\n }\n } else if (\n isEmptyString(customManager.customType) ||\n isUndefined(customManager.customType)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Each Custom Manager must contain a non-empty customType string`,\n });\n }\n }\n }\n if (['matchPackageNames', 'matchDepNames'].includes(key)) {\n const startPattern = regEx(/!?\\//);\n const endPattern = regEx(/\\/g?i?$/);\n for (const pattern of val as string[]) {\n if (\n startPattern.test(pattern) &&\n endPattern.test(pattern)\n ) {\n try {\n // regEx isn't aware of our !/ prefix but can handle the suffix\n regEx(pattern.replace(startPattern, '/'));\n } catch {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid regExp for ${currentPath}: \\`${pattern}\\``,\n });\n }\n }\n }\n }\n if (key === 'baseBranchPatterns') {\n for (const baseBranchPattern of val as string[]) {\n if (\n isRegexMatch(baseBranchPattern) &&\n !getRegexPredicate(baseBranchPattern)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid regExp for ${currentPath}: \\`${baseBranchPattern}\\``,\n });\n }\n }\n }\n if (\n (selectors.includes(key) ||\n key === 'matchCurrentVersion' ||\n key === 'matchCurrentValue') &&\n // TODO: can be undefined ? #22198\n !rulesRe.test(parentPath!) && // Inside a packageRule\n (isString(parentPath) || !isPreset) // top level in a preset\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: ${key} should be inside a \\`packageRule\\` only`,\n });\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a list (Array)`,\n });\n }\n } else if (type === 'string') {\n if (!isString(val)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a string`,\n });\n }\n } else if (type === 'object') {\n if (isPlainObject(val)) {\n if (key === 'registryAliases') {\n const res = validatePlainObject(val);\n if (res !== true) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${key}.${res}\\` configuration: value is not a string`,\n });\n }\n } else if (key === 'env') {\n const allowedEnvVars =\n configType === 'global'\n ? coerceArray(config.allowedEnv)\n : GlobalConfig.get('allowedEnv');\n for (const [envVarName, envVarValue] of Object.entries(val)) {\n if (!isString(envVarValue)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid env variable value: \\`${currentPath}.${envVarName}\\` must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(envVarName, allowedEnvVars)) {\n errors.push({\n // `Security` is always a fatal error that blocks the rest of the Renovate run.\n //\n // As `env` is only applied when it's at the top-level (where `parentPath === undefined`), we should only report a security error there.\n //\n // If it's found to be set to a disallowed value - even if it's not going to be used - we should report as an error, which may block the run, but much less worryingly than Security.\n topic: parentPath\n ? ConfigValidationTopic.Error\n : ConfigValidationTopic.Security,\n message: `Env variable name \\`${envVarName}\\` is not allowed by this Renovate instance's \\`allowedEnv\\`.`,\n });\n }\n }\n } else if (key === 'statusCheckNames') {\n for (const [\n statusCheckKey,\n statusCheckValue,\n ] of Object.entries(val)) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${key}.${statusCheckKey}\\` configuration: key is not allowed.`,\n });\n }\n if (!(\n isString(statusCheckValue) || null === statusCheckValue\n )) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: status check is not a string.`,\n });\n continue;\n }\n }\n } else if (key === 'statusCheckWhen') {\n for (const [\n statusCheckKey,\n statusCheckValue,\n ] of Object.entries(val)) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${key}.${statusCheckKey}\\` configuration: key is not allowed.`,\n });\n }\n if (\n !isString(statusCheckValue) ||\n !allowedStatusCheckWhenValues.includes(\n statusCheckValue as StatusCheckWhen,\n )\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: value must be one of \"always\", \"never\", or \"failed\".`,\n });\n continue;\n }\n }\n } else if (key === 'customDatasources') {\n for (const [\n customDatasourceName,\n customDatasourceValue,\n ] of Object.entries(val)) {\n if (!isPlainObject(customDatasourceValue)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${customDatasourceName}\\` configuration: customDatasource is not an object`,\n });\n continue;\n }\n const subValidation = await validateConfig(\n configType,\n customDatasourceValue,\n isPreset,\n `${currentPath}.${customDatasourceName}`,\n key,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n } else if (key === 'installTools') {\n for (const toolName of Object.keys(val)) {\n if (!isToolName(toolName)) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${toolName}\\` configuration: not a valid tool name.`,\n });\n }\n }\n } else if (key === 'constraints') {\n const { get: getVersioning } =\n await import('../modules/versioning/index.ts');\n for (const [k, v] of Object.entries(val)) {\n if (!isString(v)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\` should be an object of key-value pairs of constraints and their value`,\n });\n break;\n }\n\n if (!isConstraintName(k)) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\`: \\`${k}\\` is not a supported constraint name`,\n });\n } else if (isToolName(k)) {\n // TODO: #31831\n const versioningId = getToolConfig(k)?.versioning;\n const versioning = getVersioning(versioningId);\n if (!versioning.isValid(v)) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}=${v}\\` is not a valid tool version constraint, according to \\`${versioningId}\\` versioning`,\n });\n }\n }\n }\n } else if (key === 'constraintsVersioning') {\n for (const [k, v] of Object.entries(val)) {\n if (!isString(v)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\` should be an object of key-value pairs of additional constraint names and their versioning`,\n });\n break;\n }\n\n if (isToolName(k)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\` is not a valid additional constraint name, as \\`${k}\\` is a tool name, and \\`constraintsVersioning\\` can only override the versioning for a non-tool constraint`,\n });\n } else if (isConstraintName(k)) {\n const versioningName = v.split(':')[0];\n if (\n !AllVersioningsListLiteral.includes(\n versioningName as VersioningName,\n )\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}=${v}\\`: \\`${v}\\` is not a valid versioning scheme`,\n });\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\`: \\`${k}\\` is not a known additional constraint name`,\n });\n }\n }\n } else {\n const ignoredObjects = options\n .filter((option) => option.freeChoice)\n .map((option) => option.name);\n if (!ignoredObjects.includes(key)) {\n const subValidation = await validateConfig(\n configType,\n val,\n isPreset,\n currentPath,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a json object`,\n });\n }\n } else {\n // v8 ignore next -- intentionally unhandled - if we knew what was to be covered here, we'd add validation\n logger.debug(\n {},\n `Unhandled validation for ${type} at \\`${currentPath}\\``,\n );\n }\n }\n }\n\n if (key === 'hostRules' && isArray(val)) {\n const allowedHeaders =\n configType === 'global'\n ? coerceArray(config.allowedHeaders)\n : GlobalConfig.get('allowedHeaders');\n for (const rule of val as HostRule[]) {\n if (isNonEmptyString(rule.matchHost)) {\n if (\n rule.matchHost.includes('://') &&\n parseUrl(rule.matchHost) === null\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `hostRules matchHost \\`${rule.matchHost}\\` is not a valid URL.`,\n });\n }\n } else if (isEmptyString(rule.matchHost)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message:\n 'Invalid value for hostRules matchHost. It cannot be an empty string.',\n });\n }\n\n if (\n !isUndefined(rule.allowInternal) &&\n !mayGrantInternalHostAccess(configType)\n ) {\n errors.push({\n // like disallowed `headers` below, `Security` only where the rules are actually applied - see the comment there\n topic: parentPath\n ? ConfigValidationTopic.Error\n : ConfigValidationTopic.Security,\n message: allowInternalNotAllowedMessage(configType),\n });\n }\n\n if (!rule.headers) {\n continue;\n }\n if (!isPlainObject(rule.headers)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid hostRules headers configuration: headers must be an object.`,\n });\n continue;\n }\n for (const [header, value] of Object.entries(rule.headers)) {\n if (!isString(value)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid hostRules headers value configuration: header must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(header, allowedHeaders)) {\n errors.push({\n // `Security` is always a fatal error that blocks the rest of the Renovate run.\n //\n // As `hostRules[]` is only applied when it's at the top-level (where `parentPath === undefined`), we should only report a security error there.\n //\n // If it's found to be set to a disallowed value - even if it's not going to be used - we should report as an error, which may block the run, but much less worryingly than Security.\n topic: parentPath\n ? ConfigValidationTopic.Error\n : ConfigValidationTopic.Security,\n message: `hostRules header \\`${header}\\` is not allowed by this Renovate instance's \\`allowedHeaders\\`.`,\n });\n }\n }\n }\n }\n\n if (key === 'matchJsonata' && isArray(val, isString)) {\n for (const expression of val) {\n const res = getExpression(expression);\n if (res instanceof Error) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid JSONata expression for ${currentPath}: ${res.message}`,\n });\n }\n }\n }\n\n validateAllowedValues(key, val, currentPath, errors);\n }\n\n function sortAll(a: ValidationMessage, b: ValidationMessage): number {\n if (a.topic === b.topic) {\n return a.message > b.message ? 1 : -1;\n }\n return a.topic > b.topic ? 1 : -1;\n }\n\n errors.sort(sortAll);\n warnings.sort(sortAll);\n return { errors, warnings };\n },\n );\n}\n\n/**\n * Basic validation for global config options\n */\nasync function validateGlobalConfig(\n key: string,\n val: unknown,\n type: string,\n warnings: ValidationMessage[],\n errors: ValidationMessage[],\n currentPath: string | undefined,\n config: AllConfig,\n): Promise<void> {\n /* v8 ignore next -- not testable yet */\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: ConfigValidationTopic.Deprecation,\n message: getDeprecationMessage(key)!,\n });\n }\n\n if (key === 'binarySource' && val === 'docker') {\n warnings.push({\n topic: ConfigValidationTopic.Deprecation,\n message:\n 'Usage of `binarySource=docker` is deprecated, and will be removed in the future. Please migrate to `binarySource=install`. Feedback on the usage of `binarySource=docker` is welcome at https://github.com/renovatebot/renovate/discussions/40742',\n });\n }\n\n if (val !== null) {\n // v8 ignore else -- TODO: add test #40625\n if (type === 'string') {\n if (isString(val)) {\n if (optionSupportsTemplating.has(key)) {\n try {\n template.validate(val);\n } catch {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid template in config path: ${currentPath}`,\n });\n }\n }\n\n if (\n key === 'onboardingConfigFileName' &&\n !getPossibleConfigFileNames({\n configFileNames: config.configFileNames,\n platform: config.platform,\n }).includes(val)\n ) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${getPossibleConfigFileNames(\n {\n configFileNames: config.configFileNames,\n platform: config.platform,\n },\n ).join(', ')}.`,\n });\n }\n\n if (\n key === 'reportType' &&\n ['s3', 'file'].includes(val) &&\n !isString(config.reportPath)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `reportType '${val}' requires a configured reportPath`,\n });\n }\n } else {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a string.`,\n });\n }\n } else if (type === 'integer') {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n warnings.push(...validateNumber(key, val, allowsNegative, currentPath));\n } else if (type === 'boolean') {\n if (val !== true && val !== false) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a boolean. Found: ${JSON.stringify(\n val,\n )} (${typeof val}).`,\n });\n }\n } else if (type === 'array') {\n if (isArray(val) && key !== 'repositories') {\n validateStringArray(key, val, currentPath, errors);\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n 'global',\n subval,\n false,\n `${currentPath}[${subIndex}]`,\n );\n warnings.push(...subValidation.warnings);\n errors.push(...subValidation.errors);\n }\n }\n\n if (isRegexOrGlobOption(key)) {\n warnings.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath: currentPath!,\n }),\n );\n }\n } else if (isArray(val)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isPlainObject(subval)) {\n if (!isNonEmptyString(subval.repository)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}[${subIndex}]: each repository object entry must have a \\`repository\\` string property`,\n });\n }\n const { repository: _, ...repoEntryConfig } = subval;\n // Each repository object entry is validated as its own global config, so it does not automatically see the top-level `allowedEnv`/`allowedHeaders`.\n // Inherit them (unless the entry sets its own) so that entry-level `env`/`headers` are validated against the allowlists, rather than an empty one.\n const subValidation = await validateConfig(\n 'global',\n {\n ...(config.allowedEnv ? { allowedEnv: config.allowedEnv } : {}),\n ...(config.allowedHeaders\n ? { allowedHeaders: config.allowedHeaders }\n : {}),\n ...repoEntryConfig,\n },\n false,\n `${currentPath}[${subIndex}]`,\n );\n warnings.push(...subValidation.warnings);\n errors.push(...subValidation.errors);\n } else if (isString(subval)) {\n if (!isNonEmptyStringAndNotWhitespace(subval)) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}[${subIndex}]: each repository string entry entry must be a non-empty string`,\n });\n }\n } else {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}[${subIndex}]: invalid type, should be either a string or an object`,\n });\n }\n }\n } else {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a list (Array).`,\n });\n }\n } else if (type === 'object') {\n if (isPlainObject(val)) {\n if (key === 'onboardingConfig') {\n const subValidation = await validateConfig('repo', val);\n for (const warning of subValidation.warnings.concat(\n subValidation.errors,\n )) {\n warnings.push(warning);\n }\n } else if (key === 'force') {\n // `force` is validated as a global config of its own, so it does not automatically see the top-level `allowedEnv`/`allowedHeaders`.\n // Inherit them (unless `force` sets its own) so that the self-hosted admin's own `force.env`/`force.hostRules[].headers` are validated against the allowlists they set, rather than an empty one.\n const subValidation = await validateConfig('global', {\n ...(config.allowedEnv ? { allowedEnv: config.allowedEnv } : {}),\n ...(config.allowedHeaders\n ? { allowedHeaders: config.allowedHeaders }\n : {}),\n ...val,\n });\n for (const warning of subValidation.warnings.concat(\n subValidation.errors,\n )) {\n warnings.push(warning);\n }\n } else if (key === 'cacheTtlOverride') {\n for (const [subKey, subValue] of Object.entries(val)) {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n warnings.push(\n ...validateNumber(\n key,\n subValue,\n allowsNegative,\n currentPath,\n subKey,\n ),\n );\n\n if (\n !(packageCacheNamespaces as readonly string[]).includes(subKey) &&\n !anyMatchRegexOrGlobList(\n packageCacheNamespaces as unknown as string[],\n [subKey],\n )\n ) {\n errors.push({\n message: `${currentPath}: namespace \\`${subKey}\\` does not exist`,\n topic: ConfigValidationTopic.Error,\n });\n }\n }\n } else {\n const res = validatePlainObject(val);\n if (res !== true) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${res}\\` configuration: value must be a string.`,\n });\n }\n }\n } else {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a JSON object.`,\n });\n }\n }\n }\n\n validateAllowedValues(key, val, currentPath, errors);\n}\n\nfunction getPossibleConfigFileNames({\n configFileNames,\n platform,\n}: {\n configFileNames?: string[];\n platform?: PlatformId;\n}): string[] {\n const filenames = getConfigFileNames(platform);\n if (isNonEmptyArray(configFileNames)) {\n return filenames.concat(configFileNames);\n }\n\n return filenames;\n}\n\nfunction validateStringArray(\n key: string,\n val: unknown[],\n currentPath: string | undefined,\n errors: ValidationMessage[],\n): void {\n const option = optionsByName.get(key);\n if (\n option?.type === 'array' &&\n option.subType === 'string' &&\n // these report the invalid entries with a more specific message\n !['extends', 'commitTrailers'].includes(key) &&\n !val.every(isString)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a list of strings`,\n });\n }\n}\n\nfunction describeAllowedValues(option: RenovateOptions): string {\n const allowedValues = coerceArray(option.allowedValues);\n // for options with a lot of values (i.e. `enabledManagers`), listing them all makes for an unreadable message\n if (allowedValues.length > 10) {\n const page = option.globalOnly\n ? 'self-hosted-configuration'\n : 'configuration-options';\n return `allowedValues, which are listed at ${GlobalConfig.get('productLinks').documentation}${page}/#${option.name.toLowerCase()}`;\n }\n return `allowedValues: ${JSON.stringify(allowedValues)}`;\n}\n\nfunction validateAllowedValues(\n key: string,\n val: unknown,\n currentPath: string | undefined,\n errors: ValidationMessage[],\n): void {\n const option = optionsByName.get(key);\n if (!option) {\n return;\n }\n\n const allowedValues = option.allowedValues;\n if (allowedValues?.length) {\n if (val === null && option.default === null) {\n // do nothing\n } else if (isArray(val, isString)) {\n const invalidOptions = val.filter((v) => !allowedValues.includes(v));\n if (invalidOptions.length) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid ${currentPath}: ${option.name} had invalid values \\`${JSON.stringify(invalidOptions)}\\` which are not part of the ${describeAllowedValues(option)}`,\n });\n }\n } else if (isString(val)) {\n if (key === 'versioning') {\n if (!allowedValues.includes(val) && !val.startsWith('regex:')) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid ${currentPath}: ${option.name} had invalid value \\`${JSON.stringify(val)}\\`. ${option.name} can only be a known versioning scheme, or be a string starting with \\`regex:\\` for custom regular expression versioning`,\n });\n }\n } else if (\n !allowedValues.includes(val) &&\n // a templated value can't be checked until it's been rendered\n !(option.supportsTemplating && val.includes('{{'))\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid ${currentPath}: ${option.name} had a value \\`${JSON.stringify(val)}\\` which was not part of the ${describeAllowedValues(option)}`,\n });\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation.js","names":["managerList","regexOrGlobValidator.check","matchBaseBranchesValidator.check"],"sources":["../../lib/config/validation.ts"],"sourcesContent":["import is, {\n isArray,\n isBoolean,\n isEmptyString,\n isNonEmptyArray,\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isObject,\n isPlainObject,\n isString,\n isUndefined,\n} from '@sindresorhus/is';\nimport type { PlatformId } from '../constants/index.ts';\nimport { instrument } from '../instrumentation/index.ts';\nimport { logger } from '../logger/index.ts';\nimport { AllManagersListLiteral } from '../manager-list.generated.ts';\nimport { isCustomManager } from '../modules/manager/custom/index.ts';\nimport type { CustomManager } from '../modules/manager/custom/types.ts';\nimport type { HostRule } from '../types/index.ts';\nimport { coerceArray } from '../util/array.ts';\nimport { packageCacheNamespaces } from '../util/cache/package/namespaces.ts';\nimport { clone } from '../util/clone.ts';\nimport { getToolConfig } from '../util/exec/containerbase.ts';\nimport { isConstraintName, isToolName } from '../util/exec/types.ts';\nimport { isValidCommitTrailer } from '../util/git/commit-trailers.ts';\nimport { getExpression } from '../util/jsonata.ts';\nimport { regEx } from '../util/regex.ts';\nimport {\n anyMatchRegexOrGlobList,\n getRegexOrGlobPredicate,\n getRegexPredicate,\n isRegexMatch,\n matchRegexOrGlobList,\n} from '../util/string-match.ts';\nimport * as template from '../util/template/index.ts';\nimport { parseUrl } from '../util/url.ts';\nimport {\n AllVersioningsListLiteral,\n type VersioningName,\n} from '../versioning-list.generated.ts';\nimport {\n hasValidSchedule,\n hasValidTimezone,\n} from '../workers/repository/update/branch/schedule.ts';\nimport { getConfigFileNames } from './app-strings.ts';\nimport { GlobalConfig } from './global.ts';\nimport { migrateConfig } from './migration.ts';\nimport { getOptions } from './options/index.ts';\nimport {\n describeAllowedLocations,\n getAllowedParents,\n} from './options/scopes.ts';\nimport { resolveConfigPresets } from './presets/index.ts';\nimport { isRelativePresetReference, parsePreset } from './presets/parse.ts';\nimport type {\n AllConfig,\n AllowedParents,\n RenovateConfig,\n RenovateOptions,\n StatusCheckKey,\n StatusCheckWhen,\n ValidationMessage,\n ValidationResult,\n} from './types.ts';\nimport {\n allowedStatusCheckStrings,\n allowedStatusCheckWhenValues,\n} from './types.ts';\nimport * as matchBaseBranchesValidator from './validation-helpers/match-base-branches.ts';\nimport * as regexOrGlobValidator from './validation-helpers/regex-glob-matchers.ts';\nimport { ConfigValidationTopic } from './validation-helpers/types.ts';\nimport {\n getParentName,\n isFalseGlobal,\n validateJSONataManagerFields,\n validateNumber,\n validatePlainObject,\n validateRegexManagerFields,\n} from './validation-helpers/utils.ts';\n\nconst options = getOptions();\n\nlet optionsInitialized = false;\nlet optionTypes: Record<string, RenovateOptions['type']>;\nlet optionParents: Record<string, AllowedParents[]>;\nlet optionLocations: Record<string, string>;\nlet optionGlobals: Set<string>;\nlet optionInherits: Set<string>;\nlet optionRegexOrGlob: Set<string>;\nlet optionAllowsNegativeIntegers: Set<string>;\nlet optionSupportsTemplating: Set<string>;\nlet optionsByName: Map<string, RenovateOptions>;\n\nconst managerList: readonly string[] = AllManagersListLiteral;\n\nconst topLevelObjects = [...managerList, 'env'];\n\nconst ignoredNodes = [\n '$schema',\n 'headers',\n 'depType',\n 'npmToken',\n 'packageFile',\n 'forkToken',\n 'repository',\n 'vulnerabilityAlertsOnly',\n 'vulnerabilityAlert',\n 'isVulnerabilityAlert',\n 'vulnerabilityFixVersion', // not intended to be used by end users but may be by Mend apps\n 'copyLocalLibs', // deprecated - functionality is now enabled by default\n 'prBody', // deprecated\n 'minimumConfidence', // undocumented feature flag\n];\nconst tzRe = regEx(/^:timezone\\((?<timezone>.+)\\)$/);\nconst rulesRe = regEx(/p.*Rules\\[\\d+\\]$/);\nconst repoEntryRe = regEx(/^repositories\\[\\d+\\]$/);\n\nfunction isIgnored(key: string): boolean {\n return ignoredNodes.includes(key);\n}\n\nfunction getDeprecationMessage(option: string): string | undefined {\n const deprecatedOptions: Record<string, string | undefined> = {\n branchName: `Direct editing of branchName is now deprecated. Please edit branchPrefix, additionalBranchPrefix, or branchTopic instead`,\n commitMessage: `Direct editing of commitMessage is now deprecated. Please edit commitMessage's subcomponents instead.`,\n prTitle: `Direct editing of prTitle is now deprecated. Please edit commitMessage subcomponents instead as they will be passed through to prTitle.`,\n };\n if (deprecatedOptions[option]) {\n return deprecatedOptions[option];\n }\n\n const found = options.find((o) => o.name === option);\n if (!found) {\n return undefined;\n }\n\n if (!found.deprecationMsg) {\n return undefined;\n }\n\n return `The '${option}' option is deprecated: ${found.deprecationMsg}`;\n}\n\nfunction isInhertConfigOption(key: string): boolean {\n return optionInherits.has(key);\n}\n\nfunction isRegexOrGlobOption(key: string): boolean {\n return optionRegexOrGlob.has(key);\n}\n\nfunction isGlobalOption(key: string): boolean {\n return optionGlobals.has(key);\n}\n\nfunction initOptions(): void {\n if (optionsInitialized) {\n return;\n }\n\n optionParents = {};\n optionLocations = {};\n optionInherits = new Set();\n optionTypes = {};\n optionRegexOrGlob = new Set();\n optionGlobals = new Set();\n optionAllowsNegativeIntegers = new Set();\n optionSupportsTemplating = new Set();\n optionsByName = new Map();\n\n for (const option of options) {\n optionTypes[option.name] = option.type;\n\n optionsByName.set(option.name, option);\n\n const parents = getAllowedParents(option);\n if (parents) {\n optionParents[option.name] = parents;\n // TODO: types (#22198)\n optionLocations[option.name] = describeAllowedLocations(option)!;\n }\n\n if (option.inheritConfigSupport) {\n optionInherits.add(option.name);\n }\n\n if (option.patternMatch) {\n optionRegexOrGlob.add(option.name);\n }\n\n if (option.globalOnly) {\n optionGlobals.add(option.name);\n }\n\n if (option.allowNegative) {\n optionAllowsNegativeIntegers.add(option.name);\n }\n\n if (option.supportsTemplating) {\n optionSupportsTemplating.add(option.name);\n }\n }\n\n optionsInitialized = true;\n}\n\n/**\n * Removes every relative preset reference from a deep copy of the given\n * `packageRules` entry, at any nesting depth.\n *\n * Relative references are only resolvable while the preset which contains them\n * is fetched, so they must not be passed to `resolveConfigPresets()` during\n * validation. They are still syntax checked by the `extends` validation.\n */\nfunction stripRelativePresets(packageRule: RenovateConfig): {\n rule: RenovateConfig;\n hasRelativePresets: boolean;\n} {\n const rule = clone(packageRule);\n const hasRelativePresets = stripRelativePresetsFromValue(rule);\n return { rule, hasRelativePresets };\n}\n\nfunction stripRelativePresetsFromValue(value: unknown): boolean {\n if (isArray(value)) {\n let stripped = false;\n for (const element of value) {\n stripped = stripRelativePresetsFromValue(element) || stripped;\n }\n return stripped;\n }\n\n if (!isPlainObject(value)) {\n return false;\n }\n\n let stripped = false;\n for (const [key, val] of Object.entries(value)) {\n if (key === 'extends' && isArray(val)) {\n const remaining = val.filter(\n (preset) => !(isString(preset) && isRelativePresetReference(preset)),\n );\n if (remaining.length !== val.length) {\n value[key] = remaining;\n stripped = true;\n }\n continue;\n }\n\n stripped = stripRelativePresetsFromValue(val) || stripped;\n }\n return stripped;\n}\n\ntype ConfigType = 'global' | 'inherit' | 'repo';\n\n/**\n * Whether a `hostRules` `allowInternal` is honored from this kind of config.\n *\n * Only the self-hosted administrator's own configuration may grant access to internal hosts. The inherited config repository belongs to the organization rather than to them, so its rules only count where the administrator has opted into trusting them with `inheritConfigTrusted`.\n */\nfunction mayGrantInternalHostAccess(configType: ConfigType): boolean {\n if (configType === 'global') {\n return true;\n }\n if (configType === 'inherit') {\n return GlobalConfig.get('inheritConfigTrusted');\n }\n return false;\n}\n\nfunction allowInternalNotAllowedMessage(configType: ConfigType): string {\n if (configType === 'inherit') {\n return 'hostRules `allowInternal` is not allowed in inherited config, as this Renovate instance has not set `inheritConfigTrusted=true`. The administrator can either set it, or move the rule to their global config or a `repositories[]` entry.';\n }\n return `hostRules \\`allowInternal\\` is only allowed in the self-hosted administrator's own configuration.`;\n}\n\nexport async function validateConfig(\n configType: ConfigType,\n config: AllConfig,\n isPreset?: boolean,\n parentPath?: string,\n // the name of the option that `config` is a value of, for when it can't be derived from `parentPath` (i.e. the name of a `customDatasources` entry is the user's choice)\n parentOptionName?: string,\n): Promise<ValidationResult> {\n return instrument(\n `validateConfig(${configType}, ${JSON.stringify(parentPath)})`,\n async () => {\n initOptions();\n\n let errors: ValidationMessage[] = [];\n let warnings: ValidationMessage[] = [];\n\n for (const [key, val] of Object.entries(config)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n /* v8 ignore next -- TODO: add test */\n if (key === '__proto__') {\n errors.push({\n topic: ConfigValidationTopic.Security,\n message: '__proto__',\n });\n continue;\n }\n if (\n parentPath &&\n parentPath !== 'onboardingConfig' &&\n !repoEntryRe.test(parentPath) &&\n topLevelObjects.includes(key)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `The \"${key}\" object can only be configured at the top level of a config but was found inside \"${parentPath}\"`,\n });\n }\n\n if (isGlobalOption(key)) {\n if (configType === 'global') {\n await validateGlobalConfig(\n key,\n val,\n optionTypes[key],\n warnings,\n errors,\n currentPath,\n config,\n );\n continue;\n } else if (\n !isFalseGlobal(key, parentPath) &&\n !(configType === 'inherit' && isInhertConfigOption(key))\n ) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `The \"${key}\" option is a global option reserved only for Renovate's global configuration and cannot be configured within a repository's config file.`,\n });\n continue;\n }\n }\n if (key === 'registryUrls' && !parentPath && isNonEmptyArray(val)) {\n warnings.push({\n topic: ConfigValidationTopic.Warning,\n message:\n 'Setting `registryUrls` at the top level of your config will apply it to all managers and datasources, which can cause the wrong registry URL to be used for some packages. Use `registryUrls` inside `packageRules` to target specific managers or packages.',\n });\n }\n if (\n key === 'defaultRegistryUrls' &&\n !parentPath &&\n isNonEmptyArray(val)\n ) {\n warnings.push({\n topic: ConfigValidationTopic.Warning,\n message:\n 'Setting `defaultRegistryUrls` at the top level of your config will apply it to all managers and datasources, which can cause the wrong registry URL to be used for some packages. Use `defaultRegistryUrls` inside `packageRules` to target specific managers or packages.',\n });\n }\n if (\n !isIgnored(key) && // We need to ignore some reserved keys\n !(is as any).function(val) // Ignore all functions\n ) {\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: ConfigValidationTopic.Deprecation,\n message: getDeprecationMessage(key)!,\n });\n }\n if (optionSupportsTemplating.has(key) && val) {\n try {\n // TODO: types (#22198)\n template.validate((val as string).toString());\n } catch {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid template in config path: ${currentPath}`,\n });\n }\n }\n const parentName =\n parentOptionName ??\n (parentPath &&\n (parentPath === 'onboardingConfig' || repoEntryRe.test(parentPath))\n ? '.'\n : getParentName(parentPath));\n if (\n !isPreset &&\n parentName &&\n optionParents[key] &&\n !optionParents[key].includes(parentName as AllowedParents) &&\n /* an object which may only be top-level is already reported above, with a message which says so more precisely */\n !topLevelObjects.includes(key)\n ) {\n const usedIn =\n parentName === '.'\n ? 'at the top level of a config'\n : `in \"${parentName}\"`;\n const message = `\"${key}\" can't be used ${usedIn}, as it can only be used ${optionLocations[key]}.`;\n warnings.push({\n topic: `${parentPath ? `${parentPath}.` : ''}${key}`,\n message,\n });\n }\n\n // v8 ignore else -- intentionally unhandled - if we knew what was to be covered here, we'd add validation\n if (!optionTypes[key]) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid configuration option: ${currentPath}`,\n });\n } else if (key === 'schedule' && isArray(val, isString)) {\n const [validSchedule, errorMessage] = hasValidSchedule(val);\n if (!validSchedule) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid ${currentPath}: \\`${errorMessage}\\``,\n });\n }\n } else if (\n [\n 'allowedVersions',\n 'matchCurrentVersion',\n 'matchCurrentValue',\n 'matchNewValue',\n ].includes(key) &&\n isRegexMatch(val)\n ) {\n if (!getRegexPredicate(val)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid regExp for ${currentPath}: \\`${val}\\``,\n });\n }\n } else if (key === 'timezone' && val !== null) {\n const [validTimezone, errorMessage] = hasValidTimezone(\n val as string,\n );\n if (!validTimezone) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n } else if (val !== null) {\n const type = optionTypes[key];\n if (type === 'boolean') {\n if (val !== true && val !== false) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be boolean. Found: ${JSON.stringify(\n val,\n )} (${typeof val})`,\n });\n }\n } else if (type === 'integer') {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n errors.push(\n ...validateNumber(key, val, allowsNegative, currentPath),\n );\n } else if (type === 'array' && val) {\n if (isArray(val)) {\n validateStringArray(key, val, currentPath, errors);\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n configType,\n subval,\n isPreset,\n `${currentPath}[${subIndex}]`,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n }\n if (isRegexOrGlobOption(key)) {\n errors.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath,\n }),\n );\n }\n if (key === 'extends') {\n for (const subval of val) {\n if (isString(subval)) {\n if (\n configType !== 'global' &&\n subval.startsWith('global:')\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: you cannot extend from \"global:\" presets in a repository config's \"extends\"`,\n });\n }\n\n if (\n parentName === 'packageRules' &&\n subval.startsWith('group:')\n ) {\n warnings.push({\n topic: ConfigValidationTopic.Warning,\n message: `${currentPath}: you should not extend \"group:\" presets`,\n });\n }\n if (tzRe.test(subval)) {\n const [, timezone] = tzRe.exec(subval)!;\n const [validTimezone, errorMessage] =\n hasValidTimezone(timezone);\n if (!validTimezone) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n }\n if (!subval.includes('{{')) {\n try {\n parsePreset(subval);\n } catch {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: preset \"${subval}\" is not valid`,\n });\n }\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: preset value is not a string`,\n });\n }\n }\n }\n\n if (key === 'commitTrailers') {\n for (const subval of val) {\n if (!isValidCommitTrailer(subval)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid commit trailer: \\`${JSON.stringify(\n subval,\n )}\\`. Must be a single-line string in the form \\`Key: value\\`, where the key contains only letters, digits and \\`-\\`.`,\n });\n }\n }\n }\n\n const selectors = [\n 'matchFileNames',\n 'matchLanguages',\n 'matchCategories',\n 'matchBaseBranches',\n 'matchManagers',\n 'matchDatasources',\n 'matchDepTypes',\n 'matchDepNames',\n 'matchPackageNames',\n 'matchCurrentValue',\n 'matchCurrentVersion',\n 'matchSourceUrls',\n 'matchRegistryUrls',\n 'matchUpdateTypes',\n 'matchIsBreaking',\n 'matchConfidence',\n 'matchCurrentAge',\n 'matchRepositories',\n 'matchNewValue',\n 'matchJsonata',\n ];\n if (key === 'packageRules') {\n for (const [subIndex, packageRule] of val.entries()) {\n if (isObject(packageRule)) {\n const { rule, hasRelativePresets } =\n stripRelativePresets(packageRule);\n const { config: resolved } = await resolveConfigPresets(\n rule,\n config,\n );\n const resolvedRule = migrateConfig({\n packageRules: [resolved],\n }).migratedConfig.packageRules![0];\n warnings.push(\n ...matchBaseBranchesValidator.check({\n resolvedRule,\n currentPath: `${currentPath}[${subIndex}]`,\n baseBranchPatterns: config.baseBranchPatterns!,\n }),\n );\n const selectorLength = Object.keys(resolvedRule).filter(\n (ruleKey) => selectors.includes(ruleKey),\n ).length;\n if (!selectorLength) {\n if (hasRelativePresets) {\n // the stripped relative preset may still provide the\n // missing selectors, so this cannot be an error\n const message = `${currentPath}[${subIndex}]: this rule extends a relative preset that cannot be resolved during validation, so its selectors could not be checked. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message,\n });\n } else {\n const message = `${currentPath}[${subIndex}]: Each packageRule must contain at least one match* or exclude* selector. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: ConfigValidationTopic.Error,\n message,\n });\n }\n }\n if (\n // the stripped relative preset legitimately provides\n // the non-selector field\n !hasRelativePresets &&\n selectorLength === Object.keys(resolvedRule).length\n ) {\n const message = `${currentPath}[${subIndex}]: Each packageRule must contain at least one non-match* or non-exclude* field. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message,\n });\n }\n // It's too late to apply any of these options once you already have updates determined\n const preLookupOptions = [\n 'allowedVersions',\n 'extractVersion',\n 'followTag',\n 'ignoreDeps',\n 'ignoreUnstable',\n 'rangeStrategy',\n 'registryUrls',\n 'respectLatest',\n 'rollbackPrs',\n 'separateMajorMinor',\n 'separateMinorPatch',\n 'separateMultipleMajor',\n 'separateMultipleMinor',\n 'versioning',\n ] as const;\n // These selectors are only known after the lookup\n const postLookupSelectors: string[] = [];\n if (isNonEmptyArray(resolvedRule.matchUpdateTypes)) {\n postLookupSelectors.push('matchUpdateTypes');\n }\n if (isBoolean(resolvedRule.matchIsBreaking)) {\n postLookupSelectors.push('matchIsBreaking');\n }\n for (const selector of postLookupSelectors) {\n for (const option of preLookupOptions) {\n if (resolvedRule[option] !== undefined) {\n const message = `${currentPath}[${subIndex}]: packageRules cannot combine both ${selector} and ${option}. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: ConfigValidationTopic.Error,\n message,\n });\n }\n }\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath} must contain JSON objects`,\n });\n }\n }\n }\n if (key === 'customManagers') {\n const allowedKeys = [\n 'customType',\n 'description',\n 'fileFormat',\n 'managerFilePatterns',\n 'matchStrings',\n 'matchStringsStrategy',\n 'depNameTemplate',\n 'packageNameTemplate',\n 'datasourceTemplate',\n 'versioningTemplate',\n 'registryUrlTemplate',\n 'currentValueTemplate',\n 'extractVersionTemplate',\n 'autoReplaceStringTemplate',\n 'depTypeTemplate',\n ];\n for (const customManager of val as CustomManager[]) {\n if (\n Object.keys(customManager).some(\n (k) => !allowedKeys.includes(k),\n )\n ) {\n const disallowedKeys = Object.keys(customManager).filter(\n (k) => !allowedKeys.includes(k),\n );\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Custom Manager contains disallowed fields: ${disallowedKeys.join(\n ', ',\n )}`,\n });\n } else if (\n isNonEmptyString(customManager.customType) &&\n isCustomManager(customManager.customType)\n ) {\n if (isNonEmptyArray(customManager.managerFilePatterns)) {\n switch (customManager.customType) {\n case 'regex':\n validateRegexManagerFields(\n customManager,\n currentPath,\n errors,\n );\n break;\n case 'jsonata':\n validateJSONataManagerFields(\n customManager,\n currentPath,\n errors,\n );\n break;\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Each Custom Manager must contain a non-empty managerFilePatterns array`,\n });\n }\n } else if (\n isEmptyString(customManager.customType) ||\n isUndefined(customManager.customType)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Each Custom Manager must contain a non-empty customType string`,\n });\n }\n }\n }\n if (['matchPackageNames', 'matchDepNames'].includes(key)) {\n const startPattern = regEx(/!?\\//);\n const endPattern = regEx(/\\/g?i?$/);\n for (const pattern of val as string[]) {\n if (\n startPattern.test(pattern) &&\n endPattern.test(pattern)\n ) {\n try {\n // regEx isn't aware of our !/ prefix but can handle the suffix\n regEx(pattern.replace(startPattern, '/'));\n } catch {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid regExp for ${currentPath}: \\`${pattern}\\``,\n });\n }\n }\n }\n }\n if (key === 'baseBranchPatterns') {\n for (const baseBranchPattern of val as string[]) {\n if (\n isRegexMatch(baseBranchPattern) &&\n !getRegexPredicate(baseBranchPattern)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid regExp for ${currentPath}: \\`${baseBranchPattern}\\``,\n });\n }\n }\n }\n if (\n (selectors.includes(key) ||\n key === 'matchCurrentVersion' ||\n key === 'matchCurrentValue') &&\n // TODO: can be undefined ? #22198\n !rulesRe.test(parentPath!) && // Inside a packageRule\n (isString(parentPath) || !isPreset) // top level in a preset\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}: ${key} should be inside a \\`packageRule\\` only`,\n });\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a list (Array)`,\n });\n }\n } else if (type === 'string') {\n if (!isString(val)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a string`,\n });\n }\n } else if (type === 'object') {\n if (isPlainObject(val)) {\n if (key === 'registryAliases') {\n const res = validatePlainObject(val);\n if (res !== true) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${key}.${res}\\` configuration: value is not a string`,\n });\n }\n } else if (key === 'env') {\n const allowedEnvVars =\n configType === 'global'\n ? coerceArray(config.allowedEnv)\n : GlobalConfig.get('allowedEnv');\n for (const [envVarName, envVarValue] of Object.entries(val)) {\n if (!isString(envVarValue)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid env variable value: \\`${currentPath}.${envVarName}\\` must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(envVarName, allowedEnvVars)) {\n errors.push({\n // `Security` is always a fatal error that blocks the rest of the Renovate run.\n //\n // As `env` is only applied when it's at the top-level (where `parentPath === undefined`), we should only report a security error there.\n //\n // If it's found to be set to a disallowed value - even if it's not going to be used - we should report as an error, which may block the run, but much less worryingly than Security.\n topic: parentPath\n ? ConfigValidationTopic.Error\n : ConfigValidationTopic.Security,\n message: `Env variable name \\`${envVarName}\\` is not allowed by this Renovate instance's \\`allowedEnv\\`.`,\n });\n }\n }\n } else if (key === 'statusCheckNames') {\n for (const [\n statusCheckKey,\n statusCheckValue,\n ] of Object.entries(val)) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${key}.${statusCheckKey}\\` configuration: key is not allowed.`,\n });\n }\n if (!(\n isString(statusCheckValue) || null === statusCheckValue\n )) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: status check is not a string.`,\n });\n continue;\n }\n }\n } else if (key === 'statusCheckWhen') {\n for (const [\n statusCheckKey,\n statusCheckValue,\n ] of Object.entries(val)) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${key}.${statusCheckKey}\\` configuration: key is not allowed.`,\n });\n }\n if (\n !isString(statusCheckValue) ||\n !allowedStatusCheckWhenValues.includes(\n statusCheckValue as StatusCheckWhen,\n )\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: value must be one of \"always\", \"never\", or \"failed\".`,\n });\n continue;\n }\n }\n } else if (key === 'customDatasources') {\n for (const [\n customDatasourceName,\n customDatasourceValue,\n ] of Object.entries(val)) {\n if (!isPlainObject(customDatasourceValue)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${customDatasourceName}\\` configuration: customDatasource is not an object`,\n });\n continue;\n }\n const subValidation = await validateConfig(\n configType,\n customDatasourceValue,\n isPreset,\n `${currentPath}.${customDatasourceName}`,\n key,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n } else if (key === 'installTools') {\n for (const toolName of Object.keys(val)) {\n if (!isToolName(toolName)) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${toolName}\\` configuration: not a valid tool name.`,\n });\n }\n }\n } else if (key === 'constraints') {\n const { get: getVersioning } =\n await import('../modules/versioning/index.ts');\n for (const [k, v] of Object.entries(val)) {\n if (!isString(v)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\` should be an object of key-value pairs of constraints and their value`,\n });\n break;\n }\n\n if (!isConstraintName(k)) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\`: \\`${k}\\` is not a supported constraint name`,\n });\n } else if (isToolName(k)) {\n // TODO: #31831\n const versioningId = getToolConfig(k)?.versioning;\n const versioning = getVersioning(versioningId);\n if (!versioning.isValid(v)) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}=${v}\\` is not a valid tool version constraint, according to \\`${versioningId}\\` versioning`,\n });\n }\n }\n }\n } else if (key === 'constraintsVersioning') {\n for (const [k, v] of Object.entries(val)) {\n if (!isString(v)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\` should be an object of key-value pairs of additional constraint names and their versioning`,\n });\n break;\n }\n\n if (isToolName(k)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\` is not a valid additional constraint name, as \\`${k}\\` is a tool name, and \\`constraintsVersioning\\` can only override the versioning for a non-tool constraint`,\n });\n } else if (isConstraintName(k)) {\n const versioningName = v.split(':')[0];\n if (\n !AllVersioningsListLiteral.includes(\n versioningName as VersioningName,\n )\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}=${v}\\`: \\`${v}\\` is not a valid versioning scheme`,\n });\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}.${k}\\`: \\`${k}\\` is not a known additional constraint name`,\n });\n }\n }\n } else {\n const ignoredObjects = options\n .filter((option) => option.freeChoice)\n .map((option) => option.name);\n if (!ignoredObjects.includes(key)) {\n const subValidation = await validateConfig(\n configType,\n val,\n isPreset,\n currentPath,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n }\n } else {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a json object`,\n });\n }\n } else {\n // v8 ignore next -- intentionally unhandled - if we knew what was to be covered here, we'd add validation\n logger.debug(\n {},\n `Unhandled validation for ${type} at \\`${currentPath}\\``,\n );\n }\n }\n }\n\n if (key === 'hostRules' && isArray(val)) {\n const allowedHeaders =\n configType === 'global'\n ? coerceArray(config.allowedHeaders)\n : GlobalConfig.get('allowedHeaders');\n for (const rule of val as HostRule[]) {\n if (isNonEmptyString(rule.matchHost)) {\n if (\n rule.matchHost.includes('://') &&\n parseUrl(rule.matchHost) === null\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `hostRules matchHost \\`${rule.matchHost}\\` is not a valid URL.`,\n });\n }\n } else if (isEmptyString(rule.matchHost)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message:\n 'Invalid value for hostRules matchHost. It cannot be an empty string.',\n });\n }\n\n if (\n !isUndefined(rule.allowInternal) &&\n !mayGrantInternalHostAccess(configType)\n ) {\n errors.push({\n // like disallowed `headers` below, `Security` only where the rules are actually applied - see the comment there\n topic: parentPath\n ? ConfigValidationTopic.Error\n : ConfigValidationTopic.Security,\n message: allowInternalNotAllowedMessage(configType),\n });\n }\n\n if (!rule.headers) {\n continue;\n }\n if (!isPlainObject(rule.headers)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid hostRules headers configuration: headers must be an object.`,\n });\n continue;\n }\n for (const [header, value] of Object.entries(rule.headers)) {\n if (!isString(value)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid hostRules headers value configuration: header must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(header, allowedHeaders)) {\n errors.push({\n // `Security` is always a fatal error that blocks the rest of the Renovate run.\n //\n // As `hostRules[]` is only applied when it's at the top-level (where `parentPath === undefined`), we should only report a security error there.\n //\n // If it's found to be set to a disallowed value - even if it's not going to be used - we should report as an error, which may block the run, but much less worryingly than Security.\n topic: parentPath\n ? ConfigValidationTopic.Error\n : ConfigValidationTopic.Security,\n message: `hostRules header \\`${header}\\` is not allowed by this Renovate instance's \\`allowedHeaders\\`.`,\n });\n }\n }\n }\n }\n\n if (key === 'matchJsonata' && isArray(val, isString)) {\n for (const expression of val) {\n const res = getExpression(expression);\n if (res instanceof Error) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid JSONata expression for ${currentPath}: ${res.message}`,\n });\n }\n }\n }\n\n validateAllowedValues(key, val, currentPath, errors);\n }\n\n function sortAll(a: ValidationMessage, b: ValidationMessage): number {\n if (a.topic === b.topic) {\n return a.message > b.message ? 1 : -1;\n }\n return a.topic > b.topic ? 1 : -1;\n }\n\n errors.sort(sortAll);\n warnings.sort(sortAll);\n return { errors, warnings };\n },\n );\n}\n\n/**\n * Basic validation for global config options\n */\nasync function validateGlobalConfig(\n key: string,\n val: unknown,\n type: string,\n warnings: ValidationMessage[],\n errors: ValidationMessage[],\n currentPath: string | undefined,\n config: AllConfig,\n): Promise<void> {\n /* v8 ignore next -- not testable yet */\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: ConfigValidationTopic.Deprecation,\n message: getDeprecationMessage(key)!,\n });\n }\n\n if (key === 'binarySource' && val === 'docker') {\n warnings.push({\n topic: ConfigValidationTopic.Deprecation,\n message:\n 'Usage of `binarySource=docker` is deprecated, and will be removed in the future. Please migrate to `binarySource=install`. Feedback on the usage of `binarySource=docker` is welcome at https://github.com/renovatebot/renovate/discussions/40742',\n });\n }\n\n if (val !== null) {\n // v8 ignore else -- TODO: add test #40625\n if (type === 'string') {\n if (isString(val)) {\n if (optionSupportsTemplating.has(key)) {\n try {\n template.validate(val);\n } catch {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid template in config path: ${currentPath}`,\n });\n }\n }\n\n if (\n key === 'onboardingConfigFileName' &&\n !getPossibleConfigFileNames({\n configFileNames: config.configFileNames,\n platform: config.platform,\n }).includes(val)\n ) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${getPossibleConfigFileNames(\n {\n configFileNames: config.configFileNames,\n platform: config.platform,\n },\n ).join(', ')}.`,\n });\n }\n\n if (\n key === 'reportType' &&\n ['s3', 'file'].includes(val) &&\n !isString(config.reportPath)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `reportType '${val}' requires a configured reportPath`,\n });\n }\n } else {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a string.`,\n });\n }\n } else if (type === 'integer') {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n warnings.push(...validateNumber(key, val, allowsNegative, currentPath));\n } else if (type === 'boolean') {\n if (val !== true && val !== false) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a boolean. Found: ${JSON.stringify(\n val,\n )} (${typeof val}).`,\n });\n }\n } else if (type === 'array') {\n if (isArray(val) && key !== 'repositories') {\n validateStringArray(key, val, currentPath, errors);\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n 'global',\n subval,\n false,\n `${currentPath}[${subIndex}]`,\n );\n warnings.push(...subValidation.warnings);\n errors.push(...subValidation.errors);\n }\n }\n\n if (isRegexOrGlobOption(key)) {\n warnings.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath: currentPath!,\n }),\n );\n }\n } else if (isArray(val)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isPlainObject(subval)) {\n if (!isNonEmptyString(subval.repository)) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}[${subIndex}]: each repository object entry must have a \\`repository\\` string property`,\n });\n }\n const { repository: _, ...repoEntryConfig } = subval;\n // Each repository object entry is validated as its own global config, so it does not automatically see the top-level `allowedEnv`/`allowedHeaders`.\n // Inherit them (unless the entry sets its own) so that entry-level `env`/`headers` are validated against the allowlists, rather than an empty one.\n const subValidation = await validateConfig(\n 'global',\n {\n ...(config.allowedEnv ? { allowedEnv: config.allowedEnv } : {}),\n ...(config.allowedHeaders\n ? { allowedHeaders: config.allowedHeaders }\n : {}),\n ...repoEntryConfig,\n },\n false,\n `${currentPath}[${subIndex}]`,\n );\n warnings.push(...subValidation.warnings);\n errors.push(...subValidation.errors);\n } else if (isString(subval)) {\n if (!isNonEmptyStringAndNotWhitespace(subval)) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}[${subIndex}]: each repository string entry entry must be a non-empty string`,\n });\n }\n } else {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `${currentPath}[${subIndex}]: invalid type, should be either a string or an object`,\n });\n }\n }\n } else {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a list (Array).`,\n });\n }\n } else if (type === 'object') {\n if (isPlainObject(val)) {\n if (key === 'onboardingConfig') {\n const subValidation = await validateConfig('repo', val);\n for (const warning of subValidation.warnings.concat(\n subValidation.errors,\n )) {\n warnings.push(warning);\n }\n } else if (key === 'force') {\n // `force` is validated as a global config of its own, so it does not automatically see the top-level `allowedEnv`/`allowedHeaders`.\n // Inherit them (unless `force` sets its own) so that the self-hosted admin's own `force.env`/`force.hostRules[].headers` are validated against the allowlists they set, rather than an empty one.\n const subValidation = await validateConfig('global', {\n ...(config.allowedEnv ? { allowedEnv: config.allowedEnv } : {}),\n ...(config.allowedHeaders\n ? { allowedHeaders: config.allowedHeaders }\n : {}),\n ...val,\n });\n for (const warning of subValidation.warnings.concat(\n subValidation.errors,\n )) {\n warnings.push(warning);\n }\n } else if (key === 'cacheTtlOverride') {\n for (const [subKey, subValue] of Object.entries(val)) {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n warnings.push(\n ...validateNumber(\n key,\n subValue,\n allowsNegative,\n currentPath,\n subKey,\n ),\n );\n\n if (\n !(packageCacheNamespaces as readonly string[]).includes(subKey) &&\n !anyMatchRegexOrGlobList(\n packageCacheNamespaces as unknown as string[],\n [subKey],\n )\n ) {\n errors.push({\n message: `${currentPath}: namespace \\`${subKey}\\` does not exist`,\n topic: ConfigValidationTopic.Error,\n });\n }\n }\n } else {\n const res = validatePlainObject(val);\n if (res !== true) {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid \\`${currentPath}.${res}\\` configuration: value must be a string.`,\n });\n }\n }\n } else {\n warnings.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a JSON object.`,\n });\n }\n }\n }\n\n validateAllowedValues(key, val, currentPath, errors);\n}\n\nfunction getPossibleConfigFileNames({\n configFileNames,\n platform,\n}: {\n configFileNames?: string[];\n platform?: PlatformId;\n}): string[] {\n const filenames = getConfigFileNames(platform);\n if (isNonEmptyArray(configFileNames)) {\n return filenames.concat(configFileNames);\n }\n\n return filenames;\n}\n\nfunction validateStringArray(\n key: string,\n val: unknown[],\n currentPath: string | undefined,\n errors: ValidationMessage[],\n): void {\n const option = optionsByName.get(key);\n if (\n option?.type === 'array' &&\n option.subType === 'string' &&\n // these report the invalid entries with a more specific message\n !['extends', 'commitTrailers'].includes(key) &&\n !val.every(isString)\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Configuration option \\`${currentPath}\\` should be a list of strings`,\n });\n }\n}\n\nfunction describeAllowedValues(option: RenovateOptions): string {\n const allowedValues = coerceArray(option.allowedValues);\n // for options with a lot of values (i.e. `enabledManagers`), listing them all makes for an unreadable message\n if (allowedValues.length > 10) {\n const page = option.globalOnly\n ? 'self-hosted-configuration'\n : 'configuration-options';\n return `allowedValues, which are listed at ${GlobalConfig.get('productLinks').documentation}${page}/#${option.name.toLowerCase()}`;\n }\n return `allowedValues: ${JSON.stringify(allowedValues)}`;\n}\n\nfunction isAllowedValue(\n option: RenovateOptions,\n allowedValues: readonly string[],\n val: string,\n): boolean {\n if (allowedValues.includes(val)) {\n return true;\n }\n if (!option.patternMatch) {\n return false;\n }\n // pattern matching options also accept negation, globs and regexes, which are valid if they can match any of the allowed values\n const predicate = getRegexOrGlobPredicate(\n val.startsWith('!') ? val.slice(1) : val,\n );\n return allowedValues.some((allowed) => predicate(allowed));\n}\n\nfunction validateAllowedValues(\n key: string,\n val: unknown,\n currentPath: string | undefined,\n errors: ValidationMessage[],\n): void {\n const option = optionsByName.get(key);\n if (!option) {\n return;\n }\n\n const allowedValues = option.allowedValues;\n if (allowedValues?.length) {\n if (val === null && option.default === null) {\n // do nothing\n } else if (isArray(val, isString)) {\n const invalidOptions = val.filter(\n (v) => !isAllowedValue(option, allowedValues, v),\n );\n if (invalidOptions.length) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid ${currentPath}: ${option.name} had invalid values \\`${JSON.stringify(invalidOptions)}\\` which are not part of the ${describeAllowedValues(option)}`,\n });\n }\n } else if (isString(val)) {\n if (key === 'versioning') {\n if (!allowedValues.includes(val) && !val.startsWith('regex:')) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid ${currentPath}: ${option.name} had invalid value \\`${JSON.stringify(val)}\\`. ${option.name} can only be a known versioning scheme, or be a string starting with \\`regex:\\` for custom regular expression versioning`,\n });\n }\n } else if (\n !isAllowedValue(option, allowedValues, val) &&\n // a templated value can't be checked until it's been rendered\n !(option.supportsTemplating && val.includes('{{'))\n ) {\n errors.push({\n topic: ConfigValidationTopic.Error,\n message: `Invalid ${currentPath}: ${option.name} had a value \\`${JSON.stringify(val)}\\` which was not part of the ${describeAllowedValues(option)}`,\n });\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -43,7 +43,7 @@ hashMap.set("fleet", "ffa222820f72c4eb4cdc4c229ae8c50433bee96f3b974f0633d5a7d1f6
|
|
|
43
43
|
hashMap.set("flux", "0e9d00a108f6e828ad207ee0213d56ecd64475df9bd87c23b0c2b2f80e00a392");
|
|
44
44
|
hashMap.set("fvm", "9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90");
|
|
45
45
|
hashMap.set("git-submodules", "f4e2c6ddf2fa93241665c5176faafb358eecfcb701e7478790c4d58853ed827a");
|
|
46
|
-
hashMap.set("github-actions", "
|
|
46
|
+
hashMap.set("github-actions", "ccf6ed287d00ca7886b2e08807b5be4cd75ac0f74ffd1fc932aee7619a42eed3");
|
|
47
47
|
hashMap.set("gitlabci", "a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672");
|
|
48
48
|
hashMap.set("gitlabci-include", "8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351");
|
|
49
49
|
hashMap.set("glasskube", "93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','8e11293c8f61b4cbae77a3b1634a47213031c59df2c9833d89db65bf4e6edc64');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','66c207983960b1a1f49b972f77efe3bfd3097e19b0ee4034ccf9ac6c0d13e05b');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','04a13dec4e08ba21004961c718072fde976226d65809fa3c838bf66ba93e5d5a');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4d4f1d9a6519ba552b316b396db13ff0654a2663d8ed976188899a2d57d306a2');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','77a06471b8aec434457bcbde14a7473bc1c20a5fbe203ecc188bcc7a4fec1718');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','d354b54fee207cabab9fcff67fea1ca3292c7f37a4ef9537c7bb4cab41a35610');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','3976117beb9adeade088187965929d42f21f5da12c4614fd22aa92cad1083b19');\nhashMap.set('conan','8d46e9a30ae628e26118aea10a98d1b846f7c5d96d51ce24693437d555f6d125');\nhashMap.set('copier','a0678cc1eec36301328780966eec215c6e18748ea80c98873c8e13291a684cfa');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','41e6a8b7b8bae08f07b3e4b69c8c095db5da984bb23c004cd1ebf755a6317794');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','b5faeb8f31d238e0d05a4aeebf9a837273687908ab8078b34e738bb0e369c80c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','ffa222820f72c4eb4cdc4c229ae8c50433bee96f3b974f0633d5a7d1f6427c97');\nhashMap.set('flux','0e9d00a108f6e828ad207ee0213d56ecd64475df9bd87c23b0c2b2f80e00a392');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','f4e2c6ddf2fa93241665c5176faafb358eecfcb701e7478790c4d58853ed827a');\nhashMap.set('github-actions','2ef680275a8370f5c3761513e50c135718234459a657c94bc3d5369aef9daada');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','b70bcb736679e5660cf4d075a663629d0ddab4e854ce78d6336844138f2cbc82');\nhashMap.set('gradle','14ffeecba62452d47d3796e68753da745de2614b6e5ecc346da4f0067ed4bc6e');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','22f61344565f87ca3512c0ba8fac32627fde8ee919b7badae07b2116e285f049');\nhashMap.set('helm-values','0aa79bb0257d0d72e54dfd2653e59bfef63b97e46c035b7443593bdf6e6382aa');\nhashMap.set('helmfile','ab63e5bc2bb381939a6b75911947e3fc79d31827423ded07f61ea1c98d95a542');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','927798e082caf46a0da703389ba07e9e61fa73ef571ab551301b8fc6b06957d1');\nhashMap.set('hermit','abf066a64be5e5112e4da68896cf14583691e817d8bf2fc5ec65aebcc0fde53b');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','d3f24fa8a647979d7e4ce5ba963e4c53a36a5992a2d4e3b331a9a512f213e181');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','59c691024c34cb4be4d9b4f811019ae9b22410df0da54977cdcecea261fbbbf5');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','9cbd96a29fe96e3df7418e422256380202f07970cf7f00b08388c181224a2b85');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','4b606e97e80101b866e2f9fe05546b09faafa8e7793549b35a438d76649aefbb');\nhashMap.set('nuget','fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('pep621','02ba97d9d2bbd696417ea0ea26c0ed27f4e8cf296f1afdbb27ec07bcc3bd987c');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','a98dc76a002e1dc21662237f009ff8fea36236bb4e24cb82ee30c6a78f57271f');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','9b8ac4f9432f2789f60847c80582966d5ed4f735d2f678c82416d0eb9548b4fa');\nhashMap.set('pixi','e31c397982ffa34222b061f23f3b3683f42523dd5dca45ecce2448b0ebc55ea2');\nhashMap.set('poetry','2c74e8e94c484c8bfc93ba1272078d531a52e4faaa978fc90ddb654064bb85bc');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','40927b98dd2bac45dba60e66b5fd0e6b84b61d02db8be536fda7b14546a4feb7');\nhashMap.set('renovate-config','dfaf3f03ddaf70c332f7916106648f36dbfa6a36dd76d15dd27fa116ab3c174c');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','cdf063debdbf36888523ff8cec6d2d1b0ec6f49b37b2fbcd80b0d4f6a31114e1');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','6788a8569ba9c50c763ffa2bed952a4314ae8e696c29f93d3eb7c4a12d99ce20');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','300f8fb3c09667654412d2f5dd8ab4882e0f5d1d7a8bc39794993d2e7e58d1b7');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','30774cd456c443be2cd236fd5b8cd1cb821f1437c6309842e34960832df3557f');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','8e11293c8f61b4cbae77a3b1634a47213031c59df2c9833d89db65bf4e6edc64');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','66c207983960b1a1f49b972f77efe3bfd3097e19b0ee4034ccf9ac6c0d13e05b');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','04a13dec4e08ba21004961c718072fde976226d65809fa3c838bf66ba93e5d5a');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4d4f1d9a6519ba552b316b396db13ff0654a2663d8ed976188899a2d57d306a2');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','77a06471b8aec434457bcbde14a7473bc1c20a5fbe203ecc188bcc7a4fec1718');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','d354b54fee207cabab9fcff67fea1ca3292c7f37a4ef9537c7bb4cab41a35610');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','3976117beb9adeade088187965929d42f21f5da12c4614fd22aa92cad1083b19');\nhashMap.set('conan','8d46e9a30ae628e26118aea10a98d1b846f7c5d96d51ce24693437d555f6d125');\nhashMap.set('copier','a0678cc1eec36301328780966eec215c6e18748ea80c98873c8e13291a684cfa');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','41e6a8b7b8bae08f07b3e4b69c8c095db5da984bb23c004cd1ebf755a6317794');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','b5faeb8f31d238e0d05a4aeebf9a837273687908ab8078b34e738bb0e369c80c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','ffa222820f72c4eb4cdc4c229ae8c50433bee96f3b974f0633d5a7d1f6427c97');\nhashMap.set('flux','0e9d00a108f6e828ad207ee0213d56ecd64475df9bd87c23b0c2b2f80e00a392');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','f4e2c6ddf2fa93241665c5176faafb358eecfcb701e7478790c4d58853ed827a');\nhashMap.set('github-actions','ccf6ed287d00ca7886b2e08807b5be4cd75ac0f74ffd1fc932aee7619a42eed3');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','b70bcb736679e5660cf4d075a663629d0ddab4e854ce78d6336844138f2cbc82');\nhashMap.set('gradle','14ffeecba62452d47d3796e68753da745de2614b6e5ecc346da4f0067ed4bc6e');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','22f61344565f87ca3512c0ba8fac32627fde8ee919b7badae07b2116e285f049');\nhashMap.set('helm-values','0aa79bb0257d0d72e54dfd2653e59bfef63b97e46c035b7443593bdf6e6382aa');\nhashMap.set('helmfile','ab63e5bc2bb381939a6b75911947e3fc79d31827423ded07f61ea1c98d95a542');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','927798e082caf46a0da703389ba07e9e61fa73ef571ab551301b8fc6b06957d1');\nhashMap.set('hermit','abf066a64be5e5112e4da68896cf14583691e817d8bf2fc5ec65aebcc0fde53b');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','d3f24fa8a647979d7e4ce5ba963e4c53a36a5992a2d4e3b331a9a512f213e181');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','59c691024c34cb4be4d9b4f811019ae9b22410df0da54977cdcecea261fbbbf5');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','9cbd96a29fe96e3df7418e422256380202f07970cf7f00b08388c181224a2b85');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','4b606e97e80101b866e2f9fe05546b09faafa8e7793549b35a438d76649aefbb');\nhashMap.set('nuget','fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('pep621','02ba97d9d2bbd696417ea0ea26c0ed27f4e8cf296f1afdbb27ec07bcc3bd987c');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','a98dc76a002e1dc21662237f009ff8fea36236bb4e24cb82ee30c6a78f57271f');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','9b8ac4f9432f2789f60847c80582966d5ed4f735d2f678c82416d0eb9548b4fa');\nhashMap.set('pixi','e31c397982ffa34222b061f23f3b3683f42523dd5dca45ecce2448b0ebc55ea2');\nhashMap.set('poetry','2c74e8e94c484c8bfc93ba1272078d531a52e4faaa978fc90ddb654064bb85bc');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','40927b98dd2bac45dba60e66b5fd0e6b84b61d02db8be536fda7b14546a4feb7');\nhashMap.set('renovate-config','dfaf3f03ddaf70c332f7916106648f36dbfa6a36dd76d15dd27fa116ab3c174c');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','cdf063debdbf36888523ff8cec6d2d1b0ec6f49b37b2fbcd80b0d4f6a31114e1');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','6788a8569ba9c50c763ffa2bed952a4314ae8e696c29f93d3eb7c4a12d99ce20');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','300f8fb3c09667654412d2f5dd8ab4882e0f5d1d7a8bc39794993d2e7e58d1b7');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','30774cd456c443be2cd236fd5b8cd1cb821f1437c6309842e34960832df3557f');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":";AAAA,MAAa,0BAAU,IAAI,IAAoB;AAE/C,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,mBAAkB,kEAAkE;AAChG,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,gBAAe,kEAAkE;AAC7F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,uBAAsB,kEAAkE;AACpG,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,eAAc,kEAAkE;AAC5F,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,gBAAe,kEAAkE;AAC7F,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,oBAAmB,kEAAkE;AACjG,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,iBAAgB,kEAAkE;AAC9F,QAAQ,IAAI,qBAAoB,kEAAkE;AAClG,QAAQ,IAAI,eAAc,kEAAkE;AAC5F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,0BAAyB,kEAAkE;AACvG,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,mBAAkB,kEAAkE;AAChG,QAAQ,IAAI,iBAAgB,kEAAkE;AAC9F,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,iBAAgB,kEAAkE;AAC9F,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,eAAc,kEAAkE;AAC5F,QAAQ,IAAI,oBAAmB,kEAAkE;AACjG,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,QAAO,kEAAkE;AACrF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,mBAAkB,kEAAkE;AAChG,QAAQ,IAAI,gBAAe,kEAAkE;AAC7F,QAAQ,IAAI,mBAAkB,kEAAkE;AAChG,QAAQ,IAAI,kBAAiB,kEAAkE;AAC/F,QAAQ,IAAI,OAAM,kEAAkE;AACpF,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,aAAY,kEAAkE;AAC1F,QAAQ,IAAI,qBAAoB,kEAAkE;AAClG,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,sBAAqB,kEAAkE;AACnG,QAAQ,IAAI,iBAAgB,kEAAkE;AAC9F,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,SAAQ,kEAAkE;AACtF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,UAAS,kEAAkE;AACvF,QAAQ,IAAI,cAAa,kEAAkE;AAC3F,QAAQ,IAAI,YAAW,kEAAkE;AACzF,QAAQ,IAAI,WAAU,kEAAkE;AACxF,QAAQ,IAAI,SAAQ,kEAAkE"}
|
|
@@ -119,7 +119,7 @@ async function updateActionsLockfile(config, packageFiles) {
|
|
|
119
119
|
}],
|
|
120
120
|
docker: {}
|
|
121
121
|
};
|
|
122
|
-
const commands = ["gh actions-lock --no-interactive --no-narrow --no-migrate-local-actions"];
|
|
122
|
+
const commands = ["gh actions-lock --no-interactive --relock --no-narrow --no-migrate-local-actions"];
|
|
123
123
|
if (GlobalConfig.get("binarySource") === "global") logger.once.debug({ constraint: ghActionsLockConstraint }, "Not installing the `gh-actions-lock` extension, and ignoring `constraints.ghActionsLock`, because `binarySource=global` leaves tooling to the administrator");
|
|
124
124
|
else if (ghActionsLockConstraint) commands.unshift(`gh extension install ${extensionName} --force --pin ${quote(ghActionsLockConstraint)}`);
|
|
125
125
|
else commands.unshift(`gh extension install ${extensionName} --force`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":["hostRules.find"],"sources":["../../../../lib/modules/manager/github-actions/artifacts.ts"],"sourcesContent":["import { quote } from 'shlex';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { findGithubToken } from '../../../util/check-token.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions, ExtraEnv } from '../../../util/exec/types.ts';\nimport { readLocalFile, writeLocalFile } from '../../../util/fs/index.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { FileChange } from '../../../util/git/types.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type { PackageFile, PostUpdateConfig } from '../types.ts';\nimport {\n artifactErrorMessageFromExecError,\n resolveToolConstraint,\n} from '../util.ts';\nimport { actionsLockFile, isLockfileManaged } from './common.ts';\nimport { ActionsLockfile } from './schema.ts';\nimport type { ActionsLockfileResult, OnboardedWorkflows } from './types.ts';\n\n/** The `gh` CLI extension that generates and verifies the lockfile. */\nconst extensionName = 'github/gh-actions-lock';\n\n/** The `uses:` dep types the lockfile graph is built from. */\nconst lockedDepTypes = ['action', 'workflow', 'docker'];\n\nfunction findToken(url: string): string | undefined {\n return findGithubToken(hostRules.find({ hostType: 'github', url }));\n}\n\n/**\n * `gh` takes the token from a different variable for GitHub Enterprise Server, and has to be told which host to talk to.\n *\n * Public actions are still resolved against github.com from there, so pass a token for both hosts.\n */\nfunction getTokenEnv(): ExtraEnv {\n const githubComEndpoint = 'https://api.github.com/';\n const configuredEndpoint = GlobalConfig.get('endpoint');\n // The configured endpoint only says where GitHub lives when Renovate is talking to GitHub: workflows mirrored onto another platform still resolve their actions against github.com.\n const endpoint =\n configuredEndpoint && detectPlatform(configuredEndpoint) === 'github'\n ? configuredEndpoint\n : githubComEndpoint;\n\n const hostname = parseUrl(endpoint)?.hostname;\n const isEnterprise =\n !!hostname && hostname !== 'api.github.com' && hostname !== 'github.com';\n\n const env: ExtraEnv = {};\n\n if (isEnterprise) {\n const enterpriseToken = findToken(endpoint);\n if (enterpriseToken) {\n env.GH_HOST = hostname;\n env.GH_ENTERPRISE_TOKEN = enterpriseToken;\n }\n }\n\n const token = findToken(githubComEndpoint);\n if (token) {\n env.GH_TOKEN = token;\n }\n\n if (!Object.keys(env).length) {\n logger.debug('No GitHub token found for `gh actions-lock`');\n }\n\n return env;\n}\n\n/**\n * Whether any updated dependency is one the lockfile records an edge for, and sits in a file `gh actions-lock` will look at.\n */\nfunction hasLockedUpdate(\n config: PostUpdateConfig,\n onboardedWorkflows: OnboardedWorkflows,\n): boolean {\n return config.upgrades.some((upgrade) => {\n if (upgrade.manager !== 'github-actions') {\n return false;\n }\n\n if (!upgrade.depType || !lockedDepTypes.includes(upgrade.depType)) {\n return false;\n }\n\n const packageFile = upgrade.packageFile;\n if (!packageFile) {\n return false;\n }\n\n return isLockfileManaged(packageFile, onboardedWorkflows);\n });\n}\n\n/**\n * Regenerate `.github/workflows/actions.lock` once per branch.\n *\n * The lockfile records a transitive graph - resolved commits, numeric owner and repository IDs, and each composite action's own `uses:` edges - so it is regenerated by its own tool rather than patched here.\n * `gh actions-lock` re-reads every workflow from disk and rewrites the whole file, so this runs after all of the branch's package file updates have been flushed, in the same shape as npm's `getAdditionalFiles`.\n */\nexport async function updateActionsLockfile(\n config: PostUpdateConfig,\n packageFiles: Record<string, PackageFile[]> | undefined,\n): Promise<ActionsLockfileResult> {\n const empty: ActionsLockfileResult = {\n updatedArtifacts: [],\n artifactErrors: [],\n };\n\n const ghaPackageFiles = packageFiles?.['github-actions'];\n if (!ghaPackageFiles?.length) {\n return empty;\n }\n\n if (config.skipArtifactsUpdate) {\n logger.debug(`Skipping ${actionsLockFile} generation`);\n return empty;\n }\n\n const existingLockFileContent = await readLocalFile(actionsLockFile, 'utf8');\n if (!existingLockFileContent) {\n logger.debug(`No ${actionsLockFile} found`);\n return empty;\n }\n\n const parsedLockfile = ActionsLockfile.safeParse(existingLockFileContent);\n if (!parsedLockfile.success) {\n logger.warn(\n { err: parsedLockfile.error, lockFile: actionsLockFile },\n 'Failed to parse the GitHub Actions lockfile, so not regenerating it',\n );\n return empty;\n }\n\n if (!hasLockedUpdate(config, parsedLockfile.data.workflows)) {\n logger.debug(`No locked dependencies updated for ${actionsLockFile}`);\n return empty;\n }\n\n logger.debug(`Regenerating ${actionsLockFile}`);\n\n const ghaPackageFilePaths = new Set(\n ghaPackageFiles.map((file) => file.packageFile),\n );\n\n // Ensure that in-memory file contents are flushed to disk, so `actions-lock` can run against it.\n // A branch can group updates from other managers, whose contents may be binary - a Gradle wrapper JAR, say - so only write the workflows which the tool actually reads.\n const writtenContent = new Map<string, string>();\n for (const file of coerceArray(config.updatedPackageFiles)) {\n if (file.type === 'addition' && ghaPackageFilePaths.has(file.path)) {\n const contents = file.contents!.toString();\n await writeLocalFile(file.path, contents);\n writtenContent.set(file.path, contents);\n }\n }\n\n const tokenEnv = getTokenEnv();\n\n const ghConstraint = await resolveToolConstraint(config, 'gh');\n const ghActionsLockConstraint = await resolveToolConstraint(\n config,\n 'ghActionsLock',\n );\n\n const execOptions: ExecOptions = {\n // The tool rescans every workflow, so it runs from the repository root\n cwd: GlobalConfig.get('localDir'),\n // `extraEnv` is what forwards a variable into the Docker sidecar, but on its own it is only a default: `getChildEnv` lets a same-named variable in Renovate's own environment win.\n // The token we resolved from the host rules must not be shadowed by an ambient `GH_TOKEN`, so force it as well.\n extraEnv: tokenEnv,\n env: tokenEnv,\n toolConstraints: [{ toolName: 'gh', constraint: ghConstraint }],\n docker: {},\n };\n\n // `--no-interactive`: we have no terminal to answer prompts with\n // `--no-narrow`: keep the ref that we wrote, to avoid a `@v4` being rewritten as `@v4.2.1`\n // `--no-migrate-local-actions`: on-by-default, but unrelated to our lockfile updates\n const commands = [\n 'gh actions-lock --no-interactive --no-narrow --no-migrate-local-actions',\n ];\n\n // `binarySource=global` means the administrator provisions tooling, so we must not reach into their `gh` install to add or re-pin an extension.\n // They own the extension version, and `constraints.ghActionsLock` does not apply.\n // TODO replace once containerbase/base#7279 is available\n if (GlobalConfig.get('binarySource') === 'global') {\n // Debug rather than warn: `constraints.ghActionsLock` ships with a default, so we cannot tell an explicit override from the default here, and warning would fire for every repository on this `binarySource`.\n logger.once.debug(\n { constraint: ghActionsLockConstraint },\n 'Not installing the `gh-actions-lock` extension, and ignoring `constraints.ghActionsLock`, because `binarySource=global` leaves tooling to the administrator',\n );\n } else {\n // `--force` makes an install a no-op when the specified version is already installed\n if (ghActionsLockConstraint) {\n commands.unshift(\n `gh extension install ${extensionName} --force --pin ${quote(ghActionsLockConstraint)}`,\n );\n } else {\n commands.unshift(`gh extension install ${extensionName} --force`);\n }\n }\n\n try {\n await exec(commands, execOptions);\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, `Error updating ${actionsLockFile}`);\n return {\n updatedArtifacts: [],\n artifactErrors: [\n {\n fileName: actionsLockFile,\n // an `ExecError` always carries a `stderr`, so fall back to the message rather than rendering an artifact error with nothing in it\n stderr: artifactErrorMessageFromExecError(err, err.message),\n },\n ],\n };\n }\n\n const updatedArtifacts: FileChange[] = [];\n\n const newLockFileContent = await readLocalFile(actionsLockFile, 'utf8');\n if (newLockFileContent && newLockFileContent !== existingLockFileContent) {\n updatedArtifacts.push({\n type: 'addition',\n path: actionsLockFile,\n contents: newLockFileContent,\n });\n }\n\n // `actions-lock` may annotate workflows being managed with i.e. `# This workflow is managed by gh actions-lock.`, even if there were no updates to that workflow in this branch.\n // We should diff against Git, rather than against the branch's own updated package files, otherwise those annotations are left behind as uncommitted changes\n const status = await getRepoStatus();\n for (const path of status.modified) {\n // ignore the lockfile, as we've already committed it above, and any file which another manager owns\n if (path === actionsLockFile || !ghaPackageFilePaths.has(path)) {\n continue;\n }\n\n const newContent = await readLocalFile(path, 'utf8');\n // Whatever this branch wrote is committed as a package file update already, so only content which the tool changed on top of it is an artifact\n if (!newContent || newContent === writtenContent.get(path)) {\n continue;\n }\n logger.debug(`\\`gh actions-lock\\` annotated ${path}`);\n updatedArtifacts.push({\n type: 'addition',\n path,\n contents: newContent,\n });\n }\n\n if (!updatedArtifacts.length) {\n logger.debug(`${actionsLockFile} is unchanged`);\n }\n\n return { updatedArtifacts, artifactErrors: [] };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":["hostRules.find"],"sources":["../../../../lib/modules/manager/github-actions/artifacts.ts"],"sourcesContent":["import { quote } from 'shlex';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { findGithubToken } from '../../../util/check-token.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions, ExtraEnv } from '../../../util/exec/types.ts';\nimport { readLocalFile, writeLocalFile } from '../../../util/fs/index.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { FileChange } from '../../../util/git/types.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type { PackageFile, PostUpdateConfig } from '../types.ts';\nimport {\n artifactErrorMessageFromExecError,\n resolveToolConstraint,\n} from '../util.ts';\nimport { actionsLockFile, isLockfileManaged } from './common.ts';\nimport { ActionsLockfile } from './schema.ts';\nimport type { ActionsLockfileResult, OnboardedWorkflows } from './types.ts';\n\n/** The `gh` CLI extension that generates and verifies the lockfile. */\nconst extensionName = 'github/gh-actions-lock';\n\n/** The `uses:` dep types the lockfile graph is built from. */\nconst lockedDepTypes = ['action', 'workflow', 'docker'];\n\nfunction findToken(url: string): string | undefined {\n return findGithubToken(hostRules.find({ hostType: 'github', url }));\n}\n\n/**\n * `gh` takes the token from a different variable for GitHub Enterprise Server, and has to be told which host to talk to.\n *\n * Public actions are still resolved against github.com from there, so pass a token for both hosts.\n */\nfunction getTokenEnv(): ExtraEnv {\n const githubComEndpoint = 'https://api.github.com/';\n const configuredEndpoint = GlobalConfig.get('endpoint');\n // The configured endpoint only says where GitHub lives when Renovate is talking to GitHub: workflows mirrored onto another platform still resolve their actions against github.com.\n const endpoint =\n configuredEndpoint && detectPlatform(configuredEndpoint) === 'github'\n ? configuredEndpoint\n : githubComEndpoint;\n\n const hostname = parseUrl(endpoint)?.hostname;\n const isEnterprise =\n !!hostname && hostname !== 'api.github.com' && hostname !== 'github.com';\n\n const env: ExtraEnv = {};\n\n if (isEnterprise) {\n const enterpriseToken = findToken(endpoint);\n if (enterpriseToken) {\n env.GH_HOST = hostname;\n env.GH_ENTERPRISE_TOKEN = enterpriseToken;\n }\n }\n\n const token = findToken(githubComEndpoint);\n if (token) {\n env.GH_TOKEN = token;\n }\n\n if (!Object.keys(env).length) {\n logger.debug('No GitHub token found for `gh actions-lock`');\n }\n\n return env;\n}\n\n/**\n * Whether any updated dependency is one the lockfile records an edge for, and sits in a file `gh actions-lock` will look at.\n */\nfunction hasLockedUpdate(\n config: PostUpdateConfig,\n onboardedWorkflows: OnboardedWorkflows,\n): boolean {\n return config.upgrades.some((upgrade) => {\n if (upgrade.manager !== 'github-actions') {\n return false;\n }\n\n if (!upgrade.depType || !lockedDepTypes.includes(upgrade.depType)) {\n return false;\n }\n\n const packageFile = upgrade.packageFile;\n if (!packageFile) {\n return false;\n }\n\n return isLockfileManaged(packageFile, onboardedWorkflows);\n });\n}\n\n/**\n * Regenerate `.github/workflows/actions.lock` once per branch.\n *\n * The lockfile records a transitive graph - resolved commits, numeric owner and repository IDs, and each composite action's own `uses:` edges - so it is regenerated by its own tool rather than patched here.\n * `gh actions-lock` re-reads every workflow from disk and rewrites the whole file, so this runs after all of the branch's package file updates have been flushed, in the same shape as npm's `getAdditionalFiles`.\n */\nexport async function updateActionsLockfile(\n config: PostUpdateConfig,\n packageFiles: Record<string, PackageFile[]> | undefined,\n): Promise<ActionsLockfileResult> {\n const empty: ActionsLockfileResult = {\n updatedArtifacts: [],\n artifactErrors: [],\n };\n\n const ghaPackageFiles = packageFiles?.['github-actions'];\n if (!ghaPackageFiles?.length) {\n return empty;\n }\n\n if (config.skipArtifactsUpdate) {\n logger.debug(`Skipping ${actionsLockFile} generation`);\n return empty;\n }\n\n const existingLockFileContent = await readLocalFile(actionsLockFile, 'utf8');\n if (!existingLockFileContent) {\n logger.debug(`No ${actionsLockFile} found`);\n return empty;\n }\n\n const parsedLockfile = ActionsLockfile.safeParse(existingLockFileContent);\n if (!parsedLockfile.success) {\n logger.warn(\n { err: parsedLockfile.error, lockFile: actionsLockFile },\n 'Failed to parse the GitHub Actions lockfile, so not regenerating it',\n );\n return empty;\n }\n\n if (!hasLockedUpdate(config, parsedLockfile.data.workflows)) {\n logger.debug(`No locked dependencies updated for ${actionsLockFile}`);\n return empty;\n }\n\n logger.debug(`Regenerating ${actionsLockFile}`);\n\n const ghaPackageFilePaths = new Set(\n ghaPackageFiles.map((file) => file.packageFile),\n );\n\n // Ensure that in-memory file contents are flushed to disk, so `actions-lock` can run against it.\n // A branch can group updates from other managers, whose contents may be binary - a Gradle wrapper JAR, say - so only write the workflows which the tool actually reads.\n const writtenContent = new Map<string, string>();\n for (const file of coerceArray(config.updatedPackageFiles)) {\n if (file.type === 'addition' && ghaPackageFilePaths.has(file.path)) {\n const contents = file.contents!.toString();\n await writeLocalFile(file.path, contents);\n writtenContent.set(file.path, contents);\n }\n }\n\n const tokenEnv = getTokenEnv();\n\n const ghConstraint = await resolveToolConstraint(config, 'gh');\n const ghActionsLockConstraint = await resolveToolConstraint(\n config,\n 'ghActionsLock',\n );\n\n const execOptions: ExecOptions = {\n // The tool rescans every workflow, so it runs from the repository root\n cwd: GlobalConfig.get('localDir'),\n // `extraEnv` is what forwards a variable into the Docker sidecar, but on its own it is only a default: `getChildEnv` lets a same-named variable in Renovate's own environment win.\n // The token we resolved from the host rules must not be shadowed by an ambient `GH_TOKEN`, so force it as well.\n extraEnv: tokenEnv,\n env: tokenEnv,\n toolConstraints: [{ toolName: 'gh', constraint: ghConstraint }],\n docker: {},\n };\n\n // `--no-interactive`: we have no terminal to answer prompts with\n // `--relock`: locked pins are sticky, so without it a changed ref fails with `Ref changed`\n // `--no-narrow`: keep the ref that we wrote, to avoid a `@v4` being rewritten as `@v4.2.1`\n // `--no-migrate-local-actions`: on-by-default, but unrelated to our lockfile updates\n const commands = [\n 'gh actions-lock --no-interactive --relock --no-narrow --no-migrate-local-actions',\n ];\n\n // `binarySource=global` means the administrator provisions tooling, so we must not reach into their `gh` install to add or re-pin an extension.\n // They own the extension version, and `constraints.ghActionsLock` does not apply.\n // TODO replace once containerbase/base#7279 is available\n if (GlobalConfig.get('binarySource') === 'global') {\n // Debug rather than warn: `constraints.ghActionsLock` ships with a default, so we cannot tell an explicit override from the default here, and warning would fire for every repository on this `binarySource`.\n logger.once.debug(\n { constraint: ghActionsLockConstraint },\n 'Not installing the `gh-actions-lock` extension, and ignoring `constraints.ghActionsLock`, because `binarySource=global` leaves tooling to the administrator',\n );\n } else {\n // `--force` makes an install a no-op when the specified version is already installed\n if (ghActionsLockConstraint) {\n commands.unshift(\n `gh extension install ${extensionName} --force --pin ${quote(ghActionsLockConstraint)}`,\n );\n } else {\n commands.unshift(`gh extension install ${extensionName} --force`);\n }\n }\n\n try {\n await exec(commands, execOptions);\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, `Error updating ${actionsLockFile}`);\n return {\n updatedArtifacts: [],\n artifactErrors: [\n {\n fileName: actionsLockFile,\n // an `ExecError` always carries a `stderr`, so fall back to the message rather than rendering an artifact error with nothing in it\n stderr: artifactErrorMessageFromExecError(err, err.message),\n },\n ],\n };\n }\n\n const updatedArtifacts: FileChange[] = [];\n\n const newLockFileContent = await readLocalFile(actionsLockFile, 'utf8');\n if (newLockFileContent && newLockFileContent !== existingLockFileContent) {\n updatedArtifacts.push({\n type: 'addition',\n path: actionsLockFile,\n contents: newLockFileContent,\n });\n }\n\n // `actions-lock` may annotate workflows being managed with i.e. `# This workflow is managed by gh actions-lock.`, even if there were no updates to that workflow in this branch.\n // We should diff against Git, rather than against the branch's own updated package files, otherwise those annotations are left behind as uncommitted changes\n const status = await getRepoStatus();\n for (const path of status.modified) {\n // ignore the lockfile, as we've already committed it above, and any file which another manager owns\n if (path === actionsLockFile || !ghaPackageFilePaths.has(path)) {\n continue;\n }\n\n const newContent = await readLocalFile(path, 'utf8');\n // Whatever this branch wrote is committed as a package file update already, so only content which the tool changed on top of it is an artifact\n if (!newContent || newContent === writtenContent.get(path)) {\n continue;\n }\n logger.debug(`\\`gh actions-lock\\` annotated ${path}`);\n updatedArtifacts.push({\n type: 'addition',\n path,\n contents: newContent,\n });\n }\n\n if (!updatedArtifacts.length) {\n logger.debug(`${actionsLockFile} is unchanged`);\n }\n\n return { updatedArtifacts, artifactErrors: [] };\n}\n"],"mappings":"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"}
|
|
@@ -99,7 +99,8 @@ async function readDashboardBody(config) {
|
|
|
99
99
|
dependencyDashboardAllRateLimited: false
|
|
100
100
|
};
|
|
101
101
|
const stringifiedConfig = JSON.stringify(config);
|
|
102
|
-
if (config.
|
|
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\"")) {
|
|
103
104
|
config.dependencyDashboardTitle = config.dependencyDashboardTitle ?? `Dependency Dashboard`;
|
|
104
105
|
const issue = await platform.findIssue(config.dependencyDashboardTitle);
|
|
105
106
|
if (issue) {
|
|
@@ -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 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 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(\n (branch) =>\n !!branch.dependencyDashboardApproval ||\n !!branch.dependencyDashboardPrApproval,\n )\n )) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n // istanbul ignore if\n if (config.repoIsOnboarded === false) {\n logger.debug('Repo is onboarding - skipping dependency dashboard');\n return;\n }\n logger.debug('Ensuring Dependency Dashboard');\n\n // Check packageFiles for any deprecations 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 if (name && (dep.deprecationMessage ?? hasAnyReplacement)) {\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 }\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 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 }\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 === 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 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(\n (branch) =>\n !!branch.dependencyDashboardApproval ||\n !!branch.dependencyDashboardPrApproval,\n )\n )) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { title: config.dependencyDashboardTitle },\n 'DRY-RUN: Would close Dependency Dashboard',\n );\n } else {\n logger.debug('Closing Dependency Dashboard');\n await platform.ensureIssueClosing(config.dependencyDashboardTitle!);\n }\n return;\n }\n // istanbul ignore if\n if (config.repoIsOnboarded === false) {\n logger.debug('Repo is onboarding - skipping dependency dashboard');\n return;\n }\n logger.debug('Ensuring Dependency Dashboard');\n\n // Check packageFiles for any deprecations 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 if (name && (dep.deprecationMessage ?? hasAnyReplacement)) {\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 }\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 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 }\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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"}
|
package/package.json
CHANGED
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.176.
|
|
3
|
+
"title": "JSON schema for Renovate 44.176.3 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.176.
|
|
5
|
+
"x-renovate-version": "44.176.3",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|