renovate 39.176.3 → 40.0.0-next.1

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 (244) hide show
  1. package/dist/config/migrations/custom/package-rules-migration.js.map +1 -1
  2. package/dist/config/migrations/migrations-service.d.ts +2 -2
  3. package/dist/config/migrations/migrations-service.js.map +1 -1
  4. package/dist/config/migrations/types.d.ts +1 -3
  5. package/dist/config/migrations/types.js.map +1 -1
  6. package/dist/config/options/index.js +1 -1
  7. package/dist/config/options/index.js.map +1 -1
  8. package/dist/config/presets/internal/group.js +0 -1
  9. package/dist/config/presets/internal/group.js.map +1 -1
  10. package/dist/config/presets/types.d.ts +4 -4
  11. package/dist/config/presets/types.js.map +1 -1
  12. package/dist/config-validator.js.map +1 -1
  13. package/dist/logger/utils.js +4 -2
  14. package/dist/logger/utils.js.map +1 -1
  15. package/dist/modules/datasource/artifactory/index.js +1 -1
  16. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  17. package/dist/modules/datasource/conan/index.js +1 -1
  18. package/dist/modules/datasource/conan/index.js.map +1 -1
  19. package/dist/modules/datasource/crate/index.js.map +1 -1
  20. package/dist/modules/datasource/datasource.d.ts +1 -1
  21. package/dist/modules/datasource/datasource.js +3 -1
  22. package/dist/modules/datasource/datasource.js.map +1 -1
  23. package/dist/modules/datasource/deb/common.d.ts +3 -3
  24. package/dist/modules/datasource/deb/common.js.map +1 -1
  25. package/dist/modules/datasource/docker/ecr.js +1 -1
  26. package/dist/modules/datasource/docker/ecr.js.map +1 -1
  27. package/dist/modules/datasource/docker/index.js.map +1 -1
  28. package/dist/modules/datasource/hexpm-bob/index.js +1 -1
  29. package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
  30. package/dist/modules/datasource/nuget/v2.js +1 -1
  31. package/dist/modules/datasource/nuget/v2.js.map +1 -1
  32. package/dist/modules/datasource/pod/index.js +1 -2
  33. package/dist/modules/datasource/pod/index.js.map +1 -1
  34. package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
  35. package/dist/modules/datasource/sbt-plugin/index.js +1 -2
  36. package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
  37. package/dist/modules/manager/ansible-galaxy/collections-metadata.js +1 -2
  38. package/dist/modules/manager/ansible-galaxy/collections-metadata.js.map +1 -1
  39. package/dist/modules/manager/asdf/upgradeable-tooling.js +4 -4
  40. package/dist/modules/manager/asdf/upgradeable-tooling.js.map +1 -1
  41. package/dist/modules/manager/batect/extract.js.map +1 -1
  42. package/dist/modules/manager/bazel/artifacts.js +2 -2
  43. package/dist/modules/manager/bazel/artifacts.js.map +1 -1
  44. package/dist/modules/manager/bazel/common.js +1 -2
  45. package/dist/modules/manager/bazel/common.js.map +1 -1
  46. package/dist/modules/manager/bazel/parser.js +1 -1
  47. package/dist/modules/manager/bazel/parser.js.map +1 -1
  48. package/dist/modules/manager/bazel-module/parser/context.d.ts +4 -3
  49. package/dist/modules/manager/bazel-module/parser/context.js +9 -6
  50. package/dist/modules/manager/bazel-module/parser/context.js.map +1 -1
  51. package/dist/modules/manager/bazel-module/parser/extension-tags.js +10 -2
  52. package/dist/modules/manager/bazel-module/parser/extension-tags.js.map +1 -1
  53. package/dist/modules/manager/bazel-module/parser/fragments.d.ts +20 -2
  54. package/dist/modules/manager/bazel-module/parser/fragments.js +8 -2
  55. package/dist/modules/manager/bazel-module/parser/fragments.js.map +1 -1
  56. package/dist/modules/manager/bazel-module/parser/index.js +1 -1
  57. package/dist/modules/manager/bazel-module/parser/index.js.map +1 -1
  58. package/dist/modules/manager/bazel-module/parser/maven.d.ts +16 -0
  59. package/dist/modules/manager/bazel-module/parser/oci.d.ts +8 -0
  60. package/dist/modules/manager/bazel-module/parser/oci.js +4 -1
  61. package/dist/modules/manager/bazel-module/parser/oci.js.map +1 -1
  62. package/dist/modules/manager/bun/artifacts.js +1 -1
  63. package/dist/modules/manager/bun/artifacts.js.map +1 -1
  64. package/dist/modules/manager/bundler/extract.js.map +1 -1
  65. package/dist/modules/manager/cargo/artifacts.js +1 -1
  66. package/dist/modules/manager/cargo/artifacts.js.map +1 -1
  67. package/dist/modules/manager/cargo/extract.js.map +1 -1
  68. package/dist/modules/manager/cargo/types.d.ts +1 -3
  69. package/dist/modules/manager/cargo/types.js.map +1 -1
  70. package/dist/modules/manager/composer/utils.js +4 -4
  71. package/dist/modules/manager/composer/utils.js.map +1 -1
  72. package/dist/modules/manager/deps-edn/extract.js +3 -3
  73. package/dist/modules/manager/deps-edn/extract.js.map +1 -1
  74. package/dist/modules/manager/deps-edn/types.js.map +1 -1
  75. package/dist/modules/manager/dockerfile/extract.js +2 -3
  76. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  77. package/dist/modules/manager/fingerprint.generated.js +17 -17
  78. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  79. package/dist/modules/manager/flux/types.d.ts +3 -3
  80. package/dist/modules/manager/flux/types.js.map +1 -1
  81. package/dist/modules/manager/git-submodules/types.d.ts +2 -2
  82. package/dist/modules/manager/git-submodules/types.js.map +1 -1
  83. package/dist/modules/manager/github-actions/extract.js +2 -2
  84. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  85. package/dist/modules/manager/glasskube/types.d.ts +2 -2
  86. package/dist/modules/manager/glasskube/types.js.map +1 -1
  87. package/dist/modules/manager/gleam/artifacts.js +1 -1
  88. package/dist/modules/manager/gleam/artifacts.js.map +1 -1
  89. package/dist/modules/manager/gradle/utils.js +6 -2
  90. package/dist/modules/manager/gradle/utils.js.map +1 -1
  91. package/dist/modules/manager/haskell-cabal/extract.js +1 -1
  92. package/dist/modules/manager/haskell-cabal/extract.js.map +1 -1
  93. package/dist/modules/manager/helmfile/artifacts.js +1 -1
  94. package/dist/modules/manager/helmfile/artifacts.js.map +1 -1
  95. package/dist/modules/manager/helmfile/extract.js +2 -2
  96. package/dist/modules/manager/helmfile/extract.js.map +1 -1
  97. package/dist/modules/manager/helmv3/artifacts.js +1 -1
  98. package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
  99. package/dist/modules/manager/helmv3/extract.js.map +1 -1
  100. package/dist/modules/manager/helmv3/utils.js +1 -1
  101. package/dist/modules/manager/helmv3/utils.js.map +1 -1
  102. package/dist/modules/manager/homebrew/util.js +1 -2
  103. package/dist/modules/manager/homebrew/util.js.map +1 -1
  104. package/dist/modules/manager/jsonnet-bundler/extract.js +1 -1
  105. package/dist/modules/manager/jsonnet-bundler/extract.js.map +1 -1
  106. package/dist/modules/manager/leiningen/extract.js +1 -2
  107. package/dist/modules/manager/leiningen/extract.js.map +1 -1
  108. package/dist/modules/manager/maven/extract.js.map +1 -1
  109. package/dist/modules/manager/maven/update.js.map +1 -1
  110. package/dist/modules/manager/mise/upgradeable-tooling.js +7 -7
  111. package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
  112. package/dist/modules/manager/nix/extract.js +1 -1
  113. package/dist/modules/manager/nix/extract.js.map +1 -1
  114. package/dist/modules/manager/npm/extract/pnpm.js +1 -1
  115. package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
  116. package/dist/modules/manager/npm/post-update/index.js +1 -1
  117. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  118. package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
  119. package/dist/modules/manager/npm/update/dependency/index.js +1 -1
  120. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  121. package/dist/modules/manager/nuget/config-formatter.js +1 -2
  122. package/dist/modules/manager/nuget/config-formatter.js.map +1 -1
  123. package/dist/modules/manager/nuget/package-tree.js +1 -1
  124. package/dist/modules/manager/nuget/package-tree.js.map +1 -1
  125. package/dist/modules/manager/nuget/util.js +2 -2
  126. package/dist/modules/manager/nuget/util.js.map +1 -1
  127. package/dist/modules/manager/osgi/extract.js +3 -3
  128. package/dist/modules/manager/osgi/extract.js.map +1 -1
  129. package/dist/modules/manager/pep621/processors/pdm.js +1 -1
  130. package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
  131. package/dist/modules/manager/pep621/processors/uv.js +3 -2
  132. package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
  133. package/dist/modules/manager/pip-compile/artifacts.js +8 -2
  134. package/dist/modules/manager/pip-compile/artifacts.js.map +1 -1
  135. package/dist/modules/manager/pip-compile/common.d.ts +5 -3
  136. package/dist/modules/manager/pip-compile/common.js +34 -13
  137. package/dist/modules/manager/pip-compile/common.js.map +1 -1
  138. package/dist/modules/manager/pip-compile/extract.js.map +1 -1
  139. package/dist/modules/manager/pip-compile/types.d.ts +1 -0
  140. package/dist/modules/manager/pip-compile/types.js.map +1 -1
  141. package/dist/modules/manager/poetry/artifacts.js +2 -2
  142. package/dist/modules/manager/poetry/artifacts.js.map +1 -1
  143. package/dist/modules/manager/pre-commit/types.d.ts +2 -2
  144. package/dist/modules/manager/pre-commit/types.js.map +1 -1
  145. package/dist/modules/manager/pub/artifacts.js +1 -1
  146. package/dist/modules/manager/pub/artifacts.js.map +1 -1
  147. package/dist/modules/manager/swift/extract.js +1 -2
  148. package/dist/modules/manager/swift/extract.js.map +1 -1
  149. package/dist/modules/manager/terraform/extractors/terraform-block/required-provider.js +2 -2
  150. package/dist/modules/manager/terraform/extractors/terraform-block/required-provider.js.map +1 -1
  151. package/dist/modules/manager/terraform/hcl/types.d.ts +1 -3
  152. package/dist/modules/manager/terraform/hcl/types.js.map +1 -1
  153. package/dist/modules/manager/terraform/lockfile/index.js +1 -1
  154. package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
  155. package/dist/modules/manager/terragrunt/artifacts.js +1 -1
  156. package/dist/modules/manager/terragrunt/artifacts.js.map +1 -1
  157. package/dist/modules/manager/types.d.ts +1 -0
  158. package/dist/modules/manager/types.js.map +1 -1
  159. package/dist/modules/manager/woodpecker/types.d.ts +2 -2
  160. package/dist/modules/manager/woodpecker/types.js.map +1 -1
  161. package/dist/modules/platform/azure/azure-helper.js.map +1 -1
  162. package/dist/modules/platform/azure/index.js +1 -1
  163. package/dist/modules/platform/azure/index.js.map +1 -1
  164. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  165. package/dist/modules/platform/bitbucket/utils.js.map +1 -1
  166. package/dist/modules/platform/bitbucket-server/index.js +2 -2
  167. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  168. package/dist/modules/platform/gerrit/scm.js +1 -1
  169. package/dist/modules/platform/gerrit/scm.js.map +1 -1
  170. package/dist/modules/platform/gitea/index.js +6 -5
  171. package/dist/modules/platform/gitea/index.js.map +1 -1
  172. package/dist/modules/platform/gitea/pr-cache.d.ts +3 -2
  173. package/dist/modules/platform/gitea/pr-cache.js +21 -12
  174. package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
  175. package/dist/modules/platform/github/index.js.map +1 -1
  176. package/dist/modules/platform/gitlab/index.js +20 -16
  177. package/dist/modules/platform/gitlab/index.js.map +1 -1
  178. package/dist/modules/platform/types.d.ts +2 -2
  179. package/dist/modules/platform/types.js.map +1 -1
  180. package/dist/modules/versioning/bazel-module/bzlmod-version.d.ts +1 -1
  181. package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
  182. package/dist/modules/versioning/generic.d.ts +2 -6
  183. package/dist/modules/versioning/generic.js.map +1 -1
  184. package/dist/modules/versioning/gradle/compare.d.ts +2 -2
  185. package/dist/modules/versioning/gradle/compare.js.map +1 -1
  186. package/dist/modules/versioning/gradle/index.js +1 -1
  187. package/dist/modules/versioning/gradle/index.js.map +1 -1
  188. package/dist/modules/versioning/pvp/range.js +2 -2
  189. package/dist/modules/versioning/pvp/range.js.map +1 -1
  190. package/dist/modules/versioning/rpm/index.js +5 -5
  191. package/dist/modules/versioning/rpm/index.js.map +1 -1
  192. package/dist/modules/versioning/semver-coerced/index.js +4 -4
  193. package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
  194. package/dist/modules/versioning/types.d.ts +1 -3
  195. package/dist/modules/versioning/types.js.map +1 -1
  196. package/dist/types/git.d.ts +2 -2
  197. package/dist/types/git.js.map +1 -1
  198. package/dist/types/platform/github/index.d.ts +4 -4
  199. package/dist/types/platform/github/index.js.map +1 -1
  200. package/dist/types/platform/gitlab/index.d.ts +2 -2
  201. package/dist/types/platform/gitlab/index.js.map +1 -1
  202. package/dist/util/assign-keys.d.ts +1 -3
  203. package/dist/util/assign-keys.js.map +1 -1
  204. package/dist/util/cache/repository/http-cache.js +1 -1
  205. package/dist/util/cache/repository/http-cache.js.map +1 -1
  206. package/dist/util/exec/types.d.ts +2 -2
  207. package/dist/util/exec/types.js.map +1 -1
  208. package/dist/util/git/auth.js +1 -1
  209. package/dist/util/git/auth.js.map +1 -1
  210. package/dist/util/git/index.d.ts +10 -10
  211. package/dist/util/git/index.js +22 -26
  212. package/dist/util/git/index.js.map +1 -1
  213. package/dist/util/http/bitbucket.js.map +1 -1
  214. package/dist/util/http/cache/abstract-http-cache-provider.js +1 -1
  215. package/dist/util/http/cache/abstract-http-cache-provider.js.map +1 -1
  216. package/dist/util/http/index.js.map +1 -1
  217. package/dist/util/http/types.d.ts +3 -5
  218. package/dist/util/http/types.js.map +1 -1
  219. package/dist/util/pretty-time.js.map +1 -1
  220. package/dist/util/schema-utils.js.map +1 -1
  221. package/dist/util/stats.js +1 -0
  222. package/dist/util/stats.js.map +1 -1
  223. package/dist/workers/repository/dependency-dashboard.js +2 -2
  224. package/dist/workers/repository/dependency-dashboard.js.map +1 -1
  225. package/dist/workers/repository/init/config.d.ts +1 -2
  226. package/dist/workers/repository/init/config.js +0 -13
  227. package/dist/workers/repository/init/config.js.map +1 -1
  228. package/dist/workers/repository/init/merge.d.ts +2 -1
  229. package/dist/workers/repository/init/merge.js +13 -3
  230. package/dist/workers/repository/init/merge.js.map +1 -1
  231. package/dist/workers/repository/model/commit-message.js.map +1 -1
  232. package/dist/workers/repository/process/vulnerabilities.js +3 -1
  233. package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
  234. package/dist/workers/repository/process/write.js +1 -1
  235. package/dist/workers/repository/process/write.js.map +1 -1
  236. package/dist/workers/repository/reconfigure/validate.js +3 -1
  237. package/dist/workers/repository/reconfigure/validate.js.map +1 -1
  238. package/dist/workers/repository/update/branch/schedule.js +1 -1
  239. package/dist/workers/repository/update/branch/schedule.js.map +1 -1
  240. package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
  241. package/dist/workers/repository/updates/generate.js +9 -0
  242. package/dist/workers/repository/updates/generate.js.map +1 -1
  243. package/package.json +32 -25
  244. package/renovate-schema.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/crate/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Git from 'simple-git';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global';\nimport { logger } from '../../../logger';\nimport * as memCache from '../../../util/cache/memory';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { privateCacheDir, readCacheFile } from '../../../util/fs';\nimport { simpleGitConfig } from '../../../util/git/config';\nimport { toSha256 } from '../../../util/hash';\nimport { newlineRegex, regEx } from '../../../util/regex';\nimport { joinUrlParts, parseUrl } from '../../../util/url';\nimport * as cargoVersioning from '../../versioning/cargo';\nimport { Datasource } from '../datasource';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n Release,\n ReleaseResult,\n} from '../types';\nimport { ReleaseTimestampSchema } from './schema';\nimport type {\n CrateMetadata,\n CrateRecord,\n RegistryFlavor,\n RegistryInfo,\n} from './types';\n\nexport class CrateDatasource extends Datasource {\n static readonly id = 'crate';\n\n constructor() {\n super(CrateDatasource.id);\n }\n\n override defaultRegistryUrls = ['https://crates.io'];\n\n override defaultVersioning = cargoVersioning.id;\n\n static readonly CRATES_IO_BASE_URL =\n 'https://raw.githubusercontent.com/rust-lang/crates.io-index/master/';\n\n static readonly CRATES_IO_API_BASE_URL = 'https://crates.io/api/v1/';\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n @cache({\n namespace: `datasource-${CrateDatasource.id}`,\n key: ({ registryUrl, packageName }: GetReleasesConfig) =>\n // TODO: types (#22198)\n `${registryUrl}/${packageName}`,\n cacheable: ({ registryUrl }: GetReleasesConfig) =>\n CrateDatasource.areReleasesCacheable(registryUrl),\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n // istanbul ignore if\n if (!registryUrl) {\n logger.warn(\n 'crate datasource: No registryUrl specified, cannot perform getReleases',\n );\n return null;\n }\n\n const registryInfo = await CrateDatasource.fetchRegistryInfo({\n packageName,\n registryUrl,\n });\n if (!registryInfo) {\n logger.debug(`Could not fetch registry info from ${registryUrl}`);\n return null;\n }\n\n const dependencyUrl = CrateDatasource.getDependencyUrl(\n registryInfo,\n packageName,\n );\n\n const payload = await this.fetchCrateRecordsPayload(\n registryInfo,\n packageName,\n );\n const lines = payload\n .split(newlineRegex) // break into lines\n .map((line) => line.trim()) // remove whitespace\n .filter((line) => line.length !== 0) // remove empty lines\n .map((line) => JSON.parse(line) as CrateRecord); // parse\n\n const metadata = await this.getCrateMetadata(registryInfo, packageName);\n\n const result: ReleaseResult = {\n dependencyUrl,\n releases: [],\n };\n\n if (metadata?.homepage) {\n result.homepage = metadata.homepage;\n }\n\n if (metadata?.repository) {\n result.sourceUrl = metadata.repository;\n }\n\n result.releases = lines\n .map((version) => {\n const release: Release = {\n version: version.vers.replace(/\\+.*$/, ''),\n };\n if (version.yanked) {\n release.isDeprecated = true;\n }\n if (version.rust_version) {\n release.constraints = {\n rust: [version.rust_version],\n };\n }\n return release;\n })\n .filter((release) => release.version);\n if (!result.releases.length) {\n return null;\n }\n\n return result;\n }\n\n @cache({\n namespace: `datasource-${CrateDatasource.id}-metadata`,\n key: (info: RegistryInfo, packageName: string) =>\n `${info.rawUrl}/${packageName}`,\n cacheable: (info: RegistryInfo) =>\n CrateDatasource.areReleasesCacheable(info.rawUrl),\n ttlMinutes: 24 * 60, // 24 hours\n })\n public async getCrateMetadata(\n info: RegistryInfo,\n packageName: string,\n ): Promise<CrateMetadata | null> {\n if (info.flavor !== 'crates.io') {\n return null;\n }\n\n // The `?include=` suffix is required to avoid unnecessary database queries\n // on the crates.io server. This lets us work around the regular request\n // throttling of one request per second.\n const crateUrl = `${CrateDatasource.CRATES_IO_API_BASE_URL}crates/${packageName}?include=`;\n\n logger.debug(\n { crateUrl, packageName, registryUrl: info.rawUrl },\n 'downloading crate metadata',\n );\n\n try {\n type Response = { crate: CrateMetadata };\n const response = await this.http.getJsonUnchecked<Response>(crateUrl);\n return response.body.crate;\n } catch (err) {\n logger.warn(\n { err, packageName, registryUrl: info.rawUrl },\n 'failed to download crate metadata',\n );\n }\n\n return null;\n }\n\n public async fetchCrateRecordsPayload(\n info: RegistryInfo,\n packageName: string,\n ): Promise<string> {\n if (info.clonePath) {\n const path = upath.join(\n info.clonePath,\n ...CrateDatasource.getIndexSuffix(packageName),\n );\n return readCacheFile(path, 'utf8');\n }\n\n const baseUrl =\n info.flavor === 'crates.io'\n ? CrateDatasource.CRATES_IO_BASE_URL\n : info.rawUrl;\n\n if (info.flavor === 'crates.io' || info.isSparse) {\n const packageSuffix = CrateDatasource.getIndexSuffix(\n packageName.toLowerCase(),\n );\n const crateUrl = joinUrlParts(baseUrl, ...packageSuffix);\n try {\n return (await this.http.get(crateUrl)).body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n throw new Error(`unsupported crate registry flavor: ${info.flavor}`);\n }\n\n /**\n * Computes the dependency URL for a crate, given\n * registry information\n */\n private static getDependencyUrl(\n info: RegistryInfo,\n packageName: string,\n ): string {\n switch (info.flavor) {\n case 'crates.io':\n return `https://crates.io/crates/${packageName}`;\n case 'cloudsmith': {\n // input: https://dl.cloudsmith.io/basic/$org/$repo/cargo/index.git\n const tokens = info.url.pathname.split('/');\n const org = tokens[2];\n const repo = tokens[3];\n return `https://cloudsmith.io/~${org}/repos/${repo}/packages/detail/cargo/${packageName}`;\n }\n default:\n return `${info.rawUrl}/${packageName}`;\n }\n }\n\n /**\n * Given a Git URL, computes a semi-human-readable name for a folder in which to\n * clone the repository.\n */\n private static cacheDirFromUrl(url: URL): string {\n const proto = url.protocol.replace(regEx(/:$/), '');\n const host = url.hostname;\n const hash = toSha256(url.pathname).substring(0, 7);\n\n return `crate-registry-${proto}-${host}-${hash}`;\n }\n\n private static isSparseRegistry(url: string): boolean {\n const parsed = parseUrl(url);\n if (!parsed) {\n return false;\n }\n return parsed.protocol.startsWith('sparse+');\n }\n\n /**\n * Fetches information about a registry, by url.\n * If no url is given, assumes crates.io.\n * If an url is given, assumes it's a valid Git repository\n * url and clones it to cache.\n */\n private static async fetchRegistryInfo({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<RegistryInfo | null> {\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n\n const isSparseRegistry = CrateDatasource.isSparseRegistry(registryUrl);\n const registryFetchUrl = isSparseRegistry\n ? registryUrl.replace(/^sparse\\+/, '')\n : registryUrl;\n\n const url = parseUrl(registryFetchUrl);\n if (!url) {\n logger.debug(`Could not parse registry URL ${registryFetchUrl}`);\n return null;\n }\n\n let flavor: RegistryFlavor;\n if (url.hostname === 'crates.io') {\n flavor = 'crates.io';\n } else if (url.hostname === 'dl.cloudsmith.io') {\n flavor = 'cloudsmith';\n } else {\n flavor = 'other';\n }\n\n const registry: RegistryInfo = {\n flavor,\n rawUrl: registryFetchUrl,\n url,\n isSparse: isSparseRegistry,\n };\n\n if (\n registry.flavor !== 'crates.io' &&\n !GlobalConfig.get('allowCustomCrateRegistries')\n ) {\n logger.warn(\n 'crate datasource: allowCustomCrateRegistries=true is required for registries other than crates.io, bailing out',\n );\n return null;\n }\n if (registry.flavor !== 'crates.io' && !registry.isSparse) {\n const cacheKey = `crate-datasource/registry-clone-path/${registryFetchUrl}`;\n const cacheKeyForError = `crate-datasource/registry-clone-path/${registryFetchUrl}/error`;\n\n // We need to ensure we don't run `git clone` in parallel. Therefore we store\n // a promise of the running operation in the mem cache, which in the end resolves\n // to the file path of the cloned repository.\n\n const clonePathPromise: Promise<string> | null = memCache.get(cacheKey);\n let clonePath: string;\n\n if (clonePathPromise) {\n clonePath = await clonePathPromise;\n } else {\n clonePath = upath.join(\n privateCacheDir(),\n CrateDatasource.cacheDirFromUrl(url),\n );\n logger.info(\n { clonePath, registryFetchUrl },\n `Cloning private cargo registry`,\n );\n\n const git = Git({ ...simpleGitConfig(), maxConcurrentProcesses: 1 });\n const clonePromise = git.clone(registryFetchUrl, clonePath, {\n '--depth': 1,\n });\n\n memCache.set(\n cacheKey,\n clonePromise.then(() => clonePath).catch(() => null),\n );\n\n try {\n await clonePromise;\n } catch (err) {\n logger.warn(\n { err, packageName, registryFetchUrl },\n 'failed cloning git registry',\n );\n memCache.set(cacheKeyForError, err);\n\n return null;\n }\n }\n\n if (!clonePath) {\n const err = memCache.get(cacheKeyForError);\n logger.warn(\n { err, packageName, registryFetchUrl },\n 'Previous git clone failed, bailing out.',\n );\n\n return null;\n }\n\n registry.clonePath = clonePath;\n }\n\n return registry;\n }\n\n private static areReleasesCacheable(\n registryUrl: string | undefined,\n ): boolean {\n // We only cache public releases, we don't want to cache private\n // cloned data between runs.\n return registryUrl === 'https://crates.io';\n }\n\n public static getIndexSuffix(packageName: string): string[] {\n const len = packageName.length;\n\n if (len === 1) {\n return ['1', packageName];\n }\n if (len === 2) {\n return ['2', packageName];\n }\n if (len === 3) {\n return ['3', packageName[0], packageName];\n }\n\n return [packageName.slice(0, 2), packageName.slice(2, 4), packageName];\n }\n\n @cache({\n namespace: `datasource-crate`,\n key: (\n { registryUrl, packageName }: PostprocessReleaseConfig,\n { version }: Release,\n ) => `postprocessRelease:${registryUrl}:${packageName}:${version}`,\n ttlMinutes: 7 * 24 * 60,\n cacheable: ({ registryUrl }: PostprocessReleaseConfig, _: Release) =>\n registryUrl === 'https://crates.io',\n })\n override async postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n if (registryUrl !== 'https://crates.io') {\n return release;\n }\n\n const url = `https://crates.io/api/v1/crates/${packageName}/${release.version}`;\n const { body: releaseTimestamp } = await this.http.getJson(\n url,\n ReleaseTimestampSchema,\n );\n release.releaseTimestamp = releaseTimestamp;\n return release;\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/crate/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Git from 'simple-git';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global';\nimport { logger } from '../../../logger';\nimport * as memCache from '../../../util/cache/memory';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { privateCacheDir, readCacheFile } from '../../../util/fs';\nimport { simpleGitConfig } from '../../../util/git/config';\nimport { toSha256 } from '../../../util/hash';\nimport { newlineRegex, regEx } from '../../../util/regex';\nimport { joinUrlParts, parseUrl } from '../../../util/url';\nimport * as cargoVersioning from '../../versioning/cargo';\nimport { Datasource } from '../datasource';\nimport type {\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n Release,\n ReleaseResult,\n} from '../types';\nimport { ReleaseTimestampSchema } from './schema';\nimport type {\n CrateMetadata,\n CrateRecord,\n RegistryFlavor,\n RegistryInfo,\n} from './types';\n\nexport class CrateDatasource extends Datasource {\n static readonly id = 'crate';\n\n constructor() {\n super(CrateDatasource.id);\n }\n\n override defaultRegistryUrls = ['https://crates.io'];\n\n override defaultVersioning = cargoVersioning.id;\n\n static readonly CRATES_IO_BASE_URL =\n 'https://raw.githubusercontent.com/rust-lang/crates.io-index/master/';\n\n static readonly CRATES_IO_API_BASE_URL = 'https://crates.io/api/v1/';\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n @cache({\n namespace: `datasource-${CrateDatasource.id}`,\n key: ({ registryUrl, packageName }: GetReleasesConfig) =>\n // TODO: types (#22198)\n `${registryUrl}/${packageName}`,\n cacheable: ({ registryUrl }: GetReleasesConfig) =>\n CrateDatasource.areReleasesCacheable(registryUrl),\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n // istanbul ignore if\n if (!registryUrl) {\n logger.warn(\n 'crate datasource: No registryUrl specified, cannot perform getReleases',\n );\n return null;\n }\n\n const registryInfo = await CrateDatasource.fetchRegistryInfo({\n packageName,\n registryUrl,\n });\n if (!registryInfo) {\n logger.debug(`Could not fetch registry info from ${registryUrl}`);\n return null;\n }\n\n const dependencyUrl = CrateDatasource.getDependencyUrl(\n registryInfo,\n packageName,\n );\n\n const payload = await this.fetchCrateRecordsPayload(\n registryInfo,\n packageName,\n );\n const lines = payload\n .split(newlineRegex) // break into lines\n .map((line) => line.trim()) // remove whitespace\n .filter((line) => line.length !== 0) // remove empty lines\n .map((line) => JSON.parse(line) as CrateRecord); // parse\n\n const metadata = await this.getCrateMetadata(registryInfo, packageName);\n\n const result: ReleaseResult = {\n dependencyUrl,\n releases: [],\n };\n\n if (metadata?.homepage) {\n result.homepage = metadata.homepage;\n }\n\n if (metadata?.repository) {\n result.sourceUrl = metadata.repository;\n }\n\n result.releases = lines\n .map((version) => {\n const release: Release = {\n version: version.vers.replace(/\\+.*$/, ''),\n };\n if (version.yanked) {\n release.isDeprecated = true;\n }\n if (version.rust_version) {\n release.constraints = {\n rust: [version.rust_version],\n };\n }\n return release;\n })\n .filter((release) => release.version);\n if (!result.releases.length) {\n return null;\n }\n\n return result;\n }\n\n @cache({\n namespace: `datasource-${CrateDatasource.id}-metadata`,\n key: (info: RegistryInfo, packageName: string) =>\n `${info.rawUrl}/${packageName}`,\n cacheable: (info: RegistryInfo) =>\n CrateDatasource.areReleasesCacheable(info.rawUrl),\n ttlMinutes: 24 * 60, // 24 hours\n })\n public async getCrateMetadata(\n info: RegistryInfo,\n packageName: string,\n ): Promise<CrateMetadata | null> {\n if (info.flavor !== 'crates.io') {\n return null;\n }\n\n // The `?include=` suffix is required to avoid unnecessary database queries\n // on the crates.io server. This lets us work around the regular request\n // throttling of one request per second.\n const crateUrl = `${CrateDatasource.CRATES_IO_API_BASE_URL}crates/${packageName}?include=`;\n\n logger.debug(\n { crateUrl, packageName, registryUrl: info.rawUrl },\n 'downloading crate metadata',\n );\n\n try {\n interface Response {\n crate: CrateMetadata;\n }\n const response = await this.http.getJsonUnchecked<Response>(crateUrl);\n return response.body.crate;\n } catch (err) {\n logger.warn(\n { err, packageName, registryUrl: info.rawUrl },\n 'failed to download crate metadata',\n );\n }\n\n return null;\n }\n\n public async fetchCrateRecordsPayload(\n info: RegistryInfo,\n packageName: string,\n ): Promise<string> {\n if (info.clonePath) {\n const path = upath.join(\n info.clonePath,\n ...CrateDatasource.getIndexSuffix(packageName),\n );\n return readCacheFile(path, 'utf8');\n }\n\n const baseUrl =\n info.flavor === 'crates.io'\n ? CrateDatasource.CRATES_IO_BASE_URL\n : info.rawUrl;\n\n if (info.flavor === 'crates.io' || info.isSparse) {\n const packageSuffix = CrateDatasource.getIndexSuffix(\n packageName.toLowerCase(),\n );\n const crateUrl = joinUrlParts(baseUrl, ...packageSuffix);\n try {\n return (await this.http.get(crateUrl)).body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n throw new Error(`unsupported crate registry flavor: ${info.flavor}`);\n }\n\n /**\n * Computes the dependency URL for a crate, given\n * registry information\n */\n private static getDependencyUrl(\n info: RegistryInfo,\n packageName: string,\n ): string {\n switch (info.flavor) {\n case 'crates.io':\n return `https://crates.io/crates/${packageName}`;\n case 'cloudsmith': {\n // input: https://dl.cloudsmith.io/basic/$org/$repo/cargo/index.git\n const tokens = info.url.pathname.split('/');\n const org = tokens[2];\n const repo = tokens[3];\n return `https://cloudsmith.io/~${org}/repos/${repo}/packages/detail/cargo/${packageName}`;\n }\n default:\n return `${info.rawUrl}/${packageName}`;\n }\n }\n\n /**\n * Given a Git URL, computes a semi-human-readable name for a folder in which to\n * clone the repository.\n */\n private static cacheDirFromUrl(url: URL): string {\n const proto = url.protocol.replace(regEx(/:$/), '');\n const host = url.hostname;\n const hash = toSha256(url.pathname).substring(0, 7);\n\n return `crate-registry-${proto}-${host}-${hash}`;\n }\n\n private static isSparseRegistry(url: string): boolean {\n const parsed = parseUrl(url);\n if (!parsed) {\n return false;\n }\n return parsed.protocol.startsWith('sparse+');\n }\n\n /**\n * Fetches information about a registry, by url.\n * If no url is given, assumes crates.io.\n * If an url is given, assumes it's a valid Git repository\n * url and clones it to cache.\n */\n private static async fetchRegistryInfo({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<RegistryInfo | null> {\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n\n const isSparseRegistry = CrateDatasource.isSparseRegistry(registryUrl);\n const registryFetchUrl = isSparseRegistry\n ? registryUrl.replace(/^sparse\\+/, '')\n : registryUrl;\n\n const url = parseUrl(registryFetchUrl);\n if (!url) {\n logger.debug(`Could not parse registry URL ${registryFetchUrl}`);\n return null;\n }\n\n let flavor: RegistryFlavor;\n if (url.hostname === 'crates.io') {\n flavor = 'crates.io';\n } else if (url.hostname === 'dl.cloudsmith.io') {\n flavor = 'cloudsmith';\n } else {\n flavor = 'other';\n }\n\n const registry: RegistryInfo = {\n flavor,\n rawUrl: registryFetchUrl,\n url,\n isSparse: isSparseRegistry,\n };\n\n if (\n registry.flavor !== 'crates.io' &&\n !GlobalConfig.get('allowCustomCrateRegistries')\n ) {\n logger.warn(\n 'crate datasource: allowCustomCrateRegistries=true is required for registries other than crates.io, bailing out',\n );\n return null;\n }\n if (registry.flavor !== 'crates.io' && !registry.isSparse) {\n const cacheKey = `crate-datasource/registry-clone-path/${registryFetchUrl}`;\n const cacheKeyForError = `crate-datasource/registry-clone-path/${registryFetchUrl}/error`;\n\n // We need to ensure we don't run `git clone` in parallel. Therefore we store\n // a promise of the running operation in the mem cache, which in the end resolves\n // to the file path of the cloned repository.\n\n const clonePathPromise: Promise<string> | null = memCache.get(cacheKey);\n let clonePath: string;\n\n if (clonePathPromise) {\n clonePath = await clonePathPromise;\n } else {\n clonePath = upath.join(\n privateCacheDir(),\n CrateDatasource.cacheDirFromUrl(url),\n );\n logger.info(\n { clonePath, registryFetchUrl },\n `Cloning private cargo registry`,\n );\n\n const git = Git({ ...simpleGitConfig(), maxConcurrentProcesses: 1 });\n const clonePromise = git.clone(registryFetchUrl, clonePath, {\n '--depth': 1,\n });\n\n memCache.set(\n cacheKey,\n clonePromise.then(() => clonePath).catch(() => null),\n );\n\n try {\n await clonePromise;\n } catch (err) {\n logger.warn(\n { err, packageName, registryFetchUrl },\n 'failed cloning git registry',\n );\n memCache.set(cacheKeyForError, err);\n\n return null;\n }\n }\n\n if (!clonePath) {\n const err = memCache.get(cacheKeyForError);\n logger.warn(\n { err, packageName, registryFetchUrl },\n 'Previous git clone failed, bailing out.',\n );\n\n return null;\n }\n\n registry.clonePath = clonePath;\n }\n\n return registry;\n }\n\n private static areReleasesCacheable(\n registryUrl: string | undefined,\n ): boolean {\n // We only cache public releases, we don't want to cache private\n // cloned data between runs.\n return registryUrl === 'https://crates.io';\n }\n\n public static getIndexSuffix(packageName: string): string[] {\n const len = packageName.length;\n\n if (len === 1) {\n return ['1', packageName];\n }\n if (len === 2) {\n return ['2', packageName];\n }\n if (len === 3) {\n return ['3', packageName[0], packageName];\n }\n\n return [packageName.slice(0, 2), packageName.slice(2, 4), packageName];\n }\n\n @cache({\n namespace: `datasource-crate`,\n key: (\n { registryUrl, packageName }: PostprocessReleaseConfig,\n { version }: Release,\n ) => `postprocessRelease:${registryUrl}:${packageName}:${version}`,\n ttlMinutes: 7 * 24 * 60,\n cacheable: ({ registryUrl }: PostprocessReleaseConfig, _: Release) =>\n registryUrl === 'https://crates.io',\n })\n override async postprocessRelease(\n { packageName, registryUrl }: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n if (registryUrl !== 'https://crates.io') {\n return release;\n }\n\n const url = `https://crates.io/api/v1/crates/${packageName}/${release.version}`;\n const { body: releaseTimestamp } = await this.http.getJson(\n url,\n ReleaseTimestampSchema,\n );\n release.releaseTimestamp = releaseTimestamp;\n return release;\n }\n}\n"]}
