diff --git a/lib/datasource/adoptium-java/index.spec.ts b/lib/datasource/adoptium-java/index.spec.ts index c42add8831cc03f827fda8fb6d33684df1cb3fa8..a04ccb3afd49da6d9eb3476fb8ea13fcf7615906 100644 --- a/lib/datasource/adoptium-java/index.spec.ts +++ b/lib/datasource/adoptium-java/index.spec.ts @@ -39,6 +39,16 @@ describe('datasource/adoptium-java/index', () => { ).toBeNull(); }); + it('returns null for empty result', async () => { + httpMock.scope(defaultRegistryUrl).get(getPath(0)).reply(200, {}); + expect( + await getPkgReleases({ + datasource, + depName, + }) + ).toBeNull(); + }); + it('returns null for empty 200 OK', async () => { httpMock .scope(defaultRegistryUrl) @@ -69,7 +79,7 @@ describe('datasource/adoptium-java/index', () => { depName, }); expect(res).toMatchSnapshot(); - expect(res.releases).toHaveLength(3); + expect(res?.releases).toHaveLength(3); }); it('processes real data (jre)', async () => { @@ -79,16 +89,17 @@ describe('datasource/adoptium-java/index', () => { depName: 'java-jre', }); expect(res).toMatchSnapshot(); - expect(res.releases).toHaveLength(2); + expect(res?.releases).toHaveLength(2); }); it('pages', async () => { + const versions = [...range(1, 50)].map((v: number) => ({ + semver: `1.${v}.0`, + })); httpMock .scope(defaultRegistryUrl) .get(getPath(0)) - .reply(200, { - versions: [...range(1, 50)].map((v) => ({ semver: `1.${v}.0` })), - }) + .reply(200, { versions }) .get(getPath(1)) .reply(404); const res = await getPkgReleases({ @@ -96,7 +107,7 @@ describe('datasource/adoptium-java/index', () => { depName, }); expect(res).toMatchSnapshot(); - expect(res.releases).toHaveLength(50); + expect(res?.releases).toHaveLength(50); }); }); }); diff --git a/lib/datasource/adoptium-java/index.ts b/lib/datasource/adoptium-java/index.ts index e5c0d1752084a080a3fbff9dd5fa40fd3194dc3d..c3f59a4809e9d014fc57a023ae930678d3f08c02 100644 --- a/lib/datasource/adoptium-java/index.ts +++ b/lib/datasource/adoptium-java/index.ts @@ -3,7 +3,7 @@ import { ExternalHostError } from '../../types/errors/external-host-error'; import { cache } from '../../util/cache/package/decorator'; import { HttpError } from '../../util/http/types'; import { Datasource } from '../datasource'; -import type { GetReleasesConfig, ReleaseResult } from '../types'; +import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; import { datasource, defaultRegistryUrl, @@ -25,6 +25,32 @@ export class AdoptiumJavaDatasource extends Datasource { override readonly caching = true; + private async getPageReleases( + url: string, + page: number + ): Promise<Release[] | null> { + const pgUrl = `${url}&page=${page}`; + try { + const pgRes = await this.http.getJson<AdoptiumJavaResponse>(pgUrl); + return ( + pgRes?.body?.versions?.map(({ semver }) => ({ + version: semver, + })) ?? null + ); + } catch (err) { + if ( + page !== 0 && + err instanceof HttpError && + err.response?.statusCode === 404 + ) { + // No more pages + return null; + } + + throw err; + } + } + @cache({ namespace: `datasource-${datasource}`, key: ({ registryUrl, lookupName }: GetReleasesConfig) => @@ -34,7 +60,6 @@ export class AdoptiumJavaDatasource extends Datasource { registryUrl, lookupName, }: GetReleasesConfig): Promise<ReleaseResult | null> { - let page = 0; const imageType = getImageType(lookupName); logger.trace( { registryUrl, lookupName, imageType }, @@ -46,24 +71,20 @@ export class AdoptiumJavaDatasource extends Datasource { homepage: 'https://adoptium.net', releases: [], }; - let resp: AdoptiumJavaResponse; try { - do { - resp = ( - await this.http.getJson<AdoptiumJavaResponse>(`${url}&page=${page}`) - ).body; - result.releases.push( - ...resp.versions.map(({ semver }) => ({ version: semver })) - ); + let page = 0; + let releases = await this.getPageReleases(url, page); + while (releases) { + result.releases.push(...releases); + if (releases.length !== pageSize || page >= 50) { + break; + } page += 1; - } while (page < 50 && resp.versions.length === pageSize); + releases = await this.getPageReleases(url, page); + } } catch (err) { // istanbul ignore else: not testable with nock if (err instanceof HttpError) { - if (err.response?.statusCode === 404 && page > 0) { - // no more pages - return result; - } if (err.response?.statusCode !== 404) { throw new ExternalHostError(err); } diff --git a/tsconfig.strict.json b/tsconfig.strict.json index dd63af38d24872c24fa92befd5b47ff22a3918dd..c23f0583f7084107013b951b5c54ae5e4442f2b8 100644 --- a/tsconfig.strict.json +++ b/tsconfig.strict.json @@ -14,6 +14,7 @@ "lib/data-files.generated.ts", "lib/datasource/**/common.ts", "lib/datasource/**/types.ts", + "lib/datasource/adoptium-java", "lib/datasource/artifactory", "lib/datasource/gitlab-tags/util.ts", "lib/datasource/helm/common.ts", @@ -70,6 +71,7 @@ ], "exclude": [ "lib/constants/platform.spec.ts", + "lib/datasource/adoptium-java/**/*.spec.ts", "lib/datasource/artifactory/**/*.spec.ts", "lib/datasource/docker/common.ts", "lib/datasource/github-releases/common.ts",