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