renovate 44.17.0 → 44.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/dist/config/migrations/custom/ignore-npmrc-file-migration.js +2 -1
  2. package/dist/config/migrations/custom/ignore-npmrc-file-migration.js.map +1 -1
  3. package/dist/config/migrations/custom/stability-days-migration.js +1 -3
  4. package/dist/config/migrations/custom/stability-days-migration.js.map +1 -1
  5. package/dist/config/options/index.js +1 -1
  6. package/dist/config/options/index.js.map +1 -1
  7. package/dist/config/secrets.js +2 -1
  8. package/dist/config/secrets.js.map +1 -1
  9. package/dist/config/validation.js +1 -3
  10. package/dist/config/validation.js.map +1 -1
  11. package/dist/config-validator.js +2 -1
  12. package/dist/config-validator.js.map +1 -1
  13. package/dist/expose.js.map +1 -1
  14. package/dist/global-config-option-defaults.generated.js +1 -1
  15. package/dist/global-config-option-defaults.generated.js.map +1 -1
  16. package/dist/modules/datasource/artifactory/index.js +2 -1
  17. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  18. package/dist/modules/datasource/aws-eks-addon/index.js +2 -1
  19. package/dist/modules/datasource/aws-eks-addon/index.js.map +1 -1
  20. package/dist/modules/datasource/aws-machine-image/index.js +3 -2
  21. package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
  22. package/dist/modules/datasource/bazel/index.js +2 -1
  23. package/dist/modules/datasource/bazel/index.js.map +1 -1
  24. package/dist/modules/datasource/bitbucket-server-tags/index.js +4 -2
  25. package/dist/modules/datasource/bitbucket-server-tags/index.js.map +1 -1
  26. package/dist/modules/datasource/bitbucket-tags/index.js +2 -1
  27. package/dist/modules/datasource/bitbucket-tags/index.js.map +1 -1
  28. package/dist/modules/datasource/bitrise/index.js +2 -1
  29. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  30. package/dist/modules/datasource/common.js +4 -2
  31. package/dist/modules/datasource/common.js.map +1 -1
  32. package/dist/modules/datasource/crate/index.js +12 -5
  33. package/dist/modules/datasource/crate/index.js.map +1 -1
  34. package/dist/modules/datasource/custom/formats/toml.js +2 -1
  35. package/dist/modules/datasource/custom/formats/toml.js.map +1 -1
  36. package/dist/modules/datasource/custom/formats/yaml.js +4 -2
  37. package/dist/modules/datasource/custom/formats/yaml.js.map +1 -1
  38. package/dist/modules/datasource/deb/checksum.js +2 -1
  39. package/dist/modules/datasource/deb/checksum.js.map +1 -1
  40. package/dist/modules/datasource/deb/packages.js +3 -1
  41. package/dist/modules/datasource/deb/packages.js.map +1 -1
  42. package/dist/modules/datasource/deno/index.js +2 -1
  43. package/dist/modules/datasource/deno/index.js.map +1 -1
  44. package/dist/modules/datasource/docker/common.js +3 -2
  45. package/dist/modules/datasource/docker/common.js.map +1 -1
  46. package/dist/modules/datasource/docker/dockerhub-cache.js +1 -1
  47. package/dist/modules/datasource/docker/dockerhub-cache.js.map +1 -1
  48. package/dist/modules/datasource/docker/index.js +11 -10
  49. package/dist/modules/datasource/docker/index.js.map +1 -1
  50. package/dist/modules/datasource/forgejo-tags/index.js +4 -2
  51. package/dist/modules/datasource/forgejo-tags/index.js.map +1 -1
  52. package/dist/modules/datasource/galaxy-collection/index.js +5 -3
  53. package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
  54. package/dist/modules/datasource/git-refs/base.js +2 -1
  55. package/dist/modules/datasource/git-refs/base.js.map +1 -1
  56. package/dist/modules/datasource/git-refs/index.js +1 -1
  57. package/dist/modules/datasource/git-refs/index.js.map +1 -1
  58. package/dist/modules/datasource/gitea-tags/index.js +4 -2
  59. package/dist/modules/datasource/gitea-tags/index.js.map +1 -1
  60. package/dist/modules/datasource/github-release-attachments/index.js +3 -2
  61. package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
  62. package/dist/modules/datasource/github-tags/index.js +1 -1
  63. package/dist/modules/datasource/github-tags/index.js.map +1 -1
  64. package/dist/modules/datasource/gitlab-tags/index.js +2 -1
  65. package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
  66. package/dist/modules/datasource/gitlab-tags/util.js +2 -1
  67. package/dist/modules/datasource/gitlab-tags/util.js.map +1 -1
  68. package/dist/modules/datasource/go/releases-goproxy.js +8 -5
  69. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  70. package/dist/modules/datasource/jenkins-plugins/index.js +1 -1
  71. package/dist/modules/datasource/jenkins-plugins/index.js.map +1 -1
  72. package/dist/modules/datasource/jsr/index.js +2 -1
  73. package/dist/modules/datasource/jsr/index.js.map +1 -1
  74. package/dist/modules/datasource/maven/index.js +3 -2
  75. package/dist/modules/datasource/maven/index.js.map +1 -1
  76. package/dist/modules/datasource/maven/util.js +1 -1
  77. package/dist/modules/datasource/maven/util.js.map +1 -1
  78. package/dist/modules/datasource/nuget/v2.js +3 -2
  79. package/dist/modules/datasource/nuget/v2.js.map +1 -1
  80. package/dist/modules/datasource/nuget/v3.js +9 -5
  81. package/dist/modules/datasource/nuget/v3.js.map +1 -1
  82. package/dist/modules/datasource/packagist/index.js +7 -4
  83. package/dist/modules/datasource/packagist/index.js.map +1 -1
  84. package/dist/modules/datasource/rpm/providers/common.js +3 -1
  85. package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
  86. package/dist/modules/datasource/rpm/repomd.js +2 -1
  87. package/dist/modules/datasource/rpm/repomd.js.map +1 -1
  88. package/dist/modules/datasource/ruby-version/index.js +2 -1
  89. package/dist/modules/datasource/ruby-version/index.js.map +1 -1
  90. package/dist/modules/datasource/rubygems/metadata-cache.js +1 -1
  91. package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
  92. package/dist/modules/datasource/sbt-package/index.js +8 -5
  93. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  94. package/dist/modules/datasource/sbt-package/util.js +2 -1
  95. package/dist/modules/datasource/sbt-package/util.js.map +1 -1
  96. package/dist/modules/datasource/terraform-module/index.js +4 -2
  97. package/dist/modules/datasource/terraform-module/index.js.map +1 -1
  98. package/dist/modules/datasource/terraform-module/utils.js +2 -1
  99. package/dist/modules/datasource/terraform-module/utils.js.map +1 -1
  100. package/dist/modules/datasource/terraform-provider/index.js +2 -1
  101. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  102. package/dist/modules/datasource/typst/schema.js +4 -2
  103. package/dist/modules/datasource/typst/schema.js.map +1 -1
  104. package/dist/modules/manager/ansible-galaxy/collections.js +2 -2
  105. package/dist/modules/manager/ansible-galaxy/collections.js.map +1 -1
  106. package/dist/modules/manager/ansible-galaxy/extract.js +5 -3
  107. package/dist/modules/manager/ansible-galaxy/extract.js.map +1 -1
  108. package/dist/modules/manager/bazel/artifacts.js +1 -1
  109. package/dist/modules/manager/bazel/artifacts.js.map +1 -1
  110. package/dist/modules/manager/bazel/parser.js +1 -1
  111. package/dist/modules/manager/bazel/parser.js.map +1 -1
  112. package/dist/modules/manager/bazel/rules/index.js +7 -2
  113. package/dist/modules/manager/bazel/rules/index.js.map +1 -1
  114. package/dist/modules/manager/bazel-module/extract.js +2 -1
  115. package/dist/modules/manager/bazel-module/extract.js.map +1 -1
  116. package/dist/modules/manager/bazel-module/parser/extension-tags.js +3 -2
  117. package/dist/modules/manager/bazel-module/parser/extension-tags.js.map +1 -1
  118. package/dist/modules/manager/bazel-module/rules.js +1 -3
  119. package/dist/modules/manager/bazel-module/rules.js.map +1 -1
  120. package/dist/modules/manager/bitbucket-pipelines/extract.js +5 -3
  121. package/dist/modules/manager/bitbucket-pipelines/extract.js.map +1 -1
  122. package/dist/modules/manager/buildkite/extract.js +1 -1
  123. package/dist/modules/manager/buildkite/extract.js.map +1 -1
  124. package/dist/modules/manager/bun/extract.js +2 -1
  125. package/dist/modules/manager/bun/extract.js.map +1 -1
  126. package/dist/modules/manager/bundler/artifacts.js +3 -2
  127. package/dist/modules/manager/bundler/artifacts.js.map +1 -1
  128. package/dist/modules/manager/cargo/artifacts.js +3 -2
  129. package/dist/modules/manager/cargo/artifacts.js.map +1 -1
  130. package/dist/modules/manager/cocoapods/artifacts.js +2 -1
  131. package/dist/modules/manager/cocoapods/artifacts.js.map +1 -1
  132. package/dist/modules/manager/composer/update-locked.js +1 -1
  133. package/dist/modules/manager/composer/update-locked.js.map +1 -1
  134. package/dist/modules/manager/conan/artifacts.js +4 -2
  135. package/dist/modules/manager/conan/artifacts.js.map +1 -1
  136. package/dist/modules/manager/custom/jsonata/index.js +1 -3
  137. package/dist/modules/manager/custom/jsonata/index.js.map +1 -1
  138. package/dist/modules/manager/custom/jsonata/utils.js +1 -3
  139. package/dist/modules/manager/custom/jsonata/utils.js.map +1 -1
  140. package/dist/modules/manager/custom/regex/index.js +1 -3
  141. package/dist/modules/manager/custom/regex/index.js.map +1 -1
  142. package/dist/modules/manager/custom/regex/strategies.js +7 -6
  143. package/dist/modules/manager/custom/regex/strategies.js.map +1 -1
  144. package/dist/modules/manager/custom/regex/utils.js +1 -3
  145. package/dist/modules/manager/custom/regex/utils.js.map +1 -1
  146. package/dist/modules/manager/docker-compose/extract.js +2 -2
  147. package/dist/modules/manager/docker-compose/extract.js.map +1 -1
  148. package/dist/modules/manager/droneci/extract.js +1 -1
  149. package/dist/modules/manager/droneci/extract.js.map +1 -1
  150. package/dist/modules/manager/flux/artifacts.js +5 -3
  151. package/dist/modules/manager/flux/artifacts.js.map +1 -1
  152. package/dist/modules/manager/flux/extract.js +2 -6
  153. package/dist/modules/manager/flux/extract.js.map +1 -1
  154. package/dist/modules/manager/git-submodules/extract.js +5 -4
  155. package/dist/modules/manager/git-submodules/extract.js.map +1 -1
  156. package/dist/modules/manager/github-actions/extract.js +2 -1
  157. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  158. package/dist/modules/manager/gitlabci/extract.js +1 -1
  159. package/dist/modules/manager/gitlabci/extract.js.map +1 -1
  160. package/dist/modules/manager/gitlabci/schema.js +2 -1
  161. package/dist/modules/manager/gitlabci/schema.js.map +1 -1
  162. package/dist/modules/manager/gitlabci-include/extract.js +1 -1
  163. package/dist/modules/manager/gitlabci-include/extract.js.map +1 -1
  164. package/dist/modules/manager/gleam/artifacts.js +2 -1
  165. package/dist/modules/manager/gleam/artifacts.js.map +1 -1
  166. package/dist/modules/manager/gomod/artifacts.js +2 -1
  167. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  168. package/dist/modules/manager/gradle/artifacts.js +3 -1
  169. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  170. package/dist/modules/manager/gradle/extract/catalog.js +3 -1
  171. package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
  172. package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js +2 -1
  173. package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js.map +1 -1
  174. package/dist/modules/manager/gradle/extract.js +4 -2
  175. package/dist/modules/manager/gradle/extract.js.map +1 -1
  176. package/dist/modules/manager/gradle/parser/handlers.js +4 -2
  177. package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
  178. package/dist/modules/manager/gradle/parser/registry-urls.js +3 -2
  179. package/dist/modules/manager/gradle/parser/registry-urls.js.map +1 -1
  180. package/dist/modules/manager/gradle-wrapper/utils.js +2 -1
  181. package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
  182. package/dist/modules/manager/helm-values/extract.js +1 -1
  183. package/dist/modules/manager/helm-values/extract.js.map +1 -1
  184. package/dist/modules/manager/helmfile/utils.js +3 -2
  185. package/dist/modules/manager/helmfile/utils.js.map +1 -1
  186. package/dist/modules/manager/helmsman/extract.js +1 -1
  187. package/dist/modules/manager/helmsman/extract.js.map +1 -1
  188. package/dist/modules/manager/helmv3/artifacts.js +3 -2
  189. package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
  190. package/dist/modules/manager/jenkins/extract.js +1 -1
  191. package/dist/modules/manager/jenkins/extract.js.map +1 -1
  192. package/dist/modules/manager/jsonnet-bundler/artifacts.js +1 -1
  193. package/dist/modules/manager/jsonnet-bundler/artifacts.js.map +1 -1
  194. package/dist/modules/manager/kustomize/artifacts.js +3 -4
  195. package/dist/modules/manager/kustomize/artifacts.js.map +1 -1
  196. package/dist/modules/manager/kustomize/extract.js +1 -1
  197. package/dist/modules/manager/kustomize/extract.js.map +1 -1
  198. package/dist/modules/manager/leiningen/extract.js +2 -1
  199. package/dist/modules/manager/leiningen/extract.js.map +1 -1
  200. package/dist/modules/manager/maven/extract.js +6 -6
  201. package/dist/modules/manager/maven/extract.js.map +1 -1
  202. package/dist/modules/manager/maven-wrapper/artifacts.js +4 -1
  203. package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
  204. package/dist/modules/manager/meteor/extract.js +1 -1
  205. package/dist/modules/manager/meteor/extract.js.map +1 -1
  206. package/dist/modules/manager/mix/artifacts.js +2 -1
  207. package/dist/modules/manager/mix/artifacts.js.map +1 -1
  208. package/dist/modules/manager/nix/extract.js +0 -1
  209. package/dist/modules/manager/nix/extract.js.map +1 -1
  210. package/dist/modules/manager/npm/artifacts.js +2 -1
  211. package/dist/modules/manager/npm/artifacts.js.map +1 -1
  212. package/dist/modules/manager/npm/extract/common/package-file.js +1 -1
  213. package/dist/modules/manager/npm/extract/common/package-file.js.map +1 -1
  214. package/dist/modules/manager/npm/extract/pnpm.js +2 -1
  215. package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
  216. package/dist/modules/manager/npm/extract/yarn.js +3 -2
  217. package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
  218. package/dist/modules/manager/npm/post-update/index.js +9 -7
  219. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  220. package/dist/modules/manager/npm/post-update/npm.js +7 -4
  221. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  222. package/dist/modules/manager/npm/post-update/pnpm.js +1 -1
  223. package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
  224. package/dist/modules/manager/npm/update/dependency/index.js +2 -1
  225. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  226. package/dist/modules/manager/npm/update/index.js +5 -0
  227. package/dist/modules/manager/npm/update/index.js.map +1 -0
  228. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js +1 -1
  229. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js.map +1 -1
  230. package/dist/modules/manager/npm/update/locked-dependency/package-lock/index.js +21 -16
  231. package/dist/modules/manager/npm/update/locked-dependency/package-lock/index.js.map +1 -1
  232. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js +2 -2
  233. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js.map +1 -1
  234. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/index.js +1 -1
  235. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/index.js.map +1 -1
  236. package/dist/modules/manager/npm/utils.js +3 -3
  237. package/dist/modules/manager/npm/utils.js.map +1 -1
  238. package/dist/modules/manager/nuget/artifacts.js +2 -1
  239. package/dist/modules/manager/nuget/artifacts.js.map +1 -1
  240. package/dist/modules/manager/nuget/update.js +2 -1
  241. package/dist/modules/manager/nuget/update.js.map +1 -1
  242. package/dist/modules/manager/pep621/processors/pdm.js +2 -1
  243. package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
  244. package/dist/modules/manager/pep621/schema.js +2 -1
  245. package/dist/modules/manager/pep621/schema.js.map +1 -1
  246. package/dist/modules/manager/pip-compile/artifacts.js +2 -1
  247. package/dist/modules/manager/pip-compile/artifacts.js.map +1 -1
  248. package/dist/modules/manager/pip_requirements/artifacts.js +5 -3
  249. package/dist/modules/manager/pip_requirements/artifacts.js.map +1 -1
  250. package/dist/modules/manager/pipenv/extract.js +2 -1
  251. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  252. package/dist/modules/manager/poetry/artifacts.js +3 -2
  253. package/dist/modules/manager/poetry/artifacts.js.map +1 -1
  254. package/dist/modules/manager/poetry/extract.js +2 -1
  255. package/dist/modules/manager/poetry/extract.js.map +1 -1
  256. package/dist/modules/manager/pre-commit/extract.js +5 -3
  257. package/dist/modules/manager/pre-commit/extract.js.map +1 -1
  258. package/dist/modules/manager/puppet/puppetfile-parser.js +2 -1
  259. package/dist/modules/manager/puppet/puppetfile-parser.js.map +1 -1
  260. package/dist/modules/manager/quadlet/extract.js +2 -1
  261. package/dist/modules/manager/quadlet/extract.js.map +1 -1
  262. package/dist/modules/manager/sbt/extract.js +1 -1
  263. package/dist/modules/manager/sbt/extract.js.map +1 -1
  264. package/dist/modules/manager/swift/extract.js +4 -6
  265. package/dist/modules/manager/swift/extract.js.map +1 -1
  266. package/dist/modules/manager/terraform/lockfile/index.js +4 -3
  267. package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
  268. package/dist/modules/manager/terraform/util.js +2 -1
  269. package/dist/modules/manager/terraform/util.js.map +1 -1
  270. package/dist/modules/manager/terragrunt/extract.js +3 -9
  271. package/dist/modules/manager/terragrunt/extract.js.map +1 -1
  272. package/dist/modules/manager/tflint-plugin/extract.js +1 -1
  273. package/dist/modules/manager/tflint-plugin/extract.js.map +1 -1
  274. package/dist/modules/manager/vendir/artifacts.js +3 -2
  275. package/dist/modules/manager/vendir/artifacts.js.map +1 -1
  276. package/dist/modules/platform/azure/index.js +8 -7
  277. package/dist/modules/platform/azure/index.js.map +1 -1
  278. package/dist/modules/platform/bitbucket/comments.js +2 -2
  279. package/dist/modules/platform/bitbucket/comments.js.map +1 -1
  280. package/dist/modules/platform/bitbucket/index.js +9 -8
  281. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  282. package/dist/modules/platform/bitbucket-server/index.js +8 -9
  283. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  284. package/dist/modules/platform/codecommit/codecommit-client.js +8 -5
  285. package/dist/modules/platform/codecommit/codecommit-client.js.map +1 -1
  286. package/dist/modules/platform/codecommit/index.js +5 -5
  287. package/dist/modules/platform/codecommit/index.js.map +1 -1
  288. package/dist/modules/platform/forgejo/forgejo-helper.js +5 -3
  289. package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -1
  290. package/dist/modules/platform/forgejo/index.js +15 -8
  291. package/dist/modules/platform/forgejo/index.js.map +1 -1
  292. package/dist/modules/platform/gerrit/client.js +2 -1
  293. package/dist/modules/platform/gerrit/client.js.map +1 -1
  294. package/dist/modules/platform/gerrit/index.js +4 -2
  295. package/dist/modules/platform/gerrit/index.js.map +1 -1
  296. package/dist/modules/platform/gerrit/utils.js +1 -1
  297. package/dist/modules/platform/gerrit/utils.js.map +1 -1
  298. package/dist/modules/platform/gitea/gitea-helper.js +5 -3
  299. package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
  300. package/dist/modules/platform/gitea/index.js +16 -9
  301. package/dist/modules/platform/gitea/index.js.map +1 -1
  302. package/dist/modules/platform/github/index.js +27 -24
  303. package/dist/modules/platform/github/index.js.map +1 -1
  304. package/dist/modules/platform/github/massage-markdown-links.js +1 -1
  305. package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
  306. package/dist/modules/platform/github/pr.js +1 -1
  307. package/dist/modules/platform/github/pr.js.map +1 -1
  308. package/dist/modules/platform/github/schema.js +3 -2
  309. package/dist/modules/platform/github/schema.js.map +1 -1
  310. package/dist/modules/platform/gitlab/index.js +19 -14
  311. package/dist/modules/platform/gitlab/index.js.map +1 -1
  312. package/dist/modules/platform/local/scm.js +1 -1
  313. package/dist/modules/platform/local/scm.js.map +1 -1
  314. package/dist/modules/platform/util.js +2 -1
  315. package/dist/modules/platform/util.js.map +1 -1
  316. package/dist/modules/versioning/cargo/index.js +1 -1
  317. package/dist/modules/versioning/cargo/index.js.map +1 -1
  318. package/dist/modules/versioning/conan/index.js +4 -2
  319. package/dist/modules/versioning/conan/index.js.map +1 -1
  320. package/dist/modules/versioning/nixpkgs/index.js +2 -1
  321. package/dist/modules/versioning/nixpkgs/index.js.map +1 -1
  322. package/dist/modules/versioning/nuget/index.js +4 -2
  323. package/dist/modules/versioning/nuget/index.js.map +1 -1
  324. package/dist/modules/versioning/nuget/range.js +4 -2
  325. package/dist/modules/versioning/nuget/range.js.map +1 -1
  326. package/dist/modules/versioning/pep440/range.js +1 -1
  327. package/dist/modules/versioning/pep440/range.js.map +1 -1
  328. package/dist/modules/versioning/perl/index.js +1 -1
  329. package/dist/modules/versioning/perl/index.js.map +1 -1
  330. package/dist/modules/versioning/poetry/index.js +2 -2
  331. package/dist/modules/versioning/poetry/index.js.map +1 -1
  332. package/dist/modules/versioning/rez/index.js +5 -5
  333. package/dist/modules/versioning/rez/index.js.map +1 -1
  334. package/dist/modules/versioning/ruby/strategies/bump.js +3 -2
  335. package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
  336. package/dist/modules/versioning/ruby/strategies/replace.js +3 -2
  337. package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
  338. package/dist/modules/versioning/ruby/strategies/widen.js +3 -2
  339. package/dist/modules/versioning/ruby/strategies/widen.js.map +1 -1
  340. package/dist/util/cache/package/index.js +3 -1
  341. package/dist/util/cache/package/index.js.map +1 -1
  342. package/dist/util/cache/package/with-cache.js +7 -4
  343. package/dist/util/cache/package/with-cache.js.map +1 -1
  344. package/dist/util/cache/repository/impl/base.js +3 -2
  345. package/dist/util/cache/repository/impl/base.js.map +1 -1
  346. package/dist/util/cache/repository/impl/local.js +2 -1
  347. package/dist/util/cache/repository/impl/local.js.map +1 -1
  348. package/dist/util/cache/repository/impl/s3.js +4 -1
  349. package/dist/util/cache/repository/impl/s3.js.map +1 -1
  350. package/dist/util/date.js +1 -1
  351. package/dist/util/date.js.map +1 -1
  352. package/dist/util/emoji.js +6 -2
  353. package/dist/util/emoji.js.map +1 -1
  354. package/dist/util/exec/common.js +1 -1
  355. package/dist/util/exec/common.js.map +1 -1
  356. package/dist/util/exec/docker/index.js +2 -1
  357. package/dist/util/exec/docker/index.js.map +1 -1
  358. package/dist/util/exec/hermit.js +2 -1
  359. package/dist/util/exec/hermit.js.map +1 -1
  360. package/dist/util/exec/index.js +1 -1
  361. package/dist/util/exec/index.js.map +1 -1
  362. package/dist/util/fs/index.js +2 -1
  363. package/dist/util/fs/index.js.map +1 -1
  364. package/dist/util/git/index.js +32 -34
  365. package/dist/util/git/index.js.map +1 -1
  366. package/dist/util/git/url.js +2 -3
  367. package/dist/util/git/url.js.map +1 -1
  368. package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js +4 -2
  369. package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js.map +1 -1
  370. package/dist/util/github/graphql/datasource-fetcher.js +3 -1
  371. package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
  372. package/dist/util/http/cache/memory-http-cache-provider.js +2 -1
  373. package/dist/util/http/cache/memory-http-cache-provider.js.map +1 -1
  374. package/dist/util/http/github.js +3 -2
  375. package/dist/util/http/github.js.map +1 -1
  376. package/dist/util/http/http.js +2 -1
  377. package/dist/util/http/http.js.map +1 -1
  378. package/dist/util/http/index.js +1 -0
  379. package/dist/util/http/index.js.map +1 -1
  380. package/dist/util/http/www-authenticate.js +1 -3
  381. package/dist/util/http/www-authenticate.js.map +1 -1
  382. package/dist/util/mutex.js +1 -1
  383. package/dist/util/mutex.js.map +1 -1
  384. package/dist/util/schema-utils/index.js +1 -1
  385. package/dist/util/schema-utils/index.js.map +1 -1
  386. package/dist/util/toml.js +2 -1
  387. package/dist/util/toml.js.map +1 -1
  388. package/dist/util/yaml.js +4 -2
  389. package/dist/util/yaml.js.map +1 -1
  390. package/dist/workers/global/config/parse/util.js.map +1 -1
  391. package/dist/workers/global/index.js +2 -2
  392. package/dist/workers/global/index.js.map +1 -1
  393. package/dist/workers/repository/changelog/index.js +2 -1
  394. package/dist/workers/repository/changelog/index.js.map +1 -1
  395. package/dist/workers/repository/config-migration/branch/rebase.js +2 -1
  396. package/dist/workers/repository/config-migration/branch/rebase.js.map +1 -1
  397. package/dist/workers/repository/error-config.js +1 -1
  398. package/dist/workers/repository/error-config.js.map +1 -1
  399. package/dist/workers/repository/finalize/prune.js +1 -1
  400. package/dist/workers/repository/finalize/prune.js.map +1 -1
  401. package/dist/workers/repository/finalize/repository-statistics.js +1 -4
  402. package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
  403. package/dist/workers/repository/index.js +8 -5
  404. package/dist/workers/repository/index.js.map +1 -1
  405. package/dist/workers/repository/init/vulnerability.js +1 -1
  406. package/dist/workers/repository/init/vulnerability.js.map +1 -1
  407. package/dist/workers/repository/onboarding/branch/config.js +2 -1
  408. package/dist/workers/repository/onboarding/branch/config.js.map +1 -1
  409. package/dist/workers/repository/onboarding/branch/create.js +2 -1
  410. package/dist/workers/repository/onboarding/branch/create.js.map +1 -1
  411. package/dist/workers/repository/onboarding/branch/index.js +2 -1
  412. package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
  413. package/dist/workers/repository/onboarding/pr/index.js +3 -1
  414. package/dist/workers/repository/onboarding/pr/index.js.map +1 -1
  415. package/dist/workers/repository/process/lookup/filter-checks.js +2 -1
  416. package/dist/workers/repository/process/lookup/filter-checks.js.map +1 -1
  417. package/dist/workers/repository/process/lookup/filter.js +1 -1
  418. package/dist/workers/repository/process/lookup/filter.js.map +1 -1
  419. package/dist/workers/repository/process/lookup/generate.js +1 -1
  420. package/dist/workers/repository/process/lookup/generate.js.map +1 -1
  421. package/dist/workers/repository/process/lookup/index.js +6 -3
  422. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  423. package/dist/workers/repository/process/lookup/rollback.js +1 -1
  424. package/dist/workers/repository/process/lookup/rollback.js.map +1 -1
  425. package/dist/workers/repository/process/vulnerabilities.js +2 -1
  426. package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
  427. package/dist/workers/repository/process/write.js +8 -4
  428. package/dist/workers/repository/process/write.js.map +1 -1
  429. package/dist/workers/repository/reconfigure/validate.js +2 -1
  430. package/dist/workers/repository/reconfigure/validate.js.map +1 -1
  431. package/dist/workers/repository/update/branch/auto-replace.js +1 -1
  432. package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
  433. package/dist/workers/repository/update/branch/bump-versions.js +2 -1
  434. package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
  435. package/dist/workers/repository/update/branch/index.js +3 -1
  436. package/dist/workers/repository/update/branch/index.js.map +1 -1
  437. package/dist/workers/repository/update/pr/automerge.js +1 -1
  438. package/dist/workers/repository/update/pr/automerge.js.map +1 -1
  439. package/dist/workers/repository/update/pr/body/updates-table.js +1 -1
  440. package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
  441. package/dist/workers/repository/update/pr/changelog/github/index.js +2 -1
  442. package/dist/workers/repository/update/pr/changelog/github/index.js.map +1 -1
  443. package/dist/workers/repository/update/pr/changelog/github/source.js +2 -1
  444. package/dist/workers/repository/update/pr/changelog/github/source.js.map +1 -1
  445. package/dist/workers/repository/update/pr/changelog/index.js +1 -1
  446. package/dist/workers/repository/update/pr/changelog/index.js.map +1 -1
  447. package/dist/workers/repository/update/pr/changelog/release-notes.js +5 -5
  448. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  449. package/dist/workers/repository/update/pr/changelog/releases.js +1 -1
  450. package/dist/workers/repository/update/pr/changelog/releases.js.map +1 -1
  451. package/dist/workers/repository/update/pr/index.js +6 -3
  452. package/dist/workers/repository/update/pr/index.js.map +1 -1
  453. package/dist/workers/repository/update/pr/pr-reuse.js +1 -1
  454. package/dist/workers/repository/update/pr/pr-reuse.js.map +1 -1
  455. package/package.json +1 -1
  456. package/renovate-schema.json +2 -2
