@@ -16,7 +16,7 @@ class SemVer {
1616 version = version . version
1717 }
1818 } else if ( typeof version !== 'string' ) {
19- throw new TypeError ( `Invalid Version: ${ version } ` )
19+ throw new TypeError ( `Invalid Version: ${ require ( 'util' ) . inspect ( version ) } ` )
2020 }
2121
2222 if ( version . length > MAX_LENGTH ) {
@@ -175,36 +175,36 @@ class SemVer {
175175
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.
178- inc ( release , identifier ) {
178+ inc ( release , identifier , identifierBase ) {
179179 switch ( release ) {
180180 case 'premajor' :
181181 this . prerelease . length = 0
182182 this . patch = 0
183183 this . minor = 0
184184 this . major ++
185- this . inc ( 'pre' , identifier )
185+ this . inc ( 'pre' , identifier , identifierBase )
186186 break
187187 case 'preminor' :
188188 this . prerelease . length = 0
189189 this . patch = 0
190190 this . minor ++
191- this . inc ( 'pre' , identifier )
191+ this . inc ( 'pre' , identifier , identifierBase )
192192 break
193193 case 'prepatch' :
194194 // If this is already a prerelease, it will bump to the next version
195195 // drop any prereleases that might already exist, since they are not
196196 // relevant at this point.
197197 this . prerelease . length = 0
198- this . inc ( 'patch' , identifier )
199- this . inc ( 'pre' , identifier )
198+ this . inc ( 'patch' , identifier , identifierBase )
199+ this . inc ( 'pre' , identifier , identifierBase )
200200 break
201201 // If the input is a non-prerelease version, this acts the same as
202202 // prepatch.
203203 case 'prerelease' :
204204 if ( this . prerelease . length === 0 ) {
205- this . inc ( 'patch' , identifier )
205+ this . inc ( 'patch' , identifier , identifierBase )
206206 }
207- this . inc ( 'pre' , identifier )
207+ this . inc ( 'pre' , identifier , identifierBase )
208208 break
209209
210210 case 'major' :
@@ -246,9 +246,15 @@ class SemVer {
246246 break
247247 // This probably shouldn't be used publicly.
248248 // 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+
250256 if ( this . prerelease . length === 0 ) {
251- this . prerelease = [ 0 ]
257+ this . prerelease = [ base ]
252258 } else {
253259 let i = this . prerelease . length
254260 while ( -- i >= 0 ) {
@@ -259,22 +265,29 @@ class SemVer {
259265 }
260266 if ( i === - 1 ) {
261267 // 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 )
263272 }
264273 }
265274 if ( identifier ) {
266275 // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
267276 // 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+ }
268281 if ( compareIdentifiers ( this . prerelease [ 0 ] , identifier ) === 0 ) {
269282 if ( isNaN ( this . prerelease [ 1 ] ) ) {
270- this . prerelease = [ identifier , 0 ]
283+ this . prerelease = prerelease
271284 }
272285 } else {
273- this . prerelease = [ identifier , 0 ]
286+ this . prerelease = prerelease
274287 }
275288 }
276289 break
277-
290+ }
278291 default :
279292 throw new Error ( `invalid increment argument: ${ release } ` )
280293 }
0 commit comments