browserslist 4.7.2 → 4.8.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 (5) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +26 -19
  3. package/index.js +123 -53
  4. package/node.js +40 -22
  5. package/package.json +9 -5
package/CHANGELOG.md CHANGED
@@ -1,9 +1,24 @@
1
1
  # Change Log
2
2
  This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
+ ## 4.8.2
5
+ * Fix `Cannot convert undefined or null to object` (by Antoine Clausse).
6
+ * Fix `mobileToDesktop` in `defaults` (by Huáng Jùnliàng).
7
+
8
+ ## 4.8.1
9
+ * Fix Chrome and `mobileToDesktop` (by Huáng Jùnliàng).
10
+
11
+ ## 4.8
12
+ * Add `> 5% in browserslist-config-my stats` query (by Andrew Leedham).
13
+ * Improve docs (by Danny van Kooten).
14
+
15
+ ## 4.7.3
16
+ * Add funding link for `npm fund`.
17
+
4
18
  ## 4.7.2
5
19
  * Add cache for query parsing.
6
20
  * Improve config caching (by Kārlis Gaņģis).
21
+ * Update Firefox ESR.
7
22
 
8
23
  ## 4.7.1
9
24
  * Improve caching.
package/README.md CHANGED
@@ -19,10 +19,10 @@ when you add the following to `package.json`:
19
19
 
20
20
  ```js
21
21
  "browserslist": [
22
- "last 1 version",
23
- "> 1%",
22
+ "defaults",
23
+ "not IE 11",
24
+ "not IE_Mob 11",
24
25
  "maintained node versions",
25
- "not dead"
26
26
  ]
27
27
  ```
28
28
 
@@ -31,15 +31,15 @@ Or in `.browserslistrc` config:
31
31
  ```yaml
32
32
  # Browsers that we support
33
33
 
34
- last 1 version
35
- > 1%
34
+ defaults
35
+ not IE 11
36
+ not IE_Mob 11
36
37
  maintained node versions
37
- not dead
38
38
  ```
39
39
 
40
40
  Developers set versions list in queries like `last 2 version`
41
41
  to be free from updating versions manually.
42
- Browserslist will use [Can I Use] data for this queries.
42
+ Browserslist will use [`caniuse-lite`] with [Can I Use] data for this queries.
43
43
 
44
44
  Browserslist will take queries from tool option,
45
45
  `browserslist` config, `.browserslistrc` config,
@@ -60,6 +60,7 @@ Browserslist will take queries from tool option,
60
60
  [Browserslist Example]: https://github.com/browserslist/browserslist-example
61
61
  [postcss-preset-env]: https://github.com/jonathantneal/postcss-preset-env
62
62
  [postcss-normalize]: https://github.com/jonathantneal/postcss-normalize
63
+ [`caniuse-lite`]: https://github.com/ben-eb/caniuse-lite
63
64
  [Autoprefixer]: https://github.com/postcss/autoprefixer
64
65
  [Can I Use]: https://caniuse.com/
65
66
  [Babel]: https://github.com/babel/babel/tree/master/packages/babel-preset-env
@@ -104,10 +105,6 @@ Browserslist will take queries from tool option,
104
105
 
105
106
  ## Best Practices
106
107
 
107
- * Select browsers directly (`last 2 Chrome versions`) only if you are making
108
- a web app for a kiosk with one browser. There are a lot of browsers
109
- on the market. If you are making general web app you should respect
110
- browsers diversity.
111
108
  * There is a `defaults` query, which gives a reasonable configuration
112
109
  for most users:
113
110
 