@@ -37,7 +37,8 @@ function applySecretsAndVariablesToConfig(applyConfig) {
37
37
  const secrets = applyConfig.secrets ?? config.secrets;
38
38
  const variables = applyConfig.variables ?? config.variables;
39
39
  if (isPlainObject(secrets)) for (const secret of Object.values(secrets)) addSecretForSanitizing(secret);
40
- return replaceInterpolatedValuesInObject(replaceInterpolatedValuesInObject(config, variables ?? {}, options.variables, deleteVariables), secrets ?? {}, options.secrets, deleteSecrets);
40
+ const configWithVars = replaceInterpolatedValuesInObject(config, variables ?? {}, options.variables, deleteVariables);
41
+ return replaceInterpolatedValuesInObject(configWithVars, secrets ?? {}, options.secrets, deleteSecrets);
41
42
  }
42
43
  //#endregion
43
44
  export { applySecretsAndVariablesToConfig, options, validateConfigSecretsAndVariables };
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.js","names":[],"sources":["../../lib/config/secrets.ts"],"sourcesContent":["import { isPlainObject } from '@sindresorhus/is';\nimport type { InterpolatorOptions } from '../util/interpolator.ts';\nimport {\n replaceInterpolatedValuesInObject,\n validateInterpolatedValues,\n} from '../util/interpolator.ts';\nimport { regEx } from '../util/regex.ts';\nimport { addSecretForSanitizing } from '../util/sanitize.ts';\nimport type { AllConfig, RenovateConfig } from './types.ts';\n\nconst namePattern = '[A-Za-z][A-Za-z0-9_]*';\nconst nameRegex = regEx(`^${namePattern}$`);\nconst secretTemplateRegex = regEx(`{{ *secrets\\\\.(${namePattern}) *}}`, 'g');\nconst variableTemplateRegex = regEx(\n `{{ *variables\\\\.(${namePattern}) *}}`,\n 'g',\n);\n\nexport const options: Record<'secrets' | 'variables', InterpolatorOptions> = {\n secrets: {\n name: 'secrets',\n nameRegex,\n templateRegex: secretTemplateRegex,\n },\n variables: {\n name: 'variables',\n nameRegex,\n templateRegex: variableTemplateRegex,\n },\n};\n\nfunction validateNestedInterpolatedValues<T extends 'secrets' | 'variables'>(\n config: AllConfig,\n key: T,\n): void {\n validateInterpolatedValues(config[key], options[key]);\n if (config.repositories) {\n for (const repository of config.repositories) {\n if (isPlainObject(repository)) {\n validateInterpolatedValues(repository[key], options[key]);\n }\n }\n }\n}\n\nexport function validateConfigSecretsAndVariables(\n config: RenovateConfig,\n): void {\n validateNestedInterpolatedValues(config, 'secrets');\n validateNestedInterpolatedValues(config, 'variables');\n}\n\ninterface ApplySecretsAndVariablesConfig {\n config: RenovateConfig;\n secrets?: RenovateConfig['secrets'];\n variables?: RenovateConfig['variables'];\n deleteSecrets?: boolean;\n deleteVariables?: boolean;\n}\n\n/**\n * Applies both variables and secrets to the Renovate config by interpolating values\n */\nexport function applySecretsAndVariablesToConfig(\n applyConfig: ApplySecretsAndVariablesConfig,\n): RenovateConfig {\n const { config, deleteSecrets, deleteVariables } = applyConfig;\n const secrets = applyConfig.secrets ?? config.secrets;\n const variables = applyConfig.variables ?? config.variables;\n\n // Add all secrets to be sanitized\n if (isPlainObject(secrets)) {\n for (const secret of Object.values(secrets)) {\n addSecretForSanitizing(secret);\n }\n }\n\n const configWithVars = replaceInterpolatedValuesInObject(\n config,\n variables ?? {},\n options.variables,\n deleteVariables,\n );\n\n return replaceInterpolatedValuesInObject(\n configWithVars,\n secrets ?? {},\n options.secrets,\n deleteSecrets,\n );\n}\n"],"mappings":";;;;;AAUA,MAAM,cAAc;AACpB,MAAM,YAAY,MAAM,IAAI,YAAY,EAAE;AAC1C,MAAM,sBAAsB,MAAM,kBAAkB,YAAY,QAAQ,GAAG;AAC3E,MAAM,wBAAwB,MAC5B,oBAAoB,YAAY,QAChC,GACF;AAEA,MAAa,UAAgE;CAC3E,SAAS;EACP,MAAM;EACN;EACA,eAAe;CACjB;CACA,WAAW;EACT,MAAM;EACN;EACA,eAAe;CACjB;AACF;AAEA,SAAS,iCACP,QACA,KACM;CACN,2BAA2B,OAAO,MAAM,QAAQ,IAAI;CACpD,IAAI,OAAO,cACJ;OAAA,MAAM,cAAc,OAAO,cAC9B,IAAI,cAAc,UAAU,GAC1B,2BAA2B,WAAW,MAAM,QAAQ,IAAI;CAAA;AAIhE;AAEA,SAAgB,kCACd,QACM;CACN,iCAAiC,QAAQ,SAAS;CAClD,iCAAiC,QAAQ,WAAW;AACtD;;;;AAaA,SAAgB,iCACd,aACgB;CAChB,MAAM,EAAE,QAAQ,eAAe,oBAAoB;CACnD,MAAM,UAAU,YAAY,WAAW,OAAO;CAC9C,MAAM,YAAY,YAAY,aAAa,OAAO;CAGlD,IAAI,cAAc,OAAO,GACvB,KAAK,MAAM,UAAU,OAAO,OAAO,OAAO,GACxC,uBAAuB,MAAM;CAWjC,OAAO,kCAPgB,kCACrB,QACA,aAAa,CAAC,GACd,QAAQ,WACR,eAIa,GACb,WAAW,CAAC,GACZ,QAAQ,SACR,aACF;AACF"}
1
+ {"version":3,"file":"secrets.js","names":[],"sources":["../../lib/config/secrets.ts"],"sourcesContent":["import { isPlainObject } from '@sindresorhus/is';\nimport type { InterpolatorOptions } from '../util/interpolator.ts';\nimport {\n replaceInterpolatedValuesInObject,\n validateInterpolatedValues,\n} from '../util/interpolator.ts';\nimport { regEx } from '../util/regex.ts';\nimport { addSecretForSanitizing } from '../util/sanitize.ts';\nimport type { AllConfig, RenovateConfig } from './types.ts';\n\nconst namePattern = '[A-Za-z][A-Za-z0-9_]*';\nconst nameRegex = regEx(`^${namePattern}$`);\nconst secretTemplateRegex = regEx(`{{ *secrets\\\\.(${namePattern}) *}}`, 'g');\nconst variableTemplateRegex = regEx(\n `{{ *variables\\\\.(${namePattern}) *}}`,\n 'g',\n);\n\nexport const options: Record<'secrets' | 'variables', InterpolatorOptions> = {\n secrets: {\n name: 'secrets',\n nameRegex,\n templateRegex: secretTemplateRegex,\n },\n variables: {\n name: 'variables',\n nameRegex,\n templateRegex: variableTemplateRegex,\n },\n};\n\nfunction validateNestedInterpolatedValues<T extends 'secrets' | 'variables'>(\n config: AllConfig,\n key: T,\n): void {\n validateInterpolatedValues(config[key], options[key]);\n if (config.repositories) {\n for (const repository of config.repositories) {\n if (isPlainObject(repository)) {\n validateInterpolatedValues(repository[key], options[key]);\n }\n }\n }\n}\n\nexport function validateConfigSecretsAndVariables(\n config: RenovateConfig,\n): void {\n validateNestedInterpolatedValues(config, 'secrets');\n validateNestedInterpolatedValues(config, 'variables');\n}\n\ninterface ApplySecretsAndVariablesConfig {\n config: RenovateConfig;\n secrets?: RenovateConfig['secrets'];\n variables?: RenovateConfig['variables'];\n deleteSecrets?: boolean;\n deleteVariables?: boolean;\n}\n\n/**\n * Applies both variables and secrets to the Renovate config by interpolating values\n */\nexport function applySecretsAndVariablesToConfig(\n applyConfig: ApplySecretsAndVariablesConfig,\n): RenovateConfig {\n const { config, deleteSecrets, deleteVariables } = applyConfig;\n const secrets = applyConfig.secrets ?? config.secrets;\n const variables = applyConfig.variables ?? config.variables;\n\n // Add all secrets to be sanitized\n if (isPlainObject(secrets)) {\n for (const secret of Object.values(secrets)) {\n addSecretForSanitizing(secret);\n }\n }\n\n const configWithVars = replaceInterpolatedValuesInObject(\n config,\n variables ?? {},\n options.variables,\n deleteVariables,\n );\n\n return replaceInterpolatedValuesInObject(\n configWithVars,\n secrets ?? {},\n options.secrets,\n deleteSecrets,\n );\n}\n"],"mappings":";;;;;AAUA,MAAM,cAAc;AACpB,MAAM,YAAY,MAAM,IAAI,YAAY,EAAE;AAC1C,MAAM,sBAAsB,MAAM,kBAAkB,YAAY,QAAQ,GAAG;AAC3E,MAAM,wBAAwB,MAC5B,oBAAoB,YAAY,QAChC,GACF;AAEA,MAAa,UAAgE;CAC3E,SAAS;EACP,MAAM;EACN;EACA,eAAe;CACjB;CACA,WAAW;EACT,MAAM;EACN;EACA,eAAe;CACjB;AACF;AAEA,SAAS,iCACP,QACA,KACM;CACN,2BAA2B,OAAO,MAAM,QAAQ,IAAI;CACpD,IAAI,OAAO,cACJ;OAAA,MAAM,cAAc,OAAO,cAC9B,IAAI,cAAc,UAAU,GAC1B,2BAA2B,WAAW,MAAM,QAAQ,IAAI;CAAA;AAIhE;AAEA,SAAgB,kCACd,QACM;CACN,iCAAiC,QAAQ,SAAS;CAClD,iCAAiC,QAAQ,WAAW;AACtD;;;;AAaA,SAAgB,iCACd,aACgB;CAChB,MAAM,EAAE,QAAQ,eAAe,oBAAoB;CACnD,MAAM,UAAU,YAAY,WAAW,OAAO;CAC9C,MAAM,YAAY,YAAY,aAAa,OAAO;CAGlD,IAAI,cAAc,OAAO,GACvB,KAAK,MAAM,UAAU,OAAO,OAAO,OAAO,GACxC,uBAAuB,MAAM;CAIjC,MAAM,iBAAiB,kCACrB,QACA,aAAa,CAAC,GACd,QAAQ,WACR,eACF;CAEA,OAAO,kCACL,gBACA,WAAW,CAAC,GACZ,QAAQ,SACR,aACF;AACF"}
@@ -354,9 +354,7 @@ async function validateConfig(configType, config, isPreset, parentPath) {
354
354
  case "regex":
355
355
  validateRegexManagerFields(customManager, currentPath, errors);
356
356
  break;
357
- case "jsonata":
358
- validateJSONataManagerFields(customManager, currentPath, errors);
359
- break;
357
+ case "jsonata": validateJSONataManagerFields(customManager, currentPath, errors);
360
358
  }
361
359
  else errors.push({
362
360
  topic: "Configuration Error",
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","names":["regexOrGlobValidator.check","matchBaseBranchesValidator.check"],"sources":["../../lib/config/validation.ts"],"sourcesContent":["import is, {\n isArray,\n isEmptyString,\n isNonEmptyArray,\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isObject,\n isPlainObject,\n isString,\n isUndefined,\n} from '@sindresorhus/is';\nimport type { PlatformId } from '../constants/index.ts';\nimport { instrument } from '../instrumentation/index.ts';\nimport { logger } from '../logger/index.ts';\nimport {\n AllManagersListLiteral,\n CustomManagersListLiteral,\n} from '../manager-list.generated.ts';\nimport { isCustomManager } from '../modules/manager/custom/index.ts';\nimport type { CustomManager } from '../modules/manager/custom/types.ts';\nimport type { HostRule } from '../types/index.ts';\nimport { packageCacheNamespaces } from '../util/cache/package/namespaces.ts';\nimport { getToolConfig } from '../util/exec/containerbase.ts';\nimport { isConstraintName, isToolName } from '../util/exec/types.ts';\nimport { isValidCommitTrailer } from '../util/git/commit-trailers.ts';\nimport { getExpression } from '../util/jsonata.ts';\nimport { regEx } from '../util/regex.ts';\nimport {\n anyMatchRegexOrGlobList,\n getRegexPredicate,\n isRegexMatch,\n matchRegexOrGlobList,\n} from '../util/string-match.ts';\nimport * as template from '../util/template/index.ts';\nimport { parseUrl } from '../util/url.ts';\nimport {\n AllVersioningsListLiteral,\n type VersioningName,\n} from '../versioning-list.generated.ts';\nimport {\n hasValidSchedule,\n hasValidTimezone,\n} from '../workers/repository/update/branch/schedule.ts';\nimport { getConfigFileNames } from './app-strings.ts';\nimport { GlobalConfig } from './global.ts';\nimport { migrateConfig } from './migration.ts';\nimport { getOptions } from './options/index.ts';\nimport { resolveConfigPresets } from './presets/index.ts';\nimport { supportedDatasources } from './presets/internal/merge-confidence.preset.ts';\nimport { parsePreset } from './presets/parse.ts';\nimport type {\n AllConfig,\n AllowedParents,\n RenovateOptions,\n StatusCheckKey,\n ValidationMessage,\n ValidationResult,\n} from './types.ts';\nimport { allowedStatusCheckStrings } from './types.ts';\nimport * as matchBaseBranchesValidator from './validation-helpers/match-base-branches.ts';\nimport * as regexOrGlobValidator from './validation-helpers/regex-glob-matchers.ts';\nimport {\n getParentName,\n isFalseGlobal,\n validateJSONataManagerFields,\n validateNumber,\n validatePlainObject,\n validateRegexManagerFields,\n} from './validation-helpers/utils.ts';\n\nconst options = getOptions();\n\nlet optionsInitialized = false;\nlet optionTypes: Record<string, RenovateOptions['type']>;\nlet optionParents: Record<string, AllowedParents[]>;\nlet optionGlobals: Set<string>;\nlet optionInherits: Set<string>;\nlet optionRegexOrGlob: Set<string>;\nlet optionAllowsNegativeIntegers: Set<string>;\nlet optionSupportsTemplating: Set<string>;\n\nconst managerList: readonly string[] = AllManagersListLiteral;\n\nconst allManagersList: readonly string[] = [\n ...AllManagersListLiteral,\n ...CustomManagersListLiteral,\n];\n\nconst topLevelObjects = [...managerList, 'env'];\n\nconst ignoredNodes = [\n '$schema',\n 'headers',\n 'depType',\n 'npmToken',\n 'packageFile',\n 'forkToken',\n 'repository',\n 'vulnerabilityAlertsOnly',\n 'vulnerabilityAlert',\n 'isVulnerabilityAlert',\n 'vulnerabilityFixVersion', // not intended to be used by end users but may be by Mend apps\n 'copyLocalLibs', // deprecated - functionality is now enabled by default\n 'prBody', // deprecated\n 'minimumConfidence', // undocumented feature flag\n];\nconst tzRe = regEx(/^:timezone\\((.+)\\)$/);\nconst rulesRe = regEx(/p.*Rules\\[\\d+\\]$/);\nconst repoEntryRe = regEx(/^repositories\\[\\d+\\]$/);\n\nfunction isIgnored(key: string): boolean {\n return ignoredNodes.includes(key);\n}\n\nfunction getUnsupportedEnabledManagers(enabledManagers: string[]): string[] {\n return enabledManagers.filter(\n (manager) => !allManagersList.includes(manager.replace('custom.', '')),\n );\n}\n\nfunction getDeprecationMessage(option: string): string | undefined {\n const deprecatedOptions: Record<string, string | undefined> = {\n branchName: `Direct editing of branchName is now deprecated. Please edit branchPrefix, additionalBranchPrefix, or branchTopic instead`,\n commitMessage: `Direct editing of commitMessage is now deprecated. Please edit commitMessage's subcomponents instead.`,\n prTitle: `Direct editing of prTitle is now deprecated. Please edit commitMessage subcomponents instead as they will be passed through to prTitle.`,\n };\n if (deprecatedOptions[option]) {\n return deprecatedOptions[option];\n }\n\n const found = options.find((o) => o.name === option);\n if (!found) {\n return undefined;\n }\n\n if (!found.deprecationMsg) {\n return undefined;\n }\n\n return `The '${option}' option is deprecated: ${found.deprecationMsg}`;\n}\n\nfunction isInhertConfigOption(key: string): boolean {\n return optionInherits.has(key);\n}\n\nfunction isRegexOrGlobOption(key: string): boolean {\n return optionRegexOrGlob.has(key);\n}\n\nfunction isGlobalOption(key: string): boolean {\n return optionGlobals.has(key);\n}\n\nfunction initOptions(): void {\n if (optionsInitialized) {\n return;\n }\n\n optionParents = {};\n optionInherits = new Set();\n optionTypes = {};\n optionRegexOrGlob = new Set();\n optionGlobals = new Set();\n optionAllowsNegativeIntegers = new Set();\n optionSupportsTemplating = new Set();\n\n for (const option of options) {\n optionTypes[option.name] = option.type;\n\n if (option.parents) {\n optionParents[option.name] = option.parents;\n }\n\n if (option.inheritConfigSupport) {\n optionInherits.add(option.name);\n }\n\n if (option.patternMatch) {\n optionRegexOrGlob.add(option.name);\n }\n\n if (option.globalOnly) {\n optionGlobals.add(option.name);\n }\n\n if (option.allowNegative) {\n optionAllowsNegativeIntegers.add(option.name);\n }\n\n if (option.supportsTemplating) {\n optionSupportsTemplating.add(option.name);\n }\n }\n\n optionsInitialized = true;\n}\n\nexport async function validateConfig(\n configType: 'global' | 'inherit' | 'repo',\n config: AllConfig,\n isPreset?: boolean,\n parentPath?: string,\n): Promise<ValidationResult> {\n return instrument(\n `validateConfig(${configType}, ${JSON.stringify(parentPath)})`,\n async () => {\n initOptions();\n\n let errors: ValidationMessage[] = [];\n let warnings: ValidationMessage[] = [];\n\n for (const [key, val] of Object.entries(config)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n /* v8 ignore next 7 -- TODO: add test */\n if (key === '__proto__') {\n errors.push({\n topic: 'Config security error',\n message: '__proto__',\n });\n continue;\n }\n if (\n parentPath &&\n parentPath !== 'onboardingConfig' &&\n !repoEntryRe.test(parentPath) &&\n topLevelObjects.includes(key)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `The \"${key}\" object can only be configured at the top level of a config but was found inside \"${parentPath}\"`,\n });\n }\n\n if (isGlobalOption(key)) {\n if (configType === 'global') {\n await validateGlobalConfig(\n key,\n val,\n optionTypes[key],\n warnings,\n errors,\n currentPath,\n config,\n );\n continue;\n } else if (\n !isFalseGlobal(key, parentPath) &&\n !(configType === 'inherit' && isInhertConfigOption(key))\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `The \"${key}\" option is a global option reserved only for Renovate's global configuration and cannot be configured within a repository's config file.`,\n });\n continue;\n }\n }\n if (key === 'enabledManagers' && val) {\n const unsupportedManagers = getUnsupportedEnabledManagers(\n val as string[],\n );\n if (isNonEmptyArray(unsupportedManagers)) {\n errors.push({\n topic: 'Configuration Error',\n message: `The following managers configured in enabledManagers are not supported: \"${unsupportedManagers.join(\n ', ',\n )}\"`,\n });\n }\n }\n if (key === 'registryUrls' && !parentPath && isNonEmptyArray(val)) {\n warnings.push({\n topic: 'Configuration Warning',\n message:\n 'Setting `registryUrls` at the top level of your config will apply it to all managers and datasources, which can cause the wrong registry URL to be used for some packages. Use `registryUrls` inside `packageRules` to target specific managers or packages.',\n });\n }\n if (\n key === 'defaultRegistryUrls' &&\n !parentPath &&\n isNonEmptyArray(val)\n ) {\n warnings.push({\n topic: 'Configuration Warning',\n message:\n 'Setting `defaultRegistryUrls` at the top level of your config will apply it to all managers and datasources, which can cause the wrong registry URL to be used for some packages. Use `defaultRegistryUrls` inside `packageRules` to target specific managers or packages.',\n });\n }\n if (\n !isIgnored(key) && // We need to ignore some reserved keys\n !(is as any).function(val) // Ignore all functions\n ) {\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: 'Deprecation Warning',\n message: getDeprecationMessage(key)!,\n });\n }\n if (optionSupportsTemplating.has(key) && val) {\n try {\n // TODO: types (#22198)\n template.validate((val as string).toString());\n } catch {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid template in config path: ${currentPath}`,\n });\n }\n }\n const parentName =\n parentPath && repoEntryRe.test(parentPath)\n ? '.'\n : getParentName(parentPath);\n if (\n !isPreset &&\n optionParents[key] &&\n !optionParents[key].includes(parentName as AllowedParents)\n ) {\n // TODO: types (#22198)\n const options = optionParents[key]?.toSorted().join(', ');\n const message = `\"${key}\" can't be used in \"${parentName}\". Allowed objects: ${options}.`;\n warnings.push({\n topic: `${parentPath ? `${parentPath}.` : ''}${key}`,\n message,\n });\n }\n\n // v8 ignore else -- intentionally unhandled - if we knew what was to be covered here, we'd add validation\n if (!optionTypes[key]) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid configuration option: ${currentPath}`,\n });\n } else if (key === 'schedule') {\n const [validSchedule, errorMessage] = hasValidSchedule(\n val as string[],\n );\n if (!validSchedule) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid ${currentPath}: \\`${errorMessage}\\``,\n });\n }\n } else if (\n [\n 'allowedVersions',\n 'matchCurrentVersion',\n 'matchCurrentValue',\n 'matchNewValue',\n ].includes(key) &&\n isRegexMatch(val)\n ) {\n if (!getRegexPredicate(val)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${val}\\``,\n });\n }\n } else if (key === 'timezone' && val !== null) {\n const [validTimezone, errorMessage] = hasValidTimezone(\n val as string,\n );\n if (!validTimezone) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n } else if (val !== null) {\n const type = optionTypes[key];\n if (type === 'boolean') {\n if (val !== true && val !== false) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be boolean. Found: ${JSON.stringify(\n val,\n )} (${typeof val})`,\n });\n }\n } else if (type === 'integer') {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n errors.push(\n ...validateNumber(key, val, allowsNegative, currentPath),\n );\n } else if (type === 'array' && val) {\n if (isArray(val)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n configType,\n subval,\n isPreset,\n `${currentPath}[${subIndex}]`,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n }\n if (isRegexOrGlobOption(key)) {\n errors.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath,\n }),\n );\n }\n if (key === 'extends') {\n for (const subval of val) {\n if (isString(subval)) {\n if (\n configType !== 'global' &&\n subval.startsWith('global:')\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: you cannot extend from \"global:\" presets in a repository config's \"extends\"`,\n });\n }\n\n if (\n parentName === 'packageRules' &&\n subval.startsWith('group:')\n ) {\n warnings.push({\n topic: 'Configuration Warning',\n message: `${currentPath}: you should not extend \"group:\" presets`,\n });\n }\n if (tzRe.test(subval)) {\n const [, timezone] = tzRe.exec(subval)!;\n const [validTimezone, errorMessage] =\n hasValidTimezone(timezone);\n if (!validTimezone) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n }\n if (!subval.includes('{{')) {\n try {\n parsePreset(subval);\n } catch {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: preset \"${subval}\" is not valid`,\n });\n }\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: preset value is not a string`,\n });\n }\n }\n }\n\n if (key === 'commitTrailers') {\n for (const subval of val) {\n if (!isValidCommitTrailer(subval)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid commit trailer: \\`${JSON.stringify(\n subval,\n )}\\`. Must be a single-line string in the form \\`Key: value\\`, where the key contains only letters, digits and \\`-\\`.`,\n });\n }\n }\n }\n\n const selectors = [\n 'matchFileNames',\n 'matchLanguages',\n 'matchCategories',\n 'matchBaseBranches',\n 'matchManagers',\n 'matchDatasources',\n 'matchDepTypes',\n 'matchDepNames',\n 'matchPackageNames',\n 'matchCurrentValue',\n 'matchCurrentVersion',\n 'matchSourceUrls',\n 'matchRegistryUrls',\n 'matchUpdateTypes',\n 'matchConfidence',\n 'matchCurrentAge',\n 'matchRepositories',\n 'matchNewValue',\n 'matchJsonata',\n ];\n if (key === 'packageRules') {\n for (const [subIndex, packageRule] of val.entries()) {\n if (isObject(packageRule)) {\n const { config: resolved } = await resolveConfigPresets(\n packageRule,\n config,\n );\n const resolvedRule = migrateConfig({\n packageRules: [resolved],\n }).migratedConfig.packageRules![0];\n warnings.push(\n ...matchBaseBranchesValidator.check({\n resolvedRule,\n currentPath: `${currentPath}[${subIndex}]`,\n baseBranchPatterns: config.baseBranchPatterns!,\n }),\n );\n const selectorLength = Object.keys(resolvedRule).filter(\n (ruleKey) => selectors.includes(ruleKey),\n ).length;\n if (!selectorLength) {\n const message = `${currentPath}[${subIndex}]: Each packageRule must contain at least one match* or exclude* selector. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: 'Configuration Error',\n message,\n });\n }\n if (selectorLength === Object.keys(resolvedRule).length) {\n const message = `${currentPath}[${subIndex}]: Each packageRule must contain at least one non-match* or non-exclude* field. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n warnings.push({\n topic: 'Configuration Error',\n message,\n });\n }\n // It's too late to apply any of these options once you already have updates determined\n const preLookupOptions = [\n 'allowedVersions',\n 'extractVersion',\n 'followTag',\n 'ignoreDeps',\n 'ignoreUnstable',\n 'rangeStrategy',\n 'registryUrls',\n 'respectLatest',\n 'rollbackPrs',\n 'separateMajorMinor',\n 'separateMinorPatch',\n 'separateMultipleMajor',\n 'separateMultipleMinor',\n 'versioning',\n ] as const;\n if (isNonEmptyArray(resolvedRule.matchUpdateTypes)) {\n for (const option of preLookupOptions) {\n if (resolvedRule[option] !== undefined) {\n const message = `${currentPath}[${subIndex}]: packageRules cannot combine both matchUpdateTypes and ${option}. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: 'Configuration Error',\n message,\n });\n }\n }\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath} must contain JSON objects`,\n });\n }\n }\n }\n if (key === 'customManagers') {\n const allowedKeys = [\n 'customType',\n 'description',\n 'fileFormat',\n 'managerFilePatterns',\n 'matchStrings',\n 'matchStringsStrategy',\n 'depNameTemplate',\n 'packageNameTemplate',\n 'datasourceTemplate',\n 'versioningTemplate',\n 'registryUrlTemplate',\n 'currentValueTemplate',\n 'extractVersionTemplate',\n 'autoReplaceStringTemplate',\n 'depTypeTemplate',\n ];\n for (const customManager of val as CustomManager[]) {\n if (\n Object.keys(customManager).some(\n (k) => !allowedKeys.includes(k),\n )\n ) {\n const disallowedKeys = Object.keys(customManager).filter(\n (k) => !allowedKeys.includes(k),\n );\n errors.push({\n topic: 'Configuration Error',\n message: `Custom Manager contains disallowed fields: ${disallowedKeys.join(\n ', ',\n )}`,\n });\n } else if (\n isNonEmptyString(customManager.customType) &&\n isCustomManager(customManager.customType)\n ) {\n if (isNonEmptyArray(customManager.managerFilePatterns)) {\n switch (customManager.customType) {\n case 'regex':\n validateRegexManagerFields(\n customManager,\n currentPath,\n errors,\n );\n break;\n case 'jsonata':\n validateJSONataManagerFields(\n customManager,\n currentPath,\n errors,\n );\n break;\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Each Custom Manager must contain a non-empty managerFilePatterns array`,\n });\n }\n } else {\n if (\n isEmptyString(customManager.customType) ||\n isUndefined(customManager.customType)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Each Custom Manager must contain a non-empty customType string`,\n });\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid customType: ${customManager.customType}. Key is not a custom manager`,\n });\n }\n }\n }\n }\n if (['matchPackageNames', 'matchDepNames'].includes(key)) {\n const startPattern = regEx(/!?\\//);\n const endPattern = regEx(/\\/g?i?$/);\n for (const pattern of val as string[]) {\n if (\n startPattern.test(pattern) &&\n endPattern.test(pattern)\n ) {\n try {\n // regEx isn't aware of our !/ prefix but can handle the suffix\n regEx(pattern.replace(startPattern, '/'));\n } catch {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${pattern}\\``,\n });\n }\n }\n }\n }\n if (key === 'baseBranchPatterns') {\n for (const baseBranchPattern of val as string[]) {\n if (\n isRegexMatch(baseBranchPattern) &&\n !getRegexPredicate(baseBranchPattern)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${baseBranchPattern}\\``,\n });\n }\n }\n }\n if (\n (selectors.includes(key) ||\n key === 'matchCurrentVersion' ||\n key === 'matchCurrentValue') &&\n // TODO: can be undefined ? #22198\n !rulesRe.test(parentPath!) && // Inside a packageRule\n (isString(parentPath) || !isPreset) // top level in a preset\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: ${key} should be inside a \\`packageRule\\` only`,\n });\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a list (Array)`,\n });\n }\n } else if (type === 'string') {\n if (!isString(val)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a string`,\n });\n }\n } else if (type === 'object') {\n if (isPlainObject(val)) {\n if (key === 'registryAliases') {\n const res = validatePlainObject(val);\n if (res !== true) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${key}.${res}\\` configuration: value is not a string`,\n });\n }\n } else if (key === 'env') {\n const allowedEnvVars =\n configType === 'global'\n ? (config.allowedEnv ?? [])\n : GlobalConfig.get('allowedEnv');\n for (const [envVarName, envVarValue] of Object.entries(val)) {\n if (!isString(envVarValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid env variable value: \\`${currentPath}.${envVarName}\\` must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(envVarName, allowedEnvVars)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Env variable name \\`${envVarName}\\` is not allowed by this bot's \\`allowedEnv\\`.`,\n });\n }\n }\n } else if (key === 'statusCheckNames') {\n for (const [\n statusCheckKey,\n statusCheckValue,\n ] of Object.entries(val)) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${key}.${statusCheckKey}\\` configuration: key is not allowed.`,\n });\n }\n if (\n !(isString(statusCheckValue) || null === statusCheckValue)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: status check is not a string.`,\n });\n continue;\n }\n }\n } else if (key === 'statusCheckWhen') {\n const allowedWhenValues = ['always', 'never', 'failed'];\n for (const [\n statusCheckKey,\n statusCheckValue,\n ] of Object.entries(val)) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${key}.${statusCheckKey}\\` configuration: key is not allowed.`,\n });\n }\n if (\n !isString(statusCheckValue) ||\n !allowedWhenValues.includes(statusCheckValue)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: value must be one of \"always\", \"never\", or \"failed\".`,\n });\n continue;\n }\n }\n } else if (key === 'customDatasources') {\n const allowedKeys = [\n 'description',\n 'defaultRegistryUrlTemplate',\n 'format',\n 'transformTemplates',\n ];\n for (const [\n customDatasourceName,\n customDatasourceValue,\n ] of Object.entries(val)) {\n if (!isPlainObject(customDatasourceValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${customDatasourceName}\\` configuration: customDatasource is not an object`,\n });\n continue;\n }\n for (const [subKey, subValue] of Object.entries(\n customDatasourceValue,\n )) {\n if (!allowedKeys.includes(subKey)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: key is not allowed`,\n });\n } else if (subKey === 'transformTemplates') {\n if (!isArray(subValue, isString)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is not an array of string`,\n });\n }\n } else if (subKey === 'description') {\n if (\n !(isString(subValue) || isArray(subValue, isString))\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is not an array of strings`,\n });\n }\n } else if (!isString(subValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is a string`,\n });\n }\n }\n }\n } else if (key === 'installTools') {\n for (const toolName of Object.keys(val)) {\n if (!isToolName(toolName)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${toolName}\\` configuration: not a valid tool name.`,\n });\n }\n }\n } else if (key === 'constraints') {\n const { get: getVersioning } =\n await import('../modules/versioning/index.ts');\n for (const [k, v] of Object.entries(val)) {\n if (!isString(v)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\` should be an object of key-value pairs of constraints and their value`,\n });\n break;\n }\n\n if (!isConstraintName(k)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\`: \\`${k}\\` is not a supported constraint name`,\n });\n } else if (isToolName(k)) {\n // TODO: #31831\n const versioningId = getToolConfig(k).versioning;\n const versioning = getVersioning(versioningId);\n if (!versioning.isValid(v)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}=${v}\\` is not a valid tool version constraint, according to \\`${versioningId}\\` versioning`,\n });\n }\n }\n }\n } else if (key === 'constraintsVersioning') {\n for (const [k, v] of Object.entries(val)) {\n if (!isString(v)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\` should be an object of key-value pairs of additional constraint names and their versioning`,\n });\n break;\n }\n\n if (isToolName(k)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\` is not a valid additional constraint name, as \\`${k}\\` is a tool name, and \\`constraintsVersioning\\` can only override the versioning for a non-tool constraint`,\n });\n } else if (isConstraintName(k)) {\n const versioningName = v.split(':')[0];\n if (\n !AllVersioningsListLiteral.includes(\n versioningName as VersioningName,\n )\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}=${v}\\`: \\`${v}\\` is not a valid versioning scheme`,\n });\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\`: \\`${k}\\` is not a known additional constraint name`,\n });\n }\n }\n } else {\n const ignoredObjects = options\n .filter((option) => option.freeChoice)\n .map((option) => option.name);\n if (!ignoredObjects.includes(key)) {\n const subValidation = await validateConfig(\n configType,\n val,\n isPreset,\n currentPath,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a json object`,\n });\n }\n } else {\n // v8 ignore next -- intentionally unhandled - if we knew what was to be covered here, we'd add validation\n logger.debug(\n {},\n `Unhandled validation for ${type} at \\`${currentPath}\\``,\n );\n }\n }\n }\n\n if (key === 'hostRules' && isArray(val)) {\n const allowedHeaders =\n configType === 'global'\n ? (config.allowedHeaders ?? [])\n : GlobalConfig.get('allowedHeaders');\n for (const rule of val as HostRule[]) {\n if (isNonEmptyString(rule.matchHost)) {\n if (\n rule.matchHost.includes('://') &&\n parseUrl(rule.matchHost) === null\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `hostRules matchHost \\`${rule.matchHost}\\` is not a valid URL.`,\n });\n }\n } else if (isEmptyString(rule.matchHost)) {\n errors.push({\n topic: 'Configuration Error',\n message:\n 'Invalid value for hostRules matchHost. It cannot be an empty string.',\n });\n }\n\n if (!rule.headers) {\n continue;\n }\n for (const [header, value] of Object.entries(rule.headers)) {\n if (!isString(value)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid hostRules headers value configuration: header must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(header, allowedHeaders)) {\n errors.push({\n topic: 'Configuration Error',\n message: `hostRules header \\`${header}\\` is not allowed by this bot's \\`allowedHeaders\\`.`,\n });\n }\n }\n }\n }\n\n if (key === 'matchJsonata' && isArray(val, isString)) {\n for (const expression of val) {\n const res = getExpression(expression);\n if (res instanceof Error) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid JSONata expression for ${currentPath}: ${res.message}`,\n });\n }\n }\n }\n }\n\n function sortAll(a: ValidationMessage, b: ValidationMessage): number {\n if (a.topic === b.topic) {\n return a.message > b.message ? 1 : -1;\n }\n return a.topic > b.topic ? 1 : -1;\n }\n\n errors.sort(sortAll);\n warnings.sort(sortAll);\n return { errors, warnings };\n },\n );\n}\n\n/**\n * Basic validation for global config options\n */\nasync function validateGlobalConfig(\n key: string,\n val: unknown,\n type: string,\n warnings: ValidationMessage[],\n errors: ValidationMessage[],\n currentPath: string | undefined,\n config: AllConfig,\n): Promise<void> {\n /* v8 ignore next 5 -- not testable yet */\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: 'Deprecation Warning',\n message: getDeprecationMessage(key)!,\n });\n }\n\n if (key === 'binarySource' && val === 'docker') {\n warnings.push({\n topic: 'Deprecation Warning',\n message:\n 'Usage of `binarySource=docker` is deprecated, and will be removed in the future. Please migrate to `binarySource=install`. Feedback on the usage of `binarySource=docker` is welcome at https://github.com/renovatebot/renovate/discussions/40742',\n });\n }\n\n if (val !== null) {\n // v8 ignore else -- TODO: add test #40625\n if (type === 'string') {\n if (isString(val)) {\n if (\n key === 'onboardingConfigFileName' &&\n !getPossibleConfigFileNames({\n configFileNames: config.configFileNames,\n platform: config.platform,\n }).includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${getPossibleConfigFileNames(\n {\n configFileNames: config.configFileNames,\n platform: config.platform,\n },\n ).join(', ')}.`,\n });\n } else if (\n key === 'repositoryCache' &&\n !['enabled', 'disabled', 'reset'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['enabled', 'disabled', 'reset'].join(', ')}.`,\n });\n } else if (\n key === 'dryRun' &&\n !['extract', 'lookup', 'full'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['extract', 'lookup', 'full'].join(', ')}.`,\n });\n } else if (\n key === 'binarySource' &&\n !['docker', 'global', 'install', 'hermit'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['docker', 'global', 'install', 'hermit'].join(', ')}.`,\n });\n } else if (\n key === 'requireConfig' &&\n !['required', 'optional', 'ignored'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['required', 'optional', 'ignored'].join(', ')}.`,\n });\n } else if (\n key === 'gitUrl' &&\n !['default', 'ssh', 'endpoint'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['default', 'ssh', 'endpoint'].join(', ')}.`,\n });\n }\n\n if (\n key === 'reportType' &&\n ['s3', 'file'].includes(val) &&\n !isString(config.reportPath)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `reportType '${val}' requires a configured reportPath`,\n });\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a string.`,\n });\n }\n } else if (type === 'integer') {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n warnings.push(...validateNumber(key, val, allowsNegative, currentPath));\n } else if (type === 'boolean') {\n if (val !== true && val !== false) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a boolean. Found: ${JSON.stringify(\n val,\n )} (${typeof val}).`,\n });\n }\n } else if (type === 'array') {\n if (isArray(val) && key !== 'repositories') {\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n 'global',\n subval,\n false,\n `${currentPath}[${subIndex}]`,\n );\n warnings.push(...subValidation.warnings);\n errors.push(...subValidation.errors);\n }\n }\n\n if (isRegexOrGlobOption(key)) {\n warnings.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath: currentPath!,\n }),\n );\n }\n if (key === 'gitNoVerify') {\n const allowedValues = ['commit', 'push'];\n for (const value of val as string[]) {\n // v8 ignore else -- TODO: add test #40625\n if (!allowedValues.includes(value)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value for \\`${currentPath}\\`. The allowed values are ${allowedValues.join(', ')}.`,\n });\n }\n }\n }\n if (key === 'mergeConfidenceDatasources') {\n const allowedValues = supportedDatasources;\n for (const value of val as string[]) {\n // v8 ignore else -- TODO: add test #40625\n if (!allowedValues.includes(value)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${value}\\` for \\`${currentPath}\\`. The allowed values are ${allowedValues.join(', ')}.`,\n });\n }\n }\n }\n } else if (isArray(val)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isPlainObject(subval)) {\n if (!isNonEmptyString(subval.repository)) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}[${subIndex}]: each repository object entry must have a \\`repository\\` string property`,\n });\n }\n const { repository: _, ...repoEntryConfig } = subval;\n // Each repository object entry is validated as its own global config, so it does not automatically see the top-level `allowedEnv`/`allowedHeaders`.\n // Inherit them (unless the entry sets its own) so that entry-level `env`/`headers` are validated against the allowlists, rather than an empty one.\n const subValidation = await validateConfig(\n 'global',\n {\n ...(config.allowedEnv ? { allowedEnv: config.allowedEnv } : {}),\n ...(config.allowedHeaders\n ? { allowedHeaders: config.allowedHeaders }\n : {}),\n ...repoEntryConfig,\n },\n false,\n `${currentPath}[${subIndex}]`,\n );\n warnings.push(...subValidation.warnings);\n errors.push(...subValidation.errors);\n } else if (isString(subval)) {\n if (!isNonEmptyStringAndNotWhitespace(subval)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `${currentPath}[${subIndex}]: each repository string entry entry must be a non-empty string`,\n });\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `${currentPath}[${subIndex}]: invalid type, should be either a string or an object`,\n });\n }\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a list (Array).`,\n });\n }\n } else if (type === 'object') {\n if (isPlainObject(val)) {\n if (key === 'onboardingConfig') {\n const subValidation = await validateConfig('repo', val);\n for (const warning of subValidation.warnings.concat(\n subValidation.errors,\n )) {\n warnings.push(warning);\n }\n } else if (key === 'force') {\n const subValidation = await validateConfig('global', val);\n for (const warning of subValidation.warnings.concat(\n subValidation.errors,\n )) {\n warnings.push(warning);\n }\n } else if (key === 'cacheTtlOverride') {\n for (const [subKey, subValue] of Object.entries(val)) {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n warnings.push(\n ...validateNumber(\n key,\n subValue,\n allowsNegative,\n currentPath,\n subKey,\n ),\n );\n\n if (\n !(packageCacheNamespaces as readonly string[]).includes(subKey) &&\n !anyMatchRegexOrGlobList(\n packageCacheNamespaces as unknown as string[],\n [subKey],\n )\n ) {\n errors.push({\n message: `${currentPath}: namespace \\`${subKey}\\` does not exist`,\n topic: 'Configuration Error',\n });\n }\n }\n } else {\n const res = validatePlainObject(val);\n if (res !== true) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${res}\\` configuration: value must be a string.`,\n });\n }\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a JSON object.`,\n });\n }\n }\n }\n}\n\nfunction getPossibleConfigFileNames({\n configFileNames,\n platform,\n}: {\n configFileNames?: string[];\n platform?: PlatformId;\n}): string[] {\n const filenames = getConfigFileNames(platform);\n if (isNonEmptyArray(configFileNames)) {\n return filenames.concat(configFileNames);\n }\n\n return filenames;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","names":["regexOrGlobValidator.check","matchBaseBranchesValidator.check"],"sources":["../../lib/config/validation.ts"],"sourcesContent":["import is, {\n isArray,\n isEmptyString,\n isNonEmptyArray,\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isObject,\n isPlainObject,\n isString,\n isUndefined,\n} from '@sindresorhus/is';\nimport type { PlatformId } from '../constants/index.ts';\nimport { instrument } from '../instrumentation/index.ts';\nimport { logger } from '../logger/index.ts';\nimport {\n AllManagersListLiteral,\n CustomManagersListLiteral,\n} from '../manager-list.generated.ts';\nimport { isCustomManager } from '../modules/manager/custom/index.ts';\nimport type { CustomManager } from '../modules/manager/custom/types.ts';\nimport type { HostRule } from '../types/index.ts';\nimport { packageCacheNamespaces } from '../util/cache/package/namespaces.ts';\nimport { getToolConfig } from '../util/exec/containerbase.ts';\nimport { isConstraintName, isToolName } from '../util/exec/types.ts';\nimport { isValidCommitTrailer } from '../util/git/commit-trailers.ts';\nimport { getExpression } from '../util/jsonata.ts';\nimport { regEx } from '../util/regex.ts';\nimport {\n anyMatchRegexOrGlobList,\n getRegexPredicate,\n isRegexMatch,\n matchRegexOrGlobList,\n} from '../util/string-match.ts';\nimport * as template from '../util/template/index.ts';\nimport { parseUrl } from '../util/url.ts';\nimport {\n AllVersioningsListLiteral,\n type VersioningName,\n} from '../versioning-list.generated.ts';\nimport {\n hasValidSchedule,\n hasValidTimezone,\n} from '../workers/repository/update/branch/schedule.ts';\nimport { getConfigFileNames } from './app-strings.ts';\nimport { GlobalConfig } from './global.ts';\nimport { migrateConfig } from './migration.ts';\nimport { getOptions } from './options/index.ts';\nimport { resolveConfigPresets } from './presets/index.ts';\nimport { supportedDatasources } from './presets/internal/merge-confidence.preset.ts';\nimport { parsePreset } from './presets/parse.ts';\nimport type {\n AllConfig,\n AllowedParents,\n RenovateOptions,\n StatusCheckKey,\n ValidationMessage,\n ValidationResult,\n} from './types.ts';\nimport { allowedStatusCheckStrings } from './types.ts';\nimport * as matchBaseBranchesValidator from './validation-helpers/match-base-branches.ts';\nimport * as regexOrGlobValidator from './validation-helpers/regex-glob-matchers.ts';\nimport {\n getParentName,\n isFalseGlobal,\n validateJSONataManagerFields,\n validateNumber,\n validatePlainObject,\n validateRegexManagerFields,\n} from './validation-helpers/utils.ts';\n\nconst options = getOptions();\n\nlet optionsInitialized = false;\nlet optionTypes: Record<string, RenovateOptions['type']>;\nlet optionParents: Record<string, AllowedParents[]>;\nlet optionGlobals: Set<string>;\nlet optionInherits: Set<string>;\nlet optionRegexOrGlob: Set<string>;\nlet optionAllowsNegativeIntegers: Set<string>;\nlet optionSupportsTemplating: Set<string>;\n\nconst managerList: readonly string[] = AllManagersListLiteral;\n\nconst allManagersList: readonly string[] = [\n ...AllManagersListLiteral,\n ...CustomManagersListLiteral,\n];\n\nconst topLevelObjects = [...managerList, 'env'];\n\nconst ignoredNodes = [\n '$schema',\n 'headers',\n 'depType',\n 'npmToken',\n 'packageFile',\n 'forkToken',\n 'repository',\n 'vulnerabilityAlertsOnly',\n 'vulnerabilityAlert',\n 'isVulnerabilityAlert',\n 'vulnerabilityFixVersion', // not intended to be used by end users but may be by Mend apps\n 'copyLocalLibs', // deprecated - functionality is now enabled by default\n 'prBody', // deprecated\n 'minimumConfidence', // undocumented feature flag\n];\nconst tzRe = regEx(/^:timezone\\((.+)\\)$/);\nconst rulesRe = regEx(/p.*Rules\\[\\d+\\]$/);\nconst repoEntryRe = regEx(/^repositories\\[\\d+\\]$/);\n\nfunction isIgnored(key: string): boolean {\n return ignoredNodes.includes(key);\n}\n\nfunction getUnsupportedEnabledManagers(enabledManagers: string[]): string[] {\n return enabledManagers.filter(\n (manager) => !allManagersList.includes(manager.replace('custom.', '')),\n );\n}\n\nfunction getDeprecationMessage(option: string): string | undefined {\n const deprecatedOptions: Record<string, string | undefined> = {\n branchName: `Direct editing of branchName is now deprecated. Please edit branchPrefix, additionalBranchPrefix, or branchTopic instead`,\n commitMessage: `Direct editing of commitMessage is now deprecated. Please edit commitMessage's subcomponents instead.`,\n prTitle: `Direct editing of prTitle is now deprecated. Please edit commitMessage subcomponents instead as they will be passed through to prTitle.`,\n };\n if (deprecatedOptions[option]) {\n return deprecatedOptions[option];\n }\n\n const found = options.find((o) => o.name === option);\n if (!found) {\n return undefined;\n }\n\n if (!found.deprecationMsg) {\n return undefined;\n }\n\n return `The '${option}' option is deprecated: ${found.deprecationMsg}`;\n}\n\nfunction isInhertConfigOption(key: string): boolean {\n return optionInherits.has(key);\n}\n\nfunction isRegexOrGlobOption(key: string): boolean {\n return optionRegexOrGlob.has(key);\n}\n\nfunction isGlobalOption(key: string): boolean {\n return optionGlobals.has(key);\n}\n\nfunction initOptions(): void {\n if (optionsInitialized) {\n return;\n }\n\n optionParents = {};\n optionInherits = new Set();\n optionTypes = {};\n optionRegexOrGlob = new Set();\n optionGlobals = new Set();\n optionAllowsNegativeIntegers = new Set();\n optionSupportsTemplating = new Set();\n\n for (const option of options) {\n optionTypes[option.name] = option.type;\n\n if (option.parents) {\n optionParents[option.name] = option.parents;\n }\n\n if (option.inheritConfigSupport) {\n optionInherits.add(option.name);\n }\n\n if (option.patternMatch) {\n optionRegexOrGlob.add(option.name);\n }\n\n if (option.globalOnly) {\n optionGlobals.add(option.name);\n }\n\n if (option.allowNegative) {\n optionAllowsNegativeIntegers.add(option.name);\n }\n\n if (option.supportsTemplating) {\n optionSupportsTemplating.add(option.name);\n }\n }\n\n optionsInitialized = true;\n}\n\nexport async function validateConfig(\n configType: 'global' | 'inherit' | 'repo',\n config: AllConfig,\n isPreset?: boolean,\n parentPath?: string,\n): Promise<ValidationResult> {\n return instrument(\n `validateConfig(${configType}, ${JSON.stringify(parentPath)})`,\n async () => {\n initOptions();\n\n let errors: ValidationMessage[] = [];\n let warnings: ValidationMessage[] = [];\n\n for (const [key, val] of Object.entries(config)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n /* v8 ignore next 7 -- TODO: add test */\n if (key === '__proto__') {\n errors.push({\n topic: 'Config security error',\n message: '__proto__',\n });\n continue;\n }\n if (\n parentPath &&\n parentPath !== 'onboardingConfig' &&\n !repoEntryRe.test(parentPath) &&\n topLevelObjects.includes(key)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `The \"${key}\" object can only be configured at the top level of a config but was found inside \"${parentPath}\"`,\n });\n }\n\n if (isGlobalOption(key)) {\n if (configType === 'global') {\n await validateGlobalConfig(\n key,\n val,\n optionTypes[key],\n warnings,\n errors,\n currentPath,\n config,\n );\n continue;\n } else if (\n !isFalseGlobal(key, parentPath) &&\n !(configType === 'inherit' && isInhertConfigOption(key))\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `The \"${key}\" option is a global option reserved only for Renovate's global configuration and cannot be configured within a repository's config file.`,\n });\n continue;\n }\n }\n if (key === 'enabledManagers' && val) {\n const unsupportedManagers = getUnsupportedEnabledManagers(\n val as string[],\n );\n if (isNonEmptyArray(unsupportedManagers)) {\n errors.push({\n topic: 'Configuration Error',\n message: `The following managers configured in enabledManagers are not supported: \"${unsupportedManagers.join(\n ', ',\n )}\"`,\n });\n }\n }\n if (key === 'registryUrls' && !parentPath && isNonEmptyArray(val)) {\n warnings.push({\n topic: 'Configuration Warning',\n message:\n 'Setting `registryUrls` at the top level of your config will apply it to all managers and datasources, which can cause the wrong registry URL to be used for some packages. Use `registryUrls` inside `packageRules` to target specific managers or packages.',\n });\n }\n if (\n key === 'defaultRegistryUrls' &&\n !parentPath &&\n isNonEmptyArray(val)\n ) {\n warnings.push({\n topic: 'Configuration Warning',\n message:\n 'Setting `defaultRegistryUrls` at the top level of your config will apply it to all managers and datasources, which can cause the wrong registry URL to be used for some packages. Use `defaultRegistryUrls` inside `packageRules` to target specific managers or packages.',\n });\n }\n if (\n !isIgnored(key) && // We need to ignore some reserved keys\n !(is as any).function(val) // Ignore all functions\n ) {\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: 'Deprecation Warning',\n message: getDeprecationMessage(key)!,\n });\n }\n if (optionSupportsTemplating.has(key) && val) {\n try {\n // TODO: types (#22198)\n template.validate((val as string).toString());\n } catch {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid template in config path: ${currentPath}`,\n });\n }\n }\n const parentName =\n parentPath && repoEntryRe.test(parentPath)\n ? '.'\n : getParentName(parentPath);\n if (\n !isPreset &&\n optionParents[key] &&\n !optionParents[key].includes(parentName as AllowedParents)\n ) {\n // TODO: types (#22198)\n const options = optionParents[key]?.toSorted().join(', ');\n const message = `\"${key}\" can't be used in \"${parentName}\". Allowed objects: ${options}.`;\n warnings.push({\n topic: `${parentPath ? `${parentPath}.` : ''}${key}`,\n message,\n });\n }\n\n // v8 ignore else -- intentionally unhandled - if we knew what was to be covered here, we'd add validation\n if (!optionTypes[key]) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid configuration option: ${currentPath}`,\n });\n } else if (key === 'schedule') {\n const [validSchedule, errorMessage] = hasValidSchedule(\n val as string[],\n );\n if (!validSchedule) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid ${currentPath}: \\`${errorMessage}\\``,\n });\n }\n } else if (\n [\n 'allowedVersions',\n 'matchCurrentVersion',\n 'matchCurrentValue',\n 'matchNewValue',\n ].includes(key) &&\n isRegexMatch(val)\n ) {\n if (!getRegexPredicate(val)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${val}\\``,\n });\n }\n } else if (key === 'timezone' && val !== null) {\n const [validTimezone, errorMessage] = hasValidTimezone(\n val as string,\n );\n if (!validTimezone) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n } else if (val !== null) {\n const type = optionTypes[key];\n if (type === 'boolean') {\n if (val !== true && val !== false) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be boolean. Found: ${JSON.stringify(\n val,\n )} (${typeof val})`,\n });\n }\n } else if (type === 'integer') {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n errors.push(\n ...validateNumber(key, val, allowsNegative, currentPath),\n );\n } else if (type === 'array' && val) {\n if (isArray(val)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n configType,\n subval,\n isPreset,\n `${currentPath}[${subIndex}]`,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n }\n if (isRegexOrGlobOption(key)) {\n errors.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath,\n }),\n );\n }\n if (key === 'extends') {\n for (const subval of val) {\n if (isString(subval)) {\n if (\n configType !== 'global' &&\n subval.startsWith('global:')\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: you cannot extend from \"global:\" presets in a repository config's \"extends\"`,\n });\n }\n\n if (\n parentName === 'packageRules' &&\n subval.startsWith('group:')\n ) {\n warnings.push({\n topic: 'Configuration Warning',\n message: `${currentPath}: you should not extend \"group:\" presets`,\n });\n }\n if (tzRe.test(subval)) {\n const [, timezone] = tzRe.exec(subval)!;\n const [validTimezone, errorMessage] =\n hasValidTimezone(timezone);\n if (!validTimezone) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: ${errorMessage}`,\n });\n }\n }\n if (!subval.includes('{{')) {\n try {\n parsePreset(subval);\n } catch {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: preset \"${subval}\" is not valid`,\n });\n }\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: preset value is not a string`,\n });\n }\n }\n }\n\n if (key === 'commitTrailers') {\n for (const subval of val) {\n if (!isValidCommitTrailer(subval)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid commit trailer: \\`${JSON.stringify(\n subval,\n )}\\`. Must be a single-line string in the form \\`Key: value\\`, where the key contains only letters, digits and \\`-\\`.`,\n });\n }\n }\n }\n\n const selectors = [\n 'matchFileNames',\n 'matchLanguages',\n 'matchCategories',\n 'matchBaseBranches',\n 'matchManagers',\n 'matchDatasources',\n 'matchDepTypes',\n 'matchDepNames',\n 'matchPackageNames',\n 'matchCurrentValue',\n 'matchCurrentVersion',\n 'matchSourceUrls',\n 'matchRegistryUrls',\n 'matchUpdateTypes',\n 'matchConfidence',\n 'matchCurrentAge',\n 'matchRepositories',\n 'matchNewValue',\n 'matchJsonata',\n ];\n if (key === 'packageRules') {\n for (const [subIndex, packageRule] of val.entries()) {\n if (isObject(packageRule)) {\n const { config: resolved } = await resolveConfigPresets(\n packageRule,\n config,\n );\n const resolvedRule = migrateConfig({\n packageRules: [resolved],\n }).migratedConfig.packageRules![0];\n warnings.push(\n ...matchBaseBranchesValidator.check({\n resolvedRule,\n currentPath: `${currentPath}[${subIndex}]`,\n baseBranchPatterns: config.baseBranchPatterns!,\n }),\n );\n const selectorLength = Object.keys(resolvedRule).filter(\n (ruleKey) => selectors.includes(ruleKey),\n ).length;\n if (!selectorLength) {\n const message = `${currentPath}[${subIndex}]: Each packageRule must contain at least one match* or exclude* selector. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: 'Configuration Error',\n message,\n });\n }\n if (selectorLength === Object.keys(resolvedRule).length) {\n const message = `${currentPath}[${subIndex}]: Each packageRule must contain at least one non-match* or non-exclude* field. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n warnings.push({\n topic: 'Configuration Error',\n message,\n });\n }\n // It's too late to apply any of these options once you already have updates determined\n const preLookupOptions = [\n 'allowedVersions',\n 'extractVersion',\n 'followTag',\n 'ignoreDeps',\n 'ignoreUnstable',\n 'rangeStrategy',\n 'registryUrls',\n 'respectLatest',\n 'rollbackPrs',\n 'separateMajorMinor',\n 'separateMinorPatch',\n 'separateMultipleMajor',\n 'separateMultipleMinor',\n 'versioning',\n ] as const;\n if (isNonEmptyArray(resolvedRule.matchUpdateTypes)) {\n for (const option of preLookupOptions) {\n if (resolvedRule[option] !== undefined) {\n const message = `${currentPath}[${subIndex}]: packageRules cannot combine both matchUpdateTypes and ${option}. Rule: ${JSON.stringify(\n packageRule,\n )}`;\n errors.push({\n topic: 'Configuration Error',\n message,\n });\n }\n }\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath} must contain JSON objects`,\n });\n }\n }\n }\n if (key === 'customManagers') {\n const allowedKeys = [\n 'customType',\n 'description',\n 'fileFormat',\n 'managerFilePatterns',\n 'matchStrings',\n 'matchStringsStrategy',\n 'depNameTemplate',\n 'packageNameTemplate',\n 'datasourceTemplate',\n 'versioningTemplate',\n 'registryUrlTemplate',\n 'currentValueTemplate',\n 'extractVersionTemplate',\n 'autoReplaceStringTemplate',\n 'depTypeTemplate',\n ];\n for (const customManager of val as CustomManager[]) {\n if (\n Object.keys(customManager).some(\n (k) => !allowedKeys.includes(k),\n )\n ) {\n const disallowedKeys = Object.keys(customManager).filter(\n (k) => !allowedKeys.includes(k),\n );\n errors.push({\n topic: 'Configuration Error',\n message: `Custom Manager contains disallowed fields: ${disallowedKeys.join(\n ', ',\n )}`,\n });\n } else if (\n isNonEmptyString(customManager.customType) &&\n isCustomManager(customManager.customType)\n ) {\n if (isNonEmptyArray(customManager.managerFilePatterns)) {\n switch (customManager.customType) {\n case 'regex':\n validateRegexManagerFields(\n customManager,\n currentPath,\n errors,\n );\n break;\n case 'jsonata':\n validateJSONataManagerFields(\n customManager,\n currentPath,\n errors,\n );\n break;\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Each Custom Manager must contain a non-empty managerFilePatterns array`,\n });\n }\n } else {\n if (\n isEmptyString(customManager.customType) ||\n isUndefined(customManager.customType)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Each Custom Manager must contain a non-empty customType string`,\n });\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid customType: ${customManager.customType}. Key is not a custom manager`,\n });\n }\n }\n }\n }\n if (['matchPackageNames', 'matchDepNames'].includes(key)) {\n const startPattern = regEx(/!?\\//);\n const endPattern = regEx(/\\/g?i?$/);\n for (const pattern of val as string[]) {\n if (\n startPattern.test(pattern) &&\n endPattern.test(pattern)\n ) {\n try {\n // regEx isn't aware of our !/ prefix but can handle the suffix\n regEx(pattern.replace(startPattern, '/'));\n } catch {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${pattern}\\``,\n });\n }\n }\n }\n }\n if (key === 'baseBranchPatterns') {\n for (const baseBranchPattern of val as string[]) {\n if (\n isRegexMatch(baseBranchPattern) &&\n !getRegexPredicate(baseBranchPattern)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid regExp for ${currentPath}: \\`${baseBranchPattern}\\``,\n });\n }\n }\n }\n if (\n (selectors.includes(key) ||\n key === 'matchCurrentVersion' ||\n key === 'matchCurrentValue') &&\n // TODO: can be undefined ? #22198\n !rulesRe.test(parentPath!) && // Inside a packageRule\n (isString(parentPath) || !isPreset) // top level in a preset\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}: ${key} should be inside a \\`packageRule\\` only`,\n });\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a list (Array)`,\n });\n }\n } else if (type === 'string') {\n if (!isString(val)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a string`,\n });\n }\n } else if (type === 'object') {\n if (isPlainObject(val)) {\n if (key === 'registryAliases') {\n const res = validatePlainObject(val);\n if (res !== true) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${key}.${res}\\` configuration: value is not a string`,\n });\n }\n } else if (key === 'env') {\n const allowedEnvVars =\n configType === 'global'\n ? (config.allowedEnv ?? [])\n : GlobalConfig.get('allowedEnv');\n for (const [envVarName, envVarValue] of Object.entries(val)) {\n if (!isString(envVarValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid env variable value: \\`${currentPath}.${envVarName}\\` must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(envVarName, allowedEnvVars)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Env variable name \\`${envVarName}\\` is not allowed by this bot's \\`allowedEnv\\`.`,\n });\n }\n }\n } else if (key === 'statusCheckNames') {\n for (const [\n statusCheckKey,\n statusCheckValue,\n ] of Object.entries(val)) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${key}.${statusCheckKey}\\` configuration: key is not allowed.`,\n });\n }\n if (\n !(isString(statusCheckValue) || null === statusCheckValue)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: status check is not a string.`,\n });\n continue;\n }\n }\n } else if (key === 'statusCheckWhen') {\n const allowedWhenValues = ['always', 'never', 'failed'];\n for (const [\n statusCheckKey,\n statusCheckValue,\n ] of Object.entries(val)) {\n if (\n !allowedStatusCheckStrings.includes(\n statusCheckKey as StatusCheckKey,\n )\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${key}.${statusCheckKey}\\` configuration: key is not allowed.`,\n });\n }\n if (\n !isString(statusCheckValue) ||\n !allowedWhenValues.includes(statusCheckValue)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${statusCheckKey}\\` configuration: value must be one of \"always\", \"never\", or \"failed\".`,\n });\n continue;\n }\n }\n } else if (key === 'customDatasources') {\n const allowedKeys = [\n 'description',\n 'defaultRegistryUrlTemplate',\n 'format',\n 'transformTemplates',\n ];\n for (const [\n customDatasourceName,\n customDatasourceValue,\n ] of Object.entries(val)) {\n if (!isPlainObject(customDatasourceValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${customDatasourceName}\\` configuration: customDatasource is not an object`,\n });\n continue;\n }\n for (const [subKey, subValue] of Object.entries(\n customDatasourceValue,\n )) {\n if (!allowedKeys.includes(subKey)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: key is not allowed`,\n });\n } else if (subKey === 'transformTemplates') {\n if (!isArray(subValue, isString)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is not an array of string`,\n });\n }\n } else if (subKey === 'description') {\n if (\n !(isString(subValue) || isArray(subValue, isString))\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is not an array of strings`,\n });\n }\n } else if (!isString(subValue)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${subKey}\\` configuration: is a string`,\n });\n }\n }\n }\n } else if (key === 'installTools') {\n for (const toolName of Object.keys(val)) {\n if (!isToolName(toolName)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${toolName}\\` configuration: not a valid tool name.`,\n });\n }\n }\n } else if (key === 'constraints') {\n const { get: getVersioning } =\n await import('../modules/versioning/index.ts');\n for (const [k, v] of Object.entries(val)) {\n if (!isString(v)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\` should be an object of key-value pairs of constraints and their value`,\n });\n break;\n }\n\n if (!isConstraintName(k)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\`: \\`${k}\\` is not a supported constraint name`,\n });\n } else if (isToolName(k)) {\n // TODO: #31831\n const versioningId = getToolConfig(k).versioning;\n const versioning = getVersioning(versioningId);\n if (!versioning.isValid(v)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}=${v}\\` is not a valid tool version constraint, according to \\`${versioningId}\\` versioning`,\n });\n }\n }\n }\n } else if (key === 'constraintsVersioning') {\n for (const [k, v] of Object.entries(val)) {\n if (!isString(v)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\` should be an object of key-value pairs of additional constraint names and their versioning`,\n });\n break;\n }\n\n if (isToolName(k)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\` is not a valid additional constraint name, as \\`${k}\\` is a tool name, and \\`constraintsVersioning\\` can only override the versioning for a non-tool constraint`,\n });\n } else if (isConstraintName(k)) {\n const versioningName = v.split(':')[0];\n if (\n !AllVersioningsListLiteral.includes(\n versioningName as VersioningName,\n )\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}=${v}\\`: \\`${v}\\` is not a valid versioning scheme`,\n });\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}.${k}\\`: \\`${k}\\` is not a known additional constraint name`,\n });\n }\n }\n } else {\n const ignoredObjects = options\n .filter((option) => option.freeChoice)\n .map((option) => option.name);\n if (!ignoredObjects.includes(key)) {\n const subValidation = await validateConfig(\n configType,\n val,\n isPreset,\n currentPath,\n );\n warnings = warnings.concat(subValidation.warnings);\n errors = errors.concat(subValidation.errors);\n }\n }\n } else {\n errors.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a json object`,\n });\n }\n } else {\n // v8 ignore next -- intentionally unhandled - if we knew what was to be covered here, we'd add validation\n logger.debug(\n {},\n `Unhandled validation for ${type} at \\`${currentPath}\\``,\n );\n }\n }\n }\n\n if (key === 'hostRules' && isArray(val)) {\n const allowedHeaders =\n configType === 'global'\n ? (config.allowedHeaders ?? [])\n : GlobalConfig.get('allowedHeaders');\n for (const rule of val as HostRule[]) {\n if (isNonEmptyString(rule.matchHost)) {\n if (\n rule.matchHost.includes('://') &&\n parseUrl(rule.matchHost) === null\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `hostRules matchHost \\`${rule.matchHost}\\` is not a valid URL.`,\n });\n }\n } else if (isEmptyString(rule.matchHost)) {\n errors.push({\n topic: 'Configuration Error',\n message:\n 'Invalid value for hostRules matchHost. It cannot be an empty string.',\n });\n }\n\n if (!rule.headers) {\n continue;\n }\n for (const [header, value] of Object.entries(rule.headers)) {\n if (!isString(value)) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid hostRules headers value configuration: header must be a string.`,\n });\n }\n if (!matchRegexOrGlobList(header, allowedHeaders)) {\n errors.push({\n topic: 'Configuration Error',\n message: `hostRules header \\`${header}\\` is not allowed by this bot's \\`allowedHeaders\\`.`,\n });\n }\n }\n }\n }\n\n if (key === 'matchJsonata' && isArray(val, isString)) {\n for (const expression of val) {\n const res = getExpression(expression);\n if (res instanceof Error) {\n errors.push({\n topic: 'Configuration Error',\n message: `Invalid JSONata expression for ${currentPath}: ${res.message}`,\n });\n }\n }\n }\n }\n\n function sortAll(a: ValidationMessage, b: ValidationMessage): number {\n if (a.topic === b.topic) {\n return a.message > b.message ? 1 : -1;\n }\n return a.topic > b.topic ? 1 : -1;\n }\n\n errors.sort(sortAll);\n warnings.sort(sortAll);\n return { errors, warnings };\n },\n );\n}\n\n/**\n * Basic validation for global config options\n */\nasync function validateGlobalConfig(\n key: string,\n val: unknown,\n type: string,\n warnings: ValidationMessage[],\n errors: ValidationMessage[],\n currentPath: string | undefined,\n config: AllConfig,\n): Promise<void> {\n /* v8 ignore next 5 -- not testable yet */\n if (getDeprecationMessage(key)) {\n warnings.push({\n topic: 'Deprecation Warning',\n message: getDeprecationMessage(key)!,\n });\n }\n\n if (key === 'binarySource' && val === 'docker') {\n warnings.push({\n topic: 'Deprecation Warning',\n message:\n 'Usage of `binarySource=docker` is deprecated, and will be removed in the future. Please migrate to `binarySource=install`. Feedback on the usage of `binarySource=docker` is welcome at https://github.com/renovatebot/renovate/discussions/40742',\n });\n }\n\n if (val !== null) {\n // v8 ignore else -- TODO: add test #40625\n if (type === 'string') {\n if (isString(val)) {\n if (\n key === 'onboardingConfigFileName' &&\n !getPossibleConfigFileNames({\n configFileNames: config.configFileNames,\n platform: config.platform,\n }).includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${getPossibleConfigFileNames(\n {\n configFileNames: config.configFileNames,\n platform: config.platform,\n },\n ).join(', ')}.`,\n });\n } else if (\n key === 'repositoryCache' &&\n !['enabled', 'disabled', 'reset'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['enabled', 'disabled', 'reset'].join(', ')}.`,\n });\n } else if (\n key === 'dryRun' &&\n !['extract', 'lookup', 'full'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['extract', 'lookup', 'full'].join(', ')}.`,\n });\n } else if (\n key === 'binarySource' &&\n !['docker', 'global', 'install', 'hermit'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['docker', 'global', 'install', 'hermit'].join(', ')}.`,\n });\n } else if (\n key === 'requireConfig' &&\n !['required', 'optional', 'ignored'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['required', 'optional', 'ignored'].join(', ')}.`,\n });\n } else if (\n key === 'gitUrl' &&\n !['default', 'ssh', 'endpoint'].includes(val)\n ) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${val}\\` for \\`${currentPath}\\`. The allowed values are ${['default', 'ssh', 'endpoint'].join(', ')}.`,\n });\n }\n\n if (\n key === 'reportType' &&\n ['s3', 'file'].includes(val) &&\n !isString(config.reportPath)\n ) {\n errors.push({\n topic: 'Configuration Error',\n message: `reportType '${val}' requires a configured reportPath`,\n });\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a string.`,\n });\n }\n } else if (type === 'integer') {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n warnings.push(...validateNumber(key, val, allowsNegative, currentPath));\n } else if (type === 'boolean') {\n if (val !== true && val !== false) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a boolean. Found: ${JSON.stringify(\n val,\n )} (${typeof val}).`,\n });\n }\n } else if (type === 'array') {\n if (isArray(val) && key !== 'repositories') {\n for (const [subIndex, subval] of val.entries()) {\n if (isObject(subval)) {\n const subValidation = await validateConfig(\n 'global',\n subval,\n false,\n `${currentPath}[${subIndex}]`,\n );\n warnings.push(...subValidation.warnings);\n errors.push(...subValidation.errors);\n }\n }\n\n if (isRegexOrGlobOption(key)) {\n warnings.push(\n ...regexOrGlobValidator.check({\n val,\n currentPath: currentPath!,\n }),\n );\n }\n if (key === 'gitNoVerify') {\n const allowedValues = ['commit', 'push'];\n for (const value of val as string[]) {\n // v8 ignore else -- TODO: add test #40625\n if (!allowedValues.includes(value)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value for \\`${currentPath}\\`. The allowed values are ${allowedValues.join(', ')}.`,\n });\n }\n }\n }\n if (key === 'mergeConfidenceDatasources') {\n const allowedValues = supportedDatasources;\n for (const value of val as string[]) {\n // v8 ignore else -- TODO: add test #40625\n if (!allowedValues.includes(value)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid value \\`${value}\\` for \\`${currentPath}\\`. The allowed values are ${allowedValues.join(', ')}.`,\n });\n }\n }\n }\n } else if (isArray(val)) {\n for (const [subIndex, subval] of val.entries()) {\n if (isPlainObject(subval)) {\n if (!isNonEmptyString(subval.repository)) {\n errors.push({\n topic: 'Configuration Error',\n message: `${currentPath}[${subIndex}]: each repository object entry must have a \\`repository\\` string property`,\n });\n }\n const { repository: _, ...repoEntryConfig } = subval;\n // Each repository object entry is validated as its own global config, so it does not automatically see the top-level `allowedEnv`/`allowedHeaders`.\n // Inherit them (unless the entry sets its own) so that entry-level `env`/`headers` are validated against the allowlists, rather than an empty one.\n const subValidation = await validateConfig(\n 'global',\n {\n ...(config.allowedEnv ? { allowedEnv: config.allowedEnv } : {}),\n ...(config.allowedHeaders\n ? { allowedHeaders: config.allowedHeaders }\n : {}),\n ...repoEntryConfig,\n },\n false,\n `${currentPath}[${subIndex}]`,\n );\n warnings.push(...subValidation.warnings);\n errors.push(...subValidation.errors);\n } else if (isString(subval)) {\n if (!isNonEmptyStringAndNotWhitespace(subval)) {\n warnings.push({\n topic: 'Configuration Error',\n message: `${currentPath}[${subIndex}]: each repository string entry entry must be a non-empty string`,\n });\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `${currentPath}[${subIndex}]: invalid type, should be either a string or an object`,\n });\n }\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a list (Array).`,\n });\n }\n } else if (type === 'object') {\n if (isPlainObject(val)) {\n if (key === 'onboardingConfig') {\n const subValidation = await validateConfig('repo', val);\n for (const warning of subValidation.warnings.concat(\n subValidation.errors,\n )) {\n warnings.push(warning);\n }\n } else if (key === 'force') {\n const subValidation = await validateConfig('global', val);\n for (const warning of subValidation.warnings.concat(\n subValidation.errors,\n )) {\n warnings.push(warning);\n }\n } else if (key === 'cacheTtlOverride') {\n for (const [subKey, subValue] of Object.entries(val)) {\n const allowsNegative = optionAllowsNegativeIntegers.has(key);\n warnings.push(\n ...validateNumber(\n key,\n subValue,\n allowsNegative,\n currentPath,\n subKey,\n ),\n );\n\n if (\n !(packageCacheNamespaces as readonly string[]).includes(subKey) &&\n !anyMatchRegexOrGlobList(\n packageCacheNamespaces as unknown as string[],\n [subKey],\n )\n ) {\n errors.push({\n message: `${currentPath}: namespace \\`${subKey}\\` does not exist`,\n topic: 'Configuration Error',\n });\n }\n }\n } else {\n const res = validatePlainObject(val);\n if (res !== true) {\n warnings.push({\n topic: 'Configuration Error',\n message: `Invalid \\`${currentPath}.${res}\\` configuration: value must be a string.`,\n });\n }\n }\n } else {\n warnings.push({\n topic: 'Configuration Error',\n message: `Configuration option \\`${currentPath}\\` should be a JSON object.`,\n });\n }\n }\n }\n}\n\nfunction getPossibleConfigFileNames({\n configFileNames,\n platform,\n}: {\n configFileNames?: string[];\n platform?: PlatformId;\n}): string[] {\n const filenames = getConfigFileNames(platform);\n if (isNonEmptyArray(configFileNames)) {\n return filenames.concat(configFileNames);\n }\n\n return filenames;\n}\n"],"mappings":"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"}
@@ -60,7 +60,8 @@ async function validate(configType, desc, config, strict, isPreset = false) {
60
60
  logger.warn(`Config migration diff:\n${msg}`);
61
61
  if (strict) returnVal = 1;
62
62
  }
63
- const res = await validateConfig(configType, massageConfig(migratedConfig), isPreset);
63
+ const massagedConfig = massageConfig(migratedConfig);
64
+ const res = await validateConfig(configType, massagedConfig, isPreset);
64
65
  if (res.errors.length) {
65
66
  logger.error({
66
67
  file: desc,
@@ -1 +1 @@
1
- {"version":3,"file":"config-validator.js","names":["getFileConfig"],"sources":["../lib/config-validator.ts"],"sourcesContent":["#!/usr/bin/env node\nimport 'source-map-support/register.js';\nimport './punycode.cjs';\n\nimport { styleText } from 'node:util';\nimport { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { Command, CommanderError } from 'commander';\nimport { dequal } from 'dequal';\nimport { diffLines } from 'diff';\nimport fs from 'fs-extra';\nimport { getConfigFileNames } from './config/app-strings.ts';\nimport { GlobalConfig } from './config/global.ts';\nimport { massageConfig } from './config/massage.ts';\nimport { migrateConfig } from './config/migration.ts';\nimport type { RenovateConfig } from './config/types.ts';\nimport { validateConfig } from './config/validation.ts';\nimport { pkg } from './expose.ts';\nimport { init, logger } from './logger/index.ts';\nimport { getEnv } from './util/env.ts';\nimport { add as addHostRule } from './util/host-rules.ts';\nimport { regEx, regexEngineStatus } from './util/regex.ts';\nimport { getConfig as getFileConfig } from './workers/global/config/parse/file.ts';\nimport { parseConfigs } from './workers/global/config/parse/index.ts';\nimport { getParsedContent } from './workers/global/config/parse/util.ts';\n\nawait init();\n\nconst { pathExists, readFile } = fs;\n\nlet returnVal = 0;\n\n/**\n * Make sure that we've resolved configuration from the different places that Renovate users would expect them to be specified\n *\n * This then allows a `configType=repo` config to i.e. be validated alongside a `config.js` or `env RENOVATE_ALLOWED_COMMANDS=...`\n *\n * Note that we intentionally don't fully initialize Renovate and its modules, as we're not fully running, and it would require a Platform to be configured\n * */\nasync function partiallyGlobalInitialize(): Promise<void> {\n // NOTE that this doesn't allow command-line arguments\n const globalConfig = await parseConfigs(getEnv(), []);\n GlobalConfig.set(globalConfig);\n\n if (globalConfig.hostRules) {\n for (const hostRule of globalConfig.hostRules) {\n addHostRule(hostRule);\n }\n }\n}\n\nasync function validate(\n configType: 'global' | 'repo',\n desc: string,\n config: RenovateConfig,\n strict: boolean,\n isPreset = false,\n): Promise<void> {\n if (config.hostRules) {\n for (const hostRule of config.hostRules) {\n addHostRule(hostRule);\n }\n }\n const { isMigrated, migratedConfig } = migrateConfig(config);\n if (isMigrated) {\n logger.warn(\n {\n oldConfig: config,\n newConfig: migratedConfig,\n },\n 'Config migration necessary',\n );\n const changedObjects = diffLines(\n JSON.stringify(config, null, 2),\n JSON.stringify(migratedConfig, null, 2),\n { ignoreWhitespace: false, newlineIsToken: false },\n );\n const added = styleText('green', '+ ');\n const removed = styleText('red', '- ');\n const msg = changedObjects\n .flatMap((part) => {\n let linePrefix: string;\n if (part.added) {\n linePrefix = added;\n } else if (part.removed) {\n linePrefix = removed;\n } else {\n linePrefix = ' ';\n }\n return part.value\n .split('\\n')\n .filter(isNonEmptyStringAndNotWhitespace)\n .map((line) =>\n line.replace(regEx(/^(?<ws> *)/), `${linePrefix}$<ws>`),\n );\n })\n .join('\\n');\n // oxlint-disable-next-line renovate/logger-static-message -- the multi-line, colorized diff must be interpolated to stay readable; as a metadata field it is JSON-escaped onto one line\n logger.warn(`Config migration diff:\\n${msg}`);\n if (strict) {\n returnVal = 1;\n }\n }\n const massagedConfig = massageConfig(migratedConfig);\n const res = await validateConfig(configType, massagedConfig, isPreset);\n if (res.errors.length) {\n logger.error(\n { file: desc, errors: res.errors },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n if (res.warnings.length) {\n logger.warn(\n { file: desc, warnings: res.warnings },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n}\n\ninterface PackageJson {\n renovate?: RenovateConfig;\n 'renovate-config'?: Record<string, RenovateConfig>;\n}\n\n(async () => {\n await partiallyGlobalInitialize();\n\n const program = new Command('renovate-config-validator')\n .summary('Validate Renovate configuration files')\n .description(\n `Validate your Renovate configuration (repo config, shared presets or global configuration) files\\n` +\n // oxlint-disable-next-line renovate/no-hardcoded-docs-url -- CLI help text, no config available\n 'If no [config-files...] are given, renovate-config-validator will look at the default config file locations (https://docs.renovatebot.com/configuration-options/)',\n )\n .addHelpText(\n 'after',\n // oxlint-disable-next-line renovate/no-hardcoded-docs-url -- CLI help text, no config available\n `\nWhen specifying [config-files...], Renovate will treat them as global self-hosted configuration files. You can disable this behaviour with --no-global\n\nExamples:\n\n $ renovate-config-validator\n $ renovate-config-validator --strict\n $ renovate-config-validator first_config.json\n $ renovate-config-validator --strict config.js\n $ renovate-config-validator --no-global renovate.json5\n $ env RENOVATE_CONFIG_FILE=obscure-name.json renovate-config-validator\n\nGlobal configuration:\n\nIf you have specified global self-hosted configuration (https://docs.renovatebot.com/self-hosted-configuration/) in environment variables or in a \\`config.js\\`, this will be detected:\n\n $ env RENOVATE_ALLOWED_ENV='[\"GO*\"]' renovate-config-validator\n # if passing the filename, make sure it's not validating as a global config\n $ env RENOVATE_ALLOWED_ENV='[\"GO*\"]' renovate-config-validator --no-global renovate.json`,\n )\n .argument('[config-files...]')\n .version(pkg.version, '-v, --version')\n .option(\n '--strict',\n 'Fail command if any configuration warnings, errors, or a migration is needed',\n )\n .option(\n '--no-global',\n 'When specifying [config-files], do not treat them as global self-hosted configuration file(s)',\n true,\n )\n // allow us to manage the exit code\n .exitOverride();\n\n program.action(async (files, opts) => {\n const strict = opts.strict ?? false;\n let filesValidated = 0;\n\n // without RE2, patterns are checked by RegExp, which accepts syntax RE2 rejects (e.g. lookahead)\n if (regexEngineStatus.type === 'unavailable') {\n logger.warn(\n { err: regexEngineStatus.err },\n 'RE2 not usable, falling back to RegExp: regex validation may be inaccurate',\n );\n } else if (regexEngineStatus.type === 'ignored') {\n logger.debug(\n 'RE2 ignored via RENOVATE_X_IGNORE_RE2: regex validation may be inaccurate',\n );\n }\n\n if (files.length) {\n let isGlobalConfig = true;\n if (opts.global === false) {\n isGlobalConfig = false;\n }\n const configType = isGlobalConfig ? 'global' : 'repo';\n for (const file of files) {\n try {\n if (!(await pathExists(file))) {\n returnVal = 1;\n logger.error({ file }, 'File does not exist');\n break;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file} as ${configType} config`);\n await validate(configType, file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n\n filesValidated++;\n }\n } else {\n for (const file of getConfigFileNames().filter(\n (name) => name !== 'package.json',\n )) {\n try {\n if (!(await pathExists(file))) {\n continue;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file}`);\n await validate('repo', file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n\n filesValidated++;\n }\n try {\n const pkgJson = JSON.parse(\n await readFile('package.json', 'utf8'),\n ) as PackageJson;\n if (pkgJson.renovate) {\n logger.info(`Validating package.json > renovate`);\n await validate(\n 'repo',\n 'package.json > renovate',\n pkgJson.renovate,\n strict,\n );\n\n filesValidated++;\n }\n if (pkgJson['renovate-config']) {\n logger.info(`Validating package.json > renovate-config`);\n for (const presetConfig of Object.values(\n pkgJson['renovate-config'],\n )) {\n await validate(\n 'repo',\n 'package.json > renovate-config',\n presetConfig,\n strict,\n true,\n );\n\n filesValidated++;\n }\n }\n } catch {\n // ignore\n }\n try {\n const env = getEnv();\n const fileConfig = await getFileConfig(env);\n if (!dequal(fileConfig, {})) {\n const file = env.RENOVATE_CONFIG_FILE ?? 'config.js';\n logger.info(`Validating ${file}`);\n try {\n await validate('global', file, fileConfig, strict);\n } catch (err) {\n logger.error({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n filesValidated++;\n }\n } catch {\n // ignore\n }\n }\n if (returnVal === 0 && filesValidated) {\n logger.info(\n `Config validated successfully against ${filesValidated} file(s)`,\n );\n } else if (!filesValidated) {\n logger.warn(`No files to perform configuration validation against`);\n }\n // Use exitCode (not process.exit) so async log streams can flush\n process.exitCode = returnVal;\n });\n\n await program.parseAsync();\n})().catch((e) => {\n // Commander throws an error at the end of Action execution i.e. as part of the `help` and `version` commands, and so we don't want to return an error code in this case\n if (\n e instanceof CommanderError &&\n (e.code === 'commander.helpDisplayed' || e.code === 'commander.version')\n ) {\n return;\n }\n\n // oxlint-disable-next-line no-console -- intentional: display critical error on CLI\n console.error(e);\n process.exit(99);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,KAAK;AAEX,MAAM,EAAE,YAAY,aAAa;AAEjC,IAAI,YAAY;;;;;;;;AAShB,eAAe,4BAA2C;CAExD,MAAM,eAAe,MAAM,aAAa,OAAO,GAAG,CAAC,CAAC;CACpD,aAAa,IAAI,YAAY;CAE7B,IAAI,aAAa,WACf,KAAK,MAAM,YAAY,aAAa,WAClC,IAAY,QAAQ;AAG1B;AAEA,eAAe,SACb,YACA,MACA,QACA,QACA,WAAW,OACI;CACf,IAAI,OAAO,WACT,KAAK,MAAM,YAAY,OAAO,WAC5B,IAAY,QAAQ;CAGxB,MAAM,EAAE,YAAY,mBAAmB,cAAc,MAAM;CAC3D,IAAI,YAAY;EACd,OAAO,KACL;GACE,WAAW;GACX,WAAW;EACb,GACA,4BACF;EACA,MAAM,iBAAiB,UACrB,KAAK,UAAU,QAAQ,MAAM,CAAC,GAC9B,KAAK,UAAU,gBAAgB,MAAM,CAAC,GACtC;GAAE,kBAAkB;GAAO,gBAAgB;EAAM,CACnD;EACA,MAAM,QAAQ,UAAU,SAAS,IAAI;EACrC,MAAM,UAAU,UAAU,OAAO,IAAI;EACrC,MAAM,MAAM,eACT,SAAS,SAAS;GACjB,IAAI;GACJ,IAAI,KAAK,OACP,aAAa;QACR,IAAI,KAAK,SACd,aAAa;QAEb,aAAa;GAEf,OAAO,KAAK,MACT,MAAM,IAAI,CAAC,CACX,OAAO,gCAAgC,CAAC,CACxC,KAAK,SACJ,KAAK,QAAQ,MAAM,YAAY,GAAG,GAAG,WAAW,MAAM,CACxD;EACJ,CAAC,CAAC,CACD,KAAK,IAAI;EAEZ,OAAO,KAAK,2BAA2B,KAAK;EAC5C,IAAI,QACF,YAAY;CAEhB;CAEA,MAAM,MAAM,MAAM,eAAe,YADV,cAAc,cACqB,GAAG,QAAQ;CACrE,IAAI,IAAI,OAAO,QAAQ;EACrB,OAAO,MACL;GAAE,MAAM;GAAM,QAAQ,IAAI;EAAO,GACjC,+BACF;EACA,YAAY;CACd;CACA,IAAI,IAAI,SAAS,QAAQ;EACvB,OAAO,KACL;GAAE,MAAM;GAAM,UAAU,IAAI;EAAS,GACrC,+BACF;EACA,YAAY;CACd;AACF;CAOC,YAAY;CACX,MAAM,0BAA0B;CAEhC,MAAM,UAAU,IAAI,QAAQ,2BAA2B,CAAC,CACrD,QAAQ,uCAAuC,CAAC,CAChD,YACC,qQAGF,CAAC,CACA,YACC,SAEA;;;;;;;;;;;;;;;;;;2FAmBF,CAAC,CACA,SAAS,mBAAmB,CAAC,CAC7B,QAAQ,IAAI,SAAS,eAAe,CAAC,CACrC,OACC,YACA,8EACF,CAAC,CACA,OACC,eACA,iGACA,IACF,CAAC,CAEA,aAAa;CAEhB,QAAQ,OAAO,OAAO,OAAO,SAAS;EACpC,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,iBAAiB;EAGrB,IAAI,kBAAkB,SAAS,eAC7B,OAAO,KACL,EAAE,KAAK,kBAAkB,IAAI,GAC7B,4EACF;OACK,IAAI,kBAAkB,SAAS,WACpC,OAAO,MACL,2EACF;EAGF,IAAI,MAAM,QAAQ;GAChB,IAAI,iBAAiB;GACrB,IAAI,KAAK,WAAW,OAClB,iBAAiB;GAEnB,MAAM,aAAa,iBAAiB,WAAW;GAC/C,KAAK,MAAM,QAAQ,OAAO;IACxB,IAAI;KACF,IAAI,CAAE,MAAM,WAAW,IAAI,GAAI;MAC7B,YAAY;MACZ,OAAO,MAAM,EAAE,KAAK,GAAG,qBAAqB;MAC5C;KACF;KACA,MAAM,gBAAgB,MAAM,iBAAiB,IAAI;KACjD,IAAI;MACF,OAAO,KAAK,cAAc,KAAK,MAAM,WAAW,QAAQ;MACxD,MAAM,SAAS,YAAY,MAAM,eAAe,MAAM;KACxD,SAAS,KAAK;MACZ,OAAO,KAAK;OAAE;OAAM;MAAI,GAAG,mCAAmC;MAC9D,YAAY;KACd;IACF,SAAS,KAAK;KACZ,OAAO,KAAK;MAAE;MAAM;KAAI,GAAG,0BAA0B;KACrD,YAAY;IACd;IAEA;GACF;EACF,OAAO;GACL,KAAK,MAAM,QAAQ,mBAAmB,CAAC,CAAC,QACrC,SAAS,SAAS,cACrB,GAAG;IACD,IAAI;KACF,IAAI,CAAE,MAAM,WAAW,IAAI,GACzB;KAEF,MAAM,gBAAgB,MAAM,iBAAiB,IAAI;KACjD,IAAI;MACF,OAAO,KAAK,cAAc,MAAM;MAChC,MAAM,SAAS,QAAQ,MAAM,eAAe,MAAM;KACpD,SAAS,KAAK;MACZ,OAAO,KAAK;OAAE;OAAM;MAAI,GAAG,mCAAmC;MAC9D,YAAY;KACd;IACF,SAAS,KAAK;KACZ,OAAO,KAAK;MAAE;MAAM;KAAI,GAAG,0BAA0B;KACrD,YAAY;IACd;IAEA;GACF;GACA,IAAI;IACF,MAAM,UAAU,KAAK,MACnB,MAAM,SAAS,gBAAgB,MAAM,CACvC;IACA,IAAI,QAAQ,UAAU;KACpB,OAAO,KAAK,oCAAoC;KAChD,MAAM,SACJ,QACA,2BACA,QAAQ,UACR,MACF;KAEA;IACF;IACA,IAAI,QAAQ,oBAAoB;KAC9B,OAAO,KAAK,2CAA2C;KACvD,KAAK,MAAM,gBAAgB,OAAO,OAChC,QAAQ,kBACV,GAAG;MACD,MAAM,SACJ,QACA,kCACA,cACA,QACA,IACF;MAEA;KACF;IACF;GACF,QAAQ,CAER;GACA,IAAI;IACF,MAAM,MAAM,OAAO;IACnB,MAAM,aAAa,MAAMA,UAAc,GAAG;IAC1C,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC,GAAG;KAC3B,MAAM,OAAO,IAAI,wBAAwB;KACzC,OAAO,KAAK,cAAc,MAAM;KAChC,IAAI;MACF,MAAM,SAAS,UAAU,MAAM,YAAY,MAAM;KACnD,SAAS,KAAK;MACZ,OAAO,MAAM;OAAE;OAAM;MAAI,GAAG,mCAAmC;MAC/D,YAAY;KACd;KACA;IACF;GACF,QAAQ,CAER;EACF;EACA,IAAI,cAAc,KAAK,gBACrB,OAAO,KACL,yCAAyC,eAAe,SAC1D;OACK,IAAI,CAAC,gBACV,OAAO,KAAK,sDAAsD;EAGpE,QAAQ,WAAW;CACrB,CAAC;CAED,MAAM,QAAQ,WAAW;AAC3B,EAAA,CAAG,CAAC,CAAC,OAAO,MAAM;CAEhB,IACE,aAAa,mBACZ,EAAE,SAAS,6BAA6B,EAAE,SAAS,sBAEpD;CAIF,QAAQ,MAAM,CAAC;CACf,QAAQ,KAAK,EAAE;AACjB,CAAC"}
1
+ {"version":3,"file":"config-validator.js","names":["getFileConfig"],"sources":["../lib/config-validator.ts"],"sourcesContent":["#!/usr/bin/env node\nimport 'source-map-support/register.js';\nimport './punycode.cjs';\n\nimport { styleText } from 'node:util';\nimport { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { Command, CommanderError } from 'commander';\nimport { dequal } from 'dequal';\nimport { diffLines } from 'diff';\nimport fs from 'fs-extra';\nimport { getConfigFileNames } from './config/app-strings.ts';\nimport { GlobalConfig } from './config/global.ts';\nimport { massageConfig } from './config/massage.ts';\nimport { migrateConfig } from './config/migration.ts';\nimport type { RenovateConfig } from './config/types.ts';\nimport { validateConfig } from './config/validation.ts';\nimport { pkg } from './expose.ts';\nimport { init, logger } from './logger/index.ts';\nimport { getEnv } from './util/env.ts';\nimport { add as addHostRule } from './util/host-rules.ts';\nimport { regEx, regexEngineStatus } from './util/regex.ts';\nimport { getConfig as getFileConfig } from './workers/global/config/parse/file.ts';\nimport { parseConfigs } from './workers/global/config/parse/index.ts';\nimport { getParsedContent } from './workers/global/config/parse/util.ts';\n\nawait init();\n\nconst { pathExists, readFile } = fs;\n\nlet returnVal = 0;\n\n/**\n * Make sure that we've resolved configuration from the different places that Renovate users would expect them to be specified\n *\n * This then allows a `configType=repo` config to i.e. be validated alongside a `config.js` or `env RENOVATE_ALLOWED_COMMANDS=...`\n *\n * Note that we intentionally don't fully initialize Renovate and its modules, as we're not fully running, and it would require a Platform to be configured\n * */\nasync function partiallyGlobalInitialize(): Promise<void> {\n // NOTE that this doesn't allow command-line arguments\n const globalConfig = await parseConfigs(getEnv(), []);\n GlobalConfig.set(globalConfig);\n\n if (globalConfig.hostRules) {\n for (const hostRule of globalConfig.hostRules) {\n addHostRule(hostRule);\n }\n }\n}\n\nasync function validate(\n configType: 'global' | 'repo',\n desc: string,\n config: RenovateConfig,\n strict: boolean,\n isPreset = false,\n): Promise<void> {\n if (config.hostRules) {\n for (const hostRule of config.hostRules) {\n addHostRule(hostRule);\n }\n }\n const { isMigrated, migratedConfig } = migrateConfig(config);\n if (isMigrated) {\n logger.warn(\n {\n oldConfig: config,\n newConfig: migratedConfig,\n },\n 'Config migration necessary',\n );\n const changedObjects = diffLines(\n JSON.stringify(config, null, 2),\n JSON.stringify(migratedConfig, null, 2),\n { ignoreWhitespace: false, newlineIsToken: false },\n );\n const added = styleText('green', '+ ');\n const removed = styleText('red', '- ');\n const msg = changedObjects\n .flatMap((part) => {\n let linePrefix: string;\n if (part.added) {\n linePrefix = added;\n } else if (part.removed) {\n linePrefix = removed;\n } else {\n linePrefix = ' ';\n }\n return part.value\n .split('\\n')\n .filter(isNonEmptyStringAndNotWhitespace)\n .map((line) =>\n line.replace(regEx(/^(?<ws> *)/), `${linePrefix}$<ws>`),\n );\n })\n .join('\\n');\n // oxlint-disable-next-line renovate/logger-static-message -- the multi-line, colorized diff must be interpolated to stay readable; as a metadata field it is JSON-escaped onto one line\n logger.warn(`Config migration diff:\\n${msg}`);\n if (strict) {\n returnVal = 1;\n }\n }\n const massagedConfig = massageConfig(migratedConfig);\n const res = await validateConfig(configType, massagedConfig, isPreset);\n if (res.errors.length) {\n logger.error(\n { file: desc, errors: res.errors },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n if (res.warnings.length) {\n logger.warn(\n { file: desc, warnings: res.warnings },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n}\n\ninterface PackageJson {\n renovate?: RenovateConfig;\n 'renovate-config'?: Record<string, RenovateConfig>;\n}\n\n(async () => {\n await partiallyGlobalInitialize();\n\n const program = new Command('renovate-config-validator')\n .summary('Validate Renovate configuration files')\n .description(\n `Validate your Renovate configuration (repo config, shared presets or global configuration) files\\n` +\n // oxlint-disable-next-line renovate/no-hardcoded-docs-url -- CLI help text, no config available\n 'If no [config-files...] are given, renovate-config-validator will look at the default config file locations (https://docs.renovatebot.com/configuration-options/)',\n )\n .addHelpText(\n 'after',\n // oxlint-disable-next-line renovate/no-hardcoded-docs-url -- CLI help text, no config available\n `\nWhen specifying [config-files...], Renovate will treat them as global self-hosted configuration files. You can disable this behaviour with --no-global\n\nExamples:\n\n $ renovate-config-validator\n $ renovate-config-validator --strict\n $ renovate-config-validator first_config.json\n $ renovate-config-validator --strict config.js\n $ renovate-config-validator --no-global renovate.json5\n $ env RENOVATE_CONFIG_FILE=obscure-name.json renovate-config-validator\n\nGlobal configuration:\n\nIf you have specified global self-hosted configuration (https://docs.renovatebot.com/self-hosted-configuration/) in environment variables or in a \\`config.js\\`, this will be detected:\n\n $ env RENOVATE_ALLOWED_ENV='[\"GO*\"]' renovate-config-validator\n # if passing the filename, make sure it's not validating as a global config\n $ env RENOVATE_ALLOWED_ENV='[\"GO*\"]' renovate-config-validator --no-global renovate.json`,\n )\n .argument('[config-files...]')\n .version(pkg.version, '-v, --version')\n .option(\n '--strict',\n 'Fail command if any configuration warnings, errors, or a migration is needed',\n )\n .option(\n '--no-global',\n 'When specifying [config-files], do not treat them as global self-hosted configuration file(s)',\n true,\n )\n // allow us to manage the exit code\n .exitOverride();\n\n program.action(async (files, opts) => {\n const strict = opts.strict ?? false;\n let filesValidated = 0;\n\n // without RE2, patterns are checked by RegExp, which accepts syntax RE2 rejects (e.g. lookahead)\n if (regexEngineStatus.type === 'unavailable') {\n logger.warn(\n { err: regexEngineStatus.err },\n 'RE2 not usable, falling back to RegExp: regex validation may be inaccurate',\n );\n } else if (regexEngineStatus.type === 'ignored') {\n logger.debug(\n 'RE2 ignored via RENOVATE_X_IGNORE_RE2: regex validation may be inaccurate',\n );\n }\n\n if (files.length) {\n let isGlobalConfig = true;\n if (opts.global === false) {\n isGlobalConfig = false;\n }\n const configType = isGlobalConfig ? 'global' : 'repo';\n for (const file of files) {\n try {\n if (!(await pathExists(file))) {\n returnVal = 1;\n logger.error({ file }, 'File does not exist');\n break;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file} as ${configType} config`);\n await validate(configType, file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n\n filesValidated++;\n }\n } else {\n for (const file of getConfigFileNames().filter(\n (name) => name !== 'package.json',\n )) {\n try {\n if (!(await pathExists(file))) {\n continue;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file}`);\n await validate('repo', file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n\n filesValidated++;\n }\n try {\n const pkgJson = JSON.parse(\n await readFile('package.json', 'utf8'),\n ) as PackageJson;\n if (pkgJson.renovate) {\n logger.info(`Validating package.json > renovate`);\n await validate(\n 'repo',\n 'package.json > renovate',\n pkgJson.renovate,\n strict,\n );\n\n filesValidated++;\n }\n if (pkgJson['renovate-config']) {\n logger.info(`Validating package.json > renovate-config`);\n for (const presetConfig of Object.values(\n pkgJson['renovate-config'],\n )) {\n await validate(\n 'repo',\n 'package.json > renovate-config',\n presetConfig,\n strict,\n true,\n );\n\n filesValidated++;\n }\n }\n } catch {\n // ignore\n }\n try {\n const env = getEnv();\n const fileConfig = await getFileConfig(env);\n if (!dequal(fileConfig, {})) {\n const file = env.RENOVATE_CONFIG_FILE ?? 'config.js';\n logger.info(`Validating ${file}`);\n try {\n await validate('global', file, fileConfig, strict);\n } catch (err) {\n logger.error({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n filesValidated++;\n }\n } catch {\n // ignore\n }\n }\n if (returnVal === 0 && filesValidated) {\n logger.info(\n `Config validated successfully against ${filesValidated} file(s)`,\n );\n } else if (!filesValidated) {\n logger.warn(`No files to perform configuration validation against`);\n }\n // Use exitCode (not process.exit) so async log streams can flush\n process.exitCode = returnVal;\n });\n\n await program.parseAsync();\n})().catch((e) => {\n // Commander throws an error at the end of Action execution i.e. as part of the `help` and `version` commands, and so we don't want to return an error code in this case\n if (\n e instanceof CommanderError &&\n (e.code === 'commander.helpDisplayed' || e.code === 'commander.version')\n ) {\n return;\n }\n\n // oxlint-disable-next-line no-console -- intentional: display critical error on CLI\n console.error(e);\n process.exit(99);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,KAAK;AAEX,MAAM,EAAE,YAAY,aAAa;AAEjC,IAAI,YAAY;;;;;;;;AAShB,eAAe,4BAA2C;CAExD,MAAM,eAAe,MAAM,aAAa,OAAO,GAAG,CAAC,CAAC;CACpD,aAAa,IAAI,YAAY;CAE7B,IAAI,aAAa,WACf,KAAK,MAAM,YAAY,aAAa,WAClC,IAAY,QAAQ;AAG1B;AAEA,eAAe,SACb,YACA,MACA,QACA,QACA,WAAW,OACI;CACf,IAAI,OAAO,WACT,KAAK,MAAM,YAAY,OAAO,WAC5B,IAAY,QAAQ;CAGxB,MAAM,EAAE,YAAY,mBAAmB,cAAc,MAAM;CAC3D,IAAI,YAAY;EACd,OAAO,KACL;GACE,WAAW;GACX,WAAW;EACb,GACA,4BACF;EACA,MAAM,iBAAiB,UACrB,KAAK,UAAU,QAAQ,MAAM,CAAC,GAC9B,KAAK,UAAU,gBAAgB,MAAM,CAAC,GACtC;GAAE,kBAAkB;GAAO,gBAAgB;EAAM,CACnD;EACA,MAAM,QAAQ,UAAU,SAAS,IAAI;EACrC,MAAM,UAAU,UAAU,OAAO,IAAI;EACrC,MAAM,MAAM,eACT,SAAS,SAAS;GACjB,IAAI;GACJ,IAAI,KAAK,OACP,aAAa;QACR,IAAI,KAAK,SACd,aAAa;QAEb,aAAa;GAEf,OAAO,KAAK,MACT,MAAM,IAAI,CAAC,CACX,OAAO,gCAAgC,CAAC,CACxC,KAAK,SACJ,KAAK,QAAQ,MAAM,YAAY,GAAG,GAAG,WAAW,MAAM,CACxD;EACJ,CAAC,CAAC,CACD,KAAK,IAAI;EAEZ,OAAO,KAAK,2BAA2B,KAAK;EAC5C,IAAI,QACF,YAAY;CAEhB;CACA,MAAM,iBAAiB,cAAc,cAAc;CACnD,MAAM,MAAM,MAAM,eAAe,YAAY,gBAAgB,QAAQ;CACrE,IAAI,IAAI,OAAO,QAAQ;EACrB,OAAO,MACL;GAAE,MAAM;GAAM,QAAQ,IAAI;EAAO,GACjC,+BACF;EACA,YAAY;CACd;CACA,IAAI,IAAI,SAAS,QAAQ;EACvB,OAAO,KACL;GAAE,MAAM;GAAM,UAAU,IAAI;EAAS,GACrC,+BACF;EACA,YAAY;CACd;AACF;CAOC,YAAY;CACX,MAAM,0BAA0B;CAEhC,MAAM,UAAU,IAAI,QAAQ,2BAA2B,CAAC,CACrD,QAAQ,uCAAuC,CAAC,CAChD,YACC,qQAGF,CAAC,CACA,YACC,SAEA;;;;;;;;;;;;;;;;;;2FAmBF,CAAC,CACA,SAAS,mBAAmB,CAAC,CAC7B,QAAQ,IAAI,SAAS,eAAe,CAAC,CACrC,OACC,YACA,8EACF,CAAC,CACA,OACC,eACA,iGACA,IACF,CAAC,CAEA,aAAa;CAEhB,QAAQ,OAAO,OAAO,OAAO,SAAS;EACpC,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,iBAAiB;EAGrB,IAAI,kBAAkB,SAAS,eAC7B,OAAO,KACL,EAAE,KAAK,kBAAkB,IAAI,GAC7B,4EACF;OACK,IAAI,kBAAkB,SAAS,WACpC,OAAO,MACL,2EACF;EAGF,IAAI,MAAM,QAAQ;GAChB,IAAI,iBAAiB;GACrB,IAAI,KAAK,WAAW,OAClB,iBAAiB;GAEnB,MAAM,aAAa,iBAAiB,WAAW;GAC/C,KAAK,MAAM,QAAQ,OAAO;IACxB,IAAI;KACF,IAAI,CAAE,MAAM,WAAW,IAAI,GAAI;MAC7B,YAAY;MACZ,OAAO,MAAM,EAAE,KAAK,GAAG,qBAAqB;MAC5C;KACF;KACA,MAAM,gBAAgB,MAAM,iBAAiB,IAAI;KACjD,IAAI;MACF,OAAO,KAAK,cAAc,KAAK,MAAM,WAAW,QAAQ;MACxD,MAAM,SAAS,YAAY,MAAM,eAAe,MAAM;KACxD,SAAS,KAAK;MACZ,OAAO,KAAK;OAAE;OAAM;MAAI,GAAG,mCAAmC;MAC9D,YAAY;KACd;IACF,SAAS,KAAK;KACZ,OAAO,KAAK;MAAE;MAAM;KAAI,GAAG,0BAA0B;KACrD,YAAY;IACd;IAEA;GACF;EACF,OAAO;GACL,KAAK,MAAM,QAAQ,mBAAmB,CAAC,CAAC,QACrC,SAAS,SAAS,cACrB,GAAG;IACD,IAAI;KACF,IAAI,CAAE,MAAM,WAAW,IAAI,GACzB;KAEF,MAAM,gBAAgB,MAAM,iBAAiB,IAAI;KACjD,IAAI;MACF,OAAO,KAAK,cAAc,MAAM;MAChC,MAAM,SAAS,QAAQ,MAAM,eAAe,MAAM;KACpD,SAAS,KAAK;MACZ,OAAO,KAAK;OAAE;OAAM;MAAI,GAAG,mCAAmC;MAC9D,YAAY;KACd;IACF,SAAS,KAAK;KACZ,OAAO,KAAK;MAAE;MAAM;KAAI,GAAG,0BAA0B;KACrD,YAAY;IACd;IAEA;GACF;GACA,IAAI;IACF,MAAM,UAAU,KAAK,MACnB,MAAM,SAAS,gBAAgB,MAAM,CACvC;IACA,IAAI,QAAQ,UAAU;KACpB,OAAO,KAAK,oCAAoC;KAChD,MAAM,SACJ,QACA,2BACA,QAAQ,UACR,MACF;KAEA;IACF;IACA,IAAI,QAAQ,oBAAoB;KAC9B,OAAO,KAAK,2CAA2C;KACvD,KAAK,MAAM,gBAAgB,OAAO,OAChC,QAAQ,kBACV,GAAG;MACD,MAAM,SACJ,QACA,kCACA,cACA,QACA,IACF;MAEA;KACF;IACF;GACF,QAAQ,CAER;GACA,IAAI;IACF,MAAM,MAAM,OAAO;IACnB,MAAM,aAAa,MAAMA,UAAc,GAAG;IAC1C,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC,GAAG;KAC3B,MAAM,OAAO,IAAI,wBAAwB;KACzC,OAAO,KAAK,cAAc,MAAM;KAChC,IAAI;MACF,MAAM,SAAS,UAAU,MAAM,YAAY,MAAM;KACnD,SAAS,KAAK;MACZ,OAAO,MAAM;OAAE;OAAM;MAAI,GAAG,mCAAmC;MAC/D,YAAY;KACd;KACA;IACF;GACF,QAAQ,CAER;EACF;EACA,IAAI,cAAc,KAAK,gBACrB,OAAO,KACL,yCAAyC,eAAe,SAC1D;OACK,IAAI,CAAC,gBACV,OAAO,KAAK,sDAAsD;EAGpE,QAAQ,WAAW;CACrB,CAAC;CAED,MAAM,QAAQ,WAAW;AAC3B,EAAA,CAAG,CAAC,CAAC,OAAO,MAAM;CAEhB,IACE,aAAa,mBACZ,EAAE,SAAS,6BAA6B,EAAE,SAAS,sBAEpD;CAIF,QAAQ,MAAM,CAAC;CACf,QAAQ,KAAK,EAAE;AACjB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"expose.js","names":[],"sources":["../lib/expose.ts"],"sourcesContent":["import { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\nexport const pkg =\n require('../package.json') as typeof import('../package.json');\n\n/**\n * return's re2\n */\nexport function re2(): RegExpConstructor {\n return require('re2');\n}\n\n/**\n * return's prettier\n */\nexport function prettier(): typeof import('prettier') {\n return require('prettier');\n}\n\n/**\n * return's openpgp\n */\nexport async function openpgp(): Promise<typeof import('openpgp')> {\n return await import('openpgp');\n}\n\n/**\n * return's bunyan\n */\nexport function bunyan(): typeof import('bunyan') {\n // use `require` to allow opentelemetry instrumentation\n return require('bunyan');\n}\n"],"mappings":";;AAEA,MAAM,UAAU,cAAc,OAAO,KAAK,GAAG;AAE7C,MAAa,MACX,QAAQ,iBAAiB;;;;AAK3B,SAAgB,MAAyB;CACvC,OAAO,QAAQ,KAAK;AACtB;;;;AAKA,SAAgB,WAAsC;CACpD,OAAO,QAAQ,UAAU;AAC3B;;;;AAKA,eAAsB,UAA6C;CACjE,OAAO,MAAM,OAAO;AACtB;;;;AAKA,SAAgB,SAAkC;CAEhD,OAAO,QAAQ,QAAQ;AACzB"}
1
+ {"version":3,"file":"expose.js","names":[],"sources":["../lib/expose.ts"],"sourcesContent":["import { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\nexport const pkg =\n require('../package.json') as typeof import('../package.json');\n\n/**\n * return's re2\n */\nexport function re2(): RegExpConstructor {\n return require('re2');\n}\n\n/**\n * return's prettier\n */\nexport function prettier(): typeof import('prettier') {\n return require('prettier');\n}\n\n/**\n * return's openpgp\n */\nexport async function openpgp(): Promise<typeof import('openpgp')> {\n return await import('openpgp');\n}\n\n/**\n * return's bunyan\n */\nexport function bunyan(): typeof import('bunyan') {\n // use `require` to allow opentelemetry instrumentation\n return require('bunyan');\n}\n"],"mappings":";;AAEA,MAAM,UAAU,cAAc,YAAY,GAAG;AAE7C,MAAa,MACX,QAAQ,iBAAiB;;;;AAK3B,SAAgB,MAAyB;CACvC,OAAO,QAAQ,KAAK;AACtB;;;;AAKA,SAAgB,WAAsC;CACpD,OAAO,QAAQ,UAAU;AAC3B;;;;AAKA,eAAsB,UAA6C;CACjE,OAAO,MAAM,OAAO;AACtB;;;;AAKA,SAAgB,SAAkC;CAEhD,OAAO,QAAQ,QAAQ;AACzB"}
@@ -23,7 +23,7 @@ const globalConfigOptionDefaults = {
23
23
  "detectHostRulesFromEnv": false,
24
24
  "dockerChildPrefix": "renovate_",
25
25
  "dockerMaxPages": 20,
26
- "dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.82.9",
26
+ "dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.82.11",
27
27
  "dockerUser": "12021",
28
28
  "executionTimeout": 15,
29
29
  "exposeAllEnv": false,
@@ -1 +1 @@
1
- {"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.82.9\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,8BAA8B;CAC9B,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
1
+ {"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.82.11\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,8BAA8B;CAC9B,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
@@ -27,7 +27,8 @@ var ArtifactoryDatasource = class extends Datasource {
27
27
  const url = joinUrlParts(registryUrl, packageName);
28
28
  const result = { releases: [] };
29
29
  try {
30
- parse((await this.http.getText(url)).body, { blockTextElements: {
30
+ const response = await this.http.getText(url);
31
+ parse(response.body, { blockTextElements: {
31
32
  script: true,
32
33
  noscript: true,
33
34
  style: true
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/artifactory/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { parse } from '../../../util/html.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { datasource } from './common.ts';\n\nexport class ArtifactoryDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the date-like text, next to the version hyperlink tag in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl) {\n logger.warn(\n { packageName },\n 'artifactory datasource requires custom registryUrl. Skipping datasource',\n );\n return null;\n }\n\n const url = joinUrlParts(registryUrl, packageName);\n\n const result: ReleaseResult = {\n releases: [],\n };\n try {\n const response = await this.http.getText(url);\n const body = parse(response.body, {\n blockTextElements: {\n script: true,\n noscript: true,\n style: true,\n },\n });\n const nodes = body.querySelectorAll('a');\n\n nodes\n .filter(\n // filter out hyperlink to navigate to parent folder\n (node) => node.innerHTML !== '../' && node.innerHTML !== '..',\n )\n .forEach(\n // extract version and published time for each node\n (node) => {\n const version: string = node.innerHTML.endsWith('/')\n ? node.innerHTML.slice(0, -1)\n : node.innerHTML;\n\n const releaseTimestamp = asTimestamp(\n node.nextSibling?.text?.trimStart()?.split(regEx(/\\s{2,}/))?.[0],\n );\n\n const thisRelease: Release = {\n version,\n releaseTimestamp,\n };\n\n result.releases.push(thisRelease);\n },\n );\n\n if (result.releases.length) {\n logger.trace(\n { registryUrl, packageName, versions: result.releases.length },\n 'artifactory: Found versions',\n );\n } else {\n logger.trace(\n { registryUrl, packageName },\n 'artifactory: No versions found',\n );\n }\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.warn(\n { registryUrl, packageName },\n 'artifactory: `Not Found` error',\n );\n return null;\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,wBAA0C;CAE1C,UAA4B;CAE5B,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,IAAI,CAAC,aAAa;GAChB,OAAO,KACL,EAAE,YAAY,GACd,yEACF;GACA,OAAO;EACT;EAEA,MAAM,MAAM,aAAa,aAAa,WAAW;EAEjD,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EACA,IAAI;GAWF,OATmB,MADI,KAAK,KAAK,QAAQ,GAAG,EAAA,CAChB,MAAM,EAChC,mBAAmB;IACjB,QAAQ;IACR,UAAU;IACV,OAAO;GACT,EACF,CACiB,CAAC,CAAC,iBAAiB,GAEhC,CAAC,CACF,QAEE,SAAS,KAAK,cAAc,SAAS,KAAK,cAAc,IAC3D,CAAC,CACA,SAEE,SAAS;IASR,MAAM,cAAuB;KAC3B,SATsB,KAAK,UAAU,SAAS,GAAG,IAC/C,KAAK,UAAU,MAAM,GAAG,EAAE,IAC1B,KAAK;KAQP,kBANuB,YACvB,KAAK,aAAa,MAAM,UAAU,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,EAK/C;IACjB;IAEA,OAAO,SAAS,KAAK,WAAW;GAClC,CACF;GAEF,IAAI,OAAO,SAAS,QAClB,OAAO,MACL;IAAE;IAAa;IAAa,UAAU,OAAO,SAAS;GAAO,GAC7D,6BACF;QAEA,OAAO,MACL;IAAE;IAAa;GAAY,GAC3B,gCACF;EAEJ,SAAS,KAAK;GACZ,IAAI,eAAeA,gBAAa,IAAI,UAAU,eAAe,KAAK;IAChE,OAAO,KACL;KAAE;KAAa;IAAY,GAC3B,gCACF;IACA,OAAO;GACT;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc;GACzB,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/artifactory/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { parse } from '../../../util/html.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { datasource } from './common.ts';\n\nexport class ArtifactoryDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the date-like text, next to the version hyperlink tag in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl) {\n logger.warn(\n { packageName },\n 'artifactory datasource requires custom registryUrl. Skipping datasource',\n );\n return null;\n }\n\n const url = joinUrlParts(registryUrl, packageName);\n\n const result: ReleaseResult = {\n releases: [],\n };\n try {\n const response = await this.http.getText(url);\n const body = parse(response.body, {\n blockTextElements: {\n script: true,\n noscript: true,\n style: true,\n },\n });\n const nodes = body.querySelectorAll('a');\n\n nodes\n .filter(\n // filter out hyperlink to navigate to parent folder\n (node) => node.innerHTML !== '../' && node.innerHTML !== '..',\n )\n .forEach(\n // extract version and published time for each node\n (node) => {\n const version: string = node.innerHTML.endsWith('/')\n ? node.innerHTML.slice(0, -1)\n : node.innerHTML;\n\n const releaseTimestamp = asTimestamp(\n node.nextSibling?.text?.trimStart()?.split(regEx(/\\s{2,}/))?.[0],\n );\n\n const thisRelease: Release = {\n version,\n releaseTimestamp,\n };\n\n result.releases.push(thisRelease);\n },\n );\n\n if (result.releases.length) {\n logger.trace(\n { registryUrl, packageName, versions: result.releases.length },\n 'artifactory: Found versions',\n );\n } else {\n logger.trace(\n { registryUrl, packageName },\n 'artifactory: No versions found',\n );\n }\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.warn(\n { registryUrl, packageName },\n 'artifactory: `Not Found` error',\n );\n return null;\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${datasource}`,\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,wBAA0C;CAE1C,UAA4B;CAE5B,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,IAAI,CAAC,aAAa;GAChB,OAAO,KACL,EAAE,YAAY,GACd,yEACF;GACA,OAAO;EACT;EAEA,MAAM,MAAM,aAAa,aAAa,WAAW;EAEjD,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EACA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,GAAG;GAU5C,MATmB,SAAS,MAAM,EAChC,mBAAmB;IACjB,QAAQ;IACR,UAAU;IACV,OAAO;GACT,EACF,CACiB,CAAC,CAAC,iBAAiB,GAEhC,CAAC,CACF,QAEE,SAAS,KAAK,cAAc,SAAS,KAAK,cAAc,IAC3D,CAAC,CACA,SAEE,SAAS;IASR,MAAM,cAAuB;KAC3B,SATsB,KAAK,UAAU,SAAS,GAAG,IAC/C,KAAK,UAAU,MAAM,GAAG,EAAE,IAC1B,KAAK;KAQP,kBANuB,YACvB,KAAK,aAAa,MAAM,UAAU,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,EAK/C;IACjB;IAEA,OAAO,SAAS,KAAK,WAAW;GAClC,CACF;GAEF,IAAI,OAAO,SAAS,QAClB,OAAO,MACL;IAAE;IAAa;IAAa,UAAU,OAAO,SAAS;GAAO,GAC7D,6BACF;QAEA,OAAO,MACL;IAAE;IAAa;GAAY,GAC3B,gCACF;EAEJ,SAAS,KAAK;GACZ,IAAI,eAAeA,gBAAa,IAAI,UAAU,eAAe,KAAK;IAChE,OAAO,KACL;KAAE;KAAa;IAAY,GAC3B,gCACF;IACA,OAAO;GACT;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc;GACzB,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -31,7 +31,8 @@ var AwsEKSAddonDataSource = class AwsEKSAddonDataSource extends Datasource {
31
31
  addonName: filter.addonName,
32
32
  maxResults: 1
33
33
  });
34
- return { releases: coerceArray((await this.getClient(filter).send(cmd)).addons).flatMap((addon) => {
34
+ const response = await this.getClient(filter).send(cmd);
35
+ return { releases: coerceArray(response.addons).flatMap((addon) => {
35
36
  return addon.addonVersions;
36
37
  }).filter(isTruthy).map((versionInfo) => ({
37
38
  version: versionInfo.addonVersion ?? "",