renovate 44.37.0 → 44.38.0

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.
@@ -92,7 +92,11 @@ const managerDefaultConfigs = {
92
92
  "versioning": "maven"
93
93
  },
94
94
  "devbox": { "managerFilePatterns": ["/(^|/)devbox\\.json$/"] },
95
- "devcontainer": { "managerFilePatterns": ["/^.devcontainer/devcontainer.json$/", "/^.devcontainer.json$/"] },
95
+ "devcontainer": { "managerFilePatterns": [
96
+ "/^.devcontainer/devcontainer.json$/",
97
+ "/^.devcontainer.json$/",
98
+ "/^.devcontainer/[^/]+/devcontainer.json$/"
99
+ ] },
96
100
  "docker-compose": { "managerFilePatterns": ["/(^|/)(?:docker-)?compose[^/]*\\.ya?ml$/"] },
97
101
  "dockerfile": { "managerFilePatterns": ["/(^|/|\\.)([Dd]ocker|[Cc]ontainer)file$/", "/(^|/)([Dd]ocker|[Cc]ontainer)file[^/]*$/"] },
98
102
  "droneci": { "managerFilePatterns": ["/(^|/)\\.drone\\.yml$/"] },
@@ -1 +1 @@
1
- {"version":3,"file":"manager-default-configs.generated.js","names":[],"sources":["../lib/manager-default-configs.generated.ts"],"sourcesContent":["\nexport const managerDefaultConfigs: Record<string, Record<string, unknown>> = {\n \"ant\": {\n \"managerFilePatterns\": [\n \"**/build.xml\"\n ]\n },\n \"ansible\": {\n \"managerFilePatterns\": [\n \"/(^|/)tasks/[^/]+\\\\.ya?ml$/\"\n ]\n },\n \"ansible-galaxy\": {\n \"managerFilePatterns\": [\n \"/(^|/)(galaxy|requirements)(\\\\.ansible)?\\\\.ya?ml$/\"\n ]\n },\n \"argocd\": {\n \"managerFilePatterns\": []\n },\n \"asdf\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.tool-versions$/\"\n ]\n },\n \"azure-pipelines\": {\n \"managerFilePatterns\": [\n \"/(^|/).azuredevops/.+\\\\.ya?ml$/\",\n \"/azure.*pipelines?.*\\\\.ya?ml$/\"\n ],\n \"enabled\": false\n },\n \"batect\": {\n \"managerFilePatterns\": [\n \"/(^|/)batect(-bundle)?\\\\.ya?ml$/\"\n ]\n },\n \"batect-wrapper\": {\n \"managerFilePatterns\": [\n \"/(^|/)batect$/\"\n ],\n \"versioning\": \"semver\"\n },\n \"bazel\": {\n \"managerFilePatterns\": [\n \"/(^|/)WORKSPACE(|\\\\.bazel|\\\\.bzlmod)$/\",\n \"/\\\\.WORKSPACE\\\\.bazel$/\",\n \"/\\\\.bzl$/\"\n ]\n },\n \"bazel-module\": {\n \"managerFilePatterns\": [\n \"/(^|/|\\\\.)MODULE\\\\.bazel$/\"\n ]\n },\n \"bazelisk\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.bazelversion$/\"\n ],\n \"pinDigests\": false,\n \"versioning\": \"semver\"\n },\n \"bicep\": {\n \"managerFilePatterns\": [\n \"/\\\\.bicep$/\"\n ]\n },\n \"bitbucket-pipelines\": {\n \"managerFilePatterns\": [\n \"**/*-pipelines.yml\"\n ]\n },\n \"bitrise\": {\n \"managerFilePatterns\": [\n \"/(^|/)bitrise\\\\.ya?ml$/\"\n ]\n },\n \"buildkite\": {\n \"managerFilePatterns\": [\n \"/buildkite\\\\.ya?ml/\",\n \"/\\\\.buildkite/.+\\\\.ya?ml$/\"\n ],\n \"commitMessageTopic\": \"buildkite plugin {{depName}}\",\n \"commitMessageExtra\": \"to {{#if isMajor}}{{{prettyNewMajor}}}{{else}}{{{newValue}}}{{/if}}\"\n },\n \"buildpacks\": {\n \"commitMessageTopic\": \"buildpack {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)project\\\\.toml$/\"\n ],\n \"pinDigests\": false\n },\n \"bun\": {\n \"managerFilePatterns\": [\n \"/(^|/)bun\\\\.lockb?$/\",\n \"/(^|/)package\\\\.json$/\"\n ],\n \"digest\": {\n \"prBodyDefinitions\": {\n \"Change\": \"{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}\"\n }\n },\n \"prBodyDefinitions\": {\n \"Change\": \"[{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})\"\n }\n },\n \"bun-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.bun-version$/\"\n ],\n \"versioning\": \"npm\"\n },\n \"bundler\": {\n \"managerFilePatterns\": [\n \"/(^|/)Gemfile$/\"\n ],\n \"versioning\": \"ruby\"\n },\n \"cake\": {\n \"managerFilePatterns\": [\n \"/\\\\.cake$/\"\n ]\n },\n \"cargo\": {\n \"commitMessageTopic\": \"Rust crate {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)Cargo\\\\.toml$/\"\n ]\n },\n \"cdnurl\": {\n \"managerFilePatterns\": [],\n \"versioning\": \"semver\"\n },\n \"circleci\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.circleci/.+\\\\.ya?ml$/\"\n ]\n },\n \"cloudbuild\": {\n \"managerFilePatterns\": [\n \"/(^|/)cloudbuild\\\\.ya?ml/\"\n ]\n },\n \"cocoapods\": {\n \"managerFilePatterns\": [\n \"/(^|/)Podfile$/\"\n ],\n \"versioning\": \"ruby\"\n },\n \"composer\": {\n \"managerFilePatterns\": [\n \"/(^|/)([\\\\w-]*)composer\\\\.json$/\"\n ],\n \"versioning\": \"composer\"\n },\n \"conan\": {\n \"managerFilePatterns\": [\n \"/(^|/)conanfile\\\\.(txt|py)$/\"\n ],\n \"datasource\": \"conan\",\n \"versioning\": \"conan\"\n },\n \"copier\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.copier-answers(\\\\..+)?\\\\.ya?ml/\"\n ],\n \"versioning\": \"pep440\"\n },\n \"cpanfile\": {\n \"managerFilePatterns\": [\n \"/(^|/)cpanfile$/\"\n ]\n },\n \"crossplane\": {\n \"managerFilePatterns\": []\n },\n \"crow\": {\n \"managerFilePatterns\": [\n \"/^\\\\.crow(?:/[^/]+)?\\\\.ya?ml$/\"\n ]\n },\n \"deno\": {\n \"managerFilePatterns\": [\n \"/(^|/)deno\\\\.lock$/\",\n \"/(^|/)deno\\\\.(json|jsonc)$/\"\n ],\n \"digest\": {\n \"prBodyDefinitions\": {\n \"Change\": \"{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}\"\n }\n },\n \"prBodyDefinitions\": {\n \"Change\": \"{{#if (equals datasource \\\"npm\\\")}}[{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}}){{else}}{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}{{/if}}\"\n }\n },\n \"deps-edn\": {\n \"managerFilePatterns\": [\n \"/(^|/)(?:deps|bb)\\\\.edn$/\"\n ],\n \"versioning\": \"maven\"\n },\n \"devbox\": {\n \"managerFilePatterns\": [\n \"/(^|/)devbox\\\\.json$/\"\n ]\n },\n \"devcontainer\": {\n \"managerFilePatterns\": [\n \"/^.devcontainer/devcontainer.json$/\",\n \"/^.devcontainer.json$/\"\n ]\n },\n \"docker-compose\": {\n \"managerFilePatterns\": [\n \"/(^|/)(?:docker-)?compose[^/]*\\\\.ya?ml$/\"\n ]\n },\n \"dockerfile\": {\n \"managerFilePatterns\": [\n \"/(^|/|\\\\.)([Dd]ocker|[Cc]ontainer)file$/\",\n \"/(^|/)([Dd]ocker|[Cc]ontainer)file[^/]*$/\"\n ]\n },\n \"droneci\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.drone\\\\.yml$/\"\n ]\n },\n \"fleet\": {\n \"managerFilePatterns\": [\n \"/(^|/)fleet\\\\.ya?ml/\"\n ]\n },\n \"flux\": {\n \"managerFilePatterns\": [\n \"/(?:^|/)gotk-components\\\\.ya?ml$/\"\n ]\n },\n \"fvm\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.fvm/fvm_config\\\\.json$/\",\n \"/(^|/)\\\\.fvmrc$/\"\n ],\n \"versioning\": \"semver\"\n },\n \"git-submodules\": {\n \"enabled\": false,\n \"versioning\": \"git\",\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.gitmodules$/\"\n ]\n },\n \"github-actions\": {\n \"managerFilePatterns\": [\n \"/(^|/)(workflow-templates|\\\\.(?:github|gitea|forgejo)/(?:workflows|actions))/.+\\\\.ya?ml$/\",\n \"/(^|/)action\\\\.ya?ml$/\"\n ]\n },\n \"gitlabci\": {\n \"managerFilePatterns\": [\n \"/\\\\.gitlab-ci\\\\.ya?ml$/\"\n ]\n },\n \"gitlabci-include\": {\n \"managerFilePatterns\": [\n \"/\\\\.gitlab-ci\\\\.ya?ml$/\"\n ]\n },\n \"glasskube\": {\n \"managerFilePatterns\": []\n },\n \"gleam\": {\n \"managerFilePatterns\": [\n \"/(^|/)gleam.toml$/\"\n ],\n \"versioning\": \"hex\"\n },\n \"gomod\": {\n \"managerFilePatterns\": [\n \"/(^|/)go\\\\.mod$/\"\n ],\n \"pinDigests\": false\n },\n \"gradle\": {\n \"managerFilePatterns\": [\n \"/\\\\.gradle(\\\\.kts)?$/\",\n \"/(^|/)gradle\\\\.properties$/\",\n \"/(^|/)gradle/.+\\\\.toml$/\",\n \"/(^|/)buildSrc/.+\\\\.kt$/\",\n \"/\\\\.versions\\\\.toml$/\",\n \"/(^|/)versions.props$/\",\n \"/(^|/)versions.lock$/\"\n ],\n \"timeout\": 600,\n \"versioning\": \"gradle\"\n },\n \"gradle-wrapper\": {\n \"managerFilePatterns\": [\n \"/(^|/)gradle/wrapper/gradle-wrapper\\\\.properties$/\"\n ],\n \"versioning\": \"gradle\"\n },\n \"haskell-cabal\": {\n \"managerFilePatterns\": [\n \"/\\\\.cabal$/\"\n ],\n \"pinDigests\": false\n },\n \"helm-requirements\": {\n \"registryAliases\": {\n \"stable\": \"https://charts.helm.sh/stable\"\n },\n \"commitMessageTopic\": \"helm chart {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)requirements\\\\.ya?ml$/\"\n ]\n },\n \"helm-values\": {\n \"commitMessageTopic\": \"helm values {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)values\\\\.ya?ml$/\"\n ],\n \"pinDigests\": false\n },\n \"helmfile\": {\n \"registryAliases\": {\n \"stable\": \"https://charts.helm.sh/stable\"\n },\n \"commitMessageTopic\": \"helm chart {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)helmfile\\\\.ya?ml(?:\\\\.gotmpl)?$/\",\n \"/(^|/)helmfile\\\\.d/.+\\\\.ya?ml(?:\\\\.gotmpl)?$/\"\n ]\n },\n \"helmsman\": {\n \"managerFilePatterns\": []\n },\n \"helmv3\": {\n \"registryAliases\": {\n \"stable\": \"https://charts.helm.sh/stable\"\n },\n \"commitMessageTopic\": \"helm chart {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)Chart\\\\.ya?ml$/\"\n ]\n },\n \"hermit\": {\n \"managerFilePatterns\": [\n \"/(^|/)bin/hermit$/\"\n ],\n \"excludeCommitPaths\": [\n \"**/bin/hermit\"\n ],\n \"versioning\": \"hermit\"\n },\n \"homeassistant-manifest\": {\n \"managerFilePatterns\": [\n \"/(^|/)manifest\\\\.json$/\"\n ]\n },\n \"homebrew\": {\n \"commitMessageTopic\": \"Homebrew Formula {{depName}}\",\n \"managerFilePatterns\": [\n \"/^Formula/\\\\w*/?[^/]+[.]rb$/\"\n ]\n },\n \"html\": {\n \"managerFilePatterns\": [\n \"/\\\\.html?$/\"\n ],\n \"versioning\": \"semver\",\n \"digest\": {\n \"enabled\": false\n },\n \"pinDigests\": false\n },\n \"jenkins\": {\n \"managerFilePatterns\": [\n \"/(^|/)plugins\\\\.(txt|ya?ml)$/\"\n ]\n },\n \"jsonnet-bundler\": {\n \"managerFilePatterns\": [\n \"/(^|/)jsonnetfile\\\\.json$/\"\n ],\n \"datasource\": \"git-tags\"\n },\n \"kotlin-script\": {\n \"managerFilePatterns\": [\n \"/^.+\\\\.main\\\\.kts$/\"\n ]\n },\n \"kubernetes\": {\n \"managerFilePatterns\": []\n },\n \"kustomize\": {\n \"managerFilePatterns\": [\n \"/(^|/)kustomization\\\\.ya?ml$/\"\n ],\n \"pinDigests\": false\n },\n \"leiningen\": {\n \"managerFilePatterns\": [\n \"/(^|/)project\\\\.clj$/\"\n ],\n \"versioning\": \"maven\"\n },\n \"maven\": {\n \"managerFilePatterns\": [\n \"/(^|/|\\\\.)pom\\\\.xml$/\",\n \"/(^|/)pom\\\\.template\\\\.xml$/\",\n \"/^(((\\\\.mvn)|(\\\\.m2))/)?settings\\\\.xml$/\",\n \"/(^|/)\\\\.mvn/extensions\\\\.xml$/\"\n ]\n },\n \"maven-wrapper\": {\n \"managerFilePatterns\": [\n \"/(^|\\\\/).mvn/wrapper/maven-wrapper.properties$/\",\n \"/(^|\\\\/)mvnw(.cmd)?$/\"\n ]\n },\n \"meteor\": {\n \"managerFilePatterns\": [\n \"/(^|/)package\\\\.js$/\"\n ]\n },\n \"mint\": {\n \"managerFilePatterns\": [\n \"/(^|/)Mintfile$/\"\n ]\n },\n \"mise\": {\n \"managerFilePatterns\": [\n \"**/{,.}mise{,.*}.toml\",\n \"**/{,.}mise/config{,.*}.toml\",\n \"**/.config/mise{,.*}.toml\",\n \"**/.config/mise/{mise,config}{,.*}.toml\",\n \"**/.config/mise/conf.d/*.toml\",\n \"**/.rtx{,.*}.toml\"\n ],\n \"pinDigests\": false\n },\n \"mix\": {\n \"managerFilePatterns\": [\n \"/(^|/)mix\\\\.exs$/\"\n ]\n },\n \"nix\": {\n \"managerFilePatterns\": [\n \"/(^|/)flake\\\\.nix$/\"\n ],\n \"commitMessageTopic\": \"nix\",\n \"commitMessageExtra\": \"to {{newValue}}\",\n \"enabled\": false\n },\n \"nodenv\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.node-version$/\"\n ],\n \"versioning\": \"node\"\n },\n \"npm\": {\n \"managerFilePatterns\": [\n \"/(^|/)package\\\\.json$/\",\n \"/(^|/)pnpm-workspace\\\\.yaml$/\",\n \"/(^|/)\\\\.yarnrc\\\\.yml$/\"\n ],\n \"digest\": {\n \"prBodyDefinitions\": {\n \"Change\": \"{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}\"\n }\n },\n \"prBodyDefinitions\": {\n \"Change\": \"[{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})\"\n }\n },\n \"nuget\": {\n \"managerFilePatterns\": [\n \"/\\\\.(?:cs|fs|vb|sql)proj$/\",\n \"/\\\\.(?:props|targets)$/\",\n \"/(^|/)dotnet-tools\\\\.json$/\",\n \"/(^|/)global\\\\.json$/\"\n ],\n \"rangeStrategy\": \"bump\",\n \"packageRules\": [\n {\n \"matchDepTypes\": [\n \"msbuild-sdk\"\n ],\n \"rangeStrategy\": \"bump\"\n }\n ]\n },\n \"nvm\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.nvmrc$/\"\n ],\n \"versioning\": \"node\",\n \"pinDigests\": false\n },\n \"ocb\": {\n \"managerFilePatterns\": []\n },\n \"osgi\": {\n \"managerFilePatterns\": [\n \"/(^|/)src/main/features/.+\\\\.json$/\"\n ]\n },\n \"pep621\": {\n \"managerFilePatterns\": [\n \"/(^|/)pyproject\\\\.toml$/\"\n ]\n },\n \"pep723\": {\n \"managerFilePatterns\": []\n },\n \"pip-compile\": {\n \"managerFilePatterns\": [],\n \"lockFileMaintenance\": {\n \"enabled\": true,\n \"branchTopic\": \"pip-compile-refresh\",\n \"commitMessageAction\": \"Refresh pip-compile outputs\"\n }\n },\n \"pip_requirements\": {\n \"managerFilePatterns\": [\n \"/(^|/)[\\\\w-]*requirements([-._]\\\\w+)?\\\\.(txt|pip)$/\"\n ]\n },\n \"pip_setup\": {\n \"managerFilePatterns\": [\n \"/(^|/)setup\\\\.py$/\"\n ]\n },\n \"pipenv\": {\n \"managerFilePatterns\": [\n \"/(^|/)Pipfile$/\"\n ]\n },\n \"pixi\": {\n \"managerFilePatterns\": [\n \"/(^|/)pyproject\\\\.toml$/\",\n \"/(^|/)pixi\\\\.toml$/\"\n ]\n },\n \"poetry\": {\n \"managerFilePatterns\": [\n \"/(^|/)pyproject\\\\.toml$/\"\n ]\n },\n \"pre-commit\": {\n \"commitMessageTopic\": \"pre-commit hook {{depName}}\",\n \"enabled\": false,\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.pre-commit-config\\\\.ya?ml$/\"\n ],\n \"prBodyNotes\": [\n \"Note: The `pre-commit` manager in Renovate is not supported by the `pre-commit` maintainers or community. Please do not report any problems there, instead [create a Discussion in the Renovate repository](https://github.com/renovatebot/renovate/discussions/new) if you have any questions.\"\n ]\n },\n \"proto\": {\n \"managerFilePatterns\": [\n \"**/.prototools\"\n ]\n },\n \"pub\": {\n \"managerFilePatterns\": [\n \"/(^|/)pubspec\\\\.ya?ml$/\"\n ]\n },\n \"puppet\": {\n \"managerFilePatterns\": [\n \"/(^|/)Puppetfile$/\"\n ]\n },\n \"pyenv\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.python-version$/\"\n ],\n \"versioning\": \"docker\",\n \"pinDigests\": false\n },\n \"quadlet\": {\n \"managerFilePatterns\": [\n \"/.+\\\\.container$/\",\n \"/.+\\\\.image$/\",\n \"/.+\\\\.volume$/\"\n ]\n },\n \"renovate-config\": {\n \"managerFilePatterns\": [\n \"renovate.json\",\n \"renovate.jsonc\",\n \"renovate.json5\",\n \".github/renovate.json\",\n \".github/renovate.jsonc\",\n \".github/renovate.json5\",\n \".gitlab/renovate.json\",\n \".gitlab/renovate.jsonc\",\n \".gitlab/renovate.json5\",\n \".renovaterc\",\n \".renovaterc.json\",\n \".renovaterc.jsonc\",\n \".renovaterc.json5\"\n ]\n },\n \"ruby-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.ruby-version$/\"\n ],\n \"versioning\": \"ruby\"\n },\n \"runtime-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)runtime.txt$/\"\n ],\n \"pinDigests\": false\n },\n \"rust-toolchain\": {\n \"commitMessageTopic\": \"Rust\",\n \"managerFilePatterns\": [\n \"/(^|/)rust-toolchain(\\\\.toml)?$/\"\n ]\n },\n \"sbt\": {\n \"managerFilePatterns\": [\n \"/\\\\.sbt$/\",\n \"/project/[^/]*\\\\.scala$/\",\n \"/project/build\\\\.properties$/\",\n \"/(^|/)repositories$/\"\n ],\n \"versioning\": \"ivy\"\n },\n \"scalafmt\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.scalafmt.conf$/\"\n ]\n },\n \"setup-cfg\": {\n \"managerFilePatterns\": [\n \"/(^|/)setup\\\\.cfg$/\"\n ],\n \"versioning\": \"pep440\"\n },\n \"smithy\": {\n \"managerFilePatterns\": [\n \"/(^|/)smithy-build\\\\.json$/\"\n ]\n },\n \"sveltos\": {\n \"managerFilePatterns\": []\n },\n \"swift\": {\n \"managerFilePatterns\": [\n \"/(^|/)Package\\\\.swift/\"\n ],\n \"versioning\": \"swift\",\n \"pinDigests\": false\n },\n \"tekton\": {\n \"managerFilePatterns\": []\n },\n \"terraform\": {\n \"commitMessageTopic\": \"Terraform {{depName}}\",\n \"managerFilePatterns\": [\n \"**/*.tf\",\n \"**/*.tofu\"\n ],\n \"pinDigests\": false\n },\n \"terraform-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.terraform-version$/\"\n ],\n \"versioning\": \"hashicorp\",\n \"extractVersion\": \"^v(?<version>.*)$\"\n },\n \"terragrunt\": {\n \"commitMessageTopic\": \"Terragrunt dependency {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)terragrunt\\\\.hcl$/\"\n ]\n },\n \"terragrunt-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.terragrunt-version$/\"\n ],\n \"versioning\": \"hashicorp\",\n \"extractVersion\": \"^v(?<version>.+)$\"\n },\n \"tflint-plugin\": {\n \"commitMessageTopic\": \"TFLint plugin {{depName}}\",\n \"managerFilePatterns\": [\n \"/\\\\.tflint\\\\.hcl$/\"\n ],\n \"extractVersion\": \"^v(?<version>.*)$\"\n },\n \"travis\": {\n \"managerFilePatterns\": [\n \"/^\\\\.travis\\\\.ya?ml$/\"\n ],\n \"major\": {\n \"enabled\": false\n },\n \"versioning\": \"node\"\n },\n \"typst\": {\n \"managerFilePatterns\": [\n \"/\\\\.typ$/\"\n ]\n },\n \"unity3d\": {\n \"managerFilePatterns\": [\n \"**/ProjectSettings/ProjectVersion.txt\"\n ]\n },\n \"velaci\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.vela\\\\.ya?ml$/\"\n ]\n },\n \"vendir\": {\n \"commitMessageTopic\": \"vendir {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)vendir\\\\.yml$/\"\n ]\n },\n \"woodpecker\": {\n \"managerFilePatterns\": [\n \"/^\\\\.woodpecker(?:/[^/]+)?\\\\.ya?ml$/\"\n ]\n },\n \"xcodegen\": {\n \"managerFilePatterns\": [\n \"**/project.yml\"\n ],\n \"pinDigests\": false\n },\n \"regex\": {\n \"pinDigests\": false\n },\n \"jsonata\": {\n \"pinDigests\": false\n }\n};\n"],"mappings":";AACA,MAAa,wBAAiE;CAC5E,OAAO,EACL,uBAAuB,CACrB,cACF,EACF;CACA,WAAW,EACT,uBAAuB,CACrB,6BACF,EACF;CACA,kBAAkB,EAChB,uBAAuB,CACrB,oDACF,EACF;CACA,UAAU,EACR,uBAAuB,CAAC,EAC1B;CACA,QAAQ,EACN,uBAAuB,CACrB,0BACF,EACF;CACA,mBAAmB;EACjB,uBAAuB,CACrB,mCACA,gCACF;EACA,WAAW;CACb;CACA,UAAU,EACR,uBAAuB,CACrB,kCACF,EACF;CACA,kBAAkB;EAChB,uBAAuB,CACrB,gBACF;EACA,cAAc;CAChB;CACA,SAAS,EACP,uBAAuB;EACrB;EACA;EACA;CACF,EACF;CACA,gBAAgB,EACd,uBAAuB,CACrB,4BACF,EACF;CACA,YAAY;EACV,uBAAuB,CACrB,yBACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,SAAS,EACP,uBAAuB,CACrB,aACF,EACF;CACA,uBAAuB,EACrB,uBAAuB,CACrB,oBACF,EACF;CACA,WAAW,EACT,uBAAuB,CACrB,yBACF,EACF;CACA,aAAa;EACX,uBAAuB,CACrB,uBACA,4BACF;EACA,sBAAsB;EACtB,sBAAsB;CACxB;CACA,cAAc;EACZ,sBAAsB;EACtB,uBAAuB,CACrB,wBACF;EACA,cAAc;CAChB;CACA,OAAO;EACL,uBAAuB,CACrB,wBACA,wBACF;EACA,UAAU,EACR,qBAAqB,EACnB,UAAU,8KACZ,EACF;EACA,qBAAqB,EACnB,UAAU,6SACZ;CACF;CACA,eAAe;EACb,uBAAuB,CACrB,wBACF;EACA,cAAc;CAChB;CACA,WAAW;EACT,uBAAuB,CACrB,iBACF;EACA,cAAc;CAChB;CACA,QAAQ,EACN,uBAAuB,CACrB,YACF,EACF;CACA,SAAS;EACP,sBAAsB;EACtB,uBAAuB,CACrB,sBACF;CACF;CACA,UAAU;EACR,uBAAuB,CAAC;EACxB,cAAc;CAChB;CACA,YAAY,EACV,uBAAuB,CACrB,gCACF,EACF;CACA,cAAc,EACZ,uBAAuB,CACrB,2BACF,EACF;CACA,aAAa;EACX,uBAAuB,CACrB,iBACF;EACA,cAAc;CAChB;CACA,YAAY;EACV,uBAAuB,CACrB,kCACF;EACA,cAAc;CAChB;CACA,SAAS;EACP,uBAAuB,CACrB,8BACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,UAAU;EACR,uBAAuB,CACrB,0CACF;EACA,cAAc;CAChB;CACA,YAAY,EACV,uBAAuB,CACrB,kBACF,EACF;CACA,cAAc,EACZ,uBAAuB,CAAC,EAC1B;CACA,QAAQ,EACN,uBAAuB,CACrB,gCACF,EACF;CACA,QAAQ;EACN,uBAAuB,CACrB,uBACA,6BACF;EACA,UAAU,EACR,qBAAqB,EACnB,UAAU,gLACZ,EACF;EACA,qBAAqB,EACnB,UAAU,8gBACZ;CACF;CACA,YAAY;EACV,uBAAuB,CACrB,2BACF;EACA,cAAc;CAChB;CACA,UAAU,EACR,uBAAuB,CACrB,uBACF,EACF;CACA,gBAAgB,EACd,uBAAuB,CACrB,uCACA,wBACF,EACF;CACA,kBAAkB,EAChB,uBAAuB,CACrB,0CACF,EACF;CACA,cAAc,EACZ,uBAAuB,CACrB,4CACA,2CACF,EACF;CACA,WAAW,EACT,uBAAuB,CACrB,wBACF,EACF;CACA,SAAS,EACP,uBAAuB,CACrB,sBACF,EACF;CACA,QAAQ,EACN,uBAAuB,CACrB,mCACF,EACF;CACA,OAAO;EACL,uBAAuB,CACrB,oCACA,kBACF;EACA,cAAc;CAChB;CACA,kBAAkB;EAChB,WAAW;EACX,cAAc;EACd,uBAAuB,CACrB,uBACF;CACF;CACA,kBAAkB,EAChB,uBAAuB,CACrB,6FACA,wBACF,EACF;CACA,YAAY,EACV,uBAAuB,CACrB,yBACF,EACF;CACA,oBAAoB,EAClB,uBAAuB,CACrB,yBACF,EACF;CACA,aAAa,EACX,uBAAuB,CAAC,EAC1B;CACA,SAAS;EACP,uBAAuB,CACrB,oBACF;EACA,cAAc;CAChB;CACA,SAAS;EACP,uBAAuB,CACrB,kBACF;EACA,cAAc;CAChB;CACA,UAAU;EACR,uBAAuB;GACrB;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,WAAW;EACX,cAAc;CAChB;CACA,kBAAkB;EAChB,uBAAuB,CACrB,oDACF;EACA,cAAc;CAChB;CACA,iBAAiB;EACf,uBAAuB,CACrB,aACF;EACA,cAAc;CAChB;CACA,qBAAqB;EACnB,mBAAmB,EACjB,UAAU,gCACZ;EACA,sBAAsB;EACtB,uBAAuB,CACrB,8BACF;CACF;CACA,eAAe;EACb,sBAAsB;EACtB,uBAAuB,CACrB,wBACF;EACA,cAAc;CAChB;CACA,YAAY;EACV,mBAAmB,EACjB,UAAU,gCACZ;EACA,sBAAsB;EACtB,uBAAuB,CACrB,0CACA,+CACF;CACF;CACA,YAAY,EACV,uBAAuB,CAAC,EAC1B;CACA,UAAU;EACR,mBAAmB,EACjB,UAAU,gCACZ;EACA,sBAAsB;EACtB,uBAAuB,CACrB,uBACF;CACF;CACA,UAAU;EACR,uBAAuB,CACrB,oBACF;EACA,sBAAsB,CACpB,eACF;EACA,cAAc;CAChB;CACA,0BAA0B,EACxB,uBAAuB,CACrB,yBACF,EACF;CACA,YAAY;EACV,sBAAsB;EACtB,uBAAuB,CACrB,8BACF;CACF;CACA,QAAQ;EACN,uBAAuB,CACrB,aACF;EACA,cAAc;EACd,UAAU,EACR,WAAW,MACb;EACA,cAAc;CAChB;CACA,WAAW,EACT,uBAAuB,CACrB,+BACF,EACF;CACA,mBAAmB;EACjB,uBAAuB,CACrB,4BACF;EACA,cAAc;CAChB;CACA,iBAAiB,EACf,uBAAuB,CACrB,qBACF,EACF;CACA,cAAc,EACZ,uBAAuB,CAAC,EAC1B;CACA,aAAa;EACX,uBAAuB,CACrB,+BACF;EACA,cAAc;CAChB;CACA,aAAa;EACX,uBAAuB,CACrB,uBACF;EACA,cAAc;CAChB;CACA,SAAS,EACP,uBAAuB;EACrB;EACA;EACA;EACA;CACF,EACF;CACA,iBAAiB,EACf,uBAAuB,CACrB,mDACA,uBACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,sBACF,EACF;CACA,QAAQ,EACN,uBAAuB,CACrB,kBACF,EACF;CACA,QAAQ;EACN,uBAAuB;GACrB;GACA;GACA;GACA;GACA;GACA;EACF;EACA,cAAc;CAChB;CACA,OAAO,EACL,uBAAuB,CACrB,mBACF,EACF;CACA,OAAO;EACL,uBAAuB,CACrB,qBACF;EACA,sBAAsB;EACtB,sBAAsB;EACtB,WAAW;CACb;CACA,UAAU;EACR,uBAAuB,CACrB,yBACF;EACA,cAAc;CAChB;CACA,OAAO;EACL,uBAAuB;GACrB;GACA;GACA;EACF;EACA,UAAU,EACR,qBAAqB,EACnB,UAAU,8KACZ,EACF;EACA,qBAAqB,EACnB,UAAU,6SACZ;CACF;CACA,SAAS;EACP,uBAAuB;GACrB;GACA;GACA;GACA;EACF;EACA,iBAAiB;EACjB,gBAAgB,CACd;GACE,iBAAiB,CACf,aACF;GACA,iBAAiB;EACnB,CACF;CACF;CACA,OAAO;EACL,uBAAuB,CACrB,kBACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,OAAO,EACL,uBAAuB,CAAC,EAC1B;CACA,QAAQ,EACN,uBAAuB,CACrB,qCACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,0BACF,EACF;CACA,UAAU,EACR,uBAAuB,CAAC,EAC1B;CACA,eAAe;EACb,uBAAuB,CAAC;EACxB,uBAAuB;GACrB,WAAW;GACX,eAAe;GACf,uBAAuB;EACzB;CACF;CACA,oBAAoB,EAClB,uBAAuB,CACrB,qDACF,EACF;CACA,aAAa,EACX,uBAAuB,CACrB,oBACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,iBACF,EACF;CACA,QAAQ,EACN,uBAAuB,CACrB,4BACA,qBACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,0BACF,EACF;CACA,cAAc;EACZ,sBAAsB;EACtB,WAAW;EACX,uBAAuB,CACrB,sCACF;EACA,eAAe,CACb,iSACF;CACF;CACA,SAAS,EACP,uBAAuB,CACrB,gBACF,EACF;CACA,OAAO,EACL,uBAAuB,CACrB,yBACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,oBACF,EACF;CACA,SAAS;EACP,uBAAuB,CACrB,2BACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,WAAW,EACT,uBAAuB;EACrB;EACA;EACA;CACF,EACF;CACA,mBAAmB,EACjB,uBAAuB;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,EACF;CACA,gBAAgB;EACd,uBAAuB,CACrB,yBACF;EACA,cAAc;CAChB;CACA,mBAAmB;EACjB,uBAAuB,CACrB,qBACF;EACA,cAAc;CAChB;CACA,kBAAkB;EAChB,sBAAsB;EACtB,uBAAuB,CACrB,kCACF;CACF;CACA,OAAO;EACL,uBAAuB;GACrB;GACA;GACA;GACA;EACF;EACA,cAAc;CAChB;CACA,YAAY,EACV,uBAAuB,CACrB,0BACF,EACF;CACA,aAAa;EACX,uBAAuB,CACrB,qBACF;EACA,cAAc;CAChB;CACA,UAAU,EACR,uBAAuB,CACrB,6BACF,EACF;CACA,WAAW,EACT,uBAAuB,CAAC,EAC1B;CACA,SAAS;EACP,uBAAuB,CACrB,wBACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,UAAU,EACR,uBAAuB,CAAC,EAC1B;CACA,aAAa;EACX,sBAAsB;EACtB,uBAAuB,CACrB,WACA,WACF;EACA,cAAc;CAChB;CACA,qBAAqB;EACnB,uBAAuB,CACrB,8BACF;EACA,cAAc;EACd,kBAAkB;CACpB;CACA,cAAc;EACZ,sBAAsB;EACtB,uBAAuB,CACrB,0BACF;CACF;CACA,sBAAsB;EACpB,uBAAuB,CACrB,+BACF;EACA,cAAc;EACd,kBAAkB;CACpB;CACA,iBAAiB;EACf,sBAAsB;EACtB,uBAAuB,CACrB,oBACF;EACA,kBAAkB;CACpB;CACA,UAAU;EACR,uBAAuB,CACrB,uBACF;EACA,SAAS,EACP,WAAW,MACb;EACA,cAAc;CAChB;CACA,SAAS,EACP,uBAAuB,CACrB,WACF,EACF;CACA,WAAW,EACT,uBAAuB,CACrB,uCACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,yBACF,EACF;CACA,UAAU;EACR,sBAAsB;EACtB,uBAAuB,CACrB,sBACF;CACF;CACA,cAAc,EACZ,uBAAuB,CACrB,sCACF,EACF;CACA,YAAY;EACV,uBAAuB,CACrB,gBACF;EACA,cAAc;CAChB;CACA,SAAS,EACP,cAAc,MAChB;CACA,WAAW,EACT,cAAc,MAChB;AACF"}
1
+ {"version":3,"file":"manager-default-configs.generated.js","names":[],"sources":["../lib/manager-default-configs.generated.ts"],"sourcesContent":["\nexport const managerDefaultConfigs: Record<string, Record<string, unknown>> = {\n \"ant\": {\n \"managerFilePatterns\": [\n \"**/build.xml\"\n ]\n },\n \"ansible\": {\n \"managerFilePatterns\": [\n \"/(^|/)tasks/[^/]+\\\\.ya?ml$/\"\n ]\n },\n \"ansible-galaxy\": {\n \"managerFilePatterns\": [\n \"/(^|/)(galaxy|requirements)(\\\\.ansible)?\\\\.ya?ml$/\"\n ]\n },\n \"argocd\": {\n \"managerFilePatterns\": []\n },\n \"asdf\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.tool-versions$/\"\n ]\n },\n \"azure-pipelines\": {\n \"managerFilePatterns\": [\n \"/(^|/).azuredevops/.+\\\\.ya?ml$/\",\n \"/azure.*pipelines?.*\\\\.ya?ml$/\"\n ],\n \"enabled\": false\n },\n \"batect\": {\n \"managerFilePatterns\": [\n \"/(^|/)batect(-bundle)?\\\\.ya?ml$/\"\n ]\n },\n \"batect-wrapper\": {\n \"managerFilePatterns\": [\n \"/(^|/)batect$/\"\n ],\n \"versioning\": \"semver\"\n },\n \"bazel\": {\n \"managerFilePatterns\": [\n \"/(^|/)WORKSPACE(|\\\\.bazel|\\\\.bzlmod)$/\",\n \"/\\\\.WORKSPACE\\\\.bazel$/\",\n \"/\\\\.bzl$/\"\n ]\n },\n \"bazel-module\": {\n \"managerFilePatterns\": [\n \"/(^|/|\\\\.)MODULE\\\\.bazel$/\"\n ]\n },\n \"bazelisk\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.bazelversion$/\"\n ],\n \"pinDigests\": false,\n \"versioning\": \"semver\"\n },\n \"bicep\": {\n \"managerFilePatterns\": [\n \"/\\\\.bicep$/\"\n ]\n },\n \"bitbucket-pipelines\": {\n \"managerFilePatterns\": [\n \"**/*-pipelines.yml\"\n ]\n },\n \"bitrise\": {\n \"managerFilePatterns\": [\n \"/(^|/)bitrise\\\\.ya?ml$/\"\n ]\n },\n \"buildkite\": {\n \"managerFilePatterns\": [\n \"/buildkite\\\\.ya?ml/\",\n \"/\\\\.buildkite/.+\\\\.ya?ml$/\"\n ],\n \"commitMessageTopic\": \"buildkite plugin {{depName}}\",\n \"commitMessageExtra\": \"to {{#if isMajor}}{{{prettyNewMajor}}}{{else}}{{{newValue}}}{{/if}}\"\n },\n \"buildpacks\": {\n \"commitMessageTopic\": \"buildpack {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)project\\\\.toml$/\"\n ],\n \"pinDigests\": false\n },\n \"bun\": {\n \"managerFilePatterns\": [\n \"/(^|/)bun\\\\.lockb?$/\",\n \"/(^|/)package\\\\.json$/\"\n ],\n \"digest\": {\n \"prBodyDefinitions\": {\n \"Change\": \"{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}\"\n }\n },\n \"prBodyDefinitions\": {\n \"Change\": \"[{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})\"\n }\n },\n \"bun-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.bun-version$/\"\n ],\n \"versioning\": \"npm\"\n },\n \"bundler\": {\n \"managerFilePatterns\": [\n \"/(^|/)Gemfile$/\"\n ],\n \"versioning\": \"ruby\"\n },\n \"cake\": {\n \"managerFilePatterns\": [\n \"/\\\\.cake$/\"\n ]\n },\n \"cargo\": {\n \"commitMessageTopic\": \"Rust crate {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)Cargo\\\\.toml$/\"\n ]\n },\n \"cdnurl\": {\n \"managerFilePatterns\": [],\n \"versioning\": \"semver\"\n },\n \"circleci\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.circleci/.+\\\\.ya?ml$/\"\n ]\n },\n \"cloudbuild\": {\n \"managerFilePatterns\": [\n \"/(^|/)cloudbuild\\\\.ya?ml/\"\n ]\n },\n \"cocoapods\": {\n \"managerFilePatterns\": [\n \"/(^|/)Podfile$/\"\n ],\n \"versioning\": \"ruby\"\n },\n \"composer\": {\n \"managerFilePatterns\": [\n \"/(^|/)([\\\\w-]*)composer\\\\.json$/\"\n ],\n \"versioning\": \"composer\"\n },\n \"conan\": {\n \"managerFilePatterns\": [\n \"/(^|/)conanfile\\\\.(txt|py)$/\"\n ],\n \"datasource\": \"conan\",\n \"versioning\": \"conan\"\n },\n \"copier\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.copier-answers(\\\\..+)?\\\\.ya?ml/\"\n ],\n \"versioning\": \"pep440\"\n },\n \"cpanfile\": {\n \"managerFilePatterns\": [\n \"/(^|/)cpanfile$/\"\n ]\n },\n \"crossplane\": {\n \"managerFilePatterns\": []\n },\n \"crow\": {\n \"managerFilePatterns\": [\n \"/^\\\\.crow(?:/[^/]+)?\\\\.ya?ml$/\"\n ]\n },\n \"deno\": {\n \"managerFilePatterns\": [\n \"/(^|/)deno\\\\.lock$/\",\n \"/(^|/)deno\\\\.(json|jsonc)$/\"\n ],\n \"digest\": {\n \"prBodyDefinitions\": {\n \"Change\": \"{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}\"\n }\n },\n \"prBodyDefinitions\": {\n \"Change\": \"{{#if (equals datasource \\\"npm\\\")}}[{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}}){{else}}{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}{{/if}}\"\n }\n },\n \"deps-edn\": {\n \"managerFilePatterns\": [\n \"/(^|/)(?:deps|bb)\\\\.edn$/\"\n ],\n \"versioning\": \"maven\"\n },\n \"devbox\": {\n \"managerFilePatterns\": [\n \"/(^|/)devbox\\\\.json$/\"\n ]\n },\n \"devcontainer\": {\n \"managerFilePatterns\": [\n \"/^.devcontainer/devcontainer.json$/\",\n \"/^.devcontainer.json$/\",\n \"/^.devcontainer/[^/]+/devcontainer.json$/\"\n ]\n },\n \"docker-compose\": {\n \"managerFilePatterns\": [\n \"/(^|/)(?:docker-)?compose[^/]*\\\\.ya?ml$/\"\n ]\n },\n \"dockerfile\": {\n \"managerFilePatterns\": [\n \"/(^|/|\\\\.)([Dd]ocker|[Cc]ontainer)file$/\",\n \"/(^|/)([Dd]ocker|[Cc]ontainer)file[^/]*$/\"\n ]\n },\n \"droneci\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.drone\\\\.yml$/\"\n ]\n },\n \"fleet\": {\n \"managerFilePatterns\": [\n \"/(^|/)fleet\\\\.ya?ml/\"\n ]\n },\n \"flux\": {\n \"managerFilePatterns\": [\n \"/(?:^|/)gotk-components\\\\.ya?ml$/\"\n ]\n },\n \"fvm\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.fvm/fvm_config\\\\.json$/\",\n \"/(^|/)\\\\.fvmrc$/\"\n ],\n \"versioning\": \"semver\"\n },\n \"git-submodules\": {\n \"enabled\": false,\n \"versioning\": \"git\",\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.gitmodules$/\"\n ]\n },\n \"github-actions\": {\n \"managerFilePatterns\": [\n \"/(^|/)(workflow-templates|\\\\.(?:github|gitea|forgejo)/(?:workflows|actions))/.+\\\\.ya?ml$/\",\n \"/(^|/)action\\\\.ya?ml$/\"\n ]\n },\n \"gitlabci\": {\n \"managerFilePatterns\": [\n \"/\\\\.gitlab-ci\\\\.ya?ml$/\"\n ]\n },\n \"gitlabci-include\": {\n \"managerFilePatterns\": [\n \"/\\\\.gitlab-ci\\\\.ya?ml$/\"\n ]\n },\n \"glasskube\": {\n \"managerFilePatterns\": []\n },\n \"gleam\": {\n \"managerFilePatterns\": [\n \"/(^|/)gleam.toml$/\"\n ],\n \"versioning\": \"hex\"\n },\n \"gomod\": {\n \"managerFilePatterns\": [\n \"/(^|/)go\\\\.mod$/\"\n ],\n \"pinDigests\": false\n },\n \"gradle\": {\n \"managerFilePatterns\": [\n \"/\\\\.gradle(\\\\.kts)?$/\",\n \"/(^|/)gradle\\\\.properties$/\",\n \"/(^|/)gradle/.+\\\\.toml$/\",\n \"/(^|/)buildSrc/.+\\\\.kt$/\",\n \"/\\\\.versions\\\\.toml$/\",\n \"/(^|/)versions.props$/\",\n \"/(^|/)versions.lock$/\"\n ],\n \"timeout\": 600,\n \"versioning\": \"gradle\"\n },\n \"gradle-wrapper\": {\n \"managerFilePatterns\": [\n \"/(^|/)gradle/wrapper/gradle-wrapper\\\\.properties$/\"\n ],\n \"versioning\": \"gradle\"\n },\n \"haskell-cabal\": {\n \"managerFilePatterns\": [\n \"/\\\\.cabal$/\"\n ],\n \"pinDigests\": false\n },\n \"helm-requirements\": {\n \"registryAliases\": {\n \"stable\": \"https://charts.helm.sh/stable\"\n },\n \"commitMessageTopic\": \"helm chart {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)requirements\\\\.ya?ml$/\"\n ]\n },\n \"helm-values\": {\n \"commitMessageTopic\": \"helm values {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)values\\\\.ya?ml$/\"\n ],\n \"pinDigests\": false\n },\n \"helmfile\": {\n \"registryAliases\": {\n \"stable\": \"https://charts.helm.sh/stable\"\n },\n \"commitMessageTopic\": \"helm chart {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)helmfile\\\\.ya?ml(?:\\\\.gotmpl)?$/\",\n \"/(^|/)helmfile\\\\.d/.+\\\\.ya?ml(?:\\\\.gotmpl)?$/\"\n ]\n },\n \"helmsman\": {\n \"managerFilePatterns\": []\n },\n \"helmv3\": {\n \"registryAliases\": {\n \"stable\": \"https://charts.helm.sh/stable\"\n },\n \"commitMessageTopic\": \"helm chart {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)Chart\\\\.ya?ml$/\"\n ]\n },\n \"hermit\": {\n \"managerFilePatterns\": [\n \"/(^|/)bin/hermit$/\"\n ],\n \"excludeCommitPaths\": [\n \"**/bin/hermit\"\n ],\n \"versioning\": \"hermit\"\n },\n \"homeassistant-manifest\": {\n \"managerFilePatterns\": [\n \"/(^|/)manifest\\\\.json$/\"\n ]\n },\n \"homebrew\": {\n \"commitMessageTopic\": \"Homebrew Formula {{depName}}\",\n \"managerFilePatterns\": [\n \"/^Formula/\\\\w*/?[^/]+[.]rb$/\"\n ]\n },\n \"html\": {\n \"managerFilePatterns\": [\n \"/\\\\.html?$/\"\n ],\n \"versioning\": \"semver\",\n \"digest\": {\n \"enabled\": false\n },\n \"pinDigests\": false\n },\n \"jenkins\": {\n \"managerFilePatterns\": [\n \"/(^|/)plugins\\\\.(txt|ya?ml)$/\"\n ]\n },\n \"jsonnet-bundler\": {\n \"managerFilePatterns\": [\n \"/(^|/)jsonnetfile\\\\.json$/\"\n ],\n \"datasource\": \"git-tags\"\n },\n \"kotlin-script\": {\n \"managerFilePatterns\": [\n \"/^.+\\\\.main\\\\.kts$/\"\n ]\n },\n \"kubernetes\": {\n \"managerFilePatterns\": []\n },\n \"kustomize\": {\n \"managerFilePatterns\": [\n \"/(^|/)kustomization\\\\.ya?ml$/\"\n ],\n \"pinDigests\": false\n },\n \"leiningen\": {\n \"managerFilePatterns\": [\n \"/(^|/)project\\\\.clj$/\"\n ],\n \"versioning\": \"maven\"\n },\n \"maven\": {\n \"managerFilePatterns\": [\n \"/(^|/|\\\\.)pom\\\\.xml$/\",\n \"/(^|/)pom\\\\.template\\\\.xml$/\",\n \"/^(((\\\\.mvn)|(\\\\.m2))/)?settings\\\\.xml$/\",\n \"/(^|/)\\\\.mvn/extensions\\\\.xml$/\"\n ]\n },\n \"maven-wrapper\": {\n \"managerFilePatterns\": [\n \"/(^|\\\\/).mvn/wrapper/maven-wrapper.properties$/\",\n \"/(^|\\\\/)mvnw(.cmd)?$/\"\n ]\n },\n \"meteor\": {\n \"managerFilePatterns\": [\n \"/(^|/)package\\\\.js$/\"\n ]\n },\n \"mint\": {\n \"managerFilePatterns\": [\n \"/(^|/)Mintfile$/\"\n ]\n },\n \"mise\": {\n \"managerFilePatterns\": [\n \"**/{,.}mise{,.*}.toml\",\n \"**/{,.}mise/config{,.*}.toml\",\n \"**/.config/mise{,.*}.toml\",\n \"**/.config/mise/{mise,config}{,.*}.toml\",\n \"**/.config/mise/conf.d/*.toml\",\n \"**/.rtx{,.*}.toml\"\n ],\n \"pinDigests\": false\n },\n \"mix\": {\n \"managerFilePatterns\": [\n \"/(^|/)mix\\\\.exs$/\"\n ]\n },\n \"nix\": {\n \"managerFilePatterns\": [\n \"/(^|/)flake\\\\.nix$/\"\n ],\n \"commitMessageTopic\": \"nix\",\n \"commitMessageExtra\": \"to {{newValue}}\",\n \"enabled\": false\n },\n \"nodenv\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.node-version$/\"\n ],\n \"versioning\": \"node\"\n },\n \"npm\": {\n \"managerFilePatterns\": [\n \"/(^|/)package\\\\.json$/\",\n \"/(^|/)pnpm-workspace\\\\.yaml$/\",\n \"/(^|/)\\\\.yarnrc\\\\.yml$/\"\n ],\n \"digest\": {\n \"prBodyDefinitions\": {\n \"Change\": \"{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}\"\n }\n },\n \"prBodyDefinitions\": {\n \"Change\": \"[{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})\"\n }\n },\n \"nuget\": {\n \"managerFilePatterns\": [\n \"/\\\\.(?:cs|fs|vb|sql)proj$/\",\n \"/\\\\.(?:props|targets)$/\",\n \"/(^|/)dotnet-tools\\\\.json$/\",\n \"/(^|/)global\\\\.json$/\"\n ],\n \"rangeStrategy\": \"bump\",\n \"packageRules\": [\n {\n \"matchDepTypes\": [\n \"msbuild-sdk\"\n ],\n \"rangeStrategy\": \"bump\"\n }\n ]\n },\n \"nvm\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.nvmrc$/\"\n ],\n \"versioning\": \"node\",\n \"pinDigests\": false\n },\n \"ocb\": {\n \"managerFilePatterns\": []\n },\n \"osgi\": {\n \"managerFilePatterns\": [\n \"/(^|/)src/main/features/.+\\\\.json$/\"\n ]\n },\n \"pep621\": {\n \"managerFilePatterns\": [\n \"/(^|/)pyproject\\\\.toml$/\"\n ]\n },\n \"pep723\": {\n \"managerFilePatterns\": []\n },\n \"pip-compile\": {\n \"managerFilePatterns\": [],\n \"lockFileMaintenance\": {\n \"enabled\": true,\n \"branchTopic\": \"pip-compile-refresh\",\n \"commitMessageAction\": \"Refresh pip-compile outputs\"\n }\n },\n \"pip_requirements\": {\n \"managerFilePatterns\": [\n \"/(^|/)[\\\\w-]*requirements([-._]\\\\w+)?\\\\.(txt|pip)$/\"\n ]\n },\n \"pip_setup\": {\n \"managerFilePatterns\": [\n \"/(^|/)setup\\\\.py$/\"\n ]\n },\n \"pipenv\": {\n \"managerFilePatterns\": [\n \"/(^|/)Pipfile$/\"\n ]\n },\n \"pixi\": {\n \"managerFilePatterns\": [\n \"/(^|/)pyproject\\\\.toml$/\",\n \"/(^|/)pixi\\\\.toml$/\"\n ]\n },\n \"poetry\": {\n \"managerFilePatterns\": [\n \"/(^|/)pyproject\\\\.toml$/\"\n ]\n },\n \"pre-commit\": {\n \"commitMessageTopic\": \"pre-commit hook {{depName}}\",\n \"enabled\": false,\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.pre-commit-config\\\\.ya?ml$/\"\n ],\n \"prBodyNotes\": [\n \"Note: The `pre-commit` manager in Renovate is not supported by the `pre-commit` maintainers or community. Please do not report any problems there, instead [create a Discussion in the Renovate repository](https://github.com/renovatebot/renovate/discussions/new) if you have any questions.\"\n ]\n },\n \"proto\": {\n \"managerFilePatterns\": [\n \"**/.prototools\"\n ]\n },\n \"pub\": {\n \"managerFilePatterns\": [\n \"/(^|/)pubspec\\\\.ya?ml$/\"\n ]\n },\n \"puppet\": {\n \"managerFilePatterns\": [\n \"/(^|/)Puppetfile$/\"\n ]\n },\n \"pyenv\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.python-version$/\"\n ],\n \"versioning\": \"docker\",\n \"pinDigests\": false\n },\n \"quadlet\": {\n \"managerFilePatterns\": [\n \"/.+\\\\.container$/\",\n \"/.+\\\\.image$/\",\n \"/.+\\\\.volume$/\"\n ]\n },\n \"renovate-config\": {\n \"managerFilePatterns\": [\n \"renovate.json\",\n \"renovate.jsonc\",\n \"renovate.json5\",\n \".github/renovate.json\",\n \".github/renovate.jsonc\",\n \".github/renovate.json5\",\n \".gitlab/renovate.json\",\n \".gitlab/renovate.jsonc\",\n \".gitlab/renovate.json5\",\n \".renovaterc\",\n \".renovaterc.json\",\n \".renovaterc.jsonc\",\n \".renovaterc.json5\"\n ]\n },\n \"ruby-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.ruby-version$/\"\n ],\n \"versioning\": \"ruby\"\n },\n \"runtime-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)runtime.txt$/\"\n ],\n \"pinDigests\": false\n },\n \"rust-toolchain\": {\n \"commitMessageTopic\": \"Rust\",\n \"managerFilePatterns\": [\n \"/(^|/)rust-toolchain(\\\\.toml)?$/\"\n ]\n },\n \"sbt\": {\n \"managerFilePatterns\": [\n \"/\\\\.sbt$/\",\n \"/project/[^/]*\\\\.scala$/\",\n \"/project/build\\\\.properties$/\",\n \"/(^|/)repositories$/\"\n ],\n \"versioning\": \"ivy\"\n },\n \"scalafmt\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.scalafmt.conf$/\"\n ]\n },\n \"setup-cfg\": {\n \"managerFilePatterns\": [\n \"/(^|/)setup\\\\.cfg$/\"\n ],\n \"versioning\": \"pep440\"\n },\n \"smithy\": {\n \"managerFilePatterns\": [\n \"/(^|/)smithy-build\\\\.json$/\"\n ]\n },\n \"sveltos\": {\n \"managerFilePatterns\": []\n },\n \"swift\": {\n \"managerFilePatterns\": [\n \"/(^|/)Package\\\\.swift/\"\n ],\n \"versioning\": \"swift\",\n \"pinDigests\": false\n },\n \"tekton\": {\n \"managerFilePatterns\": []\n },\n \"terraform\": {\n \"commitMessageTopic\": \"Terraform {{depName}}\",\n \"managerFilePatterns\": [\n \"**/*.tf\",\n \"**/*.tofu\"\n ],\n \"pinDigests\": false\n },\n \"terraform-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.terraform-version$/\"\n ],\n \"versioning\": \"hashicorp\",\n \"extractVersion\": \"^v(?<version>.*)$\"\n },\n \"terragrunt\": {\n \"commitMessageTopic\": \"Terragrunt dependency {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)terragrunt\\\\.hcl$/\"\n ]\n },\n \"terragrunt-version\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.terragrunt-version$/\"\n ],\n \"versioning\": \"hashicorp\",\n \"extractVersion\": \"^v(?<version>.+)$\"\n },\n \"tflint-plugin\": {\n \"commitMessageTopic\": \"TFLint plugin {{depName}}\",\n \"managerFilePatterns\": [\n \"/\\\\.tflint\\\\.hcl$/\"\n ],\n \"extractVersion\": \"^v(?<version>.*)$\"\n },\n \"travis\": {\n \"managerFilePatterns\": [\n \"/^\\\\.travis\\\\.ya?ml$/\"\n ],\n \"major\": {\n \"enabled\": false\n },\n \"versioning\": \"node\"\n },\n \"typst\": {\n \"managerFilePatterns\": [\n \"/\\\\.typ$/\"\n ]\n },\n \"unity3d\": {\n \"managerFilePatterns\": [\n \"**/ProjectSettings/ProjectVersion.txt\"\n ]\n },\n \"velaci\": {\n \"managerFilePatterns\": [\n \"/(^|/)\\\\.vela\\\\.ya?ml$/\"\n ]\n },\n \"vendir\": {\n \"commitMessageTopic\": \"vendir {{depName}}\",\n \"managerFilePatterns\": [\n \"/(^|/)vendir\\\\.yml$/\"\n ]\n },\n \"woodpecker\": {\n \"managerFilePatterns\": [\n \"/^\\\\.woodpecker(?:/[^/]+)?\\\\.ya?ml$/\"\n ]\n },\n \"xcodegen\": {\n \"managerFilePatterns\": [\n \"**/project.yml\"\n ],\n \"pinDigests\": false\n },\n \"regex\": {\n \"pinDigests\": false\n },\n \"jsonata\": {\n \"pinDigests\": false\n }\n};\n"],"mappings":";AACA,MAAa,wBAAiE;CAC5E,OAAO,EACL,uBAAuB,CACrB,cACF,EACF;CACA,WAAW,EACT,uBAAuB,CACrB,6BACF,EACF;CACA,kBAAkB,EAChB,uBAAuB,CACrB,oDACF,EACF;CACA,UAAU,EACR,uBAAuB,CAAC,EAC1B;CACA,QAAQ,EACN,uBAAuB,CACrB,0BACF,EACF;CACA,mBAAmB;EACjB,uBAAuB,CACrB,mCACA,gCACF;EACA,WAAW;CACb;CACA,UAAU,EACR,uBAAuB,CACrB,kCACF,EACF;CACA,kBAAkB;EAChB,uBAAuB,CACrB,gBACF;EACA,cAAc;CAChB;CACA,SAAS,EACP,uBAAuB;EACrB;EACA;EACA;CACF,EACF;CACA,gBAAgB,EACd,uBAAuB,CACrB,4BACF,EACF;CACA,YAAY;EACV,uBAAuB,CACrB,yBACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,SAAS,EACP,uBAAuB,CACrB,aACF,EACF;CACA,uBAAuB,EACrB,uBAAuB,CACrB,oBACF,EACF;CACA,WAAW,EACT,uBAAuB,CACrB,yBACF,EACF;CACA,aAAa;EACX,uBAAuB,CACrB,uBACA,4BACF;EACA,sBAAsB;EACtB,sBAAsB;CACxB;CACA,cAAc;EACZ,sBAAsB;EACtB,uBAAuB,CACrB,wBACF;EACA,cAAc;CAChB;CACA,OAAO;EACL,uBAAuB,CACrB,wBACA,wBACF;EACA,UAAU,EACR,qBAAqB,EACnB,UAAU,8KACZ,EACF;EACA,qBAAqB,EACnB,UAAU,6SACZ;CACF;CACA,eAAe;EACb,uBAAuB,CACrB,wBACF;EACA,cAAc;CAChB;CACA,WAAW;EACT,uBAAuB,CACrB,iBACF;EACA,cAAc;CAChB;CACA,QAAQ,EACN,uBAAuB,CACrB,YACF,EACF;CACA,SAAS;EACP,sBAAsB;EACtB,uBAAuB,CACrB,sBACF;CACF;CACA,UAAU;EACR,uBAAuB,CAAC;EACxB,cAAc;CAChB;CACA,YAAY,EACV,uBAAuB,CACrB,gCACF,EACF;CACA,cAAc,EACZ,uBAAuB,CACrB,2BACF,EACF;CACA,aAAa;EACX,uBAAuB,CACrB,iBACF;EACA,cAAc;CAChB;CACA,YAAY;EACV,uBAAuB,CACrB,kCACF;EACA,cAAc;CAChB;CACA,SAAS;EACP,uBAAuB,CACrB,8BACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,UAAU;EACR,uBAAuB,CACrB,0CACF;EACA,cAAc;CAChB;CACA,YAAY,EACV,uBAAuB,CACrB,kBACF,EACF;CACA,cAAc,EACZ,uBAAuB,CAAC,EAC1B;CACA,QAAQ,EACN,uBAAuB,CACrB,gCACF,EACF;CACA,QAAQ;EACN,uBAAuB,CACrB,uBACA,6BACF;EACA,UAAU,EACR,qBAAqB,EACnB,UAAU,gLACZ,EACF;EACA,qBAAqB,EACnB,UAAU,8gBACZ;CACF;CACA,YAAY;EACV,uBAAuB,CACrB,2BACF;EACA,cAAc;CAChB;CACA,UAAU,EACR,uBAAuB,CACrB,uBACF,EACF;CACA,gBAAgB,EACd,uBAAuB;EACrB;EACA;EACA;CACF,EACF;CACA,kBAAkB,EAChB,uBAAuB,CACrB,0CACF,EACF;CACA,cAAc,EACZ,uBAAuB,CACrB,4CACA,2CACF,EACF;CACA,WAAW,EACT,uBAAuB,CACrB,wBACF,EACF;CACA,SAAS,EACP,uBAAuB,CACrB,sBACF,EACF;CACA,QAAQ,EACN,uBAAuB,CACrB,mCACF,EACF;CACA,OAAO;EACL,uBAAuB,CACrB,oCACA,kBACF;EACA,cAAc;CAChB;CACA,kBAAkB;EAChB,WAAW;EACX,cAAc;EACd,uBAAuB,CACrB,uBACF;CACF;CACA,kBAAkB,EAChB,uBAAuB,CACrB,6FACA,wBACF,EACF;CACA,YAAY,EACV,uBAAuB,CACrB,yBACF,EACF;CACA,oBAAoB,EAClB,uBAAuB,CACrB,yBACF,EACF;CACA,aAAa,EACX,uBAAuB,CAAC,EAC1B;CACA,SAAS;EACP,uBAAuB,CACrB,oBACF;EACA,cAAc;CAChB;CACA,SAAS;EACP,uBAAuB,CACrB,kBACF;EACA,cAAc;CAChB;CACA,UAAU;EACR,uBAAuB;GACrB;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,WAAW;EACX,cAAc;CAChB;CACA,kBAAkB;EAChB,uBAAuB,CACrB,oDACF;EACA,cAAc;CAChB;CACA,iBAAiB;EACf,uBAAuB,CACrB,aACF;EACA,cAAc;CAChB;CACA,qBAAqB;EACnB,mBAAmB,EACjB,UAAU,gCACZ;EACA,sBAAsB;EACtB,uBAAuB,CACrB,8BACF;CACF;CACA,eAAe;EACb,sBAAsB;EACtB,uBAAuB,CACrB,wBACF;EACA,cAAc;CAChB;CACA,YAAY;EACV,mBAAmB,EACjB,UAAU,gCACZ;EACA,sBAAsB;EACtB,uBAAuB,CACrB,0CACA,+CACF;CACF;CACA,YAAY,EACV,uBAAuB,CAAC,EAC1B;CACA,UAAU;EACR,mBAAmB,EACjB,UAAU,gCACZ;EACA,sBAAsB;EACtB,uBAAuB,CACrB,uBACF;CACF;CACA,UAAU;EACR,uBAAuB,CACrB,oBACF;EACA,sBAAsB,CACpB,eACF;EACA,cAAc;CAChB;CACA,0BAA0B,EACxB,uBAAuB,CACrB,yBACF,EACF;CACA,YAAY;EACV,sBAAsB;EACtB,uBAAuB,CACrB,8BACF;CACF;CACA,QAAQ;EACN,uBAAuB,CACrB,aACF;EACA,cAAc;EACd,UAAU,EACR,WAAW,MACb;EACA,cAAc;CAChB;CACA,WAAW,EACT,uBAAuB,CACrB,+BACF,EACF;CACA,mBAAmB;EACjB,uBAAuB,CACrB,4BACF;EACA,cAAc;CAChB;CACA,iBAAiB,EACf,uBAAuB,CACrB,qBACF,EACF;CACA,cAAc,EACZ,uBAAuB,CAAC,EAC1B;CACA,aAAa;EACX,uBAAuB,CACrB,+BACF;EACA,cAAc;CAChB;CACA,aAAa;EACX,uBAAuB,CACrB,uBACF;EACA,cAAc;CAChB;CACA,SAAS,EACP,uBAAuB;EACrB;EACA;EACA;EACA;CACF,EACF;CACA,iBAAiB,EACf,uBAAuB,CACrB,mDACA,uBACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,sBACF,EACF;CACA,QAAQ,EACN,uBAAuB,CACrB,kBACF,EACF;CACA,QAAQ;EACN,uBAAuB;GACrB;GACA;GACA;GACA;GACA;GACA;EACF;EACA,cAAc;CAChB;CACA,OAAO,EACL,uBAAuB,CACrB,mBACF,EACF;CACA,OAAO;EACL,uBAAuB,CACrB,qBACF;EACA,sBAAsB;EACtB,sBAAsB;EACtB,WAAW;CACb;CACA,UAAU;EACR,uBAAuB,CACrB,yBACF;EACA,cAAc;CAChB;CACA,OAAO;EACL,uBAAuB;GACrB;GACA;GACA;EACF;EACA,UAAU,EACR,qBAAqB,EACnB,UAAU,8KACZ,EACF;EACA,qBAAqB,EACnB,UAAU,6SACZ;CACF;CACA,SAAS;EACP,uBAAuB;GACrB;GACA;GACA;GACA;EACF;EACA,iBAAiB;EACjB,gBAAgB,CACd;GACE,iBAAiB,CACf,aACF;GACA,iBAAiB;EACnB,CACF;CACF;CACA,OAAO;EACL,uBAAuB,CACrB,kBACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,OAAO,EACL,uBAAuB,CAAC,EAC1B;CACA,QAAQ,EACN,uBAAuB,CACrB,qCACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,0BACF,EACF;CACA,UAAU,EACR,uBAAuB,CAAC,EAC1B;CACA,eAAe;EACb,uBAAuB,CAAC;EACxB,uBAAuB;GACrB,WAAW;GACX,eAAe;GACf,uBAAuB;EACzB;CACF;CACA,oBAAoB,EAClB,uBAAuB,CACrB,qDACF,EACF;CACA,aAAa,EACX,uBAAuB,CACrB,oBACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,iBACF,EACF;CACA,QAAQ,EACN,uBAAuB,CACrB,4BACA,qBACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,0BACF,EACF;CACA,cAAc;EACZ,sBAAsB;EACtB,WAAW;EACX,uBAAuB,CACrB,sCACF;EACA,eAAe,CACb,iSACF;CACF;CACA,SAAS,EACP,uBAAuB,CACrB,gBACF,EACF;CACA,OAAO,EACL,uBAAuB,CACrB,yBACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,oBACF,EACF;CACA,SAAS;EACP,uBAAuB,CACrB,2BACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,WAAW,EACT,uBAAuB;EACrB;EACA;EACA;CACF,EACF;CACA,mBAAmB,EACjB,uBAAuB;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,EACF;CACA,gBAAgB;EACd,uBAAuB,CACrB,yBACF;EACA,cAAc;CAChB;CACA,mBAAmB;EACjB,uBAAuB,CACrB,qBACF;EACA,cAAc;CAChB;CACA,kBAAkB;EAChB,sBAAsB;EACtB,uBAAuB,CACrB,kCACF;CACF;CACA,OAAO;EACL,uBAAuB;GACrB;GACA;GACA;GACA;EACF;EACA,cAAc;CAChB;CACA,YAAY,EACV,uBAAuB,CACrB,0BACF,EACF;CACA,aAAa;EACX,uBAAuB,CACrB,qBACF;EACA,cAAc;CAChB;CACA,UAAU,EACR,uBAAuB,CACrB,6BACF,EACF;CACA,WAAW,EACT,uBAAuB,CAAC,EAC1B;CACA,SAAS;EACP,uBAAuB,CACrB,wBACF;EACA,cAAc;EACd,cAAc;CAChB;CACA,UAAU,EACR,uBAAuB,CAAC,EAC1B;CACA,aAAa;EACX,sBAAsB;EACtB,uBAAuB,CACrB,WACA,WACF;EACA,cAAc;CAChB;CACA,qBAAqB;EACnB,uBAAuB,CACrB,8BACF;EACA,cAAc;EACd,kBAAkB;CACpB;CACA,cAAc;EACZ,sBAAsB;EACtB,uBAAuB,CACrB,0BACF;CACF;CACA,sBAAsB;EACpB,uBAAuB,CACrB,+BACF;EACA,cAAc;EACd,kBAAkB;CACpB;CACA,iBAAiB;EACf,sBAAsB;EACtB,uBAAuB,CACrB,oBACF;EACA,kBAAkB;CACpB;CACA,UAAU;EACR,uBAAuB,CACrB,uBACF;EACA,SAAS,EACP,WAAW,MACb;EACA,cAAc;CAChB;CACA,SAAS,EACP,uBAAuB,CACrB,WACF,EACF;CACA,WAAW,EACT,uBAAuB,CACrB,uCACF,EACF;CACA,UAAU,EACR,uBAAuB,CACrB,yBACF,EACF;CACA,UAAU;EACR,sBAAsB;EACtB,uBAAuB,CACrB,sBACF;CACF;CACA,cAAc,EACZ,uBAAuB,CACrB,sCACF,EACF;CACA,YAAY;EACV,uBAAuB,CACrB,gBACF;EACA,cAAc;CAChB;CACA,SAAS,EACP,cAAc,MAChB;CACA,WAAW,EACT,cAAc,MAChB;AACF"}
@@ -19,7 +19,11 @@ var devcontainer_exports = /* @__PURE__ */ __exportAll({
19
19
  const name = "Dev Container";
20
20
  const url = "https://code.visualstudio.com/docs/devcontainers/containers";
21
21
  const categories = ["docker"];
22
- const defaultConfig = { managerFilePatterns: ["/^.devcontainer/devcontainer.json$/", "/^.devcontainer.json$/"] };
22
+ const defaultConfig = { managerFilePatterns: [
23
+ "/^.devcontainer/devcontainer.json$/",
24
+ "/^.devcontainer.json$/",
25
+ "/^.devcontainer/[^/]+/devcontainer.json$/"
26
+ ] };
23
27
  const supportedDatasources = [
24
28
  DockerDatasource.id,
25
29
  GolangVersionDatasource.id,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/devcontainer/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GolangVersionDatasource } from '../../datasource/golang-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { PythonVersionDatasource } from '../../datasource/python-version/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\n\nexport { knownDepTypes } from './dep-types.ts';\nexport { extractPackageFile } from './extract.ts';\n\nexport const name = 'Dev Container';\nexport const url =\n 'https://code.visualstudio.com/docs/devcontainers/containers';\nexport const categories: Category[] = ['docker'];\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '/^.devcontainer/devcontainer.json$/',\n '/^.devcontainer.json$/',\n ],\n};\n\nexport const supportedDatasources = [\n DockerDatasource.id,\n GolangVersionDatasource.id,\n NodeVersionDatasource.id,\n PythonVersionDatasource.id,\n RubyVersionDatasource.id,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;AAUA,MAAa,OAAO;AACpB,MAAa,MACX;AACF,MAAa,aAAyB,CAAC,QAAQ;AAE/C,MAAa,gBAAgB,EAC3B,qBAAqB,CACnB,uCACA,wBACF,EACF;AAEA,MAAa,uBAAuB;CAClC,iBAAiB;CACjB,wBAAwB;CACxB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;AACxB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/devcontainer/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GolangVersionDatasource } from '../../datasource/golang-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { PythonVersionDatasource } from '../../datasource/python-version/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\n\nexport { knownDepTypes } from './dep-types.ts';\nexport { extractPackageFile } from './extract.ts';\n\nexport const name = 'Dev Container';\nexport const url =\n 'https://code.visualstudio.com/docs/devcontainers/containers';\nexport const categories: Category[] = ['docker'];\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '/^.devcontainer/devcontainer.json$/',\n '/^.devcontainer.json$/',\n '/^.devcontainer/[^/]+/devcontainer.json$/',\n ],\n};\n\nexport const supportedDatasources = [\n DockerDatasource.id,\n GolangVersionDatasource.id,\n NodeVersionDatasource.id,\n PythonVersionDatasource.id,\n RubyVersionDatasource.id,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;AAUA,MAAa,OAAO;AACpB,MAAa,MACX;AACF,MAAa,aAAyB,CAAC,QAAQ;AAE/C,MAAa,gBAAgB,EAC3B,qBAAqB;CACnB;CACA;CACA;AACF,EACF;AAEA,MAAa,uBAAuB;CAClC,iBAAiB;CACjB,wBAAwB;CACxB,sBAAsB;CACtB,wBAAwB;CACxB,sBAAsB;AACxB"}
@@ -42,9 +42,13 @@ function getExpectedPrList(config, branches) {
42
42
  logger.trace({ config });
43
43
  let prDesc = `\n### What to Expect\n\n`;
44
44
  if (!branches.length) return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\n`;
45
+ const securityBranchCount = branches.filter((b) => b.isVulnerabilityAlert).length;
46
+ const throttledBranchCount = branches.length - securityBranchCount;
45
47
  const { limit: concurrentLimit, key: concurrentLimitKey } = resolveConcurrentLimit(config);
46
- if (concurrentLimit > 0 && concurrentLimit < branches.length) prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? "s" : ""}, up to a maximum of ${branches.length} over time (see [docs for \`${concurrentLimitKey}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimitKey.toLowerCase()})):\n\n`;
47
- else {
48
+ if (concurrentLimit > 0 && concurrentLimit < throttledBranchCount) {
49
+ const securityNote = securityBranchCount > 0 ? `, plus ${securityBranchCount} security update Pull Request${securityBranchCount > 1 ? "s" : ""} which ${securityBranchCount > 1 ? "are" : "is"} not subject to this limit` : "";
50
+ prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? "s" : ""}, up to a maximum of ${branches.length} over time (see [docs for \`${concurrentLimitKey}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimitKey.toLowerCase()}))${securityNote}:\n\n`;
51
+ } else {
48
52
  prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;
49
53
  prDesc += branches.length > 1 ? `s:\n\n` : `:\n\n`;
50
54
  }
@@ -76,8 +80,9 @@ function getExpectedPrList(config, branches) {
76
80
  }
77
81
  const prHourlyLimit = coerceNumber(config.prHourlyLimit);
78
82
  const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);
79
- if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < branches.length) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.\n\n`);
80
- else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < branches.length) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.\n\n`);
83
+ const securityBypassNote = securityBranchCount > 0 ? ` Security update Pull Request${securityBranchCount > 1 ? "s are" : " is"} not subject to this limit and will be created straight away.` : "";
84
+ if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < throttledBranchCount) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.${securityBypassNote}\n\n`);
85
+ else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < throttledBranchCount) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.${securityBypassNote}\n\n`);
81
86
  return prDesc;
