1
1
const debug = require ( '../internal/debug' )
2
2
const { MAX_LENGTH , MAX_SAFE_INTEGER } = require ( '../internal/constants' )
3
- const { safeRe : re , t } = require ( '../internal/re' )
3
+ const { safeRe : re , safeSrc : src , t } = require ( '../internal/re' )
4
4
5
5
const parseOptions = require ( '../internal/parse-options' )
6
6
const { compareIdentifiers } = require ( '../internal/identifiers' )
@@ -10,7 +10,7 @@ class SemVer {
10
10
11
11
if ( version instanceof SemVer ) {
12
12
if ( version . loose === ! ! options . loose &&
13
- version . includePrerelease === ! ! options . includePrerelease ) {
13
+ version . includePrerelease === ! ! options . includePrerelease ) {
14
14
return version
15
15
} else {
16
16
version = version . version
@@ -176,6 +176,20 @@ class SemVer {
176
176
// preminor will bump the version up to the next minor release, and immediately
177
177
// down to pre-release. premajor and prepatch work the same way.
178
178
inc ( release , identifier , identifierBase ) {
179
+ if ( release . startsWith ( 'pre' ) ) {
180
+ if ( ! identifier && identifierBase === false ) {
181
+ throw new Error ( 'invalid increment argument: identifier is empty' )
182
+ }
183
+ // Avoid an invalid semver results
184
+ if ( identifier ) {
185
+ const r = new RegExp ( `^${ this . options . loose ? src [ t . PRERELEASELOOSE ] : src [ t . PRERELEASE ] } $` )
186
+ const match = `-${ identifier } ` . match ( r )
187
+ if ( ! match || match [ 1 ] !== identifier ) {
188
+ throw new Error ( `invalid identifier: ${ identifier } ` )
189
+ }
190
+ }
191
+ }
192
+
179
193
switch ( release ) {
180
194
case 'premajor' :
181
195
this . prerelease . length = 0
@@ -206,6 +220,12 @@ class SemVer {
206
220
}
207
221
this . inc ( 'pre' , identifier , identifierBase )
208
222
break
223
+ case 'release' :
224
+ if ( this . prerelease . length === 0 ) {
225
+ throw new Error ( `version ${ this . raw } is not a prerelease` )
226
+ }
227
+ this . prerelease . length = 0
228
+ break
209
229
210
230
case 'major' :
211
231
// If this is a pre-major version, bump up to the same major version.
@@ -249,10 +269,6 @@ class SemVer {
249
269
case 'pre' : {
250
270
const base = Number ( identifierBase ) ? 1 : 0
251
271
252
- if ( ! identifier && identifierBase === false ) {
253
- throw new Error ( 'invalid increment argument: identifier is empty' )
254
- }
255
-
256
272
if ( this . prerelease . length === 0 ) {
257
273
this . prerelease = [ base ]
258
274
} else {
0 commit comments