browserslist 3.2.6 → 4.0.1

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 CHANGED
@@ -1,6 +1,23 @@
1
1
  # Change Log
2
2
  This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
+ ## 4.0.1
5
+ * Reduce npm package size.
6
+ * Fix docs.
7
+
8
+ ## 4.0.0 “Erinaceus amurensis”
9
+ * Add `node X` and `maintained node versions` queries (by Pavel Vostrikov).
10
+ * Remove Node.js 4 support.
11
+ * Show warning if `caniuse-lite` is old (by Anton Tuzhik).
12
+ * Add comma support in config file.
13
+
14
+ ## 3.2.8
15
+ * Add IE 9-5.5 to dead browsers.
16
+ * Remove development configs from npm package.
17
+
18
+ ## 3.2.7
19
+ * Add Firefox 60 as Firefox ESR.
20
+
4
21
  ## 3.2.6
5
22
  * Add Opera Mini 12 to dead browsers.
6
23
  * Update docs (by Jamie Kyle).
@@ -38,7 +55,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
38
55
  * Add `ignoreUnknownVersions` option.
39
56
  * Fix docs (by Pascal Duez).
40
57
 
41
- ## 3.0
58
+ ## 3.0 “Atelerix sclateri”
42
59
  * Remove country statistics from client-side build of Browserslist.
43
60
  * Change `> 1%` to `> 0.5%` in default query.
44
61
  * Add `not dead` to default query.
@@ -139,7 +156,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
139
156
  ## 2.1
140
157
  * Add `>= 5%`, `>= 5% in US` and `>= 5% in my stats` queries.
141
158
 
142
- ## 2.0
159
+ ## 2.0 “Atelerix frontalis”
143
160
  * `last n versions` returns versions for all browsers, not only main browsers.
144
161
  * Cache file system operations (by Aarni Koskela).
145
162
  * Use `caniuse-lite` 1 MB instead of `caniuse-db` 7 MB (by Ben Briggs).
@@ -238,7 +255,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
238
255
  ## 1.0.1
239
256
  * Update Firefox ESR (by Rouven Weßling).
240
257
 
241
- ## 1.0
258
+ ## 1.0 “Atelerix algirus”
242
259
  * Remove Opera 12.1 from default query.
243
260
  * Add `not` keyword and exclude browsers by query.
244
261
  * Add Microsoft Edge support (by Andrey Polischuk).
