Skip to content

Commit 05ecfbc

Browse files
[cli] Ensure npm pre-release versioning works for post-GA release pre-releases (#722)
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
1 parent 7268d2f commit 05ecfbc

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

.changeset/solid-ideas-sing.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@workflow/cli": patch
3+
---
4+
5+
Ensure npm pre-release version update checks work for post-GA release pre-releases

packages/cli/src/lib/update-check.ts

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,47 @@ function compareVersions(a: string, b: string): boolean {
3131
return { parts, prerelease };
3232
};
3333

34+
const comparePrerelease = (
35+
pre1: string | undefined,
36+
pre2: string | undefined
37+
): number => {
38+
if (!pre1 && !pre2) return 0; // both no prerelease
39+
if (!pre1 && pre2) return 1; // no prerelease > prerelease
40+
if (pre1 && !pre2) return -1; // prerelease < no prerelease
41+
if (typeof pre1 !== 'string' || typeof pre2 !== 'string') return 0;
42+
43+
// Both have prerelease - compare them properly
44+
const parts1 = pre1.split('.');
45+
const parts2 = pre2.split('.');
46+
47+
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
48+
const p1 = parts1[i];
49+
const p2 = parts2[i];
50+
51+
// If one side is missing, it's less than the other
52+
if (p1 === undefined) return -1;
53+
if (p2 === undefined) return 1;
54+
55+
// Try to parse as numbers for numeric comparison
56+
const num1 = Number(p1);
57+
const num2 = Number(p2);
58+
const isNum1 = !Number.isNaN(num1) && p1 !== '';
59+
const isNum2 = !Number.isNaN(num2) && p2 !== '';
60+
61+
if (isNum1 && isNum2) {
62+
// Both are numbers - compare numerically
63+
if (num1 > num2) return 1;
64+
if (num1 < num2) return -1;
65+
} else {
66+
// At least one is non-numeric - compare as strings
67+
if (p1 > p2) return 1;
68+
if (p1 < p2) return -1;
69+
}
70+
}
71+
72+
return 0; // equal
73+
};
74+
3475
const versionA = parseVersion(a);
3576
const versionB = parseVersion(b);
3677

@@ -42,15 +83,8 @@ function compareVersions(a: string, b: string): boolean {
4283

4384
// If versions are equal up to patch level, check prerelease
4485
// No prerelease is considered greater than prerelease
45-
if (!versionA.prerelease && versionB.prerelease) return true;
46-
if (versionA.prerelease && !versionB.prerelease) return false;
47-
48-
// Both have prereleases or both don't - they're equal
49-
if (versionA.prerelease && versionB.prerelease) {
50-
return versionA.prerelease > versionB.prerelease;
51-
}
52-
53-
return false;
86+
const preResult = comparePrerelease(versionA.prerelease, versionB.prerelease);
87+
return preResult > 0;
5488
}
5589

5690
/**

0 commit comments

Comments
 (0)