From 9e28ef32752536501af3fbff8a63ccbe5343591c Mon Sep 17 00:00:00 2001 From: RahulGautamSingh <rahultesnik@gmail.com> Date: Thu, 16 Jun 2022 16:30:11 +0530 Subject: [PATCH] refactor: redefine defaultRegistryUrls (#15856) Co-authored-by: Rhys Arkins <rhys@arkins.net> Co-authored-by: Michael Kriese <michael.kriese@visualon.de> --- lib/modules/datasource/datasource.ts | 2 +- lib/modules/datasource/index.spec.ts | 65 ++++++++++++++++++++++++++++ lib/modules/datasource/index.ts | 7 ++- lib/modules/datasource/types.ts | 2 +- 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/lib/modules/datasource/datasource.ts b/lib/modules/datasource/datasource.ts index eb9ffa1ce8..3d7fa807a3 100644 --- a/lib/modules/datasource/datasource.ts +++ b/lib/modules/datasource/datasource.ts @@ -19,7 +19,7 @@ export abstract class Datasource implements DatasourceApi { defaultConfig: Record<string, unknown> | undefined; - defaultRegistryUrls: string[] | undefined; + defaultRegistryUrls?: string[] | (() => string[]); defaultVersioning: string | undefined; diff --git a/lib/modules/datasource/index.spec.ts b/lib/modules/datasource/index.spec.ts index c2054c683a..ace1cba910 100644 --- a/lib/modules/datasource/index.spec.ts +++ b/lib/modules/datasource/index.spec.ts @@ -43,6 +43,47 @@ class DummyDatasource extends Datasource { } } +class DummyDatasource2 extends Datasource { + override defaultRegistryUrls = function () { + return ['https://reg1.com']; + }; + + constructor(private registriesMock: RegistriesMock = defaultRegistriesMock) { + super(datasource); + } + + override getReleases({ + registryUrl, + }: GetReleasesConfig): Promise<ReleaseResult | null> { + const fn = this.registriesMock[registryUrl]; + if (typeof fn === 'function') { + return Promise.resolve(fn()); + } + return Promise.resolve(fn ?? null); + } +} + +class DummyDatasource3 extends Datasource { + override customRegistrySupport = false; + override defaultRegistryUrls = function () { + return ['https://reg1.com']; + }; + + constructor(private registriesMock: RegistriesMock = defaultRegistriesMock) { + super(datasource); + } + + override getReleases({ + registryUrl, + }: GetReleasesConfig): Promise<ReleaseResult | null> { + const fn = this.registriesMock[registryUrl]; + if (typeof fn === 'function') { + return Promise.resolve(fn()); + } + return Promise.resolve(fn ?? null); + } +} + jest.mock('./metadata-manual', () => ({ manualChangelogUrls: { dummy: { @@ -212,6 +253,30 @@ describe('modules/datasource/index', () => { expect(res).toMatchObject({ releases: [{ version: '0.0.1' }] }); }); + it('defaultRegistryUrls function works', async () => { + datasources.set(datasource, new DummyDatasource2()); + const res = await getPkgReleases({ + datasource, + depName, + }); + expect(res).toMatchObject({ + releases: [{ version: '1.2.3' }], + registryUrl: 'https://reg1.com', + }); + }); + + it('defaultRegistryUrls function with customRegistrySupport works', async () => { + datasources.set(datasource, new DummyDatasource3()); + const res = await getPkgReleases({ + datasource, + depName, + }); + expect(res).toMatchObject({ + releases: [{ version: '1.2.3' }], + registryUrl: 'https://reg1.com', + }); + }); + it('applies extractVersion', async () => { const registries: RegistriesMock = { 'https://reg1.com': { diff --git a/lib/modules/datasource/index.ts b/lib/modules/datasource/index.ts index b55b1c2e1a..ece88626ad 100644 --- a/lib/modules/datasource/index.ts +++ b/lib/modules/datasource/index.ts @@ -209,7 +209,9 @@ function resolveRegistryUrls( 'Custom registries are not allowed for this datasource and will be ignored' ); } - return datasource.defaultRegistryUrls ?? []; + return is.function_(datasource.defaultRegistryUrls) + ? datasource.defaultRegistryUrls() + : datasource.defaultRegistryUrls ?? []; } const customUrls = registryUrls?.filter(Boolean); let resolvedUrls: string[] = []; @@ -218,6 +220,9 @@ function resolveRegistryUrls( } else if (is.nonEmptyArray(defaultRegistryUrls)) { resolvedUrls = [...defaultRegistryUrls]; resolvedUrls.concat(additionalRegistryUrls ?? []); + } else if (is.function_(datasource.defaultRegistryUrls)) { + resolvedUrls = [...datasource.defaultRegistryUrls()]; + resolvedUrls.concat(additionalRegistryUrls ?? []); } else if (is.nonEmptyArray(datasource.defaultRegistryUrls)) { resolvedUrls = [...datasource.defaultRegistryUrls]; resolvedUrls.concat(additionalRegistryUrls ?? []); diff --git a/lib/modules/datasource/types.ts b/lib/modules/datasource/types.ts index be5e106ec0..867c8829f1 100644 --- a/lib/modules/datasource/types.ts +++ b/lib/modules/datasource/types.ts @@ -76,7 +76,7 @@ export interface DatasourceApi extends ModuleApi { id: string; getDigest?(config: DigestConfig, newValue?: string): Promise<string | null>; getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null>; - defaultRegistryUrls?: string[]; + defaultRegistryUrls?: string[] | (() => string[]); defaultVersioning?: string; defaultConfig?: Record<string, unknown>; -- GitLab