1+ 'use strict'
2+
13const debug = require ( '../internal/debug' )
24const { MAX_LENGTH , MAX_SAFE_INTEGER } = require ( '../internal/constants' )
35const { safeRe : re , t } = require ( '../internal/re' )
@@ -10,7 +12,7 @@ class SemVer {
1012
1113 if ( version instanceof SemVer ) {
1214 if ( version . loose === ! ! options . loose &&
13- version . includePrerelease === ! ! options . includePrerelease ) {
15+ version . includePrerelease === ! ! options . includePrerelease ) {
1416 return version
1517 } else {
1618 version = version . version
@@ -176,6 +178,19 @@ class SemVer {
176178 // preminor will bump the version up to the next minor release, and immediately
177179 // down to pre-release. premajor and prepatch work the same way.
178180 inc ( release , identifier , identifierBase ) {
181+ if ( release . startsWith ( 'pre' ) ) {
182+ if ( ! identifier && identifierBase === false ) {
183+ throw new Error ( 'invalid increment argument: identifier is empty' )
184+ }
185+ // Avoid an invalid semver results
186+ if ( identifier ) {
187+ const match = `-${ identifier } ` . match ( this . options . loose ? re [ t . PRERELEASELOOSE ] : re [ t . PRERELEASE ] )
188+ if ( ! match || match [ 1 ] !== identifier ) {
189+ throw new Error ( `invalid identifier: ${ identifier } ` )
190+ }
191+ }
192+ }
193+
179194 switch ( release ) {
180195 case 'premajor' :
181196 this . prerelease . length = 0
@@ -206,6 +221,12 @@ class SemVer {
206221 }
207222 this . inc ( 'pre' , identifier , identifierBase )
208223 break
224+ case 'release' :
225+ if ( this . prerelease . length === 0 ) {
226+ throw new Error ( `version ${ this . raw } is not a prerelease` )
227+ }
228+ this . prerelease . length = 0
229+ break
209230
210231 case 'major' :
211232 // If this is a pre-major version, bump up to the same major version.
@@ -249,10 +270,6 @@ class SemVer {
249270 case 'pre' : {
250271 const base = Number ( identifierBase ) ? 1 : 0
251272
252- if ( ! identifier && identifierBase === false ) {
253- throw new Error ( 'invalid increment argument: identifier is empty' )
254- }
255-
256273 if ( this . prerelease . length === 0 ) {
257274 this . prerelease = [ base ]
258275 } else {
0 commit comments