diff --git a/lib/versioning/cargo/index.ts b/lib/versioning/cargo/index.ts
index 50847c56b2b6d87dfd317fe265ec89c6fa67f1bc..aa21ac9c573afa3a5403197a90de4b34dac42f19 100644
--- a/lib/versioning/cargo/index.ts
+++ b/lib/versioning/cargo/index.ts
@@ -1,5 +1,5 @@
 import { api as npm } from '../npm';
-import { VersioningApi, RangeStrategy } from '../common';
+import { VersioningApi, NewValueConfig } from '../common';
 
 const isVersion = (input: string): string | boolean => npm.isVersion(input);
 
@@ -64,12 +64,12 @@ const isSingleVersion = (constraint: string): string | boolean =>
       .trim()
   );
 
-function getNewValue(
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string {
+function getNewValue({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string {
   if (rangeStrategy === 'pin' || isSingleVersion(currentValue)) {
     let res = '=';
     if (currentValue.startsWith('= ')) {
@@ -78,12 +78,12 @@ function getNewValue(
     res += toVersion;
     return res;
   }
-  const newSemver = npm.getNewValue(
-    cargo2npm(currentValue),
+  const newSemver = npm.getNewValue({
+    currentValue: cargo2npm(currentValue),
     rangeStrategy,
     fromVersion,
-    toVersion
-  );
+    toVersion,
+  });
   let newCargo = npm2cargo(newSemver);
   // Try to reverse any caret we added
   if (newCargo.startsWith('^') && !currentValue.startsWith('^')) {
diff --git a/lib/versioning/common.ts b/lib/versioning/common.ts
index 06ffe3da243172972fa4d2cf6cba351ff47fea71..c1e3a5aba8a585d28093346d1d963f9db77c07f1 100644
--- a/lib/versioning/common.ts
+++ b/lib/versioning/common.ts
@@ -9,6 +9,12 @@ export type RangeStrategy =
   | 'update-lockfile'
   | 'widen';
 
+export interface NewValueConfig {
+  currentValue: string;
+  rangeStrategy: RangeStrategy;
+  fromVersion?: string;
+  toVersion: string;
+}
 export interface VersioningApi {
   // validation
   isCompatible(version: string, range?: string): string | boolean | null;
@@ -28,12 +34,7 @@ export interface VersioningApi {
   isLessThanRange?(version: string, range: string): boolean;
   maxSatisfyingVersion(versions: string[], range: string): string | null;
   minSatisfyingVersion(versions: string[], range: string): string | null;
-  getNewValue(
-    currentValue: string,
-    rangeStrategy: RangeStrategy,
-    fromVersion: string,
-    toVersion: string
-  ): string;
+  getNewValue(newValueConfig: NewValueConfig): string;
   sortVersions(version: string, other: string): number;
 
   matches(version: string, range: string | Range): boolean;
diff --git a/lib/versioning/composer/index.ts b/lib/versioning/composer/index.ts
index c5880f4a91aebb42d4cb8dec01a550fa2f01ba64..a4a57a950f0c6805022a2b46a70116feb6a802aa 100644
--- a/lib/versioning/composer/index.ts
+++ b/lib/versioning/composer/index.ts
@@ -1,7 +1,7 @@
 import { coerce } from 'semver';
 import { logger } from '../../logger';
 import { api as npm } from '../npm';
-import { VersioningApi, RangeStrategy } from '../common';
+import { VersioningApi, NewValueConfig } from '../common';
 
 function padZeroes(input: string): string {
   const sections = input.split('.');
@@ -65,12 +65,12 @@ const maxSatisfyingVersion = (versions: string[], range: string): string =>
 const minSatisfyingVersion = (versions: string[], range: string): string =>
   npm.minSatisfyingVersion(versions.map(composer2npm), composer2npm(range));
 
-function getNewValue(
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string {
+function getNewValue({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string {
   if (rangeStrategy === 'pin') {
     return toVersion;
   }
@@ -84,12 +84,12 @@ function getNewValue(
     npm.isValid(currentValue) &&
     composer2npm(currentValue) === currentValue
   ) {
-    newValue = npm.getNewValue(
+    newValue = npm.getNewValue({
       currentValue,
       rangeStrategy,
       fromVersion,
-      padZeroes(toVersion)
-    );
+      toVersion: padZeroes(toVersion),
+    });
   } else if (currentValue.match(/^~(0\.[1-9][0-9]*)$/)) {
     // handle ~0.4 case first
     if (toMajor === 0) {
@@ -113,12 +113,12 @@ function getNewValue(
       .split('||')
       .pop()
       .trim();
-    const replacementValue = getNewValue(
-      lastValue,
+    const replacementValue = getNewValue({
+      currentValue: lastValue,
       rangeStrategy,
       fromVersion,
-      toVersion
-    );
+      toVersion,
+    });
     if (rangeStrategy === 'replace') {
       newValue = replacementValue;
     } else if (rangeStrategy === 'widen') {
diff --git a/lib/versioning/hashicorp/index.ts b/lib/versioning/hashicorp/index.ts
index f29b5ee4b0ac582f553d4768389aff78bf086aa7..faf9d3f47142bbb983e54556ab5cbcf36a395d72 100644
--- a/lib/versioning/hashicorp/index.ts
+++ b/lib/versioning/hashicorp/index.ts
@@ -1,5 +1,5 @@
 import { api as npm } from '../npm';
-import { VersioningApi, RangeStrategy } from '../common';
+import { VersioningApi, NewValueConfig } from '../common';
 
 function hashicorp2npm(input: string): string {
   // The only case incompatible with semver is a "short" ~>, e.g. ~> 1.2
@@ -21,12 +21,12 @@ const maxSatisfyingVersion = (versions: string[], range: string): string =>
 const minSatisfyingVersion = (versions: string[], range: string): string =>
   npm.minSatisfyingVersion(versions.map(hashicorp2npm), hashicorp2npm(range));
 
-function getNewValue(
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string {
+function getNewValue({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string {
   // handle specia. ~> 1.2 case
   if (currentValue.match(/(~>\s*)\d+\.\d+$/)) {
     return currentValue.replace(
@@ -34,7 +34,12 @@ function getNewValue(
       `$1${npm.getMajor(toVersion)}.0`
     );
   }
-  return npm.getNewValue(currentValue, rangeStrategy, fromVersion, toVersion);
+  return npm.getNewValue({
+    currentValue,
+    rangeStrategy,
+    fromVersion,
+    toVersion,
+  });
 }
 
 export const api: VersioningApi = {
diff --git a/lib/versioning/hex/index.ts b/lib/versioning/hex/index.ts
index 4f7b9a20f921903a2e3ae370ec9b0fc66ac33313..fb595dd1daf41c54a20165949cd80a776c696f3a 100644
--- a/lib/versioning/hex/index.ts
+++ b/lib/versioning/hex/index.ts
@@ -1,5 +1,5 @@
 import { api as npm } from '../npm';
-import { VersioningApi, RangeStrategy } from '../common';
+import { VersioningApi, NewValueConfig } from '../common';
 
 function hex2npm(input: string): string {
   return input
@@ -46,18 +46,18 @@ const maxSatisfyingVersion = (versions: string[], range: string): string =>
 const minSatisfyingVersion = (versions: string[], range: string): string =>
   npm.minSatisfyingVersion(versions.map(hex2npm), hex2npm(range));
 
-const getNewValue = (
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string => {
-  let newSemver = npm.getNewValue(
-    hex2npm(currentValue),
+const getNewValue = ({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string => {
+  let newSemver = npm.getNewValue({
+    currentValue: hex2npm(currentValue),
     rangeStrategy,
     fromVersion,
-    toVersion
-  );
+    toVersion,
+  });
   newSemver = npm2hex(newSemver);
   if (currentValue.match(/~>\s*(\d+\.\d+)$/)) {
     newSemver = newSemver.replace(
diff --git a/lib/versioning/loose/generic.ts b/lib/versioning/loose/generic.ts
index ce5c09d199482c5b1a8ad353fcd2466b2e3de151..1e2641eb4da19b0214af1b43dd75d729685a6c05 100644
--- a/lib/versioning/loose/generic.ts
+++ b/lib/versioning/loose/generic.ts
@@ -1,4 +1,4 @@
-import { VersioningApi, RangeStrategy } from '../common';
+import { VersioningApi, NewValueConfig } from '../common';
 
 export interface GenericVersion {
   release: number[];
@@ -80,12 +80,8 @@ export const comparer = (
   function minSatisfyingVersion(versions: string[], range: string): string {
     return versions.find(v => equals(v, range)) || null;
   }
-  function getNewValue(
-    _currentValue: string,
-    _rangeStrategy: RangeStrategy,
-    _fromVersion: string,
-    toVersion: string
-  ): string {
+  function getNewValue(newValueConfig: NewValueConfig): string {
+    const { toVersion } = newValueConfig || {};
     return toVersion;
   }
   function sortVersions(version: string, other: string): number {
@@ -190,12 +186,8 @@ export abstract class GenericVersioningApi<
   }
 
   // eslint-disable-next-line class-methods-use-this
-  getNewValue(
-    _currentValue: string,
-    _rangeStrategy: RangeStrategy,
-    _fromVersion: string,
-    toVersion: string
-  ): string {
+  getNewValue(newValueConfig: NewValueConfig): string {
+    const { toVersion } = newValueConfig || {};
     return toVersion;
   }
 
diff --git a/lib/versioning/maven/index.ts b/lib/versioning/maven/index.ts
index 9e4b8a88b1f0312803472efab06f0b66599061a3..c1636d7f7600d6a11d9c162ed677dcbca9b4b313 100644
--- a/lib/versioning/maven/index.ts
+++ b/lib/versioning/maven/index.ts
@@ -12,7 +12,7 @@ import {
   qualifierType,
   QualifierTypes,
 } from './compare';
-import { RangeStrategy, VersioningApi } from '../common';
+import { NewValueConfig, VersioningApi } from '../common';
 
 const equals = (a: string, b: string): boolean => compare(a, b) === 0;
 
@@ -114,12 +114,11 @@ const maxSatisfyingVersion = (versions: string[], range: string): string => {
   }, null);
 };
 
-function getNewValue(
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  _fromVersion: string,
-  toVersion: string
-): string | null {
+function getNewValue({
+  currentValue,
+  rangeStrategy,
+  toVersion,
+}: NewValueConfig): string | null {
   if (isVersion(currentValue) || rangeStrategy === 'pin') {
     return toVersion;
   }
diff --git a/lib/versioning/node/index.ts b/lib/versioning/node/index.ts
index dcde501adc3a0648e29ee74cf670d33d291887ba..c7ac9e9a5212c46367202f19ea3a43b39cd75cd3 100644
--- a/lib/versioning/node/index.ts
+++ b/lib/versioning/node/index.ts
@@ -1,18 +1,18 @@
 import npm, { isVersion, isValid } from '../npm';
-import { RangeStrategy, VersioningApi } from '../common';
+import { NewValueConfig, VersioningApi } from '../common';
 
-function getNewValue(
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string {
-  const res = npm.getNewValue(
+function getNewValue({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string {
+  const res = npm.getNewValue({
     currentValue,
     rangeStrategy,
     fromVersion,
-    toVersion
-  );
+    toVersion,
+  });
   if (isVersion(res)) {
     // normalize out any 'v' prefix
     return isVersion(res);
diff --git a/lib/versioning/npm/range.ts b/lib/versioning/npm/range.ts
index 56019cec7ee3d4f3310e8f3d4ace45789fc94175..94bfeb21eeb948d5c2e8440e0f753ebe96479b41 100644
--- a/lib/versioning/npm/range.ts
+++ b/lib/versioning/npm/range.ts
@@ -9,14 +9,14 @@ import {
 } from 'semver';
 import { parseRange } from 'semver-utils';
 import { logger } from '../../logger';
-import { RangeStrategy } from '../common';
+import { NewValueConfig } from '../common';
 
-export function getNewValue(
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string {
+export function getNewValue({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string {
   if (rangeStrategy === 'pin' || isVersion(currentValue)) {
     return toVersion;
   }
@@ -24,17 +24,22 @@ export function getNewValue(
     if (satisfies(toVersion, currentValue)) {
       return currentValue;
     }
-    return getNewValue(currentValue, 'replace', fromVersion, toVersion);
+    return getNewValue({
+      currentValue,
+      rangeStrategy: 'replace',
+      fromVersion,
+      toVersion,
+    });
   }
   const parsedRange = parseRange(currentValue);
   const element = parsedRange[parsedRange.length - 1];
   if (rangeStrategy === 'widen') {
-    const newValue = getNewValue(
+    const newValue = getNewValue({
       currentValue,
-      'replace',
+      rangeStrategy: 'replace',
       fromVersion,
-      toVersion
-    );
+      toVersion,
+    });
     if (element.operator && element.operator.startsWith('<')) {
       // TODO fix this
       const splitCurrent = currentValue.split(element.operator);
@@ -63,7 +68,12 @@ export function getNewValue(
   if (rangeStrategy === 'bump') {
     if (parsedRange.length === 1) {
       if (!element.operator) {
-        return getNewValue(currentValue, 'replace', fromVersion, toVersion);
+        return getNewValue({
+          currentValue,
+          rangeStrategy: 'replace',
+          fromVersion,
+          toVersion,
+        });
       }
       if (element.operator === '^') {
         const split = currentValue.split('.');
diff --git a/lib/versioning/pep440/range.ts b/lib/versioning/pep440/range.ts
index fafb81b38b99ebbf36d8b030f866bde200433ef0..c7145161143fc13c259ba74fd9b2d21adbc6912f 100644
--- a/lib/versioning/pep440/range.ts
+++ b/lib/versioning/pep440/range.ts
@@ -2,7 +2,7 @@ import { gte, lte, satisfies } from '@renovate/pep440';
 import { parse as parseVersion } from '@renovate/pep440/lib/version';
 import { parse as parseRange } from '@renovate/pep440/lib/specifier';
 import { logger } from '../../logger';
-import { RangeStrategy } from '../common';
+import { NewValueConfig } from '../common';
 
 function getFutureVersion(
   baseVersion: string,
@@ -35,12 +35,12 @@ interface Range {
   version: string;
 }
 
-export function getNewValue(
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string {
+export function getNewValue({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string {
   // easy pin
   if (rangeStrategy === 'pin') {
     return '==' + toVersion;
@@ -67,7 +67,12 @@ export function getNewValue(
         rangeStrategy +
         '. Using "replace" instead.'
     );
-    return getNewValue(currentValue, 'replace', fromVersion, toVersion);
+    return getNewValue({
+      currentValue,
+      rangeStrategy: 'replace',
+      fromVersion,
+      toVersion,
+    });
   }
   if (ranges.some(range => range.operator === '===')) {
     // the operator "===" is used for legacy non PEP440 versions
diff --git a/lib/versioning/poetry/index.ts b/lib/versioning/poetry/index.ts
index 49ec562ff31080d5897dd198e31b7a2a25cbe8f8..e6b77e9cddf17a3a5a2647c7f41355cc451f6c5f 100644
--- a/lib/versioning/poetry/index.ts
+++ b/lib/versioning/poetry/index.ts
@@ -1,7 +1,7 @@
 import { parseRange } from 'semver-utils';
 import { major, minor } from 'semver';
 import { api as npm } from '../npm';
-import { RangeStrategy, VersioningApi } from '../common';
+import { NewValueConfig, VersioningApi } from '../common';
 
 function notEmpty(s: string): boolean {
   return s !== '';
@@ -82,12 +82,12 @@ function handleShort(
   return null;
 }
 
-function getNewValue(
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string {
+function getNewValue({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string {
   if (rangeStrategy === 'replace') {
     const npmCurrentValue = poetry2npm(currentValue);
     const parsedRange = parseRange(npmCurrentValue);
@@ -107,12 +107,12 @@ function getNewValue(
       }
     }
   }
-  const newSemver = npm.getNewValue(
-    poetry2npm(currentValue),
+  const newSemver = npm.getNewValue({
+    currentValue: poetry2npm(currentValue),
     rangeStrategy,
     fromVersion,
-    toVersion
-  );
+    toVersion,
+  });
   const newPoetry = npm2poetry(newSemver);
   return newPoetry;
 }
diff --git a/lib/versioning/ruby/index.ts b/lib/versioning/ruby/index.ts
index 0da4b089940c0da973c366e27e28b6b98b3cca14..0d4b4b3f89fdc0a7f63df6dade7bc107b6fc5922 100644
--- a/lib/versioning/ruby/index.ts
+++ b/lib/versioning/ruby/index.ts
@@ -6,7 +6,7 @@ import {
   maxSatisfying,
   minSatisfying,
 } from '@snyk/ruby-semver';
-import { VersioningApi, RangeStrategy } from '../common';
+import { VersioningApi, NewValueConfig } from '../common';
 import { logger } from '../../logger';
 import { parse as parseVersion } from './version';
 import { parse as parseRange, ltr } from './range';
@@ -66,12 +66,12 @@ const maxSatisfyingVersion = (versions: string[], range: string): string =>
 const minSatisfyingVersion = (versions: string[], range: string): string =>
   minSatisfying(versions.map(vtrim), vtrim(range));
 
-const getNewValue = (
-  currentValue: string,
-  rangeStrategy: RangeStrategy,
-  fromVersion: string,
-  toVersion: string
-): string => {
+const getNewValue = ({
+  currentValue,
+  rangeStrategy,
+  fromVersion,
+  toVersion,
+}: NewValueConfig): string => {
   let result = null;
   if (isVersion(currentValue)) {
     return currentValue.startsWith('v') ? 'v' + toVersion : toVersion;
diff --git a/lib/versioning/semver/index.ts b/lib/versioning/semver/index.ts
index 9b068e357867d0ea3bee3cd96a91f206b0930dc1..389d81b4e556ed5aaadb276e2933bdb735f08fc2 100644
--- a/lib/versioning/semver/index.ts
+++ b/lib/versioning/semver/index.ts
@@ -1,6 +1,6 @@
 import semver from 'semver';
 import stable from 'semver-stable';
-import { RangeStrategy, VersioningApi } from '../common';
+import { NewValueConfig, VersioningApi } from '../common';
 
 const { is: isStable } = stable;
 
@@ -23,12 +23,7 @@ export const isVersion = (input: string): string => valid(input);
 
 export { isVersion as isValid, maxSatisfyingVersion };
 
-function getNewValue(
-  _currentValue: string,
-  _rangeStrategy: RangeStrategy,
-  _fromVersion: string,
-  toVersion: string
-): string {
+function getNewValue({ toVersion }: NewValueConfig): string {
   return toVersion;
 }
 
diff --git a/lib/versioning/swift/range.ts b/lib/versioning/swift/range.ts
index 9bfaa6a4a2ec0f585fc199396d152622527ef7d8..7f15bf564f659e22943f93df1e15a8fdade7628b 100644
--- a/lib/versioning/swift/range.ts
+++ b/lib/versioning/swift/range.ts
@@ -1,5 +1,5 @@
 import semver from 'semver';
-import { RangeStrategy } from '../common';
+import { NewValueConfig } from '../common';
 
 const fromParam = /^\s*from\s*:\s*"([^"]+)"\s*$/;
 const fromRange = /^\s*"([^"]+)"\s*\.\.\.\s*$/;
@@ -34,12 +34,7 @@ function toSemverRange(range: string): string {
   return null;
 }
 
-function getNewValue(
-  currentValue: string,
-  _rangeStrategy: RangeStrategy,
-  _fromVersion: string,
-  toVersion: string
-): string {
+function getNewValue({ currentValue, toVersion }: NewValueConfig): string {
   if (fromParam.test(currentValue)) {
     return toVersion;
   }
diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts
index 0be041a64d7639f9f63c8c1ed25a9757271fd45e..de6c5d8ddeb26907ef22a1193d2363021d3a59a5 100644
--- a/lib/workers/repository/process/lookup/index.ts
+++ b/lib/workers/repository/process/lookup/index.ts
@@ -239,12 +239,12 @@ export async function lookupUpdates(
       res.updates.push({
         updateType: 'pin',
         isPin: true,
-        newValue: version.getNewValue(
+        newValue: version.getNewValue({
           currentValue,
           rangeStrategy,
           fromVersion,
-          fromVersion
-        ),
+          toVersion: fromVersion,
+        }),
         newMajor: version.getMajor(fromVersion),
       });
     }
@@ -271,12 +271,12 @@ export async function lookupUpdates(
     for (const toVersion of filteredVersions) {
       const update: LookupUpdate = { fromVersion, toVersion } as any;
       try {
-        update.newValue = version.getNewValue(
+        update.newValue = version.getNewValue({
           currentValue,
           rangeStrategy,
           fromVersion,
-          toVersion
-        );
+          toVersion,
+        });
       } catch (err) /* istanbul ignore next */ {
         logger.warn(
           { err, currentValue, rangeStrategy, fromVersion, toVersion },
diff --git a/lib/workers/repository/process/lookup/rollback.ts b/lib/workers/repository/process/lookup/rollback.ts
index 0972187068f5f14fca4af7945ad51bc127266f6b..a16a480647374af26c72539ceb8592664524a123 100644
--- a/lib/workers/repository/process/lookup/rollback.ts
+++ b/lib/workers/repository/process/lookup/rollback.ts
@@ -49,13 +49,11 @@ export function getRollbackUpdate(
     logger.info('No toVersion to roll back to');
     return null;
   }
-  let fromVersion: string;
-  const newValue = version.getNewValue(
+  const newValue = version.getNewValue({
     currentValue,
-    'replace',
-    fromVersion,
-    toVersion
-  );
+    rangeStrategy: 'replace',
+    toVersion,
+  });
   return {
     updateType: 'rollback',
     branchName:
diff --git a/test/versioning/cargo.spec.ts b/test/versioning/cargo.spec.ts
index a1a1524477da39c2d8df4bebc7c5e963a9fd405b..cb1ceb79dfa33c251ad54a116737eee1360f6978 100644
--- a/test/versioning/cargo.spec.ts
+++ b/test/versioning/cargo.spec.ts
@@ -104,107 +104,262 @@ describe('semver.isSingleVersion()', () => {
 });
 describe('semver.getNewValue()', () => {
   it('bumps equals', () => {
-    expect(semver.getNewValue('=1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
-    expect(semver.getNewValue('   =1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '=1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '   =1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
   });
   it('bumps equals space', () => {
-    expect(semver.getNewValue('= 1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '= 1.1.0'
-    );
-    expect(semver.getNewValue('  = 1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
-    expect(semver.getNewValue('  =   1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
-    expect(semver.getNewValue('=    1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '= 1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '= 1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('= 1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '  = 1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '  =   1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '=    1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('= 1.1.0');
   });
   it('bumps version range', () => {
-    expect(semver.getNewValue('1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('1.1.0');
   });
   it('bumps short caret to same', () => {
-    expect(semver.getNewValue('^1.0', 'bump', '1.0.0', '1.0.7')).toEqual(
-      '^1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7',
+      })
+    ).toEqual('^1.0');
   });
   it('replaces with newer', () => {
-    expect(semver.getNewValue('^1.0.0', 'replace', '1.0.0', '2.0.7')).toEqual(
-      '^2.0.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '2.0.7',
+      })
+    ).toEqual('^2.0.0');
   });
   it('replaces with version range', () => {
-    expect(semver.getNewValue('1.0.0', 'replace', '1.0.0', '2.0.7')).toEqual(
-      '2.0.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '2.0.7',
+      })
+    ).toEqual('2.0.0');
   });
   it('updates naked caret', () => {
-    expect(semver.getNewValue('^1', 'bump', '1.0.0', '2.1.7')).toEqual('^2');
+    expect(
+      semver.getNewValue({
+        currentValue: '^1',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '2.1.7',
+      })
+    ).toEqual('^2');
   });
   it('bumps naked tilde', () => {
-    expect(semver.getNewValue('~1', 'bump', '1.0.0', '1.1.7')).toEqual('~1');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.7',
+      })
+    ).toEqual('~1');
   });
   it('bumps naked major', () => {
-    expect(semver.getNewValue('5', 'bump', '5.0.0', '5.1.7')).toEqual('5');
-    expect(semver.getNewValue('5', 'bump', '5.0.0', '6.1.7')).toEqual('6');
+    expect(
+      semver.getNewValue({
+        currentValue: '5',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.1.7',
+      })
+    ).toEqual('5');
+    expect(
+      semver.getNewValue({
+        currentValue: '5',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '6.1.7',
+      })
+    ).toEqual('6');
   });
   it('bumps naked minor', () => {
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '5.0.7')).toEqual('5.0');
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '5.1.7')).toEqual('5.1');
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '6.1.7')).toEqual('6.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.0.7',
+      })
+    ).toEqual('5.0');
+
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.1.7',
+      })
+    ).toEqual('5.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '6.1.7',
+      })
+    ).toEqual('6.1');
   });
   it('replaces minor', () => {
-    expect(semver.getNewValue('5.0', 'replace', '5.0.0', '6.1.7')).toEqual(
-      '6.1'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'replace',
+        fromVersion: '5.0.0',
+        toVersion: '6.1.7',
+      })
+    ).toEqual('6.1');
   });
   it('replaces equals', () => {
-    expect(semver.getNewValue('=1.0.0', 'replace', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '=1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
   });
   it('handles long asterisk', () => {
-    expect(semver.getNewValue('1.0.*', 'replace', '1.0.0', '1.1.0')).toEqual(
-      '1.1.*'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.*',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('1.1.*');
   });
   it('handles short asterisk', () => {
-    expect(semver.getNewValue('1.*', 'replace', '1.0.0', '2.1.0')).toEqual(
-      '2.*'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.*',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '2.1.0',
+      })
+    ).toEqual('2.*');
   });
   it('handles updating from stable to unstable', () => {
     expect(
-      semver.getNewValue('~0.6.1', 'replace', '0.6.8', '0.7.0-rc.2')
+      semver.getNewValue({
+        currentValue: '~0.6.1',
+        rangeStrategy: 'replace',
+        fromVersion: '0.6.8',
+        toVersion: '0.7.0-rc.2',
+      })
     ).toEqual('~0.7.0-rc');
   });
   it('handles less than version requirements', () => {
-    expect(semver.getNewValue('<1.3.4', 'replace', '1.2.3', '1.5.0')).toEqual(
-      '<1.5.1'
-    );
-    expect(semver.getNewValue('< 1.3.4', 'replace', '1.2.3', '1.5.0')).toEqual(
-      '< 1.5.1'
-    );
-    expect(
-      semver.getNewValue('<   1.3.4', 'replace', '1.2.3', '1.5.0')
+    expect(
+      semver.getNewValue({
+        currentValue: '<1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
+    ).toEqual('<1.5.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '< 1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
+    ).toEqual('< 1.5.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '<   1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
     ).toEqual('< 1.5.1');
   });
   it('handles less than equals version requirements', () => {
-    expect(semver.getNewValue('<=1.3.4', 'replace', '1.2.3', '1.5.0')).toEqual(
-      '<=1.5.0'
-    );
-    expect(semver.getNewValue('<= 1.3.4', 'replace', '1.2.3', '1.5.0')).toEqual(
-      '<= 1.5.0'
-    );
-    expect(
-      semver.getNewValue('<=   1.3.4', 'replace', '1.2.3', '1.5.0')
+    expect(
+      semver.getNewValue({
+        currentValue: '<=1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
+    ).toEqual('<=1.5.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '<= 1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
+    ).toEqual('<= 1.5.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '<=   1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
     ).toEqual('<= 1.5.0');
   });
 });
diff --git a/test/versioning/composer.spec.ts b/test/versioning/composer.spec.ts
index 6cee2aebadc23300e05fbbb82e8a60bc60299cb9..a7c3a70c631b454515d7e0df619cf6068fbb9975 100644
--- a/test/versioning/composer.spec.ts
+++ b/test/versioning/composer.spec.ts
@@ -107,60 +107,143 @@ describe('semver.matches()', () => {
 });
 describe('semver.getNewValue()', () => {
   it('returns pinned toVersion', () => {
-    expect(semver.getNewValue('~1.0', 'pin', '1.0', 'V1.1')).toEqual('V1.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1.0',
+        rangeStrategy: 'pin',
+        fromVersion: '1.0',
+        toVersion: 'V1.1',
+      })
+    ).toEqual('V1.1');
   });
   it('returns toVersion', () => {
-    expect(semver.getNewValue('v1.0', 'replace', '1.0', '1.1')).toEqual('v1.1');
+    expect(
+      semver.getNewValue({
+        currentValue: 'v1.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0',
+        toVersion: '1.1',
+      })
+    ).toEqual('v1.1');
   });
   it('bumps short caret to same', () => {
-    expect(semver.getNewValue('^1.0', 'bump', '1.0.0', '1.0.7')).toEqual(
-      '^1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7',
+      })
+    ).toEqual('^1.0');
   });
   it('handles tilde zero', () => {
-    expect(semver.getNewValue('~0.2', 'replace', '0.2.0', '0.3.0')).toEqual(
-      '~0.3'
-    );
-    expect(semver.getNewValue('~0.2', 'replace', '0.2.0', '1.1.0')).toEqual(
-      '~1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '~0.2',
+        rangeStrategy: 'replace',
+        fromVersion: '0.2.0',
+        toVersion: '0.3.0',
+      })
+    ).toEqual('~0.3');
+    expect(
+      semver.getNewValue({
+        currentValue: '~0.2',
+        rangeStrategy: 'replace',
+        fromVersion: '0.2.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('~1.0');
   });
   it('handles tilde major', () => {
-    expect(semver.getNewValue('~4', 'replace', '4.0.0', '4.2.0')).toEqual('~4');
-    expect(semver.getNewValue('~4', 'replace', '4.0.0', '5.1.0')).toEqual('~5');
+    expect(
+      semver.getNewValue({
+        currentValue: '~4',
+        rangeStrategy: 'replace',
+        fromVersion: '4.0.0',
+        toVersion: '4.2.0',
+      })
+    ).toEqual('~4');
+    expect(
+      semver.getNewValue({
+        currentValue: '~4',
+        rangeStrategy: 'replace',
+        fromVersion: '4.0.0',
+        toVersion: '5.1.0',
+      })
+    ).toEqual('~5');
   });
   it('handles tilde minor', () => {
-    expect(semver.getNewValue('~4.0', 'replace', '4.0.0', '5.1.0')).toEqual(
-      '~5.0'
-    );
-    expect(semver.getNewValue('~4.0', 'replace', '4.0.0', '4.1.0')).toEqual(
-      '~4.1'
-    );
-    expect(
-      semver.getNewValue('~1.2 || ~2.0', 'replace', '2.0.0', '3.1.0')
+    expect(
+      semver.getNewValue({
+        currentValue: '~4.0',
+        rangeStrategy: 'replace',
+        fromVersion: '4.0.0',
+        toVersion: '5.1.0',
+      })
+    ).toEqual('~5.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '~4.0',
+        rangeStrategy: 'replace',
+        fromVersion: '4.0.0',
+        toVersion: '4.1.0',
+      })
+    ).toEqual('~4.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1.2 || ~2.0',
+        rangeStrategy: 'replace',
+        fromVersion: '2.0.0',
+        toVersion: '3.1.0',
+      })
     ).toEqual('~3.0');
     expect(
-      semver.getNewValue('~1.2 || ~2.0', 'widen', '2.0.0', '3.1.0')
+      semver.getNewValue({
+        currentValue: '~1.2 || ~2.0',
+        rangeStrategy: 'widen',
+        fromVersion: '2.0.0',
+        toVersion: '3.1.0',
+      })
     ).toEqual('~1.2 || ~2.0 || ~3.0');
   });
   it('returns toVersion if unsupported', () => {
-    expect(semver.getNewValue('+4.0.0', 'replace', '4.0.0', '4.2.0')).toEqual(
-      '4.2.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '+4.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '4.0.0',
+        toVersion: '4.2.0',
+      })
+    ).toEqual('4.2.0');
   });
   it('returns versioned toVersion', () => {
-    expect(semver.getNewValue('v4.0.0', 'replace', '4.0.0', '4.2.0')).toEqual(
-      'v4.2.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: 'v4.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '4.0.0',
+        toVersion: '4.2.0',
+      })
+    ).toEqual('v4.2.0');
   });
   it('bumps short caret with v', () => {
-    expect(semver.getNewValue('^v1.0', 'bump', '1.0.0', '1.1.7')).toEqual(
-      '^v1.1'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^v1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.7',
+      })
+    ).toEqual('^v1.1');
   });
   it('handles differing lengths', () => {
-    expect(semver.getNewValue('3.6.*', 'replace', '3.6.0', '3.7')).toEqual(
-      '3.7.*'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '3.6.*',
+        rangeStrategy: 'replace',
+        fromVersion: '3.6.0',
+        toVersion: '3.7',
+      })
+    ).toEqual('3.7.*');
   });
 });
diff --git a/test/versioning/docker.spec.ts b/test/versioning/docker.spec.ts
index c4a656e09db4b8630d2d2ecf8c11e7ea3e959d40..c7a51985dc86d13527324abebdd2c74a5126f481 100644
--- a/test/versioning/docker.spec.ts
+++ b/test/versioning/docker.spec.ts
@@ -118,7 +118,14 @@ describe('docker.', () => {
   });
   describe('getNewValue(', () => {
     it('returns toVersion', () => {
-      expect(docker.getNewValue(null, null, null, '1.2.3')).toBe('1.2.3');
+      expect(
+        docker.getNewValue({
+          currentValue: null,
+          rangeStrategy: null,
+          fromVersion: null,
+          toVersion: '1.2.3',
+        })
+      ).toBe('1.2.3');
     });
   });
 });
diff --git a/test/versioning/hashicorp.spec.ts b/test/versioning/hashicorp.spec.ts
index 72e6d50396abe4a3341bb5eb5d41ef808abab58e..a1260bfd6a03ad02465ab6ba5fda080d0f539c3d 100644
--- a/test/versioning/hashicorp.spec.ts
+++ b/test/versioning/hashicorp.spec.ts
@@ -51,16 +51,31 @@ describe('semver.minSatisfyingVersion()', () => {
 });
 describe('semver.getNewValue()', () => {
   it('handles tilde greater than', () => {
-    expect(semver.getNewValue('~> 1.2', 'replace', '1.2.3', '2.0.7')).toEqual(
-      '~> 2.0'
-    );
-    expect(semver.getNewValue('~> 1.2.0', 'replace', '1.2.3', '2.0.7')).toEqual(
-      '~> 2.0.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '~> 1.2',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
+    ).toEqual('~> 2.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '~> 1.2.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
+    ).toEqual('~> 2.0.0');
   });
   it('handles comma dividers', () => {
     expect(
-      semver.getNewValue('>= 1.0.0, <= 2.0.0', 'widen', '1.2.3', '2.0.7')
+      semver.getNewValue({
+        currentValue: '>= 1.0.0, <= 2.0.0',
+        rangeStrategy: 'widen',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
     ).toEqual('>= 1.0.0, <= 2.0.7');
   });
 });
diff --git a/test/versioning/hex.spec.ts b/test/versioning/hex.spec.ts
index 6a218de89fa7762b24adfb81000e7a97da1fea41..f8766c11af6109f8e4f72b96b25fed45993280c8 100644
--- a/test/versioning/hex.spec.ts
+++ b/test/versioning/hex.spec.ts
@@ -71,50 +71,105 @@ describe('lib/versioning/hex', () => {
   describe('hexScheme.getNewValue()', () => {
     it('handles tilde greater than', () => {
       expect(
-        hexScheme.getNewValue('~> 1.2', 'replace', '1.2.3', '2.0.7')
+        hexScheme.getNewValue({
+          currentValue: '~> 1.2',
+          rangeStrategy: 'replace',
+          fromVersion: '1.2.3',
+          toVersion: '2.0.7',
+        })
       ).toEqual('~> 2.0');
-      expect(hexScheme.getNewValue('~> 1.2', 'pin', '1.2.3', '2.0.7')).toEqual(
-        '2.0.7'
-      );
-      expect(hexScheme.getNewValue('~> 1.2', 'bump', '1.2.3', '2.0.7')).toEqual(
-        '~> 2'
-      );
       expect(
-        hexScheme.getNewValue('~> 1.2.0', 'replace', '1.2.3', '2.0.7')
+        hexScheme.getNewValue({
+          currentValue: '~> 1.2',
+          rangeStrategy: 'pin',
+          fromVersion: '1.2.3',
+          toVersion: '2.0.7',
+        })
+      ).toEqual('2.0.7');
+      expect(
+        hexScheme.getNewValue({
+          currentValue: '~> 1.2',
+          rangeStrategy: 'bump',
+          fromVersion: '1.2.3',
+          toVersion: '2.0.7',
+        })
+      ).toEqual('~> 2');
+      expect(
+        hexScheme.getNewValue({
+          currentValue: '~> 1.2.0',
+          rangeStrategy: 'replace',
+          fromVersion: '1.2.3',
+          toVersion: '2.0.7',
+        })
       ).toEqual('~> 2.0.0');
       expect(
-        hexScheme.getNewValue('~> 1.2.0', 'pin', '1.2.3', '2.0.7')
+        hexScheme.getNewValue({
+          currentValue: '~> 1.2.0',
+          rangeStrategy: 'pin',
+          fromVersion: '1.2.3',
+          toVersion: '2.0.7',
+        })
       ).toEqual('2.0.7');
       expect(
-        hexScheme.getNewValue('~> 1.2.0', 'bump', '1.2.3', '2.0.7')
+        hexScheme.getNewValue({
+          currentValue: '~> 1.2.0',
+          rangeStrategy: 'bump',
+          fromVersion: '1.2.3',
+          toVersion: '2.0.7',
+        })
       ).toEqual('~> 2.0.7');
     });
   });
   it('handles and', () => {
     expect(
-      hexScheme.getNewValue('>= 1.0.0 and <= 2.0.0', 'widen', '1.2.3', '2.0.7')
+      hexScheme.getNewValue({
+        currentValue: '>= 1.0.0 and <= 2.0.0',
+        rangeStrategy: 'widen',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
     ).toEqual('>= 1.0.0 and <= 2.0.7');
     expect(
-      hexScheme.getNewValue(
-        '>= 1.0.0 and <= 2.0.0',
-        'replace',
-        '1.2.3',
-        '2.0.7'
-      )
+      hexScheme.getNewValue({
+        currentValue: '>= 1.0.0 and <= 2.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
     ).toEqual('<= 2.0.7');
     expect(
-      hexScheme.getNewValue('>= 1.0.0 and <= 2.0.0', 'pin', '1.2.3', '2.0.7')
+      hexScheme.getNewValue({
+        currentValue: '>= 1.0.0 and <= 2.0.0',
+        rangeStrategy: 'pin',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
     ).toEqual('2.0.7');
   });
   it('handles or', () => {
     expect(
-      hexScheme.getNewValue('>= 1.0.0 or <= 2.0.0', 'widen', '1.2.3', '2.0.7')
+      hexScheme.getNewValue({
+        currentValue: '>= 1.0.0 or <= 2.0.0',
+        rangeStrategy: 'widen',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
     ).toEqual('>= 1.0.0 or <= 2.0.7');
     expect(
-      hexScheme.getNewValue('>= 1.0.0 or <= 2.0.0', 'replace', '1.2.3', '2.0.7')
+      hexScheme.getNewValue({
+        currentValue: '>= 1.0.0 or <= 2.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
     ).toEqual('<= 2.0.7');
     expect(
-      hexScheme.getNewValue('>= 1.0.0 or <= 2.0.0', 'pin', '1.2.3', '2.0.7')
+      hexScheme.getNewValue({
+        currentValue: '>= 1.0.0 or <= 2.0.0',
+        rangeStrategy: 'pin',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.7',
+      })
     ).toEqual('2.0.7');
   });
 });
diff --git a/test/versioning/maven.spec.ts b/test/versioning/maven.spec.ts
index e40d3fc534425c4b7f5eb1dd465305ce8144b6e4..dfe6d49e58c43d7f3b45f176d2c3bd7a6d44373c 100644
--- a/test/versioning/maven.spec.ts
+++ b/test/versioning/maven.spec.ts
@@ -348,8 +348,22 @@ describe('versioning/maven/index', () => {
   it('api', () => {
     expect(maven.isGreaterThan('1.1', '1')).toBe(true);
     expect(maven.maxSatisfyingVersion(['1'], '1')).toBe('1');
-    expect(maven.getNewValue('1', null, null, '1.1')).toBe('1.1');
-    expect(maven.getNewValue('[1.2.3,]', null, null, '1.2.4')).toBe('[1.2.3,]');
+    expect(
+      maven.getNewValue({
+        currentValue: '1',
+        rangeStrategy: null,
+        fromVersion: null,
+        toVersion: '1.1',
+      })
+    ).toBe('1.1');
+    expect(
+      maven.getNewValue({
+        currentValue: '[1.2.3,]',
+        rangeStrategy: null,
+        fromVersion: null,
+        toVersion: '1.2.4',
+      })
+    ).toBe('[1.2.3,]');
   });
   it('pins maven ranges', () => {
     const sample = [
@@ -366,9 +380,14 @@ describe('versioning/maven/index', () => {
       ['[1.2.3,[', '1.2.3', '1.2.4'],
     ];
     sample.forEach(([currentValue, fromVersion, toVersion]) => {
-      expect(getNewValue(currentValue, 'pin', fromVersion, toVersion)).toEqual(
-        toVersion
-      );
+      expect(
+        getNewValue({
+          currentValue,
+          rangeStrategy: 'pin',
+          fromVersion,
+          toVersion,
+        })
+      ).toEqual(toVersion);
     });
   });
 });
diff --git a/test/versioning/node.spec.ts b/test/versioning/node.spec.ts
index 22923ffa18017d8d3261524bb12987ad30a50f6e..fa84c6b48ba5938e28fd5f4625b3e4e77f24e07d 100644
--- a/test/versioning/node.spec.ts
+++ b/test/versioning/node.spec.ts
@@ -2,13 +2,23 @@ import { api as nodever } from '../../lib/versioning/node';
 
 describe('semver.getNewValue()', () => {
   it('returns normalized toVersion', () => {
-    expect(nodever.getNewValue('1.0.0', 'replace', '1.0.0', 'v1.1.0')).toEqual(
-      '1.1.0'
-    );
+    expect(
+      nodever.getNewValue({
+        currentValue: '1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: 'v1.1.0',
+      })
+    ).toEqual('1.1.0');
   });
   it('returns range', () => {
-    expect(nodever.getNewValue('~8.0.0', 'replace', '8.0.2', 'v8.2.0')).toEqual(
-      '~8.2.0'
-    );
+    expect(
+      nodever.getNewValue({
+        currentValue: '~8.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '8.0.2',
+        toVersion: 'v8.2.0',
+      })
+    ).toEqual('~8.2.0');
   });
 });
diff --git a/test/versioning/npm.spec.ts b/test/versioning/npm.spec.ts
index 5df9076edeed0928bf3d0c19c713b16d486e4a23..3a2e3dada561ed1f7e7191a95194ceb73923a9f9 100644
--- a/test/versioning/npm.spec.ts
+++ b/test/versioning/npm.spec.ts
@@ -41,86 +41,205 @@ describe('semver.isSingleVersion()', () => {
 });
 describe('semver.getNewValue()', () => {
   it('bumps equals', () => {
-    expect(semver.getNewValue('=1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '=1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
   });
   it('bumps short caret to same', () => {
-    expect(semver.getNewValue('^1.0', 'bump', '1.0.0', '1.0.7')).toEqual(
-      '^1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7',
+      })
+    ).toEqual('^1.0');
   });
   it('bumps caret to prerelease', () => {
     expect(
-      semver.getNewValue('^1', 'bump', '1.0.0', '1.0.7-prerelease.1')
+      semver.getNewValue({
+        currentValue: '^1',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7-prerelease.1',
+      })
     ).toEqual('^1.0.7-prerelease.1');
   });
   it('replaces with newer', () => {
-    expect(semver.getNewValue('^1.0.0', 'replace', '1.0.0', '1.0.7')).toEqual(
-      '^1.0.7'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7',
+      })
+    ).toEqual('^1.0.7');
   });
   it('supports tilde greater than', () => {
-    expect(semver.getNewValue('~> 1.0.0', 'replace', '1.0.0', '1.1.7')).toEqual(
-      '~> 1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '~> 1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.7',
+      })
+    ).toEqual('~> 1.1.0');
   });
   it('bumps short caret to new', () => {
-    expect(semver.getNewValue('^1.0', 'bump', '1.0.0', '1.1.7')).toEqual(
-      '^1.1'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.7',
+      })
+    ).toEqual('^1.1');
   });
   it('bumps short tilde', () => {
-    expect(semver.getNewValue('~1.0', 'bump', '1.0.0', '1.1.7')).toEqual(
-      '~1.1'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '~1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.7',
+      })
+    ).toEqual('~1.1');
   });
   it('bumps tilde to prerelease', () => {
     expect(
-      semver.getNewValue('~1.0', 'bump', '1.0.0', '1.0.7-prerelease.1')
+      semver.getNewValue({
+        currentValue: '~1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7-prerelease.1',
+      })
     ).toEqual('~1.0.7-prerelease.1');
   });
   it('updates naked caret', () => {
-    expect(semver.getNewValue('^1', 'bump', '1.0.0', '2.1.7')).toEqual('^2');
+    expect(
+      semver.getNewValue({
+        currentValue: '^1',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '2.1.7',
+      })
+    ).toEqual('^2');
   });
   it('bumps naked tilde', () => {
-    expect(semver.getNewValue('~1', 'bump', '1.0.0', '1.1.7')).toEqual('~1');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.7',
+      })
+    ).toEqual('~1');
   });
   it('bumps naked major', () => {
-    expect(semver.getNewValue('5', 'bump', '5.0.0', '5.1.7')).toEqual('5');
-    expect(semver.getNewValue('5', 'bump', '5.0.0', '6.1.7')).toEqual('6');
+    expect(
+      semver.getNewValue({
+        currentValue: '5',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.1.7',
+      })
+    ).toEqual('5');
+    expect(
+      semver.getNewValue({
+        currentValue: '5',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '6.1.7',
+      })
+    ).toEqual('6');
   });
   it('bumps naked minor', () => {
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '5.0.7')).toEqual('5.0');
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '5.1.7')).toEqual('5.1');
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '6.1.7')).toEqual('6.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.0.7',
+      })
+    ).toEqual('5.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.1.7',
+      })
+    ).toEqual('5.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '6.1.7',
+      })
+    ).toEqual('6.1');
   });
   it('bumps greater or equals', () => {
-    expect(semver.getNewValue('>=1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '>=1.1.0'
-    );
-    expect(semver.getNewValue('>= 1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '>= 1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '>=1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('>=1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '>= 1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('>= 1.1.0');
   });
   it('replaces equals', () => {
-    expect(semver.getNewValue('=1.0.0', 'replace', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '=1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
   });
   it('handles long asterisk', () => {
-    expect(semver.getNewValue('1.0.*', 'replace', '1.0.0', '1.1.0')).toEqual(
-      '1.1.*'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.*',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('1.1.*');
   });
   it('handles short asterisk', () => {
-    expect(semver.getNewValue('1.*', 'replace', '1.0.0', '2.1.0')).toEqual(
-      '2.*'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.*',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '2.1.0',
+      })
+    ).toEqual('2.*');
   });
   it('handles updating from stable to unstable', () => {
     expect(
-      semver.getNewValue('~0.6.1', 'replace', '0.6.8', '0.7.0-rc.2')
+      semver.getNewValue({
+        currentValue: '~0.6.1',
+        rangeStrategy: 'replace',
+        fromVersion: '0.6.8',
+        toVersion: '0.7.0-rc.2',
+      })
     ).toEqual('~0.7.0-rc');
   });
 });
diff --git a/test/versioning/pep440.spec.ts b/test/versioning/pep440.spec.ts
index dc43bedff3c7aaabe3470a44dad64fd64549e779..7bdddca228565f44cad4b69e311ab2c1aecd76e0 100644
--- a/test/versioning/pep440.spec.ts
+++ b/test/versioning/pep440.spec.ts
@@ -117,19 +117,34 @@ describe('pep440.getNewValue()', () => {
     // impossible
     ['!=1.2.3', null],
   ].forEach(([currentValue, expectedBump]) => {
-    const bumped = getNewValue(currentValue, 'bump', '1.0.0', '1.2.3');
+    const bumped = getNewValue({
+      currentValue,
+      rangeStrategy: 'bump',
+      fromVersion: '1.0.0',
+      toVersion: '1.2.3',
+    });
     it(`bumps '${currentValue}' to '${expectedBump}'`, () => {
       expect(bumped).toBe(expectedBump);
     });
 
-    const replaced = getNewValue(currentValue, 'replace', '1.0.0', '1.2.3');
+    const replaced = getNewValue({
+      currentValue,
+      rangeStrategy: 'replace',
+      fromVersion: '1.0.0',
+      toVersion: '1.2.3',
+    });
     const needReplace = pep440.matches('1.2.3', currentValue);
     const expectedReplace = needReplace ? currentValue : bumped;
     it(`replaces '${currentValue}' to '${expectedReplace}'`, () => {
       expect(replaced).toBe(expectedReplace);
     });
 
-    const pinned = getNewValue(currentValue, 'pin', '1.0.0', '1.2.3');
+    const pinned = getNewValue({
+      currentValue,
+      rangeStrategy: 'pin',
+      fromVersion: '1.0.0',
+      toVersion: '1.2.3',
+    });
     const expectedPin = '==1.2.3';
     it(`pins '${currentValue}' to '${expectedPin}'`, () => {
       expect(pinned).toBe(expectedPin);
@@ -137,7 +152,12 @@ describe('pep440.getNewValue()', () => {
   });
 
   it('guards against unsupported rangeStrategy', () => {
-    const invalid = getNewValue('==1.0.0', 'update-lockfile', '1.0.0', '1.2.3');
+    const invalid = getNewValue({
+      currentValue: '==1.0.0',
+      rangeStrategy: 'update-lockfile',
+      fromVersion: '1.0.0',
+      toVersion: '1.2.3',
+    });
     expect(invalid).toEqual('==1.2.3');
   });
 });
diff --git a/test/versioning/poetry.spec.ts b/test/versioning/poetry.spec.ts
index b0e792c79ae816a343cc9c4459424f8b09456d2e..32a2a0ac1ba09be95f589359a2bbfe2a9321e099 100644
--- a/test/versioning/poetry.spec.ts
+++ b/test/versioning/poetry.spec.ts
@@ -108,145 +108,353 @@ describe('semver.maxSatisfyingVersion()', () => {
 
 describe('semver.getNewValue()', () => {
   it('bumps exact', () => {
-    expect(semver.getNewValue('1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '1.1.0'
-    );
-    expect(semver.getNewValue('   1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '1.1.0'
-    );
-    expect(semver.getNewValue('1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '   1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('1.1.0');
   });
   it('bumps equals', () => {
-    expect(semver.getNewValue('=1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
-    expect(semver.getNewValue('=  1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '=1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '=  1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
   });
   it('bumps equals space', () => {
-    expect(semver.getNewValue('= 1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
-    expect(semver.getNewValue('  = 1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
-    expect(semver.getNewValue('  =   1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
-    expect(semver.getNewValue('=    1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '= 1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '  = 1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '  =   1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '=    1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
   });
   it('bumps short caret to same', () => {
-    expect(semver.getNewValue('^1.0', 'bump', '1.0.0', '1.0.7')).toEqual(
-      '^1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7',
+      })
+    ).toEqual('^1.0');
   });
   it('replaces caret with newer', () => {
-    expect(semver.getNewValue('^1.0.0', 'replace', '1.0.0', '2.0.7')).toEqual(
-      '^2.0.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '2.0.7',
+      })
+    ).toEqual('^2.0.0');
   });
   it('replaces naked version', () => {
-    expect(semver.getNewValue('1.0.0', 'replace', '1.0.0', '2.0.7')).toEqual(
-      '2.0.7'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '2.0.7',
+      })
+    ).toEqual('2.0.7');
   });
   it('replaces with version range', () => {
-    expect(semver.getNewValue('1.0.0', 'replace', '1.0.0', '^2.0.7')).toEqual(
-      '^2.0.7'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '^2.0.7',
+      })
+    ).toEqual('^2.0.7');
   });
   it('bumps naked caret', () => {
-    expect(semver.getNewValue('^1', 'bump', '1.0.0', '2.1.7')).toEqual('^2');
+    expect(
+      semver.getNewValue({
+        currentValue: '^1',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '2.1.7',
+      })
+    ).toEqual('^2');
   });
   it('bumps naked tilde', () => {
-    expect(semver.getNewValue('~1', 'bump', '1.0.0', '1.1.7')).toEqual('~1');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.7',
+      })
+    ).toEqual('~1');
   });
   it('bumps naked major', () => {
-    expect(semver.getNewValue('5', 'bump', '5.0.0', '5.1.7')).toEqual('5');
-    expect(semver.getNewValue('5', 'bump', '5.0.0', '6.1.7')).toEqual('6');
+    expect(
+      semver.getNewValue({
+        currentValue: '5',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.1.7',
+      })
+    ).toEqual('5');
+    expect(
+      semver.getNewValue({
+        currentValue: '5',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '6.1.7',
+      })
+    ).toEqual('6');
   });
   it('bumps naked minor', () => {
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '5.0.7')).toEqual('5.0');
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '5.1.7')).toEqual('5.1');
-    expect(semver.getNewValue('5.0', 'bump', '5.0.0', '6.1.7')).toEqual('6.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.0.7',
+      })
+    ).toEqual('5.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '5.1.7',
+      })
+    ).toEqual('5.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'bump',
+        fromVersion: '5.0.0',
+        toVersion: '6.1.7',
+      })
+    ).toEqual('6.1');
   });
   it('replaces minor', () => {
-    expect(semver.getNewValue('5.0', 'replace', '5.0.0', '6.1.7')).toEqual(
-      '6.1'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '5.0',
+        rangeStrategy: 'replace',
+        fromVersion: '5.0.0',
+        toVersion: '6.1.7',
+      })
+    ).toEqual('6.1');
   });
   it('replaces equals', () => {
-    expect(semver.getNewValue('=1.0.0', 'replace', '1.0.0', '1.1.0')).toEqual(
-      '=1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '=1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('=1.1.0');
   });
   it('bumps caret to prerelease', () => {
     expect(
-      semver.getNewValue('^1', 'bump', '1.0.0', '1.0.7-prerelease.1')
+      semver.getNewValue({
+        currentValue: '^1',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7-prerelease.1',
+      })
     ).toEqual('^1.0.7-prerelease.1');
   });
   it('replaces with newer', () => {
-    expect(semver.getNewValue('^1.0.0', 'replace', '1.0.0', '1.0.7')).toEqual(
-      '^1.0.7'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.0.0',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.0.7',
+      })
+    ).toEqual('^1.0.7');
   });
   it('bumps short tilde', () => {
-    expect(semver.getNewValue('~1.0', 'bump', '1.0.0', '1.1.7')).toEqual(
-      '~1.1'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '~1.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.7',
+      })
+    ).toEqual('~1.1');
   });
   it('handles long asterisk', () => {
-    expect(semver.getNewValue('1.0.*', 'replace', '1.0.0', '1.1.0')).toEqual(
-      '1.1.*'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.0.*',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('1.1.*');
   });
   it('handles short asterisk', () => {
-    expect(semver.getNewValue('1.*', 'replace', '1.0.0', '2.1.0')).toEqual(
-      '2.*'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '1.*',
+        rangeStrategy: 'replace',
+        fromVersion: '1.0.0',
+        toVersion: '2.1.0',
+      })
+    ).toEqual('2.*');
   });
   it('handles updating from stable to unstable', () => {
     expect(
-      semver.getNewValue('~0.6.1', 'replace', '0.6.8', '0.7.0-rc.2')
+      semver.getNewValue({
+        currentValue: '~0.6.1',
+        rangeStrategy: 'replace',
+        fromVersion: '0.6.8',
+        toVersion: '0.7.0-rc.2',
+      })
     ).toEqual('~0.7.0-rc');
   });
   it('handles less than version requirements', () => {
-    expect(semver.getNewValue('<1.3.4', 'replace', '1.2.3', '1.5.0')).toEqual(
-      '<1.5.1'
-    );
-    expect(semver.getNewValue('< 1.3.4', 'replace', '1.2.3', '1.5.0')).toEqual(
-      '< 1.5.1'
-    );
-    expect(
-      semver.getNewValue('<   1.3.4', 'replace', '1.2.3', '1.5.0')
+    expect(
+      semver.getNewValue({
+        currentValue: '<1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
+    ).toEqual('<1.5.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '< 1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
+    ).toEqual('< 1.5.1');
+    expect(
+      semver.getNewValue({
+        currentValue: '<   1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
     ).toEqual('< 1.5.1');
   });
   it('handles less than equals version requirements', () => {
-    expect(semver.getNewValue('<=1.3.4', 'replace', '1.2.3', '1.5.0')).toEqual(
-      '<=1.5.0'
-    );
-    expect(semver.getNewValue('<= 1.3.4', 'replace', '1.2.3', '1.5.0')).toEqual(
-      '<= 1.5.0'
-    );
-    expect(
-      semver.getNewValue('<=   1.3.4', 'replace', '1.2.3', '1.5.0')
+    expect(
+      semver.getNewValue({
+        currentValue: '<=1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
+    ).toEqual('<=1.5.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '<= 1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
+    ).toEqual('<= 1.5.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '<=   1.3.4',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '1.5.0',
+      })
     ).toEqual('<= 1.5.0');
   });
   it('handles replacing short caret versions', () => {
-    expect(semver.getNewValue('^1.2', 'replace', '1.2.3', '2.0.0')).toEqual(
-      '^2.0'
-    );
-    expect(semver.getNewValue('^1', 'replace', '1.2.3', '2.0.0')).toEqual('^2');
+    expect(
+      semver.getNewValue({
+        currentValue: '^1.2',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.0',
+      })
+    ).toEqual('^2.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '^1',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.0',
+      })
+    ).toEqual('^2');
   });
   it('handles replacing short tilde versions', () => {
-    expect(semver.getNewValue('~1.2', 'replace', '1.2.3', '2.0.0')).toEqual(
-      '~2.0'
-    );
-    expect(semver.getNewValue('~1', 'replace', '1.2.3', '2.0.0')).toEqual('~2');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1.2',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.0',
+      })
+    ).toEqual('~2.0');
+    expect(
+      semver.getNewValue({
+        currentValue: '~1',
+        rangeStrategy: 'replace',
+        fromVersion: '1.2.3',
+        toVersion: '2.0.0',
+      })
+    ).toEqual('~2');
   });
 });
diff --git a/test/versioning/regex.spec.ts b/test/versioning/regex.spec.ts
index c1bf66f8b6939439e45bb2f2f87470a2866e8794..ea519f63c93d88197c3bcea40b94523427864a7a 100644
--- a/test/versioning/regex.spec.ts
+++ b/test/versioning/regex.spec.ts
@@ -328,7 +328,14 @@ describe('regex', () => {
 
   describe('.getNewValue', () => {
     it('returns toVersion', () => {
-      expect(regex.getNewValue(null, null, null, '1.2.3')).toBe('1.2.3');
+      expect(
+        regex.getNewValue({
+          currentValue: null,
+          rangeStrategy: null,
+          fromVersion: null,
+          toVersion: '1.2.3',
+        })
+      ).toBe('1.2.3');
     });
   });
 
diff --git a/test/versioning/ruby.spec.ts b/test/versioning/ruby.spec.ts
index 1bc303b860c00191d3976296ced521c5310f44f0..7b2b86f401eac0a950c16b271caa90ffb0c9a9ea 100644
--- a/test/versioning/ruby.spec.ts
+++ b/test/versioning/ruby.spec.ts
@@ -1,4 +1,5 @@
 import { api as semverRuby } from '../../lib/versioning/ruby';
+import { RangeStrategy } from '../../lib/versioning';
 
 describe('semverRuby', () => {
   describe('.equals', () => {
@@ -365,11 +366,18 @@ describe('semverRuby', () => {
         ['1.2.3', '<= 1.0.3', 'pin', '1.0.3', '1.2.3'],
         ['1.2.3', '~> 1.0.3', 'pin', '1.0.4', '1.2.3'],
         ['4.7.8', '~> 4.7, >= 4.7.4', 'pin', '4.7.5', '4.7.8'],
-      ].forEach(([expected, current, range, from, to]) => {
-        expect(semverRuby.getNewValue(current, range as any, from, to)).toEqual(
-          expected
-        );
-      });
+      ].forEach(
+        ([expected, currentValue, rangeStrategy, fromVersion, toVersion]) => {
+          expect(
+            semverRuby.getNewValue({
+              currentValue,
+              rangeStrategy: rangeStrategy as RangeStrategy,
+              fromVersion,
+              toVersion,
+            })
+          ).toEqual(expected);
+        }
+      );
     });
 
     it('returns correct version for bump strategy', () => {
@@ -391,49 +399,83 @@ describe('semverRuby', () => {
         ['~> 1.2.0', '~> 1.0.3', 'bump', '1.0.3', '1.2.3'],
         ['~> 1.0.0', '~> 1.0.3', 'bump', '1.0.3', '1.0.4'],
         ['~> 4.7.0, >= 4.7.9', '~> 4.7, >= 4.7.4', 'bump', '4.7.5', '4.7.9'],
-      ].forEach(([expected, current, range, from, to]) => {
-        expect(semverRuby.getNewValue(current, range as any, from, to)).toEqual(
-          expected
-        );
+      ].forEach(([expected, currentValue, rangeStrategy, from, toVersion]) => {
+        expect(
+          semverRuby.getNewValue({
+            currentValue,
+            rangeStrategy: rangeStrategy as RangeStrategy,
+            toVersion,
+          })
+        ).toEqual(expected);
       });
     });
 
     it('does not error', () => {
       expect(
-        semverRuby.getNewValue('>= 3.2, < 5.0', 'replace', '4.0.2', '6.0.1')
+        semverRuby.getNewValue({
+          currentValue: '>= 3.2, < 5.0',
+          rangeStrategy: 'replace',
+          fromVersion: '4.0.2',
+          toVersion: '6.0.1',
+        })
       ).toMatchSnapshot();
     });
     it('handles updates to bundler common complex ranges major', () => {
       expect(
-        semverRuby.getNewValue('~> 5.2, >= 5.2.5', 'replace', '5.3.0', '6.0.1')
+        semverRuby.getNewValue({
+          currentValue: '~> 5.2, >= 5.2.5',
+          rangeStrategy: 'replace',
+          fromVersion: '5.3.0',
+          toVersion: '6.0.1',
+        })
       ).toEqual('~> 6.0, >= 6.0.1');
     });
     it('handles updates to bundler common complex ranges minor', () => {
       expect(
-        semverRuby.getNewValue(
-          '~> 5.2.0, >= 5.2.5',
-          'replace',
-          '5.2.5',
-          '5.3.1'
-        )
+        semverRuby.getNewValue({
+          currentValue: '~> 5.2.0, >= 5.2.5',
+          rangeStrategy: 'replace',
+          fromVersion: '5.2.5',
+          toVersion: '5.3.1',
+        })
       ).toEqual('~> 5.3.0, >= 5.3.1');
     });
     it('handles change in precision', () => {
       expect(
-        semverRuby.getNewValue('4.2.0', 'replace', '4.2.0', '4.2.5.1')
+        semverRuby.getNewValue({
+          currentValue: '4.2.0',
+          rangeStrategy: 'replace',
+          fromVersion: '4.2.0',
+          toVersion: '4.2.5.1',
+        })
       ).toEqual('4.2.5.1');
       expect(
-        semverRuby.getNewValue('4.2.5.1', 'replace', '4.2.5.1', '4.3.0')
+        semverRuby.getNewValue({
+          currentValue: '4.2.5.1',
+          rangeStrategy: 'replace',
+          fromVersion: '4.2.5.1',
+          toVersion: '4.3.0',
+        })
       ).toEqual('4.3.0');
     });
     it('handles major ranges', () => {
       expect(
-        semverRuby.getNewValue('~> 1', 'replace', '1.2.0', '2.0.3')
+        semverRuby.getNewValue({
+          currentValue: '~> 1',
+          rangeStrategy: 'replace',
+          fromVersion: '1.2.0',
+          toVersion: '2.0.3',
+        })
       ).toEqual('~> 2');
     });
     it('handles explicit equals', () => {
       expect(
-        semverRuby.getNewValue('= 5.2.2', 'replace', '5.2.2', '5.2.2.1')
+        semverRuby.getNewValue({
+          currentValue: '= 5.2.2',
+          rangeStrategy: 'replace',
+          fromVersion: '5.2.2',
+          toVersion: '5.2.2.1',
+        })
       ).toEqual('= 5.2.2.1');
     });
 
@@ -463,11 +505,18 @@ describe('semverRuby', () => {
           '2.20.1',
         ],
         ['~> 6.0.0', '~> 5.2.0', 'replace', '5.2.4.1', '6.0.2.1'],
-      ].forEach(([expected, current, range, from, to]) => {
-        expect(semverRuby.getNewValue(current, range as any, from, to)).toEqual(
-          expected
-        );
-      });
+      ].forEach(
+        ([expected, currentValue, rangeStrategy, fromVersion, toVersion]) => {
+          expect(
+            semverRuby.getNewValue({
+              currentValue,
+              rangeStrategy: rangeStrategy as RangeStrategy,
+              fromVersion,
+              toVersion,
+            })
+          ).toEqual(expected);
+        }
+      );
     });
   });
 });
diff --git a/test/versioning/semver.spec.ts b/test/versioning/semver.spec.ts
index c6493f8fec55ca15a966f793f1b9fc0f2138bb92..a8fa56c5c7b1fcac654597afc233a443bd7765e0 100644
--- a/test/versioning/semver.spec.ts
+++ b/test/versioning/semver.spec.ts
@@ -41,8 +41,13 @@ describe('semver.isSingleVersion()', () => {
 });
 describe('semver.getNewValue()', () => {
   it('uses toVersion', () => {
-    expect(semver.getNewValue('=1.0.0', 'bump', '1.0.0', '1.1.0')).toEqual(
-      '1.1.0'
-    );
+    expect(
+      semver.getNewValue({
+        currentValue: '=1.0.0',
+        rangeStrategy: 'bump',
+        fromVersion: '1.0.0',
+        toVersion: '1.1.0',
+      })
+    ).toEqual('1.1.0');
   });
 });
diff --git a/test/versioning/swift.spec.ts b/test/versioning/swift.spec.ts
index 4809bf32abd16d15c469dc620a38276bc961f616..79a59835f076f570c443c49975f6704d8d1f6ffb 100644
--- a/test/versioning/swift.spec.ts
+++ b/test/versioning/swift.spec.ts
@@ -1,4 +1,5 @@
 import swift from '../../lib/versioning/swift';
+import { RangeStrategy } from '../../lib/versioning';
 
 const {
   getNewValue,
@@ -79,13 +80,13 @@ describe('getNewValue()', () => {
       ['"1.2.3"..<"1.2.4"', 'auto', '1.2.3', '1.2.5', '"1.2.3"..<"1.2.5"'],
       ['..."1.2.4"', 'auto', '1.2.3', '1.2.5', '..."1.2.5"'],
       ['..<"1.2.4"', 'auto', '1.2.3', '1.2.5', '..<"1.2.5"'],
-    ].forEach(([range, strategy, fromVersion, toVersion, result]) => {
-      const newValue = getNewValue(
-        range,
-        strategy as any,
+    ].forEach(([range, rangeStrategy, fromVersion, toVersion, result]) => {
+      const newValue = getNewValue({
+        currentValue: range,
+        rangeStrategy: rangeStrategy as RangeStrategy,
         fromVersion,
-        toVersion
-      );
+        toVersion,
+      });
       expect(newValue).toEqual(result);
     });
   });