From ba96b700341e7a75d10beb700501fb02f4db9ec1 Mon Sep 17 00:00:00 2001
From: Michael Kriese <michael.kriese@visualon.de>
Date: Mon, 18 Apr 2022 11:13:29 +0200
Subject: [PATCH] refactor(manager): more strict null checks (#15161)

---
 lib/modules/manager/buildkite/extract.ts   | 17 +++++++++--------
 lib/modules/manager/cargo/artifacts.ts     |  2 +-
 lib/modules/manager/cocoapods/artifacts.ts |  2 +-
 lib/modules/manager/cocoapods/extract.ts   |  6 +++---
 lib/modules/manager/types.ts               |  2 +-
 tsconfig.strict.json                       | 10 ----------
 6 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/lib/modules/manager/buildkite/extract.ts b/lib/modules/manager/buildkite/extract.ts
index 5e3d7ec14f..ac345a369d 100644
--- a/lib/modules/manager/buildkite/extract.ts
+++ b/lib/modules/manager/buildkite/extract.ts
@@ -17,30 +17,31 @@ export function extractPackageFile(content: string): PackageFile | null {
       const pluginsSection = regEx(
         /^(?<pluginsIndent>\s*)(-?\s*)plugins:/
       ).exec(line);
-      if (pluginsSection) {
+      if (pluginsSection?.groups) {
         logger.trace(`Matched plugins on line ${lineNumber}`);
         isPluginsSection = true;
         pluginsIndent = pluginsSection.groups.pluginsIndent;
       } else if (isPluginsSection) {
         logger.debug(`serviceImageLine: "${line}"`);
-        const { currentIndent } = regEx(/^(?<currentIndent>\s*)/).exec(
-          line
-        ).groups;
+        const { currentIndent } = regEx(/^(?<currentIndent>\s*)/).exec(line)
+          ?.groups ?? /* istanbul ignore next: should never happen */ {
+          currentIndent: '',
+        };
         const depLineMatch = regEx(
           /^\s+(?:-\s+)?(?<depName>[^#]+)#(?<currentValue>[^:]+)/
         ).exec(line);
         if (currentIndent.length <= pluginsIndent.length) {
           isPluginsSection = false;
           pluginsIndent = '';
-        } else if (depLineMatch) {
+        } else if (depLineMatch?.groups) {
           const { depName, currentValue } = depLineMatch.groups;
           logger.trace('depLineMatch');
-          let skipReason: SkipReason;
-          let repo: string;
+          let skipReason: SkipReason | undefined;
+          let repo: string | undefined;
           const gitPluginMatch = regEx(
             /(ssh:\/\/git@|https:\/\/)(?<registry>[^/]+)\/(?<gitPluginName>.*)/
           ).exec(depName);
-          if (gitPluginMatch) {
+          if (gitPluginMatch?.groups) {
             logger.debug('Examining git plugin');
             const { registry, gitPluginName } = gitPluginMatch.groups;
             const gitDepName = gitPluginName.replace(regEx('\\.git$'), '');
diff --git a/lib/modules/manager/cargo/artifacts.ts b/lib/modules/manager/cargo/artifacts.ts
index 0a7b3015f8..a1a05c3ce3 100644
--- a/lib/modules/manager/cargo/artifacts.ts
+++ b/lib/modules/manager/cargo/artifacts.ts
@@ -57,7 +57,7 @@ export async function updateArtifacts({
   const existingLockFileContent = lockFileName
     ? await readLocalFile(lockFileName)
     : null;
-  if (!existingLockFileContent) {
+  if (!existingLockFileContent || !lockFileName) {
     logger.debug('No Cargo.lock found');
     return null;
   }
diff --git a/lib/modules/manager/cocoapods/artifacts.ts b/lib/modules/manager/cocoapods/artifacts.ts
index 9a2a60f0f2..e36240262f 100644
--- a/lib/modules/manager/cocoapods/artifacts.ts
+++ b/lib/modules/manager/cocoapods/artifacts.ts
@@ -21,7 +21,7 @@ function getPluginCommands(content: string): string[] {
   const lines: string[] = content.split(newlineRegex);
   lines.forEach((line) => {
     const match = pluginRegex.exec(line);
-    if (match) {
+    if (match?.groups) {
       const { plugin } = match.groups;
       result.add(`gem install ${quote(plugin)}`);
     }
diff --git a/lib/modules/manager/cocoapods/extract.ts b/lib/modules/manager/cocoapods/extract.ts
index eed1fb52ba..d392d7ede1 100644
--- a/lib/modules/manager/cocoapods/extract.ts
+++ b/lib/modules/manager/cocoapods/extract.ts
@@ -54,10 +54,10 @@ export function gitDep(parsedLine: ParsedLine): PackageDependency | null {
 
   const platformMatch = regEx(
     /[@/](?<platform>github|gitlab)\.com[:/](?<account>[^/]+)\/(?<repo>[^/]+)/
-  ).exec(git);
+  ).exec(git ?? '');
 
-  if (platformMatch) {
-    const { account, repo, platform } = platformMatch?.groups || {};
+  if (platformMatch?.groups) {
+    const { account, repo, platform } = platformMatch.groups;
     if (account && repo) {
       const datasource =
         platform === 'github'
diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts
index 1bece70c5c..260843c769 100644
--- a/lib/modules/manager/types.ts
+++ b/lib/modules/manager/types.ts
@@ -156,7 +156,7 @@ export interface PackageDependency<T = Record<string, any>> extends Package<T> {
   currentVersion?: string;
   lockedVersion?: string;
   propSource?: string;
-  registryUrls?: string[];
+  registryUrls?: string[] | null;
   rangeStrategy?: RangeStrategy;
   skipReason?: SkipReason;
   sourceLine?: number;
diff --git a/tsconfig.strict.json b/tsconfig.strict.json
index ce4b7261c0..d3da5e166e 100644
--- a/tsconfig.strict.json
+++ b/tsconfig.strict.json
@@ -40,16 +40,6 @@
     "lib/config/validation.ts",
     "lib/modules/datasource/github-releases/test/index.ts",
     "lib/modules/manager/api.ts",
-    "lib/modules/manager/buildkite/extract.ts",
-    "lib/modules/manager/buildkite/index.ts",
-    "lib/modules/manager/bundler/artifacts.ts",
-    "lib/modules/manager/bundler/index.ts",
-    "lib/modules/manager/bundler/extract.ts",
-    "lib/modules/manager/cargo/artifacts.ts",
-    "lib/modules/manager/cargo/index.ts",
-    "lib/modules/manager/cocoapods/artifacts.ts",
-    "lib/modules/manager/cocoapods/extract.ts",
-    "lib/modules/manager/cocoapods/index.ts",
     "lib/modules/manager/composer/artifacts.ts",
     "lib/modules/manager/composer/extract.ts",
     "lib/modules/manager/composer/index.ts",
-- 
GitLab