browserslist 4.5.4 → 4.6.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,19 @@
1
1
  # Change Log
2
2
  This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
+ ## 4.6.1
5
+ * Fix patch version support for Electron (by Kilian Valkhof).
6
+
7
+ ## 4.6
8
+ * Add `mobileToDesktop` option (by Nicolò Ribaudo).
9
+
10
+ ## 4.5.6
11
+ * Make `Node > 5` and `node > 5` queries case insensitive.
12
+
13
+ ## 4.5.5
14
+ * Fix CLI help (by Marcel Gerber).
15
+ * Add KaiOS browser to docs.
16
+
4
17
  ## 4.5.4
5
18
  * Update docs (by Andrew Leedham and Dan Onoshko).
6
19
 
package/README.md CHANGED
@@ -73,13 +73,12 @@ You can test Browserslist queries in [online demo].
73
73
 
74
74
  * [`browserslist-ga`] downloads your website browsers statistics
75
75
  to use it in `> 0.5% in my stats` query.
76
- * [`browserslist-useragent`] checks browser by user agent string
77
- to match Browserslist target browsers query.
78
- * [`browserslist-useragent-ruby`] is a Ruby library to checks browser
79
- by user agent string to match Browserslist.
80
76
  * [`browserslist-useragent-regexp`] compiles Browserslist query to a RegExp
81
77
  to test browser useragent.
82
- * [`browserslist-browserstack`] runs BrowserStack tests for all browsers in Browserslist config.
78
+ * [`browserslist-useragent-ruby`] is a Ruby library to checks browser
79
+ by user agent string to match Browserslist.
80
+ * [`browserslist-browserstack`] runs BrowserStack tests for all browsers
81
+ in Browserslist config.
83
82
  * [`caniuse-api`] returns browsers which support some specific feature.
84
83
  * Run `npx browserslist` in your project directory to see project’s
85
84
  target browsers. This CLI tool is built-in and available in any project
@@ -93,6 +92,34 @@ You can test Browserslist queries in [online demo].
93
92
  [`browserslist-browserstack`]: https://github.com/xeroxinteractive/browserslist-browserstack
94
93
 
95
94
 
95
+ ## Best Practices
96
+
97
+ * Select browsers directly (`last 2 Chrome versions`) only if you are making
98
+ a web app for a kiosk with one browser. There are a lot of browsers
99
+ on the market. If you are making general web app you should respect
100
+ browsers diversity.
101
+ * There is a `defaults` query, which gives a reasonable configuration
102
+ for most users:
103
+
104
+ ```json
105
+ "browserslist": [
106
+ "defaults"
107
+ ]
108
+ ```
109
+
110
+ * If you want to change the default set of browsers we recommend to combine
111
+ `last 1 version`, `not dead` with `> 0.2%` (or `> 1% in US`,
112
+ `> 1% in my stats`). `last n versions` adds too many dead browsers
113
+ and does not add popular old versions. Choosing a percentage above `0.2%`
114
+ will in the long run make popular browsers even more popular. We might run
115
+ into a monopoly and stagnation situation, as we had with Internet Explorer 6.
116
+ Please use this setting with caution.
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 the global market
119
+ than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox
120
+ and desktop Safari altogether.
121
+
122
+
96
123
  ## Queries
97
124
 
98
125
  Browserslist will use browsers and Node.js versions query
@@ -133,25 +160,6 @@ _A quick way to test your query is to do `npx browserslist '> 0.5%, not IE 11'`
133
160
  in your terminal._
134
161
 
135
162
 
136
- ### Best Practices
137
-
138
- * Select browsers directly (`last 2 Chrome versions`) only if you are making
139
- a web app for a kiosk with one browser. There are a lot of browsers
140
- on the market. If you are making general web app you should respect
141
- browsers diversity.
142
- * If you want to change the default set of browsers we recommend to combine
143
- `last 1 version`, `not dead` with `> 0.2%` (or `> 1% in US`,
144
- `> 1% in my stats`). `last n versions` adds too many dead browsers
145
- and does not add popular old versions. Choosing a percentage above `0.2%`
146
- will in the long run make popular browsers even more popular. We might run
147
- into a monopoly and stagnation situation, as we had with Internet Explorer 6.
148
- Please use this setting with caution.
149
- * Don’t remove browsers just because you don’t know them. Opera Mini has
150
- 100 million users in Africa and it is more popular in the global market
151
- than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox
152
- and desktop Safari altogether.
153
-
154
-
155
163
  ### Full List
156
164
 
157
165
  You can specify the browser and Node.js versions by queries (case insensitive):
@@ -261,6 +269,7 @@ Names are case insensitive:
261
269
  * `Safari` for desktop Safari.
262
270
  * `Samsung` for Samsung Internet.
