From e24ccad4857f1f288c7b76e7dcd9e2b90e14daed Mon Sep 17 00:00:00 2001 From: Egor Aristov Date: Wed, 15 Oct 2025 19:25:15 +0300 Subject: [PATCH] remove unused packages --- kitcom/internal/tsgo/semver/version.go | 274 ----- kitcom/internal/tsgo/semver/version_range.go | 438 -------- .../tsgo/semver/version_range_test.go | 959 ------------------ kitcom/internal/tsgo/semver/version_test.go | 147 --- 4 files changed, 1818 deletions(-) delete mode 100644 kitcom/internal/tsgo/semver/version.go delete mode 100644 kitcom/internal/tsgo/semver/version_range.go delete mode 100644 kitcom/internal/tsgo/semver/version_range_test.go delete mode 100644 kitcom/internal/tsgo/semver/version_test.go diff --git a/kitcom/internal/tsgo/semver/version.go b/kitcom/internal/tsgo/semver/version.go deleted file mode 100644 index 7780551..0000000 --- a/kitcom/internal/tsgo/semver/version.go +++ /dev/null @@ -1,274 +0,0 @@ -package semver - -import ( - "cmp" - "fmt" - "regexp" - "slices" - "strconv" - "strings" -) - -// https://semver.org/#spec-item-2 -// > A normal version number MUST take the form X.Y.Z where X, Y, and Z are non-negative -// > integers, and MUST NOT contain leading zeroes. X is the major version, Y is the minor -// > version, and Z is the patch version. Each element MUST increase numerically. -// -// NOTE: We differ here in that we allow X and X.Y, with missing parts having the default -// value of `0`. -var versionRegexp = regexp.MustCompile(`(?i)^(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:-([a-z0-9-.]+))?(?:\+([a-z0-9-.]+))?)?)?$`) - -// https://semver.org/#spec-item-9 -// > A pre-release version MAY be denoted by appending a hyphen and a series of dot separated -// > identifiers immediately following the patch version. Identifiers MUST comprise only ASCII -// > alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty. Numeric identifiers -// > MUST NOT include leading zeroes. -var ( - prereleaseRegexp = regexp.MustCompile(`(?i)^(?:0|[1-9]\d*|[a-z-][a-z0-9-]*)(?:\.(?:0|[1-9]\d*|[a-zA-Z-][a-zA-Z0-9-]*))*$`) - prereleasePartRegexp = regexp.MustCompile(`(?i)^(?:0|[1-9]\d*|[a-z-][a-z0-9-]*)$`) -) - -// https://semver.org/#spec-item-10 -// > Build metadata MAY be denoted by appending a plus sign and a series of dot separated -// > identifiers immediately following the patch or pre-release version. Identifiers MUST -// > comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty. -var ( - buildRegExp = regexp.MustCompile(`(?i)^[a-z0-9-]+(?:\.[a-z0-9-]+)*$`) - buildPartRegExp = regexp.MustCompile(`(?i)^[a-z0-9-]+$`) -) - -// https://semver.org/#spec-item-9 -// > Numeric identifiers MUST NOT include leading zeroes. -var numericIdentifierRegExp = regexp.MustCompile(`^(?:0|[1-9]\d*)$`) - -type Version struct { - major uint32 - minor uint32 - patch uint32 - prerelease []string - build []string -} - -var versionZero = Version{ - prerelease: []string{"0"}, -} - -func (v *Version) incrementMajor() Version { - return Version{ - major: v.major + 1, - } -} - -func (v *Version) incrementMinor() Version { - return Version{ - major: v.major, - minor: v.minor + 1, - } -} - -func (v *Version) incrementPatch() Version { - return Version{ - major: v.major, - minor: v.minor, - patch: v.patch + 1, - } -} - -const ( - comparisonLessThan = -1 - comparisonEqualTo = 0 - comparisonGreaterThan = 1 -) - -func (a *Version) Compare(b *Version) int { - // https://semver.org/#spec-item-11 - // > Precedence is determined by the first difference when comparing each of these - // > identifiers from left to right as follows: Major, minor, and patch versions are - // > always compared numerically. - // - // https://semver.org/#spec-item-11 - // > Precedence for two pre-release versions with the same major, minor, and patch version - // > MUST be determined by comparing each dot separated identifier from left to right until - // > a difference is found [...] - // - // https://semver.org/#spec-item-11 - // > Build metadata does not figure into precedence - switch { - case a == b: - return comparisonEqualTo - case a == nil: - return comparisonLessThan - case b == nil: - return comparisonGreaterThan - } - - r := cmp.Compare(a.major, b.major) - if r != 0 { - return r - } - - r = cmp.Compare(a.minor, b.minor) - if r != 0 { - return r - } - - r = cmp.Compare(a.patch, b.patch) - if r != 0 { - return r - } - - return comparePreReleaseIdentifiers(a.prerelease, b.prerelease) -} - -func comparePreReleaseIdentifiers(left, right []string) int { - // https://semver.org/#spec-item-11 - // > When major, minor, and patch are equal, a pre-release version has lower precedence - // > than a normal version. - if len(left) == 0 { - if len(right) == 0 { - return comparisonEqualTo - } - return comparisonGreaterThan - } else if len(right) == 0 { - return comparisonLessThan - } - - // https://semver.org/#spec-item-11 - // > Precedence for two pre-release versions with the same major, minor, and patch version - // > MUST be determined by comparing each dot separated identifier from left to right until - // > a difference is found [...] - return slices.CompareFunc(left, right, comparePreReleaseIdentifier) -} - -func comparePreReleaseIdentifier(left, right string) int { - // https://semver.org/#spec-item-11 - // > Precedence for two pre-release versions with the same major, minor, and patch version - // > MUST be determined by comparing each dot separated identifier from left to right until - // > a difference is found [...] - compareResult := strings.Compare(left, right) - if compareResult == 0 { - return compareResult - } - - leftIsNumeric := numericIdentifierRegExp.MatchString(left) - rightIsNumeric := numericIdentifierRegExp.MatchString(right) - - if leftIsNumeric || rightIsNumeric { - // https://semver.org/#spec-item-11 - // > Numeric identifiers always have lower precedence than non-numeric identifiers. - if !rightIsNumeric { - return comparisonLessThan - } - if !leftIsNumeric { - return comparisonGreaterThan - } - - // https://semver.org/#spec-item-11 - // > identifiers consisting of only digits are compared numerically - leftAsNumber, leftErr := getUintComponent(left) - rightAsNumber, rightErr := getUintComponent(right) - if leftErr != nil || rightErr != nil { - // This should only happen in the event of an overflow. - // If so, use the lengths or fall back to string comparison. - leftLen := len(left) - rightLen := len(right) - lenCompare := cmp.Compare(leftLen, rightLen) - if lenCompare == 0 { - return compareResult - } else { - return lenCompare - } - } - return cmp.Compare(leftAsNumber, rightAsNumber) - } - - // https://semver.org/#spec-item-11 - // > identifiers with letters or hyphens are compared lexically in ASCII sort order. - return compareResult -} - -func (v *Version) String() string { - var sb strings.Builder - fmt.Fprintf(&sb, "%d.%d.%d", v.major, v.minor, v.patch) - if len(v.prerelease) > 0 { - fmt.Fprintf(&sb, "-%s", strings.Join(v.prerelease, ".")) - } - if len(v.build) > 0 { - fmt.Fprintf(&sb, "+%s", strings.Join(v.build, ".")) - } - return sb.String() -} - -type SemverParseError struct { - origInput string -} - -func (e *SemverParseError) Error() string { - return fmt.Sprintf("Could not parse version string from %q", e.origInput) -} - -func TryParseVersion(text string) (Version, error) { - var result Version - - match := versionRegexp.FindStringSubmatch(text) - if match == nil { - return result, &SemverParseError{origInput: text} - } - - majorStr := match[1] - minorStr := match[2] - patchStr := match[3] - prereleaseStr := match[4] - buildStr := match[5] - - var err error - - result.major, err = getUintComponent(majorStr) - if err != nil { - return result, err - } - - if minorStr != "" { - result.minor, err = getUintComponent(minorStr) - if err != nil { - return result, err - } - } - - if patchStr != "" { - result.patch, err = getUintComponent(patchStr) - if err != nil { - return result, err - } - } - - if prereleaseStr != "" { - if !prereleaseRegexp.MatchString(prereleaseStr) { - return result, &SemverParseError{origInput: text} - } - - result.prerelease = strings.Split(prereleaseStr, ".") - } - if buildStr != "" { - if !buildRegExp.MatchString(buildStr) { - return result, &SemverParseError{origInput: text} - } - - result.build = strings.Split(buildStr, ".") - } - - return result, nil -} - -func MustParse(text string) Version { - v, err := TryParseVersion(text) - if err != nil { - panic(err) - } - return v -} - -func getUintComponent(text string) (uint32, error) { - r, err := strconv.ParseUint(text, 10, 32) - return uint32(r), err -} diff --git a/kitcom/internal/tsgo/semver/version_range.go b/kitcom/internal/tsgo/semver/version_range.go deleted file mode 100644 index 25ea9b5..0000000 --- a/kitcom/internal/tsgo/semver/version_range.go +++ /dev/null @@ -1,438 +0,0 @@ -package semver - -import ( - "regexp" - "strings" -) - -// https://github.com/npm/node-semver#range-grammar -// -// range-set ::= range ( logical-or range ) * -// range ::= hyphen | simple ( ' ' simple ) * | ” -// logical-or ::= ( ' ' ) * '||' ( ' ' ) * -var ( - logicalOrRegExp = regexp.MustCompile(`\|\|`) - whitespaceRegExp = regexp.MustCompile(`\s+`) -) - -// https://github.com/npm/node-semver#range-grammar -// -// partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? -// xr ::= 'x' | 'X' | '*' | nr -// nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * -// qualifier ::= ( '-' pre )? ( '+' build )? -// pre ::= parts -// build ::= parts -// parts ::= part ( '.' part ) * -// part ::= nr | [-0-9A-Za-z]+ -var partialRegExp = regexp.MustCompile(`(?i)^([x*0]|[1-9]\d*)(?:\.([x*0]|[1-9]\d*)(?:\.([x*0]|[1-9]\d*)(?:-([a-z0-9-.]+))?(?:\+([a-z0-9-.]+))?)?)?$`) - -// https://github.com/npm/node-semver#range-grammar -// -// hyphen ::= partial ' - ' partial -var hyphenRegExp = regexp.MustCompile(`(?i)^\s*([a-z0-9-+.*]+)\s+-\s+([a-z0-9-+.*]+)\s*$`) - -// https://github.com/npm/node-semver#range-grammar -// -// simple ::= primitive | partial | tilde | caret -// primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial -// tilde ::= '~' partial -// caret ::= '^' partial -var rangeRegExp = regexp.MustCompile(`(?i)^([~^<>=]|<=|>=)?\s*([a-z0-9-+.*]+)$`) - -type VersionRange struct { - alternatives [][]versionComparator -} - -type versionComparator struct { - operator comparatorOperator - operand Version -} - -type comparatorOperator string - -const ( - rangeLessThan comparatorOperator = "<" - rangeLessThanEqual comparatorOperator = "<=" - rangeEqual comparatorOperator = "=" - rangeGreaterThanEqual comparatorOperator = ">=" - rangeGreaterThan comparatorOperator = ">" -) - -func (v *VersionRange) String() string { - var sb strings.Builder - formatDisjunction(&sb, v.alternatives) - return sb.String() -} - -func formatDisjunction(sb *strings.Builder, alternatives [][]versionComparator) { - origLen := sb.Len() - - for i, alternative := range alternatives { - if i > 0 { - sb.WriteString(" || ") - } - formatAlternative(sb, alternative) - } - - if sb.Len() == origLen { - sb.WriteString("*") - } -} - -func formatAlternative(sb *strings.Builder, comparators []versionComparator) { - for i, comparator := range comparators { - if i > 0 { - sb.WriteByte(' ') - } - formatComparator(sb, comparator) - } -} - -func formatComparator(sb *strings.Builder, comparator versionComparator) { - sb.WriteString(string(comparator.operator)) - sb.WriteString(comparator.operand.String()) -} - -func (v *VersionRange) Test(version *Version) bool { - return testDisjunction(v.alternatives, version) -} - -func testDisjunction(alternatives [][]versionComparator, version *Version) bool { - // an empty disjunction is treated as "*" (all versions) - if len(alternatives) == 0 { - return true - } - - for _, alternative := range alternatives { - if testAlternative(alternative, version) { - return true - } - } - - return false -} - -func testAlternative(alternative []versionComparator, version *Version) bool { - for _, comparator := range alternative { - if !testComparator(comparator, version) { - return false - } - } - return true -} - -func testComparator(comparator versionComparator, version *Version) bool { - cmp := version.Compare(&comparator.operand) - switch comparator.operator { - case rangeLessThan: - return cmp < 0 - case rangeLessThanEqual: - return cmp <= 0 - case rangeEqual: - return cmp == 0 - case rangeGreaterThanEqual: - return cmp >= 0 - case rangeGreaterThan: - return cmp > 0 - default: - panic("Unexpected operator: " + comparator.operator) - } -} - -func TryParseVersionRange(text string) (VersionRange, bool) { - alternatives, ok := parseAlternatives(text) - return VersionRange{alternatives: alternatives}, ok -} - -func parseAlternatives(text string) ([][]versionComparator, bool) { - var alternatives [][]versionComparator - - text = strings.TrimSpace(text) - ranges := logicalOrRegExp.Split(text, -1) - for _, r := range ranges { - r = strings.TrimSpace(r) - if r == "" { - continue - } - - var comparators []versionComparator - - if hyphenMatch := hyphenRegExp.FindStringSubmatch(r); hyphenMatch != nil { - if parsedComparators, ok := parseHyphen(hyphenMatch[1], hyphenMatch[2]); ok { - comparators = append(comparators, parsedComparators...) - } else { - return nil, false - } - } else { - for _, simple := range whitespaceRegExp.Split(r, -1) { - match := rangeRegExp.FindStringSubmatch(strings.TrimSpace(simple)) - if match == nil { - return nil, false - } - - if parsedComparators, ok := parseComparator(match[1], match[2]); ok { - comparators = append(comparators, parsedComparators...) - } else { - return nil, false - } - } - } - - alternatives = append(alternatives, comparators) - } - - return alternatives, true -} - -func parseHyphen(left, right string) ([]versionComparator, bool) { - leftResult, leftOk := parsePartial(left) - if !leftOk { - return nil, false - } - - rightResult, rightOk := parsePartial(right) - if !rightOk { - return nil, false - } - - var comparators []versionComparator - if !isWildcard(leftResult.majorStr) { - // `MAJOR.*.*-...` gives us `>=MAJOR.0.0 ...` - comparators = append(comparators, versionComparator{ - operator: rangeGreaterThanEqual, - operand: leftResult.version, - }) - } - - if !isWildcard(rightResult.majorStr) { - var operator comparatorOperator - operand := rightResult.version - - switch { - case isWildcard(rightResult.minorStr): - // `...-MAJOR.*.*` gives us `... <(MAJOR+1).0.0` - operand = operand.incrementMajor() - operator = rangeLessThan - case isWildcard(rightResult.patchStr): - // `...-MAJOR.MINOR.*` gives us `... 0 || isWildcard(result.minorStr) { - secondVersion = result.version.incrementMajor() - } else if result.version.minor > 0 || isWildcard(result.patchStr) { - secondVersion = result.version.incrementMinor() - } else { - secondVersion = result.version.incrementPatch() - } - second := versionComparator{rangeLessThan, secondVersion} - comparatorsResult = []versionComparator{first, second} - - case "<", ">=": - version := result.version - if isWildcard(result.minorStr) || isWildcard(result.patchStr) { - version.prerelease = []string{"0"} - } - comparatorsResult = []versionComparator{ - {operator, version}, - } - - case "<=", ">": - version := result.version - if isWildcard(result.minorStr) { - if operator == rangeLessThanEqual { - operator = rangeLessThan - } else { - operator = rangeGreaterThanEqual - } - - version = version.incrementMajor() - version.prerelease = []string{"0"} - } else if isWildcard(result.patchStr) { - if operator == rangeLessThanEqual { - operator = rangeLessThan - } else { - operator = rangeGreaterThanEqual - } - - version = version.incrementMinor() - version.prerelease = []string{"0"} - } - - comparatorsResult = []versionComparator{ - {operator, version}, - } - case "=", "": - // normalize empty string to `=` - operator = rangeEqual - - if isWildcard(result.minorStr) || isWildcard(result.patchStr) { - originalVersion := result.version - - firstVersion := originalVersion - firstVersion.prerelease = []string{"0"} - - var secondVersion Version - if isWildcard(result.minorStr) { - secondVersion = originalVersion.incrementMajor() - } else { - secondVersion = originalVersion.incrementMinor() - } - secondVersion.prerelease = []string{"0"} - - comparatorsResult = []versionComparator{ - {rangeGreaterThanEqual, firstVersion}, - {rangeLessThan, secondVersion}, - } - } else { - comparatorsResult = []versionComparator{ - {operator, result.version}, - } - } - default: - panic("Unexpected operator: " + operator) - } - } else { - if operator == "<" || operator == ">" { - comparatorsResult = []versionComparator{ - // < 0.0.0-0 - {rangeLessThan, versionZero}, - } - } - } - - return comparatorsResult, true -} - -func isWildcard(text string) bool { - return text == "*" || text == "x" || text == "X" -} diff --git a/kitcom/internal/tsgo/semver/version_range_test.go b/kitcom/internal/tsgo/semver/version_range_test.go deleted file mode 100644 index 12eeecd..0000000 --- a/kitcom/internal/tsgo/semver/version_range_test.go +++ /dev/null @@ -1,959 +0,0 @@ -package semver - -import ( - "fmt" - "strings" - "testing" - - "gotest.tools/v3/assert" -) - -func TestWildcardsHaveSameString(t *testing.T) { - t.Parallel() - majorWildcardStrings := []string{ - "", - "*", - "*.*", - "*.*.*", - "x", - "x.x", - "x.x.x", - "X", - "X.X", - "X.X.X", - } - - minorWildcardStrings := []string{ - "1", - "1.*", - "1.*.*", - "1.x", - "1.x.x", - "1.X", - "1.X.X", - } - - patchWildcardStrings := []string{ - "1.2", - "1.2.*", - "1.2.x", - "1.2.X", - } - - mixedCaseWildcardStrings := []string{ - "x", - "X", - "*", - "x.X.x", - "X.x.*", - } - - assertAllVersionRangesHaveIdenticalStrings(t, "majorWildcardStrings", majorWildcardStrings) - assertAllVersionRangesHaveIdenticalStrings(t, "minorWildcardStrings", minorWildcardStrings) - assertAllVersionRangesHaveIdenticalStrings(t, "patchWildcardStrings", patchWildcardStrings) - assertAllVersionRangesHaveIdenticalStrings(t, "mixedCaseWildcardStrings", mixedCaseWildcardStrings) -} - -func assertAllVersionRangesHaveIdenticalStrings(t *testing.T, name string, strs []string) { - t.Run(name, func(t *testing.T) { - t.Parallel() - for _, s1 := range strs { - for _, s2 := range strs { - t.Run(s1+" == "+s2, func(t *testing.T) { - v1, ok := TryParseVersionRange(s1) - assert.Assert(t, ok) - v2, ok := TryParseVersionRange(s2) - assert.Assert(t, ok) - assert.DeepEqual(t, v1.String(), v2.String()) - }) - } - } - }) -} - -type testGoodBad struct { - good []string - bad []string -} - -func TestVersionRanges(t *testing.T) { - t.Parallel() - assertRangesGoodBad(t, "1", testGoodBad{ - good: []string{"1.0.0", "1.9.9", "1.0.0-pre", "1.0.0+build"}, - bad: []string{"0.0.0", "2.0.0", "0.0.0-pre", "0.0.0+build"}, - }) - assertRangesGoodBad(t, "1.2", testGoodBad{ - good: []string{"1.2.0", "1.2.9", "1.2.0-pre", "1.2.0+build"}, - bad: []string{"1.1.0", "1.3.0", "1.1.0-pre", "1.1.0+build"}, - }) - - assertRangesGoodBad(t, "1.2.3", testGoodBad{ - good: []string{"1.2.3", "1.2.3+build"}, - bad: []string{"1.2.2", "1.2.4", "1.2.2-pre", "1.2.2+build", "1.2.3-pre"}, - }) - - assertRangesGoodBad(t, "1.2.3-pre", testGoodBad{ - good: []string{"1.2.3-pre", "1.2.3-pre+build.stuff"}, - bad: []string{"1.2.3", "1.2.3-pre.0", "1.2.3-pre.9", "1.2.3-pre.0+build", "1.2.3-pre.9+build", "1.2.3+build", "1.2.4"}, - }) - - assertRangesGoodBad(t, "<3.8.0", testGoodBad{ - good: []string{"3.6", "3.7"}, - bad: []string{"3.8", "3.9", "4.0"}, - }) - - assertRangesGoodBad(t, "<=3.8.0", testGoodBad{ - good: []string{"3.6", "3.7", "3.8"}, - bad: []string{"3.9", "4.0"}, - }) - assertRangesGoodBad(t, ">3.8.0", testGoodBad{ - good: []string{"3.9", "4.0"}, - bad: []string{"3.6", "3.7", "3.8"}, - }) - assertRangesGoodBad(t, ">=3.8.0", testGoodBad{ - good: []string{"3.8", "3.9", "4.0"}, - bad: []string{"3.6", "3.7"}, - }) - - assertRangesGoodBad(t, "<3.8.0-0", testGoodBad{ - good: []string{"3.6", "3.7"}, - bad: []string{"3.8", "3.9", "4.0"}, - }) - - assertRangesGoodBad(t, "<=3.8.0-0", testGoodBad{ - good: []string{"3.6", "3.7"}, - bad: []string{"3.8", "3.9", "4.0"}, - }) - - // Big numbers in prerelease strings. - lotsaOnes := strings.Repeat("1", 320) - assertRangesGoodBad(t, ">=1.2.3-1"+lotsaOnes, testGoodBad{ - good: []string{"1.2.3-1" + lotsaOnes, "1.2.3-11" + lotsaOnes + ".1", "1.2.3-1" + lotsaOnes + ".1+build"}, - bad: []string{"1.2.3-" + lotsaOnes + ".1+build"}, - }) -} - -func TestComparatorsOfVersionRanges(t *testing.T) { - t.Parallel() - comparatorsTests := []testForRangeOnVersion{ - // empty (matches everything) - {"", "2.0.0", true}, - {"", "2.0.0-0", true}, - {"", "1.1.0", true}, - {"", "1.1.0-0", true}, - {"", "1.0.1", true}, - {"", "1.0.1-0", true}, - {"", "1.0.0", true}, - {"", "1.0.0-0", true}, - {"", "0.0.0", true}, - {"", "0.0.0-0", true}, - - // wildcard major (matches everything) - {"*", "2.0.0", true}, - {"*", "2.0.0-0", true}, - {"*", "1.1.0", true}, - {"*", "1.1.0-0", true}, - {"*", "1.0.1", true}, - {"*", "1.0.1-0", true}, - {"*", "1.0.0", true}, - {"*", "1.0.0-0", true}, - {"*", "0.0.0", true}, - {"*", "0.0.0-0", true}, - - // wildcard minor - {"1", "2.0.0", false}, - {"1", "2.0.0-0", false}, - {"1", "1.1.0", true}, - {"1", "1.1.0-0", true}, - {"1", "1.0.1", true}, - {"1", "1.0.1-0", true}, - {"1", "1.0.0", true}, - {"1", "1.0.0-0", true}, - {"1", "0.0.0", false}, - {"1", "0.0.0-0", false}, - - // wildcard patch - {"1.1", "2.0.0", false}, - {"1.1", "2.0.0-0", false}, - {"1.1", "1.1.0", true}, - {"1.1", "1.1.0-0", true}, - {"1.1", "1.0.1", false}, - {"1.1", "1.0.1-0", false}, - {"1.1", "1.0.0", false}, - {"1.1", "1.0.0-0", false}, - {"1.1", "0.0.0", false}, - {"1.1", "0.0.0-0", false}, - {"1.0", "2.0.0", false}, - {"1.0", "2.0.0-0", false}, - {"1.0", "1.1.0", false}, - {"1.0", "1.1.0-0", false}, - {"1.0", "1.0.1", true}, - {"1.0", "1.0.1-0", true}, - {"1.0", "1.0.0", true}, - {"1.0", "1.0.0-0", true}, - {"1.0", "0.0.0", false}, - {"1.0", "0.0.0-0", false}, - - // exact - {"1.1.0", "2.0.0", false}, - {"1.1.0", "2.0.0-0", false}, - {"1.1.0", "1.1.0", true}, - {"1.1.0", "1.1.0-0", false}, - {"1.1.0", "1.0.1", false}, - {"1.1.0", "1.0.1-0", false}, - {"1.1.0", "1.0.0-0", false}, - {"1.1.0", "1.0.0", false}, - {"1.1.0", "0.0.0", false}, - {"1.1.0", "0.0.0-0", false}, - {"1.1.0-0", "2.0.0", false}, - {"1.1.0-0", "2.0.0-0", false}, - {"1.1.0-0", "1.1.0", false}, - {"1.1.0-0", "1.1.0-0", true}, - {"1.1.0-0", "1.0.1", false}, - {"1.1.0-0", "1.0.1-0", false}, - {"1.1.0-0", "1.0.0-0", false}, - {"1.1.0-0", "1.0.0", false}, - {"1.1.0-0", "0.0.0", false}, - {"1.1.0-0", "0.0.0-0", false}, - {"1.0.1", "2.0.0", false}, - {"1.0.1", "2.0.0-0", false}, - {"1.0.1", "1.1.0", false}, - {"1.0.1", "1.1.0-0", false}, - {"1.0.1", "1.0.1", true}, - {"1.0.1", "1.0.1-0", false}, - {"1.0.1", "1.0.0-0", false}, - {"1.0.1", "1.0.0", false}, - {"1.0.1", "0.0.0", false}, - {"1.0.1", "0.0.0-0", false}, - {"1.0.1-0", "2.0.0", false}, - {"1.0.1-0", "2.0.0-0", false}, - {"1.0.1-0", "1.1.0", false}, - {"1.0.1-0", "1.1.0-0", false}, - {"1.0.1-0", "1.0.1", false}, - {"1.0.1-0", "1.0.1-0", true}, - {"1.0.1-0", "1.0.0-0", false}, - {"1.0.1-0", "1.0.0", false}, - {"1.0.1-0", "0.0.0", false}, - {"1.0.1-0", "0.0.0-0", false}, - {"1.0.0", "2.0.0", false}, - {"1.0.0", "2.0.0-0", false}, - {"1.0.0", "1.1.0", false}, - {"1.0.0", "1.1.0-0", false}, - {"1.0.0", "1.0.1", false}, - {"1.0.0", "1.0.1-0", false}, - {"1.0.0", "1.0.0-0", false}, - {"1.0.0", "1.0.0", true}, - {"1.0.0", "0.0.0", false}, - {"1.0.0", "0.0.0-0", false}, - {"1.0.0-0", "2.0.0", false}, - {"1.0.0-0", "2.0.0-0", false}, - {"1.0.0-0", "1.1.0", false}, - {"1.0.0-0", "1.1.0-0", false}, - {"1.0.0-0", "1.0.1", false}, - {"1.0.0-0", "1.0.1-0", false}, - {"1.0.0-0", "1.0.0", false}, - {"1.0.0-0", "1.0.0-0", true}, - - // = wildcard major (matches everything) - {"=*", "2.0.0", true}, - {"=*", "2.0.0-0", true}, - {"=*", "1.1.0", true}, - {"=*", "1.1.0-0", true}, - {"=*", "1.0.1", true}, - {"=*", "1.0.1-0", true}, - {"=*", "1.0.0", true}, - {"=*", "1.0.0-0", true}, - {"=*", "0.0.0", true}, - {"=*", "0.0.0-0", true}, - - // = wildcard minor - {"=1", "2.0.0", false}, - {"=1", "2.0.0-0", false}, - {"=1", "1.1.0", true}, - {"=1", "1.1.0-0", true}, - {"=1", "1.0.1", true}, - {"=1", "1.0.1-0", true}, - {"=1", "1.0.0", true}, - {"=1", "1.0.0-0", true}, - {"=1", "0.0.0", false}, - {"=1", "0.0.0-0", false}, - - // = wildcard patch - {"=1.1", "2.0.0", false}, - {"=1.1", "2.0.0-0", false}, - {"=1.1", "1.1.0", true}, - {"=1.1", "1.1.0-0", true}, - {"=1.1", "1.0.1", false}, - {"=1.1", "1.0.1-0", false}, - {"=1.1", "1.0.0", false}, - {"=1.1", "1.0.0-0", false}, - {"=1.1", "0.0.0", false}, - {"=1.1", "0.0.0-0", false}, - {"=1.0", "2.0.0", false}, - {"=1.0", "2.0.0-0", false}, - {"=1.0", "1.1.0", false}, - {"=1.0", "1.1.0-0", false}, - {"=1.0", "1.0.1", true}, - {"=1.0", "1.0.1-0", true}, - {"=1.0", "1.0.0", true}, - {"=1.0", "1.0.0-0", true}, - {"=1.0", "0.0.0", false}, - {"=1.0", "0.0.0-0", false}, - - // = exact - {"=1.1.0", "2.0.0", false}, - {"=1.1.0", "2.0.0-0", false}, - {"=1.1.0", "1.1.0", true}, - {"=1.1.0", "1.1.0-0", false}, - {"=1.1.0", "1.0.1", false}, - {"=1.1.0", "1.0.1-0", false}, - {"=1.1.0", "1.0.0-0", false}, - {"=1.1.0", "1.0.0", false}, - {"=1.1.0", "0.0.0", false}, - {"=1.1.0", "0.0.0-0", false}, - {"=1.1.0-0", "2.0.0", false}, - {"=1.1.0-0", "2.0.0-0", false}, - {"=1.1.0-0", "1.1.0", false}, - {"=1.1.0-0", "1.1.0-0", true}, - {"=1.1.0-0", "1.0.1", false}, - {"=1.1.0-0", "1.0.1-0", false}, - {"=1.1.0-0", "1.0.0-0", false}, - {"=1.1.0-0", "1.0.0", false}, - {"=1.1.0-0", "0.0.0", false}, - {"=1.1.0-0", "0.0.0-0", false}, - {"=1.0.1", "2.0.0", false}, - {"=1.0.1", "2.0.0-0", false}, - {"=1.0.1", "1.1.0", false}, - {"=1.0.1", "1.1.0-0", false}, - {"=1.0.1", "1.0.1", true}, - {"=1.0.1", "1.0.1-0", false}, - {"=1.0.1", "1.0.0-0", false}, - {"=1.0.1", "1.0.0", false}, - {"=1.0.1", "0.0.0", false}, - {"=1.0.1", "0.0.0-0", false}, - {"=1.0.1-0", "2.0.0", false}, - {"=1.0.1-0", "2.0.0-0", false}, - {"=1.0.1-0", "1.1.0", false}, - {"=1.0.1-0", "1.1.0-0", false}, - {"=1.0.1-0", "1.0.1", false}, - {"=1.0.1-0", "1.0.1-0", true}, - {"=1.0.1-0", "1.0.0-0", false}, - {"=1.0.1-0", "1.0.0", false}, - {"=1.0.1-0", "0.0.0", false}, - {"=1.0.1-0", "0.0.0-0", false}, - {"=1.0.0", "2.0.0", false}, - {"=1.0.0", "2.0.0-0", false}, - {"=1.0.0", "1.1.0", false}, - {"=1.0.0", "1.1.0-0", false}, - {"=1.0.0", "1.0.1", false}, - {"=1.0.0", "1.0.1-0", false}, - {"=1.0.0", "1.0.0-0", false}, - {"=1.0.0", "1.0.0", true}, - {"=1.0.0", "0.0.0", false}, - {"=1.0.0", "0.0.0-0", false}, - {"=1.0.0-0", "2.0.0", false}, - {"=1.0.0-0", "2.0.0-0", false}, - {"=1.0.0-0", "1.1.0", false}, - {"=1.0.0-0", "1.1.0-0", false}, - {"=1.0.0-0", "1.0.1", false}, - {"=1.0.0-0", "1.0.1-0", false}, - {"=1.0.0-0", "1.0.0", false}, - {"=1.0.0-0", "1.0.0-0", true}, - - // > wildcard major (matches nothing) - {">*", "2.0.0", false}, - {">*", "2.0.0-0", false}, - {">*", "1.1.0", false}, - {">*", "1.1.0-0", false}, - {">*", "1.0.1", false}, - {">*", "1.0.1-0", false}, - {">*", "1.0.0", false}, - {">*", "1.0.0-0", false}, - {">*", "0.0.0", false}, - {">*", "0.0.0-0", false}, - - // > wildcard minor - {">1", "2.0.0", true}, - {">1", "2.0.0-0", true}, - {">1", "1.1.0", false}, - {">1", "1.1.0-0", false}, - {">1", "1.0.1", false}, - {">1", "1.0.1-0", false}, - {">1", "1.0.0", false}, - {">1", "1.0.0-0", false}, - {">1", "0.0.0", false}, - {">1", "0.0.0-0", false}, - - // > wildcard patch - {">1.1", "2.0.0", true}, - {">1.1", "2.0.0-0", true}, - {">1.1", "1.1.0", false}, - {">1.1", "1.1.0-0", false}, - {">1.1", "1.0.1", false}, - {">1.1", "1.0.1-0", false}, - {">1.1", "1.0.0", false}, - {">1.1", "1.0.0-0", false}, - {">1.1", "0.0.0", false}, - {">1.1", "0.0.0-0", false}, - {">1.0", "2.0.0", true}, - {">1.0", "2.0.0-0", true}, - {">1.0", "1.1.0", true}, - {">1.0", "1.1.0-0", true}, - {">1.0", "1.0.1", false}, - {">1.0", "1.0.1-0", false}, - {">1.0", "1.0.0", false}, - {">1.0", "1.0.0-0", false}, - {">1.0", "0.0.0", false}, - {">1.0", "0.0.0-0", false}, - - // > exact - {">1.1.0", "2.0.0", true}, - {">1.1.0", "2.0.0-0", true}, - {">1.1.0", "1.1.0", false}, - {">1.1.0", "1.1.0-0", false}, - {">1.1.0", "1.0.1", false}, - {">1.1.0", "1.0.1-0", false}, - {">1.1.0", "1.0.0", false}, - {">1.1.0", "1.0.0-0", false}, - {">1.1.0", "0.0.0", false}, - {">1.1.0", "0.0.0-0", false}, - {">1.1.0-0", "2.0.0", true}, - {">1.1.0-0", "2.0.0-0", true}, - {">1.1.0-0", "1.1.0", true}, - {">1.1.0-0", "1.1.0-0", false}, - {">1.1.0-0", "1.0.1", false}, - {">1.1.0-0", "1.0.1-0", false}, - {">1.1.0-0", "1.0.0", false}, - {">1.1.0-0", "1.0.0-0", false}, - {">1.1.0-0", "0.0.0", false}, - {">1.1.0-0", "0.0.0-0", false}, - {">1.0.1", "2.0.0", true}, - {">1.0.1", "2.0.0-0", true}, - {">1.0.1", "1.1.0", true}, - {">1.0.1", "1.1.0-0", true}, - {">1.0.1", "1.0.1", false}, - {">1.0.1", "1.0.1-0", false}, - {">1.0.1", "1.0.0", false}, - {">1.0.1", "1.0.0-0", false}, - {">1.0.1", "0.0.0", false}, - {">1.0.1", "0.0.0-0", false}, - {">1.0.1-0", "2.0.0", true}, - {">1.0.1-0", "2.0.0-0", true}, - {">1.0.1-0", "1.1.0", true}, - {">1.0.1-0", "1.1.0-0", true}, - {">1.0.1-0", "1.0.1", true}, - {">1.0.1-0", "1.0.1-0", false}, - {">1.0.1-0", "1.0.0", false}, - {">1.0.1-0", "1.0.0-0", false}, - {">1.0.1-0", "0.0.0", false}, - {">1.0.1-0", "0.0.0-0", false}, - {">1.0.0", "2.0.0", true}, - {">1.0.0", "2.0.0-0", true}, - {">1.0.0", "1.1.0", true}, - {">1.0.0", "1.1.0-0", true}, - {">1.0.0", "1.0.1", true}, - {">1.0.0", "1.0.1-0", true}, - {">1.0.0", "1.0.0", false}, - {">1.0.0", "1.0.0-0", false}, - {">1.0.0", "0.0.0", false}, - {">1.0.0", "0.0.0-0", false}, - {">1.0.0-0", "2.0.0", true}, - {">1.0.0-0", "2.0.0-0", true}, - {">1.0.0-0", "1.1.0", true}, - {">1.0.0-0", "1.1.0-0", true}, - {">1.0.0-0", "1.0.1", true}, - {">1.0.0-0", "1.0.1-0", true}, - {">1.0.0-0", "1.0.0", true}, - {">1.0.0-0", "1.0.0-0", false}, - {">1.0.0-0", "0.0.0", false}, - {">1.0.0-0", "0.0.0-0", false}, - - // >= wildcard major (matches everything) - {">=*", "2.0.0", true}, - {">=*", "2.0.0-0", true}, - {">=*", "1.1.0", true}, - {">=*", "1.1.0-0", true}, - {">=*", "1.0.1", true}, - {">=*", "1.0.1-0", true}, - {">=*", "1.0.0", true}, - {">=*", "1.0.0-0", true}, - {">=*", "0.0.0", true}, - {">=*", "0.0.0-0", true}, - - // >= wildcard minor - {">=1", "2.0.0", true}, - {">=1", "2.0.0-0", true}, - {">=1", "1.1.0", true}, - {">=1", "1.1.0-0", true}, - {">=1", "1.0.1", true}, - {">=1", "1.0.1-0", true}, - {">=1", "1.0.0", true}, - {">=1", "1.0.0-0", true}, - {">=1", "0.0.0", false}, - {">=1", "0.0.0-0", false}, - - // >= wildcard patch - {">=1.1", "2.0.0", true}, - {">=1.1", "2.0.0-0", true}, - {">=1.1", "1.1.0", true}, - {">=1.1", "1.1.0-0", true}, - {">=1.1", "1.0.1", false}, - {">=1.1", "1.0.1-0", false}, - {">=1.1", "1.0.0", false}, - {">=1.1", "1.0.0-0", false}, - {">=1.1", "0.0.0", false}, - {">=1.1", "0.0.0-0", false}, - {">=1.0", "2.0.0", true}, - {">=1.0", "2.0.0-0", true}, - {">=1.0", "1.1.0", true}, - {">=1.0", "1.1.0-0", true}, - {">=1.0", "1.0.1", true}, - {">=1.0", "1.0.1-0", true}, - {">=1.0", "1.0.0", true}, - {">=1.0", "1.0.0-0", true}, - {">=1.0", "0.0.0", false}, - {">=1.0", "0.0.0-0", false}, - - // >= exact - {">=1.1.0", "2.0.0", true}, - {">=1.1.0", "2.0.0-0", true}, - {">=1.1.0", "1.1.0", true}, - {">=1.1.0", "1.1.0-0", false}, - {">=1.1.0", "1.0.1", false}, - {">=1.1.0", "1.0.1-0", false}, - {">=1.1.0", "1.0.0", false}, - {">=1.1.0", "1.0.0-0", false}, - {">=1.1.0", "0.0.0", false}, - {">=1.1.0", "0.0.0-0", false}, - {">=1.1.0-0", "2.0.0", true}, - {">=1.1.0-0", "2.0.0-0", true}, - {">=1.1.0-0", "1.1.0", true}, - {">=1.1.0-0", "1.1.0-0", true}, - {">=1.1.0-0", "1.0.1", false}, - {">=1.1.0-0", "1.0.1-0", false}, - {">=1.1.0-0", "1.0.0", false}, - {">=1.1.0-0", "1.0.0-0", false}, - {">=1.1.0-0", "0.0.0", false}, - {">=1.1.0-0", "0.0.0-0", false}, - {">=1.0.1", "2.0.0", true}, - {">=1.0.1", "2.0.0-0", true}, - {">=1.0.1", "1.1.0", true}, - {">=1.0.1", "1.1.0-0", true}, - {">=1.0.1", "1.0.1", true}, - {">=1.0.1", "1.0.1-0", false}, - {">=1.0.1", "1.0.0", false}, - {">=1.0.1", "1.0.0-0", false}, - {">=1.0.1", "0.0.0", false}, - {">=1.0.1", "0.0.0-0", false}, - {">=1.0.1-0", "2.0.0", true}, - {">=1.0.1-0", "2.0.0-0", true}, - {">=1.0.1-0", "1.1.0", true}, - {">=1.0.1-0", "1.1.0-0", true}, - {">=1.0.1-0", "1.0.1", true}, - {">=1.0.1-0", "1.0.1-0", true}, - {">=1.0.1-0", "1.0.0", false}, - {">=1.0.1-0", "1.0.0-0", false}, - {">=1.0.1-0", "0.0.0", false}, - {">=1.0.1-0", "0.0.0-0", false}, - {">=1.0.0", "2.0.0", true}, - {">=1.0.0", "2.0.0-0", true}, - {">=1.0.0", "1.1.0", true}, - {">=1.0.0", "1.1.0-0", true}, - {">=1.0.0", "1.0.1", true}, - {">=1.0.0", "1.0.1-0", true}, - {">=1.0.0", "1.0.0", true}, - {">=1.0.0", "1.0.0-0", false}, - {">=1.0.0", "0.0.0", false}, - {">=1.0.0", "0.0.0-0", false}, - {">=1.0.0-0", "2.0.0", true}, - {">=1.0.0-0", "2.0.0-0", true}, - {">=1.0.0-0", "1.1.0", true}, - {">=1.0.0-0", "1.1.0-0", true}, - {">=1.0.0-0", "1.0.1", true}, - {">=1.0.0-0", "1.0.1-0", true}, - {">=1.0.0-0", "1.0.0", true}, - {">=1.0.0-0", "1.0.0-0", true}, - {">=1.0.0-0", "0.0.0", false}, - {">=1.0.0-0", "0.0.0-0", false}, - - // < wildcard major (matches nothing) - {"<*", "2.0.0", false}, - {"<*", "2.0.0-0", false}, - {"<*", "1.1.0", false}, - {"<*", "1.1.0-0", false}, - {"<*", "1.0.1", false}, - {"<*", "1.0.1-0", false}, - {"<*", "1.0.0", false}, - {"<*", "1.0.0-0", false}, - {"<*", "0.0.0", false}, - {"<*", "0.0.0-0", false}, - - // < wildcard minor - {"<1", "2.0.0", false}, - {"<1", "2.0.0-0", false}, - {"<1", "1.1.0", false}, - {"<1", "1.1.0-0", false}, - {"<1", "1.0.1", false}, - {"<1", "1.0.1-0", false}, - {"<1", "1.0.0", false}, - {"<1", "1.0.0-0", false}, - {"<1", "0.0.0", true}, - {"<1", "0.0.0-0", true}, - - // < wildcard patch - {"<1.1", "2.0.0", false}, - {"<1.1", "2.0.0-0", false}, - {"<1.1", "1.1.0", false}, - {"<1.1", "1.1.0-0", false}, - {"<1.1", "1.0.1", true}, - {"<1.1", "1.0.1-0", true}, - {"<1.1", "1.0.0", true}, - {"<1.1", "1.0.0-0", true}, - {"<1.1", "0.0.0", true}, - {"<1.1", "0.0.0-0", true}, - {"<1.0", "2.0.0", false}, - {"<1.0", "2.0.0-0", false}, - {"<1.0", "1.1.0", false}, - {"<1.0", "1.1.0-0", false}, - {"<1.0", "1.0.1", false}, - {"<1.0", "1.0.1-0", false}, - {"<1.0", "1.0.0", false}, - {"<1.0", "1.0.0-0", false}, - {"<1.0", "0.0.0", true}, - {"<1.0", "0.0.0-0", true}, - - // < exact - {"<1.1.0", "2.0.0", false}, - {"<1.1.0", "2.0.0-0", false}, - {"<1.1.0", "1.1.0", false}, - {"<1.1.0", "1.1.0-0", true}, - {"<1.1.0", "1.0.1", true}, - {"<1.1.0", "1.0.1-0", true}, - {"<1.1.0", "1.0.0", true}, - {"<1.1.0", "1.0.0-0", true}, - {"<1.1.0", "0.0.0", true}, - {"<1.1.0", "0.0.0-0", true}, - {"<1.1.0-0", "2.0.0", false}, - {"<1.1.0-0", "2.0.0-0", false}, - {"<1.1.0-0", "1.1.0", false}, - {"<1.1.0-0", "1.1.0-0", false}, - {"<1.1.0-0", "1.0.1", true}, - {"<1.1.0-0", "1.0.1-0", true}, - {"<1.1.0-0", "1.0.0", true}, - {"<1.1.0-0", "1.0.0-0", true}, - {"<1.1.0-0", "0.0.0", true}, - {"<1.1.0-0", "0.0.0-0", true}, - {"<1.0.1", "2.0.0", false}, - {"<1.0.1", "2.0.0-0", false}, - {"<1.0.1", "1.1.0", false}, - {"<1.0.1", "1.1.0-0", false}, - {"<1.0.1", "1.0.1", false}, - {"<1.0.1", "1.0.1-0", true}, - {"<1.0.1", "1.0.0", true}, - {"<1.0.1", "1.0.0-0", true}, - {"<1.0.1", "0.0.0", true}, - {"<1.0.1", "0.0.0-0", true}, - {"<1.0.1-0", "2.0.0", false}, - {"<1.0.1-0", "2.0.0-0", false}, - {"<1.0.1-0", "1.1.0", false}, - {"<1.0.1-0", "1.1.0-0", false}, - {"<1.0.1-0", "1.0.1", false}, - {"<1.0.1-0", "1.0.1-0", false}, - {"<1.0.1-0", "1.0.0", true}, - {"<1.0.1-0", "1.0.0-0", true}, - {"<1.0.1-0", "0.0.0", true}, - {"<1.0.1-0", "0.0.0-0", true}, - {"<1.0.0", "2.0.0", false}, - {"<1.0.0", "2.0.0-0", false}, - {"<1.0.0", "1.1.0", false}, - {"<1.0.0", "1.1.0-0", false}, - {"<1.0.0", "1.0.1", false}, - {"<1.0.0", "1.0.1-0", false}, - {"<1.0.0", "1.0.0", false}, - {"<1.0.0", "1.0.0-0", true}, - {"<1.0.0", "0.0.0", true}, - {"<1.0.0", "0.0.0-0", true}, - {"<1.0.0-0", "2.0.0", false}, - {"<1.0.0-0", "2.0.0-0", false}, - {"<1.0.0-0", "1.1.0", false}, - {"<1.0.0-0", "1.1.0-0", false}, - {"<1.0.0-0", "1.0.1", false}, - {"<1.0.0-0", "1.0.1-0", false}, - {"<1.0.0-0", "1.0.0", false}, - {"<1.0.0-0", "1.0.0-0", false}, - {"<1.0.0-0", "0.0.0", true}, - {"<1.0.0-0", "0.0.0-0", true}, - - // <= wildcard major (matches everything) - {"<=*", "2.0.0", true}, - {"<=*", "2.0.0-0", true}, - {"<=*", "1.1.0", true}, - {"<=*", "1.1.0-0", true}, - {"<=*", "1.0.1", true}, - {"<=*", "1.0.1-0", true}, - {"<=*", "1.0.0", true}, - {"<=*", "1.0.0-0", true}, - {"<=*", "0.0.0", true}, - {"<=*", "0.0.0-0", true}, - - // <= wildcard minor - {"<=1", "2.0.0", false}, - {"<=1", "2.0.0-0", false}, - {"<=1", "1.1.0", true}, - {"<=1", "1.1.0-0", true}, - {"<=1", "1.0.1", true}, - {"<=1", "1.0.1-0", true}, - {"<=1", "1.0.0", true}, - {"<=1", "1.0.0-0", true}, - {"<=1", "0.0.0", true}, - {"<=1", "0.0.0-0", true}, - - // <= wildcard patch - {"<=1.1", "2.0.0", false}, - {"<=1.1", "2.0.0-0", false}, - {"<=1.1", "1.1.0", true}, - {"<=1.1", "1.1.0-0", true}, - {"<=1.1", "1.0.1", true}, - {"<=1.1", "1.0.1-0", true}, - {"<=1.1", "1.0.0", true}, - {"<=1.1", "1.0.0-0", true}, - {"<=1.1", "0.0.0", true}, - {"<=1.1", "0.0.0-0", true}, - {"<=1.0", "2.0.0", false}, - {"<=1.0", "2.0.0-0", false}, - {"<=1.0", "1.1.0", false}, - {"<=1.0", "1.1.0-0", false}, - {"<=1.0", "1.0.1", true}, - {"<=1.0", "1.0.1-0", true}, - {"<=1.0", "1.0.0", true}, - {"<=1.0", "1.0.0-0", true}, - {"<=1.0", "0.0.0", true}, - {"<=1.0", "0.0.0-0", true}, - - // <= exact - {"<=1.1.0", "2.0.0", false}, - {"<=1.1.0", "2.0.0-0", false}, - {"<=1.1.0", "1.1.0", true}, - {"<=1.1.0", "1.1.0-0", true}, - {"<=1.1.0", "1.0.1", true}, - {"<=1.1.0", "1.0.1-0", true}, - {"<=1.1.0", "1.0.0", true}, - {"<=1.1.0", "1.0.0-0", true}, - {"<=1.1.0", "0.0.0", true}, - {"<=1.1.0", "0.0.0-0", true}, - {"<=1.1.0-0", "2.0.0", false}, - {"<=1.1.0-0", "2.0.0-0", false}, - {"<=1.1.0-0", "1.1.0", false}, - {"<=1.1.0-0", "1.1.0-0", true}, - {"<=1.1.0-0", "1.0.1", true}, - {"<=1.1.0-0", "1.0.1-0", true}, - {"<=1.1.0-0", "1.0.0", true}, - {"<=1.1.0-0", "1.0.0-0", true}, - {"<=1.1.0-0", "0.0.0", true}, - {"<=1.1.0-0", "0.0.0-0", true}, - {"<=1.0.1", "2.0.0", false}, - {"<=1.0.1", "2.0.0-0", false}, - {"<=1.0.1", "1.1.0", false}, - {"<=1.0.1", "1.1.0-0", false}, - {"<=1.0.1", "1.0.1", true}, - {"<=1.0.1", "1.0.1-0", true}, - {"<=1.0.1", "1.0.0", true}, - {"<=1.0.1", "1.0.0-0", true}, - {"<=1.0.1", "0.0.0", true}, - {"<=1.0.1", "0.0.0-0", true}, - {"<=1.0.1-0", "2.0.0", false}, - {"<=1.0.1-0", "2.0.0-0", false}, - {"<=1.0.1-0", "1.1.0", false}, - {"<=1.0.1-0", "1.1.0-0", false}, - {"<=1.0.1-0", "1.0.1", false}, - {"<=1.0.1-0", "1.0.1-0", true}, - {"<=1.0.1-0", "1.0.0", true}, - {"<=1.0.1-0", "1.0.0-0", true}, - {"<=1.0.1-0", "0.0.0", true}, - {"<=1.0.1-0", "0.0.0-0", true}, - {"<=1.0.0", "2.0.0", false}, - {"<=1.0.0", "2.0.0-0", false}, - {"<=1.0.0", "1.1.0", false}, - {"<=1.0.0", "1.1.0-0", false}, - {"<=1.0.0", "1.0.1", false}, - {"<=1.0.0", "1.0.1-0", false}, - {"<=1.0.0", "1.0.0", true}, - {"<=1.0.0", "1.0.0-0", true}, - {"<=1.0.0", "0.0.0", true}, - {"<=1.0.0", "0.0.0-0", true}, - {"<=1.0.0-0", "2.0.0", false}, - {"<=1.0.0-0", "2.0.0-0", false}, - {"<=1.0.0-0", "1.1.0", false}, - {"<=1.0.0-0", "1.1.0-0", false}, - {"<=1.0.0-0", "1.0.1", false}, - {"<=1.0.0-0", "1.0.1-0", false}, - {"<=1.0.0-0", "1.0.0", false}, - {"<=1.0.0-0", "1.0.0-0", true}, - {"<=1.0.0-0", "0.0.0", true}, - {"<=1.0.0-0", "0.0.0-0", true}, - - // https://github.com/microsoft/TypeScript/issues/50909 - {">4.8", "4.9.0-beta", true}, - {">=4.9", "4.9.0-beta", true}, - {"<4.9", "4.9.0-beta", false}, - {"<=4.8", "4.9.0-beta", false}, - } - for _, test := range comparatorsTests { - assertRangeTest(t, "comparators", test.rangeText, test.versionText, test.expected) - } -} - -func TestConjunctionsOfVersionRanges(t *testing.T) { - t.Parallel() - conjunctionTests := []testForRangeOnVersion{ - {">1.0.0 <2.0.0", "1.0.1", true}, - {">1.0.0 <2.0.0", "2.0.0", false}, - {">1.0.0 <2.0.0", "1.0.0", false}, - {">1 >2", "3.0.0", true}, - } - for _, test := range conjunctionTests { - assertRangeTest(t, "conjunctions", test.rangeText, test.versionText, test.expected) - } -} - -func TestDisjunctionsOfVersionRanges(t *testing.T) { - t.Parallel() - disjunctionTests := []testForRangeOnVersion{ - {">1.0.0 || <1.0.0", "1.0.1", true}, - {">1.0.0 || <1.0.0", "0.0.1", true}, - {">1.0.0 || <1.0.0", "1.0.0", false}, - {">1.0.0 || <1.0.0", "0.0.0", true}, - {">=1.0.0 <2.0.0 || >=3.0.0 <4.0.0", "1.0.0", true}, - {">=1.0.0 <2.0.0 || >=3.0.0 <4.0.0", "2.0.0", false}, - {">=1.0.0 <2.0.0 || >=3.0.0 <4.0.0", "3.0.0", true}, - } - for _, test := range disjunctionTests { - assertRangeTest(t, "disjunctions", test.rangeText, test.versionText, test.expected) - } -} - -func TestHyphensOfVersionRanges(t *testing.T) { - t.Parallel() - hyphenTests := []testForRangeOnVersion{ - {"1.0.0 - 2.0.0", "1.0.0", true}, - {"1.0.0 - 2.0.0", "1.0.1", true}, - {"1.0.0 - 2.0.0", "2.0.0", true}, - {"1.0.0 - 2.0.0", "2.0.1", false}, - {"1.0.0 - 2.0.0", "0.9.9", false}, - {"1.0.0 - 2.0.0", "3.0.0", false}, - } - for _, test := range hyphenTests { - assertRangeTest(t, "hyphens", test.rangeText, test.versionText, test.expected) - } -} - -func TestTildesOfVersionRanges(t *testing.T) { - t.Parallel() - tildeTests := []testForRangeOnVersion{ - {"~0", "0.0.0", true}, - {"~0", "0.1.0", true}, - {"~0", "0.1.2", true}, - {"~0", "0.1.9", true}, - {"~0", "1.0.0", false}, - {"~0.1", "0.1.0", true}, - {"~0.1", "0.1.2", true}, - {"~0.1", "0.1.9", true}, - {"~0.1", "0.2.0", false}, - {"~0.1.2", "0.1.2", true}, - {"~0.1.2", "0.1.9", true}, - {"~0.1.2", "0.2.0", false}, - {"~1.0.0", "1.0.0", true}, - {"~1.0.0", "1.0.1", true}, - {"~1", "1.0.0", true}, - {"~1", "1.2.0", true}, - {"~1", "1.2.3", true}, - {"~1", "0.0.0", false}, - {"~1", "2.0.0", false}, - {"~1.2", "1.2.0", true}, - {"~1.2", "1.2.3", true}, - {"~1.2", "1.1.0", false}, - {"~1.2", "1.3.0", false}, - {"~1.2.3", "1.2.3", true}, - {"~1.2.3", "1.2.9", true}, - {"~1.2.3", "1.1.0", false}, - {"~1.2.3", "1.3.0", false}, - } - for _, test := range tildeTests { - assertRangeTest(t, "tilde", test.rangeText, test.versionText, test.expected) - } -} - -func TestCaretsOfVersionRanges(t *testing.T) { - t.Parallel() - caretTests := []testForRangeOnVersion{ - {"^0", "0.0.0", true}, - {"^0", "0.1.0", true}, - {"^0", "0.9.0", true}, - {"^0", "0.1.2", true}, - {"^0", "0.1.9", true}, - {"^0", "1.0.0", false}, - {"^0.1", "0.1.0", true}, - {"^0.1", "0.1.2", true}, - {"^0.1", "0.1.9", true}, - {"^0.1.2", "0.1.2", true}, - {"^0.1.2", "0.1.9", true}, - {"^0.1.2", "0.0.0", false}, - {"^0.1.2", "0.2.0", false}, - {"^0.1.2", "1.0.0", false}, - {"^1", "1.0.0", true}, - {"^1", "1.2.0", true}, - {"^1", "1.2.3", true}, - {"^1", "1.9.0", true}, - {"^1", "0.0.0", false}, - {"^1", "2.0.0", false}, - {"^1.2", "1.2.0", true}, - {"^1.2", "1.2.3", true}, - {"^1.2", "1.9.0", true}, - {"^1.2", "1.1.0", false}, - {"^1.2", "2.0.0", false}, - {"^1.2.3", "1.2.3", true}, - {"^1.2.3", "1.9.0", true}, - {"^1.2.3", "1.2.2", false}, - {"^1.2.3", "2.0.0", false}, - } - for _, test := range caretTests { - assertRangeTest(t, "caret", test.rangeText, test.versionText, test.expected) - } -} - -type testForRangeOnVersion struct { - rangeText string - versionText string - expected bool -} - -func assertRangesGoodBad(t *testing.T, versionRangeString string, tests testGoodBad) { - t.Run(versionRangeString, func(t *testing.T) { - t.Parallel() - versionRange, ok := TryParseVersionRange(versionRangeString) - assert.Assert(t, ok) - for _, good := range tests.good { - v, ok := TryParseVersion(good) - assert.Assert(t, ok) - assert.Assert(t, versionRange.Test(&v), "%s should be matched by range %s", good, versionRangeString) - } - - for _, bad := range tests.bad { - v, ok := TryParseVersion(bad) - assert.Assert(t, ok) - assert.Assert(t, !versionRange.Test(&v), "%s should not be matched by range %s", bad, versionRangeString) - } - }) -} - -func assertRangeTest(t *testing.T, name string, rangeText string, versionText string, inRange bool) { - testName := fmt.Sprintf("%s (version %s in range %s) == %t", name, versionText, rangeText, inRange) - t.Run(testName, func(t *testing.T) { - t.Parallel() - versionRange, ok := TryParseVersionRange(rangeText) - assert.Assert(t, ok) - version, err := TryParseVersion(versionText) - assert.NilError(t, err) - assert.Equal(t, versionRange.Test(&version), inRange) - }) -} diff --git a/kitcom/internal/tsgo/semver/version_test.go b/kitcom/internal/tsgo/semver/version_test.go deleted file mode 100644 index d24e5c3..0000000 --- a/kitcom/internal/tsgo/semver/version_test.go +++ /dev/null @@ -1,147 +0,0 @@ -package semver - -import ( - "testing" - - "gotest.tools/v3/assert" -) - -func TestTryParseSemver(t *testing.T) { - t.Parallel() - tests := []struct { - in string - out Version - }{ - {"1.2.3-pre.4+build.5", Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}, build: []string{"build", "5"}}}, - {"1.2.3-pre.4", Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}}}, - {"1.2.3+build.4", Version{major: 1, minor: 2, patch: 3, build: []string{"build", "4"}}}, - {"1.2.3", Version{major: 1, minor: 2, patch: 3}}, - } - - for _, test := range tests { - t.Run(test.in, func(t *testing.T) { - t.Parallel() - v, err := TryParseVersion(test.in) - assert.NilError(t, err) - assertVersion(t, v, test.out) - }) - } -} - -func TestVersionString(t *testing.T) { - t.Parallel() - tests := []struct { - in Version - out string - }{ - {Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}, build: []string{"build", "5"}}, "1.2.3-pre.4+build.5"}, - {Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}, build: []string{"build"}}, "1.2.3-pre.4+build"}, - {Version{major: 1, minor: 2, patch: 3, build: []string{"build"}}, "1.2.3+build"}, - {Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}}, "1.2.3-pre.4"}, - {Version{major: 1, minor: 2, patch: 3, build: []string{"build", "4"}}, "1.2.3+build.4"}, - {Version{major: 1, minor: 2, patch: 3}, "1.2.3"}, - } - - for _, test := range tests { - t.Run(test.out, func(t *testing.T) { - t.Parallel() - assert.Equal(t, test.in.String(), test.out) - }) - } -} - -func TestVersionCompare(t *testing.T) { - t.Parallel() - tests := []struct { - v1, v2 string - want int - }{ - // https://semver.org/#spec-item-11 - // > Precedence is determined by the first difference when comparing each of these - // > identifiers from left to right as follows: Major, minor, and patch versions are - // > always compared numerically. - {"1.0.0", "2.0.0", comparisonLessThan}, - {"1.0.0", "1.1.0", comparisonLessThan}, - {"1.0.0", "1.0.1", comparisonLessThan}, - {"2.0.0", "1.0.0", comparisonGreaterThan}, - {"1.1.0", "1.0.0", comparisonGreaterThan}, - {"1.0.1", "1.0.0", comparisonGreaterThan}, - {"1.0.0", "1.0.0", comparisonEqualTo}, - - // https://semver.org/#spec-item-11 - // > When major, minor, and patch are equal, a pre-release version has lower - // > precedence than a normal version. - {"1.0.0", "1.0.0-pre", comparisonGreaterThan}, - {"1.0.1-pre", "1.0.0", comparisonGreaterThan}, - {"1.0.0-pre", "1.0.0", comparisonLessThan}, - - // https://semver.org/#spec-item-11 - // > identifiers consisting of only digits are compared numerically - {"1.0.0-0", "1.0.0-1", comparisonLessThan}, - {"1.0.0-1", "1.0.0-0", comparisonGreaterThan}, - {"1.0.0-2", "1.0.0-10", comparisonLessThan}, - {"1.0.0-10", "1.0.0-2", comparisonGreaterThan}, - {"1.0.0-0", "1.0.0-0", comparisonEqualTo}, - - // https://semver.org/#spec-item-11 - // > identifiers with letters or hyphens are compared lexically in ASCII sort order. - {"1.0.0-a", "1.0.0-b", comparisonLessThan}, - {"1.0.0-a-2", "1.0.0-a-10", comparisonGreaterThan}, - {"1.0.0-b", "1.0.0-a", comparisonGreaterThan}, - {"1.0.0-a", "1.0.0-a", comparisonEqualTo}, - {"1.0.0-A", "1.0.0-a", comparisonLessThan}, - - // https://semver.org/#spec-item-11 - // > Numeric identifiers always have lower precedence than non-numeric identifiers. - {"1.0.0-0", "1.0.0-alpha", comparisonLessThan}, - {"1.0.0-alpha", "1.0.0-0", comparisonGreaterThan}, - {"1.0.0-0", "1.0.0-0", comparisonEqualTo}, - {"1.0.0-alpha", "1.0.0-alpha", comparisonEqualTo}, - - // https://semver.org/#spec-item-11 - // > A larger set of pre-release fields has a higher precedence than a smaller set, if all - // > of the preceding identifiers are equal. - {"1.0.0-alpha", "1.0.0-alpha.0", comparisonLessThan}, - {"1.0.0-alpha.0", "1.0.0-alpha", comparisonGreaterThan}, - - // https://semver.org/#spec-item-11 - // > Precedence for two pre-release versions with the same major, minor, and patch version - // > MUST be determined by comparing each dot separated identifier from left to right until - // > a difference is found [...] - {"1.0.0-a.0.b.1", "1.0.0-a.0.b.2", comparisonLessThan}, - {"1.0.0-a.0.b.1", "1.0.0-b.0.a.1", comparisonLessThan}, - {"1.0.0-a.0.b.2", "1.0.0-a.0.b.1", comparisonGreaterThan}, - {"1.0.0-b.0.a.1", "1.0.0-a.0.b.1", comparisonGreaterThan}, - - // https://semver.org/#spec-item-11 - // > Build metadata does not figure into precedence - {"1.0.0+build", "1.0.0", comparisonEqualTo}, - {"1.0.0+build.stuff", "1.0.0", comparisonEqualTo}, - {"1.0.0", "1.0.0+build", comparisonEqualTo}, - {"1.0.0+build", "1.0.0+stuff", comparisonEqualTo}, - - // https://semver.org/#spec-item-11 - // Edge cases for numeric and lexical comparison of prerelease identifiers. - {"1.0.0-alpha.99999", "1.0.0-alpha.100000", comparisonLessThan}, - {"1.0.0-alpha.beta", "1.0.0-alpha.alpha", comparisonGreaterThan}, - } - - for _, test := range tests { - t.Run(test.v1+" <=> "+test.v2, func(t *testing.T) { - t.Parallel() - v1, err1 := TryParseVersion(test.v1) - assert.NilError(t, err1, test.v1) - v2, err2 := TryParseVersion(test.v2) - assert.NilError(t, err2, test.v2) - assert.Equal(t, v1.Compare(&v2), test.want) - }) - } -} - -func assertVersion(t *testing.T, a, b Version) { - assert.Equal(t, a.major, b.major) - assert.Equal(t, a.minor, b.minor) - assert.Equal(t, a.patch, b.patch) - assert.DeepEqual(t, a.prerelease, b.prerelease) - assert.DeepEqual(t, a.build, b.build) -}