11const debug = require ( '../internal/debug' )
22const { 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' )
44
55const parseOptions = require ( '../internal/parse-options' )
66const { compareIdentifiers } = require ( '../internal/identifiers' )
@@ -10,7 +10,7 @@ class SemVer {
1010
1111 if ( version instanceof SemVer ) {
1212 if ( version . loose === ! ! options . loose &&
13- version . includePrerelease === ! ! options . includePrerelease ) {
13+ version . includePrerelease === ! ! options . includePrerelease ) {
1414 return version
1515 } else {
1616 version = version . version
@@ -176,6 +176,20 @@ class SemVer {
176176 // preminor will bump the version up to the next minor release, and immediately
177177 // down to pre-release. premajor and prepatch work the same way.
178178 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+
179193 switch ( release ) {
180194 case 'premajor' :
181195 this . prerelease . length = 0
@@ -206,6 +220,12 @@ class SemVer {
206220 }
207221 this . inc ( 'pre' , identifier , identifierBase )
208222 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
209229
210230 case 'major' :
211231 // If this is a pre-major version, bump up to the same major version.
@@ -249,10 +269,6 @@ class SemVer {
249269 case 'pre' : {
250270 const base = Number ( identifierBase ) ? 1 : 0
251271
252- if ( ! identifier && identifierBase === false ) {
253- throw new Error ( 'invalid increment argument: identifier is empty' )
254- }
255-
256272 if ( this . prerelease . length === 0 ) {
257273 this . prerelease = [ base ]
258274 } else {
0 commit comments