renovate 44.210.2 → 44.211.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/utils.js +2 -1
  4. package/dist/config/utils.js.map +1 -1
  5. package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
  6. package/dist/config/validation-helpers/utils.js +5 -1
  7. package/dist/config/validation-helpers/utils.js.map +1 -1
  8. package/dist/config/validation.js +8 -2
  9. package/dist/config/validation.js.map +1 -1
  10. package/dist/config-validator.js +1 -1
  11. package/dist/config-validator.js.map +1 -1
  12. package/dist/global-config-option-defaults.generated.js +1 -1
  13. package/dist/global-config-option-defaults.generated.js.map +1 -1
  14. package/dist/instrumentation/index.js +3 -2
  15. package/dist/instrumentation/index.js.map +1 -1
  16. package/dist/logger/bunyan.js +3 -2
  17. package/dist/logger/bunyan.js.map +1 -1
  18. package/dist/logger/pretty-stdout.js +2 -1
  19. package/dist/logger/pretty-stdout.js.map +1 -1
  20. package/dist/modules/datasource/apk/index.js +2 -2
  21. package/dist/modules/datasource/apk/index.js.map +1 -1
  22. package/dist/modules/datasource/artifactory/index.js +2 -3
  23. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  24. package/dist/modules/datasource/bazel/index.js +2 -1
  25. package/dist/modules/datasource/bazel/index.js.map +1 -1
  26. package/dist/modules/datasource/cdnjs/index.js +2 -1
  27. package/dist/modules/datasource/cdnjs/index.js.map +1 -1
  28. package/dist/modules/datasource/conda/index.js +2 -1
  29. package/dist/modules/datasource/conda/index.js.map +1 -1
  30. package/dist/modules/datasource/crate/index.js +2 -1
  31. package/dist/modules/datasource/crate/index.js.map +1 -1
  32. package/dist/modules/datasource/dart-version/index.js +2 -1
  33. package/dist/modules/datasource/dart-version/index.js.map +1 -1
  34. package/dist/modules/datasource/datasource.js +2 -2
  35. package/dist/modules/datasource/datasource.js.map +1 -1
  36. package/dist/modules/datasource/deb/url.js +3 -1
  37. package/dist/modules/datasource/deb/url.js.map +1 -1
  38. package/dist/modules/datasource/devbox/index.js +2 -1
  39. package/dist/modules/datasource/devbox/index.js.map +1 -1
  40. package/dist/modules/datasource/docker/common.js +10 -8
  41. package/dist/modules/datasource/docker/common.js.map +1 -1
  42. package/dist/modules/datasource/docker/ecr.js +2 -1
  43. package/dist/modules/datasource/docker/ecr.js.map +1 -1
  44. package/dist/modules/datasource/docker/index.js +20 -17
  45. package/dist/modules/datasource/docker/index.js.map +1 -1
  46. package/dist/modules/datasource/gitea-tags/base.js +2 -3
  47. package/dist/modules/datasource/gitea-tags/base.js.map +1 -1
  48. package/dist/modules/datasource/github-tags/index.js +2 -1
  49. package/dist/modules/datasource/github-tags/index.js.map +1 -1
  50. package/dist/modules/datasource/gitlab-tags/index.js +2 -3
  51. package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
  52. package/dist/modules/datasource/go/base.js +1 -1
  53. package/dist/modules/datasource/go/base.js.map +1 -1
  54. package/dist/modules/datasource/go/common.js +8 -2
  55. package/dist/modules/datasource/go/common.js.map +1 -1
  56. package/dist/modules/datasource/go/env.js +2 -1
  57. package/dist/modules/datasource/go/env.js.map +1 -1
  58. package/dist/modules/datasource/go/releases-goproxy.js +7 -5
  59. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  60. package/dist/modules/datasource/helm/index.js +2 -1
  61. package/dist/modules/datasource/helm/index.js.map +1 -1
  62. package/dist/modules/datasource/hexpm-bob/index.js +2 -1
  63. package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
  64. package/dist/modules/datasource/index.js +4 -3
  65. package/dist/modules/datasource/index.js.map +1 -1
  66. package/dist/modules/datasource/java-version/adoptium.js +3 -2
  67. package/dist/modules/datasource/java-version/adoptium.js.map +1 -1
  68. package/dist/modules/datasource/java-version/graalvm.js +2 -1
  69. package/dist/modules/datasource/java-version/graalvm.js.map +1 -1
  70. package/dist/modules/datasource/maven/index.js.map +1 -1
  71. package/dist/modules/datasource/maven/util.js +7 -10
  72. package/dist/modules/datasource/maven/util.js.map +1 -1
  73. package/dist/modules/datasource/npm/npmrc.js +2 -2
  74. package/dist/modules/datasource/npm/npmrc.js.map +1 -1
  75. package/dist/modules/datasource/nuget/v3.js +3 -5
  76. package/dist/modules/datasource/nuget/v3.js.map +1 -1
  77. package/dist/modules/datasource/packagist/index.js +4 -5
  78. package/dist/modules/datasource/packagist/index.js.map +1 -1
  79. package/dist/modules/datasource/pod/index.js +4 -4
  80. package/dist/modules/datasource/pod/index.js.map +1 -1
  81. package/dist/modules/datasource/pypi/index.js +19 -11
  82. package/dist/modules/datasource/pypi/index.js.map +1 -1
  83. package/dist/modules/datasource/python-version/index.js +2 -3
  84. package/dist/modules/datasource/python-version/index.js.map +1 -1
  85. package/dist/modules/datasource/repology/index.js +4 -3
  86. package/dist/modules/datasource/repology/index.js.map +1 -1
  87. package/dist/modules/datasource/rpm/providers/common.js +3 -1
  88. package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
  89. package/dist/modules/datasource/rubygems/index.js +2 -5
  90. package/dist/modules/datasource/rubygems/index.js.map +1 -1
  91. package/dist/modules/datasource/rubygems/versions-endpoint-cache.js +13 -18
  92. package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
  93. package/dist/modules/datasource/terraform-module/base.js +2 -1
  94. package/dist/modules/datasource/terraform-module/base.js.map +1 -1
  95. package/dist/modules/datasource/terraform-provider/index.js +2 -3
  96. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  97. package/dist/modules/manager/bazel-module/parser/context.js +0 -1
  98. package/dist/modules/manager/bazel-module/parser/context.js.map +1 -1
  99. package/dist/modules/manager/bundler/host-rules.js +4 -1
  100. package/dist/modules/manager/bundler/host-rules.js.map +1 -1
  101. package/dist/modules/manager/composer/range.js +1 -1
  102. package/dist/modules/manager/composer/range.js.map +1 -1
  103. package/dist/modules/manager/custom/utils.js +3 -1
  104. package/dist/modules/manager/custom/utils.js.map +1 -1
  105. package/dist/modules/manager/devbox/schema.js +2 -1
  106. package/dist/modules/manager/devbox/schema.js.map +1 -1
  107. package/dist/modules/manager/dockerfile/extract.js +10 -2
  108. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  109. package/dist/modules/manager/fingerprint.generated.js +1 -1
  110. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  111. package/dist/modules/manager/github-actions/parse.js +2 -1
  112. package/dist/modules/manager/github-actions/parse.js.map +1 -1
  113. package/dist/modules/manager/gomod/artifacts.js +5 -2
  114. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  115. package/dist/modules/manager/gradle/artifacts.js +5 -2
  116. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  117. package/dist/modules/manager/gradle/utils.js +2 -1
  118. package/dist/modules/manager/gradle/utils.js.map +1 -1
  119. package/dist/modules/manager/gradle-wrapper/utils.js +9 -5
  120. package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
  121. package/dist/modules/manager/helm-values/util.js +1 -1
  122. package/dist/modules/manager/helm-values/util.js.map +1 -1
  123. package/dist/modules/manager/helmfile/artifacts.js +1 -1
  124. package/dist/modules/manager/helmfile/artifacts.js.map +1 -1
  125. package/dist/modules/manager/helmv3/artifacts.js +1 -1
  126. package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
  127. package/dist/modules/manager/maven/extract.js +5 -2
  128. package/dist/modules/manager/maven/extract.js.map +1 -1
  129. package/dist/modules/manager/maven-wrapper/artifacts.js +3 -2
  130. package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
  131. package/dist/modules/manager/mise/artifacts.js +2 -1
  132. package/dist/modules/manager/mise/artifacts.js.map +1 -1
  133. package/dist/modules/manager/mise/extract.js.map +1 -1
  134. package/dist/modules/manager/npm/artifacts.js +3 -1
  135. package/dist/modules/manager/npm/artifacts.js.map +1 -1
  136. package/dist/modules/manager/npm/extract/common/dependency.js +4 -1
  137. package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
  138. package/dist/modules/manager/npm/extract/common/package-file.js +2 -1
  139. package/dist/modules/manager/npm/extract/common/package-file.js.map +1 -1
  140. package/dist/modules/manager/npm/extract/index.js.map +1 -1
  141. package/dist/modules/manager/npm/extract/post/locked-versions.js.map +1 -1
  142. package/dist/modules/manager/npm/npmrc.js +2 -1
  143. package/dist/modules/manager/npm/npmrc.js.map +1 -1
  144. package/dist/modules/manager/npm/post-update/index.js +2 -1
  145. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  146. package/dist/modules/manager/npm/post-update/npm.js +2 -3
  147. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  148. package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
  149. package/dist/modules/manager/npm/schema.js +6 -2
  150. package/dist/modules/manager/npm/schema.js.map +1 -1
  151. package/dist/modules/manager/npm/update/dependency/index.js +3 -2
  152. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  153. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js +6 -2
  154. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js.map +1 -1
  155. package/dist/modules/manager/npm/update/locked-dependency/package-lock/get-locked.js +2 -1
  156. package/dist/modules/manager/npm/update/locked-dependency/package-lock/get-locked.js.map +1 -1
  157. package/dist/modules/manager/nuget/package-tree.js +2 -1
  158. package/dist/modules/manager/nuget/package-tree.js.map +1 -1
  159. package/dist/modules/manager/paket/update-locked.js +4 -1
  160. package/dist/modules/manager/paket/update-locked.js.map +1 -1
  161. package/dist/modules/manager/pipenv/extract.js +4 -1
  162. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  163. package/dist/modules/platform/azure/azure-helper.js +2 -1
  164. package/dist/modules/platform/azure/azure-helper.js.map +1 -1
  165. package/dist/modules/platform/azure/index.js +7 -3
  166. package/dist/modules/platform/azure/index.js.map +1 -1
  167. package/dist/modules/platform/bitbucket/index.js +13 -6
  168. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  169. package/dist/modules/platform/bitbucket-server/index.js +13 -9
  170. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  171. package/dist/modules/platform/codecommit/index.js +2 -2
  172. package/dist/modules/platform/codecommit/index.js.map +1 -1
  173. package/dist/modules/platform/gerrit/client.js +4 -1
  174. package/dist/modules/platform/gerrit/client.js.map +1 -1
  175. package/dist/modules/platform/gerrit/index.js +3 -2
  176. package/dist/modules/platform/gerrit/index.js.map +1 -1
  177. package/dist/modules/platform/gitea/gitea-helper.js +5 -4
  178. package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
  179. package/dist/modules/platform/gitea/index.js +11 -4
  180. package/dist/modules/platform/gitea/index.js.map +1 -1
  181. package/dist/modules/platform/github/index.js +36 -23
  182. package/dist/modules/platform/github/index.js.map +1 -1
  183. package/dist/modules/platform/gitlab/index.js +16 -9
  184. package/dist/modules/platform/gitlab/index.js.map +1 -1
  185. package/dist/modules/platform/scm-manager/index.js +4 -1
  186. package/dist/modules/platform/scm-manager/index.js.map +1 -1
  187. package/dist/modules/platform/scm-manager/utils.js +2 -1
  188. package/dist/modules/platform/scm-manager/utils.js.map +1 -1
  189. package/dist/modules/versioning/cargo/index.js.map +1 -1
  190. package/dist/modules/versioning/composer/index.js +2 -1
  191. package/dist/modules/versioning/composer/index.js.map +1 -1
  192. package/dist/modules/versioning/conan/common.js +4 -1
  193. package/dist/modules/versioning/conan/common.js.map +1 -1
  194. package/dist/modules/versioning/debian/index.js +2 -1
  195. package/dist/modules/versioning/debian/index.js.map +1 -1
  196. package/dist/modules/versioning/gradle/compare.js +2 -1
  197. package/dist/modules/versioning/gradle/compare.js.map +1 -1
  198. package/dist/modules/versioning/hex/index.js +2 -1
  199. package/dist/modules/versioning/hex/index.js.map +1 -1
  200. package/dist/modules/versioning/julia/index.js.map +1 -1
  201. package/dist/modules/versioning/maven/compare.js +17 -7
  202. package/dist/modules/versioning/maven/compare.js.map +1 -1
  203. package/dist/modules/versioning/npm/index.js +2 -1
  204. package/dist/modules/versioning/npm/index.js.map +1 -1
  205. package/dist/modules/versioning/npm/range.js.map +1 -1
  206. package/dist/modules/versioning/paket/index.js +2 -1
  207. package/dist/modules/versioning/paket/index.js.map +1 -1
  208. package/dist/modules/versioning/paket/range.js +7 -3
  209. package/dist/modules/versioning/paket/range.js.map +1 -1
  210. package/dist/modules/versioning/pep440/index.js +2 -1
  211. package/dist/modules/versioning/pep440/index.js.map +1 -1
  212. package/dist/modules/versioning/poetry/index.js +2 -1
  213. package/dist/modules/versioning/poetry/index.js.map +1 -1
  214. package/dist/modules/versioning/regex/index.js +1 -1
  215. package/dist/modules/versioning/regex/index.js.map +1 -1
  216. package/dist/modules/versioning/rez/index.js +2 -1
  217. package/dist/modules/versioning/rez/index.js.map +1 -1
  218. package/dist/modules/versioning/vcpkg/index.js +2 -1
  219. package/dist/modules/versioning/vcpkg/index.js.map +1 -1
  220. package/dist/util/cache/package/impl/base.js +2 -1
  221. package/dist/util/cache/package/impl/base.js.map +1 -1
  222. package/dist/util/cache/package/with-cache.js +2 -1
  223. package/dist/util/cache/package/with-cache.js.map +1 -1
  224. package/dist/util/check-token.js +7 -4
  225. package/dist/util/check-token.js.map +1 -1
  226. package/dist/util/exec/utils.js +4 -1
  227. package/dist/util/exec/utils.js.map +1 -1
  228. package/dist/util/git/auth.js +5 -1
  229. package/dist/util/git/auth.js.map +1 -1
  230. package/dist/util/git/error.js.map +1 -1
  231. package/dist/util/host-rules.js +5 -3
  232. package/dist/util/host-rules.js.map +1 -1
  233. package/dist/util/http/cache/abstract-http-cache-provider.js +3 -2
  234. package/dist/util/http/cache/abstract-http-cache-provider.js.map +1 -1
  235. package/dist/util/http/cache/package-http-cache-provider.js +2 -1
  236. package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
  237. package/dist/util/http/github.js +15 -11
  238. package/dist/util/http/github.js.map +1 -1
  239. package/dist/util/http/gitlab.js +5 -4
  240. package/dist/util/http/gitlab.js.map +1 -1
  241. package/dist/util/http/http.js +2 -1
  242. package/dist/util/http/http.js.map +1 -1
  243. package/dist/util/http/jwt.js +2 -1
  244. package/dist/util/http/jwt.js.map +1 -1
  245. package/dist/util/http/retry-after.js +2 -1
  246. package/dist/util/http/retry-after.js.map +1 -1
  247. package/dist/util/http/status.js +95 -0
  248. package/dist/util/http/status.js.map +1 -0
  249. package/dist/util/merge-confidence/index.js +3 -2
  250. package/dist/util/merge-confidence/index.js.map +1 -1
  251. package/dist/util/package-rules/current-version.js +4 -1
  252. package/dist/util/package-rules/current-version.js.map +1 -1
  253. package/dist/util/package-rules/index.js +7 -3
  254. package/dist/util/package-rules/index.js.map +1 -1
  255. package/dist/util/schema-utils/index.js +5 -0
  256. package/dist/util/schema-utils/index.js.map +1 -1
  257. package/dist/workers/global/config/parse/host-rules-from-env.js +2 -1
  258. package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
  259. package/dist/workers/repository/common.js +4 -1
  260. package/dist/workers/repository/common.js.map +1 -1
  261. package/dist/workers/repository/config-migration/branch/index.js +2 -1
  262. package/dist/workers/repository/config-migration/branch/index.js.map +1 -1
  263. package/dist/workers/repository/dependency-dashboard.js +6 -2
  264. package/dist/workers/repository/dependency-dashboard.js.map +1 -1
  265. package/dist/workers/repository/finalize/repository-statistics.js +4 -1
  266. package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
  267. package/dist/workers/repository/init/merge.js +13 -3
  268. package/dist/workers/repository/init/merge.js.map +1 -1
  269. package/dist/workers/repository/onboarding/branch/check.js +2 -1
  270. package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
  271. package/dist/workers/repository/onboarding/pr/pr-list.js +4 -2
  272. package/dist/workers/repository/onboarding/pr/pr-list.js.map +1 -1
  273. package/dist/workers/repository/process/extract-update.js +4 -1
  274. package/dist/workers/repository/process/extract-update.js.map +1 -1
  275. package/dist/workers/repository/process/lookup/digest.js +2 -1
  276. package/dist/workers/repository/process/lookup/digest.js.map +1 -1
  277. package/dist/workers/repository/process/lookup/generate.js +1 -1
  278. package/dist/workers/repository/process/lookup/generate.js.map +1 -1
  279. package/dist/workers/repository/process/lookup/index.js +4 -1
  280. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  281. package/dist/workers/repository/process/lookup/utils.js +7 -1
  282. package/dist/workers/repository/process/lookup/utils.js.map +1 -1
  283. package/dist/workers/repository/process/vulnerabilities.js +10 -3
  284. package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
  285. package/dist/workers/repository/reconfigure/index.js +2 -1
  286. package/dist/workers/repository/reconfigure/index.js.map +1 -1
  287. package/dist/workers/repository/update/branch/auto-replace.js +6 -2
  288. package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
  289. package/dist/workers/repository/update/branch/errors.js +2 -1
  290. package/dist/workers/repository/update/branch/errors.js.map +1 -1
  291. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +2 -2
  292. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
  293. package/dist/workers/repository/update/branch/get-updated.js +1 -2
  294. package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
  295. package/dist/workers/repository/update/branch/index.js +2 -1
  296. package/dist/workers/repository/update/branch/index.js.map +1 -1
  297. package/dist/workers/repository/update/branch/status-checks.js +2 -1
  298. package/dist/workers/repository/update/branch/status-checks.js.map +1 -1
  299. package/dist/workers/repository/update/pr/body/index.js.map +1 -1
  300. package/dist/workers/repository/update/pr/changelog/release-notes.js +3 -2
  301. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  302. package/dist/workers/repository/update/pr/index.js +7 -3
  303. package/dist/workers/repository/update/pr/index.js.map +1 -1
  304. package/dist/workers/repository/updates/generate.js +6 -3
  305. package/dist/workers/repository/updates/generate.js.map +1 -1
  306. package/package.json +2 -2
  307. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/gradle/artifacts.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n exec,\n getToolSettingsOptions,\n gradleJvmArg,\n} from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n findUpLocal,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getFiles, getRepoStatus } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { scm } from '../../platform/scm.ts';\nimport {\n extraEnv,\n extractGradleVersion,\n getJavaConstraint,\n gradleWrapperFileName,\n prepareGradleCommand,\n} from '../gradle-wrapper/utils.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport {\n isGcvLockFile,\n isGcvPropsFile,\n} from './extract/consistent-versions-plugin.ts';\nimport { isGradleBuildFile } from './utils.ts';\n\nexport function isGradleExecutionAllowed(command: string): boolean {\n const allowlist = GlobalConfig.get('allowedUnsafeExecutions');\n\n if (!allowlist.includes('gradleWrapper')) {\n logger.once.warn(\n { command },\n 'Gradle wrapper command was requested to run, but `gradleWrapper` is not permitted in the allowedUnsafeExecutions',\n );\n return false;\n }\n\n return true;\n}\n\n// .lockfile is gradle default lockfile, /versions.lock is gradle-consistent-versions plugin lockfile\nfunction isLockFile(fileName: string): boolean {\n return fileName.endsWith('.lockfile') || isGcvLockFile(fileName);\n}\n\nasync function getUpdatedLockfiles(\n oldLockFileContentMap: Record<string, string | null>,\n): Promise<UpdateArtifactsResult[]> {\n const res: UpdateArtifactsResult[] = [];\n\n const status = await getRepoStatus();\n\n for (const modifiedFile of status.modified) {\n if (\n isLockFile(modifiedFile) ||\n modifiedFile.endsWith('gradle/verification-metadata.xml')\n ) {\n const newContent = await readLocalFile(modifiedFile, 'utf8');\n if (oldLockFileContentMap[modifiedFile] !== newContent) {\n res.push({\n file: {\n type: 'addition',\n path: modifiedFile,\n contents: newContent,\n },\n });\n }\n }\n }\n\n return res;\n}\n\nasync function getSubProjectList(\n cmd: string,\n execOptions: ExecOptions,\n): Promise<string[]> {\n const subprojects = ['']; // = root project\n const subprojectsRegex = regEx(/^[ \\t]*subprojects: \\[(?<subprojects>.+)\\]/m);\n\n const gradleProperties = await exec(`${cmd} properties`, execOptions);\n const subprojectsMatch = gradleProperties.stdout.match(subprojectsRegex);\n if (subprojectsMatch?.groups?.subprojects) {\n const projectRegex = regEx(/project '(?<name>.+?)'/g);\n const matches = subprojectsMatch.groups.subprojects.matchAll(projectRegex);\n for (const match of matches) {\n subprojects.push(match.groups!.name);\n }\n }\n\n return subprojects;\n}\n\nasync function getGradleVersion(gradlewFile: string): Promise<string | null> {\n const propertiesFile = upath.join(\n upath.dirname(gradlewFile),\n 'gradle/wrapper/gradle-wrapper.properties',\n );\n const properties = await readLocalFile(propertiesFile, 'utf8');\n const extractResult = extractGradleVersion(properties ?? '');\n\n return extractResult ? extractResult.version : null;\n}\n\nasync function buildUpdateVerificationMetadataCmd(\n verificationMetadataFile: string | undefined,\n baseCmd: string,\n): Promise<string | null> {\n if (!verificationMetadataFile) {\n return null;\n }\n\n const verificationMetadata = await readLocalFile(verificationMetadataFile);\n const verifiesChecksums = verificationMetadata?.includes(\n '<verify-metadata>true</verify-metadata>',\n );\n const verifiesSignatures = verificationMetadata?.includes(\n '<verify-signatures>true</verify-signatures>',\n );\n\n const hashTypes = ['sha256', 'sha512'].filter((type) =>\n verificationMetadata?.includes(`<${type} `),\n );\n\n if (verifiesChecksums || hashTypes.length) {\n logger.debug(\n 'Dependency metadata verification enabled or checksums present - generating checksums',\n );\n }\n\n if ((verifiesChecksums || verifiesSignatures) && !hashTypes.length) {\n // fallback algorithm for pgp and in case a weak algorithm (md5, sha1) is used for checksums\n hashTypes.push('sha256');\n }\n\n if (verifiesSignatures) {\n logger.debug(\n 'Dependency signature verification enabled - generating PGP signatures',\n );\n hashTypes.push('pgp');\n }\n\n if (!hashTypes.length) {\n return null;\n }\n\n return `${baseCmd} --write-verification-metadata ${hashTypes.join(',')} dependencies`;\n}\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`gradle.updateArtifacts(${packageFileName})`);\n\n const fileList = await scm.getFileList();\n const lockFiles = fileList.filter((file) => isLockFile(file));\n const verificationMetadataFile = fileList.find((fileName) =>\n fileName.endsWith('gradle/verification-metadata.xml'),\n );\n if (!lockFiles.length && !verificationMetadataFile) {\n logger.debug(\n 'No Gradle dependency lockfiles or verification metadata found - skipping update',\n );\n return null;\n }\n\n const gradlewName = gradleWrapperFileName();\n const gradlewFile = await findUpLocal(\n gradlewName,\n upath.dirname(packageFileName),\n );\n if (!gradlewFile) {\n logger.debug(\n 'Found Gradle dependency lockfiles but no gradlew - aborting update',\n );\n return null;\n }\n\n if (\n config.isLockFileMaintenance &&\n (!isGradleBuildFile(packageFileName) ||\n upath.dirname(packageFileName) !== upath.dirname(gradlewFile))\n ) {\n logger.trace(\n 'No build.gradle(.kts) file or not in root project - skipping lock file maintenance',\n );\n return null;\n }\n\n if (!isGradleExecutionAllowed(gradlewFile)) {\n logger.trace(\n 'Not allowed to execute gradle due to allowedUnsafeExecutions - aborting update',\n );\n return null;\n }\n\n logger.debug('Updating found Gradle dependency lockfiles');\n\n try {\n const oldLockFileContentMap = await getFiles(lockFiles);\n await prepareGradleCommand(gradlewFile);\n\n const baseCmd = `${gradlewName}${gradleJvmArg(getToolSettingsOptions(config.toolSettings))} --console=plain --dependency-verification lenient -q`;\n const execOptions: ExecOptions = {\n cwdFile: gradlewFile,\n docker: {},\n extraEnv,\n toolConstraints: [\n {\n toolName: 'java',\n constraint: await resolveToolConstraint(config, 'java', async () =>\n getJavaConstraint(await getGradleVersion(gradlewFile), gradlewFile),\n ),\n },\n ],\n };\n\n const cmds = [];\n if (lockFiles.length) {\n const subprojects = await getSubProjectList(baseCmd, execOptions);\n let lockfileCmd = `${baseCmd} ${subprojects\n .map((project) => `${project}:dependencies`)\n .map(quote)\n .join(' ')}`;\n\n if (\n config.isLockFileMaintenance === true ||\n !updatedDeps.length ||\n isGcvPropsFile(packageFileName)\n ) {\n lockfileCmd += ' --write-locks';\n } else {\n const updatedDepNames = updatedDeps\n .map(({ depName, packageName }) => packageName ?? depName)\n .filter(isNonEmptyStringAndNotWhitespace);\n\n lockfileCmd += ` --update-locks ${updatedDepNames\n .map(quote)\n .join(',')}`;\n }\n cmds.push(lockfileCmd);\n }\n\n const updateVerificationMetadataCmd =\n await buildUpdateVerificationMetadataCmd(\n verificationMetadataFile,\n baseCmd,\n );\n if (updateVerificationMetadataCmd) {\n cmds.push(updateVerificationMetadataCmd);\n }\n\n if (!cmds.length) {\n logger.debug('No lockfile or verification metadata update necessary');\n return null;\n }\n\n await writeLocalFile(packageFileName, newPackageFileContent);\n await exec(cmds, { ...execOptions, ignoreStdout: true });\n\n const res = await getUpdatedLockfiles(oldLockFileContentMap);\n logger.debug('Returning updated Gradle dependency lockfiles');\n\n return res.length > 0 ? res : null;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n\n logger.debug({ err }, 'Error while updating Gradle dependency lockfiles');\n return [\n {\n artifactError: {\n fileName: packageFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/gradle/artifacts.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n exec,\n getToolSettingsOptions,\n gradleJvmArg,\n} from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n findUpLocal,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getFiles, getRepoStatus } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { scm } from '../../platform/scm.ts';\nimport {\n extraEnv,\n extractGradleVersion,\n getJavaConstraint,\n gradleWrapperFileName,\n prepareGradleCommand,\n} from '../gradle-wrapper/utils.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport {\n isGcvLockFile,\n isGcvPropsFile,\n} from './extract/consistent-versions-plugin.ts';\nimport { isGradleBuildFile } from './utils.ts';\n\nexport function isGradleExecutionAllowed(command: string): boolean {\n const allowlist = GlobalConfig.get('allowedUnsafeExecutions');\n\n if (!allowlist.includes('gradleWrapper')) {\n logger.once.warn(\n { command },\n 'Gradle wrapper command was requested to run, but `gradleWrapper` is not permitted in the allowedUnsafeExecutions',\n );\n return false;\n }\n\n return true;\n}\n\nfunction isRootBuildFile(\n packageFileName: string,\n gradlewFile: string,\n): boolean {\n return (\n isGradleBuildFile(packageFileName) &&\n upath.dirname(packageFileName) === upath.dirname(gradlewFile)\n );\n}\n\n// .lockfile is gradle default lockfile, /versions.lock is gradle-consistent-versions plugin lockfile\nfunction isLockFile(fileName: string): boolean {\n return fileName.endsWith('.lockfile') || isGcvLockFile(fileName);\n}\n\nasync function getUpdatedLockfiles(\n oldLockFileContentMap: Record<string, string | null>,\n): Promise<UpdateArtifactsResult[]> {\n const res: UpdateArtifactsResult[] = [];\n\n const status = await getRepoStatus();\n\n for (const modifiedFile of status.modified) {\n if (\n isLockFile(modifiedFile) ||\n modifiedFile.endsWith('gradle/verification-metadata.xml')\n ) {\n const newContent = await readLocalFile(modifiedFile, 'utf8');\n if (oldLockFileContentMap[modifiedFile] !== newContent) {\n res.push({\n file: {\n type: 'addition',\n path: modifiedFile,\n contents: newContent,\n },\n });\n }\n }\n }\n\n return res;\n}\n\nasync function getSubProjectList(\n cmd: string,\n execOptions: ExecOptions,\n): Promise<string[]> {\n const subprojects = ['']; // = root project\n const subprojectsRegex = regEx(/^[ \\t]*subprojects: \\[(?<subprojects>.+)\\]/m);\n\n const gradleProperties = await exec(`${cmd} properties`, execOptions);\n const subprojectsMatch = gradleProperties.stdout.match(subprojectsRegex);\n if (subprojectsMatch?.groups?.subprojects) {\n const projectRegex = regEx(/project '(?<name>.+?)'/g);\n const matches = subprojectsMatch.groups.subprojects.matchAll(projectRegex);\n for (const match of matches) {\n subprojects.push(match.groups!.name);\n }\n }\n\n return subprojects;\n}\n\nasync function getGradleVersion(gradlewFile: string): Promise<string | null> {\n const propertiesFile = upath.join(\n upath.dirname(gradlewFile),\n 'gradle/wrapper/gradle-wrapper.properties',\n );\n const properties = await readLocalFile(propertiesFile, 'utf8');\n const extractResult = extractGradleVersion(properties ?? '');\n\n return extractResult ? extractResult.version : null;\n}\n\nasync function buildUpdateVerificationMetadataCmd(\n verificationMetadataFile: string | undefined,\n baseCmd: string,\n): Promise<string | null> {\n if (!verificationMetadataFile) {\n return null;\n }\n\n const verificationMetadata = await readLocalFile(verificationMetadataFile);\n const verifiesChecksums = verificationMetadata?.includes(\n '<verify-metadata>true</verify-metadata>',\n );\n const verifiesSignatures = verificationMetadata?.includes(\n '<verify-signatures>true</verify-signatures>',\n );\n\n const hashTypes = ['sha256', 'sha512'].filter((type) =>\n verificationMetadata?.includes(`<${type} `),\n );\n\n if (verifiesChecksums || hashTypes.length) {\n logger.debug(\n 'Dependency metadata verification enabled or checksums present - generating checksums',\n );\n }\n\n const verifiesIntegrity = !!verifiesChecksums || !!verifiesSignatures;\n if (verifiesIntegrity && !hashTypes.length) {\n // fallback algorithm for pgp and in case a weak algorithm (md5, sha1) is used for checksums\n hashTypes.push('sha256');\n }\n\n if (verifiesSignatures) {\n logger.debug(\n 'Dependency signature verification enabled - generating PGP signatures',\n );\n hashTypes.push('pgp');\n }\n\n if (!hashTypes.length) {\n return null;\n }\n\n return `${baseCmd} --write-verification-metadata ${hashTypes.join(',')} dependencies`;\n}\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`gradle.updateArtifacts(${packageFileName})`);\n\n const fileList = await scm.getFileList();\n const lockFiles = fileList.filter((file) => isLockFile(file));\n const verificationMetadataFile = fileList.find((fileName) =>\n fileName.endsWith('gradle/verification-metadata.xml'),\n );\n if (!lockFiles.length && !verificationMetadataFile) {\n logger.debug(\n 'No Gradle dependency lockfiles or verification metadata found - skipping update',\n );\n return null;\n }\n\n const gradlewName = gradleWrapperFileName();\n const gradlewFile = await findUpLocal(\n gradlewName,\n upath.dirname(packageFileName),\n );\n if (!gradlewFile) {\n logger.debug(\n 'Found Gradle dependency lockfiles but no gradlew - aborting update',\n );\n return null;\n }\n\n if (\n config.isLockFileMaintenance &&\n !isRootBuildFile(packageFileName, gradlewFile)\n ) {\n logger.trace(\n 'No build.gradle(.kts) file or not in root project - skipping lock file maintenance',\n );\n return null;\n }\n\n if (!isGradleExecutionAllowed(gradlewFile)) {\n logger.trace(\n 'Not allowed to execute gradle due to allowedUnsafeExecutions - aborting update',\n );\n return null;\n }\n\n logger.debug('Updating found Gradle dependency lockfiles');\n\n try {\n const oldLockFileContentMap = await getFiles(lockFiles);\n await prepareGradleCommand(gradlewFile);\n\n const baseCmd = `${gradlewName}${gradleJvmArg(getToolSettingsOptions(config.toolSettings))} --console=plain --dependency-verification lenient -q`;\n const execOptions: ExecOptions = {\n cwdFile: gradlewFile,\n docker: {},\n extraEnv,\n toolConstraints: [\n {\n toolName: 'java',\n constraint: await resolveToolConstraint(config, 'java', async () =>\n getJavaConstraint(await getGradleVersion(gradlewFile), gradlewFile),\n ),\n },\n ],\n };\n\n const cmds = [];\n if (lockFiles.length) {\n const subprojects = await getSubProjectList(baseCmd, execOptions);\n let lockfileCmd = `${baseCmd} ${subprojects\n .map((project) => `${project}:dependencies`)\n .map(quote)\n .join(' ')}`;\n\n if (\n config.isLockFileMaintenance === true ||\n !updatedDeps.length ||\n isGcvPropsFile(packageFileName)\n ) {\n lockfileCmd += ' --write-locks';\n } else {\n const updatedDepNames = updatedDeps\n .map(({ depName, packageName }) => packageName ?? depName)\n .filter(isNonEmptyStringAndNotWhitespace);\n\n lockfileCmd += ` --update-locks ${updatedDepNames\n .map(quote)\n .join(',')}`;\n }\n cmds.push(lockfileCmd);\n }\n\n const updateVerificationMetadataCmd =\n await buildUpdateVerificationMetadataCmd(\n verificationMetadataFile,\n baseCmd,\n );\n if (updateVerificationMetadataCmd) {\n cmds.push(updateVerificationMetadataCmd);\n }\n\n if (!cmds.length) {\n logger.debug('No lockfile or verification metadata update necessary');\n return null;\n }\n\n await writeLocalFile(packageFileName, newPackageFileContent);\n await exec(cmds, { ...execOptions, ignoreStdout: true });\n\n const res = await getUpdatedLockfiles(oldLockFileContentMap);\n logger.debug('Returning updated Gradle dependency lockfiles');\n\n return res.length > 0 ? res : null;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n\n logger.debug({ err }, 'Error while updating Gradle dependency lockfiles');\n return [\n {\n artifactError: {\n fileName: packageFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
