From 9f7d0243934e767fbd9d14414cc65edd1bc41b77 Mon Sep 17 00:00:00 2001
From: RahulGautamSingh <rahultesnik@gmail.com>
Date: Mon, 17 Jan 2022 12:30:41 +0545
Subject: [PATCH] refactor(rez): ensure strict null check (#13334)

---
 lib/versioning/rez/index.spec.ts |  2 +-
 lib/versioning/rez/index.ts      | 62 ++++++++++++++++++--------------
 lib/versioning/rez/transform.ts  | 32 ++++++++---------
 tsconfig.strict.json             |  1 +
 4 files changed, 54 insertions(+), 43 deletions(-)

diff --git a/lib/versioning/rez/index.spec.ts b/lib/versioning/rez/index.spec.ts
index 69a6fd3bf0..c0d5120849 100644
--- a/lib/versioning/rez/index.spec.ts
+++ b/lib/versioning/rez/index.spec.ts
@@ -151,7 +151,7 @@ describe('versioning/rez/index', () => {
   `(
     'isLessThanRange($version, "$range") === $expected',
     ({ version, range, expected }) => {
-      expect(versioning.isLessThanRange(version, range)).toBe(expected);
+      expect(versioning.isLessThanRange?.(version, range)).toBe(expected);
     }
   );
 
diff --git a/lib/versioning/rez/index.ts b/lib/versioning/rez/index.ts
index 33712bb0b5..68347753c2 100644
--- a/lib/versioning/rez/index.ts
+++ b/lib/versioning/rez/index.ts
@@ -33,7 +33,7 @@ function equals(a: string, b: string): boolean {
   }
 }
 
-function getMajor(version: string): number {
+function getMajor(version: string): number | null {
   try {
     return npm.getMajor(padZeroes(version));
   } catch (err) /* istanbul ignore next */ {
@@ -41,7 +41,7 @@ function getMajor(version: string): number {
   }
 }
 
-function getMinor(version: string): number {
+function getMinor(version: string): number | null {
   try {
     return npm.getMinor(padZeroes(version));
   } catch (err) /* istanbul ignore next */ {
@@ -49,7 +49,7 @@ function getMinor(version: string): number {
   }
 }
 
-function getPatch(version: string): number {
+function getPatch(version: string): number | null {
   try {
     return npm.getPatch(padZeroes(version));
   } catch (err) /* istanbul ignore next */ {
@@ -68,7 +68,7 @@ function isGreaterThan(a: string, b: string): boolean {
 function isLessThanRange(version: string, range: string): boolean {
   return (
     npm.isVersion(padZeroes(version)) &&
-    npm.isLessThanRange(padZeroes(version), rez2npm(range))
+    !!npm.isLessThanRange?.(padZeroes(version), rez2npm(range))
   );
 }
 
@@ -91,11 +91,17 @@ function matches(version: string, range: string): boolean {
   );
 }
 
-function getSatisfyingVersion(versions: string[], range: string): string {
+function getSatisfyingVersion(
+  versions: string[],
+  range: string
+): string | null {
   return npm.getSatisfyingVersion(versions, rez2npm(range));
 }
 
-function minSatisfyingVersion(versions: string[], range: string): string {
+function minSatisfyingVersion(
+  versions: string[],
+  range: string
+): string | null {
   return npm.minSatisfyingVersion(versions, rez2npm(range));
 }
 
@@ -116,7 +122,7 @@ function getNewValue({
   rangeStrategy,
   currentVersion,
   newVersion,
-}: NewValueConfig): string {
+}: NewValueConfig): string | null {
   const pep440Value = pep440.getNewValue({
     currentValue: rez2pep440(currentValue),
     rangeStrategy,
@@ -126,29 +132,31 @@ function getNewValue({
   if (exactVersion.test(currentValue)) {
     return pep440Value;
   }
-  if (inclusiveBound.test(currentValue)) {
+  if (pep440Value && inclusiveBound.test(currentValue)) {
     return pep4402rezInclusiveBound(pep440Value);
   }
-  if (lowerBound.test(currentValue)) {
+  if (pep440Value && lowerBound.test(currentValue)) {
     if (currentValue.includes('+')) {
       return npm2rezplus(pep440Value);
     }
     return pep440Value;
   }
-  if (upperBound.test(currentValue)) {
+  if (pep440Value && upperBound.test(currentValue)) {
     return pep440Value;
   }
-  if (ascendingRange.test(currentValue)) {
+  const matchAscRange = ascendingRange.exec(currentValue);
+  if (pep440Value && matchAscRange?.groups) {
     // Replace version numbers but keep rez format, otherwise we just end up trying
     // to convert every single case separately.
-    const match = ascendingRange.exec(currentValue);
-    const lowerBoundAscCurrent = match.groups.range_lower_asc;
-    const upperBoundAscCurrent = match.groups.range_upper_asc;
-    const lowerAscVersionCurrent = match.groups.range_lower_asc_version;
-    const upperAscVersionCurrent = match.groups.range_upper_asc_version;
+    const lowerBoundAscCurrent = matchAscRange.groups.range_lower_asc;
+    const upperBoundAscCurrent = matchAscRange.groups.range_upper_asc;
+    const lowerAscVersionCurrent = matchAscRange.groups.range_lower_asc_version;
+    const upperAscVersionCurrent = matchAscRange.groups.range_upper_asc_version;
     const [lowerBoundAscPep440, upperBoundAscPep440] = pep440Value.split(', ');
-    const lowerAscVersionNew = regEx(versionGroup).exec(lowerBoundAscPep440)[0];
-    const upperAscVersionNew = regEx(versionGroup).exec(upperBoundAscPep440)[0];
+    const lowerAscVersionNew =
+      regEx(versionGroup).exec(lowerBoundAscPep440)?.[0] ?? '';
+    const upperAscVersionNew =
+      regEx(versionGroup).exec(upperBoundAscPep440)?.[0] ?? '';
     const lowerBoundAscNew = lowerBoundAscCurrent.replace(
       lowerAscVersionCurrent,
       lowerAscVersionNew
@@ -161,21 +169,23 @@ function getNewValue({
 
     return lowerBoundAscNew + separator + upperBoundAscNew;
   }
-  if (descendingRange.test(currentValue)) {
+  const matchDscRange = descendingRange.exec(currentValue);
+  if (pep440Value && matchDscRange?.groups) {
     // Replace version numbers but keep rez format, otherwise we just end up trying
     // to convert every single case separately.
-    const match = descendingRange.exec(currentValue);
-    const upperBoundDescCurrent = match.groups.range_upper_desc;
-    const lowerBoundDescCurrent = match.groups.range_lower_desc;
-    const upperDescVersionCurrent = match.groups.range_upper_desc_version;
-    const lowerDescVersionCurrent = match.groups.range_lower_desc_version;
+    const upperBoundDescCurrent = matchDscRange.groups.range_upper_desc;
+    const lowerBoundDescCurrent = matchDscRange.groups.range_lower_desc;
+    const upperDescVersionCurrent =
+      matchDscRange.groups.range_upper_desc_version;
+    const lowerDescVersionCurrent =
+      matchDscRange.groups.range_lower_desc_version;
     const [lowerBoundDescPep440, upperBoundDescPep440] =
       pep440Value.split(', ');
 
     const upperDescVersionNew =
-      regEx(versionGroup).exec(upperBoundDescPep440)[0];
+      regEx(versionGroup).exec(upperBoundDescPep440)?.[0] ?? '';
     const lowerDescVersionNew =
-      regEx(versionGroup).exec(lowerBoundDescPep440)[0];
+      regEx(versionGroup).exec(lowerBoundDescPep440)?.[0] ?? '';
     const upperBoundDescNew = upperBoundDescCurrent.replace(
       upperDescVersionCurrent,
       upperDescVersionNew
diff --git a/lib/versioning/rez/transform.ts b/lib/versioning/rez/transform.ts
index 10c2a3155a..11e1857b18 100644
--- a/lib/versioning/rez/transform.ts
+++ b/lib/versioning/rez/transform.ts
@@ -56,16 +56,16 @@ export function rez2npm(input: string): string {
   if (upperBound.test(input)) {
     return input;
   }
-  if (ascendingRange.test(input)) {
-    const match = ascendingRange.exec(input);
-    const lowerBoundAsc = match.groups.range_lower_asc;
-    const upperBoundAsc = match.groups.range_upper_asc;
+  const matchAscRange = ascendingRange.exec(input);
+  if (matchAscRange?.groups) {
+    const lowerBoundAsc = matchAscRange.groups.range_lower_asc;
+    const upperBoundAsc = matchAscRange.groups.range_upper_asc;
     return plus2npm(lowerBoundAsc) + ' ' + plus2npm(upperBoundAsc);
   }
-  if (descendingRange.test(input)) {
-    const match = descendingRange.exec(input);
-    const upperBoundDesc = match.groups.range_upper_desc;
-    const lowerBoundDesc = match.groups.range_lower_desc;
+  const matchDscRange = descendingRange.exec(input);
+  if (matchDscRange?.groups) {
+    const upperBoundDesc = matchDscRange.groups.range_upper_desc;
+    const lowerBoundDesc = matchDscRange.groups.range_lower_desc;
     return plus2npm(lowerBoundDesc) + ' ' + plus2npm(upperBoundDesc);
   }
   return input;
@@ -87,16 +87,16 @@ export function rez2pep440(input: string): string {
   if (upperBound.test(input)) {
     return input;
   }
-  if (ascendingRange.test(input)) {
-    const match = ascendingRange.exec(input);
-    const lowerBoundAsc = match.groups.range_lower_asc;
-    const upperBoundAsc = match.groups.range_upper_asc;
+  const matchAscRange = ascendingRange.exec(input);
+  if (matchAscRange?.groups) {
+    const lowerBoundAsc = matchAscRange.groups.range_lower_asc;
+    const upperBoundAsc = matchAscRange.groups.range_upper_asc;
     return plus2npm(lowerBoundAsc) + ', ' + plus2npm(upperBoundAsc);
   }
-  if (descendingRange.test(input)) {
-    const match = descendingRange.exec(input);
-    const upperBoundDesc = match.groups.range_upper_desc;
-    const lowerBoundDesc = match.groups.range_lower_desc;
+  const matchDscRange = descendingRange.exec(input);
+  if (matchDscRange?.groups) {
+    const upperBoundDesc = matchDscRange.groups.range_upper_desc;
+    const lowerBoundDesc = matchDscRange.groups.range_lower_desc;
     return plus2npm(lowerBoundDesc) + ', ' + plus2npm(upperBoundDesc);
   }
   return input;
diff --git a/tsconfig.strict.json b/tsconfig.strict.json
index 24880eb5bf..dd63af38d2 100644
--- a/tsconfig.strict.json
+++ b/tsconfig.strict.json
@@ -50,6 +50,7 @@
     "lib/versioning/node/**/*.ts",
     "lib/versioning/npm/**/*.ts",
     "lib/versioning/pep440/**/*.ts",
+    "lib/versioning/rez/**/*.ts",
     "lib/versioning/ruby/**/*.ts",
     "lib/versioning/semver-coerced/**/*.ts",
     "lib/versioning/semver/**/*.ts",
-- 
GitLab