cloudflarePackageVersionSatisfies function

bool cloudflarePackageVersionSatisfies(
  1. String version,
  2. String range
)

Returns whether version satisfies range.

Only exact versions (1.2.3) and caret ranges (^1.2.3) are supported, which are the forms Katana requests. Prerelease versions never satisfy.

Implementation

bool cloudflarePackageVersionSatisfies(String version, String range) {
  List<int>? parse(String value) {
    final match = RegExp(r"^(\d+)\.(\d+)\.(\d+)$").firstMatch(value.trim());
    if (match == null) {
      return null;
    }
    return [1, 2, 3].map((i) => int.parse(match.group(i)!)).toList();
  }

  int compare(List<int> a, List<int> b) {
    for (var i = 0; i < 3; i++) {
      if (a[i] != b[i]) {
        return a[i].compareTo(b[i]);
      }
    }
    return 0;
  }

  final caret = range.startsWith("^");
  final minimum = parse(caret ? range.substring(1) : range);
  if (minimum == null) {
    throw ArgumentError.value(range, "range", "Unsupported version range.");
  }
  final current = parse(version);
  if (current == null) {
    return false;
  }
  if (!caret) {
    return compare(current, minimum) == 0;
  }
  if (compare(current, minimum) < 0) {
    return false;
  }
  if (minimum[0] > 0) {
    return current[0] == minimum[0];
  }
  if (minimum[1] > 0) {
    return current[0] == 0 && current[1] == minimum[1];
  }
  return compare(current, minimum) == 0;
}