82
87
  }
83
88
  function getBranchUpgradeTypes(branch) {
@@ -190,6 +195,7 @@ function getExpectedPrListSummary(config, branches) {
190
195
  const prHourlyLimit = coerceNumber(config.prHourlyLimit);
191
196
  const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);
192
197
  const concurrentLimit = resolveConcurrentLimit(config);
198
+ const securityCount = Object.keys(stats.securityGroups).length;
193
199
  if (hasMultipleBaseBranches) {
194
200
  let total = 0;
195
201
  const parts = sortedBases.map((base) => {
@@ -198,10 +204,10 @@ function getExpectedPrListSummary(config, branches) {
198
204
  const label = base ? `the \`${base}\` branch` : "the default branch";
199
205
  return `${count} Pull Request${count > 1 ? "s" : ""} to ${label}`;
200
206
  });
201
- const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, total);
207
+ const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, total - securityCount, securityCount);
202
208
  prDesc += `With your current configuration, Renovate will create ${parts.join(" and ")}${limitsNotice}:\n\n`;
203
209
  } else {
204
- const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, stats.prCount);
210
+ const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, stats.prCount - securityCount, securityCount);
205
211
  prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? "s" : ""}${limitsNotice}:\n\n`;
206
212
  }
207
213
  const categoryColumns = getCategoryColumns(stats.presentCategories);
@@ -226,22 +232,27 @@ function getExpectedPrListSummary(config, branches) {
226
232
  prDesc += `\n**Security updates**:\n\n`;
227
233
  for (const groupBranches of Object.values(stats.securityGroups)) prDesc += describeSecurityGroup(groupBranches);
228
234
  }
229
- if (concurrentLimit.limit > 0 && concurrentLimit.limit < stats.prCount) {
235
+ const throttledPrCount = stats.prCount - securityCount;
236
+ const securityBypassNote = securityCount > 0 ? ` Security update Pull Request${securityCount > 1 ? "s are" : " is"} not subject to this limit and will be created straight away.` : "";
237
+ if (concurrentLimit.limit > 0 && concurrentLimit.limit < throttledPrCount) {
230
238
  const notice = concurrentLimit.key === "branchConcurrentLimit" ? `Renovate will only work on ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? "es" : ""} at a time, so not all Pull Requests will be opened straight away` : `Renovate will only keep ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? "s" : ""} open at a time, so not all of the above will be opened straight away`;
231
- prDesc += emojify(`\n\n:children_crossing: ${notice}. See [docs for \`${concurrentLimit.key}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.\n\n`);
239
+ prDesc += emojify(`\n\n:children_crossing: ${notice}. See [docs for \`${concurrentLimit.key}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.${securityBypassNote}\n\n`);
232
240
  }
