diff --git a/lib/modules/datasource/datasource.ts b/lib/modules/datasource/datasource.ts index 95d6abf947b9bc7ef358ba6b0c4e964ccaa8cd6e..a035be994a73bf1fce593d933f6ef7019eb71b49 100644 --- a/lib/modules/datasource/datasource.ts +++ b/lib/modules/datasource/datasource.ts @@ -1,6 +1,5 @@ import { ExternalHostError } from '../../types/errors/external-host-error'; -import { Http } from '../../util/http'; -import type { HttpError } from '../../util/http'; +import { Http, HttpError } from '../../util/http'; import type { DatasourceApi, DigestConfig, @@ -35,22 +34,29 @@ export abstract class Datasource implements DatasourceApi { getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>; // eslint-disable-next-line @typescript-eslint/no-empty-function - handleSpecificErrors(err: HttpError): void {} + handleHttpErrors(err: HttpError): void {} - protected handleGenericErrors(err: HttpError): never { + protected handleGenericErrors(err: Error): never { // istanbul ignore if: not easy testable with nock if (err instanceof ExternalHostError) { throw err; } - this.handleSpecificErrors(err); - if (err.response?.statusCode !== undefined) { - if ( - err.response?.statusCode === 429 || - (err.response?.statusCode >= 500 && err.response?.statusCode < 600) - ) { - throw new ExternalHostError(err); + + if (err instanceof HttpError) { + this.handleHttpErrors(err); + + const statusCode = err.response?.statusCode; + if (statusCode) { + if (statusCode === 429) { + throw new ExternalHostError(err); + } + + if (statusCode >= 500 && statusCode < 600) { + throw new ExternalHostError(err); + } } } + throw err; } } diff --git a/lib/modules/datasource/ruby-version/index.spec.ts b/lib/modules/datasource/ruby-version/index.spec.ts index 5b082be7e54a45b8f4d7a7cf27a8ca80dccaf869..b020219607ec8c1d2ece44ef8c205e6609f364bb 100644 --- a/lib/modules/datasource/ruby-version/index.spec.ts +++ b/lib/modules/datasource/ruby-version/index.spec.ts @@ -19,14 +19,16 @@ describe('modules/datasource/ruby-version/index', () => { expect(res).toMatchSnapshot(); }); - it('throws for empty result', async () => { + it('returns null for empty result', async () => { httpMock .scope('https://www.ruby-lang.org') .get('/en/downloads/releases/') .reply(200, {}); - await expect( - getPkgReleases({ datasource, packageName: 'ruby' }) - ).rejects.toThrow(); + const res = await getPkgReleases({ + datasource, + packageName: 'ruby', + }); + expect(res).toBeNull(); }); it('throws for 404', async () => { diff --git a/lib/modules/datasource/ruby-version/index.ts b/lib/modules/datasource/ruby-version/index.ts index ac155f6bdb5ba9557034ca9c6b493fbd9eaf709b..d403681cd9257ffad87602953b8690099a9e960b 100644 --- a/lib/modules/datasource/ruby-version/index.ts +++ b/lib/modules/datasource/ruby-version/index.ts @@ -1,3 +1,4 @@ +import { logger } from '../../../logger'; import { ExternalHostError } from '../../../types/errors/external-host-error'; import { cache } from '../../../util/cache/package/decorator'; import { parse } from '../../../util/html'; @@ -53,7 +54,8 @@ export class RubyVersionDatasource extends Datasource { } }); if (!res.releases.length) { - throw new Error('Missing ruby releases'); + logger.warn({ registryUrl }, 'Missing ruby releases'); + return null; } } catch (err) { this.handleGenericErrors(err); @@ -62,7 +64,7 @@ export class RubyVersionDatasource extends Datasource { return res; } - override handleSpecificErrors(err: HttpError): never | void { + override handleHttpErrors(err: HttpError): never | void { throw new ExternalHostError(err); } } diff --git a/lib/modules/datasource/terraform-module/base.ts b/lib/modules/datasource/terraform-module/base.ts index 1b8ac098e49f86f10e752e40e579e3a58144f189..405b6dcc501ab85fd49cf31298ca43609a150cbd 100644 --- a/lib/modules/datasource/terraform-module/base.ts +++ b/lib/modules/datasource/terraform-module/base.ts @@ -29,7 +29,7 @@ export abstract class TerraformDatasource extends Datasource { return `${ensureTrailingSlash(registryUrl)}.well-known/terraform.json`; } - override handleSpecificErrors(err: HttpError): void { + override handleHttpErrors(err: HttpError): void { const failureCodes = ['EAI_AGAIN']; // istanbul ignore if if (failureCodes.includes(err.code)) {