semver 7.4.0 → 7.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -239,6 +239,7 @@ $ semver 1.2.4-beta.0 -i prerelease
239
239
 
240
240
  The method `.inc` takes an optional parameter 'identifierBase' string
241
241
  that will let you let your prerelease number as zero-based or one-based.
242
+ Set to `false` to omit the prerelease number altogether.
242
243
  If you do not specify this parameter, it will default to zero-based.
243
244
 
244
245
  ```javascript
@@ -246,6 +247,11 @@ semver.inc('1.2.3', 'prerelease', 'beta', '1')
246
247
  // '1.2.4-beta.1'
247
248
  ```
248
249
 
250
+ ```javascript
251
+ semver.inc('1.2.3', 'prerelease', 'beta', false)
252
+ // '1.2.4-beta'
253
+ ```
254
+
249
255
  command-line example:
250
256
 
251
257
  ```bash
@@ -253,6 +259,11 @@ $ semver 1.2.3 -i prerelease --preid beta -n 1
253
259
  1.2.4-beta.1
254
260
  ```
255
261
 
262
+ ```bash
263
+ $ semver 1.2.3 -i prerelease --preid beta -n false
264
+ 1.2.4-beta
265
+ ```
266
+
256
267
  ### Advanced Range Syntax
257
268
 
258
269
  Advanced range syntax desugars to primitive comparators in
package/bin/semver.js CHANGED
@@ -76,6 +76,9 @@ const main = () => {
76
76
  break
77
77
  case '-n':
78
78
  identifierBase = argv.shift()
79
+ if (identifierBase === 'false') {
80
+ identifierBase = false
81
+ }
79
82
  break
80
83
  case '-c': case '--coerce':
81
84
  coerce = true
@@ -178,6 +181,11 @@ Options:
178
181
  --ltr
179
182
  Coerce version strings left to right (default)
180
183
 
184
+ -n <base>
185
+ Base number to be used for the prerelease identifier.
186
+ Can be either 0 or 1, or false to omit the number altogether.
187
+ Defaults to 0.
188
+
181
189
  Program exits successfully if any valid version satisfies
182
190
  all supplied ranges, and prints all satisfying versions.
183
191
 
package/classes/semver.js CHANGED
@@ -16,7 +16,7 @@ class SemVer {
16
16
  version = version.version
17
17
  }
18
18
  } else if (typeof version !== 'string') {
19
- throw new TypeError(`Invalid Version: ${version}`)
19
+ throw new TypeError(`Invalid Version: ${require('util').inspect(version)}`)
20
20
  }
21
21
 
