Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion classes/semver.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ class SemVer {
version.includePrerelease === !!options.includePrerelease) {
return version
} else {
version = version.version
const build = version.build.length ? `+${version.build.join('.')}` : ''
version = version.version + build
}
} else if (typeof version !== 'string') {
throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
Expand Down
24 changes: 24 additions & 0 deletions test/classes/semver.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,30 @@ test('return SemVer arg to ctor if options match', t => {
t.end()
})

test('preserve build metadata when constructor options change', t => {
const version = '1.2.3-beta.1+build.7'
for (const [originalOptions, options] of [
[{}, { loose: true }],
[{ loose: true }, {}],
[{}, { includePrerelease: true }],
[{ includePrerelease: true }, {}],
]) {
const original = new SemVer(version, originalOptions)
const result = new SemVer(original, options)
t.not(result, original)
t.strictSame(result.build, ['build', '7'])
t.equal(result.raw, version)
t.equal(result.version, original.version)
t.equal(result.loose, !!options.loose)
t.equal(result.includePrerelease, !!options.includePrerelease)
t.strictSame(original.build, ['build', '7'])
}
const loose = new SemVer('01.02.03-beta+build.7', { loose: true })
t.equal(new SemVer(loose).raw, '1.2.3-beta+build.7',
'reparse the normalized version rather than its loose raw input')
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'])
Expand Down
11 changes: 11 additions & 0 deletions test/functions/compare-build.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

const { test } = require('tap')
const compareBuild = require('../../functions/compare-build')
const SemVer = require('../../classes/semver')

test('compareBuild', (t) => {
const noBuild = '1.0.0'
Expand All @@ -19,3 +20,13 @@ test('compareBuild', (t) => {

t.end()
})

test('compareBuild preserves builds on version objects with different options', t => {
const higher = new SemVer('1.0.0+2', { loose: true })
const lower = new SemVer('1.0.0+1', { includePrerelease: true })
t.equal(compareBuild(higher, lower), 1)
t.equal(compareBuild(lower, higher), -1)
t.equal(compareBuild(higher, lower, { includePrerelease: true }), 1)
t.equal(compareBuild(higher, lower, { loose: true }), 1)
t.end()
})
8 changes: 8 additions & 0 deletions test/functions/rsort.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

const { test } = require('tap')
const rsort = require('../../functions/rsort')
const SemVer = require('../../classes/semver')

test('sorting', (t) => {
const list = [
Expand All @@ -21,3 +22,10 @@ test('sorting', (t) => {
t.same(rsort(list), rsorted)
t.end()
})

test('rsort preserves build order on version objects with different options', t => {
const higher = new SemVer('1.0.0+2', { loose: true })
const lower = new SemVer('1.0.0+1', { includePrerelease: true })
t.strictSame(rsort([lower, higher]), [higher, lower])
t.end()
})
8 changes: 8 additions & 0 deletions test/functions/sort.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

const { test } = require('tap')
const sort = require('../../functions/sort')
const SemVer = require('../../classes/semver')

test('sorting', (t) => {
const list = [
Expand All @@ -22,3 +23,10 @@ test('sorting', (t) => {
t.same(sort(list), sorted)
t.end()
})

test('sort preserves build order on version objects with different options', t => {
const higher = new SemVer('1.0.0+2', { loose: true })
const lower = new SemVer('1.0.0+1', { includePrerelease: true })
t.strictSame(sort([higher, lower]), [lower, higher])
t.end()
})