233
- if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < stats.prCount) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.\n\n`);
234
- else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < stats.prCount) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.\n\n`);
241
+ if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < throttledPrCount) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.${securityBypassNote}\n\n`);
242
+ else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < throttledPrCount) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.${securityBypassNote}\n\n`);
235
243
  return prDesc;
236
244
  }
237
- function determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, prCount) {
245
+ function determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, prCount, securityCount) {
238
246
  const clauses = [];
239
247
  if (concurrentLimit.limit > 0 && concurrentLimit.limit < prCount) clauses.push(concurrentLimit.key === "branchConcurrentLimit" ? `a maximum of ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? "es" : ""} open at a time` : `a maximum of ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? "s" : ""} open at a time`);
240
248
  if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < prCount) clauses.push(`a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? "s" : ""}/rebase${commitHourlyLimit > 1 ? "s" : ""} per hour`);
241
249
  else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < prCount) clauses.push(`a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? "s" : ""} per hour`);
242
- if (clauses.length) return emojify(` (at ${clauses.join(" and ")})`);
243
- if (commitHourlyLimit === 0 && prHourlyLimit === 0) return " (with no configured maximum of PRs per hour)";
244
- return "";
250
+ if (!clauses.length) {
251
+ if (commitHourlyLimit === 0 && prHourlyLimit === 0) return " (with no configured maximum of PRs per hour)";
252
+ return "";
253
+ }
254
+ const securityNote = securityCount > 0 ? `, plus ${securityCount} security update${securityCount > 1 ? "s" : ""} which ${securityCount > 1 ? "aren't" : "isn't"} subject to these limits` : "";
255
+ return emojify(` (at ${clauses.join(" and ")}${securityNote})`);
245
256
  }
