|
const { |
|
MAX_SAFE_COMPONENT_LENGTH, |
|
MAX_SAFE_BUILD_LENGTH, |
|
MAX_LENGTH, |
|
} = require('./constants') |
|
const debug = require('./debug') |
|
exports = module.exports = {} |
|
|
|
|
|
const re = exports.re = [] |
|
const safeRe = exports.safeRe = [] |
|
const src = exports.src = [] |
|
const t = exports.t = {} |
|
let R = 0 |
|
|
|
const LETTERDASHNUMBER = '[a-zA-Z0-9-]' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const safeRegexReplacements = [ |
|
['\\s', 1], |
|
['\\d', MAX_LENGTH], |
|
[LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], |
|
] |
|
|
|
const makeSafeRegex = (value) => { |
|
for (const [token, max] of safeRegexReplacements) { |
|
value = value |
|
.split(`${token}*`).join(`${token}{0,${max}}`) |
|
.split(`${token}+`).join(`${token}{1,${max}}`) |
|
} |
|
return value |
|
} |
|
|
|
const createToken = (name, value, isGlobal) => { |
|
const safe = makeSafeRegex(value) |
|
const index = R++ |
|
debug(name, index, value) |
|
t[name] = index |
|
src[index] = value |
|
re[index] = new RegExp(value, isGlobal ? 'g' : undefined) |
|
safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') |
|
createToken('NUMERICIDENTIFIERLOOSE', '\\d+') |
|
|
|
|
|
|
|
|
|
|
|
createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`) |
|
|
|
|
|
|
|
|
|
createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + |
|
`(${src[t.NUMERICIDENTIFIER]})\\.` + |
|
`(${src[t.NUMERICIDENTIFIER]})`) |
|
|
|
createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + |
|
`(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + |
|
`(${src[t.NUMERICIDENTIFIERLOOSE]})`) |
|
|
|
|
|
|
|
|
|
createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] |
|
}|${src[t.NONNUMERICIDENTIFIER]})`) |
|
|
|
createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] |
|
}|${src[t.NONNUMERICIDENTIFIER]})`) |
|
|
|
|
|
|
|
|
|
|
|
createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] |
|
}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) |
|
|
|
createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] |
|
}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) |
|
|
|
|
|
|
|
|
|
createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`) |
|
|
|
|
|
|
|
|
|
|
|
createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] |
|
}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
createToken('FULLPLAIN', `v?${src[t.MAINVERSION] |
|
}${src[t.PRERELEASE]}?${ |
|
src[t.BUILD]}?`) |
|
|
|
createToken('FULL', `^${src[t.FULLPLAIN]}$`) |
|
|
|
|
|
|
|
|
|
createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] |
|
}${src[t.PRERELEASELOOSE]}?${ |
|
src[t.BUILD]}?`) |
|
|
|
createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) |
|
|
|
createToken('GTLT', '((?:<|>)?=?)') |
|
|
|
|
|
|
|
|
|
createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) |
|
createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) |
|
|
|
createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + |
|
`(?:\\.(${src[t.XRANGEIDENTIFIER]})` + |
|
`(?:\\.(${src[t.XRANGEIDENTIFIER]})` + |
|
`(?:${src[t.PRERELEASE]})?${ |
|
src[t.BUILD]}?` + |
|
`)?)?`) |
|
|
|
createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + |
|
`(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + |
|
`(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + |
|
`(?:${src[t.PRERELEASELOOSE]})?${ |
|
src[t.BUILD]}?` + |
|
`)?)?`) |
|
|
|
createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) |
|
createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) |
|
|
|
|
|
|
|
createToken('COERCEPLAIN', `${'(^|[^\\d])' + |
|
'(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + |
|
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + |
|
`(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`) |
|
createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`) |
|
createToken('COERCEFULL', src[t.COERCEPLAIN] + |
|
`(?:${src[t.PRERELEASE]})?` + |
|
`(?:${src[t.BUILD]})?` + |
|
`(?:$|[^\\d])`) |
|
createToken('COERCERTL', src[t.COERCE], true) |
|
createToken('COERCERTLFULL', src[t.COERCEFULL], true) |
|
|
|
|
|
|
|
createToken('LONETILDE', '(?:~>?)') |
|
|
|
createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) |
|
exports.tildeTrimReplace = '$1~' |
|
|
|
createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) |
|
createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) |
|
|
|
|
|
|
|
createToken('LONECARET', '(?:\\^)') |
|
|
|
createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) |
|
exports.caretTrimReplace = '$1^' |
|
|
|
createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) |
|
createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) |
|
|
|
|
|
createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) |
|
createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) |
|
|
|
|
|
|
|
createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] |
|
}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) |
|
exports.comparatorTrimReplace = '$1$2$3' |
|
|
|
|
|
|
|
|
|
|
|
createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + |
|
`\\s+-\\s+` + |
|
`(${src[t.XRANGEPLAIN]})` + |
|
`\\s*$`) |
|
|
|
createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + |
|
`\\s+-\\s+` + |
|
`(${src[t.XRANGEPLAINLOOSE]})` + |
|
`\\s*$`) |
|
|
|
|
|
createToken('STAR', '(<|>)?=?\\s*\\*') |
|
|
|
createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$') |
|
createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$') |
|
|