@@ -18,7 +18,8 @@ function isDependencyString(input) {
18
18
  const parts = depNotation.split(":");
19
19
  if (parts.length !== 3 && parts.length !== 4) return false;
20
20
  const [groupId, artifactId, version, classifier] = parts;
21
- return !!(groupId && artifactId && version && artifactRegex.test(groupId) && artifactRegex.test(artifactId) && (!classifier || artifactRegex.test(classifier)) && version === versionLikeSubstring(version));
21
+ const isValidClassifier = !classifier || artifactRegex.test(classifier);
22
+ return !!(groupId && artifactId && version && artifactRegex.test(groupId) && artifactRegex.test(artifactId) && isValidClassifier && version === versionLikeSubstring(version));
22
23
  }
23
24
  function isGroupArtifactString(input) {
24
25
  const parts = input.split(":");
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["gradleVersioning"],"sources":["../../../../lib/modules/manager/gradle/utils.ts"],"sourcesContent":["import upath from 'upath';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as gradleVersioning } from '../../versioning/gradle/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type {\n GradleManagerData,\n PackageVariables,\n VariableRegistry,\n} from './types.ts';\n\nconst artifactRegex = regEx(\n '^[a-zA-Z][-_a-zA-Z0-9]*(?:\\\\.[a-zA-Z0-9][-_a-zA-Z0-9]*?)*$',\n);\n\nconst versionLikeRegex = regEx('^(?<version>[-_.\\\\[\\\\](),a-zA-Z0-9+! ]+)');\n\n// Extracts version-like and range-like strings from the beginning of input\nexport function versionLikeSubstring(\n input: string | null | undefined,\n): string | null {\n if (!input) {\n return null;\n }\n\n const match = versionLikeRegex.exec(input);\n const version = match?.groups?.version?.trim();\n if (!version || !regEx(/\\d/).test(version)) {\n return null;\n }\n\n if (!gradleVersioning.isValid(version)) {\n return null;\n }\n\n return version;\n}\n\nexport function isDependencyString(input: string): boolean {\n const [depNotation, ...extra] = input.split('@');\n if (extra.length > 1) {\n return false;\n }\n\n const parts = depNotation.split(':');\n if (parts.length !== 3 && parts.length !== 4) {\n return false;\n }\n\n const [groupId, artifactId, version, classifier] = parts;\n\n return !!(\n groupId &&\n artifactId &&\n version &&\n artifactRegex.test(groupId) &&\n artifactRegex.test(artifactId) &&\n (!classifier || artifactRegex.test(classifier)) &&\n version === versionLikeSubstring(version)\n );\n}\n\n// Matches the `group:artifact` notation used by dependencies whose version is\n// declared separately, e.g. inside a rich version constraint block\nexport function isGroupArtifactString(input: string): boolean {\n const parts = input.split(':');\n if (parts.length !== 2) {\n return false;\n }\n\n const [groupId, artifactId] = parts;\n\n return !!(\n groupId &&\n artifactId &&\n artifactRegex.test(groupId) &&\n artifactRegex.test(artifactId)\n );\n}\n\nexport function parseDependencyString(\n input: string,\n): PackageDependency<GradleManagerData> | null {\n if (!isDependencyString(input)) {\n return null;\n }\n\n const [depNotation, dataType] = input.split('@');\n const [groupId, artifactId, currentValue] = depNotation.split(':');\n\n return {\n depName: `${groupId}:${artifactId}`,\n currentValue,\n ...(dataType && { dataType }),\n };\n}\n\nconst gradleVersionsFileRegex = regEx('^versions\\\\.gradle(?:\\\\.kts)?$', 'i');\nconst gradleBuildFileRegex = regEx('^build\\\\.gradle(?:\\\\.kts)?$', 'i');\nconst gradleSettingsFileRegex = regEx('^settings\\\\.gradle(?:\\\\.kts)?$', 'i');\n\nexport function isGradleScriptFile(path: string): boolean {\n const filename = upath.basename(path).toLowerCase();\n return filename.endsWith('.gradle.kts') || filename.endsWith('.gradle');\n}\n\nexport function isGradleVersionsFile(path: string): boolean {\n const filename = upath.basename(path);\n return gradleVersionsFileRegex.test(filename);\n}\n\nexport function isGradleBuildFile(path: string): boolean {\n const filename = upath.basename(path);\n return gradleBuildFileRegex.test(filename);\n}\n\nexport function isGradleSettingsFile(path: string): boolean {\n const filename = upath.basename(path);\n return gradleSettingsFileRegex.test(filename);\n}\n\nexport function isGradleDefaultCatalogFile(path: string): boolean {\n return path.endsWith('/gradle/libs.versions.toml');\n}\n\nexport function isPropsFile(path: string): boolean {\n const filename = upath.basename(path).toLowerCase();\n return filename === 'gradle.properties';\n}\n\nexport function isKotlinSourceFile(path: string): boolean {\n const filename = upath.basename(path).toLowerCase();\n return filename.endsWith('.kt');\n}\n\nexport function isTOMLFile(path: string): boolean {\n const filename = upath.basename(path).toLowerCase();\n return filename.endsWith('.toml');\n}\n\nexport function toAbsolutePath(packageFile: string): string {\n return upath.join(packageFile.replace(regEx(/^[/\\\\]*/), '/'));\n}\n\nfunction getFileRank(filename: string): number {\n if (isPropsFile(filename)) {\n return 0;\n }\n if (isGradleSettingsFile(filename)) {\n return 1;\n }\n if (isGradleDefaultCatalogFile(filename)) {\n return 2;\n }\n if (isGradleVersionsFile(filename)) {\n return 3;\n }\n if (isGradleBuildFile(filename)) {\n return 5;\n }\n return 4;\n}\n\nexport function reorderFiles(packageFiles: string[]): string[] {\n return packageFiles\n .map((path) => {\n const absPath = toAbsolutePath(path);\n const currentDir = upath.dirname(absPath);\n\n return {\n path,\n absPath,\n dir: isGradleDefaultCatalogFile(absPath)\n ? upath.dirname(currentDir)\n : currentDir,\n rank: getFileRank(absPath),\n };\n })\n .sort((a, b) => {\n // Different directories: check parent-child relationship\n if (a.dir !== b.dir) {\n if (a.dir.startsWith(`${b.dir}/`)) {\n return 1;\n }\n if (b.dir.startsWith(`${a.dir}/`)) {\n return -1;\n }\n return a.dir.localeCompare(b.dir);\n }\n\n // Same effective directory: rank, if equal sort alphabetically\n return a.rank - b.rank || a.absPath.localeCompare(b.absPath);\n })\n .map((entry) => entry.path);\n}\n\nexport function getVars(\n registry: VariableRegistry,\n dir: string,\n vars: PackageVariables = registry[dir] || {},\n): PackageVariables {\n const dirAbs = toAbsolutePath(dir);\n const parentDir = upath.dirname(dirAbs);\n if (parentDir === dirAbs) {\n return vars;\n }\n const parentVars = registry[parentDir] || {};\n return getVars(registry, parentDir, { ...parentVars, ...vars });\n}\n\nexport function updateVars(\n registry: VariableRegistry,\n dir: string,\n newVars: PackageVariables,\n): void {\n const oldVars = coerceObject(registry[dir]);\n registry[dir] = { ...oldVars, ...newVars };\n}\n\nexport function updateVarsFromDefaultCatalog(\n registry: VariableRegistry,\n dir: string,\n packageFile: string,\n newVars: PackageVariables,\n): void {\n if (!isGradleDefaultCatalogFile(toAbsolutePath(packageFile))) {\n return;\n }\n\n const rootDir = upath.dirname(dir);\n const oldVars = coerceObject(registry[rootDir]);\n let defaultLibsExtName = 'libs';\n if (\n oldVars.defaultLibrariesExtensionName?.packageFile &&\n isGradleSettingsFile(oldVars.defaultLibrariesExtensionName.packageFile)\n ) {\n defaultLibsExtName = oldVars.defaultLibrariesExtensionName.value;\n }\n\n const newVarsRemapped: PackageVariables = {};\n for (const [oldKey, variableData] of Object.entries(newVars)) {\n const key = `${defaultLibsExtName}.versions.${oldKey}`;\n newVarsRemapped[key] = { ...variableData, key };\n }\n\n registry[rootDir] = { ...oldVars, ...newVarsRemapped };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["gradleVersioning"],"sources":["../../../../lib/modules/manager/gradle/utils.ts"],"sourcesContent":["import upath from 'upath';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as gradleVersioning } from '../../versioning/gradle/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type {\n GradleManagerData,\n PackageVariables,\n VariableRegistry,\n} from './types.ts';\n\nconst artifactRegex = regEx(\n '^[a-zA-Z][-_a-zA-Z0-9]*(?:\\\\.[a-zA-Z0-9][-_a-zA-Z0-9]*?)*$',\n);\n\nconst versionLikeRegex = regEx('^(?<version>[-_.\\\\[\\\\](),a-zA-Z0-9+! ]+)');\n\n// Extracts version-like and range-like strings from the beginning of input\nexport function versionLikeSubstring(\n input: string | null | undefined,\n): string | null {\n if (!input) {\n return null;\n }\n\n const match = versionLikeRegex.exec(input);\n const version = match?.groups?.version?.trim();\n if (!version || !regEx(/\\d/).test(version)) {\n return null;\n }\n\n if (!gradleVersioning.isValid(version)) {\n return null;\n }\n\n return version;\n}\n\nexport function isDependencyString(input: string): boolean {\n const [depNotation, ...extra] = input.split('@');\n if (extra.length > 1) {\n return false;\n }\n\n const parts = depNotation.split(':');\n if (parts.length !== 3 && parts.length !== 4) {\n return false;\n }\n\n const [groupId, artifactId, version, classifier] = parts;\n\n const isValidClassifier = !classifier || artifactRegex.test(classifier);\n\n return !!(\n groupId &&\n artifactId &&\n version &&\n artifactRegex.test(groupId) &&\n artifactRegex.test(artifactId) &&\n isValidClassifier &&\n version === versionLikeSubstring(version)\n );\n}\n\n// Matches the `group:artifact` notation used by dependencies whose version is\n// declared separately, e.g. inside a rich version constraint block\nexport function isGroupArtifactString(input: string): boolean {\n const parts = input.split(':');\n if (parts.length !== 2) {\n return false;\n }\n\n const [groupId, artifactId] = parts;\n\n return !!(\n groupId &&\n artifactId &&\n artifactRegex.test(groupId) &&\n artifactRegex.test(artifactId)\n );\n}\n\nexport function parseDependencyString(\n input: string,\n): PackageDependency<GradleManagerData> | null {\n if (!isDependencyString(input)) {\n return null;\n }\n\n const [depNotation, dataType] = input.split('@');\n const [groupId, artifactId, currentValue] = depNotation.split(':');\n\n return {\n depName: `${groupId}:${artifactId}`,\n currentValue,\n ...(dataType && { dataType }),\n };\n}\n\nconst gradleVersionsFileRegex = regEx('^versions\\\\.gradle(?:\\\\.kts)?$', 'i');\nconst gradleBuildFileRegex = regEx('^build\\\\.gradle(?:\\\\.kts)?$', 'i');\nconst gradleSettingsFileRegex = regEx('^settings\\\\.gradle(?:\\\\.kts)?$', 'i');\n\nexport function isGradleScriptFile(path: string): boolean {\n const filename = upath.basename(path).toLowerCase();\n return filename.endsWith('.gradle.kts') || filename.endsWith('.gradle');\n}\n\nexport function isGradleVersionsFile(path: string): boolean {\n const filename = upath.basename(path);\n return gradleVersionsFileRegex.test(filename);\n}\n\nexport function isGradleBuildFile(path: string): boolean {\n const filename = upath.basename(path);\n return gradleBuildFileRegex.test(filename);\n}\n\nexport function isGradleSettingsFile(path: string): boolean {\n const filename = upath.basename(path);\n return gradleSettingsFileRegex.test(filename);\n}\n\nexport function isGradleDefaultCatalogFile(path: string): boolean {\n return path.endsWith('/gradle/libs.versions.toml');\n}\n\nexport function isPropsFile(path: string): boolean {\n const filename = upath.basename(path).toLowerCase();\n return filename === 'gradle.properties';\n}\n\nexport function isKotlinSourceFile(path: string): boolean {\n const filename = upath.basename(path).toLowerCase();\n return filename.endsWith('.kt');\n}\n\nexport function isTOMLFile(path: string): boolean {\n const filename = upath.basename(path).toLowerCase();\n return filename.endsWith('.toml');\n}\n\nexport function toAbsolutePath(packageFile: string): string {\n return upath.join(packageFile.replace(regEx(/^[/\\\\]*/), '/'));\n}\n\nfunction getFileRank(filename: string): number {\n if (isPropsFile(filename)) {\n return 0;\n }\n if (isGradleSettingsFile(filename)) {\n return 1;\n }\n if (isGradleDefaultCatalogFile(filename)) {\n return 2;\n }\n if (isGradleVersionsFile(filename)) {\n return 3;\n }\n if (isGradleBuildFile(filename)) {\n return 5;\n }\n return 4;\n}\n\nexport function reorderFiles(packageFiles: string[]): string[] {\n return packageFiles\n .map((path) => {\n const absPath = toAbsolutePath(path);\n const currentDir = upath.dirname(absPath);\n\n return {\n path,\n absPath,\n dir: isGradleDefaultCatalogFile(absPath)\n ? upath.dirname(currentDir)\n : currentDir,\n rank: getFileRank(absPath),\n };\n })\n .sort((a, b) => {\n // Different directories: check parent-child relationship\n if (a.dir !== b.dir) {\n if (a.dir.startsWith(`${b.dir}/`)) {\n return 1;\n }\n if (b.dir.startsWith(`${a.dir}/`)) {\n return -1;\n }\n return a.dir.localeCompare(b.dir);\n }\n\n // Same effective directory: rank, if equal sort alphabetically\n return a.rank - b.rank || a.absPath.localeCompare(b.absPath);\n })\n .map((entry) => entry.path);\n}\n\nexport function getVars(\n registry: VariableRegistry,\n dir: string,\n vars: PackageVariables = registry[dir] || {},\n): PackageVariables {\n const dirAbs = toAbsolutePath(dir);\n const parentDir = upath.dirname(dirAbs);\n if (parentDir === dirAbs) {\n return vars;\n }\n const parentVars = registry[parentDir] || {};\n return getVars(registry, parentDir, { ...parentVars, ...vars });\n}\n\nexport function updateVars(\n registry: VariableRegistry,\n dir: string,\n newVars: PackageVariables,\n): void {\n const oldVars = coerceObject(registry[dir]);\n registry[dir] = { ...oldVars, ...newVars };\n}\n\nexport function updateVarsFromDefaultCatalog(\n registry: VariableRegistry,\n dir: string,\n packageFile: string,\n newVars: PackageVariables,\n): void {\n if (!isGradleDefaultCatalogFile(toAbsolutePath(packageFile))) {\n return;\n }\n\n const rootDir = upath.dirname(dir);\n const oldVars = coerceObject(registry[rootDir]);\n let defaultLibsExtName = 'libs';\n if (\n oldVars.defaultLibrariesExtensionName?.packageFile &&\n isGradleSettingsFile(oldVars.defaultLibrariesExtensionName.packageFile)\n ) {\n defaultLibsExtName = oldVars.defaultLibrariesExtensionName.value;\n }\n\n const newVarsRemapped: PackageVariables = {};\n for (const [oldKey, variableData] of Object.entries(newVars)) {\n const key = `${defaultLibsExtName}.versions.${oldKey}`;\n newVarsRemapped[key] = { ...variableData, key };\n }\n\n registry[rootDir] = { ...oldVars, ...newVarsRemapped };\n}\n"],"mappings":";;;;;AAWA,MAAM,gBAAgB,MACpB,4DACF;AAEA,MAAM,mBAAmB,MAAM,0CAA0C;AAGzE,SAAgB,qBACd,OACe;CACf,IAAI,CAAC,OACH,OAAO;CAIT,MAAM,UADQ,iBAAiB,KAAK,KAChB,CAAC,EAAE,QAAQ,SAAS,KAAK;CAC7C,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,OAAO,GACvC,OAAO;CAGT,IAAI,CAACA,IAAiB,QAAQ,OAAO,GACnC,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,mBAAmB,OAAwB;CACzD,MAAM,CAAC,aAAa,GAAG,SAAS,MAAM,MAAM,GAAG;CAC/C,IAAI,MAAM,SAAS,GACjB,OAAO;CAGT,MAAM,QAAQ,YAAY,MAAM,GAAG;CACnC,IAAI,MAAM,WAAW,KAAK,MAAM,WAAW,GACzC,OAAO;CAGT,MAAM,CAAC,SAAS,YAAY,SAAS,cAAc;CAEnD,MAAM,oBAAoB,CAAC,cAAc,cAAc,KAAK,UAAU;CAEtE,OAAO,CAAC,EACN,WACA,cACA,WACA,cAAc,KAAK,OAAO,KAC1B,cAAc,KAAK,UAAU,KAC7B,qBACA,YAAY,qBAAqB,OAAO;AAE5C;AAIA,SAAgB,sBAAsB,OAAwB;CAC5D,MAAM,QAAQ,MAAM,MAAM,GAAG;CAC7B,IAAI,MAAM,WAAW,GACnB,OAAO;CAGT,MAAM,CAAC,SAAS,cAAc;CAE9B,OAAO,CAAC,EACN,WACA,cACA,cAAc,KAAK,OAAO,KAC1B,cAAc,KAAK,UAAU;AAEjC;AAEA,SAAgB,sBACd,OAC6C;CAC7C,IAAI,CAAC,mBAAmB,KAAK,GAC3B,OAAO;CAGT,MAAM,CAAC,aAAa,YAAY,MAAM,MAAM,GAAG;CAC/C,MAAM,CAAC,SAAS,YAAY,gBAAgB,YAAY,MAAM,GAAG;CAEjE,OAAO;EACL,SAAS,GAAG,QAAQ,GAAG;EACvB;EACA,GAAI,YAAY,EAAE,SAAS;CAC7B;AACF;AAEA,MAAM,0BAA0B,MAAM,kCAAkC,GAAG;AAC3E,MAAM,uBAAuB,MAAM,+BAA+B,GAAG;AACrE,MAAM,0BAA0B,MAAM,kCAAkC,GAAG;AAE3E,SAAgB,mBAAmB,MAAuB;CACxD,MAAM,WAAW,MAAM,SAAS,IAAI,CAAC,CAAC,YAAY;CAClD,OAAO,SAAS,SAAS,aAAa,KAAK,SAAS,SAAS,SAAS;AACxE;AAEA,SAAgB,qBAAqB,MAAuB;CAC1D,MAAM,WAAW,MAAM,SAAS,IAAI;CACpC,OAAO,wBAAwB,KAAK,QAAQ;AAC9C;AAEA,SAAgB,kBAAkB,MAAuB;CACvD,MAAM,WAAW,MAAM,SAAS,IAAI;CACpC,OAAO,qBAAqB,KAAK,QAAQ;AAC3C;AAEA,SAAgB,qBAAqB,MAAuB;CAC1D,MAAM,WAAW,MAAM,SAAS,IAAI;CACpC,OAAO,wBAAwB,KAAK,QAAQ;AAC9C;AAEA,SAAgB,2BAA2B,MAAuB;CAChE,OAAO,KAAK,SAAS,4BAA4B;AACnD;AAEA,SAAgB,YAAY,MAAuB;CAEjD,OADiB,MAAM,SAAS,IAAI,CAAC,CAAC,YACxB,MAAM;AACtB;AAEA,SAAgB,mBAAmB,MAAuB;CAExD,OADiB,MAAM,SAAS,IAAI,CAAC,CAAC,YACxB,CAAC,CAAC,SAAS,KAAK;AAChC;AAEA,SAAgB,WAAW,MAAuB;CAEhD,OADiB,MAAM,SAAS,IAAI,CAAC,CAAC,YACxB,CAAC,CAAC,SAAS,OAAO;AAClC;AAEA,SAAgB,eAAe,aAA6B;CAC1D,OAAO,MAAM,KAAK,YAAY,QAAQ,MAAM,SAAS,GAAG,GAAG,CAAC;AAC9D;AAEA,SAAS,YAAY,UAA0B;CAC7C,IAAI,YAAY,QAAQ,GACtB,OAAO;CAET,IAAI,qBAAqB,QAAQ,GAC/B,OAAO;CAET,IAAI,2BAA2B,QAAQ,GACrC,OAAO;CAET,IAAI,qBAAqB,QAAQ,GAC/B,OAAO;CAET,IAAI,kBAAkB,QAAQ,GAC5B,OAAO;CAET,OAAO;AACT;AAEA,SAAgB,aAAa,cAAkC;CAC7D,OAAO,aACJ,KAAK,SAAS;EACb,MAAM,UAAU,eAAe,IAAI;EACnC,MAAM,aAAa,MAAM,QAAQ,OAAO;EAExC,OAAO;GACL;GACA;GACA,KAAK,2BAA2B,OAAO,IACnC,MAAM,QAAQ,UAAU,IACxB;GACJ,MAAM,YAAY,OAAO;EAC3B;CACF,CAAC,CAAC,CACD,MAAM,GAAG,MAAM;EAEd,IAAI,EAAE,QAAQ,EAAE,KAAK;GACnB,IAAI,EAAE,IAAI,WAAW,GAAG,EAAE,IAAI,EAAE,GAC9B,OAAO;GAET,IAAI,EAAE,IAAI,WAAW,GAAG,EAAE,IAAI,EAAE,GAC9B,OAAO;GAET,OAAO,EAAE,IAAI,cAAc,EAAE,GAAG;EAClC;EAGA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,cAAc,EAAE,OAAO;CAC7D,CAAC,CAAC,CACD,KAAK,UAAU,MAAM,IAAI;AAC9B;AAEA,SAAgB,QACd,UACA,KACA,OAAyB,SAAS,QAAQ,CAAC,GACzB;CAClB,MAAM,SAAS,eAAe,GAAG;CACjC,MAAM,YAAY,MAAM,QAAQ,MAAM;CACtC,IAAI,cAAc,QAChB,OAAO;CAGT,OAAO,QAAQ,UAAU,WAAW;EAAE,GADnB,SAAS,cAAc,CAAC;EACU,GAAG;CAAK,CAAC;AAChE;AAEA,SAAgB,WACd,UACA,KACA,SACM;CAEN,SAAS,OAAO;EAAE,GADF,aAAa,SAAS,IACX;EAAG,GAAG;CAAQ;AAC3C;AAEA,SAAgB,6BACd,UACA,KACA,aACA,SACM;CACN,IAAI,CAAC,2BAA2B,eAAe,WAAW,CAAC,GACzD;CAGF,MAAM,UAAU,MAAM,QAAQ,GAAG;CACjC,MAAM,UAAU,aAAa,SAAS,QAAQ;CAC9C,IAAI,qBAAqB;CACzB,IACE,QAAQ,+BAA+B,eACvC,qBAAqB,QAAQ,8BAA8B,WAAW,GAEtE,qBAAqB,QAAQ,8BAA8B;CAG7D,MAAM,kBAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,QAAQ,iBAAiB,OAAO,QAAQ,OAAO,GAAG;EAC5D,MAAM,MAAM,GAAG,mBAAmB,YAAY;EAC9C,gBAAgB,OAAO;GAAE,GAAG;GAAc;EAAI;CAChD;CAEA,SAAS,WAAW;EAAE,GAAG;EAAS,GAAG;CAAgB;AACvD"}
@@ -23,6 +23,10 @@ async function prepareGradleCommand(gradlewFile) {
23
23
  }
24
24
  return null;
25
25
  }
