renovate 44.233.0 → 44.234.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/config/presets/index.js +3 -1
  2. package/dist/config/presets/index.js.map +1 -1
  3. package/dist/config/validation.js +2 -1
  4. package/dist/config/validation.js.map +1 -1
  5. package/dist/datasource-list.generated.d.ts +1 -1
  6. package/dist/datasource-list.generated.js +1 -0
  7. package/dist/datasource-list.generated.js.map +1 -1
  8. package/dist/modules/datasource/api.js +2 -0
  9. package/dist/modules/datasource/api.js.map +1 -1
  10. package/dist/modules/datasource/azure-pipelines-tasks/index.js +2 -1
  11. package/dist/modules/datasource/azure-pipelines-tasks/index.js.map +1 -1
  12. package/dist/modules/datasource/go/env.js +1 -1
  13. package/dist/modules/datasource/go/env.js.map +1 -1
  14. package/dist/modules/datasource/java-version/common.js +11 -2
  15. package/dist/modules/datasource/java-version/common.js.map +1 -1
  16. package/dist/modules/datasource/maven/index.js +2 -1
  17. package/dist/modules/datasource/maven/index.js.map +1 -1
  18. package/dist/modules/datasource/sbt-package/index.js +3 -1
  19. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  20. package/dist/modules/datasource/swift-package-registry/index.js +44 -0
  21. package/dist/modules/datasource/swift-package-registry/index.js.map +1 -0
  22. package/dist/modules/datasource/swift-package-registry/schema.js +14 -0
  23. package/dist/modules/datasource/swift-package-registry/schema.js.map +1 -0
  24. package/dist/modules/manager/bundler/extract.js +2 -2
  25. package/dist/modules/manager/bundler/extract.js.map +1 -1
  26. package/dist/modules/manager/cargo/artifacts.js +2 -1
  27. package/dist/modules/manager/cargo/artifacts.js.map +1 -1
  28. package/dist/modules/manager/deno/extract.js +3 -1
  29. package/dist/modules/manager/deno/extract.js.map +1 -1
  30. package/dist/modules/manager/fingerprint.generated.js +4 -4
  31. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  32. package/dist/modules/manager/git-submodules/extract.js +2 -1
  33. package/dist/modules/manager/git-submodules/extract.js.map +1 -1
  34. package/dist/modules/manager/github-actions/extract.js +3 -1
  35. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  36. package/dist/modules/manager/gradle/extract.js +2 -1
  37. package/dist/modules/manager/gradle/extract.js.map +1 -1
  38. package/dist/modules/manager/helmfile/extract.js +3 -1
  39. package/dist/modules/manager/helmfile/extract.js.map +1 -1
  40. package/dist/modules/manager/mise/extract.js.map +1 -1
  41. package/dist/modules/manager/mix/artifacts.js +2 -1
  42. package/dist/modules/manager/mix/artifacts.js.map +1 -1
  43. package/dist/modules/manager/npm/artifacts.js +3 -1
  44. package/dist/modules/manager/npm/artifacts.js.map +1 -1
  45. package/dist/modules/manager/npm/extract/index.js +8 -4
  46. package/dist/modules/manager/npm/extract/index.js.map +1 -1
  47. package/dist/modules/manager/npm/post-update/index.js +11 -9
  48. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  49. package/dist/modules/manager/npm/post-update/node-version.js +10 -2
  50. package/dist/modules/manager/npm/post-update/node-version.js.map +1 -1
  51. package/dist/modules/manager/npm/post-update/npm.js +9 -3
  52. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  53. package/dist/modules/manager/npm/post-update/pnpm.js +8 -2
  54. package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
  55. package/dist/modules/manager/npm/post-update/yarn.js +12 -3
  56. package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
  57. package/dist/modules/manager/swift/artifacts.js +7 -0
  58. package/dist/modules/manager/swift/artifacts.js.map +1 -1
  59. package/dist/modules/manager/swift/extract.js +68 -21
  60. package/dist/modules/manager/swift/extract.js.map +1 -1
  61. package/dist/modules/manager/swift/index.js +6 -3
  62. package/dist/modules/manager/swift/index.js.map +1 -1
  63. package/dist/modules/manager/swift/registries-json.js +50 -0
  64. package/dist/modules/manager/swift/registries-json.js.map +1 -0
  65. package/dist/modules/platform/azure/index.js +8 -2
  66. package/dist/modules/platform/azure/index.js.map +1 -1
  67. package/dist/modules/platform/bitbucket/index.js +3 -1
  68. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  69. package/dist/modules/platform/gerrit/index.js +3 -1
  70. package/dist/modules/platform/gerrit/index.js.map +1 -1
  71. package/dist/modules/platform/gitea/index.js +4 -2
  72. package/dist/modules/platform/gitea/index.js.map +1 -1
  73. package/dist/modules/platform/github/index.js +16 -13
  74. package/dist/modules/platform/github/index.js.map +1 -1
  75. package/dist/modules/platform/local/scm.js +2 -1
  76. package/dist/modules/platform/local/scm.js.map +1 -1
  77. package/dist/util/fs/index.js +3 -1
  78. package/dist/util/fs/index.js.map +1 -1
  79. package/dist/util/git/index.js +15 -11
  80. package/dist/util/git/index.js.map +1 -1
  81. package/dist/util/git/private-key.js +2 -2
  82. package/dist/util/git/private-key.js.map +1 -1
  83. package/dist/workers/repository/index.js +3 -1
  84. package/dist/workers/repository/index.js.map +1 -1
  85. package/dist/workers/repository/onboarding/branch/check.js +9 -5
  86. package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
  87. package/dist/workers/repository/process/limits.js +3 -1
  88. package/dist/workers/repository/process/limits.js.map +1 -1
  89. package/dist/workers/repository/process/lookup/digest.js +2 -2
  90. package/dist/workers/repository/process/lookup/digest.js.map +1 -1
  91. package/dist/workers/repository/process/write.js +3 -1
  92. package/dist/workers/repository/process/write.js.map +1 -1
  93. package/dist/workers/repository/update/branch/auto-replace.js +8 -6
  94. package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
  95. package/dist/workers/repository/update/branch/get-updated.js +2 -1
  96. package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
  97. package/dist/workers/repository/update/branch/index.js +12 -6
  98. package/dist/workers/repository/update/branch/index.js.map +1 -1
  99. package/dist/workers/repository/update/pr/automerge.js +12 -7
  100. package/dist/workers/repository/update/pr/automerge.js.map +1 -1
  101. package/dist/workers/repository/update/pr/changelog/release-notes.js +2 -2
  102. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  103. package/dist/workers/repository/update/pr/changelog/source.js +2 -1
  104. package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
  105. package/dist/workers/repository/update/pr/code-owners.js +15 -3
  106. package/dist/workers/repository/update/pr/code-owners.js.map +1 -1
  107. package/dist/workers/repository/update/pr/index.js +17 -8
  108. package/dist/workers/repository/update/pr/index.js.map +1 -1
  109. package/dist/workers/repository/update/pr/participants.js +2 -1
  110. package/dist/workers/repository/update/pr/participants.js.map +1 -1
  111. package/package.json +1 -1
  112. package/renovate-schema.json +5 -2
