From a737a1b4ef775625fd630863e68e3016f5962c50 Mon Sep 17 00:00:00 2001
From: Gabriel-Ladzaretti
 <97394622+Gabriel-Ladzaretti@users.noreply.github.com>
Date: Thu, 3 Mar 2022 12:50:30 +0200
Subject: [PATCH] fix(pep440): added support for widen & replace
 rangeStrategies (#14334)

---
 lib/versioning/pep440/index.spec.ts | 149 +++++++++---------
 lib/versioning/pep440/range.ts      | 226 +++++++++++++++++++++++++---
 lib/versioning/rez/index.spec.ts    | 156 +++++++++----------
 3 files changed, 360 insertions(+), 171 deletions(-)

diff --git a/lib/versioning/pep440/index.spec.ts b/lib/versioning/pep440/index.spec.ts
index e0804fe2f9..38df688bd4 100644
--- a/lib/versioning/pep440/index.spec.ts
+++ b/lib/versioning/pep440/index.spec.ts
@@ -84,74 +84,87 @@ describe('versioning/pep440/index', () => {
   );
 
   test.each`
-    currentValue          | rangeStrategy    | currentVersion | newVersion | expected
-    ${'1.0.0'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'1.2.3'}
-    ${'1.0.0'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'1.2.3'}
-    ${'1.0.0'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'==1.0.3'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'==1.0.3'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'==1.0.3'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'>=1.2.0'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'>=1.2.3'}
-    ${'>=1.2.0'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'>=1.2.0'}
-    ${'>=1.2.0'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'~=1.2.0'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.3'}
-    ${'~=1.2.0'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.0'}
-    ${'~=1.2.0'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'~=1.0.3'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.3'}
-    ${'~=1.0.3'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.3'}
-    ${'~=1.0.3'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'==1.2.*'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.*'}
-    ${'==1.2.*'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.*'}
-    ${'==1.2.*'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'==1.0.*'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.*'}
-    ${'==1.0.*'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.*'}
-    ${'==1.0.*'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'<1.2.2.3'}         | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'<1.2.4.0'}
-    ${'<1.2.2.3'}         | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'<1.2.4.0'}
-    ${'<1.2.2.3'}         | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'<1.2.3'}           | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'<1.2.4'}
-    ${'<1.2.3'}           | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'<1.2.4'}
-    ${'<1.2.3'}           | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'<1.2'}             | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'<1.3'}
-    ${'<1.2'}             | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'<1.3'}
-    ${'<1.2'}             | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'<1'}               | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'<2'}
-    ${'<1'}               | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'<2'}
-    ${'<1'}               | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'<2.0.0'}           | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'<2.0.0'}
-    ${'<2.0.0'}           | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'<2.0.0'}
-    ${'<2.0.0'}           | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'>0.9.8'}           | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'>0.9.8'}
-    ${'>0.9.8'}           | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'>0.9.8'}
-    ${'>0.9.8'}           | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'>2.0.0'}           | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'>=1.2.3'}
-    ${'>2.0.0'}           | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'>=1.2.3'}
-    ${'>2.0.0'}           | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'>=2.0.0'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'>=1.2.3'}
-    ${'>=2.0.0'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'>=1.2.3'}
-    ${'>=2.0.0'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'~=1.1.0, !=1.1.1'} | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.3, !=1.1.1'}
-    ${'~=1.1.0, !=1.1.1'} | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.3, !=1.1.1'}
-    ${'~=1.1.0, !=1.1.1'} | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'~=1.1.0,!=1.1.1'}  | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.3,!=1.1.1'}
-    ${'~=1.1.0,!=1.1.1'}  | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.3,!=1.1.1'}
-    ${'~=1.1.0,!=1.1.1'}  | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${' '}                | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${' '}
-    ${' '}                | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${' '}
-    ${' '}                | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'invalid'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${null}
-    ${'invalid'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${null}
-    ${'invalid'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'===1.0.3'}         | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${null}
-    ${'===1.0.3'}         | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${null}
-    ${'===1.0.3'}         | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'!=1.2.3'}          | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'} | ${null}
-    ${'!=1.2.3'}          | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'} | ${null}
-    ${'!=1.2.3'}          | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'} | ${'==1.2.3'}
-    ${'~=1.1.0,!=1.1.1'}  | ${'unsupported'} | ${'1.0.0'}     | ${'1.2.3'} | ${'~=1.2.3,!=1.1.1'}
-    ${'~=7.2'}            | ${'replace'}     | ${'7.2.0'}     | ${'8.0.1'} | ${'~=8.0'}
-    ${'~=7.2'}            | ${'replace'}     | ${'7.2.0'}     | ${'8'}     | ${'~=8.0'}
-    ${'~=7.2.0'}          | ${'replace'}     | ${'7.2.0'}     | ${'8.2'}   | ${'~=8.2.0'}
+    currentValue            | rangeStrategy    | currentVersion | newVersion   | expected
+    ${'1.0.0'}              | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'1.2.3'}
+    ${'1.0.0'}              | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'1.2.3'}
+    ${'1.0.0'}              | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'==1.0.3'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'==1.0.3'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'==1.0.3'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'>=1.2.0'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'>=1.2.3'}
+    ${'>=1.2.0'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'>=1.2.0'}
+    ${'>=1.2.0'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'~=1.2.0'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.3'}
+    ${'~=1.2.0'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.0'}
+    ${'~=1.2.0'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'~=1.0.3'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.3'}
+    ${'~=1.0.3'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.3'}
+    ${'~=1.0.3'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'==1.2.*'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.*'}
+    ${'==1.2.*'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.*'}
+    ${'==1.2.*'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'==1.0.*'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.*'}
+    ${'==1.0.*'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.*'}
+    ${'==1.0.*'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'<1.2.2.3'}           | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'<1.2.3.1'}
+    ${'<1.2.2.3'}           | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'<1.2.3.1'}
+    ${'<1.2.2.3'}           | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'<1.2.3'}             | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'<1.2.4'}
+    ${'<1.2.3'}             | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'<1.2.4'}
+    ${'<1.2.3'}             | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'<1.2'}               | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'<1.3'}
+    ${'<1.2'}               | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'<1.3'}
+    ${'<1.2'}               | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'<1'}                 | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'<2'}
+    ${'<1'}                 | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'<2'}
+    ${'<1'}                 | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'<2.0.0'}             | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'<2.0.0'}
+    ${'<2.0.0'}             | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'<2.0.0'}
+    ${'<2.0.0'}             | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'>0.9.8'}             | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'>0.9.8'}
+    ${'>0.9.8'}             | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'>0.9.8'}
+    ${'>0.9.8'}             | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'>2.0.0'}             | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'>=1.2.3'}
+    ${'>2.0.0'}             | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'>=1.2.3'}
+    ${'>2.0.0'}             | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'>=2.0.0'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'>=1.2.3'}
+    ${'>=2.0.0'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'>=1.2.3'}
+    ${'>=2.0.0'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'~=1.1.0, !=1.1.1'}   | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.3, !=1.1.1'}
+    ${'~=1.1.0, !=1.1.1'}   | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.3, !=1.1.1'}
+    ${'~=1.1.0, !=1.1.1'}   | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'~=1.1.0,!=1.1.1'}    | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.3,!=1.1.1'}
+    ${'~=1.1.0,!=1.1.1'}    | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.3,!=1.1.1'}
+    ${'~=1.1.0,!=1.1.1'}    | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${' '}                  | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${' '}
+    ${' '}                  | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${' '}
+    ${' '}                  | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'invalid'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${null}
+    ${'invalid'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${null}
+    ${'invalid'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'===1.0.3'}           | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${null}
+    ${'===1.0.3'}           | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${null}
+    ${'===1.0.3'}           | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'!=1.2.3'}            | ${'bump'}        | ${'1.0.0'}     | ${'1.2.3'}   | ${null}
+    ${'!=1.2.3'}            | ${'replace'}     | ${'1.0.0'}     | ${'1.2.3'}   | ${null}
+    ${'!=1.2.3'}            | ${'pin'}         | ${'1.0.0'}     | ${'1.2.3'}   | ${'==1.2.3'}
+    ${'~=1.1.0,!=1.1.1'}    | ${'unsupported'} | ${'1.0.0'}     | ${'1.2.3'}   | ${'~=1.2.3,!=1.1.1'}
+    ${'>=19.12.2,<20.13.9'} | ${'replace'}     | ${'19.12.2'}   | ${'21.3.1'}  | ${'>=21.3.1,<22.0.0'}
+    ${'>=19.12.2,<19.13.9'} | ${'replace'}     | ${'19.12.2'}   | ${'20.3.1'}  | ${'>=20.3.1,<20.4.0'}
+    ${'>=19.12.2,<19.13.0'} | ${'replace'}     | ${'19.12.2'}   | ${'20.3.1'}  | ${'>=20.3.1,<20.4.0'}
+    ${'>=19.12.2,<19.13.0'} | ${'replace'}     | ${'19.12.2'}   | ${'20.3.0'}  | ${'>=20.3.0,<20.4.0'}
+    ${'>=19.12.2,<19.13.0'} | ${'replace'}     | ${'19.12.2'}   | ${'19.13.1'} | ${'>=19.13.1,<19.14.0'}
+    ${'>=19.12.2,<19.13.0'} | ${'replace'}     | ${'19.12.2'}   | ${'19.13.0'} | ${'>=19.13.0,<19.14.0'}
+    ${'>=19.12.2,<19.13.0'} | ${'auto'}        | ${'19.12.2'}   | ${'19.13.0'} | ${'>=19.13.0,<19.14.0'}
+    ${'>=19.12.2,<20.13.9'} | ${'widen'}       | ${'19.12.2'}   | ${'21.3.1'}  | ${'>=19.12.2,<21.3.2'}
+    ${'>=19.12.2,<19.13.9'} | ${'widen'}       | ${'19.12.2'}   | ${'20.3.1'}  | ${'>=19.12.2,<20.3.2'}
+    ${'>=19.12.2,<19.13.0'} | ${'widen'}       | ${'19.12.2'}   | ${'20.3.1'}  | ${'>=19.12.2,<20.4.0'}
+    ${'>=19.12.2,<19.13.0'} | ${'widen'}       | ${'19.12.2'}   | ${'20.3.0'}  | ${'>=19.12.2,<20.4.0'}
+    ${'>=19.12.2,<19.13.0'} | ${'widen'}       | ${'19.12.2'}   | ${'19.13.1'} | ${'>=19.12.2,<19.14.0'}
+    ${'>=19.12.2,<19.13.0'} | ${'widen'}       | ${'19.12.2'}   | ${'19.13.0'} | ${'>=19.12.2,<19.14.0'}
+    ${'~=7.2'}              | ${'replace'}     | ${'7.2.0'}     | ${'8.0.1'}   | ${'~=8.0'}
+    ${'~=7.2'}              | ${'replace'}     | ${'7.2.0'}     | ${'8'}       | ${'~=8.0'}
+    ${'~=7.2.0'}            | ${'replace'}     | ${'7.2.0'}     | ${'8.2'}     | ${'~=8.2.0'}
   `(
     'getNewValue("$currentValue", "$rangeStrategy", "$currentVersion", "$newVersion") === "$expected"',
     ({ currentValue, rangeStrategy, currentVersion, newVersion, expected }) => {
diff --git a/lib/versioning/pep440/range.ts b/lib/versioning/pep440/range.ts
index 2413dbd63b..e4ec5354f5 100644
--- a/lib/versioning/pep440/range.ts
+++ b/lib/versioning/pep440/range.ts
@@ -5,29 +5,82 @@ import { logger } from '../../logger';
 import { regEx } from '../../util/regex';
 import type { NewValueConfig } from '../types';
 
+const UserPolicy = {
+  Major: 0,
+  Minor: 1,
+  Micro: 2,
+  Bug: 3,
+  0: 'Major',
+  1: 'Minor',
+  2: 'Micro',
+  3: 'Bug',
+  None: Infinity,
+} as const;
+
+type UserPolicy = typeof UserPolicy[keyof typeof UserPolicy];
+
+/**
+ * Calculate current update range precision.
+ * @param ranges A {@link Range} consists of current range
+ * @returns A {@link UserPolicy}
+ */
+function getRangePrecision(ranges: Range[]): UserPolicy {
+  const bound: number[] =
+    parseVersion((ranges[1] || ranges[0]).version)?.release ?? [];
+  let rangePrecision = -1;
+  // range is defined by a single bound.
+  // ie. <1.2.2.3,
+  //     >=7
+  if (ranges.length === 1) {
+    rangePrecision = bound.length - 1;
+  }
+  // Range is defined by both upper and lower bounds.
+  if (ranges.length === 2) {
+    const lowerBound: number[] = parseVersion(ranges[0].version)?.release ?? [];
+    rangePrecision = bound.findIndex((el, index) => el > lowerBound[index]);
+  }
+  // Tune down Major precision if followed by a zero
+  if (
+    rangePrecision === UserPolicy.Major &&
+    rangePrecision + 1 < bound.length &&
+    bound[rangePrecision + 1] === 0
+  ) {
+    rangePrecision++;
+  }
+  // Could not calculate user precision
+  // Default to the smallest possible
+  // istanbul ignore next
+  if (rangePrecision === -1) {
+    rangePrecision = bound.length - 1;
+  }
+  const key = UserPolicy[rangePrecision as keyof typeof UserPolicy];
+  return UserPolicy[key as keyof typeof UserPolicy];
+}
+
+/**
+ * @param policy Required range precision
+ * @param newVersion The newly accepted version
+ * @param baseVersion Optional Current upper bound
+ * @returns A string represents a future version upper bound.
+ */
 function getFutureVersion(
-  baseVersion: string,
+  policy: UserPolicy,
   newVersion: string,
-  incrementValue: number
-): string {
+  baseVersion?: string
+): number[] {
   const toRelease: number[] = parseVersion(newVersion)?.release ?? [];
-  const baseRelease: number[] = parseVersion(baseVersion)?.release ?? [];
-  let found = false;
-  const futureRelease = baseRelease.map((basePart, index) => {
-    if (found) {
-      return 0;
-    }
+  const baseRelease: number[] =
+    parseVersion(baseVersion || newVersion)?.release ?? [];
+  return baseRelease.map((_, index) => {
     const toPart = toRelease[index] || 0;
-    if (toPart > basePart) {
-      found = true;
-      return toPart + incrementValue;
+    if (index < policy) {
+      return toPart;
+    }
+    if (index === policy) {
+      return toPart + (baseVersion === undefined ? 0 : 1);
     }
-    return toPart;
+    return 0;
   });
-  if (!found) {
-    futureRelease[futureRelease.length - 1] += incrementValue;
-  }
-  return futureRelease.join('.');
 }
 
 interface Range {
@@ -79,6 +132,17 @@ export function getNewValue({
         ranges
       );
       break;
+    case 'widen':
+      updatedRange = handleWidenStrategy(
+        {
+          currentValue,
+          rangeStrategy,
+          currentVersion,
+          newVersion,
+        },
+        ranges
+      );
+      break;
     case 'bump':
       updatedRange = handleBumpStrategy(
         {
@@ -101,7 +165,7 @@ export function getNewValue({
       );
       return getNewValue({
         currentValue,
-        rangeStrategy: 'auto',
+        rangeStrategy: 'replace',
         currentVersion,
         newVersion,
       });
@@ -193,8 +257,13 @@ function handleUpperBound(range: Range, newVersion: string): string | null {
     if (gte(newVersion, range.version)) {
       // now here things get tricky
       // we calculate the new future version
-      const futureVersion = getFutureVersion(range.version, newVersion, 1);
-      return range.operator + futureVersion;
+      const precision = getRangePrecision([range]);
+      const futureVersion = getFutureVersion(
+        precision,
+        newVersion,
+        range.version
+      );
+      return range.operator + futureVersion.join('.');
     }
     // newVersion is in range, for other than "replace" strategies
     return range.operator + range.version;
@@ -215,7 +284,11 @@ function updateRangeValue(
 
   // keep the .* suffix
   if (range.prefix) {
-    const futureVersion = getFutureVersion(range.version, newVersion, 0);
+    const futureVersion = getFutureVersion(
+      UserPolicy.None,
+      newVersion,
+      range.version
+    ).join('.');
     return range.operator + futureVersion + '.*';
   }
   if (range.operator === '~=') {
@@ -263,6 +336,71 @@ function updateRangeValue(
   return null;
 }
 
+/**
+ * Checks for zero specifiers.
+ * returns true if one of the bounds' length is < 3.
+ * @param ranges A {@link Range} array.
+ * @returns A boolean value
+ * Used mainly for cosmetics for the rez versioning syntax.
+ */
+function hasZeroSpecifier(ranges: Range[]): boolean {
+  return ranges.some((range) => {
+    const release = parseVersion(range.version)?.release;
+    return release && release.length < 3;
+  });
+}
+
+function trimTrailingZeros(numbers: number[]): number[] {
+  let i = numbers.length - 1;
+  while (numbers[i] === 0) {
+    i--;
+  }
+  return numbers.slice(0, i + 1);
+}
+
+function handleWidenStrategy(
+  { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,
+  ranges: Range[]
+): (string | null)[] {
+  // newVersion is within range
+  if (satisfies(newVersion, currentValue)) {
+    return [currentValue];
+  }
+  let rangePrecision = getRangePrecision(ranges);
+  const trimZeros = hasZeroSpecifier(ranges);
+  return ranges.map((range) => {
+    // newVersion is over the upper bound
+    if (range.operator === '<' && gte(newVersion, range.version)) {
+      const upperBound = parseVersion(range.version)?.release ?? [];
+      const len = upperBound.length;
+      // Match the precision of the smallest specifier if other than 0
+      if (upperBound[len - 1] !== 0) {
+        const key = UserPolicy[(len - 1) as keyof typeof UserPolicy];
+        rangePrecision = UserPolicy[key as keyof typeof UserPolicy];
+      }
+      let futureVersion = getFutureVersion(
+        rangePrecision,
+        newVersion,
+        range.version
+      );
+      if (trimZeros) {
+        futureVersion = trimTrailingZeros(futureVersion);
+      }
+      return range.operator + futureVersion.join('.');
+    }
+    // default
+    return updateRangeValue(
+      {
+        currentValue,
+        rangeStrategy,
+        currentVersion,
+        newVersion,
+      },
+      range
+    );
+  });
+}
+
 function handleReplaceStrategy(
   { currentValue, rangeStrategy, currentVersion, newVersion }: NewValueConfig,
   ranges: Range[]
@@ -271,8 +409,46 @@ function handleReplaceStrategy(
   if (satisfies(newVersion, currentValue)) {
     return [currentValue];
   }
-  return ranges.map((range) =>
-    updateRangeValue(
+  const trimZeros = hasZeroSpecifier(ranges);
+  return ranges.map((range) => {
+    // newVersion is over the upper bound
+    if (range.operator === '<' && gte(newVersion, range.version)) {
+      const rangePrecision = getRangePrecision(ranges);
+      let futureVersion = getFutureVersion(
+        rangePrecision,
+        newVersion,
+        range.version
+      );
+      if (trimZeros) {
+        futureVersion = trimTrailingZeros(futureVersion);
+      }
+      return range.operator + futureVersion.join('.');
+    }
+    // handle lower bound
+    if (['>', '>='].includes(range.operator)) {
+      if (lte(newVersion, range.version)) {
+        // this looks like a rollback
+        return '>=' + newVersion;
+      }
+      // update the lower bound to reflect the accepted new version
+      const lowerBound = parseVersion(range.version)?.release ?? [];
+      const rangePrecision = lowerBound.length - 1;
+      let newBase = getFutureVersion(rangePrecision, newVersion);
+      if (trimZeros) {
+        newBase = trimTrailingZeros(newBase);
+      }
+      // trim last element of the newBase when new accepted version is out of range.
+      // example: let new bound be >8.2.5 & newVersion be 8.2.5
+      // return value will be: >8.2
+      if (range.operator === '>') {
+        if (newVersion === newBase.join('.') && newBase.length > 1) {
+          newBase.pop();
+        }
+      }
+      return range.operator + newBase.join('.');
+    }
+    // default
+    return updateRangeValue(
       {
         currentValue,
         rangeStrategy,
@@ -280,8 +456,8 @@ function handleReplaceStrategy(
         newVersion,
       },
       range
-    )
-  );
+    );
+  });
 }
 
 function handleBumpStrategy(
diff --git a/lib/versioning/rez/index.spec.ts b/lib/versioning/rez/index.spec.ts
index c0d5120849..1b910e5511 100644
--- a/lib/versioning/rez/index.spec.ts
+++ b/lib/versioning/rez/index.spec.ts
@@ -197,15 +197,15 @@ describe('versioning/rez/index', () => {
     ${'1.2.3'}           | ${'bump'}     | ${'1.2.3'}     | ${'1.2.4'} | ${'1.2.4'}
     ${'1.2.3'}           | ${'replace'}  | ${'1.2.3'}     | ${'1.2.4'} | ${'1.2.4'}
     ${'1.2.3'}           | ${'widen'}    | ${'1.2.3'}     | ${'1.2.4'} | ${'1.2.4'}
-    ${'7..8'}            | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7..9'}
-    ${'7.2..8'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2..9'}
-    ${'7.2.3..8'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2.3..9'}
-    ${'7..8.0'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7..8.3'}
-    ${'7.2..8.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2..8.3'}
-    ${'7.2.3..8.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2.3..8.3'}
-    ${'7..8.0.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7..8.3.0'}
-    ${'7.2..8.0.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2..8.3.0'}
-    ${'7.2.3..8.0.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2.3..8.3.0'}
+    ${'7..8'}            | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8..9'}
+    ${'7.2..8'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2..9'}
+    ${'7.2.3..8'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2.5..9'}
+    ${'7..8.0'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8..8.3'}
+    ${'7.2..8.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2..8.3'}
+    ${'7.2.3..8.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2.5..8.3'}
+    ${'7..8.0.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8..8.3'}
+    ${'7.2..8.0.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2..8.3'}
+    ${'7.2.3..8.0.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2.5..8.3.0'}
     ${'5..6'}            | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'5.2.5..6'}
     ${'5.2..6'}          | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'5.2.5..6'}
     ${'5.2.3..6'}        | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'5.2.5..6'}
@@ -257,23 +257,23 @@ describe('versioning/rez/index', () => {
     ${'<=1.3'}           | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<=2.2.5'}
     ${'<=1.2.3'}         | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<=2.2.5'}
     ${'<8'}              | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9'}
-    ${'<7.3'}            | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9.0'}
-    ${'<7.2.4'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9.0.0'}
+    ${'<7.3'}            | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3'}
+    ${'<7.2.4'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.2.6'}
     ${'<6'}              | ${'bump'}     | ${'5.2.3'}     | ${'6.2.5'} | ${'<7'}
-    ${'<5.3'}            | ${'bump'}     | ${'5.2.3'}     | ${'6.2.5'} | ${'<7.0'}
-    ${'<5.2.4'}          | ${'bump'}     | ${'5.2.3'}     | ${'6.2.5'} | ${'<7.0.0'}
+    ${'<5.3'}            | ${'bump'}     | ${'5.2.3'}     | ${'6.2.5'} | ${'<6.3'}
+    ${'<5.2.4'}          | ${'bump'}     | ${'5.2.3'}     | ${'6.2.5'} | ${'<6.2.6'}
     ${'<2'}              | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<3'}
-    ${'<1.3'}            | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<3.0'}
-    ${'<1.2.4'}          | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<3.0.0'}
-    ${'7+<8'}            | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7+<9'}
-    ${'7.2+<8'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2+<9'}
-    ${'7.2.3+<8'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2.3+<9'}
-    ${'7+<8.0'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7+<8.3'}
-    ${'7.2+<8.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2+<8.3'}
-    ${'7.2.3+<8.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2.3+<8.3'}
-    ${'7+<8.0.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7+<8.3.0'}
-    ${'7.2+<8.0.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2+<8.3.0'}
-    ${'7.2.3+<8.0.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'7.2.3+<8.3.0'}
+    ${'<1.3'}            | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<2.3'}
+    ${'<1.2.4'}          | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<2.2.6'}
+    ${'7+<8'}            | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8+<9'}
+    ${'7.2+<8'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2+<9'}
+    ${'7.2.3+<8'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2.5+<9'}
+    ${'7+<8.0'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8+<8.3'}
+    ${'7.2+<8.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2+<8.3'}
+    ${'7.2.3+<8.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2.5+<8.3'}
+    ${'7+<8.0.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8+<8.3'}
+    ${'7.2+<8.0.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2+<8.3'}
+    ${'7.2.3+<8.0.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'8.2.5+<8.3.0'}
     ${'5+<6'}            | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'5.2.5+<6'}
     ${'5.2+<6'}          | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'5.2.5+<6'}
     ${'5.2.3+<6'}        | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'5.2.5+<6'}
@@ -288,15 +288,15 @@ describe('versioning/rez/index', () => {
     ${'1.2+<2.0'}        | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'1.2+<2.3'}
     ${'1.2.3+<2.0'}      | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'1.2.3+<2.3'}
     ${'1.2.3+<2.0.0'}    | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'1.2.3+<2.3.0'}
-    ${'>=7,<8'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7,<9'}
-    ${'>=7.2,<8'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2,<9'}
-    ${'>=7.2.3,<8'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2.3,<9'}
-    ${'>=7,<8.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7,<8.3'}
-    ${'>=7.2,<8.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2,<8.3'}
-    ${'>=7.2.3,<8.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2.3,<8.3'}
-    ${'>=7,<8.0.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7,<8.3.0'}
-    ${'>=7.2,<8.0.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2,<8.3.0'}
-    ${'>=7.2.3,<8.0.0'}  | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2.3,<8.3.0'}
+    ${'>=7,<8'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8,<9'}
+    ${'>=7.2,<8'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2,<9'}
+    ${'>=7.2.3,<8'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2.5,<9'}
+    ${'>=7,<8.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8,<8.3'}
+    ${'>=7.2,<8.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2,<8.3'}
+    ${'>=7.2.3,<8.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2.5,<8.3'}
+    ${'>=7,<8.0.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8,<8.3'}
+    ${'>=7.2,<8.0.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2,<8.3'}
+    ${'>=7.2.3,<8.0.0'}  | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2.5,<8.3.0'}
     ${'>=5,<6'}          | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>=5.2.5,<6'}
     ${'>=5.2,<6'}        | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>=5.2.5,<6'}
     ${'>=5.2.3,<6'}      | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>=5.2.5,<6'}
@@ -311,15 +311,15 @@ describe('versioning/rez/index', () => {
     ${'>=1.2,<2.0'}      | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>=1.2,<2.3'}
     ${'>=1.2.3,<2.0'}    | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>=1.2.3,<2.3'}
     ${'>=1.2.3,<2.0.0'}  | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>=1.2.3,<2.3.0'}
-    ${'>=7<8'}           | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7<9'}
-    ${'>=7.2<8'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2<9'}
-    ${'>=7.2.3<8'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2.3<9'}
-    ${'>=7<8.0'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7<8.3'}
-    ${'>=7.2<8.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2<8.3'}
-    ${'>=7.2.3<8.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2.3<8.3'}
-    ${'>=7<8.0.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7<8.3.0'}
-    ${'>=7.2<8.0.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2<8.3.0'}
-    ${'>=7.2.3<8.0.0'}   | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=7.2.3<8.3.0'}
+    ${'>=7<8'}           | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8<9'}
+    ${'>=7.2<8'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2<9'}
+    ${'>=7.2.3<8'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2.5<9'}
+    ${'>=7<8.0'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8<8.3'}
+    ${'>=7.2<8.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2<8.3'}
+    ${'>=7.2.3<8.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2.5<8.3'}
+    ${'>=7<8.0.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8<8.3'}
+    ${'>=7.2<8.0.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2<8.3'}
+    ${'>=7.2.3<8.0.0'}   | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>=8.2.5<8.3.0'}
     ${'>=5<6'}           | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>=5.2.5<6'}
     ${'>=5.2<6'}         | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>=5.2.5<6'}
     ${'>=5.2.3<6'}       | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>=5.2.5<6'}
@@ -334,15 +334,15 @@ describe('versioning/rez/index', () => {
     ${'>=1.2<2.0'}       | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>=1.2<2.3'}
     ${'>=1.2.3<2.0'}     | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>=1.2.3<2.3'}
     ${'>=1.2.3<2.0.0'}   | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>=1.2.3<2.3.0'}
-    ${'>6,<8'}           | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>6,<9'}
-    ${'>7.1,<8'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.1,<9'}
-    ${'>7.2.0,<8'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.2.0,<9'}
-    ${'>6,<8.0'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>6,<8.3'}
-    ${'>7.1,<8.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.1,<8.3'}
-    ${'>7.2.0,<8.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.2.0,<8.3'}
-    ${'>6,<8.0.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>6,<8.3.0'}
-    ${'>7.1,<8.0.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.1,<8.3.0'}
-    ${'>7.2.0,<8.0.0'}   | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.2.0,<8.3.0'}
+    ${'>6,<8'}           | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8,<9'}
+    ${'>7.1,<8'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2,<9'}
+    ${'>7.2.0,<8'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2,<9'}
+    ${'>6,<8.0'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8,<8.3'}
+    ${'>7.1,<8.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2,<8.3'}
+    ${'>7.2.0,<8.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2,<8.3'}
+    ${'>6,<8.0.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8,<8.3'}
+    ${'>7.1,<8.0.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2,<8.3'}
+    ${'>7.2.0,<8.0.0'}   | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2,<8.3.0'}
     ${'>4,<6'}           | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>4,<6'}
     ${'>5.1,<6'}         | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>5.1,<6'}
     ${'>5.2.0,<6'}       | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>5.2.0,<6'}
@@ -357,15 +357,15 @@ describe('versioning/rez/index', () => {
     ${'>1.1,<2.0'}       | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>1.1,<2.3'}
     ${'>1.2.0,<2.0'}     | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>1.2.0,<2.3'}
     ${'>1.2.0,<2.0.0'}   | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>1.2.0,<2.3.0'}
-    ${'>6<8'}            | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>6<9'}
-    ${'>7.1<8'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.1<9'}
-    ${'>7.2.0<8'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.2.0<9'}
-    ${'>6<8.0'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>6<8.3'}
-    ${'>7.1<8.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.1<8.3'}
-    ${'>7.2.0<8.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.2.0<8.3'}
-    ${'>6<8.0.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>6<8.3.0'}
-    ${'>7.1<8.0.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.1<8.3.0'}
-    ${'>7.2.0<8.0.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>7.2.0<8.3.0'}
+    ${'>6<8'}            | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8<9'}
+    ${'>7.1<8'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2<9'}
+    ${'>7.2.0<8'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2<9'}
+    ${'>6<8.0'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8<8.3'}
+    ${'>7.1<8.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2<8.3'}
+    ${'>7.2.0<8.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2<8.3'}
+    ${'>6<8.0.0'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8<8.3'}
+    ${'>7.1<8.0.0'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2<8.3'}
+    ${'>7.2.0<8.0.0'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'>8.2<8.3.0'}
     ${'>4<6'}            | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>4<6'}
     ${'>5.1<6'}          | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>5.1<6'}
     ${'>5.2.0<6'}        | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'>5.2.0<6'}
@@ -380,15 +380,15 @@ describe('versioning/rez/index', () => {
     ${'>1.1<2.0'}        | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>1.1<2.3'}
     ${'>1.2.0<2.0'}      | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>1.2.0<2.3'}
     ${'>1.2.0<2.0.0'}    | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'>1.2.0<2.3.0'}
-    ${'<8,>=7'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>=7'}
-    ${'<8,>=7.2'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>=7.2'}
-    ${'<8,>=7.2.3'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>=7.2.3'}
-    ${'<8.0,>=7'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>=7'}
-    ${'<8.0,>=7.2'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>=7.2'}
-    ${'<8.0,>=7.2.3'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>=7.2.3'}
-    ${'<8.0.0,>=7'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3.0,>=7'}
-    ${'<8.0.0,>=7.2'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3.0,>=7.2'}
-    ${'<8.0.0,>=7.2.3'}  | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3.0,>=7.2.3'}
+    ${'<8,>=7'}          | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>=8'}
+    ${'<8,>=7.2'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>=8.2'}
+    ${'<8,>=7.2.3'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>=8.2.5'}
+    ${'<8.0,>=7'}        | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>=8'}
+    ${'<8.0,>=7.2'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>=8.2'}
+    ${'<8.0,>=7.2.3'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>=8.2.5'}
+    ${'<8.0.0,>=7'}      | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>=8'}
+    ${'<8.0.0,>=7.2'}    | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>=8.2'}
+    ${'<8.0.0,>=7.2.3'}  | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3.0,>=8.2.5'}
     ${'<6,>=5'}          | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'<6,>=5.2.5'}
     ${'<6,>=5.2'}        | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'<6,>=5.2.5'}
     ${'<6,>=5.2.3'}      | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'<6,>=5.2.5'}
@@ -403,15 +403,15 @@ describe('versioning/rez/index', () => {
     ${'<2.0,>=1.2'}      | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<2.3,>=1.2'}
     ${'<2.0,>=1.2.3'}    | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<2.3,>=1.2.3'}
     ${'<2.0.0,>=1.2.3'}  | ${'widen'}    | ${'1.2.3'}     | ${'2.2.5'} | ${'<2.3.0,>=1.2.3'}
-    ${'<8,>6'}           | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>6'}
-    ${'<8,>7.1'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>7.1'}
-    ${'<8,>7.2.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>7.2.0'}
-    ${'<8.0,>6'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>6'}
-    ${'<8.0,>7.1'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>7.1'}
-    ${'<8.0,>7.2.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>7.2.0'}
-    ${'<8.0.0,>6'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3.0,>6'}
-    ${'<8.0.0,>7.1'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3.0,>7.1'}
-    ${'<8.0.0,>7.2.0'}   | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3.0,>7.2.0'}
+    ${'<8,>6'}           | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>8'}
+    ${'<8,>7.1'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>8.2'}
+    ${'<8,>7.2.0'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<9,>8.2'}
+    ${'<8.0,>6'}         | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>8'}
+    ${'<8.0,>7.1'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>8.2'}
+    ${'<8.0,>7.2.0'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>8.2'}
+    ${'<8.0.0,>6'}       | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>8'}
+    ${'<8.0.0,>7.1'}     | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3,>8.2'}
+    ${'<8.0.0,>7.2.0'}   | ${'replace'}  | ${'7.2.3'}     | ${'8.2.5'} | ${'<8.3.0,>8.2'}
     ${'<6,>4'}           | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'<6,>4'}
     ${'<6,>5.1'}         | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'<6,>5.1'}
     ${'<6,>5.2.0'}       | ${'bump'}     | ${'5.2.3'}     | ${'5.2.5'} | ${'<6,>5.2.0'}
-- 
GitLab