26
+ function isGradleAtLeast(major, minor, wantMajor, wantMinor) {
27
+ if (major !== wantMajor) return major > wantMajor;
28
+ return !!minor && minor >= wantMinor;
29
+ }
26
30
  /**
27
31
  * Find compatible java version for gradle.
28
32
  * see https://docs.gradle.org/current/userguide/compatibility.html
@@ -34,17 +38,17 @@ async function getJavaConstraint(gradleVersion, gradlewFile) {
34
38
  const major = gradleVersion ? api.getMajor(gradleVersion) : null;
35
39
  const minor = gradleVersion ? api.getMinor(gradleVersion) : null;
36
40
  if (major) {
37
- if (major > 8 || major === 8 && minor && minor >= 8) {
41
+ if (isGradleAtLeast(major, minor, 8, 8)) {
38
42
  const toolChainVersion = await getJvmConfiguration(gradlewFile);
39
43
  if (toolChainVersion) return `^${toolChainVersion}.0.0`;
40
44
  }
41
- if (major > 6 || major === 6 && minor && minor >= 7) {
45
+ if (isGradleAtLeast(major, minor, 6, 7)) {
42
46
  const languageVersion = await getJavaLanguageVersion(gradlewFile);
43
47
  if (languageVersion) return `^${languageVersion}.0.0`;
44
48
  }
45
- if (major > 9 || major === 9 && minor && minor >= 1) return "^25.0.0";
46
- if (major > 8 || major === 8 && minor && minor >= 5) return "^21.0.0";
47
- if (major > 7 || major === 7 && minor && minor >= 3) return "^17.0.0";
49
+ if (isGradleAtLeast(major, minor, 9, 1)) return "^25.0.0";
50
+ if (isGradleAtLeast(major, minor, 8, 5)) return "^21.0.0";
51
+ if (isGradleAtLeast(major, minor, 7, 3)) return "^17.0.0";
48
52
  if (major === 7) return "^16.0.0";
49
53
  if (major > 0 && major < 5) return "^8.0.0";
50
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["gradleVersioning"],"sources":["../../../../lib/modules/manager/gradle-wrapper/utils.ts"],"sourcesContent":["import os from 'node:os';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n chmodLocalFile,\n localPathExists,\n readLocalFile,\n statLocalFile,\n} from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport gradleVersioning from '../../versioning/gradle/index.ts';\nimport { parseJavaToolchainVersion } from '../gradle/parser.ts';\nimport type { GradleVersionExtract } from './types.ts';\n\nexport const extraEnv = {\n GRADLE_OPTS:\n '-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false',\n};\n\nexport function gradleWrapperFileName(): string {\n if (\n os.platform() === 'win32' &&\n GlobalConfig.get('binarySource') !== 'docker'\n ) {\n return 'gradlew.bat';\n }\n return './gradlew';\n}\n\nexport async function prepareGradleCommand(\n gradlewFile: string,\n): Promise<string | null> {\n const gradlewStat = await statLocalFile(gradlewFile);\n if (gradlewStat?.isFile() === true) {\n // if the file is not executable by others\n if (os.platform() !== 'win32' && (gradlewStat.mode & 0o1) === 0) {\n logger.debug('Gradle wrapper is missing the executable bit');\n // add the execution permission to the owner, group and others\n await chmodLocalFile(gradlewFile, gradlewStat.mode | 0o111);\n }\n return gradleWrapperFileName();\n }\n return null;\n}\n\n/**\n * Find compatible java version for gradle.\n * see https://docs.gradle.org/current/userguide/compatibility.html\n * @param gradleVersion current gradle version\n * @param gradlewFile path to gradle wrapper\n * @returns A Java semver range\n */\nexport async function getJavaConstraint(\n gradleVersion: string | null | undefined,\n gradlewFile: string,\n): Promise<string> {\n const major = gradleVersion ? gradleVersioning.getMajor(gradleVersion) : null;\n const minor = gradleVersion ? gradleVersioning.getMinor(gradleVersion) : null;\n\n if (major) {\n // https://docs.gradle.org/8.8/release-notes.html#daemon-toolchains\n if (major > 8 || (major === 8 && minor && minor >= 8)) {\n const toolChainVersion = await getJvmConfiguration(gradlewFile);\n if (toolChainVersion) {\n return `^${toolChainVersion}.0.0`;\n }\n }\n // https://docs.gradle.org/6.7/release-notes.html#new-jvm-ecosystem-features\n if (major > 6 || (major === 6 && minor && minor >= 7)) {\n const languageVersion = await getJavaLanguageVersion(gradlewFile);\n if (languageVersion) {\n return `^${languageVersion}.0.0`;\n }\n }\n if (major > 9 || (major === 9 && minor && minor >= 1)) {\n return '^25.0.0';\n }\n if (major > 8 || (major === 8 && minor && minor >= 5)) {\n return '^21.0.0';\n }\n if (major > 7 || (major === 7 && minor && minor >= 3)) {\n return '^17.0.0';\n }\n if (major === 7) {\n return '^16.0.0';\n }\n // first public gradle version was 2.0\n if (major > 0 && major < 5) {\n return '^8.0.0';\n }\n }\n\n return '^11.0.0';\n}\n\n/**\n * https://docs.gradle.org/current/userguide/gradle_daemon.html#sec:daemon_jvm_criteria\n */\nexport async function getJvmConfiguration(\n gradlewFile: string,\n): Promise<string | null> {\n const daemonJvmFile = upath.join(\n upath.dirname(gradlewFile),\n 'gradle/gradle-daemon-jvm.properties',\n );\n const daemonJvm = await readLocalFile(daemonJvmFile, 'utf8');\n if (daemonJvm) {\n const TOOLCHAIN_VERSION_REGEX = regEx(\n '^(?:toolchainVersion\\\\s*=\\\\s*)(?<version>\\\\d+)$',\n 'm',\n );\n const toolChainMatch = TOOLCHAIN_VERSION_REGEX.exec(daemonJvm);\n // v8 ignore else -- needs a daemon-jvm file without a toolchain version\n if (toolChainMatch?.groups) {\n return toolChainMatch.groups.version;\n }\n }\n\n return null;\n}\n\n/**\n * https://docs.gradle.org/current/userguide/toolchains.html#sec:consuming\n */\nexport async function getJavaLanguageVersion(\n gradlewFile: string,\n): Promise<string | null> {\n const localGradleDir = upath.dirname(gradlewFile);\n let buildFileName = upath.join(localGradleDir, 'build.gradle');\n if (!(await localPathExists(buildFileName))) {\n buildFileName = upath.join(localGradleDir, 'build.gradle.kts');\n }\n\n const buildFileContent = await readLocalFile(buildFileName, 'utf8');\n if (!buildFileContent) {\n logger.debug('build.gradle or build.gradle.kts not found');\n return null;\n }\n\n return parseJavaToolchainVersion(buildFileContent);\n}\n\n// https://regex101.com/r/IcOs7P/1\nconst DISTRIBUTION_URL_REGEX = regEx(\n '^(?:distributionUrl\\\\s*=\\\\s*)(?<url>\\\\S*-(?<version>\\\\d+\\\\.\\\\d+(?:\\\\.\\\\d+)?(?:-\\\\w+)*)-(?<type>bin|all)\\\\.zip)\\\\s*$',\n 'm',\n);\n\nexport function extractGradleVersion(\n fileContent: string,\n): GradleVersionExtract | null {\n const distributionUrlMatch = DISTRIBUTION_URL_REGEX.exec(fileContent);\n if (distributionUrlMatch?.groups) {\n return {\n url: distributionUrlMatch.groups.url,\n version: distributionUrlMatch.groups.version,\n };\n }\n logger.debug(\n 'Gradle wrapper version and url could not be extracted from properties - skipping update',\n );\n\n return null;\n}\n"],"mappings":";;;;;;;;;AAeA,MAAa,WAAW,EACtB,aACE,sHACJ;AAEA,SAAgB,wBAAgC;CAC9C,IACE,GAAG,SAAS,MAAM,WAClB,aAAa,IAAI,cAAc,MAAM,UAErC,OAAO;CAET,OAAO;AACT;AAEA,eAAsB,qBACpB,aACwB;CACxB,MAAM,cAAc,MAAM,cAAc,WAAW;CACnD,IAAI,aAAa,OAAO,MAAM,MAAM;EAElC,IAAI,GAAG,SAAS,MAAM,YAAY,YAAY,OAAO,OAAS,GAAG;GAC/D,OAAO,MAAM,8CAA8C;GAE3D,MAAM,eAAe,aAAa,YAAY,OAAO,EAAK;EAC5D;EACA,OAAO,sBAAsB;CAC/B;CACA,OAAO;AACT;;;;;;;;AASA,eAAsB,kBACpB,eACA,aACiB;CACjB,MAAM,QAAQ,gBAAgBA,IAAiB,SAAS,aAAa,IAAI;CACzE,MAAM,QAAQ,gBAAgBA,IAAiB,SAAS,aAAa,IAAI;CAEzE,IAAI,OAAO;EAET,IAAI,QAAQ,KAAM,UAAU,KAAK,SAAS,SAAS,GAAI;GACrD,MAAM,mBAAmB,MAAM,oBAAoB,WAAW;GAC9D,IAAI,kBACF,OAAO,IAAI,iBAAiB;EAEhC;EAEA,IAAI,QAAQ,KAAM,UAAU,KAAK,SAAS,SAAS,GAAI;GACrD,MAAM,kBAAkB,MAAM,uBAAuB,WAAW;GAChE,IAAI,iBACF,OAAO,IAAI,gBAAgB;EAE/B;EACA,IAAI,QAAQ,KAAM,UAAU,KAAK,SAAS,SAAS,GACjD,OAAO;EAET,IAAI,QAAQ,KAAM,UAAU,KAAK,SAAS,SAAS,GACjD,OAAO;EAET,IAAI,QAAQ,KAAM,UAAU,KAAK,SAAS,SAAS,GACjD,OAAO;EAET,IAAI,UAAU,GACZ,OAAO;EAGT,IAAI,QAAQ,KAAK,QAAQ,GACvB,OAAO;CAEX;CAEA,OAAO;AACT;;;;AAKA,eAAsB,oBACpB,aACwB;CACxB,MAAM,gBAAgB,MAAM,KAC1B,MAAM,QAAQ,WAAW,GACzB,qCACF;CACA,MAAM,YAAY,MAAM,cAAc,eAAe,MAAM;CAC3D,IAAI,WAAW;EAKb,MAAM,iBAJ0B,MAC9B,mDACA,GAE2C,CAAC,CAAC,KAAK,SAAS;;EAE7D,IAAI,gBAAgB,QAClB,OAAO,eAAe,OAAO;CAEjC;CAEA,OAAO;AACT;;;;AAKA,eAAsB,uBACpB,aACwB;CACxB,MAAM,iBAAiB,MAAM,QAAQ,WAAW;CAChD,IAAI,gBAAgB,MAAM,KAAK,gBAAgB,cAAc;CAC7D,IAAI,CAAE,MAAM,gBAAgB,aAAa,GACvC,gBAAgB,MAAM,KAAK,gBAAgB,kBAAkB;CAG/D,MAAM,mBAAmB,MAAM,cAAc,eAAe,MAAM;CAClE,IAAI,CAAC,kBAAkB;EACrB,OAAO,MAAM,4CAA4C;EACzD,OAAO;CACT;CAEA,OAAO,0BAA0B,gBAAgB;AACnD;AAGA,MAAM,yBAAyB,MAC7B,uHACA,GACF;AAEA,SAAgB,qBACd,aAC6B;CAC7B,MAAM,uBAAuB,uBAAuB,KAAK,WAAW;CACpE,IAAI,sBAAsB,QACxB,OAAO;EACL,KAAK,qBAAqB,OAAO;EACjC,SAAS,qBAAqB,OAAO;CACvC;CAEF,OAAO,MACL,yFACF;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"utils.js","names":["gradleVersioning"],"sources":["../../../../lib/modules/manager/gradle-wrapper/utils.ts"],"sourcesContent":["import os from 'node:os';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n chmodLocalFile,\n localPathExists,\n readLocalFile,\n statLocalFile,\n} from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport gradleVersioning from '../../versioning/gradle/index.ts';\nimport { parseJavaToolchainVersion } from '../gradle/parser.ts';\nimport type { GradleVersionExtract } from './types.ts';\n\nexport const extraEnv = {\n GRADLE_OPTS:\n '-Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.daemon=false -Dorg.gradle.caching=false',\n};\n\nexport function gradleWrapperFileName(): string {\n if (\n os.platform() === 'win32' &&\n GlobalConfig.get('binarySource') !== 'docker'\n ) {\n return 'gradlew.bat';\n }\n return './gradlew';\n}\n\nexport async function prepareGradleCommand(\n gradlewFile: string,\n): Promise<string | null> {\n const gradlewStat = await statLocalFile(gradlewFile);\n if (gradlewStat?.isFile() === true) {\n // if the file is not executable by others\n if (os.platform() !== 'win32' && (gradlewStat.mode & 0o1) === 0) {\n logger.debug('Gradle wrapper is missing the executable bit');\n // add the execution permission to the owner, group and others\n await chmodLocalFile(gradlewFile, gradlewStat.mode | 0o111);\n }\n return gradleWrapperFileName();\n }\n return null;\n}\n\nfunction isGradleAtLeast(\n major: number,\n minor: number | null,\n wantMajor: number,\n wantMinor: number,\n): boolean {\n if (major !== wantMajor) {\n return major > wantMajor;\n }\n return !!minor && minor >= wantMinor;\n}\n\n/**\n * Find compatible java version for gradle.\n * see https://docs.gradle.org/current/userguide/compatibility.html\n * @param gradleVersion current gradle version\n * @param gradlewFile path to gradle wrapper\n * @returns A Java semver range\n */\nexport async function getJavaConstraint(\n gradleVersion: string | null | undefined,\n gradlewFile: string,\n): Promise<string> {\n const major = gradleVersion ? gradleVersioning.getMajor(gradleVersion) : null;\n const minor = gradleVersion ? gradleVersioning.getMinor(gradleVersion) : null;\n\n if (major) {\n // https://docs.gradle.org/8.8/release-notes.html#daemon-toolchains\n if (isGradleAtLeast(major, minor, 8, 8)) {\n const toolChainVersion = await getJvmConfiguration(gradlewFile);\n if (toolChainVersion) {\n return `^${toolChainVersion}.0.0`;\n }\n }\n // https://docs.gradle.org/6.7/release-notes.html#new-jvm-ecosystem-features\n if (isGradleAtLeast(major, minor, 6, 7)) {\n const languageVersion = await getJavaLanguageVersion(gradlewFile);\n if (languageVersion) {\n return `^${languageVersion}.0.0`;\n }\n }\n if (isGradleAtLeast(major, minor, 9, 1)) {\n return '^25.0.0';\n }\n if (isGradleAtLeast(major, minor, 8, 5)) {\n return '^21.0.0';\n }\n if (isGradleAtLeast(major, minor, 7, 3)) {\n return '^17.0.0';\n }\n if (major === 7) {\n return '^16.0.0';\n }\n // first public gradle version was 2.0\n if (major > 0 && major < 5) {\n return '^8.0.0';\n }\n }\n\n return '^11.0.0';\n}\n\n/**\n * https://docs.gradle.org/current/userguide/gradle_daemon.html#sec:daemon_jvm_criteria\n */\nexport async function getJvmConfiguration(\n gradlewFile: string,\n): Promise<string | null> {\n const daemonJvmFile = upath.join(\n upath.dirname(gradlewFile),\n 'gradle/gradle-daemon-jvm.properties',\n );\n const daemonJvm = await readLocalFile(daemonJvmFile, 'utf8');\n if (daemonJvm) {\n const TOOLCHAIN_VERSION_REGEX = regEx(\n '^(?:toolchainVersion\\\\s*=\\\\s*)(?<version>\\\\d+)$',\n 'm',\n );\n const toolChainMatch = TOOLCHAIN_VERSION_REGEX.exec(daemonJvm);\n // v8 ignore else -- needs a daemon-jvm file without a toolchain version\n if (toolChainMatch?.groups) {\n return toolChainMatch.groups.version;\n }\n }\n\n return null;\n}\n\n/**\n * https://docs.gradle.org/current/userguide/toolchains.html#sec:consuming\n */\nexport async function getJavaLanguageVersion(\n gradlewFile: string,\n): Promise<string | null> {\n const localGradleDir = upath.dirname(gradlewFile);\n let buildFileName = upath.join(localGradleDir, 'build.gradle');\n if (!(await localPathExists(buildFileName))) {\n buildFileName = upath.join(localGradleDir, 'build.gradle.kts');\n }\n\n const buildFileContent = await readLocalFile(buildFileName, 'utf8');\n if (!buildFileContent) {\n logger.debug('build.gradle or build.gradle.kts not found');\n return null;\n }\n\n return parseJavaToolchainVersion(buildFileContent);\n}\n\n// https://regex101.com/r/IcOs7P/1\nconst DISTRIBUTION_URL_REGEX = regEx(\n '^(?:distributionUrl\\\\s*=\\\\s*)(?<url>\\\\S*-(?<version>\\\\d+\\\\.\\\\d+(?:\\\\.\\\\d+)?(?:-\\\\w+)*)-(?<type>bin|all)\\\\.zip)\\\\s*$',\n 'm',\n);\n\nexport function extractGradleVersion(\n fileContent: string,\n): GradleVersionExtract | null {\n const distributionUrlMatch = DISTRIBUTION_URL_REGEX.exec(fileContent);\n if (distributionUrlMatch?.groups) {\n return {\n url: distributionUrlMatch.groups.url,\n version: distributionUrlMatch.groups.version,\n };\n }\n logger.debug(\n 'Gradle wrapper version and url could not be extracted from properties - skipping update',\n );\n\n return null;\n}\n"],"mappings":";;;;;;;;;AAeA,MAAa,WAAW,EACtB,aACE,sHACJ;AAEA,SAAgB,wBAAgC;CAC9C,IACE,GAAG,SAAS,MAAM,WAClB,aAAa,IAAI,cAAc,MAAM,UAErC,OAAO;CAET,OAAO;AACT;AAEA,eAAsB,qBACpB,aACwB;CACxB,MAAM,cAAc,MAAM,cAAc,WAAW;CACnD,IAAI,aAAa,OAAO,MAAM,MAAM;EAElC,IAAI,GAAG,SAAS,MAAM,YAAY,YAAY,OAAO,OAAS,GAAG;GAC/D,OAAO,MAAM,8CAA8C;GAE3D,MAAM,eAAe,aAAa,YAAY,OAAO,EAAK;EAC5D;EACA,OAAO,sBAAsB;CAC/B;CACA,OAAO;AACT;AAEA,SAAS,gBACP,OACA,OACA,WACA,WACS;CACT,IAAI,UAAU,WACZ,OAAO,QAAQ;CAEjB,OAAO,CAAC,CAAC,SAAS,SAAS;AAC7B;;;;;;;;AASA,eAAsB,kBACpB,eACA,aACiB;CACjB,MAAM,QAAQ,gBAAgBA,IAAiB,SAAS,aAAa,IAAI;CACzE,MAAM,QAAQ,gBAAgBA,IAAiB,SAAS,aAAa,IAAI;CAEzE,IAAI,OAAO;EAET,IAAI,gBAAgB,OAAO,OAAO,GAAG,CAAC,GAAG;GACvC,MAAM,mBAAmB,MAAM,oBAAoB,WAAW;GAC9D,IAAI,kBACF,OAAO,IAAI,iBAAiB;EAEhC;EAEA,IAAI,gBAAgB,OAAO,OAAO,GAAG,CAAC,GAAG;GACvC,MAAM,kBAAkB,MAAM,uBAAuB,WAAW;GAChE,IAAI,iBACF,OAAO,IAAI,gBAAgB;EAE/B;EACA,IAAI,gBAAgB,OAAO,OAAO,GAAG,CAAC,GACpC,OAAO;EAET,IAAI,gBAAgB,OAAO,OAAO,GAAG,CAAC,GACpC,OAAO;EAET,IAAI,gBAAgB,OAAO,OAAO,GAAG,CAAC,GACpC,OAAO;EAET,IAAI,UAAU,GACZ,OAAO;EAGT,IAAI,QAAQ,KAAK,QAAQ,GACvB,OAAO;CAEX;CAEA,OAAO;AACT;;;;AAKA,eAAsB,oBACpB,aACwB;CACxB,MAAM,gBAAgB,MAAM,KAC1B,MAAM,QAAQ,WAAW,GACzB,qCACF;CACA,MAAM,YAAY,MAAM,cAAc,eAAe,MAAM;CAC3D,IAAI,WAAW;EAKb,MAAM,iBAJ0B,MAC9B,mDACA,GAE2C,CAAC,CAAC,KAAK,SAAS;;EAE7D,IAAI,gBAAgB,QAClB,OAAO,eAAe,OAAO;CAEjC;CAEA,OAAO;AACT;;;;AAKA,eAAsB,uBACpB,aACwB;CACxB,MAAM,iBAAiB,MAAM,QAAQ,WAAW;CAChD,IAAI,gBAAgB,MAAM,KAAK,gBAAgB,cAAc;CAC7D,IAAI,CAAE,MAAM,gBAAgB,aAAa,GACvC,gBAAgB,MAAM,KAAK,gBAAgB,kBAAkB;CAG/D,MAAM,mBAAmB,MAAM,cAAc,eAAe,MAAM;CAClE,IAAI,CAAC,kBAAkB;EACrB,OAAO,MAAM,4CAA4C;EACzD,OAAO;CACT;CAEA,OAAO,0BAA0B,gBAAgB;AACnD;AAGA,MAAM,yBAAyB,MAC7B,uHACA,GACF;AAEA,SAAgB,qBACd,aAC6B;CAC7B,MAAM,uBAAuB,uBAAuB,KAAK,WAAW;CACpE,IAAI,sBAAsB,QACxB,OAAO;EACL,KAAK,qBAAqB,OAAO;EACjC,SAAS,qBAAqB,OAAO;CACvC;CAEF,OAAO,MACL,yFACF;CAEA,OAAO;AACT"}
@@ -22,7 +22,7 @@ const parentKeyRe = regEx(/image$/i);
22
22
  * tag: v1.0.0
23
23
  */
24
24
  function matchesHelmValuesDockerHeuristic(parentKey, data) {
25
- return !!(parentKeyRe.test(parentKey) && isObject(data) && hasKey("repository", data) && (hasKey("tag", data) || hasKey("version", data)));
25
+ return !!(parentKeyRe.test(parentKey) && isObject(data) && hasKey("repository", data) && ["tag", "version"].some((key) => hasKey(key, data)));
26
26
  }
27
27
  function matchesHelmValuesInlineImage(parentKey, data) {
28
28
  return !!(parentKeyRe.test(parentKey) && data && isString(data));
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":[],"sources":["../../../../lib/modules/manager/helm-values/util.ts"],"sourcesContent":["import { isObject, isString } from '@sindresorhus/is';\nimport { hasKey } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { HelmDockerImageDependency } from './types.ts';\n\nconst parentKeyRe = regEx(/image$/i);\n\n/**\n * Type guard to determine whether a given partial Helm values.yaml object potentially\n * defines a Helm Docker dependency.\n *\n * There is no exact standard of how Docker dependencies are defined in Helm\n * values.yaml files (as of February 26th 2021), this function defines a\n * heuristic based on the most commonly used format in the Helm charts:\n *\n * image:\n * repository: 'something'\n * tag: v1.0.0\n * image:\n * repository: 'something'\n * version: v1.0.0\n * renovateImage:\n * repository: 'something'\n * tag: v1.0.0\n */\nexport function matchesHelmValuesDockerHeuristic(\n parentKey: string,\n data: unknown,\n): data is HelmDockerImageDependency {\n return !!(\n parentKeyRe.test(parentKey) &&\n isObject(data) &&\n hasKey('repository', data) &&\n (hasKey('tag', data) || hasKey('version', data))\n );\n}\n\nexport function matchesHelmValuesInlineImage(\n parentKey: string,\n data: unknown,\n): data is string {\n return !!(parentKeyRe.test(parentKey) && data && isString(data));\n}\n\n/**\n * Returns the version defined by a sibling `tag` or `version` key of the given\n * object, if any:\n *\n * cli:\n * image: 'something'\n * tag: v1.0.0\n * cli:\n * image: 'something'\n * version: v1.0.0\n */\nexport function getHelmValuesSiblingVersion(\n data: Record<string, unknown> | HelmDockerImageDependency,\n): string | undefined {\n const { tag, version } = data as Record<string, unknown>;\n if (isString(tag) && tag) {\n return tag;\n }\n if (isString(version) && version) {\n return version;\n }\n return undefined;\n}\n"],"mappings":";;;;AAKA,MAAM,cAAc,MAAM,SAAS;;;;;;;;;;;;;;;;;;;AAoBnC,SAAgB,iCACd,WACA,MACmC;CACnC,OAAO,CAAC,EACN,YAAY,KAAK,SAAS,KAC1B,SAAS,IAAI,KACb,OAAO,cAAc,IAAI,MACxB,OAAO,OAAO,IAAI,KAAK,OAAO,WAAW,IAAI;AAElD;AAEA,SAAgB,6BACd,WACA,MACgB;CAChB,OAAO,CAAC,EAAE,YAAY,KAAK,SAAS,KAAK,QAAQ,SAAS,IAAI;AAChE;;;;;;;;;;;;AAaA,SAAgB,4BACd,MACoB;CACpB,MAAM,EAAE,KAAK,YAAY;CACzB,IAAI,SAAS,GAAG,KAAK,KACnB,OAAO;CAET,IAAI,SAAS,OAAO,KAAK,SACvB,OAAO;AAGX"}
1
+ {"version":3,"file":"util.js","names":[],"sources":["../../../../lib/modules/manager/helm-values/util.ts"],"sourcesContent":["import { isObject, isString } from '@sindresorhus/is';\nimport { hasKey } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { HelmDockerImageDependency } from './types.ts';\n\nconst parentKeyRe = regEx(/image$/i);\n\n/**\n * Type guard to determine whether a given partial Helm values.yaml object potentially\n * defines a Helm Docker dependency.\n *\n * There is no exact standard of how Docker dependencies are defined in Helm\n * values.yaml files (as of February 26th 2021), this function defines a\n * heuristic based on the most commonly used format in the Helm charts:\n *\n * image:\n * repository: 'something'\n * tag: v1.0.0\n * image:\n * repository: 'something'\n * version: v1.0.0\n * renovateImage:\n * repository: 'something'\n * tag: v1.0.0\n */\nexport function matchesHelmValuesDockerHeuristic(\n parentKey: string,\n data: unknown,\n): data is HelmDockerImageDependency {\n return !!(\n parentKeyRe.test(parentKey) &&\n isObject(data) &&\n hasKey('repository', data) &&\n ['tag', 'version'].some((key) => hasKey(key, data))\n );\n}\n\nexport function matchesHelmValuesInlineImage(\n parentKey: string,\n data: unknown,\n): data is string {\n return !!(parentKeyRe.test(parentKey) && data && isString(data));\n}\n\n/**\n * Returns the version defined by a sibling `tag` or `version` key of the given\n * object, if any:\n *\n * cli:\n * image: 'something'\n * tag: v1.0.0\n * cli:\n * image: 'something'\n * version: v1.0.0\n */\nexport function getHelmValuesSiblingVersion(\n data: Record<string, unknown> | HelmDockerImageDependency,\n): string | undefined {\n const { tag, version } = data as Record<string, unknown>;\n if (isString(tag) && tag) {\n return tag;\n }\n if (isString(version) && version) {\n return version;\n }\n return undefined;\n}\n"],"mappings":";;;;AAKA,MAAM,cAAc,MAAM,SAAS;;;;;;;;;;;;;;;;;;;AAoBnC,SAAgB,iCACd,WACA,MACmC;CACnC,OAAO,CAAC,EACN,YAAY,KAAK,SAAS,KAC1B,SAAS,IAAI,KACb,OAAO,cAAc,IAAI,KACzB,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,QAAQ,OAAO,KAAK,IAAI,CAAC;AAEtD;AAEA,SAAgB,6BACd,WACA,MACgB;CAChB,OAAO,CAAC,EAAE,YAAY,KAAK,SAAS,KAAK,QAAQ,SAAS,IAAI;AAChE;;;;;;;;;;;;AAaA,SAAgB,4BACd,MACoB;CACpB,MAAM,EAAE,KAAK,YAAY;CACzB,IAAI,SAAS,GAAG,KAAK,KACnB,OAAO;CAET,IAAI,SAAS,OAAO,KAAK,SACvB,OAAO;AAGX"}
@@ -16,7 +16,7 @@ import { quote } from "shlex";
16
16
  async function updateArtifacts({ packageFileName, updatedDeps, newPackageFileContent, config }) {
17
17
  logger.trace(`helmfile.updateArtifacts(${packageFileName})`);
18
18
  const { isLockFileMaintenance } = config;
19
- if (!isLockFileMaintenance && (updatedDeps === void 0 || updatedDeps.length < 1)) {
19
+ if (!isLockFileMaintenance && !updatedDeps?.length) {
20
20
  logger.debug("No updated helmfile deps - returning null");
21
21
  return null;
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/helmfile/artifacts.ts"],"sourcesContent":["import { isFalsy } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ToolConstraint } from '../../../util/exec/types.ts';\nimport { getSiblingFileName } from '../../../util/fs/index.ts';\nimport { getFile } from '../../../util/git/index.ts';\nimport { Result } from '../../../util/result.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport {\n findHelmRepositoryCredentials,\n generateHelmEnvs,\n generateRegistryLoginCmd,\n} from '../helmv3/common.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport {\n artifactErrorResult,\n resolveToolConstraint,\n updateLockFile,\n} from '../util.ts';\nimport { Doc, LockVersion } from './schema.ts';\nimport type { HelmfileManagerData } from './types.ts';\nimport { isOciRepositoryFlagSet } from './utils.ts';\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact<HelmfileManagerData>): Promise<\n UpdateArtifactsResult[] | null\n> {\n logger.trace(`helmfile.updateArtifacts(${packageFileName})`);\n\n const { isLockFileMaintenance } = config;\n if (\n !isLockFileMaintenance &&\n (updatedDeps === undefined || updatedDeps.length < 1)\n ) {\n logger.debug('No updated helmfile deps - returning null');\n return null;\n }\n\n const lockFileName = getSiblingFileName(packageFileName, 'helmfile.lock');\n const existingLockFileContent = await getFile(lockFileName);\n\n if (isFalsy(existingLockFileContent)) {\n logger.debug('No helmfile.lock found');\n return null;\n }\n\n try {\n const helmConstraint = await resolveToolConstraint(config, 'helm');\n const toolConstraints: ToolConstraint[] = [\n {\n toolName: 'helm',\n constraint: helmConstraint,\n },\n {\n toolName: 'helmfile',\n constraint: await resolveToolConstraint(config, 'helmfile', () =>\n Result.parse(existingLockFileContent, LockVersion).unwrapOrNull(),\n ),\n },\n ];\n const needKustomize = updatedDeps.some(\n (dep) => dep.managerData?.needKustomize,\n );\n if (needKustomize) {\n toolConstraints.push({\n toolName: 'kustomize',\n constraint: await resolveToolConstraint(config, 'kustomize'),\n });\n }\n\n const cmd: string[] = [];\n const docs = parseYaml(newPackageFileContent, {\n removeTemplates: true,\n customSchema: Doc,\n failureBehaviour: 'filter',\n });\n\n for (const doc of docs) {\n for (const value of coerceArray(doc.repositories).filter(\n isOciRepositoryFlagSet,\n )) {\n const loginCmd = await generateRegistryLoginCmd(value.name, value.url);\n\n // v8 ignore else -- needs a repository the login helper cannot handle\n if (loginCmd) {\n cmd.push(loginCmd);\n }\n }\n }\n\n const repositoryCredentialEnvs = Object.fromEntries(\n docs.flatMap((doc) =>\n coerceArray(doc.repositories)\n .filter((value) => !isOciRepositoryFlagSet(value))\n .flatMap((value) => {\n const credentials = findHelmRepositoryCredentials(value.url);\n const envName = value.name.toUpperCase().replaceAll('-', '_');\n return credentials\n ? [\n [`${envName}_USERNAME`, credentials.username],\n [`${envName}_PASSWORD`, credentials.password],\n ]\n : [];\n }),\n ),\n );\n\n cmd.push(`helmfile deps -f ${quote(packageFileName)}`);\n\n return await updateLockFile({\n lockFileName,\n existingLockFileContent,\n packageFile: { path: packageFileName, contents: newPackageFileContent },\n run: () =>\n exec(cmd, {\n docker: {},\n extraEnv: {\n ...generateHelmEnvs(helmConstraint),\n ...repositoryCredentialEnvs,\n },\n toolConstraints,\n }),\n });\n } catch (err) {\n /* v8 ignore if -- defensive rethrow, not reproduced in the helmfile specs */\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update Helmfile lock file');\n return artifactErrorResult(lockFileName, err);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AA0BA,eAAsB,gBAAgB,EACpC,iBACA,aACA,uBACA,UAGA;CACA,OAAO,MAAM,4BAA4B,gBAAgB,EAAE;CAE3D,MAAM,EAAE,0BAA0B;CAClC,IACE,CAAC,0BACA,gBAAgB,KAAA,KAAa,YAAY,SAAS,IACnD;EACA,OAAO,MAAM,2CAA2C;EACxD,OAAO;CACT;CAEA,MAAM,eAAe,mBAAmB,iBAAiB,eAAe;CACxE,MAAM,0BAA0B,MAAM,QAAQ,YAAY;CAE1D,IAAI,QAAQ,uBAAuB,GAAG;EACpC,OAAO,MAAM,wBAAwB;EACrC,OAAO;CACT;CAEA,IAAI;EACF,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ,MAAM;EACjE,MAAM,kBAAoC,CACxC;GACE,UAAU;GACV,YAAY;EACd,GACA;GACE,UAAU;GACV,YAAY,MAAM,sBAAsB,QAAQ,kBAC9C,OAAO,MAAM,yBAAyB,WAAW,CAAC,CAAC,aAAa,CAClE;EACF,CACF;EAIA,IAHsB,YAAY,MAC/B,QAAQ,IAAI,aAAa,aAEZ,GACd,gBAAgB,KAAK;GACnB,UAAU;GACV,YAAY,MAAM,sBAAsB,QAAQ,WAAW;EAC7D,CAAC;EAGH,MAAM,MAAgB,CAAC;EACvB,MAAM,OAAO,UAAU,uBAAuB;GAC5C,iBAAiB;GACjB,cAAc;GACd,kBAAkB;EACpB,CAAC;EAED,KAAK,MAAM,OAAO,MAChB,KAAK,MAAM,SAAS,YAAY,IAAI,YAAY,CAAC,CAAC,OAChD,sBACF,GAAG;GACD,MAAM,WAAW,MAAM,yBAAyB,MAAM,MAAM,MAAM,GAAG;;GAGrE,IAAI,UACF,IAAI,KAAK,QAAQ;EAErB;EAGF,MAAM,2BAA2B,OAAO,YACtC,KAAK,SAAS,QACZ,YAAY,IAAI,YAAY,CAAC,CAC1B,QAAQ,UAAU,CAAC,uBAAuB,KAAK,CAAC,CAAC,CACjD,SAAS,UAAU;GAClB,MAAM,cAAc,8BAA8B,MAAM,GAAG;GAC3D,MAAM,UAAU,MAAM,KAAK,YAAY,CAAC,CAAC,WAAW,KAAK,GAAG;GAC5D,OAAO,cACH,CACE,CAAC,GAAG,QAAQ,YAAY,YAAY,QAAQ,GAC5C,CAAC,GAAG,QAAQ,YAAY,YAAY,QAAQ,CAC9C,IACA,CAAC;EACP,CAAC,CACL,CACF;EAEA,IAAI,KAAK,oBAAoB,MAAM,eAAe,GAAG;EAErD,OAAO,MAAM,eAAe;GAC1B;GACA;GACA,aAAa;IAAE,MAAM;IAAiB,UAAU;GAAsB;GACtE,WACE,KAAK,KAAK;IACR,QAAQ,CAAC;IACT,UAAU;KACR,GAAG,iBAAiB,cAAc;KAClC,GAAG;IACL;IACA;GACF,CAAC;EACL,CAAC;CACH,SAAS,KAAK;;EAEZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,MAAM,EAAE,IAAI,GAAG,qCAAqC;EAC3D,OAAO,oBAAoB,cAAc,GAAG;CAC9C;AACF"}
1
+ {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/helmfile/artifacts.ts"],"sourcesContent":["import { isFalsy } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ToolConstraint } from '../../../util/exec/types.ts';\nimport { getSiblingFileName } from '../../../util/fs/index.ts';\nimport { getFile } from '../../../util/git/index.ts';\nimport { Result } from '../../../util/result.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport {\n findHelmRepositoryCredentials,\n generateHelmEnvs,\n generateRegistryLoginCmd,\n} from '../helmv3/common.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport {\n artifactErrorResult,\n resolveToolConstraint,\n updateLockFile,\n} from '../util.ts';\nimport { Doc, LockVersion } from './schema.ts';\nimport type { HelmfileManagerData } from './types.ts';\nimport { isOciRepositoryFlagSet } from './utils.ts';\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact<HelmfileManagerData>): Promise<\n UpdateArtifactsResult[] | null\n> {\n logger.trace(`helmfile.updateArtifacts(${packageFileName})`);\n\n const { isLockFileMaintenance } = config;\n if (!isLockFileMaintenance && !updatedDeps?.length) {\n logger.debug('No updated helmfile deps - returning null');\n return null;\n }\n\n const lockFileName = getSiblingFileName(packageFileName, 'helmfile.lock');\n const existingLockFileContent = await getFile(lockFileName);\n\n if (isFalsy(existingLockFileContent)) {\n logger.debug('No helmfile.lock found');\n return null;\n }\n\n try {\n const helmConstraint = await resolveToolConstraint(config, 'helm');\n const toolConstraints: ToolConstraint[] = [\n {\n toolName: 'helm',\n constraint: helmConstraint,\n },\n {\n toolName: 'helmfile',\n constraint: await resolveToolConstraint(config, 'helmfile', () =>\n Result.parse(existingLockFileContent, LockVersion).unwrapOrNull(),\n ),\n },\n ];\n const needKustomize = updatedDeps.some(\n (dep) => dep.managerData?.needKustomize,\n );\n if (needKustomize) {\n toolConstraints.push({\n toolName: 'kustomize',\n constraint: await resolveToolConstraint(config, 'kustomize'),\n });\n }\n\n const cmd: string[] = [];\n const docs = parseYaml(newPackageFileContent, {\n removeTemplates: true,\n customSchema: Doc,\n failureBehaviour: 'filter',\n });\n\n for (const doc of docs) {\n for (const value of coerceArray(doc.repositories).filter(\n isOciRepositoryFlagSet,\n )) {\n const loginCmd = await generateRegistryLoginCmd(value.name, value.url);\n\n // v8 ignore else -- needs a repository the login helper cannot handle\n if (loginCmd) {\n cmd.push(loginCmd);\n }\n }\n }\n\n const repositoryCredentialEnvs = Object.fromEntries(\n docs.flatMap((doc) =>\n coerceArray(doc.repositories)\n .filter((value) => !isOciRepositoryFlagSet(value))\n .flatMap((value) => {\n const credentials = findHelmRepositoryCredentials(value.url);\n const envName = value.name.toUpperCase().replaceAll('-', '_');\n return credentials\n ? [\n [`${envName}_USERNAME`, credentials.username],\n [`${envName}_PASSWORD`, credentials.password],\n ]\n : [];\n }),\n ),\n );\n\n cmd.push(`helmfile deps -f ${quote(packageFileName)}`);\n\n return await updateLockFile({\n lockFileName,\n existingLockFileContent,\n packageFile: { path: packageFileName, contents: newPackageFileContent },\n run: () =>\n exec(cmd, {\n docker: {},\n extraEnv: {\n ...generateHelmEnvs(helmConstraint),\n ...repositoryCredentialEnvs,\n },\n toolConstraints,\n }),\n });\n } catch (err) {\n /* v8 ignore if -- defensive rethrow, not reproduced in the helmfile specs */\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update Helmfile lock file');\n return artifactErrorResult(lockFileName, err);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AA0BA,eAAsB,gBAAgB,EACpC,iBACA,aACA,uBACA,UAGA;CACA,OAAO,MAAM,4BAA4B,gBAAgB,EAAE;CAE3D,MAAM,EAAE,0BAA0B;CAClC,IAAI,CAAC,yBAAyB,CAAC,aAAa,QAAQ;EAClD,OAAO,MAAM,2CAA2C;EACxD,OAAO;CACT;CAEA,MAAM,eAAe,mBAAmB,iBAAiB,eAAe;CACxE,MAAM,0BAA0B,MAAM,QAAQ,YAAY;CAE1D,IAAI,QAAQ,uBAAuB,GAAG;EACpC,OAAO,MAAM,wBAAwB;EACrC,OAAO;CACT;CAEA,IAAI;EACF,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ,MAAM;EACjE,MAAM,kBAAoC,CACxC;GACE,UAAU;GACV,YAAY;EACd,GACA;GACE,UAAU;GACV,YAAY,MAAM,sBAAsB,QAAQ,kBAC9C,OAAO,MAAM,yBAAyB,WAAW,CAAC,CAAC,aAAa,CAClE;EACF,CACF;EAIA,IAHsB,YAAY,MAC/B,QAAQ,IAAI,aAAa,aAEZ,GACd,gBAAgB,KAAK;GACnB,UAAU;GACV,YAAY,MAAM,sBAAsB,QAAQ,WAAW;EAC7D,CAAC;EAGH,MAAM,MAAgB,CAAC;EACvB,MAAM,OAAO,UAAU,uBAAuB;GAC5C,iBAAiB;GACjB,cAAc;GACd,kBAAkB;EACpB,CAAC;EAED,KAAK,MAAM,OAAO,MAChB,KAAK,MAAM,SAAS,YAAY,IAAI,YAAY,CAAC,CAAC,OAChD,sBACF,GAAG;GACD,MAAM,WAAW,MAAM,yBAAyB,MAAM,MAAM,MAAM,GAAG;;GAGrE,IAAI,UACF,IAAI,KAAK,QAAQ;EAErB;EAGF,MAAM,2BAA2B,OAAO,YACtC,KAAK,SAAS,QACZ,YAAY,IAAI,YAAY,CAAC,CAC1B,QAAQ,UAAU,CAAC,uBAAuB,KAAK,CAAC,CAAC,CACjD,SAAS,UAAU;GAClB,MAAM,cAAc,8BAA8B,MAAM,GAAG;GAC3D,MAAM,UAAU,MAAM,KAAK,YAAY,CAAC,CAAC,WAAW,KAAK,GAAG;GAC5D,OAAO,cACH,CACE,CAAC,GAAG,QAAQ,YAAY,YAAY,QAAQ,GAC5C,CAAC,GAAG,QAAQ,YAAY,YAAY,QAAQ,CAC9C,IACA,CAAC;EACP,CAAC,CACL,CACF;EAEA,IAAI,KAAK,oBAAoB,MAAM,eAAe,GAAG;EAErD,OAAO,MAAM,eAAe;GAC1B;GACA;GACA,aAAa;IAAE,MAAM;IAAiB,UAAU;GAAsB;GACtE,WACE,KAAK,KAAK;IACR,QAAQ,CAAC;IACT,UAAU;KACR,GAAG,iBAAiB,cAAc;KAClC,GAAG;IACL;IACA;GACF,CAAC;EACL,CAAC;CACH,SAAS,KAAK;;EAEZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,MAAM,EAAE,IAAI,GAAG,qCAAqC;EAC3D,OAAO,oBAAoB,cAAc,GAAG;CAC9C;AACF"}
@@ -36,7 +36,7 @@ async function updateArtifacts({ packageFileName, updatedDeps, newPackageFileCon
36
36
  logger.debug(`helmv3.updateArtifacts(${packageFileName})`);
37
37
  const { isLockFileMaintenance } = config;
38
38
  const isUpdateOptionAddChartArchives = config.postUpdateOptions?.includes("helmUpdateSubChartArchives");
39
- if (!isLockFileMaintenance && (updatedDeps === void 0 || updatedDeps.length < 1)) {
39
+ if (!isLockFileMaintenance && !updatedDeps?.length) {
40
40
  logger.debug("No updated helmv3 deps - returning null");
41
41
  return null;
42
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":["yaml.parseSingleYaml"],"sources":["../../../../lib/modules/manager/helmv3/artifacts.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions, ToolConstraint } from '../../../util/exec/types.ts';\nimport {\n getParentDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { collectFileChanges } from '../../../util/git/file-changes.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport * as yaml from '../../../util/yaml.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport {\n artifactErrorResult,\n fileAddition,\n fileChangesToArtifactResults,\n resolveToolConstraint,\n} from '../util.ts';\nimport {\n generateHelmEnvs,\n generateRegistryLoginCmd,\n helmRepositoryCredentialArgs,\n} from './common.ts';\nimport { isOCIRegistry } from './oci.ts';\nimport type { ChartDefinition, Repository } from './types.ts';\nimport {\n aliasRecordToRepositories,\n getRepositories,\n isFileInDir,\n} from './utils.ts';\n\nasync function helmCommands(\n execOptions: ExecOptions,\n manifestPath: string,\n repositories: Repository[],\n): Promise<void> {\n const cmd: string[] = [];\n // get OCI registries and log into them if credentials have been found\n const ociRepositories = repositories.filter(isOCIRegistry);\n await pMap(ociRepositories, async (value) => {\n const loginCmd = await generateRegistryLoginCmd(\n value.name,\n value.repository,\n );\n if (loginCmd) {\n cmd.push(loginCmd);\n }\n });\n\n // add classic Chart repositories, with credentials from fitting host rules\n for (const value of repositories.filter((repo) => !isOCIRegistry(repo))) {\n const parameters = [\n quote(value.repository),\n '--force-update',\n ...helmRepositoryCredentialArgs(value.repository),\n ];\n cmd.push(`helm repo add ${quote(value.name)} ${parameters.join(' ')}`);\n }\n\n cmd.push(`helm dependency update ${quote(getParentDir(manifestPath))}`);\n\n await exec(cmd, execOptions);\n}\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`helmv3.updateArtifacts(${packageFileName})`);\n\n const { isLockFileMaintenance } = config;\n const isUpdateOptionAddChartArchives = config.postUpdateOptions?.includes(\n 'helmUpdateSubChartArchives',\n );\n\n if (\n !isLockFileMaintenance &&\n (updatedDeps === undefined || updatedDeps.length < 1)\n ) {\n logger.debug('No updated helmv3 deps - returning null');\n return null;\n }\n\n const lockFileName = getSiblingFileName(packageFileName, 'Chart.lock');\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent && !isUpdateOptionAddChartArchives) {\n logger.debug('No Chart.lock found');\n return null;\n }\n try {\n // get repositories and registries defined in the package file\n // TODO: use schema (#9610)\n const packages = yaml.parseSingleYaml<ChartDefinition>(\n newPackageFileContent,\n );\n const locks = existingLockFileContent\n ? yaml.parseSingleYaml<ChartDefinition>(existingLockFileContent)\n : { dependencies: [] };\n\n const chartDefinitions: ChartDefinition[] = [];\n // prioritize registryAlias naming for Helm repositories\n if (config.registryAliases) {\n chartDefinitions.push({\n dependencies: aliasRecordToRepositories(config.registryAliases),\n });\n }\n chartDefinitions.push(packages, locks);\n\n const repositories = getRepositories(chartDefinitions);\n\n await writeLocalFile(packageFileName, newPackageFileContent);\n logger.debug('Updating Helm artifacts');\n const helmConstraint = await resolveToolConstraint(config, 'helm');\n const helmToolConstraint: ToolConstraint = {\n toolName: 'helm',\n constraint: helmConstraint,\n };\n\n const execOptions: ExecOptions = {\n docker: {},\n extraEnv: generateHelmEnvs(helmConstraint),\n toolConstraints: [helmToolConstraint],\n };\n await helmCommands(execOptions, packageFileName, repositories);\n logger.debug('Returning updated Helm artifacts');\n\n const fileChanges: UpdateArtifactsResult[] = [];\n\n if (isTruthy(existingLockFileContent)) {\n const newHelmLockContent = await readLocalFile(lockFileName, 'utf8');\n const isLockFileChanged =\n !isString(newHelmLockContent) ||\n isHelmLockChanged(existingLockFileContent, newHelmLockContent);\n if (isLockFileChanged) {\n fileChanges.push(fileAddition(lockFileName, newHelmLockContent));\n } else {\n logger.debug('Chart.lock is unchanged');\n }\n }\n\n // add modified helm chart archives to artifacts\n if (isTruthy(isUpdateOptionAddChartArchives)) {\n const chartsPath = getSiblingFileName(packageFileName, 'charts');\n const status = await getRepoStatus();\n fileChanges.push(\n ...fileChangesToArtifactResults(\n await collectFileChanges(status, {\n include: ['not_added', 'deleted'],\n // only add artifacts in the chart sub path\n filter: (file) => isFileInDir(chartsPath, file),\n }),\n ),\n );\n }\n\n return fileChanges.length > 0 ? fileChanges : null;\n } catch (err) {\n // istanbul ignore if\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update Helm lock file');\n return artifactErrorResult(lockFileName, err);\n }\n}\n\nfunction isHelmLockChanged(oldContent: string, newContent: string): boolean {\n const regex = regEx(/^generated: \".+\"$/m);\n return newContent.replace(regex, '') !== oldContent.replace(regex, '');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","names":["yaml.parseSingleYaml"],"sources":["../../../../lib/modules/manager/helmv3/artifacts.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions, ToolConstraint } from '../../../util/exec/types.ts';\nimport {\n getParentDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { collectFileChanges } from '../../../util/git/file-changes.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport * as yaml from '../../../util/yaml.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport {\n artifactErrorResult,\n fileAddition,\n fileChangesToArtifactResults,\n resolveToolConstraint,\n} from '../util.ts';\nimport {\n generateHelmEnvs,\n generateRegistryLoginCmd,\n helmRepositoryCredentialArgs,\n} from './common.ts';\nimport { isOCIRegistry } from './oci.ts';\nimport type { ChartDefinition, Repository } from './types.ts';\nimport {\n aliasRecordToRepositories,\n getRepositories,\n isFileInDir,\n} from './utils.ts';\n\nasync function helmCommands(\n execOptions: ExecOptions,\n manifestPath: string,\n repositories: Repository[],\n): Promise<void> {\n const cmd: string[] = [];\n // get OCI registries and log into them if credentials have been found\n const ociRepositories = repositories.filter(isOCIRegistry);\n await pMap(ociRepositories, async (value) => {\n const loginCmd = await generateRegistryLoginCmd(\n value.name,\n value.repository,\n );\n if (loginCmd) {\n cmd.push(loginCmd);\n }\n });\n\n // add classic Chart repositories, with credentials from fitting host rules\n for (const value of repositories.filter((repo) => !isOCIRegistry(repo))) {\n const parameters = [\n quote(value.repository),\n '--force-update',\n ...helmRepositoryCredentialArgs(value.repository),\n ];\n cmd.push(`helm repo add ${quote(value.name)} ${parameters.join(' ')}`);\n }\n\n cmd.push(`helm dependency update ${quote(getParentDir(manifestPath))}`);\n\n await exec(cmd, execOptions);\n}\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`helmv3.updateArtifacts(${packageFileName})`);\n\n const { isLockFileMaintenance } = config;\n const isUpdateOptionAddChartArchives = config.postUpdateOptions?.includes(\n 'helmUpdateSubChartArchives',\n );\n\n if (!isLockFileMaintenance && !updatedDeps?.length) {\n logger.debug('No updated helmv3 deps - returning null');\n return null;\n }\n\n const lockFileName = getSiblingFileName(packageFileName, 'Chart.lock');\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent && !isUpdateOptionAddChartArchives) {\n logger.debug('No Chart.lock found');\n return null;\n }\n try {\n // get repositories and registries defined in the package file\n // TODO: use schema (#9610)\n const packages = yaml.parseSingleYaml<ChartDefinition>(\n newPackageFileContent,\n );\n const locks = existingLockFileContent\n ? yaml.parseSingleYaml<ChartDefinition>(existingLockFileContent)\n : { dependencies: [] };\n\n const chartDefinitions: ChartDefinition[] = [];\n // prioritize registryAlias naming for Helm repositories\n if (config.registryAliases) {\n chartDefinitions.push({\n dependencies: aliasRecordToRepositories(config.registryAliases),\n });\n }\n chartDefinitions.push(packages, locks);\n\n const repositories = getRepositories(chartDefinitions);\n\n await writeLocalFile(packageFileName, newPackageFileContent);\n logger.debug('Updating Helm artifacts');\n const helmConstraint = await resolveToolConstraint(config, 'helm');\n const helmToolConstraint: ToolConstraint = {\n toolName: 'helm',\n constraint: helmConstraint,\n };\n\n const execOptions: ExecOptions = {\n docker: {},\n extraEnv: generateHelmEnvs(helmConstraint),\n toolConstraints: [helmToolConstraint],\n };\n await helmCommands(execOptions, packageFileName, repositories);\n logger.debug('Returning updated Helm artifacts');\n\n const fileChanges: UpdateArtifactsResult[] = [];\n\n if (isTruthy(existingLockFileContent)) {\n const newHelmLockContent = await readLocalFile(lockFileName, 'utf8');\n const isLockFileChanged =\n !isString(newHelmLockContent) ||\n isHelmLockChanged(existingLockFileContent, newHelmLockContent);\n if (isLockFileChanged) {\n fileChanges.push(fileAddition(lockFileName, newHelmLockContent));\n } else {\n logger.debug('Chart.lock is unchanged');\n }\n }\n\n // add modified helm chart archives to artifacts\n if (isTruthy(isUpdateOptionAddChartArchives)) {\n const chartsPath = getSiblingFileName(packageFileName, 'charts');\n const status = await getRepoStatus();\n fileChanges.push(\n ...fileChangesToArtifactResults(\n await collectFileChanges(status, {\n include: ['not_added', 'deleted'],\n // only add artifacts in the chart sub path\n filter: (file) => isFileInDir(chartsPath, file),\n }),\n ),\n );\n }\n\n return fileChanges.length > 0 ? fileChanges : null;\n } catch (err) {\n // istanbul ignore if\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update Helm lock file');\n return artifactErrorResult(lockFileName, err);\n }\n}\n\nfunction isHelmLockChanged(oldContent: string, newContent: string): boolean {\n const regex = regEx(/^generated: \".+\"$/m);\n return newContent.replace(regex, '') !== oldContent.replace(regex, '');\n}\n"],"mappings":"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"}
@@ -20,6 +20,9 @@ const supportedExtensionsNamespaces = [
20
20
  "http://maven.apache.org/EXTENSIONS/1.1.0",
21
21
  "http://maven.apache.org/EXTENSIONS/1.2.0"
22
22
  ];
23
+ function isModelVersion4(child) {
24
+ return child.name === "modelVersion" && child.val === "4.0.0";
25
+ }
23
26
  function parsePom(raw, packageFile) {
24
27
  let project;
25
28
  try {
@@ -32,7 +35,7 @@ function parsePom(raw, packageFile) {
32
35
  const { name, attr, children } = project;
33
36
  if (name !== "project") return null;
34
37
  if (attr.xmlns === "http://maven.apache.org/POM/4.0.0") return project;
35
- if (isNonEmptyArray(children) && children.some((c) => c.name === "modelVersion" && c.val === "4.0.0")) return project;
38
+ if (isNonEmptyArray(children) && children.some(isModelVersion4)) return project;
36
39
  return null;
37
40
  }
38
41
  function parseExtensions(raw, packageFile) {
@@ -50,7 +53,7 @@ function parseExtensions(raw, packageFile) {
50
53
  return extensions;
51
54
  }
52
55
  function containsPlaceholder(str) {
53
- return !!str && (regEx(/\${[^}]*?}/).test(str) || regEx(/\{\{[^}]*?\}\}/).test(str));
56
+ return !!str && [regEx(/\${[^}]*?}/), regEx(/\{\{[^}]*?\}\}/)].some((re) => re.test(str));
54
57
  }
55
58
  function getCNBDependencies(nodes, config) {
56
59
  const deps = [];
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["getDockerDep","getBuildpackDep"],"sources":["../../../../lib/modules/manager/maven/extract.ts"],"sourcesContent":["import { isArray, isNonEmptyArray } from '@sindresorhus/is';\nimport upath from 'upath';\nimport type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { MAVEN_REPO } from '../../datasource/maven/common.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport {\n BUILDPACK_REGISTRY_PREFIX,\n DOCKER_PREFIX,\n getDep as getBuildpackDep,\n isBuildpackRegistryRef,\n isDockerRef,\n} from '../buildpacks/extract.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n} from '../types.ts';\nimport type { MavenProp } from './types.ts';\n\nconst supportedNamespaces = [\n 'http://maven.apache.org/SETTINGS/1.0.0',\n 'http://maven.apache.org/SETTINGS/1.1.0',\n 'http://maven.apache.org/SETTINGS/1.2.0',\n];\n\nconst supportedExtensionsNamespaces = [\n 'http://maven.apache.org/EXTENSIONS/1.0.0',\n 'http://maven.apache.org/EXTENSIONS/1.1.0',\n 'http://maven.apache.org/EXTENSIONS/1.2.0',\n];\n\nfunction parsePom(raw: string, packageFile: string): XmlDocument | null {\n let project: XmlDocument;\n try {\n project = new XmlDocument(raw);\n if (raw.includes('\\r\\n')) {\n logger.warn(\n 'Your pom.xml contains windows line endings. This is not supported and may result in parsing issues.',\n );\n }\n } catch {\n logger.debug({ packageFile }, `Failed to parse as XML`);\n return null;\n }\n const { name, attr, children } = project;\n if (name !== 'project') {\n return null;\n }\n if (attr.xmlns === 'http://maven.apache.org/POM/4.0.0') {\n return project;\n }\n if (\n isNonEmptyArray(children) &&\n children.some((c: any) => c.name === 'modelVersion' && c.val === '4.0.0')\n ) {\n return project;\n }\n return null;\n}\n\nfunction parseExtensions(raw: string, packageFile: string): XmlDocument | null {\n let extensions: XmlDocument;\n try {\n extensions = new XmlDocument(raw);\n } catch {\n logger.debug({ packageFile }, `Failed to parse as XML`);\n return null;\n }\n const { name, attr, children } = extensions;\n if (name !== 'extensions') {\n return null;\n }\n if (!supportedExtensionsNamespaces.includes(attr.xmlns)) {\n return null;\n }\n if (!isNonEmptyArray(children)) {\n return null;\n }\n return extensions;\n}\n\nfunction containsPlaceholder(str: string | null | undefined): boolean {\n return (\n !!str &&\n (regEx(/\\${[^}]*?}/).test(str) || regEx(/\\{\\{[^}]*?\\}\\}/).test(str))\n );\n}\n\nfunction getCNBDependencies(\n nodes: XmlElement[],\n config: ExtractConfig,\n): PackageDependency[] {\n const deps: PackageDependency[] = [];\n for (const node of nodes) {\n const depString = node.val.trim();\n if (isDockerRef(depString)) {\n const dep = getDockerDep(depString.replace(DOCKER_PREFIX, ''), {\n registryAliases: config.registryAliases,\n });\n\n dep.fileReplacePosition = node.position!; // TODO: should not be null\n // v8 ignore else -- the extractor always populates this field\n if (dep.currentValue || dep.currentDigest) {\n deps.push(dep);\n }\n } else if (isBuildpackRegistryRef(depString)) {\n const dep = getBuildpackDep(\n depString.replace(BUILDPACK_REGISTRY_PREFIX, ''),\n );\n\n if (dep?.currentValue) {\n dep.fileReplacePosition = node.position!; // TODO: should not be null\n deps.push(dep);\n }\n }\n }\n return deps;\n}\n\nfunction getAllCNBDependencies(\n node: XmlDocument,\n config: ExtractConfig,\n): PackageDependency[] | null {\n const pluginNodes = coerceArray(\n node.childNamed('build')?.childNamed('plugins')?.childrenNamed('plugin'),\n );\n\n const pluginNode = pluginNodes.find((pluginNode) => {\n return (\n pluginNode.valueWithPath('groupId')?.trim() ===\n 'org.springframework.boot' &&\n pluginNode.valueWithPath('artifactId')?.trim() ===\n 'spring-boot-maven-plugin'\n );\n });\n if (!pluginNode) {\n return null;\n }\n\n const deps: PackageDependency[] = [];\n const imageNode = pluginNode.childNamed('configuration')?.childNamed('image');\n if (!imageNode) {\n return null;\n }\n const builder = getCNBDependencies(\n imageNode.childrenNamed('builder'),\n config,\n );\n const runImage = getCNBDependencies(\n imageNode.childrenNamed('runImage'),\n config,\n );\n const buildpacks = getCNBDependencies(\n coerceArray(imageNode.childNamed('buildpacks')?.childrenNamed('buildpack')),\n config,\n );\n deps.push(...builder, ...runImage, ...buildpacks);\n\n return deps.length ? deps : null;\n}\n\nfunction depFromNode(\n node: XmlElement,\n underBuildSettingsElement: boolean,\n): PackageDependency | null {\n if (!('valueWithPath' in node)) {\n return null;\n }\n let groupId = node.valueWithPath('groupId')?.trim();\n const artifactId = node.valueWithPath('artifactId')?.trim();\n const currentValue = node.valueWithPath('version')?.trim();\n let depType: string | undefined;\n\n if (!groupId && node.name === 'plugin') {\n groupId = 'org.apache.maven.plugins';\n }\n\n if (groupId && artifactId && currentValue) {\n const depName = `${groupId}:${artifactId}`;\n const versionNode = node.descendantWithPath('version')!;\n const fileReplacePosition = versionNode.position!; // TODO: should not be null\n const datasource = MavenDatasource.id;\n const result: PackageDependency = {\n datasource,\n depName,\n currentValue,\n fileReplacePosition,\n registryUrls: [],\n };\n\n switch (node.name) {\n case 'plugin':\n case 'extension':\n depType = 'build';\n break;\n case 'parent':\n depType = 'parent';\n break;\n case 'dependency':\n if (underBuildSettingsElement) {\n depType = 'build';\n } else if (node.valueWithPath('optional')?.trim() === 'true') {\n depType = 'optional';\n } else {\n depType = node.valueWithPath('scope')?.trim() ?? 'compile'; // maven default scope is compile\n }\n break;\n }\n\n if (depType) {\n result.depType = depType;\n }\n\n return result;\n }\n return null;\n}\n\nfunction deepExtract(\n node: XmlElement,\n result: PackageDependency[] = [],\n isRoot = true,\n underBuildSettingsElement = false,\n): PackageDependency[] {\n const dep = depFromNode(node, underBuildSettingsElement);\n if (dep && !isRoot) {\n result.push(dep);\n }\n if (node.children) {\n for (const child of node.children) {\n deepExtract(\n child as XmlElement,\n result,\n false,\n node.name === 'build' ||\n node.name === 'reporting' ||\n underBuildSettingsElement,\n );\n }\n }\n return result;\n}\n\nfunction applyProps(\n dep: PackageDependency,\n depPackageFile: string,\n props: MavenProp,\n): PackageDependency {\n let result = dep;\n let anyChange = false;\n const alreadySeenProps = new Set<string>();\n\n do {\n const [returnedResult, returnedAnyChange, fatal] = applyPropsInternal(\n result,\n depPackageFile,\n props,\n alreadySeenProps,\n );\n if (fatal) {\n dep.skipReason = 'recursive-placeholder';\n return dep;\n }\n result = returnedResult;\n anyChange = returnedAnyChange;\n } while (anyChange);\n\n if (containsPlaceholder(result.depName)) {\n result.skipReason = 'name-placeholder';\n } else if (containsPlaceholder(result.currentValue)) {\n result.skipReason = 'version-placeholder';\n }\n\n return result;\n}\n\nfunction applyPropsInternal(\n dep: PackageDependency,\n depPackageFile: string,\n props: MavenProp,\n previouslySeenProps: Set<string>,\n): [PackageDependency, boolean, boolean] {\n let anyChange = false;\n let fatal = false;\n\n const seenProps = new Set<string>();\n\n function replaceAll(str: string): string {\n return str.replace(regEx(/\\${[^}]*?}/g), (substr) => {\n const propKey = substr.slice(2, -1).trim();\n // TODO: wrong types here, props is already `MavenProp`\n const propValue = (props as any)[propKey] as MavenProp;\n if (propValue) {\n anyChange = true;\n if (previouslySeenProps.has(propKey)) {\n fatal = true;\n } else {\n seenProps.add(propKey);\n }\n return propValue.val;\n }\n return substr;\n });\n }\n\n let depName = dep.depName;\n // v8 ignore else -- the extractor always populates this field\n if (dep.depName) {\n depName = replaceAll(dep.depName);\n }\n\n const registryUrls = dep.registryUrls!.map((url) => replaceAll(url));\n\n let fileReplacePosition = dep.fileReplacePosition;\n let propSource = dep.propSource;\n let sharedVariableName: string | null = null;\n let currentValue: string | null = null;\n\n // v8 ignore else -- the extractor always populates this field\n if (dep.currentValue) {\n currentValue = dep.currentValue.replace(regEx(/^\\${[^}]*?}$/), (substr) => {\n const propKey = substr.slice(2, -1).trim();\n // TODO: wrong types here, props is already `MavenProp`\n const propValue = (props as any)[propKey] as MavenProp;\n if (propValue) {\n sharedVariableName ??= propKey;\n fileReplacePosition = propValue.fileReplacePosition;\n propSource = propValue.packageFile;\n anyChange = true;\n if (previouslySeenProps.has(propKey)) {\n fatal = true;\n } else {\n seenProps.add(propKey);\n }\n return propValue.val;\n }\n return substr;\n });\n }\n\n const result: PackageDependency = {\n ...dep,\n depName,\n registryUrls,\n fileReplacePosition,\n propSource,\n currentValue,\n };\n\n if (sharedVariableName) {\n result.sharedVariableName = sharedVariableName;\n }\n\n if (propSource && depPackageFile !== propSource) {\n result.editFile = propSource;\n }\n\n for (const prop of seenProps) {\n previouslySeenProps.add(prop);\n }\n return [result, anyChange, fatal];\n}\n\nfunction resolveParentFile(packageFile: string, parentPath: string): string {\n let parentFile = 'pom.xml';\n let parentDir = parentPath;\n const parentBasename = upath.basename(parentPath);\n if (parentBasename === 'pom.xml' || parentBasename.endsWith('.pom.xml')) {\n parentFile = parentBasename;\n parentDir = upath.dirname(parentPath);\n }\n const dir = upath.dirname(packageFile);\n return upath.normalize(upath.join(dir, parentDir, parentFile));\n}\n\ninterface MavenInterimPackageFile extends PackageFile {\n mavenProps?: Record<string, any>;\n parent?: string;\n}\n\nexport function extractPackage(\n rawContent: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFile | null {\n if (!rawContent) {\n return null;\n }\n\n const project = parsePom(rawContent, packageFile);\n if (!project) {\n return null;\n }\n\n const result: MavenInterimPackageFile = {\n datasource: MavenDatasource.id,\n packageFile,\n deps: [],\n };\n\n result.deps = deepExtract(project);\n\n const CNBDependencies = getAllCNBDependencies(project, config);\n if (CNBDependencies) {\n result.deps.push(...CNBDependencies);\n }\n\n const propsNode = project.childNamed('properties');\n const props: Record<string, MavenProp> = {};\n if (propsNode?.children) {\n for (const propNode of propsNode.children as XmlElement[]) {\n const key = propNode.name;\n const val = propNode?.val?.trim();\n if (key && val && propNode.position) {\n const fileReplacePosition = propNode.position;\n props[key] = { val, fileReplacePosition, packageFile };\n }\n }\n }\n result.mavenProps = props;\n\n const repositories = project.childNamed('repositories');\n if (repositories?.children) {\n const repoUrls: string[] = [];\n for (const repo of repositories.childrenNamed('repository')) {\n const repoUrl = repo.valueWithPath('url')?.trim();\n if (repoUrl) {\n repoUrls.push(repoUrl);\n }\n }\n result.deps.forEach((dep) => {\n // v8 ignore else -- the extractor always populates this field\n if (isArray(dep.registryUrls)) {\n repoUrls.forEach((url) => dep.registryUrls!.push(url));\n }\n });\n }\n\n if (packageFile && project.childNamed('parent')) {\n const parentPath =\n project.valueWithPath('parent.relativePath')?.trim() ?? '../pom.xml';\n result.parent = resolveParentFile(packageFile, parentPath);\n }\n\n if (project.childNamed('version')) {\n result.packageFileVersion = project.valueWithPath('version')!.trim();\n }\n\n return result;\n}\n\nexport function extractRegistries(rawContent: string): string[] {\n if (!rawContent) {\n return [];\n }\n\n const settings = parseSettings(rawContent);\n if (!settings) {\n return [];\n }\n\n const urls: string[] = [];\n\n const mirrorUrls = parseUrls(settings, 'mirrors');\n urls.push(...mirrorUrls);\n\n settings.childNamed('profiles')?.eachChild((profile) => {\n const repositoryUrls = parseUrls(profile, 'repositories');\n urls.push(...repositoryUrls);\n });\n\n // filter out duplicates\n return [...new Set(urls)];\n}\n\nfunction parseUrls(xmlNode: XmlElement, path: string): string[] {\n const children = xmlNode.descendantWithPath(path);\n const urls: string[] = [];\n if (children?.children) {\n children.eachChild((child) => {\n const url = child.valueWithPath('url');\n // v8 ignore else -- the extractor always populates this field\n if (url) {\n urls.push(url);\n }\n });\n }\n return urls;\n}\n\nexport function parseSettings(raw: string): XmlDocument | null {\n let settings: XmlDocument;\n try {\n settings = new XmlDocument(raw);\n } catch {\n return null;\n }\n const { name, attr } = settings;\n if (name !== 'settings') {\n return null;\n }\n if (supportedNamespaces.includes(attr.xmlns)) {\n return settings;\n }\n return null;\n}\n\nexport function resolveParents(packages: PackageFile[]): PackageFile[] {\n const packageFileNames: string[] = [];\n const extractedPackages: Record<string, MavenInterimPackageFile> = {};\n const extractedDeps: Record<string, PackageDependency[]> = {};\n const extractedProps: Record<string, MavenProp> = {};\n const registryUrls: Record<string, Set<string>> = {};\n packages.forEach((pkg) => {\n const name = pkg.packageFile;\n packageFileNames.push(name);\n extractedPackages[name] = pkg;\n extractedDeps[name] = [];\n });\n\n // Construct package-specific prop scopes\n // and merge them in reverse order,\n // which allows inheritance/overriding.\n packageFileNames.forEach((name) => {\n registryUrls[name] = new Set();\n const propsHierarchy: Record<string, MavenProp>[] = [];\n const visitedPackages = new Set<string>();\n let pkg: MavenInterimPackageFile | null = extractedPackages[name];\n while (pkg) {\n propsHierarchy.unshift(pkg.mavenProps!);\n\n // v8 ignore else -- the extractor always populates this field\n if (pkg.deps) {\n pkg.deps.forEach((dep) => {\n // v8 ignore else -- the extractor always populates this field\n if (dep.registryUrls) {\n dep.registryUrls.forEach((url) => {\n registryUrls[name].add(url);\n });\n }\n });\n }\n\n if (pkg.parent && !visitedPackages.has(pkg.parent)) {\n visitedPackages.add(pkg.parent);\n pkg = extractedPackages[pkg.parent];\n } else {\n pkg = null;\n }\n }\n propsHierarchy.unshift({});\n extractedProps[name] = Object.assign.apply(null, propsHierarchy as any);\n });\n\n // Resolve registryUrls\n packageFileNames.forEach((name) => {\n const pkg = extractedPackages[name];\n pkg.deps.forEach((rawDep) => {\n const urlsSet = new Set([\n ...coerceArray(rawDep.registryUrls),\n ...registryUrls[name],\n ]);\n rawDep.registryUrls = [...urlsSet];\n });\n });\n\n const rootDeps = new Set<string>();\n // Resolve placeholders\n packageFileNames.forEach((name) => {\n const pkg = extractedPackages[name];\n pkg.deps.forEach((rawDep) => {\n const dep = applyProps(rawDep, name, extractedProps[name]);\n if (dep.depType === 'parent') {\n const parentPkg = extractedPackages[pkg.parent!];\n const hasParentWithNoParent = parentPkg && !parentPkg.parent;\n const hasParentWithExternalParent =\n parentPkg && !packageFileNames.includes(parentPkg.parent!);\n if (hasParentWithNoParent || hasParentWithExternalParent) {\n rootDeps.add(dep.depName!);\n }\n }\n const sourceName = dep.propSource ?? name;\n extractedDeps[sourceName].push(dep);\n });\n });\n\n const packageFiles = packageFileNames.map((packageFile) => {\n const pkg = extractedPackages[packageFile];\n const deps = extractedDeps[packageFile];\n for (const dep of deps) {\n if (rootDeps.has(dep.depName!)) {\n dep.depType = 'parent-root';\n }\n }\n return { ...pkg, deps };\n });\n\n return packageFiles;\n}\n\nfunction cleanResult(packageFiles: MavenInterimPackageFile[]): PackageFile[] {\n packageFiles.forEach((packageFile) => {\n delete packageFile.mavenProps;\n delete packageFile.parent;\n packageFile.deps.forEach((dep) => {\n delete dep.propSource;\n //Add Registry From SuperPom\n // v8 ignore else -- the extractor always populates this field\n if (dep.datasource === MavenDatasource.id) {\n dep.registryUrls!.push(MAVEN_REPO);\n }\n });\n });\n return packageFiles;\n}\n\nexport function extractExtensions(\n rawContent: string,\n packageFile: string,\n): PackageFile | null {\n if (!rawContent) {\n return null;\n }\n\n const extensions = parseExtensions(rawContent, packageFile);\n if (!extensions) {\n return null;\n }\n\n const result: MavenInterimPackageFile = {\n datasource: MavenDatasource.id,\n packageFile,\n deps: [],\n };\n\n result.deps = deepExtract(extensions);\n\n return result;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[]> {\n const packages: PackageFile[] = [];\n const additionalRegistryUrls: string[] = [];\n\n for (const packageFile of packageFiles) {\n const content = await readLocalFile(packageFile, 'utf8');\n if (!content) {\n logger.debug({ packageFile }, 'packageFile has no content');\n continue;\n }\n if (packageFile.endsWith('settings.xml')) {\n const registries = extractRegistries(content);\n // v8 ignore else -- needs a settings.xml carrying no registries\n if (registries) {\n logger.debug(\n { registries, packageFile },\n 'Found registryUrls in settings.xml',\n );\n additionalRegistryUrls.push(...registries);\n }\n } else if (packageFile.endsWith('.mvn/extensions.xml')) {\n const extensions = extractExtensions(content, packageFile);\n if (extensions) {\n packages.push(extensions);\n } else {\n logger.trace({ packageFile }, 'can not read extensions');\n }\n } else {\n const pkg = extractPackage(content, packageFile, config);\n if (pkg) {\n packages.push(pkg);\n } else {\n logger.trace({ packageFile }, 'can not read dependencies');\n }\n }\n }\n // v8 ignore else -- the array is always defined, so this is never falsy\n if (additionalRegistryUrls) {\n for (const pkgFile of packages) {\n for (const dep of pkgFile.deps) {\n // v8 ignore else -- the extractor always populates this field\n if (dep.registryUrls) {\n dep.registryUrls.unshift(...additionalRegistryUrls);\n }\n }\n }\n }\n return cleanResult(resolveParents(packages));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":["getDockerDep","getBuildpackDep"],"sources":["../../../../lib/modules/manager/maven/extract.ts"],"sourcesContent":["import { isArray, isNonEmptyArray } from '@sindresorhus/is';\nimport upath from 'upath';\nimport type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { MAVEN_REPO } from '../../datasource/maven/common.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport {\n BUILDPACK_REGISTRY_PREFIX,\n DOCKER_PREFIX,\n getDep as getBuildpackDep,\n isBuildpackRegistryRef,\n isDockerRef,\n} from '../buildpacks/extract.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n} from '../types.ts';\nimport type { MavenProp } from './types.ts';\n\nconst supportedNamespaces = [\n 'http://maven.apache.org/SETTINGS/1.0.0',\n 'http://maven.apache.org/SETTINGS/1.1.0',\n 'http://maven.apache.org/SETTINGS/1.2.0',\n];\n\nconst supportedExtensionsNamespaces = [\n 'http://maven.apache.org/EXTENSIONS/1.0.0',\n 'http://maven.apache.org/EXTENSIONS/1.1.0',\n 'http://maven.apache.org/EXTENSIONS/1.2.0',\n];\n\nfunction isModelVersion4(child: any): boolean {\n return child.name === 'modelVersion' && child.val === '4.0.0';\n}\n\nfunction parsePom(raw: string, packageFile: string): XmlDocument | null {\n let project: XmlDocument;\n try {\n project = new XmlDocument(raw);\n if (raw.includes('\\r\\n')) {\n logger.warn(\n 'Your pom.xml contains windows line endings. This is not supported and may result in parsing issues.',\n );\n }\n } catch {\n logger.debug({ packageFile }, `Failed to parse as XML`);\n return null;\n }\n const { name, attr, children } = project;\n if (name !== 'project') {\n return null;\n }\n if (attr.xmlns === 'http://maven.apache.org/POM/4.0.0') {\n return project;\n }\n if (isNonEmptyArray(children) && children.some(isModelVersion4)) {\n return project;\n }\n return null;\n}\n\nfunction parseExtensions(raw: string, packageFile: string): XmlDocument | null {\n let extensions: XmlDocument;\n try {\n extensions = new XmlDocument(raw);\n } catch {\n logger.debug({ packageFile }, `Failed to parse as XML`);\n return null;\n }\n const { name, attr, children } = extensions;\n if (name !== 'extensions') {\n return null;\n }\n if (!supportedExtensionsNamespaces.includes(attr.xmlns)) {\n return null;\n }\n if (!isNonEmptyArray(children)) {\n return null;\n }\n return extensions;\n}\n\nfunction containsPlaceholder(str: string | null | undefined): boolean {\n return (\n !!str &&\n [regEx(/\\${[^}]*?}/), regEx(/\\{\\{[^}]*?\\}\\}/)].some((re) => re.test(str))\n );\n}\n\nfunction getCNBDependencies(\n nodes: XmlElement[],\n config: ExtractConfig,\n): PackageDependency[] {\n const deps: PackageDependency[] = [];\n for (const node of nodes) {\n const depString = node.val.trim();\n if (isDockerRef(depString)) {\n const dep = getDockerDep(depString.replace(DOCKER_PREFIX, ''), {\n registryAliases: config.registryAliases,\n });\n\n dep.fileReplacePosition = node.position!; // TODO: should not be null\n // v8 ignore else -- the extractor always populates this field\n if (dep.currentValue || dep.currentDigest) {\n deps.push(dep);\n }\n } else if (isBuildpackRegistryRef(depString)) {\n const dep = getBuildpackDep(\n depString.replace(BUILDPACK_REGISTRY_PREFIX, ''),\n );\n\n if (dep?.currentValue) {\n dep.fileReplacePosition = node.position!; // TODO: should not be null\n deps.push(dep);\n }\n }\n }\n return deps;\n}\n\nfunction getAllCNBDependencies(\n node: XmlDocument,\n config: ExtractConfig,\n): PackageDependency[] | null {\n const pluginNodes = coerceArray(\n node.childNamed('build')?.childNamed('plugins')?.childrenNamed('plugin'),\n );\n\n const pluginNode = pluginNodes.find((pluginNode) => {\n return (\n pluginNode.valueWithPath('groupId')?.trim() ===\n 'org.springframework.boot' &&\n pluginNode.valueWithPath('artifactId')?.trim() ===\n 'spring-boot-maven-plugin'\n );\n });\n if (!pluginNode) {\n return null;\n }\n\n const deps: PackageDependency[] = [];\n const imageNode = pluginNode.childNamed('configuration')?.childNamed('image');\n if (!imageNode) {\n return null;\n }\n const builder = getCNBDependencies(\n imageNode.childrenNamed('builder'),\n config,\n );\n const runImage = getCNBDependencies(\n imageNode.childrenNamed('runImage'),\n config,\n );\n const buildpacks = getCNBDependencies(\n coerceArray(imageNode.childNamed('buildpacks')?.childrenNamed('buildpack')),\n config,\n );\n deps.push(...builder, ...runImage, ...buildpacks);\n\n return deps.length ? deps : null;\n}\n\nfunction depFromNode(\n node: XmlElement,\n underBuildSettingsElement: boolean,\n): PackageDependency | null {\n if (!('valueWithPath' in node)) {\n return null;\n }\n let groupId = node.valueWithPath('groupId')?.trim();\n const artifactId = node.valueWithPath('artifactId')?.trim();\n const currentValue = node.valueWithPath('version')?.trim();\n let depType: string | undefined;\n\n if (!groupId && node.name === 'plugin') {\n groupId = 'org.apache.maven.plugins';\n }\n\n if (groupId && artifactId && currentValue) {\n const depName = `${groupId}:${artifactId}`;\n const versionNode = node.descendantWithPath('version')!;\n const fileReplacePosition = versionNode.position!; // TODO: should not be null\n const datasource = MavenDatasource.id;\n const result: PackageDependency = {\n datasource,\n depName,\n currentValue,\n fileReplacePosition,\n registryUrls: [],\n };\n\n switch (node.name) {\n case 'plugin':\n case 'extension':\n depType = 'build';\n break;\n case 'parent':\n depType = 'parent';\n break;\n case 'dependency':\n if (underBuildSettingsElement) {\n depType = 'build';\n } else if (node.valueWithPath('optional')?.trim() === 'true') {\n depType = 'optional';\n } else {\n depType = node.valueWithPath('scope')?.trim() ?? 'compile'; // maven default scope is compile\n }\n break;\n }\n\n if (depType) {\n result.depType = depType;\n }\n\n return result;\n }\n return null;\n}\n\nfunction deepExtract(\n node: XmlElement,\n result: PackageDependency[] = [],\n isRoot = true,\n underBuildSettingsElement = false,\n): PackageDependency[] {\n const dep = depFromNode(node, underBuildSettingsElement);\n if (dep && !isRoot) {\n result.push(dep);\n }\n if (node.children) {\n for (const child of node.children) {\n deepExtract(\n child as XmlElement,\n result,\n false,\n node.name === 'build' ||\n node.name === 'reporting' ||\n underBuildSettingsElement,\n );\n }\n }\n return result;\n}\n\nfunction applyProps(\n dep: PackageDependency,\n depPackageFile: string,\n props: MavenProp,\n): PackageDependency {\n let result = dep;\n let anyChange = false;\n const alreadySeenProps = new Set<string>();\n\n do {\n const [returnedResult, returnedAnyChange, fatal] = applyPropsInternal(\n result,\n depPackageFile,\n props,\n alreadySeenProps,\n );\n if (fatal) {\n dep.skipReason = 'recursive-placeholder';\n return dep;\n }\n result = returnedResult;\n anyChange = returnedAnyChange;\n } while (anyChange);\n\n if (containsPlaceholder(result.depName)) {\n result.skipReason = 'name-placeholder';\n } else if (containsPlaceholder(result.currentValue)) {\n result.skipReason = 'version-placeholder';\n }\n\n return result;\n}\n\nfunction applyPropsInternal(\n dep: PackageDependency,\n depPackageFile: string,\n props: MavenProp,\n previouslySeenProps: Set<string>,\n): [PackageDependency, boolean, boolean] {\n let anyChange = false;\n let fatal = false;\n\n const seenProps = new Set<string>();\n\n function replaceAll(str: string): string {\n return str.replace(regEx(/\\${[^}]*?}/g), (substr) => {\n const propKey = substr.slice(2, -1).trim();\n // TODO: wrong types here, props is already `MavenProp`\n const propValue = (props as any)[propKey] as MavenProp;\n if (propValue) {\n anyChange = true;\n if (previouslySeenProps.has(propKey)) {\n fatal = true;\n } else {\n seenProps.add(propKey);\n }\n return propValue.val;\n }\n return substr;\n });\n }\n\n let depName = dep.depName;\n // v8 ignore else -- the extractor always populates this field\n if (dep.depName) {\n depName = replaceAll(dep.depName);\n }\n\n const registryUrls = dep.registryUrls!.map((url) => replaceAll(url));\n\n let fileReplacePosition = dep.fileReplacePosition;\n let propSource = dep.propSource;\n let sharedVariableName: string | null = null;\n let currentValue: string | null = null;\n\n // v8 ignore else -- the extractor always populates this field\n if (dep.currentValue) {\n currentValue = dep.currentValue.replace(regEx(/^\\${[^}]*?}$/), (substr) => {\n const propKey = substr.slice(2, -1).trim();\n // TODO: wrong types here, props is already `MavenProp`\n const propValue = (props as any)[propKey] as MavenProp;\n if (propValue) {\n sharedVariableName ??= propKey;\n fileReplacePosition = propValue.fileReplacePosition;\n propSource = propValue.packageFile;\n anyChange = true;\n if (previouslySeenProps.has(propKey)) {\n fatal = true;\n } else {\n seenProps.add(propKey);\n }\n return propValue.val;\n }\n return substr;\n });\n }\n\n const result: PackageDependency = {\n ...dep,\n depName,\n registryUrls,\n fileReplacePosition,\n propSource,\n currentValue,\n };\n\n if (sharedVariableName) {\n result.sharedVariableName = sharedVariableName;\n }\n\n if (propSource && depPackageFile !== propSource) {\n result.editFile = propSource;\n }\n\n for (const prop of seenProps) {\n previouslySeenProps.add(prop);\n }\n return [result, anyChange, fatal];\n}\n\nfunction resolveParentFile(packageFile: string, parentPath: string): string {\n let parentFile = 'pom.xml';\n let parentDir = parentPath;\n const parentBasename = upath.basename(parentPath);\n if (parentBasename === 'pom.xml' || parentBasename.endsWith('.pom.xml')) {\n parentFile = parentBasename;\n parentDir = upath.dirname(parentPath);\n }\n const dir = upath.dirname(packageFile);\n return upath.normalize(upath.join(dir, parentDir, parentFile));\n}\n\ninterface MavenInterimPackageFile extends PackageFile {\n mavenProps?: Record<string, any>;\n parent?: string;\n}\n\nexport function extractPackage(\n rawContent: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFile | null {\n if (!rawContent) {\n return null;\n }\n\n const project = parsePom(rawContent, packageFile);\n if (!project) {\n return null;\n }\n\n const result: MavenInterimPackageFile = {\n datasource: MavenDatasource.id,\n packageFile,\n deps: [],\n };\n\n result.deps = deepExtract(project);\n\n const CNBDependencies = getAllCNBDependencies(project, config);\n if (CNBDependencies) {\n result.deps.push(...CNBDependencies);\n }\n\n const propsNode = project.childNamed('properties');\n const props: Record<string, MavenProp> = {};\n if (propsNode?.children) {\n for (const propNode of propsNode.children as XmlElement[]) {\n const key = propNode.name;\n const val = propNode?.val?.trim();\n if (key && val && propNode.position) {\n const fileReplacePosition = propNode.position;\n props[key] = { val, fileReplacePosition, packageFile };\n }\n }\n }\n result.mavenProps = props;\n\n const repositories = project.childNamed('repositories');\n if (repositories?.children) {\n const repoUrls: string[] = [];\n for (const repo of repositories.childrenNamed('repository')) {\n const repoUrl = repo.valueWithPath('url')?.trim();\n if (repoUrl) {\n repoUrls.push(repoUrl);\n }\n }\n result.deps.forEach((dep) => {\n // v8 ignore else -- the extractor always populates this field\n if (isArray(dep.registryUrls)) {\n repoUrls.forEach((url) => dep.registryUrls!.push(url));\n }\n });\n }\n\n if (packageFile && project.childNamed('parent')) {\n const parentPath =\n project.valueWithPath('parent.relativePath')?.trim() ?? '../pom.xml';\n result.parent = resolveParentFile(packageFile, parentPath);\n }\n\n if (project.childNamed('version')) {\n result.packageFileVersion = project.valueWithPath('version')!.trim();\n }\n\n return result;\n}\n\nexport function extractRegistries(rawContent: string): string[] {\n if (!rawContent) {\n return [];\n }\n\n const settings = parseSettings(rawContent);\n if (!settings) {\n return [];\n }\n\n const urls: string[] = [];\n\n const mirrorUrls = parseUrls(settings, 'mirrors');\n urls.push(...mirrorUrls);\n\n settings.childNamed('profiles')?.eachChild((profile) => {\n const repositoryUrls = parseUrls(profile, 'repositories');\n urls.push(...repositoryUrls);\n });\n\n // filter out duplicates\n return [...new Set(urls)];\n}\n\nfunction parseUrls(xmlNode: XmlElement, path: string): string[] {\n const children = xmlNode.descendantWithPath(path);\n const urls: string[] = [];\n if (children?.children) {\n children.eachChild((child) => {\n const url = child.valueWithPath('url');\n // v8 ignore else -- the extractor always populates this field\n if (url) {\n urls.push(url);\n }\n });\n }\n return urls;\n}\n\nexport function parseSettings(raw: string): XmlDocument | null {\n let settings: XmlDocument;\n try {\n settings = new XmlDocument(raw);\n } catch {\n return null;\n }\n const { name, attr } = settings;\n if (name !== 'settings') {\n return null;\n }\n if (supportedNamespaces.includes(attr.xmlns)) {\n return settings;\n }\n return null;\n}\n\nexport function resolveParents(packages: PackageFile[]): PackageFile[] {\n const packageFileNames: string[] = [];\n const extractedPackages: Record<string, MavenInterimPackageFile> = {};\n const extractedDeps: Record<string, PackageDependency[]> = {};\n const extractedProps: Record<string, MavenProp> = {};\n const registryUrls: Record<string, Set<string>> = {};\n packages.forEach((pkg) => {\n const name = pkg.packageFile;\n packageFileNames.push(name);\n extractedPackages[name] = pkg;\n extractedDeps[name] = [];\n });\n\n // Construct package-specific prop scopes\n // and merge them in reverse order,\n // which allows inheritance/overriding.\n packageFileNames.forEach((name) => {\n registryUrls[name] = new Set();\n const propsHierarchy: Record<string, MavenProp>[] = [];\n const visitedPackages = new Set<string>();\n let pkg: MavenInterimPackageFile | null = extractedPackages[name];\n while (pkg) {\n propsHierarchy.unshift(pkg.mavenProps!);\n\n // v8 ignore else -- the extractor always populates this field\n if (pkg.deps) {\n pkg.deps.forEach((dep) => {\n // v8 ignore else -- the extractor always populates this field\n if (dep.registryUrls) {\n dep.registryUrls.forEach((url) => {\n registryUrls[name].add(url);\n });\n }\n });\n }\n\n if (pkg.parent && !visitedPackages.has(pkg.parent)) {\n visitedPackages.add(pkg.parent);\n pkg = extractedPackages[pkg.parent];\n } else {\n pkg = null;\n }\n }\n propsHierarchy.unshift({});\n extractedProps[name] = Object.assign.apply(null, propsHierarchy as any);\n });\n\n // Resolve registryUrls\n packageFileNames.forEach((name) => {\n const pkg = extractedPackages[name];\n pkg.deps.forEach((rawDep) => {\n const urlsSet = new Set([\n ...coerceArray(rawDep.registryUrls),\n ...registryUrls[name],\n ]);\n rawDep.registryUrls = [...urlsSet];\n });\n });\n\n const rootDeps = new Set<string>();\n // Resolve placeholders\n packageFileNames.forEach((name) => {\n const pkg = extractedPackages[name];\n pkg.deps.forEach((rawDep) => {\n const dep = applyProps(rawDep, name, extractedProps[name]);\n if (dep.depType === 'parent') {\n const parentPkg = extractedPackages[pkg.parent!];\n const hasParentWithNoParent = parentPkg && !parentPkg.parent;\n const hasParentWithExternalParent =\n parentPkg && !packageFileNames.includes(parentPkg.parent!);\n if (hasParentWithNoParent || hasParentWithExternalParent) {\n rootDeps.add(dep.depName!);\n }\n }\n const sourceName = dep.propSource ?? name;\n extractedDeps[sourceName].push(dep);\n });\n });\n\n const packageFiles = packageFileNames.map((packageFile) => {\n const pkg = extractedPackages[packageFile];\n const deps = extractedDeps[packageFile];\n for (const dep of deps) {\n if (rootDeps.has(dep.depName!)) {\n dep.depType = 'parent-root';\n }\n }\n return { ...pkg, deps };\n });\n\n return packageFiles;\n}\n\nfunction cleanResult(packageFiles: MavenInterimPackageFile[]): PackageFile[] {\n packageFiles.forEach((packageFile) => {\n delete packageFile.mavenProps;\n delete packageFile.parent;\n packageFile.deps.forEach((dep) => {\n delete dep.propSource;\n //Add Registry From SuperPom\n // v8 ignore else -- the extractor always populates this field\n if (dep.datasource === MavenDatasource.id) {\n dep.registryUrls!.push(MAVEN_REPO);\n }\n });\n });\n return packageFiles;\n}\n\nexport function extractExtensions(\n rawContent: string,\n packageFile: string,\n): PackageFile | null {\n if (!rawContent) {\n return null;\n }\n\n const extensions = parseExtensions(rawContent, packageFile);\n if (!extensions) {\n return null;\n }\n\n const result: MavenInterimPackageFile = {\n datasource: MavenDatasource.id,\n packageFile,\n deps: [],\n };\n\n result.deps = deepExtract(extensions);\n\n return result;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[]> {\n const packages: PackageFile[] = [];\n const additionalRegistryUrls: string[] = [];\n\n for (const packageFile of packageFiles) {\n const content = await readLocalFile(packageFile, 'utf8');\n if (!content) {\n logger.debug({ packageFile }, 'packageFile has no content');\n continue;\n }\n if (packageFile.endsWith('settings.xml')) {\n const registries = extractRegistries(content);\n // v8 ignore else -- needs a settings.xml carrying no registries\n if (registries) {\n logger.debug(\n { registries, packageFile },\n 'Found registryUrls in settings.xml',\n );\n additionalRegistryUrls.push(...registries);\n }\n } else if (packageFile.endsWith('.mvn/extensions.xml')) {\n const extensions = extractExtensions(content, packageFile);\n if (extensions) {\n packages.push(extensions);\n } else {\n logger.trace({ packageFile }, 'can not read extensions');\n }\n } else {\n const pkg = extractPackage(content, packageFile, config);\n if (pkg) {\n packages.push(pkg);\n } else {\n logger.trace({ packageFile }, 'can not read dependencies');\n }\n }\n }\n // v8 ignore else -- the array is always defined, so this is never falsy\n if (additionalRegistryUrls) {\n for (const pkgFile of packages) {\n for (const dep of pkgFile.deps) {\n // v8 ignore else -- the extractor always populates this field\n if (dep.registryUrls) {\n dep.registryUrls.unshift(...additionalRegistryUrls);\n }\n }\n }\n }\n return cleanResult(resolveParents(packages));\n}\n"],"mappings":"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"}
@@ -101,6 +101,7 @@ async function updateArtifacts({ packageFileName, newPackageFileContent, updated
101
101
  const hasWrapperUpdate = updatedDeps.some((dep) => dep.depName === "maven-wrapper");
102
102
  const hadDistributionChecksum = newPackageFileContent.includes("distributionSha256Sum=");
103
103
  const hadWrapperChecksum = newPackageFileContent.includes("wrapperSha256Sum=");
104
+ const hadAnyChecksum = hadWrapperChecksum || hadDistributionChecksum;
104
105
  const originalDistributionType = getDistributionType(newPackageFileContent);
105
106
  if (!hasWrapperUpdate && !(hasMavenUpdate && hadDistributionChecksum)) {
106
107
  logger.debug("No Maven wrapper or distribution checksum updates - skipping Artifacts update");
@@ -114,7 +115,7 @@ async function updateArtifacts({ packageFileName, newPackageFileContent, updated
114
115
  return null;
115
116
  }
116
117
  }
117
- if (hasWrapperUpdate && (hadWrapperChecksum || hadDistributionChecksum)) {
118
+ if (hasWrapperUpdate && hadAnyChecksum) {
118
119
  const jarPath = packageFileName.replace("maven-wrapper.properties", "maven-wrapper.jar");
119
120
  if (jarPath.endsWith("maven-wrapper.jar")) try {
120
121
  await deleteLocalFile(jarPath);
@@ -122,7 +123,7 @@ async function updateArtifacts({ packageFileName, newPackageFileContent, updated
122
123
  } catch {}
123
124
  }
124
125
  let contentToWrite = newPackageFileContent;
125
- if (hasWrapperUpdate && (hadWrapperChecksum || hadDistributionChecksum)) contentToWrite = contentToWrite.replace(regEx(/^distributionSha256Sum=.*\n?/m), "").replace(regEx(/^wrapperSha256Sum=.*\n?/m), "");
126
+ if (hasWrapperUpdate && hadAnyChecksum) contentToWrite = contentToWrite.replace(regEx(/^distributionSha256Sum=.*\n?/m), "").replace(regEx(/^wrapperSha256Sum=.*\n?/m), "");
126
127
  await writeLocalFile(packageFileName, contentToWrite);
127
128
  if (hasWrapperUpdate && cmd) {
128
129
  const extraEnv = getExtraEnvOptions(updatedDeps);