renovate 44.210.2 → 44.211.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/utils.js +2 -1
  4. package/dist/config/utils.js.map +1 -1
  5. package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
  6. package/dist/config/validation-helpers/utils.js +5 -1
  7. package/dist/config/validation-helpers/utils.js.map +1 -1
  8. package/dist/config/validation.js +8 -2
  9. package/dist/config/validation.js.map +1 -1
  10. package/dist/config-validator.js +1 -1
  11. package/dist/config-validator.js.map +1 -1
  12. package/dist/global-config-option-defaults.generated.js +1 -1
  13. package/dist/global-config-option-defaults.generated.js.map +1 -1
  14. package/dist/instrumentation/index.js +3 -2
  15. package/dist/instrumentation/index.js.map +1 -1
  16. package/dist/logger/bunyan.js +3 -2
  17. package/dist/logger/bunyan.js.map +1 -1
  18. package/dist/logger/pretty-stdout.js +2 -1
  19. package/dist/logger/pretty-stdout.js.map +1 -1
  20. package/dist/modules/datasource/apk/index.js +2 -2
  21. package/dist/modules/datasource/apk/index.js.map +1 -1
  22. package/dist/modules/datasource/artifactory/index.js +2 -3
  23. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  24. package/dist/modules/datasource/bazel/index.js +2 -1
  25. package/dist/modules/datasource/bazel/index.js.map +1 -1
  26. package/dist/modules/datasource/cdnjs/index.js +2 -1
  27. package/dist/modules/datasource/cdnjs/index.js.map +1 -1
  28. package/dist/modules/datasource/conda/index.js +2 -1
  29. package/dist/modules/datasource/conda/index.js.map +1 -1
  30. package/dist/modules/datasource/crate/index.js +2 -1
  31. package/dist/modules/datasource/crate/index.js.map +1 -1
  32. package/dist/modules/datasource/dart-version/index.js +2 -1
  33. package/dist/modules/datasource/dart-version/index.js.map +1 -1
  34. package/dist/modules/datasource/datasource.js +2 -2
  35. package/dist/modules/datasource/datasource.js.map +1 -1
  36. package/dist/modules/datasource/deb/url.js +3 -1
  37. package/dist/modules/datasource/deb/url.js.map +1 -1
  38. package/dist/modules/datasource/devbox/index.js +2 -1
  39. package/dist/modules/datasource/devbox/index.js.map +1 -1
  40. package/dist/modules/datasource/docker/common.js +10 -8
  41. package/dist/modules/datasource/docker/common.js.map +1 -1
  42. package/dist/modules/datasource/docker/ecr.js +2 -1
  43. package/dist/modules/datasource/docker/ecr.js.map +1 -1
  44. package/dist/modules/datasource/docker/index.js +20 -17
  45. package/dist/modules/datasource/docker/index.js.map +1 -1
  46. package/dist/modules/datasource/gitea-tags/base.js +2 -3
  47. package/dist/modules/datasource/gitea-tags/base.js.map +1 -1
  48. package/dist/modules/datasource/github-tags/index.js +2 -1
  49. package/dist/modules/datasource/github-tags/index.js.map +1 -1
  50. package/dist/modules/datasource/gitlab-tags/index.js +2 -3
  51. package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
  52. package/dist/modules/datasource/go/base.js +1 -1
  53. package/dist/modules/datasource/go/base.js.map +1 -1
  54. package/dist/modules/datasource/go/common.js +8 -2
  55. package/dist/modules/datasource/go/common.js.map +1 -1
  56. package/dist/modules/datasource/go/env.js +2 -1
  57. package/dist/modules/datasource/go/env.js.map +1 -1
  58. package/dist/modules/datasource/go/releases-goproxy.js +7 -5
  59. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  60. package/dist/modules/datasource/helm/index.js +2 -1
  61. package/dist/modules/datasource/helm/index.js.map +1 -1
  62. package/dist/modules/datasource/hexpm-bob/index.js +2 -1
  63. package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
  64. package/dist/modules/datasource/index.js +4 -3
  65. package/dist/modules/datasource/index.js.map +1 -1
  66. package/dist/modules/datasource/java-version/adoptium.js +3 -2
  67. package/dist/modules/datasource/java-version/adoptium.js.map +1 -1
  68. package/dist/modules/datasource/java-version/graalvm.js +2 -1
  69. package/dist/modules/datasource/java-version/graalvm.js.map +1 -1
  70. package/dist/modules/datasource/maven/index.js.map +1 -1
  71. package/dist/modules/datasource/maven/util.js +7 -10
  72. package/dist/modules/datasource/maven/util.js.map +1 -1
  73. package/dist/modules/datasource/npm/npmrc.js +2 -2
  74. package/dist/modules/datasource/npm/npmrc.js.map +1 -1
  75. package/dist/modules/datasource/nuget/v3.js +3 -5
  76. package/dist/modules/datasource/nuget/v3.js.map +1 -1
  77. package/dist/modules/datasource/packagist/index.js +4 -5
  78. package/dist/modules/datasource/packagist/index.js.map +1 -1
  79. package/dist/modules/datasource/pod/index.js +4 -4
  80. package/dist/modules/datasource/pod/index.js.map +1 -1
  81. package/dist/modules/datasource/pypi/index.js +19 -11
  82. package/dist/modules/datasource/pypi/index.js.map +1 -1
  83. package/dist/modules/datasource/python-version/index.js +2 -3
  84. package/dist/modules/datasource/python-version/index.js.map +1 -1
  85. package/dist/modules/datasource/repology/index.js +4 -3
  86. package/dist/modules/datasource/repology/index.js.map +1 -1
  87. package/dist/modules/datasource/rpm/providers/common.js +3 -1
  88. package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
  89. package/dist/modules/datasource/rubygems/index.js +2 -5
  90. package/dist/modules/datasource/rubygems/index.js.map +1 -1
  91. package/dist/modules/datasource/rubygems/versions-endpoint-cache.js +13 -18
  92. package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
  93. package/dist/modules/datasource/terraform-module/base.js +2 -1
  94. package/dist/modules/datasource/terraform-module/base.js.map +1 -1
  95. package/dist/modules/datasource/terraform-provider/index.js +2 -3
  96. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  97. package/dist/modules/manager/bazel-module/parser/context.js +0 -1
  98. package/dist/modules/manager/bazel-module/parser/context.js.map +1 -1
  99. package/dist/modules/manager/bundler/host-rules.js +4 -1
  100. package/dist/modules/manager/bundler/host-rules.js.map +1 -1
  101. package/dist/modules/manager/composer/range.js +1 -1
  102. package/dist/modules/manager/composer/range.js.map +1 -1
  103. package/dist/modules/manager/custom/utils.js +3 -1
  104. package/dist/modules/manager/custom/utils.js.map +1 -1
  105. package/dist/modules/manager/devbox/schema.js +2 -1
  106. package/dist/modules/manager/devbox/schema.js.map +1 -1
  107. package/dist/modules/manager/dockerfile/extract.js +10 -2
  108. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  109. package/dist/modules/manager/fingerprint.generated.js +1 -1
  110. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  111. package/dist/modules/manager/github-actions/parse.js +2 -1
  112. package/dist/modules/manager/github-actions/parse.js.map +1 -1
  113. package/dist/modules/manager/gomod/artifacts.js +5 -2
  114. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  115. package/dist/modules/manager/gradle/artifacts.js +5 -2
  116. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  117. package/dist/modules/manager/gradle/utils.js +2 -1
  118. package/dist/modules/manager/gradle/utils.js.map +1 -1
  119. package/dist/modules/manager/gradle-wrapper/utils.js +9 -5
  120. package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
  121. package/dist/modules/manager/helm-values/util.js +1 -1
  122. package/dist/modules/manager/helm-values/util.js.map +1 -1
  123. package/dist/modules/manager/helmfile/artifacts.js +1 -1
  124. package/dist/modules/manager/helmfile/artifacts.js.map +1 -1
  125. package/dist/modules/manager/helmv3/artifacts.js +1 -1
  126. package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
  127. package/dist/modules/manager/maven/extract.js +5 -2
  128. package/dist/modules/manager/maven/extract.js.map +1 -1
  129. package/dist/modules/manager/maven-wrapper/artifacts.js +3 -2
  130. package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
  131. package/dist/modules/manager/mise/artifacts.js +2 -1
  132. package/dist/modules/manager/mise/artifacts.js.map +1 -1
  133. package/dist/modules/manager/mise/extract.js.map +1 -1
  134. package/dist/modules/manager/npm/artifacts.js +3 -1
  135. package/dist/modules/manager/npm/artifacts.js.map +1 -1
  136. package/dist/modules/manager/npm/extract/common/dependency.js +4 -1
  137. package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
  138. package/dist/modules/manager/npm/extract/common/package-file.js +2 -1
  139. package/dist/modules/manager/npm/extract/common/package-file.js.map +1 -1
  140. package/dist/modules/manager/npm/extract/index.js.map +1 -1
  141. package/dist/modules/manager/npm/extract/post/locked-versions.js.map +1 -1
  142. package/dist/modules/manager/npm/npmrc.js +2 -1
  143. package/dist/modules/manager/npm/npmrc.js.map +1 -1
  144. package/dist/modules/manager/npm/post-update/index.js +2 -1
  145. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  146. package/dist/modules/manager/npm/post-update/npm.js +2 -3
  147. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  148. package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
  149. package/dist/modules/manager/npm/schema.js +6 -2
  150. package/dist/modules/manager/npm/schema.js.map +1 -1
  151. package/dist/modules/manager/npm/update/dependency/index.js +3 -2
  152. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  153. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js +6 -2
  154. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js.map +1 -1
  155. package/dist/modules/manager/npm/update/locked-dependency/package-lock/get-locked.js +2 -1
  156. package/dist/modules/manager/npm/update/locked-dependency/package-lock/get-locked.js.map +1 -1
  157. package/dist/modules/manager/nuget/package-tree.js +2 -1
  158. package/dist/modules/manager/nuget/package-tree.js.map +1 -1
  159. package/dist/modules/manager/paket/update-locked.js +4 -1
  160. package/dist/modules/manager/paket/update-locked.js.map +1 -1
  161. package/dist/modules/manager/pipenv/extract.js +4 -1
  162. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  163. package/dist/modules/platform/azure/azure-helper.js +2 -1
  164. package/dist/modules/platform/azure/azure-helper.js.map +1 -1
  165. package/dist/modules/platform/azure/index.js +7 -3
  166. package/dist/modules/platform/azure/index.js.map +1 -1
  167. package/dist/modules/platform/bitbucket/index.js +13 -6
  168. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  169. package/dist/modules/platform/bitbucket-server/index.js +13 -9
  170. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  171. package/dist/modules/platform/codecommit/index.js +2 -2
  172. package/dist/modules/platform/codecommit/index.js.map +1 -1
  173. package/dist/modules/platform/gerrit/client.js +4 -1
  174. package/dist/modules/platform/gerrit/client.js.map +1 -1
  175. package/dist/modules/platform/gerrit/index.js +3 -2
  176. package/dist/modules/platform/gerrit/index.js.map +1 -1
  177. package/dist/modules/platform/gitea/gitea-helper.js +5 -4
  178. package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
  179. package/dist/modules/platform/gitea/index.js +11 -4
  180. package/dist/modules/platform/gitea/index.js.map +1 -1
  181. package/dist/modules/platform/github/index.js +36 -23
  182. package/dist/modules/platform/github/index.js.map +1 -1
  183. package/dist/modules/platform/gitlab/index.js +16 -9
  184. package/dist/modules/platform/gitlab/index.js.map +1 -1
  185. package/dist/modules/platform/scm-manager/index.js +4 -1
  186. package/dist/modules/platform/scm-manager/index.js.map +1 -1
  187. package/dist/modules/platform/scm-manager/utils.js +2 -1
  188. package/dist/modules/platform/scm-manager/utils.js.map +1 -1
  189. package/dist/modules/versioning/cargo/index.js.map +1 -1
  190. package/dist/modules/versioning/composer/index.js +2 -1
  191. package/dist/modules/versioning/composer/index.js.map +1 -1
  192. package/dist/modules/versioning/conan/common.js +4 -1
  193. package/dist/modules/versioning/conan/common.js.map +1 -1
  194. package/dist/modules/versioning/debian/index.js +2 -1
  195. package/dist/modules/versioning/debian/index.js.map +1 -1
  196. package/dist/modules/versioning/gradle/compare.js +2 -1
  197. package/dist/modules/versioning/gradle/compare.js.map +1 -1
  198. package/dist/modules/versioning/hex/index.js +2 -1
  199. package/dist/modules/versioning/hex/index.js.map +1 -1
  200. package/dist/modules/versioning/julia/index.js.map +1 -1
  201. package/dist/modules/versioning/maven/compare.js +17 -7
  202. package/dist/modules/versioning/maven/compare.js.map +1 -1
  203. package/dist/modules/versioning/npm/index.js +2 -1
  204. package/dist/modules/versioning/npm/index.js.map +1 -1
  205. package/dist/modules/versioning/npm/range.js.map +1 -1
  206. package/dist/modules/versioning/paket/index.js +2 -1
  207. package/dist/modules/versioning/paket/index.js.map +1 -1
  208. package/dist/modules/versioning/paket/range.js +7 -3
  209. package/dist/modules/versioning/paket/range.js.map +1 -1
  210. package/dist/modules/versioning/pep440/index.js +2 -1
  211. package/dist/modules/versioning/pep440/index.js.map +1 -1
  212. package/dist/modules/versioning/poetry/index.js +2 -1
  213. package/dist/modules/versioning/poetry/index.js.map +1 -1
  214. package/dist/modules/versioning/regex/index.js +1 -1
  215. package/dist/modules/versioning/regex/index.js.map +1 -1
  216. package/dist/modules/versioning/rez/index.js +2 -1
  217. package/dist/modules/versioning/rez/index.js.map +1 -1
  218. package/dist/modules/versioning/vcpkg/index.js +2 -1
  219. package/dist/modules/versioning/vcpkg/index.js.map +1 -1
  220. package/dist/util/cache/package/impl/base.js +2 -1
  221. package/dist/util/cache/package/impl/base.js.map +1 -1
  222. package/dist/util/cache/package/with-cache.js +2 -1
  223. package/dist/util/cache/package/with-cache.js.map +1 -1
  224. package/dist/util/check-token.js +7 -4
  225. package/dist/util/check-token.js.map +1 -1
  226. package/dist/util/exec/utils.js +4 -1
  227. package/dist/util/exec/utils.js.map +1 -1
  228. package/dist/util/git/auth.js +5 -1
  229. package/dist/util/git/auth.js.map +1 -1
  230. package/dist/util/git/error.js.map +1 -1
  231. package/dist/util/host-rules.js +5 -3
  232. package/dist/util/host-rules.js.map +1 -1
  233. package/dist/util/http/cache/abstract-http-cache-provider.js +3 -2
  234. package/dist/util/http/cache/abstract-http-cache-provider.js.map +1 -1
  235. package/dist/util/http/cache/package-http-cache-provider.js +2 -1
  236. package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
  237. package/dist/util/http/github.js +15 -11
  238. package/dist/util/http/github.js.map +1 -1
  239. package/dist/util/http/gitlab.js +5 -4
  240. package/dist/util/http/gitlab.js.map +1 -1
  241. package/dist/util/http/http.js +2 -1
  242. package/dist/util/http/http.js.map +1 -1
  243. package/dist/util/http/jwt.js +2 -1
  244. package/dist/util/http/jwt.js.map +1 -1
  245. package/dist/util/http/retry-after.js +2 -1
  246. package/dist/util/http/retry-after.js.map +1 -1
  247. package/dist/util/http/status.js +95 -0
  248. package/dist/util/http/status.js.map +1 -0
  249. package/dist/util/merge-confidence/index.js +3 -2
  250. package/dist/util/merge-confidence/index.js.map +1 -1
  251. package/dist/util/package-rules/current-version.js +4 -1
  252. package/dist/util/package-rules/current-version.js.map +1 -1
  253. package/dist/util/package-rules/index.js +7 -3
  254. package/dist/util/package-rules/index.js.map +1 -1
  255. package/dist/util/schema-utils/index.js +5 -0
  256. package/dist/util/schema-utils/index.js.map +1 -1
  257. package/dist/workers/global/config/parse/host-rules-from-env.js +2 -1
  258. package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
  259. package/dist/workers/repository/common.js +4 -1
  260. package/dist/workers/repository/common.js.map +1 -1
  261. package/dist/workers/repository/config-migration/branch/index.js +2 -1
  262. package/dist/workers/repository/config-migration/branch/index.js.map +1 -1
  263. package/dist/workers/repository/dependency-dashboard.js +6 -2
  264. package/dist/workers/repository/dependency-dashboard.js.map +1 -1
  265. package/dist/workers/repository/finalize/repository-statistics.js +4 -1
  266. package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
  267. package/dist/workers/repository/init/merge.js +13 -3
  268. package/dist/workers/repository/init/merge.js.map +1 -1
  269. package/dist/workers/repository/onboarding/branch/check.js +2 -1
  270. package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
  271. package/dist/workers/repository/onboarding/pr/pr-list.js +4 -2
  272. package/dist/workers/repository/onboarding/pr/pr-list.js.map +1 -1
  273. package/dist/workers/repository/process/extract-update.js +4 -1
  274. package/dist/workers/repository/process/extract-update.js.map +1 -1
  275. package/dist/workers/repository/process/lookup/digest.js +2 -1
  276. package/dist/workers/repository/process/lookup/digest.js.map +1 -1
  277. package/dist/workers/repository/process/lookup/generate.js +1 -1
  278. package/dist/workers/repository/process/lookup/generate.js.map +1 -1
  279. package/dist/workers/repository/process/lookup/index.js +4 -1
  280. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  281. package/dist/workers/repository/process/lookup/utils.js +7 -1
  282. package/dist/workers/repository/process/lookup/utils.js.map +1 -1
  283. package/dist/workers/repository/process/vulnerabilities.js +10 -3
  284. package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
  285. package/dist/workers/repository/reconfigure/index.js +2 -1
  286. package/dist/workers/repository/reconfigure/index.js.map +1 -1
  287. package/dist/workers/repository/update/branch/auto-replace.js +6 -2
  288. package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
  289. package/dist/workers/repository/update/branch/errors.js +2 -1
  290. package/dist/workers/repository/update/branch/errors.js.map +1 -1
  291. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +2 -2
  292. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
  293. package/dist/workers/repository/update/branch/get-updated.js +1 -2
  294. package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
  295. package/dist/workers/repository/update/branch/index.js +2 -1
  296. package/dist/workers/repository/update/branch/index.js.map +1 -1
  297. package/dist/workers/repository/update/branch/status-checks.js +2 -1
  298. package/dist/workers/repository/update/branch/status-checks.js.map +1 -1
  299. package/dist/workers/repository/update/pr/body/index.js.map +1 -1
  300. package/dist/workers/repository/update/pr/changelog/release-notes.js +3 -2
  301. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  302. package/dist/workers/repository/update/pr/index.js +7 -3
  303. package/dist/workers/repository/update/pr/index.js.map +1 -1
  304. package/dist/workers/repository/updates/generate.js +6 -3
  305. package/dist/workers/repository/updates/generate.js.map +1 -1
  306. package/package.json +2 -2
  307. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport { isNonEmptyArray, isString, isTruthy } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_BLOCKED, HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport * as packageCache from '../../util/cache/package/index.ts';\nimport { buildCacheKey } from '../../util/cache/package/key.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { detachUrlCredentials } from '../../util/host-rules.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { safeStringify } from '../../util/stringify.ts';\nimport { trimTrailingSlash, withoutUrlCredentials } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n getDatasourceHostType,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData, stripMetadataUrlCredentials } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n RegistryUrlsConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport function getDatasources(): Map<string, DatasourceApi> {\n return datasources;\n}\nexport function getDatasourceList(): string[] {\n return Array.from(datasources.keys());\n}\n\n/**\n * Projects the registry-level config onto the fields a datasource\n * implementation is allowed to see.\n */\nfunction toGetReleasesConfig(\n config: GetPkgReleasesConfig,\n registryUrl = config.registryUrl,\n): GetReleasesConfig {\n const {\n customDatasources,\n datasource,\n packageName,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n } = config;\n return {\n customDatasources,\n datasource,\n packageName,\n registryUrl,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n };\n}\n\n// TODO: fix error Type\nfunction logError(datasource: string, packageName: string, err: any): void {\n const { statusCode, code: errCode, url } = err;\n if (statusCode === 404) {\n logger.debug({ datasource, packageName, url }, 'Datasource 404');\n } else if (statusCode === 401 || statusCode === 403) {\n logger.debug({ datasource, packageName, url }, 'Datasource unauthorized');\n } else if (errCode) {\n logger.debug(\n { datasource, packageName, url, errCode },\n 'Datasource connection error',\n );\n } else {\n logger.debug({ datasource, packageName, err }, 'Datasource unknown error');\n }\n}\n\nasync function getRegistryReleases(\n datasource: DatasourceApi,\n config: GetPkgReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = buildCacheKey(registryUrl, config.packageName);\n\n const cacheEnabled = !!datasource.caching; // tells if `isPrivate` flag is supported in datasource result\n const cacheForced = GlobalConfig.get('cachePrivatePackages'); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases(toGetReleasesConfig(config, registryUrl)),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n // for the cached and the returned result alike\n stripMetadataUrlCredentials(res);\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let externalHostError: ExternalHostError | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n // Merging must not mutate responses shared by the package cache.\n const res = clone(\n await getRegistryReleases(datasource, config, registryUrl),\n );\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n // v8 ignore else -- needs merged registries where only one carries tags\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n // v8 ignore else -- needs a merged registry whose tag is not a version\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n // Don't abort the merge if another registry already returned releases;\n // a single rate-limited registry shouldn't discard results we have\n externalHostError = err;\n logger.debug(\n { err, registryUrl },\n 'datasource merge: external host error from registry; continuing so releases from other registries are not discarded',\n );\n continue;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (externalHostError) {\n throw externalHostError;\n }\n\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(\n datasource: DatasourceApi,\n registryUrls: string[],\n): string[] {\n const hostTypes = [getDatasourceHostType(datasource.id)].filter(isTruthy);\n return (\n registryUrls\n .filter(isTruthy)\n // the custom datasource detaches the credentials of a URL template from the URL it compiles, which is the one it requests\n .map((url) =>\n isCustomUrlTemplate(hostTypes, url)\n ? url\n : detachUrlCredentials(url, hostTypes),\n )\n .map(trimTrailingSlash)\n );\n}\n\n/**\n * Whether `url` requested with `hostTypes` is a URL template of the custom datasource, such as `https://host/{{packageName}}/versions.json`.\n */\nfunction isCustomUrlTemplate(hostTypes: string[], url: string): boolean {\n return hostTypes.includes('custom') && url.includes('{{');\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n packageName: string,\n {\n defaultRegistryUrls,\n registryUrls,\n additionalRegistryUrls,\n }: RegistryUrlsConfig,\n): string[] {\n const customRegistrySupport = datasource.supportsCustomRegistry(packageName);\n const datasourceDefaultRegistryUrls =\n datasource.getDefaultRegistryUrls(packageName);\n\n if (!customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n // the URLs may carry credentials, which are not logged\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls: registryUrls\n ?.filter(isTruthy)\n .map(withoutUrlCredentials),\n defaultRegistryUrls: defaultRegistryUrls\n ?.filter(isTruthy)\n .map(withoutUrlCredentials),\n additionalRegistryUrls: additionalRegistryUrls\n ?.filter(isTruthy)\n .map(withoutUrlCredentials),\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return coerceArray(datasourceDefaultRegistryUrls);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n if (isNonEmptyArray(customUrls)) {\n return massageRegistryUrls(datasource, customUrls);\n }\n const defaultUrls = isNonEmptyArray(defaultRegistryUrls)\n ? defaultRegistryUrls\n : datasourceDefaultRegistryUrls;\n if (!isNonEmptyArray(defaultUrls)) {\n return [];\n }\n return massageRegistryUrls(datasource, [\n ...defaultUrls,\n ...coerceArray(additionalRegistryUrls),\n ]);\n}\n\nfunction applyReplacements(\n config: GetPkgReleasesConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let registryUrlsConfig: RegistryUrlsConfig = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n // v8 ignore else -- npm lookups here never arrive with explicit registryUrls\n if (!isNonEmptyArray(config.registryUrls)) {\n registryUrlsConfig = {\n ...config,\n registryUrls: [resolveRegistryUrl(config.packageName)],\n };\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n const registryUrls = resolveRegistryUrls(\n datasource,\n config.packageName,\n registryUrlsConfig,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy;\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else {\n // `merge` is the only remaining strategy\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(toGetReleasesConfig(config)),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (\n [HOST_BLOCKED, HOST_DISABLED].includes(err.message) ||\n [HOST_BLOCKED, HOST_DISABLED].includes(err.err?.message)\n ) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n // also for the results of a lookup without registry URL, which do not pass `getRegistryReleases()`\n stripMetadataUrlCredentials(dep);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = buildCacheKey(\n 'datasource-mem',\n 'releases',\n datasource,\n packageName,\n config.registryStrategy,\n safeStringify([\n registryUrls,\n config.defaultRegistryUrls,\n config.additionalRegistryUrls,\n ]),\n );\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(datasource, packageName, config)[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["datasources","packageCache.get","packageCache.set","versioning.get","memCache.get"],"sources":["../../../lib/modules/datasource/index.ts"],"sourcesContent":["import { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport { isNonEmptyArray, isString, isTruthy } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_BLOCKED, HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n ATTR_RENOVATE_DATASOURCE,\n ATTR_RENOVATE_PACKAGE_NAME,\n ATTR_RENOVATE_REGISTRY_URL,\n} from '../../instrumentation/types.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../util/array.ts';\nimport * as memCache from '../../util/cache/memory/index.ts';\nimport * as packageCache from '../../util/cache/package/index.ts';\nimport { buildCacheKey } from '../../util/cache/package/key.ts';\nimport type { PackageCacheNamespace } from '../../util/cache/package/types.ts';\nimport { clone } from '../../util/clone.ts';\nimport { filterMap } from '../../util/filter-map.ts';\nimport { detachUrlCredentials } from '../../util/host-rules.ts';\nimport {\n isForbidden,\n isNotFound,\n isUnauthorized,\n} from '../../util/http/status.ts';\nimport { AsyncResult, Result } from '../../util/result.ts';\nimport { DatasourceCacheStats } from '../../util/stats.ts';\nimport { safeStringify } from '../../util/stringify.ts';\nimport { trimTrailingSlash, withoutUrlCredentials } from '../../util/url.ts';\nimport * as versioning from '../versioning/index.ts';\nimport datasources from './api.ts';\nimport {\n applyConstraintsFiltering,\n applyExtractVersion,\n applyVersionCompatibility,\n filterValidVersions,\n getDatasourceFor,\n getDatasourceHostType,\n sortAndRemoveDuplicates,\n} from './common.ts';\nimport { addMetaData, stripMetadataUrlCredentials } from './metadata.ts';\nimport { setNpmrc } from './npm/index.ts';\nimport { resolveRegistryUrl } from './npm/npmrc.ts';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetDigestInputConfig,\n GetPkgReleasesConfig,\n GetReleasesConfig,\n RegistryUrlsConfig,\n ReleaseResult,\n} from './types.ts';\n\nexport { isGetPkgReleasesConfig } from './common.ts';\nexport * from './types.ts';\n\nexport function getDatasources(): Map<string, DatasourceApi> {\n return datasources;\n}\nexport function getDatasourceList(): string[] {\n return Array.from(datasources.keys());\n}\n\n/**\n * Projects the registry-level config onto the fields a datasource\n * implementation is allowed to see.\n */\nfunction toGetReleasesConfig(\n config: GetPkgReleasesConfig,\n registryUrl = config.registryUrl,\n): GetReleasesConfig {\n const {\n customDatasources,\n datasource,\n packageName,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n } = config;\n return {\n customDatasources,\n datasource,\n packageName,\n registryUrl,\n currentValue,\n constraints,\n constraintsVersioning,\n constraintsFiltering,\n };\n}\n\n// TODO: fix error Type\nfunction logError(datasource: string, packageName: string, err: any): void {\n const { code: errCode, url } = err;\n if (isNotFound(err)) {\n logger.debug({ datasource, packageName, url }, 'Datasource 404');\n } else if (isUnauthorized(err) || isForbidden(err)) {\n logger.debug({ datasource, packageName, url }, 'Datasource unauthorized');\n } else if (errCode) {\n logger.debug(\n { datasource, packageName, url, errCode },\n 'Datasource connection error',\n );\n } else {\n logger.debug({ datasource, packageName, err }, 'Datasource unknown error');\n }\n}\n\nasync function getRegistryReleases(\n datasource: DatasourceApi,\n config: GetPkgReleasesConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n const cacheNamespace: PackageCacheNamespace = `datasource-releases-${datasource.id}`;\n const cacheKey = buildCacheKey(registryUrl, config.packageName);\n\n const cacheEnabled = !!datasource.caching; // tells if `isPrivate` flag is supported in datasource result\n const cacheForced = GlobalConfig.get('cachePrivatePackages'); // tells if caching is forced via admin config\n\n if (cacheEnabled || cacheForced) {\n const cachedResult = await packageCache.get<ReleaseResult>(\n cacheNamespace,\n cacheKey,\n );\n\n if (cachedResult) {\n logger.trace({ cacheKey }, 'Returning cached datasource response');\n DatasourceCacheStats.hit(datasource.id, registryUrl, config.packageName);\n return cachedResult;\n }\n\n DatasourceCacheStats.miss(datasource.id, registryUrl, config.packageName);\n }\n\n const res = await instrument(\n 'getReleases',\n () => datasource.getReleases(toGetReleasesConfig(config, registryUrl)),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: registryUrl,\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n if (res?.releases.length) {\n res.registryUrl ??= registryUrl;\n }\n\n if (!res) {\n return null;\n }\n\n // for the cached and the returned result alike\n stripMetadataUrlCredentials(res);\n\n let cache = false;\n if (cacheForced) {\n cache = true;\n } else if (cacheEnabled && !res.isPrivate) {\n cache = true;\n }\n\n if (cache) {\n logger.trace({ cacheKey }, 'Caching datasource response');\n await packageCache.set(cacheNamespace, cacheKey, res, 15);\n DatasourceCacheStats.set(datasource.id, registryUrl, config.packageName);\n } else {\n DatasourceCacheStats.skip(datasource.id, registryUrl, config.packageName);\n }\n\n return res;\n}\n\nfunction firstRegistry(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n if (registryUrls.length > 1) {\n logger.warn(\n {\n datasource: datasource.id,\n packageName: config.packageName,\n registryUrls,\n },\n 'Excess registryUrls found for datasource lookup - using first configured only',\n );\n }\n const registryUrl = registryUrls[0];\n return getRegistryReleases(datasource, config, registryUrl);\n}\n\nasync function huntRegistries(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let res: ReleaseResult | null = null;\n let caughtError: Error | undefined;\n for (const registryUrl of registryUrls) {\n try {\n res = await getRegistryReleases(datasource, config, registryUrl);\n if (res) {\n break;\n }\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n // We'll always save the last-thrown error\n caughtError = err;\n logger.trace({ err }, 'datasource hunt failure');\n }\n }\n if (res) {\n return res;\n }\n if (caughtError) {\n throw caughtError;\n }\n return null;\n}\n\nasync function mergeRegistries(\n config: GetPkgReleasesConfig,\n datasource: DatasourceApi,\n registryUrls: string[],\n): Promise<ReleaseResult | null> {\n let combinedRes: ReleaseResult | undefined;\n let lastErr: Error | undefined;\n let externalHostError: ExternalHostError | undefined;\n let singleRegistry = true;\n const releaseVersioning = versioning.get(config.versioning);\n for (const registryUrl of registryUrls) {\n try {\n // Merging must not mutate responses shared by the package cache.\n const res = clone(\n await getRegistryReleases(datasource, config, registryUrl),\n );\n if (!res) {\n continue;\n }\n\n if (!combinedRes) {\n // This is the first registry, so we can just use it and continue\n combinedRes = res;\n continue;\n }\n\n if (singleRegistry) {\n // This is the second registry\n // We need to move the registryUrl from the package level to the release level\n for (const release of coerceArray(combinedRes.releases)) {\n release.registryUrl ??= combinedRes.registryUrl;\n }\n singleRegistry = false;\n }\n\n const releases = coerceArray(res.releases);\n for (const release of releases) {\n // We have more than one registry, so we need to move the registryUrl\n // from the package level to the release level before merging\n release.registryUrl ??= res.registryUrl;\n }\n\n combinedRes.releases.push(...releases);\n\n // Merge the tags from the two results\n let tags = combinedRes.tags;\n if (tags) {\n // v8 ignore else -- needs merged registries where only one carries tags\n if (res.tags) {\n // Both results had tags, so we need to compare them\n for (const tag of ['release', 'latest']) {\n const existingTag = combinedRes?.tags?.[tag];\n const newTag = res.tags?.[tag];\n // v8 ignore else -- needs a merged registry whose tag is not a version\n if (isString(newTag) && releaseVersioning.isVersion(newTag)) {\n if (\n isString(existingTag) &&\n releaseVersioning.isVersion(existingTag)\n ) {\n // We need to compare them\n if (releaseVersioning.isGreaterThan(newTag, existingTag)) {\n // New tag is greater than the existing one\n tags[tag] = newTag;\n }\n } else {\n // Existing tag was not present or not a version\n // so we can just use the new one\n tags[tag] = newTag;\n }\n }\n }\n }\n } else {\n // Existing results had no tags, so we can just use the new ones\n tags = res.tags;\n }\n combinedRes = { ...res, ...combinedRes };\n if (tags) {\n combinedRes.tags = tags;\n }\n // Remove the registryUrl from the package level when more than one registry\n delete combinedRes.registryUrl;\n } catch (err) {\n if (err instanceof ExternalHostError) {\n // Don't abort the merge if another registry already returned releases;\n // a single rate-limited registry shouldn't discard results we have\n externalHostError = err;\n logger.debug(\n { err, registryUrl },\n 'datasource merge: external host error from registry; continuing so releases from other registries are not discarded',\n );\n continue;\n }\n\n lastErr = err;\n logger.trace({ err }, 'datasource merge failure');\n }\n }\n\n if (!combinedRes) {\n if (externalHostError) {\n throw externalHostError;\n }\n\n if (lastErr) {\n throw lastErr;\n }\n\n return null;\n }\n\n const seenVersions = new Set<string>();\n combinedRes.releases = filterMap(combinedRes.releases, (release) => {\n if (seenVersions.has(release.version)) {\n return null;\n }\n seenVersions.add(release.version);\n return release;\n });\n\n return combinedRes;\n}\n\nfunction massageRegistryUrls(\n datasource: DatasourceApi,\n registryUrls: string[],\n): string[] {\n const hostTypes = [getDatasourceHostType(datasource.id)].filter(isTruthy);\n return (\n registryUrls\n .filter(isTruthy)\n // the custom datasource detaches the credentials of a URL template from the URL it compiles, which is the one it requests\n .map((url) =>\n isCustomUrlTemplate(hostTypes, url)\n ? url\n : detachUrlCredentials(url, hostTypes),\n )\n .map(trimTrailingSlash)\n );\n}\n\n/**\n * Whether `url` requested with `hostTypes` is a URL template of the custom datasource, such as `https://host/{{packageName}}/versions.json`.\n */\nfunction isCustomUrlTemplate(hostTypes: string[], url: string): boolean {\n return hostTypes.includes('custom') && url.includes('{{');\n}\n\nfunction resolveRegistryUrls(\n datasource: DatasourceApi,\n packageName: string,\n {\n defaultRegistryUrls,\n registryUrls,\n additionalRegistryUrls,\n }: RegistryUrlsConfig,\n): string[] {\n const customRegistrySupport = datasource.supportsCustomRegistry(packageName);\n const datasourceDefaultRegistryUrls =\n datasource.getDefaultRegistryUrls(packageName);\n\n if (!customRegistrySupport) {\n if (\n isNonEmptyArray(registryUrls) ||\n isNonEmptyArray(defaultRegistryUrls) ||\n isNonEmptyArray(additionalRegistryUrls)\n ) {\n // the URLs may carry credentials, which are not logged\n logger.warn(\n {\n datasource: datasource.id,\n registryUrls: registryUrls\n ?.filter(isTruthy)\n .map(withoutUrlCredentials),\n defaultRegistryUrls: defaultRegistryUrls\n ?.filter(isTruthy)\n .map(withoutUrlCredentials),\n additionalRegistryUrls: additionalRegistryUrls\n ?.filter(isTruthy)\n .map(withoutUrlCredentials),\n },\n 'Custom registries are not allowed for this datasource and will be ignored',\n );\n }\n return coerceArray(datasourceDefaultRegistryUrls);\n }\n const customUrls = registryUrls?.filter(isTruthy);\n if (isNonEmptyArray(customUrls)) {\n return massageRegistryUrls(datasource, customUrls);\n }\n const defaultUrls = isNonEmptyArray(defaultRegistryUrls)\n ? defaultRegistryUrls\n : datasourceDefaultRegistryUrls;\n if (!isNonEmptyArray(defaultUrls)) {\n return [];\n }\n return massageRegistryUrls(datasource, [\n ...defaultUrls,\n ...coerceArray(additionalRegistryUrls),\n ]);\n}\n\nfunction applyReplacements(\n config: GetPkgReleasesConfig,\n): Pick<ReleaseResult, 'replacementName' | 'replacementVersion'> | undefined {\n if (config.replacementName && config.replacementVersion) {\n return {\n replacementName: config.replacementName,\n replacementVersion: config.replacementVersion,\n };\n }\n return undefined;\n}\n\nasync function fetchReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource: datasourceName } = config;\n let registryUrlsConfig: RegistryUrlsConfig = config;\n // istanbul ignore if: need test\n if (!datasourceName || getDatasourceFor(datasourceName) === undefined) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n if (datasourceName === 'npm') {\n if (isString(config.npmrc)) {\n setNpmrc(config.npmrc);\n }\n // v8 ignore else -- npm lookups here never arrive with explicit registryUrls\n if (!isNonEmptyArray(config.registryUrls)) {\n registryUrlsConfig = {\n ...config,\n registryUrls: [resolveRegistryUrl(config.packageName)],\n };\n }\n }\n const datasource = getDatasourceFor(datasourceName);\n // istanbul ignore if: needs test\n if (!datasource) {\n logger.warn({ datasource: datasourceName }, 'Unknown datasource');\n return null;\n }\n const registryUrls = resolveRegistryUrls(\n datasource,\n config.packageName,\n registryUrlsConfig,\n );\n let dep: ReleaseResult | null = null;\n const registryStrategy =\n config.registryStrategy ?? datasource.registryStrategy;\n try {\n if (isNonEmptyArray(registryUrls)) {\n if (registryStrategy === 'first') {\n dep = await firstRegistry(config, datasource, registryUrls);\n } else if (registryStrategy === 'hunt') {\n dep = await huntRegistries(config, datasource, registryUrls);\n } else {\n // `merge` is the only remaining strategy\n dep = await mergeRegistries(config, datasource, registryUrls);\n }\n } else {\n dep = await instrument(\n 'getReleases',\n () => datasource.getReleases(toGetReleasesConfig(config)),\n {\n attributes: {\n [ATTR_CODE_FUNCTION_NAME]: 'getReleases',\n [ATTR_RENOVATE_DATASOURCE]: datasource.id,\n [ATTR_RENOVATE_REGISTRY_URL]: config.registryUrl ?? '',\n [ATTR_RENOVATE_PACKAGE_NAME]: config.packageName,\n },\n },\n );\n }\n } catch (err) {\n if (\n [HOST_BLOCKED, HOST_DISABLED].includes(err.message) ||\n [HOST_BLOCKED, HOST_DISABLED].includes(err.err?.message)\n ) {\n return null;\n }\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logError(datasource.id, config.packageName, err);\n }\n if (!dep || dequal(dep, { releases: [] })) {\n return null;\n }\n addMetaData(dep, datasourceName, config.packageName);\n // also for the results of a lookup without registry URL, which do not pass `getRegistryReleases()`\n stripMetadataUrlCredentials(dep);\n dep = { ...dep, ...applyReplacements(config) };\n return dep;\n}\n\nfunction fetchCachedReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { datasource, packageName, registryUrls } = config;\n const cacheKey = buildCacheKey(\n 'datasource-mem',\n 'releases',\n datasource,\n packageName,\n config.registryStrategy,\n safeStringify([\n registryUrls,\n config.defaultRegistryUrls,\n config.additionalRegistryUrls,\n ]),\n );\n // By returning a Promise and reusing it, we should only fetch each package at most once\n const cachedResult = memCache.get<Promise<ReleaseResult | null>>(cacheKey);\n // istanbul ignore if\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n const promisedRes = fetchReleases(config);\n memCache.set(cacheKey, promisedRes);\n return promisedRes;\n}\n\nexport function getRawPkgReleases(\n config: GetPkgReleasesConfig,\n): AsyncResult<\n ReleaseResult,\n Error | 'no-datasource' | 'no-package-name' | 'no-result'\n> {\n if (!config.datasource) {\n logger.warn('No datasource found');\n return AsyncResult.err('no-datasource');\n }\n\n const packageName = config.packageName;\n if (!packageName) {\n logger.error({ config }, 'Datasource getReleases without packageName');\n return AsyncResult.err('no-package-name');\n }\n\n return Result.wrapNullable(fetchCachedReleases(config), 'no-result' as const)\n .catch((e) => {\n if (e instanceof ExternalHostError) {\n e.hostType = config.datasource;\n e.packageName = packageName;\n }\n return Result.err(e);\n })\n .transform(clone);\n}\n\nexport function applyDatasourceFilters(\n releaseResult: ReleaseResult,\n config: GetPkgReleasesConfig,\n): ReleaseResult {\n let res = releaseResult;\n res = applyExtractVersion(res, config.extractVersion);\n res = applyVersionCompatibility(\n res,\n config.versionCompatibility,\n config.currentCompatibility,\n );\n res = filterValidVersions(res, config);\n res = sortAndRemoveDuplicates(res, config);\n res = applyConstraintsFiltering(res, config);\n return res;\n}\n\nexport async function getPkgReleases(\n config: GetPkgReleasesConfig,\n): Promise<ReleaseResult | null> {\n const { val = null, err } = await getRawPkgReleases(config)\n .transform((res) => applyDatasourceFilters(res, config))\n .unwrap();\n\n if (err instanceof Error) {\n throw err;\n }\n\n return val;\n}\n\nexport function supportsDigests(datasource: string | undefined): boolean {\n const ds = !!datasource && getDatasourceFor(datasource);\n return !!ds && 'getDigest' in ds;\n}\n\nfunction getDigestConfig(\n datasource: DatasourceApi,\n config: GetDigestInputConfig,\n): DigestConfig {\n const { lookupName, currentValue, currentDigest } = config;\n const packageName = config.replacementName ?? config.packageName;\n // Prefer registryUrl from getReleases() lookup if it has been passed\n const registryUrl =\n config.registryUrl ??\n resolveRegistryUrls(datasource, packageName, config)[0];\n return { lookupName, packageName, registryUrl, currentValue, currentDigest };\n}\n\nexport function getDigest(\n config: GetDigestInputConfig,\n value?: string,\n): Promise<string | null> {\n const datasource = getDatasourceFor(config.datasource);\n // istanbul ignore if: need test\n if (!datasource || !('getDigest' in datasource)) {\n return Promise.resolve(null);\n }\n const digestConfig = getDigestConfig(datasource, config);\n return datasource.getDigest!(digestConfig, value);\n}\n\nexport function getDefaultConfig(\n datasource: string,\n): Promise<Record<string, unknown>> {\n const loadedDatasource = getDatasourceFor(datasource);\n return Promise.resolve<Record<string, unknown>>(\n loadedDatasource?.defaultConfig ?? Object.create({}),\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { logger } from "../../../logger/index.js";
