2 // Standalone semver comparison program.
3 // Exits successfully and prints matching version(s) if
4 // any supplied version is valid and passes all tests.
6 const argv = process.argv.slice(2)
14 const version = require('../package.json').version
18 let includePrerelease = false
26 const semver = require('../')
33 if (!argv.length) return help()
36 const indexOfEqualSign = a.indexOf('=')
37 if (indexOfEqualSign !== -1) {
38 a = a.slice(0, indexOfEqualSign)
39 argv.unshift(a.slice(indexOfEqualSign + 1))
42 case '-rv': case '-rev': case '--rev': case '--reverse':
45 case '-l': case '--loose':
48 case '-p': case '--include-prerelease':
49 includePrerelease = true
51 case '-v': case '--version':
52 versions.push(argv.shift())
54 case '-i': case '--inc': case '--increment':
56 case 'major': case 'minor': case 'patch': case 'prerelease':
57 case 'premajor': case 'preminor': case 'prepatch':
66 identifier = argv.shift()
68 case '-r': case '--range':
69 range.push(argv.shift())
71 case '-c': case '--coerce':
80 case '-h': case '--help': case '-?':
88 const options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
90 versions = versions.map((v) => {
91 return coerce ? (semver.coerce(v, options) || { version: v }).version : v
93 return semver.valid(v)
95 if (!versions.length) return fail()
96 if (inc && (versions.length !== 1 || range.length)) { return failInc() }
98 for (let i = 0, l = range.length; i < l; i++) {
99 versions = versions.filter((v) => {
100 return semver.satisfies(v, range[i], options)
102 if (!versions.length) return fail()
104 return success(versions)
108 const failInc = () => {
109 console.error('--inc can only be used on a single version with no range')
113 const fail = () => process.exit(1)
115 const success = () => {
116 const compare = reverse ? 'rcompare' : 'compare'
117 versions.sort((a, b) => {
118 return semver[compare](a, b, options)
120 return semver.clean(v, options)
122 return inc ? semver.inc(v, inc, options, identifier) : v
123 }).forEach((v, i, _) => { console.log(v) })
126 const help = () => console.log(
129 A JavaScript implementation of the https://semver.org/ specification
130 Copyright Isaac Z. Schlueter
132 Usage: semver [options] <version> [<version> [...]]
133 Prints valid versions sorted by SemVer precedence
137 Print versions that match the specified range.
139 -i --increment [<level>]
140 Increment a version by the specified level. Level can
141 be one of: major, minor, patch, premajor, preminor,
142 prepatch, or prerelease. Default level is 'patch'.
143 Only one version may be specified.
146 Identifier to be used to prefix premajor, preminor,
147 prepatch or prerelease version increments.
150 Interpret versions and ranges loosely
152 -p --include-prerelease
153 Always include prerelease versions in range matching
156 Coerce a string into SemVer if possible
157 (does not imply --loose)
160 Coerce version strings right to left
163 Coerce version strings left to right (default)
165 Program exits successfully if any valid version satisfies
166 all supplied ranges, and prints all satisfying versions.
168 If no satisfying versions are found, then exits failure.
170 Versions are printed in ascending order, so supplying
171 multiple versions to the utility will just sort them.`)