diff --git a/lib/modules/datasource/github-tags/index.spec.ts b/lib/modules/datasource/github-tags/index.spec.ts index 5ac69faabf8eac4a1b15dcde52104edf048c0864..b5d5931c367802e2e68039a3eab1d6248ae7d8f9 100644 --- a/lib/modules/datasource/github-tags/index.spec.ts +++ b/lib/modules/datasource/github-tags/index.spec.ts @@ -112,6 +112,26 @@ describe('modules/datasource/github-tags/index', () => { hash: 'abc', }, ]); + jest.spyOn(githubGraphql, 'queryReleases').mockResolvedValueOnce([ + { + id: 1, + version: 'v1.0.0', + releaseTimestamp: '2021-01-01', + isStable: true, + url: 'https://example.com', + name: 'some/dep2', + description: 'some description', + }, + { + id: 2, + version: 'v2.0.0', + releaseTimestamp: '2022-01-01', + isStable: false, + url: 'https://example.com', + name: 'some/dep2', + description: 'some description', + }, + ]); const res = await getPkgReleases({ datasource: github.id, depName }); @@ -122,11 +142,13 @@ describe('modules/datasource/github-tags/index', () => { gitRef: 'v1.0.0', version: 'v1.0.0', releaseTimestamp: '2021-01-01T00:00:00.000Z', + isStable: true, }, { gitRef: 'v2.0.0', version: 'v2.0.0', releaseTimestamp: '2022-01-01T00:00:00.000Z', + isStable: false, }, ], diff --git a/lib/modules/datasource/github-tags/index.ts b/lib/modules/datasource/github-tags/index.ts index 52c736c3bab73660965ef627f1097e63859ed5ce..bd98fe78ec463c3da20909d7b0e44ceb5f41b28a 100644 --- a/lib/modules/datasource/github-tags/index.ts +++ b/lib/modules/datasource/github-tags/index.ts @@ -1,9 +1,16 @@ +import is from '@sindresorhus/is'; import { logger } from '../../../logger'; -import { queryTags } from '../../../util/github/graphql'; +import { queryReleases, queryTags } from '../../../util/github/graphql'; +import type { GithubReleaseItem } from '../../../util/github/graphql/types'; import { getApiBaseUrl, getSourceUrl } from '../../../util/github/url'; import { GithubHttp } from '../../../util/http/github'; import { Datasource } from '../datasource'; -import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types'; +import type { + DigestConfig, + GetReleasesConfig, + Release, + ReleaseResult, +} from '../types'; export class GithubTagsDatasource extends Datasource { static readonly id = 'github-tags'; @@ -77,13 +84,37 @@ export class GithubTagsDatasource extends Datasource { ): Promise<ReleaseResult> { const { registryUrl, packageName: repo } = config; const sourceUrl = getSourceUrl(repo, registryUrl); - const tags = await queryTags(config, this.http); - const releases = tags.map(({ version, releaseTimestamp, gitRef }) => ({ - version, - releaseTimestamp, - gitRef, - })); - const dependency: ReleaseResult = { sourceUrl, releases }; + const tagsResult = await queryTags(config, this.http); + const releases: Release[] = tagsResult.map( + ({ version, releaseTimestamp, gitRef }) => ({ + version, + releaseTimestamp, + gitRef, + }) + ); + + try { + // Fetch additional data from releases endpoint when possible + const releasesResult = await queryReleases(config, this.http); + const releasesMap = new Map<string, GithubReleaseItem>(); + for (const release of releasesResult) { + releasesMap.set(release.version, release); + } + + for (const release of releases) { + const isReleaseStable = releasesMap.get(release.version)?.isStable; + if (is.boolean(isReleaseStable)) { + release.isStable = isReleaseStable; + } + } + } catch (err) /* istanbul ignore next */ { + logger.debug({ err }, `Error fetching additional info for GitHub tags`); + } + + const dependency: ReleaseResult = { + sourceUrl, + releases, + }; return dependency; } }