@@ -118,12 +115,16 @@ Browserslist will take queries from tool option,
118
115
  ```
119
116
 
120
117
  * If you want to change the default set of browsers we recommend to combine
121
- `last 1 version`, `not dead` with `> 0.2%` (or `> 1% in US`,
122
- `> 1% in my stats`). `last n versions` adds too many dead browsers
123
- and does not add popular old versions. Choosing a percentage above `0.2%`
124
- will in the long run make popular browsers even more popular. We might run
125
- into a monopoly and stagnation situation, as we had with Internet Explorer 6.
126
- Please use this setting with caution.
118
+ `last 2 versions`, `not dead` with a usage number like `> 0.2%`. This is
119
+ because `last n versions` on its own does not add popular old versions while
120
+ only using a percentage above `0.2%` will in the long run make popular
121
+ browsers even more popular. We might run into a monopoly and stagnation
122
+ situation, as we had with Internet Explorer 6. Please use this setting
123
+ with caution.
124
+ * Select browsers directly (`last 2 Chrome versions`) only if you are making
125
+ a web app for a kiosk with one browser. There are a lot of browsers
126
+ on the market. If you are making general web app you should respect
127
+ browsers diversity.
127
128
  * Don’t remove browsers just because you don’t know them. Opera Mini has
128
129
  100 million users in Africa and it is more popular in the global market
129
130
  than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox
@@ -173,12 +174,16 @@ in your terminal._
173
174
 
174
175
  You can specify the browser and Node.js versions by queries (case insensitive):
175
176
 
177
+ * `defaults`: Browserslist’s default browsers
178
+ (`> 0.5%, last 2 versions, Firefox ESR, not dead`).
176
179
  * `> 5%`: browsers versions selected by global usage statistics.
177
180
  `>=`, `<` and `<=` work too.
178
181
  * `> 5% in US`: uses USA usage statistics. It accepts [two-letter country code].
179
182
  * `> 5% in alt-AS`: uses Asia region usage statistics. List of all region codes
180
183
  can be found at [`caniuse-lite/data/regions`].
181
184
  * `> 5% in my stats`: uses [custom usage data].
185
+ * `> 5% in browserslist-config-mycompany stats`: uses [custom usage data]
186
+ from `browserslist-config-mycompany/browserslist-stats.json`.
182
187
  * `cover 99.5%`: most popular browsers that provide coverage.
183
188
  * `cover 99.5% in US`: same as above, with [two-letter country code].
184
189
  * `cover 99.5% in my stats`: uses [custom usage data].
@@ -207,8 +212,6 @@ You can specify the browser and Node.js versions by queries (case insensitive):
207
212
  `Samsung 4` and `OperaMobile 12.1`.
208
213
  * `last 2 versions`: the last 2 versions for *each* browser.
209
214
  * `last 2 Chrome versions`: the last 2 versions of Chrome browser.
210
- * `defaults`: Browserslist’s default browsers
211
- (`> 0.5%, last 2 versions, Firefox ESR, not dead`).
212
215
  * `not ie <= 8`: exclude browsers selected by previous queries.
213
216
 
214
217
  You can add `not ` to any query.
@@ -357,6 +360,10 @@ module.exports = [
357
360
  ]
358
361
  ```
359
362
 
363
+ You can also include a `browserslist-stats.json` file as part of your shareable
364
+ config at the root and query it using `> 5% in browserslist-config-mycompany stats`.
365
+ It uses the same format as `extends` and the `dangerousExtend` property as above.
366
+
360
367
 
361
368
  ## Configuring for Different Environments
362
369
 
package/index.js CHANGED
@@ -7,8 +7,8 @@ var e2c = require('electron-to-chromium/versions')
7
7
  var BrowserslistError = require('./error')
8
8
  var env = require('./node') // Will load browser.js in webpack
9
9
 
10
- var FLOAT_RANGE = /^\d+(\.\d+)?(-\d+(\.\d+)?)*$/
11
10
  var YEAR = 365.259641 * 24 * 60 * 60 * 1000
11
+ var ANDROID_EVERGREEN_FIRST = 37
12
12
 
13
13
  var QUERY_OR = 1
14
14
  var QUERY_AND = 2
