renovate 43.214.0 → 43.214.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config/types.d.ts
CHANGED
|
@@ -274,7 +274,7 @@ interface PostUpgradeTasks {
|
|
|
274
274
|
installTools?: Partial<Record<ToolName, Record<never, never>>>;
|
|
275
275
|
}
|
|
276
276
|
type UpdateConfig<T extends RenovateSharedConfig = RenovateSharedConfig> = Partial<Record<UpdateType, T | null>>;
|
|
277
|
-
type RenovateRepository = string | (
|
|
277
|
+
type RenovateRepository = string | (AllConfig & {
|
|
278
278
|
repository: string;
|
|
279
279
|
});
|
|
280
280
|
type UseBaseBranchConfigType = 'merge' | 'none';
|
package/dist/config/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../lib/config/types.ts"],"sourcesContent":["import type { Category, PlatformId } from '../constants/index.ts';\nimport type { LogLevelRemap } from '../logger/types.ts';\nimport type { ManagerName } from '../manager-list.generated.ts';\nimport type { CustomManager } from '../modules/manager/custom/types.ts';\nimport type {\n GitUrlOption,\n RepoSortMethod,\n SortMethod,\n} from '../modules/platform/types.ts';\nimport type {\n AutoMergeType,\n HostRule,\n Nullish,\n RangeStrategy,\n SkipReason,\n} from '../types/index.ts';\nimport type { StageName } from '../types/skip-reason.ts';\nimport type {\n AdditionalConstraintName,\n ConstraintName,\n ToolName,\n} from '../util/exec/types.ts';\nimport type { GitNoVerifyOption } from '../util/git/types.ts';\nimport type { MergeConfidence } from '../util/merge-confidence/types.ts';\nimport type { Timestamp } from '../util/timestamp.ts';\n\nexport type RenovateConfigStage =\n | 'global'\n | 'inherit'\n | 'repository'\n | 'package'\n | 'branch'\n | 'pr';\n\nexport type RenovateSplit =\n | 'init'\n | 'onboarding'\n | 'extract'\n | 'lookup'\n | 'update';\n\nexport type RepositoryCacheConfig = 'disabled' | 'enabled' | 'reset';\nexport type RepositoryCacheType = 'local' | (string & {});\nexport type DryRunConfig = 'extract' | 'lookup' | 'full';\nexport type RequiredConfig = 'required' | 'optional' | 'ignored';\n\nexport interface GroupConfig extends Record<string, unknown> {\n branchName?: string;\n branchTopic?: string;\n}\n\nexport type RecreateWhen = 'auto' | 'never' | 'always';\nexport type PlatformCommitOptions = 'auto' | 'disabled' | 'enabled';\n\nexport type BinarySource = 'docker' | 'global' | 'install' | 'hermit';\n\n// TODO: Proper typings\n/**\n * Any configuration that could be used either top-level in a repository config (or Global, Inherited or Shareable Preset configuration), or:\n *\n * - in a datasource-specific configuration\n * - in a manager-specific configuration\n * - in a Package Rule\n *\n * @see RenovateConfig for the superset of all configuration allowed in a given repository\n *\n */\nexport interface RenovateSharedConfig {\n $schema?: string;\n abandonmentThreshold?: Nullish<string>;\n addLabels?: string[];\n assignAutomerge?: boolean;\n autoApprove?: boolean;\n autoReplaceGlobalMatch?: boolean;\n automerge?: boolean;\n automergeSchedule?: string[];\n automergeStrategy?: MergeStrategy;\n automergeType?: AutoMergeType;\n azureWorkItemId?: number;\n branchName?: string;\n branchNameStrict?: boolean;\n branchPrefix?: string;\n branchPrefixOld?: string;\n bumpVersions?: BumpVersionConfig[];\n commitBody?: string;\n commitBodyTable?: boolean;\n commitMessage?: string;\n commitMessageAction?: string;\n commitMessageExtra?: string;\n commitMessageLowerCase?: 'auto' | 'never';\n commitMessagePrefix?: string;\n commitMessageTopic?: string;\n confidential?: boolean;\n configValidationError?: boolean;\n changelogUrl?: string;\n dependencyDashboardApproval?: boolean;\n draftPR?: boolean;\n enabled?: boolean;\n enabledManagers?: string[];\n encrypted?: Record<string, string>;\n extends?: string[];\n extractVersion?: string;\n managerFilePatterns?: string[];\n followTag?: string;\n force?: RenovateConfig;\n gitIgnoredAuthors?: string[];\n group?: GroupConfig;\n groupName?: string;\n groupSingleUpdates?: boolean;\n groupSlug?: string;\n hashedBranchLength?: number;\n ignoreDeps?: string[];\n ignorePaths?: string[];\n ignoreTests?: boolean;\n ignoreUnstable?: boolean;\n includePaths?: string[];\n internalChecksAsSuccess?: boolean;\n internalChecksFilter?: 'strict' | 'flexible' | 'none';\n keepUpdatedLabel?: string;\n labels?: string[];\n manager?: string;\n milestone?: number;\n minimumReleaseAge?: Nullish<string>;\n npmrc?: string;\n npmrcMerge?: boolean;\n npmToken?: string;\n\n pinDigests?: boolean;\n platformAutomerge?: boolean;\n platformCommit?: PlatformCommitOptions;\n postUpgradeTasks?: PostUpgradeTasks;\n prBodyColumns?: string[];\n prBodyDefinitions?: Record<string, string>;\n prBodyHeadingDefinitions?: Record<string, string>;\n prBodyNotes?: string[];\n prCreation?: 'immediate' | 'not-pending' | 'status-success' | 'approval';\n prFooter?: string;\n prHeader?: string;\n prPriority?: number;\n prTitle?: string;\n prTitleStrict?: boolean;\n productLinks?: Record<string, string>;\n pruneBranchAfterAutomerge?: boolean;\n rangeStrategy?: RangeStrategy;\n rebaseLabel?: string;\n rebaseWhen?: string;\n recreateClosed?: boolean;\n recreateWhen?: RecreateWhen;\n repository?: string;\n repositoryCache?: RepositoryCacheConfig;\n repositoryCacheType?: RepositoryCacheType;\n respectLatest?: boolean;\n rollbackPrs?: boolean;\n schedule?: string[];\n semanticCommitScope?: string | null;\n semanticCommitType?: string;\n semanticCommits?: 'auto' | 'enabled' | 'disabled';\n separateMajorMinor?: boolean;\n separateMinorPatch?: boolean;\n separateMultipleMajor?: boolean;\n separateMultipleMinor?: boolean;\n skipArtifactsUpdate?: boolean;\n stopUpdatingLabel?: string;\n suppressNotifications?: string[];\n timezone?: string;\n unicodeEmoji?: boolean;\n updateNotScheduled?: boolean;\n versioning?: string;\n versionCompatibility?: string;\n}\n\n/**\n * Contains all options with globalOnly=true && inheritConfigSupport=true\n */\nexport interface GlobalInheritableConfig {\n bbUseDevelopmentBranch?: boolean;\n configFileNames?: string[];\n onboarding?: boolean;\n onboardingAutoCloseAge?: number;\n onboardingBranch?: string;\n onboardingCommitMessage?: string;\n onboardingConfig?: RenovateConfig;\n onboardingConfigFileName?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingPrTitle?: string;\n requireConfig?: RequiredConfig;\n}\n\n// Config options used only within the global worker\n// The below should contain config options where stage=global\n/** @deprecated use `RepoGlobalConfig` instead **/\nexport interface GlobalOnlyConfigLegacy {\n autodiscover?: boolean;\n autodiscoverFilter?: string[] | string;\n autodiscoverNamespaces?: string[];\n autodiscoverProjects?: string[];\n autodiscoverTopics?: string[];\n baseDir?: string;\n cacheDir?: string;\n containerbaseDir?: string;\n detectHostRulesFromEnv?: boolean;\n dockerCliOptions?: string;\n endpoint?: string;\n forceCli?: boolean;\n gitNoVerify?: GitNoVerifyOption[];\n gitPrivateKey?: string;\n gitPrivateKeyPassphrase?: string;\n globalExtends?: string[];\n mergeConfidenceDatasources?: string[];\n mergeConfidenceEndpoint?: string;\n platform?: PlatformId;\n processEnv?: Record<string, string>;\n prCommitsPerRunLimit?: number;\n privateKey?: string;\n privateKeyOld?: string;\n privateKeyPath?: string;\n privateKeyPathOld?: string;\n redisPrefix?: string;\n redisUrl?: string;\n repositories?: RenovateRepository[];\n useCloudMetadataServices?: boolean;\n deleteConfigFile?: boolean;\n deleteAdditionalConfigFile?: boolean;\n}\n\n/**\n * Any global-only configuration set by self-hosted administrators.\n *\n * Used within the repository worker.\n *\n * Should only contain config options where globalOnly=true.\n */\nexport interface RepoGlobalConfig extends GlobalInheritableConfig {\n allowedCommands?: string[];\n allowCustomCrateRegistries?: boolean;\n allowPlugins?: boolean;\n allowScripts?: boolean;\n allowShellExecutorForPostUpgradeCommands?: boolean;\n allowedEnv?: string[];\n allowedHeaders?: string[];\n binarySource?: BinarySource;\n cacheDir?: string;\n cacheHardTtlMinutes?: number;\n cacheTtlOverride?: Record<string, number>;\n containerbaseDir?: string;\n customEnvVariables?: Record<string, string>;\n dockerChildPrefix?: string;\n dockerCliOptions?: string;\n dockerSidecarImage?: string;\n dockerUser?: string;\n dryRun?: DryRunConfig;\n encryptedWarning?: string;\n endpoint?: string;\n executionTimeout?: number;\n exposeAllEnv?: boolean;\n gitTimeout?: number;\n githubTokenWarn?: boolean;\n includeMirrors?: boolean;\n localDir?: string;\n migratePresets?: Record<string, string>;\n platform?: PlatformId;\n prCacheSyncMaxPages?: number;\n presetCachePersistence?: boolean;\n httpCacheTtlDays?: number;\n autodiscoverRepoSort?: RepoSortMethod;\n autodiscoverRepoOrder?: SortMethod;\n userAgent?: string;\n dockerMaxPages?: number;\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n cachePrivatePackages?: boolean;\n repositoryCacheForceLocal?: boolean;\n configFileNames?: string[];\n ignorePrAuthor?: boolean;\n allowedUnsafeExecutions?: AllowedUnsafeExecution[];\n onboardingAutoCloseAge?: number;\n toolSettings?: ToolSettingsOptions;\n}\n\n/**\n * Those options are global only but still passed into the repository worker config.\n *\n * @deprecated https://github.com/renovatebot/renovate/issues/39693\n */\nexport interface LegacyAdminConfig {\n baseDir?: string;\n localDir?: string;\n\n logContext?: string;\n\n onboarding?: boolean;\n onboardingBranch?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingRebaseCheckbox?: boolean;\n onboardingConfig?: RenovateConfig;\n onboardingConfigFileName?: string;\n\n optimizeForDisabled?: boolean;\n\n persistRepoData?: boolean;\n\n prCommitsPerRunLimit?: number;\n\n requireConfig?: RequiredConfig;\n\n useCloudMetadataServices?: boolean;\n\n writeDiscoveredRepos?: string;\n}\n\nexport type ExecutionMode = 'branch' | 'update';\n\nexport interface PostUpgradeTasks {\n commands?: string[];\n workingDirTemplate?: string;\n dataFileTemplate?: string;\n fileFilters?: string[];\n executionMode: ExecutionMode;\n installTools?: Partial<Record<ToolName, Record<never, never>>>;\n}\n\nexport type UpdateConfig<\n T extends RenovateSharedConfig = RenovateSharedConfig,\n> = Partial<Record<UpdateType, T | null>>;\n\nexport type RenovateRepository =\n | string\n | (RenovateConfig & {\n repository: string;\n });\n\nexport type UseBaseBranchConfigType = 'merge' | 'none';\nexport type ConstraintsFilter = 'strict' | 'none';\nexport type MinimumReleaseAgeBehaviour =\n | 'timestamp-required'\n | 'timestamp-optional';\n\nexport const allowedStatusCheckStrings = [\n 'minimumReleaseAge',\n 'mergeConfidence',\n 'configValidation',\n 'artifactError',\n] as const;\nexport type StatusCheckKey = (typeof allowedStatusCheckStrings)[number];\ntype UserEnv = Record<string, string>;\n\n/**\n * Computed properties, for internal use only\n */\nexport interface RenovateInternalConfig {\n /** computed base branch from patterns - for internal use only */\n baseBranches?: string[];\n currentCompatibility?: string;\n datasource?: string;\n hasBaseBranches?: boolean;\n isFork?: boolean;\n isVulnerabilityAlert?: boolean;\n\n /** What is this used for? */\n remediations?: unknown;\n /** What is this used for? */\n vulnerabilityAlertsOnly?: boolean;\n}\n\n// TODO: Proper typings\n/**\n * Configuration that could be used either top-level in a repository config (or Global, Inherited or Shareable Preset configuration).\n *\n * This is a superset of any configuration that a Renovate user (not self-hosted administrator) can set.\n */\nexport interface RenovateConfig\n extends\n LegacyAdminConfig,\n RenovateSharedConfig,\n UpdateConfig<PackageRule>,\n AssigneesAndReviewersConfig,\n ConfigMigration,\n RenovateInternalConfig {\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n reportFormatting?: boolean;\n reportPath?: string;\n reportType?: 'logging' | 'file' | 's3' | null;\n depName?: string;\n /** user configurable base branch patterns*/\n baseBranchPatterns?: string[];\n useBaseBranchConfig?: UseBaseBranchConfigType;\n baseBranch?: string;\n defaultBranch?: string;\n branchList?: string[];\n cloneSubmodules?: boolean;\n cloneSubmodulesFilter?: string[];\n description?: string | string[];\n detectGlobalManagerConfig?: boolean;\n errors?: ValidationMessage[];\n forkModeDisallowMaintainerEdits?: boolean;\n forkProcessing?: 'auto' | 'enabled' | 'disabled';\n forkToken?: string;\n\n gitAuthor?: string;\n\n hostRules?: HostRule[];\n\n inheritConfig?: boolean;\n inheritConfigFileName?: string;\n inheritConfigRepoName?: string;\n inheritConfigStrict?: boolean;\n\n ignorePresets?: string[];\n\n fileList?: string[];\n configWarningReuseIssue?: boolean;\n dependencyDashboard?: boolean;\n dependencyDashboardAutoclose?: boolean;\n dependencyDashboardChecks?: Record<string, string>;\n dependencyDashboardIssue?: number;\n dependencyDashboardTitle?: string;\n dependencyDashboardHeader?: string;\n dependencyDashboardFooter?: string;\n dependencyDashboardLabels?: string[];\n dependencyDashboardOSVVulnerabilitySummary?: 'none' | 'all' | 'unresolved';\n dependencyDashboardReportAbandonment?: boolean;\n mode?: 'silent' | 'full';\n packageFile?: string;\n packageRules?: PackageRule[];\n postUpdateOptions?: string[];\n branchConcurrentLimit?: number | null;\n parentOrg?: string;\n prConcurrentLimit?: number;\n commitHourlyLimit?: number;\n prHourlyLimit?: number;\n\n printConfig?: boolean;\n\n pruneStaleBranches?: boolean;\n\n defaultRegistryUrls?: string[];\n registryUrls?: string[] | null;\n registryAliases?: Record<string, string>;\n\n /**\n * What is this used for?\n * @deprecated\n */\n renovateJsonPresent?: boolean;\n\n repoIsOnboarded?: boolean;\n repoIsActivated?: boolean;\n\n topLevelOrg?: string;\n updateInternalDeps?: boolean;\n updateType?: UpdateType;\n\n warnings?: ValidationMessage[];\n vulnerabilityAlerts?: RenovateSharedConfig;\n osvVulnerabilityAlerts?: boolean;\n vulnerabilitySeverity?: string;\n customManagers?: CustomManager[];\n customDatasources?: Record<string, CustomDatasourceConfig>;\n\n fetchChangeLogs?: FetchChangeLogsOptions;\n secrets?: Record<string, string>;\n variables?: Record<string, string>;\n\n constraints?: Partial<Record<ConstraintName, string>>;\n /**\n * Any specific overrides for the versioning for the `AdditionalConstraintName`s.\n */\n constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;\n skipInstalls?: boolean | null;\n\n constraintsFiltering?: ConstraintsFilter;\n\n checkedBranches?: string[];\n customizeDashboard?: Record<string, string>;\n\n statusCheckNames?: Record<StatusCheckKey, string | null>;\n /**\n * User configured environment variables that Renovate uses when executing package manager commands\n */\n env?: UserEnv;\n logLevelRemap?: LogLevelRemap[];\n\n branchTopic?: string;\n additionalBranchPrefix?: string;\n sharedVariableName?: string;\n minimumGroupSize?: number;\n configFileNames?: string[];\n minimumReleaseAgeBehaviour?: MinimumReleaseAgeBehaviour;\n toolSettings?: ToolSettingsOptions;\n}\n\nconst CustomDatasourceFormats = [\n 'html',\n 'json',\n 'plain',\n 'toml',\n 'yaml',\n] as const;\nexport type CustomDatasourceFormats = (typeof CustomDatasourceFormats)[number];\n\nexport interface CustomDatasourceConfig {\n defaultRegistryUrlTemplate?: string;\n format?: CustomDatasourceFormats;\n transformTemplates?: string[];\n}\n\n/**\n * The superset of all configuration that a self-hosted administrator can set, alongside all repository-level configuration.\n *\n */\nexport interface AllConfig\n extends RenovateConfig, GlobalOnlyConfigLegacy, RepoGlobalConfig {\n gitUrl?: GitUrlOption;\n password?: string;\n token?: string;\n username?: string;\n}\n\nexport interface AssigneesAndReviewersConfig {\n assigneesFromCodeOwners?: boolean;\n expandCodeOwnersGroups?: boolean;\n assignees?: string[];\n assigneesSampleSize?: number;\n ignoreReviewers?: string[];\n reviewersFromCodeOwners?: boolean;\n reviewers?: string[];\n reviewersSampleSize?: number;\n additionalReviewers?: string[];\n filterUnavailableUsers?: boolean;\n}\n\nexport type UpdateType =\n | 'major'\n | 'minor'\n | 'patch'\n | 'pin'\n | 'digest'\n | 'pinDigest'\n | 'lockFileMaintenance'\n | 'lockfileUpdate'\n | 'rollback'\n | 'bump'\n | 'replacement';\n\n// These are the update types which can have configuration\nexport const UpdateTypesOptions = [\n 'major',\n 'minor',\n 'patch',\n 'pin',\n 'digest',\n 'pinDigest',\n 'lockFileMaintenance',\n 'rollback',\n 'replacement',\n] as const;\n\nexport type UpdateTypeOptions = (typeof UpdateTypesOptions)[number];\n\nexport type FetchChangeLogsOptions = 'off' | 'branch' | 'pr';\n\nexport type MatchStringsStrategy = 'any' | 'recursive' | 'combination';\n\nexport type MergeStrategy =\n | 'auto'\n | 'fast-forward'\n | 'merge-commit'\n | 'rebase'\n | 'rebase-merge'\n | 'squash';\n\n// This list should be added to as any new unsafe execution commands should be permitted\nexport type AllowedUnsafeExecution =\n | 'bazelModDeps'\n | 'goGenerate'\n | 'gradleWrapper'\n | 'mise';\n\n// TODO: Proper typings\nexport interface PackageRule\n extends RenovateSharedConfig, RenovateInternalConfig, UpdateConfig {\n allowedVersions?: string;\n description?: string | string[];\n matchBaseBranches?: string[];\n matchCategories?: string[];\n matchConfidence?: MergeConfidence[];\n matchCurrentAge?: string;\n matchCurrentValue?: string;\n matchCurrentVersion?: string;\n matchDatasources?: string[];\n matchDepNames?: string[];\n matchDepTypes?: string[];\n matchFileNames?: string[];\n matchManagers?: string[];\n matchNewValue?: string;\n matchPackageNames?: string[];\n matchRepositories?: string[];\n matchSourceUrls?: string[];\n matchRegistryUrls?: string[];\n matchUpdateTypes?: UpdateType[];\n matchJsonata?: string[];\n overrideDatasource?: string;\n overrideDepName?: string;\n overridePackageName?: string;\n registryUrls?: string[] | null;\n replacementName?: string;\n replacementVersion?: string;\n sourceUrl?: string;\n sourceDirectory?: string;\n vulnerabilitySeverity?: string;\n vulnerabilityFixVersion?: string;\n}\n\nexport interface ValidationMessage {\n topic: string;\n message: string;\n}\n\nexport type AllowedParents =\n | '.'\n | 'bumpVersions'\n | 'customDatasources'\n | 'customManagers'\n | 'hostRules'\n | 'logLevelRemap'\n | 'packageRules'\n | 'postUpgradeTasks'\n | 'vulnerabilityAlerts'\n | 'toolSettings'\n | ManagerName\n | UpdateTypeOptions;\nexport interface RenovateOptionBase {\n /**\n * If true, the option can only be configured by people with access to the Renovate instance.\n * Furthermore, the option should be documented in docs/usage/self-hosted-configuration.md.\n */\n globalOnly?: boolean;\n\n inheritConfigSupport?: boolean;\n\n allowedValues?: string[];\n\n allowString?: boolean;\n\n cli?: boolean;\n\n description: string;\n\n env?: false | string;\n\n /**\n * Do not validate object children\n */\n freeChoice?: boolean;\n\n mergeable?: boolean;\n\n autogenerated?: boolean;\n\n name: string;\n\n parents?: AllowedParents[];\n\n stage?: RenovateConfigStage;\n\n experimental?: boolean;\n\n experimentalDescription?: string;\n\n experimentalIssues?: number[];\n\n advancedUse?: boolean;\n\n /**\n * This is used to add a deprecation message in the docs\n */\n deprecationMsg?: string;\n\n /**\n * For internal use only: add it to any config option that supports regex or glob matching\n */\n patternMatch?: boolean;\n\n /**\n * For internal use only: add it to any config option of type integer that supports negative integers\n */\n allowNegative?: boolean;\n\n /**\n * Managers which support this option, leave undefined if all managers support it.\n */\n supportedManagers?: string[];\n\n /**\n * Platforms which support this option, leave undefined if all platforms support it.\n */\n supportedPlatforms?: PlatformId[];\n\n /**\n * Conditions that must be met for this option to be required.\n */\n requiredIf?: RenovateRequiredOption[];\n\n /**\n * If true, the option's value supports Renovate templating.\n * @see https://docs.renovatebot.com/templates/\n */\n supportsTemplating?: boolean;\n}\n\nexport interface RenovateRequiredOption {\n siblingProperties: { property: string; value: string }[];\n}\n\nexport interface RenovateArrayOption<\n T extends string | number | Record<string, unknown> = Record<string, unknown>,\n> extends RenovateOptionBase {\n default?: T[] | null;\n mergeable?: boolean;\n type: 'array';\n subType?: 'string' | 'object' | 'number';\n}\n\nexport interface RenovateStringArrayOption extends RenovateArrayOption<string> {\n format?: 'regex';\n subType: 'string';\n}\n\nexport interface RenovateNumberArrayOption extends RenovateArrayOption<number> {\n subType: 'number';\n}\n\nexport interface RenovateBooleanOption extends RenovateOptionBase {\n default?: boolean | null;\n type: 'boolean';\n}\n\nexport interface RenovateIntegerOption extends RenovateOptionBase {\n default?: number | null;\n type: 'integer';\n}\n\nexport interface RenovateStringOption extends RenovateOptionBase {\n default?: string | null;\n format?: 'regex';\n\n // Not used\n replaceLineReturns?: boolean;\n type: 'string';\n}\n\nexport interface RenovateObjectOption extends RenovateOptionBase {\n default?: any;\n additionalProperties?: Record<string, unknown> | boolean;\n mergeable?: boolean;\n type: 'object';\n}\n\nexport type RenovateOptions =\n | RenovateStringOption\n | RenovateNumberArrayOption\n | RenovateStringArrayOption\n | RenovateIntegerOption\n | RenovateBooleanOption\n | RenovateArrayOption\n | RenovateObjectOption;\n\nexport interface PackageRuleInputConfig extends RenovateConfig {\n versioning?: string;\n packageFile?: string;\n lockFiles?: string[];\n depType?: string;\n depTypes?: string[];\n depName?: string;\n packageName?: string | null;\n newValue?: string | null;\n currentValue?: string | null;\n currentVersion?: string;\n lockedVersion?: string;\n updateType?: UpdateType;\n mergeConfidenceLevel?: MergeConfidence | undefined;\n isBump?: boolean;\n sourceUrl?: string | null;\n categories?: string[];\n baseBranch?: string;\n manager?: string;\n datasource?: string;\n packageRules?: (PackageRule & PackageRuleInputConfig)[];\n releaseTimestamp?: Timestamp | null;\n repository?: string;\n currentVersionAgeInDays?: number;\n currentVersionTimestamp?: string;\n enabled?: boolean;\n skipReason?: SkipReason;\n skipStage?: StageName;\n}\n\nexport interface ConfigMigration {\n configMigration?: boolean;\n}\n\nexport interface MigratedConfig {\n /**\n * Indicates whether there was a migration applied to the configuration.\n *\n * @returns\n * `false` if the configuration does not need migrating, and `migratedConfig` can be ignored\n * `true` if the configuration was migrated, and if so, `migratedConfig` should be used instead of the provided config\n */\n isMigrated: boolean;\n migratedConfig: RenovateConfig;\n}\n\nexport interface MigratedRenovateConfig extends RenovateConfig {\n endpoints?: HostRule[];\n pathRules: PackageRule[];\n packages: PackageRule[];\n\n node?: RenovateConfig;\n travis?: RenovateConfig;\n gradle?: RenovateConfig;\n}\n\nexport interface ManagerConfig extends RenovateConfig {\n manager: string;\n categories?: Category[];\n}\n\nexport interface ValidationResult {\n errors: ValidationMessage[];\n warnings: ValidationMessage[];\n}\n\nexport interface BumpVersionConfig {\n bumpType?: string;\n filePatterns: string[];\n matchStrings: string[];\n name?: string;\n}\n\nexport interface ToolSettingsOptions {\n jvmMaxMemory?: number;\n jvmMemory?: number;\n nodeMaxMemory?: number;\n}\n"],"mappings":";AAiVA,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;AACF;AA4MA,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../lib/config/types.ts"],"sourcesContent":["import type { Category, PlatformId } from '../constants/index.ts';\nimport type { LogLevelRemap } from '../logger/types.ts';\nimport type { ManagerName } from '../manager-list.generated.ts';\nimport type { CustomManager } from '../modules/manager/custom/types.ts';\nimport type {\n GitUrlOption,\n RepoSortMethod,\n SortMethod,\n} from '../modules/platform/types.ts';\nimport type {\n AutoMergeType,\n HostRule,\n Nullish,\n RangeStrategy,\n SkipReason,\n} from '../types/index.ts';\nimport type { StageName } from '../types/skip-reason.ts';\nimport type {\n AdditionalConstraintName,\n ConstraintName,\n ToolName,\n} from '../util/exec/types.ts';\nimport type { GitNoVerifyOption } from '../util/git/types.ts';\nimport type { MergeConfidence } from '../util/merge-confidence/types.ts';\nimport type { Timestamp } from '../util/timestamp.ts';\n\nexport type RenovateConfigStage =\n | 'global'\n | 'inherit'\n | 'repository'\n | 'package'\n | 'branch'\n | 'pr';\n\nexport type RenovateSplit =\n | 'init'\n | 'onboarding'\n | 'extract'\n | 'lookup'\n | 'update';\n\nexport type RepositoryCacheConfig = 'disabled' | 'enabled' | 'reset';\nexport type RepositoryCacheType = 'local' | (string & {});\nexport type DryRunConfig = 'extract' | 'lookup' | 'full';\nexport type RequiredConfig = 'required' | 'optional' | 'ignored';\n\nexport interface GroupConfig extends Record<string, unknown> {\n branchName?: string;\n branchTopic?: string;\n}\n\nexport type RecreateWhen = 'auto' | 'never' | 'always';\nexport type PlatformCommitOptions = 'auto' | 'disabled' | 'enabled';\n\nexport type BinarySource = 'docker' | 'global' | 'install' | 'hermit';\n\n// TODO: Proper typings\n/**\n * Any configuration that could be used either top-level in a repository config (or Global, Inherited or Shareable Preset configuration), or:\n *\n * - in a datasource-specific configuration\n * - in a manager-specific configuration\n * - in a Package Rule\n *\n * @see RenovateConfig for the superset of all configuration allowed in a given repository\n *\n */\nexport interface RenovateSharedConfig {\n $schema?: string;\n abandonmentThreshold?: Nullish<string>;\n addLabels?: string[];\n assignAutomerge?: boolean;\n autoApprove?: boolean;\n autoReplaceGlobalMatch?: boolean;\n automerge?: boolean;\n automergeSchedule?: string[];\n automergeStrategy?: MergeStrategy;\n automergeType?: AutoMergeType;\n azureWorkItemId?: number;\n branchName?: string;\n branchNameStrict?: boolean;\n branchPrefix?: string;\n branchPrefixOld?: string;\n bumpVersions?: BumpVersionConfig[];\n commitBody?: string;\n commitBodyTable?: boolean;\n commitMessage?: string;\n commitMessageAction?: string;\n commitMessageExtra?: string;\n commitMessageLowerCase?: 'auto' | 'never';\n commitMessagePrefix?: string;\n commitMessageTopic?: string;\n confidential?: boolean;\n configValidationError?: boolean;\n changelogUrl?: string;\n dependencyDashboardApproval?: boolean;\n draftPR?: boolean;\n enabled?: boolean;\n enabledManagers?: string[];\n encrypted?: Record<string, string>;\n extends?: string[];\n extractVersion?: string;\n managerFilePatterns?: string[];\n followTag?: string;\n force?: RenovateConfig;\n gitIgnoredAuthors?: string[];\n group?: GroupConfig;\n groupName?: string;\n groupSingleUpdates?: boolean;\n groupSlug?: string;\n hashedBranchLength?: number;\n ignoreDeps?: string[];\n ignorePaths?: string[];\n ignoreTests?: boolean;\n ignoreUnstable?: boolean;\n includePaths?: string[];\n internalChecksAsSuccess?: boolean;\n internalChecksFilter?: 'strict' | 'flexible' | 'none';\n keepUpdatedLabel?: string;\n labels?: string[];\n manager?: string;\n milestone?: number;\n minimumReleaseAge?: Nullish<string>;\n npmrc?: string;\n npmrcMerge?: boolean;\n npmToken?: string;\n\n pinDigests?: boolean;\n platformAutomerge?: boolean;\n platformCommit?: PlatformCommitOptions;\n postUpgradeTasks?: PostUpgradeTasks;\n prBodyColumns?: string[];\n prBodyDefinitions?: Record<string, string>;\n prBodyHeadingDefinitions?: Record<string, string>;\n prBodyNotes?: string[];\n prCreation?: 'immediate' | 'not-pending' | 'status-success' | 'approval';\n prFooter?: string;\n prHeader?: string;\n prPriority?: number;\n prTitle?: string;\n prTitleStrict?: boolean;\n productLinks?: Record<string, string>;\n pruneBranchAfterAutomerge?: boolean;\n rangeStrategy?: RangeStrategy;\n rebaseLabel?: string;\n rebaseWhen?: string;\n recreateClosed?: boolean;\n recreateWhen?: RecreateWhen;\n repository?: string;\n repositoryCache?: RepositoryCacheConfig;\n repositoryCacheType?: RepositoryCacheType;\n respectLatest?: boolean;\n rollbackPrs?: boolean;\n schedule?: string[];\n semanticCommitScope?: string | null;\n semanticCommitType?: string;\n semanticCommits?: 'auto' | 'enabled' | 'disabled';\n separateMajorMinor?: boolean;\n separateMinorPatch?: boolean;\n separateMultipleMajor?: boolean;\n separateMultipleMinor?: boolean;\n skipArtifactsUpdate?: boolean;\n stopUpdatingLabel?: string;\n suppressNotifications?: string[];\n timezone?: string;\n unicodeEmoji?: boolean;\n updateNotScheduled?: boolean;\n versioning?: string;\n versionCompatibility?: string;\n}\n\n/**\n * Contains all options with globalOnly=true && inheritConfigSupport=true\n */\nexport interface GlobalInheritableConfig {\n bbUseDevelopmentBranch?: boolean;\n configFileNames?: string[];\n onboarding?: boolean;\n onboardingAutoCloseAge?: number;\n onboardingBranch?: string;\n onboardingCommitMessage?: string;\n onboardingConfig?: RenovateConfig;\n onboardingConfigFileName?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingPrTitle?: string;\n requireConfig?: RequiredConfig;\n}\n\n// Config options used only within the global worker\n// The below should contain config options where stage=global\n/** @deprecated use `RepoGlobalConfig` instead **/\nexport interface GlobalOnlyConfigLegacy {\n autodiscover?: boolean;\n autodiscoverFilter?: string[] | string;\n autodiscoverNamespaces?: string[];\n autodiscoverProjects?: string[];\n autodiscoverTopics?: string[];\n baseDir?: string;\n cacheDir?: string;\n containerbaseDir?: string;\n detectHostRulesFromEnv?: boolean;\n dockerCliOptions?: string;\n endpoint?: string;\n forceCli?: boolean;\n gitNoVerify?: GitNoVerifyOption[];\n gitPrivateKey?: string;\n gitPrivateKeyPassphrase?: string;\n globalExtends?: string[];\n mergeConfidenceDatasources?: string[];\n mergeConfidenceEndpoint?: string;\n platform?: PlatformId;\n processEnv?: Record<string, string>;\n prCommitsPerRunLimit?: number;\n privateKey?: string;\n privateKeyOld?: string;\n privateKeyPath?: string;\n privateKeyPathOld?: string;\n redisPrefix?: string;\n redisUrl?: string;\n repositories?: RenovateRepository[];\n useCloudMetadataServices?: boolean;\n deleteConfigFile?: boolean;\n deleteAdditionalConfigFile?: boolean;\n}\n\n/**\n * Any global-only configuration set by self-hosted administrators.\n *\n * Used within the repository worker.\n *\n * Should only contain config options where globalOnly=true.\n */\nexport interface RepoGlobalConfig extends GlobalInheritableConfig {\n allowedCommands?: string[];\n allowCustomCrateRegistries?: boolean;\n allowPlugins?: boolean;\n allowScripts?: boolean;\n allowShellExecutorForPostUpgradeCommands?: boolean;\n allowedEnv?: string[];\n allowedHeaders?: string[];\n binarySource?: BinarySource;\n cacheDir?: string;\n cacheHardTtlMinutes?: number;\n cacheTtlOverride?: Record<string, number>;\n containerbaseDir?: string;\n customEnvVariables?: Record<string, string>;\n dockerChildPrefix?: string;\n dockerCliOptions?: string;\n dockerSidecarImage?: string;\n dockerUser?: string;\n dryRun?: DryRunConfig;\n encryptedWarning?: string;\n endpoint?: string;\n executionTimeout?: number;\n exposeAllEnv?: boolean;\n gitTimeout?: number;\n githubTokenWarn?: boolean;\n includeMirrors?: boolean;\n localDir?: string;\n migratePresets?: Record<string, string>;\n platform?: PlatformId;\n prCacheSyncMaxPages?: number;\n presetCachePersistence?: boolean;\n httpCacheTtlDays?: number;\n autodiscoverRepoSort?: RepoSortMethod;\n autodiscoverRepoOrder?: SortMethod;\n userAgent?: string;\n dockerMaxPages?: number;\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n cachePrivatePackages?: boolean;\n repositoryCacheForceLocal?: boolean;\n configFileNames?: string[];\n ignorePrAuthor?: boolean;\n allowedUnsafeExecutions?: AllowedUnsafeExecution[];\n onboardingAutoCloseAge?: number;\n toolSettings?: ToolSettingsOptions;\n}\n\n/**\n * Those options are global only but still passed into the repository worker config.\n *\n * @deprecated https://github.com/renovatebot/renovate/issues/39693\n */\nexport interface LegacyAdminConfig {\n baseDir?: string;\n localDir?: string;\n\n logContext?: string;\n\n onboarding?: boolean;\n onboardingBranch?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingRebaseCheckbox?: boolean;\n onboardingConfig?: RenovateConfig;\n onboardingConfigFileName?: string;\n\n optimizeForDisabled?: boolean;\n\n persistRepoData?: boolean;\n\n prCommitsPerRunLimit?: number;\n\n requireConfig?: RequiredConfig;\n\n useCloudMetadataServices?: boolean;\n\n writeDiscoveredRepos?: string;\n}\n\nexport type ExecutionMode = 'branch' | 'update';\n\nexport interface PostUpgradeTasks {\n commands?: string[];\n workingDirTemplate?: string;\n dataFileTemplate?: string;\n fileFilters?: string[];\n executionMode: ExecutionMode;\n installTools?: Partial<Record<ToolName, Record<never, never>>>;\n}\n\nexport type UpdateConfig<\n T extends RenovateSharedConfig = RenovateSharedConfig,\n> = Partial<Record<UpdateType, T | null>>;\n\nexport type RenovateRepository =\n | string\n | (AllConfig & {\n repository: string;\n });\n\nexport type UseBaseBranchConfigType = 'merge' | 'none';\nexport type ConstraintsFilter = 'strict' | 'none';\nexport type MinimumReleaseAgeBehaviour =\n | 'timestamp-required'\n | 'timestamp-optional';\n\nexport const allowedStatusCheckStrings = [\n 'minimumReleaseAge',\n 'mergeConfidence',\n 'configValidation',\n 'artifactError',\n] as const;\nexport type StatusCheckKey = (typeof allowedStatusCheckStrings)[number];\ntype UserEnv = Record<string, string>;\n\n/**\n * Computed properties, for internal use only\n */\nexport interface RenovateInternalConfig {\n /** computed base branch from patterns - for internal use only */\n baseBranches?: string[];\n currentCompatibility?: string;\n datasource?: string;\n hasBaseBranches?: boolean;\n isFork?: boolean;\n isVulnerabilityAlert?: boolean;\n\n /** What is this used for? */\n remediations?: unknown;\n /** What is this used for? */\n vulnerabilityAlertsOnly?: boolean;\n}\n\n// TODO: Proper typings\n/**\n * Configuration that could be used either top-level in a repository config (or Global, Inherited or Shareable Preset configuration).\n *\n * This is a superset of any configuration that a Renovate user (not self-hosted administrator) can set.\n */\nexport interface RenovateConfig\n extends\n LegacyAdminConfig,\n RenovateSharedConfig,\n UpdateConfig<PackageRule>,\n AssigneesAndReviewersConfig,\n ConfigMigration,\n RenovateInternalConfig {\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n reportFormatting?: boolean;\n reportPath?: string;\n reportType?: 'logging' | 'file' | 's3' | null;\n depName?: string;\n /** user configurable base branch patterns*/\n baseBranchPatterns?: string[];\n useBaseBranchConfig?: UseBaseBranchConfigType;\n baseBranch?: string;\n defaultBranch?: string;\n branchList?: string[];\n cloneSubmodules?: boolean;\n cloneSubmodulesFilter?: string[];\n description?: string | string[];\n detectGlobalManagerConfig?: boolean;\n errors?: ValidationMessage[];\n forkModeDisallowMaintainerEdits?: boolean;\n forkProcessing?: 'auto' | 'enabled' | 'disabled';\n forkToken?: string;\n\n gitAuthor?: string;\n\n hostRules?: HostRule[];\n\n inheritConfig?: boolean;\n inheritConfigFileName?: string;\n inheritConfigRepoName?: string;\n inheritConfigStrict?: boolean;\n\n ignorePresets?: string[];\n\n fileList?: string[];\n configWarningReuseIssue?: boolean;\n dependencyDashboard?: boolean;\n dependencyDashboardAutoclose?: boolean;\n dependencyDashboardChecks?: Record<string, string>;\n dependencyDashboardIssue?: number;\n dependencyDashboardTitle?: string;\n dependencyDashboardHeader?: string;\n dependencyDashboardFooter?: string;\n dependencyDashboardLabels?: string[];\n dependencyDashboardOSVVulnerabilitySummary?: 'none' | 'all' | 'unresolved';\n dependencyDashboardReportAbandonment?: boolean;\n mode?: 'silent' | 'full';\n packageFile?: string;\n packageRules?: PackageRule[];\n postUpdateOptions?: string[];\n branchConcurrentLimit?: number | null;\n parentOrg?: string;\n prConcurrentLimit?: number;\n commitHourlyLimit?: number;\n prHourlyLimit?: number;\n\n printConfig?: boolean;\n\n pruneStaleBranches?: boolean;\n\n defaultRegistryUrls?: string[];\n registryUrls?: string[] | null;\n registryAliases?: Record<string, string>;\n\n /**\n * What is this used for?\n * @deprecated\n */\n renovateJsonPresent?: boolean;\n\n repoIsOnboarded?: boolean;\n repoIsActivated?: boolean;\n\n topLevelOrg?: string;\n updateInternalDeps?: boolean;\n updateType?: UpdateType;\n\n warnings?: ValidationMessage[];\n vulnerabilityAlerts?: RenovateSharedConfig;\n osvVulnerabilityAlerts?: boolean;\n vulnerabilitySeverity?: string;\n customManagers?: CustomManager[];\n customDatasources?: Record<string, CustomDatasourceConfig>;\n\n fetchChangeLogs?: FetchChangeLogsOptions;\n secrets?: Record<string, string>;\n variables?: Record<string, string>;\n\n constraints?: Partial<Record<ConstraintName, string>>;\n /**\n * Any specific overrides for the versioning for the `AdditionalConstraintName`s.\n */\n constraintsVersioning?: Partial<Record<AdditionalConstraintName, string>>;\n skipInstalls?: boolean | null;\n\n constraintsFiltering?: ConstraintsFilter;\n\n checkedBranches?: string[];\n customizeDashboard?: Record<string, string>;\n\n statusCheckNames?: Record<StatusCheckKey, string | null>;\n /**\n * User configured environment variables that Renovate uses when executing package manager commands\n */\n env?: UserEnv;\n logLevelRemap?: LogLevelRemap[];\n\n branchTopic?: string;\n additionalBranchPrefix?: string;\n sharedVariableName?: string;\n minimumGroupSize?: number;\n configFileNames?: string[];\n minimumReleaseAgeBehaviour?: MinimumReleaseAgeBehaviour;\n toolSettings?: ToolSettingsOptions;\n}\n\nconst CustomDatasourceFormats = [\n 'html',\n 'json',\n 'plain',\n 'toml',\n 'yaml',\n] as const;\nexport type CustomDatasourceFormats = (typeof CustomDatasourceFormats)[number];\n\nexport interface CustomDatasourceConfig {\n defaultRegistryUrlTemplate?: string;\n format?: CustomDatasourceFormats;\n transformTemplates?: string[];\n}\n\n/**\n * The superset of all configuration that a self-hosted administrator can set, alongside all repository-level configuration.\n *\n */\nexport interface AllConfig\n extends RenovateConfig, GlobalOnlyConfigLegacy, RepoGlobalConfig {\n gitUrl?: GitUrlOption;\n password?: string;\n token?: string;\n username?: string;\n}\n\nexport interface AssigneesAndReviewersConfig {\n assigneesFromCodeOwners?: boolean;\n expandCodeOwnersGroups?: boolean;\n assignees?: string[];\n assigneesSampleSize?: number;\n ignoreReviewers?: string[];\n reviewersFromCodeOwners?: boolean;\n reviewers?: string[];\n reviewersSampleSize?: number;\n additionalReviewers?: string[];\n filterUnavailableUsers?: boolean;\n}\n\nexport type UpdateType =\n | 'major'\n | 'minor'\n | 'patch'\n | 'pin'\n | 'digest'\n | 'pinDigest'\n | 'lockFileMaintenance'\n | 'lockfileUpdate'\n | 'rollback'\n | 'bump'\n | 'replacement';\n\n// These are the update types which can have configuration\nexport const UpdateTypesOptions = [\n 'major',\n 'minor',\n 'patch',\n 'pin',\n 'digest',\n 'pinDigest',\n 'lockFileMaintenance',\n 'rollback',\n 'replacement',\n] as const;\n\nexport type UpdateTypeOptions = (typeof UpdateTypesOptions)[number];\n\nexport type FetchChangeLogsOptions = 'off' | 'branch' | 'pr';\n\nexport type MatchStringsStrategy = 'any' | 'recursive' | 'combination';\n\nexport type MergeStrategy =\n | 'auto'\n | 'fast-forward'\n | 'merge-commit'\n | 'rebase'\n | 'rebase-merge'\n | 'squash';\n\n// This list should be added to as any new unsafe execution commands should be permitted\nexport type AllowedUnsafeExecution =\n | 'bazelModDeps'\n | 'goGenerate'\n | 'gradleWrapper'\n | 'mise';\n\n// TODO: Proper typings\nexport interface PackageRule\n extends RenovateSharedConfig, RenovateInternalConfig, UpdateConfig {\n allowedVersions?: string;\n description?: string | string[];\n matchBaseBranches?: string[];\n matchCategories?: string[];\n matchConfidence?: MergeConfidence[];\n matchCurrentAge?: string;\n matchCurrentValue?: string;\n matchCurrentVersion?: string;\n matchDatasources?: string[];\n matchDepNames?: string[];\n matchDepTypes?: string[];\n matchFileNames?: string[];\n matchManagers?: string[];\n matchNewValue?: string;\n matchPackageNames?: string[];\n matchRepositories?: string[];\n matchSourceUrls?: string[];\n matchRegistryUrls?: string[];\n matchUpdateTypes?: UpdateType[];\n matchJsonata?: string[];\n overrideDatasource?: string;\n overrideDepName?: string;\n overridePackageName?: string;\n registryUrls?: string[] | null;\n replacementName?: string;\n replacementVersion?: string;\n sourceUrl?: string;\n sourceDirectory?: string;\n vulnerabilitySeverity?: string;\n vulnerabilityFixVersion?: string;\n}\n\nexport interface ValidationMessage {\n topic: string;\n message: string;\n}\n\nexport type AllowedParents =\n | '.'\n | 'bumpVersions'\n | 'customDatasources'\n | 'customManagers'\n | 'hostRules'\n | 'logLevelRemap'\n | 'packageRules'\n | 'postUpgradeTasks'\n | 'vulnerabilityAlerts'\n | 'toolSettings'\n | ManagerName\n | UpdateTypeOptions;\nexport interface RenovateOptionBase {\n /**\n * If true, the option can only be configured by people with access to the Renovate instance.\n * Furthermore, the option should be documented in docs/usage/self-hosted-configuration.md.\n */\n globalOnly?: boolean;\n\n inheritConfigSupport?: boolean;\n\n allowedValues?: string[];\n\n allowString?: boolean;\n\n cli?: boolean;\n\n description: string;\n\n env?: false | string;\n\n /**\n * Do not validate object children\n */\n freeChoice?: boolean;\n\n mergeable?: boolean;\n\n autogenerated?: boolean;\n\n name: string;\n\n parents?: AllowedParents[];\n\n stage?: RenovateConfigStage;\n\n experimental?: boolean;\n\n experimentalDescription?: string;\n\n experimentalIssues?: number[];\n\n advancedUse?: boolean;\n\n /**\n * This is used to add a deprecation message in the docs\n */\n deprecationMsg?: string;\n\n /**\n * For internal use only: add it to any config option that supports regex or glob matching\n */\n patternMatch?: boolean;\n\n /**\n * For internal use only: add it to any config option of type integer that supports negative integers\n */\n allowNegative?: boolean;\n\n /**\n * Managers which support this option, leave undefined if all managers support it.\n */\n supportedManagers?: string[];\n\n /**\n * Platforms which support this option, leave undefined if all platforms support it.\n */\n supportedPlatforms?: PlatformId[];\n\n /**\n * Conditions that must be met for this option to be required.\n */\n requiredIf?: RenovateRequiredOption[];\n\n /**\n * If true, the option's value supports Renovate templating.\n * @see https://docs.renovatebot.com/templates/\n */\n supportsTemplating?: boolean;\n}\n\nexport interface RenovateRequiredOption {\n siblingProperties: { property: string; value: string }[];\n}\n\nexport interface RenovateArrayOption<\n T extends string | number | Record<string, unknown> = Record<string, unknown>,\n> extends RenovateOptionBase {\n default?: T[] | null;\n mergeable?: boolean;\n type: 'array';\n subType?: 'string' | 'object' | 'number';\n}\n\nexport interface RenovateStringArrayOption extends RenovateArrayOption<string> {\n format?: 'regex';\n subType: 'string';\n}\n\nexport interface RenovateNumberArrayOption extends RenovateArrayOption<number> {\n subType: 'number';\n}\n\nexport interface RenovateBooleanOption extends RenovateOptionBase {\n default?: boolean | null;\n type: 'boolean';\n}\n\nexport interface RenovateIntegerOption extends RenovateOptionBase {\n default?: number | null;\n type: 'integer';\n}\n\nexport interface RenovateStringOption extends RenovateOptionBase {\n default?: string | null;\n format?: 'regex';\n\n // Not used\n replaceLineReturns?: boolean;\n type: 'string';\n}\n\nexport interface RenovateObjectOption extends RenovateOptionBase {\n default?: any;\n additionalProperties?: Record<string, unknown> | boolean;\n mergeable?: boolean;\n type: 'object';\n}\n\nexport type RenovateOptions =\n | RenovateStringOption\n | RenovateNumberArrayOption\n | RenovateStringArrayOption\n | RenovateIntegerOption\n | RenovateBooleanOption\n | RenovateArrayOption\n | RenovateObjectOption;\n\nexport interface PackageRuleInputConfig extends RenovateConfig {\n versioning?: string;\n packageFile?: string;\n lockFiles?: string[];\n depType?: string;\n depTypes?: string[];\n depName?: string;\n packageName?: string | null;\n newValue?: string | null;\n currentValue?: string | null;\n currentVersion?: string;\n lockedVersion?: string;\n updateType?: UpdateType;\n mergeConfidenceLevel?: MergeConfidence | undefined;\n isBump?: boolean;\n sourceUrl?: string | null;\n categories?: string[];\n baseBranch?: string;\n manager?: string;\n datasource?: string;\n packageRules?: (PackageRule & PackageRuleInputConfig)[];\n releaseTimestamp?: Timestamp | null;\n repository?: string;\n currentVersionAgeInDays?: number;\n currentVersionTimestamp?: string;\n enabled?: boolean;\n skipReason?: SkipReason;\n skipStage?: StageName;\n}\n\nexport interface ConfigMigration {\n configMigration?: boolean;\n}\n\nexport interface MigratedConfig {\n /**\n * Indicates whether there was a migration applied to the configuration.\n *\n * @returns\n * `false` if the configuration does not need migrating, and `migratedConfig` can be ignored\n * `true` if the configuration was migrated, and if so, `migratedConfig` should be used instead of the provided config\n */\n isMigrated: boolean;\n migratedConfig: RenovateConfig;\n}\n\nexport interface MigratedRenovateConfig extends RenovateConfig {\n endpoints?: HostRule[];\n pathRules: PackageRule[];\n packages: PackageRule[];\n\n node?: RenovateConfig;\n travis?: RenovateConfig;\n gradle?: RenovateConfig;\n}\n\nexport interface ManagerConfig extends RenovateConfig {\n manager: string;\n categories?: Category[];\n}\n\nexport interface ValidationResult {\n errors: ValidationMessage[];\n warnings: ValidationMessage[];\n}\n\nexport interface BumpVersionConfig {\n bumpType?: string;\n filePatterns: string[];\n matchStrings: string[];\n name?: string;\n}\n\nexport interface ToolSettingsOptions {\n jvmMaxMemory?: number;\n jvmMemory?: number;\n nodeMaxMemory?: number;\n}\n"],"mappings":";AAiVA,MAAa,4BAA4B;CACvC;CACA;CACA;CACA;AACF;AA4MA,MAAa,qBAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -673,6 +673,11 @@ async function validateGlobalConfig(key, val, type, warnings, errors, currentPat
|
|
|
673
673
|
message: `Configuration option \`${currentPath}\` should be a boolean. Found: ${JSON.stringify(val)} (${typeof val}).`
|
|
674
674
|
});
|
|
675
675
|
} else if (type === "array") if (isArray(val)) {
|
|
676
|
+
for (const [subIndex, subval] of val.entries()) if (isObject(subval)) {
|
|
677
|
+
const subValidation = await validateConfig("global", subval, false, `${currentPath}[${subIndex}]`);
|
|
678
|
+
warnings.push(...subValidation.warnings);
|
|
679
|
+
errors.push(...subValidation.errors);
|
|
680
|
+
}
|
|
676
681
|
if (isRegexOrGlobOption(key)) warnings.push(...check$1({
|
|
677
682
|
val,
|
|
678
683
|
currentPath
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","names":["regexOrGlobValidator.check","matchBaseBranchesValidator.check"],"sources":["../../lib/config/validation.ts"],"sourcesContent":["import is, {\n isArray,\n isEmptyString,\n isNonEmptyArray,\n isNonEmptyString,\n isObject,\n isPlainObject,\n isString,\n isUndefined,\n} from '@sindresorhus/is';\nimport type { PlatformId } from '../constants/index.ts';\nimport { logger } from '../logger/index.ts';\nimport {\n AllManagersListLiteral,\n CustomManagersListLiteral,\n} 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 { packageCacheNamespaces } from '../util/cache/package/namespaces.ts';\nimport { getToolConfig } from '../util/exec/containerbase.ts';\nimport { isConstraintName, isToolName } from '../util/exec/types.ts';\nimport { getExpression } from '../util/jsonata.ts';\nimport { regEx } from '../util/regex.ts';\nimport {\n anyMatchRegexOrGlobList,\n getRegexPredicate,\n isRegexMatch,\n matchRegexOrGlobList,\n} from '../util/string-match.ts';\nimport * as template from '../util/template/index.ts';\nimport { parseUrl } from '../util/url.ts';\nimport {\n AllVersioningsListLiteral,\n type VersioningName,\n} from '../versioning-list.generated.ts';\nimport {\n hasValidSchedule,\n hasValidTimezone,\n} from '../workers/repository/update/branch/schedule.ts';\nimport { getConfigFileNames } from './app-strings.ts';\nimport { GlobalConfig } from './global.ts';\nimport { migrateConfig } from './migration.ts';\nimport { getOptions } from './options/index.ts';\nimport { resolveConfigPresets } from './presets/index.ts';\nimport { supportedDatasources } from './presets/internal/merge-confidence.preset.ts';\nimport { parsePreset } from './presets/parse.ts';\nimport type {\n AllConfig,\n AllowedParents,\n RenovateConfig,\n RenovateOptions,\n StatusCheckKey,\n ValidationMessage,\n ValidationResult,\n} from './types.ts';\nimport { allowedStatusCheckStrings } from './types.ts';\nimport * as matchBaseBranchesValidator from './validation-helpers/match-base-branches.ts';\nimport * as regexOrGlobValidator from './validation-helpers/regex-glob-matchers.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 optionGlobals: Set<string>;\nlet optionInherits: Set<string>;\nlet optionRegexOrGlob: Set<string>;\nlet optionAllowsNegativeIntegers: Set<string>;\nlet optionSupportsTemplating: Set<string>;\n\nconst managerList: readonly string[] = AllManagersListLiteral;\n\nconst allManagersList: readonly string[] = [\n ...AllManagersListLiteral,\n ...CustomManagersListLiteral,\n];\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\\((.+)\\)$/);\nconst rulesRe = regEx(/p.*Rules\\[\\d+\\]$/);\n\nfunction isIgnored(key: string): boolean {\n return ignoredNodes.includes(key);\n}\n\nfunction getUnsupportedEnabledManagers(enabledManagers: string[]): string[] {\n return enabledManagers.filter(\n (manager) => !allManagersList.includes(manager.replace('custom.', '')),\n );\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 optionInherits = new Set();\n optionTypes = {};\n optionRegexOrGlob = new Set();\n optionGlobals = new Set();\n optionAllowsNegativeIntegers = new Set();\n optionSupportsTemplating = new Set();\n\n for (const option of options) {\n optionTypes[option.name] = option.type;\n\n if (option.parents) {\n optionParents[option.name] = option.parents;\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\nexport async function validateConfig(\n configType: 'global' | 'inherit' | 'repo',\n config: AllConfig,\n isPreset?: boolean,\n parentPath?: string,\n): Promise<ValidationResult> {\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 7 -- TODO: add test */\n if (key === '__proto__') {\n errors.push({\n topic: 'Config security error',\n message: '__proto__',\n });\n continue;\n }\n if (\n parentPath &&\n parentPath !== 'onboardingConfig' &&\n topLevelObjects.includes(key)\n ) {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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 === 'enabledManagers' && val) {\n const unsupportedManagers = getUnsupportedEnabledManagers(\n val as string[],\n );\n if (isNonEmptyArray(unsupportedManagers)) {\n errors.push({\n topic: 'Configuration Error',\n message: `The following managers configured in enabledManagers are not supported: \"${unsupportedManagers.join(\n ', ',\n )}\"`,\n });\n }\n }\n if (key === 'registryUrls' && !parentPath && isNonEmptyArray(val)) {\n warnings.push({\n topic: 'Configuration 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 (key === 'defaultRegistryUrls' && !parentPath && isNonEmptyArray(val)) {\n warnings.push({\n topic: 'Configuration 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: 'Deprecation Warning',\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: 'Configuration Error',\n message: `Invalid template in config path: ${currentPath}`,\n });\n }\n }\n const parentName = getParentName(parentPath);\n if (\n !isPreset &&\n optionParents[key] &&\n !optionParents[key].includes(parentName as AllowedParents)\n ) {\n // TODO: types (#22198)\n const options = optionParents[key]?.toSorted().join(', ');\n const message = `\"${key}\" can't be used in \"${parentName}\". Allowed objects: ${options}.`;\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: 'Configuration Error',\n message: `Invalid configuration option: ${currentPath}`,\n });\n } else if (key === 'schedule') {\n const [validSchedule, errorMessage] = hasValidSchedule(val as string[]);\n if (!validSchedule) {\n errors.push({\n topic: 'Configuration 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: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${val}\\``,\n });\n }\n } else if (key === 'timezone' && val !== null) {\n const [validTimezone, errorMessage] = hasValidTimezone(val as string);\n if (!validTimezone) {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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(...validateNumber(key, val, allowsNegative, currentPath));\n } else if (type === 'array' && val) {\n if (isArray(val)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n configType,\n subval as RenovateConfig,\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 (configType !== 'global' && subval.startsWith('global:')) {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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: 'Configuration Error',\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n }\n if (!subval.includes('{{')) {\n try {\n parsePreset(subval);\n } catch {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: preset \"${subval}\" is not valid`,\n });\n }\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: preset value is not a string`,\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 '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 { config: resolved } = await resolveConfigPresets(\n packageRule as RenovateConfig,\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 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: 'Configuration Error',\n message,\n });\n }\n if (selectorLength === Object.keys(resolvedRule).length) {\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: 'Configuration 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 if (isNonEmptyArray(resolvedRule.matchUpdateTypes)) {\n for (const option of preLookupOptions) {\n if (resolvedRule[option] !== undefined) {\n const message = `${currentPath}[${subIndex}]: packageRules cannot combine both matchUpdateTypes and ${option}. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: 'Configuration Error',\n message,\n });\n }\n }\n }\n } else {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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: 'Configuration Error',\n message: `Each Custom Manager must contain a non-empty managerFilePatterns array`,\n });\n }\n } else {\n if (\n isEmptyString(customManager.customType) ||\n isUndefined(customManager.customType)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Each Custom Manager must contain a non-empty customType string`,\n });\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid customType: ${customManager.customType}. Key is not a custom manager`,\n });\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 (startPattern.test(pattern) && endPattern.test(pattern)) {\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: 'Configuration 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: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${baseBranchPattern}\\``,\n });\n }\n }\n }\n if (\n (selectors.includes(key) ||\n key === 'matchCurrentVersion' ||\n key === 'matchCurrentValue') &&\n // TODO: can be undefined ? #22198\n !rulesRe.test(parentPath!) && // Inside a packageRule\n (isString(parentPath) || !isPreset) // top level in a preset\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: ${key} should be inside a \\`packageRule\\` only`,\n });\n }\n } else {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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: 'Configuration 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 ? (config.allowedEnv ?? [])\n : GlobalConfig.get('allowedEnv');\n for (const [envVarName, envVarValue] of Object.entries(val)) {\n if (!isString(envVarValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid env variable value: \\`${currentPath}.${envVarName}\\` must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(envVarName, allowedEnvVars)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Env variable name \\`${envVarName}\\` is not allowed by this bot's \\`allowedEnv\\`.`,\n });\n }\n }\n } else if (key === 'statusCheckNames') {\n for (const [statusCheckKey, statusCheckValue] of Object.entries(\n val,\n )) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: 'Configuration 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: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: status check is not a string.`,\n });\n continue;\n }\n }\n } else if (key === 'customDatasources') {\n const allowedKeys = [\n 'description',\n 'defaultRegistryUrlTemplate',\n 'format',\n 'transformTemplates',\n ];\n for (const [\n customDatasourceName,\n customDatasourceValue,\n ] of Object.entries(val)) {\n if (!isPlainObject(customDatasourceValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${customDatasourceName}\\` configuration: customDatasource is not an object`,\n });\n continue;\n }\n for (const [subKey, subValue] of Object.entries(\n customDatasourceValue,\n )) {\n if (!allowedKeys.includes(subKey)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: key is not allowed`,\n });\n } else if (subKey === 'transformTemplates') {\n if (!isArray(subValue, isString)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is not an array of string`,\n });\n }\n } else if (subKey === 'description') {\n if (!(isString(subValue) || isArray(subValue, isString))) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is not an array of strings`,\n });\n }\n } else if (!isString(subValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is a string`,\n });\n }\n }\n }\n } else if (key === 'installTools') {\n for (const toolName of Object.keys(val)) {\n if (!isToolName(toolName)) {\n warnings.push({\n topic: 'Configuration 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: 'Configuration 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: 'Configuration 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: 'Configuration 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: 'Configuration 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: 'Configuration 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: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}=${v}\\`: \\`${v}\\` is not a valid versioning scheme`,\n });\n }\n } else {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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 ? (config.allowedHeaders ?? [])\n : GlobalConfig.get('allowedHeaders');\n for (const rule of val as HostRule[]) {\n if (isNonEmptyString(rule.matchHost)) {\n if (rule.matchHost.includes('://')) {\n if (parseUrl(rule.matchHost) === null) {\n errors.push({\n topic: 'Configuration Error',\n message: `hostRules matchHost \\`${rule.matchHost}\\` is not a valid URL.`,\n });\n }\n }\n } else if (isEmptyString(rule.matchHost)) {\n errors.push({\n topic: 'Configuration Error',\n message:\n 'Invalid value for hostRules matchHost. It cannot be an empty string.',\n });\n }\n\n if (!rule.headers) {\n continue;\n }\n for (const [header, value] of Object.entries(rule.headers)) {\n if (!isString(value)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid hostRules headers value configuration: header must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(header, allowedHeaders)) {\n errors.push({\n topic: 'Configuration Error',\n message: `hostRules header \\`${header}\\` is not allowed by this bot'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: 'Configuration Error',\n message: `Invalid JSONata expression for ${currentPath}: ${res.message}`,\n });\n }\n }\n }\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 * 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 5 -- not testable yet */\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: 'Deprecation Warning',\n message: getDeprecationMessage(key)!,\n });\n }\n\n if (key === 'binarySource' && val === 'docker') {\n warnings.push({\n topic: 'Deprecation Warning',\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 (\n key === 'onboardingConfigFileName' &&\n !getPossibleConfigFileNames({\n configFileNames: config.configFileNames,\n platform: config.platform,\n }).includes(val)\n ) {\n warnings.push({\n topic: 'Configuration 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 } else if (\n key === 'repositoryCache' &&\n !['enabled', 'disabled', 'reset'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['enabled', 'disabled', 'reset'].join(', ')}.`,\n });\n } else if (\n key === 'dryRun' &&\n !['extract', 'lookup', 'full'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['extract', 'lookup', 'full'].join(', ')}.`,\n });\n } else if (\n key === 'binarySource' &&\n !['docker', 'global', 'install', 'hermit'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['docker', 'global', 'install', 'hermit'].join(', ')}.`,\n });\n } else if (\n key === 'requireConfig' &&\n !['required', 'optional', 'ignored'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['required', 'optional', 'ignored'].join(', ')}.`,\n });\n } else if (\n key === 'gitUrl' &&\n !['default', 'ssh', 'endpoint'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['default', 'ssh', 'endpoint'].join(', ')}.`,\n });\n }\n\n if (\n key === 'reportType' &&\n ['s3', 'file'].includes(val) &&\n !isString(config.reportPath)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `reportType '${val}' requires a configured reportPath`,\n });\n }\n } else {\n warnings.push({\n topic: 'Configuration 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: 'Configuration 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)) {\n if (isRegexOrGlobOption(key)) {\n warnings.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath: currentPath!,\n }),\n );\n }\n if (key === 'gitNoVerify') {\n const allowedValues = ['commit', 'push'];\n for (const value of val as string[]) {\n // v8 ignore else -- TODO: add test #40625\n if (!allowedValues.includes(value)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value for \\`${currentPath}\\`. The allowed values are ${allowedValues.join(', ')}.`,\n });\n }\n }\n }\n if (key === 'mergeConfidenceDatasources') {\n const allowedValues = supportedDatasources;\n for (const value of val as string[]) {\n // v8 ignore else -- TODO: add test #40625\n if (!allowedValues.includes(value)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${value}\\` for \\`${currentPath}\\`. The allowed values are ${allowedValues.join(', ')}.`,\n });\n }\n }\n }\n } else {\n warnings.push({\n topic: 'Configuration 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 const subValidation = await validateConfig('global', val);\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: 'Configuration Error',\n });\n }\n }\n } else {\n const res = validatePlainObject(val);\n if (res !== true) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${res}\\` configuration: value must be a string.`,\n });\n }\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a JSON object.`,\n });\n }\n }\n }\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation.js","names":["regexOrGlobValidator.check","matchBaseBranchesValidator.check"],"sources":["../../lib/config/validation.ts"],"sourcesContent":["import is, {\n isArray,\n isEmptyString,\n isNonEmptyArray,\n isNonEmptyString,\n isObject,\n isPlainObject,\n isString,\n isUndefined,\n} from '@sindresorhus/is';\nimport type { PlatformId } from '../constants/index.ts';\nimport { logger } from '../logger/index.ts';\nimport {\n AllManagersListLiteral,\n CustomManagersListLiteral,\n} 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 { packageCacheNamespaces } from '../util/cache/package/namespaces.ts';\nimport { getToolConfig } from '../util/exec/containerbase.ts';\nimport { isConstraintName, isToolName } from '../util/exec/types.ts';\nimport { getExpression } from '../util/jsonata.ts';\nimport { regEx } from '../util/regex.ts';\nimport {\n anyMatchRegexOrGlobList,\n getRegexPredicate,\n isRegexMatch,\n matchRegexOrGlobList,\n} from '../util/string-match.ts';\nimport * as template from '../util/template/index.ts';\nimport { parseUrl } from '../util/url.ts';\nimport {\n AllVersioningsListLiteral,\n type VersioningName,\n} from '../versioning-list.generated.ts';\nimport {\n hasValidSchedule,\n hasValidTimezone,\n} from '../workers/repository/update/branch/schedule.ts';\nimport { getConfigFileNames } from './app-strings.ts';\nimport { GlobalConfig } from './global.ts';\nimport { migrateConfig } from './migration.ts';\nimport { getOptions } from './options/index.ts';\nimport { resolveConfigPresets } from './presets/index.ts';\nimport { supportedDatasources } from './presets/internal/merge-confidence.preset.ts';\nimport { parsePreset } from './presets/parse.ts';\nimport type {\n AllConfig,\n AllowedParents,\n RenovateConfig,\n RenovateOptions,\n StatusCheckKey,\n ValidationMessage,\n ValidationResult,\n} from './types.ts';\nimport { allowedStatusCheckStrings } from './types.ts';\nimport * as matchBaseBranchesValidator from './validation-helpers/match-base-branches.ts';\nimport * as regexOrGlobValidator from './validation-helpers/regex-glob-matchers.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 optionGlobals: Set<string>;\nlet optionInherits: Set<string>;\nlet optionRegexOrGlob: Set<string>;\nlet optionAllowsNegativeIntegers: Set<string>;\nlet optionSupportsTemplating: Set<string>;\n\nconst managerList: readonly string[] = AllManagersListLiteral;\n\nconst allManagersList: readonly string[] = [\n ...AllManagersListLiteral,\n ...CustomManagersListLiteral,\n];\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\\((.+)\\)$/);\nconst rulesRe = regEx(/p.*Rules\\[\\d+\\]$/);\n\nfunction isIgnored(key: string): boolean {\n return ignoredNodes.includes(key);\n}\n\nfunction getUnsupportedEnabledManagers(enabledManagers: string[]): string[] {\n return enabledManagers.filter(\n (manager) => !allManagersList.includes(manager.replace('custom.', '')),\n );\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 optionInherits = new Set();\n optionTypes = {};\n optionRegexOrGlob = new Set();\n optionGlobals = new Set();\n optionAllowsNegativeIntegers = new Set();\n optionSupportsTemplating = new Set();\n\n for (const option of options) {\n optionTypes[option.name] = option.type;\n\n if (option.parents) {\n optionParents[option.name] = option.parents;\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\nexport async function validateConfig(\n configType: 'global' | 'inherit' | 'repo',\n config: AllConfig,\n isPreset?: boolean,\n parentPath?: string,\n): Promise<ValidationResult> {\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 7 -- TODO: add test */\n if (key === '__proto__') {\n errors.push({\n topic: 'Config security error',\n message: '__proto__',\n });\n continue;\n }\n if (\n parentPath &&\n parentPath !== 'onboardingConfig' &&\n topLevelObjects.includes(key)\n ) {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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 === 'enabledManagers' && val) {\n const unsupportedManagers = getUnsupportedEnabledManagers(\n val as string[],\n );\n if (isNonEmptyArray(unsupportedManagers)) {\n errors.push({\n topic: 'Configuration Error',\n message: `The following managers configured in enabledManagers are not supported: \"${unsupportedManagers.join(\n ', ',\n )}\"`,\n });\n }\n }\n if (key === 'registryUrls' && !parentPath && isNonEmptyArray(val)) {\n warnings.push({\n topic: 'Configuration 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 (key === 'defaultRegistryUrls' && !parentPath && isNonEmptyArray(val)) {\n warnings.push({\n topic: 'Configuration 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: 'Deprecation Warning',\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: 'Configuration Error',\n message: `Invalid template in config path: ${currentPath}`,\n });\n }\n }\n const parentName = getParentName(parentPath);\n if (\n !isPreset &&\n optionParents[key] &&\n !optionParents[key].includes(parentName as AllowedParents)\n ) {\n // TODO: types (#22198)\n const options = optionParents[key]?.toSorted().join(', ');\n const message = `\"${key}\" can't be used in \"${parentName}\". Allowed objects: ${options}.`;\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: 'Configuration Error',\n message: `Invalid configuration option: ${currentPath}`,\n });\n } else if (key === 'schedule') {\n const [validSchedule, errorMessage] = hasValidSchedule(val as string[]);\n if (!validSchedule) {\n errors.push({\n topic: 'Configuration 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: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${val}\\``,\n });\n }\n } else if (key === 'timezone' && val !== null) {\n const [validTimezone, errorMessage] = hasValidTimezone(val as string);\n if (!validTimezone) {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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(...validateNumber(key, val, allowsNegative, currentPath));\n } else if (type === 'array' && val) {\n if (isArray(val)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n configType,\n subval as RenovateConfig,\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 (configType !== 'global' && subval.startsWith('global:')) {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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: 'Configuration Error',\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n }\n if (!subval.includes('{{')) {\n try {\n parsePreset(subval);\n } catch {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: preset \"${subval}\" is not valid`,\n });\n }\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: preset value is not a string`,\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 '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 { config: resolved } = await resolveConfigPresets(\n packageRule as RenovateConfig,\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 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: 'Configuration Error',\n message,\n });\n }\n if (selectorLength === Object.keys(resolvedRule).length) {\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: 'Configuration 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 if (isNonEmptyArray(resolvedRule.matchUpdateTypes)) {\n for (const option of preLookupOptions) {\n if (resolvedRule[option] !== undefined) {\n const message = `${currentPath}[${subIndex}]: packageRules cannot combine both matchUpdateTypes and ${option}. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: 'Configuration Error',\n message,\n });\n }\n }\n }\n } else {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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: 'Configuration Error',\n message: `Each Custom Manager must contain a non-empty managerFilePatterns array`,\n });\n }\n } else {\n if (\n isEmptyString(customManager.customType) ||\n isUndefined(customManager.customType)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Each Custom Manager must contain a non-empty customType string`,\n });\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid customType: ${customManager.customType}. Key is not a custom manager`,\n });\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 (startPattern.test(pattern) && endPattern.test(pattern)) {\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: 'Configuration 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: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${baseBranchPattern}\\``,\n });\n }\n }\n }\n if (\n (selectors.includes(key) ||\n key === 'matchCurrentVersion' ||\n key === 'matchCurrentValue') &&\n // TODO: can be undefined ? #22198\n !rulesRe.test(parentPath!) && // Inside a packageRule\n (isString(parentPath) || !isPreset) // top level in a preset\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: ${key} should be inside a \\`packageRule\\` only`,\n });\n }\n } else {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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: 'Configuration 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 ? (config.allowedEnv ?? [])\n : GlobalConfig.get('allowedEnv');\n for (const [envVarName, envVarValue] of Object.entries(val)) {\n if (!isString(envVarValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid env variable value: \\`${currentPath}.${envVarName}\\` must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(envVarName, allowedEnvVars)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Env variable name \\`${envVarName}\\` is not allowed by this bot's \\`allowedEnv\\`.`,\n });\n }\n }\n } else if (key === 'statusCheckNames') {\n for (const [statusCheckKey, statusCheckValue] of Object.entries(\n val,\n )) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: 'Configuration 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: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: status check is not a string.`,\n });\n continue;\n }\n }\n } else if (key === 'customDatasources') {\n const allowedKeys = [\n 'description',\n 'defaultRegistryUrlTemplate',\n 'format',\n 'transformTemplates',\n ];\n for (const [\n customDatasourceName,\n customDatasourceValue,\n ] of Object.entries(val)) {\n if (!isPlainObject(customDatasourceValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${customDatasourceName}\\` configuration: customDatasource is not an object`,\n });\n continue;\n }\n for (const [subKey, subValue] of Object.entries(\n customDatasourceValue,\n )) {\n if (!allowedKeys.includes(subKey)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: key is not allowed`,\n });\n } else if (subKey === 'transformTemplates') {\n if (!isArray(subValue, isString)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is not an array of string`,\n });\n }\n } else if (subKey === 'description') {\n if (!(isString(subValue) || isArray(subValue, isString))) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is not an array of strings`,\n });\n }\n } else if (!isString(subValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is a string`,\n });\n }\n }\n }\n } else if (key === 'installTools') {\n for (const toolName of Object.keys(val)) {\n if (!isToolName(toolName)) {\n warnings.push({\n topic: 'Configuration 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: 'Configuration 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: 'Configuration 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: 'Configuration 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: 'Configuration 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: 'Configuration 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: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}=${v}\\`: \\`${v}\\` is not a valid versioning scheme`,\n });\n }\n } else {\n errors.push({\n topic: 'Configuration 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: 'Configuration 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 ? (config.allowedHeaders ?? [])\n : GlobalConfig.get('allowedHeaders');\n for (const rule of val as HostRule[]) {\n if (isNonEmptyString(rule.matchHost)) {\n if (rule.matchHost.includes('://')) {\n if (parseUrl(rule.matchHost) === null) {\n errors.push({\n topic: 'Configuration Error',\n message: `hostRules matchHost \\`${rule.matchHost}\\` is not a valid URL.`,\n });\n }\n }\n } else if (isEmptyString(rule.matchHost)) {\n errors.push({\n topic: 'Configuration Error',\n message:\n 'Invalid value for hostRules matchHost. It cannot be an empty string.',\n });\n }\n\n if (!rule.headers) {\n continue;\n }\n for (const [header, value] of Object.entries(rule.headers)) {\n if (!isString(value)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid hostRules headers value configuration: header must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(header, allowedHeaders)) {\n errors.push({\n topic: 'Configuration Error',\n message: `hostRules header \\`${header}\\` is not allowed by this bot'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: 'Configuration Error',\n message: `Invalid JSONata expression for ${currentPath}: ${res.message}`,\n });\n }\n }\n }\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 * 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 5 -- not testable yet */\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: 'Deprecation Warning',\n message: getDeprecationMessage(key)!,\n });\n }\n\n if (key === 'binarySource' && val === 'docker') {\n warnings.push({\n topic: 'Deprecation Warning',\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 (\n key === 'onboardingConfigFileName' &&\n !getPossibleConfigFileNames({\n configFileNames: config.configFileNames,\n platform: config.platform,\n }).includes(val)\n ) {\n warnings.push({\n topic: 'Configuration 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 } else if (\n key === 'repositoryCache' &&\n !['enabled', 'disabled', 'reset'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['enabled', 'disabled', 'reset'].join(', ')}.`,\n });\n } else if (\n key === 'dryRun' &&\n !['extract', 'lookup', 'full'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['extract', 'lookup', 'full'].join(', ')}.`,\n });\n } else if (\n key === 'binarySource' &&\n !['docker', 'global', 'install', 'hermit'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['docker', 'global', 'install', 'hermit'].join(', ')}.`,\n });\n } else if (\n key === 'requireConfig' &&\n !['required', 'optional', 'ignored'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['required', 'optional', 'ignored'].join(', ')}.`,\n });\n } else if (\n key === 'gitUrl' &&\n !['default', 'ssh', 'endpoint'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['default', 'ssh', 'endpoint'].join(', ')}.`,\n });\n }\n\n if (\n key === 'reportType' &&\n ['s3', 'file'].includes(val) &&\n !isString(config.reportPath)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `reportType '${val}' requires a configured reportPath`,\n });\n }\n } else {\n warnings.push({\n topic: 'Configuration 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: 'Configuration 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)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n 'global',\n subval as AllConfig,\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 if (key === 'gitNoVerify') {\n const allowedValues = ['commit', 'push'];\n for (const value of val as string[]) {\n // v8 ignore else -- TODO: add test #40625\n if (!allowedValues.includes(value)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value for \\`${currentPath}\\`. The allowed values are ${allowedValues.join(', ')}.`,\n });\n }\n }\n }\n if (key === 'mergeConfidenceDatasources') {\n const allowedValues = supportedDatasources;\n for (const value of val as string[]) {\n // v8 ignore else -- TODO: add test #40625\n if (!allowedValues.includes(value)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${value}\\` for \\`${currentPath}\\`. The allowed values are ${allowedValues.join(', ')}.`,\n });\n }\n }\n }\n } else {\n warnings.push({\n topic: 'Configuration 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 const subValidation = await validateConfig('global', val);\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: 'Configuration Error',\n });\n }\n }\n } else {\n const res = validatePlainObject(val);\n if (res !== true) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${res}\\` configuration: value must be a string.`,\n });\n }\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a JSON object.`,\n });\n }\n }\n }\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"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "renovate",
|
|
3
3
|
"description": "Automated dependency updates. Flexible so you don't need to be.",
|
|
4
|
-
"version": "43.214.
|
|
4
|
+
"version": "43.214.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -181,7 +181,7 @@
|
|
|
181
181
|
"p-throttle": "8.1.0",
|
|
182
182
|
"parse-link-header": "2.0.0",
|
|
183
183
|
"prettier": "3.8.1",
|
|
184
|
-
"protobufjs": "8.
|
|
184
|
+
"protobufjs": "8.5.0",
|
|
185
185
|
"punycode": "2.3.1",
|
|
186
186
|
"remark": "15.0.1",
|
|
187
187
|
"remark-gfm": "4.0.1",
|