cloudflarePackageVersionSatisfies function
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;
}