Skip to content

Commit 503a4e5

Browse files
authoredApr 14, 2023
feat: allow identifierBase to be false (#548)
1 parent fc2f3df commit 503a4e5

File tree

6 files changed

+90
-7
lines changed

6 files changed

+90
-7
lines changed
 

‎README.md

+11
Original file line numberDiff line numberDiff line change
@@ -239,20 +239,31 @@ $ semver 1.2.4-beta.0 -i prerelease
239239

240240
The method `.inc` takes an optional parameter 'identifierBase' string
241241
that will let you let your prerelease number as zero-based or one-based.
242+
Set to `false` to omit the prerelease number altogether.
242243
If you do not specify this parameter, it will default to zero-based.
243244

244245
```javascript
245246
semver.inc('1.2.3', 'prerelease', 'beta', '1')
246247
// '1.2.4-beta.1'
247248
```
248249

250+
```javascript
251+
semver.inc('1.2.3', 'prerelease', 'beta', false)
252+
// '1.2.4-beta'
253+
```
254+
249255
command-line example:
250256

251257
```bash
252258
$ semver 1.2.3 -i prerelease --preid beta -n 1
253259
1.2.4-beta.1
254260
```
255261

262+
```bash
263+
$ semver 1.2.3 -i prerelease --preid beta -n false
264+
1.2.4-beta
265+
```
266+
256267
### Advanced Range Syntax
257268

258269
Advanced range syntax desugars to primitive comparators in

‎bin/semver.js

+8
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ const main = () => {
7676
break
7777
case '-n':
7878
identifierBase = argv.shift()
79+
if (identifierBase === 'false') {
80+
identifierBase = false
81+
}
7982
break
8083
case '-c': case '--coerce':
8184
coerce = true
@@ -178,6 +181,11 @@ Options:
178181
--ltr
179182
Coerce version strings left to right (default)
180183
184+
-n <base>
185+
Base number to be used for the prerelease identifier.
186+
Can be either 0 or 1, or false to omit the number altogether.
187+
Defaults to 0.
188+
181189
Program exits successfully if any valid version satisfies
182190
all supplied ranges, and prints all satisfying versions.
183191

‎classes/semver.js

+19-7
Original file line numberDiff line numberDiff line change
@@ -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,23 +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) {
266-
const base = Number(identifierBase) ? 1 : 0
267275
// 1.2.0-beta.1 bumps to 1.2.0-beta.2,
268276
// 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+
}
269281
if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
270282
if (isNaN(this.prerelease[1])) {
271-
this.prerelease = [identifier, base]
283+
this.prerelease = prerelease
272284
}
273285
} else {
274-
this.prerelease = [identifier, base]
286+
this.prerelease = prerelease
275287
}
276288
}
277289
break
278-
290+
}
279291
default:
280292
throw new Error(`invalid increment argument: ${release}`)
281293
}

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

