Skip to content

Commit 0c69881

Browse files
committed
feat: add Disable Prerelease Identifier Base for creating prerelease intentifiers without appending .0
1 parent 82aa7f6 commit 0c69881

File tree

7 files changed

+141
-9
lines changed

7 files changed

+141
-9
lines changed

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,29 @@ $ semver 1.2.3 -i prerelease --preid beta -n 1
253253
1.2.4-beta.1
254254
```
255255

256+
#### Disable Prerelease Identifier Base
257+
when this flag is set to true initial prerelease identifier base is disabled.
258+
259+
```javascript
260+
semver.inc('1.2.3', 'prerelease', { disableIdentifierBase: true } , 'beta')
261+
// '1.2.4-beta'
262+
```
263+
264+
command-line example:
265+
```bash
266+
$ semver 1.2.3 -i prerelease --preid beta -noidbase
267+
# 1.2.4-beta
268+
```
269+
270+
271+
if another version is created with same identifier then the prerelease
272+
number is used based on Prerelease Identifier Base
273+
274+
```javascript
275+
semver.inc('1.2.3-beta', 'prerelease', { disableIdentifierBase: true } , 'beta', '1')
276+
// '1.2.3-beta.1'
277+
```
278+
256279
### Advanced Range Syntax
257280
258281
Advanced range syntax desugars to primitive comparators in

bin/semver.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ let identifier
2525

2626
let identifierBase
2727

28+
let disableIdentifierBase
29+
2830
const semver = require('../')
2931
const parseOptions = require('../internal/parse-options')
3032

@@ -77,6 +79,9 @@ const main = () => {
7779
case '-n':
7880
identifierBase = argv.shift()
7981
break
82+
case '--noidbase':
83+
disableIdentifierBase = true
84+
break
8085
case '-c': case '--coerce':
8186
coerce = true
8287
break
@@ -94,7 +99,7 @@ const main = () => {
9499
}
95100
}
96101

97-
options = parseOptions({ loose, includePrerelease, rtl })
102+
options = parseOptions({ loose, includePrerelease, rtl, disableIdentifierBase })
98103

99104
versions = versions.map((v) => {
100105
return coerce ? (semver.coerce(v, options) || { version: v }).version : v
@@ -178,6 +183,19 @@ Options:
178183
--ltr
179184
Coerce version strings left to right (default)
180185
186+
-n <base>
187+
Prerelease Identifier Base
188+
that will let you let your prerelease number as
189+
zero-based or one-based.If you do not specify
190+
this parameter, it will default to zero-based.
191+
192+
--noidbase
193+
Disable Identifier Base
194+
when this flag is set to true initial prerelease
195+
identifier base is disabled, if another version
196+
is created with same identifier then the prerelease
197+
number is used based on Prerelease Identifier Base
198+
181199
Program exits successfully if any valid version satisfies
182200
all supplied ranges, and prints all satisfying versions.
183201

classes/semver.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,10 @@ 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
250251
if (this.prerelease.length === 0) {
251-
this.prerelease = [0]
252+
this.prerelease = [base]
252253
} else {
253254
let i = this.prerelease.length
254255
while (--i >= 0) {
@@ -259,23 +260,31 @@ class SemVer {
259260
}
260261
if (i === -1) {
261262
// didn't increment anything
262-
this.prerelease.push(0)
263+
this.prerelease.push(base)
263264
}
264265
}
265266
if (identifier) {
266-
const base = Number(identifierBase) ? 1 : 0
267267
// 1.2.0-beta.1 bumps to 1.2.0-beta.2,
268268
// 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
269269
if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
270270
if (isNaN(this.prerelease[1])) {
271-
this.prerelease = [identifier, base]
271+
if (this.options.disableIdentifierBase) {
272+
this.prerelease = [identifier]
273+
} else {
274+
this.prerelease = [identifier, base]
275+
}
272276
}
273277
} else {
274278
this.prerelease = [identifier, base]
279+
if (this.options.disableIdentifierBase) {
280+
this.prerelease = [identifier]
281+
} else {
282+
this.prerelease = [identifier, base]
283+
}
275284
}
276285
}
277286
break
278-
287+
}
279288
default:
280289
throw new Error(`invalid increment argument: ${release}`)
281290
}

tap-snapshots/test/bin/semver.js.test.cjs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,19 @@ Object {
9393
--ltr
9494
Coerce version strings left to right (default)
9595
96+
-n <base>
97+
Prerelease Identifier Base
98+
that will let you let your prerelease number as
99+
zero-based or one-based.If you do not specify
100+
this parameter, it will default to zero-based.
101+
102+
--noidbase
103+
Disable Identifier Base
104+
when this flag is set to true initial prerelease
105+
identifier base is disabled, if another version
106+
is created with same identifier then the prerelease
107+
number is used based on Prerelease Identifier Base
108+
96109
Program exits successfully if any valid version satisfies
97110
all supplied ranges, and prints all satisfying versions.
98111
@@ -149,6 +162,19 @@ Object {
149162
--ltr
150163
Coerce version strings left to right (default)
151164
165+
-n <base>
166+
Prerelease Identifier Base
167+
that will let you let your prerelease number as
168+
zero-based or one-based.If you do not specify
169+
this parameter, it will default to zero-based.
170+
171+
--noidbase
172+
Disable Identifier Base
173+
when this flag is set to true initial prerelease
174+
identifier base is disabled, if another version
175+
is created with same identifier then the prerelease
176+
number is used based on Prerelease Identifier Base
177+
152178
Program exits successfully if any valid version satisfies
153179
all supplied ranges, and prints all satisfying versions.
154180
@@ -205,6 +231,19 @@ Object {
205231
--ltr
206232
Coerce version strings left to right (default)
207233
234+
-n <base>
235+
Prerelease Identifier Base
236+
that will let you let your prerelease number as
237+
zero-based or one-based.If you do not specify
238+
this parameter, it will default to zero-based.
239+
240+
--noidbase
241+
Disable Identifier Base
242+
when this flag is set to true initial prerelease
243+
identifier base is disabled, if another version
244+
is created with same identifier then the prerelease
245+
number is used based on Prerelease Identifier Base
246+
208247
Program exits successfully if any valid version satisfies
209248
all supplied ranges, and prints all satisfying versions.
210249
@@ -261,6 +300,19 @@ Object {
261300
--ltr
262301
Coerce version strings left to right (default)
263302
303+
-n <base>
304+
Prerelease Identifier Base
305+
that will let you let your prerelease number as
306+
zero-based or one-based.If you do not specify
307+
this parameter, it will default to zero-based.
308+
309+
--noidbase
310+
Disable Identifier Base
311+
when this flag is set to true initial prerelease
312+
identifier base is disabled, if another version
313+
is created with same identifier then the prerelease
314+
number is used based on Prerelease Identifier Base
315+
264316
Program exits successfully if any valid version satisfies
265317
all supplied ranges, and prints all satisfying versions.
266318
@@ -310,6 +362,15 @@ Object {
310362
}
311363
`
312364

