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.
Files changed (4) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +22 -0
  3. package/index.js +85 -69
  4. 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 caniuse = require('caniuse-lite').agents
6
- var region = require('caniuse-lite').region
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 (process.env.BROWSERSLIST_STATS) {
77
- return process.env.BROWSERSLIST_STATS
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 env
99
+ var name
98
100
  if (typeof opts.env === 'string') {
99
- env = opts.env
100
- } else if (typeof process.env.BROWSERSLIST_ENV === 'string') {
101
- env = process.env.BROWSERSLIST_ENV
102
- } else if (typeof process.env.NODE_ENV === 'string') {
103
- env = process.env.NODE_ENV
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
- env = 'development'
107
+ name = 'development'
106
108
  }
107
109
 
108
- return config[env] || config.defaults
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 (process.env.BROWSERSLIST) {
165
- queries = process.env.BROWSERSLIST
166
- } else if (opts.config || process.env.BROWSERSLIST_CONFIG) {
167
- var file = opts.config || process.env.BROWSERSLIST_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 in browserslist.queries) {
223
- var type = browserslist.queries[i]
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 + ' ' + browserslist.byName(name).versions[0]
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
- browserslist.byName = function (name) {
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
- browserslist.checkName = function (name) {
339
- var data = browserslist.byName(name)
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
- browserslist.queries = {
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(caniuse).forEach(function (name) {
471
- var data = browserslist.byName(name)
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 = browserslist.checkName(name)
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
- globalStatistics: {
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 = browserslist.checkName(name)
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 = browserslist.checkName(name)
622
- var alias = normalizeVersion(data, version)
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 = browserslist.checkName(name)
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 caniuse) {
699
- var browser = caniuse[name]
714
+ for (var name in agents) {
715
+ var browser = agents[name]
700
716
  browserslist.data[name] = {
701
717
  name: name,
702
- versions: normalize(caniuse[name].versions),
703
- released: normalize(caniuse[name].versions.slice(0, -3))
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.1",
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.30000704",
14
- "electron-to-chromium": "^1.3.16"
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.3.0",
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.2",
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": [