246
257
  //#endregion
247
258
  export { getExpectedPrList, getExpectedPrListSummary };
@@ -1 +1 @@
1
- {"version":3,"file":"pr-list.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/pr/pr-list.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type RenovateConfig,\n type UpdateType,\n UpdateTypesOptions,\n} from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { calcLimit } from '../../../global/limits.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\n\n/**\n * The different categories of dependency updates to output, when providing the summary view.\n *\n * - `security`: if the upgrade is driven by a vulnerability alert\n * - `${updateType}`: if it's set. I.e. `major`\n * - `lockfileUpdate` when `isLockfileUpdate` is true, without an `updateType`\n * - `other`: otherwise\n */\ntype SummaryCategory = UpdateType | 'security' | 'other';\n\n/** Priority order when rendering the `SummaryCategory`s in the summary view.\n *\n * NOTE that this is not exhaustive - this is only the priority order for rendering, and other categories, such as `other` are placed after.\n */\nconst SUMMARY_CATEGORY_PRIORITY_ORDER: readonly SummaryCategory[] = [\n 'security',\n ...UpdateTypesOptions,\n // ... anything else\n];\n\ninterface ConcurrentLimit {\n limit: number;\n key: 'prConcurrentLimit' | 'branchConcurrentLimit';\n}\n\n/**\n * Resolves the concurrent limit that governs how many of the expected Pull Requests can be open at once,\n * reusing the same `calcLimit()` used to enforce these limits (see `lib/workers/global/limits.ts`).\n *\n * `branchConcurrentLimit` only takes priority when it's been explicitly configured (it's `null` by default,\n * in which case `calcLimit()` silently inherits the value of `prConcurrentLimit`) and is actually more\n * restrictive - otherwise we'd misattribute the limit to a setting the user never touched.\n */\nfunction resolveConcurrentLimit(config: RenovateConfig): ConcurrentLimit {\n const configAsUpgrade: BranchUpgradeConfig = {\n branchName: '',\n manager: '',\n prConcurrentLimit: config.prConcurrentLimit,\n branchConcurrentLimit: config.branchConcurrentLimit,\n };\n const prConcurrentLimit = calcLimit([configAsUpgrade], 'prConcurrentLimit');\n const branchConcurrentLimit = calcLimit(\n [configAsUpgrade],\n 'branchConcurrentLimit',\n );\n\n if (\n typeof config.branchConcurrentLimit === 'number' &&\n branchConcurrentLimit > 0 &&\n (prConcurrentLimit === 0 || branchConcurrentLimit < prConcurrentLimit)\n ) {\n return {\n limit: branchConcurrentLimit,\n key: 'branchConcurrentLimit',\n };\n }\n\n return { limit: prConcurrentLimit, key: 'prConcurrentLimit' };\n}\n\nexport function getExpectedPrList(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrList()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n const { limit: concurrentLimit, key: concurrentLimitKey } =\n resolveConcurrentLimit(config);\n if (concurrentLimit > 0 && concurrentLimit < branches.length) {\n prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? 's' : ''}, up to a maximum of ${branches.length} over time (see [docs for \\`${concurrentLimitKey}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimitKey.toLowerCase()})):\\n\\n`;\n } else {\n prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;\n prDesc += branches.length > 1 ? `s:\\n\\n` : `:\\n\\n`;\n }\n\n for (const branch of branches) {\n const prTitleRe = regEx(/@([a-z]+\\/[a-z]+)/);\n // TODO #22198\n prDesc += `<details>\\n<summary>${branch.prTitle!.replace(\n prTitleRe,\n '@&#8203;$1',\n )}</summary>\\n\\n`;\n if (branch.schedule?.length) {\n prDesc += ` - Schedule: ${JSON.stringify(branch.schedule)}\\n`;\n }\n prDesc += ` - Branch name: \\`${branch.branchName}\\`\\n`;\n prDesc += branch.baseBranch\n ? ` - Merge into: \\`${branch.baseBranch}\\`\\n`\n : '';\n const seen: string[] = [];\n for (const upgrade of branch.upgrades) {\n let text = '';\n if (upgrade.updateType === 'lockFileMaintenance') {\n text += ' - Regenerate lock files to use latest dependency versions';\n } else {\n if (upgrade.updateType === 'pin') {\n text += ' - Pin ';\n } else {\n text += ' - Upgrade ';\n }\n if (upgrade.sourceUrl) {\n // TODO: types (#22198)\n text += `[${upgrade.depName!}](${upgrade.sourceUrl})`;\n } else {\n text += upgrade.depName!.replace(prTitleRe, '@&#8203;$1');\n }\n // TODO: types (#22198)\n text += upgrade.isLockfileUpdate\n ? ` to \\`${upgrade.newVersion!}\\``\n : ` to \\`${upgrade.newDigest ?? upgrade.newValue!}\\``;\n text += '\\n';\n }\n if (!seen.includes(text)) {\n prDesc += text;\n seen.push(text);\n }\n }\n prDesc += '\\n\\n';\n prDesc += '</details>\\n\\n';\n }\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < branches.length\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < branches.length\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction getBranchUpgradeTypes(branch: BranchConfig): Set<SummaryCategory> {\n if (branch.isVulnerabilityAlert) {\n return new Set(['security']);\n }\n const types = new Set<SummaryCategory>();\n for (const upgrade of branch.upgrades) {\n if (upgrade.updateType) {\n types.add(upgrade.updateType);\n } else if (upgrade.isLockfileUpdate) {\n types.add('lockfileUpdate');\n } else {\n types.add('other');\n }\n }\n return types;\n}\n\n// Sort: default branch (empty string) first, then named branches alphabetically.\nfunction sortBaseBranches(bases: Iterable<string>): string[] {\n return [...bases].sort((a, b) => {\n if (a === b) {\n /* v8 ignore next -- base branches are unique Record keys; equal comparison cannot occur */\n return 0;\n }\n if (a === '') {\n return -1;\n }\n if (b === '') {\n return 1;\n }\n return a.localeCompare(b);\n });\n}\n\nfunction describeSecurityGroup(groupBranches: BranchConfig[]): string {\n const firstUpgrade = groupBranches[0].upgrades[0];\n const depName = firstUpgrade?.depName ?? groupBranches[0].prTitle ?? '';\n const updateType = firstUpgrade?.updateType ?? 'unknown';\n const packageFiles = groupBranches\n .map((b) => ({ file: b.packageFile ?? '', manager: b.manager }))\n .filter((f) => f.file);\n const uniqueManagers = new Set(packageFiles.map((f) => f.manager));\n\n // Vulnerability alerts can match on datasource + packageName without a specific file (e.g. GitHub vulnerability alerts),\n // so we need to handle an absent packageFile\n if (packageFiles.length === 0) {\n const branchManagers = new Set(groupBranches.map((b) => b.manager));\n if (branchManagers.size === 1) {\n return `- \\`${depName}\\`, (${[...branchManagers][0]}, ${updateType})\\n`;\n }\n\n return `- \\`${depName}\\`, (${updateType}): ${[...branchManagers].sort().join(', ')}\\n`;\n }\n\n if (packageFiles.length === 1) {\n const file = packageFiles[0].file;\n const [manager] = uniqueManagers;\n return `- \\`${depName}\\`, (${manager}, ${updateType}): \\`${file}\\`\\n`;\n }\n\n if (uniqueManagers.size === 1) {\n const manager = [...uniqueManagers][0];\n const fileLines = packageFiles\n .map(({ file }) => ` - \\`${file}\\`\\n`)\n .join('');\n return `- \\`${depName}\\`, (${manager}, ${updateType}):\\n${fileLines}`;\n }\n\n const fileLines = packageFiles\n .map(({ file, manager }) => ` - \\`${file}\\` (${manager})\\n`)\n .join('');\n return `- \\`${depName}\\`, (${updateType}):\\n${fileLines}`;\n}\n\ninterface BranchStats {\n // PR count per base branch, deduplicated by branchName.\n prCountByBase: Record<string, number>;\n // base -> manager -> type -> count, deduplicated by branchName+manager+type.\n tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n >;\n // All upgrade types seen anywhere — drives the table columns.\n presentCategories: Set<SummaryCategory>;\n // Security branches grouped by branchName.\n securityGroups: Record<string, BranchConfig[]>;\n prCount: number;\n}\n\nfunction collectBranchStats(branches: BranchConfig[]): BranchStats {\n const prCountByBase: Record<string, number> = {};\n const tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n > = {};\n const presentTypes = new Set<SummaryCategory>();\n const securityGroups: Record<string, BranchConfig[]> = {};\n const seenPrs = new Set<string>();\n const seenTableKeys = new Set<string>();\n\n for (const branch of branches) {\n const base = branch.baseBranch ?? '';\n const { manager, branchName } = branch;\n const branchTypes = getBranchUpgradeTypes(branch);\n\n for (const type of branchTypes) {\n presentTypes.add(type);\n }\n\n if (!seenPrs.has(branchName)) {\n seenPrs.add(branchName);\n prCountByBase[base] = (prCountByBase[base] ?? 0) + 1;\n }\n\n tableStats[base] ??= {};\n const baseStats = tableStats[base];\n baseStats[manager] ??= {};\n const managerStats = baseStats[manager];\n for (const type of branchTypes) {\n const key = `${branchName}:${manager}:${type}`;\n if (seenTableKeys.has(key)) {\n continue;\n }\n seenTableKeys.add(key);\n managerStats[type] ??= 0;\n managerStats[type]++;\n }\n\n if (branch.isVulnerabilityAlert) {\n securityGroups[branchName] ??= [];\n securityGroups[branchName].push(branch);\n }\n }\n\n return {\n prCountByBase,\n tableStats,\n presentCategories: presentTypes,\n securityGroups,\n prCount: seenPrs.size,\n };\n}\n\nfunction getCategoryColumns(\n presentTypes: Set<SummaryCategory>,\n): SummaryCategory[] {\n const cols: SummaryCategory[] = SUMMARY_CATEGORY_PRIORITY_ORDER.filter((t) =>\n presentTypes.has(t),\n );\n // Append any present types not in the standard display order\n // (e.g. lockfileUpdate, bump).\n for (const t of presentTypes) {\n if (t !== 'other' && !cols.includes(t)) {\n cols.push(t);\n }\n }\n\n if (presentTypes.has('other')) {\n cols.push('other');\n }\n\n return cols;\n}\n\nfunction categoriesToColumnHeaders(cols: readonly string[]): string {\n /* v8 ignore next -- branches always have at least one upgrade, so cols is never empty in practice */\n if (cols.length === 0) {\n return '';\n }\n return ` | ${cols.join(' | ')}`;\n}\n\nfunction renderRowCounts(\n typeColumns: readonly SummaryCategory[],\n typeCounts: Partial<Record<SummaryCategory, number>>,\n): string {\n return categoriesToColumnHeaders(\n typeColumns.map((t) => `${typeCounts[t] ?? 0}`),\n );\n}\n\nfunction sumCategoryCounts(\n rows: Partial<Record<SummaryCategory, number>>[],\n categoryColumns: readonly SummaryCategory[],\n): Partial<Record<SummaryCategory, number>> {\n const sum: Partial<Record<SummaryCategory, number>> = {};\n for (const categoryCounts of rows) {\n for (const category of categoryColumns) {\n sum[category] = (sum[category] ?? 0) + (categoryCounts[category] ?? 0);\n }\n }\n return sum;\n}\n\nexport function getExpectedPrListSummary(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrListSummary()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n\n const stats = collectBranchStats(branches);\n const sortedBases = sortBaseBranches(Object.keys(stats.prCountByBase));\n const hasMultipleBaseBranches = sortedBases.length > 1;\n\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n const concurrentLimit = resolveConcurrentLimit(config);\n\n if (hasMultipleBaseBranches) {\n let total = 0;\n const parts = sortedBases.map((base) => {\n const count = stats.prCountByBase[base];\n total += count;\n const label = base ? `the \\`${base}\\` branch` : 'the default branch';\n return `${count} Pull Request${count > 1 ? 's' : ''} to ${label}`;\n });\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n total,\n );\n prDesc += `With your current configuration, Renovate will create ${parts.join(' and ')}${limitsNotice}:\\n\\n`;\n } else {\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n stats.prCount,\n );\n prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? 's' : ''}${limitsNotice}:\\n\\n`;\n }\n\n const categoryColumns = getCategoryColumns(stats.presentCategories);\n if (hasMultipleBaseBranches) {\n prDesc += `| Branch | Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| --- | ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const base of sortedBases) {\n const label = base || '$default';\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[base],\n )) {\n prDesc += `| ${label} | ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats).flatMap((b) => Object.values(b)),\n categoryColumns,\n );\n prDesc += `| **Total** | ${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n } else {\n prDesc += `| Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[sortedBases[0]],\n )) {\n prDesc += `| ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats[sortedBases[0]]),\n categoryColumns,\n );\n prDesc += `| **Total**${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n }\n\n prDesc += `\\n<small>Note that a single PR can update multiple files and/or managers, so the above rows may not align with the number of PRs being listed above.</small>\\n`;\n\n // provide a summary of the given security updates, as they're likely more important to the user\n if (Object.keys(stats.securityGroups).length) {\n prDesc += `\\n**Security updates**:\\n\\n`;\n for (const groupBranches of Object.values(stats.securityGroups)) {\n prDesc += describeSecurityGroup(groupBranches);\n }\n }\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < stats.prCount) {\n const notice =\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `Renovate will only work on ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} at a time, so not all Pull Requests will be opened straight away`\n : `Renovate will only keep ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time, so not all of the above will be opened straight away`;\n prDesc += emojify(\n `\\n\\n:children_crossing: ${notice}. See [docs for \\`${concurrentLimit.key}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.\\n\\n`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < stats.prCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < stats.prCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction determineLimitsNotice(\n concurrentLimit: ConcurrentLimit,\n prHourlyLimit: number,\n commitHourlyLimit: number,\n prCount: number,\n): string {\n const clauses: string[] = [];\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < prCount) {\n clauses.push(\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `a maximum of ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} open at a time`\n : `a maximum of ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? 's' : ''}/rebase${commitHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n }\n\n if (clauses.length) {\n return emojify(` (at ${clauses.join(' and ')})`);\n }\n\n if (commitHourlyLimit === 0 && prHourlyLimit === 0) {\n return ' (with no configured maximum of PRs per hour)';\n }\n\n return '';\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pr-list.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/pr/pr-list.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type RenovateConfig,\n type UpdateType,\n UpdateTypesOptions,\n} from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { calcLimit } from '../../../global/limits.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\n\n/**\n * The different categories of dependency updates to output, when providing the summary view.\n *\n * - `security`: if the upgrade is driven by a vulnerability alert\n * - `${updateType}`: if it's set. I.e. `major`\n * - `lockfileUpdate` when `isLockfileUpdate` is true, without an `updateType`\n * - `other`: otherwise\n */\ntype SummaryCategory = UpdateType | 'security' | 'other';\n\n/** Priority order when rendering the `SummaryCategory`s in the summary view.\n *\n * NOTE that this is not exhaustive - this is only the priority order for rendering, and other categories, such as `other` are placed after.\n */\nconst SUMMARY_CATEGORY_PRIORITY_ORDER: readonly SummaryCategory[] = [\n 'security',\n ...UpdateTypesOptions,\n // ... anything else\n];\n\ninterface ConcurrentLimit {\n limit: number;\n key: 'prConcurrentLimit' | 'branchConcurrentLimit';\n}\n\n/**\n * Resolves the concurrent limit that governs how many of the expected Pull Requests can be open at once,\n * reusing the same `calcLimit()` used to enforce these limits (see `lib/workers/global/limits.ts`).\n *\n * `branchConcurrentLimit` only takes priority when it's been explicitly configured (it's `null` by default,\n * in which case `calcLimit()` silently inherits the value of `prConcurrentLimit`) and is actually more\n * restrictive - otherwise we'd misattribute the limit to a setting the user never touched.\n */\nfunction resolveConcurrentLimit(config: RenovateConfig): ConcurrentLimit {\n const configAsUpgrade: BranchUpgradeConfig = {\n branchName: '',\n manager: '',\n prConcurrentLimit: config.prConcurrentLimit,\n branchConcurrentLimit: config.branchConcurrentLimit,\n };\n const prConcurrentLimit = calcLimit([configAsUpgrade], 'prConcurrentLimit');\n const branchConcurrentLimit = calcLimit(\n [configAsUpgrade],\n 'branchConcurrentLimit',\n );\n\n if (\n typeof config.branchConcurrentLimit === 'number' &&\n branchConcurrentLimit > 0 &&\n (prConcurrentLimit === 0 || branchConcurrentLimit < prConcurrentLimit)\n ) {\n return {\n limit: branchConcurrentLimit,\n key: 'branchConcurrentLimit',\n };\n }\n\n return { limit: prConcurrentLimit, key: 'prConcurrentLimit' };\n}\n\nexport function getExpectedPrList(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrList()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n // Vulnerability alert branches bypass all rate/concurrency limits, so they shouldn't count towards them.\n const securityBranchCount = branches.filter(\n (b) => b.isVulnerabilityAlert,\n ).length;\n const throttledBranchCount = branches.length - securityBranchCount;\n\n const { limit: concurrentLimit, key: concurrentLimitKey } =\n resolveConcurrentLimit(config);\n if (concurrentLimit > 0 && concurrentLimit < throttledBranchCount) {\n const securityNote =\n securityBranchCount > 0\n ? `, plus ${securityBranchCount} security update Pull Request${securityBranchCount > 1 ? 's' : ''} which ${securityBranchCount > 1 ? 'are' : 'is'} not subject to this limit`\n : '';\n prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? 's' : ''}, up to a maximum of ${branches.length} over time (see [docs for \\`${concurrentLimitKey}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimitKey.toLowerCase()}))${securityNote}:\\n\\n`;\n } else {\n prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;\n prDesc += branches.length > 1 ? `s:\\n\\n` : `:\\n\\n`;\n }\n\n for (const branch of branches) {\n const prTitleRe = regEx(/@([a-z]+\\/[a-z]+)/);\n // TODO #22198\n prDesc += `<details>\\n<summary>${branch.prTitle!.replace(\n prTitleRe,\n '@&#8203;$1',\n )}</summary>\\n\\n`;\n if (branch.schedule?.length) {\n prDesc += ` - Schedule: ${JSON.stringify(branch.schedule)}\\n`;\n }\n prDesc += ` - Branch name: \\`${branch.branchName}\\`\\n`;\n prDesc += branch.baseBranch\n ? ` - Merge into: \\`${branch.baseBranch}\\`\\n`\n : '';\n const seen: string[] = [];\n for (const upgrade of branch.upgrades) {\n let text = '';\n if (upgrade.updateType === 'lockFileMaintenance') {\n text += ' - Regenerate lock files to use latest dependency versions';\n } else {\n if (upgrade.updateType === 'pin') {\n text += ' - Pin ';\n } else {\n text += ' - Upgrade ';\n }\n if (upgrade.sourceUrl) {\n // TODO: types (#22198)\n text += `[${upgrade.depName!}](${upgrade.sourceUrl})`;\n } else {\n text += upgrade.depName!.replace(prTitleRe, '@&#8203;$1');\n }\n // TODO: types (#22198)\n text += upgrade.isLockfileUpdate\n ? ` to \\`${upgrade.newVersion!}\\``\n : ` to \\`${upgrade.newDigest ?? upgrade.newValue!}\\``;\n text += '\\n';\n }\n if (!seen.includes(text)) {\n prDesc += text;\n seen.push(text);\n }\n }\n prDesc += '\\n\\n';\n prDesc += '</details>\\n\\n';\n }\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n const securityBypassNote =\n securityBranchCount > 0\n ? ` Security update Pull Request${securityBranchCount > 1 ? 's are' : ' is'} not subject to this limit and will be created straight away.`\n : '';\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < throttledBranchCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.${securityBypassNote}\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < throttledBranchCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.${securityBypassNote}\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction getBranchUpgradeTypes(branch: BranchConfig): Set<SummaryCategory> {\n if (branch.isVulnerabilityAlert) {\n return new Set(['security']);\n }\n const types = new Set<SummaryCategory>();\n for (const upgrade of branch.upgrades) {\n if (upgrade.updateType) {\n types.add(upgrade.updateType);\n } else if (upgrade.isLockfileUpdate) {\n types.add('lockfileUpdate');\n } else {\n types.add('other');\n }\n }\n return types;\n}\n\n// Sort: default branch (empty string) first, then named branches alphabetically.\nfunction sortBaseBranches(bases: Iterable<string>): string[] {\n return [...bases].sort((a, b) => {\n if (a === b) {\n /* v8 ignore next -- base branches are unique Record keys; equal comparison cannot occur */\n return 0;\n }\n if (a === '') {\n return -1;\n }\n if (b === '') {\n return 1;\n }\n return a.localeCompare(b);\n });\n}\n\nfunction describeSecurityGroup(groupBranches: BranchConfig[]): string {\n const firstUpgrade = groupBranches[0].upgrades[0];\n const depName = firstUpgrade?.depName ?? groupBranches[0].prTitle ?? '';\n const updateType = firstUpgrade?.updateType ?? 'unknown';\n const packageFiles = groupBranches\n .map((b) => ({ file: b.packageFile ?? '', manager: b.manager }))\n .filter((f) => f.file);\n const uniqueManagers = new Set(packageFiles.map((f) => f.manager));\n\n // Vulnerability alerts can match on datasource + packageName without a specific file (e.g. GitHub vulnerability alerts),\n // so we need to handle an absent packageFile\n if (packageFiles.length === 0) {\n const branchManagers = new Set(groupBranches.map((b) => b.manager));\n if (branchManagers.size === 1) {\n return `- \\`${depName}\\`, (${[...branchManagers][0]}, ${updateType})\\n`;\n }\n\n return `- \\`${depName}\\`, (${updateType}): ${[...branchManagers].sort().join(', ')}\\n`;\n }\n\n if (packageFiles.length === 1) {\n const file = packageFiles[0].file;\n const [manager] = uniqueManagers;\n return `- \\`${depName}\\`, (${manager}, ${updateType}): \\`${file}\\`\\n`;\n }\n\n if (uniqueManagers.size === 1) {\n const manager = [...uniqueManagers][0];\n const fileLines = packageFiles\n .map(({ file }) => ` - \\`${file}\\`\\n`)\n .join('');\n return `- \\`${depName}\\`, (${manager}, ${updateType}):\\n${fileLines}`;\n }\n\n const fileLines = packageFiles\n .map(({ file, manager }) => ` - \\`${file}\\` (${manager})\\n`)\n .join('');\n return `- \\`${depName}\\`, (${updateType}):\\n${fileLines}`;\n}\n\ninterface BranchStats {\n // PR count per base branch, deduplicated by branchName.\n prCountByBase: Record<string, number>;\n // base -> manager -> type -> count, deduplicated by branchName+manager+type.\n tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n >;\n // All upgrade types seen anywhere — drives the table columns.\n presentCategories: Set<SummaryCategory>;\n // Security branches grouped by branchName.\n securityGroups: Record<string, BranchConfig[]>;\n prCount: number;\n}\n\nfunction collectBranchStats(branches: BranchConfig[]): BranchStats {\n const prCountByBase: Record<string, number> = {};\n const tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n > = {};\n const presentTypes = new Set<SummaryCategory>();\n const securityGroups: Record<string, BranchConfig[]> = {};\n const seenPrs = new Set<string>();\n const seenTableKeys = new Set<string>();\n\n for (const branch of branches) {\n const base = branch.baseBranch ?? '';\n const { manager, branchName } = branch;\n const branchTypes = getBranchUpgradeTypes(branch);\n\n for (const type of branchTypes) {\n presentTypes.add(type);\n }\n\n if (!seenPrs.has(branchName)) {\n seenPrs.add(branchName);\n prCountByBase[base] = (prCountByBase[base] ?? 0) + 1;\n }\n\n tableStats[base] ??= {};\n const baseStats = tableStats[base];\n baseStats[manager] ??= {};\n const managerStats = baseStats[manager];\n for (const type of branchTypes) {\n const key = `${branchName}:${manager}:${type}`;\n if (seenTableKeys.has(key)) {\n continue;\n }\n seenTableKeys.add(key);\n managerStats[type] ??= 0;\n managerStats[type]++;\n }\n\n if (branch.isVulnerabilityAlert) {\n securityGroups[branchName] ??= [];\n securityGroups[branchName].push(branch);\n }\n }\n\n return {\n prCountByBase,\n tableStats,\n presentCategories: presentTypes,\n securityGroups,\n prCount: seenPrs.size,\n };\n}\n\nfunction getCategoryColumns(\n presentTypes: Set<SummaryCategory>,\n): SummaryCategory[] {\n const cols: SummaryCategory[] = SUMMARY_CATEGORY_PRIORITY_ORDER.filter((t) =>\n presentTypes.has(t),\n );\n // Append any present types not in the standard display order\n // (e.g. lockfileUpdate, bump).\n for (const t of presentTypes) {\n if (t !== 'other' && !cols.includes(t)) {\n cols.push(t);\n }\n }\n\n if (presentTypes.has('other')) {\n cols.push('other');\n }\n\n return cols;\n}\n\nfunction categoriesToColumnHeaders(cols: readonly string[]): string {\n /* v8 ignore next -- branches always have at least one upgrade, so cols is never empty in practice */\n if (cols.length === 0) {\n return '';\n }\n return ` | ${cols.join(' | ')}`;\n}\n\nfunction renderRowCounts(\n typeColumns: readonly SummaryCategory[],\n typeCounts: Partial<Record<SummaryCategory, number>>,\n): string {\n return categoriesToColumnHeaders(\n typeColumns.map((t) => `${typeCounts[t] ?? 0}`),\n );\n}\n\nfunction sumCategoryCounts(\n rows: Partial<Record<SummaryCategory, number>>[],\n categoryColumns: readonly SummaryCategory[],\n): Partial<Record<SummaryCategory, number>> {\n const sum: Partial<Record<SummaryCategory, number>> = {};\n for (const categoryCounts of rows) {\n for (const category of categoryColumns) {\n sum[category] = (sum[category] ?? 0) + (categoryCounts[category] ?? 0);\n }\n }\n return sum;\n}\n\nexport function getExpectedPrListSummary(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrListSummary()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n\n const stats = collectBranchStats(branches);\n const sortedBases = sortBaseBranches(Object.keys(stats.prCountByBase));\n const hasMultipleBaseBranches = sortedBases.length > 1;\n\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n const concurrentLimit = resolveConcurrentLimit(config);\n // Vulnerability alert branches bypass all rate/concurrency limits, so they shouldn't count towards them.\n const securityCount = Object.keys(stats.securityGroups).length;\n\n if (hasMultipleBaseBranches) {\n let total = 0;\n const parts = sortedBases.map((base) => {\n const count = stats.prCountByBase[base];\n total += count;\n const label = base ? `the \\`${base}\\` branch` : 'the default branch';\n return `${count} Pull Request${count > 1 ? 's' : ''} to ${label}`;\n });\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n total - securityCount,\n securityCount,\n );\n prDesc += `With your current configuration, Renovate will create ${parts.join(' and ')}${limitsNotice}:\\n\\n`;\n } else {\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n stats.prCount - securityCount,\n securityCount,\n );\n prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? 's' : ''}${limitsNotice}:\\n\\n`;\n }\n\n const categoryColumns = getCategoryColumns(stats.presentCategories);\n if (hasMultipleBaseBranches) {\n prDesc += `| Branch | Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| --- | ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const base of sortedBases) {\n const label = base || '$default';\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[base],\n )) {\n prDesc += `| ${label} | ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats).flatMap((b) => Object.values(b)),\n categoryColumns,\n );\n prDesc += `| **Total** | ${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n } else {\n prDesc += `| Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[sortedBases[0]],\n )) {\n prDesc += `| ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats[sortedBases[0]]),\n categoryColumns,\n );\n prDesc += `| **Total**${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n }\n\n prDesc += `\\n<small>Note that a single PR can update multiple files and/or managers, so the above rows may not align with the number of PRs being listed above.</small>\\n`;\n\n // provide a summary of the given security updates, as they're likely more important to the user\n if (Object.keys(stats.securityGroups).length) {\n prDesc += `\\n**Security updates**:\\n\\n`;\n for (const groupBranches of Object.values(stats.securityGroups)) {\n prDesc += describeSecurityGroup(groupBranches);\n }\n }\n\n const throttledPrCount = stats.prCount - securityCount;\n const securityBypassNote =\n securityCount > 0\n ? ` Security update Pull Request${securityCount > 1 ? 's are' : ' is'} not subject to this limit and will be created straight away.`\n : '';\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < throttledPrCount) {\n const notice =\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `Renovate will only work on ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} at a time, so not all Pull Requests will be opened straight away`\n : `Renovate will only keep ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time, so not all of the above will be opened straight away`;\n prDesc += emojify(\n `\\n\\n:children_crossing: ${notice}. See [docs for \\`${concurrentLimit.key}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.${securityBypassNote}\\n\\n`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < throttledPrCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.${securityBypassNote}\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < throttledPrCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.${securityBypassNote}\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction determineLimitsNotice(\n concurrentLimit: ConcurrentLimit,\n prHourlyLimit: number,\n commitHourlyLimit: number,\n prCount: number,\n securityCount: number,\n): string {\n const clauses: string[] = [];\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < prCount) {\n clauses.push(\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `a maximum of ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} open at a time`\n : `a maximum of ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? 's' : ''}/rebase${commitHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n }\n\n if (!clauses.length) {\n if (commitHourlyLimit === 0 && prHourlyLimit === 0) {\n return ' (with no configured maximum of PRs per hour)';\n }\n return '';\n }\n\n const securityNote =\n securityCount > 0\n ? `, plus ${securityCount} security update${securityCount > 1 ? 's' : ''} which ${securityCount > 1 ? \"aren't\" : \"isn't\"} subject to these limits`\n : '';\n\n return emojify(` (at ${clauses.join(' and ')}${securityNote})`);\n}\n"],"mappings":"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"}
@@ -85,10 +85,12 @@ var Vulnerabilities = class Vulnerabilities {
85
85
  }
