diff --git a/bin/semver.js b/bin/semver.js index 95db3aa7..d71b1bf3 100755 --- a/bin/semver.js +++ b/bin/semver.js @@ -26,6 +26,7 @@ let identifier let identifierBase const semver = require('../') +const parseOptions = require('../internal/parse-options') let reverse = false @@ -93,7 +94,7 @@ const main = () => { } } - options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl } + options = parseOptions({ loose, includePrerelease, rtl }) versions = versions.map((v) => { return coerce ? (semver.coerce(v, options) || { version: v }).version : v diff --git a/classes/comparator.js b/classes/comparator.js index 62cd204d..54ce1394 100644 --- a/classes/comparator.js +++ b/classes/comparator.js @@ -78,13 +78,6 @@ class Comparator { throw new TypeError('a Comparator is required') } - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false, - } - } - if (this.operator === '') { if (this.value === '') { return true diff --git a/internal/parse-options.js b/internal/parse-options.js index bbd9ec77..10d64ce0 100644 --- a/internal/parse-options.js +++ b/internal/parse-options.js @@ -1,11 +1,15 @@ -// parse out just the options we care about so we always get a consistent -// obj with keys in a consistent order. -const opts = ['includePrerelease', 'loose', 'rtl'] -const parseOptions = options => - !options ? {} - : typeof options !== 'object' ? { loose: true } - : opts.filter(k => options[k]).reduce((o, k) => { - o[k] = true - return o - }, {}) +// parse out just the options we care about +const looseOption = Object.freeze({ loose: true }) +const emptyOpts = Object.freeze({ }) +const parseOptions = options => { + if (!options) { + return emptyOpts + } + + if (typeof options !== 'object') { + return looseOption + } + + return options +} module.exports = parseOptions diff --git a/test/internal/parse-options.js b/test/internal/parse-options.js index 6213423d..2400537d 100644 --- a/test/internal/parse-options.js +++ b/test/internal/parse-options.js @@ -18,12 +18,24 @@ t.test('truthy non-objects always loose mode, for backwards comp', t => { t.end() }) -t.test('objects only include truthy flags we know about, set to true', t => { - t.strictSame(parseOptions(/asdf/), {}) - t.strictSame(parseOptions(new Error('hello')), {}) - t.strictSame(parseOptions({ loose: true, a: 1, rtl: false }), { loose: true }) +t.test('any object passed is returned', t => { + t.strictSame(parseOptions(/asdf/), /asdf/) + t.strictSame(parseOptions(new Error('hello')), new Error('hello')) + t.strictSame(parseOptions({ loose: true, a: 1, rtl: false }), { loose: true, a: 1, rtl: false }) t.strictSame(parseOptions({ loose: 1, rtl: 2, includePrerelease: 10 }), { + loose: 1, + rtl: 2, + includePrerelease: 10, + }) + t.strictSame(parseOptions({ loose: true }), { loose: true }) + t.strictSame(parseOptions({ rtl: true }), { rtl: true }) + t.strictSame(parseOptions({ includePrerelease: true }), { includePrerelease: true }) + t.strictSame(parseOptions({ loose: true, rtl: true }), { loose: true, rtl: true }) + t.strictSame(parseOptions({ loose: true, includePrerelease: true }), { loose: true, + includePrerelease: true, + }) + t.strictSame(parseOptions({ rtl: true, includePrerelease: true }), { rtl: true, includePrerelease: true, })