Skip to content

Commit 4bd2878

Browse files
committed
Add tests and fix logic
1 parent 8633eeb commit 4bd2878

File tree

2 files changed

+83
-15
lines changed

2 files changed

+83
-15
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { isNodeVersionGreaterThanOrEqualTo } from './nodeVersion'
2+
3+
describe('nodeVersion utils', () => {
4+
describe('isNodeVersionGreaterThanOrEqualTo', () => {
5+
it('returns true when version is greater than required version', () => {
6+
expect(isNodeVersionGreaterThanOrEqualTo('14.0.0', '12.0.0')).toBe(true)
7+
expect(isNodeVersionGreaterThanOrEqualTo('14.2.0', '14.1.0')).toBe(true)
8+
expect(isNodeVersionGreaterThanOrEqualTo('14.2.3', '14.2.2')).toBe(true)
9+
})
10+
11+
it('returns true when version equals required version', () => {
12+
expect(isNodeVersionGreaterThanOrEqualTo('14.0.0', '14.0.0')).toBe(true)
13+
expect(isNodeVersionGreaterThanOrEqualTo('14.2.1', '14.2.1')).toBe(true)
14+
})
15+
16+
it('returns false when version is less than required version', () => {
17+
expect(isNodeVersionGreaterThanOrEqualTo('12.0.0', '14.0.0')).toBe(false)
18+
expect(isNodeVersionGreaterThanOrEqualTo('14.1.0', '14.2.0')).toBe(false)
19+
expect(isNodeVersionGreaterThanOrEqualTo('14.2.1', '14.2.2')).toBe(false)
20+
})
21+
22+
it('handles partial version numbers correctly', () => {
23+
expect(isNodeVersionGreaterThanOrEqualTo('14', '12')).toBe(true)
24+
expect(isNodeVersionGreaterThanOrEqualTo('14.2', '14.1')).toBe(true)
25+
expect(isNodeVersionGreaterThanOrEqualTo('14.2', '14.2')).toBe(true)
26+
})
27+
28+
it('handles invalid version numbers', () => {
29+
expect(isNodeVersionGreaterThanOrEqualTo('invalid', '14.0.0')).toBe(false)
30+
expect(isNodeVersionGreaterThanOrEqualTo('14.0.0', 'invalid')).toBe(false)
31+
expect(isNodeVersionGreaterThanOrEqualTo('', '')).toBe(false)
32+
})
33+
34+
it('handles versions with different number of parts', () => {
35+
// Current version has more parts than required
36+
expect(isNodeVersionGreaterThanOrEqualTo('14.0.0', '14.0')).toBe(true)
37+
expect(isNodeVersionGreaterThanOrEqualTo('14.0.1', '14')).toBe(true)
38+
39+
// Required version has more parts than current
40+
expect(isNodeVersionGreaterThanOrEqualTo('14.0', '14.0.1')).toBe(false)
41+
expect(isNodeVersionGreaterThanOrEqualTo('14', '14.0.1')).toBe(false)
42+
})
43+
44+
it('handles leading zeros in version parts', () => {
45+
expect(isNodeVersionGreaterThanOrEqualTo('014.0.0', '14.0.0')).toBe(true)
46+
expect(isNodeVersionGreaterThanOrEqualTo('14.02', '14.2')).toBe(true)
47+
})
48+
})
49+
})

src/shared/utils/nodeVersion.ts

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,44 @@
1+
const normalizeVersion = (ver: string) => {
2+
if (!ver) return [NaN, NaN, NaN]
3+
4+
const parts = ver.split('.').map((part) => {
5+
const num = parseInt(part, 10)
6+
return isNaN(num) ? NaN : num
7+
})
8+
9+
// Check if any part is invalid first
10+
if (parts.some(isNaN)) return [NaN, NaN, NaN]
11+
12+
// Then pad missing parts with 0
13+
return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0]
14+
}
15+
116
export const isNodeVersionGreaterThanOrEqualTo = (
217
version: string,
318
requiredVersion: string,
419
): boolean => {
5-
// Split versions and pad with zeros if parts are missing
6-
const normalize = (ver: string) => {
7-
const parts = ver.split('.').map((part) => parseInt(part, 10))
8-
return [parts[0] || 0, parts[1] || 0, parts[2] || 0]
9-
}
10-
11-
const [major, minor, patch] = normalize(version)
12-
const [requiredMajor, requiredMinor, requiredPatch] = normalize(requiredVersion)
20+
const [major, minor, patch] = normalizeVersion(version)
21+
const [requiredMajor, requiredMinor, requiredPatch] =
22+
normalizeVersion(requiredVersion)
1323

1424
// Handle invalid inputs
15-
if (isNaN(major) || isNaN(requiredMajor)) {
25+
if (
26+
isNaN(major) ||
27+
isNaN(minor) ||
28+
isNaN(patch) ||
29+
isNaN(requiredMajor) ||
30+
isNaN(requiredMinor) ||
31+
isNaN(requiredPatch)
32+
) {
1633
return false
1734
}
1835

19-
return (
20-
major > requiredMajor ||
21-
(major === requiredMajor &&
22-
(minor > requiredMinor ||
23-
(minor === requiredMinor && patch >= requiredPatch)))
24-
)
36+
// Compare each part sequentially
37+
if (major !== requiredMajor) {
38+
return major > requiredMajor
39+
}
40+
if (minor !== requiredMinor) {
41+
return minor > requiredMinor
42+
}
43+
return patch >= requiredPatch
2544
}

0 commit comments

Comments
 (0)