86
86
  const packageName = dep.packageName ?? dep.depName;
87
87
  let osvPackageName = packageName;
88
+ let depType;
88
89
  if (ecosystem === "PyPI") osvPackageName = osvPackageName.toLowerCase().replace(regEx(/[_.-]+/g), "-");
89
90
  else if (ecosystem === "Go" && packageName === "go") {
90
91
  if (dep.depType !== "toolchain") return null;
91
92
  osvPackageName = "stdlib";
93
+ depType = dep.depType;
92
94
  }
93
95
  try {
94
96
  const osvVulnerabilities = await instrument("get OSV vulnerabilities", () => this.osvOffline.getVulnerabilities(ecosystem, osvPackageName), { attributes: {
@@ -122,6 +124,7 @@ var Vulnerabilities = class Vulnerabilities {
122
124
  osvPackageName,
123
125
  vulnerability: osvVulnerability,
124
126
  affected,
127
+ depType,
125
128
  depVersion,
126
129
  fixedVersion,
127
130
  datasource: dep.datasource,
@@ -242,7 +245,7 @@ var Vulnerabilities = class Vulnerabilities {
242
245
  return versioningApi.isVersion(version) && versioningApi.isVersion(other) && (versioningApi.equals(version, other) || versioningApi.isGreaterThan(version, other));
243
246
  }
244
247
  vulnerabilityToPackageRules(vul) {
245
- const { vulnerability, affected, packageName, depVersion, fixedVersion, datasource, packageFileConfig } = vul;
248
+ const { vulnerability, affected, packageName, depType, depVersion, fixedVersion, datasource, packageFileConfig } = vul;
246
249
  if (isNullOrUndefined(fixedVersion)) {
247
250
  logger.debug(`No fixed version available for vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`);
248
251
  return null;
@@ -256,6 +259,7 @@ var Vulnerabilities = class Vulnerabilities {
256
259
  return {
257
260
  matchDatasources: [datasource],
258
261
  matchPackageNames: [packageName],
262
+ ...depType ? { matchDepTypes: [depType] } : {},
259
263
  matchCurrentVersion: depVersion,
260
264
  versioning,
261
265
  allowedVersions: fixedVersion,
@@ -1 +1 @@
1
- {"version":3,"file":"vulnerabilities.js","names":["p.all","getVersioning"],"sources":["../../../../lib/workers/repository/process/vulnerabilities.ts"],"sourcesContent":["// TODO #22198\nimport type { Ecosystem, Osv } from '@renovatebot/osv-offline';\nimport { OsvOffline } from '@renovatebot/osv-offline';\nimport {\n isEmptyArray,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport type { CvssVector } from 'ae-cvss-calculator';\nimport * as _aeCvss from 'ae-cvss-calculator';\nimport { z } from 'zod/v4';\nimport { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { PackageRule, RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { getDefaultVersioning } from '../../../modules/datasource/common.ts';\nimport type {\n PackageDependency,\n PackageFile,\n} from '../../../modules/manager/types.ts';\nimport type { VersioningApi } from '../../../modules/versioning/index.ts';\nimport { get as getVersioning } from '../../../modules/versioning/index.ts';\nimport { sanitizeMarkdown } from '../../../util/markdown.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { titleCase } from '../../../util/string.ts';\nimport { datasourceToOsvEcosystem } from '../../../util/vulnerability/ecosystem.ts';\nimport {\n getFixedVersionConstraint,\n getLastAffectedVersionConstraint,\n} from '../../../util/vulnerability/utils.ts';\nimport type {\n DependencyVulnerabilities,\n SeverityDetails,\n Vulnerability,\n} from './types.ts';\n\nconst { fromVector } = (_aeCvss as unknown as { default: typeof _aeCvss })\n .default;\n\nexport class Vulnerabilities {\n private static osvOffline: Promise<OsvOffline> | undefined;\n\n private osvOffline: OsvOffline;\n\n private static readonly datasourceEcosystemMap = datasourceToOsvEcosystem;\n\n private constructor(osvOffline: OsvOffline) {\n this.osvOffline = osvOffline;\n }\n\n private static initialize(): Promise<OsvOffline> {\n // no async here, so osv promise will only be created once\n Vulnerabilities.osvOffline ??= OsvOffline.create();\n return Vulnerabilities.osvOffline;\n }\n\n static async create(): Promise<Vulnerabilities> {\n // intialize osv only once\n const osvOffline = await Vulnerabilities.initialize();\n\n const instance = new Vulnerabilities(osvOffline);\n return instance;\n }\n\n async appendVulnerabilityPackageRules(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<void> {\n const dependencyVulnerabilities = await this.fetchDependencyVulnerabilities(\n config,\n packageFiles,\n );\n\n config.packageRules ??= [];\n for (const {\n vulnerabilities,\n versioningApi,\n } of dependencyVulnerabilities) {\n const groupPackageRules: PackageRule[] = [];\n for (const vulnerability of vulnerabilities) {\n const rule = this.vulnerabilityToPackageRules(vulnerability);\n if (isNullOrUndefined(rule)) {\n continue;\n }\n groupPackageRules.push(rule);\n }\n this.sortByFixedVersion(groupPackageRules, versioningApi);\n\n config.packageRules.push(...groupPackageRules);\n }\n }\n\n async fetchVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<Vulnerability[]> {\n const groups = await this.fetchDependencyVulnerabilities(\n config,\n packageFiles,\n );\n return groups.flatMap((group) => group.vulnerabilities);\n }\n\n private async fetchDependencyVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<DependencyVulnerabilities[]> {\n const managers = Object.keys(packageFiles);\n const allManagerJobs = managers.map((manager) =>\n this.fetchManagerVulnerabilities(config, packageFiles, manager),\n );\n return (await Promise.all(allManagerJobs)).flat();\n }\n\n private async fetchManagerVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n manager: string,\n ): Promise<DependencyVulnerabilities[]> {\n const managerConfig = getManagerConfig(config, manager);\n const queue = packageFiles[manager].map(\n (pFile) => (): Promise<DependencyVulnerabilities[]> =>\n this.fetchManagerPackageFileVulnerabilities(managerConfig, pFile),\n );\n logger.trace(\n { manager, queueLength: queue.length },\n 'fetchManagerVulnerabilities starting',\n );\n const result = (await p.all(queue)).flat();\n logger.trace({ manager }, 'fetchManagerVulnerabilities finished');\n return result;\n }\n\n private async fetchManagerPackageFileVulnerabilities(\n managerConfig: RenovateConfig,\n pFile: PackageFile,\n ): Promise<DependencyVulnerabilities[]> {\n const { packageFile } = pFile;\n const packageFileConfig = mergeChildConfig(managerConfig, pFile);\n const { manager } = packageFileConfig;\n const queue = pFile.deps.map(\n (dep) => (): Promise<DependencyVulnerabilities | null> =>\n this.fetchDependencyVulnerability(packageFileConfig, dep),\n );\n logger.trace(\n { manager, packageFile, queueLength: queue.length },\n 'fetchManagerPackageFileVulnerabilities starting with concurrency',\n );\n\n const result = await p.all(queue);\n logger.trace(\n { packageFile },\n 'fetchManagerPackageFileVulnerabilities finished',\n );\n\n return result.filter(isTruthy);\n }\n\n private async fetchDependencyVulnerability(\n packageFileConfig: RenovateConfig & PackageFile,\n dep: PackageDependency,\n ): Promise<DependencyVulnerabilities | null> {\n const ecosystem = Vulnerabilities.datasourceEcosystemMap[dep.datasource!];\n if (!ecosystem) {\n logger.trace(`Cannot map datasource ${dep.datasource!} to OSV ecosystem`);\n return null;\n }\n\n const packageName = dep.packageName ?? dep.depName!;\n let osvPackageName = packageName;\n if (ecosystem === 'PyPI') {\n // https://peps.python.org/pep-0503/#normalized-names\n osvPackageName = osvPackageName\n .toLowerCase()\n .replace(regEx(/[_.-]+/g), '-');\n } else if (ecosystem === 'Go' && packageName === 'go') {\n if (dep.depType !== 'toolchain') {\n // The `go` directive is source compatibility, not the build toolchain, so we skip it\n return null;\n }\n osvPackageName = 'stdlib';\n }\n\n try {\n const osvVulnerabilities = await instrument(\n 'get OSV vulnerabilities',\n () => this.osvOffline.getVulnerabilities(ecosystem, osvPackageName),\n {\n attributes: {\n osvPackageName,\n ecosystem,\n },\n },\n );\n if (\n isNullOrUndefined(osvVulnerabilities) ||\n isEmptyArray(osvVulnerabilities)\n ) {\n logger.trace(\n `No vulnerabilities found in OSV database for ${packageName}`,\n );\n return null;\n }\n\n const depVersion =\n dep.lockedVersion ?? dep.currentVersion ?? dep.currentValue!;\n\n const versioning = dep.versioning ?? getDefaultVersioning(dep.datasource);\n const versioningApi = getVersioning(versioning);\n\n if (!versioningApi.isVersion(depVersion)) {\n logger.debug(\n `Skipping vulnerability lookup for package ${packageName} due to unsupported version ${depVersion}`,\n );\n return null;\n }\n\n const vulnerabilities: Vulnerability[] = [];\n for (const osvVulnerability of osvVulnerabilities) {\n if (osvVulnerability.withdrawn) {\n logger.trace(\n `Skipping withdrawn vulnerability ${osvVulnerability.id}`,\n );\n continue;\n }\n\n this.skipMaliciousPackages(\n ecosystem,\n osvPackageName,\n depVersion,\n versioningApi,\n dep,\n packageFileConfig.manager,\n packageFileConfig.packageFile,\n osvVulnerability,\n );\n\n for (const affected of osvVulnerability.affected ?? []) {\n const isVulnerable = this.isPackageVulnerable(\n ecosystem,\n osvPackageName,\n depVersion,\n affected,\n versioningApi,\n );\n if (!isVulnerable) {\n continue;\n }\n\n logger.debug(\n `Vulnerability ${osvVulnerability.id} affects ${packageName} ${depVersion}`,\n );\n const fixedVersion = this.getFixedVersion(\n ecosystem,\n depVersion,\n affected,\n versioningApi,\n );\n\n vulnerabilities.push({\n packageName,\n osvPackageName,\n vulnerability: osvVulnerability,\n affected,\n depVersion,\n fixedVersion,\n datasource: dep.datasource!,\n packageFileConfig,\n });\n }\n }\n\n return { vulnerabilities, versioningApi };\n } catch (err) {\n logger.warn(\n { err, packageName },\n 'Error fetching vulnerability information for package',\n );\n return null;\n }\n }\n\n private skipMaliciousPackages(\n ecosystem: Ecosystem,\n osvPackageName: string,\n depVersion: string,\n versioningApi: VersioningApi,\n dep: PackageDependency,\n manager: string | undefined,\n packageFile: string,\n osvVulnerability: Osv.Vulnerability,\n ): void {\n // the OpenSSF's Malicious Packages (https://github.com/ossf/malicious-packages) is a source of advisories through osv.dev, which takes various sources of advisories, and will re-publish them with more specific information about their malicious usage\n if (osvVulnerability.id.startsWith('MAL-')) {\n // is the current dependency vulnerable?\n for (const affected of osvVulnerability.affected ?? []) {\n // is the current dependency vulnerable?\n const isVulnerable = this.isPackageVulnerable(\n ecosystem,\n osvPackageName,\n depVersion,\n affected,\n versioningApi,\n );\n\n if (isVulnerable) {\n logger.debug(\n {\n packageFile: packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n currentVersion: depVersion,\n },\n `Marking ${dep.depName} as skipReason=malicious-version-in-use, as it is affected by ${osvVulnerability.id}`,\n );\n dep.skipReason = 'malicious-version-in-use';\n dep.skipStage = 'lookup';\n }\n\n // or are any of the updates vulnerable?\n for (const update of dep.updates ?? []) {\n const newVersion = update.newVersion ?? update.newValue!;\n\n const isUpdateVulnerable = this.isPackageVulnerable(\n ecosystem,\n osvPackageName,\n newVersion,\n affected,\n versioningApi,\n );\n\n if (isUpdateVulnerable) {\n logger.debug(\n {\n packageFile: packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n currentVersion: depVersion,\n newVersion,\n },\n `Marking ${dep.depName}'s update to ${newVersion} as skipReason=malicious-update-proposed, as it is affected by ${osvVulnerability.id}`,\n );\n dep.skipReason = 'malicious-update-proposed';\n dep.skipStage = 'lookup';\n }\n }\n }\n }\n }\n\n private sortByFixedVersion(\n packageRules: PackageRule[],\n versioningApi: VersioningApi,\n ): void {\n const versionsCleaned: Record<string, string> = {};\n for (const rule of packageRules) {\n const version = rule.allowedVersions!;\n versionsCleaned[version] = version.replace(regEx(/[(),=> ]+/g), '');\n }\n packageRules.sort((a, b) =>\n versioningApi.sortVersions(\n versionsCleaned[a.allowedVersions!],\n versionsCleaned[b.allowedVersions!],\n ),\n );\n }\n\n // https://ossf.github.io/osv-schema/#affectedrangesevents-fields\n private sortEvents(\n events: Osv.Event[],\n versioningApi: VersioningApi,\n ): Osv.Event[] {\n const sortedCopy: Osv.Event[] = [];\n let zeroEvent: Osv.Event | null = null;\n\n for (const event of events) {\n if (event.introduced === '0') {\n zeroEvent = event;\n } else if (versioningApi.isVersion(Object.values(event)[0])) {\n sortedCopy.push(event);\n } else {\n logger.debug({ event }, 'Skipping OSV event with invalid version');\n }\n }\n\n sortedCopy.sort((a, b) =>\n // no pre-processing, as there are only very few values to sort\n versioningApi.sortVersions(Object.values(a)[0], Object.values(b)[0]),\n );\n\n if (zeroEvent) {\n sortedCopy.unshift(zeroEvent);\n }\n\n return sortedCopy;\n }\n\n private isPackageAffected(\n ecosystem: Ecosystem,\n osvPackageName: string,\n affected: Osv.Affected,\n ): boolean {\n const pkg = affected.package;\n if (pkg?.name !== osvPackageName) {\n return false;\n }\n\n // Match exact ecosystems and OSV sub-ecosystems (e.g. Packagist:https://packages.drupal.org/8).\n return (\n pkg.ecosystem === ecosystem || pkg.ecosystem.startsWith(`${ecosystem}:`)\n );\n }\n\n private includedInVersions(\n depVersion: string,\n affected: Osv.Affected,\n ): boolean {\n return !!affected.versions?.includes(depVersion);\n }\n\n private includedInRanges(\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): boolean {\n for (const range of affected.ranges ?? []) {\n if (range.type === 'GIT') {\n continue;\n }\n\n let vulnerable = false;\n for (const event of this.sortEvents(range.events, versioningApi)) {\n if (\n isNonEmptyString(event.introduced) &&\n (event.introduced === '0' ||\n this.isVersionGtOrEq(depVersion, event.introduced, versioningApi))\n ) {\n vulnerable = true;\n } else if (\n isNonEmptyString(event.fixed) &&\n this.isVersionGtOrEq(depVersion, event.fixed, versioningApi)\n ) {\n vulnerable = false;\n } else if (\n isNonEmptyString(event.last_affected) &&\n this.isVersionGt(depVersion, event.last_affected, versioningApi)\n ) {\n vulnerable = false;\n }\n }\n\n if (vulnerable) {\n return true;\n }\n }\n\n return false;\n }\n\n // https://ossf.github.io/osv-schema/#evaluation\n private isPackageVulnerable(\n ecosystem: Ecosystem,\n osvPackageName: string,\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n this.isPackageAffected(ecosystem, osvPackageName, affected) &&\n (this.includedInVersions(depVersion, affected) ||\n this.includedInRanges(depVersion, affected, versioningApi))\n );\n }\n\n private getFixedVersion(\n ecosystem: Ecosystem,\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): string | null {\n const fixedVersions: string[] = [];\n const lastAffectedVersions: string[] = [];\n\n for (const range of affected.ranges ?? []) {\n if (range.type === 'GIT') {\n continue;\n }\n\n for (const event of range.events) {\n if (\n isNonEmptyString(event.fixed) &&\n versioningApi.isVersion(event.fixed)\n ) {\n fixedVersions.push(event.fixed);\n } else if (\n isNonEmptyString(event.last_affected) &&\n versioningApi.isVersion(event.last_affected)\n ) {\n lastAffectedVersions.push(event.last_affected);\n }\n }\n }\n\n fixedVersions.sort((a, b) => versioningApi.sortVersions(a, b));\n const fixedVersion = fixedVersions.find((version) =>\n this.isVersionGt(version, depVersion, versioningApi),\n );\n if (fixedVersion) {\n return this.getFixedVersionByEcosystem(fixedVersion, ecosystem);\n }\n\n lastAffectedVersions.sort((a, b) => versioningApi.sortVersions(a, b));\n const lastAffected = lastAffectedVersions.find((version) =>\n this.isVersionGtOrEq(version, depVersion, versioningApi),\n );\n if (lastAffected) {\n return this.getLastAffectedByEcosystem(lastAffected, ecosystem);\n }\n\n return null;\n }\n\n private getFixedVersionByEcosystem(\n fixedVersion: string,\n ecosystem: Ecosystem,\n ): string {\n return getFixedVersionConstraint(fixedVersion, ecosystem);\n }\n\n private getLastAffectedByEcosystem(\n lastAffected: string,\n ecosystem: Ecosystem,\n ): string {\n return getLastAffectedVersionConstraint(lastAffected, ecosystem);\n }\n\n private isVersionGt(\n version: string,\n other: string,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n versioningApi.isVersion(version) &&\n versioningApi.isVersion(other) &&\n versioningApi.isGreaterThan(version, other)\n );\n }\n\n private isVersionGtOrEq(\n version: string,\n other: string,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n versioningApi.isVersion(version) &&\n versioningApi.isVersion(other) &&\n (versioningApi.equals(version, other) ||\n versioningApi.isGreaterThan(version, other))\n );\n }\n\n private vulnerabilityToPackageRules(vul: Vulnerability): PackageRule | null {\n const {\n vulnerability,\n affected,\n packageName,\n depVersion,\n fixedVersion,\n datasource,\n packageFileConfig,\n } = vul;\n if (isNullOrUndefined(fixedVersion)) {\n logger.debug(\n `No fixed version available for vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`,\n );\n return null;\n }\n\n // we don't know if the dependency has a `versioning` applied to it already, so we have to use the default for the datasource\n const versioning = getDefaultVersioning(datasource);\n\n logger.debug(\n {\n datasource,\n versioning,\n },\n\n `Setting allowed version ${fixedVersion} to fix vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`,\n );\n\n const severityDetails = this.extractSeverityDetails(\n vulnerability,\n affected,\n );\n\n return {\n matchDatasources: [datasource],\n matchPackageNames: [packageName],\n matchCurrentVersion: depVersion,\n versioning,\n allowedVersions: fixedVersion,\n isVulnerabilityAlert: true,\n vulnerabilitySeverity: severityDetails.severityLevel,\n prBodyNotes: this.generatePrBodyNotes(vulnerability, affected),\n force: {\n ...packageFileConfig.vulnerabilityAlerts,\n },\n };\n }\n\n static evaluateCvssVector(vector: string): [string, string] {\n const CvssJson = z.object({\n baseScore: z.number().default(0.0),\n baseSeverity: z.string().toUpperCase().default('UNKNOWN'),\n });\n\n try {\n const parsedCvssScore: CvssVector<any> | null = fromVector(vector);\n const res = CvssJson.parse(parsedCvssScore?.createJsonSchema());\n\n return [res.baseScore.toFixed(1), res.baseSeverity];\n } catch {\n logger.debug(`Error processing CVSS vector ${vector}`);\n }\n\n return ['', ''];\n }\n\n private generatePrBodyNotes(\n vulnerability: Osv.Vulnerability,\n affected: Osv.Affected,\n ): string[] {\n let aliases = [vulnerability.id].concat(vulnerability.aliases ?? []).sort();\n aliases = aliases.map((id) => {\n if (id.startsWith('CVE-')) {\n return `[${id}](https://nvd.nist.gov/vuln/detail/${id})`;\n }\n if (id.startsWith('GHSA-')) {\n return `[${id}](https://github.com/advisories/${id})`;\n }\n if (id.startsWith('GO-')) {\n return `[${id}](https://pkg.go.dev/vuln/${id})`;\n }\n if (id.startsWith('RUSTSEC-')) {\n return `[${id}](https://rustsec.org/advisories/${id}.html)`;\n }\n\n return id;\n });\n\n let content = '\\n\\n---\\n\\n### ';\n content += vulnerability.summary ? `${vulnerability.summary}\\n` : '';\n content += `${aliases.join(' / ')}\\n`;\n content += `\\n<details>\\n<summary>More information</summary>\\n`;\n\n const details = vulnerability.details?.replace(\n regEx(/^#{1,4} /gm),\n '##### ',\n );\n content += `#### Details\\n${details ?? 'No details.'}\\n`;\n\n content += '#### Severity\\n';\n const severityDetails = this.extractSeverityDetails(\n vulnerability,\n affected,\n );\n\n if (severityDetails.cvssVector) {\n content += `- CVSS Score: ${severityDetails.score}\\n`;\n content += `- Vector String: \\`${severityDetails.cvssVector}\\`\\n`;\n } else {\n content += `${titleCase(severityDetails.severityLevel)}\\n`;\n }\n\n content += `\\n#### References\\n${\n vulnerability.references\n ?.map((ref) => {\n return `- [${ref.url}](${ref.url})`;\n })\n .join('\\n') ?? 'No references.'\n }`;\n\n let attribution = '';\n if (vulnerability.id.startsWith('GHSA-')) {\n attribution = ` and the [GitHub Advisory Database](https://github.com/github/advisory-database) ([CC-BY 4.0](https://github.com/github/advisory-database/blob/main/LICENSE.md))`;\n } else if (vulnerability.id.startsWith('GO-')) {\n attribution = ` and the [Go Vulnerability Database](https://github.com/golang/vulndb) ([CC-BY 4.0](https://github.com/golang/vulndb#license))`;\n } else if (vulnerability.id.startsWith('PYSEC-')) {\n attribution = ` and the [PyPI Advisory Database](https://github.com/pypa/advisory-database) ([CC-BY 4.0](https://github.com/pypa/advisory-database/blob/main/LICENSE))`;\n } else if (vulnerability.id.startsWith('RUSTSEC-')) {\n attribution = ` and the [Rust Advisory Database](https://github.com/RustSec/advisory-db) ([CC0 1.0](https://github.com/rustsec/advisory-db/blob/main/LICENSE.txt))`;\n }\n content += `\\n\\nThis data is provided by [OSV](https://osv.dev/vulnerability/${vulnerability.id})${attribution}.\\n`;\n content += `</details>`;\n\n return [sanitizeMarkdown(content)];\n }\n\n private extractSeverityDetails(\n vulnerability: Osv.Vulnerability,\n affected: Osv.Affected,\n ): SeverityDetails {\n let severityLevel = 'UNKNOWN';\n let score = 'Unknown';\n\n const cvssVector =\n vulnerability.severity?.find((e) => e.type === 'CVSS_V4')?.score ??\n vulnerability.severity?.find((e) => e.type === 'CVSS_V3')?.score ??\n (affected.database_specific?.cvss as string); // RUSTSEC\n\n if (cvssVector) {\n const [baseScore, severity] =\n Vulnerabilities.evaluateCvssVector(cvssVector);\n severityLevel = severity ? severity.toUpperCase() : 'UNKNOWN';\n score = baseScore\n ? `${baseScore} / 10 (${titleCase(severityLevel)})`\n : 'Unknown';\n } else if (\n vulnerability.id.startsWith('GHSA-') &&\n vulnerability.database_specific?.severity\n ) {\n const severity = vulnerability.database_specific.severity as string;\n severityLevel = severity.toUpperCase();\n }\n\n return {\n cvssVector,\n score,\n severityLevel,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vulnerabilities.js","names":["p.all","getVersioning"],"sources":["../../../../lib/workers/repository/process/vulnerabilities.ts"],"sourcesContent":["// TODO #22198\nimport type { Ecosystem, Osv } from '@renovatebot/osv-offline';\nimport { OsvOffline } from '@renovatebot/osv-offline';\nimport {\n isEmptyArray,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport type { CvssVector } from 'ae-cvss-calculator';\nimport * as _aeCvss from 'ae-cvss-calculator';\nimport { z } from 'zod/v4';\nimport { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { PackageRule, RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { getDefaultVersioning } from '../../../modules/datasource/common.ts';\nimport type {\n PackageDependency,\n PackageFile,\n} from '../../../modules/manager/types.ts';\nimport type { VersioningApi } from '../../../modules/versioning/index.ts';\nimport { get as getVersioning } from '../../../modules/versioning/index.ts';\nimport { sanitizeMarkdown } from '../../../util/markdown.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { titleCase } from '../../../util/string.ts';\nimport { datasourceToOsvEcosystem } from '../../../util/vulnerability/ecosystem.ts';\nimport {\n getFixedVersionConstraint,\n getLastAffectedVersionConstraint,\n} from '../../../util/vulnerability/utils.ts';\nimport type {\n DependencyVulnerabilities,\n SeverityDetails,\n Vulnerability,\n} from './types.ts';\n\nconst { fromVector } = (_aeCvss as unknown as { default: typeof _aeCvss })\n .default;\n\nexport class Vulnerabilities {\n private static osvOffline: Promise<OsvOffline> | undefined;\n\n private osvOffline: OsvOffline;\n\n private static readonly datasourceEcosystemMap = datasourceToOsvEcosystem;\n\n private constructor(osvOffline: OsvOffline) {\n this.osvOffline = osvOffline;\n }\n\n private static initialize(): Promise<OsvOffline> {\n // no async here, so osv promise will only be created once\n Vulnerabilities.osvOffline ??= OsvOffline.create();\n return Vulnerabilities.osvOffline;\n }\n\n static async create(): Promise<Vulnerabilities> {\n // intialize osv only once\n const osvOffline = await Vulnerabilities.initialize();\n\n const instance = new Vulnerabilities(osvOffline);\n return instance;\n }\n\n async appendVulnerabilityPackageRules(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<void> {\n const dependencyVulnerabilities = await this.fetchDependencyVulnerabilities(\n config,\n packageFiles,\n );\n\n config.packageRules ??= [];\n for (const {\n vulnerabilities,\n versioningApi,\n } of dependencyVulnerabilities) {\n const groupPackageRules: PackageRule[] = [];\n for (const vulnerability of vulnerabilities) {\n const rule = this.vulnerabilityToPackageRules(vulnerability);\n if (isNullOrUndefined(rule)) {\n continue;\n }\n groupPackageRules.push(rule);\n }\n this.sortByFixedVersion(groupPackageRules, versioningApi);\n\n config.packageRules.push(...groupPackageRules);\n }\n }\n\n async fetchVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<Vulnerability[]> {\n const groups = await this.fetchDependencyVulnerabilities(\n config,\n packageFiles,\n );\n return groups.flatMap((group) => group.vulnerabilities);\n }\n\n private async fetchDependencyVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<DependencyVulnerabilities[]> {\n const managers = Object.keys(packageFiles);\n const allManagerJobs = managers.map((manager) =>\n this.fetchManagerVulnerabilities(config, packageFiles, manager),\n );\n return (await Promise.all(allManagerJobs)).flat();\n }\n\n private async fetchManagerVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n manager: string,\n ): Promise<DependencyVulnerabilities[]> {\n const managerConfig = getManagerConfig(config, manager);\n const queue = packageFiles[manager].map(\n (pFile) => (): Promise<DependencyVulnerabilities[]> =>\n this.fetchManagerPackageFileVulnerabilities(managerConfig, pFile),\n );\n logger.trace(\n { manager, queueLength: queue.length },\n 'fetchManagerVulnerabilities starting',\n );\n const result = (await p.all(queue)).flat();\n logger.trace({ manager }, 'fetchManagerVulnerabilities finished');\n return result;\n }\n\n private async fetchManagerPackageFileVulnerabilities(\n managerConfig: RenovateConfig,\n pFile: PackageFile,\n ): Promise<DependencyVulnerabilities[]> {\n const { packageFile } = pFile;\n const packageFileConfig = mergeChildConfig(managerConfig, pFile);\n const { manager } = packageFileConfig;\n const queue = pFile.deps.map(\n (dep) => (): Promise<DependencyVulnerabilities | null> =>\n this.fetchDependencyVulnerability(packageFileConfig, dep),\n );\n logger.trace(\n { manager, packageFile, queueLength: queue.length },\n 'fetchManagerPackageFileVulnerabilities starting with concurrency',\n );\n\n const result = await p.all(queue);\n logger.trace(\n { packageFile },\n 'fetchManagerPackageFileVulnerabilities finished',\n );\n\n return result.filter(isTruthy);\n }\n\n private async fetchDependencyVulnerability(\n packageFileConfig: RenovateConfig & PackageFile,\n dep: PackageDependency,\n ): Promise<DependencyVulnerabilities | null> {\n const ecosystem = Vulnerabilities.datasourceEcosystemMap[dep.datasource!];\n if (!ecosystem) {\n logger.trace(`Cannot map datasource ${dep.datasource!} to OSV ecosystem`);\n return null;\n }\n\n const packageName = dep.packageName ?? dep.depName!;\n let osvPackageName = packageName;\n let depType: string | undefined;\n if (ecosystem === 'PyPI') {\n // https://peps.python.org/pep-0503/#normalized-names\n osvPackageName = osvPackageName\n .toLowerCase()\n .replace(regEx(/[_.-]+/g), '-');\n } else if (ecosystem === 'Go' && packageName === 'go') {\n if (dep.depType !== 'toolchain') {\n // The `go` directive is source compatibility, not the build toolchain, so we skip it\n return null;\n }\n osvPackageName = 'stdlib';\n depType = dep.depType;\n }\n\n try {\n const osvVulnerabilities = await instrument(\n 'get OSV vulnerabilities',\n () => this.osvOffline.getVulnerabilities(ecosystem, osvPackageName),\n {\n attributes: {\n osvPackageName,\n ecosystem,\n },\n },\n );\n if (\n isNullOrUndefined(osvVulnerabilities) ||\n isEmptyArray(osvVulnerabilities)\n ) {\n logger.trace(\n `No vulnerabilities found in OSV database for ${packageName}`,\n );\n return null;\n }\n\n const depVersion =\n dep.lockedVersion ?? dep.currentVersion ?? dep.currentValue!;\n\n const versioning = dep.versioning ?? getDefaultVersioning(dep.datasource);\n const versioningApi = getVersioning(versioning);\n\n if (!versioningApi.isVersion(depVersion)) {\n logger.debug(\n `Skipping vulnerability lookup for package ${packageName} due to unsupported version ${depVersion}`,\n );\n return null;\n }\n\n const vulnerabilities: Vulnerability[] = [];\n for (const osvVulnerability of osvVulnerabilities) {\n if (osvVulnerability.withdrawn) {\n logger.trace(\n `Skipping withdrawn vulnerability ${osvVulnerability.id}`,\n );\n continue;\n }\n\n this.skipMaliciousPackages(\n ecosystem,\n osvPackageName,\n depVersion,\n versioningApi,\n dep,\n packageFileConfig.manager,\n packageFileConfig.packageFile,\n osvVulnerability,\n );\n\n for (const affected of osvVulnerability.affected ?? []) {\n const isVulnerable = this.isPackageVulnerable(\n ecosystem,\n osvPackageName,\n depVersion,\n affected,\n versioningApi,\n );\n if (!isVulnerable) {\n continue;\n }\n\n logger.debug(\n `Vulnerability ${osvVulnerability.id} affects ${packageName} ${depVersion}`,\n );\n const fixedVersion = this.getFixedVersion(\n ecosystem,\n depVersion,\n affected,\n versioningApi,\n );\n\n vulnerabilities.push({\n packageName,\n osvPackageName,\n vulnerability: osvVulnerability,\n affected,\n depType,\n depVersion,\n fixedVersion,\n datasource: dep.datasource!,\n packageFileConfig,\n });\n }\n }\n\n return { vulnerabilities, versioningApi };\n } catch (err) {\n logger.warn(\n { err, packageName },\n 'Error fetching vulnerability information for package',\n );\n return null;\n }\n }\n\n private skipMaliciousPackages(\n ecosystem: Ecosystem,\n osvPackageName: string,\n depVersion: string,\n versioningApi: VersioningApi,\n dep: PackageDependency,\n manager: string | undefined,\n packageFile: string,\n osvVulnerability: Osv.Vulnerability,\n ): void {\n // the OpenSSF's Malicious Packages (https://github.com/ossf/malicious-packages) is a source of advisories through osv.dev, which takes various sources of advisories, and will re-publish them with more specific information about their malicious usage\n if (osvVulnerability.id.startsWith('MAL-')) {\n // is the current dependency vulnerable?\n for (const affected of osvVulnerability.affected ?? []) {\n // is the current dependency vulnerable?\n const isVulnerable = this.isPackageVulnerable(\n ecosystem,\n osvPackageName,\n depVersion,\n affected,\n versioningApi,\n );\n\n if (isVulnerable) {\n logger.debug(\n {\n packageFile: packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n currentVersion: depVersion,\n },\n `Marking ${dep.depName} as skipReason=malicious-version-in-use, as it is affected by ${osvVulnerability.id}`,\n );\n dep.skipReason = 'malicious-version-in-use';\n dep.skipStage = 'lookup';\n }\n\n // or are any of the updates vulnerable?\n for (const update of dep.updates ?? []) {\n const newVersion = update.newVersion ?? update.newValue!;\n\n const isUpdateVulnerable = this.isPackageVulnerable(\n ecosystem,\n osvPackageName,\n newVersion,\n affected,\n versioningApi,\n );\n\n if (isUpdateVulnerable) {\n logger.debug(\n {\n packageFile: packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n currentVersion: depVersion,\n newVersion,\n },\n `Marking ${dep.depName}'s update to ${newVersion} as skipReason=malicious-update-proposed, as it is affected by ${osvVulnerability.id}`,\n );\n dep.skipReason = 'malicious-update-proposed';\n dep.skipStage = 'lookup';\n }\n }\n }\n }\n }\n\n private sortByFixedVersion(\n packageRules: PackageRule[],\n versioningApi: VersioningApi,\n ): void {\n const versionsCleaned: Record<string, string> = {};\n for (const rule of packageRules) {\n const version = rule.allowedVersions!;\n versionsCleaned[version] = version.replace(regEx(/[(),=> ]+/g), '');\n }\n packageRules.sort((a, b) =>\n versioningApi.sortVersions(\n versionsCleaned[a.allowedVersions!],\n versionsCleaned[b.allowedVersions!],\n ),\n );\n }\n\n // https://ossf.github.io/osv-schema/#affectedrangesevents-fields\n private sortEvents(\n events: Osv.Event[],\n versioningApi: VersioningApi,\n ): Osv.Event[] {\n const sortedCopy: Osv.Event[] = [];\n let zeroEvent: Osv.Event | null = null;\n\n for (const event of events) {\n if (event.introduced === '0') {\n zeroEvent = event;\n } else if (versioningApi.isVersion(Object.values(event)[0])) {\n sortedCopy.push(event);\n } else {\n logger.debug({ event }, 'Skipping OSV event with invalid version');\n }\n }\n\n sortedCopy.sort((a, b) =>\n // no pre-processing, as there are only very few values to sort\n versioningApi.sortVersions(Object.values(a)[0], Object.values(b)[0]),\n );\n\n if (zeroEvent) {\n sortedCopy.unshift(zeroEvent);\n }\n\n return sortedCopy;\n }\n\n private isPackageAffected(\n ecosystem: Ecosystem,\n osvPackageName: string,\n affected: Osv.Affected,\n ): boolean {\n const pkg = affected.package;\n if (pkg?.name !== osvPackageName) {\n return false;\n }\n\n // Match exact ecosystems and OSV sub-ecosystems (e.g. Packagist:https://packages.drupal.org/8).\n return (\n pkg.ecosystem === ecosystem || pkg.ecosystem.startsWith(`${ecosystem}:`)\n );\n }\n\n private includedInVersions(\n depVersion: string,\n affected: Osv.Affected,\n ): boolean {\n return !!affected.versions?.includes(depVersion);\n }\n\n private includedInRanges(\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): boolean {\n for (const range of affected.ranges ?? []) {\n if (range.type === 'GIT') {\n continue;\n }\n\n let vulnerable = false;\n for (const event of this.sortEvents(range.events, versioningApi)) {\n if (\n isNonEmptyString(event.introduced) &&\n (event.introduced === '0' ||\n this.isVersionGtOrEq(depVersion, event.introduced, versioningApi))\n ) {\n vulnerable = true;\n } else if (\n isNonEmptyString(event.fixed) &&\n this.isVersionGtOrEq(depVersion, event.fixed, versioningApi)\n ) {\n vulnerable = false;\n } else if (\n isNonEmptyString(event.last_affected) &&\n this.isVersionGt(depVersion, event.last_affected, versioningApi)\n ) {\n vulnerable = false;\n }\n }\n\n if (vulnerable) {\n return true;\n }\n }\n\n return false;\n }\n\n // https://ossf.github.io/osv-schema/#evaluation\n private isPackageVulnerable(\n ecosystem: Ecosystem,\n osvPackageName: string,\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n this.isPackageAffected(ecosystem, osvPackageName, affected) &&\n (this.includedInVersions(depVersion, affected) ||\n this.includedInRanges(depVersion, affected, versioningApi))\n );\n }\n\n private getFixedVersion(\n ecosystem: Ecosystem,\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): string | null {\n const fixedVersions: string[] = [];\n const lastAffectedVersions: string[] = [];\n\n for (const range of affected.ranges ?? []) {\n if (range.type === 'GIT') {\n continue;\n }\n\n for (const event of range.events) {\n if (\n isNonEmptyString(event.fixed) &&\n versioningApi.isVersion(event.fixed)\n ) {\n fixedVersions.push(event.fixed);\n } else if (\n isNonEmptyString(event.last_affected) &&\n versioningApi.isVersion(event.last_affected)\n ) {\n lastAffectedVersions.push(event.last_affected);\n }\n }\n }\n\n fixedVersions.sort((a, b) => versioningApi.sortVersions(a, b));\n const fixedVersion = fixedVersions.find((version) =>\n this.isVersionGt(version, depVersion, versioningApi),\n );\n if (fixedVersion) {\n return this.getFixedVersionByEcosystem(fixedVersion, ecosystem);\n }\n\n lastAffectedVersions.sort((a, b) => versioningApi.sortVersions(a, b));\n const lastAffected = lastAffectedVersions.find((version) =>\n this.isVersionGtOrEq(version, depVersion, versioningApi),\n );\n if (lastAffected) {\n return this.getLastAffectedByEcosystem(lastAffected, ecosystem);\n }\n\n return null;\n }\n\n private getFixedVersionByEcosystem(\n fixedVersion: string,\n ecosystem: Ecosystem,\n ): string {\n return getFixedVersionConstraint(fixedVersion, ecosystem);\n }\n\n private getLastAffectedByEcosystem(\n lastAffected: string,\n ecosystem: Ecosystem,\n ): string {\n return getLastAffectedVersionConstraint(lastAffected, ecosystem);\n }\n\n private isVersionGt(\n version: string,\n other: string,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n versioningApi.isVersion(version) &&\n versioningApi.isVersion(other) &&\n versioningApi.isGreaterThan(version, other)\n );\n }\n\n private isVersionGtOrEq(\n version: string,\n other: string,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n versioningApi.isVersion(version) &&\n versioningApi.isVersion(other) &&\n (versioningApi.equals(version, other) ||\n versioningApi.isGreaterThan(version, other))\n );\n }\n\n private vulnerabilityToPackageRules(vul: Vulnerability): PackageRule | null {\n const {\n vulnerability,\n affected,\n packageName,\n depType,\n depVersion,\n fixedVersion,\n datasource,\n packageFileConfig,\n } = vul;\n if (isNullOrUndefined(fixedVersion)) {\n logger.debug(\n `No fixed version available for vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`,\n );\n return null;\n }\n\n // we don't know if the dependency has a `versioning` applied to it already, so we have to use the default for the datasource\n const versioning = getDefaultVersioning(datasource);\n\n logger.debug(\n {\n datasource,\n versioning,\n },\n\n `Setting allowed version ${fixedVersion} to fix vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`,\n );\n\n const severityDetails = this.extractSeverityDetails(\n vulnerability,\n affected,\n );\n\n return {\n matchDatasources: [datasource],\n matchPackageNames: [packageName],\n ...(depType ? { matchDepTypes: [depType] } : {}),\n matchCurrentVersion: depVersion,\n versioning,\n allowedVersions: fixedVersion,\n isVulnerabilityAlert: true,\n vulnerabilitySeverity: severityDetails.severityLevel,\n prBodyNotes: this.generatePrBodyNotes(vulnerability, affected),\n force: {\n ...packageFileConfig.vulnerabilityAlerts,\n },\n };\n }\n\n static evaluateCvssVector(vector: string): [string, string] {\n const CvssJson = z.object({\n baseScore: z.number().default(0.0),\n baseSeverity: z.string().toUpperCase().default('UNKNOWN'),\n });\n\n try {\n const parsedCvssScore: CvssVector<any> | null = fromVector(vector);\n const res = CvssJson.parse(parsedCvssScore?.createJsonSchema());\n\n return [res.baseScore.toFixed(1), res.baseSeverity];\n } catch {\n logger.debug(`Error processing CVSS vector ${vector}`);\n }\n\n return ['', ''];\n }\n\n private generatePrBodyNotes(\n vulnerability: Osv.Vulnerability,\n affected: Osv.Affected,\n ): string[] {\n let aliases = [vulnerability.id].concat(vulnerability.aliases ?? []).sort();\n aliases = aliases.map((id) => {\n if (id.startsWith('CVE-')) {\n return `[${id}](https://nvd.nist.gov/vuln/detail/${id})`;\n }\n if (id.startsWith('GHSA-')) {\n return `[${id}](https://github.com/advisories/${id})`;\n }\n if (id.startsWith('GO-')) {\n return `[${id}](https://pkg.go.dev/vuln/${id})`;\n }\n if (id.startsWith('RUSTSEC-')) {\n return `[${id}](https://rustsec.org/advisories/${id}.html)`;\n }\n\n return id;\n });\n\n let content = '\\n\\n---\\n\\n### ';\n content += vulnerability.summary ? `${vulnerability.summary}\\n` : '';\n content += `${aliases.join(' / ')}\\n`;\n content += `\\n<details>\\n<summary>More information</summary>\\n`;\n\n const details = vulnerability.details?.replace(\n regEx(/^#{1,4} /gm),\n '##### ',\n );\n content += `#### Details\\n${details ?? 'No details.'}\\n`;\n\n content += '#### Severity\\n';\n const severityDetails = this.extractSeverityDetails(\n vulnerability,\n affected,\n );\n\n if (severityDetails.cvssVector) {\n content += `- CVSS Score: ${severityDetails.score}\\n`;\n content += `- Vector String: \\`${severityDetails.cvssVector}\\`\\n`;\n } else {\n content += `${titleCase(severityDetails.severityLevel)}\\n`;\n }\n\n content += `\\n#### References\\n${\n vulnerability.references\n ?.map((ref) => {\n return `- [${ref.url}](${ref.url})`;\n })\n .join('\\n') ?? 'No references.'\n }`;\n\n let attribution = '';\n if (vulnerability.id.startsWith('GHSA-')) {\n attribution = ` and the [GitHub Advisory Database](https://github.com/github/advisory-database) ([CC-BY 4.0](https://github.com/github/advisory-database/blob/main/LICENSE.md))`;\n } else if (vulnerability.id.startsWith('GO-')) {\n attribution = ` and the [Go Vulnerability Database](https://github.com/golang/vulndb) ([CC-BY 4.0](https://github.com/golang/vulndb#license))`;\n } else if (vulnerability.id.startsWith('PYSEC-')) {\n attribution = ` and the [PyPI Advisory Database](https://github.com/pypa/advisory-database) ([CC-BY 4.0](https://github.com/pypa/advisory-database/blob/main/LICENSE))`;\n } else if (vulnerability.id.startsWith('RUSTSEC-')) {\n attribution = ` and the [Rust Advisory Database](https://github.com/RustSec/advisory-db) ([CC0 1.0](https://github.com/rustsec/advisory-db/blob/main/LICENSE.txt))`;\n }\n content += `\\n\\nThis data is provided by [OSV](https://osv.dev/vulnerability/${vulnerability.id})${attribution}.\\n`;\n content += `</details>`;\n\n return [sanitizeMarkdown(content)];\n }\n\n private extractSeverityDetails(\n vulnerability: Osv.Vulnerability,\n affected: Osv.Affected,\n ): SeverityDetails {\n let severityLevel = 'UNKNOWN';\n let score = 'Unknown';\n\n const cvssVector =\n vulnerability.severity?.find((e) => e.type === 'CVSS_V4')?.score ??\n vulnerability.severity?.find((e) => e.type === 'CVSS_V3')?.score ??\n (affected.database_specific?.cvss as string); // RUSTSEC\n\n if (cvssVector) {\n const [baseScore, severity] =\n Vulnerabilities.evaluateCvssVector(cvssVector);\n severityLevel = severity ? severity.toUpperCase() : 'UNKNOWN';\n score = baseScore\n ? `${baseScore} / 10 (${titleCase(severityLevel)})`\n : 'Unknown';\n } else if (\n vulnerability.id.startsWith('GHSA-') &&\n vulnerability.database_specific?.severity\n ) {\n const severity = vulnerability.database_specific.severity as string;\n severityLevel = severity.toUpperCase();\n }\n\n return {\n cvssVector,\n score,\n severityLevel,\n };\n }\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": "44.37.0",
4
+ "version": "44.38.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.37.0 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.38.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.37.0",
5
+ "x-renovate-version": "44.38.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {
@@ -2475,7 +2475,8 @@
2475
2475
  "default": {
2476
2476
  "managerFilePatterns": [
2477
2477
  "/^.devcontainer/devcontainer.json$/",
2478
- "/^.devcontainer.json$/"
2478
+ "/^.devcontainer.json$/",
2479
+ "/^.devcontainer/[^/]+/devcontainer.json$/"
2479
2480
  ]
2480
2481
  },
2481
2482
  "$ref": "#",