365+
exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta --noidbase 1`] = `
366+
Object {
367+
"code": 0,
368+
"err": "",
369+
"out": "2.0.0-beta\\n",
370+
"signal": null,
371+
}
372+
`
373+
313374
exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta 1`] = `
314375
Object {
315376
"code": 0,

test/bin/semver.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ const run = args => new Promise((resolve, reject) => {
2828
t.test('inc tests', t => Promise.all([
2929
['-i', 'major', '1.0.0'],
3030
['-i', 'major', '1.0.0', '1.0.1'],
31-
['-i', 'premajor', '1.0.0', '--preid=beta'],
3231
['-i', 'premajor', '1.0.0', '--preid=beta', '-n', '1'],
32+
['-i', 'premajor', '1.0.0', '--preid=beta', '--noidbase'],
3333
['-i', '1.2.3'],
3434
].map(args => t.resolveMatchSnapshot(run(args), args.join(' ')))))
3535

test/fixtures/increments.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,21 @@ module.exports = [
101101
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev', '0'],
102102
['1.2.0', 'preminor', '1.3.0-dev.1', false, 'dev', '1'],
103103
['1.2.3-1', 'preminor', '1.3.0-dev.0', false, 'dev'],
104+
105+
// disableIdentifierBase
106+
['1.2.0-1', 'prerelease', '1.2.0-alpha', { disableIdentifierBase: true }, 'alpha', '0'],
107+
['1.2.1', 'prerelease', '1.2.2-alpha', { disableIdentifierBase: true }, 'alpha', '0'],
108+
['1.2.2', 'prerelease', '1.2.3-alpha', { disableIdentifierBase: true }, 'alpha', '1'],
109+
['1.2.0', 'prepatch', '1.2.1-dev', { disableIdentifierBase: true }, 'dev', '1'],
110+
['1.2.0-1', 'prepatch', '1.2.1-dev', { disableIdentifierBase: true }, 'dev', '1'],
111+
['1.2.0', 'premajor', '2.0.0-dev', { disableIdentifierBase: true }, 'dev', '0'],
112+
['1.2.3-1', 'premajor', '2.0.0-dev', { disableIdentifierBase: true }, 'dev', '0'],
113+
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev', { disableIdentifierBase: true }, 'dev', '0'],
114+
['1.2.0', 'preminor', '1.3.0-dev', { disableIdentifierBase: true }, 'dev', '1'],
115+
['1.2.3-1', 'preminor', '1.3.0-dev', { disableIdentifierBase: true }, 'dev'],
116+
['1.2.3-dev', 'prerelease', '1.2.3-dev.0', { disableIdentifierBase: true }, 'dev', '0'],
117+
['1.2.3-dev', 'prerelease', '1.2.3-dev.1', { disableIdentifierBase: true }, 'dev', '1'],
118+
['1.2.0-dev', 'premajor', '2.0.0-dev', { disableIdentifierBase: true }, 'dev', '0'],
119+
['1.2.0-dev', 'preminor', '1.3.0-beta', { disableIdentifierBase: true }, 'beta', '1'],
120+
['1.2.0-dev', 'prepatch', '1.2.1-dev', { disableIdentifierBase: true }, 'dev', '1'],
104121
]

test/internal/parse-options.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,13 @@ t.test('any object passed is returned', t => {
3535
loose: true,
3636
includePrerelease: true,
3737
})
38-
t.strictSame(parseOptions({ rtl: true, includePrerelease: true }), {
38+
t.strictSame(parseOptions({ disableIdentifierBase: true }), {
39+
disableIdentifierBase: true,
40+
})
41+
t.strictSame(parseOptions({ rtl: true, includePrerelease: true, disableIdentifierBase: true }), {
3942
rtl: true,
4043
includePrerelease: true,
44+
disableIdentifierBase: true,
4145
})
4246
t.end()
4347
})

0 commit comments

Comments
 (0)