2023-12-06 17:35:57 +01:00
|
|
|
import semver from 'semver';
|
|
|
|
|
|
|
|
|
|
import * as Version from './types';
|
|
|
|
|
import { isSemVer, isSemVerReleaseType } from './semver';
|
|
|
|
|
|
|
|
|
|
export const rangeFactory = (range: string): Version.Range => {
|
|
|
|
|
return new semver.Range(range);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const rangeFromReleaseType = (current: Version.SemVer, identifier: Version.ReleaseType) => {
|
|
|
|
|
switch (identifier) {
|
|
|
|
|
case Version.ReleaseType.Major: {
|
|
|
|
|
// semver.inc(_, 'major') will target <major + 1>.0.0 which is what we want
|
|
|
|
|
// e.g. for 4.15.4, it'll return 5.0.0
|
|
|
|
|
const nextMajor = semver.inc(current, 'major') as Version.LiteralSemVer;
|
2023-12-11 13:10:33 +02:00
|
|
|
return rangeFactory(`>${current.raw} <=${nextMajor}`);
|
|
|
|
|
}
|
|
|
|
|
case Version.ReleaseType.Patch: {
|
2023-12-12 13:24:58 +02:00
|
|
|
// This will return the minor for the next minor
|
|
|
|
|
// e.g. for 4.15.4, it'll return 4.16.0
|
2023-12-12 13:27:02 +02:00
|
|
|
const minor = semver.inc(current, 'minor') as Version.LiteralSemVer;
|
2023-12-12 13:24:58 +02:00
|
|
|
return rangeFactory(`>${current.raw} <${minor}`);
|
2023-12-11 13:10:33 +02:00
|
|
|
}
|
|
|
|
|
case Version.ReleaseType.Minor: {
|
2023-12-12 13:24:58 +02:00
|
|
|
// This will return the major for the next major
|
|
|
|
|
// e.g. for 4.15.4, it'll return 5.0.0
|
2023-12-12 13:27:02 +02:00
|
|
|
const major = semver.inc(current, 'major') as Version.LiteralSemVer;
|
2023-12-12 13:24:58 +02:00
|
|
|
return rangeFactory(`>${current.raw} <${major}`);
|
2023-12-06 17:35:57 +01:00
|
|
|
}
|
|
|
|
|
default: {
|
|
|
|
|
throw new Error('Not implemented');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const rangeFromVersions = (
|
|
|
|
|
currentVersion: Version.SemVer,
|
|
|
|
|
target: Version.ReleaseType | Version.SemVer
|
|
|
|
|
) => {
|
|
|
|
|
if (isSemVer(target)) {
|
|
|
|
|
return rangeFactory(`>${currentVersion.raw} <=${target.raw}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isSemVerReleaseType(target)) {
|
|
|
|
|
return rangeFromReleaseType(currentVersion, target);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
throw new Error(`Invalid target set: ${target}`); // TODO: better errors
|
|
|
|
|
};
|