263
271
  * `UCAndroid` or `and_uc` for UC Browser for Android.
272
+ * `kaios` for KaiOS Browser.
264
273
 
265
274
 
266
275
  ## `package.json`
@@ -464,7 +473,7 @@ var browserslist = require('browserslist');
464
473
 
465
474
  // Your CSS/JS build tool code
466
475
  var process = function (source, opts) {
467
- var browsers = browserslist(opts.browsers, {
476
+ var browsers = browserslist(opts.overrideBrowserslist, {
468
477
  stats: opts.stats,
469
478
  path: opts.file,
470
479
  env: opts.env
@@ -490,6 +499,10 @@ Options:
490
499
  Default is `false.`
491
500
  * `dangerousExtend`: Disable security checks for `extend` query.
492
501
  Default is `false.`
502
+ * `mobileToDesktop`: Use desktop browsers if Can I Use doesn’t have data
503
+ about this mobile version. For instance, Browserslist will return
504
+ `chrome 20` on `and_chr 20` query (Can I Use has only data only about
505
+ latest versions of mobile browsers). Default is `false`.
493
506
 
494
507
  For non-JS environment and debug purpose you can use CLI tool:
495
508
 
package/cli.js CHANGED
@@ -13,7 +13,7 @@ var USAGE = 'Usage:\n' +
13
13
  ' ' + pkg.name + ' --config="path/to/browserlist/file"\n' +
14
14
  ' ' + pkg.name + ' --coverage "QUERIES"\n' +
15
15
  ' ' + pkg.name + ' --coverage=US "QUERIES"\n' +
16
- ' ' + pkg.name + ' --coverage=US,RU,world "QUERIES"\n' +
16
+ ' ' + pkg.name + ' --coverage=US,RU,global "QUERIES"\n' +
17
17
  ' ' + pkg.name + ' --env="environment name defined in config"\n' +
18
18
  ' ' + pkg.name + ' --stats="path/to/browserlist/stats/file"'
19
19
 
package/index.js CHANGED
@@ -33,6 +33,17 @@ function normalize (versions) {
33
33
  })
34
34
  }
35
35
 
36
+ function normalizeElectron (version) {
37
+ var versionToUse = version
38
+ if (version.split('.').length === 3) {
39
+ versionToUse = version
40
+ .split('.')
41
+ .slice(0, -1)
42
+ .join('.')
43
+ }
44
+ return versionToUse
45
+ }
46
+
36
47
  function nameMapper (name) {
37
48
  return function mapName (version) {
38
49
  return name + ' ' + version
@@ -136,11 +147,28 @@ function compareSemver (a, b) {
136
147
  )
137
148
  }
138
149
 
139
- function normalizeVersion (data, version) {
150
+ function resolveVersion (data, version) {
140
151
  if (data.versions.indexOf(version) !== -1) {
141
152
  return version
142
153
  } else if (browserslist.versionAliases[data.name][version]) {
143
154
  return browserslist.versionAliases[data.name][version]
155
+ } else {
156
+ return false
157
+ }
158
+ }
159
+
160
+ function normalizeVersion (data, version, context) {
161
+ var resolved = resolveVersion(data, version)
162
+ if (
163
+ !resolved &&
164
+ context.mobileToDesktop &&
165
+ browserslist.desktopNames[data.name]
166
+ ) {
167
+ var alias = checkName(browserslist.desktopNames[data.name])
168
+ resolved = resolveVersion(alias, version)
169
+ }
170
+ if (resolved) {
171
+ return resolved
144
172
  } else if (data.versions.length === 1) {
145
173
  return data.versions[0]
146
174
  } else {
@@ -274,6 +302,9 @@ function resolve (queries, context) {
274
302
  * version in direct query.
275
303
  * @param {boolean} [opts.dangerousExtend] Disable security checks
276
304
  * for extend query.
305
+ * @param {boolean} [opts.mobileToDesktop] Alias mobile browsers to the desktop
306
+ * version when Can I Use doesn't have
307
+ * data about the specified version.
277
308
  * @returns {string[]} Array with browser names in Can I Use.
278
309
  *
279
310
  * @example
@@ -302,7 +333,8 @@ function browserslist (queries, opts) {
302
333
 
303
334
  var context = {
304
335
  ignoreUnknownVersions: opts.ignoreUnknownVersions,
305
- dangerousExtend: opts.dangerousExtend
336
+ dangerousExtend: opts.dangerousExtend,
337
+ mobileToDesktop: opts.mobileToDesktop
306
338
  }
307
339
 
308
340
  env.oldDataWarning(browserslist.data)
@@ -427,6 +459,15 @@ browserslist.aliases = {
427
459
  qqandroid: 'and_qq'
428
460
  }
429
461
 
462
+ // Can I Use only provides a few versions for some browsers (e.g. and_chr).
463
+ // Fallback to a similar browser for unknown versions
464
+ browserslist.desktopNames = {
465
+ and_chr: 'chrome',
466
+ and_ff: 'firefox',
467
+ ie_mob: 'ie',
468
+ op_mob: 'opera'
469
+ }
470
+
430
471
  // Aliases to work with joined versions like `ios_saf 7.0-7.1`
431
472
  browserslist.versionAliases = { }
432
473
 
@@ -738,10 +779,12 @@ var QUERIES = [
738
779
  {
739
780
  regexp: /^electron\s+([\d.]+)\s*-\s*([\d.]+)$/i,
740
781
  select: function (context, from, to) {
741
- if (!e2c[from]) {
782
+ var fromToUse = normalizeElectron(from)
783
+ var toToUse = normalizeElectron(to)
784
+ if (!e2c[fromToUse]) {
742
785
  throw new BrowserslistError('Unknown version ' + from + ' of electron')
743
786
  }
744
- if (!e2c[to]) {
787
+ if (!e2c[toToUse]) {
745
788
  throw new BrowserslistError('Unknown version ' + to + ' of electron')
746
789
  }
747
790
 
@@ -760,8 +803,8 @@ var QUERIES = [
760
803
  regexp: /^(\w+)\s+([\d.]+)\s*-\s*([\d.]+)$/i,
761
804
  select: function (context, name, from, to) {
762
805
  var data = checkName(name)
763
- from = parseFloat(normalizeVersion(data, from) || from)
764
- to = parseFloat(normalizeVersion(data, to) || to)
806
+ from = parseFloat(normalizeVersion(data, from, context) || from)
807
+ to = parseFloat(normalizeVersion(data, to, context) || to)
765
808
 
766
809
  function filter (v) {
767
810
  var parsed = parseFloat(v)
@@ -774,15 +817,16 @@ var QUERIES = [
774
817
  {
775
818
  regexp: /^electron\s*(>=?|<=?)\s*([\d.]+)$/i,
776
819
  select: function (context, sign, version) {
820
+ var versionToUse = normalizeElectron(version)
777
821
  return Object.keys(e2c)
778
- .filter(generateFilter(sign, version))
822
+ .filter(generateFilter(sign, versionToUse))
779
823
  .map(function (i) {
780
824
  return 'chrome ' + e2c[i]
781
825
  })
782
826
  }
783
827
  },
784
828
  {
785
- regexp: /^node\s*(>=?|<=?)\s*([\d.]+)$/,
829
+ regexp: /^node\s*(>=?|<=?)\s*([\d.]+)$/i,
786
830
  select: function (context, sign, version) {
787
831
  var nodeVersions = jsReleases.filter(function (i) {
788
832
  return i.name === 'nodejs'
@@ -826,7 +870,8 @@ var QUERIES = [
826
870
  {
827
871
  regexp: /^electron\s+([\d.]+)$/i,
828
872
  select: function (context, version) {
829
- var chrome = e2c[version]
873
+ var versionToUse = normalizeElectron(version)
874
+ var chrome = e2c[versionToUse]
830
875
  if (!chrome) {
831
876
  throw new BrowserslistError(
832
877
  'Unknown version ' + version + ' of electron')
@@ -879,7 +924,7 @@ var QUERIES = [
879
924
  select: function (context, name, version) {
880
925
  if (/^tp$/i.test(version)) version = 'TP'
881
926
  var data = checkName(name)
882
- var alias = normalizeVersion(data, version)
927
+ var alias = normalizeVersion(data, version, context)
883
928
  if (alias) {
884
929
  version = alias
885
930
  } else {
@@ -888,7 +933,7 @@ var QUERIES = [
888
933
  } else {
889
934
  alias = version.replace(/\.0$/, '')
890
935
  }
891
- alias = normalizeVersion(data, alias)
936
+ alias = normalizeVersion(data, alias, context)
892
937
  if (alias) {
893
938
  version = alias
894
939
  } else if (context.ignoreUnknownVersions) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browserslist",
3
- "version": "4.5.4",
3
+ "version": "4.6.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,9 +11,9 @@
11
11
  "license": "MIT",
12
12
  "repository": "browserslist/browserslist",
13
13
  "dependencies": {
14
- "caniuse-lite": "^1.0.30000955",
15
- "electron-to-chromium": "^1.3.122",
16
- "node-releases": "^1.1.13"
14
+ "caniuse-lite": "^1.0.30000971",
15
+ "electron-to-chromium": "^1.3.137",
16
+ "node-releases": "^1.1.21"
17
17
  },
18
18
  "bin": "./cli.js",
19
19
  "browser": {