UNPKG

2.51 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.validRange = exports.satisfiesWithPrereleases = void 0;
4const tslib_1 = require("tslib");
5const semver_1 = tslib_1.__importDefault(require("semver"));
6/**
7 * Returns whether the given semver version satisfies the given range. Notably
8 * this supports prerelease versions so that "2.0.0-rc.0" satisfies the range
9 * ">=1.0.0", for example.
10 *
11 * This function exists because the semver.satisfies method does not include
12 * pre releases. This means ranges such as * would not satisfy 1.0.0-rc. The
13 * includePrerelease flag has a weird behavior and cannot be used (if you want
14 * to try it out, just run the `semverUtils` testsuite using this flag instead
15 * of our own implementation, and you'll see the failing cases).
16 *
17 * See https://github.com/yarnpkg/berry/issues/575 for more context.
18 */
19function satisfiesWithPrereleases(version, range, loose = false) {
20 let semverRange;
21 try {
22 semverRange = new semver_1.default.Range(range, { includePrerelease: true, loose });
23 }
24 catch (err) {
25 return false;
26 }
27 if (!version)
28 return false;
29 let semverVersion;
30 try {
31 semverVersion = new semver_1.default.SemVer(version, semverRange);
32 if (semverVersion.prerelease) {
33 semverVersion.prerelease = [];
34 }
35 }
36 catch (err) {
37 return false;
38 }
39 // A range has multiple sets of comparators. A version must satisfy all
40 // comparators in a set and at least one set to satisfy the range.
41 return semverRange.set.some(comparatorSet => {
42 for (const comparator of comparatorSet)
43 if (comparator.semver.prerelease)
44 comparator.semver.prerelease = [];
45 return comparatorSet.every(comparator => {
46 return comparator.test(semverVersion);
47 });
48 });
49}
50exports.satisfiesWithPrereleases = satisfiesWithPrereleases;
51const rangesCache = new Map();
52/**
53 * A cached version of `new semver.Range(potentialRange)` that returns `null` on invalid ranges
54 */
55function validRange(potentialRange) {
56 if (potentialRange.indexOf(`:`) !== -1)
57 return null;
58 let range = rangesCache.get(potentialRange);
59 if (typeof range !== `undefined`)
60 return range;
61 try {
62 range = new semver_1.default.Range(potentialRange);
63 }
64 catch (_a) {
65 range = null;
66 }
67 rangesCache.set(potentialRange, range);
68 return range;
69}
70exports.validRange = validRange;