diff --git a/packages/shared/src/semver.test.ts b/packages/shared/src/semver.test.ts index 824dd7d6f98d..0dac4f2ab9e0 100644 --- a/packages/shared/src/semver.test.ts +++ b/packages/shared/src/semver.test.ts @@ -32,6 +32,11 @@ describe("semver helpers", () => { }); it("compares prerelease versions before stable versions", () => { + expect(compareSemverVersions("1.0.0-Z", "1.0.0-a")).toBeLessThan(0); + expect(compareSemverVersions("1.0.0-alpha-1", "1.0.0-alpha1")).toBeLessThan(0); + expect(compareSemverVersions("1.0.0-9007199254740992", "1.0.0-9007199254740993")).toBeLessThan( + 0, + ); expect(compareSemverVersions("2.1.111-beta.1", "2.1.111")).toBeLessThan(0); }); diff --git a/packages/shared/src/semver.ts b/packages/shared/src/semver.ts index 720ea68a7506..0a982b946556 100644 --- a/packages/shared/src/semver.ts +++ b/packages/shared/src/semver.ts @@ -81,7 +81,9 @@ function comparePrereleaseIdentifier(left: string, right: string): number { const rightNumeric = SEMVER_NUMBER_SEGMENT.test(right); if (leftNumeric && rightNumeric) { - return Number.parseInt(left, 10) - Number.parseInt(right, 10); + const leftNumber = BigInt(left); + const rightNumber = BigInt(right); + return leftNumber === rightNumber ? 0 : leftNumber < rightNumber ? -1 : 1; } if (leftNumeric) { return -1; @@ -89,7 +91,7 @@ function comparePrereleaseIdentifier(left: string, right: string): number { if (rightNumeric) { return 1; } - return left.localeCompare(right); + return left === right ? 0 : left < right ? -1 : 1; } export function compareSemverVersions(left: string, right: string): number {