browserslist 2.2.1 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +22 -0
- package/index.js +85 -69
- package/package.json +14 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
3
3
|
|
|
4
|
+
## 2.3.2
|
|
5
|
+
* Fix `> 0` query for browsers with one version (by Nikolay Solovyov).
|
|
6
|
+
|
|
7
|
+
## 2.3.1
|
|
8
|
+
* Reduce library size.
|
|
9
|
+
|
|
10
|
+
## 2.3
|
|
11
|
+
* Add `unreleased versions` and `unreleased Chrome versions` queries.
|
|
12
|
+
|
|
13
|
+
## 2.2.2
|
|
14
|
+
* Fix `Path must be a string` error (by Pieter Beulque).
|
|
15
|
+
|
|
4
16
|
## 2.2.1
|
|
5
17
|
* Fix security issue with regions dynamic `require`.
|
|
6
18
|
|
package/README.md
CHANGED
|
@@ -91,6 +91,8 @@ You can specify the versions by queries (case insensitive):
|
|
|
91
91
|
* `Firefox <= 20`: versions of Firefox less than or equal to 20.
|
|
92
92
|
* `Firefox ESR`: the latest [Firefox ESR] version.
|
|
93
93
|
* `iOS 7`: the iOS browser version 7 directly.
|
|
94
|
+
* `unreleased versions`: alpha and beta versions of each browser.
|
|
95
|
+
* `unreleased Chrome versions`: alpha and beta versions of Chrome browser.
|
|
94
96
|
* `not ie <= 8`: exclude browsers selected before by previous queries.
|
|
95
97
|
You can add `not ` to any query.
|
|
96
98
|
|
|
@@ -291,6 +293,26 @@ For example, the query `> 1% in my stats, > 5% in US, 10%` is permitted.
|
|
|
291
293
|
|
|
292
294
|
[Can I Use]: http://caniuse.com/
|
|
293
295
|
|
|
296
|
+
## Webpack
|
|
297
|
+
|
|
298
|
+
If you plan to use Browserslist on client-side (e. g., tools like CodePen)
|
|
299
|
+
Browserslist could take big part of your bundle — about 150 KB.
|
|
300
|
+
|
|
301
|
+
But the biggest part of this size will be region usage statistics, which could
|
|
302
|
+
be useless for you. You can use `IgnorePlugin` in webpack to cut it:
|
|
303
|
+
|
|
304
|
+
```js
|
|
305
|
+
const webpackConfig = {
|
|
306
|
+
…
|
|
307
|
+
plugins: [
|
|
308
|
+
new webpack.IgnorePlugin(/caniuse-lite\/data\/regions/)
|
|
309
|
+
]
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
This plugin will reduce Browserslist size from 150 KB to 6 KB. But you loose
|
|
314
|
+
`> 1% in US` queries support.
|
|
315
|
+
|
|
294
316
|
## JS API
|
|
295
317
|
|
|
296
318
|
```js
|
package/index.js
CHANGED
|
@@ -2,8 +2,8 @@ var path = require('path')
|
|
|
2
2
|
var e2c = require('electron-to-chromium/versions')
|
|
3
3
|
var fs = require('fs')
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
var region = require('caniuse-lite').
|
|
5
|
+
var agents = require('caniuse-lite/dist/unpacker/agents').agents
|
|
6
|
+
var region = require('caniuse-lite/dist/unpacker/region').default
|
|
7
7
|
|
|
8
8
|
function normalize (versions) {
|
|
9
9
|
return versions.filter(function (version) {
|
|
@@ -11,6 +11,8 @@ function normalize (versions) {
|
|
|
11
11
|
})
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
var env = process.env
|
|
15
|
+
|
|
14
16
|
// eslint-disable-next-line security/detect-unsafe-regex
|
|
15
17
|
var FLOAT_RANGE = /^\d+(\.\d+)?(-\d+(\.\d+)?)*$/
|
|
16
18
|
var IS_SECTION = /^\s*\[(.+)\]\s*$/
|
|
@@ -41,9 +43,7 @@ function fillUsage (result, name, data) {
|
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
45
|
|
|
44
|
-
var cacheEnabled = !
|
|
45
|
-
process && process.env && process.env.BROWSERSLIST_DISABLE_CACHE
|
|
46
|
-
)
|
|
46
|
+
var cacheEnabled = !env.BROWSERSLIST_DISABLE_CACHE
|
|
47
47
|
var filenessCache = {}
|
|
48
48
|
var configCache = {}
|
|
49
49
|
|
|
@@ -73,14 +73,16 @@ function eachParent (file, callback) {
|
|
|
73
73
|
function getStat (opts) {
|
|
74
74
|
if (opts.stats) {
|
|
75
75
|
return opts.stats
|
|
76
|
-
} else if (
|
|
77
|
-
return
|
|
78
|
-
} else {
|
|
76
|
+
} else if (env.BROWSERSLIST_STATS) {
|
|
77
|
+
return env.BROWSERSLIST_STATS
|
|
78
|
+
} else if (opts.path) {
|
|
79
79
|
return eachParent(opts.path, function (dir) {
|
|
80
80
|
var file = path.join(dir, 'browserslist-stats.json')
|
|
81
81
|
return isFile(file) ? file : undefined
|
|
82
82
|
})
|
|
83
83
|
}
|
|
84
|
+
|
|
85
|
+
return undefined
|
|
84
86
|
}
|
|
85
87
|
|
|
86
88
|
function parsePackage (file) {
|
|
@@ -94,18 +96,18 @@ function parsePackage (file) {
|
|
|
94
96
|
function pickEnv (config, opts) {
|
|
95
97
|
if (typeof config !== 'object') return config
|
|
96
98
|
|
|
97
|
-
var
|
|
99
|
+
var name
|
|
98
100
|
if (typeof opts.env === 'string') {
|
|
99
|
-
|
|
100
|
-
} else if (
|
|
101
|
-
|
|
102
|
-
} else if (
|
|
103
|
-
|
|
101
|
+
name = opts.env
|
|
102
|
+
} else if (env.BROWSERSLIST_ENV) {
|
|
103
|
+
name = env.BROWSERSLIST_ENV
|
|
104
|
+
} else if (env.NODE_ENV) {
|
|
105
|
+
name = env.NODE_ENV
|
|
104
106
|
} else {
|
|
105
|
-
|
|
107
|
+
name = 'development'
|
|
106
108
|
}
|
|
107
109
|
|
|
108
|
-
return config[
|
|
110
|
+
return config[name] || config.defaults
|
|
109
111
|
}
|
|
110
112
|
|
|
111
113
|
function generateFilter (sign, version) {
|
|
@@ -161,10 +163,10 @@ function browserslist (queries, opts) {
|
|
|
161
163
|
}
|
|
162
164
|
|
|
163
165
|
if (typeof queries === 'undefined' || queries === null) {
|
|
164
|
-
if (
|
|
165
|
-
queries =
|
|
166
|
-
} else if (opts.config ||
|
|
167
|
-
var file = opts.config ||
|
|
166
|
+
if (env.BROWSERSLIST) {
|
|
167
|
+
queries = env.BROWSERSLIST
|
|
168
|
+
} else if (opts.config || env.BROWSERSLIST_CONFIG) {
|
|
169
|
+
var file = opts.config || env.BROWSERSLIST_CONFIG
|
|
168
170
|
if (path.basename(file) === 'package.json') {
|
|
169
171
|
queries = pickEnv(parsePackage(file), opts)
|
|
170
172
|
} else {
|
|
@@ -219,8 +221,8 @@ function browserslist (queries, opts) {
|
|
|
219
221
|
selection = selection.slice(4)
|
|
220
222
|
}
|
|
221
223
|
|
|
222
|
-
for (var i
|
|
223
|
-
var type =
|
|
224
|
+
for (var i = 0; i < QUERIES.length; i++) {
|
|
225
|
+
var type = QUERIES[i]
|
|
224
226
|
var match = selection.match(type.regexp)
|
|
225
227
|
if (match) {
|
|
226
228
|
var args = [context].concat(match.slice(1))
|
|
@@ -246,7 +248,7 @@ function browserslist (queries, opts) {
|
|
|
246
248
|
var name = parts[0]
|
|
247
249
|
var version = parts[1]
|
|
248
250
|
if (version === '0') {
|
|
249
|
-
return name + ' ' +
|
|
251
|
+
return name + ' ' + byName(name).versions[0]
|
|
250
252
|
} else {
|
|
251
253
|
return i
|
|
252
254
|
}
|
|
@@ -327,7 +329,7 @@ browserslist.aliases = {
|
|
|
327
329
|
browserslist.versionAliases = { }
|
|
328
330
|
|
|
329
331
|
// Get browser data by alias or case insensitive name
|
|
330
|
-
|
|
332
|
+
function byName (name) {
|
|
331
333
|
name = name.toLowerCase()
|
|
332
334
|
name = browserslist.aliases[name] || name
|
|
333
335
|
return browserslist.data[name]
|
|
@@ -335,8 +337,8 @@ browserslist.byName = function (name) {
|
|
|
335
337
|
|
|
336
338
|
// Get browser data by alias or case insensitive name and throw error
|
|
337
339
|
// on unknown browser
|
|
338
|
-
|
|
339
|
-
var data =
|
|
340
|
+
function checkName (name) {
|
|
341
|
+
var data = byName(name)
|
|
340
342
|
if (!data) throw new BrowserslistError('Unknown browser ' + name)
|
|
341
343
|
return data
|
|
342
344
|
}
|
|
@@ -369,8 +371,7 @@ browserslist.findConfig = function (from) {
|
|
|
369
371
|
pkgBrowserslist = parsePackage(pkg)
|
|
370
372
|
} catch (e) {
|
|
371
373
|
console.warn(
|
|
372
|
-
'[Browserslist] Could not parse ' + pkg + '. '
|
|
373
|
-
'Ignoring it.')
|
|
374
|
+
'[Browserslist] Could not parse ' + pkg + '. Ignoring it.')
|
|
374
375
|
}
|
|
375
376
|
}
|
|
376
377
|
|
|
@@ -461,14 +462,13 @@ browserslist.clearCaches = function () {
|
|
|
461
462
|
configCache = {}
|
|
462
463
|
}
|
|
463
464
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
lastVersions: {
|
|
465
|
+
var QUERIES = [
|
|
466
|
+
{
|
|
467
467
|
regexp: /^last\s+(\d+)\s+versions?$/i,
|
|
468
468
|
select: function (context, versions) {
|
|
469
469
|
var selected = []
|
|
470
|
-
Object.keys(
|
|
471
|
-
var data =
|
|
470
|
+
Object.keys(agents).forEach(function (name) {
|
|
471
|
+
var data = byName(name)
|
|
472
472
|
if (!data) return
|
|
473
473
|
var array = data.released.slice(-versions)
|
|
474
474
|
|
|
@@ -480,18 +480,46 @@ browserslist.queries = {
|
|
|
480
480
|
return selected
|
|
481
481
|
}
|
|
482
482
|
},
|
|
483
|
-
|
|
484
|
-
lastByBrowser: {
|
|
483
|
+
{
|
|
485
484
|
regexp: /^last\s+(\d+)\s+(\w+)\s+versions?$/i,
|
|
486
485
|
select: function (context, versions, name) {
|
|
487
|
-
var data =
|
|
486
|
+
var data = checkName(name)
|
|
488
487
|
return data.released.slice(-versions).map(function (v) {
|
|
489
488
|
return data.name + ' ' + v
|
|
490
489
|
})
|
|
491
490
|
}
|
|
492
491
|
},
|
|
492
|
+
{
|
|
493
|
+
regexp: /^unreleased\s+versions$/i,
|
|
494
|
+
select: function () {
|
|
495
|
+
var selected = []
|
|
496
|
+
Object.keys(agents).forEach(function (name) {
|
|
497
|
+
var data = byName(name)
|
|
498
|
+
if (!data) return
|
|
499
|
+
var array = data.versions.filter(function (v) {
|
|
500
|
+
return data.released.indexOf(v) === -1
|
|
501
|
+
})
|
|
493
502
|
|
|
494
|
-
|
|
503
|
+
array = array.map(function (v) {
|
|
504
|
+
return data.name + ' ' + v
|
|
505
|
+
})
|
|
506
|
+
selected = selected.concat(array)
|
|
507
|
+
})
|
|
508
|
+
return selected
|
|
509
|
+
}
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
regexp: /^unreleased\s+(\w+)\s+versions?$/i,
|
|
513
|
+
select: function (context, name) {
|
|
514
|
+
var data = checkName(name)
|
|
515
|
+
return data.versions.filter(function (v) {
|
|
516
|
+
return data.released.indexOf(v) === -1
|
|
517
|
+
}).map(function (v) {
|
|
518
|
+
return data.name + ' ' + v
|
|
519
|
+
})
|
|
520
|
+
}
|
|
521
|
+
},
|
|
522
|
+
{
|
|
495
523
|
regexp: /^(>=?)\s*(\d*\.?\d+)%$/,
|
|
496
524
|
select: function (context, sign, popularity) {
|
|
497
525
|
popularity = parseFloat(popularity)
|
|
@@ -510,8 +538,7 @@ browserslist.queries = {
|
|
|
510
538
|
return result
|
|
511
539
|
}
|
|
512
540
|
},
|
|
513
|
-
|
|
514
|
-
customStatistics: {
|
|
541
|
+
{
|
|
515
542
|
regexp: /^(>=?)\s*(\d*\.?\d+)%\s+in\s+my\s+stats$/,
|
|
516
543
|
select: function (context, sign, popularity) {
|
|
517
544
|
popularity = parseFloat(popularity)
|
|
@@ -534,8 +561,7 @@ browserslist.queries = {
|
|
|
534
561
|
return result
|
|
535
562
|
}
|
|
536
563
|
},
|
|
537
|
-
|
|
538
|
-
countryStatistics: {
|
|
564
|
+
{
|
|
539
565
|
regexp: /^(>=?)\s*(\d*\.?\d+)%\s+in\s+((alt-)?\w\w)$/,
|
|
540
566
|
select: function (context, sign, popularity, place) {
|
|
541
567
|
popularity = parseFloat(popularity)
|
|
@@ -563,8 +589,7 @@ browserslist.queries = {
|
|
|
563
589
|
return result
|
|
564
590
|
}
|
|
565
591
|
},
|
|
566
|
-
|
|
567
|
-
electronRange: {
|
|
592
|
+
{
|
|
568
593
|
regexp: /^electron\s+([\d.]+)\s*-\s*([\d.]+)$/i,
|
|
569
594
|
select: function (context, from, to) {
|
|
570
595
|
if (!e2c[from]) {
|
|
@@ -585,11 +610,10 @@ browserslist.queries = {
|
|
|
585
610
|
})
|
|
586
611
|
}
|
|
587
612
|
},
|
|
588
|
-
|
|
589
|
-
range: {
|
|
613
|
+
{
|
|
590
614
|
regexp: /^(\w+)\s+([\d.]+)\s*-\s*([\d.]+)$/i,
|
|
591
615
|
select: function (context, name, from, to) {
|
|
592
|
-
var data =
|
|
616
|
+
var data = checkName(name)
|
|
593
617
|
from = parseFloat(normalizeVersion(data, from) || from)
|
|
594
618
|
to = parseFloat(normalizeVersion(data, to) || to)
|
|
595
619
|
|
|
@@ -603,8 +627,7 @@ browserslist.queries = {
|
|
|
603
627
|
})
|
|
604
628
|
}
|
|
605
629
|
},
|
|
606
|
-
|
|
607
|
-
electronVersions: {
|
|
630
|
+
{
|
|
608
631
|
regexp: /^electron\s*(>=?|<=?)\s*([\d.]+)$/i,
|
|
609
632
|
select: function (context, sign, version) {
|
|
610
633
|
return Object.keys(e2c)
|
|
@@ -614,12 +637,11 @@ browserslist.queries = {
|
|
|
614
637
|
})
|
|
615
638
|
}
|
|
616
639
|
},
|
|
617
|
-
|
|
618
|
-
versions: {
|
|
640
|
+
{
|
|
619
641
|
regexp: /^(\w+)\s*(>=?|<=?)\s*([\d.]+)$/,
|
|
620
642
|
select: function (context, name, sign, version) {
|
|
621
|
-
var data =
|
|
622
|
-
var alias =
|
|
643
|
+
var data = checkName(name)
|
|
644
|
+
var alias = browserslist.versionAliases[data.name][version]
|
|
623
645
|
if (alias) {
|
|
624
646
|
version = alias
|
|
625
647
|
}
|
|
@@ -630,22 +652,19 @@ browserslist.queries = {
|
|
|
630
652
|
})
|
|
631
653
|
}
|
|
632
654
|
},
|
|
633
|
-
|
|
634
|
-
esr: {
|
|
655
|
+
{
|
|
635
656
|
regexp: /^(firefox|ff|fx)\s+esr$/i,
|
|
636
657
|
select: function () {
|
|
637
658
|
return ['firefox 52']
|
|
638
659
|
}
|
|
639
660
|
},
|
|
640
|
-
|
|
641
|
-
opMini: {
|
|
661
|
+
{
|
|
642
662
|
regexp: /(operamini|op_mini)\s+all/i,
|
|
643
663
|
select: function () {
|
|
644
664
|
return ['op_mini all']
|
|
645
665
|
}
|
|
646
666
|
},
|
|
647
|
-
|
|
648
|
-
electron: {
|
|
667
|
+
{
|
|
649
668
|
regexp: /^electron\s+([\d.]+)$/i,
|
|
650
669
|
select: function (context, version) {
|
|
651
670
|
var chrome = e2c[version]
|
|
@@ -656,12 +675,11 @@ browserslist.queries = {
|
|
|
656
675
|
return ['chrome ' + chrome]
|
|
657
676
|
}
|
|
658
677
|
},
|
|
659
|
-
|
|
660
|
-
direct: {
|
|
678
|
+
{
|
|
661
679
|
regexp: /^(\w+)\s+(tp|[\d.]+)$/i,
|
|
662
680
|
select: function (context, name, version) {
|
|
663
681
|
if (/^tp$/i.test(version)) version = 'TP'
|
|
664
|
-
var data =
|
|
682
|
+
var data = checkName(name)
|
|
665
683
|
var alias = normalizeVersion(data, version)
|
|
666
684
|
if (alias) {
|
|
667
685
|
version = alias
|
|
@@ -682,25 +700,23 @@ browserslist.queries = {
|
|
|
682
700
|
return [data.name + ' ' + version]
|
|
683
701
|
}
|
|
684
702
|
},
|
|
685
|
-
|
|
686
|
-
defaults: {
|
|
703
|
+
{
|
|
687
704
|
regexp: /^defaults$/i,
|
|
688
705
|
select: function () {
|
|
689
706
|
return browserslist(browserslist.defaults)
|
|
690
707
|
}
|
|
691
708
|
}
|
|
692
|
-
|
|
693
|
-
};
|
|
709
|
+
];
|
|
694
710
|
|
|
695
711
|
// Get and convert Can I Use data
|
|
696
712
|
|
|
697
713
|
(function () {
|
|
698
|
-
for (var name in
|
|
699
|
-
var browser =
|
|
714
|
+
for (var name in agents) {
|
|
715
|
+
var browser = agents[name]
|
|
700
716
|
browserslist.data[name] = {
|
|
701
717
|
name: name,
|
|
702
|
-
versions: normalize(
|
|
703
|
-
released: normalize(
|
|
718
|
+
versions: normalize(agents[name].versions),
|
|
719
|
+
released: normalize(agents[name].versions.slice(0, -3))
|
|
704
720
|
}
|
|
705
721
|
fillUsage(browserslist.usage.global, name, browser.usage_global)
|
|
706
722
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "browserslist",
|
|
3
|
-
"version": "2.2
|
|
3
|
+
"version": "2.3.2",
|
|
4
4
|
"description": "Share browsers list between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"caniuse",
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"repository": "ai/browserslist",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"caniuse-lite": "^1.0.
|
|
14
|
-
"electron-to-chromium": "^1.3.
|
|
13
|
+
"caniuse-lite": "^1.0.30000715",
|
|
14
|
+
"electron-to-chromium": "^1.3.18"
|
|
15
15
|
},
|
|
16
16
|
"bin": "./cli.js",
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"cross-spawn": "^5.1.0",
|
|
19
|
-
"eslint": "^4.
|
|
19
|
+
"eslint": "^4.4.1",
|
|
20
20
|
"eslint-config-logux": "^16.0.0",
|
|
21
21
|
"eslint-config-standard": "^10.2.1",
|
|
22
22
|
"eslint-plugin-es5": "^1.1.0",
|
|
@@ -27,8 +27,9 @@
|
|
|
27
27
|
"eslint-plugin-security": "^1.4.0",
|
|
28
28
|
"eslint-plugin-standard": "^3.0.1",
|
|
29
29
|
"jest": "^20.0.4",
|
|
30
|
-
"lint-staged": "^4.0.
|
|
30
|
+
"lint-staged": "^4.0.3",
|
|
31
31
|
"pre-commit": "^1.1.3",
|
|
32
|
+
"size-limit": "^0.8.4",
|
|
32
33
|
"yaspeller-ci": "^0.6.0"
|
|
33
34
|
},
|
|
34
35
|
"eslintConfig": {
|
|
@@ -52,17 +53,24 @@
|
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
},
|
|
56
|
+
"size-limit": [
|
|
57
|
+
{
|
|
58
|
+
"path": "index.js",
|
|
59
|
+
"limit": "152 KB"
|
|
60
|
+
}
|
|
61
|
+
],
|
|
55
62
|
"scripts": {
|
|
56
63
|
"lint-staged": "lint-staged",
|
|
57
64
|
"spellcheck": "yaspeller-ci README.md CHANGELOG.md",
|
|
58
65
|
"lint": "eslint *.js test/*.js",
|
|
59
|
-
"test": "jest --coverage && yarn lint && yarn spellcheck"
|
|
66
|
+
"test": "jest --coverage && yarn lint && yarn spellcheck && size-limit"
|
|
60
67
|
},
|
|
61
68
|
"lint-staged": {
|
|
62
69
|
"*.md": "yaspeller-ci",
|
|
63
70
|
"*.js": "eslint"
|
|
64
71
|
},
|
|
65
72
|
"browser": {
|
|
73
|
+
"path": false,
|
|
66
74
|
"fs": false
|
|
67
75
|
},
|
|
68
76
|
"pre-commit": [
|