renovate 44.108.2 → 44.109.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/modules/datasource/apk/index.js +6 -2
  2. package/dist/modules/datasource/apk/index.js.map +1 -1
  3. package/dist/modules/datasource/artifactory/index.js +3 -1
  4. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  5. package/dist/modules/datasource/azure-pipelines-tasks/index.js +3 -1
  6. package/dist/modules/datasource/azure-pipelines-tasks/index.js.map +1 -1
  7. package/dist/modules/datasource/bazel/index.js +6 -2
  8. package/dist/modules/datasource/bazel/index.js.map +1 -1
  9. package/dist/modules/datasource/bitbucket-tags/index.js +3 -1
  10. package/dist/modules/datasource/bitbucket-tags/index.js.map +1 -1
  11. package/dist/modules/datasource/bitrise/index.js +6 -2
  12. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  13. package/dist/modules/datasource/buildpacks-registry/index.js +6 -2
  14. package/dist/modules/datasource/buildpacks-registry/index.js.map +1 -1
  15. package/dist/modules/datasource/cdnjs/index.js +6 -2
  16. package/dist/modules/datasource/cdnjs/index.js.map +1 -1
  17. package/dist/modules/datasource/clojure/index.js +3 -1
  18. package/dist/modules/datasource/clojure/index.js.map +1 -1
  19. package/dist/modules/datasource/conan/index.js +3 -1
  20. package/dist/modules/datasource/conan/index.js.map +1 -1
  21. package/dist/modules/datasource/conda/index.js +6 -2
  22. package/dist/modules/datasource/conda/index.js.map +1 -1
  23. package/dist/modules/datasource/cpan/index.js +6 -2
  24. package/dist/modules/datasource/cpan/index.js.map +1 -1
  25. package/dist/modules/datasource/crate/index.js +3 -1
  26. package/dist/modules/datasource/crate/index.js.map +1 -1
  27. package/dist/modules/datasource/custom/index.js +3 -1
  28. package/dist/modules/datasource/custom/index.js.map +1 -1
  29. package/dist/modules/datasource/dart/index.js +6 -2
  30. package/dist/modules/datasource/dart/index.js.map +1 -1
  31. package/dist/modules/datasource/dart-version/index.js +6 -2
  32. package/dist/modules/datasource/dart-version/index.js.map +1 -1
  33. package/dist/modules/datasource/datasource.js +4 -2
  34. package/dist/modules/datasource/datasource.js.map +1 -1
  35. package/dist/modules/datasource/deb/index.js +6 -2
  36. package/dist/modules/datasource/deb/index.js.map +1 -1
  37. package/dist/modules/datasource/deno/index.js +6 -2
  38. package/dist/modules/datasource/deno/index.js.map +1 -1
  39. package/dist/modules/datasource/devbox/index.js +6 -2
  40. package/dist/modules/datasource/devbox/index.js.map +1 -1
  41. package/dist/modules/datasource/docker/index.js +3 -1
  42. package/dist/modules/datasource/docker/index.js.map +1 -1
  43. package/dist/modules/datasource/dotnet-version/index.js +7 -3
  44. package/dist/modules/datasource/dotnet-version/index.js.map +1 -1
  45. package/dist/modules/datasource/elm-package/index.js +6 -2
  46. package/dist/modules/datasource/elm-package/index.js.map +1 -1
  47. package/dist/modules/datasource/endoflife-date/index.js +3 -1
  48. package/dist/modules/datasource/endoflife-date/index.js.map +1 -1
  49. package/dist/modules/datasource/flutter-version/index.js +6 -2
  50. package/dist/modules/datasource/flutter-version/index.js.map +1 -1
  51. package/dist/modules/datasource/forgejo-releases/index.js +3 -1
  52. package/dist/modules/datasource/forgejo-releases/index.js.map +1 -1
  53. package/dist/modules/datasource/forgejo-tags/index.js +3 -1
  54. package/dist/modules/datasource/forgejo-tags/index.js.map +1 -1
  55. package/dist/modules/datasource/galaxy/index.js +6 -2
  56. package/dist/modules/datasource/galaxy/index.js.map +1 -1
  57. package/dist/modules/datasource/galaxy-collection/index.js +6 -2
  58. package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
  59. package/dist/modules/datasource/git-refs/index.js +3 -1
  60. package/dist/modules/datasource/git-refs/index.js.map +1 -1
  61. package/dist/modules/datasource/git-tags/index.js +3 -1
  62. package/dist/modules/datasource/git-tags/index.js.map +1 -1
  63. package/dist/modules/datasource/gitea-releases/index.js +0 -1
  64. package/dist/modules/datasource/gitea-releases/index.js.map +1 -1
  65. package/dist/modules/datasource/gitea-tags/base.js +6 -3
  66. package/dist/modules/datasource/gitea-tags/base.js.map +1 -1
  67. package/dist/modules/datasource/gitea-tags/index.js +0 -1
  68. package/dist/modules/datasource/gitea-tags/index.js.map +1 -1
  69. package/dist/modules/datasource/github-digest/index.js +3 -1
  70. package/dist/modules/datasource/github-digest/index.js.map +1 -1
  71. package/dist/modules/datasource/github-release-attachments/index.js +3 -1
  72. package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
  73. package/dist/modules/datasource/github-releases/index.js +3 -1
  74. package/dist/modules/datasource/github-releases/index.js.map +1 -1
  75. package/dist/modules/datasource/github-tags/index.js +3 -1
  76. package/dist/modules/datasource/github-tags/index.js.map +1 -1
  77. package/dist/modules/datasource/gitlab-packages/index.js +6 -2
  78. package/dist/modules/datasource/gitlab-packages/index.js.map +1 -1
  79. package/dist/modules/datasource/gitlab-releases/index.js +3 -1
  80. package/dist/modules/datasource/gitlab-releases/index.js.map +1 -1
  81. package/dist/modules/datasource/gitlab-tags/index.js +3 -1
  82. package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
  83. package/dist/modules/datasource/glasskube-packages/index.js +6 -2
  84. package/dist/modules/datasource/glasskube-packages/index.js.map +1 -1
  85. package/dist/modules/datasource/go/base.js +1 -1
  86. package/dist/modules/datasource/go/base.js.map +1 -1
  87. package/dist/modules/datasource/go/index.js +3 -1
  88. package/dist/modules/datasource/go/index.js.map +1 -1
  89. package/dist/modules/datasource/golang-version/index.js +6 -2
  90. package/dist/modules/datasource/golang-version/index.js.map +1 -1
  91. package/dist/modules/datasource/gradle-version/index.js +3 -1
  92. package/dist/modules/datasource/gradle-version/index.js.map +1 -1
  93. package/dist/modules/datasource/hackage/index.js +6 -2
  94. package/dist/modules/datasource/hackage/index.js.map +1 -1
  95. package/dist/modules/datasource/helm/index.js +3 -1
  96. package/dist/modules/datasource/helm/index.js.map +1 -1
  97. package/dist/modules/datasource/hermit/index.js +6 -2
  98. package/dist/modules/datasource/hermit/index.js.map +1 -1
  99. package/dist/modules/datasource/hex/index.js +3 -1
  100. package/dist/modules/datasource/hex/index.js.map +1 -1
  101. package/dist/modules/datasource/hexpm-bob/index.js +6 -2
  102. package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
  103. package/dist/modules/datasource/index.js +12 -12
  104. package/dist/modules/datasource/index.js.map +1 -1
  105. package/dist/modules/datasource/java-version/common.js +62 -13
  106. package/dist/modules/datasource/java-version/common.js.map +1 -1
  107. package/dist/modules/datasource/java-version/graalvm.js +50 -0
  108. package/dist/modules/datasource/java-version/graalvm.js.map +1 -0
  109. package/dist/modules/datasource/java-version/index.js +13 -3
  110. package/dist/modules/datasource/java-version/index.js.map +1 -1
  111. package/dist/modules/datasource/java-version/schema.js +6 -1
  112. package/dist/modules/datasource/java-version/schema.js.map +1 -1
  113. package/dist/modules/datasource/jenkins-plugins/index.js +6 -2
  114. package/dist/modules/datasource/jenkins-plugins/index.js.map +1 -1
  115. package/dist/modules/datasource/jsr/index.js +6 -2
  116. package/dist/modules/datasource/jsr/index.js.map +1 -1
  117. package/dist/modules/datasource/maven/index.js +4 -2
  118. package/dist/modules/datasource/maven/index.js.map +1 -1
  119. package/dist/modules/datasource/node-version/index.js +3 -1
  120. package/dist/modules/datasource/node-version/index.js.map +1 -1
  121. package/dist/modules/datasource/npm/index.js +6 -2
  122. package/dist/modules/datasource/npm/index.js.map +1 -1
  123. package/dist/modules/datasource/nuget/index.js +3 -1
  124. package/dist/modules/datasource/nuget/index.js.map +1 -1
  125. package/dist/modules/datasource/orb/index.js +6 -2
  126. package/dist/modules/datasource/orb/index.js.map +1 -1
  127. package/dist/modules/datasource/packagist/index.js +3 -1
  128. package/dist/modules/datasource/packagist/index.js.map +1 -1
  129. package/dist/modules/datasource/pod/index.js +4 -2
  130. package/dist/modules/datasource/pod/index.js.map +1 -1
  131. package/dist/modules/datasource/puppet-forge/index.js +3 -1
  132. package/dist/modules/datasource/puppet-forge/index.js.map +1 -1
  133. package/dist/modules/datasource/pypi/index.js +6 -2
  134. package/dist/modules/datasource/pypi/index.js.map +1 -1
  135. package/dist/modules/datasource/python-version/index.js +6 -2
  136. package/dist/modules/datasource/python-version/index.js.map +1 -1
  137. package/dist/modules/datasource/repology/index.js +3 -1
  138. package/dist/modules/datasource/repology/index.js.map +1 -1
  139. package/dist/modules/datasource/rpm/index.js +3 -1
  140. package/dist/modules/datasource/rpm/index.js.map +1 -1
  141. package/dist/modules/datasource/ruby-version/index.js +6 -2
  142. package/dist/modules/datasource/ruby-version/index.js.map +1 -1
  143. package/dist/modules/datasource/rubygems/index.js +3 -1
  144. package/dist/modules/datasource/rubygems/index.js.map +1 -1
  145. package/dist/modules/datasource/rust-version/index.js +6 -2
  146. package/dist/modules/datasource/rust-version/index.js.map +1 -1
  147. package/dist/modules/datasource/sbt-package/index.js +3 -1
  148. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  149. package/dist/modules/datasource/sbt-plugin/index.js +3 -1
  150. package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
  151. package/dist/modules/datasource/terraform-module/index.js +3 -1
  152. package/dist/modules/datasource/terraform-module/index.js.map +1 -1
  153. package/dist/modules/datasource/terraform-provider/index.js +6 -1
  154. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  155. package/dist/modules/datasource/types.d.ts +4 -5
  156. package/dist/modules/datasource/typst/index.js +7 -3
  157. package/dist/modules/datasource/typst/index.js.map +1 -1
  158. package/dist/modules/datasource/unity3d/index.js +3 -1
  159. package/dist/modules/datasource/unity3d/index.js.map +1 -1
  160. package/dist/modules/datasource/unity3d-packages/index.js +3 -1
  161. package/dist/modules/datasource/unity3d-packages/index.js.map +1 -1
  162. package/dist/modules/manager/fingerprint.generated.js +2 -2
  163. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  164. package/dist/modules/manager/mise/upgradeable-tooling.js +2 -2
  165. package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
  166. package/dist/modules/manager/terraform/util.js +1 -1
  167. package/dist/modules/manager/terraform/util.js.map +1 -1
  168. package/package.json +3 -3
  169. package/renovate-schema.json +2 -2
