renovate 44.17.0 → 44.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/dist/config/migrations/custom/ignore-npmrc-file-migration.js +2 -1
  2. package/dist/config/migrations/custom/ignore-npmrc-file-migration.js.map +1 -1
  3. package/dist/config/migrations/custom/stability-days-migration.js +1 -3
  4. package/dist/config/migrations/custom/stability-days-migration.js.map +1 -1
  5. package/dist/config/options/index.js +1 -1
  6. package/dist/config/options/index.js.map +1 -1
  7. package/dist/config/secrets.js +2 -1
  8. package/dist/config/secrets.js.map +1 -1
  9. package/dist/config/validation.js +1 -3
  10. package/dist/config/validation.js.map +1 -1
  11. package/dist/config-validator.js +2 -1
  12. package/dist/config-validator.js.map +1 -1
  13. package/dist/expose.js.map +1 -1
  14. package/dist/global-config-option-defaults.generated.js +1 -1
  15. package/dist/global-config-option-defaults.generated.js.map +1 -1
  16. package/dist/modules/datasource/artifactory/index.js +2 -1
  17. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  18. package/dist/modules/datasource/aws-eks-addon/index.js +2 -1
  19. package/dist/modules/datasource/aws-eks-addon/index.js.map +1 -1
  20. package/dist/modules/datasource/aws-machine-image/index.js +3 -2
  21. package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
  22. package/dist/modules/datasource/bazel/index.js +2 -1
  23. package/dist/modules/datasource/bazel/index.js.map +1 -1
  24. package/dist/modules/datasource/bitbucket-server-tags/index.js +4 -2
  25. package/dist/modules/datasource/bitbucket-server-tags/index.js.map +1 -1
  26. package/dist/modules/datasource/bitbucket-tags/index.js +2 -1
  27. package/dist/modules/datasource/bitbucket-tags/index.js.map +1 -1
  28. package/dist/modules/datasource/bitrise/index.js +2 -1
  29. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  30. package/dist/modules/datasource/common.js +4 -2
  31. package/dist/modules/datasource/common.js.map +1 -1
  32. package/dist/modules/datasource/crate/index.js +12 -5
  33. package/dist/modules/datasource/crate/index.js.map +1 -1
  34. package/dist/modules/datasource/custom/formats/toml.js +2 -1
  35. package/dist/modules/datasource/custom/formats/toml.js.map +1 -1
  36. package/dist/modules/datasource/custom/formats/yaml.js +4 -2
  37. package/dist/modules/datasource/custom/formats/yaml.js.map +1 -1
  38. package/dist/modules/datasource/deb/checksum.js +2 -1
  39. package/dist/modules/datasource/deb/checksum.js.map +1 -1
  40. package/dist/modules/datasource/deb/packages.js +3 -1
  41. package/dist/modules/datasource/deb/packages.js.map +1 -1
  42. package/dist/modules/datasource/deno/index.js +2 -1
  43. package/dist/modules/datasource/deno/index.js.map +1 -1
  44. package/dist/modules/datasource/docker/common.js +3 -2
  45. package/dist/modules/datasource/docker/common.js.map +1 -1
  46. package/dist/modules/datasource/docker/dockerhub-cache.js +1 -1
  47. package/dist/modules/datasource/docker/dockerhub-cache.js.map +1 -1
  48. package/dist/modules/datasource/docker/index.js +11 -10
  49. package/dist/modules/datasource/docker/index.js.map +1 -1
  50. package/dist/modules/datasource/forgejo-tags/index.js +4 -2
  51. package/dist/modules/datasource/forgejo-tags/index.js.map +1 -1
  52. package/dist/modules/datasource/galaxy-collection/index.js +5 -3
  53. package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
  54. package/dist/modules/datasource/git-refs/base.js +2 -1
  55. package/dist/modules/datasource/git-refs/base.js.map +1 -1
  56. package/dist/modules/datasource/git-refs/index.js +1 -1
  57. package/dist/modules/datasource/git-refs/index.js.map +1 -1
  58. package/dist/modules/datasource/gitea-tags/index.js +4 -2
  59. package/dist/modules/datasource/gitea-tags/index.js.map +1 -1
  60. package/dist/modules/datasource/github-release-attachments/index.js +3 -2
  61. package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
  62. package/dist/modules/datasource/github-tags/index.js +1 -1
  63. package/dist/modules/datasource/github-tags/index.js.map +1 -1
  64. package/dist/modules/datasource/gitlab-tags/index.js +2 -1
  65. package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
  66. package/dist/modules/datasource/gitlab-tags/util.js +2 -1
  67. package/dist/modules/datasource/gitlab-tags/util.js.map +1 -1
  68. package/dist/modules/datasource/go/releases-goproxy.js +8 -5
  69. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  70. package/dist/modules/datasource/jenkins-plugins/index.js +1 -1
  71. package/dist/modules/datasource/jenkins-plugins/index.js.map +1 -1
  72. package/dist/modules/datasource/jsr/index.js +2 -1
  73. package/dist/modules/datasource/jsr/index.js.map +1 -1
  74. package/dist/modules/datasource/maven/index.js +3 -2
  75. package/dist/modules/datasource/maven/index.js.map +1 -1
  76. package/dist/modules/datasource/maven/util.js +1 -1
  77. package/dist/modules/datasource/maven/util.js.map +1 -1
  78. package/dist/modules/datasource/nuget/v2.js +3 -2
  79. package/dist/modules/datasource/nuget/v2.js.map +1 -1
  80. package/dist/modules/datasource/nuget/v3.js +9 -5
  81. package/dist/modules/datasource/nuget/v3.js.map +1 -1
  82. package/dist/modules/datasource/packagist/index.js +7 -4
  83. package/dist/modules/datasource/packagist/index.js.map +1 -1
  84. package/dist/modules/datasource/rpm/providers/common.js +3 -1
  85. package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
  86. package/dist/modules/datasource/rpm/repomd.js +2 -1
  87. package/dist/modules/datasource/rpm/repomd.js.map +1 -1
  88. package/dist/modules/datasource/ruby-version/index.js +2 -1
  89. package/dist/modules/datasource/ruby-version/index.js.map +1 -1
  90. package/dist/modules/datasource/rubygems/metadata-cache.js +1 -1
  91. package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
  92. package/dist/modules/datasource/sbt-package/index.js +8 -5
  93. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  94. package/dist/modules/datasource/sbt-package/util.js +2 -1
  95. package/dist/modules/datasource/sbt-package/util.js.map +1 -1
  96. package/dist/modules/datasource/terraform-module/index.js +4 -2
  97. package/dist/modules/datasource/terraform-module/index.js.map +1 -1
  98. package/dist/modules/datasource/terraform-module/utils.js +2 -1
  99. package/dist/modules/datasource/terraform-module/utils.js.map +1 -1
  100. package/dist/modules/datasource/terraform-provider/index.js +2 -1
  101. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  102. package/dist/modules/datasource/typst/schema.js +4 -2
  103. package/dist/modules/datasource/typst/schema.js.map +1 -1
  104. package/dist/modules/manager/ansible-galaxy/collections.js +2 -2
  105. package/dist/modules/manager/ansible-galaxy/collections.js.map +1 -1
  106. package/dist/modules/manager/ansible-galaxy/extract.js +5 -3
  107. package/dist/modules/manager/ansible-galaxy/extract.js.map +1 -1
  108. package/dist/modules/manager/bazel/artifacts.js +1 -1
  109. package/dist/modules/manager/bazel/artifacts.js.map +1 -1
  110. package/dist/modules/manager/bazel/parser.js +1 -1
  111. package/dist/modules/manager/bazel/parser.js.map +1 -1
  112. package/dist/modules/manager/bazel/rules/index.js +7 -2
  113. package/dist/modules/manager/bazel/rules/index.js.map +1 -1
  114. package/dist/modules/manager/bazel-module/extract.js +2 -1
  115. package/dist/modules/manager/bazel-module/extract.js.map +1 -1
  116. package/dist/modules/manager/bazel-module/parser/extension-tags.js +3 -2
  117. package/dist/modules/manager/bazel-module/parser/extension-tags.js.map +1 -1
  118. package/dist/modules/manager/bazel-module/rules.js +1 -3
  119. package/dist/modules/manager/bazel-module/rules.js.map +1 -1
  120. package/dist/modules/manager/bitbucket-pipelines/extract.js +5 -3
  121. package/dist/modules/manager/bitbucket-pipelines/extract.js.map +1 -1
  122. package/dist/modules/manager/buildkite/extract.js +1 -1
  123. package/dist/modules/manager/buildkite/extract.js.map +1 -1
  124. package/dist/modules/manager/bun/extract.js +2 -1
  125. package/dist/modules/manager/bun/extract.js.map +1 -1
  126. package/dist/modules/manager/bundler/artifacts.js +3 -2
  127. package/dist/modules/manager/bundler/artifacts.js.map +1 -1
  128. package/dist/modules/manager/cargo/artifacts.js +3 -2
  129. package/dist/modules/manager/cargo/artifacts.js.map +1 -1
  130. package/dist/modules/manager/cocoapods/artifacts.js +2 -1
  131. package/dist/modules/manager/cocoapods/artifacts.js.map +1 -1
  132. package/dist/modules/manager/composer/update-locked.js +1 -1
  133. package/dist/modules/manager/composer/update-locked.js.map +1 -1
  134. package/dist/modules/manager/conan/artifacts.js +4 -2
  135. package/dist/modules/manager/conan/artifacts.js.map +1 -1
  136. package/dist/modules/manager/custom/jsonata/index.js +1 -3
  137. package/dist/modules/manager/custom/jsonata/index.js.map +1 -1
  138. package/dist/modules/manager/custom/jsonata/utils.js +1 -3
  139. package/dist/modules/manager/custom/jsonata/utils.js.map +1 -1
  140. package/dist/modules/manager/custom/regex/index.js +1 -3
  141. package/dist/modules/manager/custom/regex/index.js.map +1 -1
  142. package/dist/modules/manager/custom/regex/strategies.js +7 -6
  143. package/dist/modules/manager/custom/regex/strategies.js.map +1 -1
  144. package/dist/modules/manager/custom/regex/utils.js +1 -3
  145. package/dist/modules/manager/custom/regex/utils.js.map +1 -1
  146. package/dist/modules/manager/docker-compose/extract.js +2 -2
  147. package/dist/modules/manager/docker-compose/extract.js.map +1 -1
  148. package/dist/modules/manager/droneci/extract.js +1 -1
  149. package/dist/modules/manager/droneci/extract.js.map +1 -1
  150. package/dist/modules/manager/flux/artifacts.js +5 -3
  151. package/dist/modules/manager/flux/artifacts.js.map +1 -1
  152. package/dist/modules/manager/flux/extract.js +2 -6
  153. package/dist/modules/manager/flux/extract.js.map +1 -1
  154. package/dist/modules/manager/git-submodules/extract.js +5 -4
  155. package/dist/modules/manager/git-submodules/extract.js.map +1 -1
  156. package/dist/modules/manager/github-actions/extract.js +2 -1
  157. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  158. package/dist/modules/manager/gitlabci/extract.js +1 -1
  159. package/dist/modules/manager/gitlabci/extract.js.map +1 -1
  160. package/dist/modules/manager/gitlabci/schema.js +2 -1
  161. package/dist/modules/manager/gitlabci/schema.js.map +1 -1
  162. package/dist/modules/manager/gitlabci-include/extract.js +1 -1
  163. package/dist/modules/manager/gitlabci-include/extract.js.map +1 -1
  164. package/dist/modules/manager/gleam/artifacts.js +2 -1
  165. package/dist/modules/manager/gleam/artifacts.js.map +1 -1
  166. package/dist/modules/manager/gomod/artifacts.js +2 -1
  167. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  168. package/dist/modules/manager/gradle/artifacts.js +3 -1
  169. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  170. package/dist/modules/manager/gradle/extract/catalog.js +3 -1
  171. package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
  172. package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js +2 -1
  173. package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js.map +1 -1
  174. package/dist/modules/manager/gradle/extract.js +4 -2
  175. package/dist/modules/manager/gradle/extract.js.map +1 -1
  176. package/dist/modules/manager/gradle/parser/handlers.js +4 -2
  177. package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
  178. package/dist/modules/manager/gradle/parser/registry-urls.js +3 -2
  179. package/dist/modules/manager/gradle/parser/registry-urls.js.map +1 -1
  180. package/dist/modules/manager/gradle-wrapper/utils.js +2 -1
  181. package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
  182. package/dist/modules/manager/helm-values/extract.js +1 -1
  183. package/dist/modules/manager/helm-values/extract.js.map +1 -1
  184. package/dist/modules/manager/helmfile/utils.js +3 -2
  185. package/dist/modules/manager/helmfile/utils.js.map +1 -1
  186. package/dist/modules/manager/helmsman/extract.js +1 -1
  187. package/dist/modules/manager/helmsman/extract.js.map +1 -1
  188. package/dist/modules/manager/helmv3/artifacts.js +3 -2
  189. package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
  190. package/dist/modules/manager/jenkins/extract.js +1 -1
  191. package/dist/modules/manager/jenkins/extract.js.map +1 -1
  192. package/dist/modules/manager/jsonnet-bundler/artifacts.js +1 -1
  193. package/dist/modules/manager/jsonnet-bundler/artifacts.js.map +1 -1
  194. package/dist/modules/manager/kustomize/artifacts.js +3 -4
  195. package/dist/modules/manager/kustomize/artifacts.js.map +1 -1
  196. package/dist/modules/manager/kustomize/extract.js +1 -1
  197. package/dist/modules/manager/kustomize/extract.js.map +1 -1
  198. package/dist/modules/manager/leiningen/extract.js +2 -1
  199. package/dist/modules/manager/leiningen/extract.js.map +1 -1
  200. package/dist/modules/manager/maven/extract.js +6 -6
  201. package/dist/modules/manager/maven/extract.js.map +1 -1
  202. package/dist/modules/manager/maven-wrapper/artifacts.js +4 -1
  203. package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
  204. package/dist/modules/manager/meteor/extract.js +1 -1
  205. package/dist/modules/manager/meteor/extract.js.map +1 -1
  206. package/dist/modules/manager/mix/artifacts.js +2 -1
  207. package/dist/modules/manager/mix/artifacts.js.map +1 -1
  208. package/dist/modules/manager/nix/extract.js +0 -1
  209. package/dist/modules/manager/nix/extract.js.map +1 -1
  210. package/dist/modules/manager/npm/artifacts.js +2 -1
  211. package/dist/modules/manager/npm/artifacts.js.map +1 -1
  212. package/dist/modules/manager/npm/extract/common/package-file.js +1 -1
  213. package/dist/modules/manager/npm/extract/common/package-file.js.map +1 -1
  214. package/dist/modules/manager/npm/extract/pnpm.js +2 -1
  215. package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
  216. package/dist/modules/manager/npm/extract/yarn.js +3 -2
  217. package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
  218. package/dist/modules/manager/npm/post-update/index.js +9 -7
  219. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  220. package/dist/modules/manager/npm/post-update/npm.js +7 -4
  221. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  222. package/dist/modules/manager/npm/post-update/pnpm.js +1 -1
  223. package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
  224. package/dist/modules/manager/npm/update/dependency/index.js +2 -1
  225. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  226. package/dist/modules/manager/npm/update/index.js +5 -0
  227. package/dist/modules/manager/npm/update/index.js.map +1 -0
  228. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js +1 -1
  229. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js.map +1 -1
  230. package/dist/modules/manager/npm/update/locked-dependency/package-lock/index.js +21 -16
  231. package/dist/modules/manager/npm/update/locked-dependency/package-lock/index.js.map +1 -1
  232. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js +2 -2
  233. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js.map +1 -1
  234. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/index.js +1 -1
  235. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/index.js.map +1 -1
  236. package/dist/modules/manager/npm/utils.js +3 -3
  237. package/dist/modules/manager/npm/utils.js.map +1 -1
  238. package/dist/modules/manager/nuget/artifacts.js +2 -1
  239. package/dist/modules/manager/nuget/artifacts.js.map +1 -1
  240. package/dist/modules/manager/nuget/update.js +2 -1
  241. package/dist/modules/manager/nuget/update.js.map +1 -1
  242. package/dist/modules/manager/pep621/processors/pdm.js +2 -1
  243. package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
  244. package/dist/modules/manager/pep621/schema.js +2 -1
  245. package/dist/modules/manager/pep621/schema.js.map +1 -1
  246. package/dist/modules/manager/pip-compile/artifacts.js +2 -1
  247. package/dist/modules/manager/pip-compile/artifacts.js.map +1 -1
  248. package/dist/modules/manager/pip_requirements/artifacts.js +5 -3
  249. package/dist/modules/manager/pip_requirements/artifacts.js.map +1 -1
  250. package/dist/modules/manager/pipenv/extract.js +2 -1
  251. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  252. package/dist/modules/manager/poetry/artifacts.js +3 -2
  253. package/dist/modules/manager/poetry/artifacts.js.map +1 -1
  254. package/dist/modules/manager/poetry/extract.js +2 -1
  255. package/dist/modules/manager/poetry/extract.js.map +1 -1
  256. package/dist/modules/manager/pre-commit/extract.js +5 -3
  257. package/dist/modules/manager/pre-commit/extract.js.map +1 -1
  258. package/dist/modules/manager/puppet/puppetfile-parser.js +2 -1
  259. package/dist/modules/manager/puppet/puppetfile-parser.js.map +1 -1
  260. package/dist/modules/manager/quadlet/extract.js +2 -1
  261. package/dist/modules/manager/quadlet/extract.js.map +1 -1
  262. package/dist/modules/manager/sbt/extract.js +1 -1
  263. package/dist/modules/manager/sbt/extract.js.map +1 -1
  264. package/dist/modules/manager/swift/extract.js +4 -6
  265. package/dist/modules/manager/swift/extract.js.map +1 -1
  266. package/dist/modules/manager/terraform/lockfile/index.js +4 -3
  267. package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
  268. package/dist/modules/manager/terraform/util.js +2 -1
  269. package/dist/modules/manager/terraform/util.js.map +1 -1
  270. package/dist/modules/manager/terragrunt/extract.js +3 -9
  271. package/dist/modules/manager/terragrunt/extract.js.map +1 -1
  272. package/dist/modules/manager/tflint-plugin/extract.js +1 -1
  273. package/dist/modules/manager/tflint-plugin/extract.js.map +1 -1
  274. package/dist/modules/manager/vendir/artifacts.js +3 -2
  275. package/dist/modules/manager/vendir/artifacts.js.map +1 -1
  276. package/dist/modules/platform/azure/index.js +8 -7
  277. package/dist/modules/platform/azure/index.js.map +1 -1
  278. package/dist/modules/platform/bitbucket/comments.js +2 -2
  279. package/dist/modules/platform/bitbucket/comments.js.map +1 -1
  280. package/dist/modules/platform/bitbucket/index.js +9 -8
  281. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  282. package/dist/modules/platform/bitbucket-server/index.js +8 -9
  283. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  284. package/dist/modules/platform/codecommit/codecommit-client.js +8 -5
  285. package/dist/modules/platform/codecommit/codecommit-client.js.map +1 -1
  286. package/dist/modules/platform/codecommit/index.js +5 -5
  287. package/dist/modules/platform/codecommit/index.js.map +1 -1
  288. package/dist/modules/platform/forgejo/forgejo-helper.js +5 -3
  289. package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -1
  290. package/dist/modules/platform/forgejo/index.js +15 -8
  291. package/dist/modules/platform/forgejo/index.js.map +1 -1
  292. package/dist/modules/platform/gerrit/client.js +2 -1
  293. package/dist/modules/platform/gerrit/client.js.map +1 -1
  294. package/dist/modules/platform/gerrit/index.js +4 -2
  295. package/dist/modules/platform/gerrit/index.js.map +1 -1
  296. package/dist/modules/platform/gerrit/utils.js +1 -1
  297. package/dist/modules/platform/gerrit/utils.js.map +1 -1
  298. package/dist/modules/platform/gitea/gitea-helper.js +5 -3
  299. package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
  300. package/dist/modules/platform/gitea/index.js +16 -9
  301. package/dist/modules/platform/gitea/index.js.map +1 -1
  302. package/dist/modules/platform/github/index.js +27 -24
  303. package/dist/modules/platform/github/index.js.map +1 -1
  304. package/dist/modules/platform/github/massage-markdown-links.js +1 -1
  305. package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
  306. package/dist/modules/platform/github/pr.js +1 -1
  307. package/dist/modules/platform/github/pr.js.map +1 -1
  308. package/dist/modules/platform/github/schema.js +3 -2
  309. package/dist/modules/platform/github/schema.js.map +1 -1
  310. package/dist/modules/platform/gitlab/index.js +19 -14
  311. package/dist/modules/platform/gitlab/index.js.map +1 -1
  312. package/dist/modules/platform/local/scm.js +1 -1
  313. package/dist/modules/platform/local/scm.js.map +1 -1
  314. package/dist/modules/platform/util.js +2 -1
  315. package/dist/modules/platform/util.js.map +1 -1
  316. package/dist/modules/versioning/cargo/index.js +1 -1
  317. package/dist/modules/versioning/cargo/index.js.map +1 -1
  318. package/dist/modules/versioning/conan/index.js +4 -2
  319. package/dist/modules/versioning/conan/index.js.map +1 -1
  320. package/dist/modules/versioning/nixpkgs/index.js +2 -1
  321. package/dist/modules/versioning/nixpkgs/index.js.map +1 -1
  322. package/dist/modules/versioning/nuget/index.js +4 -2
  323. package/dist/modules/versioning/nuget/index.js.map +1 -1
  324. package/dist/modules/versioning/nuget/range.js +4 -2
  325. package/dist/modules/versioning/nuget/range.js.map +1 -1
  326. package/dist/modules/versioning/pep440/range.js +1 -1
  327. package/dist/modules/versioning/pep440/range.js.map +1 -1
  328. package/dist/modules/versioning/perl/index.js +1 -1
  329. package/dist/modules/versioning/perl/index.js.map +1 -1
  330. package/dist/modules/versioning/poetry/index.js +2 -2
  331. package/dist/modules/versioning/poetry/index.js.map +1 -1
  332. package/dist/modules/versioning/rez/index.js +5 -5
  333. package/dist/modules/versioning/rez/index.js.map +1 -1
  334. package/dist/modules/versioning/ruby/strategies/bump.js +3 -2
  335. package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
  336. package/dist/modules/versioning/ruby/strategies/replace.js +3 -2
  337. package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
  338. package/dist/modules/versioning/ruby/strategies/widen.js +3 -2
  339. package/dist/modules/versioning/ruby/strategies/widen.js.map +1 -1
  340. package/dist/util/cache/package/index.js +3 -1
  341. package/dist/util/cache/package/index.js.map +1 -1
  342. package/dist/util/cache/package/with-cache.js +7 -4
  343. package/dist/util/cache/package/with-cache.js.map +1 -1
  344. package/dist/util/cache/repository/impl/base.js +3 -2
  345. package/dist/util/cache/repository/impl/base.js.map +1 -1
  346. package/dist/util/cache/repository/impl/local.js +2 -1
  347. package/dist/util/cache/repository/impl/local.js.map +1 -1
  348. package/dist/util/cache/repository/impl/s3.js +4 -1
  349. package/dist/util/cache/repository/impl/s3.js.map +1 -1
  350. package/dist/util/date.js +1 -1
  351. package/dist/util/date.js.map +1 -1
  352. package/dist/util/emoji.js +6 -2
  353. package/dist/util/emoji.js.map +1 -1
  354. package/dist/util/exec/common.js +1 -1
  355. package/dist/util/exec/common.js.map +1 -1
  356. package/dist/util/exec/docker/index.js +2 -1
  357. package/dist/util/exec/docker/index.js.map +1 -1
  358. package/dist/util/exec/hermit.js +2 -1
  359. package/dist/util/exec/hermit.js.map +1 -1
  360. package/dist/util/exec/index.js +1 -1
  361. package/dist/util/exec/index.js.map +1 -1
  362. package/dist/util/fs/index.js +2 -1
  363. package/dist/util/fs/index.js.map +1 -1
  364. package/dist/util/git/index.js +32 -34
  365. package/dist/util/git/index.js.map +1 -1
  366. package/dist/util/git/url.js +2 -3
  367. package/dist/util/git/url.js.map +1 -1
  368. package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js +4 -2
  369. package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js.map +1 -1
  370. package/dist/util/github/graphql/datasource-fetcher.js +3 -1
  371. package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
  372. package/dist/util/http/cache/memory-http-cache-provider.js +2 -1
  373. package/dist/util/http/cache/memory-http-cache-provider.js.map +1 -1
  374. package/dist/util/http/github.js +3 -2
  375. package/dist/util/http/github.js.map +1 -1
  376. package/dist/util/http/http.js +2 -1
  377. package/dist/util/http/http.js.map +1 -1
  378. package/dist/util/http/index.js +1 -0
  379. package/dist/util/http/index.js.map +1 -1
  380. package/dist/util/http/www-authenticate.js +1 -3
  381. package/dist/util/http/www-authenticate.js.map +1 -1
  382. package/dist/util/mutex.js +1 -1
  383. package/dist/util/mutex.js.map +1 -1
  384. package/dist/util/schema-utils/index.js +1 -1
  385. package/dist/util/schema-utils/index.js.map +1 -1
  386. package/dist/util/toml.js +2 -1
  387. package/dist/util/toml.js.map +1 -1
  388. package/dist/util/yaml.js +4 -2
  389. package/dist/util/yaml.js.map +1 -1
  390. package/dist/workers/global/config/parse/util.js.map +1 -1
  391. package/dist/workers/global/index.js +2 -2
  392. package/dist/workers/global/index.js.map +1 -1
  393. package/dist/workers/repository/changelog/index.js +2 -1
  394. package/dist/workers/repository/changelog/index.js.map +1 -1
  395. package/dist/workers/repository/config-migration/branch/rebase.js +2 -1
  396. package/dist/workers/repository/config-migration/branch/rebase.js.map +1 -1
  397. package/dist/workers/repository/error-config.js +1 -1
  398. package/dist/workers/repository/error-config.js.map +1 -1
  399. package/dist/workers/repository/finalize/prune.js +1 -1
  400. package/dist/workers/repository/finalize/prune.js.map +1 -1
  401. package/dist/workers/repository/finalize/repository-statistics.js +1 -4
  402. package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
  403. package/dist/workers/repository/index.js +8 -5
  404. package/dist/workers/repository/index.js.map +1 -1
  405. package/dist/workers/repository/init/vulnerability.js +1 -1
  406. package/dist/workers/repository/init/vulnerability.js.map +1 -1
  407. package/dist/workers/repository/onboarding/branch/config.js +2 -1
  408. package/dist/workers/repository/onboarding/branch/config.js.map +1 -1
  409. package/dist/workers/repository/onboarding/branch/create.js +2 -1
  410. package/dist/workers/repository/onboarding/branch/create.js.map +1 -1
  411. package/dist/workers/repository/onboarding/branch/index.js +2 -1
  412. package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
  413. package/dist/workers/repository/onboarding/pr/index.js +3 -1
  414. package/dist/workers/repository/onboarding/pr/index.js.map +1 -1
  415. package/dist/workers/repository/process/lookup/filter-checks.js +2 -1
  416. package/dist/workers/repository/process/lookup/filter-checks.js.map +1 -1
  417. package/dist/workers/repository/process/lookup/filter.js +1 -1
  418. package/dist/workers/repository/process/lookup/filter.js.map +1 -1
  419. package/dist/workers/repository/process/lookup/generate.js +1 -1
  420. package/dist/workers/repository/process/lookup/generate.js.map +1 -1
  421. package/dist/workers/repository/process/lookup/index.js +6 -3
  422. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  423. package/dist/workers/repository/process/lookup/rollback.js +1 -1
  424. package/dist/workers/repository/process/lookup/rollback.js.map +1 -1
  425. package/dist/workers/repository/process/vulnerabilities.js +2 -1
  426. package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
  427. package/dist/workers/repository/process/write.js +8 -4
  428. package/dist/workers/repository/process/write.js.map +1 -1
  429. package/dist/workers/repository/reconfigure/validate.js +2 -1
  430. package/dist/workers/repository/reconfigure/validate.js.map +1 -1
  431. package/dist/workers/repository/update/branch/auto-replace.js +1 -1
  432. package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
  433. package/dist/workers/repository/update/branch/bump-versions.js +2 -1
  434. package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
  435. package/dist/workers/repository/update/branch/index.js +3 -1
  436. package/dist/workers/repository/update/branch/index.js.map +1 -1
  437. package/dist/workers/repository/update/pr/automerge.js +1 -1
  438. package/dist/workers/repository/update/pr/automerge.js.map +1 -1
  439. package/dist/workers/repository/update/pr/body/updates-table.js +1 -1
  440. package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
  441. package/dist/workers/repository/update/pr/changelog/github/index.js +2 -1
  442. package/dist/workers/repository/update/pr/changelog/github/index.js.map +1 -1
  443. package/dist/workers/repository/update/pr/changelog/github/source.js +2 -1
  444. package/dist/workers/repository/update/pr/changelog/github/source.js.map +1 -1
  445. package/dist/workers/repository/update/pr/changelog/index.js +1 -1
  446. package/dist/workers/repository/update/pr/changelog/index.js.map +1 -1
  447. package/dist/workers/repository/update/pr/changelog/release-notes.js +5 -5
  448. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  449. package/dist/workers/repository/update/pr/changelog/releases.js +1 -1
  450. package/dist/workers/repository/update/pr/changelog/releases.js.map +1 -1
  451. package/dist/workers/repository/update/pr/index.js +6 -3
  452. package/dist/workers/repository/update/pr/index.js.map +1 -1
  453. package/dist/workers/repository/update/pr/pr-reuse.js +1 -1
  454. package/dist/workers/repository/update/pr/pr-reuse.js.map +1 -1
  455. package/package.json +1 -1
  456. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/github-release-attachments/index.ts"],"sourcesContent":["import { isBoolean } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { queryReleases } from '../../../util/github/graphql/index.ts';\nimport type {\n GithubDigestFile,\n GithubRestAsset,\n GithubRestRelease,\n} from '../../../util/github/types.ts';\nimport { getApiBaseUrl, getSourceUrl } from '../../../util/github/url.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\n\nexport const cacheNamespace = 'datasource-github-releases';\n\nfunction inferHashAlg(digest: string): string {\n switch (digest.length) {\n case 64:\n return 'sha256';\n default:\n case 96:\n return 'sha512';\n }\n}\n\nexport class GithubReleaseAttachmentsDatasource extends Datasource {\n static readonly id = 'github-release-attachments';\n\n override readonly defaultRegistryUrls = ['https://github.com'];\n\n override http: GithubHttp;\n\n override readonly releaseTimestampSupport = true;\n // Note: not sure\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `releaseTimestamp` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n constructor() {\n super(GithubReleaseAttachmentsDatasource.id);\n this.http = new GithubHttp(GithubReleaseAttachmentsDatasource.id);\n }\n\n private async _findDigestFile(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const smallAssets = release.assets.filter(\n (a: GithubRestAsset) => a.size < 5 * 1024,\n );\n for (const asset of smallAssets) {\n const res = await this.http.getText(asset.browser_download_url);\n for (const line of res.body.split(newlineRegex)) {\n const [lineDigest, lineFilename] = line.split(regEx(/\\s+/), 2);\n if (lineDigest === digest) {\n return {\n assetName: asset.name,\n digestedFileName: lineFilename,\n currentVersion: release.tag_name,\n currentDigest: lineDigest,\n };\n }\n }\n }\n return null;\n }\n\n findDigestFile(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n return withCache(\n {\n ttlMinutes: 1440,\n namespace: `datasource-${GithubReleaseAttachmentsDatasource.id}`,\n key: `findDigestFile:${release.html_url}:${digest}`,\n },\n () => this._findDigestFile(release, digest),\n );\n }\n\n private async _downloadAndDigest(\n asset: GithubRestAsset,\n algorithm: string,\n ): Promise<string> {\n const res = this.http.stream(asset.browser_download_url);\n const digest = await hashStream(res, algorithm);\n return digest;\n }\n\n downloadAndDigest(\n asset: GithubRestAsset,\n algorithm: string,\n ): Promise<string> {\n return withCache(\n {\n ttlMinutes: 1440,\n namespace: `datasource-${GithubReleaseAttachmentsDatasource.id}`,\n key: `downloadAndDigest:${asset.browser_download_url}:${algorithm}`,\n },\n () => this._downloadAndDigest(asset, algorithm),\n );\n }\n\n async findAssetWithDigest(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const algorithm = inferHashAlg(digest);\n const assetsBySize = release.assets.sort(\n (a: GithubRestAsset, b: GithubRestAsset) => {\n if (a.size < b.size) {\n return -1;\n }\n if (a.size > b.size) {\n return 1;\n }\n return 0;\n },\n );\n\n for (const asset of assetsBySize) {\n const assetDigest = await this.downloadAndDigest(asset, algorithm);\n if (assetDigest === digest) {\n return {\n assetName: asset.name,\n currentVersion: release.tag_name,\n currentDigest: assetDigest,\n };\n }\n }\n return null;\n }\n\n /** Identify the asset associated with a known digest. */\n async findDigestAsset(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const digestFile = await this.findDigestFile(release, digest);\n if (digestFile) {\n return digestFile;\n }\n\n const asset = await this.findAssetWithDigest(release, digest);\n return asset;\n }\n\n /** Given a digest asset, find the equivalent digest in a different release. */\n async mapDigestAssetToRelease(\n digestAsset: GithubDigestFile,\n release: GithubRestRelease,\n ): Promise<string | null> {\n const current = digestAsset.currentVersion.replace(regEx(/^v/), '');\n const next = release.tag_name.replace(regEx(/^v/), '');\n\n if (digestAsset.digestedFileName) {\n const checksumAssetName = digestAsset.assetName.replace(current, next);\n const checksumAsset = release.assets.find(\n (a: GithubRestAsset) => a.name === checksumAssetName,\n );\n\n // If the checksum asset is not found in the new release, fall back to the download method\n if (checksumAsset) {\n const releaseFilename = digestAsset.digestedFileName.replace(\n current,\n next,\n );\n const res = await this.http.getText(checksumAsset.browser_download_url);\n for (const line of res.body.split(newlineRegex)) {\n const [lineDigest, lineFn] = line.split(regEx(/\\s+/), 2);\n if (lineFn === releaseFilename) {\n return lineDigest;\n }\n }\n return null;\n }\n }\n\n const oldFileName = digestAsset.digestedFileName ?? digestAsset.assetName;\n const fileName = oldFileName.replace(current, next);\n\n const asset = release.assets.find(\n (a: GithubRestAsset) => a.name === fileName,\n );\n\n if (!asset) {\n return null;\n }\n\n const algorithm = inferHashAlg(digestAsset.currentDigest);\n const newDigest = await this.downloadAndDigest(asset, algorithm);\n return newDigest;\n }\n\n /**\n * Attempts to resolve the digest for the specified package.\n *\n * The `newValue` supplied here should be a valid tag for the GitHub release.\n * Requires `currentValue` and `currentDigest`.\n *\n * There may be many assets attached to the release. This function will:\n * - Identify the asset pinned by `currentDigest` in the `currentValue` release\n * - Download small release assets, parse as checksum manifests (e.g. `SHASUMS.txt`).\n * - Download individual assets until `currentDigest` is encountered. This is limited to sha256 and sha512.\n * - Map the hashed asset to `newValue` and return the updated digest as a string\n */\n override async getDigest(\n {\n packageName: repo,\n currentValue,\n currentDigest,\n registryUrl,\n }: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n logger.debug(\n { repo, currentValue, currentDigest, registryUrl, newValue },\n 'getDigest',\n );\n if (!currentDigest) {\n return null;\n }\n if (!currentValue) {\n return currentDigest;\n }\n\n const apiBaseUrl = getApiBaseUrl(registryUrl);\n const { body: currentRelease } =\n await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${repo}/releases/tags/${currentValue}`,\n );\n const digestAsset = await this.findDigestAsset(\n currentRelease,\n currentDigest,\n );\n let newDigest: string | null;\n if (!digestAsset || newValue === currentValue) {\n newDigest = currentDigest;\n } else {\n const { body: newRelease } =\n await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${repo}/releases/tags/${newValue}`,\n );\n newDigest = await this.mapDigestAssetToRelease(digestAsset, newRelease);\n }\n return newDigest;\n }\n\n /**\n * This function can be used to fetch releases with a customizable versioning\n * (e.g. semver) and with releases.\n *\n * This function will:\n * - Fetch all releases\n * - Sanitize the versions if desired (e.g. strip out leading 'v')\n * - Return a dependency object containing sourceUrl string and releases array\n */\n async getReleases(config: GetReleasesConfig): Promise<ReleaseResult> {\n const releasesResult = await queryReleases(config, this.http);\n const releases = releasesResult.map((item) => {\n const { version, releaseTimestamp, isStable } = item;\n const result: Release = {\n version,\n gitRef: version,\n releaseTimestamp,\n };\n if (isBoolean(isStable)) {\n result.isStable = isStable;\n }\n return result;\n });\n const sourceUrl = getSourceUrl(config.packageName, config.registryUrl);\n return { sourceUrl, releases };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/github-release-attachments/index.ts"],"sourcesContent":["import { isBoolean } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { queryReleases } from '../../../util/github/graphql/index.ts';\nimport type {\n GithubDigestFile,\n GithubRestAsset,\n GithubRestRelease,\n} from '../../../util/github/types.ts';\nimport { getApiBaseUrl, getSourceUrl } from '../../../util/github/url.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\n\nexport const cacheNamespace = 'datasource-github-releases';\n\nfunction inferHashAlg(digest: string): string {\n switch (digest.length) {\n case 64:\n return 'sha256';\n default:\n case 96:\n return 'sha512';\n }\n}\n\nexport class GithubReleaseAttachmentsDatasource extends Datasource {\n static readonly id = 'github-release-attachments';\n\n override readonly defaultRegistryUrls = ['https://github.com'];\n\n override http: GithubHttp;\n\n override readonly releaseTimestampSupport = true;\n // Note: not sure\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `releaseTimestamp` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n constructor() {\n super(GithubReleaseAttachmentsDatasource.id);\n this.http = new GithubHttp(GithubReleaseAttachmentsDatasource.id);\n }\n\n private async _findDigestFile(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const smallAssets = release.assets.filter(\n (a: GithubRestAsset) => a.size < 5 * 1024,\n );\n for (const asset of smallAssets) {\n const res = await this.http.getText(asset.browser_download_url);\n for (const line of res.body.split(newlineRegex)) {\n const [lineDigest, lineFilename] = line.split(regEx(/\\s+/), 2);\n if (lineDigest === digest) {\n return {\n assetName: asset.name,\n digestedFileName: lineFilename,\n currentVersion: release.tag_name,\n currentDigest: lineDigest,\n };\n }\n }\n }\n return null;\n }\n\n findDigestFile(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n return withCache(\n {\n ttlMinutes: 1440,\n namespace: `datasource-${GithubReleaseAttachmentsDatasource.id}`,\n key: `findDigestFile:${release.html_url}:${digest}`,\n },\n () => this._findDigestFile(release, digest),\n );\n }\n\n private async _downloadAndDigest(\n asset: GithubRestAsset,\n algorithm: string,\n ): Promise<string> {\n const res = this.http.stream(asset.browser_download_url);\n const digest = await hashStream(res, algorithm);\n return digest;\n }\n\n downloadAndDigest(\n asset: GithubRestAsset,\n algorithm: string,\n ): Promise<string> {\n return withCache(\n {\n ttlMinutes: 1440,\n namespace: `datasource-${GithubReleaseAttachmentsDatasource.id}`,\n key: `downloadAndDigest:${asset.browser_download_url}:${algorithm}`,\n },\n () => this._downloadAndDigest(asset, algorithm),\n );\n }\n\n async findAssetWithDigest(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const algorithm = inferHashAlg(digest);\n const assetsBySize = release.assets.sort(\n (a: GithubRestAsset, b: GithubRestAsset) => {\n if (a.size < b.size) {\n return -1;\n }\n if (a.size > b.size) {\n return 1;\n }\n return 0;\n },\n );\n\n for (const asset of assetsBySize) {\n const assetDigest = await this.downloadAndDigest(asset, algorithm);\n if (assetDigest === digest) {\n return {\n assetName: asset.name,\n currentVersion: release.tag_name,\n currentDigest: assetDigest,\n };\n }\n }\n return null;\n }\n\n /** Identify the asset associated with a known digest. */\n async findDigestAsset(\n release: GithubRestRelease,\n digest: string,\n ): Promise<GithubDigestFile | null> {\n const digestFile = await this.findDigestFile(release, digest);\n if (digestFile) {\n return digestFile;\n }\n\n const asset = await this.findAssetWithDigest(release, digest);\n return asset;\n }\n\n /** Given a digest asset, find the equivalent digest in a different release. */\n async mapDigestAssetToRelease(\n digestAsset: GithubDigestFile,\n release: GithubRestRelease,\n ): Promise<string | null> {\n const current = digestAsset.currentVersion.replace(regEx(/^v/), '');\n const next = release.tag_name.replace(regEx(/^v/), '');\n\n if (digestAsset.digestedFileName) {\n const checksumAssetName = digestAsset.assetName.replace(current, next);\n const checksumAsset = release.assets.find(\n (a: GithubRestAsset) => a.name === checksumAssetName,\n );\n\n // If the checksum asset is not found in the new release, fall back to the download method\n if (checksumAsset) {\n const releaseFilename = digestAsset.digestedFileName.replace(\n current,\n next,\n );\n const res = await this.http.getText(checksumAsset.browser_download_url);\n for (const line of res.body.split(newlineRegex)) {\n const [lineDigest, lineFn] = line.split(regEx(/\\s+/), 2);\n if (lineFn === releaseFilename) {\n return lineDigest;\n }\n }\n return null;\n }\n }\n\n const oldFileName = digestAsset.digestedFileName ?? digestAsset.assetName;\n const fileName = oldFileName.replace(current, next);\n\n const asset = release.assets.find(\n (a: GithubRestAsset) => a.name === fileName,\n );\n\n if (!asset) {\n return null;\n }\n\n const algorithm = inferHashAlg(digestAsset.currentDigest);\n const newDigest = await this.downloadAndDigest(asset, algorithm);\n return newDigest;\n }\n\n /**\n * Attempts to resolve the digest for the specified package.\n *\n * The `newValue` supplied here should be a valid tag for the GitHub release.\n * Requires `currentValue` and `currentDigest`.\n *\n * There may be many assets attached to the release. This function will:\n * - Identify the asset pinned by `currentDigest` in the `currentValue` release\n * - Download small release assets, parse as checksum manifests (e.g. `SHASUMS.txt`).\n * - Download individual assets until `currentDigest` is encountered. This is limited to sha256 and sha512.\n * - Map the hashed asset to `newValue` and return the updated digest as a string\n */\n override async getDigest(\n {\n packageName: repo,\n currentValue,\n currentDigest,\n registryUrl,\n }: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n logger.debug(\n { repo, currentValue, currentDigest, registryUrl, newValue },\n 'getDigest',\n );\n if (!currentDigest) {\n return null;\n }\n if (!currentValue) {\n return currentDigest;\n }\n\n const apiBaseUrl = getApiBaseUrl(registryUrl);\n const { body: currentRelease } =\n await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${repo}/releases/tags/${currentValue}`,\n );\n const digestAsset = await this.findDigestAsset(\n currentRelease,\n currentDigest,\n );\n let newDigest: string | null;\n if (!digestAsset || newValue === currentValue) {\n newDigest = currentDigest;\n } else {\n const { body: newRelease } =\n await this.http.getJsonUnchecked<GithubRestRelease>(\n `${apiBaseUrl}repos/${repo}/releases/tags/${newValue}`,\n );\n newDigest = await this.mapDigestAssetToRelease(digestAsset, newRelease);\n }\n return newDigest;\n }\n\n /**\n * This function can be used to fetch releases with a customizable versioning\n * (e.g. semver) and with releases.\n *\n * This function will:\n * - Fetch all releases\n * - Sanitize the versions if desired (e.g. strip out leading 'v')\n * - Return a dependency object containing sourceUrl string and releases array\n */\n async getReleases(config: GetReleasesConfig): Promise<ReleaseResult> {\n const releasesResult = await queryReleases(config, this.http);\n const releases = releasesResult.map((item) => {\n const { version, releaseTimestamp, isStable } = item;\n const result: Release = {\n version,\n gitRef: version,\n releaseTimestamp,\n };\n if (isBoolean(isStable)) {\n result.isStable = isStable;\n }\n return result;\n });\n const sourceUrl = getSourceUrl(config.packageName, config.registryUrl);\n return { sourceUrl, releases };\n }\n}\n"],"mappings":"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"}
