renovate 39.189.0 → 39.190.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/config/decrypt.js +1 -1
  2. package/dist/config/decrypt.js.map +1 -1
  3. package/dist/config/migrate-validate.js +2 -2
  4. package/dist/config/migrate-validate.js.map +1 -1
  5. package/dist/config/migration.js +1 -1
  6. package/dist/config/migration.js.map +1 -1
  7. package/dist/config/validation.js +2 -2
  8. package/dist/config/validation.js.map +1 -1
  9. package/dist/instrumentation/index.js +2 -2
  10. package/dist/instrumentation/index.js.map +1 -1
  11. package/dist/logger/once.js +2 -2
  12. package/dist/logger/once.js.map +1 -1
  13. package/dist/logger/renovate-logger.js +1 -1
  14. package/dist/logger/renovate-logger.js.map +1 -1
  15. package/dist/logger/utils.js +1 -1
  16. package/dist/logger/utils.js.map +1 -1
  17. package/dist/modules/datasource/artifactory/index.js +0 -1
  18. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  19. package/dist/modules/datasource/aws-machine-image/index.js +6 -5
  20. package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
  21. package/dist/modules/datasource/bazel/index.js +0 -1
  22. package/dist/modules/datasource/bazel/index.js.map +1 -1
  23. package/dist/modules/datasource/bitrise/index.js +1 -1
  24. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  25. package/dist/modules/datasource/conda/index.js +0 -1
  26. package/dist/modules/datasource/conda/index.js.map +1 -1
  27. package/dist/modules/datasource/cpan/index.js +1 -1
  28. package/dist/modules/datasource/cpan/index.js.map +1 -1
  29. package/dist/modules/datasource/crate/index.js +2 -2
  30. package/dist/modules/datasource/crate/index.js.map +1 -1
  31. package/dist/modules/datasource/dart/index.js +1 -1
  32. package/dist/modules/datasource/dart/index.js.map +1 -1
  33. package/dist/modules/datasource/dart-version/index.js +1 -1
  34. package/dist/modules/datasource/dart-version/index.js.map +1 -1
  35. package/dist/modules/datasource/datasource.js +0 -1
  36. package/dist/modules/datasource/datasource.js.map +1 -1
  37. package/dist/modules/datasource/deb/index.js +1 -1
  38. package/dist/modules/datasource/deb/index.js.map +1 -1
  39. package/dist/modules/datasource/deno/index.js +1 -1
  40. package/dist/modules/datasource/deno/index.js.map +1 -1
  41. package/dist/modules/datasource/devbox/index.js +0 -1
  42. package/dist/modules/datasource/devbox/index.js.map +1 -1
  43. package/dist/modules/datasource/docker/common.js +1 -1
  44. package/dist/modules/datasource/docker/common.js.map +1 -1
  45. package/dist/modules/datasource/docker/index.js +5 -5
  46. package/dist/modules/datasource/docker/index.js.map +1 -1
  47. package/dist/modules/datasource/docker/schema.js +2 -1
  48. package/dist/modules/datasource/docker/schema.js.map +1 -1
  49. package/dist/modules/datasource/flutter-version/index.js +1 -1
  50. package/dist/modules/datasource/flutter-version/index.js.map +1 -1
  51. package/dist/modules/datasource/git-refs/index.js +1 -1
  52. package/dist/modules/datasource/git-refs/index.js.map +1 -1
  53. package/dist/modules/datasource/gitlab-packages/index.js +1 -1
  54. package/dist/modules/datasource/gitlab-packages/index.js.map +1 -1
  55. package/dist/modules/datasource/gitlab-releases/index.js +1 -3
  56. package/dist/modules/datasource/gitlab-releases/index.js.map +1 -1
  57. package/dist/modules/datasource/go/index.js +1 -1
  58. package/dist/modules/datasource/go/index.js.map +1 -1
  59. package/dist/modules/datasource/go/releases-direct.js +2 -2
  60. package/dist/modules/datasource/go/releases-direct.js.map +1 -1
  61. package/dist/modules/datasource/golang-version/index.js +1 -1
  62. package/dist/modules/datasource/golang-version/index.js.map +1 -1
  63. package/dist/modules/datasource/gradle-version/index.js +1 -1
  64. package/dist/modules/datasource/gradle-version/index.js.map +1 -1
  65. package/dist/modules/datasource/helm/index.js +1 -1
  66. package/dist/modules/datasource/helm/index.js.map +1 -1
  67. package/dist/modules/datasource/hex/index.js +1 -1
  68. package/dist/modules/datasource/hex/index.js.map +1 -1
  69. package/dist/modules/datasource/java-version/index.js +0 -1
  70. package/dist/modules/datasource/java-version/index.js.map +1 -1
  71. package/dist/modules/datasource/jenkins-plugins/index.js +1 -1
  72. package/dist/modules/datasource/jenkins-plugins/index.js.map +1 -1
  73. package/dist/modules/datasource/maven/index.js +3 -3
  74. package/dist/modules/datasource/maven/index.js.map +1 -1
  75. package/dist/modules/datasource/maven/util.js +2 -2
  76. package/dist/modules/datasource/maven/util.js.map +1 -1
  77. package/dist/modules/datasource/node-version/index.js +1 -1
  78. package/dist/modules/datasource/node-version/index.js.map +1 -1
  79. package/dist/modules/datasource/npm/index.js +1 -1
  80. package/dist/modules/datasource/npm/index.js.map +1 -1
  81. package/dist/modules/datasource/npm/npmrc.js +1 -1
  82. package/dist/modules/datasource/npm/npmrc.js.map +1 -1
  83. package/dist/modules/datasource/nuget/index.js +1 -1
  84. package/dist/modules/datasource/nuget/index.js.map +1 -1
  85. package/dist/modules/datasource/nuget/v3.js +1 -3
  86. package/dist/modules/datasource/nuget/v3.js.map +1 -1
  87. package/dist/modules/datasource/orb/index.js +1 -1
  88. package/dist/modules/datasource/orb/index.js.map +1 -1
  89. package/dist/modules/datasource/packagist/index.js +1 -1
  90. package/dist/modules/datasource/packagist/index.js.map +1 -1
  91. package/dist/modules/datasource/pod/index.js +1 -1
  92. package/dist/modules/datasource/pod/index.js.map +1 -1
  93. package/dist/modules/datasource/python-version/index.js +1 -1
  94. package/dist/modules/datasource/python-version/index.js.map +1 -1
  95. package/dist/modules/datasource/repology/index.js +1 -1
  96. package/dist/modules/datasource/repology/index.js.map +1 -1
  97. package/dist/modules/datasource/rubygems/index.js +1 -1
  98. package/dist/modules/datasource/rubygems/index.js.map +1 -1
  99. package/dist/modules/datasource/sbt-package/index.js +1 -1
  100. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  101. package/dist/modules/datasource/sbt-plugin/index.js +1 -1
  102. package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
  103. package/dist/modules/datasource/terraform-module/index.js +1 -1
  104. package/dist/modules/datasource/terraform-module/index.js.map +1 -1
  105. package/dist/modules/datasource/terraform-provider/index.js +1 -2
  106. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  107. package/dist/modules/manager/api.js +2 -0
  108. package/dist/modules/manager/api.js.map +1 -1
  109. package/dist/modules/manager/fingerprint.generated.js +1 -0
  110. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  111. package/dist/modules/manager/gomod/update.js +2 -2
  112. package/dist/modules/manager/gomod/update.js.map +1 -1
  113. package/dist/modules/manager/homebrew/extract.js +0 -1
  114. package/dist/modules/manager/homebrew/extract.js.map +1 -1
  115. package/dist/modules/manager/pep621/schema.d.ts +5 -0
  116. package/dist/modules/manager/pep621/schema.js +2 -0
  117. package/dist/modules/manager/pep621/schema.js.map +1 -1
  118. package/dist/modules/manager/pixi/artifacts.d.ts +3 -0
  119. package/dist/modules/manager/pixi/artifacts.js +85 -0
  120. package/dist/modules/manager/pixi/artifacts.js.map +1 -0
  121. package/dist/modules/manager/pixi/extract.d.ts +2 -0
  122. package/dist/modules/manager/pixi/extract.js +53 -0
  123. package/dist/modules/manager/pixi/extract.js.map +1 -0
  124. package/dist/modules/manager/pixi/index.d.ts +11 -0
  125. package/dist/modules/manager/pixi/index.js +22 -0
  126. package/dist/modules/manager/pixi/index.js.map +1 -0
  127. package/dist/modules/manager/pixi/lockfile.d.ts +6 -0
  128. package/dist/modules/manager/pixi/lockfile.js +25 -0
  129. package/dist/modules/manager/pixi/lockfile.js.map +1 -0
  130. package/dist/modules/manager/pixi/schema.d.ts +14 -0
  131. package/dist/modules/manager/pixi/schema.js +14 -0
  132. package/dist/modules/manager/pixi/schema.js.map +1 -0
  133. package/dist/modules/platform/index.js +0 -1
  134. package/dist/modules/platform/index.js.map +1 -1
  135. package/dist/proxy.js +1 -1
  136. package/dist/proxy.js.map +1 -1
  137. package/dist/renovate.js +2 -2
  138. package/dist/renovate.js.map +1 -1
  139. package/dist/util/exec/containerbase.js +5 -0
  140. package/dist/util/exec/containerbase.js.map +1 -1
  141. package/dist/util/http/bitbucket.js +1 -1
  142. package/dist/util/http/bitbucket.js.map +1 -1
  143. package/dist/util/http/cache/abstract-http-cache-provider.js +1 -1
  144. package/dist/util/http/cache/abstract-http-cache-provider.js.map +1 -1
  145. package/dist/workers/global/config/parse/file.js +1 -1
  146. package/dist/workers/global/config/parse/file.js.map +1 -1
  147. package/dist/workers/repository/process/extract-update.js +0 -1
  148. package/dist/workers/repository/process/extract-update.js.map +1 -1
  149. package/dist/workers/repository/updates/flatten.js +0 -1
  150. package/dist/workers/repository/updates/flatten.js.map +1 -1
  151. package/dist/workers/repository/updates/generate.js +0 -1
  152. package/dist/workers/repository/updates/generate.js.map +1 -1
  153. package/package.json +1 -1
  154. package/renovate-schema.json +11 -0
