Skip to content

Commit 113f513

Browse files
wraithgarb-bly
andauthoredApr 10, 2023
feat: identifierBase parameter for .inc (#532)
Co-authored-by: Brendt Bly <brendt.bly@outlook.com>
1 parent ea689bc commit 113f513

File tree

9 files changed

+76
-23
lines changed

9 files changed

+76
-23
lines changed
 

‎README.md

+21
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ Options:
110110
-l --loose
111111
Interpret versions and ranges loosely
112112
113+
-n <0|1>
114+
This is the base to be used for the prerelease identifier.
115+
113116
-p --include-prerelease
114117
Always include prerelease versions in range matching
115118
@@ -232,6 +235,24 @@ $ semver 1.2.4-beta.0 -i prerelease
232235
1.2.4-beta.1
233236
```
234237

238+
#### Prerelease Identifier Base
239+
240+
The method `.inc` takes an optional parameter 'identifierBase' string
241+
that will let you let your prerelease number as zero-based or one-based.
242+
If you do not specify this parameter, it will default to zero-based.
243+
244+
```javascript
245+
semver.inc('1.2.3', 'prerelease', 'beta', '1')
246+
// '1.2.4-beta.1'
247+
```
248+
249+
command-line example:
250+
251+
```bash
252+
$ semver 1.2.3 -i prerelease --preid beta -n 1
253+
1.2.4-beta.1
254+
```
255+
235256
### Advanced Range Syntax
236257

237258
Advanced range syntax desugars to primitive comparators in

‎bin/semver.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ let rtl = false
2323

2424
let identifier
2525

26+
let identifierBase
27+
2628
const semver = require('../')
2729

2830
let reverse = false
@@ -71,6 +73,9 @@ const main = () => {
7173
case '-r': case '--range':
7274
range.push(argv.shift())
7375
break
76+
case '-n':
77+
identifierBase = argv.shift()
78+
break
7479
case '-c': case '--coerce':
7580
coerce = true
7681
break
@@ -127,7 +132,7 @@ const success = () => {
127132
}).map((v) => {
128133
return semver.clean(v, options)
129134
}).map((v) => {
130-
return inc ? semver.inc(v, inc, options, identifier) : v
135+
return inc ? semver.inc(v, inc, options, identifier, identifierBase) : v
131136
}).forEach((v, i, _) => {
132137
console.log(v)
133138
})

‎classes/semver.js

+10-9
Original file line numberDiff line numberDiff line change
@@ -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':
@@ -263,14 +263,15 @@ class SemVer {
263263
}
264264
}
265265
if (identifier) {
266+
const base = Number(identifierBase) ? 1 : 0
266267
// 1.2.0-beta.1 bumps to 1.2.0-beta.2,
267268
// 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
268269
if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
269270
if (isNaN(this.prerelease[1])) {
270-
this.prerelease = [identifier, 0]
271+
this.prerelease = [identifier, base]
271272
}
272273
} else {
273-
this.prerelease = [identifier, 0]
274+
this.prerelease = [identifier, base]
274275
}
275276
}
276277
break

‎functions/inc.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
const SemVer = require('../classes/semver')
22

3-
const inc = (version, release, options, identifier) => {
3+
const inc = (version, release, options, identifier, identifierBase) => {
44
if (typeof (options) === 'string') {
5+
identifierBase = identifier
56
identifier = options
67
options = undefined
78
}
@@ -10,7 +11,7 @@ const inc = (version, release, options, identifier) => {
1011
return new SemVer(
1112
version instanceof SemVer ? version.version : version,
1213
options
13-
).inc(release, identifier).version
14+
).inc(release, identifier, identifierBase).version
1415
} catch (er) {
1516
return null
1617
}

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

+9
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,15 @@ Object {
301301
}
302302
`
303303

304+
exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta -n 1 1`] = `
305+
Object {
306+
"code": 0,
307+
"err": "",
308+
"out": "2.0.0-beta.1\\n",
309+
"signal": null,
310+
}
311+
`
312+
304313
exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta 1`] = `
305314
Object {
306315
"code": 0,

‎test/bin/semver.js

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

‎test/classes/semver.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,13 @@ test('incrementing', t => {
8484
expect,
8585
options,
8686
id,
87+
base,
8788
]) => t.test(`${version} ${inc} ${id || ''}`.trim(), t => {
8889
t.plan(1)
8990
if (expect === null) {
90-
t.throws(() => new SemVer(version, options).inc(inc, id))
91+
t.throws(() => new SemVer(version, options).inc(inc, id, base))
9192
} else {
92-
t.equal(new SemVer(version, options).inc(inc, id).version, expect)
93+
t.equal(new SemVer(version, options).inc(inc, id, base).version, expect)
9394
}
9495
}))
9596
})

‎test/fixtures/increments.js

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// [version, inc, result, options, identifier]
2-
// inc(version, inc) -> result
1+
// [version, inc, result, options, identifier, identifierBase]
2+
// inc(version, inc, options, identifier, identifierBase) -> result
33
module.exports = [
44
['1.2.3', 'major', '2.0.0'],
55
['1.2.3', 'minor', '1.3.0'],
@@ -82,9 +82,23 @@ module.exports = [
8282
['1.2.0-1', 'minor', '1.2.0', false, 'dev'],
8383
['1.0.0-1', 'major', '1.0.0', 'dev'],
8484
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev'],
85-
8685
['1.2.3-0', 'prerelease', '1.2.3-1.0', false, '1'],
8786
['1.2.3-1.0', 'prerelease', '1.2.3-1.1', false, '1'],
8887
['1.2.3-1.1', 'prerelease', '1.2.3-1.2', false, '1'],
8988
['1.2.3-1.1', 'prerelease', '1.2.3-2.0', false, '2'],
89+
90+
// [version, inc, result, identifierIndex, loose, identifier]
91+
['1.2.0-1', 'prerelease', '1.2.0-alpha.0', false, 'alpha', '0'],
92+
['1.2.1', 'prerelease', '1.2.2-alpha.0', false, 'alpha', '0'],
93+
['0.2.0', 'prerelease', '0.2.1-alpha.0', false, 'alpha', '0'],
94+
['1.2.2', 'prerelease', '1.2.3-alpha.1', false, 'alpha', '1'],
95+
['1.2.3', 'prerelease', '1.2.4-alpha.1', false, 'alpha', '1'],
96+
['1.2.4', 'prerelease', '1.2.5-alpha.1', false, 'alpha', '1'],
97+
['1.2.0', 'prepatch', '1.2.1-dev.1', false, 'dev', '1'],
98+
['1.2.0-1', 'prepatch', '1.2.1-dev.1', false, 'dev', '1'],
99+
['1.2.0', 'premajor', '2.0.0-dev.0', false, 'dev', '0'],
100+
['1.2.3-1', 'premajor', '2.0.0-dev.0', false, 'dev', '0'],
101+
['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev', '0'],
102+
['1.2.0', 'preminor', '1.3.0-dev.1', false, 'dev', '1'],
103+
['1.2.3-1', 'preminor', '1.3.0-dev.0', false, 'dev'],
90104
]

‎test/functions/inc.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@ const parse = require('../../functions/parse')
44
const increments = require('../fixtures/increments.js')
55

66
test('increment versions test', (t) => {
7-
increments.forEach(([pre, what, wanted, options, id]) => {
8-
const found = inc(pre, what, options, id)
9-
const cmd = `inc(${pre}, ${what}, ${id})`
7+
increments.forEach(([pre, what, wanted, options, id, base]) => {
8+
const found = inc(pre, what, options, id, base)
9+
const cmd = `inc(${pre}, ${what}, ${id}, ${base})`
1010
t.equal(found, wanted, `${cmd} === ${wanted}`)
1111

1212
const parsed = parse(pre, options)
1313
const parsedAsInput = parse(pre, options)
1414
if (wanted) {
15-
parsed.inc(what, id)
15+
parsed.inc(what, id, base)
1616
t.equal(parsed.version, wanted, `${cmd} object version updated`)
1717
t.equal(parsed.raw, wanted, `${cmd} object raw field updated`)
1818

1919
const preIncObject = JSON.stringify(parsedAsInput)
20-
inc(parsedAsInput, what, options, id)
20+
inc(parsedAsInput, what, options, id, base)
2121
const postIncObject = JSON.stringify(parsedAsInput)
2222
t.equal(
2323
postIncObject,
@@ -26,7 +26,7 @@ test('increment versions test', (t) => {
2626
)
2727
} else if (parsed) {
2828
t.throws(() => {
29-
parsed.inc(what, id)
29+
parsed.inc(what, id, base)
3030
})
3131
} else {
3232
t.equal(parsed, null)

0 commit comments

Comments
 (0)
Please sign in to comment.