renovate 44.37.1 → 44.39.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.
- package/dist/manager-default-configs.generated.js +5 -1
- package/dist/manager-default-configs.generated.js.map +1 -1
- package/dist/modules/manager/devcontainer/index.js +5 -1
- package/dist/modules/manager/devcontainer/index.js.map +1 -1
- package/dist/workers/repository/onboarding/pr/index.js +83 -36
- package/dist/workers/repository/onboarding/pr/index.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +5 -1
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/reconfigure/comment.js +56 -18
- package/dist/workers/repository/reconfigure/comment.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +4 -3
|
@@ -92,7 +92,11 @@ const managerDefaultConfigs = {
|
|
|
92
92
|
"versioning": "maven"
|
|
93
93
|
},
|
|
94
94
|
"devbox": { "managerFilePatterns": ["/(^|/)devbox\\.json$/"] },
|
|
95
|
-
"devcontainer": { "managerFilePatterns": [
|
|
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: [
|
|
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
|
|
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"}
|
|
@@ -55,6 +55,65 @@ async function ensureOnboardingAutoCloseAge(existingPr) {
|
|
|
55
55
|
}
|
|
56
56
|
return false;
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Full onboarding PRs list package files before the PR list.
|
|
60
|
+
*/
|
|
61
|
+
const FULL_SECTION_ORDER = [
|
|
62
|
+
"PACKAGE FILES",
|
|
63
|
+
"CONFIG",
|
|
64
|
+
"BASEBRANCH",
|
|
65
|
+
"PRLIST",
|
|
66
|
+
"WARNINGS",
|
|
67
|
+
"ERRORS"
|
|
68
|
+
];
|
|
69
|
+
/**
|
|
70
|
+
* "Summarised" onboarding PRs list PRs before other sections.
|
|
71
|
+
*/
|
|
72
|
+
const SUMMARY_SECTION_ORDER = [
|
|
73
|
+
"PRLIST",
|
|
74
|
+
"CONFIG",
|
|
75
|
+
"BASEBRANCH",
|
|
76
|
+
"PACKAGE FILES",
|
|
77
|
+
"WARNINGS",
|
|
78
|
+
"ERRORS"
|
|
79
|
+
];
|
|
80
|
+
function buildOnboardingPrTemplate(config, configFile, rebaseCheckBox, sectionOrder) {
|
|
81
|
+
let prTemplate = `Welcome to [Renovate](${GlobalConfig.get("productLinks").homepage})! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.\n\n`;
|
|
82
|
+
prTemplate += getInheritedOrGlobal("requireConfig") === "required" ? emojify(`:vertical_traffic_light: To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.\n\n`) : emojify(`:vertical_traffic_light: Renovate will begin keeping your dependencies up-to-date only once you merge or close this Pull Request.\n\n`);
|
|
83
|
+
prTemplate += emojify(`:books: See our [Reading List](${GlobalConfig.get("productLinks").documentation}reading-list/) for relevant documentation you may be interested in reading.\n\n`);
|
|
84
|
+
prTemplate += emojify(`:abcd: Do you want to change how Renovate upgrades your dependencies?`);
|
|
85
|
+
prTemplate += ` Add your custom config to \`${configFile}\` in this branch${config.onboardingRebaseCheckbox ? " and select the Retry/Rebase checkbox below" : ""}. Renovate will update the Pull Request description the next time it runs.`;
|
|
86
|
+
prTemplate += "\n\n";
|
|
87
|
+
prTemplate += emojify(`
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
${sectionOrder.map((section) => `{{${section}}}`).join("\n")}
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
:question: Got questions? Check out Renovate's [Docs](${GlobalConfig.get("productLinks").documentation}), particularly the Getting Started section.
|
|
95
|
+
If you need any further assistance then you can also [request help here](${GlobalConfig.get("productLinks").help}).
|
|
96
|
+
`);
|
|
97
|
+
prTemplate += rebaseCheckBox;
|
|
98
|
+
return prTemplate;
|
|
99
|
+
}
|
|
100
|
+
function fillOnboardingPrBody(prTemplate, sections) {
|
|
101
|
+
let prBody = prTemplate;
|
|
102
|
+
if (sections.packageFiles) prBody = `${prBody.replace("{{PACKAGE FILES}}", sections.packageFiles)}\n`;
|
|
103
|
+
else prBody = prBody.replace("{{PACKAGE FILES}}\n", "");
|
|
104
|
+
prBody = prBody.replace("{{CONFIG}}\n", sections.config);
|
|
105
|
+
prBody = prBody.replace("{{WARNINGS}}\n", sections.warnings);
|
|
106
|
+
prBody = prBody.replace("{{ERRORS}}\n", sections.errors);
|
|
107
|
+
prBody = prBody.replace("{{BASEBRANCH}}\n", sections.baseBranch);
|
|
108
|
+
prBody = prBody.replace("{{PRLIST}}\n", sections.prList);
|
|
109
|
+
return prBody;
|
|
110
|
+
}
|
|
111
|
+
function finalizeOnboardingPrBody(prBody, config, onboardingConfigHashComment) {
|
|
112
|
+
let finalPrBody = prBody;
|
|
113
|
+
if (isString(config.prHeader)) finalPrBody = `${compile(config.prHeader, config)}\n\n${finalPrBody}`;
|
|
114
|
+
if (isString(config.prFooter)) finalPrBody = `${finalPrBody}\n---\n\n${compile(config.prFooter, config)}\n`;
|
|
115
|
+
return finalPrBody + onboardingConfigHashComment;
|
|
116
|
+
}
|
|
58
117
|
async function ensureOnboardingPr(config, packageFiles, branches) {
|
|
59
118
|
if (config.repoIsOnboarded === true || config.onboardingRebaseCheckbox && !OnboardingState.prUpdateRequested) return;
|
|
60
119
|
logger.debug("ensureOnboardingPr()");
|
|
@@ -79,50 +138,38 @@ async function ensureOnboardingPr(config, packageFiles, branches) {
|
|
|
79
138
|
if (OnboardingState.onboardingCacheValid) return;
|
|
80
139
|
const onboardingConfigHashComment = await getOnboardingConfigHashComment();
|
|
81
140
|
const rebaseCheckBox = getRebaseCheckbox(config.onboardingRebaseCheckbox);
|
|
82
|
-
logger.debug("Filling in onboarding PR template");
|
|
83
|
-
let prTemplate = `Welcome to [Renovate](${GlobalConfig.get("productLinks").homepage})! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.\n\n`;
|
|
84
|
-
prTemplate += getInheritedOrGlobal("requireConfig") === "required" ? emojify(`:vertical_traffic_light: To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.\n\n`) : emojify(`:vertical_traffic_light: Renovate will begin keeping your dependencies up-to-date only once you merge or close this Pull Request.\n\n`);
|
|
85
|
-
prTemplate += emojify(`:books: See our [Reading List](${GlobalConfig.get("productLinks").documentation}reading-list/) for relevant documentation you may be interested in reading.\n\n`);
|
|
86
141
|
const configFile = getDefaultConfigFileName();
|
|
87
|
-
|
|
88
|
-
prTemplate += ` Add your custom config to \`${configFile}\` in this branch${config.onboardingRebaseCheckbox ? " and select the Retry/Rebase checkbox below" : ""}. Renovate will update the Pull Request description the next time it runs.`;
|
|
89
|
-
prTemplate += "\n\n";
|
|
90
|
-
prTemplate += emojify(`
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
{{PACKAGE FILES}}
|
|
94
|
-
{{CONFIG}}
|
|
95
|
-
{{BASEBRANCH}}
|
|
96
|
-
{{PRLIST}}
|
|
97
|
-
{{WARNINGS}}
|
|
98
|
-
{{ERRORS}}
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
:question: Got questions? Check out Renovate's [Docs](${GlobalConfig.get("productLinks").documentation}), particularly the Getting Started section.
|
|
103
|
-
If you need any further assistance then you can also [request help here](${GlobalConfig.get("productLinks").help}).
|
|
104
|
-
`);
|
|
105
|
-
prTemplate += rebaseCheckBox;
|
|
106
|
-
let prBody = prTemplate;
|
|
142
|
+
logger.debug("Filling in onboarding PR template");
|
|
107
143
|
const packageFilesDesc = getPackageFilesDesc(packageFiles);
|
|
108
|
-
if (packageFilesDesc) prBody = `${prBody.replace("{{PACKAGE FILES}}", packageFilesDesc)}\n`;
|
|
109
|
-
else prBody = prBody.replace("{{PACKAGE FILES}}\n", "");
|
|
110
144
|
let configDesc = "";
|
|
111
145
|
if (GlobalConfig.get("dryRun")) logger.info(`DRY-RUN: Would check branch ${onboardingBranch}`);
|
|
112
146
|
else configDesc = getConfigDesc(config, packageFiles);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
prBody = prBody.replace("{{BASEBRANCH}}\n", getBaseBranchDesc(config));
|
|
147
|
+
const warnings = getWarnings(config) + getDepWarningsOnboardingPR(packageFiles, config);
|
|
148
|
+
const errors = getErrors(config);
|
|
149
|
+
const baseBranchDesc = getBaseBranchDesc(config);
|
|
117
150
|
const prList = getExpectedPrList(config, branches);
|
|
118
|
-
prBody =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
151
|
+
let prBody = finalizeOnboardingPrBody(fillOnboardingPrBody(buildOnboardingPrTemplate(config, configFile, rebaseCheckBox, FULL_SECTION_ORDER), {
|
|
152
|
+
packageFiles: packageFilesDesc,
|
|
153
|
+
config: configDesc,
|
|
154
|
+
baseBranch: baseBranchDesc,
|
|
155
|
+
prList,
|
|
156
|
+
warnings,
|
|
157
|
+
errors
|
|
158
|
+
}), config, onboardingConfigHashComment);
|
|
122
159
|
if (prBody.length > platform.maxBodyLength()) {
|
|
123
160
|
logger.debug("Onboarding PR body exceeds platform limit, switching to summary PR list and package files");
|
|
124
|
-
|
|
125
|
-
if (packageFilesDesc)
|
|
161
|
+
const prListSummary = getExpectedPrListSummary(config, branches);
|
|
162
|
+
if (packageFilesDesc) {
|
|
163
|
+
const packageFilesSummary = `### Detected Package Files\n\n${getPackageFilesSummary(packageFiles)}`;
|
|
164
|
+
prBody = finalizeOnboardingPrBody(fillOnboardingPrBody(buildOnboardingPrTemplate(config, configFile, rebaseCheckBox, SUMMARY_SECTION_ORDER), {
|
|
165
|
+
packageFiles: packageFilesSummary,
|
|
166
|
+
config: configDesc,
|
|
167
|
+
baseBranch: baseBranchDesc,
|
|
168
|
+
prList: prListSummary,
|
|
169
|
+
warnings,
|
|
170
|
+
errors
|
|
171
|
+
}), config, onboardingConfigHashComment);
|
|
172
|
+
} else prBody = prBody.replace(prList, prListSummary);
|
|
126
173
|
}
|
|
127
174
|
logger.trace(`prBody:\n${prBody}`);
|
|
128
175
|
prBody = platform.massageMarkdown(prBody, config.rebaseLabel);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../lib/workers/repository/onboarding/pr/index.ts"],"sourcesContent":["import { isNumber, isString } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { REPOSITORY_CLOSED_ONBOARDING } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type { PackageFile } from '../../../../modules/manager/types.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { hashBody } from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { getInheritedOrGlobal } from '../../../../util/common.ts';\nimport { getElapsedDays } from '../../../../util/date.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { getFile } from '../../../../util/git/index.ts';\nimport { toSha256 } from '../../../../util/hash.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport type { BranchConfig } from '../../../types.ts';\nimport {\n getDepWarningsOnboardingPR,\n getErrors,\n getWarnings,\n} from '../../errors-warnings.ts';\nimport { getPlatformPrOptions } from '../../update/pr/index.ts';\nimport { prepareLabels } from '../../update/pr/labels.ts';\nimport { addParticipants } from '../../update/pr/participants.ts';\nimport { isOnboardingBranchConflicted } from '../branch/onboarding-branch-cache.ts';\nimport {\n OnboardingState,\n getDefaultConfigFileName,\n getSemanticCommitPrTitle,\n} from '../common.ts';\nimport { getBaseBranchDesc } from './base-branch.ts';\nimport { getConfigDesc } from './config-description.ts';\nimport {\n getPackageFilesDesc,\n getPackageFilesSummary,\n} from './package-files.ts';\nimport { getExpectedPrList, getExpectedPrListSummary } from './pr-list.ts';\n\n/**\n * Given an existing PR, if onboardingAutoCloseAge has passed, close the PR.\n *\n * Returns true if the PR was closed.\n */\nasync function ensureOnboardingAutoCloseAge(existingPr: Pr): Promise<boolean> {\n // check if the existing pr crosses the onboarding autoclose age\n const ageOfOnboardingPr = getElapsedDays(existingPr.createdAt!, false);\n const onboardingAutoCloseAge = getInheritedOrGlobal('onboardingAutoCloseAge');\n if (onboardingAutoCloseAge) {\n logger.debug(\n {\n onboardingAutoCloseAge,\n createdAt: existingPr.createdAt!,\n ageOfOnboardingPr,\n },\n `Determining that the onboarding PR created at \\`${existingPr.createdAt!}\\` was created ${ageOfOnboardingPr.toFixed(2)} days ago`,\n );\n }\n if (\n isNumber(onboardingAutoCloseAge) &&\n ageOfOnboardingPr > onboardingAutoCloseAge\n ) {\n // close the pr\n await platform.updatePr({\n number: existingPr.number,\n state: 'closed',\n prTitle: existingPr.title,\n });\n // ensure comment\n await ensureComment({\n number: existingPr.number,\n topic: `Renovate is disabled`,\n content: `Renovate is disabled because the onboarding PR has been unmerged for more than ${onboardingAutoCloseAge} days. To enable Renovate, you can either (a) change this PR's title to get a new onboarding PR, and merge the new onboarding PR, or (b) create a Renovate config file, and commit that file to your base branch.`,\n });\n logger.debug(\n {\n ageOfOnboardingPr,\n onboardingAutoCloseAge,\n },\n `Renovate is being disabled for this repository as the onboarding PR has been unmerged for more than ${onboardingAutoCloseAge} days`,\n );\n return true;\n }\n return false;\n}\n\nexport async function ensureOnboardingPr(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]> | null,\n branches: BranchConfig[],\n): Promise<void> {\n if (\n config.repoIsOnboarded === true ||\n (config.onboardingRebaseCheckbox && !OnboardingState.prUpdateRequested)\n ) {\n return;\n }\n logger.debug('ensureOnboardingPr()');\n logger.trace({ config });\n // TODO #22198\n const onboardingBranch = getInheritedOrGlobal('onboardingBranch')!;\n const existingPr = await platform.getBranchPr(\n onboardingBranch,\n config.defaultBranch,\n );\n if (existingPr) {\n const wasClosed = await ensureOnboardingAutoCloseAge(existingPr);\n if (wasClosed) {\n throw new Error(REPOSITORY_CLOSED_ONBOARDING);\n }\n\n // skip pr-update if branch is conflicted\n if (\n await isOnboardingBranchConflicted(\n config.defaultBranch!,\n onboardingBranch,\n )\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n 'DRY-RUN: Would comment that Onboarding PR is conflicted and needs manual resolving',\n );\n return;\n }\n await ensureComment({\n number: existingPr.number,\n topic: 'Branch Conflicted',\n content: emojify(\n `:warning: This PR has a merge conflict which Renovate is unable to automatically resolve, so updates to this PR description are now paused. Please resolve the merge conflict manually.\\n\\n`,\n ),\n });\n return;\n }\n }\n\n if (OnboardingState.onboardingCacheValid) {\n return;\n }\n\n const onboardingConfigHashComment = await getOnboardingConfigHashComment();\n const rebaseCheckBox = getRebaseCheckbox(config.onboardingRebaseCheckbox);\n logger.debug('Filling in onboarding PR template');\n let prTemplate = `Welcome to [Renovate](${\n GlobalConfig.get('productLinks').homepage\n })! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.\\n\\n`;\n prTemplate +=\n getInheritedOrGlobal('requireConfig') === 'required'\n ? emojify(\n `:vertical_traffic_light: To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.\\n\\n`,\n )\n : emojify(\n `:vertical_traffic_light: Renovate will begin keeping your dependencies up-to-date only once you merge or close this Pull Request.\\n\\n`,\n );\n\n prTemplate += emojify(\n `:books: See our [Reading List](${GlobalConfig.get('productLinks').documentation}reading-list/) for relevant documentation you may be interested in reading.\\n\\n`,\n );\n\n const configFile = getDefaultConfigFileName();\n prTemplate += emojify(\n `:abcd: Do you want to change how Renovate upgrades your dependencies?`,\n );\n prTemplate += ` Add your custom config to \\`${configFile}\\` in this branch${\n config.onboardingRebaseCheckbox\n ? ' and select the Retry/Rebase checkbox below'\n : ''\n }. Renovate will update the Pull Request description the next time it runs.`;\n prTemplate += '\\n\\n';\n // TODO #22198\n prTemplate += emojify(\n `\n\n---\n{{PACKAGE FILES}}\n{{CONFIG}}\n{{BASEBRANCH}}\n{{PRLIST}}\n{{WARNINGS}}\n{{ERRORS}}\n\n---\n\n:question: Got questions? Check out Renovate's [Docs](${\n GlobalConfig.get('productLinks').documentation\n }), particularly the Getting Started section.\nIf you need any further assistance then you can also [request help here](${\n GlobalConfig.get('productLinks').help\n }).\n`,\n );\n prTemplate += rebaseCheckBox;\n let prBody = prTemplate;\n const packageFilesDesc = getPackageFilesDesc(packageFiles);\n if (packageFilesDesc) {\n prBody = `${prBody.replace('{{PACKAGE FILES}}', packageFilesDesc)}\\n`;\n } else {\n prBody = prBody.replace('{{PACKAGE FILES}}\\n', '');\n }\n let configDesc = '';\n if (GlobalConfig.get('dryRun')) {\n // TODO: types (#22198)\n logger.info(`DRY-RUN: Would check branch ${onboardingBranch}`);\n } else {\n configDesc = getConfigDesc(config, packageFiles!);\n }\n prBody = prBody.replace('{{CONFIG}}\\n', configDesc);\n prBody = prBody.replace(\n '{{WARNINGS}}\\n',\n getWarnings(config) + getDepWarningsOnboardingPR(packageFiles!, config),\n );\n prBody = prBody.replace('{{ERRORS}}\\n', getErrors(config));\n prBody = prBody.replace('{{BASEBRANCH}}\\n', getBaseBranchDesc(config));\n const prList = getExpectedPrList(config, branches);\n prBody = prBody.replace('{{PRLIST}}\\n', prList);\n if (isString(config.prHeader)) {\n prBody = `${template.compile(config.prHeader, config)}\\n\\n${prBody}`;\n }\n if (isString(config.prFooter)) {\n prBody = `${prBody}\\n---\\n\\n${template.compile(config.prFooter, config)}\\n`;\n }\n\n prBody += onboardingConfigHashComment;\n\n if (prBody.length > platform.maxBodyLength()) {\n logger.debug(\n 'Onboarding PR body exceeds platform limit, switching to summary PR list and package files',\n );\n prBody = prBody.replace(prList, getExpectedPrListSummary(config, branches));\n if (packageFilesDesc) {\n prBody = prBody.replace(\n packageFilesDesc,\n `### Detected Package Files\\n\\n${getPackageFilesSummary(packageFiles)}`,\n );\n }\n }\n\n logger.trace(`prBody:\\n${prBody}`);\n\n prBody = platform.massageMarkdown(prBody, config.rebaseLabel);\n\n if (existingPr) {\n logger.debug('Found open onboarding PR');\n // Check if existing PR needs updating\n const prBodyHash = hashBody(prBody);\n if (existingPr.bodyStruct?.hash === prBodyHash) {\n logger.debug(`Pull Request #${existingPr.number} does not need updating`);\n return;\n }\n // PR must need updating\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would update onboarding PR');\n } else {\n await platform.updatePr({\n number: existingPr.number,\n prTitle: existingPr.title,\n prBody,\n });\n logger.info({ pr: existingPr.number }, 'Onboarding PR updated');\n }\n return;\n }\n logger.debug('Creating onboarding PR');\n const labels: string[] = prepareLabels(config);\n try {\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would create onboarding PR');\n } else {\n // TODO #22198\n const prTitle =\n config.semanticCommits === 'enabled'\n ? getSemanticCommitPrTitle(config)\n : getInheritedOrGlobal('onboardingPrTitle')!;\n const pr = await platform.createPr({\n sourceBranch: onboardingBranch,\n targetBranch: config.defaultBranch!,\n prTitle,\n prBody,\n labels,\n platformPrOptions: getPlatformPrOptions({\n ...config,\n automerge: false,\n }),\n });\n logger.info(\n { pr: `Pull Request #${pr!.number}` },\n 'Onboarding PR created',\n );\n await addParticipants(config, pr!);\n }\n } catch (err) {\n if (\n err.response?.statusCode === 422 &&\n err.response?.body?.errors?.[0]?.message?.startsWith(\n 'A pull request already exists',\n )\n ) {\n logger.warn(\n 'Onboarding PR already exists but cannot find it. It was probably created by a different user.',\n );\n await scm.deleteBranch(onboardingBranch);\n return;\n }\n throw err;\n }\n}\n\nfunction getRebaseCheckbox(onboardingRebaseCheckbox?: boolean): string {\n let rebaseCheckBox = '';\n if (onboardingRebaseCheckbox) {\n // Create markdown checkbox\n rebaseCheckBox = `\\n\\n---\\n\\n - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox.\\n`;\n }\n\n return rebaseCheckBox;\n}\n\nasync function getOnboardingConfigHashComment(): Promise<string> {\n const configFile = getDefaultConfigFileName();\n const existingContents =\n (await getFile(configFile, getInheritedOrGlobal('onboardingBranch'))) ?? '';\n const hash = toSha256(existingContents);\n\n return `\\n<!--renovate-config-hash:${hash}-->\\n`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../lib/workers/repository/onboarding/pr/index.ts"],"sourcesContent":["import { isNumber, isString } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { REPOSITORY_CLOSED_ONBOARDING } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type { PackageFile } from '../../../../modules/manager/types.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { hashBody } from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { getInheritedOrGlobal } from '../../../../util/common.ts';\nimport { getElapsedDays } from '../../../../util/date.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { getFile } from '../../../../util/git/index.ts';\nimport { toSha256 } from '../../../../util/hash.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport type { BranchConfig } from '../../../types.ts';\nimport {\n getDepWarningsOnboardingPR,\n getErrors,\n getWarnings,\n} from '../../errors-warnings.ts';\nimport { getPlatformPrOptions } from '../../update/pr/index.ts';\nimport { prepareLabels } from '../../update/pr/labels.ts';\nimport { addParticipants } from '../../update/pr/participants.ts';\nimport { isOnboardingBranchConflicted } from '../branch/onboarding-branch-cache.ts';\nimport {\n OnboardingState,\n getDefaultConfigFileName,\n getSemanticCommitPrTitle,\n} from '../common.ts';\nimport { getBaseBranchDesc } from './base-branch.ts';\nimport { getConfigDesc } from './config-description.ts';\nimport {\n getPackageFilesDesc,\n getPackageFilesSummary,\n} from './package-files.ts';\nimport { getExpectedPrList, getExpectedPrListSummary } from './pr-list.ts';\nimport type { OnboardingPrSections } from './types.ts';\n\n/**\n * Given an existing PR, if onboardingAutoCloseAge has passed, close the PR.\n *\n * Returns true if the PR was closed.\n */\nasync function ensureOnboardingAutoCloseAge(existingPr: Pr): Promise<boolean> {\n // check if the existing pr crosses the onboarding autoclose age\n const ageOfOnboardingPr = getElapsedDays(existingPr.createdAt!, false);\n const onboardingAutoCloseAge = getInheritedOrGlobal('onboardingAutoCloseAge');\n if (onboardingAutoCloseAge) {\n logger.debug(\n {\n onboardingAutoCloseAge,\n createdAt: existingPr.createdAt!,\n ageOfOnboardingPr,\n },\n `Determining that the onboarding PR created at \\`${existingPr.createdAt!}\\` was created ${ageOfOnboardingPr.toFixed(2)} days ago`,\n );\n }\n if (\n isNumber(onboardingAutoCloseAge) &&\n ageOfOnboardingPr > onboardingAutoCloseAge\n ) {\n // close the pr\n await platform.updatePr({\n number: existingPr.number,\n state: 'closed',\n prTitle: existingPr.title,\n });\n // ensure comment\n await ensureComment({\n number: existingPr.number,\n topic: `Renovate is disabled`,\n content: `Renovate is disabled because the onboarding PR has been unmerged for more than ${onboardingAutoCloseAge} days. To enable Renovate, you can either (a) change this PR's title to get a new onboarding PR, and merge the new onboarding PR, or (b) create a Renovate config file, and commit that file to your base branch.`,\n });\n logger.debug(\n {\n ageOfOnboardingPr,\n onboardingAutoCloseAge,\n },\n `Renovate is being disabled for this repository as the onboarding PR has been unmerged for more than ${onboardingAutoCloseAge} days`,\n );\n return true;\n }\n return false;\n}\n\n/**\n * Full onboarding PRs list package files before the PR list.\n */\nconst FULL_SECTION_ORDER = [\n 'PACKAGE FILES',\n 'CONFIG',\n 'BASEBRANCH',\n 'PRLIST',\n 'WARNINGS',\n 'ERRORS',\n] as const;\n\n/**\n * \"Summarised\" onboarding PRs list PRs before other sections.\n */\nconst SUMMARY_SECTION_ORDER = [\n 'PRLIST',\n 'CONFIG',\n 'BASEBRANCH',\n 'PACKAGE FILES',\n 'WARNINGS',\n 'ERRORS',\n] as const;\n\nfunction buildOnboardingPrTemplate(\n config: RenovateConfig,\n configFile: string,\n rebaseCheckBox: string,\n sectionOrder: readonly string[],\n): string {\n let prTemplate = `Welcome to [Renovate](${\n GlobalConfig.get('productLinks').homepage\n })! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.\\n\\n`;\n prTemplate +=\n getInheritedOrGlobal('requireConfig') === 'required'\n ? emojify(\n `:vertical_traffic_light: To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.\\n\\n`,\n )\n : emojify(\n `:vertical_traffic_light: Renovate will begin keeping your dependencies up-to-date only once you merge or close this Pull Request.\\n\\n`,\n );\n\n prTemplate += emojify(\n `:books: See our [Reading List](${GlobalConfig.get('productLinks').documentation}reading-list/) for relevant documentation you may be interested in reading.\\n\\n`,\n );\n\n prTemplate += emojify(\n `:abcd: Do you want to change how Renovate upgrades your dependencies?`,\n );\n prTemplate += ` Add your custom config to \\`${configFile}\\` in this branch${\n config.onboardingRebaseCheckbox\n ? ' and select the Retry/Rebase checkbox below'\n : ''\n }. Renovate will update the Pull Request description the next time it runs.`;\n prTemplate += '\\n\\n';\n // TODO #22198\n prTemplate += emojify(\n `\n\n---\n${sectionOrder.map((section) => `{{${section}}}`).join('\\n')}\n\n---\n\n:question: Got questions? Check out Renovate's [Docs](${\n GlobalConfig.get('productLinks').documentation\n }), particularly the Getting Started section.\nIf you need any further assistance then you can also [request help here](${\n GlobalConfig.get('productLinks').help\n }).\n`,\n );\n prTemplate += rebaseCheckBox;\n return prTemplate;\n}\n\nfunction fillOnboardingPrBody(\n prTemplate: string,\n sections: OnboardingPrSections,\n): string {\n let prBody = prTemplate;\n if (sections.packageFiles) {\n prBody = `${prBody.replace('{{PACKAGE FILES}}', sections.packageFiles)}\\n`;\n } else {\n prBody = prBody.replace('{{PACKAGE FILES}}\\n', '');\n }\n prBody = prBody.replace('{{CONFIG}}\\n', sections.config);\n prBody = prBody.replace('{{WARNINGS}}\\n', sections.warnings);\n prBody = prBody.replace('{{ERRORS}}\\n', sections.errors);\n prBody = prBody.replace('{{BASEBRANCH}}\\n', sections.baseBranch);\n prBody = prBody.replace('{{PRLIST}}\\n', sections.prList);\n return prBody;\n}\n\nfunction finalizeOnboardingPrBody(\n prBody: string,\n config: RenovateConfig,\n onboardingConfigHashComment: string,\n): string {\n let finalPrBody = prBody;\n if (isString(config.prHeader)) {\n finalPrBody = `${template.compile(config.prHeader, config)}\\n\\n${finalPrBody}`;\n }\n if (isString(config.prFooter)) {\n finalPrBody = `${finalPrBody}\\n---\\n\\n${template.compile(config.prFooter, config)}\\n`;\n }\n return finalPrBody + onboardingConfigHashComment;\n}\n\nexport async function ensureOnboardingPr(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]> | null,\n branches: BranchConfig[],\n): Promise<void> {\n if (\n config.repoIsOnboarded === true ||\n (config.onboardingRebaseCheckbox && !OnboardingState.prUpdateRequested)\n ) {\n return;\n }\n logger.debug('ensureOnboardingPr()');\n logger.trace({ config });\n // TODO #22198\n const onboardingBranch = getInheritedOrGlobal('onboardingBranch')!;\n const existingPr = await platform.getBranchPr(\n onboardingBranch,\n config.defaultBranch,\n );\n if (existingPr) {\n const wasClosed = await ensureOnboardingAutoCloseAge(existingPr);\n if (wasClosed) {\n throw new Error(REPOSITORY_CLOSED_ONBOARDING);\n }\n\n // skip pr-update if branch is conflicted\n if (\n await isOnboardingBranchConflicted(\n config.defaultBranch!,\n onboardingBranch,\n )\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n 'DRY-RUN: Would comment that Onboarding PR is conflicted and needs manual resolving',\n );\n return;\n }\n await ensureComment({\n number: existingPr.number,\n topic: 'Branch Conflicted',\n content: emojify(\n `:warning: This PR has a merge conflict which Renovate is unable to automatically resolve, so updates to this PR description are now paused. Please resolve the merge conflict manually.\\n\\n`,\n ),\n });\n return;\n }\n }\n\n if (OnboardingState.onboardingCacheValid) {\n return;\n }\n\n const onboardingConfigHashComment = await getOnboardingConfigHashComment();\n const rebaseCheckBox = getRebaseCheckbox(config.onboardingRebaseCheckbox);\n const configFile = getDefaultConfigFileName();\n logger.debug('Filling in onboarding PR template');\n\n const packageFilesDesc = getPackageFilesDesc(packageFiles);\n let configDesc = '';\n if (GlobalConfig.get('dryRun')) {\n // TODO: types (#22198)\n logger.info(`DRY-RUN: Would check branch ${onboardingBranch}`);\n } else {\n configDesc = getConfigDesc(config, packageFiles!);\n }\n const warnings =\n getWarnings(config) + getDepWarningsOnboardingPR(packageFiles!, config);\n const errors = getErrors(config);\n const baseBranchDesc = getBaseBranchDesc(config);\n const prList = getExpectedPrList(config, branches);\n\n let prBody = finalizeOnboardingPrBody(\n fillOnboardingPrBody(\n buildOnboardingPrTemplate(\n config,\n configFile,\n rebaseCheckBox,\n FULL_SECTION_ORDER,\n ),\n {\n packageFiles: packageFilesDesc,\n config: configDesc,\n baseBranch: baseBranchDesc,\n prList,\n warnings,\n errors,\n },\n ),\n config,\n onboardingConfigHashComment,\n );\n\n if (prBody.length > platform.maxBodyLength()) {\n logger.debug(\n 'Onboarding PR body exceeds platform limit, switching to summary PR list and package files',\n );\n const prListSummary = getExpectedPrListSummary(config, branches);\n if (packageFilesDesc) {\n const packageFilesSummary = `### Detected Package Files\\n\\n${getPackageFilesSummary(packageFiles)}`;\n // \"What to Expect\" should render before \"Detected Package Files\" in the summary view,\n // so rebuild from a template with that section order rather than reordering the rendered body.\n prBody = finalizeOnboardingPrBody(\n fillOnboardingPrBody(\n buildOnboardingPrTemplate(\n config,\n configFile,\n rebaseCheckBox,\n SUMMARY_SECTION_ORDER,\n ),\n {\n packageFiles: packageFilesSummary,\n config: configDesc,\n baseBranch: baseBranchDesc,\n prList: prListSummary,\n warnings,\n errors,\n },\n ),\n config,\n onboardingConfigHashComment,\n );\n } else {\n prBody = prBody.replace(prList, prListSummary);\n }\n }\n\n logger.trace(`prBody:\\n${prBody}`);\n\n prBody = platform.massageMarkdown(prBody, config.rebaseLabel);\n\n if (existingPr) {\n logger.debug('Found open onboarding PR');\n // Check if existing PR needs updating\n const prBodyHash = hashBody(prBody);\n if (existingPr.bodyStruct?.hash === prBodyHash) {\n logger.debug(`Pull Request #${existingPr.number} does not need updating`);\n return;\n }\n // PR must need updating\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would update onboarding PR');\n } else {\n await platform.updatePr({\n number: existingPr.number,\n prTitle: existingPr.title,\n prBody,\n });\n logger.info({ pr: existingPr.number }, 'Onboarding PR updated');\n }\n return;\n }\n logger.debug('Creating onboarding PR');\n const labels: string[] = prepareLabels(config);\n try {\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would create onboarding PR');\n } else {\n // TODO #22198\n const prTitle =\n config.semanticCommits === 'enabled'\n ? getSemanticCommitPrTitle(config)\n : getInheritedOrGlobal('onboardingPrTitle')!;\n const pr = await platform.createPr({\n sourceBranch: onboardingBranch,\n targetBranch: config.defaultBranch!,\n prTitle,\n prBody,\n labels,\n platformPrOptions: getPlatformPrOptions({\n ...config,\n automerge: false,\n }),\n });\n logger.info(\n { pr: `Pull Request #${pr!.number}` },\n 'Onboarding PR created',\n );\n await addParticipants(config, pr!);\n }\n } catch (err) {\n if (\n err.response?.statusCode === 422 &&\n err.response?.body?.errors?.[0]?.message?.startsWith(\n 'A pull request already exists',\n )\n ) {\n logger.warn(\n 'Onboarding PR already exists but cannot find it. It was probably created by a different user.',\n );\n await scm.deleteBranch(onboardingBranch);\n return;\n }\n throw err;\n }\n}\n\nfunction getRebaseCheckbox(onboardingRebaseCheckbox?: boolean): string {\n let rebaseCheckBox = '';\n if (onboardingRebaseCheckbox) {\n // Create markdown checkbox\n rebaseCheckBox = `\\n\\n---\\n\\n - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox.\\n`;\n }\n\n return rebaseCheckBox;\n}\n\nasync function getOnboardingConfigHashComment(): Promise<string> {\n const configFile = getDefaultConfigFileName();\n const existingContents =\n (await getFile(configFile, getInheritedOrGlobal('onboardingBranch'))) ?? '';\n const hash = toSha256(existingContents);\n\n return `\\n<!--renovate-config-hash:${hash}-->\\n`;\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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"}
|
|
@@ -9,36 +9,74 @@ import { getPackageFilesDesc, getPackageFilesSummary } from "../onboarding/pr/pa
|
|
|
9
9
|
import { getExpectedPrList, getExpectedPrListSummary } from "../onboarding/pr/pr-list.js";
|
|
10
10
|
import { isArray, isString } from "@sindresorhus/is";
|
|
11
11
|
//#region lib/workers/repository/reconfigure/comment.ts
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
const SECTION_ORDER = [
|
|
13
|
+
"PACKAGE FILES",
|
|
14
|
+
"CONFIG",
|
|
15
|
+
"BASEBRANCH",
|
|
16
|
+
"PRLIST",
|
|
17
|
+
"WARNINGS",
|
|
18
|
+
"ERRORS"
|
|
19
|
+
];
|
|
20
|
+
const SUMMARY_SECTION_ORDER = [
|
|
21
|
+
"PRLIST",
|
|
22
|
+
"CONFIG",
|
|
23
|
+
"BASEBRANCH",
|
|
24
|
+
"PACKAGE FILES",
|
|
25
|
+
"WARNINGS",
|
|
26
|
+
"ERRORS"
|
|
27
|
+
];
|
|
28
|
+
function buildReconfigurePrCommentTemplate(sectionOrder) {
|
|
15
29
|
let prCommentTemplate = `This is a reconfigure PR comment to help you understand and re-configure your renovate bot settings. If this Reconfigure PR were to be merged, we'd expect to see the following outcome:\n\n`;
|
|
16
30
|
prCommentTemplate += `
|
|
17
31
|
---
|
|
18
|
-
{{
|
|
19
|
-
{{CONFIG}}
|
|
20
|
-
{{BASEBRANCH}}
|
|
21
|
-
{{PRLIST}}
|
|
22
|
-
{{WARNINGS}}
|
|
23
|
-
{{ERRORS}}
|
|
32
|
+
${sectionOrder.map((section) => `{{${section}}}`).join("\n")}
|
|
24
33
|
`;
|
|
34
|
+
return prCommentTemplate;
|
|
35
|
+
}
|
|
36
|
+
function fillReconfigurePrCommentBody(prCommentTemplate, sections) {
|
|
25
37
|
let prBody = prCommentTemplate;
|
|
26
|
-
|
|
27
|
-
if (packageFilesDesc) prBody = `${prBody.replace("{{PACKAGE FILES}}", packageFilesDesc)}\n`;
|
|
38
|
+
if (sections.packageFiles) prBody = `${prBody.replace("{{PACKAGE FILES}}", sections.packageFiles)}\n`;
|
|
28
39
|
else prBody = prBody.replace("{{PACKAGE FILES}}\n", "");
|
|
40
|
+
prBody = prBody.replace("{{CONFIG}}\n", sections.config);
|
|
41
|
+
prBody = prBody.replace("{{WARNINGS}}\n", sections.warnings);
|
|
42
|
+
prBody = prBody.replace("{{ERRORS}}\n", sections.errors);
|
|
43
|
+
prBody = prBody.replace("{{BASEBRANCH}}\n", sections.baseBranch);
|
|
44
|
+
prBody = prBody.replace("{{PRLIST}}\n", sections.prList);
|
|
45
|
+
return prBody;
|
|
46
|
+
}
|
|
47
|
+
async function ensureReconfigurePrComment(config, packageFiles, branches, branchName, pr) {
|
|
48
|
+
logger.debug("ensureReconfigurePrComment()");
|
|
49
|
+
logger.trace({ config });
|
|
50
|
+
const packageFilesDesc = getPackageFilesDesc(packageFiles);
|
|
29
51
|
let configDesc = "";
|
|
30
52
|
if (GlobalConfig.get("dryRun")) logger.info(`DRY-RUN: Would check branch ${branchName}`);
|
|
31
53
|
else configDesc = getConfigDesc(config);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
prBody = prBody.replace("{{BASEBRANCH}}\n", getBaseBranchDesc(config));
|
|
54
|
+
const warnings = getWarnings(config) + getDepWarningsOnboardingPR(packageFiles, config);
|
|
55
|
+
const errors = getErrors(config);
|
|
56
|
+
const baseBranchDesc = getBaseBranchDesc(config);
|
|
36
57
|
const prList = getExpectedPrList(config, branches);
|
|
37
|
-
prBody =
|
|
58
|
+
let prBody = fillReconfigurePrCommentBody(buildReconfigurePrCommentTemplate(SECTION_ORDER), {
|
|
59
|
+
packageFiles: packageFilesDesc,
|
|
60
|
+
config: configDesc,
|
|
61
|
+
baseBranch: baseBranchDesc,
|
|
62
|
+
prList,
|
|
63
|
+
warnings,
|
|
64
|
+
errors
|
|
65
|
+
});
|
|
38
66
|
if (prBody.length > platform.maxBodyLength()) {
|
|
39
67
|
logger.debug("Reconfigure PR body exceeds platform limit, switching to summary PR list and package files");
|
|
40
|
-
|
|
41
|
-
if (packageFilesDesc)
|
|
68
|
+
const prListSummary = getExpectedPrListSummary(config, branches);
|
|
69
|
+
if (packageFilesDesc) {
|
|
70
|
+
const packageFilesSummary = `### Detected Package Files\n\n${getPackageFilesSummary(packageFiles)}`;
|
|
71
|
+
prBody = fillReconfigurePrCommentBody(buildReconfigurePrCommentTemplate(SUMMARY_SECTION_ORDER), {
|
|
72
|
+
packageFiles: packageFilesSummary,
|
|
73
|
+
config: configDesc,
|
|
74
|
+
baseBranch: baseBranchDesc,
|
|
75
|
+
prList: prListSummary,
|
|
76
|
+
warnings,
|
|
77
|
+
errors
|
|
78
|
+
});
|
|
79
|
+
} else prBody = prBody.replace(prList, prListSummary);
|
|
42
80
|
}
|
|
43
81
|
logger.trace(`prBody:\n${prBody}`);
|
|
44
82
|
prBody = platform.massageMarkdown(prBody);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment.js","names":[],"sources":["../../../../lib/workers/repository/reconfigure/comment.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { ensureComment } from '../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../modules/platform/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport type { BranchConfig } from '../../types.ts';\nimport {\n getDepWarningsOnboardingPR,\n getErrors,\n getWarnings,\n} from '../errors-warnings.ts';\nimport { getBaseBranchDesc } from '../onboarding/pr/base-branch.ts';\nimport { getScheduleDesc } from '../onboarding/pr/config-description.ts';\nimport {\n getPackageFilesDesc,\n getPackageFilesSummary,\n} from '../onboarding/pr/package-files.ts';\nimport {\n getExpectedPrList,\n getExpectedPrListSummary,\n} from '../onboarding/pr/pr-list.ts';\n\
|
|
1
|
+
{"version":3,"file":"comment.js","names":[],"sources":["../../../../lib/workers/repository/reconfigure/comment.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { ensureComment } from '../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../modules/platform/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport type { BranchConfig } from '../../types.ts';\nimport {\n getDepWarningsOnboardingPR,\n getErrors,\n getWarnings,\n} from '../errors-warnings.ts';\nimport { getBaseBranchDesc } from '../onboarding/pr/base-branch.ts';\nimport { getScheduleDesc } from '../onboarding/pr/config-description.ts';\nimport {\n getPackageFilesDesc,\n getPackageFilesSummary,\n} from '../onboarding/pr/package-files.ts';\nimport {\n getExpectedPrList,\n getExpectedPrListSummary,\n} from '../onboarding/pr/pr-list.ts';\nimport type { ReconfigurePrCommentSections } from '../onboarding/pr/types.ts';\n\n// Full reconfigure PR comments list package files before the PR list.\nconst SECTION_ORDER = [\n 'PACKAGE FILES',\n 'CONFIG',\n 'BASEBRANCH',\n 'PRLIST',\n 'WARNINGS',\n 'ERRORS',\n] as const;\n// Once the body is summarised, \"What to Expect\" should render before \"Detected Package Files\".\nconst SUMMARY_SECTION_ORDER = [\n 'PRLIST',\n 'CONFIG',\n 'BASEBRANCH',\n 'PACKAGE FILES',\n 'WARNINGS',\n 'ERRORS',\n] as const;\n\nfunction buildReconfigurePrCommentTemplate(\n sectionOrder: readonly string[],\n): string {\n let prCommentTemplate = `This is a reconfigure PR comment to help you understand and re-configure your renovate bot settings. If this Reconfigure PR were to be merged, we'd expect to see the following outcome:\\n\\n`;\n\n // TODO #22198\n prCommentTemplate += `\n---\n${sectionOrder.map((section) => `{{${section}}}`).join('\\n')}\n`;\n return prCommentTemplate;\n}\n\nfunction fillReconfigurePrCommentBody(\n prCommentTemplate: string,\n sections: ReconfigurePrCommentSections,\n): string {\n let prBody = prCommentTemplate;\n if (sections.packageFiles) {\n prBody = `${prBody.replace('{{PACKAGE FILES}}', sections.packageFiles)}\\n`;\n } else {\n prBody = prBody.replace('{{PACKAGE FILES}}\\n', '');\n }\n prBody = prBody.replace('{{CONFIG}}\\n', sections.config);\n prBody = prBody.replace('{{WARNINGS}}\\n', sections.warnings);\n prBody = prBody.replace('{{ERRORS}}\\n', sections.errors);\n prBody = prBody.replace('{{BASEBRANCH}}\\n', sections.baseBranch);\n prBody = prBody.replace('{{PRLIST}}\\n', sections.prList);\n return prBody;\n}\n\nexport async function ensureReconfigurePrComment(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]> | null,\n branches: BranchConfig[],\n branchName: string,\n pr: Pr,\n): Promise<boolean> {\n logger.debug('ensureReconfigurePrComment()');\n logger.trace({ config });\n\n const packageFilesDesc = getPackageFilesDesc(packageFiles);\n let configDesc = '';\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would check branch ${branchName}`);\n } else {\n configDesc = getConfigDesc(config);\n }\n const warnings =\n getWarnings(config) + getDepWarningsOnboardingPR(packageFiles!, config);\n const errors = getErrors(config);\n const baseBranchDesc = getBaseBranchDesc(config);\n const prList = getExpectedPrList(config, branches);\n\n let prBody = fillReconfigurePrCommentBody(\n buildReconfigurePrCommentTemplate(SECTION_ORDER),\n {\n packageFiles: packageFilesDesc,\n config: configDesc,\n baseBranch: baseBranchDesc,\n prList,\n warnings,\n errors,\n },\n );\n\n if (prBody.length > platform.maxBodyLength()) {\n logger.debug(\n 'Reconfigure PR body exceeds platform limit, switching to summary PR list and package files',\n );\n const prListSummary = getExpectedPrListSummary(config, branches);\n if (packageFilesDesc) {\n const packageFilesSummary = `### Detected Package Files\\n\\n${getPackageFilesSummary(packageFiles)}`;\n // \"What to Expect\" should render before \"Detected Package Files\" in the summary view,\n // so rebuild from a template with that section order rather than reordering the rendered body.\n prBody = fillReconfigurePrCommentBody(\n buildReconfigurePrCommentTemplate(SUMMARY_SECTION_ORDER),\n {\n packageFiles: packageFilesSummary,\n config: configDesc,\n baseBranch: baseBranchDesc,\n prList: prListSummary,\n warnings,\n errors,\n },\n );\n } else {\n prBody = prBody.replace(prList, prListSummary);\n }\n }\n\n logger.trace(`prBody:\\n${prBody}`);\n\n prBody = platform.massageMarkdown(prBody);\n\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would ensure comment');\n return true;\n }\n\n return await ensureComment({\n number: pr.number,\n topic: 'Reconfigure PR Results',\n content: prBody,\n });\n}\n\nfunction getDescriptionArray(config: RenovateConfig): string[] {\n logger.debug('getDescriptionArray()');\n logger.trace({ config });\n const desc = isArray(config.description, isString) ? config.description : [];\n return desc.concat(getScheduleDesc(config));\n}\n\nexport function getConfigDesc(config: RenovateConfig): string {\n logger.debug('getConfigDesc()');\n logger.trace({ config });\n const descriptionArr = getDescriptionArray(config);\n if (!descriptionArr.length) {\n logger.debug('No config description found');\n return '';\n }\n logger.debug(`Found description array with length:${descriptionArr.length}`);\n let desc = `\\n### Configuration Summary\\n\\nBased on the default config's presets, Renovate will:\\n\\n`;\n descriptionArr.forEach((d) => {\n desc += ` - ${d}\\n`;\n });\n desc += '\\n\\n---\\n';\n return desc;\n}\n"],"mappings":";;;;;;;;;;;AA2BA,MAAM,gBAAgB;CACpB;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,kCACP,cACQ;CACR,IAAI,oBAAoB;CAGxB,qBAAqB;;EAErB,aAAa,KAAK,YAAY,KAAK,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;;CAE3D,OAAO;AACT;AAEA,SAAS,6BACP,mBACA,UACQ;CACR,IAAI,SAAS;CACb,IAAI,SAAS,cACX,SAAS,GAAG,OAAO,QAAQ,qBAAqB,SAAS,YAAY,EAAE;MAEvE,SAAS,OAAO,QAAQ,uBAAuB,EAAE;CAEnD,SAAS,OAAO,QAAQ,gBAAgB,SAAS,MAAM;CACvD,SAAS,OAAO,QAAQ,kBAAkB,SAAS,QAAQ;CAC3D,SAAS,OAAO,QAAQ,gBAAgB,SAAS,MAAM;CACvD,SAAS,OAAO,QAAQ,oBAAoB,SAAS,UAAU;CAC/D,SAAS,OAAO,QAAQ,gBAAgB,SAAS,MAAM;CACvD,OAAO;AACT;AAEA,eAAsB,2BACpB,QACA,cACA,UACA,YACA,IACkB;CAClB,OAAO,MAAM,8BAA8B;CAC3C,OAAO,MAAM,EAAE,OAAO,CAAC;CAEvB,MAAM,mBAAmB,oBAAoB,YAAY;CACzD,IAAI,aAAa;CACjB,IAAI,aAAa,IAAI,QAAQ,GAC3B,OAAO,KAAK,+BAA+B,YAAY;MAEvD,aAAa,cAAc,MAAM;CAEnC,MAAM,WACJ,YAAY,MAAM,IAAI,2BAA2B,cAAe,MAAM;CACxE,MAAM,SAAS,UAAU,MAAM;CAC/B,MAAM,iBAAiB,kBAAkB,MAAM;CAC/C,MAAM,SAAS,kBAAkB,QAAQ,QAAQ;CAEjD,IAAI,SAAS,6BACX,kCAAkC,aAAa,GAC/C;EACE,cAAc;EACd,QAAQ;EACR,YAAY;EACZ;EACA;EACA;CACF,CACF;CAEA,IAAI,OAAO,SAAS,SAAS,cAAc,GAAG;EAC5C,OAAO,MACL,4FACF;EACA,MAAM,gBAAgB,yBAAyB,QAAQ,QAAQ;EAC/D,IAAI,kBAAkB;GACpB,MAAM,sBAAsB,iCAAiC,uBAAuB,YAAY;GAGhG,SAAS,6BACP,kCAAkC,qBAAqB,GACvD;IACE,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR;IACA;GACF,CACF;EACF,OACE,SAAS,OAAO,QAAQ,QAAQ,aAAa;CAEjD;CAEA,OAAO,MAAM,YAAY,QAAQ;CAEjC,SAAS,SAAS,gBAAgB,MAAM;CAExC,IAAI,aAAa,IAAI,QAAQ,GAAG;EAC9B,OAAO,KAAK,+BAA+B;EAC3C,OAAO;CACT;CAEA,OAAO,MAAM,cAAc;EACzB,QAAQ,GAAG;EACX,OAAO;EACP,SAAS;CACX,CAAC;AACH;AAEA,SAAS,oBAAoB,QAAkC;CAC7D,OAAO,MAAM,uBAAuB;CACpC,OAAO,MAAM,EAAE,OAAO,CAAC;CAEvB,QADa,QAAQ,OAAO,aAAa,QAAQ,IAAI,OAAO,cAAc,CAAC,EAAA,CAC/D,OAAO,gBAAgB,MAAM,CAAC;AAC5C;AAEA,SAAgB,cAAc,QAAgC;CAC5D,OAAO,MAAM,iBAAiB;CAC9B,OAAO,MAAM,EAAE,OAAO,CAAC;CACvB,MAAM,iBAAiB,oBAAoB,MAAM;CACjD,IAAI,CAAC,eAAe,QAAQ;EAC1B,OAAO,MAAM,6BAA6B;EAC1C,OAAO;CACT;CACA,OAAO,MAAM,uCAAuC,eAAe,QAAQ;CAC3E,IAAI,OAAO;CACX,eAAe,SAAS,MAAM;EAC5B,QAAQ,OAAO,EAAE;CACnB,CAAC;CACD,QAAQ;CACR,OAAO;AACT"}
|
package/package.json
CHANGED
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.
|
|
3
|
+
"title": "JSON schema for Renovate 44.39.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.
|
|
5
|
+
"x-renovate-version": "44.39.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": "#",
|