@@ -87,7 +87,9 @@ async function getPreset(preset, baseConfig) {
87
87
  });
88
88
  else {
89
89
  const cacheKey = buildCacheKey("preset", preset);
90
- const packageCache = GlobalConfig.get("presetCachePersistence") ? await import("../../util/cache/package/index.js") : void 0;
90
+ const presetCachePersistence = GlobalConfig.get("presetCachePersistence");
91
+ let packageCache;
92
+ if (presetCachePersistence) packageCache = await import("../../util/cache/package/index.js");
91
93
  if (packageCache) presetConfig = await packageCache.get(presetCacheNamespace, cacheKey);
92
94
  else presetConfig = get(cacheKey);
93
95
  if (isNullOrUndefined(presetConfig)) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["internal.getPreset","memCache.get","migration.migrateConfig","massage.massageConfig","template.compile","internal.isInternal"],"sources":["../../../lib/config/presets/index.ts"],"sourcesContent":["import {\n isArray,\n isNullOrUndefined,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport {\n CONFIG_VALIDATION,\n HOST_BLOCKED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport { buildCacheKey } from '../../util/cache/package/key.ts';\nimport { clone } from '../../util/clone.ts';\nimport { regEx } from '../../util/regex.ts';\nimport * as template from '../../util/template/index.ts';\nimport { GlobalConfig } from '../global.ts';\nimport * as massage from '../massage.ts';\nimport * as migration from '../migration.ts';\nimport type { AllConfig, RenovateConfig } from '../types.ts';\nimport { mergeChildConfig } from '../utils.ts';\nimport { removedPresets } from './common.ts';\nimport * as internal from './internal/index.ts';\nimport { parsePreset } from './parse.ts';\nimport { canonicalizeRelativePresets } from './relative.ts';\nimport type { Preset, PresetApi } from './types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_INVALID,\n PRESET_INVALID_JSON,\n PRESET_NOT_FOUND,\n PRESET_PROHIBITED_SUBPRESET,\n PRESET_RELATIVE_NO_PARENT,\n PRESET_RENOVATE_CONFIG_NOT_FOUND,\n} from './util.ts';\n\ninterface PresetSource {\n load: () => Promise<PresetApi>;\n\n /**\n * Whether presets from this source are hosted in a repository, which is what\n * allows them to reference other presets relatively.\n */\n repoHosted: boolean;\n}\n\nexport const presetSources: Record<string, PresetSource> = {\n forgejo: { load: () => import('./forgejo/index.ts'), repoHosted: true },\n gitea: { load: () => import('./gitea/index.ts'), repoHosted: true },\n github: { load: () => import('./github/index.ts'), repoHosted: true },\n gitlab: { load: () => import('./gitlab/index.ts'), repoHosted: true },\n http: { load: () => import('./http/index.ts'), repoHosted: false },\n local: { load: () => import('./local/index.ts'), repoHosted: true },\n npm: { load: () => import('./npm/index.ts'), repoHosted: false },\n};\n\nconst presetCacheNamespace = 'preset';\n\nexport function replaceArgs(\n obj: string,\n argMapping: Record<string, any>,\n): string;\nexport function replaceArgs(\n obj: string[],\n argMapping: Record<string, any>,\n): string[];\nexport function replaceArgs(\n obj: Record<string, any>,\n argMapping: Record<string, any>,\n): Record<string, any>;\nexport function replaceArgs(\n obj: Record<string, any>[],\n argMapping: Record<string, any>,\n): Record<string, any>[];\n\n/**\n * TODO: fix me #22198\n * @param obj\n * @param argMapping\n */\nexport function replaceArgs(obj: any, argMapping: Record<string, any>): any;\nexport function replaceArgs(\n obj: string | string[] | Record<string, any> | Record<string, any>[],\n argMapping: Record<string, any>,\n): any {\n if (isString(obj)) {\n let returnStr = obj;\n for (const [arg, argVal] of Object.entries(argMapping)) {\n const re = regEx(`{{${arg}}}`, 'g', false);\n returnStr = returnStr.replace(re, argVal);\n }\n return returnStr;\n }\n if (isArray(obj)) {\n const returnArray = [];\n for (const item of obj) {\n returnArray.push(replaceArgs(item, argMapping));\n }\n return returnArray;\n }\n if (isObject(obj)) {\n const returnObj: Record<string, any> = {};\n for (const [key, val] of Object.entries(obj)) {\n returnObj[key] = replaceArgs(val, argMapping);\n }\n return returnObj;\n }\n return obj;\n}\n\nexport async function getPreset(\n preset: string,\n baseConfig?: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.trace(`getPreset(${preset})`);\n // Check if the preset has been removed or replaced\n const newPreset = removedPresets[preset];\n if (newPreset) {\n return getPreset(newPreset, baseConfig);\n }\n if (newPreset === null) {\n return {};\n }\n const parsedPreset = parsePreset(preset);\n const { presetSource, repo, presetPath, presetName, tag, params, rawParams } =\n parsedPreset;\n\n if (presetSource === 'relative') {\n throw new Error(PRESET_RELATIVE_NO_PARENT);\n }\n\n let presetConfig: Preset | null | undefined;\n\n if (presetSource === 'internal') {\n presetConfig = internal.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n } else {\n const cacheKey = buildCacheKey('preset', preset);\n const presetCachePersistence = GlobalConfig.get('presetCachePersistence');\n\n const packageCache = presetCachePersistence\n ? await import('../../util/cache/package/index.ts')\n : undefined;\n\n if (packageCache) {\n presetConfig = await packageCache.get(presetCacheNamespace, cacheKey);\n } else {\n presetConfig = memCache.get(cacheKey);\n }\n\n if (isNullOrUndefined(presetConfig)) {\n const source = await presetSources[presetSource].load();\n presetConfig = await source.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n if (packageCache) {\n await packageCache.set(\n presetCacheNamespace,\n cacheKey,\n presetConfig,\n 15,\n );\n } else {\n memCache.set(cacheKey, presetConfig);\n }\n }\n }\n\n if (!presetConfig) {\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n logger.trace({ presetConfig }, `Found preset ${preset}`);\n if (params) {\n const argMapping: Record<string, string> = {};\n for (const [index, value] of params.entries()) {\n argMapping[`arg${index}`] = value;\n }\n if (rawParams) {\n argMapping.args = rawParams;\n }\n presetConfig = replaceArgs(presetConfig, argMapping);\n }\n logger.trace({ presetConfig }, `Applied params to preset ${preset}`);\n const presetKeys = Object.keys(presetConfig);\n if (\n presetKeys.length === 2 &&\n presetKeys.includes('description') &&\n presetKeys.includes('extends')\n ) {\n // preset is just a collection of other presets\n delete presetConfig.description;\n }\n const packageListKeys = ['description', 'matchPackageNames'];\n if (presetKeys.every((key) => packageListKeys.includes(key))) {\n delete presetConfig.description;\n }\n const { migratedConfig } = migration.migrateConfig(presetConfig);\n const massagedConfig = massage.massageConfig(migratedConfig);\n if (presetSources[parsedPreset.presetSource]?.repoHosted) {\n // only presets which are hosted in a repository can contain relative\n // references, in all other presets they are left as they are and fail\n // when they are resolved\n canonicalizeRelativePresets(massagedConfig, parsedPreset);\n }\n return massagedConfig;\n}\n\nexport interface ResolveConfigPresetsResult {\n config: AllConfig;\n /** when resolving the given configuration, which internal/shared presets were discovered */\n visitedPresets: {\n /** which internal/shared presets were merged into the final config */\n merged: string[];\n /** which internal/shared presets were not merged into the final config */\n unmerged: string[];\n };\n}\n\n/**\n * @param [mergeInternalPresets=true] when resolving the config presets, whether to merge Renovate internal presets into the resulting configuration.\n * When set to `false`, this will resolve these internal presets (recursively), but not merge them.\n * This is primarily intended to be used by \"shallow config\" resolution (for logging purposes).\n */\nexport async function resolveConfigPresets(\n inputConfig: AllConfig,\n baseConfig?: RenovateConfig,\n _ignorePresets?: string[],\n existingPresets: string[] = [],\n mergeInternalPresets = true,\n): Promise<ResolveConfigPresetsResult> {\n const allVisitedPresets = {\n merged: new Set<string>(),\n unmerged: new Set<string>(),\n };\n\n let ignorePresets = clone(_ignorePresets);\n if (!ignorePresets || ignorePresets.length === 0) {\n ignorePresets = coerceArray(inputConfig.ignorePresets);\n }\n logger.trace(\n { config: inputConfig, existingPresets, mergeInternalPresets },\n 'resolveConfigPresets',\n );\n\n let config: AllConfig = {};\n // First, merge all the preset configs from left to right\n if (inputConfig.extends?.length) {\n // Compile templates\n inputConfig.extends = inputConfig.extends.map((tmpl) =>\n template.compile(tmpl, {}),\n );\n for (const preset of inputConfig.extends) {\n // don't attempt to merge any internal presets if we're not expecting to\n if (!mergeInternalPresets && internal.isInternal(preset)) {\n logger.once.trace(\n { ignoredPreset: preset, mergeInternalPresets },\n 'Not merging preset',\n );\n // ... but make sure we note that we haven't resolved it\n allVisitedPresets.unmerged.add(preset);\n continue;\n }\n\n if (shouldResolvePreset(preset, existingPresets, ignorePresets)) {\n logger.trace(`Resolving preset \"${preset}\"`);\n const fetchedPreset = await fetchPreset(\n preset,\n baseConfig,\n inputConfig,\n existingPresets,\n );\n const { config: presetConfig, visitedPresets } =\n await resolveConfigPresets(\n fetchedPreset,\n baseConfig ?? inputConfig,\n ignorePresets,\n existingPresets.concat([preset]),\n mergeInternalPresets,\n );\n config = mergeChildConfig(config, presetConfig);\n allVisitedPresets.merged.add(preset);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visitedPresets.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visitedPresets.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n }\n logger.trace({ config }, `Post-preset resolve config`);\n // Now assign \"regular\" config on top\n config = mergeChildConfig(config, inputConfig);\n delete config.extends;\n delete config.ignorePresets;\n // Any description of this config replaces the ones collated from its presets.\n // Check the length, because array options default to an empty array.\n if (config.overrideDescription?.length) {\n config.description = config.overrideDescription;\n }\n delete config.overrideDescription;\n logger.trace({ config }, `Post-merge resolve config`);\n for (const [key, val] of Object.entries(config) as [\n keyof AllConfig,\n unknown,\n ][]) {\n const ignoredKeys = ['content', 'onboardingConfig'];\n if (isArray(val)) {\n // Resolve nested objects inside arrays\n config[key] = [] as never; // type can't be narrowed\n for (const element of val) {\n if (isObject(element)) {\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n element,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n (config[key] as RenovateConfig[]).push(presetConfig);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n } else {\n (config[key] as unknown[]).push(element);\n }\n }\n } else if (isObject(val) && !ignoredKeys.includes(key)) {\n // Resolve nested objects\n logger.trace(`Resolving object \"${key}\"`);\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n val,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n config[key] = presetConfig as never; // type can't be narrowed\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n logger.trace({ config: inputConfig }, 'Input config');\n logger.trace(\n { config, visitedPresets: allVisitedPresets },\n 'Resolved config',\n );\n\n return {\n config,\n visitedPresets: {\n merged: Array.from(allVisitedPresets.merged),\n unmerged: Array.from(allVisitedPresets.unmerged),\n },\n };\n}\n\nasync function fetchPreset(\n preset: string,\n baseConfig: RenovateConfig | undefined,\n inputConfig: AllConfig,\n existingPresets: string[],\n): Promise<AllConfig> {\n try {\n return await getPreset(preset, baseConfig ?? inputConfig);\n } catch (err) {\n logger.debug({ preset, err }, 'Preset fetch error');\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n throw err;\n }\n const error = new Error(CONFIG_VALIDATION);\n if (err.message === HOST_BLOCKED) {\n logger.warn(\n {\n preset,\n documentationUrl: `${GlobalConfig.get('productLinks').documentation}self-hosted-configuration/#hostrulesallowinternal`,\n },\n 'Preset host is blocked by this Renovate instance',\n );\n // a preset's response becomes configuration, so a plain hostname grant is not enough - say what the administrator actually has to configure\n error.validationError = `Preset host is blocked by this Renovate instance (${preset}). If this is intended, ask your Renovate administrator to permit it with a \\`hostRules\\` entry setting \\`allowInternal=true\\`, scoped either by \\`hostType\\` (for example \\`preset\\` or \\`npm\\`) or by a URL-prefix \\`matchHost\\``;\n } else if (err.message === PRESET_DEP_NOT_FOUND) {\n error.validationError = `Cannot find preset's package (${preset})`;\n } else if (err.message === PRESET_RENOVATE_CONFIG_NOT_FOUND) {\n error.validationError = `Preset package is missing a renovate-config entry (${preset})`;\n } else if (err.message === PRESET_NOT_FOUND) {\n error.validationError = `Preset name not found within published preset config (${preset})`;\n } else if (err.message === PRESET_INVALID) {\n error.validationError = `Preset is invalid (${preset})`;\n } else if (err.message === PRESET_PROHIBITED_SUBPRESET) {\n error.validationError = `Sub-presets cannot be combined with a custom path (${preset})`;\n } else if (err.message === PRESET_INVALID_JSON) {\n error.validationError = `Preset is invalid JSON (${preset})`;\n } else if (err.message === PRESET_RELATIVE_NO_PARENT) {\n error.validationError = `Relative preset reference cannot be resolved (${preset}). Relative presets can only be used within presets from a supported source, must stay inside their repository, and cannot be templated or used outside of a preset (for example in the repository config, inherited config, or globalExtends)`;\n } else {\n error.validationError = `Preset caused unexpected error (${preset})`;\n }\n if (existingPresets.length) {\n error.validationError +=\n '. Note: this is a *nested* preset so please contact the preset author if you are unable to fix it yourself.';\n }\n logger.info(\n { validationError: error.validationError },\n 'Throwing preset error',\n );\n throw error;\n }\n}\n\nfunction shouldResolvePreset(\n preset: string,\n existingPresets: string[],\n ignorePresets: string[],\n): boolean {\n if (existingPresets.includes(preset)) {\n logger.debug(\n `Already seen preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n if (ignorePresets.includes(preset)) {\n logger.debug(\n `Ignoring preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n return true;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["internal.getPreset","memCache.get","migration.migrateConfig","massage.massageConfig","template.compile","internal.isInternal"],"sources":["../../../lib/config/presets/index.ts"],"sourcesContent":["import {\n isArray,\n isNullOrUndefined,\n isObject,\n isString,\n} from '@sindresorhus/is';\nimport {\n CONFIG_VALIDATION,\n HOST_BLOCKED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport { buildCacheKey } from '../../util/cache/package/key.ts';\nimport { clone } from '../../util/clone.ts';\nimport { regEx } from '../../util/regex.ts';\nimport * as template from '../../util/template/index.ts';\nimport { GlobalConfig } from '../global.ts';\nimport * as massage from '../massage.ts';\nimport * as migration from '../migration.ts';\nimport type { AllConfig, RenovateConfig } from '../types.ts';\nimport { mergeChildConfig } from '../utils.ts';\nimport { removedPresets } from './common.ts';\nimport * as internal from './internal/index.ts';\nimport { parsePreset } from './parse.ts';\nimport { canonicalizeRelativePresets } from './relative.ts';\nimport type { Preset, PresetApi } from './types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_INVALID,\n PRESET_INVALID_JSON,\n PRESET_NOT_FOUND,\n PRESET_PROHIBITED_SUBPRESET,\n PRESET_RELATIVE_NO_PARENT,\n PRESET_RENOVATE_CONFIG_NOT_FOUND,\n} from './util.ts';\n\ninterface PresetSource {\n load: () => Promise<PresetApi>;\n\n /**\n * Whether presets from this source are hosted in a repository, which is what\n * allows them to reference other presets relatively.\n */\n repoHosted: boolean;\n}\n\nexport const presetSources: Record<string, PresetSource> = {\n forgejo: { load: () => import('./forgejo/index.ts'), repoHosted: true },\n gitea: { load: () => import('./gitea/index.ts'), repoHosted: true },\n github: { load: () => import('./github/index.ts'), repoHosted: true },\n gitlab: { load: () => import('./gitlab/index.ts'), repoHosted: true },\n http: { load: () => import('./http/index.ts'), repoHosted: false },\n local: { load: () => import('./local/index.ts'), repoHosted: true },\n npm: { load: () => import('./npm/index.ts'), repoHosted: false },\n};\n\nconst presetCacheNamespace = 'preset';\n\nexport function replaceArgs(\n obj: string,\n argMapping: Record<string, any>,\n): string;\nexport function replaceArgs(\n obj: string[],\n argMapping: Record<string, any>,\n): string[];\nexport function replaceArgs(\n obj: Record<string, any>,\n argMapping: Record<string, any>,\n): Record<string, any>;\nexport function replaceArgs(\n obj: Record<string, any>[],\n argMapping: Record<string, any>,\n): Record<string, any>[];\n\n/**\n * TODO: fix me #22198\n * @param obj\n * @param argMapping\n */\nexport function replaceArgs(obj: any, argMapping: Record<string, any>): any;\nexport function replaceArgs(\n obj: string | string[] | Record<string, any> | Record<string, any>[],\n argMapping: Record<string, any>,\n): any {\n if (isString(obj)) {\n let returnStr = obj;\n for (const [arg, argVal] of Object.entries(argMapping)) {\n const re = regEx(`{{${arg}}}`, 'g', false);\n returnStr = returnStr.replace(re, argVal);\n }\n return returnStr;\n }\n if (isArray(obj)) {\n const returnArray = [];\n for (const item of obj) {\n returnArray.push(replaceArgs(item, argMapping));\n }\n return returnArray;\n }\n if (isObject(obj)) {\n const returnObj: Record<string, any> = {};\n for (const [key, val] of Object.entries(obj)) {\n returnObj[key] = replaceArgs(val, argMapping);\n }\n return returnObj;\n }\n return obj;\n}\n\nexport async function getPreset(\n preset: string,\n baseConfig?: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.trace(`getPreset(${preset})`);\n // Check if the preset has been removed or replaced\n const newPreset = removedPresets[preset];\n if (newPreset) {\n return getPreset(newPreset, baseConfig);\n }\n if (newPreset === null) {\n return {};\n }\n const parsedPreset = parsePreset(preset);\n const { presetSource, repo, presetPath, presetName, tag, params, rawParams } =\n parsedPreset;\n\n if (presetSource === 'relative') {\n throw new Error(PRESET_RELATIVE_NO_PARENT);\n }\n\n let presetConfig: Preset | null | undefined;\n\n if (presetSource === 'internal') {\n presetConfig = internal.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n } else {\n const cacheKey = buildCacheKey('preset', preset);\n const presetCachePersistence = GlobalConfig.get('presetCachePersistence');\n\n let packageCache:\n typeof import('../../util/cache/package/index.ts') | undefined;\n if (presetCachePersistence) {\n packageCache = await import('../../util/cache/package/index.ts');\n }\n\n if (packageCache) {\n presetConfig = await packageCache.get(presetCacheNamespace, cacheKey);\n } else {\n presetConfig = memCache.get(cacheKey);\n }\n\n if (isNullOrUndefined(presetConfig)) {\n const source = await presetSources[presetSource].load();\n presetConfig = await source.getPreset({\n repo,\n presetPath,\n presetName,\n tag,\n });\n if (packageCache) {\n await packageCache.set(\n presetCacheNamespace,\n cacheKey,\n presetConfig,\n 15,\n );\n } else {\n memCache.set(cacheKey, presetConfig);\n }\n }\n }\n\n if (!presetConfig) {\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n logger.trace({ presetConfig }, `Found preset ${preset}`);\n if (params) {\n const argMapping: Record<string, string> = {};\n for (const [index, value] of params.entries()) {\n argMapping[`arg${index}`] = value;\n }\n if (rawParams) {\n argMapping.args = rawParams;\n }\n presetConfig = replaceArgs(presetConfig, argMapping);\n }\n logger.trace({ presetConfig }, `Applied params to preset ${preset}`);\n const presetKeys = Object.keys(presetConfig);\n if (\n presetKeys.length === 2 &&\n presetKeys.includes('description') &&\n presetKeys.includes('extends')\n ) {\n // preset is just a collection of other presets\n delete presetConfig.description;\n }\n const packageListKeys = ['description', 'matchPackageNames'];\n if (presetKeys.every((key) => packageListKeys.includes(key))) {\n delete presetConfig.description;\n }\n const { migratedConfig } = migration.migrateConfig(presetConfig);\n const massagedConfig = massage.massageConfig(migratedConfig);\n if (presetSources[parsedPreset.presetSource]?.repoHosted) {\n // only presets which are hosted in a repository can contain relative\n // references, in all other presets they are left as they are and fail\n // when they are resolved\n canonicalizeRelativePresets(massagedConfig, parsedPreset);\n }\n return massagedConfig;\n}\n\nexport interface ResolveConfigPresetsResult {\n config: AllConfig;\n /** when resolving the given configuration, which internal/shared presets were discovered */\n visitedPresets: {\n /** which internal/shared presets were merged into the final config */\n merged: string[];\n /** which internal/shared presets were not merged into the final config */\n unmerged: string[];\n };\n}\n\n/**\n * @param [mergeInternalPresets=true] when resolving the config presets, whether to merge Renovate internal presets into the resulting configuration.\n * When set to `false`, this will resolve these internal presets (recursively), but not merge them.\n * This is primarily intended to be used by \"shallow config\" resolution (for logging purposes).\n */\nexport async function resolveConfigPresets(\n inputConfig: AllConfig,\n baseConfig?: RenovateConfig,\n _ignorePresets?: string[],\n existingPresets: string[] = [],\n mergeInternalPresets = true,\n): Promise<ResolveConfigPresetsResult> {\n const allVisitedPresets = {\n merged: new Set<string>(),\n unmerged: new Set<string>(),\n };\n\n let ignorePresets = clone(_ignorePresets);\n if (!ignorePresets || ignorePresets.length === 0) {\n ignorePresets = coerceArray(inputConfig.ignorePresets);\n }\n logger.trace(\n { config: inputConfig, existingPresets, mergeInternalPresets },\n 'resolveConfigPresets',\n );\n\n let config: AllConfig = {};\n // First, merge all the preset configs from left to right\n if (inputConfig.extends?.length) {\n // Compile templates\n inputConfig.extends = inputConfig.extends.map((tmpl) =>\n template.compile(tmpl, {}),\n );\n for (const preset of inputConfig.extends) {\n // don't attempt to merge any internal presets if we're not expecting to\n if (!mergeInternalPresets && internal.isInternal(preset)) {\n logger.once.trace(\n { ignoredPreset: preset, mergeInternalPresets },\n 'Not merging preset',\n );\n // ... but make sure we note that we haven't resolved it\n allVisitedPresets.unmerged.add(preset);\n continue;\n }\n\n if (shouldResolvePreset(preset, existingPresets, ignorePresets)) {\n logger.trace(`Resolving preset \"${preset}\"`);\n const fetchedPreset = await fetchPreset(\n preset,\n baseConfig,\n inputConfig,\n existingPresets,\n );\n const { config: presetConfig, visitedPresets } =\n await resolveConfigPresets(\n fetchedPreset,\n baseConfig ?? inputConfig,\n ignorePresets,\n existingPresets.concat([preset]),\n mergeInternalPresets,\n );\n config = mergeChildConfig(config, presetConfig);\n allVisitedPresets.merged.add(preset);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visitedPresets.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visitedPresets.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n }\n logger.trace({ config }, `Post-preset resolve config`);\n // Now assign \"regular\" config on top\n config = mergeChildConfig(config, inputConfig);\n delete config.extends;\n delete config.ignorePresets;\n // Any description of this config replaces the ones collated from its presets.\n // Check the length, because array options default to an empty array.\n if (config.overrideDescription?.length) {\n config.description = config.overrideDescription;\n }\n delete config.overrideDescription;\n logger.trace({ config }, `Post-merge resolve config`);\n for (const [key, val] of Object.entries(config) as [\n keyof AllConfig,\n unknown,\n ][]) {\n const ignoredKeys = ['content', 'onboardingConfig'];\n if (isArray(val)) {\n // Resolve nested objects inside arrays\n config[key] = [] as never; // type can't be narrowed\n for (const element of val) {\n if (isObject(element)) {\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n element,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n (config[key] as RenovateConfig[]).push(presetConfig);\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n } else {\n (config[key] as unknown[]).push(element);\n }\n }\n } else if (isObject(val) && !ignoredKeys.includes(key)) {\n // Resolve nested objects\n logger.trace(`Resolving object \"${key}\"`);\n const { config: presetConfig, visitedPresets: visited } =\n await resolveConfigPresets(\n val,\n baseConfig,\n ignorePresets,\n existingPresets,\n mergeInternalPresets,\n );\n config[key] = presetConfig as never; // type can't be narrowed\n\n // then also make sure we've noted any nested presets we've merged\n for (const mergedPreset of visited.merged) {\n allVisitedPresets.merged.add(mergedPreset);\n }\n // ... or not merged\n for (const unmergedPreset of visited.unmerged) {\n allVisitedPresets.unmerged.add(unmergedPreset);\n }\n }\n }\n logger.trace({ config: inputConfig }, 'Input config');\n logger.trace(\n { config, visitedPresets: allVisitedPresets },\n 'Resolved config',\n );\n\n return {\n config,\n visitedPresets: {\n merged: Array.from(allVisitedPresets.merged),\n unmerged: Array.from(allVisitedPresets.unmerged),\n },\n };\n}\n\nasync function fetchPreset(\n preset: string,\n baseConfig: RenovateConfig | undefined,\n inputConfig: AllConfig,\n existingPresets: string[],\n): Promise<AllConfig> {\n try {\n return await getPreset(preset, baseConfig ?? inputConfig);\n } catch (err) {\n logger.debug({ preset, err }, 'Preset fetch error');\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n throw err;\n }\n const error = new Error(CONFIG_VALIDATION);\n if (err.message === HOST_BLOCKED) {\n logger.warn(\n {\n preset,\n documentationUrl: `${GlobalConfig.get('productLinks').documentation}self-hosted-configuration/#hostrulesallowinternal`,\n },\n 'Preset host is blocked by this Renovate instance',\n );\n // a preset's response becomes configuration, so a plain hostname grant is not enough - say what the administrator actually has to configure\n error.validationError = `Preset host is blocked by this Renovate instance (${preset}). If this is intended, ask your Renovate administrator to permit it with a \\`hostRules\\` entry setting \\`allowInternal=true\\`, scoped either by \\`hostType\\` (for example \\`preset\\` or \\`npm\\`) or by a URL-prefix \\`matchHost\\``;\n } else if (err.message === PRESET_DEP_NOT_FOUND) {\n error.validationError = `Cannot find preset's package (${preset})`;\n } else if (err.message === PRESET_RENOVATE_CONFIG_NOT_FOUND) {\n error.validationError = `Preset package is missing a renovate-config entry (${preset})`;\n } else if (err.message === PRESET_NOT_FOUND) {\n error.validationError = `Preset name not found within published preset config (${preset})`;\n } else if (err.message === PRESET_INVALID) {\n error.validationError = `Preset is invalid (${preset})`;\n } else if (err.message === PRESET_PROHIBITED_SUBPRESET) {\n error.validationError = `Sub-presets cannot be combined with a custom path (${preset})`;\n } else if (err.message === PRESET_INVALID_JSON) {\n error.validationError = `Preset is invalid JSON (${preset})`;\n } else if (err.message === PRESET_RELATIVE_NO_PARENT) {\n error.validationError = `Relative preset reference cannot be resolved (${preset}). Relative presets can only be used within presets from a supported source, must stay inside their repository, and cannot be templated or used outside of a preset (for example in the repository config, inherited config, or globalExtends)`;\n } else {\n error.validationError = `Preset caused unexpected error (${preset})`;\n }\n if (existingPresets.length) {\n error.validationError +=\n '. Note: this is a *nested* preset so please contact the preset author if you are unable to fix it yourself.';\n }\n logger.info(\n { validationError: error.validationError },\n 'Throwing preset error',\n );\n throw error;\n }\n}\n\nfunction shouldResolvePreset(\n preset: string,\n existingPresets: string[],\n ignorePresets: string[],\n): boolean {\n if (existingPresets.includes(preset)) {\n logger.debug(\n `Already seen preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n if (ignorePresets.includes(preset)) {\n logger.debug(\n `Ignoring preset ${preset} in [${existingPresets.join(', ')}]`,\n );\n return false;\n }\n return true;\n}\n"],"mappings":"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"}
@@ -217,7 +217,8 @@ async function validateConfig(configType, config, isPreset, parentPath, parentOp
217
217
  message: `Invalid template in config path: ${currentPath}`
218
218
  });
219
219
  }
