Skip to content

Commit

Permalink
Merge pull request #16303 from Nexus-Mods/improved-version-coersion
Browse files Browse the repository at this point in the history
adding coreceVersion as an API utility function
  • Loading branch information
insomnious authored Sep 12, 2024
2 parents 93e1919 + 07eb91d commit e09b563
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 10 deletions.
6 changes: 2 additions & 4 deletions src/extensions/mod_management/util/modReference.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import * as path from 'path';
import * as semver from 'semver';
import { truthy } from '../../../util/util';
import { IMod, IReference } from '../types/IMod';
import { sanitizeExpression } from './testModReference';
import { sanitizeExpression, coerceToSemver } from './testModReference';

export function makeModReference(mod: IMod): IReference {
if (!truthy(mod.attributes['fileMD5'])
Expand All @@ -21,7 +19,7 @@ export function makeModReference(mod: IMod): IReference {
? sanitizeExpression(fileName)
: undefined,
fileMD5: mod.attributes['fileMD5'],
versionMatch: semver.coerce(mod.attributes['version'])?.version ?? mod.attributes['version'],
versionMatch: coerceToSemver(mod.attributes['version']) ?? mod.attributes['version'],
logicalFileName: mod.attributes['logicalFileName'],
};
}
40 changes: 35 additions & 5 deletions src/extensions/mod_management/util/testModReference.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,42 @@ const fuzzyVersionCache: { [input: string]: boolean } = {};

const coerceableRE = /^v?[0-9.]+$/;

function safeCoerce(input: string): string {
export function safeCoerce(input: string): string {
return coerceableRE.test(input)
? semver.coerce(input)?.raw ?? input
? coerceToSemver(input) ?? input
: input;
}

export function coerceToSemver(version: string): string {
if (!version) {
return undefined;
}
const match = version.match(/^(\d+)\.(\d+)\.(\d+)(.*)$/);
if (match) {
const major = match[1];
const minor = match[2];
const patch = match[3];
let preRelease = match[4].trim();

// If there's something after the first three segments, treat it as pre-release
if (preRelease) {
// Remove leading punctuation from the pre-release part
preRelease = preRelease.replace(/^[\.\-\+]/, '');
return `${major}.${minor}.${patch}-${preRelease}`;
} else {
return `${major}.${minor}.${patch}`;
}
} else {
if (coerceableRE.test(version)) {
const coerced = semver.coerce(version);
if (coerced) {
return coerced.version
}
return version;
}
}
}

export function isFuzzyVersion(input: string) {
const cachedRes: boolean = fuzzyVersionCache[input];
if (cachedRes !== undefined) {
Expand Down Expand Up @@ -211,11 +241,11 @@ function testRef(mod: IModLookupInfo, modId: string, ref: IModReference,
&& truthy(mod.version)) {
const versionMatch = ref.versionMatch.split('+')[0];
const doesMatch = (mod.version === ref.versionMatch)
|| (mod.version === safeCoerce(versionMatch));
|| (safeCoerce(mod.version) === safeCoerce(versionMatch)) || ref.fileMD5 === mod.fileMD5;
if (!doesMatch) {
const versionCoerced = semver.coerce(mod.version);
const versionCoerced = safeCoerce(mod.version);
if (semver.valid(versionCoerced)) {
if (!semver.satisfies(versionCoerced, versionMatch, true)) {
if (!semver.satisfies(versionCoerced, versionMatch, { loose: true, includePrerelease: true })) {
return false;
} // the version is a valid semantic version and does match
} else {
Expand Down
3 changes: 2 additions & 1 deletion src/util/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { makeModReference } from '../extensions/mod_management/util/modReference
import { getModSource, getModSources } from '../extensions/mod_management/util/modSource';
import { removeMods } from '../extensions/mod_management/util/removeMods';
import sortMods, { CycleError } from '../extensions/mod_management/util/sort';
import testModReference from '../extensions/mod_management/util/testModReference';
import testModReference, { coerceToSemver } from '../extensions/mod_management/util/testModReference';
import { convertGameIdReverse, nexusGameId } from '../extensions/nexus_integration/util/convertGameId';
import GameStoreHelper from '../util/GameStoreHelper';
import { getApplication } from './application';
Expand Down Expand Up @@ -125,6 +125,7 @@ export {
local,
lookupFromDownload,
makeModReference,
coerceToSemver,
makeNormalizingDict,
makeOverlayableDictionary,
makeQueue,
Expand Down

0 comments on commit e09b563

Please sign in to comment.