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":"toml.js","names":["parseToml"],"sources":["../../../../../lib/modules/datasource/custom/formats/toml.ts"],"sourcesContent":["import { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport { parse as parseToml } from '../../../../util/toml.ts';\nimport type { CustomDatasourceFetcher } from './types.ts';\n\nexport class TomlFetcher implements CustomDatasourceFetcher {\n async fetch(http: Http, registryURL: string): Promise<unknown> {\n const response = await http.getToml(registryURL);\n\n return response.body;\n }\n\n async readFile(registryURL: string): Promise<unknown> {\n const fileContent = await readLocalFile(registryURL, 'utf8');\n\n return parseToml(fileContent!);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,MAA4D;CAC1D,MAAM,MAAM,MAAY,aAAuC;EAG7D,QAAO,MAFgB,KAAK,QAAQ,WAAW,EAAA,CAE/B;CAClB;CAEA,MAAM,SAAS,aAAuC;EAGpD,OAAOA,MAAU,MAFS,cAAc,aAAa,MAAM,CAE9B;CAC/B;AACF"}
1
+ {"version":3,"file":"toml.js","names":["parseToml"],"sources":["../../../../../lib/modules/datasource/custom/formats/toml.ts"],"sourcesContent":["import { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport { parse as parseToml } from '../../../../util/toml.ts';\nimport type { CustomDatasourceFetcher } from './types.ts';\n\nexport class TomlFetcher implements CustomDatasourceFetcher {\n async fetch(http: Http, registryURL: string): Promise<unknown> {\n const response = await http.getToml(registryURL);\n\n return response.body;\n }\n\n async readFile(registryURL: string): Promise<unknown> {\n const fileContent = await readLocalFile(registryURL, 'utf8');\n\n return parseToml(fileContent!);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,MAA4D;CAC1D,MAAM,MAAM,MAAY,aAAuC;EAG7D,QAAO,MAFgB,KAAK,QAAQ,WAAW,EAAA,CAE/B;CAClB;CAEA,MAAM,SAAS,aAAuC;EACpD,MAAM,cAAc,MAAM,cAAc,aAAa,MAAM;EAE3D,OAAOA,MAAU,WAAY;CAC/B;AACF"}
@@ -3,10 +3,12 @@ import { readLocalFile } from "../../../../util/fs/index.js";
3
3
  //#region lib/modules/datasource/custom/formats/yaml.ts
4
4
  var YamlFetcher = class {
5
5
  async fetch(http, registryURL) {
6
- return parseSingleYaml((await http.getText(registryURL)).body);
6
+ const response = await http.getText(registryURL);
7
+ return parseSingleYaml(response.body);
7
8
  }
8
9
  async readFile(registryURL) {
9
- return parseSingleYaml(await readLocalFile(registryURL, "utf8"));
10
+ const fileContent = await readLocalFile(registryURL, "utf8");
11
+ return parseSingleYaml(fileContent);
10
12
  }
11
13
  };
12
14
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"yaml.js","names":[],"sources":["../../../../../lib/modules/datasource/custom/formats/yaml.ts"],"sourcesContent":["import { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { CustomDatasourceFetcher } from './types.ts';\n\nexport class YamlFetcher implements CustomDatasourceFetcher {\n async fetch(http: Http, registryURL: string): Promise<unknown> {\n const response = await http.getText(registryURL);\n\n return parseSingleYaml(response.body);\n }\n\n async readFile(registryURL: string): Promise<unknown> {\n const fileContent = await readLocalFile(registryURL, 'utf8');\n\n return parseSingleYaml(fileContent!);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,MAA4D;CAC1D,MAAM,MAAM,MAAY,aAAuC;EAG7D,OAAO,iBAAgB,MAFA,KAAK,QAAQ,WAAW,EAAA,CAEf,IAAI;CACtC;CAEA,MAAM,SAAS,aAAuC;EAGpD,OAAO,gBAAgB,MAFG,cAAc,aAAa,MAAM,CAExB;CACrC;AACF"}
1
+ {"version":3,"file":"yaml.js","names":[],"sources":["../../../../../lib/modules/datasource/custom/formats/yaml.ts"],"sourcesContent":["import { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { CustomDatasourceFetcher } from './types.ts';\n\nexport class YamlFetcher implements CustomDatasourceFetcher {\n async fetch(http: Http, registryURL: string): Promise<unknown> {\n const response = await http.getText(registryURL);\n\n return parseSingleYaml(response.body);\n }\n\n async readFile(registryURL: string): Promise<unknown> {\n const fileContent = await readLocalFile(registryURL, 'utf8');\n\n return parseSingleYaml(fileContent!);\n }\n}\n"],"mappings":";;;AAKA,IAAa,cAAb,MAA4D;CAC1D,MAAM,MAAM,MAAY,aAAuC;EAC7D,MAAM,WAAW,MAAM,KAAK,QAAQ,WAAW;EAE/C,OAAO,gBAAgB,SAAS,IAAI;CACtC;CAEA,MAAM,SAAS,aAAuC;EACpD,MAAM,cAAc,MAAM,cAAc,aAAa,MAAM;EAE3D,OAAO,gBAAgB,WAAY;CACrC;AACF"}
@@ -25,7 +25,8 @@ function parseChecksumsFromInRelease(inReleaseContent, packagePath) {
25
25
  * @returns resolves to the SHA256 checksum
26
26
  */
27
27
  function computeFileChecksum(filePath) {
28
- return hashStream(createCacheReadStream(filePath), "sha256");
28
+ const stream = createCacheReadStream(filePath);
29
+ return hashStream(stream, "sha256");
29
30
  }
30
31
  //#endregion
31
32
  export { computeFileChecksum, parseChecksumsFromInRelease };
@@ -1 +1 @@
1
- {"version":3,"file":"checksum.js","names":[],"sources":["../../../../lib/modules/datasource/deb/checksum.ts"],"sourcesContent":["import { createCacheReadStream } from '../../../util/fs/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { escapeRegExp, newlineRegex, regEx } from '../../../util/regex.ts';\n\n/**\n * Parses the SHA256 checksum for a specified package path from the InRelease content.\n *\n * @param inReleaseContent - content of the InRelease file\n * @param packagePath - path of the package file (e.g., 'contrib/binary-amd64/Packages.gz')\n * @returns The SHA256 checksum if found, otherwise undefined\n */\nexport function parseChecksumsFromInRelease(\n inReleaseContent: string,\n packagePath: string,\n): string | null {\n const lines = inReleaseContent.split(newlineRegex);\n const regex = regEx(\n `([a-f0-9]{64})\\\\s+\\\\d+\\\\s+${escapeRegExp(packagePath)}$`,\n );\n\n for (const line of lines) {\n const match = regex.exec(line);\n if (match) {\n return match[1];\n }\n }\n\n return null;\n}\n\n/**\n * Computes the SHA256 checksum of a specified file.\n *\n * @param filePath - path of the file\n * @returns resolves to the SHA256 checksum\n */\nexport function computeFileChecksum(filePath: string): Promise<string> {\n const stream = createCacheReadStream(filePath);\n return hashStream(stream, 'sha256');\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,4BACd,kBACA,aACe;CACf,MAAM,QAAQ,iBAAiB,MAAM,YAAY;CACjD,MAAM,QAAQ,MACZ,6BAA6B,aAAa,WAAW,EAAE,EACzD;CAEA,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,MAAM,KAAK,IAAI;EAC7B,IAAI,OACF,OAAO,MAAM;CAEjB;CAEA,OAAO;AACT;;;;;;;AAQA,SAAgB,oBAAoB,UAAmC;CAErE,OAAO,WADQ,sBAAsB,QACd,GAAG,QAAQ;AACpC"}
1
+ {"version":3,"file":"checksum.js","names":[],"sources":["../../../../lib/modules/datasource/deb/checksum.ts"],"sourcesContent":["import { createCacheReadStream } from '../../../util/fs/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { escapeRegExp, newlineRegex, regEx } from '../../../util/regex.ts';\n\n/**\n * Parses the SHA256 checksum for a specified package path from the InRelease content.\n *\n * @param inReleaseContent - content of the InRelease file\n * @param packagePath - path of the package file (e.g., 'contrib/binary-amd64/Packages.gz')\n * @returns The SHA256 checksum if found, otherwise undefined\n */\nexport function parseChecksumsFromInRelease(\n inReleaseContent: string,\n packagePath: string,\n): string | null {\n const lines = inReleaseContent.split(newlineRegex);\n const regex = regEx(\n `([a-f0-9]{64})\\\\s+\\\\d+\\\\s+${escapeRegExp(packagePath)}$`,\n );\n\n for (const line of lines) {\n const match = regex.exec(line);\n if (match) {\n return match[1];\n }\n }\n\n return null;\n}\n\n/**\n * Computes the SHA256 checksum of a specified file.\n *\n * @param filePath - path of the file\n * @returns resolves to the SHA256 checksum\n */\nexport function computeFileChecksum(filePath: string): Promise<string> {\n const stream = createCacheReadStream(filePath);\n return hashStream(stream, 'sha256');\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,4BACd,kBACA,aACe;CACf,MAAM,QAAQ,iBAAiB,MAAM,YAAY;CACjD,MAAM,QAAQ,MACZ,6BAA6B,aAAa,WAAW,EAAE,EACzD;CAEA,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,MAAM,KAAK,IAAI;EAC7B,IAAI,OACF,OAAO,MAAM;CAEjB;CAEA,OAAO;AACT;;;;;;;AAQA,SAAgB,oBAAoB,UAAmC;CACrE,MAAM,SAAS,sBAAsB,QAAQ;CAC7C,OAAO,WAAW,QAAQ,QAAQ;AACpC"}
@@ -60,7 +60,9 @@ async function downloadPackageFile(basePackageUrl, compression, compressedFile,
60
60
  logger.debug(`No need to download ${packageUrl}, file is up to date.`);
61
61
  return false;
62
62
  }
63
- await pipeline(http.stream(packageUrl), createCacheWriteStream(compressedFile));
63
+ const readStream = http.stream(packageUrl);
64
+ const writeStream = createCacheWriteStream(compressedFile);
65
+ await pipeline(readStream, writeStream);
64
66
  logger.debug({
65
67
  url: packageUrl,
66
68
  targetFile: compressedFile
@@ -1 +1 @@
1
- {"version":3,"file":"packages.js","names":["fs.ensureCacheDir","fs.rmCache","fs.createCacheWriteStream","fs.pipeline"],"sources":["../../../../lib/modules/datasource/deb/packages.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport {\n computeFileChecksum,\n parseChecksumsFromInRelease,\n} from './checksum.ts';\nimport { cacheSubDir } from './common.ts';\nimport { checkIfModified, getBaseSuiteUrl } from './url.ts';\nimport { extract, getFileCreationTime } from './utils.ts';\n\n/**\n * Downloads and extracts a package file from a component URL.\n *\n * @param componentUrl - The URL of the component.\n * @returns The path to the extracted file and the last modification timestamp.\n * @throws Will throw an error if no valid compression method is found.\n */\nexport async function downloadAndExtractPackage(\n componentUrl: string,\n http: Http,\n): Promise<{ extractedFile: string; lastTimestamp: Date }> {\n const packageUrlHash = toSha256(componentUrl);\n const fullCacheDir = await fs.ensureCacheDir(cacheSubDir);\n const extractedFile = upath.join(fullCacheDir, `${packageUrlHash}.txt`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compression = 'gz';\n const compressedFile = upath.join(\n fullCacheDir,\n `${randomUUID()}_${packageUrlHash}.${compression}`,\n );\n\n const wasUpdated = await downloadPackageFile(\n componentUrl,\n compression,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n await extract(compressedFile, compression, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (error) {\n logger.warn(\n {\n compressedFile,\n componentUrl,\n compression,\n error: error.message,\n },\n 'Failed to extract package file from compressed file',\n );\n } finally {\n await fs.rmCache(compressedFile);\n }\n }\n\n if (!lastTimestamp) {\n //extracting went wrong\n throw new Error('Missing metadata in extracted package index file!');\n }\n\n return { extractedFile, lastTimestamp };\n}\n\n/**\n * Downloads a package file if it has been modified since the last download timestamp.\n *\n * @param basePackageUrl - The base URL of the package.\n * @param compression - The compression method used (e.g., 'gz').\n * @param compressedFile - The path where the compressed file will be saved.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the file was downloaded, otherwise false.\n */\nexport async function downloadPackageFile(\n basePackageUrl: string,\n compression: string,\n compressedFile: string,\n http: Http,\n lastDownloadTimestamp?: Date,\n): Promise<boolean> {\n const baseSuiteUrl = getBaseSuiteUrl(basePackageUrl);\n const packageUrl = joinUrlParts(basePackageUrl, `Packages.${compression}`);\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await checkIfModified(\n packageUrl,\n lastDownloadTimestamp,\n http,\n );\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${packageUrl}, file is up to date.`);\n return false;\n }\n const readStream = http.stream(packageUrl);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n logger.debug(\n { url: packageUrl, targetFile: compressedFile },\n 'Downloading Debian package file',\n );\n\n let inReleaseContent = '';\n\n try {\n inReleaseContent = await fetchInReleaseFile(baseSuiteUrl, http);\n } catch (error) {\n // This is expected to fail for Artifactory if GPG verification is not enabled\n logger.debug(\n { url: baseSuiteUrl, err: error },\n 'Could not fetch InRelease file',\n );\n }\n\n if (inReleaseContent) {\n const actualChecksum = await computeFileChecksum(compressedFile);\n const expectedChecksum = parseChecksumsFromInRelease(\n inReleaseContent,\n // path to the Package.gz file\n packageUrl.replace(`${baseSuiteUrl}/`, ''),\n );\n if (actualChecksum !== expectedChecksum) {\n await fs.rmCache(compressedFile);\n throw new Error('SHA256 checksum validation failed');\n }\n }\n\n return needsToDownload;\n}\n\n/**\n * Fetches the content of the InRelease file from the given base suite URL.\n *\n * @param baseReleaseUrl - The base URL of the suite (e.g., 'https://deb.debian.org/debian/dists/bullseye').\n * @returns resolves to the content of the InRelease file.\n * @throws An error if the InRelease file could not be downloaded.\n */\nexport async function fetchInReleaseFile(\n baseReleaseUrl: string,\n http: Http,\n): Promise<string> {\n const inReleaseUrl = joinUrlParts(baseReleaseUrl, 'InRelease');\n const response = await http.getText(inReleaseUrl);\n return response.body;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAsBA,eAAsB,0BACpB,cACA,MACyD;CACzD,MAAM,iBAAiB,SAAS,YAAY;CAC5C,MAAM,eAAe,MAAMA,eAAAA,KAA6B;CACxD,MAAM,gBAAgB,MAAM,KAAK,cAAc,GAAG,eAAe,KAAK;CACtE,IAAI,gBAAgB,MAAM,oBAAoB,aAAa;CAE3D,MAAM,cAAc;CACpB,MAAM,iBAAiB,MAAM,KAC3B,cACA,GAAG,WAAW,EAAE,GAAG,eAAe,GAAG,aACvC;CAUA,IAAI,MARqB,oBACvB,cACA,aACA,gBACA,MACA,aACF,KAEkB,CAAC,eACjB,IAAI;EACF,MAAM,QAAQ,gBAAgB,aAAa,aAAa;EACxD,gBAAgB,MAAM,oBAAoB,aAAa;CACzD,SAAS,OAAO;EACd,OAAO,KACL;GACE;GACA;GACA;GACA,OAAO,MAAM;EACf,GACA,qDACF;CACF,UAAU;EACR,MAAMC,QAAW,cAAc;CACjC;CAGF,IAAI,CAAC,eAEH,MAAM,IAAI,MAAM,mDAAmD;CAGrE,OAAO;EAAE;EAAe;CAAc;AACxC;;;;;;;;;;AAWA,eAAsB,oBACpB,gBACA,aACA,gBACA,MACA,uBACkB;CAClB,MAAM,eAAe,gBAAgB,cAAc;CACnD,MAAM,aAAa,aAAa,gBAAgB,YAAY,aAAa;CACzE,IAAI,kBAAkB;CAEtB,IAAI,uBACF,kBAAkB,MAAM,gBACtB,YACA,uBACA,IACF;CAGF,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,uBAAuB,WAAW,sBAAsB;EACrE,OAAO;CACT;CAGA,MAAME,SAFa,KAAK,OAAO,UAEb,GADED,uBAA0B,cAChB,CAAW;CACzC,OAAO,MACL;EAAE,KAAK;EAAY,YAAY;CAAe,GAC9C,iCACF;CAEA,IAAI,mBAAmB;CAEvB,IAAI;EACF,mBAAmB,MAAM,mBAAmB,cAAc,IAAI;CAChE,SAAS,OAAO;EAEd,OAAO,MACL;GAAE,KAAK;GAAc,KAAK;EAAM,GAChC,gCACF;CACF;CAEA,IAAI,kBAOE;MAAA,MANyB,oBAAoB,cAAc,MACtC,4BACvB,kBAEA,WAAW,QAAQ,GAAG,aAAa,IAAI,EAAE,CAEL,GAAG;GACvC,MAAMD,QAAW,cAAc;GAC/B,MAAM,IAAI,MAAM,mCAAmC;EACrD;;CAGF,OAAO;AACT;;;;;;;;AASA,eAAsB,mBACpB,gBACA,MACiB;CACjB,MAAM,eAAe,aAAa,gBAAgB,WAAW;CAE7D,QAAO,MADgB,KAAK,QAAQ,YAAY,EAAA,CAChC;AAClB"}
1
+ {"version":3,"file":"packages.js","names":["fs.ensureCacheDir","fs.rmCache","fs.createCacheWriteStream","fs.pipeline"],"sources":["../../../../lib/modules/datasource/deb/packages.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport {\n computeFileChecksum,\n parseChecksumsFromInRelease,\n} from './checksum.ts';\nimport { cacheSubDir } from './common.ts';\nimport { checkIfModified, getBaseSuiteUrl } from './url.ts';\nimport { extract, getFileCreationTime } from './utils.ts';\n\n/**\n * Downloads and extracts a package file from a component URL.\n *\n * @param componentUrl - The URL of the component.\n * @returns The path to the extracted file and the last modification timestamp.\n * @throws Will throw an error if no valid compression method is found.\n */\nexport async function downloadAndExtractPackage(\n componentUrl: string,\n http: Http,\n): Promise<{ extractedFile: string; lastTimestamp: Date }> {\n const packageUrlHash = toSha256(componentUrl);\n const fullCacheDir = await fs.ensureCacheDir(cacheSubDir);\n const extractedFile = upath.join(fullCacheDir, `${packageUrlHash}.txt`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compression = 'gz';\n const compressedFile = upath.join(\n fullCacheDir,\n `${randomUUID()}_${packageUrlHash}.${compression}`,\n );\n\n const wasUpdated = await downloadPackageFile(\n componentUrl,\n compression,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n await extract(compressedFile, compression, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (error) {\n logger.warn(\n {\n compressedFile,\n componentUrl,\n compression,\n error: error.message,\n },\n 'Failed to extract package file from compressed file',\n );\n } finally {\n await fs.rmCache(compressedFile);\n }\n }\n\n if (!lastTimestamp) {\n //extracting went wrong\n throw new Error('Missing metadata in extracted package index file!');\n }\n\n return { extractedFile, lastTimestamp };\n}\n\n/**\n * Downloads a package file if it has been modified since the last download timestamp.\n *\n * @param basePackageUrl - The base URL of the package.\n * @param compression - The compression method used (e.g., 'gz').\n * @param compressedFile - The path where the compressed file will be saved.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the file was downloaded, otherwise false.\n */\nexport async function downloadPackageFile(\n basePackageUrl: string,\n compression: string,\n compressedFile: string,\n http: Http,\n lastDownloadTimestamp?: Date,\n): Promise<boolean> {\n const baseSuiteUrl = getBaseSuiteUrl(basePackageUrl);\n const packageUrl = joinUrlParts(basePackageUrl, `Packages.${compression}`);\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await checkIfModified(\n packageUrl,\n lastDownloadTimestamp,\n http,\n );\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${packageUrl}, file is up to date.`);\n return false;\n }\n const readStream = http.stream(packageUrl);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n logger.debug(\n { url: packageUrl, targetFile: compressedFile },\n 'Downloading Debian package file',\n );\n\n let inReleaseContent = '';\n\n try {\n inReleaseContent = await fetchInReleaseFile(baseSuiteUrl, http);\n } catch (error) {\n // This is expected to fail for Artifactory if GPG verification is not enabled\n logger.debug(\n { url: baseSuiteUrl, err: error },\n 'Could not fetch InRelease file',\n );\n }\n\n if (inReleaseContent) {\n const actualChecksum = await computeFileChecksum(compressedFile);\n const expectedChecksum = parseChecksumsFromInRelease(\n inReleaseContent,\n // path to the Package.gz file\n packageUrl.replace(`${baseSuiteUrl}/`, ''),\n );\n if (actualChecksum !== expectedChecksum) {\n await fs.rmCache(compressedFile);\n throw new Error('SHA256 checksum validation failed');\n }\n }\n\n return needsToDownload;\n}\n\n/**\n * Fetches the content of the InRelease file from the given base suite URL.\n *\n * @param baseReleaseUrl - The base URL of the suite (e.g., 'https://deb.debian.org/debian/dists/bullseye').\n * @returns resolves to the content of the InRelease file.\n * @throws An error if the InRelease file could not be downloaded.\n */\nexport async function fetchInReleaseFile(\n baseReleaseUrl: string,\n http: Http,\n): Promise<string> {\n const inReleaseUrl = joinUrlParts(baseReleaseUrl, 'InRelease');\n const response = await http.getText(inReleaseUrl);\n return response.body;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAsBA,eAAsB,0BACpB,cACA,MACyD;CACzD,MAAM,iBAAiB,SAAS,YAAY;CAC5C,MAAM,eAAe,MAAMA,eAAAA,KAA6B;CACxD,MAAM,gBAAgB,MAAM,KAAK,cAAc,GAAG,eAAe,KAAK;CACtE,IAAI,gBAAgB,MAAM,oBAAoB,aAAa;CAE3D,MAAM,cAAc;CACpB,MAAM,iBAAiB,MAAM,KAC3B,cACA,GAAG,WAAW,EAAE,GAAG,eAAe,GAAG,aACvC;CAUA,IAAI,MARqB,oBACvB,cACA,aACA,gBACA,MACA,aACF,KAEkB,CAAC,eACjB,IAAI;EACF,MAAM,QAAQ,gBAAgB,aAAa,aAAa;EACxD,gBAAgB,MAAM,oBAAoB,aAAa;CACzD,SAAS,OAAO;EACd,OAAO,KACL;GACE;GACA;GACA;GACA,OAAO,MAAM;EACf,GACA,qDACF;CACF,UAAU;EACR,MAAMC,QAAW,cAAc;CACjC;CAGF,IAAI,CAAC,eAEH,MAAM,IAAI,MAAM,mDAAmD;CAGrE,OAAO;EAAE;EAAe;CAAc;AACxC;;;;;;;;;;AAWA,eAAsB,oBACpB,gBACA,aACA,gBACA,MACA,uBACkB;CAClB,MAAM,eAAe,gBAAgB,cAAc;CACnD,MAAM,aAAa,aAAa,gBAAgB,YAAY,aAAa;CACzE,IAAI,kBAAkB;CAEtB,IAAI,uBACF,kBAAkB,MAAM,gBACtB,YACA,uBACA,IACF;CAGF,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,uBAAuB,WAAW,sBAAsB;EACrE,OAAO;CACT;CACA,MAAM,aAAa,KAAK,OAAO,UAAU;CACzC,MAAM,cAAcC,uBAA0B,cAAc;CAC5D,MAAMC,SAAY,YAAY,WAAW;CACzC,OAAO,MACL;EAAE,KAAK;EAAY,YAAY;CAAe,GAC9C,iCACF;CAEA,IAAI,mBAAmB;CAEvB,IAAI;EACF,mBAAmB,MAAM,mBAAmB,cAAc,IAAI;CAChE,SAAS,OAAO;EAEd,OAAO,MACL;GAAE,KAAK;GAAc,KAAK;EAAM,GAChC,gCACF;CACF;CAEA,IAAI,kBAOE;MAAA,MANyB,oBAAoB,cAAc,MACtC,4BACvB,kBAEA,WAAW,QAAQ,GAAG,aAAa,IAAI,EAAE,CAEL,GAAG;GACvC,MAAMF,QAAW,cAAc;GAC/B,MAAM,IAAI,MAAM,mCAAmC;EACrD;;CAGF,OAAO;AACT;;;;;;;;AASA,eAAsB,mBACpB,gBACA,MACiB;CACjB,MAAM,eAAe,aAAa,gBAAgB,WAAW;CAE7D,QAAO,MADgB,KAAK,QAAQ,YAAY,EAAA,CAChC;AAClB"}
@@ -29,7 +29,8 @@ var DenoDatasource = class DenoDatasource extends Datasource {
29
29
  logger.debug(`Could not extract rawPackageName from packageName: "${packageName}"`);
30
30
  return null;
31
31
  }
32
- const moduleAPIURL = joinUrlParts(massagedRegistryUrl, "v2/modules", rawPackageName.replace("x/", ""));
32
+ const massagedPackageName = rawPackageName.replace("x/", "");
33
+ const moduleAPIURL = joinUrlParts(massagedRegistryUrl, "v2/modules", massagedPackageName);
33
34
  return await this.getReleaseResult(moduleAPIURL);
34
35
  }
35
36
  getReleases(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semanticVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/deno/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as semanticVersioning from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { Release } from '../index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n DenoAPIModuleResponse,\n DenoAPIModuleVersionResponse,\n} from './schema.ts';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override readonly defaultRegistryUrls = ['https://apiland.deno.dev'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (isNullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getReleaseResult(\n moduleAPIURL: string,\n ): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> =\n (await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n )) ?? {};\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next 3: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n\n getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n key: `getReleaseResult:${moduleAPIURL}`,\n },\n () => this._getReleaseResult(moduleAPIURL),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAgBA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,wBAA0C;CAE1C,mBAAqC;CAErC,oBAAsCA;CAEtC,sBAAwC,CAAC,0BAA0B;CAEnE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,sBAAsB;EAK5B,MAAM,iBAHgB,MACpB,oDACF,CAAC,CAAC,KAAK,WAC4B,CAAC,EAAE,QAAQ;EAC9C,IAAI,kBAAkB,cAAc,GAAG;GACrC,OAAO,MACL,uDAAuD,YAAY,EACrE;GACA,OAAO;EACT;EAMA,MAAM,eAAe,aACnB,qBACA,cAL0B,eAAe,QAAQ,MAAM,EAMrC,CACpB;EAEA,OAAO,MAAM,KAAK,iBAAiB,YAAY;CACjD;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GAExC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,kBACZ,cACwB;EACxB,MAAM,kBAAkB,WAAW;EACnC,MAAM,gBACH,MAAMC,IACL,cAAc,eAAe,MAC7B,eACF,KAAM,CAAC;EACT,IAAI,gBAAgB;EAEpB,MAAM,EACJ,MAAM,EAAE,UAAU,WAChB,MAAM,KAAK,KAAK,QAAQ,cAAc,qBAAqB;EAG/D,MAAM,WAAW,MAAM,KACrB,UACA,OAAO,YAAY;GACjB,MAAM,eAAe,cAAc;;GAEnC,IAAI,cACF,OAAO;GAIT,MAAM,MAAM,aAAa,cAAc,OAAO;GAC9C,MAAM,EAAE,MAAM,YAAY,MAAM,KAAK,KAAK,QACxC,KACA,6BAA6B,OAAO,EAAE,OAAO,UAAU;IACrD,OAAO,KACL;KAAE;KAAK;IAAQ,GACf,qCACF;IACA,OAAO,EAAE,QAAQ;GACnB,CAAC,CACH;GAEA,cAAc,QAAQ,WAAW;GACjC,gBAAgB;GAEhB,OAAO;EACT,GACA,EAAE,aAAa,EAAE,CACnB;EAEA,IAAI,eAEF,MAAMC,IACJ,cAAc,eAAe,MAC7B,iBACA,eACA,KACF;EAGF,OAAO;GAAE;GAAU;EAAK;CAC1B;CAEA,iBAAiB,cAA8C;EAC7D,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,oBAAoB;EAC3B,SACM,KAAK,kBAAkB,YAAY,CAC3C;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semanticVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/deno/index.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as semanticVersioning from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { Release } from '../index.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport {\n DenoAPIModuleResponse,\n DenoAPIModuleVersionResponse,\n} from './schema.ts';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override readonly defaultRegistryUrls = ['https://apiland.deno.dev'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (isNullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getReleaseResult(\n moduleAPIURL: string,\n ): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> =\n (await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n )) ?? {};\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next 3: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n\n getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n return withCache(\n {\n namespace: `datasource-${DenoDatasource.id}`,\n key: `getReleaseResult:${moduleAPIURL}`,\n },\n () => this._getReleaseResult(moduleAPIURL),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAgBA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,wBAA0C;CAE1C,mBAAqC;CAErC,oBAAsCA;CAEtC,sBAAwC,CAAC,0BAA0B;CAEnE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,MAAM,sBAAsB;EAK5B,MAAM,iBAHgB,MACpB,oDACF,CAAC,CAAC,KAAK,WAC4B,CAAC,EAAE,QAAQ;EAC9C,IAAI,kBAAkB,cAAc,GAAG;GACrC,OAAO,MACL,uDAAuD,YAAY,EACrE;GACA,OAAO;EACT;EAGA,MAAM,sBAAsB,eAAe,QAAQ,MAAM,EAAE;EAG3D,MAAM,eAAe,aACnB,qBACA,cACA,mBACF;EAEA,OAAO,MAAM,KAAK,iBAAiB,YAAY;CACjD;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GAExC,KAAK,eAAe,OAAO,YAAY,GAAG,OAAO;GACjD,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,kBACZ,cACwB;EACxB,MAAM,kBAAkB,WAAW;EACnC,MAAM,gBACH,MAAMC,IACL,cAAc,eAAe,MAC7B,eACF,KAAM,CAAC;EACT,IAAI,gBAAgB;EAEpB,MAAM,EACJ,MAAM,EAAE,UAAU,WAChB,MAAM,KAAK,KAAK,QAAQ,cAAc,qBAAqB;EAG/D,MAAM,WAAW,MAAM,KACrB,UACA,OAAO,YAAY;GACjB,MAAM,eAAe,cAAc;;GAEnC,IAAI,cACF,OAAO;GAIT,MAAM,MAAM,aAAa,cAAc,OAAO;GAC9C,MAAM,EAAE,MAAM,YAAY,MAAM,KAAK,KAAK,QACxC,KACA,6BAA6B,OAAO,EAAE,OAAO,UAAU;IACrD,OAAO,KACL;KAAE;KAAK;IAAQ,GACf,qCACF;IACA,OAAO,EAAE,QAAQ;GACnB,CAAC,CACH;GAEA,cAAc,QAAQ,WAAW;GACjC,gBAAgB;GAEhB,OAAO;EACT,GACA,EAAE,aAAa,EAAE,CACnB;EAEA,IAAI,eAEF,MAAMC,IACJ,cAAc,eAAe,MAC7B,iBACA,eACA,KACF;EAGF,OAAO;GAAE;GAAU;EAAK;CAC1B;CAEA,iBAAiB,cAA8C;EAC7D,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,oBAAoB;EAC3B,SACM,KAAK,kBAAkB,YAAY,CAC3C;CACF;AACF"}
@@ -126,7 +126,7 @@ async function getAuthHeaders(http, registryHost, dockerRepository, apiCheckUrl
126
126
  }
127
127
  addSecretForSanitizing(token);
128
128
  return { authorization: `Bearer ${token}` };
129
- } catch (err) /* istanbul ignore next */ {
129
+ } catch (err) /* istanbul ignore next */ {
130
130
  /* v8 ignore if -- quay.io errors are swallowed pending #9604, not reproduced in specs */
131
131
  if (err.host === "quay.io") return null;
132
132
  /* v8 ignore if -- registry auth rejection is logged and swallowed, not mocked in specs */
@@ -177,7 +177,8 @@ function getRegistryRepository(packageName, registryUrl) {
177
177
  let registryHost = trimTrailingSlash(registryUrl);
178
178
  if (!regEx(/^https?:\/\//).test(registryHost)) registryHost = `https://${registryHost}`;
179
179
  let dockerRepository = packageName.replace(registryEndingWithSlash, "");
180
- const parsedFullUrl = parseUrl(`${registryHost}/${dockerRepository}`);
180
+ const fullUrl = `${registryHost}/${dockerRepository}`;
181
+ const parsedFullUrl = parseUrl(fullUrl);
181
182
  if (!parsedFullUrl) return {
182
183
  registryHost,
183
184
  dockerRepository
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":["hostRules.find","dockerVersioning"],"sources":["../../../../lib/modules/datasource/docker/common.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport {\n HOST_DISABLED,\n PAGE_NOT_FOUND_ERROR,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport type {\n HttpOptions,\n HttpResponse,\n OutgoingHttpHeaders,\n} from '../../../util/http/types.ts';\nimport type { ParamsChallenge } from '../../../util/http/www-authenticate.ts';\nimport { BearerScheme, parse } from '../../../util/http/www-authenticate.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { addSecretForSanitizing } from '../../../util/sanitize.ts';\nimport {\n ensureTrailingSlash,\n parseUrl,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport { api as dockerVersioning } from '../../versioning/docker/index.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { ecrRegex, getECRAuthToken, isECRMaxResultsResponse } from './ecr.ts';\nimport { googleRegex } from './google.ts';\nimport type { OciHelmConfig } from './schema.ts';\nimport { RegistryAuthToken } from './schema.ts';\nimport type { RegistryRepository } from './types.ts';\n\nexport const dockerDatasourceId = 'docker';\n\nexport const imageUrlLabel = 'org.opencontainers.image.url';\n\nexport const sourceLabel = 'org.opencontainers.image.source';\nexport const sourceLabels = [sourceLabel, 'org.label-schema.vcs-url'] as const;\n\nexport const gitRefLabel = 'org.opencontainers.image.revision';\n\nexport const DOCKER_HUB = 'https://index.docker.io';\n\nexport function isDockerHost(host: string): boolean {\n const regex = regEx(/(?:^|\\.)docker\\.io$/);\n return regex.test(host);\n}\n\nexport async function getAuthHeaders(\n http: Http,\n registryHost: string,\n dockerRepository: string,\n apiCheckUrl = `${registryHost}/v2/`,\n): Promise<OutgoingHttpHeaders | null> {\n try {\n const options = {\n throwHttpErrors: false,\n noAuth: true,\n cacheProvider: memCacheProvider,\n };\n const apiCheckResponse = apiCheckUrl.endsWith('/v2/')\n ? await http.get(apiCheckUrl, options)\n : // use json request, as this will be cached for tags, so it returns json\n // TODO: add cache test\n await http.getJsonUnchecked(apiCheckUrl, options);\n\n if (apiCheckResponse.statusCode === 200) {\n logger.debug(`No registry auth required for ${apiCheckUrl}`);\n return {};\n }\n if (apiCheckResponse.statusCode === 404) {\n logger.debug(`Page Not Found ${apiCheckUrl}`);\n // throw error up to be caught and potentially retried with library/ prefix\n throw new Error(PAGE_NOT_FOUND_ERROR);\n }\n // Some ECR-compatible private registries (e.g. corporate Docker proxies) reject\n // n>1000 with 405 even on the auth-probe request. Fall back to probing the base\n // /v2/ endpoint so getAuthHeaders can still obtain a valid token; the main fetch\n // loop already retries with n=1000 when it encounters this same error.\n if (isECRMaxResultsResponse(apiCheckResponse)) {\n logger.debug(\n { apiCheckUrl },\n 'Registry rejected n>1000 on auth probe; retrying auth check via base /v2/ endpoint',\n );\n return getAuthHeaders(http, registryHost, dockerRepository);\n }\n if (\n apiCheckResponse.statusCode !== 401 ||\n !isNonEmptyString(apiCheckResponse.headers['www-authenticate'])\n ) {\n logger.warn(\n { apiCheckUrl, res: apiCheckResponse },\n 'Invalid registry response',\n );\n return null;\n }\n\n const rule = hostRules.find({\n hostType: dockerDatasourceId,\n url: apiCheckUrl,\n });\n const opts: HttpOptions = {};\n\n if (ecrRegex.test(registryHost)) {\n logger.once.debug(`hostRules: ecr auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using ecr auth for Docker registry`,\n );\n const [, region] = coerceArray(ecrRegex.exec(registryHost));\n const auth = await getECRAuthToken(region, rule);\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n }\n } else if (\n googleRegex.test(registryHost) &&\n typeof rule.username === 'undefined' &&\n typeof rule.password === 'undefined' &&\n typeof rule.token === 'undefined'\n ) {\n logger.once.debug(`hostRules: google auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using google auth for Docker registry`,\n );\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { registryHost, dockerRepository },\n 'Could not get Google access token, using no auth',\n );\n }\n } else if (rule.username && rule.password) {\n logger.once.debug(`hostRules: basic auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using basic auth for Docker registry`,\n );\n const auth = Buffer.from(`${rule.username}:${rule.password}`).toString(\n 'base64',\n );\n opts.headers = { authorization: `Basic ${auth}` };\n } else if (rule.token) {\n const authType = rule.authType ?? 'Bearer';\n logger.once.debug(\n `hostRules: ${authType} token auth for ${registryHost}`,\n );\n logger.trace(\n { registryHost, dockerRepository },\n `Using ${authType} token for Docker registry`,\n );\n opts.headers = { authorization: `${authType} ${rule.token}` };\n }\n\n const challenges = parse(apiCheckResponse.headers['www-authenticate']);\n const authenticateHeader = challenges.find(\n (c): c is ParamsChallenge => c.scheme === BearerScheme,\n );\n\n // If realm isn't an url, we should directly use auth header\n // Can happen when we get a Basic auth or some other auth type\n // * WWW-Authenticate: Basic realm=\"Artifactory Realm\"\n // * Www-Authenticate: Basic realm=\"https://123456789.dkr.ecr.eu-central-1.amazonaws.com/\",service=\"ecr.amazonaws.com\"\n // * www-authenticate: Bearer realm=\"https://ghcr.io/token\",service=\"ghcr.io\",scope=\"repository:user/image:pull\"\n // * www-authenticate: Bearer realm=\"https://auth.docker.io/token\",service=\"registry.docker.io\"\n // * www-authenticate: Bearer realm=\"https://codeberg.org/v2/token\",service=\"container_registry\",scope=\"*\",Basic realm=\"https://codeberg.org/v2\",service=\"container_registry\",scope=\"*\"\n if (\n !authenticateHeader ||\n !isString(authenticateHeader.params?.realm) ||\n parseUrl(authenticateHeader.params.realm) === null\n ) {\n logger.once.debug(`hostRules: testing direct auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository, authenticateHeader },\n `Invalid realm, testing direct auth`,\n );\n return opts.headers ?? null;\n }\n\n // already guarded by above clause\n const authUrl = parseUrl(`${authenticateHeader.params.realm}`)!;\n\n // repo isn't known to server yet, so causing wrong scope `repository:user/image:pull`\n if (\n isString(authenticateHeader.params.scope) &&\n !apiCheckUrl.endsWith('/v2/')\n ) {\n authUrl.searchParams.append('scope', authenticateHeader.params.scope);\n } else {\n authUrl.searchParams.append(\n 'scope',\n `repository:${dockerRepository}:pull`,\n );\n }\n\n if (isString(authenticateHeader.params.service)) {\n authUrl.searchParams.append('service', authenticateHeader.params.service);\n }\n\n logger.trace(\n { registryHost, dockerRepository, authUrl: authUrl.href },\n `Obtaining docker registry token`,\n );\n opts.noAuth = true;\n opts.cacheProvider = memCacheProvider;\n const authResponse = (\n await http.getJson(authUrl.href, opts, RegistryAuthToken)\n ).body;\n\n const token = authResponse.token ?? authResponse.access_token;\n /* v8 ignore next 4 -- TODO: add test */\n if (!token) {\n logger.warn('Failed to obtain docker registry token');\n return null;\n }\n // sanitize token\n addSecretForSanitizing(token);\n return {\n authorization: `Bearer ${token}`,\n };\n } catch (err) /* istanbul ignore next */ {\n /* v8 ignore if -- quay.io errors are swallowed pending #9604, not reproduced in specs */\n if (err.host === 'quay.io') {\n // TODO: debug why quay throws errors (#9604)\n return null;\n }\n /* v8 ignore if -- registry auth rejection is logged and swallowed, not mocked in specs */\n if (err.statusCode === 401) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Unauthorized docker lookup',\n );\n logger.debug({ err });\n return null;\n }\n /* v8 ignore if -- registry permission rejection is logged and swallowed, not mocked in specs */\n if (err.statusCode === 403) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Not allowed to access docker registry',\n );\n logger.debug({ err });\n return null;\n }\n if (err.name === 'RequestError' && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n /* v8 ignore if -- Docker Hub rate limiting maps to ExternalHostError, not mocked in specs */\n if (err.statusCode === 429 && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n /* v8 ignore if -- registry server errors map to ExternalHostError, not mocked in specs */\n if (err.statusCode >= 500 && err.statusCode < 600) {\n throw new ExternalHostError(err);\n }\n if (err.message === PAGE_NOT_FOUND_ERROR) {\n throw err;\n }\n /* v8 ignore if -- hostRules-disabled host is swallowed silently, not mocked in specs */\n if (err.message === HOST_DISABLED) {\n logger.trace({ registryHost, dockerRepository, err }, 'Host disabled');\n return null;\n }\n logger.warn(\n { registryHost, dockerRepository, err },\n 'Error obtaining docker token',\n );\n return null;\n }\n}\n\nexport function getRegistryRepository(\n packageName: string,\n registryUrl: string,\n): RegistryRepository {\n if (registryUrl !== DOCKER_HUB) {\n const registryEndingWithSlash = ensureTrailingSlash(\n registryUrl.replace(regEx(/^https?:\\/\\//), ''),\n );\n if (packageName.startsWith(registryEndingWithSlash)) {\n let registryHost = trimTrailingSlash(registryUrl);\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n let dockerRepository = packageName.replace(registryEndingWithSlash, '');\n const fullUrl = `${registryHost}/${dockerRepository}`;\n const parsedFullUrl = parseUrl(fullUrl);\n if (!parsedFullUrl) {\n return { registryHost, dockerRepository };\n }\n registryHost = parsedFullUrl.origin;\n dockerRepository = parsedFullUrl.pathname.substring(1);\n return {\n registryHost,\n dockerRepository,\n };\n }\n }\n let registryHost = registryUrl;\n const split = packageName.split('/');\n if (split.length > 1 && (split[0].includes('.') || split[0].includes(':'))) {\n [registryHost] = split;\n split.shift();\n }\n let dockerRepository = split.join('/');\n\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n\n const { path, base } =\n regEx(/^(?<base>https:\\/\\/[^/]+)\\/(?<path>.+)$/).exec(registryHost)\n ?.groups ?? {};\n if (base && path) {\n registryHost = base;\n dockerRepository = `${trimTrailingSlash(path)}/${dockerRepository}`;\n }\n\n registryHost = registryHost\n .replace('https://docker.io', 'https://index.docker.io')\n .replace('https://registry-1.docker.io', 'https://index.docker.io');\n\n const opts = hostRules.find({\n hostType: dockerDatasourceId,\n url: registryHost,\n });\n if (opts?.insecureRegistry) {\n registryHost = registryHost.replace('https', 'http');\n }\n if (registryHost.endsWith('.docker.io') && !dockerRepository.includes('/')) {\n dockerRepository = `library/${dockerRepository}`;\n }\n return {\n registryHost,\n dockerRepository,\n };\n}\n\nexport function extractDigestFromResponseBody(\n manifestResponse: HttpResponse,\n): string {\n return `sha256:${toSha256(manifestResponse.body)}`;\n}\n\nexport function findLatestStable(tags: string[]): string | null {\n let stable: string | null = null;\n\n for (const tag of tags) {\n if (!dockerVersioning.isValid(tag) || !dockerVersioning.isStable(tag)) {\n continue;\n }\n\n if (!stable || dockerVersioning.isGreaterThan(tag, stable)) {\n stable = tag;\n }\n }\n\n return stable;\n}\n\nconst chartRepo = regEx(/charts?|helm|helm-charts?/i);\n\nfunction isPossibleChartRepo(url: string): boolean {\n if (detectPlatform(url) === null) {\n return false;\n }\n\n const parsed = parseGitUrl(url);\n return chartRepo.test(parsed.name);\n}\n\nexport function findHelmSourceUrl(release: OciHelmConfig): string | null {\n if (release.home && isPossibleChartRepo(release.home)) {\n return release.home;\n }\n\n if (!release.sources?.length) {\n return null;\n }\n\n for (const url of release.sources) {\n if (isPossibleChartRepo(url)) {\n return url;\n }\n }\n\n // fallback\n return release.sources[0];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"common.js","names":["hostRules.find","dockerVersioning"],"sources":["../../../../lib/modules/datasource/docker/common.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport {\n HOST_DISABLED,\n PAGE_NOT_FOUND_ERROR,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { toSha256 } from '../../../util/hash.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport type {\n HttpOptions,\n HttpResponse,\n OutgoingHttpHeaders,\n} from '../../../util/http/types.ts';\nimport type { ParamsChallenge } from '../../../util/http/www-authenticate.ts';\nimport { BearerScheme, parse } from '../../../util/http/www-authenticate.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { addSecretForSanitizing } from '../../../util/sanitize.ts';\nimport {\n ensureTrailingSlash,\n parseUrl,\n trimTrailingSlash,\n} from '../../../util/url.ts';\nimport { api as dockerVersioning } from '../../versioning/docker/index.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { ecrRegex, getECRAuthToken, isECRMaxResultsResponse } from './ecr.ts';\nimport { googleRegex } from './google.ts';\nimport type { OciHelmConfig } from './schema.ts';\nimport { RegistryAuthToken } from './schema.ts';\nimport type { RegistryRepository } from './types.ts';\n\nexport const dockerDatasourceId = 'docker';\n\nexport const imageUrlLabel = 'org.opencontainers.image.url';\n\nexport const sourceLabel = 'org.opencontainers.image.source';\nexport const sourceLabels = [sourceLabel, 'org.label-schema.vcs-url'] as const;\n\nexport const gitRefLabel = 'org.opencontainers.image.revision';\n\nexport const DOCKER_HUB = 'https://index.docker.io';\n\nexport function isDockerHost(host: string): boolean {\n const regex = regEx(/(?:^|\\.)docker\\.io$/);\n return regex.test(host);\n}\n\nexport async function getAuthHeaders(\n http: Http,\n registryHost: string,\n dockerRepository: string,\n apiCheckUrl = `${registryHost}/v2/`,\n): Promise<OutgoingHttpHeaders | null> {\n try {\n const options = {\n throwHttpErrors: false,\n noAuth: true,\n cacheProvider: memCacheProvider,\n };\n const apiCheckResponse = apiCheckUrl.endsWith('/v2/')\n ? await http.get(apiCheckUrl, options)\n : // use json request, as this will be cached for tags, so it returns json\n // TODO: add cache test\n await http.getJsonUnchecked(apiCheckUrl, options);\n\n if (apiCheckResponse.statusCode === 200) {\n logger.debug(`No registry auth required for ${apiCheckUrl}`);\n return {};\n }\n if (apiCheckResponse.statusCode === 404) {\n logger.debug(`Page Not Found ${apiCheckUrl}`);\n // throw error up to be caught and potentially retried with library/ prefix\n throw new Error(PAGE_NOT_FOUND_ERROR);\n }\n // Some ECR-compatible private registries (e.g. corporate Docker proxies) reject\n // n>1000 with 405 even on the auth-probe request. Fall back to probing the base\n // /v2/ endpoint so getAuthHeaders can still obtain a valid token; the main fetch\n // loop already retries with n=1000 when it encounters this same error.\n if (isECRMaxResultsResponse(apiCheckResponse)) {\n logger.debug(\n { apiCheckUrl },\n 'Registry rejected n>1000 on auth probe; retrying auth check via base /v2/ endpoint',\n );\n return getAuthHeaders(http, registryHost, dockerRepository);\n }\n if (\n apiCheckResponse.statusCode !== 401 ||\n !isNonEmptyString(apiCheckResponse.headers['www-authenticate'])\n ) {\n logger.warn(\n { apiCheckUrl, res: apiCheckResponse },\n 'Invalid registry response',\n );\n return null;\n }\n\n const rule = hostRules.find({\n hostType: dockerDatasourceId,\n url: apiCheckUrl,\n });\n const opts: HttpOptions = {};\n\n if (ecrRegex.test(registryHost)) {\n logger.once.debug(`hostRules: ecr auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using ecr auth for Docker registry`,\n );\n const [, region] = coerceArray(ecrRegex.exec(registryHost));\n const auth = await getECRAuthToken(region, rule);\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n }\n } else if (\n googleRegex.test(registryHost) &&\n typeof rule.username === 'undefined' &&\n typeof rule.password === 'undefined' &&\n typeof rule.token === 'undefined'\n ) {\n logger.once.debug(`hostRules: google auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using google auth for Docker registry`,\n );\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { registryHost, dockerRepository },\n 'Could not get Google access token, using no auth',\n );\n }\n } else if (rule.username && rule.password) {\n logger.once.debug(`hostRules: basic auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using basic auth for Docker registry`,\n );\n const auth = Buffer.from(`${rule.username}:${rule.password}`).toString(\n 'base64',\n );\n opts.headers = { authorization: `Basic ${auth}` };\n } else if (rule.token) {\n const authType = rule.authType ?? 'Bearer';\n logger.once.debug(\n `hostRules: ${authType} token auth for ${registryHost}`,\n );\n logger.trace(\n { registryHost, dockerRepository },\n `Using ${authType} token for Docker registry`,\n );\n opts.headers = { authorization: `${authType} ${rule.token}` };\n }\n\n const challenges = parse(apiCheckResponse.headers['www-authenticate']);\n const authenticateHeader = challenges.find(\n (c): c is ParamsChallenge => c.scheme === BearerScheme,\n );\n\n // If realm isn't an url, we should directly use auth header\n // Can happen when we get a Basic auth or some other auth type\n // * WWW-Authenticate: Basic realm=\"Artifactory Realm\"\n // * Www-Authenticate: Basic realm=\"https://123456789.dkr.ecr.eu-central-1.amazonaws.com/\",service=\"ecr.amazonaws.com\"\n // * www-authenticate: Bearer realm=\"https://ghcr.io/token\",service=\"ghcr.io\",scope=\"repository:user/image:pull\"\n // * www-authenticate: Bearer realm=\"https://auth.docker.io/token\",service=\"registry.docker.io\"\n // * www-authenticate: Bearer realm=\"https://codeberg.org/v2/token\",service=\"container_registry\",scope=\"*\",Basic realm=\"https://codeberg.org/v2\",service=\"container_registry\",scope=\"*\"\n if (\n !authenticateHeader ||\n !isString(authenticateHeader.params?.realm) ||\n parseUrl(authenticateHeader.params.realm) === null\n ) {\n logger.once.debug(`hostRules: testing direct auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository, authenticateHeader },\n `Invalid realm, testing direct auth`,\n );\n return opts.headers ?? null;\n }\n\n // already guarded by above clause\n const authUrl = parseUrl(`${authenticateHeader.params.realm}`)!;\n\n // repo isn't known to server yet, so causing wrong scope `repository:user/image:pull`\n if (\n isString(authenticateHeader.params.scope) &&\n !apiCheckUrl.endsWith('/v2/')\n ) {\n authUrl.searchParams.append('scope', authenticateHeader.params.scope);\n } else {\n authUrl.searchParams.append(\n 'scope',\n `repository:${dockerRepository}:pull`,\n );\n }\n\n if (isString(authenticateHeader.params.service)) {\n authUrl.searchParams.append('service', authenticateHeader.params.service);\n }\n\n logger.trace(\n { registryHost, dockerRepository, authUrl: authUrl.href },\n `Obtaining docker registry token`,\n );\n opts.noAuth = true;\n opts.cacheProvider = memCacheProvider;\n const authResponse = (\n await http.getJson(authUrl.href, opts, RegistryAuthToken)\n ).body;\n\n const token = authResponse.token ?? authResponse.access_token;\n /* v8 ignore next 4 -- TODO: add test */\n if (!token) {\n logger.warn('Failed to obtain docker registry token');\n return null;\n }\n // sanitize token\n addSecretForSanitizing(token);\n return {\n authorization: `Bearer ${token}`,\n };\n } catch (err) /* istanbul ignore next */ {\n /* v8 ignore if -- quay.io errors are swallowed pending #9604, not reproduced in specs */\n if (err.host === 'quay.io') {\n // TODO: debug why quay throws errors (#9604)\n return null;\n }\n /* v8 ignore if -- registry auth rejection is logged and swallowed, not mocked in specs */\n if (err.statusCode === 401) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Unauthorized docker lookup',\n );\n logger.debug({ err });\n return null;\n }\n /* v8 ignore if -- registry permission rejection is logged and swallowed, not mocked in specs */\n if (err.statusCode === 403) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Not allowed to access docker registry',\n );\n logger.debug({ err });\n return null;\n }\n if (err.name === 'RequestError' && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n /* v8 ignore if -- Docker Hub rate limiting maps to ExternalHostError, not mocked in specs */\n if (err.statusCode === 429 && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n /* v8 ignore if -- registry server errors map to ExternalHostError, not mocked in specs */\n if (err.statusCode >= 500 && err.statusCode < 600) {\n throw new ExternalHostError(err);\n }\n if (err.message === PAGE_NOT_FOUND_ERROR) {\n throw err;\n }\n /* v8 ignore if -- hostRules-disabled host is swallowed silently, not mocked in specs */\n if (err.message === HOST_DISABLED) {\n logger.trace({ registryHost, dockerRepository, err }, 'Host disabled');\n return null;\n }\n logger.warn(\n { registryHost, dockerRepository, err },\n 'Error obtaining docker token',\n );\n return null;\n }\n}\n\nexport function getRegistryRepository(\n packageName: string,\n registryUrl: string,\n): RegistryRepository {\n if (registryUrl !== DOCKER_HUB) {\n const registryEndingWithSlash = ensureTrailingSlash(\n registryUrl.replace(regEx(/^https?:\\/\\//), ''),\n );\n if (packageName.startsWith(registryEndingWithSlash)) {\n let registryHost = trimTrailingSlash(registryUrl);\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n let dockerRepository = packageName.replace(registryEndingWithSlash, '');\n const fullUrl = `${registryHost}/${dockerRepository}`;\n const parsedFullUrl = parseUrl(fullUrl);\n if (!parsedFullUrl) {\n return { registryHost, dockerRepository };\n }\n registryHost = parsedFullUrl.origin;\n dockerRepository = parsedFullUrl.pathname.substring(1);\n return {\n registryHost,\n dockerRepository,\n };\n }\n }\n let registryHost = registryUrl;\n const split = packageName.split('/');\n if (split.length > 1 && (split[0].includes('.') || split[0].includes(':'))) {\n [registryHost] = split;\n split.shift();\n }\n let dockerRepository = split.join('/');\n\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n\n const { path, base } =\n regEx(/^(?<base>https:\\/\\/[^/]+)\\/(?<path>.+)$/).exec(registryHost)\n ?.groups ?? {};\n if (base && path) {\n registryHost = base;\n dockerRepository = `${trimTrailingSlash(path)}/${dockerRepository}`;\n }\n\n registryHost = registryHost\n .replace('https://docker.io', 'https://index.docker.io')\n .replace('https://registry-1.docker.io', 'https://index.docker.io');\n\n const opts = hostRules.find({\n hostType: dockerDatasourceId,\n url: registryHost,\n });\n if (opts?.insecureRegistry) {\n registryHost = registryHost.replace('https', 'http');\n }\n if (registryHost.endsWith('.docker.io') && !dockerRepository.includes('/')) {\n dockerRepository = `library/${dockerRepository}`;\n }\n return {\n registryHost,\n dockerRepository,\n };\n}\n\nexport function extractDigestFromResponseBody(\n manifestResponse: HttpResponse,\n): string {\n return `sha256:${toSha256(manifestResponse.body)}`;\n}\n\nexport function findLatestStable(tags: string[]): string | null {\n let stable: string | null = null;\n\n for (const tag of tags) {\n if (!dockerVersioning.isValid(tag) || !dockerVersioning.isStable(tag)) {\n continue;\n }\n\n if (!stable || dockerVersioning.isGreaterThan(tag, stable)) {\n stable = tag;\n }\n }\n\n return stable;\n}\n\nconst chartRepo = regEx(/charts?|helm|helm-charts?/i);\n\nfunction isPossibleChartRepo(url: string): boolean {\n if (detectPlatform(url) === null) {\n return false;\n }\n\n const parsed = parseGitUrl(url);\n return chartRepo.test(parsed.name);\n}\n\nexport function findHelmSourceUrl(release: OciHelmConfig): string | null {\n if (release.home && isPossibleChartRepo(release.home)) {\n return release.home;\n }\n\n if (!release.sources?.length) {\n return null;\n }\n\n for (const url of release.sources) {\n if (isPossibleChartRepo(url)) {\n return url;\n }\n }\n\n // fallback\n return release.sources[0];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoCA,MAAa,qBAAqB;AAElC,MAAa,gBAAgB;AAE7B,MAAa,cAAc;AAC3B,MAAa,eAAe,CAAC,aAAa,0BAA0B;AAEpE,MAAa,cAAc;AAE3B,MAAa,aAAa;AAE1B,SAAgB,aAAa,MAAuB;CAElD,OADc,MAAM,qBACT,CAAC,CAAC,KAAK,IAAI;AACxB;AAEA,eAAsB,eACpB,MACA,cACA,kBACA,cAAc,GAAG,aAAa,OACO;CACrC,IAAI;EACF,MAAM,UAAU;GACd,iBAAiB;GACjB,QAAQ;GACR,eAAe;EACjB;EACA,MAAM,mBAAmB,YAAY,SAAS,MAAM,IAChD,MAAM,KAAK,IAAI,aAAa,OAAO,IAGnC,MAAM,KAAK,iBAAiB,aAAa,OAAO;EAEpD,IAAI,iBAAiB,eAAe,KAAK;GACvC,OAAO,MAAM,iCAAiC,aAAa;GAC3D,OAAO,CAAC;EACV;EACA,IAAI,iBAAiB,eAAe,KAAK;GACvC,OAAO,MAAM,kBAAkB,aAAa;GAE5C,MAAM,IAAI,MAAM,oBAAoB;EACtC;EAKA,IAAI,wBAAwB,gBAAgB,GAAG;GAC7C,OAAO,MACL,EAAE,YAAY,GACd,oFACF;GACA,OAAO,eAAe,MAAM,cAAc,gBAAgB;EAC5D;EACA,IACE,iBAAiB,eAAe,OAChC,CAAC,iBAAiB,iBAAiB,QAAQ,mBAAmB,GAC9D;GACA,OAAO,KACL;IAAE;IAAa,KAAK;GAAiB,GACrC,2BACF;GACA,OAAO;EACT;EAEA,MAAM,OAAOA,KAAe;GAC1B,UAAU;GACV,KAAK;EACP,CAAC;EACD,MAAM,OAAoB,CAAC;EAE3B,IAAI,SAAS,KAAK,YAAY,GAAG;GAC/B,OAAO,KAAK,MAAM,2BAA2B,cAAc;GAC3D,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,oCACF;GACA,MAAM,GAAG,UAAU,YAAY,SAAS,KAAK,YAAY,CAAC;GAC1D,MAAM,OAAO,MAAM,gBAAgB,QAAQ,IAAI;GAC/C,IAAI,MACF,KAAK,UAAU,EAAE,eAAe,SAAS,OAAO;EAEpD,OAAO,IACL,YAAY,KAAK,YAAY,KAC7B,OAAO,KAAK,aAAa,eACzB,OAAO,KAAK,aAAa,eACzB,OAAO,KAAK,UAAU,aACtB;GACA,OAAO,KAAK,MAAM,8BAA8B,cAAc;GAC9D,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,uCACF;GACA,MAAM,OAAO,MAAM,mBAAmB;GACtC,IAAI,MACF,KAAK,UAAU,EAAE,eAAe,SAAS,OAAO;QAEhD,OAAO,KAAK,MACV;IAAE;IAAc;GAAiB,GACjC,kDACF;EAEJ,OAAO,IAAI,KAAK,YAAY,KAAK,UAAU;GACzC,OAAO,KAAK,MAAM,6BAA6B,cAAc;GAC7D,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,sCACF;GAIA,KAAK,UAAU,EAAE,eAAe,SAHnB,OAAO,KAAK,GAAG,KAAK,SAAS,GAAG,KAAK,UAAU,CAAC,CAAC,SAC5D,QAE0C,IAAI;EAClD,OAAO,IAAI,KAAK,OAAO;GACrB,MAAM,WAAW,KAAK,YAAY;GAClC,OAAO,KAAK,MACV,cAAc,SAAS,kBAAkB,cAC3C;GACA,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,SAAS,SAAS,2BACpB;GACA,KAAK,UAAU,EAAE,eAAe,GAAG,SAAS,GAAG,KAAK,QAAQ;EAC9D;EAGA,MAAM,qBADa,MAAM,iBAAiB,QAAQ,mBACd,CAAC,CAAC,MACnC,MAA4B,EAAE,WAAW,YAC5C;EASA,IACE,CAAC,sBACD,CAAC,SAAS,mBAAmB,QAAQ,KAAK,KAC1C,SAAS,mBAAmB,OAAO,KAAK,MAAM,MAC9C;GACA,OAAO,KAAK,MAAM,sCAAsC,cAAc;GACtE,OAAO,MACL;IAAE;IAAc;IAAkB;GAAmB,GACrD,oCACF;GACA,OAAO,KAAK,WAAW;EACzB;EAGA,MAAM,UAAU,SAAS,GAAG,mBAAmB,OAAO,OAAO;EAG7D,IACE,SAAS,mBAAmB,OAAO,KAAK,KACxC,CAAC,YAAY,SAAS,MAAM,GAE5B,QAAQ,aAAa,OAAO,SAAS,mBAAmB,OAAO,KAAK;OAEpE,QAAQ,aAAa,OACnB,SACA,cAAc,iBAAiB,MACjC;EAGF,IAAI,SAAS,mBAAmB,OAAO,OAAO,GAC5C,QAAQ,aAAa,OAAO,WAAW,mBAAmB,OAAO,OAAO;EAG1E,OAAO,MACL;GAAE;GAAc;GAAkB,SAAS,QAAQ;EAAK,GACxD,iCACF;EACA,KAAK,SAAS;EACd,KAAK,gBAAgB;EACrB,MAAM,gBACJ,MAAM,KAAK,QAAQ,QAAQ,MAAM,MAAM,iBAAiB,EAAA,CACxD;EAEF,MAAM,QAAQ,aAAa,SAAS,aAAa;;EAEjD,IAAI,CAAC,OAAO;GACV,OAAO,KAAK,wCAAwC;GACpD,OAAO;EACT;EAEA,uBAAuB,KAAK;EAC5B,OAAO,EACL,eAAe,UAAU,QAC3B;CACF,SAAS,gCAAgC;;EAEvC,IAAI,IAAI,SAAS,WAEf,OAAO;;EAGT,IAAI,IAAI,eAAe,KAAK;GAC1B,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,4BACF;GACA,OAAO,MAAM,EAAE,IAAI,CAAC;GACpB,OAAO;EACT;;EAEA,IAAI,IAAI,eAAe,KAAK;GAC1B,OAAO,MACL;IAAE;IAAc;GAAiB,GACjC,uCACF;GACA,OAAO,MAAM,EAAE,IAAI,CAAC;GACpB,OAAO;EACT;EACA,IAAI,IAAI,SAAS,kBAAkB,aAAa,YAAY,GAC1D,MAAM,IAAI,kBAAkB,GAAG;;EAGjC,IAAI,IAAI,eAAe,OAAO,aAAa,YAAY,GACrD,MAAM,IAAI,kBAAkB,GAAG;;EAGjC,IAAI,IAAI,cAAc,OAAO,IAAI,aAAa,KAC5C,MAAM,IAAI,kBAAkB,GAAG;EAEjC,IAAI,IAAI,YAAA,kBACN,MAAM;;EAGR,IAAI,IAAI,YAAA,iBAA2B;GACjC,OAAO,MAAM;IAAE;IAAc;IAAkB;GAAI,GAAG,eAAe;GACrE,OAAO;EACT;EACA,OAAO,KACL;GAAE;GAAc;GAAkB;EAAI,GACtC,8BACF;EACA,OAAO;CACT;AACF;AAEA,SAAgB,sBACd,aACA,aACoB;CACpB,IAAI,gBAAA,2BAA4B;EAC9B,MAAM,0BAA0B,oBAC9B,YAAY,QAAQ,MAAM,cAAc,GAAG,EAAE,CAC/C;EACA,IAAI,YAAY,WAAW,uBAAuB,GAAG;GACnD,IAAI,eAAe,kBAAkB,WAAW;GAChD,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,KAAK,YAAY,GAC1C,eAAe,WAAW;GAE5B,IAAI,mBAAmB,YAAY,QAAQ,yBAAyB,EAAE;GACtE,MAAM,UAAU,GAAG,aAAa,GAAG;GACnC,MAAM,gBAAgB,SAAS,OAAO;GACtC,IAAI,CAAC,eACH,OAAO;IAAE;IAAc;GAAiB;GAE1C,eAAe,cAAc;GAC7B,mBAAmB,cAAc,SAAS,UAAU,CAAC;GACrD,OAAO;IACL;IACA;GACF;EACF;CACF;CACA,IAAI,eAAe;CACnB,MAAM,QAAQ,YAAY,MAAM,GAAG;CACnC,IAAI,MAAM,SAAS,MAAM,MAAM,EAAE,CAAC,SAAS,GAAG,KAAK,MAAM,EAAE,CAAC,SAAS,GAAG,IAAI;EAC1E,CAAC,gBAAgB;EACjB,MAAM,MAAM;CACd;CACA,IAAI,mBAAmB,MAAM,KAAK,GAAG;CAErC,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,KAAK,YAAY,GAC1C,eAAe,WAAW;CAG5B,MAAM,EAAE,MAAM,SACZ,MAAM,yCAAyC,CAAC,CAAC,KAAK,YAAY,CAAC,EAC/D,UAAU,CAAC;CACjB,IAAI,QAAQ,MAAM;EAChB,eAAe;EACf,mBAAmB,GAAG,kBAAkB,IAAI,EAAE,GAAG;CACnD;CAEA,eAAe,aACZ,QAAQ,qBAAqB,yBAAyB,CAAC,CACvD,QAAQ,gCAAgC,yBAAyB;CAMpE,IAJaA,KAAe;EAC1B,UAAA;EACA,KAAK;CACP,CACO,CAAC,EAAE,kBACR,eAAe,aAAa,QAAQ,SAAS,MAAM;CAErD,IAAI,aAAa,SAAS,YAAY,KAAK,CAAC,iBAAiB,SAAS,GAAG,GACvE,mBAAmB,WAAW;CAEhC,OAAO;EACL;EACA;CACF;AACF;AAEA,SAAgB,8BACd,kBACQ;CACR,OAAO,UAAU,SAAS,iBAAiB,IAAI;AACjD;AAEA,SAAgB,iBAAiB,MAA+B;CAC9D,IAAI,SAAwB;CAE5B,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,CAACC,IAAiB,QAAQ,GAAG,KAAK,CAACA,IAAiB,SAAS,GAAG,GAClE;EAGF,IAAI,CAAC,UAAUA,IAAiB,cAAc,KAAK,MAAM,GACvD,SAAS;CAEb;CAEA,OAAO;AACT;AAEA,MAAM,YAAY,MAAM,4BAA4B;AAEpD,SAAS,oBAAoB,KAAsB;CACjD,IAAI,eAAe,GAAG,MAAM,MAC1B,OAAO;CAGT,MAAM,SAAS,YAAY,GAAG;CAC9B,OAAO,UAAU,KAAK,OAAO,IAAI;AACnC;AAEA,SAAgB,kBAAkB,SAAuC;CACvE,IAAI,QAAQ,QAAQ,oBAAoB,QAAQ,IAAI,GAClD,OAAO,QAAQ;CAGjB,IAAI,CAAC,QAAQ,SAAS,QACpB,OAAO;CAGT,KAAK,MAAM,OAAO,QAAQ,SACxB,IAAI,oBAAoB,GAAG,GACzB,OAAO;CAKX,OAAO,QAAQ,QAAQ;AACzB"}
@@ -56,7 +56,7 @@ var DockerHubCache = class DockerHubCache {
56
56
  return needNextPage;
57
57
  }
58
58
  async save() {
59
- if (this.isChanged) await set(cacheNamespace, this.dockerRepository, this.cache, 4320 * 30);
59
+ if (this.isChanged) await set(cacheNamespace, this.dockerRepository, this.cache, 129600);
60
60
  }
61
61
  getItems() {
62
62
  return Object.values(this.cache.items);
@@ -1 +1 @@
1
- {"version":3,"file":"dockerhub-cache.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/docker/dockerhub-cache.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { DockerHubTag } from './schema.ts';\n\nexport interface DockerHubCacheData {\n items: Record<number, DockerHubTag>;\n updatedAt: string | null;\n}\n\nconst cacheNamespace = 'datasource-docker-hub-cache';\n\nexport class DockerHubCache {\n private isChanged = false;\n private reconciledIds = new Set<number>();\n private dockerRepository: string;\n private cache: DockerHubCacheData;\n\n private constructor(dockerRepository: string, cache: DockerHubCacheData) {\n this.dockerRepository = dockerRepository;\n this.cache = cache;\n }\n\n static async init(dockerRepository: string): Promise<DockerHubCache> {\n let repoCache = await packageCache.get<DockerHubCacheData>(\n cacheNamespace,\n dockerRepository,\n );\n\n repoCache ??= {\n items: {},\n updatedAt: null,\n };\n\n return new DockerHubCache(dockerRepository, repoCache);\n }\n\n reconcile(items: DockerHubTag[], expectedCount: number): boolean {\n let needNextPage = true;\n\n let earliestDate = null;\n\n let { updatedAt } = this.cache;\n let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;\n\n for (const newItem of items) {\n const id = newItem.id;\n this.reconciledIds.add(id);\n\n const oldItem = this.cache.items[id];\n\n const itemDate = DateTime.fromISO(newItem.last_updated);\n\n if (!earliestDate || earliestDate > itemDate) {\n earliestDate = itemDate;\n }\n\n if (!latestDate || latestDate < itemDate) {\n latestDate = itemDate;\n updatedAt = newItem.last_updated;\n }\n\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n this.cache.items[newItem.id] = newItem;\n this.isChanged = true;\n }\n\n this.cache.updatedAt = updatedAt;\n\n if (earliestDate && latestDate) {\n for (const [key, item] of Object.entries(this.cache.items)) {\n const id = parseInt(key, 10);\n\n const itemDate = DateTime.fromISO(item.last_updated);\n\n if (\n itemDate < earliestDate ||\n itemDate > latestDate ||\n this.reconciledIds.has(id)\n ) {\n continue;\n }\n\n delete this.cache.items[id];\n this.isChanged = true;\n }\n\n if (Object.keys(this.cache.items).length > expectedCount) {\n return true;\n }\n }\n\n return needNextPage;\n }\n\n async save(): Promise<void> {\n if (this.isChanged) {\n await packageCache.set(\n cacheNamespace,\n this.dockerRepository,\n this.cache,\n 3 * 60 * 24 * 30,\n );\n }\n }\n\n getItems(): DockerHubTag[] {\n return Object.values(this.cache.items);\n }\n\n getDigestForTag(tagName: string): string | null {\n return (\n this.getItems().find((item) => item.name === tagName)?.digest ?? null\n );\n }\n\n getArchDigestForTag(tagName: string, architecture: string): string | null {\n const tag = this.getItems().find((item) => item.name === tagName);\n return (\n tag?.images.find((img) => img.architecture === architecture)?.digest ??\n null\n );\n }\n}\n"],"mappings":";;;;AAUA,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,YAAoB;CACpB,gCAAwB,IAAI,IAAY;CACxC;CACA;CAEA,YAAoB,kBAA0B,OAA2B;EACvE,KAAK,mBAAmB;EACxB,KAAK,QAAQ;CACf;CAEA,aAAa,KAAK,kBAAmD;EACnE,IAAI,YAAY,MAAMA,IACpB,gBACA,gBACF;EAEA,cAAc;GACZ,OAAO,CAAC;GACR,WAAW;EACb;EAEA,OAAO,IAAI,eAAe,kBAAkB,SAAS;CACvD;CAEA,UAAU,OAAuB,eAAgC;EAC/D,IAAI,eAAe;EAEnB,IAAI,eAAe;EAEnB,IAAI,EAAE,cAAc,KAAK;EACzB,IAAI,aAAa,YAAY,SAAS,QAAQ,SAAS,IAAI;EAE3D,KAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,KAAK,QAAQ;GACnB,KAAK,cAAc,IAAI,EAAE;GAEzB,MAAM,UAAU,KAAK,MAAM,MAAM;GAEjC,MAAM,WAAW,SAAS,QAAQ,QAAQ,YAAY;GAEtD,IAAI,CAAC,gBAAgB,eAAe,UAClC,eAAe;GAGjB,IAAI,CAAC,cAAc,aAAa,UAAU;IACxC,aAAa;IACb,YAAY,QAAQ;GACtB;GAEA,IAAI,OAAO,SAAS,OAAO,GAAG;IAC5B,eAAe;IACf;GACF;GAEA,KAAK,MAAM,MAAM,QAAQ,MAAM;GAC/B,KAAK,YAAY;EACnB;EAEA,KAAK,MAAM,YAAY;EAEvB,IAAI,gBAAgB,YAAY;GAC9B,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,KAAK,GAAG;IAC1D,MAAM,KAAK,SAAS,KAAK,EAAE;IAE3B,MAAM,WAAW,SAAS,QAAQ,KAAK,YAAY;IAEnD,IACE,WAAW,gBACX,WAAW,cACX,KAAK,cAAc,IAAI,EAAE,GAEzB;IAGF,OAAO,KAAK,MAAM,MAAM;IACxB,KAAK,YAAY;GACnB;GAEA,IAAI,OAAO,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,eACzC,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,OAAsB;EAC1B,IAAI,KAAK,WACP,MAAMC,IACJ,gBACA,KAAK,kBACL,KAAK,OACL,OAAc,EAChB;CAEJ;CAEA,WAA2B;EACzB,OAAO,OAAO,OAAO,KAAK,MAAM,KAAK;CACvC;CAEA,gBAAgB,SAAgC;EAC9C,OACE,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAAO,CAAC,EAAE,UAAU;CAErE;CAEA,oBAAoB,SAAiB,cAAqC;EAExE,OADY,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAErD,CAAC,EAAE,OAAO,MAAM,QAAQ,IAAI,iBAAiB,YAAY,CAAC,EAAE,UAC9D;CAEJ;AACF"}
1
+ {"version":3,"file":"dockerhub-cache.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/docker/dockerhub-cache.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { DockerHubTag } from './schema.ts';\n\nexport interface DockerHubCacheData {\n items: Record<number, DockerHubTag>;\n updatedAt: string | null;\n}\n\nconst cacheNamespace = 'datasource-docker-hub-cache';\n\nexport class DockerHubCache {\n private isChanged = false;\n private reconciledIds = new Set<number>();\n private dockerRepository: string;\n private cache: DockerHubCacheData;\n\n private constructor(dockerRepository: string, cache: DockerHubCacheData) {\n this.dockerRepository = dockerRepository;\n this.cache = cache;\n }\n\n static async init(dockerRepository: string): Promise<DockerHubCache> {\n let repoCache = await packageCache.get<DockerHubCacheData>(\n cacheNamespace,\n dockerRepository,\n );\n\n repoCache ??= {\n items: {},\n updatedAt: null,\n };\n\n return new DockerHubCache(dockerRepository, repoCache);\n }\n\n reconcile(items: DockerHubTag[], expectedCount: number): boolean {\n let needNextPage = true;\n\n let earliestDate = null;\n\n let { updatedAt } = this.cache;\n let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;\n\n for (const newItem of items) {\n const id = newItem.id;\n this.reconciledIds.add(id);\n\n const oldItem = this.cache.items[id];\n\n const itemDate = DateTime.fromISO(newItem.last_updated);\n\n if (!earliestDate || earliestDate > itemDate) {\n earliestDate = itemDate;\n }\n\n if (!latestDate || latestDate < itemDate) {\n latestDate = itemDate;\n updatedAt = newItem.last_updated;\n }\n\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n this.cache.items[newItem.id] = newItem;\n this.isChanged = true;\n }\n\n this.cache.updatedAt = updatedAt;\n\n if (earliestDate && latestDate) {\n for (const [key, item] of Object.entries(this.cache.items)) {\n const id = parseInt(key, 10);\n\n const itemDate = DateTime.fromISO(item.last_updated);\n\n if (\n itemDate < earliestDate ||\n itemDate > latestDate ||\n this.reconciledIds.has(id)\n ) {\n continue;\n }\n\n delete this.cache.items[id];\n this.isChanged = true;\n }\n\n if (Object.keys(this.cache.items).length > expectedCount) {\n return true;\n }\n }\n\n return needNextPage;\n }\n\n async save(): Promise<void> {\n if (this.isChanged) {\n await packageCache.set(\n cacheNamespace,\n this.dockerRepository,\n this.cache,\n 3 * 60 * 24 * 30,\n );\n }\n }\n\n getItems(): DockerHubTag[] {\n return Object.values(this.cache.items);\n }\n\n getDigestForTag(tagName: string): string | null {\n return (\n this.getItems().find((item) => item.name === tagName)?.digest ?? null\n );\n }\n\n getArchDigestForTag(tagName: string, architecture: string): string | null {\n const tag = this.getItems().find((item) => item.name === tagName);\n return (\n tag?.images.find((img) => img.architecture === architecture)?.digest ??\n null\n );\n }\n}\n"],"mappings":";;;;AAUA,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,YAAoB;CACpB,gCAAwB,IAAI,IAAY;CACxC;CACA;CAEA,YAAoB,kBAA0B,OAA2B;EACvE,KAAK,mBAAmB;EACxB,KAAK,QAAQ;CACf;CAEA,aAAa,KAAK,kBAAmD;EACnE,IAAI,YAAY,MAAMA,IACpB,gBACA,gBACF;EAEA,cAAc;GACZ,OAAO,CAAC;GACR,WAAW;EACb;EAEA,OAAO,IAAI,eAAe,kBAAkB,SAAS;CACvD;CAEA,UAAU,OAAuB,eAAgC;EAC/D,IAAI,eAAe;EAEnB,IAAI,eAAe;EAEnB,IAAI,EAAE,cAAc,KAAK;EACzB,IAAI,aAAa,YAAY,SAAS,QAAQ,SAAS,IAAI;EAE3D,KAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,KAAK,QAAQ;GACnB,KAAK,cAAc,IAAI,EAAE;GAEzB,MAAM,UAAU,KAAK,MAAM,MAAM;GAEjC,MAAM,WAAW,SAAS,QAAQ,QAAQ,YAAY;GAEtD,IAAI,CAAC,gBAAgB,eAAe,UAClC,eAAe;GAGjB,IAAI,CAAC,cAAc,aAAa,UAAU;IACxC,aAAa;IACb,YAAY,QAAQ;GACtB;GAEA,IAAI,OAAO,SAAS,OAAO,GAAG;IAC5B,eAAe;IACf;GACF;GAEA,KAAK,MAAM,MAAM,QAAQ,MAAM;GAC/B,KAAK,YAAY;EACnB;EAEA,KAAK,MAAM,YAAY;EAEvB,IAAI,gBAAgB,YAAY;GAC9B,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,KAAK,GAAG;IAC1D,MAAM,KAAK,SAAS,KAAK,EAAE;IAE3B,MAAM,WAAW,SAAS,QAAQ,KAAK,YAAY;IAEnD,IACE,WAAW,gBACX,WAAW,cACX,KAAK,cAAc,IAAI,EAAE,GAEzB;IAGF,OAAO,KAAK,MAAM,MAAM;IACxB,KAAK,YAAY;GACnB;GAEA,IAAI,OAAO,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,eACzC,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,MAAM,OAAsB;EAC1B,IAAI,KAAK,WACP,MAAMC,IACJ,gBACA,KAAK,kBACL,KAAK,OACL,MACF;CAEJ;CAEA,WAA2B;EACzB,OAAO,OAAO,OAAO,KAAK,MAAM,KAAK;CACvC;CAEA,gBAAgB,SAAgC;EAC9C,OACE,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAAO,CAAC,EAAE,UAAU;CAErE;CAEA,oBAAoB,SAAiB,cAAqC;EAExE,OADY,KAAK,SAAS,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,OAErD,CAAC,EAAE,OAAO,MAAM,QAAQ,IAAI,iBAAiB,YAAY,CAAC,EAAE,UAC9D;CAEJ;AACF"}
@@ -74,7 +74,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
74
74
  noAuth: true,
75
75
  cacheProvider: memCacheProvider
76
76
  });
77
- } catch (err) /* istanbul ignore next */ {
77
+ } catch (err) /* istanbul ignore next */ {
78
78
  if (err instanceof ExternalHostError) throw err;
79
79
  if (err.statusCode === 401) {
80
80
  logger.debug({
@@ -127,7 +127,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
127
127
  return withCache({
128
128
  namespace: "datasource-docker-imageconfig",
129
129
  key: `${registryHost}:${dockerRepository}@${configDigest}`,
130
- ttlMinutes: 1440 * 28
130
+ ttlMinutes: 40320
131
131
  }, () => this._getImageConfig(registryHost, dockerRepository, configDigest));
132
132
  }
133
133
  async _getHelmConfig(registryHost, dockerRepository, configDigest) {
@@ -148,7 +148,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
148
148
  return withCache({
149
149
  namespace: "datasource-docker-imageconfig",
150
150
  key: `${registryHost}:${dockerRepository}@${configDigest}`,
151
- ttlMinutes: 1440 * 28
151
+ ttlMinutes: 40320
152
152
  }, () => this._getHelmConfig(registryHost, dockerRepository, configDigest));
153
153
  }
154
154
  async getConfigDigest(registry, dockerRepository, tag) {
@@ -203,7 +203,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
203
203
  try {
204
204
  manifestResponse = await this.getManifestResponse(registryHost, dockerRepository, currentDigest, "head");
205
205
  } catch (_err) {
206
- const err = _err instanceof ExternalHostError ? _err.err : /* istanbul ignore next: can never happen */ _err;
206
+ const err = _err instanceof ExternalHostError ? _err.err : /* istanbul ignore next: can never happen */ _err;
207
207
  if (typeof err.statusCode === "number" && err.statusCode >= 500 && err.statusCode < 600) return null;
208
208
  /* istanbul ignore next */
209
209
  throw _err;
@@ -217,7 +217,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
217
217
  logger.debug(`Current digest ${currentDigest} relates to architecture ${architecture ?? "null"}`);
218
218
  return architecture;
219
219
  }
220
- } catch (err) /* istanbul ignore next */ {
220
+ } catch (err) /* istanbul ignore next */ {
221
221
  if (err.statusCode !== 404 || err.message === "page-not-found") throw err;
222
222
  logger.debug({
223
223
  registryHost,
@@ -231,7 +231,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
231
231
  return withCache({
232
232
  namespace: "datasource-docker-architecture",
233
233
  key: `${registryHost}:${dockerRepository}@${currentDigest}`,
234
- ttlMinutes: 1440 * 28,
234
+ ttlMinutes: 40320,
235
235
  shouldCacheResult: isNonEmptyString
236
236
  }, () => this._getImageArchitecture(registryHost, dockerRepository, currentDigest));
237
237
  }
@@ -297,7 +297,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
297
297
  }
298
298
  if (labels) logger.debug({ labels }, "found labels in manifest");
299
299
  return labels;
300
- } catch (err) /* istanbul ignore next: should be tested in future */ {
300
+ } catch (err) /* istanbul ignore next: should be tested in future */ {
301
301
  if (err instanceof ExternalHostError) throw err;
302
302
  if (err.statusCode === 400 || err.statusCode === 401) logger.debug({
303
303
  registryHost,
@@ -437,7 +437,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
437
437
  }
438
438
  else tags = await this.getDockerApiTags(registryHost, dockerRepository);
439
439
  return tags;
440
- } catch (_err) /* istanbul ignore next */ {
440
+ } catch (_err) /* istanbul ignore next */ {
441
441
  const err = _err instanceof ExternalHostError ? _err.err : _err;
442
442
  if ((err.statusCode === 404 || err.message === "page-not-found") && !dockerRepository.includes("/")) {
443
443
  logger.debug(`Retrying Tags for ${registryHost}/${dockerRepository} using library/ prefix`);
@@ -563,7 +563,7 @@ var DockerDatasource = class DockerDatasource extends Datasource {
563
563
  }, newValue);
564
564
  }
565
565
  if (manifestResponse) logger.debug(`Got docker digest ${digest}`);
566
- } catch (err) /* istanbul ignore next */ {
566
+ } catch (err) /* istanbul ignore next */ {
567
567
  if (err instanceof ExternalHostError) throw err;
568
568
  logger.debug({
569
569
  err,
@@ -576,9 +576,10 @@ var DockerDatasource = class DockerDatasource extends Datasource {
576
576
  getDigest(config, newValue) {
577
577
  const newTag = newValue ?? "latest";
578
578
  const { registryHost, dockerRepository } = getRegistryRepository(config.packageName, config.registryUrl);
579
+ const digest = config.currentDigest ? `@${config.currentDigest}` : "";
579
580
  return withCache({
580
581
  namespace: "datasource-docker-digest",
581
- key: `${registryHost}:${dockerRepository}:${newTag}${config.currentDigest ? `@${config.currentDigest}` : ""}`,
582
+ key: `${registryHost}:${dockerRepository}:${newTag}${digest}`,
582
583
  fallback: true,
583
584
  shouldCacheResult: isNonEmptyString
584
585
  }, () => this._getDigest(config, newValue));