-
Notifications
You must be signed in to change notification settings - Fork 577
/
test_range.ts
82 lines (79 loc) · 2.22 KB
/
test_range.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import type { Comparator, Range, SemVer } from "./types.ts";
import { compare } from "./compare.ts";
import { isWildcardComparator } from "./_shared.ts";
function testComparator(version: SemVer, comparator: Comparator): boolean {
if (isWildcardComparator(comparator)) {
return true;
}
const cmp = compare(version, comparator.semver ?? comparator);
switch (comparator.operator) {
case "=":
case undefined: {
return cmp === 0;
}
case "!=": {
return cmp !== 0;
}
case ">": {
return cmp > 0;
}
case "<": {
return cmp < 0;
}
case ">=": {
return cmp >= 0;
}
case "<=": {
return cmp <= 0;
}
}
}
function testComparatorSet(
version: SemVer,
set: Comparator[],
): boolean {
for (const comparator of set) {
if (!testComparator(version, comparator)) {
return false;
}
}
if (version.prerelease && version.prerelease.length > 0) {
// Find the comparator that is allowed to have prereleases
// For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
// That should allow `1.2.3-pr.2` to pass.
// However, `1.2.4-alpha.notready` should NOT be allowed,
// even though it's within the range set by the comparators.
for (const comparator of set) {
if (isWildcardComparator(comparator)) {
continue;
}
const { prerelease } = comparator.semver ?? comparator;
if (prerelease && prerelease.length > 0) {
const major = comparator.semver?.major ?? comparator.major;
const minor = comparator.semver?.minor ?? comparator.minor;
const patch = comparator.semver?.patch ?? comparator.patch;
if (
version.major === major && version.minor === minor &&
version.patch === patch
) {
return true;
}
}
}
return false;
}
return true;
}
/**
* Test to see if the version satisfies the range.
* @param version The version to test
* @param range The range to check
* @returns true if the version is in the range
*/
export function testRange(
version: SemVer,
range: Range,
): boolean {
return range.some((set) => testComparatorSet(version, set));
}