Skip to content

Commit

Permalink
Added version coercion to the module and CLI.
Browse files Browse the repository at this point in the history
  • Loading branch information
joeledwards committed Nov 7, 2017
1 parent ec6f97a commit 68cef2d
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 2 deletions.
14 changes: 12 additions & 2 deletions bin/semver
Expand Up @@ -12,6 +12,7 @@ var argv = process.argv.slice(2)
, inc = null
, version = require("../package.json").version
, loose = false
, coerce = false
, identifier = undefined
, semver = require("../semver")
, reverse = false
Expand Down Expand Up @@ -54,6 +55,9 @@ function main () {
case "-r": case "--range":
range.push(argv.shift())
break
case "-c": case "--coerce":
coerce = true
break
case "-h": case "--help": case "-?":
return help()
default:
Expand All @@ -62,8 +66,10 @@ function main () {
}
}

versions = versions.filter(function (v) {
return semver.valid(v, loose)
versions = versions.map(function (v) {
return coerce ? (semver.coerce(v) || {version: v}).version : v
}).filter(function (v) {
return semver.valid(v)
})
if (!versions.length) return fail()
if (inc && (versions.length !== 1 || range.length))
Expand Down Expand Up @@ -122,6 +128,10 @@ function help () {
,"-l --loose"
," Interpret versions and ranges loosely"
,""
,"-c --coerce"
," Coerce a string into SemVer if possible"
," (does not imply --loose)"
,""
,"Program exits successfully if any valid version satisfies"
,"all supplied ranges, and prints all satisfying versions."
,""
Expand Down
21 changes: 21 additions & 0 deletions semver.js
Expand Up @@ -1294,3 +1294,24 @@ function intersects(r1, r2, loose) {
r2 = new Range(r2, loose)
return r1.intersects(r2)
}

exports.coerce = coerce;
function coerce(version) {
if (version instanceof SemVer)
return version

if (typeof version !== 'string')
return null

if (version.length > MAX_LENGTH)
return null;

var match = version.match(/([vV]?\d+(?:[.]\d+)*)/)
if (match == null)
return null

var parts = match[0].split(/[.]/)
var semver = ['0', '0', '0'].map(function (ph, idx) { return parts[idx] || ph } ).join('.')

return parse(semver)
}
72 changes: 72 additions & 0 deletions test/coerce.js
@@ -0,0 +1,72 @@
var tap = require('tap');
var test = tap.test;
var semver = require('../semver.js');
var coerce = semver.coerce;

test('\ncoerce tests', function(t) {
var tooLong = '123' + '.1'.repeat(127);
var justRight = '12' + '.1'.repeat(127);

// Expected to be null (cannot be coerced).
[
null,
{version: '1.2.3'},
function () { return '1.2.3'; },
'',
'.',
tooLong
].forEach(function (input) {
var msg = 'coerce(' + input + ') should be null'
t.same(coerce(input), null, msg)
});

// Expected to be the same.
[
[semver.parse('1.2.3'), '1.2.3'],
['.1', '1.0.0'],
['.1.', '1.0.0'],
['..1', '1.0.0'],
['.1.1', '1.1.0'],
['1.', '1.0.0'],
['1.0', '1.0.0'],
['1.0.0', '1.0.0'],
['0', '0.0.0'],
['0.0', '0.0.0'],
['0.0.0', '0.0.0'],
['0.1', '0.1.0'],
['0.0.1', '0.0.1'],
['0.1.1', '0.1.1'],
['1', '1.0.0'],
['1.2', '1.2.0'],
['1.2.3', '1.2.3'],
['1.2.3.4', '1.2.3'],
['13', '13.0.0'],
['35.12', '35.12.0'],
['35.12.18', '35.12.18'],
['35.12.18.24', '35.12.18'],
['v1', '1.0.0'],
['v1.2', '1.2.0'],
['v1.2.3', '1.2.3'],
['v1.2.3.4', '1.2.3'],
['1 0', '1.0.0'],
['1 1', '1.0.0'],
['1.1 1', '1.1.0'],
['1.1-1', '1.1.0'],
['1.1-1', '1.1.0'],
['a1', '1.0.0'],
['a1a', '1.0.0'],
['1a', '1.0.0'],
['version 1', '1.0.0'],
['version1', '1.0.0'],
['version1.0', '1.0.0'],
['version1.1', '1.1.0'],
[justRight, '12.1.1']
].forEach(function (tuple) {
var input = tuple[0]
var expected = tuple[1]
var msg = 'coerce(' + input + ') should become ' + expected
t.same((coerce(input) || {}).version, expected, msg)
});

t.done();
});

0 comments on commit 68cef2d

Please sign in to comment.