UNPKG

1.27 kBJavaScriptView Raw
1// @ts-check
2
3/**
4 * Extracts versions from a semver string.
5 * @param {string} semver The semver string.
6 * @returns {SemanticVersion} The major, minor, patch, prerelease and build
7 * versions.
8 */
9export default function semver(semver) {
10 if (typeof semver !== "string")
11 throw new TypeError("Argument 1 `semver` must be a string.");
12
13 const match = semver.match(
14 // The is is official recommended RegEx, see:
15 // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
16 /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/u
17 );
18
19 if (!match)
20 throw new TypeError("Argument 1 `semver` must be a semver string.");
21
22 const [, major, minor, patch, prerelease, build] = match;
23
24 return {
25 major: parseInt(major),
26 minor: parseInt(minor),
27 patch: parseInt(patch),
28 prerelease,
29 build,
30 };
31}
32
33/**
34 * A semantic version.
35 * @typedef {object} SemanticVersion
36 * @prop {number} major Major version.
37 * @prop {number} minor Minor version.
38 * @prop {number} patch Patch version.
39 * @prop {string} [prerelease] Prerelease version.
40 * @prop {string} [build] Build metadata.
41 */