@@ -138,9 +138,9 @@ function compare (a, b) {
138
138
 
139
139
  function compareSemver (a, b) {
140
140
  return (
141
- compare(a[0], b[0]) ||
142
- compare(a[1], b[1]) ||
143
- compare(a[2], b[2])
141
+ compare(parseInt(a[0]), parseInt(b[0])) ||
142
+ compare(parseInt(a[1] || '0'), parseInt(b[1] || '0')) ||
143
+ compare(parseInt(a[2] || '0'), parseInt(b[2] || '0'))
144
144
  )
145
145
  }
146
146
 
@@ -154,16 +154,8 @@ function resolveVersion (data, version) {
154
154
  }
155
155
  }
156
156
 
157
- function normalizeVersion (data, version, context) {
157
+ function normalizeVersion (data, version) {
158
158
  var resolved = resolveVersion(data, version)
159
- if (
160
- !resolved &&
161
- context.mobileToDesktop &&
162
- browserslist.desktopNames[data.name]
163
- ) {
164
- var alias = checkName(browserslist.desktopNames[data.name])
165
- resolved = resolveVersion(alias, version)
166
- }
167
159
  if (resolved) {
168
160
  return resolved
169
161
  } else if (data.versions.length === 1) {
@@ -173,10 +165,10 @@ function normalizeVersion (data, version, context) {
173
165
  }
174
166
  }
175
167
 
176
- function filterByYear (since) {
168
+ function filterByYear (since, context) {
177
169
  since = since / 1000
178
170
  return Object.keys(agents).reduce(function (selected, name) {
179
- var data = byName(name)
171
+ var data = byName(name, context)
180
172
  if (!data) return selected
181
173
  var versions = Object.keys(data.releaseDate).filter(function (v) {
182
174
  return data.releaseDate[v] >= since
@@ -185,14 +177,47 @@ function filterByYear (since) {
185
177
  }, [])
186
178
  }
187
179
 
188
- function byName (name) {
180
+ function cloneData (data) {
181
+ return {
182
+ name: data.name,
183
+ versions: data.versions,
184
+ released: data.released,
185
+ releaseDate: data.releaseDate
186
+ }
187
+ }
188
+
189
+ function byName (name, context) {
189
190
  name = name.toLowerCase()
190
191
  name = browserslist.aliases[name] || name
192
+ if (context.mobileToDesktop && browserslist.desktopNames[name]) {
193
+ var desktop = browserslist.data[browserslist.desktopNames[name]]
194
+ if (name === 'android') {
195
+ return normalizeAndroidData(cloneData(browserslist.data[name]), desktop)
196
+ } else {
197
+ var cloned = cloneData(desktop)
198
+ cloned.name = name
199
+ return cloned
200
+ }
201
+ }
191
202
  return browserslist.data[name]
192
203
  }
193
204
 
194
- function checkName (name) {
195
- var data = byName(name)
205
+ function normalizeAndroidVersions (androidVersions, chromeVersions) {
206
+ var firstEvergreen = ANDROID_EVERGREEN_FIRST
207
+ var last = chromeVersions[chromeVersions.length - 1]
208
+ return androidVersions
209
+ .filter(function (version) { return /^(?:[2-4]\.|[34]$)/.test(version) })
210
+ .concat(chromeVersions.slice(firstEvergreen - last - 1))
211
+ }
212
+
213
+ function normalizeAndroidData (android, chrome) {
214
+ android.released = normalizeAndroidVersions(android.released, chrome.released)
215
+ android.versions = normalizeAndroidVersions(android.versions, chrome.versions)
216
+ return android
217
+ }
218
+
219
+ function checkName (name, context) {
220
+ var data = byName(name, context)
196
221
  if (!data) throw new BrowserslistError('Unknown browser ' + name)
197
222
  return data
198
223
  }
@@ -204,11 +229,11 @@ function unknownQuery (query) {
204
229
  )
205
230
  }
206
231
 
207
- function filterAndroid (list, versions) {
232
+ function filterAndroid (list, versions, context) {
233
+ if (context.mobileToDesktop) return list
208
234
  var released = browserslist.data.android.released
209
- var firstEvergreen = 37
210
235
  var last = released[released.length - 1]
211
- var diff = last - firstEvergreen - versions // First Android Evergreen
236
+ var diff = last - ANDROID_EVERGREEN_FIRST - versions
212
237
  if (diff > 0) {
213
238
  return list.slice(-1)
214
239
  } else {
@@ -252,7 +277,7 @@ function resolve (queries, context) {
252
277
  var array = type.select.apply(browserslist, args).map(function (j) {
253
278
  var parts = j.split(' ')
254
279
  if (parts[1] === '0') {
255
- return parts[0] + ' ' + byName(parts[0]).versions[0]
280
+ return parts[0] + ' ' + byName(parts[0], context).versions[0]
256
281
  } else {
257
282
  return j
258
283
  }
@@ -359,11 +384,12 @@ function browserslist (queries, opts) {
359
384
  name1 = name1.split(' ')
360
385
  name2 = name2.split(' ')
361
386
  if (name1[0] === name2[0]) {
362
- if (FLOAT_RANGE.test(name1[1]) && FLOAT_RANGE.test(name2[1])) {
363
- return parseFloat(name2[1]) - parseFloat(name1[1])
364
- } else {
365
- return compare(name2[1], name1[1])
366
- }
387
+ // assumptions on caniuse data
388
+ // 1) version ranges never overlaps
389
+ // 2) if version is not a range, it never contains `-`
390
+ var version1 = name1[1].split('-')[0]
391
+ var version2 = name2[1].split('-')[0]
392
+ return compareSemver(version2.split('.'), version1.split('.'))
367
393
  } else {
368
394
  return compare(name1[0], name2[0])
369
395
  }
@@ -383,8 +409,8 @@ function parse (queries) {
383
409
  }
384
410
 
385
411
  function doMatch (string, qs) {
386
- var or = /^(?:,\s*|\s+OR\s+)(.*)/i
387
- var and = /^\s+AND\s+(.*)/i
412
+ var or = /^(?:,\s*|\s+or\s+)(.*)/i
413
+ var and = /^\s+and\s+(.*)/i
388
414
 
389
415
  return find(string, function (parsed, n, max) {
390
416
  if (and.test(parsed)) {
@@ -455,7 +481,8 @@ browserslist.desktopNames = {
455
481
  and_chr: 'chrome',
456
482
  and_ff: 'firefox',
457
483
  ie_mob: 'ie',
458
- op_mob: 'opera'
484
+ op_mob: 'opera',
485
+ android: 'chrome' // has extra processing logic
459
486
  }
460
487
 
461
488
  // Aliases to work with joined versions like `ios_saf 7.0-7.1`
@@ -530,11 +557,13 @@ var QUERIES = [
530
557
  regexp: /^last\s+(\d+)\s+major\s+versions?$/i,
531
558
  select: function (context, versions) {
532
559
  return Object.keys(agents).reduce(function (selected, name) {
533
- var data = byName(name)
560
+ var data = byName(name, context)
534
561
  if (!data) return selected
535
562
  var list = getMajorVersions(data.released, versions)
536
563
  list = list.map(nameMapper(data.name))
537
- if (data.name === 'android') list = filterAndroid(list, versions)
564
+ if (data.name === 'android') {
565
+ list = filterAndroid(list, versions, context)
566
+ }
538
567
  return selected.concat(list)
539
568
  }, [])
540
569
  }
@@ -543,11 +572,13 @@ var QUERIES = [
543
572
  regexp: /^last\s+(\d+)\s+versions?$/i,
544
573
  select: function (context, versions) {
545
574
  return Object.keys(agents).reduce(function (selected, name) {
546
- var data = byName(name)
575
+ var data = byName(name, context)
547
576
  if (!data) return selected
548
577
  var list = data.released.slice(-versions)
549
578
  list = list.map(nameMapper(data.name))
550
- if (data.name === 'android') list = filterAndroid(list, versions)
579
+ if (data.name === 'android') {
580
+ list = filterAndroid(list, versions, context)
581
+ }
551
582
  return selected.concat(list)
552
583
  }, [])
553
584
  }
@@ -564,10 +595,12 @@ var QUERIES = [
564
595
  {
565
596
  regexp: /^last\s+(\d+)\s+(\w+)\s+major\s+versions?$/i,
566
597
  select: function (context, versions, name) {
567
- var data = checkName(name)
598
+ var data = checkName(name, context)
568
599
  var validVersions = getMajorVersions(data.released, versions)
569
600
  var list = validVersions.map(nameMapper(data.name))
570
- if (data.name === 'android') list = filterAndroid(list, versions)
601
+ if (data.name === 'android') {
602
+ list = filterAndroid(list, versions, context)
603
+ }
571
604
  return list
572
605
  }
573
606
  },
@@ -582,17 +615,19 @@ var QUERIES = [
582
615
  {
583
616
  regexp: /^last\s+(\d+)\s+(\w+)\s+versions?$/i,
584
617
  select: function (context, versions, name) {
585
- var data = checkName(name)
618
+ var data = checkName(name, context)
586
619
  var list = data.released.slice(-versions).map(nameMapper(data.name))
587
- if (data.name === 'android') list = filterAndroid(list, versions)
620
+ if (data.name === 'android') {
621
+ list = filterAndroid(list, versions, context)
622
+ }
588
623
  return list
589
624
  }
590
625
  },
591
626
  {
592
627
  regexp: /^unreleased\s+versions$/i,
593
- select: function () {
628
+ select: function (context) {
594
629
  return Object.keys(agents).reduce(function (selected, name) {
595
- var data = byName(name)
630
+ var data = byName(name, context)
596
631
  if (!data) return selected
597
632
  var list = data.versions.filter(function (v) {
598
633
  return data.released.indexOf(v) === -1
@@ -611,7 +646,7 @@ var QUERIES = [
611
646
  {
612
647
  regexp: /^unreleased\s+(\w+)\s+versions?$/i,
613
648
  select: function (context, name) {
614
- var data = checkName(name)
649
+ var data = checkName(name, context)
615
650
  return data.versions.filter(function (v) {
616
651
  return data.released.indexOf(v) === -1
617
652
  }).map(nameMapper(data.name))
@@ -620,7 +655,7 @@ var QUERIES = [
620
655
  {
621
656
  regexp: /^last\s+(\d*.?\d+)\s+years?$/i,
622
657
  select: function (context, years) {
623
- return filterByYear(Date.now() - YEAR * years)
658
+ return filterByYear(Date.now() - YEAR * years, context)
624
659
  }
625
660
  },
626
661
  {
@@ -629,7 +664,7 @@ var QUERIES = [
629
664
  year = parseInt(year)
630
665
  month = parseInt(month || '01') - 1
631
666
  date = parseInt(date || '01')
632
- return filterByYear(Date.UTC(year, month, date, 0, 0, 0))
667
+ return filterByYear(Date.UTC(year, month, date, 0, 0, 0), context)
633
668
  }
634
669
  },
635
670
  {
@@ -685,6 +720,41 @@ var QUERIES = [
685
720
  }, [])
686
721
  }
687
722
  },
723
+ {
724
+ regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%\s+in\s+(\S+)\s+stats$/,
725
+ select: function (context, sign, popularity, name) {
726
+ popularity = parseFloat(popularity)
727
+ var stats = env.loadStat(context, name, browserslist.data)
728
+ if (stats) {
729
+ context.customUsage = { }
730
+ for (var browser in stats) {
731
+ fillUsage(context.customUsage, browser, stats[browser])
732
+ }
733
+ }
734
+ if (!context.customUsage) {
735
+ throw new BrowserslistError('Custom usage statistics was not provided')
736
+ }
737
+ var usage = context.customUsage
738
+ return Object.keys(usage).reduce(function (result, version) {
739
+ if (sign === '>') {
740
+ if (usage[version] > popularity) {
741
+ result.push(version)
742
+ }
743
+ } else if (sign === '<') {
744
+ if (usage[version] < popularity) {
745
+ result.push(version)
746
+ }
747
+ } else if (sign === '<=') {
748
+ if (usage[version] <= popularity) {
749
+ result.push(version)
750
+ }
751
+ } else if (usage[version] >= popularity) {
752
+ result.push(version)
753
+ }
754
+ return result
755
+ }, [])
756
+ }
757
+ },
688
758
  {
689
759
  regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%\s+in\s+((alt-)?\w\w)$/,
690
760
  select: function (context, sign, popularity, place) {
@@ -781,9 +851,9 @@ var QUERIES = [
781
851
  {
782
852
  regexp: /^(\w+)\s+([\d.]+)\s*-\s*([\d.]+)$/i,
783
853
  select: function (context, name, from, to) {
784
- var data = checkName(name)
785
- from = parseFloat(normalizeVersion(data, from, context) || from)
786
- to = parseFloat(normalizeVersion(data, to, context) || to)
854
+ var data = checkName(name, context)
855
+ from = parseFloat(normalizeVersion(data, from) || from)
856
+ to = parseFloat(normalizeVersion(data, to) || to)
787
857
  function filter (v) {
788
858
  var parsed = parseFloat(v)
789
859
  return parsed >= from && parsed <= to
@@ -820,7 +890,7 @@ var QUERIES = [
820
890
  {
821
891
  regexp: /^(\w+)\s*(>=?|<=?)\s*([\d.]+)$/,
822
892
  select: function (context, name, sign, version) {
823
- var data = checkName(name)
893
+ var data = checkName(name, context)
824
894
  var alias = browserslist.versionAliases[data.name][version]
825
895
  if (alias) {
826
896
  version = alias
@@ -912,8 +982,8 @@ var QUERIES = [
912
982
  regexp: /^(\w+)\s+(tp|[\d.]+)$/i,
913
983
  select: function (context, name, version) {
914
984
  if (/^tp$/i.test(version)) version = 'TP'
915
- var data = checkName(name)
916
- var alias = normalizeVersion(data, version, context)
985
+ var data = checkName(name, context)
986
+ var alias = normalizeVersion(data, version)
917
987
  if (alias) {
918
988
  version = alias
919
989
  } else {
@@ -922,7 +992,7 @@ var QUERIES = [
922
992
  } else {
923
993
  alias = version.replace(/\.0$/, '')
924
994
  }
925
- alias = normalizeVersion(data, alias, context)
995
+ alias = normalizeVersion(data, alias)
926
996
  if (alias) {
927
997
  version = alias
928
998
  } else if (context.ignoreUnknownVersions) {
@@ -943,8 +1013,8 @@ var QUERIES = [
943
1013
  },
944
1014
  {
945
1015
  regexp: /^defaults$/i,
946
- select: function () {
947
- return browserslist(browserslist.defaults)
1016
+ select: function (context) {
1017
+ return resolve(browserslist.defaults, context)
948
1018
  }
949
1019
  },
950
1020
  {
@@ -962,7 +1032,7 @@ var QUERIES = [
962
1032
  {
963
1033
  regexp: /^(\w+)$/i,
964
1034
  select: function (context, name) {
965
- if (byName(name)) {
1035
+ if (byName(name, context)) {
966
1036
  throw new BrowserslistError(
967
1037
  'Specify versions in Browserslist query for browser ' + name)
968
1038
  } else {
package/node.js CHANGED
@@ -4,7 +4,7 @@ var fs = require('fs')
4
4
 
5
5
  var BrowserslistError = require('./error')
6
6
 
7
- var IS_SECTION = /^\s*\[(.+)\]\s*$/
7
+ var IS_SECTION = /^\s*\[(.+)]\s*$/
8
8
  var CONFIG_PATTERN = /^browserslist-config-/
9
9
  var SCOPED_CONFIG__PATTERN = /@[^/]+\/browserslist-config(-|$|\/)/
10
10
  var TIME_TO_UPDATE_CANIUSE = 6 * 30 * 24 * 60 * 60 * 1000
@@ -111,6 +111,32 @@ function latestReleaseTime (agents) {
111
111
  return latest * 1000
112
112
  }
113
113
 
114
+ function normalizeStats (data, stats) {
115
+ if (stats && 'dataByBrowser' in stats) {
116
+ stats = stats.dataByBrowser
117
+ }
118
+
119
+ if (typeof stats !== 'object') return undefined
120
+
121
+ var normalized = { }
122
+ for (var i in stats) {
123
+ var versions = Object.keys(stats[i])
124
+ if (
125
+ versions.length === 1 &&
126
+ data[i] &&
127
+ data[i].versions.length === 1
128
+ ) {
129
+ var normal = Object.keys(data[i].versions)[0]
130
+ normalized[i] = { }
131
+ normalized[i][normal] = stats[i][versions[0]]
132
+ } else {
133
+ normalized[i] = stats[i]
134
+ }
135
+ }
136
+
137
+ return normalized
138
+ }
139
+
114
140
  module.exports = {
115
141
  loadQueries: function loadQueries (context, name) {
116
142
  if (!context.dangerousExtend) checkExtend(name)
@@ -124,6 +150,18 @@ module.exports = {
124
150
  return queries
125
151
  },
126
152
 
153
+ loadStat: function loadStat (context, name, data) {
154
+ if (!context.dangerousExtend) checkExtend(name)
155
+ // eslint-disable-next-line security/detect-non-literal-require
156
+ var stats = require(
157
+ require.resolve(
158
+ path.join(name, 'browserslist-stats.json'),
159
+ { paths: ['.'] }
160
+ )
161
+ )
162
+ return normalizeStats(data, stats)
163
+ },
164
+
127
165
  getStat: function getStat (opts, data) {
128
166
  var stats
129
167
  if (opts.stats) {
@@ -136,7 +174,6 @@ module.exports = {
136
174
  return isFile(file) ? file : undefined
137
175
  })
138
176
  }
139
-
140
177
  if (typeof stats === 'string') {
141
178
  try {
142
179
  stats = JSON.parse(fs.readFileSync(stats))
@@ -144,26 +181,7 @@ module.exports = {
144
181
  throw new BrowserslistError('Can\'t read ' + stats)
145
182
  }
146
183
  }
147
-
148
- if (stats && 'dataByBrowser' in stats) {
149
- stats = stats.dataByBrowser
150
- }
151
-
152
- if (typeof stats !== 'object') return undefined
153
-
154
- var normalized = { }
155
- for (var i in stats) {
156
- var versions = Object.keys(stats[i])
157
- if (versions.length === 1 && data[i] && data[i].versions.length === 1) {
158
- var normal = Object.keys(data[i].versions)[0]
159
- normalized[i] = { }
160
- normalized[i][normal] = stats[i][versions[0]]
161
- } else {
162
- normalized[i] = stats[i]
163
- }
164
- }
165
-
166
- return normalized
184
+ return normalizeStats(data, stats)
167
185
  },
168
186
 
169
187
  loadConfig: function loadConfig (opts) {
package/package.json CHANGED
@@ -1,19 +1,23 @@
1
1
  {
2
2
  "name": "browserslist",
3
- "version": "4.7.2",
3
+ "version": "4.8.2",
4
4
  "description": "Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset",
5
5
  "keywords": [
6
6
  "caniuse",
7
7
  "browsers",
8
8
  "target"
9
9
  ],
10
+ "funding": {
11
+ "type": "tidelift",
12
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
13
+ },
10
14
  "author": "Andrey Sitnik <andrey@sitnik.ru>",
11
15
  "license": "MIT",
12
16
  "repository": "browserslist/browserslist",
13
17
  "dependencies": {
14
- "caniuse-lite": "^1.0.30001004",
15
- "electron-to-chromium": "^1.3.295",
16
- "node-releases": "^1.1.38"
18
+ "caniuse-lite": "^1.0.30001015",
19
+ "electron-to-chromium": "^1.3.322",
20
+ "node-releases": "^1.1.42"
17
21
  },
18
22
  "bin": "./cli.js",
19
23
  "browser": {
@@ -25,6 +29,6 @@
25
29
  ],
26
30
  "sharec": {
27
31
  "config": "@logux/sharec-config",
28
- "version": "0.5.4"
32
+ "version": "0.5.6"
29
33
  }
30
34
  }