@@ -64,7 +64,7 @@ var GithubTagsDatasource = class GithubTagsDatasource extends Datasource {
64
64
  const releaseTimestamp = releasesMap.get(release.version)?.releaseTimestamp;
65
65
  if (releaseTimestamp && (isNullOrUndefined(release.releaseTimestamp) || releaseTimestamp > release.releaseTimestamp)) release.releaseTimestamp = releaseTimestamp;
66
66
  }
67
- } catch (err) /* istanbul ignore next */ {
67
+ } catch (err) /* istanbul ignore next */ {
68
68
  logger.debug({ err }, `Error fetching additional info for GitHub tags`);
69
69
  }
70
70
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/github-tags/index.ts"],"sourcesContent":["import { isBoolean, isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport {\n queryReleases,\n queryTags,\n} from '../../../util/github/graphql/index.ts';\nimport type { GithubReleaseItem } from '../../../util/github/graphql/types.ts';\nimport { findCommitOfTag } from '../../../util/github/tags.ts';\nimport { getApiBaseUrl, getSourceUrl } from '../../../util/github/url.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\n\nexport class GithubTagsDatasource extends Datasource {\n static readonly id = 'github-tags';\n\n override readonly defaultRegistryUrls = ['https://github.com'];\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n // Note: not sure\n override readonly releaseTimestampNote =\n 'The get release timestamp is determined from the `releaseTimestamp` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n override http: GithubHttp;\n\n constructor() {\n super(GithubTagsDatasource.id);\n this.http = new GithubHttp(GithubTagsDatasource.id);\n }\n\n async getCommit(\n registryUrl: string | undefined,\n githubRepo: string,\n ): Promise<string | null> {\n const apiBaseUrl = getApiBaseUrl(registryUrl);\n let digest: string | null = null;\n try {\n const url = `${apiBaseUrl}repos/${githubRepo}/commits?per_page=1`;\n const res = await this.http.getJsonUnchecked<{ sha: string }[]>(url, {\n cacheProvider: memCacheProvider,\n });\n digest = res.body[0].sha;\n } catch (err) {\n logger.debug(\n { githubRepo, err, registryUrl },\n 'Error getting latest commit from GitHub repo',\n );\n }\n return digest;\n }\n\n /**\n * github.getDigest\n *\n * The `newValue` supplied here should be a valid tag for the docker image.\n *\n * Returns the latest commit hash for the repository.\n */\n override getDigest(\n { packageName: repo, registryUrl }: Partial<DigestConfig>,\n newValue?: string,\n ): Promise<string | null> {\n return newValue\n ? findCommitOfTag(registryUrl, repo!, newValue, this.http)\n : this.getCommit(registryUrl, repo!);\n }\n\n override async getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult> {\n const { registryUrl, packageName: repo } = config;\n const sourceUrl = getSourceUrl(repo, registryUrl);\n const tagsResult = await queryTags(config, this.http);\n const releases: Release[] = tagsResult.map(\n ({ version, releaseTimestamp, gitRef, hash }) => ({\n newDigest: hash,\n version,\n releaseTimestamp,\n gitRef,\n }),\n );\n\n try {\n // Fetch additional data from releases endpoint when possible\n const releasesResult = await queryReleases(config, this.http);\n const releasesMap = new Map<string, GithubReleaseItem>();\n for (const release of releasesResult) {\n releasesMap.set(release.version, release);\n }\n\n for (const release of releases) {\n const isReleaseStable = releasesMap.get(release.version)?.isStable;\n if (isBoolean(isReleaseStable)) {\n release.isStable = isReleaseStable;\n }\n\n const releaseTimestamp = releasesMap.get(\n release.version,\n )?.releaseTimestamp;\n if (\n releaseTimestamp &&\n (isNullOrUndefined(release.releaseTimestamp) ||\n releaseTimestamp > release.releaseTimestamp)\n ) {\n release.releaseTimestamp = releaseTimestamp;\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err }, `Error fetching additional info for GitHub tags`);\n }\n\n const dependency: ReleaseResult = {\n sourceUrl,\n releases,\n };\n return dependency;\n }\n}\n"],"mappings":";;;;;;;;;AAmBA,IAAa,uBAAb,MAAa,6BAA6B,WAAW;CACnD,OAAgB,KAAK;CAErB,sBAAwC,CAAC,oBAAoB;CAE7D,mBAAqC;CAErC,0BAA4C;CAE5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF;CAEA,cAAc;EACZ,MAAM,qBAAqB,EAAE;EAC7B,KAAK,OAAO,IAAI,WAAW,qBAAqB,EAAE;CACpD;CAEA,MAAM,UACJ,aACA,YACwB;EACxB,MAAM,aAAa,cAAc,WAAW;EAC5C,IAAI,SAAwB;EAC5B,IAAI;GACF,MAAM,MAAM,GAAG,WAAW,QAAQ,WAAW;GAI7C,UAAS,MAHS,KAAK,KAAK,iBAAoC,KAAK,EACnE,eAAe,iBACjB,CAAC,EAAA,CACY,KAAK,EAAE,CAAC;EACvB,SAAS,KAAK;GACZ,OAAO,MACL;IAAE;IAAY;IAAK;GAAY,GAC/B,8CACF;EACF;EACA,OAAO;CACT;;;;;;;;CASA,UACE,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,OAAO,WACH,gBAAgB,aAAa,MAAO,UAAU,KAAK,IAAI,IACvD,KAAK,UAAU,aAAa,IAAK;CACvC;CAEA,MAAe,YACb,QACwB;EACxB,MAAM,EAAE,aAAa,aAAa,SAAS;EAC3C,MAAM,YAAY,aAAa,MAAM,WAAW;EAEhD,MAAM,YAAsB,MADH,UAAU,QAAQ,KAAK,IAAI,EAAA,CACb,KACpC,EAAE,SAAS,kBAAkB,QAAQ,YAAY;GAChD,WAAW;GACX;GACA;GACA;EACF,EACF;EAEA,IAAI;GAEF,MAAM,iBAAiB,MAAM,cAAc,QAAQ,KAAK,IAAI;GAC5D,MAAM,8BAAc,IAAI,IAA+B;GACvD,KAAK,MAAM,WAAW,gBACpB,YAAY,IAAI,QAAQ,SAAS,OAAO;GAG1C,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,kBAAkB,YAAY,IAAI,QAAQ,OAAO,CAAC,EAAE;IAC1D,IAAI,UAAU,eAAe,GAC3B,QAAQ,WAAW;IAGrB,MAAM,mBAAmB,YAAY,IACnC,QAAQ,OACV,CAAC,EAAE;IACH,IACE,qBACC,kBAAkB,QAAQ,gBAAgB,KACzC,mBAAmB,QAAQ,mBAE7B,QAAQ,mBAAmB;GAE/B;EACF,SAAS,kCAAgC;GACvC,OAAO,MAAM,EAAE,IAAI,GAAG,gDAAgD;EACxE;EAMA,OAAO;GAHL;GACA;EAEc;CAClB;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/github-tags/index.ts"],"sourcesContent":["import { isBoolean, isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport {\n queryReleases,\n queryTags,\n} from '../../../util/github/graphql/index.ts';\nimport type { GithubReleaseItem } from '../../../util/github/graphql/types.ts';\nimport { findCommitOfTag } from '../../../util/github/tags.ts';\nimport { getApiBaseUrl, getSourceUrl } from '../../../util/github/url.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\n\nexport class GithubTagsDatasource extends Datasource {\n static readonly id = 'github-tags';\n\n override readonly defaultRegistryUrls = ['https://github.com'];\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n // Note: not sure\n override readonly releaseTimestampNote =\n 'The get release timestamp is determined from the `releaseTimestamp` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n override http: GithubHttp;\n\n constructor() {\n super(GithubTagsDatasource.id);\n this.http = new GithubHttp(GithubTagsDatasource.id);\n }\n\n async getCommit(\n registryUrl: string | undefined,\n githubRepo: string,\n ): Promise<string | null> {\n const apiBaseUrl = getApiBaseUrl(registryUrl);\n let digest: string | null = null;\n try {\n const url = `${apiBaseUrl}repos/${githubRepo}/commits?per_page=1`;\n const res = await this.http.getJsonUnchecked<{ sha: string }[]>(url, {\n cacheProvider: memCacheProvider,\n });\n digest = res.body[0].sha;\n } catch (err) {\n logger.debug(\n { githubRepo, err, registryUrl },\n 'Error getting latest commit from GitHub repo',\n );\n }\n return digest;\n }\n\n /**\n * github.getDigest\n *\n * The `newValue` supplied here should be a valid tag for the docker image.\n *\n * Returns the latest commit hash for the repository.\n */\n override getDigest(\n { packageName: repo, registryUrl }: Partial<DigestConfig>,\n newValue?: string,\n ): Promise<string | null> {\n return newValue\n ? findCommitOfTag(registryUrl, repo!, newValue, this.http)\n : this.getCommit(registryUrl, repo!);\n }\n\n override async getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult> {\n const { registryUrl, packageName: repo } = config;\n const sourceUrl = getSourceUrl(repo, registryUrl);\n const tagsResult = await queryTags(config, this.http);\n const releases: Release[] = tagsResult.map(\n ({ version, releaseTimestamp, gitRef, hash }) => ({\n newDigest: hash,\n version,\n releaseTimestamp,\n gitRef,\n }),\n );\n\n try {\n // Fetch additional data from releases endpoint when possible\n const releasesResult = await queryReleases(config, this.http);\n const releasesMap = new Map<string, GithubReleaseItem>();\n for (const release of releasesResult) {\n releasesMap.set(release.version, release);\n }\n\n for (const release of releases) {\n const isReleaseStable = releasesMap.get(release.version)?.isStable;\n if (isBoolean(isReleaseStable)) {\n release.isStable = isReleaseStable;\n }\n\n const releaseTimestamp = releasesMap.get(\n release.version,\n )?.releaseTimestamp;\n if (\n releaseTimestamp &&\n (isNullOrUndefined(release.releaseTimestamp) ||\n releaseTimestamp > release.releaseTimestamp)\n ) {\n release.releaseTimestamp = releaseTimestamp;\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err }, `Error fetching additional info for GitHub tags`);\n }\n\n const dependency: ReleaseResult = {\n sourceUrl,\n releases,\n };\n return dependency;\n }\n}\n"],"mappings":";;;;;;;;;AAmBA,IAAa,uBAAb,MAAa,6BAA6B,WAAW;CACnD,OAAgB,KAAK;CAErB,sBAAwC,CAAC,oBAAoB;CAE7D,mBAAqC;CAErC,0BAA4C;CAE5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF;CAEA,cAAc;EACZ,MAAM,qBAAqB,EAAE;EAC7B,KAAK,OAAO,IAAI,WAAW,qBAAqB,EAAE;CACpD;CAEA,MAAM,UACJ,aACA,YACwB;EACxB,MAAM,aAAa,cAAc,WAAW;EAC5C,IAAI,SAAwB;EAC5B,IAAI;GACF,MAAM,MAAM,GAAG,WAAW,QAAQ,WAAW;GAI7C,UAAS,MAHS,KAAK,KAAK,iBAAoC,KAAK,EACnE,eAAe,iBACjB,CAAC,EAAA,CACY,KAAK,EAAE,CAAC;EACvB,SAAS,KAAK;GACZ,OAAO,MACL;IAAE;IAAY;IAAK;GAAY,GAC/B,8CACF;EACF;EACA,OAAO;CACT;;;;;;;;CASA,UACE,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,OAAO,WACH,gBAAgB,aAAa,MAAO,UAAU,KAAK,IAAI,IACvD,KAAK,UAAU,aAAa,IAAK;CACvC;CAEA,MAAe,YACb,QACwB;EACxB,MAAM,EAAE,aAAa,aAAa,SAAS;EAC3C,MAAM,YAAY,aAAa,MAAM,WAAW;EAEhD,MAAM,YAAsB,MADH,UAAU,QAAQ,KAAK,IAAI,EAAA,CACb,KACpC,EAAE,SAAS,kBAAkB,QAAQ,YAAY;GAChD,WAAW;GACX;GACA;GACA;EACF,EACF;EAEA,IAAI;GAEF,MAAM,iBAAiB,MAAM,cAAc,QAAQ,KAAK,IAAI;GAC5D,MAAM,8BAAc,IAAI,IAA+B;GACvD,KAAK,MAAM,WAAW,gBACpB,YAAY,IAAI,QAAQ,SAAS,OAAO;GAG1C,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,kBAAkB,YAAY,IAAI,QAAQ,OAAO,CAAC,EAAE;IAC1D,IAAI,UAAU,eAAe,GAC3B,QAAQ,WAAW;IAGrB,MAAM,mBAAmB,YAAY,IACnC,QAAQ,OACV,CAAC,EAAE;IACH,IACE,qBACC,kBAAkB,QAAQ,gBAAgB,KACzC,mBAAmB,QAAQ,mBAE7B,QAAQ,mBAAmB;GAE/B;EACF,SAAS,gCAAgC;GACvC,OAAO,MAAM,EAAE,IAAI,GAAG,gDAAgD;EACxE;EAMA,OAAO;GAHL;GACA;EAEc;CAClB;AACF"}
@@ -19,7 +19,8 @@ var GitlabTagsDatasource = class GitlabTagsDatasource extends Datasource {
19
19
  }
20
20
  defaultRegistryUrls = [defaultRegistryUrl];
21
21
  async _getReleases({ registryUrl, packageName: repo }) {
22
- const url = joinUrlParts(getDepHost(registryUrl), `api/v4/projects`, encodeURIComponent(repo), `repository/tags?per_page=100`);
22
+ const depHost = getDepHost(registryUrl);
23
+ const url = joinUrlParts(depHost, `api/v4/projects`, encodeURIComponent(repo), `repository/tags?per_page=100`);
23
24
  const gitlabTags = (await this.http.getJsonUnchecked(url, { paginate: true })).body;
24
25
  const dependency = {
25
26
  sourceUrl: getSourceUrl(repo, registryUrl),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/gitlab-tags/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { GitlabHttp } from '../../../util/http/gitlab.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport type { GitlabCommit, GitlabTag } from './types.ts';\nimport { defaultRegistryUrl, getDepHost, getSourceUrl } from './util.ts';\n\nexport class GitlabTagsDatasource extends Datasource {\n static readonly id = 'gitlab-tags';\n\n protected override http: GitlabHttp;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'To get release timestamp we use the `created_at` field from the response.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n constructor() {\n super(GitlabTagsDatasource.id);\n this.http = new GitlabHttp(GitlabTagsDatasource.id);\n }\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const depHost = getDepHost(registryUrl);\n\n const urlEncodedRepo = encodeURIComponent(repo);\n\n // tag\n const url = joinUrlParts(\n depHost,\n `api/v4/projects`,\n urlEncodedRepo,\n `repository/tags?per_page=100`,\n );\n\n const gitlabTags = (\n await this.http.getJsonUnchecked<GitlabTag[]>(url, {\n paginate: true,\n })\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: getSourceUrl(repo, registryUrl),\n releases: [],\n };\n dependency.releases = gitlabTags.map(({ name, commit }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(commit?.created_at),\n }));\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GitlabTagsDatasource.id}`,\n key: `getReleases:${getDepHost(config.registryUrl)}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * gitlab.getDigest\n *\n * Returs the latest commit hash of the repository.\n */\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n const depHost = getDepHost(registryUrl);\n\n const urlEncodedRepo = encodeURIComponent(repo);\n let digest: string | null = null;\n\n try {\n if (newValue) {\n const url = joinUrlParts(\n depHost,\n `api/v4/projects`,\n urlEncodedRepo,\n `repository/commits/`,\n newValue,\n );\n const gitlabCommits =\n await this.http.getJsonUnchecked<GitlabCommit>(url);\n digest = gitlabCommits.body.id;\n } else {\n const url = joinUrlParts(\n depHost,\n `api/v4/projects`,\n urlEncodedRepo,\n `repository/commits?per_page=1`,\n );\n const gitlabCommits =\n await this.http.getJsonUnchecked<GitlabCommit[]>(url);\n digest = gitlabCommits.body[0].id;\n }\n } catch (err) {\n logger.debug(\n { gitlabRepo: repo, err, registryUrl },\n 'Error getting latest commit from Gitlab repo',\n );\n }\n\n if (!digest) {\n return null;\n }\n\n return digest;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${GitlabTagsDatasource.id}`,\n key: `getDigest:${getDepHost(config.registryUrl)}:${config.packageName}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,uBAAb,MAAa,6BAA6B,WAAW;CACnD,OAAgB,KAAK;CAErB;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,qBAAqB,EAAE;EAC7B,KAAK,OAAO,IAAI,WAAW,qBAAqB,EAAE;CACpD;CAEA,sBAAwC,CAAC,kBAAkB;CAE3D,MAAc,aAAa,EACzB,aACA,aAAa,QACsC;EAMnD,MAAM,MAAM,aALI,WAAW,WAMnB,GACN,mBALqB,mBAAmB,IAM3B,GACb,8BACF;EAEA,MAAM,cACJ,MAAM,KAAK,KAAK,iBAA8B,KAAK,EACjD,UAAU,KACZ,CAAC,EAAA,CACD;EAEF,MAAM,aAA4B;GAChC,WAAW,aAAa,MAAM,WAAW;GACzC,UAAU,CAAC;EACb;EACA,WAAW,WAAW,WAAW,KAAK,EAAE,MAAM,cAAc;GAC1D,SAAS;GACT,QAAQ;GACR,kBAAkB,YAAY,QAAQ,UAAU;EAClD,EAAE;EAEF,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,qBAAqB;GAC9C,KAAK,eAAe,WAAW,OAAO,WAAW,EAAE,GAAG,OAAO;GAC7D,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;;;;;;CAOA,MAAc,WACZ,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,MAAM,UAAU,WAAW,WAAW;EAEtC,MAAM,iBAAiB,mBAAmB,IAAI;EAC9C,IAAI,SAAwB;EAE5B,IAAI;GACF,IAAI,UAAU;IACZ,MAAM,MAAM,aACV,SACA,mBACA,gBACA,uBACA,QACF;IAGA,UAAS,MADD,KAAK,KAAK,iBAA+B,GAAG,EAAA,CAC7B,KAAK;GAC9B,OAAO;IACL,MAAM,MAAM,aACV,SACA,mBACA,gBACA,+BACF;IAGA,UAAS,MADD,KAAK,KAAK,iBAAiC,GAAG,EAAA,CAC/B,KAAK,EAAE,CAAC;GACjC;EACF,SAAS,KAAK;GACZ,OAAO,MACL;IAAE,YAAY;IAAM;IAAK;GAAY,GACrC,8CACF;EACF;EAEA,IAAI,CAAC,QACH,OAAO;EAGT,OAAO;CACT;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,cAAc,qBAAqB;GAC9C,KAAK,aAAa,WAAW,OAAO,WAAW,EAAE,GAAG,OAAO;GAC3D,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/gitlab-tags/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { GitlabHttp } from '../../../util/http/gitlab.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport type { GitlabCommit, GitlabTag } from './types.ts';\nimport { defaultRegistryUrl, getDepHost, getSourceUrl } from './util.ts';\n\nexport class GitlabTagsDatasource extends Datasource {\n static readonly id = 'gitlab-tags';\n\n protected override http: GitlabHttp;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'To get release timestamp we use the `created_at` field from the response.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n constructor() {\n super(GitlabTagsDatasource.id);\n this.http = new GitlabHttp(GitlabTagsDatasource.id);\n }\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const depHost = getDepHost(registryUrl);\n\n const urlEncodedRepo = encodeURIComponent(repo);\n\n // tag\n const url = joinUrlParts(\n depHost,\n `api/v4/projects`,\n urlEncodedRepo,\n `repository/tags?per_page=100`,\n );\n\n const gitlabTags = (\n await this.http.getJsonUnchecked<GitlabTag[]>(url, {\n paginate: true,\n })\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: getSourceUrl(repo, registryUrl),\n releases: [],\n };\n dependency.releases = gitlabTags.map(({ name, commit }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(commit?.created_at),\n }));\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GitlabTagsDatasource.id}`,\n key: `getReleases:${getDepHost(config.registryUrl)}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * gitlab.getDigest\n *\n * Returs the latest commit hash of the repository.\n */\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n const depHost = getDepHost(registryUrl);\n\n const urlEncodedRepo = encodeURIComponent(repo);\n let digest: string | null = null;\n\n try {\n if (newValue) {\n const url = joinUrlParts(\n depHost,\n `api/v4/projects`,\n urlEncodedRepo,\n `repository/commits/`,\n newValue,\n );\n const gitlabCommits =\n await this.http.getJsonUnchecked<GitlabCommit>(url);\n digest = gitlabCommits.body.id;\n } else {\n const url = joinUrlParts(\n depHost,\n `api/v4/projects`,\n urlEncodedRepo,\n `repository/commits?per_page=1`,\n );\n const gitlabCommits =\n await this.http.getJsonUnchecked<GitlabCommit[]>(url);\n digest = gitlabCommits.body[0].id;\n }\n } catch (err) {\n logger.debug(\n { gitlabRepo: repo, err, registryUrl },\n 'Error getting latest commit from Gitlab repo',\n );\n }\n\n if (!digest) {\n return null;\n }\n\n return digest;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${GitlabTagsDatasource.id}`,\n key: `getDigest:${getDepHost(config.registryUrl)}:${config.packageName}`,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,uBAAb,MAAa,6BAA6B,WAAW;CACnD,OAAgB,KAAK;CAErB;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,qBAAqB,EAAE;EAC7B,KAAK,OAAO,IAAI,WAAW,qBAAqB,EAAE;CACpD;CAEA,sBAAwC,CAAC,kBAAkB;CAE3D,MAAc,aAAa,EACzB,aACA,aAAa,QACsC;EACnD,MAAM,UAAU,WAAW,WAAW;EAKtC,MAAM,MAAM,aACV,SACA,mBALqB,mBAAmB,IAM3B,GACb,8BACF;EAEA,MAAM,cACJ,MAAM,KAAK,KAAK,iBAA8B,KAAK,EACjD,UAAU,KACZ,CAAC,EAAA,CACD;EAEF,MAAM,aAA4B;GAChC,WAAW,aAAa,MAAM,WAAW;GACzC,UAAU,CAAC;EACb;EACA,WAAW,WAAW,WAAW,KAAK,EAAE,MAAM,cAAc;GAC1D,SAAS;GACT,QAAQ;GACR,kBAAkB,YAAY,QAAQ,UAAU;EAClD,EAAE;EAEF,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,qBAAqB;GAC9C,KAAK,eAAe,WAAW,OAAO,WAAW,EAAE,GAAG,OAAO;GAC7D,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;;;;;;CAOA,MAAc,WACZ,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,MAAM,UAAU,WAAW,WAAW;EAEtC,MAAM,iBAAiB,mBAAmB,IAAI;EAC9C,IAAI,SAAwB;EAE5B,IAAI;GACF,IAAI,UAAU;IACZ,MAAM,MAAM,aACV,SACA,mBACA,gBACA,uBACA,QACF;IAGA,UAAS,MADD,KAAK,KAAK,iBAA+B,GAAG,EAAA,CAC7B,KAAK;GAC9B,OAAO;IACL,MAAM,MAAM,aACV,SACA,mBACA,gBACA,+BACF;IAGA,UAAS,MADD,KAAK,KAAK,iBAAiC,GAAG,EAAA,CAC/B,KAAK,EAAE,CAAC;GACjC;EACF,SAAS,KAAK;GACZ,OAAO,MACL;IAAE,YAAY;IAAM;IAAK;GAAY,GACrC,8CACF;EACF;EAEA,IAAI,CAAC,QACH,OAAO;EAGT,OAAO;CACT;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,cAAc,qBAAqB;GAC9C,KAAK,aAAa,WAAW,OAAO,WAAW,EAAE,GAAG,OAAO;GAC3D,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;AACF"}
@@ -6,7 +6,8 @@ function getDepHost(registryUrl = defaultRegistryUrl) {
6
6
  return registryUrl.replace(regEx(/\/api\/v4$/), "");
7
7
  }
8
8
  function getSourceUrl(packageName, registryUrl) {
9
- return joinUrlParts(getDepHost(registryUrl), packageName);
9
+ const depHost = getDepHost(registryUrl);
10
+ return joinUrlParts(depHost, packageName);
10
11
  }
11
12
  //#endregion
12
13
  export { defaultRegistryUrl, getDepHost, getSourceUrl };
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":[],"sources":["../../../../lib/modules/datasource/gitlab-tags/util.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\n\nexport const defaultRegistryUrl = 'https://gitlab.com';\n\nexport function getDepHost(registryUrl: string = defaultRegistryUrl): string {\n return registryUrl.replace(regEx(/\\/api\\/v4$/), '');\n}\n\nexport function getSourceUrl(\n packageName: string,\n registryUrl?: string,\n): string {\n const depHost = getDepHost(registryUrl);\n return joinUrlParts(depHost, packageName);\n}\n"],"mappings":";;;AAGA,MAAa,qBAAqB;AAElC,SAAgB,WAAW,cAAsB,oBAA4B;CAC3E,OAAO,YAAY,QAAQ,MAAM,YAAY,GAAG,EAAE;AACpD;AAEA,SAAgB,aACd,aACA,aACQ;CAER,OAAO,aADS,WAAW,WACD,GAAG,WAAW;AAC1C"}
1
+ {"version":3,"file":"util.js","names":[],"sources":["../../../../lib/modules/datasource/gitlab-tags/util.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\n\nexport const defaultRegistryUrl = 'https://gitlab.com';\n\nexport function getDepHost(registryUrl: string = defaultRegistryUrl): string {\n return registryUrl.replace(regEx(/\\/api\\/v4$/), '');\n}\n\nexport function getSourceUrl(\n packageName: string,\n registryUrl?: string,\n): string {\n const depHost = getDepHost(registryUrl);\n return joinUrlParts(depHost, packageName);\n}\n"],"mappings":";;;AAGA,MAAa,qBAAqB;AAElC,SAAgB,WAAW,cAAsB,oBAA4B;CAC3E,OAAO,YAAY,QAAQ,MAAM,YAAY,GAAG,EAAE;AACpD;AAEA,SAAgB,aACd,aACA,aACQ;CACR,MAAM,UAAU,WAAW,WAAW;CACtC,OAAO,aAAa,SAAS,WAAW;AAC1C"}
@@ -73,7 +73,8 @@ var GoProxyDatasource = class GoProxyDatasource extends Datasource {
73
73
  if (!canFallback) break;
74
74
  }
75
75
  if (result && !result.sourceUrl) try {
76
- const sourceUrl = getSourceUrl(await BaseGoDatasource.getDatasource(packageName));
76
+ const datasource = await BaseGoDatasource.getDatasource(packageName);
77
+ const sourceUrl = getSourceUrl(datasource);
77
78
  if (sourceUrl) result.sourceUrl = sourceUrl;
78
79
  } catch (err) {
79
80
  logger.trace({ err }, `Can't get datasource for ${packageName}`);
@@ -124,7 +125,7 @@ var GoProxyDatasource = class GoProxyDatasource extends Datasource {
124
125
  return withCache({
125
126
  namespace: `datasource-${GoProxyDatasource.id}`,
126
127
  key: GoProxyDatasource.getVersionedCacheKey(packageName, version),
127
- ttlMinutes: 2400 * 60
128
+ ttlMinutes: 144e3
128
129
  }, () => this._retrieveGoDirectiveForModule(baseUrl, packageName, version));
129
130
  }
130
131
  async _retrieveGoDirectiveForModule(baseUrl, packageName, version) {
@@ -161,7 +162,8 @@ var GoProxyDatasource = class GoProxyDatasource extends Datasource {
161
162
  const isGopkgin = packageName.startsWith("gopkg.in/");
162
163
  const majorSuffixSeparator = isGopkgin ? "." : "/";
163
164
  const modParts = packageName.match(modRegex)?.groups;
164
- const baseMod = modParts?.baseMod ?? packageName;
165
+ const baseMod = modParts?.baseMod ??
166
+ /* v8 ignore next -- defensive: modRegex matches any non-empty package name, so baseMod is always set */ packageName;
165
167
  const packageMajor = parseInt(modParts?.majorVersion ?? "0", 10);
166
168
  const result = { releases: [] };
167
169
  for (let major = packageMajor;; major += 1) {
@@ -172,10 +174,11 @@ var GoProxyDatasource = class GoProxyDatasource extends Datasource {
172
174
  }
173
175
  let releases = [];
174
176
  try {
175
- releases = await map((await this.listVersions(baseUrl, pkg)).filter(({ version }) => {
177
+ const filteredReleases = (await this.listVersions(baseUrl, pkg)).filter(({ version }) => {
176
178
  if (major < 2) return true;
177
179
  return version.split(regEx(/[^\d]+/)).find(isTruthy) === major.toString();
178
- }), async (versionInfo) => {
180
+ });
181
+ releases = await map(filteredReleases, async (versionInfo) => {
179
182
  const { version, newDigest, releaseTimestamp } = versionInfo;
180
183
  if (releaseTimestamp) return {
181
184
  version,
@@ -1 +1 @@
1
- {"version":3,"file":"releases-goproxy.js","names":["p.map","HttpError","goVersioning"],"sources":["../../../../lib/modules/datasource/go/releases-goproxy.ts"],"sourcesContent":["import {\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isTruthy,\n} from '@sindresorhus/is';\nimport type { ConstraintsFilter } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport goVersioning from '../../versioning/go-mod-directive/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BaseGoDatasource } from './base.ts';\nimport { getSourceUrl } from './common.ts';\nimport { parseGoproxy, parseNoproxy } from './goproxy-parser.ts';\nimport { GoDirectDatasource } from './releases-direct.ts';\nimport { VersionInfo } from './schema.ts';\n\n/** TODO #42566 */\nconst goVersionRegex = regEx(/^\\s*go\\s+(?<version>[^\\s]+)\\s*$/);\n\nconst modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\\d+))?$/);\n\n/**\n * @see https://go.dev/ref/mod#pseudo-versions\n */\nconst pseudoVersionRegex = regEx(\n /v\\d+\\.\\d+\\.\\d+-(?:\\w+\\.)?(?:0\\.)?(?<timestamp>\\d{14})-(?<digest>[a-f0-9]{12})/i,\n);\n\nexport function pseudoVersionToRelease(pseudoVersion: string): Release | null {\n const match = pseudoVersion.match(pseudoVersionRegex)?.groups;\n if (!match) {\n return null;\n }\n\n const { digest: newDigest, timestamp } = match;\n const releaseTimestamp = asTimestamp(timestamp);\n\n return {\n version: pseudoVersion,\n newDigest,\n releaseTimestamp,\n };\n}\n\nexport class GoProxyDatasource extends Datasource {\n static readonly id = 'go-proxy';\n\n constructor() {\n super(GoProxyDatasource.id);\n }\n\n readonly direct = new GoDirectDatasource();\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName } = config;\n logger.trace(`goproxy.getReleases(${packageName})`);\n const goproxy = getEnv().GOPROXY ?? 'https://proxy.golang.org,direct';\n if (goproxy === 'direct') {\n return this.direct.getReleases(config);\n }\n const proxyList = parseGoproxy(goproxy);\n const noproxy = parseNoproxy();\n\n let result: ReleaseResult | null = null;\n\n if (noproxy?.test(packageName)) {\n logger.debug(`Fetching ${packageName} via GONOPROXY match`);\n result = await this.direct.getReleases(config);\n return result;\n }\n\n for (const { url, fallback } of proxyList) {\n try {\n if (url === 'off') {\n break;\n } else if (url === 'direct') {\n result = await this.direct.getReleases(config);\n break;\n }\n\n const res = await this.getVersionsWithInfo(\n url,\n packageName,\n config.constraintsFiltering,\n );\n if (res.releases.length) {\n result = res;\n break;\n }\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const statusCode = potentialHttpError?.response?.statusCode;\n const canFallback =\n fallback === '|' ? true : statusCode === 404 || statusCode === 410;\n const msg = canFallback\n ? 'Goproxy error: trying next URL provided with GOPROXY'\n : 'Goproxy error: skipping other URLs provided with GOPROXY';\n logger.debug({ err }, msg);\n if (!canFallback) {\n break;\n }\n }\n }\n\n if (result && !result.sourceUrl) {\n try {\n const datasource = await BaseGoDatasource.getDatasource(packageName);\n const sourceUrl = getSourceUrl(datasource);\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n } catch (err) {\n logger.trace({ err }, `Can't get datasource for ${packageName}`);\n }\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Avoid ambiguity when serving from case-insensitive file systems.\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\n encodeCase(input: string): string {\n return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`);\n }\n\n async listVersions(baseUrl: string, packageName: string): Promise<Release[]> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n 'list',\n );\n const { body } = await this.http.getText(url);\n return filterMap(body.split(newlineRegex), (str) => {\n if (!isNonEmptyStringAndNotWhitespace(str)) {\n return null;\n }\n\n const [version, timestamp] = str.trim().split(regEx(/\\s+/));\n const release: Release = pseudoVersionToRelease(version) ?? { version };\n\n const releaseTimestamp = asTimestamp(timestamp);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n return release;\n });\n }\n\n async versionInfo(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<Release> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.info`,\n );\n const res = await this.http.getJson(url, VersionInfo);\n\n const result: Release = {\n version: res.body.Version,\n };\n\n const releaseTimestamp = asTimestamp(res.body.Time);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n return result;\n }\n\n /**\n * Retrieve the `go` directive for a given Go Module.\n *\n * NOTE that this means the `go` directive, not the `toolchain` directive.\n */\n async retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getVersionedCacheKey(packageName, version),\n // a module's `go.mod` should /never/ change after it's published. If going via the Go Proxy and the Go Checksum Database, a change in this value will result in build failures.\n ttlMinutes: 100 * 24 * 60,\n },\n () => this._retrieveGoDirectiveForModule(baseUrl, packageName, version),\n );\n }\n\n async _retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.mod`,\n );\n const res = await this.http.getText(url);\n\n let goDirective: string | undefined = undefined;\n\n for (const line of res.body.split('\\n')) {\n const goVersionMatches = goVersionRegex.exec(line)?.groups;\n if (goVersionMatches) {\n goDirective = goVersionMatches.version;\n break;\n }\n }\n\n if (!goDirective) {\n return goDirective;\n }\n\n // always return it in full SemVer format, which can then be matched on using `semver` or `semver-coerced`\n const parts = goDirective.split('.');\n if (parts.length === 1) {\n return `${parts[0]}.0.0`;\n }\n if (parts.length === 2) {\n return `${parts[0]}.${parts[1]}.0`;\n }\n return `${parts[0]}.${parts[1]}.${parts[2]}`;\n }\n\n async getLatestVersion(\n baseUrl: string,\n packageName: string,\n ): Promise<{ version: string; sourceUrl?: string } | null> {\n try {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@latest',\n );\n const res = await this.http.getJson(url, VersionInfo);\n const { Version: version, Origin: origin } = res.body;\n // Extract sourceUrl from GOPROXY Origin when present, avoiding go-get to\n // vanity hosts (https://github.com/renovatebot/renovate/discussions/44898)\n const sourceUrl =\n origin?.VCS === 'git' && isNonEmptyString(origin.URL)\n ? origin.URL.replace(regEx(/\\.git$/), '')\n : undefined;\n return { version, sourceUrl };\n } catch (err) {\n logger.trace({ err }, 'Failed to get latest version');\n return null;\n }\n }\n\n async getVersionsWithInfo(\n baseUrl: string,\n packageName: string,\n constraintsFiltering: ConstraintsFilter | undefined,\n ): Promise<ReleaseResult> {\n const isGopkgin = packageName.startsWith('gopkg.in/');\n const majorSuffixSeparator = isGopkgin ? '.' : '/';\n const modParts = packageName.match(modRegex)?.groups;\n const baseMod =\n modParts?.baseMod ??\n /* v8 ignore next -- defensive: modRegex matches any non-empty package name, so baseMod is always set */ packageName;\n const packageMajor = parseInt(modParts?.majorVersion ?? '0', 10);\n\n const result: ReleaseResult = { releases: [] };\n for (let major = packageMajor; ; major += 1) {\n let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;\n if (!isGopkgin && major < 2) {\n pkg = baseMod;\n major += 1; // v0 and v1 are the same module\n }\n\n let releases: Release[] = [];\n\n try {\n const res = await this.listVersions(baseUrl, pkg);\n\n // Artifactory returns all versions in any major (past and future),\n // so starting from v2, we filter them in order to avoid the infinite loop\n const filteredReleases = res.filter(({ version }) => {\n if (major < 2) {\n return true;\n }\n\n return (\n version.split(regEx(/[^\\d]+/)).find(isTruthy) === major.toString()\n );\n });\n\n releases = await p.map(filteredReleases, async (versionInfo) => {\n const { version, newDigest, releaseTimestamp } = versionInfo;\n\n if (releaseTimestamp) {\n return { version, newDigest, releaseTimestamp };\n }\n\n try {\n return await this.versionInfo(baseUrl, pkg, version);\n } catch (err) {\n logger.trace({ err }, `Can't obtain data from ${baseUrl}`);\n return { version };\n }\n });\n\n if (constraintsFiltering === 'strict') {\n releases = await p.map(releases, async (rel) => {\n try {\n const goDirective = await this.retrieveGoDirectiveForModule(\n baseUrl,\n pkg,\n rel.version,\n );\n if (goDirective) {\n rel.constraints ??= {};\n rel.constraints['%goMod'] ??= [];\n rel.constraints['%goMod'].push(goDirective);\n }\n } catch (err) {\n logger.trace(\n { err },\n `Can't obtain \\`go\\` directive from ${baseUrl}`,\n );\n }\n\n return rel;\n });\n }\n\n result.releases.push(...releases);\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const status = potentialHttpError.response?.statusCode;\n if (\n potentialHttpError instanceof HttpError &&\n (status === 404 || status === 403) &&\n major !== packageMajor\n ) {\n break;\n }\n\n throw err;\n }\n\n const latest = await this.getLatestVersion(baseUrl, pkg);\n if (latest) {\n const { version: latestVersion, sourceUrl } = latest;\n result.tags ??= {};\n result.tags.latest ??= latestVersion;\n if (goVersioning.isGreaterThan(latestVersion, result.tags.latest)) {\n result.tags.latest = latestVersion;\n }\n if (sourceUrl) {\n result.sourceUrl ??= sourceUrl;\n }\n if (!result.releases.length) {\n const releaseFromLatest = pseudoVersionToRelease(latestVersion);\n if (releaseFromLatest) {\n result.releases.push(releaseFromLatest);\n }\n }\n }\n\n if (!releases.length) {\n break;\n }\n }\n\n return result;\n }\n\n static getCacheKey({\n packageName,\n constraintsFiltering,\n }: GetReleasesConfig): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n const constraintsFilteringKey =\n constraintsFiltering && constraintsFiltering !== 'none'\n ? `@@${constraintsFiltering}`\n : '';\n // TODO: types (#22198)\n return `${packageName}@@${goproxy}@@${noproxy?.toString()}${constraintsFilteringKey}`;\n }\n\n static getVersionedCacheKey(packageName: string, version: string): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n // TODO: types (#22198)\n return `${packageName}@@${version}@@${goproxy}@@${noproxy?.toString()}`;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"releases-goproxy.js","names":["p.map","HttpError","goVersioning"],"sources":["../../../../lib/modules/datasource/go/releases-goproxy.ts"],"sourcesContent":["import {\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isTruthy,\n} from '@sindresorhus/is';\nimport type { ConstraintsFilter } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport goVersioning from '../../versioning/go-mod-directive/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BaseGoDatasource } from './base.ts';\nimport { getSourceUrl } from './common.ts';\nimport { parseGoproxy, parseNoproxy } from './goproxy-parser.ts';\nimport { GoDirectDatasource } from './releases-direct.ts';\nimport { VersionInfo } from './schema.ts';\n\n/** TODO #42566 */\nconst goVersionRegex = regEx(/^\\s*go\\s+(?<version>[^\\s]+)\\s*$/);\n\nconst modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\\d+))?$/);\n\n/**\n * @see https://go.dev/ref/mod#pseudo-versions\n */\nconst pseudoVersionRegex = regEx(\n /v\\d+\\.\\d+\\.\\d+-(?:\\w+\\.)?(?:0\\.)?(?<timestamp>\\d{14})-(?<digest>[a-f0-9]{12})/i,\n);\n\nexport function pseudoVersionToRelease(pseudoVersion: string): Release | null {\n const match = pseudoVersion.match(pseudoVersionRegex)?.groups;\n if (!match) {\n return null;\n }\n\n const { digest: newDigest, timestamp } = match;\n const releaseTimestamp = asTimestamp(timestamp);\n\n return {\n version: pseudoVersion,\n newDigest,\n releaseTimestamp,\n };\n}\n\nexport class GoProxyDatasource extends Datasource {\n static readonly id = 'go-proxy';\n\n constructor() {\n super(GoProxyDatasource.id);\n }\n\n readonly direct = new GoDirectDatasource();\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName } = config;\n logger.trace(`goproxy.getReleases(${packageName})`);\n const goproxy = getEnv().GOPROXY ?? 'https://proxy.golang.org,direct';\n if (goproxy === 'direct') {\n return this.direct.getReleases(config);\n }\n const proxyList = parseGoproxy(goproxy);\n const noproxy = parseNoproxy();\n\n let result: ReleaseResult | null = null;\n\n if (noproxy?.test(packageName)) {\n logger.debug(`Fetching ${packageName} via GONOPROXY match`);\n result = await this.direct.getReleases(config);\n return result;\n }\n\n for (const { url, fallback } of proxyList) {\n try {\n if (url === 'off') {\n break;\n } else if (url === 'direct') {\n result = await this.direct.getReleases(config);\n break;\n }\n\n const res = await this.getVersionsWithInfo(\n url,\n packageName,\n config.constraintsFiltering,\n );\n if (res.releases.length) {\n result = res;\n break;\n }\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const statusCode = potentialHttpError?.response?.statusCode;\n const canFallback =\n fallback === '|' ? true : statusCode === 404 || statusCode === 410;\n const msg = canFallback\n ? 'Goproxy error: trying next URL provided with GOPROXY'\n : 'Goproxy error: skipping other URLs provided with GOPROXY';\n logger.debug({ err }, msg);\n if (!canFallback) {\n break;\n }\n }\n }\n\n if (result && !result.sourceUrl) {\n try {\n const datasource = await BaseGoDatasource.getDatasource(packageName);\n const sourceUrl = getSourceUrl(datasource);\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n } catch (err) {\n logger.trace({ err }, `Can't get datasource for ${packageName}`);\n }\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Avoid ambiguity when serving from case-insensitive file systems.\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\n encodeCase(input: string): string {\n return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`);\n }\n\n async listVersions(baseUrl: string, packageName: string): Promise<Release[]> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n 'list',\n );\n const { body } = await this.http.getText(url);\n return filterMap(body.split(newlineRegex), (str) => {\n if (!isNonEmptyStringAndNotWhitespace(str)) {\n return null;\n }\n\n const [version, timestamp] = str.trim().split(regEx(/\\s+/));\n const release: Release = pseudoVersionToRelease(version) ?? { version };\n\n const releaseTimestamp = asTimestamp(timestamp);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n return release;\n });\n }\n\n async versionInfo(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<Release> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.info`,\n );\n const res = await this.http.getJson(url, VersionInfo);\n\n const result: Release = {\n version: res.body.Version,\n };\n\n const releaseTimestamp = asTimestamp(res.body.Time);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n return result;\n }\n\n /**\n * Retrieve the `go` directive for a given Go Module.\n *\n * NOTE that this means the `go` directive, not the `toolchain` directive.\n */\n async retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getVersionedCacheKey(packageName, version),\n // a module's `go.mod` should /never/ change after it's published. If going via the Go Proxy and the Go Checksum Database, a change in this value will result in build failures.\n ttlMinutes: 100 * 24 * 60,\n },\n () => this._retrieveGoDirectiveForModule(baseUrl, packageName, version),\n );\n }\n\n async _retrieveGoDirectiveForModule(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<string | undefined> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.mod`,\n );\n const res = await this.http.getText(url);\n\n let goDirective: string | undefined = undefined;\n\n for (const line of res.body.split('\\n')) {\n const goVersionMatches = goVersionRegex.exec(line)?.groups;\n if (goVersionMatches) {\n goDirective = goVersionMatches.version;\n break;\n }\n }\n\n if (!goDirective) {\n return goDirective;\n }\n\n // always return it in full SemVer format, which can then be matched on using `semver` or `semver-coerced`\n const parts = goDirective.split('.');\n if (parts.length === 1) {\n return `${parts[0]}.0.0`;\n }\n if (parts.length === 2) {\n return `${parts[0]}.${parts[1]}.0`;\n }\n return `${parts[0]}.${parts[1]}.${parts[2]}`;\n }\n\n async getLatestVersion(\n baseUrl: string,\n packageName: string,\n ): Promise<{ version: string; sourceUrl?: string } | null> {\n try {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@latest',\n );\n const res = await this.http.getJson(url, VersionInfo);\n const { Version: version, Origin: origin } = res.body;\n // Extract sourceUrl from GOPROXY Origin when present, avoiding go-get to\n // vanity hosts (https://github.com/renovatebot/renovate/discussions/44898)\n const sourceUrl =\n origin?.VCS === 'git' && isNonEmptyString(origin.URL)\n ? origin.URL.replace(regEx(/\\.git$/), '')\n : undefined;\n return { version, sourceUrl };\n } catch (err) {\n logger.trace({ err }, 'Failed to get latest version');\n return null;\n }\n }\n\n async getVersionsWithInfo(\n baseUrl: string,\n packageName: string,\n constraintsFiltering: ConstraintsFilter | undefined,\n ): Promise<ReleaseResult> {\n const isGopkgin = packageName.startsWith('gopkg.in/');\n const majorSuffixSeparator = isGopkgin ? '.' : '/';\n const modParts = packageName.match(modRegex)?.groups;\n const baseMod =\n modParts?.baseMod ??\n /* v8 ignore next -- defensive: modRegex matches any non-empty package name, so baseMod is always set */ packageName;\n const packageMajor = parseInt(modParts?.majorVersion ?? '0', 10);\n\n const result: ReleaseResult = { releases: [] };\n for (let major = packageMajor; ; major += 1) {\n let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;\n if (!isGopkgin && major < 2) {\n pkg = baseMod;\n major += 1; // v0 and v1 are the same module\n }\n\n let releases: Release[] = [];\n\n try {\n const res = await this.listVersions(baseUrl, pkg);\n\n // Artifactory returns all versions in any major (past and future),\n // so starting from v2, we filter them in order to avoid the infinite loop\n const filteredReleases = res.filter(({ version }) => {\n if (major < 2) {\n return true;\n }\n\n return (\n version.split(regEx(/[^\\d]+/)).find(isTruthy) === major.toString()\n );\n });\n\n releases = await p.map(filteredReleases, async (versionInfo) => {\n const { version, newDigest, releaseTimestamp } = versionInfo;\n\n if (releaseTimestamp) {\n return { version, newDigest, releaseTimestamp };\n }\n\n try {\n return await this.versionInfo(baseUrl, pkg, version);\n } catch (err) {\n logger.trace({ err }, `Can't obtain data from ${baseUrl}`);\n return { version };\n }\n });\n\n if (constraintsFiltering === 'strict') {\n releases = await p.map(releases, async (rel) => {\n try {\n const goDirective = await this.retrieveGoDirectiveForModule(\n baseUrl,\n pkg,\n rel.version,\n );\n if (goDirective) {\n rel.constraints ??= {};\n rel.constraints['%goMod'] ??= [];\n rel.constraints['%goMod'].push(goDirective);\n }\n } catch (err) {\n logger.trace(\n { err },\n `Can't obtain \\`go\\` directive from ${baseUrl}`,\n );\n }\n\n return rel;\n });\n }\n\n result.releases.push(...releases);\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const status = potentialHttpError.response?.statusCode;\n if (\n potentialHttpError instanceof HttpError &&\n (status === 404 || status === 403) &&\n major !== packageMajor\n ) {\n break;\n }\n\n throw err;\n }\n\n const latest = await this.getLatestVersion(baseUrl, pkg);\n if (latest) {\n const { version: latestVersion, sourceUrl } = latest;\n result.tags ??= {};\n result.tags.latest ??= latestVersion;\n if (goVersioning.isGreaterThan(latestVersion, result.tags.latest)) {\n result.tags.latest = latestVersion;\n }\n if (sourceUrl) {\n result.sourceUrl ??= sourceUrl;\n }\n if (!result.releases.length) {\n const releaseFromLatest = pseudoVersionToRelease(latestVersion);\n if (releaseFromLatest) {\n result.releases.push(releaseFromLatest);\n }\n }\n }\n\n if (!releases.length) {\n break;\n }\n }\n\n return result;\n }\n\n static getCacheKey({\n packageName,\n constraintsFiltering,\n }: GetReleasesConfig): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n const constraintsFilteringKey =\n constraintsFiltering && constraintsFiltering !== 'none'\n ? `@@${constraintsFiltering}`\n : '';\n // TODO: types (#22198)\n return `${packageName}@@${goproxy}@@${noproxy?.toString()}${constraintsFilteringKey}`;\n }\n\n static getVersionedCacheKey(packageName: string, version: string): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n // TODO: types (#22198)\n return `${packageName}@@${version}@@${goproxy}@@${noproxy?.toString()}`;\n }\n}\n"],"mappings":"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"}
@@ -79,7 +79,7 @@ var JenkinsPluginsDatasource = class JenkinsPluginsDatasource extends Datasource
79
79
  response = (await this.http.getJson(url, schema)).body;
80
80
  const durationMs = Math.round(Date.now() - startTime);
81
81
  logger.debug({ durationMs }, `jenkins-plugins: Fetched Jenkins plugins from ${url}`);
82
- } catch (err) /* istanbul ignore next */ {
82
+ } catch (err) /* istanbul ignore next */ {
83
83
  this.handleGenericErrors(err);
84
84
  }
85
85
  return response;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/jenkins-plugins/index.ts"],"sourcesContent":["import { type ZodType } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport {\n JenkinsPluginsInfoResponse,\n JenkinsPluginsVersionsResponse,\n} from './schema.ts';\n\nexport class JenkinsPluginsDatasource extends Datasource {\n static readonly id = 'jenkins-plugins';\n\n constructor() {\n super(JenkinsPluginsDatasource.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = ['https://updates.jenkins.io'];\n\n override readonly registryStrategy = 'hunt';\n\n private static readonly packageInfoPath = 'current/update-center.actual.json';\n private static readonly packageVersionsPath = 'current/plugin-versions.json';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The releaseTimestamp is determined from the `releaseTimestamp` or `buildDate` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` field in the results.';\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const updateSiteUrl = ensureTrailingSlash(registryUrl);\n\n const plugins = await this.getJenkinsPluginInfo(updateSiteUrl);\n const plugin = plugins[packageName];\n if (!plugin) {\n return null;\n }\n\n const result = clone(plugin);\n const versions = await this.getJenkinsPluginVersions(updateSiteUrl);\n const releases = versions[packageName];\n result.releases = releases ? clone(releases) : [];\n return result;\n }\n\n private async _getJenkinsPluginInfo(\n updateSiteUrl: string,\n ): Promise<Record<string, ReleaseResult>> {\n const { plugins } = await this.getJenkinsUpdateCenterResponse(\n `${updateSiteUrl}${JenkinsPluginsDatasource.packageInfoPath}`,\n JenkinsPluginsInfoResponse,\n );\n\n const info: Record<string, ReleaseResult> = {};\n for (const name of Object.keys(plugins)) {\n info[name] = {\n releases: [], // releases\n sourceUrl: plugins[name]?.scm,\n };\n }\n return info;\n }\n\n getJenkinsPluginInfo(\n updateSiteUrl: string,\n ): Promise<Record<string, ReleaseResult>> {\n return withCache(\n {\n namespace: `datasource-${JenkinsPluginsDatasource.id}`,\n key: 'info',\n ttlMinutes: 1440,\n },\n () => this._getJenkinsPluginInfo(updateSiteUrl),\n );\n }\n\n private async _getJenkinsPluginVersions(\n updateSiteUrl: string,\n ): Promise<Record<string, Release[]>> {\n const { plugins } = await this.getJenkinsUpdateCenterResponse(\n `${updateSiteUrl}${JenkinsPluginsDatasource.packageVersionsPath}`,\n JenkinsPluginsVersionsResponse,\n );\n\n const versions: Record<string, Release[]> = {};\n for (const name of Object.keys(plugins)) {\n versions[name] = Object.keys(plugins[name]).map((version) => {\n const downloadUrl = plugins[name][version]?.url;\n const buildDate = plugins[name][version]?.buildDate;\n const releaseTimestamp =\n plugins[name][version]?.releaseTimestamp ?? asTimestamp(buildDate);\n const jenkins = plugins[name][version]?.requiredCore;\n const constraints = jenkins ? { jenkins: [`>=${jenkins}`] } : undefined;\n return {\n version,\n downloadUrl,\n releaseTimestamp,\n ...(constraints && { constraints }),\n };\n });\n }\n return versions;\n }\n\n getJenkinsPluginVersions(\n updateSiteUrl: string,\n ): Promise<Record<string, Release[]>> {\n return withCache(\n {\n namespace: `datasource-${JenkinsPluginsDatasource.id}`,\n key: 'versions',\n },\n () => this._getJenkinsPluginVersions(updateSiteUrl),\n );\n }\n\n private async getJenkinsUpdateCenterResponse<T>(\n url: string,\n schema: ZodType<T>,\n ): Promise<T> {\n let response: T;\n\n try {\n logger.debug(`jenkins-plugins: Fetching Jenkins plugins from ${url}`);\n const startTime = Date.now();\n response = (await this.http.getJson(url, schema)).body;\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug(\n { durationMs },\n `jenkins-plugins: Fetched Jenkins plugins from ${url}`,\n );\n } catch (err) /* istanbul ignore next */ {\n this.handleGenericErrors(err);\n }\n\n return response;\n }\n}\n"],"mappings":";;;;;;;;AAaA,IAAa,2BAAb,MAAa,iCAAiC,WAAW;CACvD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,yBAAyB,EAAE;CACnC;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,4BAA4B;CAErE,mBAAqC;CAErC,OAAwB,kBAAkB;CAC1C,OAAwB,sBAAsB;CAE9C,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAM,YAAY,EAChB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAET,MAAM,gBAAgB,oBAAoB,WAAW;EAGrD,MAAM,UAAS,MADO,KAAK,qBAAqB,aAAa,EAAA,CACtC;EACvB,IAAI,CAAC,QACH,OAAO;EAGT,MAAM,SAAS,MAAM,MAAM;EAE3B,MAAM,YAAW,MADM,KAAK,yBAAyB,aAAa,EAAA,CACxC;EAC1B,OAAO,WAAW,WAAW,MAAM,QAAQ,IAAI,CAAC;EAChD,OAAO;CACT;CAEA,MAAc,sBACZ,eACwC;EACxC,MAAM,EAAE,YAAY,MAAM,KAAK,+BAC7B,GAAG,gBAAgB,yBAAyB,mBAC5C,0BACF;EAEA,MAAM,OAAsC,CAAC;EAC7C,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,GACpC,KAAK,QAAQ;GACX,UAAU,CAAC;GACX,WAAW,QAAQ,KAAK,EAAE;EAC5B;EAEF,OAAO;CACT;CAEA,qBACE,eACwC;EACxC,OAAO,UACL;GACE,WAAW,cAAc,yBAAyB;GAClD,KAAK;GACL,YAAY;EACd,SACM,KAAK,sBAAsB,aAAa,CAChD;CACF;CAEA,MAAc,0BACZ,eACoC;EACpC,MAAM,EAAE,YAAY,MAAM,KAAK,+BAC7B,GAAG,gBAAgB,yBAAyB,uBAC5C,8BACF;EAEA,MAAM,WAAsC,CAAC;EAC7C,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,GACpC,SAAS,QAAQ,OAAO,KAAK,QAAQ,KAAK,CAAC,CAAC,KAAK,YAAY;GAC3D,MAAM,cAAc,QAAQ,KAAK,CAAC,QAAQ,EAAE;GAC5C,MAAM,YAAY,QAAQ,KAAK,CAAC,QAAQ,EAAE;GAC1C,MAAM,mBACJ,QAAQ,KAAK,CAAC,QAAQ,EAAE,oBAAoB,YAAY,SAAS;GACnE,MAAM,UAAU,QAAQ,KAAK,CAAC,QAAQ,EAAE;GACxC,MAAM,cAAc,UAAU,EAAE,SAAS,CAAC,KAAK,SAAS,EAAE,IAAI,KAAA;GAC9D,OAAO;IACL;IACA;IACA;IACA,GAAI,eAAe,EAAE,YAAY;GACnC;EACF,CAAC;EAEH,OAAO;CACT;CAEA,yBACE,eACoC;EACpC,OAAO,UACL;GACE,WAAW,cAAc,yBAAyB;GAClD,KAAK;EACP,SACM,KAAK,0BAA0B,aAAa,CACpD;CACF;CAEA,MAAc,+BACZ,KACA,QACY;EACZ,IAAI;EAEJ,IAAI;GACF,OAAO,MAAM,kDAAkD,KAAK;GACpE,MAAM,YAAY,KAAK,IAAI;GAC3B,YAAY,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,EAAA,CAAG;GAClD,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,SAAS;GACpD,OAAO,MACL,EAAE,WAAW,GACb,iDAAiD,KACnD;EACF,SAAS,kCAAgC;GACvC,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/jenkins-plugins/index.ts"],"sourcesContent":["import { type ZodType } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport {\n JenkinsPluginsInfoResponse,\n JenkinsPluginsVersionsResponse,\n} from './schema.ts';\n\nexport class JenkinsPluginsDatasource extends Datasource {\n static readonly id = 'jenkins-plugins';\n\n constructor() {\n super(JenkinsPluginsDatasource.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = ['https://updates.jenkins.io'];\n\n override readonly registryStrategy = 'hunt';\n\n private static readonly packageInfoPath = 'current/update-center.actual.json';\n private static readonly packageVersionsPath = 'current/plugin-versions.json';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The releaseTimestamp is determined from the `releaseTimestamp` or `buildDate` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` field in the results.';\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const updateSiteUrl = ensureTrailingSlash(registryUrl);\n\n const plugins = await this.getJenkinsPluginInfo(updateSiteUrl);\n const plugin = plugins[packageName];\n if (!plugin) {\n return null;\n }\n\n const result = clone(plugin);\n const versions = await this.getJenkinsPluginVersions(updateSiteUrl);\n const releases = versions[packageName];\n result.releases = releases ? clone(releases) : [];\n return result;\n }\n\n private async _getJenkinsPluginInfo(\n updateSiteUrl: string,\n ): Promise<Record<string, ReleaseResult>> {\n const { plugins } = await this.getJenkinsUpdateCenterResponse(\n `${updateSiteUrl}${JenkinsPluginsDatasource.packageInfoPath}`,\n JenkinsPluginsInfoResponse,\n );\n\n const info: Record<string, ReleaseResult> = {};\n for (const name of Object.keys(plugins)) {\n info[name] = {\n releases: [], // releases\n sourceUrl: plugins[name]?.scm,\n };\n }\n return info;\n }\n\n getJenkinsPluginInfo(\n updateSiteUrl: string,\n ): Promise<Record<string, ReleaseResult>> {\n return withCache(\n {\n namespace: `datasource-${JenkinsPluginsDatasource.id}`,\n key: 'info',\n ttlMinutes: 1440,\n },\n () => this._getJenkinsPluginInfo(updateSiteUrl),\n );\n }\n\n private async _getJenkinsPluginVersions(\n updateSiteUrl: string,\n ): Promise<Record<string, Release[]>> {\n const { plugins } = await this.getJenkinsUpdateCenterResponse(\n `${updateSiteUrl}${JenkinsPluginsDatasource.packageVersionsPath}`,\n JenkinsPluginsVersionsResponse,\n );\n\n const versions: Record<string, Release[]> = {};\n for (const name of Object.keys(plugins)) {\n versions[name] = Object.keys(plugins[name]).map((version) => {\n const downloadUrl = plugins[name][version]?.url;\n const buildDate = plugins[name][version]?.buildDate;\n const releaseTimestamp =\n plugins[name][version]?.releaseTimestamp ?? asTimestamp(buildDate);\n const jenkins = plugins[name][version]?.requiredCore;\n const constraints = jenkins ? { jenkins: [`>=${jenkins}`] } : undefined;\n return {\n version,\n downloadUrl,\n releaseTimestamp,\n ...(constraints && { constraints }),\n };\n });\n }\n return versions;\n }\n\n getJenkinsPluginVersions(\n updateSiteUrl: string,\n ): Promise<Record<string, Release[]>> {\n return withCache(\n {\n namespace: `datasource-${JenkinsPluginsDatasource.id}`,\n key: 'versions',\n },\n () => this._getJenkinsPluginVersions(updateSiteUrl),\n );\n }\n\n private async getJenkinsUpdateCenterResponse<T>(\n url: string,\n schema: ZodType<T>,\n ): Promise<T> {\n let response: T;\n\n try {\n logger.debug(`jenkins-plugins: Fetching Jenkins plugins from ${url}`);\n const startTime = Date.now();\n response = (await this.http.getJson(url, schema)).body;\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug(\n { durationMs },\n `jenkins-plugins: Fetched Jenkins plugins from ${url}`,\n );\n } catch (err) /* istanbul ignore next */ {\n this.handleGenericErrors(err);\n }\n\n return response;\n }\n}\n"],"mappings":";;;;;;;;AAaA,IAAa,2BAAb,MAAa,iCAAiC,WAAW;CACvD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,yBAAyB,EAAE;CACnC;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,4BAA4B;CAErE,mBAAqC;CAErC,OAAwB,kBAAkB;CAC1C,OAAwB,sBAAsB;CAE9C,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAM,YAAY,EAChB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAET,MAAM,gBAAgB,oBAAoB,WAAW;EAGrD,MAAM,UAAS,MADO,KAAK,qBAAqB,aAAa,EAAA,CACtC;EACvB,IAAI,CAAC,QACH,OAAO;EAGT,MAAM,SAAS,MAAM,MAAM;EAE3B,MAAM,YAAW,MADM,KAAK,yBAAyB,aAAa,EAAA,CACxC;EAC1B,OAAO,WAAW,WAAW,MAAM,QAAQ,IAAI,CAAC;EAChD,OAAO;CACT;CAEA,MAAc,sBACZ,eACwC;EACxC,MAAM,EAAE,YAAY,MAAM,KAAK,+BAC7B,GAAG,gBAAgB,yBAAyB,mBAC5C,0BACF;EAEA,MAAM,OAAsC,CAAC;EAC7C,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,GACpC,KAAK,QAAQ;GACX,UAAU,CAAC;GACX,WAAW,QAAQ,KAAK,EAAE;EAC5B;EAEF,OAAO;CACT;CAEA,qBACE,eACwC;EACxC,OAAO,UACL;GACE,WAAW,cAAc,yBAAyB;GAClD,KAAK;GACL,YAAY;EACd,SACM,KAAK,sBAAsB,aAAa,CAChD;CACF;CAEA,MAAc,0BACZ,eACoC;EACpC,MAAM,EAAE,YAAY,MAAM,KAAK,+BAC7B,GAAG,gBAAgB,yBAAyB,uBAC5C,8BACF;EAEA,MAAM,WAAsC,CAAC;EAC7C,KAAK,MAAM,QAAQ,OAAO,KAAK,OAAO,GACpC,SAAS,QAAQ,OAAO,KAAK,QAAQ,KAAK,CAAC,CAAC,KAAK,YAAY;GAC3D,MAAM,cAAc,QAAQ,KAAK,CAAC,QAAQ,EAAE;GAC5C,MAAM,YAAY,QAAQ,KAAK,CAAC,QAAQ,EAAE;GAC1C,MAAM,mBACJ,QAAQ,KAAK,CAAC,QAAQ,EAAE,oBAAoB,YAAY,SAAS;GACnE,MAAM,UAAU,QAAQ,KAAK,CAAC,QAAQ,EAAE;GACxC,MAAM,cAAc,UAAU,EAAE,SAAS,CAAC,KAAK,SAAS,EAAE,IAAI,KAAA;GAC9D,OAAO;IACL;IACA;IACA;IACA,GAAI,eAAe,EAAE,YAAY;GACnC;EACF,CAAC;EAEH,OAAO;CACT;CAEA,yBACE,eACoC;EACpC,OAAO,UACL;GACE,WAAW,cAAc,yBAAyB;GAClD,KAAK;EACP,SACM,KAAK,0BAA0B,aAAa,CACpD;CACF;CAEA,MAAc,+BACZ,KACA,QACY;EACZ,IAAI;EAEJ,IAAI;GACF,OAAO,MAAM,kDAAkD,KAAK;GACpE,MAAM,YAAY,KAAK,IAAI;GAC3B,YAAY,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,EAAA,CAAG;GAClD,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,SAAS;GACpD,OAAO,MACL,EAAE,WAAW,GACb,iDAAiD,KACnD;EACF,SAAS,gCAAgC;GACvC,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO;CACT;AACF"}
@@ -22,7 +22,8 @@ var JsrDatasource = class JsrDatasource extends Datasource {
22
22
  async _getReleases({ packageName, registryUrl }) {
23
23
  /* v8 ignore next 3 -- should never happen */
24
24
  if (!registryUrl) return null;
25
- if (isNull(extractJsrPackageName(packageName))) {
25
+ const validJsrPackageName = extractJsrPackageName(packageName);
26
+ if (isNull(validJsrPackageName)) {
26
27
  logger.debug(`Could not extract packageName: "${packageName}"`);
27
28
  return null;
28
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semverId"],"sources":["../../../../lib/modules/datasource/jsr/index.ts"],"sourcesContent":["import { isNull } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as semverId } from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrls } from './common.ts';\nimport { JsrPackageMetadata } from './schema.ts';\nimport { extractJsrPackageName } from './util.ts';\n\nexport class JsrDatasource extends Datasource {\n static readonly id = 'jsr';\n\n // custom registry support is not yet supported\n // https://github.com/jsr-io/jsr/issues/203\n override readonly customRegistrySupport = false;\n\n override readonly registryStrategy = 'first';\n // https://jsr.io/docs/using-packages#semver-resolution\n override readonly defaultVersioning = semverId;\n\n // use npm compatible registry api url due to returns\n override readonly defaultRegistryUrls = defaultRegistryUrls;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `createdAt` field in the results. For packages without explicit timestamps, defaults to 2025-09-18.';\n\n constructor() {\n super(JsrDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const validJsrPackageName = extractJsrPackageName(packageName);\n if (isNull(validJsrPackageName)) {\n logger.debug(`Could not extract packageName: \"${packageName}\"`);\n return null;\n }\n // construct a package metadata url\n // https://jsr.io/docs/api#package-metadata\n const packageInfoUrl = joinUrlParts(registryUrl, packageName, 'meta.json');\n\n const result: ReleaseResult = {\n homepage: joinUrlParts(registryUrl, packageName),\n registryUrl,\n releases: [],\n };\n\n try {\n const { body } = await this.http.getJson(\n packageInfoUrl,\n JsrPackageMetadata,\n );\n result.releases.push(...body);\n } catch (err) {\n logger.warn({ err }, 'JSR: failed to get package details');\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${JsrDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAIrB,wBAA0C;CAE1C,mBAAqC;CAErC,oBAAsCA;CAGtC,sBAAwC;CAExC,0BAA4C;CAC5C,uBACE;CAEF,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAIT,IAAI,OADwB,sBAAsB,WACrB,CAAC,GAAG;GAC/B,OAAO,MAAM,mCAAmC,YAAY,EAAE;GAC9D,OAAO;EACT;EAGA,MAAM,iBAAiB,aAAa,aAAa,aAAa,WAAW;EAEzE,MAAM,SAAwB;GAC5B,UAAU,aAAa,aAAa,WAAW;GAC/C;GACA,UAAU,CAAC;EACb;EAEA,IAAI;GACF,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAC/B,gBACA,kBACF;GACA,OAAO,SAAS,KAAK,GAAG,IAAI;EAC9B,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,oCAAoC;GACzD,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GAEvC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semverId"],"sources":["../../../../lib/modules/datasource/jsr/index.ts"],"sourcesContent":["import { isNull } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as semverId } from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { defaultRegistryUrls } from './common.ts';\nimport { JsrPackageMetadata } from './schema.ts';\nimport { extractJsrPackageName } from './util.ts';\n\nexport class JsrDatasource extends Datasource {\n static readonly id = 'jsr';\n\n // custom registry support is not yet supported\n // https://github.com/jsr-io/jsr/issues/203\n override readonly customRegistrySupport = false;\n\n override readonly registryStrategy = 'first';\n // https://jsr.io/docs/using-packages#semver-resolution\n override readonly defaultVersioning = semverId;\n\n // use npm compatible registry api url due to returns\n override readonly defaultRegistryUrls = defaultRegistryUrls;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `createdAt` field in the results. For packages without explicit timestamps, defaults to 2025-09-18.';\n\n constructor() {\n super(JsrDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const validJsrPackageName = extractJsrPackageName(packageName);\n if (isNull(validJsrPackageName)) {\n logger.debug(`Could not extract packageName: \"${packageName}\"`);\n return null;\n }\n // construct a package metadata url\n // https://jsr.io/docs/api#package-metadata\n const packageInfoUrl = joinUrlParts(registryUrl, packageName, 'meta.json');\n\n const result: ReleaseResult = {\n homepage: joinUrlParts(registryUrl, packageName),\n registryUrl,\n releases: [],\n };\n\n try {\n const { body } = await this.http.getJson(\n packageInfoUrl,\n JsrPackageMetadata,\n );\n result.releases.push(...body);\n } catch (err) {\n logger.warn({ err }, 'JSR: failed to get package details');\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${JsrDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAK;CAIrB,wBAA0C;CAE1C,mBAAqC;CAErC,oBAAsCA;CAGtC,sBAAwC;CAExC,0BAA4C;CAC5C,uBACE;CAEF,cAAc;EACZ,MAAM,cAAc,EAAE;CACxB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,sBAAsB,sBAAsB,WAAW;EAC7D,IAAI,OAAO,mBAAmB,GAAG;GAC/B,OAAO,MAAM,mCAAmC,YAAY,EAAE;GAC9D,OAAO;EACT;EAGA,MAAM,iBAAiB,aAAa,aAAa,aAAa,WAAW;EAEzE,MAAM,SAAwB;GAC5B,UAAU,aAAa,aAAa,WAAW;GAC/C;GACA,UAAU,CAAC;EACb;EAEA,IAAI;GACF,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAC/B,gBACA,kBACF;GACA,OAAO,SAAS,KAAK,GAAG,IAAI;EAC9B,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,oCAAoC;GACzD,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GAEvC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -13,7 +13,7 @@ function getLatestSuitableVersion(releases) {
13
13
  if (!releases?.length) return null;
14
14
  const allVersions = releases.map(({ version }) => version);
15
15
  const stableVersions = allVersions.filter((x) => api.isStable(x));
16
- return (stableVersions.length ? stableVersions : allVersions).reduce((latestVersion, version) => compare(version, latestVersion) === 1 ? version : /* istanbul ignore next: hard to test */ latestVersion);
16
+ return (stableVersions.length ? stableVersions : allVersions).reduce((latestVersion, version) => compare(version, latestVersion) === 1 ? version : /* istanbul ignore next: hard to test */ latestVersion);
17
17
  }
18
18
  function extractVersions(metadata) {
19
19
  const res = {};
@@ -91,7 +91,8 @@ var MavenDatasource = class MavenDatasource extends Datasource {
91
91
  if (cachedResult) return cachedResult;
92
92
  if (!packageName || !registryUrl) return release;
93
93
  const dependency = getDependencyParts(packageName);
94
- const artifactUrl = getMavenUrl(dependency, registryUrl, await createUrlForDependencyPom(this.http, release.versionOrig ?? release.version, dependency, registryUrl));
94
+ const pomUrl = await createUrlForDependencyPom(this.http, release.versionOrig ?? release.version, dependency, registryUrl);
95
+ const artifactUrl = getMavenUrl(dependency, registryUrl, pomUrl);
95
96
  const { val, err } = (await downloadMaven(this.http, artifactUrl)).unwrap();
96
97
  if (err) {
97
98
  const result = err.type === "not-found" ? "reject" : release;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["mavenVersion","mavenVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/maven/index.ts"],"sourcesContent":["import type { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\nimport mavenVersion, * as mavenVersioning from '../../versioning/maven/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { MAVEN_CENTRAL_URLS, MAVEN_REPO } from './common.ts';\nimport type { MavenDependency, MetadataResults } from './types.ts';\nimport {\n createUrlForDependencyPom,\n downloadMaven,\n downloadMavenXml,\n getDependencyInfo,\n getDependencyParts,\n getMavenUrl,\n} from './util.ts';\n\nfunction getLatestSuitableVersion(releases: Release[]): string | null {\n /* v8 ignore next 3 -- TODO: add test */\n if (!releases?.length) {\n return null;\n }\n const allVersions = releases.map(({ version }) => version);\n const stableVersions = allVersions.filter((x) => mavenVersion.isStable(x));\n const versions = stableVersions.length ? stableVersions : allVersions;\n return versions.reduce((latestVersion, version) =>\n compare(version, latestVersion) === 1\n ? version\n : /* istanbul ignore next: hard to test */ latestVersion,\n );\n}\n\nfunction extractVersions(metadata: XmlDocument): MetadataResults {\n const res: MetadataResults = {};\n const versions = metadata.descendantWithPath('versioning.versions');\n const elements = versions?.childrenNamed('version');\n if (!elements) {\n return res;\n }\n res.versions = elements.map((el) => el.val);\n const latest = metadata.descendantWithPath('versioning.latest');\n if (latest?.val) {\n res.tags ??= {};\n res.tags.latest = latest.val;\n }\n const release = metadata.descendantWithPath('versioning.release');\n if (release?.val) {\n res.tags ??= {};\n res.tags.release = release.val;\n }\n\n return res;\n}\n\nexport const defaultRegistryUrls = [MAVEN_REPO];\n\nexport class MavenDatasource extends Datasource {\n static id = 'maven';\n\n override readonly caching = true;\n\n override readonly defaultRegistryUrls = defaultRegistryUrls;\n\n override readonly defaultVersioning: string = mavenVersioning.id;\n\n override readonly registryStrategy: RegistryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `Last-Modified` header or the `lastModified` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` tags in the results.';\n\n constructor(id = MavenDatasource.id) {\n super(id);\n }\n\n async fetchVersionsFromMetadata(\n dependency: MavenDependency,\n repoUrl: string,\n ): Promise<MetadataResults> {\n const metadataUrl = getMavenUrl(dependency, repoUrl, 'maven-metadata.xml');\n const metadataXmlResult = await downloadMavenXml(this.http, metadataUrl);\n return metadataXmlResult\n .transform(({ data: metadata }) => extractVersions(metadata))\n .onError((err) => {\n logger.debug(\n `Maven: error fetching versions for \"${dependency.display}\": ${err.type}`,\n );\n })\n .unwrapOr({});\n }\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const dependency = getDependencyParts(packageName);\n const repoUrl = ensureTrailingSlash(registryUrl);\n\n if (\n // groupId\n (packageName.includes('.gradle.plugin:') ||\n // artifactId\n packageName.endsWith('.gradle.plugin')) &&\n MAVEN_CENTRAL_URLS.some((url) => repoUrl === ensureTrailingSlash(url))\n ) {\n logger.debug(\n `Maven: skipping Maven Central for suspected Gradle plugin \"${packageName}\"`,\n );\n return null;\n }\n\n logger.debug(`Looking up ${dependency.display} in repository ${repoUrl}`);\n\n const metadata = await this.fetchVersionsFromMetadata(dependency, repoUrl);\n if (!metadata.versions?.length) {\n return null;\n }\n const releases = metadata.versions.map((version) => ({ version }));\n\n logger.debug(\n `Found ${releases.length} new releases for ${dependency.display} in repository ${repoUrl}`,\n );\n\n const latestSuitableVersion = getLatestSuitableVersion(releases);\n const dependencyInfo =\n latestSuitableVersion &&\n (await getDependencyInfo(\n this.http,\n dependency,\n repoUrl,\n latestSuitableVersion,\n ));\n\n const result: ReleaseResult = {\n ...dependency,\n ...dependencyInfo,\n releases,\n };\n if (metadata.tags) {\n result.tags = metadata.tags;\n if (result.tags.latest) {\n logger.debug(`Setting respectLatest=false for maven ${packageName}`);\n result.respectLatest = false;\n }\n }\n\n if (!this.defaultRegistryUrls.includes(registryUrl)) {\n result.isPrivate = true;\n }\n\n return result;\n }\n\n override async postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n const { version, versionOrig } = release;\n const cacheKey = versionOrig\n ? `postprocessRelease:${registryUrl}:${packageName}:${versionOrig}:${version}`\n : `postprocessRelease:${registryUrl}:${packageName}:${version}`;\n const cachedResult = await packageCache.get<PostprocessReleaseResult>(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n );\n\n /* v8 ignore if: hard to test */\n if (cachedResult) {\n return cachedResult;\n }\n\n if (!packageName || !registryUrl) {\n return release;\n }\n\n const dependency = getDependencyParts(packageName);\n\n const pomUrl = await createUrlForDependencyPom(\n this.http,\n release.versionOrig ?? release.version,\n dependency,\n registryUrl,\n );\n\n const artifactUrl = getMavenUrl(dependency, registryUrl, pomUrl);\n const fetchResult = await downloadMaven(this.http, artifactUrl);\n const { val, err } = fetchResult.unwrap();\n\n if (err) {\n const result: PostprocessReleaseResult =\n err.type === 'not-found' ? 'reject' : release;\n if (result === 'reject') {\n await packageCache.set(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n result,\n 24 * 60,\n );\n }\n return result;\n }\n\n if (val.lastModified) {\n release.releaseTimestamp = asTimestamp(val.lastModified);\n }\n\n return release;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["mavenVersion","mavenVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/maven/index.ts"],"sourcesContent":["import type { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\nimport mavenVersion, * as mavenVersioning from '../../versioning/maven/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { MAVEN_CENTRAL_URLS, MAVEN_REPO } from './common.ts';\nimport type { MavenDependency, MetadataResults } from './types.ts';\nimport {\n createUrlForDependencyPom,\n downloadMaven,\n downloadMavenXml,\n getDependencyInfo,\n getDependencyParts,\n getMavenUrl,\n} from './util.ts';\n\nfunction getLatestSuitableVersion(releases: Release[]): string | null {\n /* v8 ignore next 3 -- TODO: add test */\n if (!releases?.length) {\n return null;\n }\n const allVersions = releases.map(({ version }) => version);\n const stableVersions = allVersions.filter((x) => mavenVersion.isStable(x));\n const versions = stableVersions.length ? stableVersions : allVersions;\n return versions.reduce((latestVersion, version) =>\n compare(version, latestVersion) === 1\n ? version\n : /* istanbul ignore next: hard to test */ latestVersion,\n );\n}\n\nfunction extractVersions(metadata: XmlDocument): MetadataResults {\n const res: MetadataResults = {};\n const versions = metadata.descendantWithPath('versioning.versions');\n const elements = versions?.childrenNamed('version');\n if (!elements) {\n return res;\n }\n res.versions = elements.map((el) => el.val);\n const latest = metadata.descendantWithPath('versioning.latest');\n if (latest?.val) {\n res.tags ??= {};\n res.tags.latest = latest.val;\n }\n const release = metadata.descendantWithPath('versioning.release');\n if (release?.val) {\n res.tags ??= {};\n res.tags.release = release.val;\n }\n\n return res;\n}\n\nexport const defaultRegistryUrls = [MAVEN_REPO];\n\nexport class MavenDatasource extends Datasource {\n static id = 'maven';\n\n override readonly caching = true;\n\n override readonly defaultRegistryUrls = defaultRegistryUrls;\n\n override readonly defaultVersioning: string = mavenVersioning.id;\n\n override readonly registryStrategy: RegistryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `Last-Modified` header or the `lastModified` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` tags in the results.';\n\n constructor(id = MavenDatasource.id) {\n super(id);\n }\n\n async fetchVersionsFromMetadata(\n dependency: MavenDependency,\n repoUrl: string,\n ): Promise<MetadataResults> {\n const metadataUrl = getMavenUrl(dependency, repoUrl, 'maven-metadata.xml');\n const metadataXmlResult = await downloadMavenXml(this.http, metadataUrl);\n return metadataXmlResult\n .transform(({ data: metadata }) => extractVersions(metadata))\n .onError((err) => {\n logger.debug(\n `Maven: error fetching versions for \"${dependency.display}\": ${err.type}`,\n );\n })\n .unwrapOr({});\n }\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const dependency = getDependencyParts(packageName);\n const repoUrl = ensureTrailingSlash(registryUrl);\n\n if (\n // groupId\n (packageName.includes('.gradle.plugin:') ||\n // artifactId\n packageName.endsWith('.gradle.plugin')) &&\n MAVEN_CENTRAL_URLS.some((url) => repoUrl === ensureTrailingSlash(url))\n ) {\n logger.debug(\n `Maven: skipping Maven Central for suspected Gradle plugin \"${packageName}\"`,\n );\n return null;\n }\n\n logger.debug(`Looking up ${dependency.display} in repository ${repoUrl}`);\n\n const metadata = await this.fetchVersionsFromMetadata(dependency, repoUrl);\n if (!metadata.versions?.length) {\n return null;\n }\n const releases = metadata.versions.map((version) => ({ version }));\n\n logger.debug(\n `Found ${releases.length} new releases for ${dependency.display} in repository ${repoUrl}`,\n );\n\n const latestSuitableVersion = getLatestSuitableVersion(releases);\n const dependencyInfo =\n latestSuitableVersion &&\n (await getDependencyInfo(\n this.http,\n dependency,\n repoUrl,\n latestSuitableVersion,\n ));\n\n const result: ReleaseResult = {\n ...dependency,\n ...dependencyInfo,\n releases,\n };\n if (metadata.tags) {\n result.tags = metadata.tags;\n if (result.tags.latest) {\n logger.debug(`Setting respectLatest=false for maven ${packageName}`);\n result.respectLatest = false;\n }\n }\n\n if (!this.defaultRegistryUrls.includes(registryUrl)) {\n result.isPrivate = true;\n }\n\n return result;\n }\n\n override async postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n const { version, versionOrig } = release;\n const cacheKey = versionOrig\n ? `postprocessRelease:${registryUrl}:${packageName}:${versionOrig}:${version}`\n : `postprocessRelease:${registryUrl}:${packageName}:${version}`;\n const cachedResult = await packageCache.get<PostprocessReleaseResult>(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n );\n\n /* v8 ignore if: hard to test */\n if (cachedResult) {\n return cachedResult;\n }\n\n if (!packageName || !registryUrl) {\n return release;\n }\n\n const dependency = getDependencyParts(packageName);\n\n const pomUrl = await createUrlForDependencyPom(\n this.http,\n release.versionOrig ?? release.version,\n dependency,\n registryUrl,\n );\n\n const artifactUrl = getMavenUrl(dependency, registryUrl, pomUrl);\n const fetchResult = await downloadMaven(this.http, artifactUrl);\n const { val, err } = fetchResult.unwrap();\n\n if (err) {\n const result: PostprocessReleaseResult =\n err.type === 'not-found' ? 'reject' : release;\n if (result === 'reject') {\n await packageCache.set(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n result,\n 24 * 60,\n );\n }\n return result;\n }\n\n if (val.lastModified) {\n release.releaseTimestamp = asTimestamp(val.lastModified);\n }\n\n return release;\n }\n}\n"],"mappings":";;;;;;;;;;AA2BA,SAAS,yBAAyB,UAAoC;;CAEpE,IAAI,CAAC,UAAU,QACb,OAAO;CAET,MAAM,cAAc,SAAS,KAAK,EAAE,cAAc,OAAO;CACzD,MAAM,iBAAiB,YAAY,QAAQ,MAAMA,IAAa,SAAS,CAAC,CAAC;CAEzE,QADiB,eAAe,SAAS,iBAAiB,YAAA,CAC1C,QAAQ,eAAe,YACrC,QAAQ,SAAS,aAAa,MAAM,IAChC,mDACyC,aAC/C;AACF;AAEA,SAAS,gBAAgB,UAAwC;CAC/D,MAAM,MAAuB,CAAC;CAE9B,MAAM,WADW,SAAS,mBAAmB,qBACrB,CAAC,EAAE,cAAc,SAAS;CAClD,IAAI,CAAC,UACH,OAAO;CAET,IAAI,WAAW,SAAS,KAAK,OAAO,GAAG,GAAG;CAC1C,MAAM,SAAS,SAAS,mBAAmB,mBAAmB;CAC9D,IAAI,QAAQ,KAAK;EACf,IAAI,SAAS,CAAC;EACd,IAAI,KAAK,SAAS,OAAO;CAC3B;CACA,MAAM,UAAU,SAAS,mBAAmB,oBAAoB;CAChE,IAAI,SAAS,KAAK;EAChB,IAAI,SAAS,CAAC;EACd,IAAI,KAAK,UAAU,QAAQ;CAC7B;CAEA,OAAO;AACT;AAEA,MAAa,sBAAsB,CAAC,UAAU;AAE9C,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAO,KAAK;CAEZ,UAA4B;CAE5B,sBAAwC;CAExC,oBAA8CC;CAE9C,mBAAuD;CAEvD,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,YAAY,KAAK,gBAAgB,IAAI;EACnC,MAAM,EAAE;CACV;CAEA,MAAM,0BACJ,YACA,SAC0B;EAC1B,MAAM,cAAc,YAAY,YAAY,SAAS,oBAAoB;EAEzE,QAAO,MADyB,iBAAiB,KAAK,MAAM,WAAW,EAAA,CAEpE,WAAW,EAAE,MAAM,eAAe,gBAAgB,QAAQ,CAAC,CAAC,CAC5D,SAAS,QAAQ;GAChB,OAAO,MACL,uCAAuC,WAAW,QAAQ,KAAK,IAAI,MACrE;EACF,CAAC,CAAC,CACD,SAAS,CAAC,CAAC;CAChB;CAEA,MAAM,YAAY,EAChB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,aAAa,mBAAmB,WAAW;EACjD,MAAM,UAAU,oBAAoB,WAAW;EAE/C,KAEG,YAAY,SAAS,iBAAiB,KAErC,YAAY,SAAS,gBAAgB,MACvC,mBAAmB,MAAM,QAAQ,YAAY,oBAAoB,GAAG,CAAC,GACrE;GACA,OAAO,MACL,8DAA8D,YAAY,EAC5E;GACA,OAAO;EACT;EAEA,OAAO,MAAM,cAAc,WAAW,QAAQ,iBAAiB,SAAS;EAExE,MAAM,WAAW,MAAM,KAAK,0BAA0B,YAAY,OAAO;EACzE,IAAI,CAAC,SAAS,UAAU,QACtB,OAAO;EAET,MAAM,WAAW,SAAS,SAAS,KAAK,aAAa,EAAE,QAAQ,EAAE;EAEjE,OAAO,MACL,SAAS,SAAS,OAAO,oBAAoB,WAAW,QAAQ,iBAAiB,SACnF;EAEA,MAAM,wBAAwB,yBAAyB,QAAQ;EAC/D,MAAM,iBACJ,yBACC,MAAM,kBACL,KAAK,MACL,YACA,SACA,qBACF;EAEF,MAAM,SAAwB;GAC5B,GAAG;GACH,GAAG;GACH;EACF;EACA,IAAI,SAAS,MAAM;GACjB,OAAO,OAAO,SAAS;GACvB,IAAI,OAAO,KAAK,QAAQ;IACtB,OAAO,MAAM,yCAAyC,aAAa;IACnE,OAAO,gBAAgB;GACzB;EACF;EAEA,IAAI,CAAC,KAAK,oBAAoB,SAAS,WAAW,GAChD,OAAO,YAAY;EAGrB,OAAO;CACT;CAEA,MAAe,mBACb,EAAE,aAAa,eACf,SACmC;EACnC,MAAM,EAAE,SAAS,gBAAgB;EACjC,MAAM,WAAW,cACb,sBAAsB,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YACnE,sBAAsB,YAAY,GAAG,YAAY,GAAG;EACxD,MAAM,eAAe,MAAMC,IACzB,uCACA,QACF;;EAGA,IAAI,cACF,OAAO;EAGT,IAAI,CAAC,eAAe,CAAC,aACnB,OAAO;EAGT,MAAM,aAAa,mBAAmB,WAAW;EAEjD,MAAM,SAAS,MAAM,0BACnB,KAAK,MACL,QAAQ,eAAe,QAAQ,SAC/B,YACA,WACF;EAEA,MAAM,cAAc,YAAY,YAAY,aAAa,MAAM;EAE/D,MAAM,EAAE,KAAK,SAAQ,MADK,cAAc,KAAK,MAAM,WAAW,EAAA,CAC7B,OAAO;EAExC,IAAI,KAAK;GACP,MAAM,SACJ,IAAI,SAAS,cAAc,WAAW;GACxC,IAAI,WAAW,UACb,MAAMC,IACJ,uCACA,UACA,QACA,IACF;GAEF,OAAO;EACT;EAEA,IAAI,IAAI,cACN,QAAQ,mBAAmB,YAAY,IAAI,YAAY;EAGzD,OAAO;CACT;AACF"}
@@ -51,7 +51,7 @@ const cacheProvider = new PackageHttpCacheProvider({
51
51
  });
52
52
  const pomCacheProvider = new PackageHttpCacheProvider({
53
53
  namespace: "datasource-maven:pom-cache-provider",
54
- softTtlMinutes: 1440 * 28,
54
+ softTtlMinutes: 40320,
55
55
  checkAuthorizationHeader: true,
56
56
  checkCacheControlHeader: false,
57
57
  writeSchema: CachedMavenXml