@@ -277,5 +294,5 @@ This project adheres to [Semantic Versioning](http://semver.org/).
277
294
  ## 0.1.1
278
295
  * Sort browsers by name and version.
279
296
 
280
- ## 0.1
297
+ ## 0.1 “Atelerix albiventris”
281
298
  * Initial release.
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Browserslist [![Cult Of Martians][cult-img]][cult]
2
2
 
3
- <img align="right" width="120" height="120"
4
- src="./logo.svg" alt="Browserslist logo by Anton Lovchikov">
3
+ <img width="120" height="120" alt="Browserslist logo by Anton Lovchikov"
4
+ src="http://browserslist.github.io/browserslist/logo.svg" align="right">
5
5
 
6
- Library to share target browsers between different front-end tools.
7
- It is used in:
6
+ The config to share target browsers and Node.js versions between different
7
+ front-end tools. It is used in:
8
8
 
9
9
  * [Autoprefixer]
10
- * [babel-preset-env]
10
+ * [Babel]
11
11
  (external config in `package.json` or `browserslist` will be supported in 7.0)
12
12
  * [postcss-preset-env]
13
13
  * [eslint-plugin-compat]
@@ -21,8 +21,10 @@ when you add the following to `package.json`:
21
21
  ```json
22
22
  {
23
23
  "browserslist": [
24
+ "last 1 version",
24
25
  "> 1%",
25
- "IE 10"
26
+ "maintained node versions",
27
+ "not dead"
26
28
  ]
27
29
  }
28
30
  ```
@@ -32,15 +34,17 @@ Or in `.browserslistrc` config:
32
34
  ```yaml
33
35
  # Browsers that we support
34
36
 
37
+ last 1 version
35
38
  > 1%
36
- IE 10 # sorry
39
+ maintained node versions
40
+ not dead
37
41
  ```
38
42
 
39
- Developers set browsers list in queries like `last 2 version`
40
- to be free from updating browser versions manually.
43
+ Developers set versions list in queries like `last 2 version`
44
+ to be free from updating versions manually.
41
45
  Browserslist will use [Can I Use] data for this queries.
42
46
 
43
- Browserslist will take browsers queries from tool option,
47
+ Browserslist will take queries from tool option,
44
48
  `browserslist` config, `.browserslistrc` config,
45
49
  `browserslist` section in `package.json` or environment variables.
46
50
 
@@ -58,11 +62,11 @@ You can test Browserslist queries in [online demo].
58
62
  [eslint-plugin-compat]: https://github.com/amilajack/eslint-plugin-compat
59
63
  [Browserslist Example]: https://github.com/browserslist/browserslist-example
60
64
  [postcss-preset-env]: https://github.com/jonathantneal/postcss-preset-env
61
- [babel-preset-env]: https://github.com/babel/babel/tree/master/packages/babel-preset-env
62
65
  [postcss-normalize]: https://github.com/jonathantneal/postcss-normalize
63
66
  [Autoprefixer]: https://github.com/postcss/autoprefixer
64
67
  [online demo]: http://browserl.ist/
65
68
  [Can I Use]: http://caniuse.com/
69
+ [Babel]: https://github.com/babel/babel/tree/master/packages/babel-preset-env
66
70
 
67
71
  ## Tools
68
72
 
@@ -70,19 +74,23 @@ You can test Browserslist queries in [online demo].
70
74
  to use it in `> 0.5% in my stats` query.
71
75
  * [`browserslist-useragent`] checks browser by user agent string
72
76
  to match Browserslist target browsers query.
77
+ * [`browserslist-useragent-ruby`] is a Ruby library to checks browser
78
+ by user agent string to match Browserslist.
73
79
  * [`caniuse-api`] returns browsers which support some specific feature.
74
80
  * Run `npx browserslist` in your project directory to see project’s
75
81
  target browsers. This CLI tool is built-in and available in any project
76
82
  with Autoprefixer.
77
83
 
78
- [`browserslist-useragent`]: https://github.com/pastelsky/browserslist-useragent
79
- [`browserslist-ga`]: https://github.com/browserslist/browserslist-ga
80
- [`caniuse-api`]: https://github.com/Nyalab/caniuse-api
84
+ [`browserslist-useragent-ruby`]: https://github.com/browserslist/browserslist-useragent-ruby
85
+ [`browserslist-useragent`]: https://github.com/pastelsky/browserslist-useragent
86
+ [`browserslist-ga`]: https://github.com/browserslist/browserslist-ga
87
+ [`caniuse-api`]: https://github.com/Nyalab/caniuse-api
81
88
 
82
89
 
83
90
  ## Queries
84
91
 
85
- Browserslist will use browsers query from one of this sources:
92
+ Browserslist will use browsers and Node.js versions query
93
+ from one of this sources:
86
94
 
87
95
  1. Tool options. For example `browsers` option in Autoprefixer.
88
96
  2. `BROWSERSLIST` environment variable.
@@ -97,25 +105,26 @@ Browserslist will use browsers query from one of this sources:
97
105
 
98
106
  ### Best Practices
99
107
 
100
- * We do not recommend to changing the default set of browsers unless you
101
- know what are you doing. Browserslist’s default browsers selection is a
102
- result of many long discussions. It is easy to make mistake selecting own
103
- browsers without understanding what are you doing (like accidentally making
104
- your website inaccessible for Chinese users).
105
108
  * Select browsers directly (`last 2 Chrome versions`) only if you are making
106
109
  web app for kiosk with one browser. There are a lot browsers on the market.
107
110
  If you are making general web app you should respect browsers diversity.
108
- * If you want to change the default set of browsers we recommend `> 0.2%`,
109
- `> 1% in US` or `> 1% in my stats`. `last 2 versions` will add too many
110
- dead browsers and will not add many popular versions. If you require last
111
- 2 versions support, set `last 2 versions, > 1% in my stats, not dead`.
111
+ * If you want to change the default set of browsers we recommend to combine
112
+ `last 1 version`, `not dead` with `> 0.2%` (or `> 1% in US`,
113
+ `> 1% in my stats`). Just `last n versions` adds too many dead browsers
114
+ and does not add popular old versions. Just `> 0.2%` make popular browsers
115
+ even more popular, so we will have a monopoly and stagnation, as we had
116
+ with Internet Explorer 6.
117
+ * Don’t remove browsers just because you don’t know them. Opera Mini has
118
+ 100 million users in Africa and it is more popular in global market,
119
+ than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox
120
+ and desktop Safari altogether.
112
121
 
113
122
 
114
123
  ### Full List
115
124
 
116
- You can specify the versions by queries (case insensitive):
125
+ You can specify the browser and Node.js versions by queries (case insensitive):
117
126
 
118
- * `> 5%`: versions selected by global usage statistics.
127
+ * `> 5%`: browsers versions selected by global usage statistics.
119
128
  `>=`, `<` and `<=` work too.
120
129
  * `> 5% in US`: uses USA usage statistics. It accepts [two-letter country code].
121
130
  * `> 5% in alt-AS`: uses Asia region usage statistics. List of all region codes
@@ -124,6 +133,10 @@ You can specify the versions by queries (case insensitive):
124
133
  * `cover 99.5%`: most popular browsers that provide coverage.
125
134
  * `cover 99.5% in US`: same as above, with [two-letter country code].
126
135
  * `cover 99.5% in my stats`: uses [custom usage data].
136
+ * `maintained node versions`: all Node.js versions, which are [still maintained]
137
+ by Node.js Foundation.
138
+ * `node 10` and `node 10.4`: selects latest Node.js `10.x.x`
139
+ or `10.4.x` release.
127
140
  * `extends browserslist-config-mycompany`: take queries from
128
141
  `browserslist-config-mycompany` npm package.
129
142
  * `ie 6-8`: selects an inclusive range of versions.
@@ -189,6 +202,7 @@ whereas `last 3 Chrome versions` might select `50, 49, 48` (major only).
189
202
  [`caniuse-lite/data/regions`]: https://github.com/ben-eb/caniuse-lite/tree/master/data/regions
190
203
  [two-letter country code]: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements
191
204
  [custom usage data]: #custom-usage-data
205
+ [still maintained]: https://github.com/nodejs/Release
192
206
  [Can I Use]: http://caniuse.com/
193
207
 
194
208
 
@@ -208,6 +222,7 @@ Names are case insensitive:
208
222
  * `Firefox` or `ff` for Mozilla Firefox.
209
223
  * `FirefoxAndroid` or `and_ff` for Firefox for Android.
210
224
  * `iOS` or `ios_saf` for iOS Safari.
225
+ * `Node` for Node.js.
211
226
  * `Opera` for Opera.
212
227
  * `OperaMini` or `op_mini` for Opera Mini.
213
228
  * `OperaMobile` or `op_mob` for Opera Mobile.
@@ -229,6 +244,7 @@ browsers in `package.json` with `browserslist` key:
229
244
  "autoprefixer": "^6.5.4"
230
245
  },
