From d5f04ef4fba99185f4a42cc96731b193630a0c55 Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Mon, 29 Nov 2021 10:33:36 +0300
Subject: [PATCH] refactor(swift): Enable strict null checks (#12850)

---
 lib/versioning/swift/index.spec.ts |  5 ++-
 lib/versioning/swift/index.ts      | 43 +++++++++++++++--------
 lib/versioning/swift/range.ts      | 56 +++++++++++++++++++-----------
 tsconfig.strict.json               |  2 ++
 4 files changed, 71 insertions(+), 35 deletions(-)

diff --git a/lib/versioning/swift/index.spec.ts b/lib/versioning/swift/index.spec.ts
index 9bc5a45d99..dd1b8c812c 100644
--- a/lib/versioning/swift/index.spec.ts
+++ b/lib/versioning/swift/index.spec.ts
@@ -23,16 +23,19 @@ describe('versioning/swift/index', () => {
     version                    | expected
     ${'from: "1.2.3"'}         | ${true}
     ${'from : "1.2.3"'}        | ${true}
+    ${'from : "1.2.3.4.5"'}    | ${false}
     ${'from:"1.2.3"'}          | ${true}
     ${' from:"1.2.3" '}        | ${true}
     ${' from : "1.2.3" '}      | ${true}
     ${'"1.2.3"..."1.2.4"'}     | ${true}
     ${' "1.2.3" ... "1.2.4" '} | ${true}
     ${'"1.2.3"...'}            | ${true}
+    ${'"1.2.3.4.5"...'}        | ${false}
     ${' "1.2.3" ... '}         | ${true}
     ${'..."1.2.4"'}            | ${true}
     ${' ... "1.2.4" '}         | ${true}
     ${'"1.2.3"..<"1.2.4"'}     | ${true}
+    ${'"1.2.3.4.5"..<"1.2.4"'} | ${false}
     ${' "1.2.3" ..< "1.2.4" '} | ${true}
     ${'..<"1.2.4"'}            | ${true}
     ${' ..< "1.2.4" '}         | ${true}
@@ -86,7 +89,7 @@ describe('versioning/swift/index', () => {
   `(
     'isLessThanRange("$version", "$range") === "$expected"',
     ({ version, range, expected }) => {
-      expect(isLessThanRange(version, range)).toBe(expected);
+      expect(isLessThanRange?.(version, range)).toBe(expected);
     }
   );
 
diff --git a/lib/versioning/swift/index.ts b/lib/versioning/swift/index.ts
index fa7ba22a6b..d3de422d77 100644
--- a/lib/versioning/swift/index.ts
+++ b/lib/versioning/swift/index.ts
@@ -29,21 +29,36 @@ const {
 
 export const isValid = (input: string): boolean =>
   !!valid(input) || !!validRange(toSemverRange(input));
+
 export const isVersion = (input: string): boolean => !!valid(input);
-const getSatisfyingVersion = (versions: string[], range: string): string =>
-  maxSatisfying(
-    versions.map((v) => v.replace(regEx(/^v/), '')), // TODO #12071
-    toSemverRange(range)
-  );
-const minSatisfyingVersion = (versions: string[], range: string): string =>
-  minSatisfying(
-    versions.map((v) => v.replace(regEx(/^v/), '')), // TODO #12071 #12070
-    toSemverRange(range)
-  );
-const isLessThanRange = (version: string, range: string): boolean =>
-  ltr(version, toSemverRange(range));
-const matches = (version: string, range: string): boolean =>
-  satisfies(version, toSemverRange(range));
+
+function getSatisfyingVersion(
+  versions: string[],
+  range: string
+): string | null {
+  const normalizedVersions = versions.map((v) => v.replace(regEx(/^v/), ''));
+  const semverRange = toSemverRange(range);
+  return semverRange ? maxSatisfying(normalizedVersions, semverRange) : null;
+}
+
+function minSatisfyingVersion(
+  versions: string[],
+  range: string
+): string | null {
+  const normalizedVersions = versions.map((v) => v.replace(regEx(/^v/), ''));
+  const semverRange = toSemverRange(range);
+  return semverRange ? minSatisfying(normalizedVersions, semverRange) : null;
+}
+
+function isLessThanRange(version: string, range: string): boolean {
+  const semverRange = toSemverRange(range);
+  return semverRange ? ltr(version, semverRange) : false;
+}
+
+function matches(version: string, range: string): boolean {
+  const semverRange = toSemverRange(range);
+  return semverRange ? satisfies(version, semverRange) : false;
+}
 
 export const api: VersioningApi = {
   equals,
diff --git a/lib/versioning/swift/range.ts b/lib/versioning/swift/range.ts
index 18ce3d20e0..955db8b68c 100644
--- a/lib/versioning/swift/range.ts
+++ b/lib/versioning/swift/range.ts
@@ -7,27 +7,40 @@ const fromRange = regEx(/^\s*"([^"]+)"\s*\.\.\.\s*$/);
 const binaryRange = regEx(/^\s*"([^"]+)"\s*(\.\.[.<])\s*"([^"]+)"\s*$/);
 const toRange = regEx(/^\s*(\.\.[.<])\s*"([^"]+)"\s*$/);
 
-function toSemverRange(range: string): string {
-  if (fromParam.test(range)) {
-    const [, version] = fromParam.exec(range);
+function toSemverRange(range: string): string | null {
+  const fromParamMatch = fromParam.exec(range);
+  if (fromParamMatch) {
+    const [, version] = fromParamMatch;
     if (semver.valid(version)) {
       const nextMajor = `${semver.major(version) + 1}.0.0`;
       return `>=${version} <${nextMajor}`;
     }
-  } else if (fromRange.test(range)) {
-    const [, version] = fromRange.exec(range);
+    return null;
+  }
+
+  const fromRangeMatch = fromRange.exec(range);
+  if (fromRangeMatch) {
+    const [, version] = fromRangeMatch;
     if (semver.valid(version)) {
       return `>=${version}`;
     }
-  } else if (binaryRange.test(range)) {
-    const [, currentVersion, op, newVersion] = binaryRange.exec(range);
+    return null;
+  }
+
+  const binaryRangeMatch = binaryRange.exec(range);
+  if (binaryRangeMatch) {
+    const [, currentVersion, op, newVersion] = binaryRangeMatch;
     if (semver.valid(currentVersion) && semver.valid(newVersion)) {
       return op === '..<'
         ? `>=${currentVersion} <${newVersion}`
         : `>=${currentVersion} <=${newVersion}`;
     }
-  } else if (toRange.test(range)) {
-    const [, op, newVersion] = toRange.exec(range);
+    return null;
+  }
+
+  const toRangeMatch = toRange.exec(range);
+  if (toRangeMatch) {
+    const [, op, newVersion] = toRangeMatch;
     if (semver.valid(newVersion)) {
       return op === '..<' ? `<${newVersion}` : `<=${newVersion}`;
     }
@@ -35,26 +48,29 @@ function toSemverRange(range: string): string {
   return null;
 }
 
-function getNewValue({
-  currentValue,
-  currentVersion,
-  newVersion,
-}: NewValueConfig): string {
+function getNewValue({ currentValue, newVersion }: NewValueConfig): string {
   if (fromParam.test(currentValue)) {
     return currentValue.replace(regEx(/".*?"/), `"${newVersion}"`);
   }
-  if (fromRange.test(currentValue)) {
-    const [, version] = fromRange.exec(currentValue);
+
+  const fromRangeMatch = fromRange.exec(currentValue);
+  if (fromRangeMatch) {
+    const [, version] = fromRangeMatch;
     return currentValue.replace(version, newVersion);
   }
-  if (binaryRange.test(currentValue)) {
-    const [, , , version] = binaryRange.exec(currentValue);
+
+  const binaryRangeMatch = binaryRange.exec(currentValue);
+  if (binaryRangeMatch) {
+    const [, , , version] = binaryRangeMatch;
     return currentValue.replace(version, newVersion);
   }
-  if (toRange.test(currentValue)) {
-    const [, , version] = toRange.exec(currentValue);
+
+  const toRangeMatch = toRange.exec(currentValue);
+  if (toRangeMatch) {
+    const [, , version] = toRangeMatch;
     return currentValue.replace(version, newVersion);
   }
+
   return currentValue;
 }
 
diff --git a/tsconfig.strict.json b/tsconfig.strict.json
index 7a93df971d..0d5f61d746 100644
--- a/tsconfig.strict.json
+++ b/tsconfig.strict.json
@@ -134,6 +134,8 @@
     "./lib/util/sanitize.ts",
     "./lib/util/split.ts",
     "./lib/util/url.ts",
+    "./lib/versioning/swift/index.spec.ts",
+    "./lib/versioning/swift/index.ts",
     "./lib/versioning/ubuntu/index.spec.ts",
     "./lib/versioning/ubuntu/index.ts",
     "./lib/workers/pr/changelog/hbs-template.ts",
-- 
GitLab