mirror of
https://github.com/denoland/std.git
synced 2024-11-21 20:50:22 +00:00
51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
|
// This module is browser compatible.
|
|
import type { ReleaseType, SemVer } from "./types.ts";
|
|
import { compareIdentifier } from "./_shared.ts";
|
|
|
|
/**
|
|
* Returns difference between two SemVers by the release type,
|
|
* or `undefined` if the SemVers are the same.
|
|
*
|
|
* @example Usage
|
|
* ```ts
|
|
* import { parse, difference } from "@std/semver";
|
|
* import { assertEquals } from "@std/assert";
|
|
*
|
|
* const version1 = parse("1.2.3");
|
|
* const version2 = parse("1.2.4");
|
|
* const version3 = parse("1.3.0");
|
|
* const version4 = parse("2.0.0");
|
|
*
|
|
* assertEquals(difference(version1, version2), "patch");
|
|
* assertEquals(difference(version1, version3), "minor");
|
|
* assertEquals(difference(version1, version4), "major");
|
|
* assertEquals(difference(version1, version1), undefined);
|
|
* ```
|
|
*
|
|
* @param version1 The first SemVer to compare
|
|
* @param version2 The second SemVer to compare
|
|
* @returns The release type difference or `undefined` if the versions are the same
|
|
*/
|
|
export function difference(
|
|
version1: SemVer,
|
|
version2: SemVer,
|
|
): ReleaseType | undefined {
|
|
const hasPrerelease = version1.prerelease?.length ||
|
|
version2.prerelease?.length;
|
|
|
|
if (version1.major !== version2.major) {
|
|
return hasPrerelease ? "premajor" : "major";
|
|
}
|
|
if (version1.minor !== version2.minor) {
|
|
return hasPrerelease ? "preminor" : "minor";
|
|
}
|
|
if (version1.patch !== version2.patch) {
|
|
return hasPrerelease ? "prepatch" : "patch";
|
|
}
|
|
|
|
if (compareIdentifier(version1.prerelease, version2.prerelease) !== 0) {
|
|
return "prerelease";
|
|
}
|
|
}
|