123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- #!/usr/bin/env node
- // Standalone semver comparison program.
- // Exits successfully and prints matching version(s) if
- // any supplied version is valid and passes all tests.
- const argv = process.argv.slice(2)
- let versions = []
- const range = []
- let inc = null
- const version = require('../package.json').version
- let loose = false
- let includePrerelease = false
- let coerce = false
- let rtl = false
- let identifier
- let identifierBase
- const semver = require('../')
- const parseOptions = require('../internal/parse-options')
- let reverse = false
- let options = {}
- const main = () => {
- if (!argv.length) {
- return help()
- }
- while (argv.length) {
- let a = argv.shift()
- const indexOfEqualSign = a.indexOf('=')
- if (indexOfEqualSign !== -1) {
- const value = a.slice(indexOfEqualSign + 1)
- a = a.slice(0, indexOfEqualSign)
- argv.unshift(value)
- }
- switch (a) {
- case '-rv': case '-rev': case '--rev': case '--reverse':
- reverse = true
- break
- case '-l': case '--loose':
- loose = true
- break
- case '-p': case '--include-prerelease':
- includePrerelease = true
- break
- case '-v': case '--version':
- versions.push(argv.shift())
- break
- case '-i': case '--inc': case '--increment':
- switch (argv[0]) {
- case 'major': case 'minor': case 'patch': case 'prerelease':
- case 'premajor': case 'preminor': case 'prepatch':
- inc = argv.shift()
- break
- default:
- inc = 'patch'
- break
- }
- break
- case '--preid':
- identifier = argv.shift()
- break
- case '-r': case '--range':
- range.push(argv.shift())
- break
- case '-n':
- identifierBase = argv.shift()
- if (identifierBase === 'false') {
- identifierBase = false
- }
- break
- case '-c': case '--coerce':
- coerce = true
- break
- case '--rtl':
- rtl = true
- break
- case '--ltr':
- rtl = false
- break
- case '-h': case '--help': case '-?':
- return help()
- default:
- versions.push(a)
- break
- }
- }
- options = parseOptions({ loose, includePrerelease, rtl })
- versions = versions.map((v) => {
- return coerce ? (semver.coerce(v, options) || { version: v }).version : v
- }).filter((v) => {
- return semver.valid(v)
- })
- if (!versions.length) {
- return fail()
- }
- if (inc && (versions.length !== 1 || range.length)) {
- return failInc()
- }
- for (let i = 0, l = range.length; i < l; i++) {
- versions = versions.filter((v) => {
- return semver.satisfies(v, range[i], options)
- })
- if (!versions.length) {
- return fail()
- }
- }
- versions
- .sort((a, b) => semver[reverse ? 'rcompare' : 'compare'](a, b, options))
- .map(v => semver.clean(v, options))
- .map(v => inc ? semver.inc(v, inc, options, identifier, identifierBase) : v)
- .forEach(v => console.log(v))
- }
- const failInc = () => {
- console.error('--inc can only be used on a single version with no range')
- fail()
- }
- const fail = () => process.exit(1)
- const help = () => console.log(
- `SemVer ${version}
- A JavaScript implementation of the https://semver.org/ specification
- Copyright Isaac Z. Schlueter
- Usage: semver [options] <version> [<version> [...]]
- Prints valid versions sorted by SemVer precedence
- Options:
- -r --range <range>
- Print versions that match the specified range.
- -i --increment [<level>]
- Increment a version by the specified level. Level can
- be one of: major, minor, patch, premajor, preminor,
- prepatch, or prerelease. Default level is 'patch'.
- Only one version may be specified.
- --preid <identifier>
- Identifier to be used to prefix premajor, preminor,
- prepatch or prerelease version increments.
- -l --loose
- Interpret versions and ranges loosely
- -p --include-prerelease
- Always include prerelease versions in range matching
- -c --coerce
- Coerce a string into SemVer if possible
- (does not imply --loose)
- --rtl
- Coerce version strings right to left
- --ltr
- Coerce version strings left to right (default)
- -n <base>
- Base number to be used for the prerelease identifier.
- Can be either 0 or 1, or false to omit the number altogether.
- Defaults to 0.
- Program exits successfully if any valid version satisfies
- all supplied ranges, and prints all satisfying versions.
- If no satisfying versions are found, then exits failure.
- Versions are printed in ascending order, so supplying
- multiple versions to the utility will just sort them.`)
- main()
|