All files / semver / _test_comparator_set.ts

100.00% Branches 27/27
100.00% Lines 48/48
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
 
 
 
x28
x28
 
x1081
x1081
x1107
x1107
x2108
x2108
x1081
x2219
x1138
x1138
x2164
x1083
x1083
x2192
x1111
x1111
x2512
x1431
x1431
x2689
x1608
x1608
x2223
x1142
x1142
x1081
x1081
 
x28
x755
x1808
x1808
x755
 
 
 
 
 
 
x1771
x1806
x1806
x1853
x1806
x1806
x1806
x1806
x1806
x1816
x1816
x1806
 
x1411
x755


























































// Copyright 2018-2026 the Deno authors. MIT license.

import type { Comparator, SemVer } from "./types.ts";
import { isWildcardComparator } from "./_shared.ts";
import { compare } from "./compare.ts";

function testComparator(version: SemVer, comparator: Comparator): boolean {
  if (isWildcardComparator(comparator)) {
    return true;
  }
  const cmp = compare(version, 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;
    }
  }
}

export function testComparatorSet(version: SemVer, set: Comparator[]): boolean {
  for (const comparator of set) {
    if (!testComparator(version, comparator)) return false;
  }
  if (!version.prerelease?.length) return true;

  // 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;
    if (!comparator.prerelease?.length) continue;
    const { major, minor, patch } = comparator;
    if (
      version.major === major &&
      version.minor === minor &&
      version.patch === patch
    ) {
      return true;
    }
  }

  return false;
}