Skip to content

Commit

Permalink
refactor: more strict null checks (#15141)
Browse files Browse the repository at this point in the history
  • Loading branch information
viceice committed Apr 16, 2022
1 parent 5cf9123 commit 08b5063
Show file tree
Hide file tree
Showing 15 changed files with 95 additions and 76 deletions.
7 changes: 6 additions & 1 deletion lib/modules/datasource/gitlab-packages/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ export class GitlabPackagesDatasource extends Datasource {
registryUrl,
packageName,
}: GetReleasesConfig): Promise<ReleaseResult | null> {
// istanbul ignore if
if (!registryUrl) {
return null;
}

const [projectPart, packagePart] = packageName.split(':', 2);

const apiUrl = GitlabPackagesDatasource.getGitlabPackageApiUrl(
Expand All @@ -58,7 +63,7 @@ export class GitlabPackagesDatasource extends Datasource {
);

const result: ReleaseResult = {
releases: null,
releases: [],
};

let response: GitlabPackage[];
Expand Down
5 changes: 5 additions & 0 deletions lib/modules/datasource/gitlab-releases/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ export class GitlabReleasesDatasource extends Datasource {
registryUrl,
packageName,
}: GetReleasesConfig): Promise<ReleaseResult | null> {
// istanbul ignore if
if (!registryUrl) {
return null;
}

const urlEncodedRepo = encodeURIComponent(packageName);
const apiUrl = `${registryUrl}/api/v4/projects/${urlEncodedRepo}/releases`;

Expand Down
7 changes: 4 additions & 3 deletions lib/modules/datasource/gitlab-tags/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export class GitlabTagsDatasource extends Datasource {

const dependency: ReleaseResult = {
sourceUrl: getSourceUrl(repo, registryUrl),
releases: null,
releases: [],
};
dependency.releases = gitlabTags.map(({ name, commit }) => ({
version: name,
Expand All @@ -75,8 +75,9 @@ export class GitlabTagsDatasource extends Datasource {
): Promise<string | null> {
const depHost = getDepHost(registryUrl);

const urlEncodedRepo = encodeURIComponent(repo);
let digest: string;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const urlEncodedRepo = encodeURIComponent(repo!);
let digest: string | null = null;

try {
if (newValue) {
Expand Down
12 changes: 7 additions & 5 deletions lib/modules/datasource/golang-version/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,12 @@ export class GolangVersionDatasource extends Datasource {
lines.splice(0, startOfReleases + 1);

// Parse the release list
let release: Release = { version: undefined };
let release: Omit<Release, 'version'> & { version?: string } = {
version: undefined,
};
let skipFutureRelease = false;
while (lines.length !== 0) {
const line = lines.shift();
const line = lines.shift()!;
if (line === releaseBeginningChar) {
if (release.version !== undefined) {
throw new ExternalHostError(
Expand All @@ -76,7 +78,7 @@ export class GolangVersionDatasource extends Datasource {
new Error('Invalid file - release has empty version')
);
}
res.releases.push(release);
res.releases.push(release as Release);
}
release = { version: undefined };
} else {
Expand All @@ -85,15 +87,15 @@ export class GolangVersionDatasource extends Datasource {
skipFutureRelease = true;
}
const releaseDateMatch = releaseDateRegex.exec(line);
if (releaseDateMatch) {
if (releaseDateMatch?.groups) {
// Make a valid UTC timestamp
const year = releaseDateMatch.groups.year.padStart(4, '0');
const month = releaseDateMatch.groups.month.padStart(2, '0');
const day = releaseDateMatch.groups.day.padStart(2, '0');
release.releaseTimestamp = `${year}-${month}-${day}T00:00:00.000Z`;
}
const releaseVersionMatch = releaseVersionRegex.exec(line);
if (releaseVersionMatch) {
if (releaseVersionMatch?.groups) {
release.version = `${releaseVersionMatch.groups.versionMajor}.${releaseVersionMatch.groups.versionMinor}.${releaseVersionMatch.groups.patch}`;
if (!isVersion(release.version)) {
throw new ExternalHostError(
Expand Down
9 changes: 7 additions & 2 deletions lib/modules/datasource/gradle-version/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,16 @@ export class GradleVersionDatasource extends Datasource {

@cache({
namespace: `datasource-${GradleVersionDatasource.id}`,
key: ({ registryUrl }: GetReleasesConfig) => registryUrl,
key: ({ registryUrl }: GetReleasesConfig) => `${registryUrl}`,
})
async getReleases({
registryUrl,
}: GetReleasesConfig): Promise<ReleaseResult> {
}: GetReleasesConfig): Promise<ReleaseResult | null> {
// istanbul ignore if
if (!registryUrl) {
return null;
}

let releases: Release[];
try {
const response = await this.http.getJson<GradleRelease[]>(registryUrl);
Expand Down
14 changes: 7 additions & 7 deletions lib/modules/datasource/npm/get.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ export async function getDependency(
return null;
}

const latestVersion = res.versions[res['dist-tags']?.latest];
const latestVersion = res.versions[res['dist-tags']?.latest ?? ''];
res.repository = res.repository || latestVersion?.repository;
res.homepage = res.homepage || latestVersion?.homepage;

Expand All @@ -100,7 +100,7 @@ export async function getDependency(
sourceUrl,
sourceDirectory,
versions: {},
releases: null,
releases: [],
'dist-tags': res['dist-tags'],
registryUrl,
};
Expand All @@ -112,17 +112,17 @@ export async function getDependency(
dep.releases = Object.keys(res.versions).map((version) => {
const release: NpmRelease = {
version,
gitRef: res.versions[version].gitHead,
dependencies: res.versions[version].dependencies,
devDependencies: res.versions[version].devDependencies,
gitRef: res.versions?.[version].gitHead,
dependencies: res.versions?.[version].dependencies,
devDependencies: res.versions?.[version].devDependencies,
};
if (res.time?.[version]) {
release.releaseTimestamp = res.time[version];
}
if (res.versions[version].deprecated) {
if (res.versions?.[version].deprecated) {
release.isDeprecated = true;
}
const source = getPackageSource(res.versions[version].repository);
const source = getPackageSource(res.versions?.[version].repository);
if (source.sourceUrl && source.sourceUrl !== dep.sourceUrl) {
release.sourceUrl = source.sourceUrl;
}
Expand Down
5 changes: 5 additions & 0 deletions lib/modules/datasource/npm/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ export class NpmDatasource extends Datasource {
packageName,
registryUrl,
}: GetReleasesConfig): Promise<ReleaseResult | null> {
// istanbul ignore if
if (!registryUrl) {
return null;
}

const res = await getDependency(this.http, registryUrl, packageName);
if (res) {
res.tags = res['dist-tags'];
Expand Down
12 changes: 6 additions & 6 deletions lib/modules/datasource/npm/npmrc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ function envReplace(value: any, env = process.env): any {

const ENV_EXPR = regEx(/(\\*)\$\{([^}]+)\}/g);

return value.replace(ENV_EXPR, (match, esc, envVarName) => {
return value.replace(ENV_EXPR, (match, _esc, envVarName) => {
if (env[envVarName] === undefined) {
logger.warn('Failed to replace env in config: ' + match);
throw new Error('env-replace');
}
return env[envVarName];
return env[envVarName]!;
});
}

Expand Down Expand Up @@ -82,7 +82,7 @@ export function convertNpmrcToRules(npmrc: Record<string, any>): NpmrcRules {
if (matchHost) {
hostRule.matchHost = matchHost;
}
rules.hostRules.push(hostRule);
rules.hostRules?.push(hostRule);
}
// Generate packageRules
const matchDataSources = ['npm'];
Expand All @@ -91,7 +91,7 @@ export function convertNpmrcToRules(npmrc: Record<string, any>): NpmrcRules {
if (is.nonEmptyString(registry)) {
if (validateUrl(registry)) {
// Default registry
rules.packageRules.push({
rules.packageRules?.push({
matchDataSources,
registryUrls: [registry],
});
Expand All @@ -109,7 +109,7 @@ export function convertNpmrcToRules(npmrc: Record<string, any>): NpmrcRules {
if (keyType === 'registry' && keyParts.length && is.nonEmptyString(value)) {
const scope = keyParts.join(':');
if (validateUrl(value)) {
rules.packageRules.push({
rules.packageRules?.push({
matchDataSources,
matchPackagePrefixes: [scope + '/'],
registryUrls: [value],
Expand Down Expand Up @@ -153,7 +153,7 @@ export function setNpmrc(input?: string): void {
}
}
const npmrcRules = convertNpmrcToRules(npmrc);
if (npmrcRules.hostRules.length) {
if (npmrcRules.hostRules?.length) {
npmrcRules.hostRules.forEach((hostRule) => hostRules.add(hostRule));
}
packageRules = npmrcRules.packageRules;
Expand Down
38 changes: 19 additions & 19 deletions lib/modules/datasource/npm/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,33 @@ import type { HostRule } from '../../../types';
import type { Release, ReleaseResult } from '../types';

export interface NpmrcRules {
hostRules?: HostRule[];
packageRules?: PackageRule[];
hostRules: HostRule[];
packageRules: PackageRule[];
}

export type NpmResponseVersion = {
repository?: {
url: string;
directory: string;
};
homepage?: string;
deprecated?: boolean;
gitHead?: string;
dependencies?: Record<string, string>;
devDependencies?: Record<string, string>;
};

export interface NpmResponse {
_id: string;
name?: string;
versions?: Record<
string,
{
repository?: {
url: string;
directory: string;
};
homepage?: string;
deprecated?: boolean;
gitHead?: string;
dependencies?: Record<string, string>;
devDependencies?: Record<string, string>;
}
>;
name: string;
versions?: Record<string, NpmResponseVersion>;
repository?: {
url?: string;
directory?: string;
};
homepage?: string;
time?: Record<string, string>;
'dist-tags'?: Record<string, string>;
}

export interface NpmRelease extends Release {
Expand All @@ -39,8 +39,8 @@ export interface NpmDependency extends ReleaseResult {
releases: NpmRelease[];
deprecationSource?: string;
name: string;
homepage: string;
sourceUrl: string;
homepage?: string;
sourceUrl?: string;
versions: Record<string, any>;
'dist-tags'?: Record<string, string>;
sourceDirectory?: string;
Expand Down
4 changes: 2 additions & 2 deletions lib/modules/datasource/nuget/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { ParsedRegistryUrl } from './types';
const buildMetaRe = regEx(/\+.+$/g);

export function removeBuildMeta(version: string): string {
return version?.replace(buildMetaRe, '');
return version.replace(buildMetaRe, '');
}

const urlWhitespaceRe = regEx(/\s/g);
Expand All @@ -16,7 +16,7 @@ export function massageUrl(url: string): string {

// During `dotnet pack` certain URLs are being URL decoded which may introduce whitespaces
// and causes Markdown link generation problems.
resultUrl = resultUrl?.replace(urlWhitespaceRe, '%20');
resultUrl = resultUrl.replace(urlWhitespaceRe, '%20');

return resultUrl;
}
Expand Down
6 changes: 5 additions & 1 deletion lib/modules/datasource/nuget/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,12 @@ export class NugetDatasource extends Datasource {
async getReleases({
packageName,
registryUrl,
}: GetReleasesConfig): Promise<ReleaseResult> {
}: GetReleasesConfig): Promise<ReleaseResult | null> {
logger.trace(`nuget.getReleases(${packageName})`);
// istanbul ignore if
if (!registryUrl) {
return null;
}
const { feedUrl, protocolVersion } = parseRegistryUrl(registryUrl);
if (protocolVersion === 2) {
return v2.getReleases(this.http, feedUrl, packageName);
Expand Down
16 changes: 9 additions & 7 deletions lib/modules/datasource/nuget/v2.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { XmlDocument, XmlElement } from 'xmldoc';
import { logger } from '../../../logger';
import type { Http } from '../../../util/http';
import type { HttpResponse } from '../../../util/http/types';
import { regEx } from '../../../util/regex';
import type { ReleaseResult } from '../types';
import { massageUrl, removeBuildMeta } from './common';

function getPkgProp(pkgInfo: XmlElement, propName: string): string {
return pkgInfo.childNamed('m:properties').childNamed(`d:${propName}`)?.val;
function getPkgProp(pkgInfo: XmlElement, propName: string): string | undefined {
return pkgInfo.childNamed('m:properties')?.childNamed(`d:${propName}`)?.val;
}

export async function getReleases(
Expand All @@ -17,12 +18,13 @@ export async function getReleases(
const dep: ReleaseResult = {
releases: [],
};
let pkgUrlList = `${feedUrl.replace(
let pkgUrlList: string | null = `${feedUrl.replace(
regEx(/\/+$/),
''
)}/FindPackagesById()?id=%27${pkgName}%27&$select=Version,IsLatestVersion,ProjectUrl,Published`;
do {
const pkgVersionsListRaw = await http.get(pkgUrlList);
while (pkgUrlList !== null) {
// typescript issue
const pkgVersionsListRaw: HttpResponse<string> = await http.get(pkgUrlList);
const pkgVersionsListDoc = new XmlDocument(pkgVersionsListRaw.body);

const pkgInfoList = pkgVersionsListDoc.childrenNamed('entry');
Expand All @@ -31,7 +33,7 @@ export async function getReleases(
const version = getPkgProp(pkgInfo, 'Version');
const releaseTimestamp = getPkgProp(pkgInfo, 'Published');
dep.releases.push({
version: removeBuildMeta(version),
version: removeBuildMeta(`${version}`),
releaseTimestamp,
});
try {
Expand All @@ -55,7 +57,7 @@ export async function getReleases(
.find((node) => node.attr.rel === 'next');

pkgUrlList = nextPkgUrlListLink ? nextPkgUrlListLink.attr.href : null;
} while (pkgUrlList !== null);
}

// dep not found if no release, so we can try next registry
if (dep.releases.length === 0) {
Expand Down

0 comments on commit 08b5063

Please sign in to comment.