-
Notifications
You must be signed in to change notification settings - Fork 623
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Co-authored-by: Asher Gomez <ashersaupingomez@gmail.com>
- Loading branch information
Showing
7 changed files
with
507 additions
and
64 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// Copyright 2018-2024 the Deno authors. All rights reserved. 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 && version.prerelease.length > 0) { | ||
// 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; | ||
} | ||
const { major, minor, patch, prerelease } = comparator; | ||
if (prerelease && prerelease.length > 0) { | ||
if ( | ||
version.major === major && version.minor === minor && | ||
version.patch === patch | ||
) { | ||
return true; | ||
} | ||
} | ||
} | ||
return false; | ||
} | ||
return true; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. | ||
|
||
import type { Comparator, Range, SemVer } from "./types.ts"; | ||
import { testComparatorSet } from "./_test_comparator_set.ts"; | ||
import { isWildcardComparator } from "./_shared.ts"; | ||
import { compare } from "./compare.ts"; | ||
|
||
/** Check if the semver is greater than the range. */ | ||
export function greaterThanRange(semver: SemVer, range: Range): boolean { | ||
return range.every((comparatorSet) => | ||
greaterThanComparatorSet(semver, comparatorSet) | ||
); | ||
} | ||
|
||
function greaterThanComparatorSet( | ||
semver: SemVer, | ||
comparatorSet: Comparator[], | ||
): boolean { | ||
// If the comparator set contains wildcard, then the semver is not greater than the range. | ||
if (comparatorSet.some(isWildcardComparator)) return false; | ||
// If the semver satisfies the comparator set, then it's not greater than the range. | ||
if (testComparatorSet(semver, comparatorSet)) return false; | ||
// If the semver is less than any of the comparator set, then it's not greater than the range. | ||
if ( | ||
comparatorSet.some((comparator) => lessThanComparator(semver, comparator)) | ||
) return false; | ||
return true; | ||
} | ||
|
||
function lessThanComparator(semver: SemVer, comparator: Comparator): boolean { | ||
const cmp = compare(semver, comparator); | ||
switch (comparator.operator) { | ||
case "=": | ||
case undefined: | ||
return cmp < 0; | ||
case "!=": | ||
return false; | ||
case ">": | ||
return cmp <= 0; | ||
case "<": | ||
return false; | ||
case ">=": | ||
return cmp < 0; | ||
case "<=": | ||
return false; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. | ||
// Copyright Isaac Z. Schlueter and npm contributors. All rights reserved. ISC license. | ||
|
||
import { assert, assertFalse } from "../assert/mod.ts"; | ||
import { | ||
format, | ||
formatRange, | ||
greaterThanRange, | ||
parse, | ||
parseRange, | ||
} from "./mod.ts"; | ||
|
||
Deno.test("greaterThanRange() checks if the semver is greater than the range", async (t) => { | ||
// from https://github.com/npm/node-semver/blob/692451bd6f75b38a71a99f39da405c94a5954a22/test/fixtures/version-gt-range.js | ||
const versionGtRange = [ | ||
["~1.2.2", "1.3.0"], | ||
["~0.6.1-1", "0.7.1-1"], | ||
["1.0.0 - 2.0.0", "2.0.1"], | ||
["1.0.0", "1.0.1-beta1"], | ||
["1.0.0", "2.0.0"], | ||
["<=2.0.0", "2.1.1"], | ||
["<=2.0.0", "3.2.9"], | ||
["<2.0.0", "2.0.0"], | ||
["0.1.20 || 1.2.4", "1.2.5"], | ||
["2.x.x", "3.0.0"], | ||
["1.2.x", "1.3.0"], | ||
["1.2.x || 2.x", "3.0.0"], | ||
["2.*.*", "5.0.1"], | ||
["1.2.*", "1.3.3"], | ||
["1.2.* || 2.*", "4.0.0"], | ||
["2", "3.0.0"], | ||
["2.3", "2.4.2"], | ||
["~2.4", "2.5.0"], // >=2.4.0 <2.5.0 | ||
["~2.4", "2.5.5"], | ||
["~>3.2.1", "3.3.0"], // >=3.2.1 <3.3.0 | ||
["~1", "2.2.3"], // >=1.0.0 <2.0.0 | ||
["~>1", "2.2.4"], | ||
["~> 1", "3.2.3"], | ||
["~1.0", "1.1.2"], // >=1.0.0 <1.1.0 | ||
["~ 1.0", "1.1.0"], | ||
["<1.2", "1.2.0"], | ||
["< 1.2", "1.2.1"], | ||
["~v0.5.4-pre", "0.6.0"], | ||
["~v0.5.4-pre", "0.6.1-pre"], | ||
["=0.7.x", "0.8.0"], | ||
["<0.7.x", "0.7.0"], | ||
["1.0.0 - 2.0.0", "2.2.3"], | ||
["1.0.0", "1.0.1"], | ||
["<=2.0.0", "3.0.0"], | ||
["<=2.0.0", "2.9999.9999"], | ||
["<=2.0.0", "2.2.9"], | ||
["<2.0.0", "2.9999.9999"], | ||
["<2.0.0", "2.2.9"], | ||
["2.x.x", "3.1.3"], | ||
["1.2.x", "1.3.3"], | ||
["1.2.x || 2.x", "3.1.3"], | ||
["2.*.*", "3.1.3"], | ||
["1.2.* || 2.*", "3.1.3"], | ||
["2", "3.1.2"], | ||
["2.3", "2.4.1"], | ||
["~>3.2.1", "3.3.2"], // >=3.2.1 <3.3.0 | ||
["~>1", "2.2.3"], | ||
["~1.0", "1.1.0"], // >=1.0.0 <1.1.0 | ||
["<1", "1.0.0"], | ||
["=0.7.x", "0.8.2"], | ||
["<0.7.x", "0.7.2"], | ||
] as const; | ||
|
||
for (const [range, version] of versionGtRange) { | ||
const v = parse(version); | ||
const r = parseRange(range); | ||
const testName = `${format(v)} should be greater than ${formatRange(r)}`; | ||
await t.step(testName, () => { | ||
assert(greaterThanRange(v, r), testName); | ||
}); | ||
} | ||
|
||
// from https://github.com/npm/node-semver/blob/692451bd6f75b38a71a99f39da405c94a5954a22/test/fixtures/version-not-gt-range.js | ||
const versionNotGtRange = [ | ||
["~0.6.1-1", "0.6.1-1"], | ||
["1.0.0 - 2.0.0", "1.2.3"], | ||
["1.0.0 - 2.0.0", "0.9.9"], | ||
["1.0.0", "1.0.0"], | ||
[">=*", "0.2.4"], | ||
["", "1.0.0", true], | ||
["*", "1.2.3"], | ||
["*", "1.2.3-foo"], | ||
[">=1.0.0", "1.0.0"], | ||
[">=1.0.0", "1.0.1"], | ||
[">=1.0.0", "1.1.0"], | ||
[">1.0.0", "1.0.1"], | ||
[">1.0.0", "1.1.0"], | ||
["<=2.0.0", "2.0.0"], | ||
["<=2.0.0", "1.9999.9999"], | ||
["<=2.0.0", "0.2.9"], | ||
["<2.0.0", "1.9999.9999"], | ||
["<2.0.0", "0.2.9"], | ||
[">= 1.0.0", "1.0.0"], | ||
[">= 1.0.0", "1.0.1"], | ||
[">= 1.0.0", "1.1.0"], | ||
["> 1.0.0", "1.0.1"], | ||
["> 1.0.0", "1.1.0"], | ||
["<= 2.0.0", "2.0.0"], | ||
["<= 2.0.0", "1.9999.9999"], | ||
["<= 2.0.0", "0.2.9"], | ||
["< 2.0.0", "1.9999.9999"], | ||
["<\t2.0.0", "0.2.9"], | ||
[">=0.1.97", "v0.1.97"], | ||
[">=0.1.97", "0.1.97"], | ||
["0.1.20 || 1.2.4", "1.2.4"], | ||
["0.1.20 || >1.2.4", "1.2.4"], | ||
["0.1.20 || 1.2.4", "1.2.3"], | ||
["0.1.20 || 1.2.4", "0.1.20"], | ||
[">=0.2.3 || <0.0.1", "0.0.0"], | ||
[">=0.2.3 || <0.0.1", "0.2.3"], | ||
[">=0.2.3 || <0.0.1", "0.2.4"], | ||
["||", "1.3.4"], | ||
["2.x.x", "2.1.3"], | ||
["1.2.x", "1.2.3"], | ||
["1.2.x || 2.x", "2.1.3"], | ||
["1.2.x || 2.x", "1.2.3"], | ||
["x", "1.2.3"], | ||
["2.*.*", "2.1.3"], | ||
["1.2.*", "1.2.3"], | ||
["1.2.* || 2.*", "2.1.3"], | ||
["1.2.* || 2.*", "1.2.3"], | ||
["2", "2.1.2"], | ||
["2.3", "2.3.1"], | ||
["~2.4", "2.4.0"], // >=2.4.0 <2.5.0 | ||
["~2.4", "2.4.5"], | ||
["~>3.2.1", "3.2.2"], // >=3.2.1 <3.3.0 | ||
["~1", "1.2.3"], // >=1.0.0 <2.0.0 | ||
["~>1", "1.2.3"], | ||
["~> 1", "1.2.3"], | ||
["~1.0", "1.0.2"], // >=1.0.0 <1.1.0 | ||
// ["~ 1.0", "1.0.2"], TODO(kt3k): Enable this. The parsing of `~ 1.0` seems broken now. | ||
[">=1", "1.0.0"], | ||
[">= 1", "1.0.0"], | ||
["<1.2", "1.1.1"], | ||
["< 1.2", "1.1.1"], | ||
["~v0.5.4-pre", "0.5.5"], | ||
["~v0.5.4-pre", "0.5.4"], | ||
["=0.7.x", "0.7.2"], | ||
[">=0.7.x", "0.7.2"], | ||
["=0.7.x", "0.7.0-asdf"], | ||
[">=0.7.x", "0.7.0-asdf"], | ||
["<=0.7.x", "0.6.2"], | ||
[">0.2.3 >0.2.4 <=0.2.5", "0.2.5"], | ||
[">=0.2.3 <=0.2.4", "0.2.4"], | ||
["1.0.0 - 2.0.0", "2.0.0"], | ||
["^1", "0.0.0-0"], | ||
["^3.0.0", "2.0.0"], | ||
["^1.0.0 || ~2.0.1", "2.0.0"], | ||
["^0.1.0 || ~3.0.1 || 5.0.0", "3.2.0"], | ||
["^0.1.0 || ~3.0.1 || 5.0.0", "5.0.0-0", true], | ||
["^0.1.0 || ~3.0.1 || >4 <=5.0.0", "3.5.0"], | ||
] as const; | ||
|
||
for (const [range, version] of versionNotGtRange) { | ||
const v = parse(version); | ||
const r = parseRange(range); | ||
const testName = `${format(v)} should not be greater than ${ | ||
formatRange(r) | ||
}`; | ||
await t.step(testName, () => { | ||
assertFalse(greaterThanRange(v, r), testName); | ||
}); | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. | ||
|
||
import type { Comparator, Range, SemVer } from "./types.ts"; | ||
import { testComparatorSet } from "./_test_comparator_set.ts"; | ||
import { isWildcardComparator } from "./_shared.ts"; | ||
import { compare } from "./compare.ts"; | ||
|
||
/** Check if the semver is less than the range. */ | ||
export function lessThanRange(semver: SemVer, range: Range): boolean { | ||
return range.every((comparatorSet) => | ||
lessThanComparatorSet(semver, comparatorSet) | ||
); | ||
} | ||
|
||
function lessThanComparatorSet(semver: SemVer, comparatorSet: Comparator[]) { | ||
// If the comparator set contains wildcard, then the semver is not greater than the range. | ||
if (comparatorSet.some(isWildcardComparator)) return false; | ||
// If the semver satisfies the comparator set, then it's not less than the range. | ||
if (testComparatorSet(semver, comparatorSet)) return false; | ||
// If the semver is greater than any of the comparator set, then it's not less than the range. | ||
if ( | ||
comparatorSet.some((comparator) => | ||
greaterThanComparator(semver, comparator) | ||
) | ||
) return false; | ||
return true; | ||
} | ||
|
||
function greaterThanComparator( | ||
semver: SemVer, | ||
comparator: Comparator, | ||
): boolean { | ||
const cmp = compare(semver, comparator); | ||
switch (comparator.operator) { | ||
case "=": | ||
case undefined: | ||
return cmp > 0; | ||
case "!=": | ||
return false; | ||
case ">": | ||
return false; | ||
case "<": | ||
return cmp >= 0; | ||
case ">=": | ||
return false; | ||
case "<=": | ||
return cmp > 0; | ||
} | ||
} |
Oops, something went wrong.