22
22
  if (version.length > MAX_LENGTH) {
@@ -246,9 +246,15 @@ class SemVer {
246
246
  break
247
247
  // This probably shouldn't be used publicly.
248
248
  // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
249
- case 'pre':
249
+ case 'pre': {
250
+ const base = Number(identifierBase) ? 1 : 0
251
+
252
+ if (!identifier && identifierBase === false) {
253
+ throw new Error('invalid increment argument: identifier is empty')
254
+ }
255
+
250
256
  if (this.prerelease.length === 0) {
251
- this.prerelease = [0]
257
+ this.prerelease = [base]
252
258
  } else {
253
259
  let i = this.prerelease.length
254
260
  while (--i >= 0) {
@@ -259,23 +265,29 @@ class SemVer {
259
265
  }
260
266
  if (i === -1) {
261
267
  // didn't increment anything
262
- this.prerelease.push(0)
268
+ if (identifier === this.prerelease.join('.') && identifierBase === false) {
269
+ throw new Error('invalid increment argument: identifier already exists')
270
+ }
271
+ this.prerelease.push(base)
263
272
  }
264
273
  }
265
274
  if (identifier) {
266
- const base = Number(identifierBase) ? 1 : 0
267
275
  // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
268
276
  // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
277
+ let prerelease = [identifier, base]
278
+ if (identifierBase === false) {
279
+ prerelease = [identifier]
280
+ }
269
281
  if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
270
282
  if (isNaN(this.prerelease[1])) {
271
- this.prerelease = [identifier, base]
283
+ this.prerelease = prerelease
272
284
  }
273
285
  } else {
274
- this.prerelease = [identifier, base]
286
+ this.prerelease = prerelease
275
287
  }
276
288
  }
277
289
  break
278
-
290
+ }
279
291
  default:
280
292
  throw new Error(`invalid increment argument: ${release}`)
281
293
  }
package/functions/diff.js CHANGED
@@ -1,39 +1,54 @@
1
- const parse = require('./parse')
2
- const eq = require('./eq')
1
+ const parse = require('./parse.js')
3
2
 
4
3
  const diff = (version1, version2) => {
5
- const v1 = parse(version1)
6
- const v2 = parse(version2)
7
- if (eq(v1, v2)) {
4
+ const v1 = parse(version1, null, true)
5
+ const v2 = parse(version2, null, true)
6
+ const comparison = v1.compare(v2)
7
+
8
+ if (comparison === 0) {
8
9
  return null
9
- } else {
10
- const hasPre = v1.prerelease.length || v2.prerelease.length
11
- const prefix = hasPre ? 'pre' : ''
12
- const defaultResult = hasPre ? 'prerelease' : ''
13
-
14
- if (v1.major !== v2.major) {
15
- return prefix + 'major'
16
- }
17
- if (v1.minor !== v2.minor) {
18
- return prefix + 'minor'
19
- }
20
-
21
- if (v1.patch !== v2.patch) {
22
- return prefix + 'patch'
23
- }
24
-
25
- if (!v1.prerelease.length || !v2.prerelease.length) {
26
- if (v1.patch) {
27
- return 'patch'
28
- }
29
- if (v1.minor) {
30
- return 'minor'
31
- }
32
- if (v1.major) {
33
- return 'major'
34
- }
35
- }
36
- return defaultResult // may be undefined
37
10
  }
11
+
12
+ const v1Higher = comparison > 0
13
+ const highVersion = v1Higher ? v1 : v2
14
+ const lowVersion = v1Higher ? v2 : v1
15
+ const highHasPre = !!highVersion.prerelease.length
16
+
17
+ // add the `pre` prefix if we are going to a prerelease version
18
+ const prefix = highHasPre ? 'pre' : ''
19
+
20
+ if (v1.major !== v2.major) {
21
+ return prefix + 'major'
22
+ }
23
+
24
+ if (v1.minor !== v2.minor) {
25
+ return prefix + 'minor'
26
+ }
27
+
28
+ if (v1.patch !== v2.patch) {
29
+ return prefix + 'patch'
30
+ }
31
+
32
+ // at this point we know stable versions match but overall versions are not equal,
33
+ // so either they are both prereleases, or the lower version is a prerelease
34
+
35
+ if (highHasPre) {
36
+ // high and low are preleases
37
+ return 'prerelease'
38
+ }
39
+
40
+ if (lowVersion.patch) {
41
+ // anything higher than a patch bump would result in the wrong version
42
+ return 'patch'
43
+ }
44
+
45
+ if (lowVersion.minor) {
46
+ // anything higher than a minor bump would result in the wrong version
47
+ return 'minor'
48
+ }
49
+
50
+ // bumping major/minor/patch all have same result
51
+ return 'major'
38
52
  }
53
+
39
54
  module.exports = diff
@@ -1,22 +1,15 @@
1
- const { MAX_LENGTH } = require('../internal/constants')
2
1
  const SemVer = require('../classes/semver')
3
- const parse = (version, options) => {
2
+ const parse = (version, options, throwErrors = false) => {
4
3
  if (version instanceof SemVer) {
5
4
  return version
6
5
  }
7
-
8
- if (typeof version !== 'string') {
9
- return null
10
- }
11
-
12
- if (version.length > MAX_LENGTH) {
13
- return null
14
- }
15
-
16
6
  try {
17
7
  return new SemVer(version, options)
18
8
  } catch (er) {
19
- return null
9
+ if (!throwErrors) {
10
+ return null
11
+ }
12
+ throw er
20
13
  }
21
14
  }
22
15
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "semver",
3
- "version": "7.4.0",
3
+ "version": "7.5.0",
4
4
  "description": "The semantic version parser used by npm.",
5
5
  "main": "index.js",
6
6
  "scripts": {