@@ -16,7 +16,7 @@ export declare abstract class Datasource implements DatasourceApi {
16
16
  protected http: Http;
17
17
  abstract getReleases(getReleasesConfig: GetReleasesConfig): Promise<ReleaseResult | null>;
18
18
  getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>;
19
- handleHttpErrors(err: HttpError): void;
19
+ handleHttpErrors(_err: HttpError): void;
20
20
  protected handleGenericErrors(err: Error): never;
21
21
  postprocessRelease(_config: PostprocessReleaseConfig, release: Release): Promise<PostprocessReleaseResult>;
22
22
  }
@@ -20,7 +20,9 @@ class Datasource {
20
20
  sourceUrlSupport = 'none';
21
21
  sourceUrlNote;
22
22
  http;
23
- handleHttpErrors(err) { }
23
+ handleHttpErrors(_err) {
24
+ // intentionally empty
25
+ }
24
26
  handleGenericErrors(err) {
25
27
  // istanbul ignore if: not easy testable with nock
26
28
  if (err instanceof external_host_error_1.ExternalHostError) {
@@ -1 +1 @@
1
- {"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../../lib/modules/datasource/datasource.ts"],"names":[],"mappings":";;;AAAA,gFAA2E;AAC3E,0CAAkD;AAalD,MAAsB,UAAU;IACQ;IAAtC,YAAsC,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,WAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,CAAsB;IAE7B,qBAAqB,GAAG,IAAI,CAAC;IAE7B,aAAa,CAAsC;IAEnD,mBAAmB,CAA+B;IAElD,iBAAiB,CAAsB;IAEvC,gBAAgB,GAAiC,OAAO,CAAC;IAEzD,uBAAuB,GAAG,KAAK,CAAC;IAChC,oBAAoB,CAAsB;IAE1C,gBAAgB,GAAqB,MAAM,CAAC;IAC5C,aAAa,CAAsB;IAEzB,IAAI,CAAO;IAQrB,gBAAgB,CAAC,GAAc,IAAS,CAAC;IAE/B,mBAAmB,CAAC,GAAU;QACtC,kDAAkD;QAClD,IAAI,GAAG,YAAY,uCAAiB,EAAE,CAAC;YACrC,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,GAAG,YAAY,gBAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAE3B,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC;YAC5C,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,UAAU,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,CAAC,EAAE,CAAC;oBAClE,MAAM,IAAI,uCAAiB,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,2DAA2D;IAC3D,kBAAkB,CAChB,OAAiC,EACjC,OAAgB;QAEhB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;CACF;AA5DD,gCA4DC","sourcesContent":["import { ExternalHostError } from '../../types/errors/external-host-error';\nimport { Http, HttpError } from '../../util/http';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n SourceUrlSupport,\n} from './types';\n\nexport abstract class Datasource implements DatasourceApi {\n protected constructor(public readonly id: string) {\n this.http = new Http(id);\n }\n\n caching: boolean | undefined;\n\n customRegistrySupport = true;\n\n defaultConfig: Record<string, unknown> | undefined;\n\n defaultRegistryUrls?: string[] | (() => string[]);\n\n defaultVersioning?: string | undefined;\n\n registryStrategy: RegistryStrategy | undefined = 'first';\n\n releaseTimestampSupport = false;\n releaseTimestampNote?: string | undefined;\n\n sourceUrlSupport: SourceUrlSupport = 'none';\n sourceUrlNote?: string | undefined;\n\n protected http: Http;\n\n abstract getReleases(\n getReleasesConfig: GetReleasesConfig,\n ): Promise<ReleaseResult | null>;\n\n getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>;\n\n handleHttpErrors(err: HttpError): void {}\n\n protected handleGenericErrors(err: Error): never {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n if (err instanceof HttpError) {\n this.handleHttpErrors(err);\n\n const statusCode = err.response?.statusCode;\n if (statusCode) {\n if (statusCode === 429 || (statusCode >= 500 && statusCode < 600)) {\n throw new ExternalHostError(err);\n }\n }\n }\n\n throw err;\n }\n\n // istanbul ignore next: no-op implementation, never called\n postprocessRelease(\n _config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n return Promise.resolve(release);\n }\n}\n"]}
1
+ {"version":3,"file":"datasource.js","sourceRoot":"","sources":["../../../lib/modules/datasource/datasource.ts"],"names":[],"mappings":";;;AAAA,gFAA2E;AAC3E,0CAAkD;AAalD,MAAsB,UAAU;IACQ;IAAtC,YAAsC,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,WAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,CAAsB;IAE7B,qBAAqB,GAAG,IAAI,CAAC;IAE7B,aAAa,CAAsC;IAEnD,mBAAmB,CAA+B;IAElD,iBAAiB,CAAsB;IAEvC,gBAAgB,GAAiC,OAAO,CAAC;IAEzD,uBAAuB,GAAG,KAAK,CAAC;IAChC,oBAAoB,CAAsB;IAE1C,gBAAgB,GAAqB,MAAM,CAAC;IAC5C,aAAa,CAAsB;IAEzB,IAAI,CAAO;IAQrB,gBAAgB,CAAC,IAAe;QAC9B,sBAAsB;IACxB,CAAC;IAES,mBAAmB,CAAC,GAAU;QACtC,kDAAkD;QAClD,IAAI,GAAG,YAAY,uCAAiB,EAAE,CAAC;YACrC,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,GAAG,YAAY,gBAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAE3B,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC;YAC5C,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,UAAU,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,CAAC,EAAE,CAAC;oBAClE,MAAM,IAAI,uCAAiB,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,2DAA2D;IAC3D,kBAAkB,CAChB,OAAiC,EACjC,OAAgB;QAEhB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;CACF;AA9DD,gCA8DC","sourcesContent":["import { ExternalHostError } from '../../types/errors/external-host-error';\nimport { Http, HttpError } from '../../util/http';\nimport type {\n DatasourceApi,\n DigestConfig,\n GetReleasesConfig,\n PostprocessReleaseConfig,\n PostprocessReleaseResult,\n RegistryStrategy,\n Release,\n ReleaseResult,\n SourceUrlSupport,\n} from './types';\n\nexport abstract class Datasource implements DatasourceApi {\n protected constructor(public readonly id: string) {\n this.http = new Http(id);\n }\n\n caching: boolean | undefined;\n\n customRegistrySupport = true;\n\n defaultConfig: Record<string, unknown> | undefined;\n\n defaultRegistryUrls?: string[] | (() => string[]);\n\n defaultVersioning?: string | undefined;\n\n registryStrategy: RegistryStrategy | undefined = 'first';\n\n releaseTimestampSupport = false;\n releaseTimestampNote?: string | undefined;\n\n sourceUrlSupport: SourceUrlSupport = 'none';\n sourceUrlNote?: string | undefined;\n\n protected http: Http;\n\n abstract getReleases(\n getReleasesConfig: GetReleasesConfig,\n ): Promise<ReleaseResult | null>;\n\n getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>;\n\n handleHttpErrors(_err: HttpError): void {\n // intentionally empty\n }\n\n protected handleGenericErrors(err: Error): never {\n // istanbul ignore if: not easy testable with nock\n if (err instanceof ExternalHostError) {\n throw err;\n }\n\n if (err instanceof HttpError) {\n this.handleHttpErrors(err);\n\n const statusCode = err.response?.statusCode;\n if (statusCode) {\n if (statusCode === 429 || (statusCode >= 500 && statusCode < 600)) {\n throw new ExternalHostError(err);\n }\n }\n }\n\n throw err;\n }\n\n // istanbul ignore next: no-op implementation, never called\n postprocessRelease(\n _config: PostprocessReleaseConfig,\n release: Release,\n ): Promise<PostprocessReleaseResult> {\n return Promise.resolve(release);\n }\n}\n"]}
@@ -3,6 +3,6 @@ import type { PackageDescription } from './types';
3
3
  * This specifies the directory where the extracted and downloaded packages files are stored relative to cacheDir.
4
4
  * The folder will be created automatically if it doesn't exist.
5
5
  */
6
- export declare const cacheSubDir: string;
7
- export declare const requiredPackageKeys: Array<keyof PackageDescription>;
8
- export declare const packageKeys: Array<keyof PackageDescription>;
6
+ export declare const cacheSubDir = "deb";
7
+ export declare const requiredPackageKeys: (keyof PackageDescription)[];
8
+ export declare const packageKeys: (keyof PackageDescription)[];
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/deb/common.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACU,QAAA,WAAW,GAAW,KAAK,CAAC;AAE5B,QAAA,mBAAmB,GAAoC;IAClE,SAAS;IACT,SAAS;CACV,CAAC;AAEW,QAAA,WAAW,GAAoC;IAC1D,GAAG,2BAAmB;IACtB,UAAU;CACX,CAAC","sourcesContent":["import type { PackageDescription } from './types';\n\n/**\n * This specifies the directory where the extracted and downloaded packages files are stored relative to cacheDir.\n * The folder will be created automatically if it doesn't exist.\n */\nexport const cacheSubDir: string = 'deb';\n\nexport const requiredPackageKeys: Array<keyof PackageDescription> = [\n 'Package',\n 'Version',\n];\n\nexport const packageKeys: Array<keyof PackageDescription> = [\n ...requiredPackageKeys,\n 'Homepage',\n];\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/deb/common.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACU,QAAA,WAAW,GAAG,KAAK,CAAC;AAEpB,QAAA,mBAAmB,GAAiC;IAC/D,SAAS;IACT,SAAS;CACV,CAAC;AAEW,QAAA,WAAW,GAAiC;IACvD,GAAG,2BAAmB;IACtB,UAAU;CACX,CAAC","sourcesContent":["import type { PackageDescription } from './types';\n\n/**\n * This specifies the directory where the extracted and downloaded packages files are stored relative to cacheDir.\n * The folder will be created automatically if it doesn't exist.\n */\nexport const cacheSubDir = 'deb';\n\nexport const requiredPackageKeys: (keyof PackageDescription)[] = [\n 'Package',\n 'Version',\n];\n\nexport const packageKeys: (keyof PackageDescription)[] = [\n ...requiredPackageKeys,\n 'Homepage',\n];\n"]}
@@ -45,6 +45,6 @@ function isECRMaxResultsError(err) {
45
45
  return !!(resp?.statusCode === 405 &&
46
46
  resp.headers?.['docker-distribution-api-version'] &&
47
47
  // https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults
48
- resp.body?.['errors']?.[0]?.message?.includes('Member must have value less than or equal to 1000'));
48
+ resp.body?.errors?.[0]?.message?.includes('Member must have value less than or equal to 1000'));
49
49
  }
50
50
  //# sourceMappingURL=ecr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ecr.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/docker/ecr.ts"],"names":[],"mappings":";;;AAcA,0CAsCC;AAED,oDAUC;AA/DD,oDAA0C;AAC1C,4CAAyC;AAIzC,+CAA4C;AAC5C,qDAAgE;AAEnD,QAAA,QAAQ,GAAG,IAAA,aAAK,EAC3B,uDAAuD,CACxD,CAAC;AACW,QAAA,cAAc,GAAG,IAAA,aAAK,EAAC,kBAAkB,CAAC,CAAC;AAEjD,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,IAAc;IAEd,MAAM,MAAM,GAAoB,EAAE,MAAM,EAAE,CAAC;IAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7C,eAAM,CAAC,KAAK,CACV,sEAAsE,CACvE,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1C,eAAM,CAAC,KAAK,CACV,iEAAiE,CAClE,CAAC;QACF,MAAM,CAAC,WAAW,GAAG;YACnB,WAAW,EAAE,IAAI,CAAC,QAAQ;YAC1B,eAAe,EAAE,IAAI,CAAC,QAAQ;YAC9B,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,gBAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC;QAC5E,IAAI,kBAAkB,EAAE,CAAC;YACvB,iBAAiB;YACjB,IAAA,iCAAsB,EAAC,kBAAkB,CAAC,CAAC;YAC3C,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QACD,eAAM,CAAC,IAAI,CACT,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7B,eAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAc;IACjD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAyC,CAAC;IAC3D,OAAO,CAAC,CAAC,CACP,IAAI,EAAE,UAAU,KAAK,GAAG;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC,iCAAiC,CAAC;QACjD,sIAAsI;QACtI,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAC3C,mDAAmD,CACpD,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { ECRClientConfig } from '@aws-sdk/client-ecr';\nimport { ECR } from '@aws-sdk/client-ecr';\nimport { logger } from '../../../logger';\nimport type { HostRule } from '../../../types';\nimport type { HttpError } from '../../../util/http';\nimport type { HttpResponse } from '../../../util/http/types';\nimport { regEx } from '../../../util/regex';\nimport { addSecretForSanitizing } from '../../../util/sanitize';\n\nexport const ecrRegex = regEx(\n /\\d+\\.dkr\\.ecr(?:-fips)?\\.([-a-z0-9]+)\\.amazonaws\\.com/,\n);\nexport const ecrPublicRegex = regEx(/public\\.ecr\\.aws/);\n\nexport async function getECRAuthToken(\n region: string,\n opts: HostRule,\n): Promise<string | null> {\n const config: ECRClientConfig = { region };\n if (opts.username === `AWS` && opts.password) {\n logger.trace(\n `AWS user specified, encoding basic auth credentials for ECR registry`,\n );\n return Buffer.from(`AWS:${opts.password}`).toString('base64');\n } else if (opts.username && opts.password) {\n logger.trace(\n `Using AWS accessKey to get Authorization token for ECR registry`,\n );\n config.credentials = {\n accessKeyId: opts.username,\n secretAccessKey: opts.password,\n ...(opts.token && { sessionToken: opts.token }),\n };\n }\n\n const ecr = new ECR(config);\n try {\n const data = await ecr.getAuthorizationToken({});\n const authorizationToken = data?.authorizationData?.[0]?.authorizationToken;\n if (authorizationToken) {\n // sanitize token\n addSecretForSanitizing(authorizationToken);\n return authorizationToken;\n }\n logger.warn(\n 'Could not extract authorizationToken from ECR getAuthorizationToken response',\n );\n } catch (err) {\n logger.trace({ err }, 'err');\n logger.warn('ECR getAuthorizationToken error');\n }\n return null;\n}\n\nexport function isECRMaxResultsError(err: HttpError): boolean {\n const resp = err.response as HttpResponse<any> | undefined;\n return !!(\n resp?.statusCode === 405 &&\n resp.headers?.['docker-distribution-api-version'] &&\n // https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults\n resp.body?.['errors']?.[0]?.message?.includes(\n 'Member must have value less than or equal to 1000',\n )\n );\n}\n"]}
1
+ {"version":3,"file":"ecr.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/docker/ecr.ts"],"names":[],"mappings":";;;AAcA,0CAsCC;AAED,oDAUC;AA/DD,oDAA0C;AAC1C,4CAAyC;AAIzC,+CAA4C;AAC5C,qDAAgE;AAEnD,QAAA,QAAQ,GAAG,IAAA,aAAK,EAC3B,uDAAuD,CACxD,CAAC;AACW,QAAA,cAAc,GAAG,IAAA,aAAK,EAAC,kBAAkB,CAAC,CAAC;AAEjD,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,IAAc;IAEd,MAAM,MAAM,GAAoB,EAAE,MAAM,EAAE,CAAC;IAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7C,eAAM,CAAC,KAAK,CACV,sEAAsE,CACvE,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1C,eAAM,CAAC,KAAK,CACV,iEAAiE,CAClE,CAAC;QACF,MAAM,CAAC,WAAW,GAAG;YACnB,WAAW,EAAE,IAAI,CAAC,QAAQ;YAC1B,eAAe,EAAE,IAAI,CAAC,QAAQ;YAC9B,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,gBAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC;QAC5E,IAAI,kBAAkB,EAAE,CAAC;YACvB,iBAAiB;YACjB,IAAA,iCAAsB,EAAC,kBAAkB,CAAC,CAAC;YAC3C,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QACD,eAAM,CAAC,IAAI,CACT,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7B,eAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAc;IACjD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAyC,CAAC;IAC3D,OAAO,CAAC,CAAC,CACP,IAAI,EAAE,UAAU,KAAK,GAAG;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC,iCAAiC,CAAC;QACjD,sIAAsI;QACtI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CACvC,mDAAmD,CACpD,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { ECRClientConfig } from '@aws-sdk/client-ecr';\nimport { ECR } from '@aws-sdk/client-ecr';\nimport { logger } from '../../../logger';\nimport type { HostRule } from '../../../types';\nimport type { HttpError } from '../../../util/http';\nimport type { HttpResponse } from '../../../util/http/types';\nimport { regEx } from '../../../util/regex';\nimport { addSecretForSanitizing } from '../../../util/sanitize';\n\nexport const ecrRegex = regEx(\n /\\d+\\.dkr\\.ecr(?:-fips)?\\.([-a-z0-9]+)\\.amazonaws\\.com/,\n);\nexport const ecrPublicRegex = regEx(/public\\.ecr\\.aws/);\n\nexport async function getECRAuthToken(\n region: string,\n opts: HostRule,\n): Promise<string | null> {\n const config: ECRClientConfig = { region };\n if (opts.username === `AWS` && opts.password) {\n logger.trace(\n `AWS user specified, encoding basic auth credentials for ECR registry`,\n );\n return Buffer.from(`AWS:${opts.password}`).toString('base64');\n } else if (opts.username && opts.password) {\n logger.trace(\n `Using AWS accessKey to get Authorization token for ECR registry`,\n );\n config.credentials = {\n accessKeyId: opts.username,\n secretAccessKey: opts.password,\n ...(opts.token && { sessionToken: opts.token }),\n };\n }\n\n const ecr = new ECR(config);\n try {\n const data = await ecr.getAuthorizationToken({});\n const authorizationToken = data?.authorizationData?.[0]?.authorizationToken;\n if (authorizationToken) {\n // sanitize token\n addSecretForSanitizing(authorizationToken);\n return authorizationToken;\n }\n logger.warn(\n 'Could not extract authorizationToken from ECR getAuthorizationToken response',\n );\n } catch (err) {\n logger.trace({ err }, 'err');\n logger.warn('ECR getAuthorizationToken error');\n }\n return null;\n}\n\nexport function isECRMaxResultsError(err: HttpError): boolean {\n const resp = err.response as HttpResponse<any> | undefined;\n return !!(\n resp?.statusCode === 405 &&\n resp.headers?.['docker-distribution-api-version'] &&\n // https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults\n resp.body?.errors?.[0]?.message?.includes(\n 'Member must have value less than or equal to 1000',\n )\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/docker/index.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global';\nimport { PAGE_NOT_FOUND_ERROR } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { HttpError } from '../../../util/http';\nimport type { HttpResponse } from '../../../util/http/types';\nimport { hasKey } from '../../../util/object';\nimport { regEx } from '../../../util/regex';\nimport { type AsyncResult, Result } from '../../../util/result';\nimport { isDockerDigest } from '../../../util/string-match';\nimport { asTimestamp } from '../../../util/timestamp';\nimport {\n ensurePathPrefix,\n joinUrlParts,\n parseLinkHeader,\n} from '../../../util/url';\nimport { id as dockerVersioningId } from '../../versioning/docker';\nimport { Datasource } from '../datasource';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types';\nimport { isArtifactoryServer } from '../util';\nimport {\n DOCKER_HUB,\n dockerDatasourceId,\n extractDigestFromResponseBody,\n findHelmSourceUrl,\n findLatestStable,\n getAuthHeaders,\n getRegistryRepository,\n gitRefLabel,\n imageUrlLabel,\n isDockerHost,\n sourceLabel,\n sourceLabels,\n} from './common';\nimport { DockerHubCache } from './dockerhub-cache';\nimport { ecrPublicRegex, ecrRegex, isECRMaxResultsError } from './ecr';\nimport type { DistributionManifest, OciImageManifest } from './schema';\nimport {\n DockerHubTagsPage,\n ManifestJson,\n OciHelmConfig,\n OciImageConfig,\n} from './schema';\n\nconst defaultConfig = {\n commitMessageTopic: '{{{depName}}} Docker tag',\n commitMessageExtra:\n 'to {{#if isPinDigest}}{{{newDigestShort}}}{{else}}{{#if isMajor}}{{{prettyNewMajor}}}{{else}}{{{prettyNewVersion}}}{{/if}}{{/if}}',\n digest: {\n branchTopic: '{{{depNameSanitized}}}-{{{currentValue}}}',\n commitMessageExtra: 'to {{newDigestShort}}',\n commitMessageTopic:\n '{{{depName}}}{{#if currentValue}}:{{{currentValue}}}{{/if}} Docker digest',\n group: {\n commitMessageTopic: '{{{groupName}}}',\n commitMessageExtra: '',\n },\n },\n pin: {\n commitMessageExtra: '',\n groupName: 'Docker digests',\n group: {\n commitMessageTopic: '{{{groupName}}}',\n branchTopic: 'digests-pin',\n },\n },\n};\n\nexport class DockerDatasource extends Datasource {\n static readonly id = dockerDatasourceId;\n\n override readonly defaultVersioning = dockerVersioningId;\n\n override readonly defaultRegistryUrls = [DOCKER_HUB];\n\n override readonly defaultConfig = defaultConfig;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `tag_last_pushed` field in thre results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `org.opencontainers.image.source` and `org.label-schema.vcs-url` labels present in the metadata of the **latest stable** image found on the Docker registry.';\n\n constructor() {\n super(DockerDatasource.id);\n }\n\n // TODO: debug why quay throws errors (#9612)\n private async getManifestResponse(\n registryHost: string,\n dockerRepository: string,\n tag: string,\n mode: 'head' | 'get' = 'get',\n ): Promise<HttpResponse | null> {\n logger.debug(\n `getManifestResponse(${registryHost}, ${dockerRepository}, ${tag}, ${mode})`,\n );\n try {\n const headers = await getAuthHeaders(\n this.http,\n registryHost,\n dockerRepository,\n );\n if (!headers) {\n logger.warn('No docker auth found - returning');\n return null;\n }\n headers.accept = [\n 'application/vnd.docker.distribution.manifest.list.v2+json',\n 'application/vnd.docker.distribution.manifest.v2+json',\n 'application/vnd.oci.image.manifest.v1+json',\n 'application/vnd.oci.image.index.v1+json',\n ].join(', ');\n const url = `${registryHost}/v2/${dockerRepository}/manifests/${tag}`;\n const manifestResponse = await this.http[mode](url, {\n headers,\n noAuth: true,\n });\n return manifestResponse;\n } catch (err) /* istanbul ignore next */ {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.statusCode === 401) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Unauthorized docker lookup',\n );\n logger.debug({ err });\n return null;\n }\n if (err.statusCode === 404) {\n logger.debug(\n {\n err,\n registryHost,\n dockerRepository,\n tag,\n },\n 'Docker Manifest is unknown',\n );\n return null;\n }\n if (err.statusCode === 429 && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n if (err.statusCode >= 500 && err.statusCode < 600) {\n throw new ExternalHostError(err);\n }\n if (err.code === 'ETIMEDOUT') {\n logger.debug(\n { registryHost },\n 'Timeout when attempting to connect to docker registry',\n );\n logger.debug({ err });\n return null;\n }\n logger.debug(\n {\n err,\n registryHost,\n dockerRepository,\n tag,\n },\n 'Unknown Error looking up docker manifest',\n );\n return null;\n }\n }\n\n @cache({\n namespace: 'datasource-docker-imageconfig',\n key: (\n registryHost: string,\n dockerRepository: string,\n configDigest: string,\n ) => `${registryHost}:${dockerRepository}@${configDigest}`,\n ttlMinutes: 1440 * 28,\n })\n async getImageConfig(\n registryHost: string,\n dockerRepository: string,\n configDigest: string,\n ): Promise<HttpResponse<OciImageConfig> | undefined> {\n logger.trace(\n `getImageConfig(${registryHost}, ${dockerRepository}, ${configDigest})`,\n );\n\n const headers = await getAuthHeaders(\n this.http,\n registryHost,\n dockerRepository,\n );\n // istanbul ignore if: Should never happen\n if (!headers) {\n logger.warn('No docker auth found - returning');\n return undefined;\n }\n const url = joinUrlParts(\n registryHost,\n 'v2',\n dockerRepository,\n 'blobs',\n configDigest,\n );\n return await this.http.getJson(\n url,\n {\n headers,\n noAuth: true,\n },\n OciImageConfig,\n );\n }\n\n @cache({\n namespace: 'datasource-docker-imageconfig',\n key: (\n registryHost: string,\n dockerRepository: string,\n configDigest: string,\n ) => `${registryHost}:${dockerRepository}@${configDigest}`,\n ttlMinutes: 1440 * 28,\n })\n async getHelmConfig(\n registryHost: string,\n dockerRepository: string,\n configDigest: string,\n ): Promise<HttpResponse<OciHelmConfig> | undefined> {\n logger.trace(\n `getImageConfig(${registryHost}, ${dockerRepository}, ${configDigest})`,\n );\n\n const headers = await getAuthHeaders(\n this.http,\n registryHost,\n dockerRepository,\n );\n // istanbul ignore if: Should never happen\n if (!headers) {\n logger.warn('No docker auth found - returning');\n return undefined;\n }\n const url = joinUrlParts(\n registryHost,\n 'v2',\n dockerRepository,\n 'blobs',\n configDigest,\n );\n return await this.http.getJson(\n url,\n {\n headers,\n noAuth: true,\n },\n OciHelmConfig,\n );\n }\n\n private async getConfigDigest(\n registry: string,\n dockerRepository: string,\n tag: string,\n ): Promise<string | null> {\n return (\n (await this.getManifest(registry, dockerRepository, tag))?.config\n ?.digest ?? null\n );\n }\n\n private async getManifest(\n registry: string,\n dockerRepository: string,\n tag: string,\n ): Promise<OciImageManifest | DistributionManifest | null> {\n const manifestResponse = await this.getManifestResponse(\n registry,\n dockerRepository,\n tag,\n );\n\n // If getting the manifest fails here, then abort\n // This means that the latest tag doesn't have a manifest, which shouldn't\n // be possible\n // istanbul ignore if\n if (!manifestResponse) {\n return null;\n }\n\n // Softfail on invalid manifests\n const parsed = ManifestJson.safeParse(manifestResponse.body);\n if (!parsed.success) {\n logger.debug(\n {\n registry,\n dockerRepository,\n tag,\n body: manifestResponse.body,\n headers: manifestResponse.headers,\n err: parsed.error,\n },\n 'Invalid manifest response',\n );\n return null;\n }\n\n const manifest = parsed.data;\n\n switch (manifest.mediaType) {\n case 'application/vnd.docker.distribution.manifest.v2+json':\n case 'application/vnd.oci.image.manifest.v1+json':\n return manifest;\n case 'application/vnd.docker.distribution.manifest.list.v2+json':\n case 'application/vnd.oci.image.index.v1+json':\n if (!manifest.manifests.length) {\n logger.debug(\n { manifest },\n 'Invalid manifest list with no manifests - returning',\n );\n return null;\n }\n logger.trace(\n { registry, dockerRepository, tag },\n 'Found manifest list, using first image',\n );\n return this.getManifest(\n registry,\n dockerRepository,\n manifest.manifests[0].digest,\n );\n // istanbul ignore next: can't happen\n default:\n return null;\n }\n }\n\n @cache({\n namespace: 'datasource-docker-architecture',\n key: (\n registryHost: string,\n dockerRepository: string,\n currentDigest: string,\n ) => `${registryHost}:${dockerRepository}@${currentDigest}`,\n ttlMinutes: 1440 * 28,\n })\n async getImageArchitecture(\n registryHost: string,\n dockerRepository: string,\n currentDigest: string,\n ): Promise<string | null | undefined> {\n try {\n let manifestResponse: HttpResponse<string> | null;\n\n try {\n manifestResponse = await this.getManifestResponse(\n registryHost,\n dockerRepository,\n currentDigest,\n 'head',\n );\n } catch (_err) {\n const err =\n _err instanceof ExternalHostError\n ? _err.err\n : /* istanbul ignore next: can never happen */ _err;\n\n if (\n typeof err.statusCode === 'number' &&\n err.statusCode >= 500 &&\n err.statusCode < 600\n ) {\n // querying the digest manifest for a non existent image leads to a 500 statusCode\n return null;\n }\n\n /* istanbul ignore next */\n throw _err;\n }\n\n if (\n manifestResponse?.headers['content-type'] !==\n 'application/vnd.docker.distribution.manifest.v2+json' &&\n manifestResponse?.headers['content-type'] !==\n 'application/vnd.oci.image.manifest.v1+json'\n ) {\n return null;\n }\n\n const configDigest = await this.getConfigDigest(\n registryHost,\n dockerRepository,\n currentDigest,\n );\n if (!configDigest) {\n return null;\n }\n\n const configResponse = await this.getImageConfig(\n registryHost,\n dockerRepository,\n configDigest,\n );\n\n // TODO: fix me, architecture is required in spec\n if (\n configResponse &&\n ('config' in configResponse.body ||\n 'architecture' in configResponse.body)\n ) {\n const architecture = configResponse.body.architecture ?? null;\n logger.debug(\n `Current digest ${currentDigest} relates to architecture ${\n architecture ?? 'null'\n }`,\n );\n\n return architecture;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode !== 404 || err.message === PAGE_NOT_FOUND_ERROR) {\n throw err;\n }\n logger.debug(\n { registryHost, dockerRepository, currentDigest, err },\n 'Unknown error getting image architecture',\n );\n }\n\n return undefined;\n }\n\n /*\n * docker.getLabels\n *\n * This function will:\n * - Return the labels for the requested image\n */\n @cache({\n namespace: 'datasource-docker-labels',\n key: (registryHost: string, dockerRepository: string, tag: string) =>\n `${registryHost}:${dockerRepository}:${tag}`,\n ttlMinutes: 24 * 60,\n })\n async getLabels(\n registryHost: string,\n dockerRepository: string,\n tag: string,\n ): Promise<Record<string, string> | undefined> {\n logger.debug(`getLabels(${registryHost}, ${dockerRepository}, ${tag})`);\n // Skip Docker Hub image if RENOVATE_X_DOCKER_HUB_DISABLE_LABEL_LOOKUP is set\n if (\n process.env.RENOVATE_X_DOCKER_HUB_DISABLE_LABEL_LOOKUP &&\n registryHost === 'https://index.docker.io'\n ) {\n logger.debug(\n 'Docker Hub image - skipping label lookup due to RENOVATE_X_DOCKER_HUB_DISABLE_LABEL_LOOKUP',\n );\n return {};\n }\n // Docker Hub library images don't have labels we need\n if (\n registryHost === 'https://index.docker.io' &&\n dockerRepository.startsWith('library/')\n ) {\n logger.debug('Docker Hub library image - skipping label lookup');\n return {};\n }\n try {\n let labels: Record<string, string> | undefined = {};\n const manifest = await this.getManifest(\n registryHost,\n dockerRepository,\n tag,\n );\n\n if (!manifest) {\n logger.debug(\n { registryHost, dockerRepository, tag },\n 'No manifest found',\n );\n return undefined;\n }\n\n if ('annotations' in manifest && manifest.annotations) {\n labels = manifest.annotations;\n }\n\n switch (manifest.config.mediaType) {\n case 'application/vnd.cncf.helm.config.v1+json': {\n if (labels[sourceLabel]) {\n // we already have the source url, so no need to pull the config\n return labels;\n }\n const configResponse = await this.getHelmConfig(\n registryHost,\n dockerRepository,\n manifest.config.digest,\n );\n\n if (configResponse) {\n // Helm chart\n const url = findHelmSourceUrl(configResponse.body);\n if (url) {\n labels[sourceLabel] = url;\n }\n }\n break;\n }\n case 'application/vnd.oci.image.config.v1+json':\n case 'application/vnd.docker.container.image.v1+json': {\n if (labels[sourceLabel] && labels[gitRefLabel]) {\n // we already have the source url, so no need to pull the config\n return labels;\n }\n const configResponse = await this.getImageConfig(\n registryHost,\n dockerRepository,\n manifest.config.digest,\n );\n\n // istanbul ignore if: should never happen\n if (!configResponse) {\n return labels;\n }\n\n const body = configResponse.body;\n if (body.config) {\n labels = { ...labels, ...body.config.Labels };\n } else {\n logger.debug(\n { headers: configResponse.headers, body },\n `manifest blob response body missing the \"config\" property`,\n );\n }\n break;\n }\n }\n\n if (labels) {\n logger.debug(\n {\n labels,\n },\n 'found labels in manifest',\n );\n }\n return labels;\n } catch (err) /* istanbul ignore next: should be tested in future */ {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.statusCode === 400 || err.statusCode === 401) {\n logger.debug(\n { registryHost, dockerRepository, err },\n 'Unauthorized docker lookup',\n );\n } else if (err.statusCode === 404) {\n logger.warn(\n {\n err,\n registryHost,\n dockerRepository,\n tag,\n },\n 'Config Manifest is unknown',\n );\n } else if (err.statusCode === 429 && isDockerHost(registryHost)) {\n logger.warn({ err }, 'docker registry failure: too many requests');\n } else if (err.statusCode >= 500 && err.statusCode < 600) {\n logger.debug(\n {\n err,\n registryHost,\n dockerRepository,\n tag,\n },\n 'docker registry failure: internal error',\n );\n } else if (\n err.code === 'ERR_TLS_CERT_ALTNAME_INVALID' ||\n err.code === 'ETIMEDOUT'\n ) {\n logger.debug(\n { registryHost, err },\n 'Error connecting to docker registry',\n );\n } else if (registryHost === 'https://quay.io') {\n // istanbul ignore next\n logger.debug(\n 'Ignoring quay.io errors until they fully support v2 schema',\n );\n } else {\n logger.info(\n { registryHost, dockerRepository, tag, err },\n 'Unknown error getting Docker labels',\n );\n }\n return {};\n }\n }\n\n private async getTagsQuayRegistry(\n registry: string,\n repository: string,\n ): Promise<string[]> {\n let tags: string[] = [];\n const limit = 100;\n\n const pageUrl = (page: number): string =>\n `${registry}/api/v1/repository/${repository}/tag/?limit=${limit}&page=${page}&onlyActiveTags=true`;\n\n let page = 1;\n let url: string | null = pageUrl(page);\n while (url && page <= 20) {\n interface QuayRestDockerTags {\n tags: {\n name: string;\n }[];\n has_additional: boolean;\n }\n\n // typescript issue :-/\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const res = (await this.http.getJsonUnchecked<QuayRestDockerTags>(\n url,\n )) as HttpResponse<QuayRestDockerTags>;\n const pageTags = res.body.tags.map((tag) => tag.name);\n tags = tags.concat(pageTags);\n page += 1;\n url = res.body.has_additional ? pageUrl(page) : null;\n }\n return tags;\n }\n\n private async getDockerApiTags(\n registryHost: string,\n dockerRepository: string,\n ): Promise<string[] | null> {\n let tags: string[] = [];\n // AWS ECR limits the maximum number of results to 1000\n // See https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults\n // See https://docs.aws.amazon.com/AmazonECRPublic/latest/APIReference/API_DescribeRepositories.html#ecrpublic-DescribeRepositories-request-maxResults\n const limit =\n ecrRegex.test(registryHost) || ecrPublicRegex.test(registryHost)\n ? 1000\n : 10000;\n let url: string | null =\n `${registryHost}/${dockerRepository}/tags/list?n=${limit}`;\n url = ensurePathPrefix(url, '/v2');\n const headers = await getAuthHeaders(\n this.http,\n registryHost,\n dockerRepository,\n url,\n );\n if (!headers) {\n logger.debug('Failed to get authHeaders for getTags lookup');\n return null;\n }\n let page = 0;\n const pages = GlobalConfig.get('dockerMaxPages', 20);\n let foundMaxResultsError = false;\n do {\n let res: HttpResponse<{ tags: string[] }>;\n try {\n res = await this.http.getJsonUnchecked<{ tags: string[] }>(url, {\n headers,\n noAuth: true,\n });\n } catch (err) {\n if (\n !foundMaxResultsError &&\n err instanceof HttpError &&\n isECRMaxResultsError(err)\n ) {\n const maxResults = 1000;\n url = `${registryHost}/${dockerRepository}/tags/list?n=${maxResults}`;\n url = ensurePathPrefix(url, '/v2');\n foundMaxResultsError = true;\n continue;\n }\n throw err;\n }\n tags = tags.concat(res.body.tags);\n const linkHeader = parseLinkHeader(res.headers.link);\n if (isArtifactoryServer(res)) {\n // Artifactory incorrectly returns a next link without the virtual repository name\n // this is due to a bug in Artifactory https://jfrog.atlassian.net/browse/RTFACT-18971\n url = linkHeader?.next?.last\n ? `${url}&last=${linkHeader.next.last}`\n : null;\n } else {\n url = linkHeader?.next ? new URL(linkHeader.next.url, url).href : null;\n }\n page += 1;\n } while (url && page < pages);\n return tags;\n }\n\n @cache({\n namespace: 'datasource-docker-tags',\n key: (registryHost: string, dockerRepository: string) =>\n `${registryHost}:${dockerRepository}`,\n })\n async getTags(\n registryHost: string,\n dockerRepository: string,\n ): Promise<string[] | null> {\n try {\n const isQuay = regEx(/^https:\\/\\/quay\\.io(?::[1-9][0-9]{0,4})?$/i).test(\n registryHost,\n );\n let tags: string[] | null;\n if (isQuay) {\n tags = await this.getTagsQuayRegistry(registryHost, dockerRepository);\n } else {\n tags = await this.getDockerApiTags(registryHost, dockerRepository);\n }\n return tags;\n } catch (_err) /* istanbul ignore next */ {\n const err = _err instanceof ExternalHostError ? _err.err : _err;\n\n if (\n (err.statusCode === 404 || err.message === PAGE_NOT_FOUND_ERROR) &&\n !dockerRepository.includes('/')\n ) {\n logger.debug(\n `Retrying Tags for ${registryHost}/${dockerRepository} using library/ prefix`,\n );\n return this.getTags(registryHost, 'library/' + dockerRepository);\n }\n // JFrog Artifactory - Retry handling when resolving Docker Official Images\n // These follow the format of {{registryHost}}{{jFrogRepository}}/library/{{dockerRepository}}\n if (\n (err.statusCode === 404 || err.message === PAGE_NOT_FOUND_ERROR) &&\n isArtifactoryServer(err.response) &&\n dockerRepository.split('/').length === 2\n ) {\n logger.debug(\n `JFrog Artifactory: Retrying Tags for ${registryHost}/${dockerRepository} using library/ path between JFrog virtual repository and image`,\n );\n\n const dockerRepositoryParts = dockerRepository.split('/');\n const jfrogRepository = dockerRepositoryParts[0];\n const dockerImage = dockerRepositoryParts[1];\n\n return this.getTags(\n registryHost,\n jfrogRepository + '/library/' + dockerImage,\n );\n }\n if (err.statusCode === 429 && isDockerHost(registryHost)) {\n logger.warn(\n { registryHost, dockerRepository, err },\n 'docker registry failure: too many requests',\n );\n throw new ExternalHostError(err);\n }\n if (err.statusCode >= 500 && err.statusCode < 600) {\n logger.warn(\n { registryHost, dockerRepository, err },\n 'docker registry failure: internal error',\n );\n throw new ExternalHostError(err);\n }\n const errorCodes = ['ECONNRESET', 'ETIMEDOUT'];\n if (errorCodes.includes(err.code)) {\n logger.warn(\n { registryHost, dockerRepository, err },\n 'docker registry connection failure',\n );\n throw new ExternalHostError(err);\n }\n if (isDockerHost(registryHost)) {\n logger.info({ err }, 'Docker Hub lookup failure');\n }\n throw _err;\n }\n }\n\n /**\n * docker.getDigest\n *\n * The `newValue` supplied here should be a valid tag for the docker image.\n *\n * This function will:\n * - Look up a sha256 digest for a tag on its registry\n * - Return the digest as a string\n */\n @cache({\n namespace: 'datasource-docker-digest',\n key: (\n { registryUrl, packageName, currentDigest }: DigestConfig,\n newValue?: string,\n ) => {\n const newTag = newValue ?? 'latest';\n const { registryHost, dockerRepository } = getRegistryRepository(\n packageName,\n registryUrl!,\n );\n const digest = currentDigest ? `@${currentDigest}` : '';\n return `${registryHost}:${dockerRepository}:${newTag}${digest}`;\n },\n })\n override async getDigest(\n { registryUrl, lookupName, packageName, currentDigest }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n let registryHost: string;\n let dockerRepository: string;\n if (registryUrl && lookupName) {\n // Reuse the resolved values from getReleases()\n registryHost = registryUrl;\n dockerRepository = lookupName;\n } else {\n // Resolve values independently\n ({ registryHost, dockerRepository } = getRegistryRepository(\n packageName,\n registryUrl!,\n ));\n }\n logger.debug(\n // TODO: types (#22198)\n `getDigest(${registryHost}, ${dockerRepository}, ${newValue})`,\n );\n const newTag = is.nonEmptyString(newValue) ? newValue : 'latest';\n let digest: string | null = null;\n try {\n let architecture: string | null | undefined = null;\n if (currentDigest && isDockerDigest(currentDigest)) {\n architecture = await this.getImageArchitecture(\n registryHost,\n dockerRepository,\n currentDigest,\n );\n }\n\n let manifestResponse: HttpResponse | null = null;\n if (!architecture) {\n manifestResponse = await this.getManifestResponse(\n registryHost,\n dockerRepository,\n newTag,\n 'head',\n );\n\n if (\n manifestResponse &&\n hasKey('docker-content-digest', manifestResponse.headers)\n ) {\n digest =\n (manifestResponse.headers['docker-content-digest'] as string) ||\n null;\n }\n }\n\n if (\n is.string(architecture) ||\n (manifestResponse &&\n !hasKey('docker-content-digest', manifestResponse.headers))\n ) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Architecture-specific digest or missing docker-content-digest header - pulling full manifest',\n );\n manifestResponse = await this.getManifestResponse(\n registryHost,\n dockerRepository,\n newTag,\n );\n\n if (architecture && manifestResponse) {\n const parsed = ManifestJson.safeParse(manifestResponse.body);\n /* istanbul ignore else: hard to test */\n if (parsed.success) {\n const manifestList = parsed.data;\n if (\n manifestList.mediaType ===\n 'application/vnd.docker.distribution.manifest.list.v2+json' ||\n manifestList.mediaType ===\n 'application/vnd.oci.image.index.v1+json'\n ) {\n for (const manifest of manifestList.manifests) {\n if (manifest.platform?.architecture === architecture) {\n digest = manifest.digest;\n break;\n }\n }\n // TODO: return null if no matching architecture digest found\n // https://github.com/renovatebot/renovate/discussions/22639\n } else if (\n hasKey('docker-content-digest', manifestResponse.headers)\n ) {\n // TODO: return null if no matching architecture, requires to fetch the config manifest\n // https://github.com/renovatebot/renovate/discussions/22639\n digest = manifestResponse.headers[\n 'docker-content-digest'\n ] as string;\n }\n } else {\n logger.debug(\n {\n registryHost,\n dockerRepository,\n newTag,\n body: manifestResponse.body,\n headers: manifestResponse.headers,\n err: parsed.error,\n },\n 'Failed to parse manifest response',\n );\n }\n }\n\n if (!digest) {\n logger.debug(\n { registryHost, dockerRepository, newTag },\n 'Extraction digest from manifest response body is deprecated',\n );\n digest = extractDigestFromResponseBody(manifestResponse!);\n }\n }\n\n if (\n !manifestResponse &&\n !dockerRepository.includes('/') &&\n !packageName.includes('/')\n ) {\n logger.debug(\n `Retrying Digest for ${registryHost}/${dockerRepository} using library/ prefix`,\n );\n return this.getDigest(\n {\n registryUrl,\n packageName: 'library/' + packageName,\n currentDigest,\n },\n newValue,\n );\n }\n\n if (manifestResponse) {\n // TODO: fix types (#22198)\n logger.debug(`Got docker digest ${digest!}`);\n }\n } catch (err) /* istanbul ignore next */ {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n {\n err,\n packageName,\n newTag,\n },\n 'Unknown Error looking up docker image digest',\n );\n }\n return digest;\n }\n\n @cache({\n namespace: 'datasource-docker-hub-tags',\n key: (dockerRepository: string) => `${dockerRepository}`,\n })\n async getDockerHubTags(dockerRepository: string): Promise<Release[] | null> {\n let url = `https://hub.docker.com/v2/repositories/${dockerRepository}/tags?page_size=1000&ordering=last_updated`;\n\n const cache = await DockerHubCache.init(dockerRepository);\n let needNextPage: boolean = true;\n while (needNextPage) {\n const { val, err } = await this.http\n .getJsonSafe(url, DockerHubTagsPage)\n .unwrap();\n\n if (err) {\n logger.debug({ err }, `Docker: error fetching data from DockerHub`);\n return null;\n }\n\n const { results, next, count } = val;\n\n needNextPage = cache.reconcile(results, count);\n\n if (!next) {\n break;\n }\n\n url = next;\n }\n\n await cache.save();\n\n const items = cache.getItems();\n return items.map(\n ({ name: version, tag_last_pushed, digest: newDigest }) => {\n const release: Release = { version };\n\n const releaseTimestamp = asTimestamp(tag_last_pushed);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n if (newDigest) {\n release.newDigest = newDigest;\n }\n\n return release;\n },\n );\n }\n\n /**\n * docker.getReleases\n *\n * A docker image usually looks something like this: somehost.io/owner/repo:8.1.0-alpine\n * In the above:\n * - 'somehost.io' is the registry\n * - 'owner/repo' is the package name\n * - '8.1.0-alpine' is the tag\n *\n * This function will filter only tags that contain a semver version\n */\n @cache({\n namespace: 'datasource-docker-releases-v2',\n key: ({ registryUrl, packageName }: GetReleasesConfig) => {\n const { registryHost, dockerRepository } = getRegistryRepository(\n packageName,\n registryUrl!,\n );\n return `${registryHost}:${dockerRepository}`;\n },\n cacheable: ({ registryUrl, packageName }: GetReleasesConfig) => {\n const { registryHost } = getRegistryRepository(packageName, registryUrl!);\n return registryHost === 'https://index.docker.io';\n },\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const { registryHost, dockerRepository } = getRegistryRepository(\n packageName,\n registryUrl!,\n );\n\n type TagsResultType = AsyncResult<\n Release[],\n NonNullable<Error | 'tags-error' | 'dockerhub-error'>\n >;\n\n const getTags = (): TagsResultType =>\n Result.wrapNullable(\n this.getTags(registryHost, dockerRepository),\n 'tags-error' as const,\n ).transform((tags) => tags.map((version) => ({ version })));\n\n const getDockerHubTags = (): TagsResultType =>\n Result.wrapNullable(\n this.getDockerHubTags(dockerRepository),\n 'dockerhub-error' as const,\n ).catch(getTags);\n\n const tagsResult =\n registryHost === 'https://index.docker.io' &&\n !process.env.RENOVATE_X_DOCKER_HUB_TAGS_DISABLE\n ? getDockerHubTags()\n : getTags();\n\n const { val: releases, err } = await tagsResult.unwrap();\n if (err instanceof Error) {\n throw err;\n } else if (err) {\n return null;\n }\n\n const ret: ReleaseResult = {\n registryUrl: registryHost,\n releases,\n };\n if (dockerRepository !== packageName) {\n // This will be reused later if a getDigest() call is made\n ret.lookupName = dockerRepository;\n }\n\n const tags = releases.map((release) => release.version);\n const latestTag = tags.includes('latest')\n ? 'latest'\n : (findLatestStable(tags) ?? tags[tags.length - 1]);\n\n // istanbul ignore if: needs test\n if (!latestTag) {\n return ret;\n }\n const labels = await this.getLabels(\n registryHost,\n dockerRepository,\n latestTag,\n );\n if (labels) {\n if (is.nonEmptyString(labels[gitRefLabel])) {\n ret.gitRef = labels[gitRefLabel];\n }\n for (const label of sourceLabels) {\n if (is.nonEmptyString(labels[label])) {\n ret.sourceUrl = labels[label];\n break;\n }\n }\n if (is.nonEmptyString(labels[imageUrlLabel])) {\n ret.homepage = labels[imageUrlLabel];\n }\n }\n return ret;\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/docker/index.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global';\nimport { PAGE_NOT_FOUND_ERROR } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { HttpError } from '../../../util/http';\nimport type { HttpResponse } from '../../../util/http/types';\nimport { hasKey } from '../../../util/object';\nimport { regEx } from '../../../util/regex';\nimport { type AsyncResult, Result } from '../../../util/result';\nimport { isDockerDigest } from '../../../util/string-match';\nimport { asTimestamp } from '../../../util/timestamp';\nimport {\n ensurePathPrefix,\n joinUrlParts,\n parseLinkHeader,\n} from '../../../util/url';\nimport { id as dockerVersioningId } from '../../versioning/docker';\nimport { Datasource } from '../datasource';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types';\nimport { isArtifactoryServer } from '../util';\nimport {\n DOCKER_HUB,\n dockerDatasourceId,\n extractDigestFromResponseBody,\n findHelmSourceUrl,\n findLatestStable,\n getAuthHeaders,\n getRegistryRepository,\n gitRefLabel,\n imageUrlLabel,\n isDockerHost,\n sourceLabel,\n sourceLabels,\n} from './common';\nimport { DockerHubCache } from './dockerhub-cache';\nimport { ecrPublicRegex, ecrRegex, isECRMaxResultsError } from './ecr';\nimport type { DistributionManifest, OciImageManifest } from './schema';\nimport {\n DockerHubTagsPage,\n ManifestJson,\n OciHelmConfig,\n OciImageConfig,\n} from './schema';\n\nconst defaultConfig = {\n commitMessageTopic: '{{{depName}}} Docker tag',\n commitMessageExtra:\n 'to {{#if isPinDigest}}{{{newDigestShort}}}{{else}}{{#if isMajor}}{{{prettyNewMajor}}}{{else}}{{{prettyNewVersion}}}{{/if}}{{/if}}',\n digest: {\n branchTopic: '{{{depNameSanitized}}}-{{{currentValue}}}',\n commitMessageExtra: 'to {{newDigestShort}}',\n commitMessageTopic:\n '{{{depName}}}{{#if currentValue}}:{{{currentValue}}}{{/if}} Docker digest',\n group: {\n commitMessageTopic: '{{{groupName}}}',\n commitMessageExtra: '',\n },\n },\n pin: {\n commitMessageExtra: '',\n groupName: 'Docker digests',\n group: {\n commitMessageTopic: '{{{groupName}}}',\n branchTopic: 'digests-pin',\n },\n },\n};\n\nexport class DockerDatasource extends Datasource {\n static readonly id = dockerDatasourceId;\n\n override readonly defaultVersioning = dockerVersioningId;\n\n override readonly defaultRegistryUrls = [DOCKER_HUB];\n\n override readonly defaultConfig = defaultConfig;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `tag_last_pushed` field in thre results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `org.opencontainers.image.source` and `org.label-schema.vcs-url` labels present in the metadata of the **latest stable** image found on the Docker registry.';\n\n constructor() {\n super(DockerDatasource.id);\n }\n\n // TODO: debug why quay throws errors (#9612)\n private async getManifestResponse(\n registryHost: string,\n dockerRepository: string,\n tag: string,\n mode: 'head' | 'get' = 'get',\n ): Promise<HttpResponse | null> {\n logger.debug(\n `getManifestResponse(${registryHost}, ${dockerRepository}, ${tag}, ${mode})`,\n );\n try {\n const headers = await getAuthHeaders(\n this.http,\n registryHost,\n dockerRepository,\n );\n if (!headers) {\n logger.warn('No docker auth found - returning');\n return null;\n }\n headers.accept = [\n 'application/vnd.docker.distribution.manifest.list.v2+json',\n 'application/vnd.docker.distribution.manifest.v2+json',\n 'application/vnd.oci.image.manifest.v1+json',\n 'application/vnd.oci.image.index.v1+json',\n ].join(', ');\n const url = `${registryHost}/v2/${dockerRepository}/manifests/${tag}`;\n const manifestResponse = await this.http[mode](url, {\n headers,\n noAuth: true,\n });\n return manifestResponse;\n } catch (err) /* istanbul ignore next */ {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.statusCode === 401) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Unauthorized docker lookup',\n );\n logger.debug({ err });\n return null;\n }\n if (err.statusCode === 404) {\n logger.debug(\n {\n err,\n registryHost,\n dockerRepository,\n tag,\n },\n 'Docker Manifest is unknown',\n );\n return null;\n }\n if (err.statusCode === 429 && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n if (err.statusCode >= 500 && err.statusCode < 600) {\n throw new ExternalHostError(err);\n }\n if (err.code === 'ETIMEDOUT') {\n logger.debug(\n { registryHost },\n 'Timeout when attempting to connect to docker registry',\n );\n logger.debug({ err });\n return null;\n }\n logger.debug(\n {\n err,\n registryHost,\n dockerRepository,\n tag,\n },\n 'Unknown Error looking up docker manifest',\n );\n return null;\n }\n }\n\n @cache({\n namespace: 'datasource-docker-imageconfig',\n key: (\n registryHost: string,\n dockerRepository: string,\n configDigest: string,\n ) => `${registryHost}:${dockerRepository}@${configDigest}`,\n ttlMinutes: 1440 * 28,\n })\n async getImageConfig(\n registryHost: string,\n dockerRepository: string,\n configDigest: string,\n ): Promise<HttpResponse<OciImageConfig> | undefined> {\n logger.trace(\n `getImageConfig(${registryHost}, ${dockerRepository}, ${configDigest})`,\n );\n\n const headers = await getAuthHeaders(\n this.http,\n registryHost,\n dockerRepository,\n );\n // istanbul ignore if: Should never happen\n if (!headers) {\n logger.warn('No docker auth found - returning');\n return undefined;\n }\n const url = joinUrlParts(\n registryHost,\n 'v2',\n dockerRepository,\n 'blobs',\n configDigest,\n );\n return await this.http.getJson(\n url,\n {\n headers,\n noAuth: true,\n },\n OciImageConfig,\n );\n }\n\n @cache({\n namespace: 'datasource-docker-imageconfig',\n key: (\n registryHost: string,\n dockerRepository: string,\n configDigest: string,\n ) => `${registryHost}:${dockerRepository}@${configDigest}`,\n ttlMinutes: 1440 * 28,\n })\n async getHelmConfig(\n registryHost: string,\n dockerRepository: string,\n configDigest: string,\n ): Promise<HttpResponse<OciHelmConfig> | undefined> {\n logger.trace(\n `getImageConfig(${registryHost}, ${dockerRepository}, ${configDigest})`,\n );\n\n const headers = await getAuthHeaders(\n this.http,\n registryHost,\n dockerRepository,\n );\n // istanbul ignore if: Should never happen\n if (!headers) {\n logger.warn('No docker auth found - returning');\n return undefined;\n }\n const url = joinUrlParts(\n registryHost,\n 'v2',\n dockerRepository,\n 'blobs',\n configDigest,\n );\n return await this.http.getJson(\n url,\n {\n headers,\n noAuth: true,\n },\n OciHelmConfig,\n );\n }\n\n private async getConfigDigest(\n registry: string,\n dockerRepository: string,\n tag: string,\n ): Promise<string | null> {\n return (\n (await this.getManifest(registry, dockerRepository, tag))?.config\n ?.digest ?? null\n );\n }\n\n private async getManifest(\n registry: string,\n dockerRepository: string,\n tag: string,\n ): Promise<OciImageManifest | DistributionManifest | null> {\n const manifestResponse = await this.getManifestResponse(\n registry,\n dockerRepository,\n tag,\n );\n\n // If getting the manifest fails here, then abort\n // This means that the latest tag doesn't have a manifest, which shouldn't\n // be possible\n // istanbul ignore if\n if (!manifestResponse) {\n return null;\n }\n\n // Softfail on invalid manifests\n const parsed = ManifestJson.safeParse(manifestResponse.body);\n if (!parsed.success) {\n logger.debug(\n {\n registry,\n dockerRepository,\n tag,\n body: manifestResponse.body,\n headers: manifestResponse.headers,\n err: parsed.error,\n },\n 'Invalid manifest response',\n );\n return null;\n }\n\n const manifest = parsed.data;\n\n switch (manifest.mediaType) {\n case 'application/vnd.docker.distribution.manifest.v2+json':\n case 'application/vnd.oci.image.manifest.v1+json':\n return manifest;\n case 'application/vnd.docker.distribution.manifest.list.v2+json':\n case 'application/vnd.oci.image.index.v1+json':\n if (!manifest.manifests.length) {\n logger.debug(\n { manifest },\n 'Invalid manifest list with no manifests - returning',\n );\n return null;\n }\n logger.trace(\n { registry, dockerRepository, tag },\n 'Found manifest list, using first image',\n );\n return this.getManifest(\n registry,\n dockerRepository,\n manifest.manifests[0].digest,\n );\n // istanbul ignore next: can't happen\n default:\n return null;\n }\n }\n\n @cache({\n namespace: 'datasource-docker-architecture',\n key: (\n registryHost: string,\n dockerRepository: string,\n currentDigest: string,\n ) => `${registryHost}:${dockerRepository}@${currentDigest}`,\n ttlMinutes: 1440 * 28,\n })\n async getImageArchitecture(\n registryHost: string,\n dockerRepository: string,\n currentDigest: string,\n ): Promise<string | null | undefined> {\n try {\n let manifestResponse: HttpResponse<string> | null;\n\n try {\n manifestResponse = await this.getManifestResponse(\n registryHost,\n dockerRepository,\n currentDigest,\n 'head',\n );\n } catch (_err) {\n const err =\n _err instanceof ExternalHostError\n ? _err.err\n : /* istanbul ignore next: can never happen */ _err;\n\n if (\n typeof err.statusCode === 'number' &&\n err.statusCode >= 500 &&\n err.statusCode < 600\n ) {\n // querying the digest manifest for a non existent image leads to a 500 statusCode\n return null;\n }\n\n /* istanbul ignore next */\n throw _err;\n }\n\n if (\n manifestResponse?.headers['content-type'] !==\n 'application/vnd.docker.distribution.manifest.v2+json' &&\n manifestResponse?.headers['content-type'] !==\n 'application/vnd.oci.image.manifest.v1+json'\n ) {\n return null;\n }\n\n const configDigest = await this.getConfigDigest(\n registryHost,\n dockerRepository,\n currentDigest,\n );\n if (!configDigest) {\n return null;\n }\n\n const configResponse = await this.getImageConfig(\n registryHost,\n dockerRepository,\n configDigest,\n );\n\n // TODO: fix me, architecture is required in spec\n if (\n configResponse &&\n ('config' in configResponse.body ||\n 'architecture' in configResponse.body)\n ) {\n const architecture = configResponse.body.architecture ?? null;\n logger.debug(\n `Current digest ${currentDigest} relates to architecture ${\n architecture ?? 'null'\n }`,\n );\n\n return architecture;\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.statusCode !== 404 || err.message === PAGE_NOT_FOUND_ERROR) {\n throw err;\n }\n logger.debug(\n { registryHost, dockerRepository, currentDigest, err },\n 'Unknown error getting image architecture',\n );\n }\n\n return undefined;\n }\n\n /*\n * docker.getLabels\n *\n * This function will:\n * - Return the labels for the requested image\n */\n @cache({\n namespace: 'datasource-docker-labels',\n key: (registryHost: string, dockerRepository: string, tag: string) =>\n `${registryHost}:${dockerRepository}:${tag}`,\n ttlMinutes: 24 * 60,\n })\n async getLabels(\n registryHost: string,\n dockerRepository: string,\n tag: string,\n ): Promise<Record<string, string> | undefined> {\n logger.debug(`getLabels(${registryHost}, ${dockerRepository}, ${tag})`);\n // Skip Docker Hub image if RENOVATE_X_DOCKER_HUB_DISABLE_LABEL_LOOKUP is set\n if (\n process.env.RENOVATE_X_DOCKER_HUB_DISABLE_LABEL_LOOKUP &&\n registryHost === 'https://index.docker.io'\n ) {\n logger.debug(\n 'Docker Hub image - skipping label lookup due to RENOVATE_X_DOCKER_HUB_DISABLE_LABEL_LOOKUP',\n );\n return {};\n }\n // Docker Hub library images don't have labels we need\n if (\n registryHost === 'https://index.docker.io' &&\n dockerRepository.startsWith('library/')\n ) {\n logger.debug('Docker Hub library image - skipping label lookup');\n return {};\n }\n try {\n let labels: Record<string, string> | undefined = {};\n const manifest = await this.getManifest(\n registryHost,\n dockerRepository,\n tag,\n );\n\n if (!manifest) {\n logger.debug(\n { registryHost, dockerRepository, tag },\n 'No manifest found',\n );\n return undefined;\n }\n\n if ('annotations' in manifest && manifest.annotations) {\n labels = manifest.annotations;\n }\n\n switch (manifest.config.mediaType) {\n case 'application/vnd.cncf.helm.config.v1+json': {\n if (labels[sourceLabel]) {\n // we already have the source url, so no need to pull the config\n return labels;\n }\n const configResponse = await this.getHelmConfig(\n registryHost,\n dockerRepository,\n manifest.config.digest,\n );\n\n if (configResponse) {\n // Helm chart\n const url = findHelmSourceUrl(configResponse.body);\n if (url) {\n labels[sourceLabel] = url;\n }\n }\n break;\n }\n case 'application/vnd.oci.image.config.v1+json':\n case 'application/vnd.docker.container.image.v1+json': {\n if (labels[sourceLabel] && labels[gitRefLabel]) {\n // we already have the source url, so no need to pull the config\n return labels;\n }\n const configResponse = await this.getImageConfig(\n registryHost,\n dockerRepository,\n manifest.config.digest,\n );\n\n // istanbul ignore if: should never happen\n if (!configResponse) {\n return labels;\n }\n\n const body = configResponse.body;\n if (body.config) {\n labels = { ...labels, ...body.config.Labels };\n } else {\n logger.debug(\n { headers: configResponse.headers, body },\n `manifest blob response body missing the \"config\" property`,\n );\n }\n break;\n }\n }\n\n if (labels) {\n logger.debug(\n {\n labels,\n },\n 'found labels in manifest',\n );\n }\n return labels;\n } catch (err) /* istanbul ignore next: should be tested in future */ {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n if (err.statusCode === 400 || err.statusCode === 401) {\n logger.debug(\n { registryHost, dockerRepository, err },\n 'Unauthorized docker lookup',\n );\n } else if (err.statusCode === 404) {\n logger.warn(\n {\n err,\n registryHost,\n dockerRepository,\n tag,\n },\n 'Config Manifest is unknown',\n );\n } else if (err.statusCode === 429 && isDockerHost(registryHost)) {\n logger.warn({ err }, 'docker registry failure: too many requests');\n } else if (err.statusCode >= 500 && err.statusCode < 600) {\n logger.debug(\n {\n err,\n registryHost,\n dockerRepository,\n tag,\n },\n 'docker registry failure: internal error',\n );\n } else if (\n err.code === 'ERR_TLS_CERT_ALTNAME_INVALID' ||\n err.code === 'ETIMEDOUT'\n ) {\n logger.debug(\n { registryHost, err },\n 'Error connecting to docker registry',\n );\n } else if (registryHost === 'https://quay.io') {\n // istanbul ignore next\n logger.debug(\n 'Ignoring quay.io errors until they fully support v2 schema',\n );\n } else {\n logger.info(\n { registryHost, dockerRepository, tag, err },\n 'Unknown error getting Docker labels',\n );\n }\n return {};\n }\n }\n\n private async getTagsQuayRegistry(\n registry: string,\n repository: string,\n ): Promise<string[]> {\n let tags: string[] = [];\n const limit = 100;\n\n const pageUrl = (page: number): string =>\n `${registry}/api/v1/repository/${repository}/tag/?limit=${limit}&page=${page}&onlyActiveTags=true`;\n\n let page = 1;\n let url: string | null = pageUrl(page);\n while (url && page <= 20) {\n interface QuayRestDockerTags {\n tags: {\n name: string;\n }[];\n has_additional: boolean;\n }\n\n // typescript issue :-/\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const res = (await this.http.getJsonUnchecked<QuayRestDockerTags>(\n url,\n )) as HttpResponse<QuayRestDockerTags>;\n const pageTags = res.body.tags.map((tag) => tag.name);\n tags = tags.concat(pageTags);\n page += 1;\n url = res.body.has_additional ? pageUrl(page) : null;\n }\n return tags;\n }\n\n private async getDockerApiTags(\n registryHost: string,\n dockerRepository: string,\n ): Promise<string[] | null> {\n let tags: string[] = [];\n // AWS ECR limits the maximum number of results to 1000\n // See https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults\n // See https://docs.aws.amazon.com/AmazonECRPublic/latest/APIReference/API_DescribeRepositories.html#ecrpublic-DescribeRepositories-request-maxResults\n const limit =\n ecrRegex.test(registryHost) || ecrPublicRegex.test(registryHost)\n ? 1000\n : 10000;\n let url: string | null =\n `${registryHost}/${dockerRepository}/tags/list?n=${limit}`;\n url = ensurePathPrefix(url, '/v2');\n const headers = await getAuthHeaders(\n this.http,\n registryHost,\n dockerRepository,\n url,\n );\n if (!headers) {\n logger.debug('Failed to get authHeaders for getTags lookup');\n return null;\n }\n let page = 0;\n const pages = GlobalConfig.get('dockerMaxPages', 20);\n let foundMaxResultsError = false;\n do {\n let res: HttpResponse<{ tags: string[] }>;\n try {\n res = await this.http.getJsonUnchecked<{ tags: string[] }>(url, {\n headers,\n noAuth: true,\n });\n } catch (err) {\n if (\n !foundMaxResultsError &&\n err instanceof HttpError &&\n isECRMaxResultsError(err)\n ) {\n const maxResults = 1000;\n url = `${registryHost}/${dockerRepository}/tags/list?n=${maxResults}`;\n url = ensurePathPrefix(url, '/v2');\n foundMaxResultsError = true;\n continue;\n }\n throw err;\n }\n tags = tags.concat(res.body.tags);\n const linkHeader = parseLinkHeader(res.headers.link);\n if (isArtifactoryServer(res)) {\n // Artifactory incorrectly returns a next link without the virtual repository name\n // this is due to a bug in Artifactory https://jfrog.atlassian.net/browse/RTFACT-18971\n url = linkHeader?.next?.last\n ? `${url}&last=${linkHeader.next.last}`\n : null;\n } else {\n url = linkHeader?.next ? new URL(linkHeader.next.url, url).href : null;\n }\n page += 1;\n } while (url && page < pages);\n return tags;\n }\n\n @cache({\n namespace: 'datasource-docker-tags',\n key: (registryHost: string, dockerRepository: string) =>\n `${registryHost}:${dockerRepository}`,\n })\n async getTags(\n registryHost: string,\n dockerRepository: string,\n ): Promise<string[] | null> {\n try {\n const isQuay = regEx(/^https:\\/\\/quay\\.io(?::[1-9][0-9]{0,4})?$/i).test(\n registryHost,\n );\n let tags: string[] | null;\n if (isQuay) {\n tags = await this.getTagsQuayRegistry(registryHost, dockerRepository);\n } else {\n tags = await this.getDockerApiTags(registryHost, dockerRepository);\n }\n return tags;\n } catch (_err) /* istanbul ignore next */ {\n const err = _err instanceof ExternalHostError ? _err.err : _err;\n\n if (\n (err.statusCode === 404 || err.message === PAGE_NOT_FOUND_ERROR) &&\n !dockerRepository.includes('/')\n ) {\n logger.debug(\n `Retrying Tags for ${registryHost}/${dockerRepository} using library/ prefix`,\n );\n return this.getTags(registryHost, 'library/' + dockerRepository);\n }\n // JFrog Artifactory - Retry handling when resolving Docker Official Images\n // These follow the format of {{registryHost}}{{jFrogRepository}}/library/{{dockerRepository}}\n if (\n (err.statusCode === 404 || err.message === PAGE_NOT_FOUND_ERROR) &&\n isArtifactoryServer(err.response) &&\n dockerRepository.split('/').length === 2\n ) {\n logger.debug(\n `JFrog Artifactory: Retrying Tags for ${registryHost}/${dockerRepository} using library/ path between JFrog virtual repository and image`,\n );\n\n const dockerRepositoryParts = dockerRepository.split('/');\n const jfrogRepository = dockerRepositoryParts[0];\n const dockerImage = dockerRepositoryParts[1];\n\n return this.getTags(\n registryHost,\n jfrogRepository + '/library/' + dockerImage,\n );\n }\n if (err.statusCode === 429 && isDockerHost(registryHost)) {\n logger.warn(\n { registryHost, dockerRepository, err },\n 'docker registry failure: too many requests',\n );\n throw new ExternalHostError(err);\n }\n if (err.statusCode >= 500 && err.statusCode < 600) {\n logger.warn(\n { registryHost, dockerRepository, err },\n 'docker registry failure: internal error',\n );\n throw new ExternalHostError(err);\n }\n const errorCodes = ['ECONNRESET', 'ETIMEDOUT'];\n if (errorCodes.includes(err.code)) {\n logger.warn(\n { registryHost, dockerRepository, err },\n 'docker registry connection failure',\n );\n throw new ExternalHostError(err);\n }\n if (isDockerHost(registryHost)) {\n logger.info({ err }, 'Docker Hub lookup failure');\n }\n throw _err;\n }\n }\n\n /**\n * docker.getDigest\n *\n * The `newValue` supplied here should be a valid tag for the docker image.\n *\n * This function will:\n * - Look up a sha256 digest for a tag on its registry\n * - Return the digest as a string\n */\n @cache({\n namespace: 'datasource-docker-digest',\n key: (\n { registryUrl, packageName, currentDigest }: DigestConfig,\n newValue?: string,\n ) => {\n const newTag = newValue ?? 'latest';\n const { registryHost, dockerRepository } = getRegistryRepository(\n packageName,\n registryUrl!,\n );\n const digest = currentDigest ? `@${currentDigest}` : '';\n return `${registryHost}:${dockerRepository}:${newTag}${digest}`;\n },\n })\n override async getDigest(\n { registryUrl, lookupName, packageName, currentDigest }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n let registryHost: string;\n let dockerRepository: string;\n if (registryUrl && lookupName) {\n // Reuse the resolved values from getReleases()\n registryHost = registryUrl;\n dockerRepository = lookupName;\n } else {\n // Resolve values independently\n ({ registryHost, dockerRepository } = getRegistryRepository(\n packageName,\n registryUrl!,\n ));\n }\n logger.debug(\n // TODO: types (#22198)\n `getDigest(${registryHost}, ${dockerRepository}, ${newValue})`,\n );\n const newTag = is.nonEmptyString(newValue) ? newValue : 'latest';\n let digest: string | null = null;\n try {\n let architecture: string | null | undefined = null;\n if (currentDigest && isDockerDigest(currentDigest)) {\n architecture = await this.getImageArchitecture(\n registryHost,\n dockerRepository,\n currentDigest,\n );\n }\n\n let manifestResponse: HttpResponse | null = null;\n if (!architecture) {\n manifestResponse = await this.getManifestResponse(\n registryHost,\n dockerRepository,\n newTag,\n 'head',\n );\n\n if (\n manifestResponse &&\n hasKey('docker-content-digest', manifestResponse.headers)\n ) {\n digest =\n (manifestResponse.headers['docker-content-digest'] as string) ||\n null;\n }\n }\n\n if (\n is.string(architecture) ||\n (manifestResponse &&\n !hasKey('docker-content-digest', manifestResponse.headers))\n ) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Architecture-specific digest or missing docker-content-digest header - pulling full manifest',\n );\n manifestResponse = await this.getManifestResponse(\n registryHost,\n dockerRepository,\n newTag,\n );\n\n if (architecture && manifestResponse) {\n const parsed = ManifestJson.safeParse(manifestResponse.body);\n /* istanbul ignore else: hard to test */\n if (parsed.success) {\n const manifestList = parsed.data;\n if (\n manifestList.mediaType ===\n 'application/vnd.docker.distribution.manifest.list.v2+json' ||\n manifestList.mediaType ===\n 'application/vnd.oci.image.index.v1+json'\n ) {\n for (const manifest of manifestList.manifests) {\n if (manifest.platform?.architecture === architecture) {\n digest = manifest.digest;\n break;\n }\n }\n // TODO: return null if no matching architecture digest found\n // https://github.com/renovatebot/renovate/discussions/22639\n } else if (\n hasKey('docker-content-digest', manifestResponse.headers)\n ) {\n // TODO: return null if no matching architecture, requires to fetch the config manifest\n // https://github.com/renovatebot/renovate/discussions/22639\n digest = manifestResponse.headers[\n 'docker-content-digest'\n ] as string;\n }\n } else {\n logger.debug(\n {\n registryHost,\n dockerRepository,\n newTag,\n body: manifestResponse.body,\n headers: manifestResponse.headers,\n err: parsed.error,\n },\n 'Failed to parse manifest response',\n );\n }\n }\n\n if (!digest) {\n logger.debug(\n { registryHost, dockerRepository, newTag },\n 'Extraction digest from manifest response body is deprecated',\n );\n digest = extractDigestFromResponseBody(manifestResponse!);\n }\n }\n\n if (\n !manifestResponse &&\n !dockerRepository.includes('/') &&\n !packageName.includes('/')\n ) {\n logger.debug(\n `Retrying Digest for ${registryHost}/${dockerRepository} using library/ prefix`,\n );\n return this.getDigest(\n {\n registryUrl,\n packageName: 'library/' + packageName,\n currentDigest,\n },\n newValue,\n );\n }\n\n if (manifestResponse) {\n // TODO: fix types (#22198)\n logger.debug(`Got docker digest ${digest!}`);\n }\n } catch (err) /* istanbul ignore next */ {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n {\n err,\n packageName,\n newTag,\n },\n 'Unknown Error looking up docker image digest',\n );\n }\n return digest;\n }\n\n @cache({\n namespace: 'datasource-docker-hub-tags',\n key: (dockerRepository: string) => `${dockerRepository}`,\n })\n async getDockerHubTags(dockerRepository: string): Promise<Release[] | null> {\n let url = `https://hub.docker.com/v2/repositories/${dockerRepository}/tags?page_size=1000&ordering=last_updated`;\n\n const cache = await DockerHubCache.init(dockerRepository);\n let needNextPage = true;\n while (needNextPage) {\n const { val, err } = await this.http\n .getJsonSafe(url, DockerHubTagsPage)\n .unwrap();\n\n if (err) {\n logger.debug({ err }, `Docker: error fetching data from DockerHub`);\n return null;\n }\n\n const { results, next, count } = val;\n\n needNextPage = cache.reconcile(results, count);\n\n if (!next) {\n break;\n }\n\n url = next;\n }\n\n await cache.save();\n\n const items = cache.getItems();\n return items.map(\n ({ name: version, tag_last_pushed, digest: newDigest }) => {\n const release: Release = { version };\n\n const releaseTimestamp = asTimestamp(tag_last_pushed);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n if (newDigest) {\n release.newDigest = newDigest;\n }\n\n return release;\n },\n );\n }\n\n /**\n * docker.getReleases\n *\n * A docker image usually looks something like this: somehost.io/owner/repo:8.1.0-alpine\n * In the above:\n * - 'somehost.io' is the registry\n * - 'owner/repo' is the package name\n * - '8.1.0-alpine' is the tag\n *\n * This function will filter only tags that contain a semver version\n */\n @cache({\n namespace: 'datasource-docker-releases-v2',\n key: ({ registryUrl, packageName }: GetReleasesConfig) => {\n const { registryHost, dockerRepository } = getRegistryRepository(\n packageName,\n registryUrl!,\n );\n return `${registryHost}:${dockerRepository}`;\n },\n cacheable: ({ registryUrl, packageName }: GetReleasesConfig) => {\n const { registryHost } = getRegistryRepository(packageName, registryUrl!);\n return registryHost === 'https://index.docker.io';\n },\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const { registryHost, dockerRepository } = getRegistryRepository(\n packageName,\n registryUrl!,\n );\n\n type TagsResultType = AsyncResult<\n Release[],\n NonNullable<Error | 'tags-error' | 'dockerhub-error'>\n >;\n\n const getTags = (): TagsResultType =>\n Result.wrapNullable(\n this.getTags(registryHost, dockerRepository),\n 'tags-error' as const,\n ).transform((tags) => tags.map((version) => ({ version })));\n\n const getDockerHubTags = (): TagsResultType =>\n Result.wrapNullable(\n this.getDockerHubTags(dockerRepository),\n 'dockerhub-error' as const,\n ).catch(getTags);\n\n const tagsResult =\n registryHost === 'https://index.docker.io' &&\n !process.env.RENOVATE_X_DOCKER_HUB_TAGS_DISABLE\n ? getDockerHubTags()\n : getTags();\n\n const { val: releases, err } = await tagsResult.unwrap();\n if (err instanceof Error) {\n throw err;\n } else if (err) {\n return null;\n }\n\n const ret: ReleaseResult = {\n registryUrl: registryHost,\n releases,\n };\n if (dockerRepository !== packageName) {\n // This will be reused later if a getDigest() call is made\n ret.lookupName = dockerRepository;\n }\n\n const tags = releases.map((release) => release.version);\n const latestTag = tags.includes('latest')\n ? 'latest'\n : (findLatestStable(tags) ?? tags[tags.length - 1]);\n\n // istanbul ignore if: needs test\n if (!latestTag) {\n return ret;\n }\n const labels = await this.getLabels(\n registryHost,\n dockerRepository,\n latestTag,\n );\n if (labels) {\n if (is.nonEmptyString(labels[gitRefLabel])) {\n ret.gitRef = labels[gitRefLabel];\n }\n for (const label of sourceLabels) {\n if (is.nonEmptyString(labels[label])) {\n ret.sourceUrl = labels[label];\n break;\n }\n }\n if (is.nonEmptyString(labels[imageUrlLabel])) {\n ret.homepage = labels[imageUrlLabel];\n }\n }\n return ret;\n }\n}\n"]}
@@ -79,7 +79,7 @@ class HexpmBobDatasource extends datasource_1.Datasource {
79
79
  static isStable(version, packageType) {
80
80
  switch (packageType) {
81
81
  case 'elixir':
82
- return version.match(/^v\d+\.\d+\.\d+($|-otp)/) !== null;
82
+ return /^v\d+\.\d+\.\d+($|-otp)/.test(version);
83
83
  case 'erlang':
84
84
  return version.startsWith('OTP-');
85
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/hexpm-bob/index.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { HttpError } from '../../../util/http';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { id as semverId } from '../../versioning/semver';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { datasource, defaultRegistryUrl } from './common';\nimport type { PackageType } from './types';\n\nexport class HexpmBobDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly caching = true;\n\n override readonly defaultVersioning = semverId;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildDate` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL https://github.com/elixir-lang/elixir.git for the `elixir` package and the https://github.com/erlang/otp.git URL for the `erlang` package.';\n\n @cache({\n namespace: `datasource-${datasource}`,\n key: ({ registryUrl, packageName }: GetReleasesConfig) =>\n `${registryUrl}:${packageName}`,\n })\n async getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const packageType = HexpmBobDatasource.getPackageType(packageName);\n\n if (!packageType) {\n return null;\n }\n\n logger.trace(\n { registryUrl, packageName },\n `fetching hex.pm bob ${packageName} release`,\n );\n\n const url = `${registryUrl!}/builds/${packageName}/builds.txt`;\n\n const result: ReleaseResult = {\n releases: [],\n ...HexpmBobDatasource.getPackageDetails(packageType),\n };\n try {\n const { body } = await this.http.get(url);\n result.releases = body\n .split('\\n')\n .map((line) => line.trim())\n .filter(is.nonEmptyString)\n .map((line) => {\n const [version, gitRef, buildDate] = line.split(' ');\n\n return {\n gitRef,\n isStable: HexpmBobDatasource.isStable(version, packageType),\n releaseTimestamp: asTimestamp(buildDate),\n version: HexpmBobDatasource.cleanVersion(version, packageType),\n };\n });\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length > 0 ? result : null;\n }\n\n private static getPackageType(packageName: string): PackageType | null {\n if (packageName === 'elixir') {\n return 'elixir';\n }\n if (/^otp\\/\\w+-\\d+\\.\\d+$/.test(packageName)) {\n return 'erlang';\n }\n return null;\n }\n\n private static cleanVersion(\n version: string,\n packageType: PackageType,\n ): string {\n switch (packageType) {\n case 'elixir':\n return version.replace(/^v/, '');\n case 'erlang':\n return version.replace(/^OTP-/, '');\n }\n }\n\n private static isStable(version: string, packageType: PackageType): boolean {\n switch (packageType) {\n case 'elixir':\n return version.match(/^v\\d+\\.\\d+\\.\\d+($|-otp)/) !== null;\n case 'erlang':\n return version.startsWith('OTP-');\n }\n }\n\n private static getPackageDetails(\n packageType: PackageType,\n ): Omit<ReleaseResult, 'releases'> {\n switch (packageType) {\n case 'elixir':\n return {\n homepage: 'https://elixir-lang.org/',\n sourceUrl: 'https://github.com/elixir-lang/elixir.git',\n };\n case 'erlang':\n return {\n homepage: 'https://www.erlang.org/',\n sourceUrl: 'https://github.com/erlang/otp.git',\n };\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/hexpm-bob/index.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { HttpError } from '../../../util/http';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { id as semverId } from '../../versioning/semver';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { datasource, defaultRegistryUrl } from './common';\nimport type { PackageType } from './types';\n\nexport class HexpmBobDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly caching = true;\n\n override readonly defaultVersioning = semverId;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildDate` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL https://github.com/elixir-lang/elixir.git for the `elixir` package and the https://github.com/erlang/otp.git URL for the `erlang` package.';\n\n @cache({\n namespace: `datasource-${datasource}`,\n key: ({ registryUrl, packageName }: GetReleasesConfig) =>\n `${registryUrl}:${packageName}`,\n })\n async getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const packageType = HexpmBobDatasource.getPackageType(packageName);\n\n if (!packageType) {\n return null;\n }\n\n logger.trace(\n { registryUrl, packageName },\n `fetching hex.pm bob ${packageName} release`,\n );\n\n const url = `${registryUrl!}/builds/${packageName}/builds.txt`;\n\n const result: ReleaseResult = {\n releases: [],\n ...HexpmBobDatasource.getPackageDetails(packageType),\n };\n try {\n const { body } = await this.http.get(url);\n result.releases = body\n .split('\\n')\n .map((line) => line.trim())\n .filter(is.nonEmptyString)\n .map((line) => {\n const [version, gitRef, buildDate] = line.split(' ');\n\n return {\n gitRef,\n isStable: HexpmBobDatasource.isStable(version, packageType),\n releaseTimestamp: asTimestamp(buildDate),\n version: HexpmBobDatasource.cleanVersion(version, packageType),\n };\n });\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length > 0 ? result : null;\n }\n\n private static getPackageType(packageName: string): PackageType | null {\n if (packageName === 'elixir') {\n return 'elixir';\n }\n if (/^otp\\/\\w+-\\d+\\.\\d+$/.test(packageName)) {\n return 'erlang';\n }\n return null;\n }\n\n private static cleanVersion(\n version: string,\n packageType: PackageType,\n ): string {\n switch (packageType) {\n case 'elixir':\n return version.replace(/^v/, '');\n case 'erlang':\n return version.replace(/^OTP-/, '');\n }\n }\n\n private static isStable(version: string, packageType: PackageType): boolean {\n switch (packageType) {\n case 'elixir':\n return /^v\\d+\\.\\d+\\.\\d+($|-otp)/.test(version);\n case 'erlang':\n return version.startsWith('OTP-');\n }\n }\n\n private static getPackageDetails(\n packageType: PackageType,\n ): Omit<ReleaseResult, 'releases'> {\n switch (packageType) {\n case 'elixir':\n return {\n homepage: 'https://elixir-lang.org/',\n sourceUrl: 'https://github.com/elixir-lang/elixir.git',\n };\n case 'erlang':\n return {\n homepage: 'https://www.erlang.org/',\n sourceUrl: 'https://github.com/erlang/otp.git',\n };\n }\n }\n}\n"]}
@@ -31,7 +31,7 @@ class NugetV2Api {
31
31
  try {
32
32
  const pkgIsLatestVersion = this.getPkgProp(pkgInfo, 'IsLatestVersion');
33
33
  if (pkgIsLatestVersion === 'true') {
34
- dep['tags'] = { latest: (0, common_1.removeBuildMeta)(`${version}`) };
34
+ dep.tags = { latest: (0, common_1.removeBuildMeta)(`${version}`) };
35
35
  const projectUrl = this.getPkgProp(pkgInfo, 'ProjectUrl');
36
36
  if (projectUrl) {
37
37
  dep.sourceUrl = (0, common_1.massageUrl)(projectUrl);
@@ -1 +1 @@
1
- {"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/nuget/v2.ts"],"names":[],"mappings":";;;AACA,mCAAqC;AACrC,4CAAyC;AAEzC,+CAA4C;AAC5C,uDAAsD;AAEtD,qCAAuD;AAEvD,MAAa,UAAU;IACrB,UAAU,CAAC,OAAmB,EAAE,QAAgB;QAC9C,OAAO,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAU,EACV,OAAe,EACf,OAAe;QAEf,MAAM,GAAG,GAAkB;YACzB,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,IAAI,UAAU,GAAkB,GAAG,OAAO,CAAC,OAAO,CAChD,IAAA,aAAK,EAAC,MAAM,CAAC,EACb,EAAE,CACH,6BAA6B,OAAO,0DAA0D,CAAC;QAChG,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;YAC3B,mBAAmB;YACnB,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,kBAAkB,GAAG,IAAI,oBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAEpE,MAAM,WAAW,GAAG,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE9D,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACpD,MAAM,gBAAgB,GAAG,IAAA,uBAAW,EAClC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CACtC,CAAC;gBACF,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAChB,uBAAuB;oBACvB,OAAO,EAAE,IAAA,wBAAe,EAAC,GAAG,OAAO,EAAE,CAAC;oBACtC,gBAAgB;iBACjB,CAAC,CAAC;gBACH,IAAI,CAAC;oBACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CACxC,OAAO,EACP,iBAAiB,CAClB,CAAC;oBACF,IAAI,kBAAkB,KAAK,MAAM,EAAE,CAAC;wBAClC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAA,wBAAe,EAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;wBACxD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;wBAC1D,IAAI,UAAU,EAAE,CAAC;4BACf,GAAG,CAAC,SAAS,GAAG,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;wBACzC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,0BAA0B,CAAC,CAAC;oBACxC,eAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,EACzB,8DAA8D,CAC/D,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GAAG,kBAAkB;iBAC1C,aAAa,CAAC,MAAM,CAAC;iBACrB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;YAE5C,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,CAAC;QAED,2DAA2D;QAC3D,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AApED,gCAoEC","sourcesContent":["import type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger';\nimport type { Http } from '../../../util/http';\nimport { regEx } from '../../../util/regex';\nimport { asTimestamp } from '../../../util/timestamp';\nimport type { ReleaseResult } from '../types';\nimport { massageUrl, removeBuildMeta } from './common';\n\nexport class NugetV2Api {\n getPkgProp(pkgInfo: XmlElement, propName: string): string | undefined {\n return pkgInfo.childNamed('m:properties')?.childNamed(`d:${propName}`)?.val;\n }\n\n async getReleases(\n http: Http,\n feedUrl: string,\n pkgName: string,\n ): Promise<ReleaseResult | null> {\n const dep: ReleaseResult = {\n releases: [],\n };\n let pkgUrlList: string | null = `${feedUrl.replace(\n regEx(/\\/+$/),\n '',\n )}/FindPackagesById()?id=%27${pkgName}%27&$select=Version,IsLatestVersion,ProjectUrl,Published`;\n while (pkgUrlList !== null) {\n // typescript issue\n const pkgVersionsListRaw = await http.get(pkgUrlList);\n const pkgVersionsListDoc = new XmlDocument(pkgVersionsListRaw.body);\n\n const pkgInfoList = pkgVersionsListDoc.childrenNamed('entry');\n\n for (const pkgInfo of pkgInfoList) {\n const version = this.getPkgProp(pkgInfo, 'Version');\n const releaseTimestamp = asTimestamp(\n this.getPkgProp(pkgInfo, 'Published'),\n );\n dep.releases.push({\n // TODO: types (#22198)\n version: removeBuildMeta(`${version}`),\n releaseTimestamp,\n });\n try {\n const pkgIsLatestVersion = this.getPkgProp(\n pkgInfo,\n 'IsLatestVersion',\n );\n if (pkgIsLatestVersion === 'true') {\n dep['tags'] = { latest: removeBuildMeta(`${version}`) };\n const projectUrl = this.getPkgProp(pkgInfo, 'ProjectUrl');\n if (projectUrl) {\n dep.sourceUrl = massageUrl(projectUrl);\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug(\n { err, pkgName, feedUrl },\n `nuget registry failure: can't parse pkg info for project url`,\n );\n }\n }\n\n const nextPkgUrlListLink = pkgVersionsListDoc\n .childrenNamed('link')\n .find((node) => node.attr.rel === 'next');\n\n pkgUrlList = nextPkgUrlListLink ? nextPkgUrlListLink.attr.href : null;\n }\n\n // dep not found if no release, so we can try next registry\n if (dep.releases.length === 0) {\n return null;\n }\n\n return dep;\n }\n}\n"]}
1
+ {"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/nuget/v2.ts"],"names":[],"mappings":";;;AACA,mCAAqC;AACrC,4CAAyC;AAEzC,+CAA4C;AAC5C,uDAAsD;AAEtD,qCAAuD;AAEvD,MAAa,UAAU;IACrB,UAAU,CAAC,OAAmB,EAAE,QAAgB;QAC9C,OAAO,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAU,EACV,OAAe,EACf,OAAe;QAEf,MAAM,GAAG,GAAkB;YACzB,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,IAAI,UAAU,GAAkB,GAAG,OAAO,CAAC,OAAO,CAChD,IAAA,aAAK,EAAC,MAAM,CAAC,EACb,EAAE,CACH,6BAA6B,OAAO,0DAA0D,CAAC;QAChG,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;YAC3B,mBAAmB;YACnB,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,kBAAkB,GAAG,IAAI,oBAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAEpE,MAAM,WAAW,GAAG,kBAAkB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE9D,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACpD,MAAM,gBAAgB,GAAG,IAAA,uBAAW,EAClC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CACtC,CAAC;gBACF,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAChB,uBAAuB;oBACvB,OAAO,EAAE,IAAA,wBAAe,EAAC,GAAG,OAAO,EAAE,CAAC;oBACtC,gBAAgB;iBACjB,CAAC,CAAC;gBACH,IAAI,CAAC;oBACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,CACxC,OAAO,EACP,iBAAiB,CAClB,CAAC;oBACF,IAAI,kBAAkB,KAAK,MAAM,EAAE,CAAC;wBAClC,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,IAAA,wBAAe,EAAC,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;wBACrD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;wBAC1D,IAAI,UAAU,EAAE,CAAC;4BACf,GAAG,CAAC,SAAS,GAAG,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAC;wBACzC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,0BAA0B,CAAC,CAAC;oBACxC,eAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,EACzB,8DAA8D,CAC/D,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GAAG,kBAAkB;iBAC1C,aAAa,CAAC,MAAM,CAAC;iBACrB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;YAE5C,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,CAAC;QAED,2DAA2D;QAC3D,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AApED,gCAoEC","sourcesContent":["import type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger';\nimport type { Http } from '../../../util/http';\nimport { regEx } from '../../../util/regex';\nimport { asTimestamp } from '../../../util/timestamp';\nimport type { ReleaseResult } from '../types';\nimport { massageUrl, removeBuildMeta } from './common';\n\nexport class NugetV2Api {\n getPkgProp(pkgInfo: XmlElement, propName: string): string | undefined {\n return pkgInfo.childNamed('m:properties')?.childNamed(`d:${propName}`)?.val;\n }\n\n async getReleases(\n http: Http,\n feedUrl: string,\n pkgName: string,\n ): Promise<ReleaseResult | null> {\n const dep: ReleaseResult = {\n releases: [],\n };\n let pkgUrlList: string | null = `${feedUrl.replace(\n regEx(/\\/+$/),\n '',\n )}/FindPackagesById()?id=%27${pkgName}%27&$select=Version,IsLatestVersion,ProjectUrl,Published`;\n while (pkgUrlList !== null) {\n // typescript issue\n const pkgVersionsListRaw = await http.get(pkgUrlList);\n const pkgVersionsListDoc = new XmlDocument(pkgVersionsListRaw.body);\n\n const pkgInfoList = pkgVersionsListDoc.childrenNamed('entry');\n\n for (const pkgInfo of pkgInfoList) {\n const version = this.getPkgProp(pkgInfo, 'Version');\n const releaseTimestamp = asTimestamp(\n this.getPkgProp(pkgInfo, 'Published'),\n );\n dep.releases.push({\n // TODO: types (#22198)\n version: removeBuildMeta(`${version}`),\n releaseTimestamp,\n });\n try {\n const pkgIsLatestVersion = this.getPkgProp(\n pkgInfo,\n 'IsLatestVersion',\n );\n if (pkgIsLatestVersion === 'true') {\n dep.tags = { latest: removeBuildMeta(`${version}`) };\n const projectUrl = this.getPkgProp(pkgInfo, 'ProjectUrl');\n if (projectUrl) {\n dep.sourceUrl = massageUrl(projectUrl);\n }\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug(\n { err, pkgName, feedUrl },\n `nuget registry failure: can't parse pkg info for project url`,\n );\n }\n }\n\n const nextPkgUrlListLink = pkgVersionsListDoc\n .childrenNamed('link')\n .find((node) => node.attr.rel === 'next');\n\n pkgUrlList = nextPkgUrlListLink ? nextPkgUrlListLink.attr.href : null;\n }\n\n // dep not found if no release, so we can try next registry\n if (dep.releases.length === 0) {\n return null;\n }\n\n return dep;\n }\n}\n"]}
@@ -124,8 +124,7 @@ class PodDatasource extends datasource_1.Datasource {
124
124
  const resp = await this.requestCDN(url, packageName);
125
125
  if (resp) {
126
126
  const lines = resp.split(regex_1.newlineRegex);
127
- for (let idx = 0; idx < lines.length; idx += 1) {
128
- const line = lines[idx];
127
+ for (const line of lines) {
129
128
  const [name, ...versions] = line.split('/');
130
129
  if (name === packageName.replace((0, regex_1.regEx)(/\/.*$/), '')) {
131
130
  const releases = versions.map((version) => ({ version }));