browserslist 4.9.0 → 4.11.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 +12 -0
- package/README.md +1 -1
- package/cli.js +21 -11
- package/index.js +3 -3
- package/node.js +22 -15
- package/package.json +5 -4
- package/update-db.js +134 -0
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
|
+
## 4.11.1
|
|
5
|
+
* FIx Node.js 6 support.
|
|
6
|
+
|
|
7
|
+
## 4.11
|
|
8
|
+
* Add `npx browserslist --mobile-to-desktop` (by James Ross).
|
|
9
|
+
|
|
10
|
+
## 4.10
|
|
11
|
+
* Add `npx browserslist --update-db` (by Ivan Solovev).
|
|
12
|
+
|
|
13
|
+
## 4.9.1
|
|
14
|
+
* Normalize incorrect Can I Use regional data (by Huáng Jùnliàng).
|
|
15
|
+
|
|
4
16
|
## 4.9
|
|
5
17
|
* Add `node X-Y` query support (by Yuping Zuo).
|
|
6
18
|
|
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ not IE_Mob 11
|
|
|
37
37
|
maintained node versions
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
Developers set their version lists using queries like `last 2
|
|
40
|
+
Developers set their version lists using queries like `last 2 versions`
|
|
41
41
|
to be free from updating versions manually.
|
|
42
42
|
Browserslist will use [`caniuse-lite`] with [Can I Use] data for this queries.
|
|
43
43
|
|
package/cli.js
CHANGED
|
@@ -3,19 +3,23 @@
|
|
|
3
3
|
var fs = require('fs')
|
|
4
4
|
|
|
5
5
|
var browserslist = require('./')
|
|
6
|
+
var updateDb = require('./update-db')
|
|
6
7
|
var pkg = require('./package.json')
|
|
8
|
+
|
|
7
9
|
var args = process.argv.slice(2)
|
|
8
10
|
|
|
9
11
|
var USAGE = 'Usage:\n' +
|
|
10
|
-
'
|
|
11
|
-
'
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'
|
|
18
|
-
'
|
|
12
|
+
' npx browserslist\n' +
|
|
13
|
+
' npx browserslist "QUERIES"\n' +
|
|
14
|
+
' npx browserslist --json "QUERIES"\n' +
|
|
15
|
+
' npx browserslist --config="path/to/browserlist/file"\n' +
|
|
16
|
+
' npx browserslist --coverage "QUERIES"\n' +
|
|
17
|
+
' npx browserslist --coverage=US "QUERIES"\n' +
|
|
18
|
+
' npx browserslist --coverage=US,RU,global "QUERIES"\n' +
|
|
19
|
+
' npx browserslist --env="environment name defined in config"\n' +
|
|
20
|
+
' npx browserslist --stats="path/to/browserlist/stats/file"\n' +
|
|
21
|
+
' npx browserslist --mobile-to-desktop\n' +
|
|
22
|
+
' npx browserslist --update-db'
|
|
19
23
|
|
|
20
24
|
function isArg (arg) {
|
|
21
25
|
return args.some(function (str) {
|
|
@@ -24,14 +28,18 @@ function isArg (arg) {
|
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
function error (msg) {
|
|
27
|
-
process.stderr.write(
|
|
31
|
+
process.stderr.write('browserslist: ' + msg + '\n')
|
|
28
32
|
process.exit(1)
|
|
29
33
|
}
|
|
30
34
|
|
|
31
35
|
if (isArg('--help') || isArg('-h')) {
|
|
32
36
|
process.stdout.write(pkg.description + '.\n\n' + USAGE + '\n')
|
|
33
37
|
} else if (isArg('--version') || isArg('-v')) {
|
|
34
|
-
process.stdout.write(
|
|
38
|
+
process.stdout.write('browserslist ' + pkg.version + '\n')
|
|
39
|
+
} else if (isArg('--update-db')) {
|
|
40
|
+
updateDb(function (str) {
|
|
41
|
+
process.stdout.write(str)
|
|
42
|
+
})
|
|
35
43
|
} else {
|
|
36
44
|
var mode = 'browsers'
|
|
37
45
|
var opts = { }
|
|
@@ -65,6 +73,8 @@ if (isArg('--help') || isArg('-h')) {
|
|
|
65
73
|
}
|
|
66
74
|
} else if (name === '--json') {
|
|
67
75
|
mode = 'json'
|
|
76
|
+
} else if (name === '--mobile-to-desktop') {
|
|
77
|
+
opts.mobileToDesktop = true
|
|
68
78
|
} else {
|
|
69
79
|
error('Unknown arguments ' + args[i] + '.\n\n' + USAGE)
|
|
70
80
|
}
|
package/index.js
CHANGED
|
@@ -588,7 +588,7 @@ browserslist.coverage = function (browsers, stats) {
|
|
|
588
588
|
} else {
|
|
589
589
|
stats = stats.toUpperCase()
|
|
590
590
|
}
|
|
591
|
-
env.loadCountry(browserslist.usage, stats)
|
|
591
|
+
env.loadCountry(browserslist.usage, stats, browserslist.data)
|
|
592
592
|
data = browserslist.usage[stats]
|
|
593
593
|
} else {
|
|
594
594
|
if ('dataByBrowser' in stats) {
|
|
@@ -823,7 +823,7 @@ var QUERIES = [
|
|
|
823
823
|
} else {
|
|
824
824
|
place = place.toLowerCase()
|
|
825
825
|
}
|
|
826
|
-
env.loadCountry(browserslist.usage, place)
|
|
826
|
+
env.loadCountry(browserslist.usage, place, browserslist.data)
|
|
827
827
|
var usage = browserslist.usage[place]
|
|
828
828
|
return Object.keys(usage).reduce(function (result, version) {
|
|
829
829
|
if (sign === '>') {
|
|
@@ -866,7 +866,7 @@ var QUERIES = [
|
|
|
866
866
|
} else {
|
|
867
867
|
place = place.toLowerCase()
|
|
868
868
|
}
|
|
869
|
-
env.loadCountry(browserslist.usage, place)
|
|
869
|
+
env.loadCountry(browserslist.usage, place, browserslist.data)
|
|
870
870
|
usage = browserslist.usage[place]
|
|
871
871
|
}
|
|
872
872
|
}
|
package/node.js
CHANGED
|
@@ -137,6 +137,20 @@ function normalizeStats (data, stats) {
|
|
|
137
137
|
return normalized
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
+
function normalizeUsageData (usageData, data) {
|
|
141
|
+
for (var browser in usageData) {
|
|
142
|
+
var browserUsage = usageData[browser]
|
|
143
|
+
// eslint-disable-next-line max-len
|
|
144
|
+
// https://github.com/browserslist/browserslist/issues/431#issuecomment-565230615
|
|
145
|
+
// caniuse-db returns { 0: "percentage" } for `and_*` regional stats
|
|
146
|
+
if ('0' in browserUsage) {
|
|
147
|
+
var versions = data[browser].versions
|
|
148
|
+
browserUsage[versions[versions.length - 1]] = browserUsage[0]
|
|
149
|
+
delete browserUsage[0]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
140
154
|
module.exports = {
|
|
141
155
|
loadQueries: function loadQueries (context, name) {
|
|
142
156
|
if (!context.dangerousExtend) checkExtend(name)
|
|
@@ -201,16 +215,17 @@ module.exports = {
|
|
|
201
215
|
}
|
|
202
216
|
},
|
|
203
217
|
|
|
204
|
-
loadCountry: function loadCountry (usage, country) {
|
|
218
|
+
loadCountry: function loadCountry (usage, country, data) {
|
|
205
219
|
var code = country.replace(/[^\w-]/g, '')
|
|
206
220
|
if (!usage[code]) {
|
|
207
221
|
// eslint-disable-next-line security/detect-non-literal-require
|
|
208
222
|
var compressed = require('caniuse-lite/data/regions/' + code + '.js')
|
|
209
|
-
var
|
|
223
|
+
var usageData = region(compressed)
|
|
224
|
+
normalizeUsageData(usageData, data)
|
|
210
225
|
usage[country] = { }
|
|
211
|
-
for (var i in
|
|
212
|
-
for (var j in
|
|
213
|
-
usage[country][i + ' ' + j] =
|
|
226
|
+
for (var i in usageData) {
|
|
227
|
+
for (var j in usageData[i]) {
|
|
228
|
+
usage[country][i + ' ' + j] = usageData[i][j]
|
|
214
229
|
}
|
|
215
230
|
}
|
|
216
231
|
}
|
|
@@ -327,17 +342,9 @@ module.exports = {
|
|
|
327
342
|
var halfYearAgo = Date.now() - TIME_TO_UPDATE_CANIUSE
|
|
328
343
|
|
|
329
344
|
if (latest !== 0 && latest < halfYearAgo) {
|
|
330
|
-
var command = 'npm update'
|
|
331
|
-
eachParent(__filename, function (dir) {
|
|
332
|
-
var pckg = path.join(dir, 'package.json')
|
|
333
|
-
var yarnLock = path.join(dir, 'yarn.lock')
|
|
334
|
-
if (isFile(pckg) && isFile(yarnLock)) {
|
|
335
|
-
command = 'yarn upgrade'
|
|
336
|
-
}
|
|
337
|
-
})
|
|
338
345
|
console.warn(
|
|
339
|
-
'Browserslist: caniuse-lite is outdated. ' +
|
|
340
|
-
'
|
|
346
|
+
'Browserslist: caniuse-lite is outdated. Please run:\n' +
|
|
347
|
+
'npx browserslist@latest --update-db'
|
|
341
348
|
)
|
|
342
349
|
}
|
|
343
350
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "browserslist",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.11.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",
|
|
@@ -15,9 +15,10 @@
|
|
|
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.30001038",
|
|
19
|
+
"electron-to-chromium": "^1.3.390",
|
|
20
|
+
"node-releases": "^1.1.53",
|
|
21
|
+
"pkg-up": "^2.0.0"
|
|
21
22
|
},
|
|
22
23
|
"bin": "./cli.js",
|
|
23
24
|
"browser": {
|
package/update-db.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
var childProcess = require('child_process')
|
|
2
|
+
var pkgUp = require('pkg-up')
|
|
3
|
+
var path = require('path')
|
|
4
|
+
var fs = require('fs')
|
|
5
|
+
|
|
6
|
+
var BrowserslistError = require('./error')
|
|
7
|
+
|
|
8
|
+
function detectLockfile () {
|
|
9
|
+
var packagePath = pkgUp.sync()
|
|
10
|
+
if (!packagePath) {
|
|
11
|
+
throw new BrowserslistError(
|
|
12
|
+
'Cannot find package.json. ' +
|
|
13
|
+
'Is it a right project to run npx browserslist --update-db?'
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
var rootDir = path.dirname(packagePath)
|
|
18
|
+
var lockfileNpm = path.join(rootDir, 'package-lock.json')
|
|
19
|
+
var lockfileYarn = path.join(rootDir, 'yarn.lock')
|
|
20
|
+
var lockfilePnpm = path.join(rootDir, 'pnpm-lock.yaml')
|
|
21
|
+
|
|
22
|
+
/* istanbul ignore next */
|
|
23
|
+
if (fs.existsSync(lockfilePnpm)) {
|
|
24
|
+
return { mode: 'pnpm', file: lockfilePnpm }
|
|
25
|
+
} else if (fs.existsSync(lockfileNpm)) {
|
|
26
|
+
return { mode: 'npm', file: lockfileNpm }
|
|
27
|
+
} else if (fs.existsSync(lockfileYarn)) {
|
|
28
|
+
return { mode: 'yarn', file: lockfileYarn }
|
|
29
|
+
} else {
|
|
30
|
+
throw new BrowserslistError(
|
|
31
|
+
'No lockfile found. Run "npm install", "yarn install" or "pnpm install"'
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function getCurrentVersion (lock) {
|
|
37
|
+
var match
|
|
38
|
+
/* istanbul ignore if */
|
|
39
|
+
if (lock.mode === 'pnpm') {
|
|
40
|
+
match = /\/caniuse-lite\/([^:]+):/.exec(lock.content)
|
|
41
|
+
if (match[1]) return match[1]
|
|
42
|
+
} else if (lock.mode === 'npm') {
|
|
43
|
+
var dependencies = JSON.parse(lock.content).dependencies
|
|
44
|
+
if (dependencies && dependencies['caniuse-lite']) {
|
|
45
|
+
return dependencies['caniuse-lite'].version
|
|
46
|
+
}
|
|
47
|
+
} else if (lock.mode === 'yarn') {
|
|
48
|
+
match = /caniuse-lite@[^:]+:\n\s+version\s+"([^"]+)"/.exec(lock.content)
|
|
49
|
+
if (match[1]) return match[1]
|
|
50
|
+
}
|
|
51
|
+
return null
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function getLastestInfo () {
|
|
55
|
+
return JSON.parse(
|
|
56
|
+
childProcess.execSync('npm show caniuse-lite --json').toString()
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function updateLockfile (lock, latest) {
|
|
61
|
+
if (lock.mode === 'npm') {
|
|
62
|
+
var fixed = deletePackage(JSON.parse(lock.content))
|
|
63
|
+
return JSON.stringify(fixed, null, ' ')
|
|
64
|
+
} else {
|
|
65
|
+
var lines = lock.content.split('\n')
|
|
66
|
+
var i
|
|
67
|
+
/* istanbul ignore if */
|
|
68
|
+
if (lock.mode === 'pnpm') {
|
|
69
|
+
for (i = 0; i < lines.length; i++) {
|
|
70
|
+
if (lines[i].indexOf('caniuse-lite:') >= 0) {
|
|
71
|
+
lines[i] = lines[i].replace(/: .*$/, ': ' + latest.version)
|
|
72
|
+
} else if (lines[i].indexOf('/caniuse-lite') >= 0) {
|
|
73
|
+
lines[i] = lines[i].replace(/\/[^/:]+:/, '/' + latest.version + ':')
|
|
74
|
+
for (i = i + 1; i < lines.length; i++) {
|
|
75
|
+
if (lines[i].indexOf('integrity: ') !== -1) {
|
|
76
|
+
lines[i] = lines[i].replace(
|
|
77
|
+
/integrity: .+/, 'integrity: ' + latest.dist.integrity
|
|
78
|
+
)
|
|
79
|
+
} else if (lines[i].indexOf(' /') !== -1) {
|
|
80
|
+
break
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} else if (lock.mode === 'yarn') {
|
|
86
|
+
for (i = 0; i < lines.length; i++) {
|
|
87
|
+
if (lines[i].indexOf('caniuse-lite@') !== -1) {
|
|
88
|
+
lines[i + 1] = lines[i + 1].replace(
|
|
89
|
+
/version "[^"]+"/, 'version "' + latest.version + '"'
|
|
90
|
+
)
|
|
91
|
+
lines[i + 2] = lines[i + 2].replace(
|
|
92
|
+
/resolved "[^"]+"/, 'resolved "' + latest.dist.tarball + '"'
|
|
93
|
+
)
|
|
94
|
+
lines[i + 3] = lines[i + 3].replace(
|
|
95
|
+
/integrity .+/, 'integrity ' + latest.dist.integrity
|
|
96
|
+
)
|
|
97
|
+
i += 4
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return lines.join('\n')
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function deletePackage (node) {
|
|
106
|
+
if (node.dependencies) {
|
|
107
|
+
delete node.dependencies['caniuse-lite']
|
|
108
|
+
for (var i in node.dependencies) {
|
|
109
|
+
node.dependencies[i] = deletePackage(node.dependencies[i])
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return node
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = function updateDB (print) {
|
|
116
|
+
var lock = detectLockfile()
|
|
117
|
+
lock.content = fs.readFileSync(lock.file).toString()
|
|
118
|
+
|
|
119
|
+
var current = getCurrentVersion(lock)
|
|
120
|
+
var latest = getLastestInfo()
|
|
121
|
+
|
|
122
|
+
if (typeof current === 'string') {
|
|
123
|
+
print('Current version: ' + current + '\n')
|
|
124
|
+
}
|
|
125
|
+
print(
|
|
126
|
+
'New version: ' + latest.version + '\n' +
|
|
127
|
+
'Updating caniuse-lite…\n'
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
fs.writeFileSync(lock.file, updateLockfile(lock, latest))
|
|
131
|
+
childProcess.execSync(lock.mode + ' install')
|
|
132
|
+
|
|
133
|
+
print('caniuse-lite has been successfully updated')
|
|
134
|
+
}
|