2
+ import { isNotFound } from "../../../util/http/status.js";
2
3
  import { ExternalHostError } from "../../../types/errors/external-host-error.js";
3
4
  import { RequestError } from "../../../util/http/got.js";
4
5
  import "../../../util/http/index.js";
@@ -11,7 +12,7 @@ async function getPageReleases(http, url, page) {
11
12
  try {
12
13
  return (await http.getJson(pgUrl, AdoptiumJavaResponse))?.body?.versions?.map(({ semver }) => ({ version: semver })) ?? null;
13
14
  } catch (err) {
14
- if (page !== 0 && err instanceof RequestError && err.response?.statusCode === 404) return null;
15
+ if (page !== 0 && isNotFound(err)) return null;
15
16
  throw err;
16
17
  }
17
18
  }
@@ -35,7 +36,7 @@ async function getAdoptiumReleases(http, pkgConfig) {
35
36
  }
36
37
  } catch (err) {
37
38
  if (err instanceof RequestError) {
38
- if (err.response?.statusCode !== 404) throw new ExternalHostError(err);
39
+ if (!isNotFound(err)) throw new ExternalHostError(err);
39
40
  return null;
40
41
  }
41
42
  throw err;
@@ -1 +1 @@
1
- {"version":3,"file":"adoptium.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/java-version/adoptium.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { type Http, HttpError } from '../../../util/http/index.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { pageSize } from './common.ts';\nimport { AdoptiumJavaResponse } from './schema.ts';\nimport type { PackageConfig } from './types.ts';\n\nexport const adoptiumRegistryUrl = 'https://api.adoptium.net/';\n\nasync function getPageReleases(\n http: Http,\n url: string,\n page: number,\n): Promise<Release[] | null> {\n const pgUrl = `${url}&page=${page}`;\n try {\n const pgRes = await http.getJson(pgUrl, AdoptiumJavaResponse);\n return (\n pgRes?.body?.versions?.map(({ semver }) => ({\n version: semver,\n })) ?? null\n );\n } catch (err) {\n if (\n page !== 0 &&\n err instanceof HttpError &&\n err.response?.statusCode === 404\n ) {\n // No more pages\n return null;\n }\n\n throw err;\n }\n}\n\nexport async function getAdoptiumReleases(\n http: Http,\n pkgConfig: PackageConfig,\n): Promise<ReleaseResult | null> {\n logger.trace({ pkgConfig }, 'fetching Adoptium releases');\n\n let url = `${adoptiumRegistryUrl}v3/info/release_versions?page_size=${pageSize}&image_type=${pkgConfig.imageType}&project=jdk&release_type=ga&sort_method=DATE&sort_order=DESC`;\n\n if (pkgConfig.architecture) {\n url += `&architecture=${pkgConfig.architecture}`;\n }\n if (pkgConfig.os) {\n url += `&os=${pkgConfig.os}`;\n }\n\n const result: ReleaseResult = {\n homepage: 'https://adoptium.net',\n releases: [],\n };\n\n try {\n let page = 0;\n let releases = await getPageReleases(http, url, page);\n while (releases) {\n result.releases.push(...releases);\n if (releases.length !== pageSize || page >= 50) {\n break;\n }\n page += 1;\n releases = await getPageReleases(http, url, page);\n }\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n // 404 is handled by getPageReleases, so if we get here it's an unexpected 404\n return null;\n }\n throw err;\n }\n\n return result.releases.length ? result : null;\n}\n"],"mappings":";;;;;;;AAQA,MAAa,sBAAsB;AAEnC,eAAe,gBACb,MACA,KACA,MAC2B;CAC3B,MAAM,QAAQ,GAAG,IAAI,QAAQ;CAC7B,IAAI;EAEF,QACE,MAFkB,KAAK,QAAQ,OAAO,oBAAoB,EAAA,EAEnD,MAAM,UAAU,KAAK,EAAE,cAAc,EAC1C,SAAS,OACX,EAAE,KAAK;CAEX,SAAS,KAAK;EACZ,IACE,SAAS,KACT,eAAeA,gBACf,IAAI,UAAU,eAAe,KAG7B,OAAO;EAGT,MAAM;CACR;AACF;AAEA,eAAsB,oBACpB,MACA,WAC+B;CAC/B,OAAO,MAAM,EAAE,UAAU,GAAG,4BAA4B;CAExD,IAAI,MAAM,GAAG,oBAAoB,mDAA4D,UAAU,UAAU;CAEjH,IAAI,UAAU,cACZ,OAAO,iBAAiB,UAAU;CAEpC,IAAI,UAAU,IACZ,OAAO,OAAO,UAAU;CAG1B,MAAM,SAAwB;EAC5B,UAAU;EACV,UAAU,CAAC;CACb;CAEA,IAAI;EACF,IAAI,OAAO;EACX,IAAI,WAAW,MAAM,gBAAgB,MAAM,KAAK,IAAI;EACpD,OAAO,UAAU;GACf,OAAO,SAAS,KAAK,GAAG,QAAQ;GAChC,IAAI,SAAS,WAAA,MAAuB,QAAQ,IAC1C;GAEF,QAAQ;GACR,WAAW,MAAM,gBAAgB,MAAM,KAAK,IAAI;EAClD;CACF,SAAS,KAAK;EACZ,IAAI,eAAeA,cAAW;GAC5B,IAAI,IAAI,UAAU,eAAe,KAC/B,MAAM,IAAI,kBAAkB,GAAG;GAGjC,OAAO;EACT;EACA,MAAM;CACR;CAEA,OAAO,OAAO,SAAS,SAAS,SAAS;AAC3C"}
1
+ {"version":3,"file":"adoptium.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/java-version/adoptium.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { type Http, HttpError } from '../../../util/http/index.ts';\nimport { isNotFound } from '../../../util/http/status.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\nimport { pageSize } from './common.ts';\nimport { AdoptiumJavaResponse } from './schema.ts';\nimport type { PackageConfig } from './types.ts';\n\nexport const adoptiumRegistryUrl = 'https://api.adoptium.net/';\n\nasync function getPageReleases(\n http: Http,\n url: string,\n page: number,\n): Promise<Release[] | null> {\n const pgUrl = `${url}&page=${page}`;\n try {\n const pgRes = await http.getJson(pgUrl, AdoptiumJavaResponse);\n return (\n pgRes?.body?.versions?.map(({ semver }) => ({\n version: semver,\n })) ?? null\n );\n } catch (err) {\n if (page !== 0 && isNotFound(err)) {\n // No more pages\n return null;\n }\n\n throw err;\n }\n}\n\nexport async function getAdoptiumReleases(\n http: Http,\n pkgConfig: PackageConfig,\n): Promise<ReleaseResult | null> {\n logger.trace({ pkgConfig }, 'fetching Adoptium releases');\n\n let url = `${adoptiumRegistryUrl}v3/info/release_versions?page_size=${pageSize}&image_type=${pkgConfig.imageType}&project=jdk&release_type=ga&sort_method=DATE&sort_order=DESC`;\n\n if (pkgConfig.architecture) {\n url += `&architecture=${pkgConfig.architecture}`;\n }\n if (pkgConfig.os) {\n url += `&os=${pkgConfig.os}`;\n }\n\n const result: ReleaseResult = {\n homepage: 'https://adoptium.net',\n releases: [],\n };\n\n try {\n let page = 0;\n let releases = await getPageReleases(http, url, page);\n while (releases) {\n result.releases.push(...releases);\n if (releases.length !== pageSize || page >= 50) {\n break;\n }\n page += 1;\n releases = await getPageReleases(http, url, page);\n }\n } catch (err) {\n if (err instanceof HttpError) {\n if (!isNotFound(err)) {\n throw new ExternalHostError(err);\n }\n // 404 is handled by getPageReleases, so if we get here it's an unexpected 404\n return null;\n }\n throw err;\n }\n\n return result.releases.length ? result : null;\n}\n"],"mappings":";;;;;;;;AASA,MAAa,sBAAsB;AAEnC,eAAe,gBACb,MACA,KACA,MAC2B;CAC3B,MAAM,QAAQ,GAAG,IAAI,QAAQ;CAC7B,IAAI;EAEF,QACE,MAFkB,KAAK,QAAQ,OAAO,oBAAoB,EAAA,EAEnD,MAAM,UAAU,KAAK,EAAE,cAAc,EAC1C,SAAS,OACX,EAAE,KAAK;CAEX,SAAS,KAAK;EACZ,IAAI,SAAS,KAAK,WAAW,GAAG,GAE9B,OAAO;EAGT,MAAM;CACR;AACF;AAEA,eAAsB,oBACpB,MACA,WAC+B;CAC/B,OAAO,MAAM,EAAE,UAAU,GAAG,4BAA4B;CAExD,IAAI,MAAM,GAAG,oBAAoB,mDAA4D,UAAU,UAAU;CAEjH,IAAI,UAAU,cACZ,OAAO,iBAAiB,UAAU;CAEpC,IAAI,UAAU,IACZ,OAAO,OAAO,UAAU;CAG1B,MAAM,SAAwB;EAC5B,UAAU;EACV,UAAU,CAAC;CACb;CAEA,IAAI;EACF,IAAI,OAAO;EACX,IAAI,WAAW,MAAM,gBAAgB,MAAM,KAAK,IAAI;EACpD,OAAO,UAAU;GACf,OAAO,SAAS,KAAK,GAAG,QAAQ;GAChC,IAAI,SAAS,WAAA,MAAuB,QAAQ,IAC1C;GAEF,QAAQ;GACR,WAAW,MAAM,gBAAgB,MAAM,KAAK,IAAI;EAClD;CACF,SAAS,KAAK;EACZ,IAAI,eAAeA,cAAW;GAC5B,IAAI,CAAC,WAAW,GAAG,GACjB,MAAM,IAAI,kBAAkB,GAAG;GAGjC,OAAO;EACT;EACA,MAAM;CACR;CAEA,OAAO,OAAO,SAAS,SAAS,SAAS;AAC3C"}
@@ -1,5 +1,6 @@
1
1
  import { logger } from "../../../logger/index.js";
