From abc1197b859b700066a77a75f9202e3494f10e8b Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Tue, 8 Feb 2022 14:48:43 +0300 Subject: [PATCH] refactor(datasource/terraform): Enable strict null checks (#14050) * refactor(datasource/terraform): Enable strict null checks * Fix coverage Co-authored-by: Michael Kriese --- lib/datasource/terraform-module/index.ts | 14 +++++--- lib/datasource/terraform-provider/index.ts | 41 ++++++++++------------ tsconfig.strict.json | 3 -- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/lib/datasource/terraform-module/index.ts b/lib/datasource/terraform-module/index.ts index f9bbbe2f174e32..0031cb7f42914f 100644 --- a/lib/datasource/terraform-module/index.ts +++ b/lib/datasource/terraform-module/index.ts @@ -31,6 +31,11 @@ export class TerraformModuleDatasource extends TerraformDatasource { lookupName, registryUrl, }: GetReleasesConfig): Promise { + // istanbul ignore if + if (!registryUrl) { + return null; + } + const { registry, repository } = TerraformModuleDatasource.getRegistryRepository(lookupName, registryUrl); logger.trace( @@ -58,14 +63,13 @@ export class TerraformModuleDatasource extends TerraformDatasource { // Simplify response before caching and returning const dep: ReleaseResult = { - releases: null, + releases: res.versions.map((version) => ({ + version, + })), }; if (res.source) { dep.sourceUrl = res.source; } - dep.releases = res.versions.map((version) => ({ - version, - })); if (pkgUrl.startsWith('https://registry.terraform.io/')) { dep.homepage = `https://registry.terraform.io/modules/${repository}`; } @@ -83,7 +87,7 @@ export class TerraformModuleDatasource extends TerraformDatasource { private static getRegistryRepository( lookupName: string, - registryUrl: string + registryUrl = '' ): RegistryRepository { let registry: string; const split = lookupName.split('/'); diff --git a/lib/datasource/terraform-provider/index.ts b/lib/datasource/terraform-provider/index.ts index 268a98dd594118..1ef9bf5b121ee2 100644 --- a/lib/datasource/terraform-provider/index.ts +++ b/lib/datasource/terraform-provider/index.ts @@ -1,3 +1,4 @@ +import is from '@sindresorhus/is'; import pMap from 'p-map'; import { logger } from '../../logger'; import { ExternalHostError } from '../../types/errors/external-host-error'; @@ -48,9 +49,13 @@ export class TerraformProviderDatasource extends TerraformDatasource { lookupName, registryUrl, }: GetReleasesConfig): Promise { + // istanbul ignore if + if (!registryUrl) { + return null; + } logger.debug({ lookupName }, 'terraform-provider.getDependencies()'); - let dep: ReleaseResult = null; - const registryHost = parseUrl(registryUrl).host; + let dep: ReleaseResult | null = null; + const registryHost = parseUrl(registryUrl)?.host; if (registryHost === 'releases.hashicorp.com') { dep = await this.queryReleaseBackend(lookupName, registryUrl); } else { @@ -77,14 +82,13 @@ export class TerraformProviderDatasource extends TerraformDatasource { const backendURL = `${registryURL}${serviceDiscovery['providers.v1']}${repository}`; const res = (await this.http.getJson(backendURL)).body; const dep: ReleaseResult = { - releases: null, + releases: res.versions.map((version) => ({ + version, + })), }; if (res.source) { dep.sourceUrl = res.source; } - dep.releases = res.versions.map((version) => ({ - version, - })); // set published date for latest release const latestVersion = dep.releases.find( (release) => res.version === release.version @@ -102,7 +106,7 @@ export class TerraformProviderDatasource extends TerraformDatasource { private async queryReleaseBackend( lookupName: string, registryURL: string - ): Promise { + ): Promise { const backendLookUpName = `terraform-provider-${lookupName}`; const backendURL = registryURL + `/index.json`; const res = ( @@ -114,14 +118,11 @@ export class TerraformProviderDatasource extends TerraformDatasource { } const dep: ReleaseResult = { - releases: null, + releases: Object.keys(res[backendLookUpName].versions).map((version) => ({ + version, + })), sourceUrl: `https://github.com/terraform-providers/${backendLookUpName}`, }; - dep.releases = Object.keys(res[backendLookUpName].versions).map( - (version) => ({ - version, - }) - ); logger.trace({ dep }, 'dep'); return dep; } @@ -135,16 +136,16 @@ export class TerraformProviderDatasource extends TerraformDatasource { registryURL: string, repository: string, version: string - ): Promise { + ): Promise { if (registryURL === TerraformProviderDatasource.defaultRegistryUrls[1]) { // check if registryURL === secondary backend const repositoryRegexResult = - TerraformProviderDatasource.repositoryRegex.exec(repository); + TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups; if (!repositoryRegexResult) { // non hashicorp builds are not supported with releases.hashicorp.com return null; } - const lookupName = repositoryRegexResult.groups.lookupName; + const lookupName = repositoryRegexResult.lookupName; const backendLookUpName = `terraform-provider-${lookupName}`; let versionReleaseBackend: VersionDetailResponse; try { @@ -220,12 +221,8 @@ export class TerraformProviderDatasource extends TerraformDatasource { { concurrency: 4 } ); - // if any of the requests to build details have failed, return null - if (result.some((value) => Boolean(value) === false)) { - return null; - } - - return result; + const filteredResult = result.filter(is.truthy); + return filteredResult.length === result.length ? filteredResult : null; } @cache({ diff --git a/tsconfig.strict.json b/tsconfig.strict.json index 95bc2f4b13d608..e5591d0e6d224d 100644 --- a/tsconfig.strict.json +++ b/tsconfig.strict.json @@ -123,9 +123,6 @@ "lib/datasource/rubygems/get-rubygems-org.ts", "lib/datasource/rubygems/get.ts", "lib/datasource/rubygems/index.ts", - "lib/datasource/terraform-module/base.ts", - "lib/datasource/terraform-module/index.ts", - "lib/datasource/terraform-provider/index.ts", "lib/manager/ansible-galaxy/collections-metadata.ts", "lib/manager/ansible-galaxy/collections.ts", "lib/manager/ansible-galaxy/extract.ts",