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 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 version`
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
- ' ' + pkg.name + '\n' +
11
- ' ' + pkg.name + ' "QUERIES"\n' +
12
- ' ' + pkg.name + ' --json "QUERIES"\n' +
13
- ' ' + pkg.name + ' --config="path/to/browserlist/file"\n' +
14
- ' ' + pkg.name + ' --coverage "QUERIES"\n' +
15
- ' ' + pkg.name + ' --coverage=US "QUERIES"\n' +
16
- ' ' + pkg.name + ' --coverage=US,RU,global "QUERIES"\n' +
17
- ' ' + pkg.name + ' --env="environment name defined in config"\n' +
18
- ' ' + pkg.name + ' --stats="path/to/browserlist/stats/file"'
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(pkg.name + ': ' + msg + '\n')
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(pkg.name + ' ' + pkg.version + '\n')
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 data = region(compressed)
223
+ var usageData = region(compressed)
224
+ normalizeUsageData(usageData, data)
210
225
  usage[country] = { }
211
- for (var i in data) {
212
- for (var j in data[i]) {
213
- usage[country][i + ' ' + j] = data[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
- 'Please run the following command: `' + command + '`'
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.9.0",
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.30001030",
19
- "electron-to-chromium": "^1.3.361",
20
- "node-releases": "^1.1.50"
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
+ }