browserslist 4.9.1 → 4.10.0

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,9 @@
1
1
  # Change Log
2
2
  This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
+ ## 4.10
5
+ * Add `npx browserslist --update-db` (by Ivan Solovev).
6
+
4
7
  ## 4.9.1
5
8
  * Normalize incorrect Can I Use regional data (by Huáng Jùnliàng).
6
9
 
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,22 @@
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 --update-db'
19
22
 
20
23
  function isArg (arg) {
21
24
  return args.some(function (str) {
@@ -24,14 +27,18 @@ function isArg (arg) {
24
27
  }
25
28
 
26
29
  function error (msg) {
27
- process.stderr.write(pkg.name + ': ' + msg + '\n')
30
+ process.stderr.write('browserslist: ' + msg + '\n')
28
31
  process.exit(1)
29
32
  }
30
33
 
31
34
  if (isArg('--help') || isArg('-h')) {
32
35
  process.stdout.write(pkg.description + '.\n\n' + USAGE + '\n')
33
36
  } else if (isArg('--version') || isArg('-v')) {
34
- process.stdout.write(pkg.name + ' ' + pkg.version + '\n')
37
+ process.stdout.write('browserslist ' + pkg.version + '\n')
38
+ } else if (isArg('--update-db')) {
39
+ updateDb(function (str) {
40
+ process.stdout.write(str)
41
+ })
35
42
  } else {
36
43
  var mode = 'browsers'
37
44
  var opts = { }
package/node.js CHANGED
@@ -342,14 +342,7 @@ module.exports = {
342
342
  var halfYearAgo = Date.now() - TIME_TO_UPDATE_CANIUSE
343
343
 
344
344
  if (latest !== 0 && latest < halfYearAgo) {
345
- var command = 'npm update'
346
- eachParent(__filename, function (dir) {
347
- var pckg = path.join(dir, 'package.json')
348
- var yarnLock = path.join(dir, 'yarn.lock')
349
- if (isFile(pckg) && isFile(yarnLock)) {
350
- command = 'yarn upgrade'
351
- }
352
- })
345
+ var command = 'npx browserslist --update-db'
353
346
  console.warn(
354
347
  'Browserslist: caniuse-lite is outdated. ' +
355
348
  'Please run the following command: `' + command + '`'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browserslist",
3
- "version": "4.9.1",
3
+ "version": "4.10.0",
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.363",
20
- "node-releases": "^1.1.50"
18
+ "caniuse-lite": "^1.0.30001035",
19
+ "electron-to-chromium": "^1.3.378",
20
+ "node-releases": "^1.1.52",
21
+ "pkg-up": "^3.1.0"
21
22
  },
22
23
  "bin": "./cli.js",
23
24
  "browser": {
package/update-db.js ADDED
@@ -0,0 +1,131 @@
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
+ if (fs.existsSync(lockfileNpm)) {
23
+ return { mode: 'npm', file: lockfileNpm }
24
+ } else if (fs.existsSync(lockfileYarn)) {
25
+ return { mode: 'yarn', file: lockfileYarn }
26
+ } else if (fs.existsSync(lockfilePnpm)) {
27
+ return { mode: 'pnpm', file: lockfilePnpm }
28
+ } else {
29
+ throw new BrowserslistError(
30
+ 'No lockfile found. Run "npm install", "yarn install" or "pnpm install"'
31
+ )
32
+ }
33
+ }
34
+
35
+ function getCurrentVersion (lock) {
36
+ var match
37
+ if (lock.mode === 'npm') {
38
+ var dependencies = JSON.parse(lock.content).dependencies
39
+ if (dependencies && dependencies['caniuse-lite']) {
40
+ return dependencies['caniuse-lite'].version
41
+ }
42
+ } else if (lock.mode === 'yarn') {
43
+ match = /caniuse-lite@[^:]+:\n\s+version\s+"([^"]+)"/.exec(lock.content)
44
+ if (match[1]) return match[1]
45
+ } else if (lock.mode === 'pnpm') {
46
+ match = /\/caniuse-lite\/([^:]+):/.exec(lock.content)
47
+ if (match[1]) return match[1]
48
+ }
49
+ return null
50
+ }
51
+
52
+ function getLastestInfo () {
53
+ return JSON.parse(
54
+ childProcess.execSync('npm show caniuse-lite --json').toString()
55
+ )
56
+ }
57
+
58
+ function updateLockfile (lock, latest) {
59
+ if (lock.mode === 'npm') {
60
+ var fixed = deletePackage(JSON.parse(lock.content))
61
+ return JSON.stringify(fixed, null, ' ')
62
+ } else {
63
+ var lines = lock.content.split('\n')
64
+ var i
65
+ if (lock.mode === 'yarn') {
66
+ for (i = 0; i < lines.length; i++) {
67
+ if (lines[i].indexOf('caniuse-lite@') !== -1) {
68
+ lines[i + 1] = lines[i + 1].replace(
69
+ /version "[^"]+"/, 'version "' + latest.version + '"'
70
+ )
71
+ lines[i + 2] = lines[i + 2].replace(
72
+ /resolved "[^"]+"/, 'resolved "' + latest.dist.tarball + '"'
73
+ )
74
+ lines[i + 3] = lines[i + 3].replace(
75
+ /integrity .+/, 'integrity ' + latest.dist.integrity
76
+ )
77
+ i += 4
78
+ }
79
+ }
80
+ } else if (lock.mode === 'pnpm') {
81
+ for (i = 0; i < lines.length; i++) {
82
+ if (lines[i].indexOf('caniuse-lite:') >= 0) {
83
+ lines[i] = lines[i].replace(/: .*$/, ': ' + latest.version)
84
+ } else if (lines[i].indexOf('/caniuse-lite') >= 0) {
85
+ lines[i] = lines[i].replace(/\/[^/:]+:/, '/' + latest.version + ':')
86
+ for (i = i + 1; i < lines.length; i++) {
87
+ if (lines[i].indexOf('integrity: ') !== -1) {
88
+ lines[i] = lines[i].replace(
89
+ /integrity: .+/, 'integrity: ' + latest.dist.integrity
90
+ )
91
+ } else if (lines[i].indexOf(' /') !== -1) {
92
+ break
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ return lines.join('\n')
99
+ }
100
+ }
101
+
102
+ function deletePackage (node) {
103
+ if (node.dependencies) {
104
+ delete node.dependencies['caniuse-lite']
105
+ for (var i in node.dependencies) {
106
+ node.dependencies[i] = deletePackage(node.dependencies[i])
107
+ }
108
+ }
109
+ return node
110
+ }
111
+
112
+ module.exports = function updateDB (print) {
113
+ var lock = detectLockfile()
114
+ lock.content = fs.readFileSync(lock.file).toString()
115
+
116
+ var current = getCurrentVersion(lock)
117
+ var latest = getLastestInfo()
118
+
119
+ if (typeof current === 'string') {
120
+ print('Current version: ' + current + '\n')
121
+ }
122
+ print(
123
+ 'New version: ' + latest.version + '\n' +
124
+ 'Updating caniuse-lite…\n'
125
+ )
126
+
127
+ fs.writeFileSync(lock.file, updateLockfile(lock, latest))
128
+ childProcess.execSync(lock.mode + ' install')
129
+
130
+ print('caniuse-lite has been successfully updated')
131
+ }