@@ -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 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.getText(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 /* v8 ignore next 6 -- should never happen */\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.getText(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 /* v8 ignore next 3 -- should never happen */\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 @@ class DartDatasource extends datasource_1.Datasource {
16
16
  sourceUrlSupport = 'package';
17
17
  sourceUrlNote = 'The source URL is determined from the `repository` field of the latest release object in the results.';
18
18
  async getReleases({ packageName, registryUrl, }) {
19
- // istanbul ignore if
19
+ /* v8 ignore next 3 -- should never happen */
20
20
  if (!registryUrl) {
21
21
  return null;
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/dart/index.ts"],"names":[],"mappings":";;;AACA,uDAAsD;AACtD,2CAAwD;AACxD,8CAA2C;AAI3C,MAAa,cAAe,SAAQ,uBAAU;IAC5C,MAAM,CAAU,EAAE,GAAG,MAAM,CAAC;IAE5B;QACE,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEiB,qBAAqB,GAAG,IAAI,CAAC;IAE7B,mBAAmB,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEpD,uBAAuB,GAAG,IAAI,CAAC;IAC/B,oBAAoB,GACpC,gFAAgF,CAAC;IACjE,gBAAgB,GAAG,SAAS,CAAC;IAC7B,aAAa,GAC7B,uGAAuG,CAAC;IAE1G,KAAK,CAAC,WAAW,CAAC,EAChB,WAAW,EACX,WAAW,GACO;QAClB,qBAAqB;QACrB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,GAAyB,IAAI,CAAC;QACxC,MAAM,MAAM,GAAG,GAAG,IAAA,yBAAmB,EACnC,WAAW,CACZ,gBAAgB,WAAW,EAAE,CAAC;QAE/B,IAAI,GAAG,GAAoC,IAAI,CAAC;QAChD,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAa,MAAM,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;QACvB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YAClC,MAAM,QAAQ,GAAG,QAAQ;gBACvB,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC;gBACvC,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjC,OAAO;gBACP,gBAAgB,EAAE,IAAA,uBAAW,EAAC,SAAS,CAAC;aACzC,CAAC,CAAC,CAAC;YACN,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC;gBAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBAC/B,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;wBACrB,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;oBACrC,CAAC;oBAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;wBACvB,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;;AA/DH,wCAgEC","sourcesContent":["import type { HttpResponse } from '../../../util/http/types';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { ensureTrailingSlash } from '../../../util/url';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport type { DartResult } from './types';\n\nexport class DartDatasource extends Datasource {\n static readonly id = 'dart';\n\n constructor() {\n super(DartDatasource.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = ['https://pub.dartlang.org/'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field of the latest release object in the results.';\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n let result: ReleaseResult | null = null;\n const pkgUrl = `${ensureTrailingSlash(\n registryUrl,\n )}api/packages/${packageName}`;\n\n let raw: HttpResponse<DartResult> | null = null;\n try {\n raw = await this.http.getJsonUnchecked<DartResult>(pkgUrl);\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n const body = raw?.body;\n if (body) {\n const { versions, latest } = body;\n const releases = versions\n ?.filter(({ retracted }) => !retracted)\n ?.map(({ version, published }) => ({\n version,\n releaseTimestamp: asTimestamp(published),\n }));\n if (releases && latest) {\n result = { releases };\n\n const pubspec = latest.pubspec;\n if (pubspec) {\n if (pubspec.homepage) {\n result.homepage = pubspec.homepage;\n }\n\n if (pubspec.repository) {\n result.sourceUrl = pubspec.repository;\n }\n }\n }\n }\n return result;\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/dart/index.ts"],"names":[],"mappings":";;;AACA,uDAAsD;AACtD,2CAAwD;AACxD,8CAA2C;AAI3C,MAAa,cAAe,SAAQ,uBAAU;IAC5C,MAAM,CAAU,EAAE,GAAG,MAAM,CAAC;IAE5B;QACE,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEiB,qBAAqB,GAAG,IAAI,CAAC;IAE7B,mBAAmB,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEpD,uBAAuB,GAAG,IAAI,CAAC;IAC/B,oBAAoB,GACpC,gFAAgF,CAAC;IACjE,gBAAgB,GAAG,SAAS,CAAC;IAC7B,aAAa,GAC7B,uGAAuG,CAAC;IAE1G,KAAK,CAAC,WAAW,CAAC,EAChB,WAAW,EACX,WAAW,GACO;QAClB,6CAA6C;QAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,GAAyB,IAAI,CAAC;QACxC,MAAM,MAAM,GAAG,GAAG,IAAA,yBAAmB,EACnC,WAAW,CACZ,gBAAgB,WAAW,EAAE,CAAC;QAE/B,IAAI,GAAG,GAAoC,IAAI,CAAC;QAChD,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAa,MAAM,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;QACvB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YAClC,MAAM,QAAQ,GAAG,QAAQ;gBACvB,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC;gBACvC,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjC,OAAO;gBACP,gBAAgB,EAAE,IAAA,uBAAW,EAAC,SAAS,CAAC;aACzC,CAAC,CAAC,CAAC;YACN,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC;gBAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBAC/B,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;wBACrB,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;oBACrC,CAAC;oBAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;wBACvB,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;;AA/DH,wCAgEC","sourcesContent":["import type { HttpResponse } from '../../../util/http/types';\nimport { asTimestamp } from '../../../util/timestamp';\nimport { ensureTrailingSlash } from '../../../util/url';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport type { DartResult } from './types';\n\nexport class DartDatasource extends Datasource {\n static readonly id = 'dart';\n\n constructor() {\n super(DartDatasource.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = ['https://pub.dartlang.org/'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field of the latest release object in the results.';\n\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n let result: ReleaseResult | null = null;\n const pkgUrl = `${ensureTrailingSlash(\n registryUrl,\n )}api/packages/${packageName}`;\n\n let raw: HttpResponse<DartResult> | null = null;\n try {\n raw = await this.http.getJsonUnchecked<DartResult>(pkgUrl);\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n const body = raw?.body;\n if (body) {\n const { versions, latest } = body;\n const releases = versions\n ?.filter(({ retracted }) => !retracted)\n ?.map(({ version, published }) => ({\n version,\n releaseTimestamp: asTimestamp(published),\n }));\n if (releases && latest) {\n result = { releases };\n\n const pubspec = latest.pubspec;\n if (pubspec) {\n if (pubspec.homepage) {\n result.homepage = pubspec.homepage;\n }\n\n if (pubspec.repository) {\n result.sourceUrl = pubspec.repository;\n }\n }\n }\n }\n return result;\n }\n}\n"]}
@@ -24,7 +24,7 @@ class DartVersionDatasource extends datasource_1.Datasource {
24
24
  sourceUrlSupport = 'package';
25
25
  sourceUrlNote = 'We use the URL: https://github.com/dart-lang/sdk.';
26
26
  async getReleases({ registryUrl, }) {
27
- // istanbul ignore if
27
+ /* v8 ignore next 3 -- should never happen */
28
28
  if (!registryUrl) {
29
29
  return null;
30
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/dart-version/index.ts"],"names":[],"mappings":";;;;AAAA,kEAAkC;AAClC,+CAA4C;AAC5C,8CAA2C;AAI9B,QAAA,kBAAkB,GAAG,IAAA,aAAK,EAAC,iBAAiB,CAAC,CAAC;AAC3D;;;;GAIG;AACU,QAAA,eAAe,GAAG,IAAA,aAAK,EAAC,OAAO,CAAC,CAAC;AAE9C,MAAa,qBAAsB,SAAQ,uBAAU;IACnD,MAAM,CAAU,EAAE,GAAG,cAAc,CAAC;IAEpC;QACE,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAEiB,qBAAqB,GAAG,KAAK,CAAC;IAE9B,mBAAmB,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAEzD,OAAO,GAAG,IAAI,CAAC;IAEhB,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAEpC,gBAAgB,GAAG,SAAS,CAAC;IAC7B,aAAa,GAC7B,mDAAmD,CAAC;IAEtD,KAAK,CAAC,WAAW,CAAC,EAChB,WAAW,GACO;QAClB,qBAAqB;QACrB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAkB;YAC5B,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE,kCAAkC;YAC7C,WAAW;YACX,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,IAAI,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,CACX,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAC9B,GAAG,WAAW,gEAAgE,OAAO,wBAAwB,CAC9G,CACF,CAAC,IAAI,CAAC;gBACP,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAEO,uBAAuB,CAC7B,OAAe,EACf,QAAkB;QAElB,OAAO,QAAQ;aACZ,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;aAClD,MAAM,CAAC,YAAE,CAAC,MAAM,CAAC;aACjB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAClB,IACE,OAAO,KAAK,QAAQ;gBACpB,wBAAwB;gBACxB,uBAAe,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC7B,4EAA4E;gBAC5E,iDAAiD;gBACjD,CAAC,OAAO,KAAK,QAAQ,IAAI,0BAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAC1D,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,kEAAkE;IAC1D,oBAAoB,CAAC,MAAc;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;;AA5EH,sDA6EC","sourcesContent":["import is from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types';\nimport type { DartResponse } from './types';\n\nexport const stableVersionRegex = regEx(/^\\d+\\.\\d+\\.\\d+$/);\n/**\n * The server returns old svn versions which would need mapping to a version.\n * They are very old, so we skip them instead.\n * https://github.com/dart-lang/site-www/blob/7d4409c87bb6570b2d8870b20283f81f2b7e08fc/tool/get-dart/dart_sdk_archive/lib/src/svn_versions.dart#L2\n */\nexport const svnVersionRegex = regEx(/^\\d+$/);\n\nexport class DartVersionDatasource extends Datasource {\n static readonly id = 'dart-version';\n\n constructor() {\n super(DartVersionDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://storage.googleapis.com'];\n\n override readonly caching = true;\n\n private readonly channels = ['stable', 'beta', 'dev'];\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/dart-lang/sdk.';\n\n async getReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n const result: ReleaseResult = {\n homepage: 'https://dart.dev/',\n sourceUrl: 'https://github.com/dart-lang/sdk',\n registryUrl,\n releases: [],\n };\n try {\n for (const channel of this.channels) {\n const resp = (\n await this.http.getJsonUnchecked<DartResponse>(\n `${registryUrl}/storage/v1/b/dart-archive/o?delimiter=%2F&prefix=channels%2F${channel}%2Frelease%2F&alt=json`,\n )\n ).body;\n const releases = this.getReleasesFromResponse(channel, resp.prefixes);\n result.releases.push(...releases);\n }\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n private getReleasesFromResponse(\n channel: string,\n prefixes: string[],\n ): Release[] {\n return prefixes\n .map((prefix) => this.getVersionFromPrefix(prefix))\n .filter(is.string)\n .filter((version) => {\n if (\n version === 'latest' ||\n // skip old svn versions\n svnVersionRegex.test(version) ||\n // The API response contains a stable version being released as a non-stable\n // release. So we filter out these releases here.\n (channel !== 'stable' && stableVersionRegex.test(version))\n ) {\n return false;\n }\n return true;\n })\n .map((version) => ({ version, isStable: channel === 'stable' }));\n }\n\n // Prefix should have a format of \"channels/stable/release/2.9.3/\"\n private getVersionFromPrefix(prefix: string): string | undefined {\n const parts = prefix.split('/');\n return parts[parts.length - 2];\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/dart-version/index.ts"],"names":[],"mappings":";;;;AAAA,kEAAkC;AAClC,+CAA4C;AAC5C,8CAA2C;AAI9B,QAAA,kBAAkB,GAAG,IAAA,aAAK,EAAC,iBAAiB,CAAC,CAAC;AAC3D;;;;GAIG;AACU,QAAA,eAAe,GAAG,IAAA,aAAK,EAAC,OAAO,CAAC,CAAC;AAE9C,MAAa,qBAAsB,SAAQ,uBAAU;IACnD,MAAM,CAAU,EAAE,GAAG,cAAc,CAAC;IAEpC;QACE,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAEiB,qBAAqB,GAAG,KAAK,CAAC;IAE9B,mBAAmB,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAEzD,OAAO,GAAG,IAAI,CAAC;IAEhB,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAEpC,gBAAgB,GAAG,SAAS,CAAC;IAC7B,aAAa,GAC7B,mDAAmD,CAAC;IAEtD,KAAK,CAAC,WAAW,CAAC,EAChB,WAAW,GACO;QAClB,6CAA6C;QAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAkB;YAC5B,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE,kCAAkC;YAC7C,WAAW;YACX,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,IAAI,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,CACX,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAC9B,GAAG,WAAW,gEAAgE,OAAO,wBAAwB,CAC9G,CACF,CAAC,IAAI,CAAC;gBACP,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAEO,uBAAuB,CAC7B,OAAe,EACf,QAAkB;QAElB,OAAO,QAAQ;aACZ,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;aAClD,MAAM,CAAC,YAAE,CAAC,MAAM,CAAC;aACjB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAClB,IACE,OAAO,KAAK,QAAQ;gBACpB,wBAAwB;gBACxB,uBAAe,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC7B,4EAA4E;gBAC5E,iDAAiD;gBACjD,CAAC,OAAO,KAAK,QAAQ,IAAI,0BAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAC1D,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,kEAAkE;IAC1D,oBAAoB,CAAC,MAAc;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;;AA5EH,sDA6EC","sourcesContent":["import is from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types';\nimport type { DartResponse } from './types';\n\nexport const stableVersionRegex = regEx(/^\\d+\\.\\d+\\.\\d+$/);\n/**\n * The server returns old svn versions which would need mapping to a version.\n * They are very old, so we skip them instead.\n * https://github.com/dart-lang/site-www/blob/7d4409c87bb6570b2d8870b20283f81f2b7e08fc/tool/get-dart/dart_sdk_archive/lib/src/svn_versions.dart#L2\n */\nexport const svnVersionRegex = regEx(/^\\d+$/);\n\nexport class DartVersionDatasource extends Datasource {\n static readonly id = 'dart-version';\n\n constructor() {\n super(DartVersionDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://storage.googleapis.com'];\n\n override readonly caching = true;\n\n private readonly channels = ['stable', 'beta', 'dev'];\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'We use the URL: https://github.com/dart-lang/sdk.';\n\n async getReleases({\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n const result: ReleaseResult = {\n homepage: 'https://dart.dev/',\n sourceUrl: 'https://github.com/dart-lang/sdk',\n registryUrl,\n releases: [],\n };\n try {\n for (const channel of this.channels) {\n const resp = (\n await this.http.getJsonUnchecked<DartResponse>(\n `${registryUrl}/storage/v1/b/dart-archive/o?delimiter=%2F&prefix=channels%2F${channel}%2Frelease%2F&alt=json`,\n )\n ).body;\n const releases = this.getReleasesFromResponse(channel, resp.prefixes);\n result.releases.push(...releases);\n }\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n private getReleasesFromResponse(\n channel: string,\n prefixes: string[],\n ): Release[] {\n return prefixes\n .map((prefix) => this.getVersionFromPrefix(prefix))\n .filter(is.string)\n .filter((version) => {\n if (\n version === 'latest' ||\n // skip old svn versions\n svnVersionRegex.test(version) ||\n // The API response contains a stable version being released as a non-stable\n // release. So we filter out these releases here.\n (channel !== 'stable' && stableVersionRegex.test(version))\n ) {\n return false;\n }\n return true;\n })\n .map((version) => ({ version, isStable: channel === 'stable' }));\n }\n\n // Prefix should have a format of \"channels/stable/release/2.9.3/\"\n private getVersionFromPrefix(prefix: string): string | undefined {\n const parts = prefix.split('/');\n return parts[parts.length - 2];\n }\n}\n"]}
@@ -24,7 +24,6 @@ class Datasource {
24
24
  // intentionally empty
25
25
  }
26
26
  handleGenericErrors(err) {
27
- // istanbul ignore if: not easy testable with nock
28
27
  if (err instanceof external_host_error_1.ExternalHostError) {
29
28
  throw err;
30
29
  }
@@ -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,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"]}
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,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;AA7DD,gCA6DC","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 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"]}
@@ -225,7 +225,7 @@ class DebDatasource extends datasource_1.Datasource {
225
225
  * @returns The release result if the package is found, otherwise null.
226
226
  */
227
227
  async getReleases({ registryUrl, packageName, }) {
228
- // istanbul ignore if
228
+ /* v8 ignore next 3 -- should never happen */
229
229
  if (!registryUrl) {
230
230
  return null;
231
231
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/deb/index.ts"],"names":[],"mappings":"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","sourcesContent":["import readline from 'readline';\nimport { nanoid } from 'nanoid';\nimport upath from 'upath';\nimport { logger } from '../../../logger';\nimport { cache } from '../../../util/cache/package/decorator';\nimport * as fs from '../../../util/fs';\nimport { toSha256 } from '../../../util/hash';\nimport type { HttpOptions } from '../../../util/http/types';\nimport { joinUrlParts } from '../../../util/url';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { computeFileChecksum, parseChecksumsFromInRelease } from './checksum';\nimport { cacheSubDir, packageKeys, requiredPackageKeys } from './common';\nimport { extract, getFileCreationTime } from './file';\nimport { formatReleaseResult, releaseMetaInformationMatches } from './release';\nimport type { PackageDescription } from './types';\nimport { constructComponentUrls, getBaseReleaseUrl } from './url';\n\nexport class DebDatasource extends Datasource {\n static readonly id = 'deb';\n\n constructor() {\n super(DebDatasource.id);\n }\n\n /**\n * Users are able to specify custom Debian repositories as long as they follow\n * the Debian package repository format as specified here\n * @see{https://wiki.debian.org/DebianRepository/Format}\n */\n override readonly customRegistrySupport = true;\n\n /**\n * Users can specify multiple upstream repositories and the datasource will aggregate the release\n * @example\n * When specifying multiple dependencies both internal and external dependencies from internal/external artifactory\n */\n override readonly registryStrategy = 'merge';\n\n /**\n * The original apt source list file format is\n * deb uri distribution [component1] [component2] [...]\n * @see{https://wiki.debian.org/DebianRepository/Format}\n *\n * However, for Renovate, we require the registry URLs to be\n * valid URLs which is why the parameters are encoded in the URL.\n *\n * The following query parameters are required:\n * - components: comma separated list of components\n * - suite: stable, oldstable or other alias for a release, either this or release must be given\n * - release: buster, etc.\n * - binaryArch: e.g. amd64 resolves to http://deb.debian.org/debian/dists/stable/non-free/binary-amd64/\n */\n override readonly defaultRegistryUrls = [\n 'https://deb.debian.org/debian?suite=stable&components=main,contrib,non-free&binaryArch=amd64',\n ];\n\n override readonly defaultVersioning = 'deb';\n\n /**\n * Downloads and extracts a package file from a component URL.\n *\n * @param componentUrl - The URL of the component.\n * @returns The path to the extracted file and the last modification timestamp.\n * @throws Will throw an error if no valid compression method is found.\n */\n private async downloadAndExtractPackage(\n componentUrl: string,\n ): Promise<{ extractedFile: string; lastTimestamp: Date }> {\n const packageUrlHash = toSha256(componentUrl);\n const fullCacheDir = await fs.ensureCacheDir(cacheSubDir);\n const extractedFile = upath.join(fullCacheDir, `${packageUrlHash}.txt`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compression = 'gz';\n const compressedFile = upath.join(\n fullCacheDir,\n `${nanoid()}_${packageUrlHash}.${compression}`,\n );\n\n const wasUpdated = await this.downloadPackageFile(\n componentUrl,\n compression,\n compressedFile,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n await extract(compressedFile, compression, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (error) {\n logger.warn(\n {\n compressedFile,\n componentUrl,\n compression,\n error: error.message,\n },\n 'Failed to extract package file from compressed file',\n );\n } finally {\n await fs.rmCache(compressedFile);\n }\n }\n\n if (!lastTimestamp) {\n //extracting went wrong\n throw new Error('Missing metadata in extracted package index file!');\n }\n\n return { extractedFile, lastTimestamp };\n }\n\n /**\n * Downloads a package file if it has been modified since the last download timestamp.\n *\n * @param basePackageUrl - The base URL of the package.\n * @param compression - The compression method used (e.g., 'gz').\n * @param compressedFile - The path where the compressed file will be saved.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the file was downloaded, otherwise false.\n */\n private async downloadPackageFile(\n basePackageUrl: string,\n compression: string,\n compressedFile: string,\n lastDownloadTimestamp?: Date,\n ): Promise<boolean> {\n const baseReleaseUrl = getBaseReleaseUrl(basePackageUrl);\n const packageUrl = joinUrlParts(basePackageUrl, `Packages.${compression}`);\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await this.checkIfModified(\n packageUrl,\n lastDownloadTimestamp,\n );\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${packageUrl}, file is up to date.`);\n return false;\n }\n const readStream = this.http.stream(packageUrl);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n logger.debug(\n { url: packageUrl, targetFile: compressedFile },\n 'Downloading Debian package file',\n );\n\n let inReleaseContent = '';\n\n try {\n inReleaseContent = await this.fetchInReleaseFile(baseReleaseUrl);\n } catch (error) {\n // This is expected to fail for Artifactory if GPG verification is not enabled\n logger.debug(\n { url: baseReleaseUrl, err: error },\n 'Could not fetch InRelease file',\n );\n }\n\n if (inReleaseContent) {\n const actualChecksum = await computeFileChecksum(compressedFile);\n const expectedChecksum = parseChecksumsFromInRelease(\n inReleaseContent,\n // path to the Package.gz file\n packageUrl.replace(`${baseReleaseUrl}/`, ''),\n );\n if (actualChecksum !== expectedChecksum) {\n await fs.rmCache(compressedFile);\n throw new Error('SHA256 checksum validation failed');\n }\n }\n\n return needsToDownload;\n }\n\n /**\n * Fetches the content of the InRelease file from the given base release URL.\n *\n * @param baseReleaseUrl - The base URL of the release (e.g., 'https://deb.debian.org/debian/dists/bullseye').\n * @returns resolves to the content of the InRelease file.\n * @throws An error if the InRelease file could not be downloaded.\n */\n private async fetchInReleaseFile(baseReleaseUrl: string): Promise<string> {\n const inReleaseUrl = joinUrlParts(baseReleaseUrl, 'InRelease');\n const response = await this.http.getText(inReleaseUrl);\n return response.body;\n }\n\n /**\n * Checks if a packageUrl content has been modified since the specified timestamp.\n *\n * @param packageUrl - The URL to check.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the content has been modified, otherwise false.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since\n */\n private async checkIfModified(\n packageUrl: string,\n lastDownloadTimestamp: Date,\n ): Promise<boolean> {\n const options: HttpOptions = {\n headers: {\n 'If-Modified-Since': lastDownloadTimestamp.toUTCString(),\n },\n };\n\n try {\n const response = await this.http.head(packageUrl, options);\n return response.statusCode !== 304;\n } catch (error) {\n logger.warn(\n { packageUrl, lastDownloadTimestamp, errorMessage: error.message },\n 'Could not determine if package file is modified since last download',\n );\n return true; // Assume it needs to be downloaded if check fails\n }\n }\n\n /**\n * Parses the extracted package index file.\n *\n * @param extractedFile - The path to the extracted package file.\n * @param lastTimestamp - The timestamp of the last modification.\n * @returns a list of packages with minimal Metadata.\n */\n @cache({\n namespace: `datasource-${DebDatasource.id}`,\n key: (extractedFile: string, lastTimestamp: Date) =>\n `${extractedFile}:${lastTimestamp.getTime()}`,\n ttlMinutes: 24 * 60,\n })\n async parseExtractedPackageIndex(\n extractedFile: string,\n lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n // read line by line to avoid high memory consumption as the extracted Packages\n // files can be multiple MBs in size\n const rl = readline.createInterface({\n input: fs.createCacheReadStream(extractedFile),\n terminal: false,\n });\n\n let currentPackage: PackageDescription = {};\n // A Package Index can contain multiple Versions of the package on private Artifactory (e.g. Jfrog)\n const allPackages: Record<string, PackageDescription[]> = {};\n\n for await (const line of rl) {\n if (line === '') {\n // All information of the package are available, add to the list of packages\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n currentPackage = {};\n }\n } else {\n for (const key of packageKeys) {\n if (line.startsWith(`${key}:`)) {\n currentPackage[key] = line.substring(key.length + 1).trim();\n break;\n }\n }\n }\n }\n\n // Check the last package after file reading is complete\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n }\n\n return allPackages;\n }\n\n @cache({\n namespace: `datasource-${DebDatasource.id}`,\n key: (componentUrl: string) => componentUrl,\n })\n async getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n const { extractedFile, lastTimestamp } =\n await this.downloadAndExtractPackage(componentUrl);\n return await this.parseExtractedPackageIndex(extractedFile, lastTimestamp);\n }\n\n /**\n * Fetches the release information for a given package from the registry URL.\n *\n * @param config - Configuration for fetching releases.\n * @returns The release result if the package is found, otherwise null.\n */\n @cache({\n namespace: `datasource-${DebDatasource.id}`,\n key: ({ registryUrl, packageName }: GetReleasesConfig) =>\n `${registryUrl}:${packageName}`,\n })\n async getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n // istanbul ignore if\n if (!registryUrl) {\n return null;\n }\n\n const componentUrls = constructComponentUrls(registryUrl);\n let aggregatedRelease: ReleaseResult | null = null;\n\n for (const componentUrl of componentUrls) {\n try {\n const packageIndex = await this.getPackageIndex(componentUrl);\n const parsedPackages = packageIndex[packageName];\n\n if (parsedPackages) {\n const newRelease = formatReleaseResult(parsedPackages);\n if (aggregatedRelease === null) {\n aggregatedRelease = newRelease;\n } else {\n if (!releaseMetaInformationMatches(aggregatedRelease, newRelease)) {\n logger.warn(\n { packageName },\n 'Package occurred in more than one repository with different meta information. Aggregating releases anyway.',\n );\n }\n aggregatedRelease.releases.push(...newRelease.releases);\n }\n }\n } catch (error) {\n logger.debug(\n { componentUrl, error },\n 'Skipping component due to an error',\n );\n }\n }\n\n return aggregatedRelease;\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/deb/index.ts"],"names":[],"mappings":";;;;AAAA,gEAAgC;AAChC,mCAAgC;AAChC,0DAA0B;AAC1B,4CAAyC;AACzC,qEAA8D;AAC9D,6DAAuC;AACvC,6CAA8C;AAE9C,2CAAiD;AACjD,8CAA2C;AAE3C,yCAA8E;AAC9E,qCAAyE;AACzE,iCAAsD;AACtD,uCAA+E;AAE/E,+BAAkE;AAElE,MAAa,aAAc,SAAQ,uBAAU;IAC3C,MAAM,CAAU,EAAE,GAAG,KAAK,CAAC;IAE3B;QACE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACe,qBAAqB,GAAG,IAAI,CAAC;IAE/C;;;;OAIG;IACe,gBAAgB,GAAG,OAAO,CAAC;IAE7C;;;;;;;;;;;;;OAaG;IACe,mBAAmB,GAAG;QACtC,8FAA8F;KAC/F,CAAC;IAEgB,iBAAiB,GAAG,KAAK,CAAC;IAE5C;;;;;;OAMG;IACK,KAAK,CAAC,yBAAyB,CACrC,YAAoB;QAEpB,MAAM,cAAc,GAAG,IAAA,eAAQ,EAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,cAAc,CAAC,oBAAW,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,eAAK,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,cAAc,MAAM,CAAC,CAAC;QACxE,IAAI,aAAa,GAAG,MAAM,IAAA,0BAAmB,EAAC,aAAa,CAAC,CAAC;QAE7D,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,cAAc,GAAG,eAAK,CAAC,IAAI,CAC/B,YAAY,EACZ,GAAG,IAAA,eAAM,GAAE,IAAI,cAAc,IAAI,WAAW,EAAE,CAC/C,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC/C,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,CACd,CAAC;QAEF,IAAI,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,IAAA,cAAO,EAAC,cAAc,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;gBAC1D,aAAa,GAAG,MAAM,IAAA,0BAAmB,EAAC,aAAa,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAM,CAAC,IAAI,CACT;oBACE,cAAc;oBACd,YAAY;oBACZ,WAAW;oBACX,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,EACD,qDAAqD,CACtD,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,uBAAuB;YACvB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;IAC1C,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,mBAAmB,CAC/B,cAAsB,EACtB,WAAmB,EACnB,cAAsB,EACtB,qBAA4B;QAE5B,MAAM,cAAc,GAAG,IAAA,uBAAiB,EAAC,cAAc,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,IAAA,kBAAY,EAAC,cAAc,EAAE,YAAY,WAAW,EAAE,CAAC,CAAC;QAC3E,IAAI,eAAe,GAAG,IAAI,CAAC;QAE3B,IAAI,qBAAqB,EAAE,CAAC;YAC1B,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,CAC1C,UAAU,EACV,qBAAqB,CACtB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,eAAM,CAAC,KAAK,CAAC,uBAAuB,UAAU,uBAAuB,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,EAAE,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3C,eAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,EAC/C,iCAAiC,CAClC,CAAC;QAEF,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAE1B,IAAI,CAAC;YACH,gBAAgB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,8EAA8E;YAC9E,eAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,EAAE,EACnC,gCAAgC,CACjC,CAAC;QACJ,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,cAAc,GAAG,MAAM,IAAA,8BAAmB,EAAC,cAAc,CAAC,CAAC;YACjE,MAAM,gBAAgB,GAAG,IAAA,sCAA2B,EAClD,gBAAgB;YAChB,8BAA8B;YAC9B,UAAU,CAAC,OAAO,CAAC,GAAG,cAAc,GAAG,EAAE,EAAE,CAAC,CAC7C,CAAC;YACF,IAAI,cAAc,KAAK,gBAAgB,EAAE,CAAC;gBACxC,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,kBAAkB,CAAC,cAAsB;QACrD,MAAM,YAAY,GAAG,IAAA,kBAAY,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvD,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,eAAe,CAC3B,UAAkB,EAClB,qBAA2B;QAE3B,MAAM,OAAO,GAAgB;YAC3B,OAAO,EAAE;gBACP,mBAAmB,EAAE,qBAAqB,CAAC,WAAW,EAAE;aACzD;SACF,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3D,OAAO,QAAQ,CAAC,UAAU,KAAK,GAAG,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,IAAI,CACT,EAAE,UAAU,EAAE,qBAAqB,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,EAClE,qEAAqE,CACtE,CAAC;YACF,OAAO,IAAI,CAAC,CAAC,kDAAkD;QACjE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IAOG,AAAN,KAAK,CAAC,0BAA0B,CAC9B,aAAqB,EACrB,aAAmB;QAEnB,+EAA+E;QAC/E,oCAAoC;QACpC,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC;YAC9C,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,IAAI,cAAc,GAAuB,EAAE,CAAC;QAC5C,mGAAmG;QACnG,MAAM,WAAW,GAAyC,EAAE,CAAC;QAE7D,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,4EAA4E;gBAC5E,IAAI,4BAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC;oBAC9D,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,OAAQ,CAAC,EAAE,CAAC;wBAC1C,WAAW,CAAC,cAAc,CAAC,OAAQ,CAAC,GAAG,EAAE,CAAC;oBAC5C,CAAC;oBACD,WAAW,CAAC,cAAc,CAAC,OAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC1D,cAAc,GAAG,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,GAAG,IAAI,oBAAW,EAAE,CAAC;oBAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;wBAC/B,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC5D,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,IAAI,4BAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,OAAQ,CAAC,EAAE,CAAC;gBAC1C,WAAW,CAAC,cAAc,CAAC,OAAQ,CAAC,GAAG,EAAE,CAAC;YAC5C,CAAC;YACD,WAAW,CAAC,cAAc,CAAC,OAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAMK,AAAN,KAAK,CAAC,eAAe,CACnB,YAAoB;QAEpB,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GACpC,MAAM,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;QACrD,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;OAKG;IAMG,AAAN,KAAK,CAAC,WAAW,CAAC,EAChB,WAAW,EACX,WAAW,GACO;QAClB,6CAA6C;QAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,aAAa,GAAG,IAAA,4BAAsB,EAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,iBAAiB,GAAyB,IAAI,CAAC;QAEnD,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBAC9D,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;gBAEjD,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,UAAU,GAAG,IAAA,6BAAmB,EAAC,cAAc,CAAC,CAAC;oBACvD,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;wBAC/B,iBAAiB,GAAG,UAAU,CAAC;oBACjC,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,IAAA,uCAA6B,EAAC,iBAAiB,EAAE,UAAU,CAAC,EAAE,CAAC;4BAClE,eAAM,CAAC,IAAI,CACT,EAAE,WAAW,EAAE,EACf,4GAA4G,CAC7G,CAAC;wBACJ,CAAC;wBACD,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAM,CAAC,KAAK,CACV,EAAE,YAAY,EAAE,KAAK,EAAE,EACvB,oCAAoC,CACrC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;;AAvUH,sCAwUC;AA9GO;IANL,IAAA,iBAAK,EAAC;QACL,SAAS,EAAE,cAAc,aAAa,CAAC,EAAE,EAAE;QAC3C,GAAG,EAAE,CAAC,aAAqB,EAAE,aAAmB,EAAE,EAAE,CAClD,GAAG,aAAa,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE;QAC/C,UAAU,EAAE,EAAE,GAAG,EAAE;KACpB,CAAC;+DA6CD;AAMK;IAJL,IAAA,iBAAK,EAAC;QACL,SAAS,EAAE,cAAc,aAAa,CAAC,EAAE,EAAE;QAC3C,GAAG,EAAE,CAAC,YAAoB,EAAE,EAAE,CAAC,YAAY;KAC5C,CAAC;oDAOD;AAaK;IALL,IAAA,iBAAK,EAAC;QACL,SAAS,EAAE,cAAc,aAAa,CAAC,EAAE,EAAE;QAC3C,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,EAAqB,EAAE,EAAE,CACvD,GAAG,WAAW,IAAI,WAAW,EAAE;KAClC,CAAC;gDAyCD","sourcesContent":["import readline from 'readline';\nimport { nanoid } from 'nanoid';\nimport upath from 'upath';\nimport { logger } from '../../../logger';\nimport { cache } from '../../../util/cache/package/decorator';\nimport * as fs from '../../../util/fs';\nimport { toSha256 } from '../../../util/hash';\nimport type { HttpOptions } from '../../../util/http/types';\nimport { joinUrlParts } from '../../../util/url';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { computeFileChecksum, parseChecksumsFromInRelease } from './checksum';\nimport { cacheSubDir, packageKeys, requiredPackageKeys } from './common';\nimport { extract, getFileCreationTime } from './file';\nimport { formatReleaseResult, releaseMetaInformationMatches } from './release';\nimport type { PackageDescription } from './types';\nimport { constructComponentUrls, getBaseReleaseUrl } from './url';\n\nexport class DebDatasource extends Datasource {\n static readonly id = 'deb';\n\n constructor() {\n super(DebDatasource.id);\n }\n\n /**\n * Users are able to specify custom Debian repositories as long as they follow\n * the Debian package repository format as specified here\n * @see{https://wiki.debian.org/DebianRepository/Format}\n */\n override readonly customRegistrySupport = true;\n\n /**\n * Users can specify multiple upstream repositories and the datasource will aggregate the release\n * @example\n * When specifying multiple dependencies both internal and external dependencies from internal/external artifactory\n */\n override readonly registryStrategy = 'merge';\n\n /**\n * The original apt source list file format is\n * deb uri distribution [component1] [component2] [...]\n * @see{https://wiki.debian.org/DebianRepository/Format}\n *\n * However, for Renovate, we require the registry URLs to be\n * valid URLs which is why the parameters are encoded in the URL.\n *\n * The following query parameters are required:\n * - components: comma separated list of components\n * - suite: stable, oldstable or other alias for a release, either this or release must be given\n * - release: buster, etc.\n * - binaryArch: e.g. amd64 resolves to http://deb.debian.org/debian/dists/stable/non-free/binary-amd64/\n */\n override readonly defaultRegistryUrls = [\n 'https://deb.debian.org/debian?suite=stable&components=main,contrib,non-free&binaryArch=amd64',\n ];\n\n override readonly defaultVersioning = 'deb';\n\n /**\n * Downloads and extracts a package file from a component URL.\n *\n * @param componentUrl - The URL of the component.\n * @returns The path to the extracted file and the last modification timestamp.\n * @throws Will throw an error if no valid compression method is found.\n */\n private async downloadAndExtractPackage(\n componentUrl: string,\n ): Promise<{ extractedFile: string; lastTimestamp: Date }> {\n const packageUrlHash = toSha256(componentUrl);\n const fullCacheDir = await fs.ensureCacheDir(cacheSubDir);\n const extractedFile = upath.join(fullCacheDir, `${packageUrlHash}.txt`);\n let lastTimestamp = await getFileCreationTime(extractedFile);\n\n const compression = 'gz';\n const compressedFile = upath.join(\n fullCacheDir,\n `${nanoid()}_${packageUrlHash}.${compression}`,\n );\n\n const wasUpdated = await this.downloadPackageFile(\n componentUrl,\n compression,\n compressedFile,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n await extract(compressedFile, compression, extractedFile);\n lastTimestamp = await getFileCreationTime(extractedFile);\n } catch (error) {\n logger.warn(\n {\n compressedFile,\n componentUrl,\n compression,\n error: error.message,\n },\n 'Failed to extract package file from compressed file',\n );\n } finally {\n await fs.rmCache(compressedFile);\n }\n }\n\n if (!lastTimestamp) {\n //extracting went wrong\n throw new Error('Missing metadata in extracted package index file!');\n }\n\n return { extractedFile, lastTimestamp };\n }\n\n /**\n * Downloads a package file if it has been modified since the last download timestamp.\n *\n * @param basePackageUrl - The base URL of the package.\n * @param compression - The compression method used (e.g., 'gz').\n * @param compressedFile - The path where the compressed file will be saved.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the file was downloaded, otherwise false.\n */\n private async downloadPackageFile(\n basePackageUrl: string,\n compression: string,\n compressedFile: string,\n lastDownloadTimestamp?: Date,\n ): Promise<boolean> {\n const baseReleaseUrl = getBaseReleaseUrl(basePackageUrl);\n const packageUrl = joinUrlParts(basePackageUrl, `Packages.${compression}`);\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await this.checkIfModified(\n packageUrl,\n lastDownloadTimestamp,\n );\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${packageUrl}, file is up to date.`);\n return false;\n }\n const readStream = this.http.stream(packageUrl);\n const writeStream = fs.createCacheWriteStream(compressedFile);\n await fs.pipeline(readStream, writeStream);\n logger.debug(\n { url: packageUrl, targetFile: compressedFile },\n 'Downloading Debian package file',\n );\n\n let inReleaseContent = '';\n\n try {\n inReleaseContent = await this.fetchInReleaseFile(baseReleaseUrl);\n } catch (error) {\n // This is expected to fail for Artifactory if GPG verification is not enabled\n logger.debug(\n { url: baseReleaseUrl, err: error },\n 'Could not fetch InRelease file',\n );\n }\n\n if (inReleaseContent) {\n const actualChecksum = await computeFileChecksum(compressedFile);\n const expectedChecksum = parseChecksumsFromInRelease(\n inReleaseContent,\n // path to the Package.gz file\n packageUrl.replace(`${baseReleaseUrl}/`, ''),\n );\n if (actualChecksum !== expectedChecksum) {\n await fs.rmCache(compressedFile);\n throw new Error('SHA256 checksum validation failed');\n }\n }\n\n return needsToDownload;\n }\n\n /**\n * Fetches the content of the InRelease file from the given base release URL.\n *\n * @param baseReleaseUrl - The base URL of the release (e.g., 'https://deb.debian.org/debian/dists/bullseye').\n * @returns resolves to the content of the InRelease file.\n * @throws An error if the InRelease file could not be downloaded.\n */\n private async fetchInReleaseFile(baseReleaseUrl: string): Promise<string> {\n const inReleaseUrl = joinUrlParts(baseReleaseUrl, 'InRelease');\n const response = await this.http.getText(inReleaseUrl);\n return response.body;\n }\n\n /**\n * Checks if a packageUrl content has been modified since the specified timestamp.\n *\n * @param packageUrl - The URL to check.\n * @param lastDownloadTimestamp - The timestamp of the last download.\n * @returns True if the content has been modified, otherwise false.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since\n */\n private async checkIfModified(\n packageUrl: string,\n lastDownloadTimestamp: Date,\n ): Promise<boolean> {\n const options: HttpOptions = {\n headers: {\n 'If-Modified-Since': lastDownloadTimestamp.toUTCString(),\n },\n };\n\n try {\n const response = await this.http.head(packageUrl, options);\n return response.statusCode !== 304;\n } catch (error) {\n logger.warn(\n { packageUrl, lastDownloadTimestamp, errorMessage: error.message },\n 'Could not determine if package file is modified since last download',\n );\n return true; // Assume it needs to be downloaded if check fails\n }\n }\n\n /**\n * Parses the extracted package index file.\n *\n * @param extractedFile - The path to the extracted package file.\n * @param lastTimestamp - The timestamp of the last modification.\n * @returns a list of packages with minimal Metadata.\n */\n @cache({\n namespace: `datasource-${DebDatasource.id}`,\n key: (extractedFile: string, lastTimestamp: Date) =>\n `${extractedFile}:${lastTimestamp.getTime()}`,\n ttlMinutes: 24 * 60,\n })\n async parseExtractedPackageIndex(\n extractedFile: string,\n lastTimestamp: Date,\n ): Promise<Record<string, PackageDescription[]>> {\n // read line by line to avoid high memory consumption as the extracted Packages\n // files can be multiple MBs in size\n const rl = readline.createInterface({\n input: fs.createCacheReadStream(extractedFile),\n terminal: false,\n });\n\n let currentPackage: PackageDescription = {};\n // A Package Index can contain multiple Versions of the package on private Artifactory (e.g. Jfrog)\n const allPackages: Record<string, PackageDescription[]> = {};\n\n for await (const line of rl) {\n if (line === '') {\n // All information of the package are available, add to the list of packages\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n currentPackage = {};\n }\n } else {\n for (const key of packageKeys) {\n if (line.startsWith(`${key}:`)) {\n currentPackage[key] = line.substring(key.length + 1).trim();\n break;\n }\n }\n }\n }\n\n // Check the last package after file reading is complete\n if (requiredPackageKeys.every((key) => key in currentPackage)) {\n if (!allPackages[currentPackage.Package!]) {\n allPackages[currentPackage.Package!] = [];\n }\n allPackages[currentPackage.Package!].push(currentPackage);\n }\n\n return allPackages;\n }\n\n @cache({\n namespace: `datasource-${DebDatasource.id}`,\n key: (componentUrl: string) => componentUrl,\n })\n async getPackageIndex(\n componentUrl: string,\n ): Promise<Record<string, PackageDescription[]>> {\n const { extractedFile, lastTimestamp } =\n await this.downloadAndExtractPackage(componentUrl);\n return await this.parseExtractedPackageIndex(extractedFile, lastTimestamp);\n }\n\n /**\n * Fetches the release information for a given package from the registry URL.\n *\n * @param config - Configuration for fetching releases.\n * @returns The release result if the package is found, otherwise null.\n */\n @cache({\n namespace: `datasource-${DebDatasource.id}`,\n key: ({ registryUrl, packageName }: GetReleasesConfig) =>\n `${registryUrl}:${packageName}`,\n })\n async getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const componentUrls = constructComponentUrls(registryUrl);\n let aggregatedRelease: ReleaseResult | null = null;\n\n for (const componentUrl of componentUrls) {\n try {\n const packageIndex = await this.getPackageIndex(componentUrl);\n const parsedPackages = packageIndex[packageName];\n\n if (parsedPackages) {\n const newRelease = formatReleaseResult(parsedPackages);\n if (aggregatedRelease === null) {\n aggregatedRelease = newRelease;\n } else {\n if (!releaseMetaInformationMatches(aggregatedRelease, newRelease)) {\n logger.warn(\n { packageName },\n 'Package occurred in more than one repository with different meta information. Aggregating releases anyway.',\n );\n }\n aggregatedRelease.releases.push(...newRelease.releases);\n }\n }\n } catch (error) {\n logger.debug(\n { componentUrl, error },\n 'Skipping component due to an error',\n );\n }\n }\n\n return aggregatedRelease;\n }\n}\n"]}
@@ -47,7 +47,7 @@ class DenoDatasource extends datasource_1.Datasource {
47
47
  // get details for the versions
48
48
  const releases = await (0, p_map_1.default)(versions, async (version) => {
49
49
  const cacheRelease = releasesCache[version];
50
- // istanbul ignore if
50
+ /* v8 ignore next 3: hard to test */
51
51
  if (cacheRelease) {
52
52
  return cacheRelease;
53
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/deno/index.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger';\nimport * as packageCache from '../../../util/cache/package';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { regEx } from '../../../util/regex';\nimport { joinUrlParts } from '../../../util/url';\nimport * as semanticVersioning from '../../versioning/semver';\nimport { Datasource } from '../datasource';\nimport type { Release } from '../index';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { DenoAPIModuleResponse, DenoAPIModuleVersionResponse } from './schema';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override readonly defaultRegistryUrls = ['https://apiland.deno.dev'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n @cache({\n namespace: `datasource-${DenoDatasource.id}`,\n key: ({ packageName, registryUrl }: GetReleasesConfig) =>\n // TODO: types (#22198)\n `getReleases:${registryUrl}:${packageName}`,\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (is.nullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n @cache({\n namespace: `datasource-${DenoDatasource.id}`,\n key: (moduleAPIURL) => `getReleaseResult:${moduleAPIURL}`,\n })\n async getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> =\n (await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n )) ?? {};\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n // istanbul ignore if\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/deno/index.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport pMap from 'p-map';\nimport { logger } from '../../../logger';\nimport * as packageCache from '../../../util/cache/package';\nimport { cache } from '../../../util/cache/package/decorator';\nimport { regEx } from '../../../util/regex';\nimport { joinUrlParts } from '../../../util/url';\nimport * as semanticVersioning from '../../versioning/semver';\nimport { Datasource } from '../datasource';\nimport type { Release } from '../index';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { DenoAPIModuleResponse, DenoAPIModuleVersionResponse } from './schema';\n\nexport class DenoDatasource extends Datasource {\n static readonly id = 'deno';\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = semanticVersioning.id;\n\n override readonly defaultRegistryUrls = ['https://apiland.deno.dev'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `uploaded_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `repository` field in the results.';\n\n constructor() {\n super(DenoDatasource.id);\n }\n\n @cache({\n namespace: `datasource-${DenoDatasource.id}`,\n key: ({ packageName, registryUrl }: GetReleasesConfig) =>\n // TODO: types (#22198)\n `getReleases:${registryUrl}:${packageName}`,\n })\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const massagedRegistryUrl = registryUrl!;\n\n const extractResult = regEx(\n /^(https:\\/\\/deno.land\\/)(?<rawPackageName>[^@\\s]+)/,\n ).exec(packageName);\n const rawPackageName = extractResult?.groups?.rawPackageName;\n if (is.nullOrUndefined(rawPackageName)) {\n logger.debug(\n `Could not extract rawPackageName from packageName: \"${packageName}\"`,\n );\n return null;\n }\n\n // remove third-party prefix if defined. The only internal library is `std` and is available under the same API\n const massagedPackageName = rawPackageName.replace('x/', '');\n\n // https://apiland.deno.dev/v2/modules/postgres\n const moduleAPIURL = joinUrlParts(\n massagedRegistryUrl,\n 'v2/modules',\n massagedPackageName,\n );\n\n return await this.getReleaseResult(moduleAPIURL);\n }\n\n @cache({\n namespace: `datasource-${DenoDatasource.id}`,\n key: (moduleAPIURL) => `getReleaseResult:${moduleAPIURL}`,\n })\n async getReleaseResult(moduleAPIURL: string): Promise<ReleaseResult> {\n const detailsCacheKey = `details:${moduleAPIURL}`;\n const releasesCache: Record<string, Release> =\n (await packageCache.get(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n )) ?? {};\n let cacheModified = false;\n\n const {\n body: { versions, tags },\n } = await this.http.getJson(moduleAPIURL, DenoAPIModuleResponse);\n\n // get details for the versions\n const releases = await pMap(\n versions,\n async (version) => {\n const cacheRelease = releasesCache[version];\n /* v8 ignore next 3: hard to test */\n if (cacheRelease) {\n return cacheRelease;\n }\n\n // https://apiland.deno.dev/v2/modules/postgres/v0.17.0\n const url = joinUrlParts(moduleAPIURL, version);\n const { body: release } = await this.http.getJson(\n url,\n DenoAPIModuleVersionResponse.catch(({ error: err }) => {\n logger.warn(\n { err, version },\n 'Deno: failed to get version details',\n );\n return { version };\n }),\n );\n\n releasesCache[release.version] = release;\n cacheModified = true;\n\n return release;\n },\n { concurrency: 5 },\n );\n\n if (cacheModified) {\n // 1 week. Releases at Deno are immutable, therefore we can use a long term cache here.\n await packageCache.set(\n `datasource-${DenoDatasource.id}`,\n detailsCacheKey,\n releasesCache,\n 10080,\n );\n }\n\n return { releases, tags };\n }\n}\n"]}
@@ -32,7 +32,6 @@ class DevboxDatasource extends datasource_1.Datasource {
32
32
  res.homepage = response.body.homepage;
33
33
  }
34
34
  catch (err) {
35
- // istanbul ignore else: not testable with nock
36
35
  if (err instanceof http_1.HttpError) {
37
36
  if (err.response?.statusCode !== 404) {
38
37
  throw new external_host_error_1.ExternalHostError(err);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/devbox/index.ts"],"names":[],"mappings":";;;;AAAA,4CAAyC;AACzC,mFAA8E;AAC9E,6CAA+C;AAC/C,2CAAiD;AACjD,kFAA4D;AAC5D,8CAA2C;AAE3C,qCAA0D;AAC1D,qCAA0C;AAE1C,MAAa,gBAAiB,SAAQ,uBAAU;IAC9C,MAAM,CAAU,EAAE,GAAG,mBAAU,CAAC;IAEhC;QACE,KAAK,CAAC,mBAAU,CAAC,CAAC;IACpB,CAAC;IAEiB,qBAAqB,GAAG,IAAI,CAAC;IAC7B,uBAAuB,GAAG,IAAI,CAAC;IAE/B,gBAAgB,GAAG,OAAO,CAAC;IAE3B,iBAAiB,GAAG,gBAAgB,CAAC,EAAE,CAAC;IAExC,mBAAmB,GAAG,CAAC,2BAAkB,CAAC,CAAC;IAE7D,KAAK,CAAC,WAAW,CAAC,EAChB,WAAW,EACX,WAAW,GACO;QAClB,MAAM,GAAG,GAAkB;YACzB,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,eAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,IAAA,kBAAY,EAC/B,WAAY,EACZ,aAAa,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAC/C,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,uBAAc,CAAC,CAAC;YACvE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,+CAA+C;YAC/C,IAAI,GAAG,YAAY,gBAAS,EAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,KAAK,GAAG,EAAE,CAAC;oBACrC,MAAM,IAAI,uCAAiB,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;;AA7CH,4CA8CC","sourcesContent":["import { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { HttpError } from '../../../util/http';\nimport { joinUrlParts } from '../../../util/url';\nimport * as devboxVersioning from '../../versioning/devbox';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { datasource, defaultRegistryUrl } from './common';\nimport { DevboxResponse } from './schema';\n\nexport class DevboxDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n override readonly releaseTimestampSupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = devboxVersioning.id;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n async getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res: ReleaseResult = {\n releases: [],\n };\n\n logger.trace({ registryUrl, packageName }, 'fetching devbox release');\n\n const devboxPkgUrl = joinUrlParts(\n registryUrl!,\n `/pkg?name=${encodeURIComponent(packageName)}`,\n );\n\n try {\n const response = await this.http.getJson(devboxPkgUrl, DevboxResponse);\n res.releases = response.body.releases;\n res.homepage = response.body.homepage;\n } catch (err) {\n // istanbul ignore else: not testable with nock\n if (err instanceof HttpError) {\n if (err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n }\n this.handleGenericErrors(err);\n }\n return res.releases.length ? res : null;\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/devbox/index.ts"],"names":[],"mappings":";;;;AAAA,4CAAyC;AACzC,mFAA8E;AAC9E,6CAA+C;AAC/C,2CAAiD;AACjD,kFAA4D;AAC5D,8CAA2C;AAE3C,qCAA0D;AAC1D,qCAA0C;AAE1C,MAAa,gBAAiB,SAAQ,uBAAU;IAC9C,MAAM,CAAU,EAAE,GAAG,mBAAU,CAAC;IAEhC;QACE,KAAK,CAAC,mBAAU,CAAC,CAAC;IACpB,CAAC;IAEiB,qBAAqB,GAAG,IAAI,CAAC;IAC7B,uBAAuB,GAAG,IAAI,CAAC;IAE/B,gBAAgB,GAAG,OAAO,CAAC;IAE3B,iBAAiB,GAAG,gBAAgB,CAAC,EAAE,CAAC;IAExC,mBAAmB,GAAG,CAAC,2BAAkB,CAAC,CAAC;IAE7D,KAAK,CAAC,WAAW,CAAC,EAChB,WAAW,EACX,WAAW,GACO;QAClB,MAAM,GAAG,GAAkB;YACzB,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,eAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,IAAA,kBAAY,EAC/B,WAAY,EACZ,aAAa,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAC/C,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,uBAAc,CAAC,CAAC;YACvE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,gBAAS,EAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,KAAK,GAAG,EAAE,CAAC;oBACrC,MAAM,IAAI,uCAAiB,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;;AA5CH,4CA6CC","sourcesContent":["import { logger } from '../../../logger';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { HttpError } from '../../../util/http';\nimport { joinUrlParts } from '../../../util/url';\nimport * as devboxVersioning from '../../versioning/devbox';\nimport { Datasource } from '../datasource';\nimport type { GetReleasesConfig, ReleaseResult } from '../types';\nimport { datasource, defaultRegistryUrl } from './common';\nimport { DevboxResponse } from './schema';\n\nexport class DevboxDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n override readonly releaseTimestampSupport = true;\n\n override readonly registryStrategy = 'first';\n\n override readonly defaultVersioning = devboxVersioning.id;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n async getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const res: ReleaseResult = {\n releases: [],\n };\n\n logger.trace({ registryUrl, packageName }, 'fetching devbox release');\n\n const devboxPkgUrl = joinUrlParts(\n registryUrl!,\n `/pkg?name=${encodeURIComponent(packageName)}`,\n );\n\n try {\n const response = await this.http.getJson(devboxPkgUrl, DevboxResponse);\n res.releases = response.body.releases;\n res.homepage = response.body.homepage;\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n }\n this.handleGenericErrors(err);\n }\n return res.releases.length ? res : null;\n }\n}\n"]}
@@ -132,7 +132,7 @@ async function getAuthHeaders(http, registryHost, dockerRepository, apiCheckUrl
132
132
  opts.noAuth = true;
133
133
  const authResponse = (await http.getJsonUnchecked(authUrl.href, opts)).body;
134
134
  const token = authResponse.token ?? authResponse.access_token;
135
- // istanbul ignore if
135
+ /* v8 ignore next 4 -- TODO: add test */
136
136
  if (!token) {
137
137
  logger_1.logger.warn('Failed to obtain docker registry token');
138
138
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/docker/common.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { parse } from 'auth-header';\nimport {\n HOST_DISABLED,\n PAGE_NOT_FOUND_ERROR,\n} from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { HostRule } from '../../../types';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { coerceArray } from '../../../util/array';\nimport { detectPlatform } from '../../../util/common';\nimport { parseGitUrl } from '../../../util/git/url';\nimport { toSha256 } from '../../../util/hash';\nimport * as hostRules from '../../../util/host-rules';\nimport type { Http } from '../../../util/http';\nimport type {\n HttpOptions,\n HttpResponse,\n OutgoingHttpHeaders,\n} from '../../../util/http/types';\nimport { regEx } from '../../../util/regex';\nimport { addSecretForSanitizing } from '../../../util/sanitize';\nimport {\n ensureTrailingSlash,\n parseUrl,\n trimTrailingSlash,\n} from '../../../util/url';\nimport { api as dockerVersioning } from '../../versioning/docker';\nimport { getGoogleAuthToken } from '../util';\nimport { ecrRegex, getECRAuthToken } from './ecr';\nimport { googleRegex } from './google';\nimport type { OciHelmConfig } from './schema';\nimport type { RegistryRepository } from './types';\n\nexport const dockerDatasourceId = 'docker';\n\nexport const imageUrlLabel = 'org.opencontainers.image.url';\n\nexport const sourceLabel = 'org.opencontainers.image.source';\nexport const sourceLabels = [sourceLabel, 'org.label-schema.vcs-url'] as const;\n\nexport const gitRefLabel = 'org.opencontainers.image.revision';\n\nexport const DOCKER_HUB = 'https://index.docker.io';\n\nexport function isDockerHost(host: string): boolean {\n const regex = regEx(/(?:^|\\.)docker\\.io$/);\n return regex.test(host);\n}\n\nexport async function getAuthHeaders(\n http: Http,\n registryHost: string,\n dockerRepository: string,\n apiCheckUrl = `${registryHost}/v2/`,\n): Promise<OutgoingHttpHeaders | null> {\n try {\n const options = {\n throwHttpErrors: false,\n noAuth: true,\n };\n const apiCheckResponse = apiCheckUrl.endsWith('/v2/')\n ? await http.get(apiCheckUrl, options)\n : // use json request, as this will be cached for tags, so it returns json\n // TODO: add cache test\n await http.getJsonUnchecked(apiCheckUrl, options);\n\n if (apiCheckResponse.statusCode === 200) {\n logger.debug(`No registry auth required for ${apiCheckUrl}`);\n return {};\n }\n if (apiCheckResponse.statusCode === 404) {\n logger.debug(`Page Not Found ${apiCheckUrl}`);\n // throw error up to be caught and potentially retried with library/ prefix\n throw new Error(PAGE_NOT_FOUND_ERROR);\n }\n if (\n apiCheckResponse.statusCode !== 401 ||\n !is.nonEmptyString(apiCheckResponse.headers['www-authenticate'])\n ) {\n logger.warn(\n { apiCheckUrl, res: apiCheckResponse },\n 'Invalid registry response',\n );\n return null;\n }\n\n const authenticateHeader = parse(\n apiCheckResponse.headers['www-authenticate'],\n );\n\n const opts: HostRule & HttpOptions = hostRules.find({\n hostType: dockerDatasourceId,\n url: apiCheckUrl,\n });\n if (ecrRegex.test(registryHost)) {\n logger.once.debug(`hostRules: ecr auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using ecr auth for Docker registry`,\n );\n const [, region] = coerceArray(ecrRegex.exec(registryHost));\n const auth = await getECRAuthToken(region, opts);\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n }\n } else if (\n googleRegex.test(registryHost) &&\n typeof opts.username === 'undefined' &&\n typeof opts.password === 'undefined' &&\n typeof opts.token === 'undefined'\n ) {\n logger.once.debug(`hostRules: google auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using google auth for Docker registry`,\n );\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { registryHost, dockerRepository },\n 'Could not get Google access token, using no auth',\n );\n }\n } else if (opts.username && opts.password) {\n logger.once.debug(`hostRules: basic auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using basic auth for Docker registry`,\n );\n const auth = Buffer.from(`${opts.username}:${opts.password}`).toString(\n 'base64',\n );\n opts.headers = { authorization: `Basic ${auth}` };\n } else if (opts.token) {\n const authType = opts.authType ?? 'Bearer';\n logger.once.debug(\n `hostRules: ${authType} token auth for ${registryHost}`,\n );\n logger.trace(\n { registryHost, dockerRepository },\n `Using ${authType} token for Docker registry`,\n );\n opts.headers = { authorization: `${authType} ${opts.token}` };\n }\n delete opts.username;\n delete opts.password;\n delete opts.token;\n\n // If realm isn't an url, we should directly use auth header\n // Can happen when we get a Basic auth or some other auth type\n // * WWW-Authenticate: Basic realm=\"Artifactory Realm\"\n // * Www-Authenticate: Basic realm=\"https://123456789.dkr.ecr.eu-central-1.amazonaws.com/\",service=\"ecr.amazonaws.com\"\n // * www-authenticate: Bearer realm=\"https://ghcr.io/token\",service=\"ghcr.io\",scope=\"repository:user/image:pull\"\n // * www-authenticate: Bearer realm=\"https://auth.docker.io/token\",service=\"registry.docker.io\"\n if (\n authenticateHeader.scheme.toUpperCase() !== 'BEARER' ||\n !is.string(authenticateHeader.params.realm) ||\n parseUrl(authenticateHeader.params.realm) === null\n ) {\n logger.once.debug(`hostRules: testing direct auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository, authenticateHeader },\n `Invalid realm, testing direct auth`,\n );\n return opts.headers ?? null;\n }\n\n const authUrl = new URL(`${authenticateHeader.params.realm}`);\n\n // repo isn't known to server yet, so causing wrong scope `repository:user/image:pull`\n if (\n is.string(authenticateHeader.params.scope) &&\n !apiCheckUrl.endsWith('/v2/')\n ) {\n authUrl.searchParams.append('scope', authenticateHeader.params.scope);\n } else {\n authUrl.searchParams.append(\n 'scope',\n `repository:${dockerRepository}:pull`,\n );\n }\n\n if (is.string(authenticateHeader.params.service)) {\n authUrl.searchParams.append('service', authenticateHeader.params.service);\n }\n\n logger.trace(\n { registryHost, dockerRepository, authUrl: authUrl.href },\n `Obtaining docker registry token`,\n );\n opts.noAuth = true;\n const authResponse = (\n await http.getJsonUnchecked<{ token?: string; access_token?: string }>(\n authUrl.href,\n opts,\n )\n ).body;\n\n const token = authResponse.token ?? authResponse.access_token;\n // istanbul ignore if\n if (!token) {\n logger.warn('Failed to obtain docker registry token');\n return null;\n }\n // sanitize token\n addSecretForSanitizing(token);\n return {\n authorization: `Bearer ${token}`,\n };\n } catch (err) /* istanbul ignore next */ {\n if (err.host === 'quay.io') {\n // TODO: debug why quay throws errors (#9604)\n return null;\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 === 403) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Not allowed to access docker registry',\n );\n logger.debug({ err });\n return null;\n }\n if (err.name === 'RequestError' && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n 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.message === PAGE_NOT_FOUND_ERROR) {\n throw err;\n }\n if (err.message === HOST_DISABLED) {\n logger.trace({ registryHost, dockerRepository, err }, 'Host disabled');\n return null;\n }\n logger.warn(\n { registryHost, dockerRepository, err },\n 'Error obtaining docker token',\n );\n return null;\n }\n}\n\nexport function getRegistryRepository(\n packageName: string,\n registryUrl: string,\n): RegistryRepository {\n if (registryUrl !== DOCKER_HUB) {\n const registryEndingWithSlash = ensureTrailingSlash(\n registryUrl.replace(regEx(/^https?:\\/\\//), ''),\n );\n if (packageName.startsWith(registryEndingWithSlash)) {\n let registryHost = trimTrailingSlash(registryUrl);\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n let dockerRepository = packageName.replace(registryEndingWithSlash, '');\n const fullUrl = `${registryHost}/${dockerRepository}`;\n const { origin, pathname } = parseUrl(fullUrl)!;\n registryHost = origin;\n dockerRepository = pathname.substring(1);\n return {\n registryHost,\n dockerRepository,\n };\n }\n }\n let registryHost = registryUrl;\n const split = packageName.split('/');\n if (split.length > 1 && (split[0].includes('.') || split[0].includes(':'))) {\n [registryHost] = split;\n split.shift();\n }\n let dockerRepository = split.join('/');\n\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n\n const { path, base } =\n regEx(/^(?<base>https:\\/\\/[^/]+)\\/(?<path>.+)$/).exec(registryHost)\n ?.groups ?? {};\n if (base && path) {\n registryHost = base;\n dockerRepository = `${trimTrailingSlash(path)}/${dockerRepository}`;\n }\n\n registryHost = registryHost\n .replace('https://docker.io', 'https://index.docker.io')\n .replace('https://registry-1.docker.io', 'https://index.docker.io');\n\n const opts = hostRules.find({\n hostType: dockerDatasourceId,\n url: registryHost,\n });\n if (opts?.insecureRegistry) {\n registryHost = registryHost.replace('https', 'http');\n }\n if (registryHost.endsWith('.docker.io') && !dockerRepository.includes('/')) {\n dockerRepository = 'library/' + dockerRepository;\n }\n return {\n registryHost,\n dockerRepository,\n };\n}\n\nexport function extractDigestFromResponseBody(\n manifestResponse: HttpResponse,\n): string {\n return 'sha256:' + toSha256(manifestResponse.body);\n}\n\nexport function findLatestStable(tags: string[]): string | null {\n let stable: string | null = null;\n\n for (const tag of tags) {\n if (!dockerVersioning.isValid(tag) || !dockerVersioning.isStable(tag)) {\n continue;\n }\n\n if (!stable || dockerVersioning.isGreaterThan(tag, stable)) {\n stable = tag;\n }\n }\n\n return stable;\n}\n\nconst chartRepo = regEx(/charts?|helm|helm-charts?/i);\n\nfunction isPossibleChartRepo(url: string): boolean {\n if (detectPlatform(url) === null) {\n return false;\n }\n\n const parsed = parseGitUrl(url);\n return chartRepo.test(parsed.name);\n}\n\nexport function findHelmSourceUrl(release: OciHelmConfig): string | null {\n if (release.home && isPossibleChartRepo(release.home)) {\n return release.home;\n }\n\n if (!release.sources?.length) {\n return null;\n }\n\n for (const url of release.sources) {\n if (isPossibleChartRepo(url)) {\n return url;\n }\n }\n\n // fallback\n return release.sources[0];\n}\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../lib/modules/datasource/docker/common.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport { parse } from 'auth-header';\nimport {\n HOST_DISABLED,\n PAGE_NOT_FOUND_ERROR,\n} from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { HostRule } from '../../../types';\nimport { ExternalHostError } from '../../../types/errors/external-host-error';\nimport { coerceArray } from '../../../util/array';\nimport { detectPlatform } from '../../../util/common';\nimport { parseGitUrl } from '../../../util/git/url';\nimport { toSha256 } from '../../../util/hash';\nimport * as hostRules from '../../../util/host-rules';\nimport type { Http } from '../../../util/http';\nimport type {\n HttpOptions,\n HttpResponse,\n OutgoingHttpHeaders,\n} from '../../../util/http/types';\nimport { regEx } from '../../../util/regex';\nimport { addSecretForSanitizing } from '../../../util/sanitize';\nimport {\n ensureTrailingSlash,\n parseUrl,\n trimTrailingSlash,\n} from '../../../util/url';\nimport { api as dockerVersioning } from '../../versioning/docker';\nimport { getGoogleAuthToken } from '../util';\nimport { ecrRegex, getECRAuthToken } from './ecr';\nimport { googleRegex } from './google';\nimport type { OciHelmConfig } from './schema';\nimport type { RegistryRepository } from './types';\n\nexport const dockerDatasourceId = 'docker';\n\nexport const imageUrlLabel = 'org.opencontainers.image.url';\n\nexport const sourceLabel = 'org.opencontainers.image.source';\nexport const sourceLabels = [sourceLabel, 'org.label-schema.vcs-url'] as const;\n\nexport const gitRefLabel = 'org.opencontainers.image.revision';\n\nexport const DOCKER_HUB = 'https://index.docker.io';\n\nexport function isDockerHost(host: string): boolean {\n const regex = regEx(/(?:^|\\.)docker\\.io$/);\n return regex.test(host);\n}\n\nexport async function getAuthHeaders(\n http: Http,\n registryHost: string,\n dockerRepository: string,\n apiCheckUrl = `${registryHost}/v2/`,\n): Promise<OutgoingHttpHeaders | null> {\n try {\n const options = {\n throwHttpErrors: false,\n noAuth: true,\n };\n const apiCheckResponse = apiCheckUrl.endsWith('/v2/')\n ? await http.get(apiCheckUrl, options)\n : // use json request, as this will be cached for tags, so it returns json\n // TODO: add cache test\n await http.getJsonUnchecked(apiCheckUrl, options);\n\n if (apiCheckResponse.statusCode === 200) {\n logger.debug(`No registry auth required for ${apiCheckUrl}`);\n return {};\n }\n if (apiCheckResponse.statusCode === 404) {\n logger.debug(`Page Not Found ${apiCheckUrl}`);\n // throw error up to be caught and potentially retried with library/ prefix\n throw new Error(PAGE_NOT_FOUND_ERROR);\n }\n if (\n apiCheckResponse.statusCode !== 401 ||\n !is.nonEmptyString(apiCheckResponse.headers['www-authenticate'])\n ) {\n logger.warn(\n { apiCheckUrl, res: apiCheckResponse },\n 'Invalid registry response',\n );\n return null;\n }\n\n const authenticateHeader = parse(\n apiCheckResponse.headers['www-authenticate'],\n );\n\n const opts: HostRule & HttpOptions = hostRules.find({\n hostType: dockerDatasourceId,\n url: apiCheckUrl,\n });\n if (ecrRegex.test(registryHost)) {\n logger.once.debug(`hostRules: ecr auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using ecr auth for Docker registry`,\n );\n const [, region] = coerceArray(ecrRegex.exec(registryHost));\n const auth = await getECRAuthToken(region, opts);\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n }\n } else if (\n googleRegex.test(registryHost) &&\n typeof opts.username === 'undefined' &&\n typeof opts.password === 'undefined' &&\n typeof opts.token === 'undefined'\n ) {\n logger.once.debug(`hostRules: google auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using google auth for Docker registry`,\n );\n const auth = await getGoogleAuthToken();\n if (auth) {\n opts.headers = { authorization: `Basic ${auth}` };\n } else {\n logger.once.debug(\n { registryHost, dockerRepository },\n 'Could not get Google access token, using no auth',\n );\n }\n } else if (opts.username && opts.password) {\n logger.once.debug(`hostRules: basic auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository },\n `Using basic auth for Docker registry`,\n );\n const auth = Buffer.from(`${opts.username}:${opts.password}`).toString(\n 'base64',\n );\n opts.headers = { authorization: `Basic ${auth}` };\n } else if (opts.token) {\n const authType = opts.authType ?? 'Bearer';\n logger.once.debug(\n `hostRules: ${authType} token auth for ${registryHost}`,\n );\n logger.trace(\n { registryHost, dockerRepository },\n `Using ${authType} token for Docker registry`,\n );\n opts.headers = { authorization: `${authType} ${opts.token}` };\n }\n delete opts.username;\n delete opts.password;\n delete opts.token;\n\n // If realm isn't an url, we should directly use auth header\n // Can happen when we get a Basic auth or some other auth type\n // * WWW-Authenticate: Basic realm=\"Artifactory Realm\"\n // * Www-Authenticate: Basic realm=\"https://123456789.dkr.ecr.eu-central-1.amazonaws.com/\",service=\"ecr.amazonaws.com\"\n // * www-authenticate: Bearer realm=\"https://ghcr.io/token\",service=\"ghcr.io\",scope=\"repository:user/image:pull\"\n // * www-authenticate: Bearer realm=\"https://auth.docker.io/token\",service=\"registry.docker.io\"\n if (\n authenticateHeader.scheme.toUpperCase() !== 'BEARER' ||\n !is.string(authenticateHeader.params.realm) ||\n parseUrl(authenticateHeader.params.realm) === null\n ) {\n logger.once.debug(`hostRules: testing direct auth for ${registryHost}`);\n logger.trace(\n { registryHost, dockerRepository, authenticateHeader },\n `Invalid realm, testing direct auth`,\n );\n return opts.headers ?? null;\n }\n\n const authUrl = new URL(`${authenticateHeader.params.realm}`);\n\n // repo isn't known to server yet, so causing wrong scope `repository:user/image:pull`\n if (\n is.string(authenticateHeader.params.scope) &&\n !apiCheckUrl.endsWith('/v2/')\n ) {\n authUrl.searchParams.append('scope', authenticateHeader.params.scope);\n } else {\n authUrl.searchParams.append(\n 'scope',\n `repository:${dockerRepository}:pull`,\n );\n }\n\n if (is.string(authenticateHeader.params.service)) {\n authUrl.searchParams.append('service', authenticateHeader.params.service);\n }\n\n logger.trace(\n { registryHost, dockerRepository, authUrl: authUrl.href },\n `Obtaining docker registry token`,\n );\n opts.noAuth = true;\n const authResponse = (\n await http.getJsonUnchecked<{ token?: string; access_token?: string }>(\n authUrl.href,\n opts,\n )\n ).body;\n\n const token = authResponse.token ?? authResponse.access_token;\n /* v8 ignore next 4 -- TODO: add test */\n if (!token) {\n logger.warn('Failed to obtain docker registry token');\n return null;\n }\n // sanitize token\n addSecretForSanitizing(token);\n return {\n authorization: `Bearer ${token}`,\n };\n } catch (err) /* istanbul ignore next */ {\n if (err.host === 'quay.io') {\n // TODO: debug why quay throws errors (#9604)\n return null;\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 === 403) {\n logger.debug(\n { registryHost, dockerRepository },\n 'Not allowed to access docker registry',\n );\n logger.debug({ err });\n return null;\n }\n if (err.name === 'RequestError' && isDockerHost(registryHost)) {\n throw new ExternalHostError(err);\n }\n 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.message === PAGE_NOT_FOUND_ERROR) {\n throw err;\n }\n if (err.message === HOST_DISABLED) {\n logger.trace({ registryHost, dockerRepository, err }, 'Host disabled');\n return null;\n }\n logger.warn(\n { registryHost, dockerRepository, err },\n 'Error obtaining docker token',\n );\n return null;\n }\n}\n\nexport function getRegistryRepository(\n packageName: string,\n registryUrl: string,\n): RegistryRepository {\n if (registryUrl !== DOCKER_HUB) {\n const registryEndingWithSlash = ensureTrailingSlash(\n registryUrl.replace(regEx(/^https?:\\/\\//), ''),\n );\n if (packageName.startsWith(registryEndingWithSlash)) {\n let registryHost = trimTrailingSlash(registryUrl);\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n let dockerRepository = packageName.replace(registryEndingWithSlash, '');\n const fullUrl = `${registryHost}/${dockerRepository}`;\n const { origin, pathname } = parseUrl(fullUrl)!;\n registryHost = origin;\n dockerRepository = pathname.substring(1);\n return {\n registryHost,\n dockerRepository,\n };\n }\n }\n let registryHost = registryUrl;\n const split = packageName.split('/');\n if (split.length > 1 && (split[0].includes('.') || split[0].includes(':'))) {\n [registryHost] = split;\n split.shift();\n }\n let dockerRepository = split.join('/');\n\n if (!regEx(/^https?:\\/\\//).test(registryHost)) {\n registryHost = `https://${registryHost}`;\n }\n\n const { path, base } =\n regEx(/^(?<base>https:\\/\\/[^/]+)\\/(?<path>.+)$/).exec(registryHost)\n ?.groups ?? {};\n if (base && path) {\n registryHost = base;\n dockerRepository = `${trimTrailingSlash(path)}/${dockerRepository}`;\n }\n\n registryHost = registryHost\n .replace('https://docker.io', 'https://index.docker.io')\n .replace('https://registry-1.docker.io', 'https://index.docker.io');\n\n const opts = hostRules.find({\n hostType: dockerDatasourceId,\n url: registryHost,\n });\n if (opts?.insecureRegistry) {\n registryHost = registryHost.replace('https', 'http');\n }\n if (registryHost.endsWith('.docker.io') && !dockerRepository.includes('/')) {\n dockerRepository = 'library/' + dockerRepository;\n }\n return {\n registryHost,\n dockerRepository,\n };\n}\n\nexport function extractDigestFromResponseBody(\n manifestResponse: HttpResponse,\n): string {\n return 'sha256:' + toSha256(manifestResponse.body);\n}\n\nexport function findLatestStable(tags: string[]): string | null {\n let stable: string | null = null;\n\n for (const tag of tags) {\n if (!dockerVersioning.isValid(tag) || !dockerVersioning.isStable(tag)) {\n continue;\n }\n\n if (!stable || dockerVersioning.isGreaterThan(tag, stable)) {\n stable = tag;\n }\n }\n\n return stable;\n}\n\nconst chartRepo = regEx(/charts?|helm|helm-charts?/i);\n\nfunction isPossibleChartRepo(url: string): boolean {\n if (detectPlatform(url) === null) {\n return false;\n }\n\n const parsed = parseGitUrl(url);\n return chartRepo.test(parsed.name);\n}\n\nexport function findHelmSourceUrl(release: OciHelmConfig): string | null {\n if (release.home && isPossibleChartRepo(release.home)) {\n return release.home;\n }\n\n if (!release.sources?.length) {\n return null;\n }\n\n for (const url of release.sources) {\n if (isPossibleChartRepo(url)) {\n return url;\n }\n }\n\n // fallback\n return release.sources[0];\n}\n"]}
@@ -118,7 +118,7 @@ class DockerDatasource extends datasource_1.Datasource {
118
118
  async getImageConfig(registryHost, dockerRepository, configDigest) {
119
119
  logger_1.logger.trace(`getImageConfig(${registryHost}, ${dockerRepository}, ${configDigest})`);
120
120
  const headers = await (0, common_1.getAuthHeaders)(this.http, registryHost, dockerRepository);
121
- // istanbul ignore if: Should never happen
121
+ /* v8 ignore next 4 -- should never happen */
122
122
  if (!headers) {
123
123
  logger_1.logger.warn('No docker auth found - returning');
124
124
  return undefined;
@@ -132,7 +132,7 @@ class DockerDatasource extends datasource_1.Datasource {
132
132
  async getHelmConfig(registryHost, dockerRepository, configDigest) {
133
133
  logger_1.logger.trace(`getImageConfig(${registryHost}, ${dockerRepository}, ${configDigest})`);
134
134
  const headers = await (0, common_1.getAuthHeaders)(this.http, registryHost, dockerRepository);
135
- // istanbul ignore if: Should never happen
135
+ /* v8 ignore next 4 -- should never happen */
136
136
  if (!headers) {
137
137
  logger_1.logger.warn('No docker auth found - returning');
138
138
  return undefined;
@@ -152,7 +152,7 @@ class DockerDatasource extends datasource_1.Datasource {
152
152
  // If getting the manifest fails here, then abort
153
153
  // This means that the latest tag doesn't have a manifest, which shouldn't
154
154
  // be possible
155
- // istanbul ignore if
155
+ /* v8 ignore next 3 -- should never happen */
156
156
  if (!manifestResponse) {
157
157
  return null;
158
158
  }
@@ -287,7 +287,7 @@ class DockerDatasource extends datasource_1.Datasource {
287
287
  return labels;
288
288
  }
289
289
  const configResponse = await this.getImageConfig(registryHost, dockerRepository, manifest.config.digest);
290
- // istanbul ignore if: should never happen
290
+ /* v8 ignore next 3 -- should never happen */
291
291
  if (!configResponse) {
292
292
  return labels;
293
293
  }
@@ -654,7 +654,7 @@ class DockerDatasource extends datasource_1.Datasource {
654
654
  const latestTag = tags.includes('latest')
655
655
  ? 'latest'
656
656
  : ((0, common_1.findLatestStable)(tags) ?? tags[tags.length - 1]);
657
- // istanbul ignore if: needs test
657
+ /* v8 ignore next 3 -- TODO: add test */
658
658
  if (!latestTag) {
659
659
  return ret;
660
660
  }