diff --git a/parser.go b/parser.go index 57cbfac..c24cae6 100644 --- a/parser.go +++ b/parser.go @@ -441,10 +441,16 @@ func (p *Parser) parseTildeRange(version string) (*Range, error) { }), nil } + segments := strings.Count(version, ".") + 1 + var upper string - if v.Minor > 0 || v.Patch > 0 { + if segments >= 2 { + // ~1.2.3 := >=1.2.3 <1.3.0 + // ~1.0.0 := >=1.0.0 <1.1.0 + // ~1.0 := >=1.0.0 <1.1.0 upper = fmt.Sprintf("%d.%d.0", v.Major, v.Minor+1) } else { + // ~1 := >=1.0.0 <2.0.0 upper = fmt.Sprintf("%d.0.0", v.Major+1) } diff --git a/parser_test.go b/parser_test.go index 39869fb..8a566f2 100644 --- a/parser_test.go +++ b/parser_test.go @@ -75,6 +75,12 @@ func TestParseNpmRange(t *testing.T) { {"~1.2.3 excludes minor", "~1.2.3", "1.3.0", false}, {"~1.2.0 includes patch", "~1.2.0", "1.2.9", true}, {"~1.2.0 excludes minor", "~1.2.0", "1.3.0", false}, + {"~1.0.0 includes patch", "~1.0.0", "1.0.9", true}, + {"~1.0.0 excludes minor", "~1.0.0", "1.1.0", false}, + {"~1.0 includes patch", "~1.0", "1.0.9", true}, + {"~1.0 excludes minor", "~1.0", "1.1.0", false}, + {"~1 includes minor", "~1", "1.9.0", true}, + {"~1 excludes major", "~1", "2.0.0", false}, // X-ranges {"1.x includes 1.0.0", "1.x", "1.0.0", true},