2
2
  import { joinUrlParts } from "../../../util/url.js";
3
+ import { isNotFound } from "../../../util/http/status.js";
3
4
  import { ExternalHostError } from "../../../types/errors/external-host-error.js";
4
5
  import { RequestError } from "../../../util/http/got.js";
5
6
  import "../../../util/http/index.js";
@@ -34,7 +35,7 @@ async function getGraalvmReleases(http, pkgConfig, registryUrl) {
34
35
  result.releases.push(...filteredReleases);
35
36
  } catch (err) {
36
37
  if (err instanceof RequestError) {
37
- if (err.response?.statusCode === 404) {
38
+ if (isNotFound(err)) {
38
39
  logger.debug({ url }, "GraalVM releases not found (404)");
39
40
  return null;
40
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graalvm.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/java-version/graalvm.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { type Http, HttpError } from '../../../util/http/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport type { ReleaseResult } from '../types.ts';\nimport { MiseJavaRelease } from './schema.ts';\nimport type { PackageConfig } from './types.ts';\n\nexport const graalvmRegistryUrl = 'https://mise-java.jdx.dev/';\n\nexport async function getGraalvmReleases(\n http: Http,\n pkgConfig: PackageConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n logger.trace({ pkgConfig, registryUrl }, 'fetching GraalVM releases');\n\n // Build URL: /jvm/{releaseType}/{os}/{architecture}.json\n // If system detection returns null, we can't fetch - return null\n if (!pkgConfig.os || !pkgConfig.architecture) {\n logger.debug(\n { os: pkgConfig.os, architecture: pkgConfig.architecture },\n 'Cannot fetch GraalVM releases without OS and architecture',\n );\n return null;\n }\n\n const releaseType = pkgConfig.releaseType ?? 'ga';\n\n const url = joinUrlParts(\n registryUrl,\n 'jvm',\n releaseType,\n pkgConfig.os,\n `${pkgConfig.architecture}.json`,\n );\n\n const result: ReleaseResult = {\n homepage: 'https://www.oracle.com/java/graalvm/',\n sourceUrl: 'https://github.com/oracle/graal',\n registryUrl,\n releases: [],\n };\n\n try {\n const response = await http.getJson(url, z.array(MiseJavaRelease));\n\n // Filter by vendor and image_type\n const filteredReleases = response.body\n .filter((release) => {\n return (\n release.vendor === pkgConfig.vendor &&\n release.image_type === pkgConfig.imageType\n );\n })\n .map((release) => ({\n version: release.version,\n }));\n\n result.releases.push(...filteredReleases);\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode === 404) {\n logger.debug({ url }, 'GraalVM releases not found (404)');\n return null;\n }\n throw new ExternalHostError(err);\n }\n\n throw err;\n }\n\n return result.releases.length ? result : null;\n}\n"],"mappings":";;;;;;;;AASA,MAAa,qBAAqB;AAElC,eAAsB,mBACpB,MACA,WACA,aAC+B;CAC/B,OAAO,MAAM;EAAE;EAAW;CAAY,GAAG,2BAA2B;CAIpE,IAAI,CAAC,UAAU,MAAM,CAAC,UAAU,cAAc;EAC5C,OAAO,MACL;GAAE,IAAI,UAAU;GAAI,cAAc,UAAU;EAAa,GACzD,2DACF;EACA,OAAO;CACT;CAEA,MAAM,cAAc,UAAU,eAAe;CAE7C,MAAM,MAAM,aACV,aACA,OACA,aACA,UAAU,IACV,GAAG,UAAU,aAAa,MAC5B;CAEA,MAAM,SAAwB;EAC5B,UAAU;EACV,WAAW;EACX;EACA,UAAU,CAAC;CACb;CAEA,IAAI;EAIF,MAAM,oBAAmB,MAHF,KAAK,QAAQ,KAAK,EAAE,MAAM,eAAe,CAAC,EAAA,CAG/B,KAC/B,QAAQ,YAAY;GACnB,OACE,QAAQ,WAAW,UAAU,UAC7B,QAAQ,eAAe,UAAU;EAErC,CAAC,CAAC,CACD,KAAK,aAAa,EACjB,SAAS,QAAQ,QACnB,EAAE;EAEJ,OAAO,SAAS,KAAK,GAAG,gBAAgB;CAC1C,SAAS,KAAK;EACZ,IAAI,eAAeA,cAAW;GAC5B,IAAI,IAAI,UAAU,eAAe,KAAK;IACpC,OAAO,MAAM,EAAE,IAAI,GAAG,kCAAkC;IACxD,OAAO;GACT;GACA,MAAM,IAAI,kBAAkB,GAAG;EACjC;EAEA,MAAM;CACR;CAEA,OAAO,OAAO,SAAS,SAAS,SAAS;AAC3C"}
1
+ {"version":3,"file":"graalvm.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/java-version/graalvm.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { type Http, HttpError } from '../../../util/http/index.ts';\nimport { isNotFound } from '../../../util/http/status.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport type { ReleaseResult } from '../types.ts';\nimport { MiseJavaRelease } from './schema.ts';\nimport type { PackageConfig } from './types.ts';\n\nexport const graalvmRegistryUrl = 'https://mise-java.jdx.dev/';\n\nexport async function getGraalvmReleases(\n http: Http,\n pkgConfig: PackageConfig,\n registryUrl: string,\n): Promise<ReleaseResult | null> {\n logger.trace({ pkgConfig, registryUrl }, 'fetching GraalVM releases');\n\n // Build URL: /jvm/{releaseType}/{os}/{architecture}.json\n // If system detection returns null, we can't fetch - return null\n if (!pkgConfig.os || !pkgConfig.architecture) {\n logger.debug(\n { os: pkgConfig.os, architecture: pkgConfig.architecture },\n 'Cannot fetch GraalVM releases without OS and architecture',\n );\n return null;\n }\n\n const releaseType = pkgConfig.releaseType ?? 'ga';\n\n const url = joinUrlParts(\n registryUrl,\n 'jvm',\n releaseType,\n pkgConfig.os,\n `${pkgConfig.architecture}.json`,\n );\n\n const result: ReleaseResult = {\n homepage: 'https://www.oracle.com/java/graalvm/',\n sourceUrl: 'https://github.com/oracle/graal',\n registryUrl,\n releases: [],\n };\n\n try {\n const response = await http.getJson(url, z.array(MiseJavaRelease));\n\n // Filter by vendor and image_type\n const filteredReleases = response.body\n .filter((release) => {\n return (\n release.vendor === pkgConfig.vendor &&\n release.image_type === pkgConfig.imageType\n );\n })\n .map((release) => ({\n version: release.version,\n }));\n\n result.releases.push(...filteredReleases);\n } catch (err) {\n if (err instanceof HttpError) {\n if (isNotFound(err)) {\n logger.debug({ url }, 'GraalVM releases not found (404)');\n return null;\n }\n throw new ExternalHostError(err);\n }\n\n throw err;\n }\n\n return result.releases.length ? result : null;\n}\n"],"mappings":";;;;;;;;;AAUA,MAAa,qBAAqB;AAElC,eAAsB,mBACpB,MACA,WACA,aAC+B;CAC/B,OAAO,MAAM;EAAE;EAAW;CAAY,GAAG,2BAA2B;CAIpE,IAAI,CAAC,UAAU,MAAM,CAAC,UAAU,cAAc;EAC5C,OAAO,MACL;GAAE,IAAI,UAAU;GAAI,cAAc,UAAU;EAAa,GACzD,2DACF;EACA,OAAO;CACT;CAEA,MAAM,cAAc,UAAU,eAAe;CAE7C,MAAM,MAAM,aACV,aACA,OACA,aACA,UAAU,IACV,GAAG,UAAU,aAAa,MAC5B;CAEA,MAAM,SAAwB;EAC5B,UAAU;EACV,WAAW;EACX;EACA,UAAU,CAAC;CACb;CAEA,IAAI;EAIF,MAAM,oBAAmB,MAHF,KAAK,QAAQ,KAAK,EAAE,MAAM,eAAe,CAAC,EAAA,CAG/B,KAC/B,QAAQ,YAAY;GACnB,OACE,QAAQ,WAAW,UAAU,UAC7B,QAAQ,eAAe,UAAU;EAErC,CAAC,CAAC,CACD,KAAK,aAAa,EACjB,SAAS,QAAQ,QACnB,EAAE;EAEJ,OAAO,SAAS,KAAK,GAAG,gBAAgB;CAC1C,SAAS,KAAK;EACZ,IAAI,eAAeA,cAAW;GAC5B,IAAI,WAAW,GAAG,GAAG;IACnB,OAAO,MAAM,EAAE,IAAI,GAAG,kCAAkC;IACxD,OAAO;GACT;GACA,MAAM,IAAI,kBAAkB,GAAG;EACjC;EAEA,MAAM;CACR;CAEA,OAAO,OAAO,SAAS,SAAS,SAAS;AAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["mavenVersion","mavenVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/maven/index.ts"],"sourcesContent":["import type { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\nimport mavenVersion, * as mavenVersioning from '../../versioning/maven/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { MAVEN_CENTRAL_URLS, MAVEN_REPO } from './common.ts';\nimport type { MavenDependency, MetadataResults } from './types.ts';\nimport {\n createUrlForDependencyPom,\n downloadMaven,\n downloadMavenXml,\n getDependencyInfo,\n getDependencyParts,\n getMavenUrl,\n} from './util.ts';\n\nfunction getLatestSuitableVersion(releases: Release[]): string | null {\n /* v8 ignore next -- TODO: add test */\n if (!releases?.length) {\n return null;\n }\n const allVersions = releases.map(({ version }) => version);\n const stableVersions = allVersions.filter((x) => mavenVersion.isStable(x));\n const versions = stableVersions.length ? stableVersions : allVersions;\n return versions.reduce((latestVersion, version) =>\n compare(version, latestVersion) === 1\n ? version\n : /* istanbul ignore next: hard to test */ latestVersion,\n );\n}\n\nfunction extractVersions(metadata: XmlDocument): MetadataResults {\n const res: MetadataResults = {};\n const versions = metadata.descendantWithPath('versioning.versions');\n const elements = versions?.childrenNamed('version');\n if (!elements) {\n return res;\n }\n res.versions = elements.map((el) => el.val);\n const latest = metadata.descendantWithPath('versioning.latest');\n if (latest?.val) {\n res.tags ??= {};\n res.tags.latest = latest.val;\n }\n const release = metadata.descendantWithPath('versioning.release');\n if (release?.val) {\n res.tags ??= {};\n res.tags.release = release.val;\n }\n\n return res;\n}\n\nexport const defaultRegistryUrls = [MAVEN_REPO];\n\nexport class MavenDatasource extends Datasource {\n static id = 'maven';\n\n override readonly caching = true;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return defaultRegistryUrls;\n }\n\n override readonly defaultVersioning: string = mavenVersioning.id;\n\n override readonly registryStrategy: RegistryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `Last-Modified` header or the `lastModified` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` tags in the results.';\n\n constructor(id = MavenDatasource.id, http?: Http) {\n super(id, http);\n }\n\n async fetchVersionsFromMetadata(\n dependency: MavenDependency,\n repoUrl: string,\n ): Promise<MetadataResults> {\n const metadataUrl = getMavenUrl(dependency, repoUrl, 'maven-metadata.xml');\n const metadataXmlResult = await downloadMavenXml(this.http, metadataUrl);\n return metadataXmlResult\n .transform(({ data: metadata }) => extractVersions(metadata))\n .onError((err) => {\n logger.debug(\n `Maven: error fetching versions for \"${dependency.display}\": ${err.type}`,\n );\n })\n .unwrapOr({});\n }\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const dependency = getDependencyParts(packageName);\n const repoUrl = ensureTrailingSlash(registryUrl);\n\n if (\n // groupId\n (packageName.includes('.gradle.plugin:') ||\n // artifactId\n packageName.endsWith('.gradle.plugin')) &&\n MAVEN_CENTRAL_URLS.some((url) => repoUrl === ensureTrailingSlash(url))\n ) {\n logger.debug(\n `Maven: skipping Maven Central for suspected Gradle plugin \"${packageName}\"`,\n );\n return null;\n }\n\n logger.debug(`Looking up ${dependency.display} in repository ${repoUrl}`);\n\n const metadata = await this.fetchVersionsFromMetadata(dependency, repoUrl);\n if (!metadata.versions?.length) {\n return null;\n }\n const releases = metadata.versions.map((version) => ({ version }));\n\n logger.debug(\n `Found ${releases.length} new releases for ${dependency.display} in repository ${repoUrl}`,\n );\n\n const latestSuitableVersion = getLatestSuitableVersion(releases);\n const dependencyInfo =\n latestSuitableVersion &&\n (await getDependencyInfo(\n this.http,\n dependency,\n repoUrl,\n latestSuitableVersion,\n ));\n\n const result: ReleaseResult = {\n ...dependency,\n ...dependencyInfo,\n releases,\n };\n if (metadata.tags) {\n result.tags = metadata.tags;\n if (result.tags.latest) {\n logger.debug(`Setting respectLatest=false for maven ${packageName}`);\n result.respectLatest = false;\n }\n }\n\n if (!this.getDefaultRegistryUrls('').includes(registryUrl)) {\n result.isPrivate = true;\n }\n\n return result;\n }\n\n override async postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n const { version, versionOrig } = release;\n const cacheKey = buildCacheKey(\n 'postprocessRelease',\n registryUrl,\n packageName,\n versionOrig,\n version,\n );\n const cachedResult = await packageCache.get<PostprocessReleaseResult>(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n );\n\n /* v8 ignore if: hard to test */\n if (cachedResult) {\n return cachedResult;\n }\n\n if (!packageName || !registryUrl) {\n return release;\n }\n\n const dependency = getDependencyParts(packageName);\n\n const pomUrl = await createUrlForDependencyPom(\n this.http,\n release.versionOrig ?? release.version,\n dependency,\n registryUrl,\n );\n\n const artifactUrl = getMavenUrl(dependency, registryUrl, pomUrl);\n const fetchResult = await downloadMaven(this.http, artifactUrl);\n const { val, err } = fetchResult.unwrap();\n\n if (err) {\n const result: PostprocessReleaseResult =\n err.type === 'not-found' ? 'reject' : release;\n if (result === 'reject') {\n await packageCache.set(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n result,\n 24 * 60,\n );\n }\n return result;\n }\n\n if (val.lastModified) {\n release.releaseTimestamp = asTimestamp(val.lastModified);\n }\n\n return release;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["mavenVersion","mavenVersioning.id","packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/maven/index.ts"],"sourcesContent":["import type { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { buildCacheKey } from '../../../util/cache/package/key.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { compare } from '../../versioning/maven/compare.ts';\nimport mavenVersion, * as mavenVersioning from '../../versioning/maven/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { MAVEN_CENTRAL_URLS, MAVEN_REPO } from './common.ts';\nimport type { MavenDependency, MetadataResults } from './types.ts';\nimport {\n createUrlForDependencyPom,\n downloadMaven,\n downloadMavenXml,\n getDependencyInfo,\n getDependencyParts,\n getMavenUrl,\n} from './util.ts';\n\nfunction getLatestSuitableVersion(releases: Release[]): string | null {\n /* v8 ignore next -- TODO: add test */\n if (!releases?.length) {\n return null;\n }\n const allVersions = releases.map(({ version }) => version);\n const stableVersions = allVersions.filter((x) => mavenVersion.isStable(x));\n const versions = stableVersions.length ? stableVersions : allVersions;\n return versions.reduce((latestVersion, version) =>\n compare(version, latestVersion) === 1\n ? version\n : /* istanbul ignore next: hard to test */ latestVersion,\n );\n}\n\nfunction extractVersions(metadata: XmlDocument): MetadataResults {\n const res: MetadataResults = {};\n const versions = metadata.descendantWithPath('versioning.versions');\n const elements = versions?.childrenNamed('version');\n if (!elements) {\n return res;\n }\n res.versions = elements.map((el) => el.val);\n const latest = metadata.descendantWithPath('versioning.latest');\n if (latest?.val) {\n res.tags ??= {};\n res.tags.latest = latest.val;\n }\n const release = metadata.descendantWithPath('versioning.release');\n if (release?.val) {\n res.tags ??= {};\n res.tags.release = release.val;\n }\n\n return res;\n}\n\nexport const defaultRegistryUrls = [MAVEN_REPO];\n\nexport class MavenDatasource extends Datasource {\n static id = 'maven';\n\n override readonly caching = true;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return defaultRegistryUrls;\n }\n\n override readonly defaultVersioning: string = mavenVersioning.id;\n\n override readonly registryStrategy: RegistryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `Last-Modified` header or the `lastModified` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `scm` tags in the results.';\n\n constructor(id = MavenDatasource.id, http?: Http) {\n super(id, http);\n }\n\n async fetchVersionsFromMetadata(\n dependency: MavenDependency,\n repoUrl: string,\n ): Promise<MetadataResults> {\n const metadataUrl = getMavenUrl(dependency, repoUrl, 'maven-metadata.xml');\n const metadataXmlResult = await downloadMavenXml(this.http, metadataUrl);\n return metadataXmlResult\n .transform(({ data: metadata }) => extractVersions(metadata))\n .onError((err) => {\n logger.debug(\n `Maven: error fetching versions for \"${dependency.display}\": ${err.type}`,\n );\n })\n .unwrapOr({});\n }\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const dependency = getDependencyParts(packageName);\n const repoUrl = ensureTrailingSlash(registryUrl);\n\n const isGradlePlugin =\n // groupId\n packageName.includes('.gradle.plugin:') ||\n // artifactId\n packageName.endsWith('.gradle.plugin');\n if (\n isGradlePlugin &&\n MAVEN_CENTRAL_URLS.some((url) => repoUrl === ensureTrailingSlash(url))\n ) {\n logger.debug(\n `Maven: skipping Maven Central for suspected Gradle plugin \"${packageName}\"`,\n );\n return null;\n }\n\n logger.debug(`Looking up ${dependency.display} in repository ${repoUrl}`);\n\n const metadata = await this.fetchVersionsFromMetadata(dependency, repoUrl);\n if (!metadata.versions?.length) {\n return null;\n }\n const releases = metadata.versions.map((version) => ({ version }));\n\n logger.debug(\n `Found ${releases.length} new releases for ${dependency.display} in repository ${repoUrl}`,\n );\n\n const latestSuitableVersion = getLatestSuitableVersion(releases);\n const dependencyInfo =\n latestSuitableVersion &&\n (await getDependencyInfo(\n this.http,\n dependency,\n repoUrl,\n latestSuitableVersion,\n ));\n\n const result: ReleaseResult = {\n ...dependency,\n ...dependencyInfo,\n releases,\n };\n if (metadata.tags) {\n result.tags = metadata.tags;\n if (result.tags.latest) {\n logger.debug(`Setting respectLatest=false for maven ${packageName}`);\n result.respectLatest = false;\n }\n }\n\n if (!this.getDefaultRegistryUrls('').includes(registryUrl)) {\n result.isPrivate = true;\n }\n\n return result;\n }\n\n override async postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n const { version, versionOrig } = release;\n const cacheKey = buildCacheKey(\n 'postprocessRelease',\n registryUrl,\n packageName,\n versionOrig,\n version,\n );\n const cachedResult = await packageCache.get<PostprocessReleaseResult>(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n );\n\n /* v8 ignore if: hard to test */\n if (cachedResult) {\n return cachedResult;\n }\n\n if (!packageName || !registryUrl) {\n return release;\n }\n\n const dependency = getDependencyParts(packageName);\n\n const pomUrl = await createUrlForDependencyPom(\n this.http,\n release.versionOrig ?? release.version,\n dependency,\n registryUrl,\n );\n\n const artifactUrl = getMavenUrl(dependency, registryUrl, pomUrl);\n const fetchResult = await downloadMaven(this.http, artifactUrl);\n const { val, err } = fetchResult.unwrap();\n\n if (err) {\n const result: PostprocessReleaseResult =\n err.type === 'not-found' ? 'reject' : release;\n if (result === 'reject') {\n await packageCache.set(\n 'datasource-maven:postprocess-reject',\n cacheKey,\n result,\n 24 * 60,\n );\n }\n return result;\n }\n\n if (val.lastModified) {\n release.releaseTimestamp = asTimestamp(val.lastModified);\n }\n\n return release;\n }\n}\n"],"mappings":"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"}
@@ -2,6 +2,7 @@ import "../../../constants/error-messages.js";
2
2
  import { regEx } from "../../../util/regex.js";
3
3
  import { logger } from "../../../logger/index.js";
4
4
  import { ensureTrailingSlash, isHttpUrl } from "../../../util/url.js";
5
+ import { isForbidden, isNotFound, isRateLimited, isRateLimitedOrServerError, isUnauthorized } from "../../../util/http/status.js";
5
6
  import { ExternalHostError } from "../../../types/errors/external-host-error.js";
6
7
  import { get, getCacheType, set } from "../../../util/cache/package/index.js";
7
8
  import { RequestError } from "../../../util/http/got.js";
@@ -21,21 +22,16 @@ import { XmlDocument } from "xmldoc";
21
22
  // lib/modules/datasource/maven/util.ts
22
23
  function isTemporaryError(err) {
23
24
  if (err.code === "ECONNRESET") return true;
24
- if (err.response) {
25
- const status = err.response.statusCode;
26
- return status === 429 || status >= 500 && status < 600;
27
- }
28
- return false;
25
+ return isRateLimitedOrServerError(err);
29
26
  }
30
27
  function isHostError(err) {
31
28
  return err.code === "ETIMEDOUT";
32
29
  }
33
30
  function isNotFoundError(err) {
34
- return err.code === "ENOTFOUND" || err.response?.statusCode === 404;
31
+ return err.code === "ENOTFOUND" || isNotFound(err);
35
32
  }
36
33
  function isPermissionsIssue(err) {
37
- const status = err.response?.statusCode;
38
- return status === 401 || status === 403;
34
+ return isUnauthorized(err) || isForbidden(err);
39
35
  }
40
36
  function isConnectionError(err) {
41
37
  return err.code === "EAI_AGAIN" || err.code === "ERR_TLS_CERT_ALTNAME_INVALID" || err.code === "ECONNREFUSED";
@@ -118,7 +114,7 @@ async function downloadHttpProtocol(http, pkgUrl, opts = {}) {
118
114
  err
119
115
  }, "Temporary error");
120
116
  if (isMavenCentral(url)) {
121
- if (err?.response?.statusCode === 429) {
117
+ if (isRateLimited(err)) {
122
118
  if (getCacheType() === "redis") logger.once.warn({ failedUrl }, "Maven Central rate limiting detected despite Redis caching.");
123
119
  else logger.once.warn({ failedUrl }, "Maven Central rate limiting detected. Persistent caching required.");
124
120
  }
@@ -302,7 +298,8 @@ async function getDependencyInfo(http, dependency, repoUrl, version, recursionLi
302
298
  const groupId = pomContent.valueWithPath("groupId");
303
299
  if (groupId) result.packageScope = groupId;
304
300
  const parent = pomContent.childNamed("parent");
305
- if (recursionLimit > 0 && parent && (!result.sourceUrl || !result.homepage)) {
301
+ const isMissingInfo = !result.sourceUrl || !result.homepage;
302
+ if (recursionLimit > 0 && parent && isMissingInfo) {
306
303
  const [parentGroupId, parentArtifactId, parentVersion] = [
307
304
  "groupId",
308
305
  "artifactId",
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":["packageCache.get","HttpError","packageCache.set","packageCache.getCacheType"],"sources":["../../../../lib/modules/datasource/maven/util.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { GetObjectCommand } from '@aws-sdk/client-s3';\nimport { XmlDocument } from 'xmldoc';\nimport {\n HOST_BLOCKED,\n HOST_DISABLED,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider.ts';\nimport { type Http, HttpError } from '../../../util/http/index.ts';\nimport type { HttpOptions, HttpResponse } from '../../../util/http/types.ts';\nimport { refusedHostMessage } from '../../../util/http/util.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { getS3Client, parseS3Url } from '../../../util/s3.ts';\nimport { streamToString } from '../../../util/streams.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash, isHttpUrl } from '../../../util/url.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { isMavenCentral } from './common.ts';\nimport { CachedMavenXml } from './schema.ts';\nimport type {\n DependencyInfo,\n MavenDependency,\n MavenFetchResult,\n MavenFetchSuccess,\n} from './types.ts';\n\nfunction isTemporaryError(err: HttpError): boolean {\n if (err.code === 'ECONNRESET') {\n return true;\n }\n\n if (err.response) {\n const status = err.response.statusCode;\n return status === 429 || (status >= 500 && status < 600);\n }\n\n return false;\n}\n\nfunction isHostError(err: HttpError): boolean {\n return err.code === 'ETIMEDOUT';\n}\n\nfunction isNotFoundError(err: HttpError): boolean {\n return err.code === 'ENOTFOUND' || err.response?.statusCode === 404;\n}\n\nfunction isPermissionsIssue(err: HttpError): boolean {\n const status = err.response?.statusCode;\n return status === 401 || status === 403;\n}\n\nfunction isConnectionError(err: HttpError): boolean {\n return (\n err.code === 'EAI_AGAIN' ||\n err.code === 'ERR_TLS_CERT_ALTNAME_INVALID' ||\n err.code === 'ECONNREFUSED'\n );\n}\n\nfunction isUnsupportedHostError(err: HttpError): boolean {\n return err.name === 'UnsupportedProtocolError';\n}\n\nconst cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-maven:cache-provider',\n softTtlMinutes: 15,\n checkAuthorizationHeader: true,\n checkCacheControlHeader: false, // Maven doesn't respond with `cache-control` headers\n writeSchema: CachedMavenXml,\n});\n\n// Release POMs and timestamped snapshot POMs are immutable once published, so we can cache them much longer than mutable metadata files.\nconst pomCacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-maven:pom-cache-provider',\n softTtlMinutes: 60 * 24 * 28, // 28 days before we'll give it another check, just in case it's updated\n checkAuthorizationHeader: true,\n checkCacheControlHeader: false,\n writeSchema: CachedMavenXml,\n});\n\nfunction selectCacheProvider(url: string): PackageHttpCacheProvider {\n // Non-timestamped -SNAPSHOT.pom files are mutable; everything else ending in .pom (release POMs and timestamped snapshot POMs) is immutable.\n if (url.endsWith('.pom') && !url.endsWith('-SNAPSHOT.pom')) {\n return pomCacheProvider;\n }\n return cacheProvider;\n}\n\nconst METADATA_NOT_FOUND_NAMESPACE =\n 'datasource-maven:metadata-not-found' as const;\nconst METADATA_NOT_FOUND_TTL_MINUTES = 60 * 12; // 12 hours\n\n/** introduces jitter to make sure that a given repo's cache expiring doesn't lead to many requests leading to high traffic and/or rate limits */\nfunction getMetadataNotFoundTtl(): number {\n const jitter = Math.floor(Math.random() * 60 * 2); // 0–120 minutes\n return METADATA_NOT_FOUND_TTL_MINUTES + jitter;\n}\n\nfunction isMetadataUrl(url: string): boolean {\n return url.endsWith('/maven-metadata.xml');\n}\n\nexport async function downloadHttpProtocol(\n http: Http,\n pkgUrl: URL | string,\n opts: HttpOptions = {},\n): Promise<MavenFetchResult> {\n const url = pkgUrl.toString();\n\n if (isMetadataUrl(url)) {\n const cacheHasNotFoundResponse = await packageCache.get<true>(\n METADATA_NOT_FOUND_NAMESPACE,\n url,\n );\n if (cacheHasNotFoundResponse) {\n logger.trace(\n { url },\n 'Returning cached 404 response for the metadata-metadata URL request',\n );\n return Result.err({ type: 'not-found' });\n }\n }\n\n const fetchResult = await Result.wrap<HttpResponse>(\n http.getText(url, { ...opts, cacheProvider: selectCacheProvider(url) }),\n )\n .transform((res): MavenFetchSuccess => {\n const result: MavenFetchSuccess = { data: res.body };\n\n if (!res.authorization) {\n result.isCacheable = true;\n }\n\n const lastModified = asTimestamp(res?.headers?.['last-modified']);\n if (lastModified) {\n result.lastModified = lastModified;\n }\n\n return result;\n })\n .catch(async (err): Promise<MavenFetchResult> => {\n /* v8 ignore next: never happens, needs for type narrowing */\n if (!(err instanceof HttpError)) {\n return Result.err({ type: 'unknown', err });\n }\n\n const failedUrl = url;\n if ([HOST_BLOCKED, HOST_DISABLED].includes(err.message)) {\n logger.trace({ failedUrl }, refusedHostMessage(err));\n return Result.err({ type: 'host-disabled' });\n }\n\n if (isNotFoundError(err)) {\n logger.trace({ failedUrl }, `Url not found`);\n if (isMetadataUrl(failedUrl)) {\n await packageCache.set(\n METADATA_NOT_FOUND_NAMESPACE,\n failedUrl,\n true,\n getMetadataNotFoundTtl(),\n );\n }\n return Result.err({ type: 'not-found' });\n }\n\n if (isHostError(err)) {\n logger.debug(`Cannot connect to host ${failedUrl}`);\n return Result.err({ type: 'host-error' });\n }\n\n if (isPermissionsIssue(err)) {\n logger.debug(\n `Dependency lookup unauthorized. Please add authentication with a hostRule for ${failedUrl}`,\n );\n return Result.err({ type: 'permission-issue' });\n }\n\n if (isTemporaryError(err)) {\n logger.debug({ failedUrl, err }, 'Temporary error');\n\n if (isMavenCentral(url)) {\n const statusCode = err?.response?.statusCode;\n if (statusCode === 429) {\n if (packageCache.getCacheType() === 'redis') {\n logger.once.warn(\n { failedUrl },\n 'Maven Central rate limiting detected despite Redis caching.',\n );\n } else {\n logger.once.warn(\n { failedUrl },\n 'Maven Central rate limiting detected. Persistent caching required.',\n );\n }\n }\n return Result.err({ type: 'maven-central-temporary-error', err });\n }\n return Result.err({ type: 'temporary-error' });\n }\n\n if (isConnectionError(err)) {\n logger.debug(`Connection refused to maven registry ${failedUrl}`);\n return Result.err({ type: 'connection-error' });\n }\n\n if (isUnsupportedHostError(err)) {\n logger.debug(`Unsupported host ${failedUrl}`);\n return Result.err({ type: 'unsupported-host' });\n }\n\n logger.info({ failedUrl, err }, 'Unknown HTTP download error');\n return Result.err({ type: 'unknown', err });\n });\n\n const { err } = fetchResult.unwrap();\n if (err?.type === 'maven-central-temporary-error') {\n throw new ExternalHostError(err.err);\n }\n\n return fetchResult;\n}\n\nexport async function downloadHttpContent(\n http: Http,\n pkgUrl: URL | string,\n opts: HttpOptions = {},\n): Promise<string | null> {\n const fetchResult = await downloadHttpProtocol(http, pkgUrl, opts);\n return fetchResult.transform(({ data }) => data).unwrapOrNull();\n}\n\nfunction isS3NotFound(err: Error): boolean {\n return err.message === 'NotFound' || err.message === 'NoSuchKey';\n}\n\nexport async function downloadS3Protocol(\n pkgUrl: URL,\n): Promise<MavenFetchResult> {\n logger.trace({ url: pkgUrl.toString() }, `Attempting to load S3 dependency`);\n\n const s3Url = parseS3Url(pkgUrl);\n if (!s3Url) {\n return Result.err({ type: 'invalid-url' });\n }\n\n return await Result.wrap(() => {\n const command = new GetObjectCommand(s3Url);\n const client = getS3Client();\n return client.send(command);\n })\n .transform(\n async ({\n Body,\n LastModified,\n DeleteMarker,\n }): Promise<MavenFetchResult> => {\n if (DeleteMarker) {\n logger.trace(\n { failedUrl: pkgUrl.toString() },\n 'Maven S3 lookup error: DeleteMarker encountered',\n );\n return Result.err({ type: 'not-found' });\n }\n\n if (!(Body instanceof Readable)) {\n logger.debug(\n { failedUrl: pkgUrl.toString() },\n 'Maven S3 lookup error: unsupported Body type',\n );\n return Result.err({ type: 'unsupported-format' });\n }\n\n const data = await streamToString(Body);\n const result: MavenFetchSuccess = { data };\n\n const lastModified = asTimestamp(LastModified);\n if (lastModified) {\n result.lastModified = lastModified;\n }\n\n return Result.ok(result);\n },\n )\n .catch((err): MavenFetchResult => {\n if (!(err instanceof Error)) {\n return Result.err(err);\n }\n\n const failedUrl = pkgUrl.toString();\n\n if (err.name === 'CredentialsProviderError') {\n logger.debug(\n { failedUrl },\n 'Maven S3 lookup error: credentials provider error, check \"AWS_ACCESS_KEY_ID\" and \"AWS_SECRET_ACCESS_KEY\" variables',\n );\n return Result.err({ type: 'credentials-error' });\n }\n\n if (err.message === 'Region is missing') {\n logger.debug(\n { failedUrl },\n 'Maven S3 lookup error: missing region, check \"AWS_REGION\" variable',\n );\n return Result.err({ type: 'missing-aws-region' });\n }\n\n if (isS3NotFound(err)) {\n logger.trace({ failedUrl }, 'Maven S3 lookup error: object not found');\n return Result.err({ type: 'not-found' });\n }\n\n logger.debug({ failedUrl, err }, 'Maven S3 lookup error: unknown error');\n return Result.err({ type: 'unknown', err });\n });\n}\n\nexport async function downloadArtifactRegistryProtocol(\n http: Http,\n pkgUrl: URL,\n): Promise<MavenFetchResult> {\n const opts: HttpOptions = {};\n const host = pkgUrl.host;\n const path = pkgUrl.pathname;\n\n logger.trace({ host, path }, `Using google auth for Maven repository`);\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { host, path },\n 'Could not get Google access token, using no auth',\n );\n }\n\n const url = pkgUrl.toString().replace('artifactregistry:', 'https:');\n\n return downloadHttpProtocol(http, url, opts);\n}\n\nfunction containsPlaceholder(str: string): boolean {\n return regEx(/\\${.*?}/g).test(str);\n}\n\nfunction removeKnownPlaceholders(str: string): string {\n return str.replace(regEx(/\\/tree\\/\\${[^}]+}/), '');\n}\n\nexport function getMavenUrl(\n dependency: MavenDependency,\n repoUrl: string,\n path: string,\n): URL {\n return new URL(\n `${dependency.dependencyUrl}/${path}`,\n ensureTrailingSlash(repoUrl),\n );\n}\n\nexport async function downloadMaven(\n http: Http,\n url: URL,\n): Promise<MavenFetchResult> {\n const protocol = url.protocol;\n\n let result: MavenFetchResult = Result.err({ type: 'unsupported-protocol' });\n\n if (isHttpUrl(url)) {\n result = await downloadHttpProtocol(http, url);\n }\n\n if (protocol === 'artifactregistry:') {\n result = await downloadArtifactRegistryProtocol(http, url);\n }\n\n if (protocol === 's3:') {\n result = await downloadS3Protocol(url);\n }\n\n return result.onError((err) => {\n if (err.type === 'unsupported-protocol') {\n logger.debug(\n { url: url.toString() },\n `Maven lookup error: unsupported protocol (${protocol})`,\n );\n }\n });\n}\n\nexport async function downloadMavenXml(\n http: Http,\n url: URL,\n): Promise<MavenFetchResult<XmlDocument>> {\n const rawResult = await downloadMaven(http, url);\n return rawResult.transform((result): MavenFetchResult<XmlDocument> => {\n try {\n return Result.ok({\n ...result,\n data: new XmlDocument(result.data),\n });\n } catch (err) {\n return Result.err({ type: 'xml-parse-error', err });\n }\n });\n}\n\nexport function getDependencyParts(packageName: string): MavenDependency {\n const [group, name] = packageName.split(':');\n const dependencyUrl = `${group.replace(regEx(/\\./g), '/')}/${name}`;\n return {\n display: packageName,\n group,\n name,\n dependencyUrl,\n };\n}\n\nfunction extractSnapshotVersion(metadata: XmlDocument): string | null {\n // Parse the maven-metadata.xml for the snapshot version and determine\n // the fixed version of the latest deployed snapshot.\n // The metadata descriptor can be found at\n // https://maven.apache.org/ref/3.3.3/maven-repository-metadata/repository-metadata.html\n //\n // Basically, we need to replace -SNAPSHOT with the artifact timestanp & build number,\n // so for example 1.0.0-SNAPSHOT will become 1.0.0-<timestamp>-<buildNumber>\n const version = metadata\n .descendantWithPath('version')\n ?.val?.replace('-SNAPSHOT', '');\n\n const snapshot = metadata.descendantWithPath('versioning.snapshot');\n const timestamp = snapshot?.childNamed('timestamp')?.val;\n const build = snapshot?.childNamed('buildNumber')?.val;\n\n // If we weren't able to parse out the required 3 version elements,\n // return null because we can't determine the fixed version of the latest snapshot.\n if (!version || !timestamp || !build) {\n return null;\n }\n return `${version}-${timestamp}-${build}`;\n}\n\nasync function getSnapshotFullVersion(\n http: Http,\n version: string,\n dependency: MavenDependency,\n repoUrl: string,\n): Promise<string | null> {\n // To determine what actual files are available for the snapshot, first we have to fetch and parse\n // the metadata located at http://<repo>/<group>/<artifact>/<version-SNAPSHOT>/maven-metadata.xml\n const metadataUrl = getMavenUrl(\n dependency,\n repoUrl,\n `${version}/maven-metadata.xml`,\n );\n\n const metadataXmlResult = await downloadMavenXml(http, metadataUrl);\n\n return metadataXmlResult\n .transform(({ data }) =>\n Result.wrapNullable(extractSnapshotVersion(data), {\n type: 'snapshot-extract-error',\n }),\n )\n .unwrapOrNull();\n}\n\nfunction isSnapshotVersion(version: string): boolean {\n if (version.endsWith('-SNAPSHOT')) {\n return true;\n }\n return false;\n}\n\nexport async function createUrlForDependencyPom(\n http: Http,\n version: string,\n dependency: MavenDependency,\n repoUrl: string,\n): Promise<string> {\n if (isSnapshotVersion(version)) {\n // By default, Maven snapshots are deployed to the repository with fixed file names.\n // Resolve the full, actual pom file name for the version.\n const fullVersion = await getSnapshotFullVersion(\n http,\n version,\n dependency,\n repoUrl,\n );\n\n // If we were able to resolve the version, use that, otherwise fall back to using -SNAPSHOT\n if (fullVersion !== null) {\n // TODO: types (#22198)\n return `${version}/${dependency.name}-${fullVersion}.pom`;\n }\n }\n\n // TODO: types (#22198)\n return `${version}/${dependency.name}-${version}.pom`;\n}\n\nexport async function getDependencyInfo(\n http: Http,\n dependency: MavenDependency,\n repoUrl: string,\n version: string,\n recursionLimit = 5,\n): Promise<DependencyInfo> {\n const path = await createUrlForDependencyPom(\n http,\n version,\n dependency,\n repoUrl,\n );\n\n const pomUrl = getMavenUrl(dependency, repoUrl, path);\n const pomXmlResult = await downloadMavenXml(http, pomUrl);\n const dependencyInfoResult = await pomXmlResult.transform(\n async ({ data: pomContent }) => {\n const result: DependencyInfo = {};\n\n const homepage = pomContent.valueWithPath('url');\n if (homepage && !containsPlaceholder(homepage)) {\n result.homepage = homepage;\n }\n\n const sourceUrl = pomContent.valueWithPath('scm.url');\n if (\n sourceUrl &&\n !containsPlaceholder(removeKnownPlaceholders(sourceUrl))\n ) {\n result.sourceUrl = sourceUrl\n .replace(regEx(/^scm:/), '')\n .replace(regEx(/^git:/), '')\n .replace(regEx(/^git@github.com:/), 'https://github.com/')\n .replace(regEx(/^git@github.com\\//), 'https://github.com/');\n\n if (result.sourceUrl.startsWith('//')) {\n // most likely the result of us stripping scm:, git: etc\n // going with prepending https: here which should result in potential information retrival\n result.sourceUrl = `https:${result.sourceUrl}`;\n }\n }\n\n const relocation = pomContent.descendantWithPath(\n 'distributionManagement.relocation',\n );\n if (relocation) {\n const relocationGroup =\n relocation.valueWithPath('groupId') ?? dependency.group;\n const relocationName =\n relocation.valueWithPath('artifactId') ?? dependency.name;\n result.replacementName = `${relocationGroup}:${relocationName}`;\n const relocationVersion = relocation.valueWithPath('version');\n result.replacementVersion = relocationVersion ?? version;\n const relocationMessage = relocation.valueWithPath('message');\n if (relocationMessage) {\n result.deprecationMessage = relocationMessage;\n }\n }\n\n const groupId = pomContent.valueWithPath('groupId');\n if (groupId) {\n result.packageScope = groupId;\n }\n\n const parent = pomContent.childNamed('parent');\n if (\n recursionLimit > 0 &&\n parent &&\n (!result.sourceUrl || !result.homepage)\n ) {\n // if we found a parent and are missing some information\n // trying to get the scm/homepage information from it\n const [parentGroupId, parentArtifactId, parentVersion] = [\n 'groupId',\n 'artifactId',\n 'version',\n ].map((k) => parent.valueWithPath(k)?.replace(regEx(/\\s+/g), ''));\n if (parentGroupId && parentArtifactId && parentVersion) {\n const parentDisplayId = `${parentGroupId}:${parentArtifactId}`;\n const parentDependency = getDependencyParts(parentDisplayId);\n const parentInformation = await getDependencyInfo(\n http,\n parentDependency,\n repoUrl,\n parentVersion,\n recursionLimit - 1,\n );\n if (!result.sourceUrl && parentInformation.sourceUrl) {\n result.sourceUrl = parentInformation.sourceUrl;\n }\n if (!result.homepage && parentInformation.homepage) {\n result.homepage = parentInformation.homepage;\n }\n }\n }\n\n return result;\n },\n );\n\n return dependencyInfoResult.unwrapOr({});\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"util.js","names":["packageCache.get","HttpError","packageCache.set","packageCache.getCacheType"],"sources":["../../../../lib/modules/datasource/maven/util.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { GetObjectCommand } from '@aws-sdk/client-s3';\nimport { XmlDocument } from 'xmldoc';\nimport {\n HOST_BLOCKED,\n HOST_DISABLED,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { PackageHttpCacheProvider } from '../../../util/http/cache/package-http-cache-provider.ts';\nimport { type Http, HttpError } from '../../../util/http/index.ts';\nimport {\n isForbidden,\n isNotFound,\n isRateLimited,\n isRateLimitedOrServerError,\n isUnauthorized,\n} from '../../../util/http/status.ts';\nimport type { HttpOptions, HttpResponse } from '../../../util/http/types.ts';\nimport { refusedHostMessage } from '../../../util/http/util.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { getS3Client, parseS3Url } from '../../../util/s3.ts';\nimport { streamToString } from '../../../util/streams.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash, isHttpUrl } from '../../../util/url.ts';\nimport { getGoogleAuthToken } from '../util.ts';\nimport { isMavenCentral } from './common.ts';\nimport { CachedMavenXml } from './schema.ts';\nimport type {\n DependencyInfo,\n MavenDependency,\n MavenFetchResult,\n MavenFetchSuccess,\n} from './types.ts';\n\nfunction isTemporaryError(err: HttpError): boolean {\n if (err.code === 'ECONNRESET') {\n return true;\n }\n\n return isRateLimitedOrServerError(err);\n}\n\nfunction isHostError(err: HttpError): boolean {\n return err.code === 'ETIMEDOUT';\n}\n\nfunction isNotFoundError(err: HttpError): boolean {\n return err.code === 'ENOTFOUND' || isNotFound(err);\n}\n\nfunction isPermissionsIssue(err: HttpError): boolean {\n return isUnauthorized(err) || isForbidden(err);\n}\n\nfunction isConnectionError(err: HttpError): boolean {\n return (\n err.code === 'EAI_AGAIN' ||\n err.code === 'ERR_TLS_CERT_ALTNAME_INVALID' ||\n err.code === 'ECONNREFUSED'\n );\n}\n\nfunction isUnsupportedHostError(err: HttpError): boolean {\n return err.name === 'UnsupportedProtocolError';\n}\n\nconst cacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-maven:cache-provider',\n softTtlMinutes: 15,\n checkAuthorizationHeader: true,\n checkCacheControlHeader: false, // Maven doesn't respond with `cache-control` headers\n writeSchema: CachedMavenXml,\n});\n\n// Release POMs and timestamped snapshot POMs are immutable once published, so we can cache them much longer than mutable metadata files.\nconst pomCacheProvider = new PackageHttpCacheProvider({\n namespace: 'datasource-maven:pom-cache-provider',\n softTtlMinutes: 60 * 24 * 28, // 28 days before we'll give it another check, just in case it's updated\n checkAuthorizationHeader: true,\n checkCacheControlHeader: false,\n writeSchema: CachedMavenXml,\n});\n\nfunction selectCacheProvider(url: string): PackageHttpCacheProvider {\n // Non-timestamped -SNAPSHOT.pom files are mutable; everything else ending in .pom (release POMs and timestamped snapshot POMs) is immutable.\n if (url.endsWith('.pom') && !url.endsWith('-SNAPSHOT.pom')) {\n return pomCacheProvider;\n }\n return cacheProvider;\n}\n\nconst METADATA_NOT_FOUND_NAMESPACE =\n 'datasource-maven:metadata-not-found' as const;\nconst METADATA_NOT_FOUND_TTL_MINUTES = 60 * 12; // 12 hours\n\n/** introduces jitter to make sure that a given repo's cache expiring doesn't lead to many requests leading to high traffic and/or rate limits */\nfunction getMetadataNotFoundTtl(): number {\n const jitter = Math.floor(Math.random() * 60 * 2); // 0–120 minutes\n return METADATA_NOT_FOUND_TTL_MINUTES + jitter;\n}\n\nfunction isMetadataUrl(url: string): boolean {\n return url.endsWith('/maven-metadata.xml');\n}\n\nexport async function downloadHttpProtocol(\n http: Http,\n pkgUrl: URL | string,\n opts: HttpOptions = {},\n): Promise<MavenFetchResult> {\n const url = pkgUrl.toString();\n\n if (isMetadataUrl(url)) {\n const cacheHasNotFoundResponse = await packageCache.get<true>(\n METADATA_NOT_FOUND_NAMESPACE,\n url,\n );\n if (cacheHasNotFoundResponse) {\n logger.trace(\n { url },\n 'Returning cached 404 response for the metadata-metadata URL request',\n );\n return Result.err({ type: 'not-found' });\n }\n }\n\n const fetchResult = await Result.wrap<HttpResponse>(\n http.getText(url, { ...opts, cacheProvider: selectCacheProvider(url) }),\n )\n .transform((res): MavenFetchSuccess => {\n const result: MavenFetchSuccess = { data: res.body };\n\n if (!res.authorization) {\n result.isCacheable = true;\n }\n\n const lastModified = asTimestamp(res?.headers?.['last-modified']);\n if (lastModified) {\n result.lastModified = lastModified;\n }\n\n return result;\n })\n .catch(async (err): Promise<MavenFetchResult> => {\n /* v8 ignore next: never happens, needs for type narrowing */\n if (!(err instanceof HttpError)) {\n return Result.err({ type: 'unknown', err });\n }\n\n const failedUrl = url;\n if ([HOST_BLOCKED, HOST_DISABLED].includes(err.message)) {\n logger.trace({ failedUrl }, refusedHostMessage(err));\n return Result.err({ type: 'host-disabled' });\n }\n\n if (isNotFoundError(err)) {\n logger.trace({ failedUrl }, `Url not found`);\n if (isMetadataUrl(failedUrl)) {\n await packageCache.set(\n METADATA_NOT_FOUND_NAMESPACE,\n failedUrl,\n true,\n getMetadataNotFoundTtl(),\n );\n }\n return Result.err({ type: 'not-found' });\n }\n\n if (isHostError(err)) {\n logger.debug(`Cannot connect to host ${failedUrl}`);\n return Result.err({ type: 'host-error' });\n }\n\n if (isPermissionsIssue(err)) {\n logger.debug(\n `Dependency lookup unauthorized. Please add authentication with a hostRule for ${failedUrl}`,\n );\n return Result.err({ type: 'permission-issue' });\n }\n\n if (isTemporaryError(err)) {\n logger.debug({ failedUrl, err }, 'Temporary error');\n\n if (isMavenCentral(url)) {\n if (isRateLimited(err)) {\n if (packageCache.getCacheType() === 'redis') {\n logger.once.warn(\n { failedUrl },\n 'Maven Central rate limiting detected despite Redis caching.',\n );\n } else {\n logger.once.warn(\n { failedUrl },\n 'Maven Central rate limiting detected. Persistent caching required.',\n );\n }\n }\n return Result.err({ type: 'maven-central-temporary-error', err });\n }\n return Result.err({ type: 'temporary-error' });\n }\n\n if (isConnectionError(err)) {\n logger.debug(`Connection refused to maven registry ${failedUrl}`);\n return Result.err({ type: 'connection-error' });\n }\n\n if (isUnsupportedHostError(err)) {\n logger.debug(`Unsupported host ${failedUrl}`);\n return Result.err({ type: 'unsupported-host' });\n }\n\n logger.info({ failedUrl, err }, 'Unknown HTTP download error');\n return Result.err({ type: 'unknown', err });\n });\n\n const { err } = fetchResult.unwrap();\n if (err?.type === 'maven-central-temporary-error') {\n throw new ExternalHostError(err.err);\n }\n\n return fetchResult;\n}\n\nexport async function downloadHttpContent(\n http: Http,\n pkgUrl: URL | string,\n opts: HttpOptions = {},\n): Promise<string | null> {\n const fetchResult = await downloadHttpProtocol(http, pkgUrl, opts);\n return fetchResult.transform(({ data }) => data).unwrapOrNull();\n}\n\nfunction isS3NotFound(err: Error): boolean {\n return err.message === 'NotFound' || err.message === 'NoSuchKey';\n}\n\nexport async function downloadS3Protocol(\n pkgUrl: URL,\n): Promise<MavenFetchResult> {\n logger.trace({ url: pkgUrl.toString() }, `Attempting to load S3 dependency`);\n\n const s3Url = parseS3Url(pkgUrl);\n if (!s3Url) {\n return Result.err({ type: 'invalid-url' });\n }\n\n return await Result.wrap(() => {\n const command = new GetObjectCommand(s3Url);\n const client = getS3Client();\n return client.send(command);\n })\n .transform(\n async ({\n Body,\n LastModified,\n DeleteMarker,\n }): Promise<MavenFetchResult> => {\n if (DeleteMarker) {\n logger.trace(\n { failedUrl: pkgUrl.toString() },\n 'Maven S3 lookup error: DeleteMarker encountered',\n );\n return Result.err({ type: 'not-found' });\n }\n\n if (!(Body instanceof Readable)) {\n logger.debug(\n { failedUrl: pkgUrl.toString() },\n 'Maven S3 lookup error: unsupported Body type',\n );\n return Result.err({ type: 'unsupported-format' });\n }\n\n const data = await streamToString(Body);\n const result: MavenFetchSuccess = { data };\n\n const lastModified = asTimestamp(LastModified);\n if (lastModified) {\n result.lastModified = lastModified;\n }\n\n return Result.ok(result);\n },\n )\n .catch((err): MavenFetchResult => {\n if (!(err instanceof Error)) {\n return Result.err(err);\n }\n\n const failedUrl = pkgUrl.toString();\n\n if (err.name === 'CredentialsProviderError') {\n logger.debug(\n { failedUrl },\n 'Maven S3 lookup error: credentials provider error, check \"AWS_ACCESS_KEY_ID\" and \"AWS_SECRET_ACCESS_KEY\" variables',\n );\n return Result.err({ type: 'credentials-error' });\n }\n\n if (err.message === 'Region is missing') {\n logger.debug(\n { failedUrl },\n 'Maven S3 lookup error: missing region, check \"AWS_REGION\" variable',\n );\n return Result.err({ type: 'missing-aws-region' });\n }\n\n if (isS3NotFound(err)) {\n logger.trace({ failedUrl }, 'Maven S3 lookup error: object not found');\n return Result.err({ type: 'not-found' });\n }\n\n logger.debug({ failedUrl, err }, 'Maven S3 lookup error: unknown error');\n return Result.err({ type: 'unknown', err });\n });\n}\n\nexport async function downloadArtifactRegistryProtocol(\n http: Http,\n pkgUrl: URL,\n): Promise<MavenFetchResult> {\n const opts: HttpOptions = {};\n const host = pkgUrl.host;\n const path = pkgUrl.pathname;\n\n logger.trace({ host, path }, `Using google auth for Maven repository`);\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { host, path },\n 'Could not get Google access token, using no auth',\n );\n }\n\n const url = pkgUrl.toString().replace('artifactregistry:', 'https:');\n\n return downloadHttpProtocol(http, url, opts);\n}\n\nfunction containsPlaceholder(str: string): boolean {\n return regEx(/\\${.*?}/g).test(str);\n}\n\nfunction removeKnownPlaceholders(str: string): string {\n return str.replace(regEx(/\\/tree\\/\\${[^}]+}/), '');\n}\n\nexport function getMavenUrl(\n dependency: MavenDependency,\n repoUrl: string,\n path: string,\n): URL {\n return new URL(\n `${dependency.dependencyUrl}/${path}`,\n ensureTrailingSlash(repoUrl),\n );\n}\n\nexport async function downloadMaven(\n http: Http,\n url: URL,\n): Promise<MavenFetchResult> {\n const protocol = url.protocol;\n\n let result: MavenFetchResult = Result.err({ type: 'unsupported-protocol' });\n\n if (isHttpUrl(url)) {\n result = await downloadHttpProtocol(http, url);\n }\n\n if (protocol === 'artifactregistry:') {\n result = await downloadArtifactRegistryProtocol(http, url);\n }\n\n if (protocol === 's3:') {\n result = await downloadS3Protocol(url);\n }\n\n return result.onError((err) => {\n if (err.type === 'unsupported-protocol') {\n logger.debug(\n { url: url.toString() },\n `Maven lookup error: unsupported protocol (${protocol})`,\n );\n }\n });\n}\n\nexport async function downloadMavenXml(\n http: Http,\n url: URL,\n): Promise<MavenFetchResult<XmlDocument>> {\n const rawResult = await downloadMaven(http, url);\n return rawResult.transform((result): MavenFetchResult<XmlDocument> => {\n try {\n return Result.ok({\n ...result,\n data: new XmlDocument(result.data),\n });\n } catch (err) {\n return Result.err({ type: 'xml-parse-error', err });\n }\n });\n}\n\nexport function getDependencyParts(packageName: string): MavenDependency {\n const [group, name] = packageName.split(':');\n const dependencyUrl = `${group.replace(regEx(/\\./g), '/')}/${name}`;\n return {\n display: packageName,\n group,\n name,\n dependencyUrl,\n };\n}\n\nfunction extractSnapshotVersion(metadata: XmlDocument): string | null {\n // Parse the maven-metadata.xml for the snapshot version and determine\n // the fixed version of the latest deployed snapshot.\n // The metadata descriptor can be found at\n // https://maven.apache.org/ref/3.3.3/maven-repository-metadata/repository-metadata.html\n //\n // Basically, we need to replace -SNAPSHOT with the artifact timestanp & build number,\n // so for example 1.0.0-SNAPSHOT will become 1.0.0-<timestamp>-<buildNumber>\n const version = metadata\n .descendantWithPath('version')\n ?.val?.replace('-SNAPSHOT', '');\n\n const snapshot = metadata.descendantWithPath('versioning.snapshot');\n const timestamp = snapshot?.childNamed('timestamp')?.val;\n const build = snapshot?.childNamed('buildNumber')?.val;\n\n // If we weren't able to parse out the required 3 version elements,\n // return null because we can't determine the fixed version of the latest snapshot.\n if (!version || !timestamp || !build) {\n return null;\n }\n return `${version}-${timestamp}-${build}`;\n}\n\nasync function getSnapshotFullVersion(\n http: Http,\n version: string,\n dependency: MavenDependency,\n repoUrl: string,\n): Promise<string | null> {\n // To determine what actual files are available for the snapshot, first we have to fetch and parse\n // the metadata located at http://<repo>/<group>/<artifact>/<version-SNAPSHOT>/maven-metadata.xml\n const metadataUrl = getMavenUrl(\n dependency,\n repoUrl,\n `${version}/maven-metadata.xml`,\n );\n\n const metadataXmlResult = await downloadMavenXml(http, metadataUrl);\n\n return metadataXmlResult\n .transform(({ data }) =>\n Result.wrapNullable(extractSnapshotVersion(data), {\n type: 'snapshot-extract-error',\n }),\n )\n .unwrapOrNull();\n}\n\nfunction isSnapshotVersion(version: string): boolean {\n if (version.endsWith('-SNAPSHOT')) {\n return true;\n }\n return false;\n}\n\nexport async function createUrlForDependencyPom(\n http: Http,\n version: string,\n dependency: MavenDependency,\n repoUrl: string,\n): Promise<string> {\n if (isSnapshotVersion(version)) {\n // By default, Maven snapshots are deployed to the repository with fixed file names.\n // Resolve the full, actual pom file name for the version.\n const fullVersion = await getSnapshotFullVersion(\n http,\n version,\n dependency,\n repoUrl,\n );\n\n // If we were able to resolve the version, use that, otherwise fall back to using -SNAPSHOT\n if (fullVersion !== null) {\n // TODO: types (#22198)\n return `${version}/${dependency.name}-${fullVersion}.pom`;\n }\n }\n\n // TODO: types (#22198)\n return `${version}/${dependency.name}-${version}.pom`;\n}\n\nexport async function getDependencyInfo(\n http: Http,\n dependency: MavenDependency,\n repoUrl: string,\n version: string,\n recursionLimit = 5,\n): Promise<DependencyInfo> {\n const path = await createUrlForDependencyPom(\n http,\n version,\n dependency,\n repoUrl,\n );\n\n const pomUrl = getMavenUrl(dependency, repoUrl, path);\n const pomXmlResult = await downloadMavenXml(http, pomUrl);\n const dependencyInfoResult = await pomXmlResult.transform(\n async ({ data: pomContent }) => {\n const result: DependencyInfo = {};\n\n const homepage = pomContent.valueWithPath('url');\n if (homepage && !containsPlaceholder(homepage)) {\n result.homepage = homepage;\n }\n\n const sourceUrl = pomContent.valueWithPath('scm.url');\n if (\n sourceUrl &&\n !containsPlaceholder(removeKnownPlaceholders(sourceUrl))\n ) {\n result.sourceUrl = sourceUrl\n .replace(regEx(/^scm:/), '')\n .replace(regEx(/^git:/), '')\n .replace(regEx(/^git@github.com:/), 'https://github.com/')\n .replace(regEx(/^git@github.com\\//), 'https://github.com/');\n\n if (result.sourceUrl.startsWith('//')) {\n // most likely the result of us stripping scm:, git: etc\n // going with prepending https: here which should result in potential information retrival\n result.sourceUrl = `https:${result.sourceUrl}`;\n }\n }\n\n const relocation = pomContent.descendantWithPath(\n 'distributionManagement.relocation',\n );\n if (relocation) {\n const relocationGroup =\n relocation.valueWithPath('groupId') ?? dependency.group;\n const relocationName =\n relocation.valueWithPath('artifactId') ?? dependency.name;\n result.replacementName = `${relocationGroup}:${relocationName}`;\n const relocationVersion = relocation.valueWithPath('version');\n result.replacementVersion = relocationVersion ?? version;\n const relocationMessage = relocation.valueWithPath('message');\n if (relocationMessage) {\n result.deprecationMessage = relocationMessage;\n }\n }\n\n const groupId = pomContent.valueWithPath('groupId');\n if (groupId) {\n result.packageScope = groupId;\n }\n\n const parent = pomContent.childNamed('parent');\n const isMissingInfo = !result.sourceUrl || !result.homepage;\n if (recursionLimit > 0 && parent && isMissingInfo) {\n // if we found a parent and are missing some information\n // trying to get the scm/homepage information from it\n const [parentGroupId, parentArtifactId, parentVersion] = [\n 'groupId',\n 'artifactId',\n 'version',\n ].map((k) => parent.valueWithPath(k)?.replace(regEx(/\\s+/g), ''));\n if (parentGroupId && parentArtifactId && parentVersion) {\n const parentDisplayId = `${parentGroupId}:${parentArtifactId}`;\n const parentDependency = getDependencyParts(parentDisplayId);\n const parentInformation = await getDependencyInfo(\n http,\n parentDependency,\n repoUrl,\n parentVersion,\n recursionLimit - 1,\n );\n if (!result.sourceUrl && parentInformation.sourceUrl) {\n result.sourceUrl = parentInformation.sourceUrl;\n }\n if (!result.homepage && parentInformation.homepage) {\n result.homepage = parentInformation.homepage;\n }\n }\n }\n\n return result;\n },\n );\n\n return dependencyInfoResult.unwrapOr({});\n}\n"],"mappings":"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"}
@@ -5,9 +5,9 @@ import { fromBase64 } from "../../../util/string.js";
5
5
  import { logger } from "../../../logger/index.js";
6
6
  import { ensureTrailingSlash, isHttpUrl } from "../../../util/url.js";
7
7
  import { add } from "../../../util/host-rules.js";
8
+ import { Ini } from "../../../util/schema-utils/index.js";
8
9
  import { defaultRegistryUrl } from "./common.js";
9
10
  import { isNonEmptyString, isString } from "@sindresorhus/is";
10
- import ini from "ini";
11
11
  // lib/modules/datasource/npm/npmrc.ts
12
12
  let npmrc = {};
13
13
  let npmrcRaw = "";
@@ -95,7 +95,7 @@ function setNpmrc(input) {
95
95
  const existingNpmrc = npmrc;
96
96
  npmrcRaw = input;
97
97
  logger.debug("Setting npmrc");
98
- npmrc = ini.parse(input.replace(regEx(/\\n/g), "\n"));
98
+ npmrc = Ini.parse(input.replace(regEx(/\\n/g), "\n"));
99
99
  const exposeAllEnv = GlobalConfig.get("exposeAllEnv");
100
100
  for (const [key, val] of Object.entries(npmrc)) if (!exposeAllEnv && key.endsWith("registry") && isString(val) && val.includes("localhost")) {
101
101
  logger.debug({
@@ -1 +1 @@
1
- {"version":3,"file":"npmrc.js","names":["hostRules.add"],"sources":["../../../../lib/modules/datasource/npm/npmrc.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport ini from 'ini';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport type { PackageRule } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { HostRule } from '../../../types/index.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { ensureTrailingSlash, isHttpUrl } from '../../../util/url.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport type { NpmrcRules } from './types.ts';\n\nlet npmrc: Record<string, any> = {};\nlet npmrcRaw = '';\nlet packageRules: PackageRule[] = [];\n\nfunction envReplace(value: any, env = getEnv()): any {\n /* v8 ignore next -- TODO: add test */\n if (!isString(value)) {\n return value;\n }\n\n const ENV_EXPR = regEx(/(?<esc>\\\\*)\\$\\{(?<envVarName>[^}]+)\\}/g);\n\n return value.replace(ENV_EXPR, (match, _esc, envVarName) => {\n if (env[envVarName] === undefined) {\n logger.warn({ match }, 'Failed to replace env in config');\n throw new Error('env-replace');\n }\n return env[envVarName];\n });\n}\n\nexport function getMatchHostFromNpmrcHost(input: string): string {\n if (input.startsWith('//')) {\n const matchHost = input.replace('//', '');\n if (matchHost.includes('/')) {\n return `https://${matchHost}`;\n }\n return matchHost;\n }\n return input;\n}\n\nexport function convertNpmrcToRules(npmrc: Record<string, any>): NpmrcRules {\n const rules: NpmrcRules = {\n hostRules: [],\n packageRules: [],\n };\n // Generate hostRules\n const hostType = 'npm';\n const hosts: Record<string, HostRule> = {};\n for (const [key, value] of Object.entries(npmrc)) {\n if (!isNonEmptyString(value)) {\n continue;\n }\n const keyParts = key.split(':');\n const keyType = keyParts.pop();\n let matchHost = '';\n if (keyParts.length) {\n matchHost = getMatchHostFromNpmrcHost(keyParts.join(':'));\n }\n const rule: HostRule = hosts[matchHost] || {};\n if (keyType === '_authToken' || keyType === '_auth') {\n rule.token = value;\n if (keyType === '_auth') {\n rule.authType = 'Basic';\n }\n } else if (keyType === 'username') {\n rule.username = value;\n } else if (keyType === '_password') {\n rule.password = fromBase64(value);\n } else {\n continue; // don't add the rule\n }\n hosts[matchHost] = rule;\n }\n for (const [matchHost, rule] of Object.entries(hosts)) {\n const hostRule = { ...rule, hostType };\n if (matchHost) {\n hostRule.matchHost = matchHost;\n }\n rules.hostRules?.push(hostRule);\n }\n // Generate packageRules\n const matchDatasources = ['npm'];\n const { registry } = npmrc;\n // packageRules order matters, so look for a default registry first\n if (isNonEmptyString(registry)) {\n if (isHttpUrl(registry)) {\n // Default registry\n rules.packageRules?.push({\n matchDatasources,\n registryUrls: [registry],\n });\n } else {\n logger.warn({ registry }, 'Invalid npmrc registry= URL');\n }\n }\n // Now look for scoped registries\n for (const [key, value] of Object.entries(npmrc)) {\n if (!isNonEmptyString(value)) {\n continue;\n }\n const keyParts = key.split(':');\n const keyType = keyParts.pop();\n if (keyType === 'registry' && keyParts.length && isNonEmptyString(value)) {\n const scope = keyParts.join(':');\n if (isHttpUrl(value)) {\n rules.packageRules?.push({\n matchDatasources,\n matchPackageNames: [`${scope}/**`],\n registryUrls: [value],\n });\n } else {\n logger.warn({ scope, registry: value }, 'Invalid npmrc registry= URL');\n }\n }\n }\n return rules;\n}\n\nexport function setNpmrc(input?: string): void {\n if (input) {\n if (input === npmrcRaw) {\n return;\n }\n const existingNpmrc = npmrc;\n npmrcRaw = input;\n logger.debug('Setting npmrc');\n npmrc = ini.parse(input.replace(regEx(/\\\\n/g), '\\n'));\n const exposeAllEnv = GlobalConfig.get('exposeAllEnv');\n for (const [key, val] of Object.entries(npmrc)) {\n if (\n !exposeAllEnv &&\n key.endsWith('registry') &&\n isString(val) &&\n val.includes('localhost')\n ) {\n logger.debug(\n { key, val },\n 'Detected localhost registry - rejecting npmrc file',\n );\n npmrc = existingNpmrc;\n return;\n }\n }\n if (exposeAllEnv) {\n for (const key of Object.keys(npmrc)) {\n npmrc[key] = envReplace(npmrc[key]);\n }\n }\n const npmrcRules = convertNpmrcToRules(npmrc);\n if (npmrcRules.hostRules?.length) {\n npmrcRules.hostRules.forEach((hostRule) => hostRules.add(hostRule));\n }\n packageRules = npmrcRules.packageRules;\n } else {\n // `npmrc` starts as an object and is only ever reassigned to one, so it is\n // always truthy here\n logger.debug('Resetting npmrc');\n npmrc = {};\n npmrcRaw = '';\n packageRules = [];\n }\n}\n\nexport function resolveRegistryUrl(packageName: string): string {\n let registryUrl = defaultRegistryUrl;\n for (const rule of packageRules) {\n const { matchPackageNames, registryUrls } = rule;\n if (\n !matchPackageNames ||\n packageName.startsWith(matchPackageNames[0].replace(regEx(/\\*\\*$/), ''))\n ) {\n // TODO: fix types #22198\n registryUrl = registryUrls![0];\n }\n }\n return registryUrl;\n}\n\nexport function resolvePackageUrl(\n registryUrl: string,\n packageName: string,\n): string {\n return new URL(\n encodeURIComponent(packageName).replace(regEx(/^%40/), '@'),\n ensureTrailingSlash(registryUrl),\n ).href;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"npmrc.js","names":["hostRules.add"],"sources":["../../../../lib/modules/datasource/npm/npmrc.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport type { PackageRule } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { HostRule } from '../../../types/index.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Ini } from '../../../util/schema-utils/index.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { ensureTrailingSlash, isHttpUrl } from '../../../util/url.ts';\nimport { defaultRegistryUrl } from './common.ts';\nimport type { NpmrcRules } from './types.ts';\n\nlet npmrc: Record<string, any> = {};\nlet npmrcRaw = '';\nlet packageRules: PackageRule[] = [];\n\nfunction envReplace(value: any, env = getEnv()): any {\n /* v8 ignore next -- TODO: add test */\n if (!isString(value)) {\n return value;\n }\n\n const ENV_EXPR = regEx(/(?<esc>\\\\*)\\$\\{(?<envVarName>[^}]+)\\}/g);\n\n return value.replace(ENV_EXPR, (match, _esc, envVarName) => {\n if (env[envVarName] === undefined) {\n logger.warn({ match }, 'Failed to replace env in config');\n throw new Error('env-replace');\n }\n return env[envVarName];\n });\n}\n\nexport function getMatchHostFromNpmrcHost(input: string): string {\n if (input.startsWith('//')) {\n const matchHost = input.replace('//', '');\n if (matchHost.includes('/')) {\n return `https://${matchHost}`;\n }\n return matchHost;\n }\n return input;\n}\n\nexport function convertNpmrcToRules(npmrc: Record<string, any>): NpmrcRules {\n const rules: NpmrcRules = {\n hostRules: [],\n packageRules: [],\n };\n // Generate hostRules\n const hostType = 'npm';\n const hosts: Record<string, HostRule> = {};\n for (const [key, value] of Object.entries(npmrc)) {\n if (!isNonEmptyString(value)) {\n continue;\n }\n const keyParts = key.split(':');\n const keyType = keyParts.pop();\n let matchHost = '';\n if (keyParts.length) {\n matchHost = getMatchHostFromNpmrcHost(keyParts.join(':'));\n }\n const rule: HostRule = hosts[matchHost] || {};\n if (keyType === '_authToken' || keyType === '_auth') {\n rule.token = value;\n if (keyType === '_auth') {\n rule.authType = 'Basic';\n }\n } else if (keyType === 'username') {\n rule.username = value;\n } else if (keyType === '_password') {\n rule.password = fromBase64(value);\n } else {\n continue; // don't add the rule\n }\n hosts[matchHost] = rule;\n }\n for (const [matchHost, rule] of Object.entries(hosts)) {\n const hostRule = { ...rule, hostType };\n if (matchHost) {\n hostRule.matchHost = matchHost;\n }\n rules.hostRules?.push(hostRule);\n }\n // Generate packageRules\n const matchDatasources = ['npm'];\n const { registry } = npmrc;\n // packageRules order matters, so look for a default registry first\n if (isNonEmptyString(registry)) {\n if (isHttpUrl(registry)) {\n // Default registry\n rules.packageRules?.push({\n matchDatasources,\n registryUrls: [registry],\n });\n } else {\n logger.warn({ registry }, 'Invalid npmrc registry= URL');\n }\n }\n // Now look for scoped registries\n for (const [key, value] of Object.entries(npmrc)) {\n if (!isNonEmptyString(value)) {\n continue;\n }\n const keyParts = key.split(':');\n const keyType = keyParts.pop();\n if (keyType === 'registry' && keyParts.length && isNonEmptyString(value)) {\n const scope = keyParts.join(':');\n if (isHttpUrl(value)) {\n rules.packageRules?.push({\n matchDatasources,\n matchPackageNames: [`${scope}/**`],\n registryUrls: [value],\n });\n } else {\n logger.warn({ scope, registry: value }, 'Invalid npmrc registry= URL');\n }\n }\n }\n return rules;\n}\n\nexport function setNpmrc(input?: string): void {\n if (input) {\n if (input === npmrcRaw) {\n return;\n }\n const existingNpmrc = npmrc;\n npmrcRaw = input;\n logger.debug('Setting npmrc');\n npmrc = Ini.parse(input.replace(regEx(/\\\\n/g), '\\n'));\n const exposeAllEnv = GlobalConfig.get('exposeAllEnv');\n for (const [key, val] of Object.entries(npmrc)) {\n if (\n !exposeAllEnv &&\n key.endsWith('registry') &&\n isString(val) &&\n val.includes('localhost')\n ) {\n logger.debug(\n { key, val },\n 'Detected localhost registry - rejecting npmrc file',\n );\n npmrc = existingNpmrc;\n return;\n }\n }\n if (exposeAllEnv) {\n for (const key of Object.keys(npmrc)) {\n npmrc[key] = envReplace(npmrc[key]);\n }\n }\n const npmrcRules = convertNpmrcToRules(npmrc);\n if (npmrcRules.hostRules?.length) {\n npmrcRules.hostRules.forEach((hostRule) => hostRules.add(hostRule));\n }\n packageRules = npmrcRules.packageRules;\n } else {\n // `npmrc` starts as an object and is only ever reassigned to one, so it is\n // always truthy here\n logger.debug('Resetting npmrc');\n npmrc = {};\n npmrcRaw = '';\n packageRules = [];\n }\n}\n\nexport function resolveRegistryUrl(packageName: string): string {\n let registryUrl = defaultRegistryUrl;\n for (const rule of packageRules) {\n const { matchPackageNames, registryUrls } = rule;\n if (\n !matchPackageNames ||\n packageName.startsWith(matchPackageNames[0].replace(regEx(/\\*\\*$/), ''))\n ) {\n // TODO: fix types #22198\n registryUrl = registryUrls![0];\n }\n }\n return registryUrl;\n}\n\nexport function resolvePackageUrl(\n registryUrl: string,\n packageName: string,\n): string {\n return new URL(\n encodeURIComponent(packageName).replace(regEx(/^%40/), '@'),\n ensureTrailingSlash(registryUrl),\n ).href;\n}\n"],"mappings":";;;;;;;;;;;AAcA,IAAI,QAA6B,CAAC;AAClC,IAAI,WAAW;AACf,IAAI,eAA8B,CAAC;AAEnC,SAAS,WAAW,OAAY,MAAM,OAAO,GAAQ;;CAEnD,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO;CAGT,MAAM,WAAW,MAAM,wCAAwC;CAE/D,OAAO,MAAM,QAAQ,WAAW,OAAO,MAAM,eAAe;EAC1D,IAAI,IAAI,gBAAgB,KAAA,GAAW;GACjC,OAAO,KAAK,EAAE,MAAM,GAAG,iCAAiC;GACxD,MAAM,IAAI,MAAM,aAAa;EAC/B;EACA,OAAO,IAAI;CACb,CAAC;AACH;AAEA,SAAgB,0BAA0B,OAAuB;CAC/D,IAAI,MAAM,WAAW,IAAI,GAAG;EAC1B,MAAM,YAAY,MAAM,QAAQ,MAAM,EAAE;EACxC,IAAI,UAAU,SAAS,GAAG,GACxB,OAAO,WAAW;EAEpB,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAgB,oBAAoB,OAAwC;CAC1E,MAAM,QAAoB;EACxB,WAAW,CAAC;EACZ,cAAc,CAAC;CACjB;CAEA,MAAM,WAAW;CACjB,MAAM,QAAkC,CAAC;CACzC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,CAAC,iBAAiB,KAAK,GACzB;EAEF,MAAM,WAAW,IAAI,MAAM,GAAG;EAC9B,MAAM,UAAU,SAAS,IAAI;EAC7B,IAAI,YAAY;EAChB,IAAI,SAAS,QACX,YAAY,0BAA0B,SAAS,KAAK,GAAG,CAAC;EAE1D,MAAM,OAAiB,MAAM,cAAc,CAAC;EAC5C,IAAI,YAAY,gBAAgB,YAAY,SAAS;GACnD,KAAK,QAAQ;GACb,IAAI,YAAY,SACd,KAAK,WAAW;EAEpB,OAAO,IAAI,YAAY,YACrB,KAAK,WAAW;OACX,IAAI,YAAY,aACrB,KAAK,WAAW,WAAW,KAAK;OAEhC;EAEF,MAAM,aAAa;CACrB;CACA,KAAK,MAAM,CAAC,WAAW,SAAS,OAAO,QAAQ,KAAK,GAAG;EACrD,MAAM,WAAW;GAAE,GAAG;GAAM;EAAS;EACrC,IAAI,WACF,SAAS,YAAY;EAEvB,MAAM,WAAW,KAAK,QAAQ;CAChC;CAEA,MAAM,mBAAmB,CAAC,KAAK;CAC/B,MAAM,EAAE,aAAa;CAErB,IAAI,iBAAiB,QAAQ,GAAG;EAC9B,IAAI,UAAU,QAAQ,GAEpB,MAAM,cAAc,KAAK;GACvB;GACA,cAAc,CAAC,QAAQ;EACzB,CAAC;OAED,OAAO,KAAK,EAAE,SAAS,GAAG,6BAA6B;CAE3D;CAEA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,CAAC,iBAAiB,KAAK,GACzB;EAEF,MAAM,WAAW,IAAI,MAAM,GAAG;EAE9B,IADgB,SAAS,IACf,MAAM,cAAc,SAAS,UAAU,iBAAiB,KAAK,GAAG;GACxE,MAAM,QAAQ,SAAS,KAAK,GAAG;GAC/B,IAAI,UAAU,KAAK,GACjB,MAAM,cAAc,KAAK;IACvB;IACA,mBAAmB,CAAC,GAAG,MAAM,IAAI;IACjC,cAAc,CAAC,KAAK;GACtB,CAAC;QAED,OAAO,KAAK;IAAE;IAAO,UAAU;GAAM,GAAG,6BAA6B;EAEzE;CACF;CACA,OAAO;AACT;AAEA,SAAgB,SAAS,OAAsB;CAC7C,IAAI,OAAO;EACT,IAAI,UAAU,UACZ;EAEF,MAAM,gBAAgB;EACtB,WAAW;EACX,OAAO,MAAM,eAAe;EAC5B,QAAQ,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC;EACpD,MAAM,eAAe,aAAa,IAAI,cAAc;EACpD,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,KAAK,GAC3C,IACE,CAAC,gBACD,IAAI,SAAS,UAAU,KACvB,SAAS,GAAG,KACZ,IAAI,SAAS,WAAW,GACxB;GACA,OAAO,MACL;IAAE;IAAK;GAAI,GACX,oDACF;GACA,QAAQ;GACR;EACF;EAEF,IAAI,cACF,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,MAAM,OAAO,WAAW,MAAM,IAAI;EAGtC,MAAM,aAAa,oBAAoB,KAAK;EAC5C,IAAI,WAAW,WAAW,QACxB,WAAW,UAAU,SAAS,aAAaA,IAAc,QAAQ,CAAC;EAEpE,eAAe,WAAW;CAC5B,OAAO;EAGL,OAAO,MAAM,iBAAiB;EAC9B,QAAQ,CAAC;EACT,WAAW;EACX,eAAe,CAAC;CAClB;AACF;AAEA,SAAgB,mBAAmB,aAA6B;CAC9D,IAAI,cAAc;CAClB,KAAK,MAAM,QAAQ,cAAc;EAC/B,MAAM,EAAE,mBAAmB,iBAAiB;EAC5C,IACE,CAAC,qBACD,YAAY,WAAW,kBAAkB,EAAE,CAAC,QAAQ,MAAM,OAAO,GAAG,EAAE,CAAC,GAGvE,cAAc,aAAc;CAEhC;CACA,OAAO;AACT;AAEA,SAAgB,kBACd,aACA,aACQ;CACR,OAAO,IAAI,IACT,mBAAmB,WAAW,CAAC,CAAC,QAAQ,MAAM,MAAM,GAAG,GAAG,GAC1D,oBAAoB,WAAW,CACjC,CAAC,CAAC;AACJ"}
@@ -4,13 +4,12 @@ import { coerceArray } from "../../../util/array.js";
4
4
  import { logger } from "../../../logger/index.js";
5
5
  import { buildCacheKey } from "../../../util/cache/package/key.js";
6
6
  import { ensureTrailingSlash } from "../../../util/url.js";
7
+ import { isNotFound } from "../../../util/http/status.js";
7
8
  import { ExternalHostError } from "../../../types/errors/external-host-error.js";
8
9
  import { createCacheWriteStream, ensureCacheDir, pipeline, readCacheFile, rmCache } from "../../../util/fs/index.js";
9
10
  import { api } from "../../versioning/nuget/index.js";
10
11
  import { get, set } from "../../../util/cache/package/index.js";
11
12
  import { withCache } from "../../../util/cache/package/with-cache.js";
12
- import { RequestError } from "../../../util/http/got.js";
13
- import "../../../util/http/index.js";
14
13
  import { asTimestamp } from "../../../util/timestamp.js";
15
14
  import { all } from "../../../util/promises.js";
16
15
  import { memCacheProvider } from "../../../util/http/cache/memory-http-cache-provider.js";
@@ -122,8 +121,7 @@ var NugetV3Api = class NugetV3Api {
122
121
  const sourceUrl = nuspec.valueWithPath("metadata.repository@url");
123
122
  if (sourceUrl) dep.sourceUrl = massageUrl(sourceUrl);
124
123
  } catch (err) {
125
- /* v8 ignore else -- not easy testable with nock */
126
- if (err instanceof RequestError && err.response?.statusCode === 404) {
124
+ if (isNotFound(err)) {
127
125
  shouldTryNupkg = true;
128
126
  logger.debug({
129
127
  registryUrl,
@@ -143,7 +141,7 @@ var NugetV3Api = class NugetV3Api {
143
141
  } catch (err) {
144
142
  // istanbul ignore if: not easy testable with nock
145
143
  if (err instanceof ExternalHostError) throw err;
146
- if (err instanceof RequestError && err.response?.statusCode === 404) logger.debug({
144
+ if (isNotFound(err)) logger.debug({
147
145
  registryUrl,
148
146
  pkgName,
149
147
  pkgVersion: latestStable