Skip to content

Commit af761c0

Browse files
authored
fix(inc): fully capture prerelease identifier (#764)
Closes: #763
1 parent 2cfcbb5 commit af761c0

File tree

4 files changed

+13
-6
lines changed

4 files changed

+13
-6
lines changed

classes/semver.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const debug = require('../internal/debug')
22
const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
3-
const { safeRe: re, t } = require('../internal/re')
3+
const { safeRe: re, safeSrc: src, t } = require('../internal/re')
44

55
const parseOptions = require('../internal/parse-options')
66
const { compareIdentifiers } = require('../internal/identifiers')
@@ -182,7 +182,8 @@ class SemVer {
182182
}
183183
// Avoid an invalid semver results
184184
if (identifier) {
185-
const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])
185+
const r = new RegExp(`^${this.options.loose ? src[t.PRERELEASELOOSE] : src[t.PRERELEASE]}$`)
186+
const match = `-${identifier}`.match(r)
186187
if (!match || match[1] !== identifier) {
187188
throw new Error(`invalid identifier: ${identifier}`)
188189
}

internal/re.js

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ exports = module.exports = {}
1010
const re = exports.re = []
1111
const safeRe = exports.safeRe = []
1212
const src = exports.src = []
13+
const safeSrc = exports.safeSrc = []
1314
const t = exports.t = {}
1415
let R = 0
1516

@@ -42,6 +43,7 @@ const createToken = (name, value, isGlobal) => {
4243
debug(name, index, value)
4344
t[name] = index
4445
src[index] = value
46+
safeSrc[index] = safe
4547
re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
4648
safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)
4749
}

test/fixtures/increments.js

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ module.exports = [
3232
['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'],
3333
['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'],
3434
['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'],
35+
['1.0.0', 'prepatch', '1.0.1-alpha.1.1a.0', null, 'alpha.1.1a'],
3536
['1.2.0', 'prepatch', '1.2.1-0'],
3637
['1.2.0-1', 'prepatch', '1.2.1-0'],
3738
['1.2.0', 'preminor', '1.3.0-0'],

test/internal/re.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
const { test } = require('tap')
2-
const { src, re, safeRe } = require('../../internal/re')
2+
const { src, re, safeRe, safeSrc } = require('../../internal/re')
33
const semver = require('../../')
44

5-
test('has a list of src, re, and tokens', (t) => {
5+
test('Semver itself has a list of src, re, and tokens', (t) => {
66
t.match(Object.assign({}, semver), {
7-
src: Array,
87
re: Array,
8+
src: Array,
99
tokens: Object,
1010
})
1111
re.forEach(r => t.match(r, RegExp, 'regexps are regexps'))
12-
src.forEach(s => t.match(s, String, 'src is strings'))
12+
safeRe.forEach(r => t.match(r, RegExp, 'safe regexps are regexps'))
13+
src.forEach(s => t.match(s, String, 'src are strings'))
14+
safeSrc.forEach(s => t.match(s, String, 'safe srcare strings'))
15+
t.ok(Object.keys(semver.tokens).length, 'there are tokens')
1316
for (const i in semver.tokens) {
1417
t.match(semver.tokens[i], Number, 'tokens are numbers')
1518
}

0 commit comments

Comments
 (0)