Skip to content

Commit

Permalink
feat: add support of range syntax for node (browserslist#454)
Browse files Browse the repository at this point in the history
* test: add tests of range syntax for node

* feat: add support of range syntax for node

* docs: add copyright information

* test: improve test coverage of error handling for node
  • Loading branch information
zypA13510 authored Feb 26, 2020
1 parent 52e6f74 commit fdbecd7
Show file tree
Hide file tree
Showing 3 changed files with 209 additions and 1 deletion.
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License (MIT)

Copyright 2014 Andrey Sitnik <[email protected]>
Copyright 2014 Andrey Sitnik <[email protected]> and other contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
Expand Down
62 changes: 62 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,43 @@ function compareSemver (a, b) {
)
}

// this follows the npm-like semver behavior
function semverFilterLoose (operator, range) {
range = range.split('.').map(parseSimpleInt)
if (typeof range[1] === 'undefined') {
range[1] = 'x'
}
// ignore any patch version because we only return minor versions
// range[2] = 'x'
switch (operator) {
case '<=':
return function (version) {
version = version.split('.').map(parseSimpleInt)
return compareSemverLoose(version, range) <= 0
}
default:
case '>=':
return function (version) {
version = version.split('.').map(parseSimpleInt)
return compareSemverLoose(version, range) >= 0
}
}
}

// this follows the npm-like semver behavior
function compareSemverLoose (version, range) {
if (version[0] !== range[0]) {
return version[0] < range[0] ? -1 : +1
}
if (range[1] === 'x') {
return 0
}
if (version[1] !== range[1]) {
return version[1] < range[1] ? -1 : +1
}
return 0
}

function resolveVersion (data, version) {
if (data.versions.indexOf(version) !== -1) {
return version
Expand Down Expand Up @@ -870,6 +907,31 @@ var QUERIES = [
})
}
},
{
regexp: /^node\s+([\d.]+)\s*-\s*([\d.]+)$/i,
select: function (context, from, to) {
var nodeVersions = jsReleases.filter(function (i) {
return i.name === 'nodejs'
}).map(function (i) {
return i.version
})
var semverRegExp = /^(0|[1-9]\d*)(\.(0|[1-9]\d*)){0,2}$/
if (!semverRegExp.test(from)) {
throw new BrowserslistError(
'Unknown version ' + from + ' of Node.js')
}
if (!semverRegExp.test(to)) {
throw new BrowserslistError(
'Unknown version ' + to + ' of Node.js')
}
return nodeVersions
.filter(semverFilterLoose('>=', from))
.filter(semverFilterLoose('<=', to))
.map(function (v) {
return 'node ' + v
})
}
},
{
regexp: /^(\w+)\s+([\d.]+)\s*-\s*([\d.]+)$/i,
select: function (context, name, from, to) {
Expand Down
146 changes: 146 additions & 0 deletions test/node.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,27 @@ it('throws on unknown Node.js version', () => {
}).toThrow(/Unknown version/)
})

it('throws on malformed Node.js version', () => {
expect(() => {
browserslist('node 8.a')
}).toThrow(/Unknown/)
expect(() => {
browserslist('node 8.8.8.8')
}).toThrow(/Unknown/)
expect(() => {
browserslist('node 8.01')
}).toThrow(/Unknown/)
expect(() => {
browserslist('node 6 - 8.a')
}).toThrow(/Unknown/)
expect(() => {
browserslist('node 6.6.6.6 - 8')
}).toThrow(/Unknown/)
expect(() => {
browserslist('node 6 - 8.01')
}).toThrow(/Unknown/)
})

it('return empty array on unknown Node.js version with special flag', () => {
expect(browserslist('node 3', { ignoreUnknownVersions: true })).toEqual([])
})
Expand Down Expand Up @@ -182,3 +203,128 @@ it('supports comparison operator', () => {
'node 11.10.0'
]))
})

it('supports range selection', () => {
expect(browserslist('node 4-6')).toEqual([
'node 6.17.0',
'node 6.16.0',
'node 6.15.0',
'node 6.14.0',
'node 6.13.0',
'node 6.12.0',
'node 6.11.0',
'node 6.10.0',
'node 6.9.0',
'node 6.8.0',
'node 6.7.0',
'node 6.6.0',
'node 6.5.0',
'node 6.4.0',
'node 6.3.0',
'node 6.2.0',
'node 6.1.0',
'node 6.0.0',

'node 5.12.0',
'node 5.11.0',
'node 5.10.0',
'node 5.9.0',
'node 5.8.0',
'node 5.7.0',
'node 5.6.0',
'node 5.5.0',
'node 5.4.0',
'node 5.3.0',
'node 5.2.0',
'node 5.1.0',
'node 5.0.0',

'node 4.9.0',
'node 4.8.0',
'node 4.7.0',
'node 4.6.0',
'node 4.5.0',
'node 4.4.0',
'node 4.3.0',
'node 4.2.0',
'node 4.1.0',
'node 4.0.0'
])

expect(browserslist('node 4-6.0.0')).toEqual([
'node 6.0.0',

'node 5.12.0',
'node 5.11.0',
'node 5.10.0',
'node 5.9.0',
'node 5.8.0',
'node 5.7.0',
'node 5.6.0',
'node 5.5.0',
'node 5.4.0',
'node 5.3.0',
'node 5.2.0',
'node 5.1.0',
'node 5.0.0',

'node 4.9.0',
'node 4.8.0',
'node 4.7.0',
'node 4.6.0',
'node 4.5.0',
'node 4.4.0',
'node 4.3.0',
'node 4.2.0',
'node 4.1.0',
'node 4.0.0'
])

expect(browserslist('node 6.5-7.5')).toEqual([
'node 7.5.0',
'node 7.4.0',
'node 7.3.0',
'node 7.2.0',
'node 7.1.0',
'node 7.0.0',

'node 6.17.0',
'node 6.16.0',
'node 6.15.0',
'node 6.14.0',
'node 6.13.0',
'node 6.12.0',
'node 6.11.0',
'node 6.10.0',
'node 6.9.0',
'node 6.8.0',
'node 6.7.0',
'node 6.6.0',
'node 6.5.0'
])

expect(browserslist('node 6.6.4-7.7.5')).toEqual([
'node 7.7.0',
'node 7.6.0',
'node 7.5.0',
'node 7.4.0',
'node 7.3.0',
'node 7.2.0',
'node 7.1.0',
'node 7.0.0',

'node 6.17.0',
'node 6.16.0',
'node 6.15.0',
'node 6.14.0',
'node 6.13.0',
'node 6.12.0',
'node 6.11.0',
'node 6.10.0',
'node 6.9.0',
'node 6.8.0',
'node 6.7.0',
// include 6.6.0 as patch versions are ignored
'node 6.6.0'
])
})

0 comments on commit fdbecd7

Please sign in to comment.