220
- const parentName = parentOptionName ?? (isRepoRootPath(parentPath) ? "." : getParentName(parentPath));
220
+ let parentName = parentOptionName;
221
+ if (is.undefined(parentName)) parentName = isRepoRootPath(parentPath) ? "." : getParentName(parentPath);
221
222
  if (!isPreset && parentName && optionParents[key] && !optionParents[key].includes(parentName) && !topLevelObjects.includes(key)) {
222
223
  const { customType } = config;
223
224
  const parent = parentName === "customManagers" && isString(customType) ? parentPath?.replace("customManagers", `custom.${customType}`) : parentPath;
@@ -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 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 isRepoRootPath(parentPath: string | undefined): boolean {\n if (!parentPath) {\n return false;\n }\n return parentPath === 'onboardingConfig' || repoEntryRe.test(parentPath);\n}\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 /* an option which can be used anywhere is valid in any object, even one which `any` doesn't (yet) expand to */\n if (parents && !option.scopes?.includes('any')) {\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 (isRepoRootPath(parentPath) ? '.' : 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 /* the path of the parent, like `packageRules[1]`, naming a custom manager like we do in `enabledManagers` */\n const { customType } = config as Partial<CustomManager>;\n const parent =\n parentName === 'customManagers' && isString(customType)\n ? parentPath?.replace('customManagers', `custom.${customType}`)\n : parentPath;\n const usedIn =\n parentName === '.'\n ? 'at the top level of a config'\n : `in \"${parent}\"`;\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 const isSelectorKey =\n selectors.includes(key) ||\n key === 'matchCurrentVersion' ||\n key === 'matchCurrentValue';\n // top level in a preset\n const isStringPathOrNotPreset =\n isString(parentPath) || !isPreset;\n if (\n isSelectorKey &&\n // TODO: can be undefined ? #22198\n !rulesRe.test(parentPath!) && // Inside a packageRule\n isStringPathOrNotPreset\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 // options which can only be used in one parent, like `packageRules`, are documented under it\n const heading =\n option.parents?.length === 1\n ? `${option.parents[0]}${option.name}`\n : option.name;\n return `allowedValues, which are listed at ${GlobalConfig.get('productLinks').documentation}${page}/#${heading.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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"}
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 isRepoRootPath(parentPath: string | undefined): boolean {\n if (!parentPath) {\n return false;\n }\n return parentPath === 'onboardingConfig' || repoEntryRe.test(parentPath);\n}\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 /* an option which can be used anywhere is valid in any object, even one which `any` doesn't (yet) expand to */\n if (parents && !option.scopes?.includes('any')) {\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 let parentName = parentOptionName;\n if (is.undefined(parentName)) {\n parentName = isRepoRootPath(parentPath)\n ? '.'\n : getParentName(parentPath);\n }\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 /* the path of the parent, like `packageRules[1]`, naming a custom manager like we do in `enabledManagers` */\n const { customType } = config as Partial<CustomManager>;\n const parent =\n parentName === 'customManagers' && isString(customType)\n ? parentPath?.replace('customManagers', `custom.${customType}`)\n : parentPath;\n const usedIn =\n parentName === '.'\n ? 'at the top level of a config'\n : `in \"${parent}\"`;\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 const isSelectorKey =\n selectors.includes(key) ||\n key === 'matchCurrentVersion' ||\n key === 'matchCurrentValue';\n // top level in a preset\n const isStringPathOrNotPreset =\n isString(parentPath) || !isPreset;\n if (\n isSelectorKey &&\n // TODO: can be undefined ? #22198\n !rulesRe.test(parentPath!) && // Inside a packageRule\n isStringPathOrNotPreset\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 // options which can only be used in one parent, like `packageRules`, are documented under it\n const heading =\n option.parents?.length === 1\n ? `${option.parents[0]}${option.name}`\n : option.name;\n return `allowedValues, which are listed at ${GlobalConfig.get('productLinks').documentation}${page}/#${heading.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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"}
@@ -1,3 +1,3 @@
1
- export declare const AllDatasourcesListLiteral: readonly ["apk", "artifactory", "aws-eks-addon", "aws-machine-image", "aws-rds", "azure-bicep-resource", "azure-pipelines-tasks", "azure-tags", "bazel", "bitbucket-server-tags", "bitbucket-tags", "bitrise", "buildpacks-registry", "cdnjs", "clojure", "conan", "conda", "cpan", "crate", "custom", "dart", "dart-version", "deb", "deno", "devbox", "docker", "dotnet-version", "elm-package", "endoflife-date", "flutter-version", "forgejo-releases", "forgejo-tags", "galaxy", "galaxy-collection", "git-refs", "git-tags", "gitea-releases", "gitea-tags", "github-digest", "github-release-attachments", "github-releases", "github-runners", "github-tags", "gitlab-packages", "gitlab-releases", "gitlab-tags", "glasskube-packages", "go", "golang-version", "gradle-version", "hackage", "helm", "hermit", "hex", "hexpm-bob", "java-version", "jenkins-plugins", "jsr", "julia-general-metadata", "kubernetes-api", "maven", "nextcloud", "node-version", "npm", "nuget", "orb", "packagist", "pod", "puppet-forge", "pypi", "python-version", "repology", "rpm", "ruby-version", "rubygems", "rust-version", "sbt-package", "sbt-plugin", "terraform-module", "terraform-provider", "typst", "unity3d", "unity3d-packages"];
1
+ export declare const AllDatasourcesListLiteral: readonly ["apk", "artifactory", "aws-eks-addon", "aws-machine-image", "aws-rds", "azure-bicep-resource", "azure-pipelines-tasks", "azure-tags", "bazel", "bitbucket-server-tags", "bitbucket-tags", "bitrise", "buildpacks-registry", "cdnjs", "clojure", "conan", "conda", "cpan", "crate", "custom", "dart", "dart-version", "deb", "deno", "devbox", "docker", "dotnet-version", "elm-package", "endoflife-date", "flutter-version", "forgejo-releases", "forgejo-tags", "galaxy", "galaxy-collection", "git-refs", "git-tags", "gitea-releases", "gitea-tags", "github-digest", "github-release-attachments", "github-releases", "github-runners", "github-tags", "gitlab-packages", "gitlab-releases", "gitlab-tags", "glasskube-packages", "go", "golang-version", "gradle-version", "hackage", "helm", "hermit", "hex", "hexpm-bob", "java-version", "jenkins-plugins", "jsr", "julia-general-metadata", "kubernetes-api", "maven", "nextcloud", "node-version", "npm", "nuget", "orb", "packagist", "pod", "puppet-forge", "pypi", "python-version", "repology", "rpm", "ruby-version", "rubygems", "rust-version", "sbt-package", "sbt-plugin", "swift-package-registry", "terraform-module", "terraform-provider", "typst", "unity3d", "unity3d-packages"];
2
2
  export type DatasourceName = typeof AllDatasourcesListLiteral[number];
3
3
  //# sourceMappingURL=datasource-list.generated.d.ts.map
@@ -78,6 +78,7 @@ const AllDatasourcesListLiteral = [
78
78
  "rust-version",
79
79
  "sbt-package",
80
80
  "sbt-plugin",
81
+ "swift-package-registry",
81
82
  "terraform-module",
82
83
  "terraform-provider",
83
84
  "typst",
@@ -1 +1 @@
1
- {"version":3,"file":"datasource-list.generated.js","names":[],"sources":["../lib/datasource-list.generated.ts"],"sourcesContent":["\nexport const AllDatasourcesListLiteral = [\"apk\",\"artifactory\",\"aws-eks-addon\",\"aws-machine-image\",\"aws-rds\",\"azure-bicep-resource\",\"azure-pipelines-tasks\",\"azure-tags\",\"bazel\",\"bitbucket-server-tags\",\"bitbucket-tags\",\"bitrise\",\"buildpacks-registry\",\"cdnjs\",\"clojure\",\"conan\",\"conda\",\"cpan\",\"crate\",\"custom\",\"dart\",\"dart-version\",\"deb\",\"deno\",\"devbox\",\"docker\",\"dotnet-version\",\"elm-package\",\"endoflife-date\",\"flutter-version\",\"forgejo-releases\",\"forgejo-tags\",\"galaxy\",\"galaxy-collection\",\"git-refs\",\"git-tags\",\"gitea-releases\",\"gitea-tags\",\"github-digest\",\"github-release-attachments\",\"github-releases\",\"github-runners\",\"github-tags\",\"gitlab-packages\",\"gitlab-releases\",\"gitlab-tags\",\"glasskube-packages\",\"go\",\"golang-version\",\"gradle-version\",\"hackage\",\"helm\",\"hermit\",\"hex\",\"hexpm-bob\",\"java-version\",\"jenkins-plugins\",\"jsr\",\"julia-general-metadata\",\"kubernetes-api\",\"maven\",\"nextcloud\",\"node-version\",\"npm\",\"nuget\",\"orb\",\"packagist\",\"pod\",\"puppet-forge\",\"pypi\",\"python-version\",\"repology\",\"rpm\",\"ruby-version\",\"rubygems\",\"rust-version\",\"sbt-package\",\"sbt-plugin\",\"terraform-module\",\"terraform-provider\",\"typst\",\"unity3d\",\"unity3d-packages\"] as const;\nexport type DatasourceName = typeof AllDatasourcesListLiteral[number];\n"],"mappings":";AACA,MAAa,4BAA4B;CAAC;CAAM;CAAc;CAAgB;CAAoB;CAAU;CAAuB;CAAwB;CAAa;CAAQ;CAAwB;CAAiB;CAAU;CAAsB;CAAQ;CAAU;CAAQ;CAAQ;CAAO;CAAQ;CAAS;CAAO;CAAe;CAAM;CAAO;CAAS;CAAS;CAAiB;CAAc;CAAiB;CAAkB;CAAmB;CAAe;CAAS;CAAoB;CAAW;CAAW;CAAiB;CAAa;CAAgB;CAA6B;CAAkB;CAAiB;CAAc;CAAkB;CAAkB;CAAc;CAAqB;CAAK;CAAiB;CAAiB;CAAU;CAAO;CAAS;CAAM;CAAY;CAAe;CAAkB;CAAM;CAAyB;CAAiB;CAAQ;CAAY;CAAe;CAAM;CAAQ;CAAM;CAAY;CAAM;CAAe;CAAO;CAAiB;CAAW;CAAM;CAAe;CAAW;CAAe;CAAc;CAAa;CAAmB;CAAqB;CAAQ;CAAU;AAAkB"}
1
+ {"version":3,"file":"datasource-list.generated.js","names":[],"sources":["../lib/datasource-list.generated.ts"],"sourcesContent":["\nexport const AllDatasourcesListLiteral = [\"apk\",\"artifactory\",\"aws-eks-addon\",\"aws-machine-image\",\"aws-rds\",\"azure-bicep-resource\",\"azure-pipelines-tasks\",\"azure-tags\",\"bazel\",\"bitbucket-server-tags\",\"bitbucket-tags\",\"bitrise\",\"buildpacks-registry\",\"cdnjs\",\"clojure\",\"conan\",\"conda\",\"cpan\",\"crate\",\"custom\",\"dart\",\"dart-version\",\"deb\",\"deno\",\"devbox\",\"docker\",\"dotnet-version\",\"elm-package\",\"endoflife-date\",\"flutter-version\",\"forgejo-releases\",\"forgejo-tags\",\"galaxy\",\"galaxy-collection\",\"git-refs\",\"git-tags\",\"gitea-releases\",\"gitea-tags\",\"github-digest\",\"github-release-attachments\",\"github-releases\",\"github-runners\",\"github-tags\",\"gitlab-packages\",\"gitlab-releases\",\"gitlab-tags\",\"glasskube-packages\",\"go\",\"golang-version\",\"gradle-version\",\"hackage\",\"helm\",\"hermit\",\"hex\",\"hexpm-bob\",\"java-version\",\"jenkins-plugins\",\"jsr\",\"julia-general-metadata\",\"kubernetes-api\",\"maven\",\"nextcloud\",\"node-version\",\"npm\",\"nuget\",\"orb\",\"packagist\",\"pod\",\"puppet-forge\",\"pypi\",\"python-version\",\"repology\",\"rpm\",\"ruby-version\",\"rubygems\",\"rust-version\",\"sbt-package\",\"sbt-plugin\",\"swift-package-registry\",\"terraform-module\",\"terraform-provider\",\"typst\",\"unity3d\",\"unity3d-packages\"] as const;\nexport type DatasourceName = typeof AllDatasourcesListLiteral[number];\n"],"mappings":";AACA,MAAa,4BAA4B;CAAC;CAAM;CAAc;CAAgB;CAAoB;CAAU;CAAuB;CAAwB;CAAa;CAAQ;CAAwB;CAAiB;CAAU;CAAsB;CAAQ;CAAU;CAAQ;CAAQ;CAAO;CAAQ;CAAS;CAAO;CAAe;CAAM;CAAO;CAAS;CAAS;CAAiB;CAAc;CAAiB;CAAkB;CAAmB;CAAe;CAAS;CAAoB;CAAW;CAAW;CAAiB;CAAa;CAAgB;CAA6B;CAAkB;CAAiB;CAAc;CAAkB;CAAkB;CAAc;CAAqB;CAAK;CAAiB;CAAiB;CAAU;CAAO;CAAS;CAAM;CAAY;CAAe;CAAkB;CAAM;CAAyB;CAAiB;CAAQ;CAAY;CAAe;CAAM;CAAQ;CAAM;CAAY;CAAM;CAAe;CAAO;CAAiB;CAAW;CAAM;CAAe;CAAW;CAAe;CAAc;CAAa;CAAyB;CAAmB;CAAqB;CAAQ;CAAU;AAAkB"}
@@ -76,6 +76,7 @@ import { RubygemsDatasource } from "./rubygems/index.js";
76
76
  import { RustVersionDatasource } from "./rust-version/index.js";
77
77
  import { SbtPackageDatasource } from "./sbt-package/index.js";
78
78
  import { SbtPluginDatasource } from "./sbt-plugin/index.js";
79
+ import { SwiftPackageRegistryDatasource } from "./swift-package-registry/index.js";
79
80
  import { TerraformModuleDatasource } from "./terraform-module/index.js";
80
81
  import { TerraformProviderDatasource } from "./terraform-provider/index.js";
81
82
  import { TypstDatasource } from "./typst/index.js";
@@ -161,6 +162,7 @@ api.set(RubygemsDatasource.id, new RubygemsDatasource());
161
162
  api.set(RustVersionDatasource.id, new RustVersionDatasource());
162
163
  api.set(SbtPackageDatasource.id, new SbtPackageDatasource());
163
164
  api.set(SbtPluginDatasource.id, new SbtPluginDatasource());
165
+ api.set(SwiftPackageRegistryDatasource.id, new SwiftPackageRegistryDatasource());
164
166
  api.set(TerraformModuleDatasource.id, new TerraformModuleDatasource());
165
167
  api.set(TerraformProviderDatasource.id, new TerraformProviderDatasource());
166
168
  api.set(TypstDatasource.id, new TypstDatasource());