231
246
  "browserslist": [
247
+ "last 1 version",
232
248
  "> 1%",
233
249
  "IE 10"
234
250
  ]
@@ -244,6 +260,7 @@ and have browsers queries split by a new line. Comments starts with `#` symb
244
260
  ```yaml
245
261
  # Browsers that we support
246
262
 
263
+ last 1 version
247
264
  > 1%
248
265
  IE 10 # sorry
249
266
  ```
@@ -293,6 +310,7 @@ When writing a shared Browserslist package, just export an array.
293
310
 
294
311
  ```js
295
312
  module.exports = [
313
+ 'last 1 version',
296
314
  '> 1%',
297
315
  'ie 10'
298
316
  ]
package/browser.js CHANGED
@@ -31,5 +31,7 @@ module.exports = {
31
31
 
32
32
  findConfig: noop,
33
33
 
34
- clearCaches: noop
34
+ clearCaches: noop,
35
+
36
+ oldDataWarning: noop
35
37
  }
package/cli.js CHANGED
@@ -38,7 +38,7 @@ if (isArg('--help') || isArg('-h')) {
38
38
 
39
39
  for (var i = 0; i < args.length; i++) {
40
40
  if (args[i][0] !== '-') {
41
- queries = args[i].replace(/^['"]|['"]$/g, '')
41
+ queries = args[i].replace(/^["']|["']$/g, '')
42
42
  continue
43
43
  }
44
44
 
@@ -46,7 +46,7 @@ if (isArg('--help') || isArg('-h')) {
46
46
  var name = arg[0]
47
47
  var value = arg[1]
48
48
 
49
- if (value) value = value.replace(/^['"]|['"]$/g, '')
49
+ if (value) value = value.replace(/^["']|["']$/g, '')
50
50
 
51
51
  if (name === '--config' || name === '-b') {
52
52
  opts.config = value
package/index.js CHANGED
@@ -1,8 +1,9 @@
1
+ var jsReleases = require('node-releases/data/processed/envs.json')
2
+ var agents = require('caniuse-lite/dist/unpacker/agents').agents
3
+ var jsEOL = require('node-releases/data/release-schedule/release-schedule.json')
1
4
  var path = require('path')
2
5
  var e2c = require('electron-to-chromium/versions')
3
6
 
4
- var agents = require('caniuse-lite/dist/unpacker/agents').agents
5
-
6
7
  var BrowserslistError = require('./error')
7
8
  var env = require('./node') // Will load browser.js in webpack
8
9
 
@@ -140,7 +141,7 @@ function resolve (queries, context) {
140
141
  var array = type.select.apply(browserslist, args)
141
142
  if (isExclude) {
142
143
  array = array.concat(array.map(function (j) {
143
- return j.replace(/\s[^\s]+/, ' 0')
144
+ return j.replace(/\s\S+/, ' 0')
144
145
  }))
145
146
  return result.filter(function (j) {
146
147
  return array.indexOf(j) === -1
@@ -206,6 +207,7 @@ function browserslist (queries, opts) {
206
207
  dangerousExtend: opts.dangerousExtend
207
208
  }
208
209
 
210
+ env.oldDataWarning(browserslist.data)
209
211
  var stats = env.getStat(opts)
210
212
  if (stats) {
211
213
  context.customUsage = { }
@@ -332,7 +334,7 @@ browserslist.coverage = function (browsers, stats) {
332
334
  return browsers.reduce(function (all, i) {
333
335
  var usage = data[i]
334
336
  if (usage === undefined) {
335
- usage = data[i.replace(/ [^\s]+$/, ' 0')]
337
+ usage = data[i.replace(/ \S+$/, ' 0')]
336
338
  }
337
339
  return all + (usage || 0)
338
340
  }, 0)
@@ -648,7 +650,7 @@ var QUERIES = [
648
650
  {
649
651
  regexp: /^(firefox|ff|fx)\s+esr$/i,
650
652
  select: function () {
651
- return ['firefox 52']
653
+ return ['firefox 52', 'firefox 60']
652
654
  }
653
655
  },
654
656
  {
@@ -668,6 +670,38 @@ var QUERIES = [
668
670
  return ['chrome ' + chrome]
669
671
  }
670
672
  },
673
+ {
674
+ regexp: /^node\s+(\d+(\.\d+)?(\.\d+)?)$/i,
675
+ select: function (context, version) {
676
+ var nodeReleases = jsReleases.filter(function (i) {
677
+ return i.name === 'nodejs'
678
+ })
679
+ var matched = nodeReleases.filter(function (i) {
680
+ return (i.version + '.').indexOf(version + '.') === 0
681
+ })
682
+ if (matched.length === 0) {
683
+ if (context.ignoreUnknownVersions) {
684
+ return []
685
+ } else {
686
+ throw new BrowserslistError(
687
+ 'Unknown version ' + version + ' of Node.js')
688
+ }
689
+ }
690
+ return ['node ' + matched[matched.length - 1].version]
691
+ }
692
+ },
693
+ {
694
+ regexp: /^maintained\s+node\s+versions$/i,
695
+ select: function (context) {
696
+ var now = Date.now()
697
+ var queries = Object.keys(jsEOL).filter(function (key) {
698
+ return now < Date.parse(jsEOL[key].end)
699
+ }).map(function (key) {
700
+ return 'node ' + key.slice(1)
701
+ })
702
+ return resolve(queries, context)
703
+ }
704
+ },
671
705
  {
672
706
  regexp: /^(\w+)\s+(tp|[\d.]+)$/i,
673
707
  select: function (context, name, version) {
@@ -709,8 +743,9 @@ var QUERIES = [
709
743
  },
710
744
  {
711
745
  regexp: /^dead$/i,
712
- select: function () {
713
- return ['ie 10', 'ie_mob 10', 'bb 10', 'bb 7', 'op_mob 12.1']
746
+ select: function (context) {
747
+ var dead = ['ie <= 10', 'ie_mob <= 10', 'bb <= 10', 'op_mob <= 12.1']
748
+ return resolve(dead, context)
714
749
  }
715
750
  },
716
751
  {
package/node.js CHANGED
@@ -7,9 +7,11 @@ var BrowserslistError = require('./error')
7
7
  var IS_SECTION = /^\s*\[(.+)\]\s*$/
8
8
  var CONFIG_PATTERN = /^browserslist-config-/
9
9
  var SCOPED_CONFIG__PATTERN = /@[^./]+\/browserslist-config(-|$)/
10
+ var TIME_TO_UPDATE_CANIUSE = 6 * 30 * 24 * 60 * 60 * 1000
10
11
  var FORMAT = 'Browserslist config should be a string or an array ' +
11
12
  'of strings with browser queries'
12
13
 
14
+ var dataTimeChecked = false
13
15
  var filenessCache = { }
14
16
  var configCache = { }
15
17
 
@@ -96,6 +98,19 @@ function parsePackage (file) {
96
98
  return list
97
99
  }
98
100
 
101
+ function latestReleaseTime (agents) {
102
+ var latest = 0
103
+ for (var name in agents) {
104
+ var dates = agents[name].releaseDate || { }
105
+ for (var key in dates) {
106
+ if (latest < dates[key]) {
107
+ latest = dates[key]
108
+ }
109
+ }
110
+ }
111
+ return latest * 1000
112
+ }
113
+
99
114
  module.exports = {
100
115
  loadQueries: function loadQueries (context, name) {
101
116
  if (!context.dangerousExtend) checkExtend(name)
@@ -174,7 +189,7 @@ module.exports = {
174
189
 
175
190
  string.toString()
176
191
  .replace(/#[^\n]*/g, '')
177
- .split(/\n/)
192
+ .split(/\n|,/)
178
193
  .map(function (line) {
179
194
  return line.trim()
180
195
  })
@@ -256,7 +271,30 @@ module.exports = {
256
271
  },
257
272
 
258
273
  clearCaches: function clearCaches () {
274
+ dataTimeChecked = false
259
275
  filenessCache = { }
260
276
  configCache = { }
277
+ },
278
+
279
+ oldDataWarning: function oldDataWarning (agentsObj) {
280
+ if (dataTimeChecked) return
281
+ dataTimeChecked = true
282
+
283
+ var latest = latestReleaseTime(agentsObj)
284
+ var halfYearAgo = Date.now() - TIME_TO_UPDATE_CANIUSE
285
+
286
+ if (latest !== 0 && latest < halfYearAgo) {
287
+ var command = 'npm update'
288
+ eachParent(__filename, function (dir) {
289
+ var pckg = path.join(dir, 'package.json')
290
+ var yarnLock = path.join(dir, 'yarn.lock')
291
+ if (isFile(pckg) && isFile(yarnLock)) {
292
+ command = 'yarn upgrade'
293
+ }
294
+ })
295
+ console.warn(
296
+ 'Browserslist: caniuse-lite is outdated. ' +
297
+ 'Please run next command `' + command + ' caniuse-lite browserslist`')
298
+ }
261
299
  }
262
300
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browserslist",
3
- "version": "3.2.6",
3
+ "version": "4.0.1",
4
4
  "description": "Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset",
5
5
  "keywords": [
6
6
  "caniuse",
@@ -11,77 +11,14 @@
11
11
  "license": "MIT",
12
12
  "repository": "browserslist/browserslist",
13
13
  "dependencies": {
14
- "caniuse-lite": "^1.0.30000830",
15
- "electron-to-chromium": "^1.3.42"
14
+ "caniuse-lite": "^1.0.30000865",
15
+ "electron-to-chromium": "^1.3.52",
16
+ "node-releases": "^1.0.0-alpha.10"
16
17
  },
17
18
  "bin": "./cli.js",
18
- "devDependencies": {
19
- "cross-spawn": "^6.0.5",
20
- "eslint": "^4.19.1",
21
- "eslint-ci": "^0.1.1",
22
- "eslint-config-logux": "^21.0.0",
23
- "eslint-config-standard": "^11.0.0",
24
- "eslint-plugin-es5": "^1.3.1",
25
- "eslint-plugin-import": "^2.11.0",
26
- "eslint-plugin-jest": "^21.15.1",
27
- "eslint-plugin-node": "^6.0.1",
28
- "eslint-plugin-promise": "^3.7.0",
29
- "eslint-plugin-security": "^1.4.0",
30
- "eslint-plugin-standard": "^3.1.0",
31
- "fs-extra": "^5.0.0",
32
- "jest": "^22.4.3",
33
- "lint-staged": "^7.0.4",
34
- "pre-commit": "^1.1.3",
35
- "size-limit": "^0.17.0",
36
- "yaspeller-ci": "^1.0.0"
37
- },
38
- "eslintConfig": {
39
- "extends": "eslint-config-logux/browser",
40
- "rules": {
41
- "security/detect-unsafe-regex": "off",
42
- "global-require": "off"
43
- },
44
- "overrides": {
45
- "files": [
46
- "*.test.js"
47
- ],
48
- "rules": {
49
- "es5/no-arrow-functions": "off"
50
- }
51
- }
52
- },
53
- "jest": {
54
- "testEnvironment": "node",
55
- "coverageThreshold": {
56
- "global": {
57
- "statements": 100
58
- }
59
- },
60
- "modulePathIgnorePatterns": [
61
- "<rootDir>/test/fixtures"
62
- ]
63
- },
64
- "size-limit": [
65
- {
66
- "path": "index.js",
67
- "limit": "7.2 KB"
68
- }
69
- ],
70
- "scripts": {
71
- "lint-staged": "lint-staged",
72
- "spellcheck": "yaspeller-ci README.md CHANGELOG.md",
73
- "lint": "eslint-ci *.js test/*.js benchmark/*.js",
74
- "test": "jest --coverage && yarn lint && yarn spellcheck && size-limit"
75
- },
76
- "lint-staged": {
77
- "*.md": "yaspeller-ci",
78
- "*.js": "eslint"
79
- },
19
+ "scripts": {},
80
20
  "browser": {
81
21
  "./node.js": "./browser.js",
82
22
  "path": false
83
- },
84
- "pre-commit": [
85
- "lint-staged"
86
- ]
23
+ }
87
24
  }