/
semver.js
153 lines (136 loc) · 4.22 KB
/
semver.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
const { test } = require('tap')
const SemVer = require('../../classes/semver')
const increments = require('../fixtures/increments.js')
const comparisons = require('../fixtures/comparisons.js')
const equality = require('../fixtures/equality.js')
const invalidVersions = require('../fixtures/invalid-versions')
test('comparisons', t => {
t.plan(comparisons.length)
comparisons.forEach(([v0, v1, opt]) => t.test(`${v0} ${v1}`, t => {
const s0 = new SemVer(v0, opt)
const s1 = new SemVer(v1, opt)
t.equal(s0.compare(s1), 1)
t.equal(s0.compare(v1), 1)
t.equal(s1.compare(s0), -1)
t.equal(s1.compare(v0), -1)
t.equal(s0.compare(v0), 0)
t.equal(s1.compare(v1), 0)
t.end()
}))
})
test('equality', t => {
t.plan(equality.length)
equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => {
const s0 = new SemVer(v0, loose)
const s1 = new SemVer(v1, loose)
t.equal(s0.compare(s1), 0)
t.equal(s1.compare(s0), 0)
t.equal(s0.compare(v1), 0)
t.equal(s1.compare(v0), 0)
t.equal(s0.compare(s0), 0)
t.equal(s1.compare(s1), 0)
t.equal(s0.comparePre(s1), 0, 'comparePre just to hit that code path')
t.end()
}))
})
test('toString equals parsed version', t => {
t.equal(String(new SemVer('v1.2.3')), '1.2.3')
t.end()
})
test('throws when presented with garbage', t => {
t.plan(invalidVersions.length)
invalidVersions.forEach(([v, msg, opts]) =>
t.throws(() => new SemVer(v, opts), msg))
})
test('return SemVer arg to ctor if options match', t => {
const s = new SemVer('1.2.3', { loose: true, includePrerelease: true })
t.equal(new SemVer(s, { loose: true, includePrerelease: true }), s,
'get same object when options match')
t.not(new SemVer(s), s, 'get new object when options match')
t.end()
})
test('really big numeric prerelease value', (t) => {
const r = new SemVer(`1.2.3-beta.${Number.MAX_SAFE_INTEGER}0`)
t.strictSame(r.prerelease, ['beta', '90071992547409910'])
t.end()
})
test('invalid version numbers', (t) => {
['1.2.3.4', 'NOT VALID', 1.2, null, 'Infinity.NaN.Infinity'].forEach((v) => {
t.throws(
() => {
new SemVer(v) // eslint-disable-line no-new
},
{
name: 'TypeError',
message:
typeof v === 'string'
? `Invalid Version: ${v}`
: `Invalid version. Must be a string. Got type "${typeof v}".`,
}
)
})
t.end()
})
test('incrementing', t => {
t.plan(increments.length)
increments.forEach(([
version,
inc,
expect,
options,
id,
base,
]) => t.test(`${version} ${inc} ${id || ''}`.trim(), t => {
t.plan(1)
if (expect === null) {
t.throws(() => new SemVer(version, options).inc(inc, id, base))
} else {
t.equal(new SemVer(version, options).inc(inc, id, base).version, expect)
}
}))
})
test('compare main vs pre', (t) => {
const s = new SemVer('1.2.3')
t.equal(s.compareMain('2.3.4'), -1)
t.equal(s.compareMain('1.2.4'), -1)
t.equal(s.compareMain('0.1.2'), 1)
t.equal(s.compareMain('1.2.2'), 1)
t.equal(s.compareMain('1.2.3-pre'), 0)
const p = new SemVer('1.2.3-alpha.0.pr.1')
t.equal(p.comparePre('9.9.9-alpha.0.pr.1'), 0)
t.equal(p.comparePre('1.2.3'), -1)
t.equal(p.comparePre('1.2.3-alpha.0.pr.2'), -1)
t.equal(p.comparePre('1.2.3-alpha.0.2'), 1)
t.end()
})
test('invalid version numbers', (t) => {
['1.2.3.4', 'NOT VALID', 1.2, null, 'Infinity.NaN.Infinity'].forEach((v) => {
t.throws(
() => {
new SemVer(v) // eslint-disable-line no-new
},
{
name: 'TypeError',
message:
typeof v === 'string'
? `Invalid Version: ${v}`
: `Invalid version. Must be a string. Got type "${typeof v}".`,
}
)
})
t.end()
})
test('compareBuild', (t) => {
const noBuild = new SemVer('1.0.0')
const build0 = new SemVer('1.0.0+0')
const build1 = new SemVer('1.0.0+1')
const build10 = new SemVer('1.0.0+1.0')
t.equal(noBuild.compareBuild(build0), -1)
t.equal(build0.compareBuild(build0), 0)
t.equal(build0.compareBuild(noBuild), 1)
t.equal(build0.compareBuild('1.0.0+0.0'), -1)
t.equal(build0.compareBuild(build1), -1)
t.equal(build1.compareBuild(build0), 1)
t.equal(build10.compareBuild(build1), 1)
t.end()
})