@@ -51,9 +51,13 @@ var ApkDatasource = class ApkDatasource extends Datasource {
51
51
  * - branch: latest-stable, v3.19, edge or any other Alpine branch
52
52
  * - components: comma separated list of components, e.g. main,community,testing
53
53
  */
54
- defaultRegistryUrls = ["https://dl-cdn.alpinelinux.org/alpine?branch=latest-stable&components=main&arch=x86_64"];
54
+ getDefaultRegistryUrls(_packageName) {
55
+ return ["https://dl-cdn.alpinelinux.org/alpine?branch=latest-stable&components=main&arch=x86_64"];
56
+ }
55
57
  defaultConfig = defaultConfig;
56
- customRegistrySupport = true;
58
+ supportsCustomRegistry(_packageName) {
59
+ return true;
60
+ }
57
61
  registryStrategy = "merge";
58
62
  releaseTimestampSupport = true;
59
63
  releaseTimestampNote = "The release timestamp is determined from the `buildDate` field in the results.";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["fs.ensureCacheDir","fs.createCacheWriteStream","fs.pipeline","tarExtract","fs.cachePathExists","HttpError","fs.rmCache"],"sources":["../../../../lib/modules/datasource/apk/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { isNonEmptyObject } from '@sindresorhus/is';\nimport { extract as tarExtract } from 'tar';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as apkVersioning } from '../../versioning/apk/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { parseApkIndexFile } from './parser.ts';\nimport type { ApkPackage } from './types.ts';\nimport { constructComponentUrls } from './url.ts';\n\nexport const apkDatasourceId = 'apk';\n\nconst defaultConfig = {\n commitMessageTopic: '{{{depName}}} APK package',\n commitMessageExtra:\n 'to {{#if isMajor}}{{{prettyNewMajor}}}{{else}}{{{prettyNewVersion}}}{{/if}}',\n};\n\n/**\n * Groups packages by name so that a lookup does not scan the whole index.\n *\n * An index holds thousands of packages, and a name can appear more than once\n * when the component serves multiple versions of it.\n */\nfunction groupPackagesByName(\n packages: ApkPackage[],\n): Record<string, ApkPackage[]> {\n const packagesByName: Record<string, ApkPackage[]> = {};\n\n for (const pkg of packages) {\n packagesByName[pkg.name] ??= [];\n packagesByName[pkg.name].push(pkg);\n }\n\n return packagesByName;\n}\n\nexport class ApkDatasource extends Datasource {\n static readonly id = apkDatasourceId;\n\n override readonly defaultVersioning = apkVersioning;\n\n /**\n * Alpine APK repositories are laid out as\n * `{base}/{branch}/{component}/{arch}/APKINDEX.tar.gz`, and `/etc/apk/repositories`\n * holds one entry per component.\n *\n * For Renovate, the path segments are encoded as query parameters so that a single\n * registry URL can cover multiple components.\n *\n * The following query parameter is required:\n * - arch: e.g. x86_64, aarch64, armv7\n *\n * The following query parameters are optional, as repositories such as Wolfi serve\n * their index directly below the repository root:\n * - branch: latest-stable, v3.19, edge or any other Alpine branch\n * - components: comma separated list of components, e.g. main,community,testing\n */\n override readonly defaultRegistryUrls = [\n 'https://dl-cdn.alpinelinux.org/alpine?branch=latest-stable&components=main&arch=x86_64',\n ];\n\n override readonly defaultConfig = defaultConfig;\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildDate` field in the results.';\n\n constructor() {\n super(ApkDatasource.id);\n }\n\n /**\n * Gets all available packages from a single APK component, keyed by package name\n */\n private async _getPackages(\n componentUrl: string,\n ): Promise<Record<string, ApkPackage[]>> {\n logger.debug(`Fetching APK packages from ${componentUrl}`);\n\n const extractId = randomUUID();\n const cacheDir = await fs.ensureCacheDir(upath.join('apk', extractId));\n const tarFile = upath.join(cacheDir, 'APKINDEX.tar.gz');\n const extractedFile = upath.join(cacheDir, 'APKINDEX');\n\n try {\n const indexUrl = joinUrlParts(componentUrl, 'APKINDEX.tar.gz');\n logger.debug(`Attempting to download ${indexUrl}`);\n const readStream = this.http.stream(indexUrl);\n const writeStream = fs.createCacheWriteStream(tarFile);\n await fs.pipeline(readStream, writeStream);\n\n await tarExtract({\n file: tarFile,\n cwd: cacheDir,\n filter: (path) => upath.basename(path) === 'APKINDEX',\n });\n\n if (!(await fs.cachePathExists(extractedFile))) {\n logger.warn({ componentUrl }, 'APKINDEX file not found in tar archive');\n return {};\n }\n\n logger.debug('Successfully extracted APKINDEX content');\n\n let packages: ApkPackage[] = [];\n try {\n packages = await parseApkIndexFile(extractedFile);\n } catch (err) {\n logger.warn({ componentUrl, err }, 'Error parsing APK index file');\n return {};\n }\n\n logger.debug(\n { componentUrl, packageCount: packages.length },\n 'Successfully parsed APK index',\n );\n\n return groupPackagesByName(packages);\n } catch (err) {\n if (err instanceof HttpError) {\n const statusCode = err.response?.statusCode;\n if (statusCode === 429 || (statusCode && statusCode >= 500)) {\n throw new ExternalHostError(err);\n }\n // The caller logs the failure once for the component it was skipping\n throw err;\n }\n\n logger.warn(\n { componentUrl, err },\n 'Error extracting APK index from tar.gz',\n );\n return {};\n } finally {\n await fs.rmCache(cacheDir);\n }\n }\n\n private getPackages(\n componentUrl: string,\n ): Promise<Record<string, ApkPackage[]>> {\n return withCache(\n {\n namespace: `datasource-${ApkDatasource.id}`,\n key: componentUrl,\n ttlMinutes: 60,\n fallback: true,\n // Soft failures resolve to an empty index, which must not be cached as a valid one\n shouldCacheResult: isNonEmptyObject,\n },\n () => this._getPackages(componentUrl),\n );\n }\n\n /**\n * Gets releases for a specific package from APK repositories\n */\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore if -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n logger.debug(`Getting APK releases for ${packageName} from ${registryUrl}`);\n\n const componentUrls = constructComponentUrls(registryUrl);\n let result: ReleaseResult | null = null;\n // A package can be served by more than one component, so the same version\n // must not be reported twice\n const seenVersions = new Set<string>();\n\n for (const componentUrl of componentUrls) {\n try {\n const packages = await this.getPackages(componentUrl);\n const matchingPackages = packages[packageName];\n\n if (!matchingPackages) {\n logger.debug(\n { packageName, componentUrl },\n 'No matching packages found',\n );\n continue;\n }\n\n const releases: Release[] = [];\n for (const pkg of matchingPackages) {\n if (seenVersions.has(pkg.version)) {\n continue;\n }\n seenVersions.add(pkg.version);\n releases.push({\n version: pkg.version,\n releaseTimestamp: pkg.buildDate\n ? asTimestamp(pkg.buildDate * 1000)\n : undefined,\n });\n }\n\n logger.trace(\n {\n packageName,\n componentUrl,\n releaseCount: releases.length,\n releases,\n },\n 'Found APK releases',\n );\n\n result ??= { releases: [], registryUrl };\n result.homepage ??= matchingPackages.find((pkg) => pkg.url)?.url;\n result.releases.push(...releases);\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { packageName, componentUrl, err },\n 'Skipping APK component due to an error',\n );\n }\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["fs.ensureCacheDir","fs.createCacheWriteStream","fs.pipeline","tarExtract","fs.cachePathExists","HttpError","fs.rmCache"],"sources":["../../../../lib/modules/datasource/apk/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { isNonEmptyObject } from '@sindresorhus/is';\nimport { extract as tarExtract } from 'tar';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as fs from '../../../util/fs/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { id as apkVersioning } from '../../versioning/apk/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { parseApkIndexFile } from './parser.ts';\nimport type { ApkPackage } from './types.ts';\nimport { constructComponentUrls } from './url.ts';\n\nexport const apkDatasourceId = 'apk';\n\nconst defaultConfig = {\n commitMessageTopic: '{{{depName}}} APK package',\n commitMessageExtra:\n 'to {{#if isMajor}}{{{prettyNewMajor}}}{{else}}{{{prettyNewVersion}}}{{/if}}',\n};\n\n/**\n * Groups packages by name so that a lookup does not scan the whole index.\n *\n * An index holds thousands of packages, and a name can appear more than once\n * when the component serves multiple versions of it.\n */\nfunction groupPackagesByName(\n packages: ApkPackage[],\n): Record<string, ApkPackage[]> {\n const packagesByName: Record<string, ApkPackage[]> = {};\n\n for (const pkg of packages) {\n packagesByName[pkg.name] ??= [];\n packagesByName[pkg.name].push(pkg);\n }\n\n return packagesByName;\n}\n\nexport class ApkDatasource extends Datasource {\n static readonly id = apkDatasourceId;\n\n override readonly defaultVersioning = apkVersioning;\n\n /**\n * Alpine APK repositories are laid out as\n * `{base}/{branch}/{component}/{arch}/APKINDEX.tar.gz`, and `/etc/apk/repositories`\n * holds one entry per component.\n *\n * For Renovate, the path segments are encoded as query parameters so that a single\n * registry URL can cover multiple components.\n *\n * The following query parameter is required:\n * - arch: e.g. x86_64, aarch64, armv7\n *\n * The following query parameters are optional, as repositories such as Wolfi serve\n * their index directly below the repository root:\n * - branch: latest-stable, v3.19, edge or any other Alpine branch\n * - components: comma separated list of components, e.g. main,community,testing\n */\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [\n 'https://dl-cdn.alpinelinux.org/alpine?branch=latest-stable&components=main&arch=x86_64',\n ];\n }\n\n override readonly defaultConfig = defaultConfig;\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `buildDate` field in the results.';\n\n constructor() {\n super(ApkDatasource.id);\n }\n\n /**\n * Gets all available packages from a single APK component, keyed by package name\n */\n private async _getPackages(\n componentUrl: string,\n ): Promise<Record<string, ApkPackage[]>> {\n logger.debug(`Fetching APK packages from ${componentUrl}`);\n\n const extractId = randomUUID();\n const cacheDir = await fs.ensureCacheDir(upath.join('apk', extractId));\n const tarFile = upath.join(cacheDir, 'APKINDEX.tar.gz');\n const extractedFile = upath.join(cacheDir, 'APKINDEX');\n\n try {\n const indexUrl = joinUrlParts(componentUrl, 'APKINDEX.tar.gz');\n logger.debug(`Attempting to download ${indexUrl}`);\n const readStream = this.http.stream(indexUrl);\n const writeStream = fs.createCacheWriteStream(tarFile);\n await fs.pipeline(readStream, writeStream);\n\n await tarExtract({\n file: tarFile,\n cwd: cacheDir,\n filter: (path) => upath.basename(path) === 'APKINDEX',\n });\n\n if (!(await fs.cachePathExists(extractedFile))) {\n logger.warn({ componentUrl }, 'APKINDEX file not found in tar archive');\n return {};\n }\n\n logger.debug('Successfully extracted APKINDEX content');\n\n let packages: ApkPackage[] = [];\n try {\n packages = await parseApkIndexFile(extractedFile);\n } catch (err) {\n logger.warn({ componentUrl, err }, 'Error parsing APK index file');\n return {};\n }\n\n logger.debug(\n { componentUrl, packageCount: packages.length },\n 'Successfully parsed APK index',\n );\n\n return groupPackagesByName(packages);\n } catch (err) {\n if (err instanceof HttpError) {\n const statusCode = err.response?.statusCode;\n if (statusCode === 429 || (statusCode && statusCode >= 500)) {\n throw new ExternalHostError(err);\n }\n // The caller logs the failure once for the component it was skipping\n throw err;\n }\n\n logger.warn(\n { componentUrl, err },\n 'Error extracting APK index from tar.gz',\n );\n return {};\n } finally {\n await fs.rmCache(cacheDir);\n }\n }\n\n private getPackages(\n componentUrl: string,\n ): Promise<Record<string, ApkPackage[]>> {\n return withCache(\n {\n namespace: `datasource-${ApkDatasource.id}`,\n key: componentUrl,\n ttlMinutes: 60,\n fallback: true,\n // Soft failures resolve to an empty index, which must not be cached as a valid one\n shouldCacheResult: isNonEmptyObject,\n },\n () => this._getPackages(componentUrl),\n );\n }\n\n /**\n * Gets releases for a specific package from APK repositories\n */\n async getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore if -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n logger.debug(`Getting APK releases for ${packageName} from ${registryUrl}`);\n\n const componentUrls = constructComponentUrls(registryUrl);\n let result: ReleaseResult | null = null;\n // A package can be served by more than one component, so the same version\n // must not be reported twice\n const seenVersions = new Set<string>();\n\n for (const componentUrl of componentUrls) {\n try {\n const packages = await this.getPackages(componentUrl);\n const matchingPackages = packages[packageName];\n\n if (!matchingPackages) {\n logger.debug(\n { packageName, componentUrl },\n 'No matching packages found',\n );\n continue;\n }\n\n const releases: Release[] = [];\n for (const pkg of matchingPackages) {\n if (seenVersions.has(pkg.version)) {\n continue;\n }\n seenVersions.add(pkg.version);\n releases.push({\n version: pkg.version,\n releaseTimestamp: pkg.buildDate\n ? asTimestamp(pkg.buildDate * 1000)\n : undefined,\n });\n }\n\n logger.trace(\n {\n packageName,\n componentUrl,\n releaseCount: releases.length,\n releases,\n },\n 'Found APK releases',\n );\n\n result ??= { releases: [], registryUrl };\n result.homepage ??= matchingPackages.find((pkg) => pkg.url)?.url;\n result.releases.push(...releases);\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { packageName, componentUrl, err },\n 'Skipping APK component due to an error',\n );\n }\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
@@ -13,7 +13,9 @@ var ArtifactoryDatasource = class extends Datasource {
13
13
  constructor() {
14
14
  super(datasource);
15
15
  }
16
- customRegistrySupport = true;
16
+ supportsCustomRegistry(_packageName) {
17
+ return true;
18
+ }
17
19
  caching = true;
18
20
  registryStrategy = "merge";
19
21
  releaseTimestampSupport = true;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/artifactory/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { parse } from '../../../util/html.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { datasource } from './common.ts';\n\nexport class ArtifactoryDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the date-like text, next to the version hyperlink tag in the results.';\n\n private async fetchReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl) {\n logger.warn(\n { packageName },\n 'artifactory datasource requires custom registryUrl. Skipping datasource',\n );\n return null;\n }\n\n const url = joinUrlParts(registryUrl, packageName);\n\n const result: ReleaseResult = {\n releases: [],\n };\n try {\n const response = await this.http.getText(url);\n const body = parse(response.body, {\n blockTextElements: {\n script: true,\n noscript: true,\n style: true,\n },\n });\n const nodes = body.querySelectorAll('a');\n\n nodes\n .filter(\n // filter out hyperlink to navigate to parent folder\n (node) => node.innerHTML !== '../' && node.innerHTML !== '..',\n )\n .forEach(\n // extract version and published time for each node\n (node) => {\n const version: string = node.innerHTML.endsWith('/')\n ? node.innerHTML.slice(0, -1)\n : node.innerHTML;\n\n const releaseTimestamp = asTimestamp(\n node.nextSibling?.text?.trimStart()?.split(regEx(/\\s{2,}/))?.[0],\n );\n\n const thisRelease: Release = {\n version,\n releaseTimestamp,\n };\n\n result.releases.push(thisRelease);\n },\n );\n\n if (result.releases.length) {\n logger.trace(\n { registryUrl, packageName, versions: result.releases.length },\n 'artifactory: Found versions',\n );\n } else {\n logger.trace(\n { registryUrl, packageName },\n 'artifactory: No versions found',\n );\n }\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.warn(\n { registryUrl, packageName },\n 'artifactory: `Not Found` error',\n );\n return null;\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,wBAA0C;CAE1C,UAA4B;CAE5B,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,IAAI,CAAC,aAAa;GAChB,OAAO,KACL,EAAE,YAAY,GACd,yEACF;GACA,OAAO;EACT;EAEA,MAAM,MAAM,aAAa,aAAa,WAAW;EAEjD,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EACA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,GAAG;GAU5C,MATmB,SAAS,MAAM,EAChC,mBAAmB;IACjB,QAAQ;IACR,UAAU;IACV,OAAO;GACT,EACF,CACiB,CAAC,CAAC,iBAAiB,GAEhC,CAAC,CACF,QAEE,SAAS,KAAK,cAAc,SAAS,KAAK,cAAc,IAC3D,CAAC,CACA,SAEE,SAAS;IASR,MAAM,cAAuB;KAC3B,SATsB,KAAK,UAAU,SAAS,GAAG,IAC/C,KAAK,UAAU,MAAM,GAAG,EAAE,IAC1B,KAAK;KAQP,kBANuB,YACvB,KAAK,aAAa,MAAM,UAAU,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,EAK/C;IACjB;IAEA,OAAO,SAAS,KAAK,WAAW;GAClC,CACF;GAEF,IAAI,OAAO,SAAS,QAClB,OAAO,MACL;IAAE;IAAa;IAAa,UAAU,OAAO,SAAS;GAAO,GAC7D,6BACF;QAEA,OAAO,MACL;IAAE;IAAa;GAAY,GAC3B,gCACF;EAEJ,SAAS,KAAK;GACZ,IAAI,eAAeA,gBAAa,IAAI,UAAU,eAAe,KAAK;IAChE,OAAO,KACL;KAAE;KAAa;IAAY,GAC3B,gCACF;IACA,OAAO;GACT;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["HttpError"],"sources":["../../../../lib/modules/datasource/artifactory/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { parse } from '../../../util/html.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { datasource } from './common.ts';\n\nexport class ArtifactoryDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the date-like text, next to the version hyperlink tag in the results.';\n\n private async fetchReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl) {\n logger.warn(\n { packageName },\n 'artifactory datasource requires custom registryUrl. Skipping datasource',\n );\n return null;\n }\n\n const url = joinUrlParts(registryUrl, packageName);\n\n const result: ReleaseResult = {\n releases: [],\n };\n try {\n const response = await this.http.getText(url);\n const body = parse(response.body, {\n blockTextElements: {\n script: true,\n noscript: true,\n style: true,\n },\n });\n const nodes = body.querySelectorAll('a');\n\n nodes\n .filter(\n // filter out hyperlink to navigate to parent folder\n (node) => node.innerHTML !== '../' && node.innerHTML !== '..',\n )\n .forEach(\n // extract version and published time for each node\n (node) => {\n const version: string = node.innerHTML.endsWith('/')\n ? node.innerHTML.slice(0, -1)\n : node.innerHTML;\n\n const releaseTimestamp = asTimestamp(\n node.nextSibling?.text?.trimStart()?.split(regEx(/\\s{2,}/))?.[0],\n );\n\n const thisRelease: Release = {\n version,\n releaseTimestamp,\n };\n\n result.releases.push(thisRelease);\n },\n );\n\n if (result.releases.length) {\n logger.trace(\n { registryUrl, packageName, versions: result.releases.length },\n 'artifactory: Found versions',\n );\n } else {\n logger.trace(\n { registryUrl, packageName },\n 'artifactory: No versions found',\n );\n }\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode === 404) {\n logger.warn(\n { registryUrl, packageName },\n 'artifactory: `Not Found` error',\n );\n return null;\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,wBAAb,cAA2C,WAAW;CACpD,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,UAA4B;CAE5B,mBAAqC;CAErC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,IAAI,CAAC,aAAa;GAChB,OAAO,KACL,EAAE,YAAY,GACd,yEACF;GACA,OAAO;EACT;EAEA,MAAM,MAAM,aAAa,aAAa,WAAW;EAEjD,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EACA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,GAAG;GAU5C,MATmB,SAAS,MAAM,EAChC,mBAAmB;IACjB,QAAQ;IACR,UAAU;IACV,OAAO;GACT,EACF,CACiB,CAAC,CAAC,iBAAiB,GAEhC,CAAC,CACF,QAEE,SAAS,KAAK,cAAc,SAAS,KAAK,cAAc,IAC3D,CAAC,CACA,SAEE,SAAS;IASR,MAAM,cAAuB;KAC3B,SATsB,KAAK,UAAU,SAAS,GAAG,IAC/C,KAAK,UAAU,MAAM,GAAG,EAAE,IAC1B,KAAK;KAQP,kBANuB,YACvB,KAAK,aAAa,MAAM,UAAU,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,EAK/C;IACjB;IAEA,OAAO,SAAS,KAAK,WAAW;GAClC,CACF;GAEF,IAAI,OAAO,SAAS,QAClB,OAAO,MACL;IAAE;IAAa;IAAa,UAAU,OAAO,SAAS;GAAO,GAC7D,6BACF;QAEA,OAAO,MACL;IAAE;IAAa;GAAY,GAC3B,gCACF;EAEJ,SAAS,KAAK;GACZ,IAAI,eAAeA,gBAAa,IAAI,UAAU,eAAe,KAAK;IAChE,OAAO,KACL;KAAE;KAAa;IAAY,GAC3B,gCACF;IACA,OAAO;GACT;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -14,7 +14,9 @@ var AzurePipelinesTasksDatasource = class AzurePipelinesTasksDatasource extends
14
14
  constructor() {
15
15
  super(AzurePipelinesTasksDatasource.id);
16
16
  }
17
- customRegistrySupport = false;
17
+ supportsCustomRegistry(_packageName) {
18
+ return false;
19
+ }
18
20
  defaultVersioning = id;
19
21
  async getReleases({ packageName }) {
20
22
  const platform = GlobalConfig.get("platform");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["versioning","hostRules.find"],"sources":["../../../../lib/modules/datasource/azure-pipelines-tasks/index.ts"],"sourcesContent":["import type { TypeOf, ZodType } from 'zod/v4';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { id as versioning } from '../../versioning/loose/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport {\n AzurePipelinesFallbackTasks,\n AzurePipelinesJSON,\n AzurePipelinesTaskVersion,\n} from './schema.ts';\n\nconst TASKS_URL_BASE =\n 'https://raw.githubusercontent.com/renovatebot/azure-devops-marketplace/main';\nconst BUILT_IN_TASKS_URL = `${TASKS_URL_BASE}/azure-pipelines-builtin-tasks.json`;\nconst MARKETPLACE_TASKS_URL = `${TASKS_URL_BASE}/azure-pipelines-marketplace-tasks.json`;\nconst BUILT_IN_TASKS_CHANGELOG_URL =\n 'https://github.com/microsoft/azure-pipelines-tasks/releases';\n\nexport class AzurePipelinesTasksDatasource extends Datasource {\n static readonly id = 'azure-pipelines-tasks';\n\n constructor() {\n super(AzurePipelinesTasksDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultVersioning = versioning;\n\n async getReleases({\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const platform = GlobalConfig.get('platform');\n const endpoint = GlobalConfig.get('endpoint');\n const { token } = hostRules.find({\n hostType: AzurePipelinesTasksDatasource.id,\n url: endpoint,\n });\n\n if (platform === 'azure' && endpoint && token) {\n const auth = Buffer.from(`renovate:${token}`).toString('base64');\n const opts: HttpOptions = {\n headers: { authorization: `Basic ${auth}` },\n };\n const results = await this.getTasks(\n `${endpoint}/_apis/distributedtask/tasks/`,\n opts,\n AzurePipelinesJSON,\n );\n\n const result: ReleaseResult = { releases: [] };\n\n results.value\n .filter((task) => {\n const matchers = [\n task.id === packageName,\n task.name === packageName,\n task.contributionIdentifier !== null &&\n `${task.contributionIdentifier}.${task.id}` === packageName,\n task.contributionIdentifier !== null &&\n `${task.contributionIdentifier}.${task.name}` === packageName,\n ];\n return matchers.some((match) => match);\n })\n .sort(AzurePipelinesTasksDatasource.compareSemanticVersions('version'))\n .forEach((task) => {\n const release: Release = {\n version: `${task.version!.major}.${task.version!.minor}.${task.version!.patch}`,\n changelogContent: task.releaseNotes,\n isDeprecated: task.deprecated,\n };\n\n if (task.serverOwned) {\n release.changelogUrl = BUILT_IN_TASKS_CHANGELOG_URL;\n }\n\n result.releases.push(release);\n });\n\n return result;\n }\n const versions =\n (\n await this.getTasks(BUILT_IN_TASKS_URL, {}, AzurePipelinesFallbackTasks)\n )[packageName.toLowerCase()] ??\n (\n await this.getTasks(\n MARKETPLACE_TASKS_URL,\n {},\n AzurePipelinesFallbackTasks,\n )\n )[packageName.toLowerCase()];\n\n if (versions) {\n const releases = versions.map((version) => ({ version }));\n return { releases };\n }\n\n return null;\n }\n\n private async _getTasks<Schema extends ZodType>(\n url: string,\n opts: HttpOptions,\n schema: Schema,\n ): Promise<TypeOf<Schema>> {\n const { body } = await this.http.getJson(url, opts, schema);\n return body;\n }\n\n getTasks<Schema extends ZodType>(\n url: string,\n opts: HttpOptions,\n schema: Schema,\n ): Promise<TypeOf<Schema>> {\n return withCache(\n {\n namespace: `datasource-${AzurePipelinesTasksDatasource.id}`,\n key: url,\n ttlMinutes: 24 * 60,\n },\n () => this._getTasks(url, opts, schema),\n );\n }\n\n static compareSemanticVersions = (key: string) => (a: any, b: any) => {\n const a1Version = AzurePipelinesTaskVersion.safeParse(a[key]).data;\n const b1Version = AzurePipelinesTaskVersion.safeParse(b[key]).data;\n\n const a1 =\n a1Version === undefined\n ? ''\n : `${a1Version.major}.${a1Version.minor}.${a1Version.patch}`;\n const b1 =\n b1Version === undefined\n ? ''\n : `${b1Version.major}.${b1Version.minor}.${b1Version.patch}`;\n\n const len = Math.min(a1.length, b1.length);\n\n for (let i = 0; i < len; i++) {\n const a2 = +a1[i] || 0;\n const b2 = +b1[i] || 0;\n\n if (a2 !== b2) {\n return a2 > b2 ? 1 : -1;\n }\n }\n\n return b1.length - a1.length;\n };\n}\n"],"mappings":";;;;;;;AAcA,MAAM,iBACJ;AACF,MAAM,qBAAqB,GAAG,eAAe;AAC7C,MAAM,wBAAwB,GAAG,eAAe;AAChD,MAAM,+BACJ;AAEF,IAAa,gCAAb,MAAa,sCAAsC,WAAW;CAC5D,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,8BAA8B,EAAE;CACxC;CAEA,wBAA0C;CAE1C,oBAAsCA;CAEtC,MAAM,YAAY,EAChB,eACmD;EACnD,MAAM,WAAW,aAAa,IAAI,UAAU;EAC5C,MAAM,WAAW,aAAa,IAAI,UAAU;EAC5C,MAAM,EAAE,UAAUC,KAAe;GAC/B,UAAU,8BAA8B;GACxC,KAAK;EACP,CAAC;EAED,IAAI,aAAa,WAAW,YAAY,OAAO;GAE7C,MAAM,OAAoB,EACxB,SAAS,EAAE,eAAe,SAFf,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,SAAS,QAEf,IAAI,EAC5C;GACA,MAAM,UAAU,MAAM,KAAK,SACzB,GAAG,SAAS,gCACZ,MACA,kBACF;GAEA,MAAM,SAAwB,EAAE,UAAU,CAAC,EAAE;GAE7C,QAAQ,MACL,QAAQ,SAAS;IAShB,OAAO;KAPL,KAAK,OAAO;KACZ,KAAK,SAAS;KACd,KAAK,2BAA2B,QAC9B,GAAG,KAAK,uBAAuB,GAAG,KAAK,SAAS;KAClD,KAAK,2BAA2B,QAC9B,GAAG,KAAK,uBAAuB,GAAG,KAAK,WAAW;IAExC,CAAC,CAAC,MAAM,UAAU,KAAK;GACvC,CAAC,CAAC,CACD,KAAK,8BAA8B,wBAAwB,SAAS,CAAC,CAAC,CACtE,SAAS,SAAS;IACjB,MAAM,UAAmB;KACvB,SAAS,GAAG,KAAK,QAAS,MAAM,GAAG,KAAK,QAAS,MAAM,GAAG,KAAK,QAAS;KACxE,kBAAkB,KAAK;KACvB,cAAc,KAAK;IACrB;IAEA,IAAI,KAAK,aACP,QAAQ,eAAe;IAGzB,OAAO,SAAS,KAAK,OAAO;GAC9B,CAAC;GAEH,OAAO;EACT;EACA,MAAM,YAEF,MAAM,KAAK,SAAS,oBAAoB,CAAC,GAAG,2BAA2B,EAAA,CACvE,YAAY,YAAY,OAExB,MAAM,KAAK,SACT,uBACA,CAAC,GACD,2BACF,EAAA,CACA,YAAY,YAAY;EAE5B,IAAI,UAEF,OAAO,EAAE,UADQ,SAAS,KAAK,aAAa,EAAE,QAAQ,EACtC,EAAE;EAGpB,OAAO;CACT;CAEA,MAAc,UACZ,KACA,MACA,QACyB;EACzB,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,MAAM;EAC1D,OAAO;CACT;CAEA,SACE,KACA,MACA,QACyB;EACzB,OAAO,UACL;GACE,WAAW,cAAc,8BAA8B;GACvD,KAAK;GACL,YAAY;EACd,SACM,KAAK,UAAU,KAAK,MAAM,MAAM,CACxC;CACF;CAEA,OAAO,2BAA2B,SAAiB,GAAQ,MAAW;EACpE,MAAM,YAAY,0BAA0B,UAAU,EAAE,IAAI,CAAC,CAAC;EAC9D,MAAM,YAAY,0BAA0B,UAAU,EAAE,IAAI,CAAC,CAAC;EAE9D,MAAM,KACJ,cAAc,KAAA,IACV,KACA,GAAG,UAAU,MAAM,GAAG,UAAU,MAAM,GAAG,UAAU;EACzD,MAAM,KACJ,cAAc,KAAA,IACV,KACA,GAAG,UAAU,MAAM,GAAG,UAAU,MAAM,GAAG,UAAU;EAEzD,MAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM;EAEzC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;GAC5B,MAAM,KAAK,CAAC,GAAG,MAAM;GACrB,MAAM,KAAK,CAAC,GAAG,MAAM;GAErB,IAAI,OAAO,IACT,OAAO,KAAK,KAAK,IAAI;EAEzB;EAEA,OAAO,GAAG,SAAS,GAAG;CACxB;AACF"}
1
+ {"version":3,"file":"index.js","names":["versioning","hostRules.find"],"sources":["../../../../lib/modules/datasource/azure-pipelines-tasks/index.ts"],"sourcesContent":["import type { TypeOf, ZodType } from 'zod/v4';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { id as versioning } from '../../versioning/loose/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport {\n AzurePipelinesFallbackTasks,\n AzurePipelinesJSON,\n AzurePipelinesTaskVersion,\n} from './schema.ts';\n\nconst TASKS_URL_BASE =\n 'https://raw.githubusercontent.com/renovatebot/azure-devops-marketplace/main';\nconst BUILT_IN_TASKS_URL = `${TASKS_URL_BASE}/azure-pipelines-builtin-tasks.json`;\nconst MARKETPLACE_TASKS_URL = `${TASKS_URL_BASE}/azure-pipelines-marketplace-tasks.json`;\nconst BUILT_IN_TASKS_CHANGELOG_URL =\n 'https://github.com/microsoft/azure-pipelines-tasks/releases';\n\nexport class AzurePipelinesTasksDatasource extends Datasource {\n static readonly id = 'azure-pipelines-tasks';\n\n constructor() {\n super(AzurePipelinesTasksDatasource.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n override readonly defaultVersioning = versioning;\n\n async getReleases({\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const platform = GlobalConfig.get('platform');\n const endpoint = GlobalConfig.get('endpoint');\n const { token } = hostRules.find({\n hostType: AzurePipelinesTasksDatasource.id,\n url: endpoint,\n });\n\n if (platform === 'azure' && endpoint && token) {\n const auth = Buffer.from(`renovate:${token}`).toString('base64');\n const opts: HttpOptions = {\n headers: { authorization: `Basic ${auth}` },\n };\n const results = await this.getTasks(\n `${endpoint}/_apis/distributedtask/tasks/`,\n opts,\n AzurePipelinesJSON,\n );\n\n const result: ReleaseResult = { releases: [] };\n\n results.value\n .filter((task) => {\n const matchers = [\n task.id === packageName,\n task.name === packageName,\n task.contributionIdentifier !== null &&\n `${task.contributionIdentifier}.${task.id}` === packageName,\n task.contributionIdentifier !== null &&\n `${task.contributionIdentifier}.${task.name}` === packageName,\n ];\n return matchers.some((match) => match);\n })\n .sort(AzurePipelinesTasksDatasource.compareSemanticVersions('version'))\n .forEach((task) => {\n const release: Release = {\n version: `${task.version!.major}.${task.version!.minor}.${task.version!.patch}`,\n changelogContent: task.releaseNotes,\n isDeprecated: task.deprecated,\n };\n\n if (task.serverOwned) {\n release.changelogUrl = BUILT_IN_TASKS_CHANGELOG_URL;\n }\n\n result.releases.push(release);\n });\n\n return result;\n }\n const versions =\n (\n await this.getTasks(BUILT_IN_TASKS_URL, {}, AzurePipelinesFallbackTasks)\n )[packageName.toLowerCase()] ??\n (\n await this.getTasks(\n MARKETPLACE_TASKS_URL,\n {},\n AzurePipelinesFallbackTasks,\n )\n )[packageName.toLowerCase()];\n\n if (versions) {\n const releases = versions.map((version) => ({ version }));\n return { releases };\n }\n\n return null;\n }\n\n private async _getTasks<Schema extends ZodType>(\n url: string,\n opts: HttpOptions,\n schema: Schema,\n ): Promise<TypeOf<Schema>> {\n const { body } = await this.http.getJson(url, opts, schema);\n return body;\n }\n\n getTasks<Schema extends ZodType>(\n url: string,\n opts: HttpOptions,\n schema: Schema,\n ): Promise<TypeOf<Schema>> {\n return withCache(\n {\n namespace: `datasource-${AzurePipelinesTasksDatasource.id}`,\n key: url,\n ttlMinutes: 24 * 60,\n },\n () => this._getTasks(url, opts, schema),\n );\n }\n\n static compareSemanticVersions = (key: string) => (a: any, b: any) => {\n const a1Version = AzurePipelinesTaskVersion.safeParse(a[key]).data;\n const b1Version = AzurePipelinesTaskVersion.safeParse(b[key]).data;\n\n const a1 =\n a1Version === undefined\n ? ''\n : `${a1Version.major}.${a1Version.minor}.${a1Version.patch}`;\n const b1 =\n b1Version === undefined\n ? ''\n : `${b1Version.major}.${b1Version.minor}.${b1Version.patch}`;\n\n const len = Math.min(a1.length, b1.length);\n\n for (let i = 0; i < len; i++) {\n const a2 = +a1[i] || 0;\n const b2 = +b1[i] || 0;\n\n if (a2 !== b2) {\n return a2 > b2 ? 1 : -1;\n }\n }\n\n return b1.length - a1.length;\n };\n}\n"],"mappings":"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"}
@@ -13,9 +13,13 @@ import { isTruthy } from "@sindresorhus/is";
13
13
  var BazelDatasource = class BazelDatasource extends Datasource {
14
14
  static id = "bazel";
15
15
  static bazelCentralRepoUrl = "https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main";
16
- defaultRegistryUrls = [BazelDatasource.bazelCentralRepoUrl];
16
+ getDefaultRegistryUrls(_packageName) {
17
+ return [BazelDatasource.bazelCentralRepoUrl];
18
+ }
17
19
  registryStrategy = "hunt";
18
- customRegistrySupport = true;
20
+ supportsCustomRegistry(_packageName) {
21
+ return true;
22
+ }
19
23
  caching = true;
20
24
  defaultVersioning = id;
21
25
  static packageMetadataPath(packageName) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["bazelVersioningId","HttpError"],"sources":["../../../../lib/modules/datasource/bazel/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { isValidLocalPath, readLocalFile } from '../../../util/fs/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { Json } from '../../../util/schema-utils/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { BzlmodVersion } from '../../versioning/bazel-module/bzlmod-version.ts';\nimport { id as bazelVersioningId } from '../../versioning/bazel-module/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BazelModuleMetadata } from './schema.ts';\n\nexport class BazelDatasource extends Datasource {\n static readonly id = 'bazel';\n\n static readonly bazelCentralRepoUrl =\n 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main';\n\n override readonly defaultRegistryUrls = [BazelDatasource.bazelCentralRepoUrl];\n override readonly registryStrategy = 'hunt';\n override readonly customRegistrySupport = true;\n override readonly caching = true;\n override readonly defaultVersioning = bazelVersioningId;\n\n static packageMetadataPath(packageName: string): string {\n return `/modules/${packageName}/metadata.json`;\n }\n\n constructor() {\n super(BazelDatasource.id);\n }\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const path = BazelDatasource.packageMetadataPath(packageName);\n const url = joinUrlParts(registryUrl!, path);\n const result: ReleaseResult = { releases: [] };\n try {\n let metadata: BazelModuleMetadata;\n const FILE_PREFIX = 'file://';\n if (url.startsWith(FILE_PREFIX)) {\n const filePath = url.slice(FILE_PREFIX.length);\n if (!isValidLocalPath(filePath)) {\n return null;\n }\n const fileContent = await readLocalFile(filePath, 'utf8');\n if (!fileContent) {\n return null;\n }\n metadata = Json.pipe(BazelModuleMetadata).parse(fileContent);\n } else {\n const response = await this.http.getJson(url, BazelModuleMetadata);\n metadata = response.body;\n }\n\n result.releases = metadata.versions\n .map((v) => new BzlmodVersion(v))\n .sort(BzlmodVersion.defaultCompare)\n .map((bv) => {\n const release: Release = { version: bv.original };\n if (isTruthy(metadata.yanked_versions?.[bv.original])) {\n release.isDeprecated = true;\n }\n return release;\n });\n if (metadata.homepage) {\n result.homepage = metadata.homepage;\n }\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode === 404) {\n return null;\n }\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl!}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,OAAgB,sBACd;CAEF,sBAAwC,CAAC,gBAAgB,mBAAmB;CAC5E,mBAAqC;CACrC,wBAA0C;CAC1C,UAA4B;CAC5B,oBAAsCA;CAEtC,OAAO,oBAAoB,aAA6B;EACtD,OAAO,YAAY,YAAY;CACjC;CAEA,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,MAAM,OAAO,gBAAgB,oBAAoB,WAAW;EAC5D,MAAM,MAAM,aAAa,aAAc,IAAI;EAC3C,MAAM,SAAwB,EAAE,UAAU,CAAC,EAAE;EAC7C,IAAI;GACF,IAAI;GAEJ,IAAI,IAAI,WAAW,SAAW,GAAG;IAC/B,MAAM,WAAW,IAAI,MAAM,CAAkB;IAC7C,IAAI,CAAC,iBAAiB,QAAQ,GAC5B,OAAO;IAET,MAAM,cAAc,MAAM,cAAc,UAAU,MAAM;IACxD,IAAI,CAAC,aACH,OAAO;IAET,WAAW,KAAK,KAAK,mBAAmB,CAAC,CAAC,MAAM,WAAW;GAC7D,OAEE,YAAW,MADY,KAAK,KAAK,QAAQ,KAAK,mBAAmB,EAAA,CAC7C;GAGtB,OAAO,WAAW,SAAS,SACxB,KAAK,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAChC,KAAK,cAAc,cAAc,CAAC,CAClC,KAAK,OAAO;IACX,MAAM,UAAmB,EAAE,SAAS,GAAG,SAAS;IAChD,IAAI,SAAS,SAAS,kBAAkB,GAAG,SAAS,GAClD,QAAQ,eAAe;IAEzB,OAAO;GACT,CAAC;GACH,IAAI,SAAS,UACX,OAAO,WAAW,SAAS;EAE/B,SAAS,KAAK;GACZ,IAAI,eAAeC,cAAW;IAC5B,IAAI,IAAI,UAAU,eAAe,KAC/B,OAAO;IAET,MAAM,IAAI,kBAAkB,GAAG;GACjC;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAa,GAAG,OAAO;GACtC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["bazelVersioningId","HttpError"],"sources":["../../../../lib/modules/datasource/bazel/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { isValidLocalPath, readLocalFile } from '../../../util/fs/index.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { Json } from '../../../util/schema-utils/index.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { BzlmodVersion } from '../../versioning/bazel-module/bzlmod-version.ts';\nimport { id as bazelVersioningId } from '../../versioning/bazel-module/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BazelModuleMetadata } from './schema.ts';\n\nexport class BazelDatasource extends Datasource {\n static readonly id = 'bazel';\n\n static readonly bazelCentralRepoUrl =\n 'https://raw.githubusercontent.com/bazelbuild/bazel-central-registry/main';\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [BazelDatasource.bazelCentralRepoUrl];\n }\n override readonly registryStrategy = 'hunt';\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n override readonly caching = true;\n override readonly defaultVersioning = bazelVersioningId;\n\n static packageMetadataPath(packageName: string): string {\n return `/modules/${packageName}/metadata.json`;\n }\n\n constructor() {\n super(BazelDatasource.id);\n }\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const path = BazelDatasource.packageMetadataPath(packageName);\n const url = joinUrlParts(registryUrl!, path);\n const result: ReleaseResult = { releases: [] };\n try {\n let metadata: BazelModuleMetadata;\n const FILE_PREFIX = 'file://';\n if (url.startsWith(FILE_PREFIX)) {\n const filePath = url.slice(FILE_PREFIX.length);\n if (!isValidLocalPath(filePath)) {\n return null;\n }\n const fileContent = await readLocalFile(filePath, 'utf8');\n if (!fileContent) {\n return null;\n }\n metadata = Json.pipe(BazelModuleMetadata).parse(fileContent);\n } else {\n const response = await this.http.getJson(url, BazelModuleMetadata);\n metadata = response.body;\n }\n\n result.releases = metadata.versions\n .map((v) => new BzlmodVersion(v))\n .sort(BzlmodVersion.defaultCompare)\n .map((bv) => {\n const release: Release = { version: bv.original };\n if (isTruthy(metadata.yanked_versions?.[bv.original])) {\n release.isDeprecated = true;\n }\n return release;\n });\n if (metadata.homepage) {\n result.homepage = metadata.homepage;\n }\n } catch (err) {\n if (err instanceof HttpError) {\n if (err.response?.statusCode === 404) {\n return null;\n }\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl!}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,OAAgB,sBACd;CAEF,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,gBAAgB,mBAAmB;CAC7C;CACA,mBAAqC;CACrC,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CACA,UAA4B;CAC5B,oBAAsCA;CAEtC,OAAO,oBAAoB,aAA6B;EACtD,OAAO,YAAY,YAAY;CACjC;CAEA,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,MAAM,OAAO,gBAAgB,oBAAoB,WAAW;EAC5D,MAAM,MAAM,aAAa,aAAc,IAAI;EAC3C,MAAM,SAAwB,EAAE,UAAU,CAAC,EAAE;EAC7C,IAAI;GACF,IAAI;GAEJ,IAAI,IAAI,WAAW,SAAW,GAAG;IAC/B,MAAM,WAAW,IAAI,MAAM,CAAkB;IAC7C,IAAI,CAAC,iBAAiB,QAAQ,GAC5B,OAAO;IAET,MAAM,cAAc,MAAM,cAAc,UAAU,MAAM;IACxD,IAAI,CAAC,aACH,OAAO;IAET,WAAW,KAAK,KAAK,mBAAmB,CAAC,CAAC,MAAM,WAAW;GAC7D,OAEE,YAAW,MADY,KAAK,KAAK,QAAQ,KAAK,mBAAmB,EAAA,CAC7C;GAGtB,OAAO,WAAW,SAAS,SACxB,KAAK,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAChC,KAAK,cAAc,cAAc,CAAC,CAClC,KAAK,OAAO;IACX,MAAM,UAAmB,EAAE,SAAS,GAAG,SAAS;IAChD,IAAI,SAAS,SAAS,kBAAkB,GAAG,SAAS,GAClD,QAAQ,eAAe;IAEzB,OAAO;GACT,CAAC;GACH,IAAI,SAAS,UACX,OAAO,WAAW,SAAS;EAE/B,SAAS,KAAK;GACZ,IAAI,eAAeC,cAAW;IAC5B,IAAI,IAAI,UAAU,eAAe,KAC/B,OAAO;IAET,MAAM,IAAI,kBAAkB,GAAG;GACjC;GACA,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAa,GAAG,OAAO;GACtC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -14,7 +14,9 @@ var BitbucketTagsDatasource = class BitbucketTagsDatasource extends Datasource {
14
14
  constructor() {
15
15
  super(BitbucketTagsDatasource.id);
16
16
  }
17
- defaultRegistryUrls = BitbucketTagsDatasource.defaultRegistryUrls;
17
+ getDefaultRegistryUrls(_packageName) {
18
+ return BitbucketTagsDatasource.defaultRegistryUrls;
19
+ }
18
20
  releaseTimestampSupport = true;
19
21
  releaseTimestampNote = "The release timestamp is determined from the `date` field in the results.";
20
22
  sourceUrlSupport = "package";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/index.ts"],"sourcesContent":["import type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketHttp } from '../../../util/http/bitbucket.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { RepoInfo } from '../../platform/bitbucket/schema.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { BitbucketCommits, BitbucketTag, BitbucketTags } from './schema.ts';\n\nexport class BitbucketTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-tags';\n\n bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id);\n\n static readonly defaultRegistryUrls = ['https://bitbucket.org'];\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketTagsDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n BitbucketTagsDatasource.defaultRegistryUrls;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static getRegistryURL(registryUrl?: string): string {\n // fallback to default API endpoint if custom not provided\n return registryUrl ?? this.defaultRegistryUrls[0];\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketTagsDatasource.getRegistryURL(\n registryUrl,\n )}:${repo}:${type}`;\n }\n\n static getSourceUrl(packageName: string, registryUrl?: string): string {\n const url = BitbucketTagsDatasource.getRegistryURL(registryUrl);\n const normalizedUrl = ensureTrailingSlash(url);\n return `${normalizedUrl}${packageName}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = `/2.0/repositories/${repo}/refs/tags`;\n const bitbucketTags = (\n await this.bitbucketHttp.getJson(url, { paginate: true }, BitbucketTags)\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl),\n registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl),\n releases: bitbucketTags.map(({ name, target }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(target?.date),\n })),\n };\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetched the commit has for specified tag\n private async _getTagCommit(\n _registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n const url = `/2.0/repositories/${repo}/refs/tags/${tag}`;\n\n const bitbucketTag = (await this.bitbucketHttp.getJson(url, BitbucketTag))\n .body;\n\n return bitbucketTag.target?.hash ?? null;\n }\n\n getTagCommit(\n registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(registryUrl, repo, tag),\n );\n }\n\n private async _getMainBranch(\n _registryUrl: string,\n repo: string,\n ): Promise<string> {\n return (\n await this.bitbucketHttp.getJson(`/2.0/repositories/${repo}`, RepoInfo)\n ).body.mainbranch;\n }\n\n getMainBranch(registryUrl: string, repo: string): Promise<string> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n 'mainbranch',\n ),\n ttlMinutes: 60,\n },\n () => this._getMainBranch(registryUrl, repo),\n );\n }\n\n // getDigest fetched the latest commit for repository main branch\n // however, if newValue is provided, then getTagCommit is called\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (newValue?.length) {\n return this.getTagCommit(registryUrl, repo, newValue);\n }\n\n const mainBranch = await this.getMainBranch(\n BitbucketTagsDatasource.getRegistryURL(registryUrl),\n repo,\n );\n\n const url = `/2.0/repositories/${repo}/commits/${mainBranch}`;\n const bitbucketCommits = (\n await this.bitbucketHttp.getJson(url, BitbucketCommits)\n ).body;\n\n if (bitbucketCommits.length === 0) {\n return null;\n }\n\n return bitbucketCommits[0].hash;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,gBAAgB,IAAI,cAAc,wBAAwB,EAAE;CAE5D,OAAgB,sBAAsB,CAAC,uBAAuB;CAE9D,OAAgB,iBAAwC,cAAc,wBAAwB;CAE9F,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,sBACE,wBAAwB;CAE1B,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,OAAO,eAAe,aAA8B;EAElD,OAAO,eAAe,KAAK,oBAAoB;CACjD;CAEA,OAAO,YACL,aACA,MACA,MACQ;EACR,OAAO,GAAG,wBAAwB,eAChC,WACF,EAAE,GAAG,KAAK,GAAG;CACf;CAEA,OAAO,aAAa,aAAqB,aAA8B;EACrE,MAAM,MAAM,wBAAwB,eAAe,WAAW;EAE9D,OAAO,GADe,oBAAoB,GACpB,IAAI;CAC5B;CAGA,MAAc,aAAa,EACzB,aACA,aAAa,QACsC;EACnD,MAAM,MAAM,qBAAqB,KAAK;EACtC,MAAM,iBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,EAAE,UAAU,KAAK,GAAG,aAAa,EAAA,CACvE;EAYF,OAAO;GATL,WAAW,wBAAwB,aAAa,MAAM,WAAW;GACjE,aAAa,wBAAwB,eAAe,WAAW;GAC/D,UAAU,cAAc,KAAK,EAAE,MAAM,cAAc;IACjD,SAAS;IACT,QAAQ;IACR,kBAAkB,YAAY,QAAQ,IAAI;GAC5C,EAAE;EAGY;CAClB;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,MACF;GACA,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAGA,MAAc,cACZ,cACA,MACA,KACwB;EACxB,MAAM,MAAM,qBAAqB,KAAK,aAAa;EAKnD,QAHsB,MAAM,KAAK,cAAc,QAAQ,KAAK,YAAY,EAAA,CACrE,KAEiB,QAAQ,QAAQ;CACtC;CAEA,aACE,aACA,MACA,KACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,OAAO,KACT;EACF,SACM,KAAK,cAAc,aAAa,MAAM,GAAG,CACjD;CACF;CAEA,MAAc,eACZ,cACA,MACiB;EACjB,QACE,MAAM,KAAK,cAAc,QAAQ,qBAAqB,QAAQ,QAAQ,EAAA,CACtE,KAAK;CACT;CAEA,cAAc,aAAqB,MAA+B;EAChE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,YACF;GACA,YAAY;EACd,SACM,KAAK,eAAe,aAAa,IAAI,CAC7C;CACF;CAIA,MAAc,WACZ,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,IAAI,UAAU,QACZ,OAAO,KAAK,aAAa,aAAa,MAAM,QAAQ;EAQtD,MAAM,MAAM,qBAAqB,KAAK,WAAW,MALxB,KAAK,cAC5B,wBAAwB,eAAe,WAAW,GAClD,IACF;EAGA,MAAM,oBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,gBAAgB,EAAA,CACtD;EAEF,IAAI,iBAAiB,WAAW,GAC9B,OAAO;EAGT,OAAO,iBAAiB,EAAE,CAAC;CAC7B;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,QACF;GACA,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/bitbucket-tags/index.ts"],"sourcesContent":["import type { PackageCacheNamespace } from '../../../util/cache/package/types.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { BitbucketHttp } from '../../../util/http/bitbucket.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { RepoInfo } from '../../platform/bitbucket/schema.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n ReleaseResult,\n} from '../types.ts';\nimport { BitbucketCommits, BitbucketTag, BitbucketTags } from './schema.ts';\n\nexport class BitbucketTagsDatasource extends Datasource {\n static readonly id = 'bitbucket-tags';\n\n bitbucketHttp = new BitbucketHttp(BitbucketTagsDatasource.id);\n\n static readonly defaultRegistryUrls = ['https://bitbucket.org'];\n\n static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketTagsDatasource.id}`;\n\n constructor() {\n super(BitbucketTagsDatasource.id);\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return BitbucketTagsDatasource.defaultRegistryUrls;\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined by using the `packageName` and `registryUrl`.';\n\n static getRegistryURL(registryUrl?: string): string {\n // fallback to default API endpoint if custom not provided\n return registryUrl ?? this.defaultRegistryUrls[0];\n }\n\n static getCacheKey(\n registryUrl: string | undefined,\n repo: string,\n type: string,\n ): string {\n return `${BitbucketTagsDatasource.getRegistryURL(\n registryUrl,\n )}:${repo}:${type}`;\n }\n\n static getSourceUrl(packageName: string, registryUrl?: string): string {\n const url = BitbucketTagsDatasource.getRegistryURL(registryUrl);\n const normalizedUrl = ensureTrailingSlash(url);\n return `${normalizedUrl}${packageName}`;\n }\n\n // getReleases fetches list of tags for the repository\n private async _getReleases({\n registryUrl,\n packageName: repo,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = `/2.0/repositories/${repo}/refs/tags`;\n const bitbucketTags = (\n await this.bitbucketHttp.getJson(url, { paginate: true }, BitbucketTags)\n ).body;\n\n const dependency: ReleaseResult = {\n sourceUrl: BitbucketTagsDatasource.getSourceUrl(repo, registryUrl),\n registryUrl: BitbucketTagsDatasource.getRegistryURL(registryUrl),\n releases: bitbucketTags.map(({ name, target }) => ({\n version: name,\n gitRef: name,\n releaseTimestamp: asTimestamp(target?.date),\n })),\n };\n\n return dependency;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'tags',\n ),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n // getTagCommit fetched the commit has for specified tag\n private async _getTagCommit(\n _registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n const url = `/2.0/repositories/${repo}/refs/tags/${tag}`;\n\n const bitbucketTag = (await this.bitbucketHttp.getJson(url, BitbucketTag))\n .body;\n\n return bitbucketTag.target?.hash ?? null;\n }\n\n getTagCommit(\n registryUrl: string | undefined,\n repo: string,\n tag: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n `tag-${tag}`,\n ),\n },\n () => this._getTagCommit(registryUrl, repo, tag),\n );\n }\n\n private async _getMainBranch(\n _registryUrl: string,\n repo: string,\n ): Promise<string> {\n return (\n await this.bitbucketHttp.getJson(`/2.0/repositories/${repo}`, RepoInfo)\n ).body.mainbranch;\n }\n\n getMainBranch(registryUrl: string, repo: string): Promise<string> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n registryUrl,\n repo,\n 'mainbranch',\n ),\n ttlMinutes: 60,\n },\n () => this._getMainBranch(registryUrl, repo),\n );\n }\n\n // getDigest fetched the latest commit for repository main branch\n // however, if newValue is provided, then getTagCommit is called\n private async _getDigest(\n { packageName: repo, registryUrl }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (newValue?.length) {\n return this.getTagCommit(registryUrl, repo, newValue);\n }\n\n const mainBranch = await this.getMainBranch(\n BitbucketTagsDatasource.getRegistryURL(registryUrl),\n repo,\n );\n\n const url = `/2.0/repositories/${repo}/commits/${mainBranch}`;\n const bitbucketCommits = (\n await this.bitbucketHttp.getJson(url, BitbucketCommits)\n ).body;\n\n if (bitbucketCommits.length === 0) {\n return null;\n }\n\n return bitbucketCommits[0].hash;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: BitbucketTagsDatasource.cacheNamespace,\n key: BitbucketTagsDatasource.getCacheKey(\n config.registryUrl,\n config.packageName,\n 'digest',\n ),\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,0BAAb,MAAa,gCAAgC,WAAW;CACtD,OAAgB,KAAK;CAErB,gBAAgB,IAAI,cAAc,wBAAwB,EAAE;CAE5D,OAAgB,sBAAsB,CAAC,uBAAuB;CAE9D,OAAgB,iBAAwC,cAAc,wBAAwB;CAE9F,cAAc;EACZ,MAAM,wBAAwB,EAAE;CAClC;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,wBAAwB;CACjC;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,OAAO,eAAe,aAA8B;EAElD,OAAO,eAAe,KAAK,oBAAoB;CACjD;CAEA,OAAO,YACL,aACA,MACA,MACQ;EACR,OAAO,GAAG,wBAAwB,eAChC,WACF,EAAE,GAAG,KAAK,GAAG;CACf;CAEA,OAAO,aAAa,aAAqB,aAA8B;EACrE,MAAM,MAAM,wBAAwB,eAAe,WAAW;EAE9D,OAAO,GADe,oBAAoB,GACpB,IAAI;CAC5B;CAGA,MAAc,aAAa,EACzB,aACA,aAAa,QACsC;EACnD,MAAM,MAAM,qBAAqB,KAAK;EACtC,MAAM,iBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,EAAE,UAAU,KAAK,GAAG,aAAa,EAAA,CACvE;EAYF,OAAO;GATL,WAAW,wBAAwB,aAAa,MAAM,WAAW;GACjE,aAAa,wBAAwB,eAAe,WAAW;GAC/D,UAAU,cAAc,KAAK,EAAE,MAAM,cAAc;IACjD,SAAS;IACT,QAAQ;IACR,kBAAkB,YAAY,QAAQ,IAAI;GAC5C,EAAE;EAGY;CAClB;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,MACF;GACA,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAGA,MAAc,cACZ,cACA,MACA,KACwB;EACxB,MAAM,MAAM,qBAAqB,KAAK,aAAa;EAKnD,QAHsB,MAAM,KAAK,cAAc,QAAQ,KAAK,YAAY,EAAA,CACrE,KAEiB,QAAQ,QAAQ;CACtC;CAEA,aACE,aACA,MACA,KACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,OAAO,KACT;EACF,SACM,KAAK,cAAc,aAAa,MAAM,GAAG,CACjD;CACF;CAEA,MAAc,eACZ,cACA,MACiB;EACjB,QACE,MAAM,KAAK,cAAc,QAAQ,qBAAqB,QAAQ,QAAQ,EAAA,CACtE,KAAK;CACT;CAEA,cAAc,aAAqB,MAA+B;EAChE,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,aACA,MACA,YACF;GACA,YAAY;EACd,SACM,KAAK,eAAe,aAAa,IAAI,CAC7C;CACF;CAIA,MAAc,WACZ,EAAE,aAAa,MAAM,eACrB,UACwB;EACxB,IAAI,UAAU,QACZ,OAAO,KAAK,aAAa,aAAa,MAAM,QAAQ;EAQtD,MAAM,MAAM,qBAAqB,KAAK,WAAW,MALxB,KAAK,cAC5B,wBAAwB,eAAe,WAAW,GAClD,IACF;EAGA,MAAM,oBACJ,MAAM,KAAK,cAAc,QAAQ,KAAK,gBAAgB,EAAA,CACtD;EAEF,IAAI,iBAAiB,WAAW,GAC9B,OAAO;EAGT,OAAO,iBAAiB,EAAE,CAAC;CAC7B;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,wBAAwB;GACnC,KAAK,wBAAwB,YAC3B,OAAO,aACP,OAAO,aACP,QACF;GACA,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;AACF"}
@@ -17,8 +17,12 @@ var BitriseDatasource = class BitriseDatasource extends Datasource {
17
17
  super(BitriseDatasource.id);
18
18
  this.http = new GithubHttp(this.id);
19
19
  }
20
- customRegistrySupport = true;
21
- defaultRegistryUrls = ["https://github.com/bitrise-io/bitrise-steplib.git"];
20
+ supportsCustomRegistry(_packageName) {
21
+ return true;
22
+ }
23
+ getDefaultRegistryUrls(_packageName) {
24
+ return ["https://github.com/bitrise-io/bitrise-steplib.git"];
25
+ }
22
26
  releaseTimestampSupport = true;
23
27
  releaseTimestampNote = "The release timestamp is determined from the `published_at` field in the results.";
24
28
  sourceUrlSupport = "release";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["semver"],"sources":["../../../../lib/modules/datasource/bitrise/index.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { GithubContentResponse } from '../../platform/github/schema.ts';\nimport semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BitriseStepFile } from './schema.ts';\n\nexport class BitriseDatasource extends Datasource {\n static readonly id = 'bitrise';\n\n override readonly http: GithubHttp;\n\n constructor() {\n super(BitriseDatasource.id);\n\n this.http = new GithubHttp(this.id);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly defaultRegistryUrls = [\n 'https://github.com/bitrise-io/bitrise-steplib.git',\n ];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async fetchReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const parsedUrl = parseGitUrl(registryUrl);\n if (detectPlatform(registryUrl) !== 'github') {\n logger.once.warn(\n { source: parsedUrl.source },\n 'Unsupported Git hoster for this datasource',\n );\n return null;\n }\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n const massagedPackageName = encodeURIComponent(packageName);\n const baseApiURL =\n parsedUrl.resource === 'github.com'\n ? 'https://api.github.com'\n : `https://${parsedUrl.resource}/api/v3`;\n const packageUrl = joinUrlParts(\n baseApiURL,\n 'repos',\n parsedUrl.full_name,\n 'contents/steps',\n massagedPackageName,\n );\n\n const { body: packageRaw } = await this.http.getJson(\n packageUrl,\n GithubContentResponse,\n );\n\n if (!isArray(packageRaw)) {\n logger.warn(\n { data: packageRaw, url: packageUrl },\n 'Got unexpected response for Bitrise package location',\n );\n return null;\n }\n\n for (const versionDir of packageRaw.filter((element) =>\n semver.isValid(element.name),\n )) {\n const stepUrl = joinUrlParts(packageUrl, versionDir.name, 'step.yml');\n // TODO use getRawFile when ready #30155\n const { body } = await this.http.getJson(stepUrl, GithubContentResponse);\n if (!('content' in body)) {\n logger.warn(\n { data: body, url: stepUrl },\n 'Got unexpected response for Bitrise step location',\n );\n return null;\n }\n if (body.encoding !== 'base64') {\n logger.warn(\n { encoding: body.encoding, data: body, url: stepUrl },\n `Got unexpected encoding for Bitrise step location`,\n );\n return null;\n }\n\n const content = fromBase64(body.content);\n const { published_at, source_code_url } = BitriseStepFile.parse(content);\n\n result.releases.push({\n version: versionDir.name,\n releaseTimestamp: published_at,\n sourceUrl: source_code_url,\n });\n }\n\n // if we have no releases return null\n if (!result.releases.length) {\n return null;\n }\n\n return {\n ...result,\n homepage: `https://bitrise.io/integrations/steps/${packageName}`,\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl}/${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAa,oBAAb,MAAa,0BAA0B,WAAW;CAChD,OAAgB,KAAK;CAErB;CAEA,cAAc;EACZ,MAAM,kBAAkB,EAAE;EAE1B,KAAK,OAAO,IAAI,WAAW,KAAK,EAAE;CACpC;CAEA,wBAA0C;CAE1C,sBAAwC,CACtC,mDACF;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,YAAY,YAAY,WAAW;EACzC,IAAI,eAAe,WAAW,MAAM,UAAU;GAC5C,OAAO,KAAK,KACV,EAAE,QAAQ,UAAU,OAAO,GAC3B,4CACF;GACA,OAAO;EACT;EAEA,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,MAAM,sBAAsB,mBAAmB,WAAW;EAC1D,MAAM,aACJ,UAAU,aAAa,eACnB,2BACA,WAAW,UAAU,SAAS;EACpC,MAAM,aAAa,aACjB,YACA,SACA,UAAU,WACV,kBACA,mBACF;EAEA,MAAM,EAAE,MAAM,eAAe,MAAM,KAAK,KAAK,QAC3C,YACA,qBACF;EAEA,IAAI,CAAC,QAAQ,UAAU,GAAG;GACxB,OAAO,KACL;IAAE,MAAM;IAAY,KAAK;GAAW,GACpC,sDACF;GACA,OAAO;EACT;EAEA,KAAK,MAAM,cAAc,WAAW,QAAQ,YAC1CA,IAAO,QAAQ,QAAQ,IAAI,CAC7B,GAAG;GACD,MAAM,UAAU,aAAa,YAAY,WAAW,MAAM,UAAU;GAEpE,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,SAAS,qBAAqB;GACvE,IAAI,EAAE,aAAa,OAAO;IACxB,OAAO,KACL;KAAE,MAAM;KAAM,KAAK;IAAQ,GAC3B,mDACF;IACA,OAAO;GACT;GACA,IAAI,KAAK,aAAa,UAAU;IAC9B,OAAO,KACL;KAAE,UAAU,KAAK;KAAU,MAAM;KAAM,KAAK;IAAQ,GACpD,mDACF;IACA,OAAO;GACT;GAEA,MAAM,UAAU,WAAW,KAAK,OAAO;GACvC,MAAM,EAAE,cAAc,oBAAoB,gBAAgB,MAAM,OAAO;GAEvE,OAAO,SAAS,KAAK;IACnB,SAAS,WAAW;IACpB,kBAAkB;IAClB,WAAW;GACb,CAAC;EACH;EAGA,IAAI,CAAC,OAAO,SAAS,QACnB,OAAO;EAGT,OAAO;GACL,GAAG;GACH,UAAU,yCAAyC;EACrD;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["semver"],"sources":["../../../../lib/modules/datasource/bitrise/index.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { detectPlatform } from '../../../util/common.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { fromBase64 } from '../../../util/string.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { GithubContentResponse } from '../../platform/github/schema.ts';\nimport semver from '../../versioning/semver/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { BitriseStepFile } from './schema.ts';\n\nexport class BitriseDatasource extends Datasource {\n static readonly id = 'bitrise';\n\n override readonly http: GithubHttp;\n\n constructor() {\n super(BitriseDatasource.id);\n\n this.http = new GithubHttp(this.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://github.com/bitrise-io/bitrise-steplib.git'];\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async fetchReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n const parsedUrl = parseGitUrl(registryUrl);\n if (detectPlatform(registryUrl) !== 'github') {\n logger.once.warn(\n { source: parsedUrl.source },\n 'Unsupported Git hoster for this datasource',\n );\n return null;\n }\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n const massagedPackageName = encodeURIComponent(packageName);\n const baseApiURL =\n parsedUrl.resource === 'github.com'\n ? 'https://api.github.com'\n : `https://${parsedUrl.resource}/api/v3`;\n const packageUrl = joinUrlParts(\n baseApiURL,\n 'repos',\n parsedUrl.full_name,\n 'contents/steps',\n massagedPackageName,\n );\n\n const { body: packageRaw } = await this.http.getJson(\n packageUrl,\n GithubContentResponse,\n );\n\n if (!isArray(packageRaw)) {\n logger.warn(\n { data: packageRaw, url: packageUrl },\n 'Got unexpected response for Bitrise package location',\n );\n return null;\n }\n\n for (const versionDir of packageRaw.filter((element) =>\n semver.isValid(element.name),\n )) {\n const stepUrl = joinUrlParts(packageUrl, versionDir.name, 'step.yml');\n // TODO use getRawFile when ready #30155\n const { body } = await this.http.getJson(stepUrl, GithubContentResponse);\n if (!('content' in body)) {\n logger.warn(\n { data: body, url: stepUrl },\n 'Got unexpected response for Bitrise step location',\n );\n return null;\n }\n if (body.encoding !== 'base64') {\n logger.warn(\n { encoding: body.encoding, data: body, url: stepUrl },\n `Got unexpected encoding for Bitrise step location`,\n );\n return null;\n }\n\n const content = fromBase64(body.content);\n const { published_at, source_code_url } = BitriseStepFile.parse(content);\n\n result.releases.push({\n version: versionDir.name,\n releaseTimestamp: published_at,\n sourceUrl: source_code_url,\n });\n }\n\n // if we have no releases return null\n if (!result.releases.length) {\n return null;\n }\n\n return {\n ...result,\n homepage: `https://bitrise.io/integrations/steps/${packageName}`,\n };\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n key: `${config.registryUrl}/${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAa,oBAAb,MAAa,0BAA0B,WAAW;CAChD,OAAgB,KAAK;CAErB;CAEA,cAAc;EACZ,MAAM,kBAAkB,EAAE;EAE1B,KAAK,OAAO,IAAI,WAAW,KAAK,EAAE;CACpC;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,mDAAmD;CAC7D;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,MAAM,YAAY,YAAY,WAAW;EACzC,IAAI,eAAe,WAAW,MAAM,UAAU;GAC5C,OAAO,KAAK,KACV,EAAE,QAAQ,UAAU,OAAO,GAC3B,4CACF;GACA,OAAO;EACT;EAEA,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,MAAM,sBAAsB,mBAAmB,WAAW;EAC1D,MAAM,aACJ,UAAU,aAAa,eACnB,2BACA,WAAW,UAAU,SAAS;EACpC,MAAM,aAAa,aACjB,YACA,SACA,UAAU,WACV,kBACA,mBACF;EAEA,MAAM,EAAE,MAAM,eAAe,MAAM,KAAK,KAAK,QAC3C,YACA,qBACF;EAEA,IAAI,CAAC,QAAQ,UAAU,GAAG;GACxB,OAAO,KACL;IAAE,MAAM;IAAY,KAAK;GAAW,GACpC,sDACF;GACA,OAAO;EACT;EAEA,KAAK,MAAM,cAAc,WAAW,QAAQ,YAC1CA,IAAO,QAAQ,QAAQ,IAAI,CAC7B,GAAG;GACD,MAAM,UAAU,aAAa,YAAY,WAAW,MAAM,UAAU;GAEpE,MAAM,EAAE,SAAS,MAAM,KAAK,KAAK,QAAQ,SAAS,qBAAqB;GACvE,IAAI,EAAE,aAAa,OAAO;IACxB,OAAO,KACL;KAAE,MAAM;KAAM,KAAK;IAAQ,GAC3B,mDACF;IACA,OAAO;GACT;GACA,IAAI,KAAK,aAAa,UAAU;IAC9B,OAAO,KACL;KAAE,UAAU,KAAK;KAAU,MAAM;KAAM,KAAK;IAAQ,GACpD,mDACF;IACA,OAAO;GACT;GAEA,MAAM,UAAU,WAAW,KAAK,OAAO;GACvC,MAAM,EAAE,cAAc,oBAAoB,gBAAgB,MAAM,OAAO;GAEvE,OAAO,SAAS,KAAK;IACnB,SAAS,WAAW;IACpB,kBAAkB;IAClB,WAAW;GACb,CAAC;EACH;EAGA,IAAI,CAAC,OAAO,SAAS,QACnB,OAAO;EAGT,OAAO;GACL,GAAG;GACH,UAAU,yCAAyC;EACrD;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GACE,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -12,8 +12,12 @@ var BuildpacksRegistryDatasource = class BuildpacksRegistryDatasource extends Da
12
12
  constructor() {
13
13
  super(BuildpacksRegistryDatasource.id);
14
14
  }
15
- customRegistrySupport = false;
16
- defaultRegistryUrls = ["https://registry.buildpacks.io"];
15
+ supportsCustomRegistry(_packageName) {
16
+ return false;
17
+ }
18
+ getDefaultRegistryUrls(_packageName) {
19
+ return ["https://registry.buildpacks.io"];
20
+ }
17
21
  releaseTimestampSupport = true;
18
22
  releaseTimestampNote = "The release timestamp is determined from the `published_at` field in the results.";
19
23
  sourceUrlSupport = "release";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/buildpacks-registry/index.ts"],"sourcesContent":["import urlJoin from 'url-join';\nimport { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { Result } from '../../../util/result.ts';\nimport { Datasource } from '../datasource.ts';\nimport { ReleasesConfig } from '../schema.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BuildpacksRegistryResponse } from './schema.ts';\n\nexport class BuildpacksRegistryDatasource extends Datasource {\n static readonly id = 'buildpacks-registry';\n\n constructor() {\n super(BuildpacksRegistryDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://registry.buildpacks.io'];\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ packageName, registryUrl }) => {\n const url = urlJoin(\n registryUrl,\n 'api',\n 'v1',\n 'buildpacks',\n packageName,\n );\n\n return this.http.getJsonSafe(url, BuildpacksRegistryResponse);\n })\n .transform(({ versions, latest }): ReleaseResult => {\n const releases: Release[] = versions;\n\n const res: ReleaseResult = { releases };\n\n if (latest?.homepage) {\n res.homepage = latest.homepage;\n }\n\n return res;\n });\n\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'buildpacks: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BuildpacksRegistryDatasource.id}`,\n key: `${config.registryUrl}:${config.packageName}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;AAUA,IAAa,+BAAb,MAAa,qCAAqC,WAAW;CAC3D,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,6BAA6B,EAAE;CACvC;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,gCAAgC;CAEzE,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aACZ,QAC+B;EAyB/B,MAAM,EAAE,KAAK,QAAQ,MAxBN,OAAO,MAAM,QAAQ,cAAc,CAAC,CAChD,WAAW,EAAE,aAAa,kBAAkB;GAC3C,MAAM,MAAM,QACV,aACA,OACA,MACA,cACA,WACF;GAEA,OAAO,KAAK,KAAK,YAAY,KAAK,0BAA0B;EAC9D,CAAC,CAAC,CACD,WAAW,EAAE,UAAU,aAA4B;GAGlD,MAAM,MAAqB,EAAE,UAAA,SAAS;GAEtC,IAAI,QAAQ,UACV,IAAI,WAAW,OAAO;GAGxB,OAAO;EACT,CAE8B,CAAC,CAAC,OAAO;EAEzC,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,8BAA8B;GACpD,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,6BAA6B;GACtD,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/buildpacks-registry/index.ts"],"sourcesContent":["import urlJoin from 'url-join';\nimport { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { Result } from '../../../util/result.ts';\nimport { Datasource } from '../datasource.ts';\nimport { ReleasesConfig } from '../schema.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BuildpacksRegistryResponse } from './schema.ts';\n\nexport class BuildpacksRegistryDatasource extends Datasource {\n static readonly id = 'buildpacks-registry';\n\n constructor() {\n super(BuildpacksRegistryDatasource.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://registry.buildpacks.io'];\n }\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published_at` field in the results.';\n override readonly sourceUrlSupport = 'release';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `source_code_url` field of the release object in the results.';\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ packageName, registryUrl }) => {\n const url = urlJoin(\n registryUrl,\n 'api',\n 'v1',\n 'buildpacks',\n packageName,\n );\n\n return this.http.getJsonSafe(url, BuildpacksRegistryResponse);\n })\n .transform(({ versions, latest }): ReleaseResult => {\n const releases: Release[] = versions;\n\n const res: ReleaseResult = { releases };\n\n if (latest?.homepage) {\n res.homepage = latest.homepage;\n }\n\n return res;\n });\n\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'buildpacks: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${BuildpacksRegistryDatasource.id}`,\n key: `${config.registryUrl}:${config.packageName}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;AAUA,IAAa,+BAAb,MAAa,qCAAqC,WAAW;CAC3D,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,6BAA6B,EAAE;CACvC;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,gCAAgC;CAC1C;CAEA,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,aACZ,QAC+B;EAyB/B,MAAM,EAAE,KAAK,QAAQ,MAxBN,OAAO,MAAM,QAAQ,cAAc,CAAC,CAChD,WAAW,EAAE,aAAa,kBAAkB;GAC3C,MAAM,MAAM,QACV,aACA,OACA,MACA,cACA,WACF;GAEA,OAAO,KAAK,KAAK,YAAY,KAAK,0BAA0B;EAC9D,CAAC,CAAC,CACD,WAAW,EAAE,UAAU,aAA4B;GAGlD,MAAM,MAAqB,EAAE,UAAA,SAAS;GAEtC,IAAI,QAAQ,UACV,IAAI,WAAW,OAAO;GAGxB,OAAO;EACT,CAE8B,CAAC,CAAC,OAAO;EAEzC,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,8BAA8B;GACpD,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,6BAA6B;GACtD,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -13,8 +13,12 @@ var CdnjsDatasource = class CdnjsDatasource extends Datasource {
13
13
  constructor() {
14
14
  super(CdnjsDatasource.id);
15
15
  }
16
- customRegistrySupport = false;
17
- defaultRegistryUrls = ["https://api.cdnjs.com/"];
16
+ supportsCustomRegistry(_packageName) {
17
+ return false;
18
+ }
19
+ getDefaultRegistryUrls(_packageName) {
20
+ return ["https://api.cdnjs.com/"];
21
+ }
18
22
  sourceUrlSupport = "package";
19
23
  sourceUrlNote = "The source URL is determined from the `repository` field in the results.";
20
24
  async _getReleases(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/cdnjs/index.ts"],"sourcesContent":["import { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { HttpError } from '../../../util/http/index.ts';\nimport { Result } from '../../../util/result.ts';\nimport { Datasource } from '../datasource.ts';\nimport { DigestsConfig, ReleasesConfig } from '../schema.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { CdnjsAPISriResponse, CdnjsAPIVersionResponse } from './schema.ts';\n\nexport class CdnjsDatasource extends Datasource {\n static readonly id = 'cdnjs';\n\n constructor() {\n super(CdnjsDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://api.cdnjs.com/'];\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 private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ packageName, registryUrl }) => {\n const [library] = packageName.split('/');\n\n const url = `${registryUrl}libraries/${library}?fields=homepage,repository,versions`;\n\n return this.http.getJsonSafe(\n url,\n { cacheProvider: memCacheProvider },\n CdnjsAPIVersionResponse,\n );\n })\n .transform(({ versions, homepage, repository }): ReleaseResult => {\n const releases: Release[] = versions;\n\n const res: ReleaseResult = { releases };\n\n if (homepage) {\n res.homepage = homepage;\n }\n\n if (repository) {\n res.sourceUrl = repository;\n }\n\n return res;\n });\n\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'cdnjs: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const library = config.packageName.split('/')[0];\n return withCache(\n {\n namespace: `datasource-${CdnjsDatasource.id}`,\n key: `getReleases:${library}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getDigest(\n config: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n const { packageName } = config;\n const [library] = packageName.split('/');\n const assetName = packageName.replace(`${library}/`, '');\n\n const result = Result.parse(config, DigestsConfig)\n .transform(({ registryUrl }) => {\n const url = `${registryUrl}libraries/${library}/${newValue}?fields=sri`;\n\n return this.http.getJsonSafe(url, CdnjsAPISriResponse);\n })\n .transform(({ sri }): string => {\n return sri?.[assetName];\n });\n\n const { val = null, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'cdnjs: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${CdnjsDatasource.id}`,\n key: `getDigest:${config.registryUrl}:${config.packageName}:${newValue}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n override handleHttpErrors(err: HttpError): void {\n if (err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,wBAAwB;CAEjE,mBAAqC;CACrC,gBACE;CAEF,MAAc,aACZ,QAC+B;EA6B/B,MAAM,EAAE,KAAK,QAAQ,MA5BN,OAAO,MAAM,QAAQ,cAAc,CAAC,CAChD,WAAW,EAAE,aAAa,kBAAkB;GAC3C,MAAM,CAAC,WAAW,YAAY,MAAM,GAAG;GAEvC,MAAM,MAAM,GAAG,YAAY,YAAY,QAAQ;GAE/C,OAAO,KAAK,KAAK,YACf,KACA,EAAE,eAAe,iBAAiB,GAClC,uBACF;EACF,CAAC,CAAC,CACD,WAAW,EAAE,UAAU,UAAU,iBAAgC;GAGhE,MAAM,MAAqB,EAAE,UAAA,SAAS;GAEtC,IAAI,UACF,IAAI,WAAW;GAGjB,IAAI,YACF,IAAI,YAAY;GAGlB,OAAO;EACT,CAE8B,CAAC,CAAC,OAAO;EAEzC,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;GAC/C,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,MAAM,UAAU,OAAO,YAAY,MAAM,GAAG,CAAC,CAAC;EAC9C,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,eAAe;GACpB,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,WACZ,QACA,UACwB;EACxB,MAAM,EAAE,gBAAgB;EACxB,MAAM,CAAC,WAAW,YAAY,MAAM,GAAG;EACvC,MAAM,YAAY,YAAY,QAAQ,GAAG,QAAQ,IAAI,EAAE;EAYvD,MAAM,EAAE,MAAM,MAAM,QAAQ,MAVb,OAAO,MAAM,QAAQ,aAAa,CAAC,CAC/C,WAAW,EAAE,kBAAkB;GAC9B,MAAM,MAAM,GAAG,YAAY,YAAY,QAAQ,GAAG,SAAS;GAE3D,OAAO,KAAK,KAAK,YAAY,KAAK,mBAAmB;EACvD,CAAC,CAAC,CACD,WAAW,EAAE,UAAkB;GAC9B,OAAO,MAAM;EACf,CAEqC,CAAC,CAAC,OAAO;EAEhD,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;GAC/C,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,aAAa,OAAO,YAAY,GAAG,OAAO,YAAY,GAAG;GAC9D,WAAW;GACX,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;CAEA,iBAA0B,KAAsB;EAC9C,IAAI,IAAI,UAAU,eAAe,KAC/B,MAAM,IAAI,kBAAkB,GAAG;CAEnC;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/cdnjs/index.ts"],"sourcesContent":["import { ZodError } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport type { HttpError } from '../../../util/http/index.ts';\nimport { Result } from '../../../util/result.ts';\nimport { Datasource } from '../datasource.ts';\nimport { DigestsConfig, ReleasesConfig } from '../schema.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { CdnjsAPISriResponse, CdnjsAPIVersionResponse } from './schema.ts';\n\nexport class CdnjsDatasource extends Datasource {\n static readonly id = 'cdnjs';\n\n constructor() {\n super(CdnjsDatasource.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://api.cdnjs.com/'];\n }\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 private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const result = Result.parse(config, ReleasesConfig)\n .transform(({ packageName, registryUrl }) => {\n const [library] = packageName.split('/');\n\n const url = `${registryUrl}libraries/${library}?fields=homepage,repository,versions`;\n\n return this.http.getJsonSafe(\n url,\n { cacheProvider: memCacheProvider },\n CdnjsAPIVersionResponse,\n );\n })\n .transform(({ versions, homepage, repository }): ReleaseResult => {\n const releases: Release[] = versions;\n\n const res: ReleaseResult = { releases };\n\n if (homepage) {\n res.homepage = homepage;\n }\n\n if (repository) {\n res.sourceUrl = repository;\n }\n\n return res;\n });\n\n const { val, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'cdnjs: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const library = config.packageName.split('/')[0];\n return withCache(\n {\n namespace: `datasource-${CdnjsDatasource.id}`,\n key: `getReleases:${library}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private async _getDigest(\n config: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n const { packageName } = config;\n const [library] = packageName.split('/');\n const assetName = packageName.replace(`${library}/`, '');\n\n const result = Result.parse(config, DigestsConfig)\n .transform(({ registryUrl }) => {\n const url = `${registryUrl}libraries/${library}/${newValue}?fields=sri`;\n\n return this.http.getJsonSafe(url, CdnjsAPISriResponse);\n })\n .transform(({ sri }): string => {\n return sri?.[assetName];\n });\n\n const { val = null, err } = await result.unwrap();\n\n if (err instanceof ZodError) {\n logger.debug({ err }, 'cdnjs: validation error');\n return null;\n }\n\n if (err) {\n this.handleGenericErrors(err);\n }\n\n return val;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue: string,\n ): Promise<string | null> {\n return withCache(\n {\n namespace: `datasource-${CdnjsDatasource.id}`,\n key: `getDigest:${config.registryUrl}:${config.packageName}:${newValue}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getDigest(config, newValue),\n );\n }\n\n override handleHttpErrors(err: HttpError): void {\n if (err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,IAAa,kBAAb,MAAa,wBAAwB,WAAW;CAC9C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,gBAAgB,EAAE;CAC1B;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,wBAAwB;CAClC;CAEA,mBAAqC;CACrC,gBACE;CAEF,MAAc,aACZ,QAC+B;EA6B/B,MAAM,EAAE,KAAK,QAAQ,MA5BN,OAAO,MAAM,QAAQ,cAAc,CAAC,CAChD,WAAW,EAAE,aAAa,kBAAkB;GAC3C,MAAM,CAAC,WAAW,YAAY,MAAM,GAAG;GAEvC,MAAM,MAAM,GAAG,YAAY,YAAY,QAAQ;GAE/C,OAAO,KAAK,KAAK,YACf,KACA,EAAE,eAAe,iBAAiB,GAClC,uBACF;EACF,CAAC,CAAC,CACD,WAAW,EAAE,UAAU,UAAU,iBAAgC;GAGhE,MAAM,MAAqB,EAAE,UAAA,SAAS;GAEtC,IAAI,UACF,IAAI,WAAW;GAGjB,IAAI,YACF,IAAI,YAAY;GAGlB,OAAO;EACT,CAE8B,CAAC,CAAC,OAAO;EAEzC,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;GAC/C,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,YAAY,QAA0D;EACpE,MAAM,UAAU,OAAO,YAAY,MAAM,GAAG,CAAC,CAAC;EAC9C,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,eAAe;GACpB,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,MAAc,WACZ,QACA,UACwB;EACxB,MAAM,EAAE,gBAAgB;EACxB,MAAM,CAAC,WAAW,YAAY,MAAM,GAAG;EACvC,MAAM,YAAY,YAAY,QAAQ,GAAG,QAAQ,IAAI,EAAE;EAYvD,MAAM,EAAE,MAAM,MAAM,QAAQ,MAVb,OAAO,MAAM,QAAQ,aAAa,CAAC,CAC/C,WAAW,EAAE,kBAAkB;GAC9B,MAAM,MAAM,GAAG,YAAY,YAAY,QAAQ,GAAG,SAAS;GAE3D,OAAO,KAAK,KAAK,YAAY,KAAK,mBAAmB;EACvD,CAAC,CAAC,CACD,WAAW,EAAE,UAAkB;GAC9B,OAAO,MAAM;EACf,CAEqC,CAAC,CAAC,OAAO;EAEhD,IAAI,eAAe,UAAU;GAC3B,OAAO,MAAM,EAAE,IAAI,GAAG,yBAAyB;GAC/C,OAAO;EACT;EAEA,IAAI,KACF,KAAK,oBAAoB,GAAG;EAG9B,OAAO;CACT;CAEA,UACE,QACA,UACwB;EACxB,OAAO,UACL;GACE,WAAW,cAAc,gBAAgB;GACzC,KAAK,aAAa,OAAO,YAAY,GAAG,OAAO,YAAY,GAAG;GAC9D,WAAW;GACX,UAAU;EACZ,SACM,KAAK,WAAW,QAAQ,QAAQ,CACxC;CACF;CAEA,iBAA0B,KAAsB;EAC9C,IAAI,IAAI,UAAU,eAAe,KAC/B,MAAM,IAAI,kBAAkB,GAAG;CAEnC;AACF"}
@@ -8,7 +8,9 @@ var ClojureDatasource = class ClojureDatasource extends MavenDatasource {
8
8
  super(ClojureDatasource.id);
9
9
  }
10
10
  registryStrategy = "merge";
11
- defaultRegistryUrls = [CLOJARS_REPO, MAVEN_REPO];
11
+ getDefaultRegistryUrls(_packageName) {
12
+ return [CLOJARS_REPO, MAVEN_REPO];
13
+ }
12
14
  };
13
15
  //#endregion
14
16
  export { ClojureDatasource };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/clojure/index.ts"],"sourcesContent":["import { MAVEN_REPO } from '../maven/common.ts';\nimport { MavenDatasource } from '../maven/index.ts';\nimport { CLOJARS_REPO } from './common.ts';\n\nexport class ClojureDatasource extends MavenDatasource {\n static override readonly id = 'clojure';\n\n constructor() {\n super(ClojureDatasource.id);\n }\n\n override readonly registryStrategy = 'merge';\n\n override readonly defaultRegistryUrls = [CLOJARS_REPO, MAVEN_REPO];\n}\n"],"mappings":";;;;AAIA,IAAa,oBAAb,MAAa,0BAA0B,gBAAgB;CACrD,OAAyB,KAAK;CAE9B,cAAc;EACZ,MAAM,kBAAkB,EAAE;CAC5B;CAEA,mBAAqC;CAErC,sBAAwC,CAAC,cAAc,UAAU;AACnE"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/clojure/index.ts"],"sourcesContent":["import { MAVEN_REPO } from '../maven/common.ts';\nimport { MavenDatasource } from '../maven/index.ts';\nimport { CLOJARS_REPO } from './common.ts';\n\nexport class ClojureDatasource extends MavenDatasource {\n static override readonly id = 'clojure';\n\n constructor() {\n super(ClojureDatasource.id);\n }\n\n override readonly registryStrategy = 'merge';\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [CLOJARS_REPO, MAVEN_REPO];\n }\n}\n"],"mappings":";;;;AAIA,IAAa,oBAAb,MAAa,0BAA0B,gBAAgB;CACrD,OAAyB,KAAK;CAE9B,cAAc;EACZ,MAAM,kBAAkB,EAAE;CAC5B;CAEA,mBAAqC;CAErC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,cAAc,UAAU;CAClC;AACF"}
@@ -11,7 +11,9 @@ import { isString, isUndefined } from "@sindresorhus/is";
11
11
  //#region lib/modules/datasource/conan/index.ts
12
12
  var ConanDatasource = class ConanDatasource extends Datasource {
13
13
  static id = datasource;
14
- defaultRegistryUrls = [defaultRegistryUrl];
14
+ getDefaultRegistryUrls(_packageName) {
15
+ return [defaultRegistryUrl];
16
+ }
15
17
  caching = true;
16
18
  registryStrategy = "merge";
17
19
  githubHttp;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["allVersioning.get"],"sources":["../../../../lib/modules/datasource/conan/index.ts"],"sourcesContent":["import { isString, isUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash, joinUrlParts } from '../../../util/url.ts';\nimport * as allVersioning from '../../versioning/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { isArtifactoryServer } from '../util.ts';\nimport { datasource, defaultRegistryUrl, getConanPackage } from './common.ts';\nimport {\n ConanCenterReleases,\n ConanJSON,\n ConanLatestRevision,\n ConanProperties,\n ConanRevisionJSON,\n} from './schema.ts';\n\nexport class ConanDatasource extends Datasource {\n static readonly id = datasource;\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n githubHttp: GithubHttp;\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is supported only if the package is served from the Artifactory servers. In which case we determine it from the `properties[conan.package.url]` field in the results.';\n\n constructor(id = ConanDatasource.id) {\n super(id);\n this.githubHttp = new GithubHttp(id);\n }\n\n async getConanCenterReleases(\n conanName: string,\n userAndChannel: string,\n ): Promise<ReleaseResult | null> {\n if (userAndChannel && userAndChannel !== '@_/_') {\n logger.debug(\n { conanName, userAndChannel },\n 'User/channel not supported for Conan Center lookups',\n );\n return null;\n }\n const url = `https://api.github.com/repos/conan-io/conan-center-index/contents/recipes/${conanName}/config.yml`;\n const { body: result } = await this.githubHttp.getYaml(\n url,\n { headers: { accept: 'application/vnd.github.v3.raw' } },\n ConanCenterReleases,\n );\n return result;\n }\n\n private async fetchDigest(\n { registryUrl, packageName }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (isUndefined(newValue) || isUndefined(registryUrl)) {\n return null;\n }\n const url = ensureTrailingSlash(registryUrl);\n const conanPackage = getConanPackage(packageName);\n const revisionLookUp = joinUrlParts(\n url,\n 'v2/conans/',\n conanPackage.conanName,\n newValue,\n conanPackage.userAndChannel,\n '/revisions',\n );\n const { body: digest } = await this.http.getJson(\n revisionLookUp,\n ConanLatestRevision,\n );\n return digest;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return this.cached(\n {\n // TODO: types (#22198)\n key: `getDigest:${config.registryUrl!}:${config.packageName}:${newValue!}`,\n fallback: true,\n },\n () => this.fetchDigest(config, newValue),\n );\n }\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const conanPackage = getConanPackage(packageName);\n const userAndChannel = `@${conanPackage.userAndChannel}`;\n if (\n isString(registryUrl) &&\n ensureTrailingSlash(registryUrl) === defaultRegistryUrl\n ) {\n return this.getConanCenterReleases(\n conanPackage.conanName,\n userAndChannel,\n );\n }\n\n logger.trace(\n { packageName, registryUrl },\n 'Looking up conan api dependency',\n );\n\n // v8 ignore else -- the datasource layer always supplies a registry url\n if (registryUrl) {\n const url = ensureTrailingSlash(registryUrl);\n const lookupUrl = joinUrlParts(\n url,\n `v2/conans/search?q=${conanPackage.conanName}`,\n );\n\n try {\n const rep = await this.http.getJson(lookupUrl, ConanJSON);\n const conanJson = rep.body;\n if (conanJson) {\n logger.trace({ lookupUrl }, 'Got conan api result');\n const dep: ReleaseResult = { releases: [] };\n\n const conanJsonReleases: Release[] = conanJson\n .filter(({ userChannel }) => userChannel === userAndChannel)\n .map(({ version }) => ({ version }));\n dep.releases.push(...conanJsonReleases);\n\n try {\n if (isArtifactoryServer(rep)) {\n const conanApiRegexp = regEx(\n /(?<host>.*)\\/artifactory\\/api\\/conan\\/(?<repo>[^/]+)/,\n );\n const groups = conanApiRegexp.exec(url)?.groups;\n if (!groups) {\n return dep;\n }\n const semver = allVersioning.get('semver');\n\n const sortedReleases = dep.releases\n .filter((release) => semver.isVersion(release.version))\n .sort((a, b) => semver.sortVersions(a.version, b.version));\n\n const latestVersion = sortedReleases.at(-1)?.version;\n\n if (!latestVersion) {\n return dep;\n }\n logger.debug(\n `Conan package ${packageName} has latest version ${latestVersion}`,\n );\n\n const latestRevisionUrl = joinUrlParts(\n url,\n `v2/conans/${conanPackage.conanName}/${latestVersion}/${conanPackage.userAndChannel}/latest`,\n );\n const {\n body: { revision: packageRev },\n } = await this.http.getJson(latestRevisionUrl, ConanRevisionJSON);\n\n const [user, channel] = conanPackage.userAndChannel.split('/');\n const packageUrl = joinUrlParts(\n `${groups.host}/artifactory/api/storage/${groups.repo}`,\n `${user}/${conanPackage.conanName}/${latestVersion}/${channel}/${packageRev}/export/conanfile.py?properties=conan.package.url`,\n );\n const { body: conanProperties } = await this.http.getJson(\n packageUrl,\n ConanProperties,\n );\n const { sourceUrl } = conanProperties;\n // v8 ignore else -- needs a full artifactory properties fixture\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n }\n } catch (err) {\n logger.debug({ err }, \"Couldn't determine Conan package url\");\n }\n return dep;\n }\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n return null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["allVersioning.get"],"sources":["../../../../lib/modules/datasource/conan/index.ts"],"sourcesContent":["import { isString, isUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash, joinUrlParts } from '../../../util/url.ts';\nimport * as allVersioning from '../../versioning/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type {\n DigestConfig,\n GetReleasesConfig,\n Release,\n ReleaseResult,\n} from '../types.ts';\nimport { isArtifactoryServer } from '../util.ts';\nimport { datasource, defaultRegistryUrl, getConanPackage } from './common.ts';\nimport {\n ConanCenterReleases,\n ConanJSON,\n ConanLatestRevision,\n ConanProperties,\n ConanRevisionJSON,\n} from './schema.ts';\n\nexport class ConanDatasource extends Datasource {\n static readonly id = datasource;\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n override readonly caching = true;\n\n override readonly registryStrategy = 'merge';\n\n githubHttp: GithubHttp;\n\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is supported only if the package is served from the Artifactory servers. In which case we determine it from the `properties[conan.package.url]` field in the results.';\n\n constructor(id = ConanDatasource.id) {\n super(id);\n this.githubHttp = new GithubHttp(id);\n }\n\n async getConanCenterReleases(\n conanName: string,\n userAndChannel: string,\n ): Promise<ReleaseResult | null> {\n if (userAndChannel && userAndChannel !== '@_/_') {\n logger.debug(\n { conanName, userAndChannel },\n 'User/channel not supported for Conan Center lookups',\n );\n return null;\n }\n const url = `https://api.github.com/repos/conan-io/conan-center-index/contents/recipes/${conanName}/config.yml`;\n const { body: result } = await this.githubHttp.getYaml(\n url,\n { headers: { accept: 'application/vnd.github.v3.raw' } },\n ConanCenterReleases,\n );\n return result;\n }\n\n private async fetchDigest(\n { registryUrl, packageName }: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n if (isUndefined(newValue) || isUndefined(registryUrl)) {\n return null;\n }\n const url = ensureTrailingSlash(registryUrl);\n const conanPackage = getConanPackage(packageName);\n const revisionLookUp = joinUrlParts(\n url,\n 'v2/conans/',\n conanPackage.conanName,\n newValue,\n conanPackage.userAndChannel,\n '/revisions',\n );\n const { body: digest } = await this.http.getJson(\n revisionLookUp,\n ConanLatestRevision,\n );\n return digest;\n }\n\n override getDigest(\n config: DigestConfig,\n newValue?: string,\n ): Promise<string | null> {\n return this.cached(\n {\n // TODO: types (#22198)\n key: `getDigest:${config.registryUrl!}:${config.packageName}:${newValue!}`,\n fallback: true,\n },\n () => this.fetchDigest(config, newValue),\n );\n }\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n const conanPackage = getConanPackage(packageName);\n const userAndChannel = `@${conanPackage.userAndChannel}`;\n if (\n isString(registryUrl) &&\n ensureTrailingSlash(registryUrl) === defaultRegistryUrl\n ) {\n return this.getConanCenterReleases(\n conanPackage.conanName,\n userAndChannel,\n );\n }\n\n logger.trace(\n { packageName, registryUrl },\n 'Looking up conan api dependency',\n );\n\n // v8 ignore else -- the datasource layer always supplies a registry url\n if (registryUrl) {\n const url = ensureTrailingSlash(registryUrl);\n const lookupUrl = joinUrlParts(\n url,\n `v2/conans/search?q=${conanPackage.conanName}`,\n );\n\n try {\n const rep = await this.http.getJson(lookupUrl, ConanJSON);\n const conanJson = rep.body;\n if (conanJson) {\n logger.trace({ lookupUrl }, 'Got conan api result');\n const dep: ReleaseResult = { releases: [] };\n\n const conanJsonReleases: Release[] = conanJson\n .filter(({ userChannel }) => userChannel === userAndChannel)\n .map(({ version }) => ({ version }));\n dep.releases.push(...conanJsonReleases);\n\n try {\n if (isArtifactoryServer(rep)) {\n const conanApiRegexp = regEx(\n /(?<host>.*)\\/artifactory\\/api\\/conan\\/(?<repo>[^/]+)/,\n );\n const groups = conanApiRegexp.exec(url)?.groups;\n if (!groups) {\n return dep;\n }\n const semver = allVersioning.get('semver');\n\n const sortedReleases = dep.releases\n .filter((release) => semver.isVersion(release.version))\n .sort((a, b) => semver.sortVersions(a.version, b.version));\n\n const latestVersion = sortedReleases.at(-1)?.version;\n\n if (!latestVersion) {\n return dep;\n }\n logger.debug(\n `Conan package ${packageName} has latest version ${latestVersion}`,\n );\n\n const latestRevisionUrl = joinUrlParts(\n url,\n `v2/conans/${conanPackage.conanName}/${latestVersion}/${conanPackage.userAndChannel}/latest`,\n );\n const {\n body: { revision: packageRev },\n } = await this.http.getJson(latestRevisionUrl, ConanRevisionJSON);\n\n const [user, channel] = conanPackage.userAndChannel.split('/');\n const packageUrl = joinUrlParts(\n `${groups.host}/artifactory/api/storage/${groups.repo}`,\n `${user}/${conanPackage.conanName}/${latestVersion}/${channel}/${packageRev}/export/conanfile.py?properties=conan.package.url`,\n );\n const { body: conanProperties } = await this.http.getJson(\n packageUrl,\n ConanProperties,\n );\n const { sourceUrl } = conanProperties;\n // v8 ignore else -- needs a full artifactory properties fixture\n if (sourceUrl) {\n dep.sourceUrl = sourceUrl;\n }\n }\n } catch (err) {\n logger.debug({ err }, \"Couldn't determine Conan package url\");\n }\n return dep;\n }\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n return null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n // TODO: types (#22198)\n key: `getReleases:${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":"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"}
@@ -15,9 +15,13 @@ var CondaDatasource = class extends Datasource {
15
15
  constructor() {
16
16
  super(datasource);
17
17
  }
18
- customRegistrySupport = true;
18
+ supportsCustomRegistry(_packageName) {
19
+ return true;
20
+ }
19
21
  registryStrategy = "hunt";
20
- defaultRegistryUrls = [defaultRegistryUrl];
22
+ getDefaultRegistryUrls(_packageName) {
23
+ return [defaultRegistryUrl];
24
+ }
21
25
  caching = true;
22
26
  releaseTimestampSupport = true;
23
27
  releaseTimestampNote = "The release timestamp is determined from the `upload_time` field of the files of a version when using the Anaconda.org API, or from the `createdAt` field of the variants of a version when using prefix.dev. All files of a version are assumed to be published at roughly the same time.";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["prefixDev.getReleases","HttpError"],"sources":["../../../../lib/modules/datasource/conda/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { Timestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash, joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport * as prefixDev from './prefix-dev.ts';\nimport { CondaPackage } from './schema.ts';\n\nexport class CondaDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override readonly customRegistrySupport = true;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly defaultRegistryUrls = [defaultRegistryUrl];\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `upload_time` field of the files of a version when using the Anaconda.org API, or from the `createdAt` field of the variants of a version when using prefix.dev. All files of a version are assumed to be published at roughly the same time.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `dev_url` field in the results.';\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n logger.trace({ registryUrl, packageName }, 'fetching conda package');\n\n if (!registryUrl) {\n return null;\n }\n\n // fast.prefix.dev is a alias, deprecated, but still running.\n // We expect registryUrl to be `https://prefix.dev/${channel}` here.\n if (\n registryUrl.startsWith('https://prefix.dev/') ||\n registryUrl.startsWith('https://fast.prefix.dev/')\n ) {\n // Since the registryUrl contains at least 3 `/` ,\n // the channel varitable won't be undefined in any case.\n const channel = ensureTrailingSlash(registryUrl).split('/').at(-2)!;\n\n return prefixDev.getReleases(this.http, channel, packageName);\n }\n\n const url = joinUrlParts(registryUrl, packageName);\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n try {\n const response = await this.http.getJson(url, CondaPackage);\n\n result.homepage = response.body.html_url;\n result.sourceUrl = response.body.dev_url;\n\n const releaseDate: Record<string, Timestamp> = {};\n // we assume all packages are roughly released on the same time\n for (const file of coerceArray(response.body.files)) {\n releaseDate[file.version] ??= Timestamp.parse(file.upload_time);\n }\n\n coerceArray(response.body.versions).forEach((version: string) => {\n const thisRelease: Release = {\n version,\n releaseTimestamp: releaseDate[version],\n };\n result.releases.push(thisRelease);\n });\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n // TODO: types (#22198)\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,kBAAb,cAAqC,WAAW;CAC9C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,wBAA0C;CAE1C,mBAAqC;CAErC,sBAAwC,CAAC,kBAAkB;CAE3D,UAA4B;CAE5B,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,OAAO,MAAM;GAAE;GAAa;EAAY,GAAG,wBAAwB;EAEnE,IAAI,CAAC,aACH,OAAO;EAKT,IACE,YAAY,WAAW,qBAAqB,KAC5C,YAAY,WAAW,0BAA0B,GACjD;GAGA,MAAM,UAAU,oBAAoB,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE;GAEjE,OAAOA,YAAsB,KAAK,MAAM,SAAS,WAAW;EAC9D;EAEA,MAAM,MAAM,aAAa,aAAa,WAAW;EAEjD,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,KAAK,YAAY;GAE1D,OAAO,WAAW,SAAS,KAAK;GAChC,OAAO,YAAY,SAAS,KAAK;GAEjC,MAAM,cAAyC,CAAC;GAEhD,KAAK,MAAM,QAAQ,YAAY,SAAS,KAAK,KAAK,GAChD,YAAY,KAAK,aAAa,UAAU,MAAM,KAAK,WAAW;GAGhE,YAAY,SAAS,KAAK,QAAQ,CAAC,CAAC,SAAS,YAAoB;IAC/D,MAAM,cAAuB;KAC3B;KACA,kBAAkB,YAAY;IAChC;IACA,OAAO,SAAS,KAAK,WAAW;GAClC,CAAC;EACH,SAAS,KAAK;GACZ,IAAI,eAAeC,gBAAa,IAAI,UAAU,eAAe,KAC3D,MAAM,IAAI,kBAAkB,GAAG;GAEjC,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GAEE,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["prefixDev.getReleases","HttpError"],"sources":["../../../../lib/modules/datasource/conda/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport { Timestamp } from '../../../util/timestamp.ts';\nimport { ensureTrailingSlash, joinUrlParts } from '../../../util/url.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { datasource, defaultRegistryUrl } from './common.ts';\nimport * as prefixDev from './prefix-dev.ts';\nimport { CondaPackage } from './schema.ts';\n\nexport class CondaDatasource extends Datasource {\n static readonly id = datasource;\n\n constructor() {\n super(datasource);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return true;\n }\n\n override readonly registryStrategy = 'hunt';\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return [defaultRegistryUrl];\n }\n\n override readonly caching = true;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `upload_time` field of the files of a version when using the Anaconda.org API, or from the `createdAt` field of the variants of a version when using prefix.dev. All files of a version are assumed to be published at roughly the same time.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the `dev_url` field in the results.';\n\n private async fetchReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n logger.trace({ registryUrl, packageName }, 'fetching conda package');\n\n if (!registryUrl) {\n return null;\n }\n\n // fast.prefix.dev is a alias, deprecated, but still running.\n // We expect registryUrl to be `https://prefix.dev/${channel}` here.\n if (\n registryUrl.startsWith('https://prefix.dev/') ||\n registryUrl.startsWith('https://fast.prefix.dev/')\n ) {\n // Since the registryUrl contains at least 3 `/` ,\n // the channel varitable won't be undefined in any case.\n const channel = ensureTrailingSlash(registryUrl).split('/').at(-2)!;\n\n return prefixDev.getReleases(this.http, channel, packageName);\n }\n\n const url = joinUrlParts(registryUrl, packageName);\n\n const result: ReleaseResult = {\n releases: [],\n };\n\n try {\n const response = await this.http.getJson(url, CondaPackage);\n\n result.homepage = response.body.html_url;\n result.sourceUrl = response.body.dev_url;\n\n const releaseDate: Record<string, Timestamp> = {};\n // we assume all packages are roughly released on the same time\n for (const file of coerceArray(response.body.files)) {\n releaseDate[file.version] ??= Timestamp.parse(file.upload_time);\n }\n\n coerceArray(response.body.versions).forEach((version: string) => {\n const thisRelease: Release = {\n version,\n releaseTimestamp: releaseDate[version],\n };\n result.releases.push(thisRelease);\n });\n } catch (err) {\n if (err instanceof HttpError && err.response?.statusCode !== 404) {\n throw new ExternalHostError(err);\n }\n this.handleGenericErrors(err);\n }\n\n return result.releases.length ? result : null;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return this.cached(\n {\n // TODO: types (#22198)\n key: `${config.registryUrl}:${config.packageName}`,\n fallback: true,\n },\n () => this.fetchReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,kBAAb,cAAqC,WAAW;CAC9C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,UAAU;CAClB;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,mBAAqC;CAErC,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,kBAAkB;CAC5B;CAEA,UAA4B;CAE5B,0BAA4C;CAC5C,uBACE;CACF,mBAAqC;CACrC,gBACE;CAEF,MAAc,cAAc,EAC1B,aACA,eACmD;EACnD,OAAO,MAAM;GAAE;GAAa;EAAY,GAAG,wBAAwB;EAEnE,IAAI,CAAC,aACH,OAAO;EAKT,IACE,YAAY,WAAW,qBAAqB,KAC5C,YAAY,WAAW,0BAA0B,GACjD;GAGA,MAAM,UAAU,oBAAoB,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE;GAEjE,OAAOA,YAAsB,KAAK,MAAM,SAAS,WAAW;EAC9D;EAEA,MAAM,MAAM,aAAa,aAAa,WAAW;EAEjD,MAAM,SAAwB,EAC5B,UAAU,CAAC,EACb;EAEA,IAAI;GACF,MAAM,WAAW,MAAM,KAAK,KAAK,QAAQ,KAAK,YAAY;GAE1D,OAAO,WAAW,SAAS,KAAK;GAChC,OAAO,YAAY,SAAS,KAAK;GAEjC,MAAM,cAAyC,CAAC;GAEhD,KAAK,MAAM,QAAQ,YAAY,SAAS,KAAK,KAAK,GAChD,YAAY,KAAK,aAAa,UAAU,MAAM,KAAK,WAAW;GAGhE,YAAY,SAAS,KAAK,QAAQ,CAAC,CAAC,SAAS,YAAoB;IAC/D,MAAM,cAAuB;KAC3B;KACA,kBAAkB,YAAY;IAChC;IACA,OAAO,SAAS,KAAK,WAAW;GAClC,CAAC;EACH,SAAS,KAAK;GACZ,IAAI,eAAeC,gBAAa,IAAI,UAAU,eAAe,KAC3D,MAAM,IAAI,kBAAkB,GAAG;GAEjC,KAAK,oBAAoB,GAAG;EAC9B;EAEA,OAAO,OAAO,SAAS,SAAS,SAAS;CAC3C;CAEA,YAAY,QAA0D;EACpE,OAAO,KAAK,OACV;GAEE,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,UAAU;EACZ,SACM,KAAK,cAAc,MAAM,CACjC;CACF;AACF"}
@@ -9,8 +9,12 @@ var CpanDatasource = class CpanDatasource extends Datasource {
9
9
  constructor() {
10
10
  super(CpanDatasource.id);
11
11
  }
12
- customRegistrySupport = false;
13
- defaultRegistryUrls = ["https://fastapi.metacpan.org/"];
12
+ supportsCustomRegistry(_packageName) {
13
+ return false;
14
+ }
15
+ getDefaultRegistryUrls(_packageName) {
16
+ return ["https://fastapi.metacpan.org/"];
17
+ }
14
18
  defaultVersioning = id;
15
19
  releaseTimestampSupport = true;
16
20
  releaseTimestampNote = "The release timestamp is determined from the `date` field in the results.";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["perlVersioning.id"],"sources":["../../../../lib/modules/datasource/cpan/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as perlVersioning from '../../versioning/perl/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { MetaCpanApiFileSearchResponse } from './schema.ts';\nimport type { CpanRelease } from './types.ts';\n\nexport class CpanDatasource extends Datasource {\n static readonly id = 'cpan';\n\n constructor() {\n super(CpanDatasource.id);\n }\n\n override readonly customRegistrySupport = false;\n\n override readonly defaultRegistryUrls = ['https://fastapi.metacpan.org/'];\n\n override readonly defaultVersioning = perlVersioning.id;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n let result: ReleaseResult | null = null;\n const searchUrl = joinUrlParts(registryUrl, 'v1/file/_search');\n\n let releases: CpanRelease[] | null = null;\n try {\n const body = {\n query: {\n bool: {\n filter: [\n { term: { 'module.name': packageName } },\n { term: { 'module.authorized': true } },\n { exists: { field: 'module.associated_pod' } },\n ],\n },\n },\n _source: [\n 'module.name',\n 'module.version',\n 'distribution',\n 'date',\n 'deprecated',\n 'maturity',\n 'status',\n ],\n sort: [{ date: 'desc' }],\n };\n\n releases = (\n await this.http.postJson(\n searchUrl,\n { body },\n MetaCpanApiFileSearchResponse,\n )\n ).body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n let latestDistribution: string | null = null;\n let latestVersion: string | null = null;\n // `releases` is only still null if the request above threw, and\n // `handleGenericErrors()` always rethrows - the `releases.length` below\n // would dereference null if the else were ever taken\n // v8 ignore else -- unreachable\n if (releases) {\n for (const release of releases) {\n latestDistribution ??= release.distribution;\n if (!latestVersion && release.isLatest) {\n latestVersion = release.version;\n }\n }\n }\n if (releases.length > 0 && latestDistribution) {\n result = {\n releases,\n changelogUrl: `https://metacpan.org/dist/${latestDistribution}/changes`,\n homepage: `https://metacpan.org/pod/${packageName}`,\n };\n\n if (latestVersion) {\n result.tags ??= {};\n result.tags.latest = latestVersion;\n }\n }\n\n return result;\n }\n\n override getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${CpanDatasource.id}`,\n key: `${config.packageName}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,wBAA0C;CAE1C,sBAAwC,CAAC,+BAA+B;CAExE,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,IAAI,SAA+B;EACnC,MAAM,YAAY,aAAa,aAAa,iBAAiB;EAE7D,IAAI,WAAiC;EACrC,IAAI;GACF,MAAM,OAAO;IACX,OAAO,EACL,MAAM,EACJ,QAAQ;KACN,EAAE,MAAM,EAAE,eAAe,YAAY,EAAE;KACvC,EAAE,MAAM,EAAE,qBAAqB,KAAK,EAAE;KACtC,EAAE,QAAQ,EAAE,OAAO,wBAAwB,EAAE;IAC/C,EACF,EACF;IACA,SAAS;KACP;KACA;KACA;KACA;KACA;KACA;KACA;IACF;IACA,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC;GACzB;GAEA,YACE,MAAM,KAAK,KAAK,SACd,WACA,EAAE,KAAK,GACP,6BACF,EAAA,CACA;EACJ,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,IAAI,qBAAoC;EACxC,IAAI,gBAA+B;;EAKnC,IAAI,UACF,KAAK,MAAM,WAAW,UAAU;GAC9B,uBAAuB,QAAQ;GAC/B,IAAI,CAAC,iBAAiB,QAAQ,UAC5B,gBAAgB,QAAQ;EAE5B;EAEF,IAAI,SAAS,SAAS,KAAK,oBAAoB;GAC7C,SAAS;IACP;IACA,cAAc,6BAA6B,mBAAmB;IAC9D,UAAU,4BAA4B;GACxC;GAEA,IAAI,eAAe;IACjB,OAAO,SAAS,CAAC;IACjB,OAAO,KAAK,SAAS;GACvB;EACF;EAEA,OAAO;CACT;CAEA,YACE,QAC+B;EAC/B,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,GAAG,OAAO;GACf,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":["perlVersioning.id"],"sources":["../../../../lib/modules/datasource/cpan/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as perlVersioning from '../../versioning/perl/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { MetaCpanApiFileSearchResponse } from './schema.ts';\nimport type { CpanRelease } from './types.ts';\n\nexport class CpanDatasource extends Datasource {\n static readonly id = 'cpan';\n\n constructor() {\n super(CpanDatasource.id);\n }\n\n override supportsCustomRegistry(_packageName: string): boolean {\n return false;\n }\n\n override getDefaultRegistryUrls(_packageName: string): string[] {\n return ['https://fastapi.metacpan.org/'];\n }\n\n override readonly defaultVersioning = perlVersioning.id;\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `date` field in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next -- should never happen */\n if (!registryUrl) {\n return null;\n }\n\n let result: ReleaseResult | null = null;\n const searchUrl = joinUrlParts(registryUrl, 'v1/file/_search');\n\n let releases: CpanRelease[] | null = null;\n try {\n const body = {\n query: {\n bool: {\n filter: [\n { term: { 'module.name': packageName } },\n { term: { 'module.authorized': true } },\n { exists: { field: 'module.associated_pod' } },\n ],\n },\n },\n _source: [\n 'module.name',\n 'module.version',\n 'distribution',\n 'date',\n 'deprecated',\n 'maturity',\n 'status',\n ],\n sort: [{ date: 'desc' }],\n };\n\n releases = (\n await this.http.postJson(\n searchUrl,\n { body },\n MetaCpanApiFileSearchResponse,\n )\n ).body;\n } catch (err) {\n this.handleGenericErrors(err);\n }\n\n let latestDistribution: string | null = null;\n let latestVersion: string | null = null;\n // `releases` is only still null if the request above threw, and\n // `handleGenericErrors()` always rethrows - the `releases.length` below\n // would dereference null if the else were ever taken\n // v8 ignore else -- unreachable\n if (releases) {\n for (const release of releases) {\n latestDistribution ??= release.distribution;\n if (!latestVersion && release.isLatest) {\n latestVersion = release.version;\n }\n }\n }\n if (releases.length > 0 && latestDistribution) {\n result = {\n releases,\n changelogUrl: `https://metacpan.org/dist/${latestDistribution}/changes`,\n homepage: `https://metacpan.org/pod/${packageName}`,\n };\n\n if (latestVersion) {\n result.tags ??= {};\n result.tags.latest = latestVersion;\n }\n }\n\n return result;\n }\n\n override getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${CpanDatasource.id}`,\n key: `${config.packageName}`,\n cacheable: true,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,iBAAb,MAAa,uBAAuB,WAAW;CAC7C,OAAgB,KAAK;CAErB,cAAc;EACZ,MAAM,eAAe,EAAE;CACzB;CAEA,uBAAgC,cAA+B;EAC7D,OAAO;CACT;CAEA,uBAAgC,cAAgC;EAC9D,OAAO,CAAC,+BAA+B;CACzC;CAEA,oBAAsCA;CAEtC,0BAA4C;CAC5C,uBACE;CAEF,MAAc,aAAa,EACzB,aACA,eACmD;;EAEnD,IAAI,CAAC,aACH,OAAO;EAGT,IAAI,SAA+B;EACnC,MAAM,YAAY,aAAa,aAAa,iBAAiB;EAE7D,IAAI,WAAiC;EACrC,IAAI;GACF,MAAM,OAAO;IACX,OAAO,EACL,MAAM,EACJ,QAAQ;KACN,EAAE,MAAM,EAAE,eAAe,YAAY,EAAE;KACvC,EAAE,MAAM,EAAE,qBAAqB,KAAK,EAAE;KACtC,EAAE,QAAQ,EAAE,OAAO,wBAAwB,EAAE;IAC/C,EACF,EACF;IACA,SAAS;KACP;KACA;KACA;KACA;KACA;KACA;KACA;IACF;IACA,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC;GACzB;GAEA,YACE,MAAM,KAAK,KAAK,SACd,WACA,EAAE,KAAK,GACP,6BACF,EAAA,CACA;EACJ,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;EAEA,IAAI,qBAAoC;EACxC,IAAI,gBAA+B;;EAKnC,IAAI,UACF,KAAK,MAAM,WAAW,UAAU;GAC9B,uBAAuB,QAAQ;GAC/B,IAAI,CAAC,iBAAiB,QAAQ,UAC5B,gBAAgB,QAAQ;EAE5B;EAEF,IAAI,SAAS,SAAS,KAAK,oBAAoB;GAC7C,SAAS;IACP;IACA,cAAc,6BAA6B,mBAAmB;IAC9D,UAAU,4BAA4B;GACxC;GAEA,IAAI,eAAe;IACjB,OAAO,SAAS,CAAC;IACjB,OAAO,KAAK,SAAS;GACvB;EACF;EAEA,OAAO;CACT;CAEA,YACE,QAC+B;EAC/B,OAAO,UACL;GACE,WAAW,cAAc,eAAe;GACxC,KAAK,GAAG,OAAO;GACf,WAAW;GACX,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;AACF"}
@@ -25,7 +25,9 @@ var CrateDatasource = class CrateDatasource extends Datasource {
25
25
  constructor() {
26
26
  super(CrateDatasource.id);
27
27
  }
28
- defaultRegistryUrls = ["sparse+https://index.crates.io/"];
28
+ getDefaultRegistryUrls(_packageName) {
29
+ return ["sparse+https://index.crates.io/"];
30
+ }
29
31
  defaultVersioning = id;
30
32
  sourceUrlSupport = "package";
31
33
  sourceUrlNote = "The source URL is determined from the `repository` field in the results.";