diff --git a/lib/modules/datasource/artifactory/index.ts b/lib/modules/datasource/artifactory/index.ts index 86fe6918b04b44..e66ffb4ebaac59 100644 --- a/lib/modules/datasource/artifactory/index.ts +++ b/lib/modules/datasource/artifactory/index.ts @@ -21,6 +21,10 @@ export class ArtifactoryDatasource extends Datasource { override readonly registryStrategy = 'merge'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the date-like text, next to the version hyperlink tag in the results.'; + @cache({ namespace: `datasource-${datasource}`, key: ({ registryUrl, packageName }: GetReleasesConfig) => diff --git a/lib/modules/datasource/aws-machine-image/index.ts b/lib/modules/datasource/aws-machine-image/index.ts index 8c15677505b0aa..455e1d33bad46e 100644 --- a/lib/modules/datasource/aws-machine-image/index.ts +++ b/lib/modules/datasource/aws-machine-image/index.ts @@ -18,6 +18,10 @@ export class AwsMachineImageDataSource extends Datasource { override readonly caching = true; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `CreationDate` field in the results.'; + override readonly defaultConfig = { // Because AMIs don't follow any versioning scheme, we override commitMessageExtra to remove the 'v' commitMessageExtra: 'to {{{newVersion}}}', diff --git a/lib/modules/datasource/bitbucket-tags/index.ts b/lib/modules/datasource/bitbucket-tags/index.ts index 57149f7e74e77e..165336cce165b9 100644 --- a/lib/modules/datasource/bitbucket-tags/index.ts +++ b/lib/modules/datasource/bitbucket-tags/index.ts @@ -19,6 +19,13 @@ export class BitbucketTagsDatasource extends Datasource { static readonly defaultRegistryUrls = ['https://bitbucket.org']; + static readonly releaseTimestampSupport = true; + static readonly releaseTimestampNote = + 'The release timestamp is determined from the `date` field in the results.'; + static readonly sourceUrlSupport = 'package'; + static readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + static readonly cacheNamespace: PackageCacheNamespace = `datasource-${BitbucketTagsDatasource.id}`; constructor() { diff --git a/lib/modules/datasource/cdnjs/index.ts b/lib/modules/datasource/cdnjs/index.ts index 6a142235e97fe3..daf17b6961b725 100644 --- a/lib/modules/datasource/cdnjs/index.ts +++ b/lib/modules/datasource/cdnjs/index.ts @@ -28,6 +28,10 @@ export class CdnJsDatasource extends Datasource { override readonly defaultRegistryUrls = ['https://api.cdnjs.com/']; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `repository` field in the results.'; + @cache({ namespace: `datasource-${CdnJsDatasource.id}`, key: ({ packageName }: GetReleasesConfig) => packageName.split('/')[0], diff --git a/lib/modules/datasource/conan/index.ts b/lib/modules/datasource/conan/index.ts index c4a7179b781ae6..2a82502dc00790 100644 --- a/lib/modules/datasource/conan/index.ts +++ b/lib/modules/datasource/conan/index.ts @@ -38,6 +38,10 @@ export class ConanDatasource extends Datasource { githubHttp: GithubHttp; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + '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.'; + constructor(id = ConanDatasource.id) { super(id); this.githubHttp = new GithubHttp(id); diff --git a/lib/modules/datasource/conda/index.ts b/lib/modules/datasource/conda/index.ts index b32cd4de63748b..980eb8de9be103 100644 --- a/lib/modules/datasource/conda/index.ts +++ b/lib/modules/datasource/conda/index.ts @@ -23,6 +23,10 @@ export class CondaDatasource extends Datasource { override readonly caching = true; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `dev_url` field in the results.'; + @cache({ namespace: `datasource-${datasource}`, key: ({ registryUrl, packageName }: GetReleasesConfig) => diff --git a/lib/modules/datasource/cpan/index.ts b/lib/modules/datasource/cpan/index.ts index ee8a808da54bf9..85436a1d925463 100644 --- a/lib/modules/datasource/cpan/index.ts +++ b/lib/modules/datasource/cpan/index.ts @@ -18,6 +18,10 @@ export class CpanDatasource extends Datasource { override readonly defaultVersioning = perlVersioning.id; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `date` field in the results.'; + @cache({ namespace: `datasource-${CpanDatasource.id}`, key: ({ packageName }: GetReleasesConfig) => `${packageName}`, diff --git a/lib/modules/datasource/crate/index.ts b/lib/modules/datasource/crate/index.ts index 4f72d264eeb6f9..24ec9ce47e02c8 100644 --- a/lib/modules/datasource/crate/index.ts +++ b/lib/modules/datasource/crate/index.ts @@ -35,6 +35,10 @@ export class CrateDatasource extends Datasource { static readonly CRATES_IO_API_BASE_URL = 'https://crates.io/api/v1/'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `repository` field in the results.'; + @cache({ namespace: `datasource-${CrateDatasource.id}`, key: ({ registryUrl, packageName }: GetReleasesConfig) => diff --git a/lib/modules/datasource/dart-version/index.ts b/lib/modules/datasource/dart-version/index.ts index a3aa8c45687a51..23f95ccab89124 100644 --- a/lib/modules/datasource/dart-version/index.ts +++ b/lib/modules/datasource/dart-version/index.ts @@ -21,6 +21,10 @@ export class DartVersionDatasource extends Datasource { private readonly channels = ['stable', 'beta', 'dev']; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL: https://github.com/dart-lang/sdk.'; + async getReleases({ registryUrl, }: GetReleasesConfig): Promise { diff --git a/lib/modules/datasource/dart/index.ts b/lib/modules/datasource/dart/index.ts index 30da6a53c23e5c..88e549cfeb8903 100644 --- a/lib/modules/datasource/dart/index.ts +++ b/lib/modules/datasource/dart/index.ts @@ -15,6 +15,13 @@ export class DartDatasource extends Datasource { override readonly defaultRegistryUrls = ['https://pub.dartlang.org/']; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `published` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `repository` field of the latest release object in the results.'; + async getReleases({ packageName, registryUrl, diff --git a/lib/modules/datasource/datasource.ts b/lib/modules/datasource/datasource.ts index 2d88417201d244..fce559644110b4 100644 --- a/lib/modules/datasource/datasource.ts +++ b/lib/modules/datasource/datasource.ts @@ -6,6 +6,7 @@ import type { GetReleasesConfig, RegistryStrategy, ReleaseResult, + SourceUrlSupport, } from './types'; export abstract class Datasource implements DatasourceApi { @@ -25,6 +26,12 @@ export abstract class Datasource implements DatasourceApi { registryStrategy: RegistryStrategy | undefined = 'first'; + releaseTimestampSupport = false; + releaseTimestampNote?: string | undefined; + + sourceUrlSupport: SourceUrlSupport = 'none'; + sourceUrlNote?: string | undefined; + protected http: Http; abstract getReleases( diff --git a/lib/modules/datasource/deno/index.ts b/lib/modules/datasource/deno/index.ts index 425cf975c065f7..e396c3b7d8a8b4 100644 --- a/lib/modules/datasource/deno/index.ts +++ b/lib/modules/datasource/deno/index.ts @@ -22,6 +22,13 @@ export class DenoDatasource extends Datasource { override readonly defaultRegistryUrls = ['https://apiland.deno.dev']; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `uploaded_at` field in the results.'; + override readonly sourceUrlSupport = 'release'; + override readonly sourceUrlNote = + 'The source URL is determined from the `repository` field in the results.'; + constructor() { super(DenoDatasource.id); } diff --git a/lib/modules/datasource/docker/index.ts b/lib/modules/datasource/docker/index.ts index a62192581aa4ec..c0266ac7a09a03 100644 --- a/lib/modules/datasource/docker/index.ts +++ b/lib/modules/datasource/docker/index.ts @@ -81,6 +81,13 @@ export class DockerDatasource extends Datasource { override readonly defaultConfig = defaultConfig; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `tag_last_pushed` field in thre results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `org.opencontainers.image.source` and `org.label-schema.vcs-url` labels present in the metadata of the **latest stable** image found on the Docker registry.'; + constructor() { super(DockerDatasource.id); } diff --git a/lib/modules/datasource/dotnet-version/index.ts b/lib/modules/datasource/dotnet-version/index.ts index c7051630d6223c..f5a799dc5f123f 100644 --- a/lib/modules/datasource/dotnet-version/index.ts +++ b/lib/modules/datasource/dotnet-version/index.ts @@ -23,6 +23,13 @@ export class DotnetVersionDatasource extends Datasource { 'https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/releases-index.json', ]; + override releaseTimestampSupport = true; + override releaseTimestampNote = + 'The release timestamp is determined from the `release-date` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL https://github.com/dotnet/sdk for the `dotnet-sdk` package and, the https://github.com/dotnet/runtime URL for the `dotnet-runtime` package.'; + @cache({ namespace: `datasource-${DotnetVersionDatasource.id}`, key: ({ packageName }: GetReleasesConfig) => packageName, diff --git a/lib/modules/datasource/endoflife-date/index.ts b/lib/modules/datasource/endoflife-date/index.ts index 036a9f3e719635..630129d977ba99 100644 --- a/lib/modules/datasource/endoflife-date/index.ts +++ b/lib/modules/datasource/endoflife-date/index.ts @@ -14,6 +14,10 @@ export class EndoflifeDatePackagesource extends Datasource { override readonly caching = true; override readonly defaultVersioning = 'loose'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `releaseDate` field in the results.'; + constructor() { super(EndoflifeDatePackagesource.id); } diff --git a/lib/modules/datasource/flutter-version/index.ts b/lib/modules/datasource/flutter-version/index.ts index bead276e7a3f48..46dd2ce47e8d44 100644 --- a/lib/modules/datasource/flutter-version/index.ts +++ b/lib/modules/datasource/flutter-version/index.ts @@ -21,6 +21,13 @@ export class FlutterVersionDatasource extends Datasource { override readonly defaultVersioning = semverId; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `release_date` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL: https://github.com/flutter/flutter.'; + async getReleases({ registryUrl, }: GetReleasesConfig): Promise { diff --git a/lib/modules/datasource/galaxy-collection/index.ts b/lib/modules/datasource/galaxy-collection/index.ts index 3fd7e63ace7b37..ec109bc450a7a5 100644 --- a/lib/modules/datasource/galaxy-collection/index.ts +++ b/lib/modules/datasource/galaxy-collection/index.ts @@ -28,6 +28,15 @@ export class GalaxyCollectionDatasource extends Datasource { override readonly defaultVersioning = pep440Versioning.id; + override readonly releaseTimestampSupport = true; + override releaseTimestampNote = + 'The release timestamp is determined from the `created_at` field in the results.'; + // sourceUrl is returned in each release as well as the ReleaseResult + // the one present in release result is the sourceUrl of the latest release + override readonly sourceUrlSupport = 'release'; + override readonly sourceUrlNote = + 'The `sourceUrl` is determined from the `repository` field in the results.'; + @cache({ namespace: `datasource-${GalaxyCollectionDatasource.id}`, key: ({ packageName }: GetReleasesConfig) => packageName, diff --git a/lib/modules/datasource/galaxy/index.ts b/lib/modules/datasource/galaxy/index.ts index 698d9ede78f73c..64e0412f51cc2b 100644 --- a/lib/modules/datasource/galaxy/index.ts +++ b/lib/modules/datasource/galaxy/index.ts @@ -19,6 +19,13 @@ export class GalaxyDatasource extends Datasource { override readonly defaultVersioning = pep440Versioning.id; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `created` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `github_user` and `github_repo` fields in the results.'; + @cache({ namespace: 'datasource-galaxy', key: (getReleasesConfig: GetReleasesConfig) => diff --git a/lib/modules/datasource/git-refs/index.ts b/lib/modules/datasource/git-refs/index.ts index b4543c164926b7..a5271f9e02c68a 100644 --- a/lib/modules/datasource/git-refs/index.ts +++ b/lib/modules/datasource/git-refs/index.ts @@ -17,6 +17,10 @@ export class GitRefsDatasource extends GitDatasource { override readonly customRegistrySupport = false; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + @cache({ namespace: `datasource-${GitRefsDatasource.id}`, key: ({ packageName }: GetReleasesConfig) => packageName, diff --git a/lib/modules/datasource/git-tags/index.ts b/lib/modules/datasource/git-tags/index.ts index 09f084d09b345e..d5300c7ba4ba63 100644 --- a/lib/modules/datasource/git-tags/index.ts +++ b/lib/modules/datasource/git-tags/index.ts @@ -11,6 +11,9 @@ export class GitTagsDatasource extends GitDatasource { } override readonly customRegistrySupport = false; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; @cache({ namespace: `datasource-${GitTagsDatasource.id}`, diff --git a/lib/modules/datasource/gitea-releases/index.ts b/lib/modules/datasource/gitea-releases/index.ts index 66d41f61c11ca9..a2febc4d922b28 100644 --- a/lib/modules/datasource/gitea-releases/index.ts +++ b/lib/modules/datasource/gitea-releases/index.ts @@ -16,6 +16,13 @@ export class GiteaReleasesDatasource extends Datasource { private static readonly cacheNamespace: PackageCacheNamespace = `datasource-${GiteaReleasesDatasource.id}`; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `published_at` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + constructor() { super(GiteaReleasesDatasource.id); } diff --git a/lib/modules/datasource/gitea-tags/index.ts b/lib/modules/datasource/gitea-tags/index.ts index d177a50f560e41..fb893b0c33c59a 100644 --- a/lib/modules/datasource/gitea-tags/index.ts +++ b/lib/modules/datasource/gitea-tags/index.ts @@ -16,6 +16,13 @@ export class GiteaTagsDatasource extends Datasource { private static readonly cacheNamespace: PackageCacheNamespace = `datasource-${GiteaTagsDatasource.id}`; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `created` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + constructor() { super(GiteaTagsDatasource.id); } diff --git a/lib/modules/datasource/github-release-attachments/index.ts b/lib/modules/datasource/github-release-attachments/index.ts index d79242124e5acb..da41d74df40512 100644 --- a/lib/modules/datasource/github-release-attachments/index.ts +++ b/lib/modules/datasource/github-release-attachments/index.ts @@ -38,6 +38,14 @@ export class GithubReleaseAttachmentsDatasource extends Datasource { override http: GithubHttp; + override readonly releaseTimestampSupport = true; + // Note: not sure + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `releaseTimestamp` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + constructor() { super(GithubReleaseAttachmentsDatasource.id); this.http = new GithubHttp(GithubReleaseAttachmentsDatasource.id); @@ -222,7 +230,7 @@ export class GithubReleaseAttachmentsDatasource extends Datasource { } /** - * This function can be used to fetch releases with a customisable versioning + * This function can be used to fetch releases with a customizable versioning * (e.g. semver) and with releases. * * This function will: diff --git a/lib/modules/datasource/github-releases/index.ts b/lib/modules/datasource/github-releases/index.ts index b13d0e15000eed..1963f34f4089bd 100644 --- a/lib/modules/datasource/github-releases/index.ts +++ b/lib/modules/datasource/github-releases/index.ts @@ -21,6 +21,14 @@ export class GithubReleasesDatasource extends Datasource { override http: GithubHttp; + override readonly releaseTimestampSupport = true; + // Note: not sure + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `releaseTimestamp` field from the response.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + constructor() { super(GithubReleasesDatasource.id); this.http = new GithubHttp(GithubReleasesDatasource.id); diff --git a/lib/modules/datasource/github-runners/index.ts b/lib/modules/datasource/github-runners/index.ts index 9cf3722dc3b430..d77eda75b178f3 100644 --- a/lib/modules/datasource/github-runners/index.ts +++ b/lib/modules/datasource/github-runners/index.ts @@ -5,6 +5,10 @@ import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; export class GithubRunnersDatasource extends Datasource { static readonly id = 'github-runners'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL: https://github.com/actions/runner-images.'; + /** * Only add stable runners to the datasource. See datasource readme for details. */ diff --git a/lib/modules/datasource/github-tags/index.ts b/lib/modules/datasource/github-tags/index.ts index 328374cb91db5d..0fdca9b6b3020d 100644 --- a/lib/modules/datasource/github-tags/index.ts +++ b/lib/modules/datasource/github-tags/index.ts @@ -20,6 +20,14 @@ export class GithubTagsDatasource extends Datasource { override readonly registryStrategy = 'hunt'; + override readonly releaseTimestampSupport = true; + // Note: not sure + override readonly releaseTimestampNote = + 'The get release timestamp is determined from the `releaseTimestamp` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + override http: GithubHttp; constructor() { diff --git a/lib/modules/datasource/gitlab-packages/index.ts b/lib/modules/datasource/gitlab-packages/index.ts index e30bc997a3e0c3..28d0483aae5069 100644 --- a/lib/modules/datasource/gitlab-packages/index.ts +++ b/lib/modules/datasource/gitlab-packages/index.ts @@ -19,6 +19,10 @@ export class GitlabPackagesDatasource extends Datasource { override defaultRegistryUrls = ['https://gitlab.com']; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `created_at` field in the results.'; + constructor() { super(datasource); this.http = new GitlabHttp(datasource); diff --git a/lib/modules/datasource/gitlab-releases/index.ts b/lib/modules/datasource/gitlab-releases/index.ts index a6458d35e02ff2..54ba562796a795 100644 --- a/lib/modules/datasource/gitlab-releases/index.ts +++ b/lib/modules/datasource/gitlab-releases/index.ts @@ -11,6 +11,13 @@ export class GitlabReleasesDatasource extends Datasource { static readonly registryStrategy = 'first'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `released_at` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + constructor() { super(GitlabReleasesDatasource.id); this.http = new GitlabHttp(GitlabReleasesDatasource.id); diff --git a/lib/modules/datasource/gitlab-tags/index.ts b/lib/modules/datasource/gitlab-tags/index.ts index d1317c5f803569..247b4d5e69bfe8 100644 --- a/lib/modules/datasource/gitlab-tags/index.ts +++ b/lib/modules/datasource/gitlab-tags/index.ts @@ -12,6 +12,13 @@ export class GitlabTagsDatasource extends Datasource { protected override http: GitlabHttp; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'To get release timestamp we use the `created_at` field from the response.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined by using the `packageName` and `registryUrl`.'; + constructor() { super(GitlabTagsDatasource.id); this.http = new GitlabHttp(GitlabTagsDatasource.id); diff --git a/lib/modules/datasource/go/index.ts b/lib/modules/datasource/go/index.ts index 15d87556c86140..a3abb57cf753b9 100644 --- a/lib/modules/datasource/go/index.ts +++ b/lib/modules/datasource/go/index.ts @@ -31,6 +31,13 @@ export class GoDatasource extends Datasource { override readonly customRegistrySupport = false; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'If the release timestamp is not returned from the respective datasoure used to fetch the releases, then Renovate uses the `Time` field in the results instead.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `packageName` and `registryUrl`.'; + readonly goproxy = new GoProxyDatasource(); readonly direct = new GoDirectDatasource(); @@ -51,7 +58,7 @@ export class GoDatasource extends Datasource { * go.getDigest * * This datasource resolves a go module URL into its source repository - * and then fetches the digest it if it is on GitHub. + * and then fetches the digest if it is on GitHub. * * This function will: * - Determine the source URL for the module diff --git a/lib/modules/datasource/golang-version/index.ts b/lib/modules/datasource/golang-version/index.ts index 79e907f3418136..65e7d9b87b37c3 100644 --- a/lib/modules/datasource/golang-version/index.ts +++ b/lib/modules/datasource/golang-version/index.ts @@ -32,6 +32,13 @@ export class GolangVersionDatasource extends Datasource { override readonly defaultVersioning = semverVersioningId; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `Date` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL: https://github.com/golang/go.'; + @cache({ namespace: `datasource-${GolangVersionDatasource.id}`, key: 'all' }) async getReleases({ registryUrl, diff --git a/lib/modules/datasource/gradle-version/index.ts b/lib/modules/datasource/gradle-version/index.ts index 069b51f7190a77..bb6368e19803f1 100644 --- a/lib/modules/datasource/gradle-version/index.ts +++ b/lib/modules/datasource/gradle-version/index.ts @@ -20,6 +20,13 @@ export class GradleVersionDatasource extends Datasource { override readonly registryStrategy = 'merge'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `buildTime` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL: https://github.com/gradle/gradle.'; + private static readonly buildTimeRegex = regEx( '^(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\+\\d\\d\\d\\d)$', ); diff --git a/lib/modules/datasource/helm/index.ts b/lib/modules/datasource/helm/index.ts index ada0c21779c1b8..e5ccc32b5113d1 100644 --- a/lib/modules/datasource/helm/index.ts +++ b/lib/modules/datasource/helm/index.ts @@ -25,6 +25,13 @@ export class HelmDatasource extends Datasource { override readonly defaultVersioning = helmVersioning.id; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timstamp is determined from the `created` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `home` field or the `sources` field in the results.'; + @cache({ namespace: `datasource-${HelmDatasource.id}`, key: (helmRepository: string) => helmRepository, diff --git a/lib/modules/datasource/hermit/index.ts b/lib/modules/datasource/hermit/index.ts index 4db90e81b975ec..167c1544e64a2a 100644 --- a/lib/modules/datasource/hermit/index.ts +++ b/lib/modules/datasource/hermit/index.ts @@ -30,6 +30,10 @@ export class HermitDatasource extends Datasource { 'https://github.com/cashapp/hermit-packages', ]; + override readonly sourceUrlSupport = 'release'; + override readonly sourceUrlNote = + 'The source URL is determined from the `Repository` field in the results.'; + pathRegex: RegExp; constructor() { diff --git a/lib/modules/datasource/hex/index.ts b/lib/modules/datasource/hex/index.ts index e6ee7d927cc364..c21b87785402ee 100644 --- a/lib/modules/datasource/hex/index.ts +++ b/lib/modules/datasource/hex/index.ts @@ -18,6 +18,13 @@ export class HexDatasource extends Datasource { override readonly defaultVersioning = hexVersioning.id; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined the `inserted_at` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `Github` field in the results.'; + @cache({ namespace: `datasource-${HexDatasource.id}`, key: ({ packageName }: GetReleasesConfig) => packageName, diff --git a/lib/modules/datasource/hexpm-bob/index.ts b/lib/modules/datasource/hexpm-bob/index.ts index 5d1f0a89ee1086..c841f26e9a38d4 100644 --- a/lib/modules/datasource/hexpm-bob/index.ts +++ b/lib/modules/datasource/hexpm-bob/index.ts @@ -24,6 +24,13 @@ export class HexpmBobDatasource extends Datasource { override readonly defaultVersioning = semverId; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `buildDate` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL https://github.com/elixir-lang/elixir.git for the `elixir` package and the https://github.com/erlang/otp.git URL for the `erlang` package.'; + @cache({ namespace: `datasource-${datasource}`, key: ({ registryUrl, packageName }: GetReleasesConfig) => diff --git a/lib/modules/datasource/jenkins-plugins/index.ts b/lib/modules/datasource/jenkins-plugins/index.ts index a19ead3bb18e33..28cbca46d5831d 100644 --- a/lib/modules/datasource/jenkins-plugins/index.ts +++ b/lib/modules/datasource/jenkins-plugins/index.ts @@ -25,6 +25,13 @@ export class JenkinsPluginsDatasource extends Datasource { private static readonly packageInfoPath = 'current/update-center.actual.json'; private static readonly packageVersionsPath = 'current/plugin-versions.json'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The releaseTimestamp is determined from the `releaseTimestamp` or `buildDate` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `scm` field in the results.'; + async getReleases({ packageName, registryUrl, diff --git a/lib/modules/datasource/maven/index.ts b/lib/modules/datasource/maven/index.ts index 259ce3e2ce573f..3232823257c48e 100644 --- a/lib/modules/datasource/maven/index.ts +++ b/lib/modules/datasource/maven/index.ts @@ -69,6 +69,13 @@ export class MavenDatasource extends Datasource { override readonly registryStrategy: RegistryStrategy = 'merge'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `Last-Modified` header or the `lastModified` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `scm` tags in the results.'; + constructor(id = MavenDatasource.id) { super(id); } diff --git a/lib/modules/datasource/node-version/index.ts b/lib/modules/datasource/node-version/index.ts index 9e234bb68dc02c..c37c707c32cabf 100644 --- a/lib/modules/datasource/node-version/index.ts +++ b/lib/modules/datasource/node-version/index.ts @@ -19,6 +19,13 @@ export class NodeVersionDatasource extends Datasource { override readonly caching = true; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `date` field.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL: https://github.com/nodejs/node'; + @cache({ namespace: `datasource-${datasource}`, // TODO: types (#22198) diff --git a/lib/modules/datasource/npm/index.ts b/lib/modules/datasource/npm/index.ts index 84795f0f7bc14f..65a4df8c1b8d7a 100644 --- a/lib/modules/datasource/npm/index.ts +++ b/lib/modules/datasource/npm/index.ts @@ -14,6 +14,13 @@ export class NpmDatasource extends Datasource { override readonly defaultVersioning = npmVersioning.id; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `time` field in the results.'; + override readonly sourceUrlSupport = 'release'; + override readonly sourceUrlNote = + 'The source URL is determined from the `repository` field in the results.'; + constructor() { super(NpmDatasource.id); } diff --git a/lib/modules/datasource/nuget/index.ts b/lib/modules/datasource/nuget/index.ts index 7b18f7010095c9..1307901f72ef36 100644 --- a/lib/modules/datasource/nuget/index.ts +++ b/lib/modules/datasource/nuget/index.ts @@ -18,6 +18,17 @@ export class NugetDatasource extends Datasource { override readonly registryStrategy = 'merge'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = ` + For the v2 API, the release timestamp is determined from the \`Publised\` tag and, + for the v3 API, the release timestamp is determined from the \`published\` field in the results. + `; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = ` + For the v2 API, the source URL is determined from the \`ProjectUrl\` tag and, + for the v3 API, the source URL is determined from the \`metadata.repository@url\` field in the results. + `; + readonly v2Api = new NugetV2Api(); readonly v3Api = new NugetV3Api(); diff --git a/lib/modules/datasource/orb/index.ts b/lib/modules/datasource/orb/index.ts index 98f0a2c7e8cdf4..2f2a1c20a711cd 100644 --- a/lib/modules/datasource/orb/index.ts +++ b/lib/modules/datasource/orb/index.ts @@ -29,6 +29,10 @@ export class OrbDatasource extends Datasource { override readonly defaultRegistryUrls = ['https://circleci.com/']; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `createdAt` field in the results.'; + @cache({ namespace: `datasource-${OrbDatasource.id}`, key: ({ packageName }: GetReleasesConfig) => packageName, diff --git a/lib/modules/datasource/packagist/index.ts b/lib/modules/datasource/packagist/index.ts index 1c4d4719ae717e..f427929c1e3051 100644 --- a/lib/modules/datasource/packagist/index.ts +++ b/lib/modules/datasource/packagist/index.ts @@ -32,6 +32,14 @@ export class PackagistDatasource extends Datasource { override readonly registryStrategy = 'hunt'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `time` field in the results.'; + // Note: this can be changed to 'release', as the source is present in each release but we remove it while processing + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from `source` field in the results.'; + // We calculate auth at this datasource layer so that we can know whether it's safe to cache or not private static getHostOpts(url: string): HttpOptions { const { username, password } = hostRules.find({ diff --git a/lib/modules/datasource/puppet-forge/index.ts b/lib/modules/datasource/puppet-forge/index.ts index fed7e182eca36e..f656f4d5faad79 100644 --- a/lib/modules/datasource/puppet-forge/index.ts +++ b/lib/modules/datasource/puppet-forge/index.ts @@ -12,6 +12,10 @@ export class PuppetForgeDatasource extends Datasource { override readonly defaultRegistryUrls = [PUPPET_FORGE]; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `created_at` field from the response.'; + async getReleases({ packageName, registryUrl, @@ -50,6 +54,7 @@ export class PuppetForgeDatasource extends Datasource { ): ReleaseResult { const result: ReleaseResult = { releases, + // the homepage url in the fixtures is a github repo, we can use this as sourceUrl homepage: module.homepage_url, }; diff --git a/lib/modules/datasource/pypi/index.ts b/lib/modules/datasource/pypi/index.ts index dd87ed2f23490d..477525bdd48fa5 100644 --- a/lib/modules/datasource/pypi/index.ts +++ b/lib/modules/datasource/pypi/index.ts @@ -31,6 +31,12 @@ export class PypiDatasource extends Datasource { override readonly registryStrategy = 'merge'; + override readonly releaseTimestampNote = + 'The relase timestamp is determined from the `upload_time` field in the results.'; + override readonly sourceUrlSupport = 'release'; + override readonly sourceUrlNote = + 'The source URL is determined from the `homepage` field if it is a github repository, else we use the `project_urls` field.'; + async getReleases({ packageName, registryUrl, diff --git a/lib/modules/datasource/ruby-version/index.ts b/lib/modules/datasource/ruby-version/index.ts index 60fae662e90a5c..7f2a2613c1d6f8 100644 --- a/lib/modules/datasource/ruby-version/index.ts +++ b/lib/modules/datasource/ruby-version/index.ts @@ -20,6 +20,13 @@ export class RubyVersionDatasource extends Datasource { override readonly defaultVersioning = rubyVersioningId; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `release-list` table in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'We use the URL: https://github.com/ruby/ruby.'; + @cache({ namespace: `datasource-${RubyVersionDatasource.id}`, key: 'all' }) async getReleases({ registryUrl, diff --git a/lib/modules/datasource/rubygems/index.ts b/lib/modules/datasource/rubygems/index.ts index 58833d513b67dc..942bfd6395bc97 100644 --- a/lib/modules/datasource/rubygems/index.ts +++ b/lib/modules/datasource/rubygems/index.ts @@ -47,6 +47,13 @@ export class RubyGemsDatasource extends Datasource { private readonly versionsEndpointCache: VersionsEndpointCache; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `created_at` field in the results.'; + override readonly sourceUrlSupport = 'release'; + override readonly sourceUrlNote = + 'The source URL is determined from the `source_code_uri` field in the results.'; + @cache({ namespace: `datasource-${RubyGemsDatasource.id}`, key: ({ packageName, registryUrl }: GetReleasesConfig) => diff --git a/lib/modules/datasource/sbt-package/index.ts b/lib/modules/datasource/sbt-package/index.ts index c0b83d6c950146..b714aae786c7b6 100644 --- a/lib/modules/datasource/sbt-package/index.ts +++ b/lib/modules/datasource/sbt-package/index.ts @@ -24,6 +24,10 @@ export class SbtPackageDatasource extends MavenDatasource { override readonly registryStrategy = 'hunt'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `scm` tags in the results.'; + constructor(id = SbtPackageDatasource.id) { super(id); this.http = new Http('sbt'); diff --git a/lib/modules/datasource/sbt-plugin/index.ts b/lib/modules/datasource/sbt-plugin/index.ts index 8fd574e56d227e..1d4c18a6ab039a 100644 --- a/lib/modules/datasource/sbt-plugin/index.ts +++ b/lib/modules/datasource/sbt-plugin/index.ts @@ -23,6 +23,10 @@ export class SbtPluginDatasource extends SbtPackageDatasource { override readonly defaultVersioning = ivyVersioning.id; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the `scm` tags in the results.'; + constructor() { super(SbtPluginDatasource.id); this.http = new Http('sbt'); diff --git a/lib/modules/datasource/terraform-module/index.ts b/lib/modules/datasource/terraform-module/index.ts index fe89239f194926..4e3b25e4bfd3ec 100644 --- a/lib/modules/datasource/terraform-module/index.ts +++ b/lib/modules/datasource/terraform-module/index.ts @@ -25,6 +25,13 @@ export class TerraformModuleDatasource extends TerraformDatasource { override readonly defaultVersioning = hashicorpVersioning.id; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is only supported for the latest version, and is determined from the `published_at` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the the `source` field in the results.'; + readonly extendedApiRegistryUrls = [ 'https://registry.terraform.io', 'https://app.terraform.io', @@ -32,7 +39,7 @@ export class TerraformModuleDatasource extends TerraformDatasource { /** * This function will fetch a package from the specified Terraform registry and return all semver versions. - * - `sourceUrl` is supported of "source" field is set + * - `sourceUrl` is supported if "source" field is set * - `homepage` is set to the Terraform registry's page if it's on the official main registry */ @cache({ diff --git a/lib/modules/datasource/terraform-provider/index.ts b/lib/modules/datasource/terraform-provider/index.ts index d52a78198b1652..56c78a7522b68b 100644 --- a/lib/modules/datasource/terraform-provider/index.ts +++ b/lib/modules/datasource/terraform-provider/index.ts @@ -42,6 +42,13 @@ export class TerraformProviderDatasource extends TerraformDatasource { override readonly registryStrategy = 'hunt'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is only supported for the latest version, and is determined from the `published_at` field in the results.'; + override readonly sourceUrlSupport = 'package'; + override readonly sourceUrlNote = + 'The source URL is determined from the the `source` field in the results.'; + @cache({ namespace: `datasource-${TerraformProviderDatasource.id}`, key: (getReleasesConfig: GetReleasesConfig) => diff --git a/lib/modules/datasource/types.ts b/lib/modules/datasource/types.ts index 196d9335657da7..98f6279ebb2101 100644 --- a/lib/modules/datasource/types.ts +++ b/lib/modules/datasource/types.ts @@ -91,7 +91,7 @@ export interface ReleaseResult { } export type RegistryStrategy = 'first' | 'hunt' | 'merge'; - +export type SourceUrlSupport = 'package' | 'release' | 'none'; export interface DatasourceApi extends ModuleApi { id: string; getDigest?(config: DigestConfig, newValue?: string): Promise; @@ -113,6 +113,24 @@ export interface DatasourceApi extends ModuleApi { */ customRegistrySupport: boolean; + /** + * Whether release timestamp can be returned. + */ + releaseTimestampSupport: boolean; + /** + * Notes on how release timestamp is determined. + */ + releaseTimestampNote?: string; + + /** + * Whether sourceURL can be returned. + */ + sourceUrlSupport: SourceUrlSupport; + /** + * Notes on how sourceURL is determined. + */ + sourceUrlNote?: string; + /** * Whether to perform caching in the datasource index/wrapper or not. * true: datasoure index wrapper should cache all results (based on registryUrl/packageName) diff --git a/lib/modules/datasource/unity3d/index.ts b/lib/modules/datasource/unity3d/index.ts index c07b9f66db2fee..24298d4a6c5e90 100644 --- a/lib/modules/datasource/unity3d/index.ts +++ b/lib/modules/datasource/unity3d/index.ts @@ -24,6 +24,10 @@ export class Unity3dDatasource extends Datasource { override readonly registryStrategy = 'merge'; + override readonly releaseTimestampSupport = true; + override readonly releaseTimestampNote = + 'The release timestamp is determined from the `pubDate` tag in the results.'; + constructor() { super(Unity3dDatasource.id); }