UNPKG

4.43 kBJavaScriptView Raw
1#!/usr/bin/env node
2// Standalone semver comparison program.
3// Exits successfully and prints matching version(s) if
4// any supplied version is valid and passes all tests.
5
6const argv = process.argv.slice(2)
7
8let versions = []
9
10const range = []
11
12let inc = null
13
14const version = require('../package.json').version
15
16let loose = false
17
18let includePrerelease = false
19
20let coerce = false
21
22let rtl = false
23
24let identifier
25
26const semver = require('../')
27
28let reverse = false
29
30let options = {}
31
32const main = () => {
33 if (!argv.length) {
34 return help()
35 }
36 while (argv.length) {
37 let a = argv.shift()
38 const indexOfEqualSign = a.indexOf('=')
39 if (indexOfEqualSign !== -1) {
40 const value = a.slice(indexOfEqualSign + 1)
41 a = a.slice(0, indexOfEqualSign)
42 argv.unshift(value)
43 }
44 switch (a) {
45 case '-rv': case '-rev': case '--rev': case '--reverse':
46 reverse = true
47 break
48 case '-l': case '--loose':
49 loose = true
50 break
51 case '-p': case '--include-prerelease':
52 includePrerelease = true
53 break
54 case '-v': case '--version':
55 versions.push(argv.shift())
56 break
57 case '-i': case '--inc': case '--increment':
58 switch (argv[0]) {
59 case 'major': case 'minor': case 'patch': case 'prerelease':
60 case 'premajor': case 'preminor': case 'prepatch':
61 inc = argv.shift()
62 break
63 default:
64 inc = 'patch'
65 break
66 }
67 break
68 case '--preid':
69 identifier = argv.shift()
70 break
71 case '-r': case '--range':
72 range.push(argv.shift())
73 break
74 case '-c': case '--coerce':
75 coerce = true
76 break
77 case '--rtl':
78 rtl = true
79 break
80 case '--ltr':
81 rtl = false
82 break
83 case '-h': case '--help': case '-?':
84 return help()
85 default:
86 versions.push(a)
87 break
88 }
89 }
90
91 options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
92
93 versions = versions.map((v) => {
94 return coerce ? (semver.coerce(v, options) || { version: v }).version : v
95 }).filter((v) => {
96 return semver.valid(v)
97 })
98 if (!versions.length) {
99 return fail()
100 }
101 if (inc && (versions.length !== 1 || range.length)) {
102 return failInc()
103 }
104
105 for (let i = 0, l = range.length; i < l; i++) {
106 versions = versions.filter((v) => {
107 return semver.satisfies(v, range[i], options)
108 })
109 if (!versions.length) {
110 return fail()
111 }
112 }
113 return success(versions)
114}
115
116const failInc = () => {
117 console.error('--inc can only be used on a single version with no range')
118 fail()
119}
120
121const fail = () => process.exit(1)
122
123const success = () => {
124 const compare = reverse ? 'rcompare' : 'compare'
125 versions.sort((a, b) => {
126 return semver[compare](a, b, options)
127 }).map((v) => {
128 return semver.clean(v, options)
129 }).map((v) => {
130 return inc ? semver.inc(v, inc, options, identifier) : v
131 }).forEach((v, i, _) => {
132 console.log(v)
133 })
134}
135
136const help = () => console.log(
137`SemVer ${version}
138
139A JavaScript implementation of the https://semver.org/ specification
140Copyright Isaac Z. Schlueter
141
142Usage: semver [options] <version> [<version> [...]]
143Prints valid versions sorted by SemVer precedence
144
145Options:
146-r --range <range>
147 Print versions that match the specified range.
148
149-i --increment [<level>]
150 Increment a version by the specified level. Level can
151 be one of: major, minor, patch, premajor, preminor,
152 prepatch, or prerelease. Default level is 'patch'.
153 Only one version may be specified.
154
155--preid <identifier>
156 Identifier to be used to prefix premajor, preminor,
157 prepatch or prerelease version increments.
158
159-l --loose
160 Interpret versions and ranges loosely
161
162-p --include-prerelease
163 Always include prerelease versions in range matching
164
165-c --coerce
166 Coerce a string into SemVer if possible
167 (does not imply --loose)
168
169--rtl
170 Coerce version strings right to left
171
172--ltr
173 Coerce version strings left to right (default)
174
175Program exits successfully if any valid version satisfies
176all supplied ranges, and prints all satisfying versions.
177
178If no satisfying versions are found, then exits failure.
179
180Versions are printed in ascending order, so supplying
181multiple versions to the utility will just sort them.`)
182
183main()