browserslist 4.7.3 → 4.8.3
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 +14 -0
- package/README.md +28 -19
- package/index.js +123 -53
- package/node.js +41 -23
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
3
3
|
|
|
4
|
+
## 4.8.3
|
|
5
|
+
* Fix warning message (by Anton Ivanov).
|
|
6
|
+
|
|
7
|
+
## 4.8.2
|
|
8
|
+
* Fix `Cannot convert undefined or null to object` (by Antoine Clausse).
|
|
9
|
+
* Fix `mobileToDesktop` in `defaults` (by Huáng Jùnliàng).
|
|
10
|
+
|
|
11
|
+
## 4.8.1
|
|
12
|
+
* Fix Chrome and `mobileToDesktop` (by Huáng Jùnliàng).
|
|
13
|
+
|
|
14
|
+
## 4.8
|
|
15
|
+
* Add `> 5% in browserslist-config-my stats` query (by Andrew Leedham).
|
|
16
|
+
* Improve docs (by Danny van Kooten).
|
|
17
|
+
|
|
4
18
|
## 4.7.3
|
|
5
19
|
* Add funding link for `npm fund`.
|
|
6
20
|
|
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
|
-
"
|
|
23
|
-
"
|
|
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
|
-
|
|
35
|
-
|
|
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
|
|
@@ -80,6 +81,8 @@ Browserslist will take queries from tool option,
|
|
|
80
81
|
|
|
81
82
|
## Tools
|
|
82
83
|
|
|
84
|
+
* [`browserl.ist`](https://browserl.ist/) is an online tool to check
|
|
85
|
+
what browsers will be selected by some query.
|
|
83
86
|
* [`browserslist-ga`] and [`browserslist-ga-export`] download your website
|
|
84
87
|
browsers statistics to use it in `> 0.5% in my stats` query.
|
|
85
88
|
* [`browserslist-useragent-regexp`] compiles Browserslist query to a RegExp
|
|
@@ -104,10 +107,6 @@ Browserslist will take queries from tool option,
|
|
|
104
107
|
|
|
105
108
|
## Best Practices
|
|
106
109
|
|
|
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
110
|
* There is a `defaults` query, which gives a reasonable configuration
|
|
112
111
|
for most users:
|
|
113
112
|
|
|
@@ -118,12 +117,16 @@ Browserslist will take queries from tool option,
|
|
|
118
117
|
```
|
|
119
118
|
|
|
120
119
|
* If you want to change the default set of browsers we recommend to combine
|
|
121
|
-
`last
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
120
|
+
`last 2 versions`, `not dead` with a usage number like `> 0.2%`. This is
|
|
121
|
+
because `last n versions` on its own does not add popular old versions while
|
|
122
|
+
only using a percentage above `0.2%` will in the long run make popular
|
|
123
|
+
browsers even more popular. We might run into a monopoly and stagnation
|
|
124
|
+
situation, as we had with Internet Explorer 6. Please use this setting
|
|
125
|
+
with caution.
|
|
126
|
+
* Select browsers directly (`last 2 Chrome versions`) only if you are making
|
|
127
|
+
a web app for a kiosk with one browser. There are a lot of browsers
|
|
128
|
+
on the market. If you are making general web app you should respect
|
|
129
|
+
browsers diversity.
|
|
127
130
|
* Don’t remove browsers just because you don’t know them. Opera Mini has
|
|
128
131
|
100 million users in Africa and it is more popular in the global market
|
|
129
132
|
than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox
|
|
@@ -173,12 +176,16 @@ in your terminal._
|
|
|
173
176
|
|
|
174
177
|
You can specify the browser and Node.js versions by queries (case insensitive):
|
|
175
178
|
|
|
179
|
+
* `defaults`: Browserslist’s default browsers
|
|
180
|
+
(`> 0.5%, last 2 versions, Firefox ESR, not dead`).
|
|
176
181
|
* `> 5%`: browsers versions selected by global usage statistics.
|
|
177
182
|
`>=`, `<` and `<=` work too.
|
|
178
183
|
* `> 5% in US`: uses USA usage statistics. It accepts [two-letter country code].
|
|
179
184
|
* `> 5% in alt-AS`: uses Asia region usage statistics. List of all region codes
|
|
180
185
|
can be found at [`caniuse-lite/data/regions`].
|
|
181
186
|
* `> 5% in my stats`: uses [custom usage data].
|
|
187
|
+
* `> 5% in browserslist-config-mycompany stats`: uses [custom usage data]
|
|
188
|
+
from `browserslist-config-mycompany/browserslist-stats.json`.
|
|
182
189
|
* `cover 99.5%`: most popular browsers that provide coverage.
|
|
183
190
|
* `cover 99.5% in US`: same as above, with [two-letter country code].
|
|
184
191
|
* `cover 99.5% in my stats`: uses [custom usage data].
|
|
@@ -207,8 +214,6 @@ You can specify the browser and Node.js versions by queries (case insensitive):
|
|
|
207
214
|
`Samsung 4` and `OperaMobile 12.1`.
|
|
208
215
|
* `last 2 versions`: the last 2 versions for *each* browser.
|
|
209
216
|
* `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
217
|
* `not ie <= 8`: exclude browsers selected by previous queries.
|
|
213
218
|
|
|
214
219
|
You can add `not ` to any query.
|
|
@@ -357,6 +362,10 @@ module.exports = [
|
|
|
357
362
|
]
|
|
358
363
|
```
|
|
359
364
|
|
|
365
|
+
You can also include a `browserslist-stats.json` file as part of your shareable
|
|
366
|
+
config at the root and query it using `> 5% in browserslist-config-mycompany stats`.
|
|
367
|
+
It uses the same format as `extends` and the `dangerousExtend` property as above.
|
|
368
|
+
|
|
360
369
|
|
|
361
370
|
## Configuring for Different Environments
|
|
362
371
|
|
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
|
|
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
|
|
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
|
|
195
|
-
var
|
|
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 -
|
|
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
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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+
|
|
387
|
-
var and = /^\s+
|
|
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')
|
|
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')
|
|
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')
|
|
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')
|
|
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
|
|
786
|
-
to = parseFloat(normalizeVersion(data, 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
|
|
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
|
|
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
|
|
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*\[(.+)
|
|
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) {
|
|
@@ -319,7 +337,7 @@ module.exports = {
|
|
|
319
337
|
})
|
|
320
338
|
console.warn(
|
|
321
339
|
'Browserslist: caniuse-lite is outdated. ' +
|
|
322
|
-
'Please run
|
|
340
|
+
'Please run the following command: `' + command + '`'
|
|
323
341
|
)
|
|
324
342
|
}
|
|
325
343
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "browserslist",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.8.3",
|
|
4
4
|
"description": "Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"caniuse",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"repository": "browserslist/browserslist",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"caniuse-lite": "^1.0.
|
|
19
|
-
"electron-to-chromium": "^1.3.
|
|
20
|
-
"node-releases": "^1.1.
|
|
18
|
+
"caniuse-lite": "^1.0.30001017",
|
|
19
|
+
"electron-to-chromium": "^1.3.322",
|
|
20
|
+
"node-releases": "^1.1.44"
|
|
21
21
|
},
|
|
22
22
|
"bin": "./cli.js",
|
|
23
23
|
"browser": {
|