All files / semver / _test_comparator_set.ts

100.00% Branches 43/43
100.00% Functions 2/2
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
 
x1054
x1054
x26
x26
x1028
x1028
x1054
x1054
x58
x58
x1054
x2
x2
x1054
x30
x30
x1054
x350
x350
x1054
x527
x527
x1054
x61
x61
x1054
x1054
 
x28
x728
x1054
x1054
x728
 
 
 
 
 
 
x374
x35
x35
x13
x35
x35
x35
x35
x35
x10
x10
x35
 
x14
x728


























































// 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;
}