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 | */
|
9 | export 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 | */
|