+29
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ Object {
9393
--ltr
9494
Coerce version strings left to right (default)
9595
96+
-n <base>
97+
Base number to be used for the prerelease identifier.
98+
Can be either 0 or 1, or false to omit the number altogether.
99+
Defaults to 0.
100+
96101
Program exits successfully if any valid version satisfies
97102
all supplied ranges, and prints all satisfying versions.
98103
@@ -149,6 +154,11 @@ Object {
149154
--ltr
150155
Coerce version strings left to right (default)
151156
157+
-n <base>
158+
Base number to be used for the prerelease identifier.
159+
Can be either 0 or 1, or false to omit the number altogether.
160+
Defaults to 0.
161+
152162
Program exits successfully if any valid version satisfies
153163
all supplied ranges, and prints all satisfying versions.
154164
@@ -205,6 +215,11 @@ Object {
205215
--ltr
206216
Coerce version strings left to right (default)
207217
218+
-n <base>
219+
Base number to be used for the prerelease identifier.
220+
Can be either 0 or 1, or false to omit the number altogether.
221+
Defaults to 0.
222+
208223
Program exits successfully if any valid version satisfies
209224
all supplied ranges, and prints all satisfying versions.
210225
@@ -261,6 +276,11 @@ Object {
261276
--ltr
262277
Coerce version strings left to right (default)
263278
279+
-n <base>
280+
Base number to be used for the prerelease identifier.
281+
Can be either 0 or 1, or false to omit the number altogether.
282+
Defaults to 0.
283+
264284
Program exits successfully if any valid version satisfies
265285
all supplied ranges, and prints all satisfying versions.
266286
@@ -310,6 +330,15 @@ Object {
310330
}
311331
`
312332

333+
exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta -n false 1`] = `
334+
Object {
335+
"code": 0,
336+
"err": "",
337+
"out": "2.0.0-beta\\n",
338+
"signal": null,
339+
}
340+
`
341+
313342
exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta 1`] = `
314343
Object {
315344
"code": 0,

‎test/bin/semver.js

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ t.test('inc tests', t => Promise.all([
3030
['-i', 'major', '1.0.0', '1.0.1'],
3131
['-i', 'premajor', '1.0.0', '--preid=beta'],
3232
['-i', 'premajor', '1.0.0', '--preid=beta', '-n', '1'],
33+
['-i', 'premajor', '1.0.0', '--preid=beta', '-n', 'false'],
3334
['-i', '1.2.3'],
3435
].map(args => t.resolveMatchSnapshot(run(args), args.join(' ')))))
3536

‎test/fixtures/increments.js

+22
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ module.exports = [
7979
['1.2.3-1', 'preminor', '1.3.0-dev.0', false, 'dev'],
8080
['1.2.0', 'premajor', '2.0.0-dev.0', false, 'dev'],
8181
['1.2.3-1', 'premajor', '2.0.0-dev.0', false, 'dev'],
82+
['1.2.3-1', 'premajor', '2.0.0-dev.1', false, 'dev', 1],
8283
['1.2.0-1', 'minor', '1.2.0', false, 'dev'],
8384
['1.0.0-1', 'major', '1.0.0', 'dev'],
8485
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev'],
@@ -99,6 +100,27 @@ module.exports = [
99100
['1.2.0', 'premajor', '2.0.0-dev.0', false, 'dev', '0'],
100101
['1.2.3-1', 'premajor', '2.0.0-dev.0', false, 'dev', '0'],
101102
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev', '0'],
103+
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.1', false, 'dev', '1'],
104+
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.bar.0', false, '', '0'],
105+
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.bar.1', false, '', '1'],
102106
['1.2.0', 'preminor', '1.3.0-dev.1', false, 'dev', '1'],
103107
['1.2.3-1', 'preminor', '1.3.0-dev.0', false, 'dev'],
108+
['1.2.0', 'prerelease', '1.2.1-1', false, '', '1'],
109+
110+
['1.2.0-1', 'prerelease', '1.2.0-alpha', false, 'alpha', false],
111+
['1.2.1', 'prerelease', '1.2.2-alpha', false, 'alpha', false],
112+
['1.2.2', 'prerelease', '1.2.3-alpha', false, 'alpha', false],
113+
['1.2.0', 'prepatch', '1.2.1-dev', false, 'dev', false],
114+
['1.2.0-1', 'prepatch', '1.2.1-dev', false, 'dev', false],
115+
['1.2.0', 'premajor', '2.0.0-dev', false, 'dev', false],
116+
['1.2.3-1', 'premajor', '2.0.0-dev', false, 'dev', false],
117+
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev', false, 'dev', false],
118+
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.baz', false, 'dev.baz', false],
119+
['1.2.0', 'preminor', '1.3.0-dev', false, 'dev', false],
120+
['1.2.3-1', 'preminor', '1.3.0-dev', false, 'dev', false],
121+
['1.2.3-dev', 'prerelease', null, false, 'dev', false],
122+
['1.2.0-dev', 'premajor', '2.0.0-dev', false, 'dev', false],
123+
['1.2.0-dev', 'preminor', '1.3.0-beta', false, 'beta', false],
124+
['1.2.0-dev', 'prepatch', '1.2.1-dev', false, 'dev', false],
125+
['1.2.0', 'prerelease', null, false, '', false],
104126
]

0 commit comments

Comments
 (0)
Please sign in to comment.