meetsComparator

tcmts.core.semver.meetsComparator · #tc7ov4hq · term · runs anywhere

import { compareVersions, parse, partial } from "#codebase/tcmts/core/semver";

export function meetsComparator(version: string, comparator: string): boolean {
  const m = /^(\^|~|>=|<=|>|<|=)?\s*(.*)$/.exec(comparator)!;
  const op = m[1] ?? "";
  const spec = m[2]!.replace(/^v/, "");
  const cmp = (b: string) => compareVersions(version, b);
  const p = parse(spec);
  if (!p) {
    const bounds = partial(spec);
    if (!bounds) return false;
    const [lo, hi] = bounds;
    if (op === "" || op === "=" || op === "^" || op === "~") return cmp(lo) >= 0 && (hi === undefined || cmp(hi) < 0);
    if (op === ">=") return cmp(lo) >= 0;
    if (op === ">") return hi === undefined ? false : cmp(hi) >= 0;
    if (op === "<") return cmp(lo) < 0;
    if (op === "<=") return hi === undefined || cmp(hi) < 0;
    return false;
  }
  switch (op) {
    case "":
    case "=":
      return cmp(spec) === 0;
    case ">":
      return cmp(spec) > 0;
    case ">=":
      return cmp(spec) >= 0;
    case "<":
      return cmp(spec) < 0;
    case "<=":
      return cmp(spec) <= 0;
    case "~":
      return cmp(spec) >= 0 && cmp(`${p.major}.${p.minor + 1}.0`) < 0;
    case "^": {
      const upper = p.major > 0 ? `${p.major + 1}.0.0` : p.minor > 0 ? `0.${p.minor + 1}.0` : `0.0.${p.patch + 1}`;
      return cmp(spec) >= 0 && cmp(upper) < 0;
    }
  }
  return false;
}

uses

used by