browserslist 4.15.0 → 4.16.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 CHANGED
@@ -1,6 +1,18 @@
1
1
  # Change Log
2
2
  This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
+ ## 4.16.3
5
+ * Fixed `--update-db`.
6
+
7
+ ## 4.16.2
8
+ * Fixed `--update-db` (by @ialarmedalien).
9
+
10
+ ## 4.16.1
11
+ * Fixed Chrome 4 with `mobileToDesktop` (by Aron Woost).
12
+
13
+ ## 4.16
14
+ * Add `browserslist config` query.
15
+
4
16
  ## 4.15
5
17
  * Add TypeScript types (by Dmitry Semigradsky).
6
18
 
package/README.md CHANGED
@@ -65,6 +65,7 @@ Browserslist will take queries from tool option,
65
65
  ## Table of Contents
66
66
 
67
67
  * [Tools](#tools)
68
+ * [Text Editors](#text-editors)
68
69
  * [Best Practices](#best-practices)
69
70
  * [Browsers Data Updating](#browsers-data-updating)
70
71
  * [Queries](#queries)
@@ -88,8 +89,6 @@ Browserslist will take queries from tool option,
88
89
 
89
90
  * [`browserl.ist`](https://browserl.ist/) is an online tool to check
90
91
  what browsers will be selected by some query.
91
- * [`browserslist-vscode`] adds `.browserslistrc` syntax highlighting
92
- to Visual Studio Code.
93
92
  * [`browserslist-ga`] and [`browserslist-ga-export`] download your website
94
93
  browsers statistics to use it in `> 0.5% in my stats` query.
95
94
  * [`browserslist-useragent-regexp`] compiles Browserslist query to a RegExp
@@ -110,11 +109,17 @@ Browserslist will take queries from tool option,
110
109
  [`browserslist-browserstack`]: https://github.com/xeroxinteractive/browserslist-browserstack
111
110
  [`browserslist-ga-export`]: https://github.com/browserslist/browserslist-ga-export
112
111
  [`browserslist-useragent`]: https://github.com/pastelsky/browserslist-useragent
113
- [`browserslist-vscode`]: https://marketplace.visualstudio.com/items?itemName=webben.browserslist
114
112
  [`browserslist-ga`]: https://github.com/browserslist/browserslist-ga
115
113
  [`caniuse-api`]: https://github.com/Nyalab/caniuse-api
116
114
 
117
115
 
116
+ ### Text Editors
117
+
118
+ These extensions will add syntax highlighting for `.browserslistrc` files.
119
+
120
+ * [VS Code](https://marketplace.visualstudio.com/items?itemName=webben.browserslist)
121
+ * [Vim](https://github.com/browserslist/vim-browserslist)
122
+
118
123
  ## Best Practices
119
124
 
120
125
  * There is a `defaults` query, which gives a reasonable configuration
@@ -267,6 +272,9 @@ You can specify the browser and Node.js versions by queries (case insensitive):
267
272
  `es6-module` here is the `feat` parameter at the URL of the [Can I Use]
268
273
  page. A list of all available features can be found at
269
274
  [`caniuse-lite/data/features`].
275
+ * `browserslist config`: the browsers defined in Browserslist config. Useful
276
+ in Differential Serving to modify user’s config like
277
+ `browserslist config and supports es6-module`.
270
278
  * `since 2015` or `last 2 years`: all versions released since year 2015
271
279
  (also `since 2015-03` and `since 2015-03-10`).
272
280
  * `unreleased versions` or `unreleased Chrome versions`:
@@ -394,8 +402,7 @@ naming or prefixing the module with `@scope/browserslist-config`, such as
394
402
  `@scope/browserslist-config` or `@scope/browserslist-config-mycompany`.
395
403
 
396
404
  If you don’t accept Browserslist queries from users, you can disable the
397
- validation by using the or `BROWSERSLIST_DANGEROUS_EXTEND` environment variable
398
- or `dangerousExtend` option.
405
+ validation by using the or `BROWSERSLIST_DANGEROUS_EXTEND` environment variable.
399
406
 
400
407
  ```sh
401
408
  BROWSERSLIST_DANGEROUS_EXTEND=1 npx webpack
package/index.js CHANGED
@@ -425,6 +425,7 @@ function browserslist (queries, opts) {
425
425
  ignoreUnknownVersions: opts.ignoreUnknownVersions,
426
426
  dangerousExtend: opts.dangerousExtend,
427
427
  mobileToDesktop: opts.mobileToDesktop,
428
+ path: opts.path,
428
429
  env: opts.env
429
430
  }
430
431
 
@@ -1105,6 +1106,12 @@ var QUERIES = [
1105
1106
  return [data.name + ' ' + version]
1106
1107
  }
1107
1108
  },
1109
+ {
1110
+ regexp: /^browserslist config$/i,
1111
+ select: function (context) {
1112
+ return browserslist(undefined, context)
1113
+ }
1114
+ },
1108
1115
  {
1109
1116
  regexp: /^extends (.+)$/i,
1110
1117
  select: function (context, name) {
package/node.js CHANGED
@@ -127,7 +127,7 @@ function normalizeStats (data, stats) {
127
127
  data[i] &&
128
128
  data[i].versions.length === 1
129
129
  ) {
130
- var normal = Object.keys(data[i].versions)[0]
130
+ var normal = data[i].versions[0]
131
131
  normalized[i] = { }
132
132
  normalized[i][normal] = stats[i][versions[0]]
133
133
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browserslist",
3
- "version": "4.15.0",
3
+ "version": "4.16.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,11 +15,11 @@
15
15
  "license": "MIT",
16
16
  "repository": "browserslist/browserslist",
17
17
  "dependencies": {
18
- "caniuse-lite": "^1.0.30001164",
18
+ "caniuse-lite": "^1.0.30001181",
19
19
  "colorette": "^1.2.1",
20
- "electron-to-chromium": "^1.3.612",
20
+ "electron-to-chromium": "^1.3.649",
21
21
  "escalade": "^3.1.1",
22
- "node-releases": "^1.1.67"
22
+ "node-releases": "^1.1.70"
23
23
  },
24
24
  "engines": {
25
25
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
package/update-db.js CHANGED
@@ -19,7 +19,7 @@ function detectLockfile () {
19
19
  if (!packageDir) {
20
20
  throw new BrowserslistError(
21
21
  'Cannot find package.json. ' +
22
- 'Is it a right project to run npx browserslist --update-db?'
22
+ 'Is this the right directory to run `npx browserslist --update-db` in?'
23
23
  )
24
24
  }
25
25
 
@@ -27,48 +27,27 @@ function detectLockfile () {
27
27
  var lockfileYarn = path.join(packageDir, 'yarn.lock')
28
28
  var lockfilePnpm = path.join(packageDir, 'pnpm-lock.yaml')
29
29
 
30
- /* istanbul ignore next */
31
30
  if (fs.existsSync(lockfilePnpm)) {
32
31
  return { mode: 'pnpm', file: lockfilePnpm }
33
32
  } else if (fs.existsSync(lockfileNpm)) {
34
33
  return { mode: 'npm', file: lockfileNpm }
35
34
  } else if (fs.existsSync(lockfileYarn)) {
36
35
  return { mode: 'yarn', file: lockfileYarn }
37
- } else {
38
- throw new BrowserslistError(
39
- 'No lockfile found. Run "npm install", "yarn install" or "pnpm install"'
40
- )
41
- }
42
- }
43
-
44
- function getCurrentVersion (lock) {
45
- var match
46
- /* istanbul ignore if */
47
- if (lock.mode === 'pnpm') {
48
- match = /\/caniuse-lite\/([^:]+):/.exec(lock.content)
49
- if (match[1]) return match[1]
50
- } else if (lock.mode === 'npm') {
51
- var dependencies = JSON.parse(lock.content).dependencies
52
- if (dependencies && dependencies['caniuse-lite']) {
53
- return dependencies['caniuse-lite'].version
54
- }
55
- } else if (lock.mode === 'yarn') {
56
- match = /caniuse-lite@[^:]+:\r?\n\s+version\s+"([^"]+)"/.exec(lock.content)
57
- if (match[1]) return match[1]
58
36
  }
59
- return null
37
+ throw new BrowserslistError(
38
+ 'No lockfile found. Run "npm install", "yarn install" or "pnpm install"'
39
+ )
60
40
  }
61
41
 
62
42
  function getLatestInfo (lock) {
63
- if (lock.mode !== 'yarn') {
64
- return JSON.parse(
65
- childProcess.execSync('npm show caniuse-lite --json').toString()
66
- )
67
- } else {
43
+ if (lock.mode === 'yarn') {
68
44
  return JSON.parse(
69
45
  childProcess.execSync('yarn info caniuse-lite --json').toString()
70
46
  ).data
71
47
  }
48
+ return JSON.parse(
49
+ childProcess.execSync('npm show caniuse-lite --json').toString()
50
+ )
72
51
  }
73
52
 
74
53
  function getBrowsersList () {
@@ -117,66 +96,106 @@ function diffBrowsersLists (old, current) {
117
96
  .join('\n')
118
97
  }
119
98
 
120
- function updateLockfile (lock, latest) {
121
- if (lock.mode === 'npm') {
122
- var fixed = deletePackage(JSON.parse(lock.content))
123
- return JSON.stringify(fixed, null, ' ')
124
- } else {
125
- var lines = lock.content.split('\n')
126
- var i
127
- /* istanbul ignore if */
128
- if (lock.mode === 'pnpm') {
129
- for (i = 0; i < lines.length; i++) {
130
- if (lines[i].indexOf('caniuse-lite:') >= 0) {
131
- lines[i] = lines[i].replace(/: .*$/, ': ' + latest.version)
132
- } else if (lines[i].indexOf('/caniuse-lite') >= 0) {
133
- lines[i] = lines[i].replace(/\/[^/:]+:/, '/' + latest.version + ':')
134
- for (i = i + 1; i < lines.length; i++) {
135
- if (lines[i].indexOf('integrity: ') !== -1) {
136
- lines[i] = lines[i].replace(
137
- /integrity: .+/, 'integrity: ' + latest.dist.integrity
138
- )
139
- } else if (lines[i].indexOf(' /') !== -1) {
140
- break
141
- }
142
- }
99
+ function updateNpmLockfile (lock, latest) {
100
+ var metadata = { latest: latest, versions: [] }
101
+ var content = deletePackage(JSON.parse(lock.content), metadata)
102
+ metadata.content = JSON.stringify(content, null, ' ')
103
+ return metadata
104
+ }
105
+
106
+ function deletePackage (node, metadata) {
107
+ if (node.dependencies) {
108
+ if (node.dependencies['caniuse-lite']) {
109
+ var version = node.dependencies['caniuse-lite'].version
110
+ metadata.versions[version] = true
111
+ delete node.dependencies['caniuse-lite']
112
+ }
113
+ for (var i in node.dependencies) {
114
+ node.dependencies[i] = deletePackage(node.dependencies[i], metadata)
115
+ }
116
+ }
117
+ return node
118
+ }
119
+
120
+ var yarnVersionRe = new RegExp('version "(.*?)"')
121
+
122
+ function updateYarnLockfile (lock, latest) {
123
+ var blocks = lock.content.split(/(\n{2,})/).map(function (block) {
124
+ return block.split('\n')
125
+ })
126
+ var versions = {}
127
+ blocks.forEach(function (lines) {
128
+ if (lines[0].indexOf('caniuse-lite@') !== -1) {
129
+ var match = yarnVersionRe.exec(lines[1])
130
+ versions[match[1]] = true
131
+ if (match[1] !== latest.version) {
132
+ lines[1] = lines[1].replace(
133
+ /version "[^"]+"/, 'version "' + latest.version + '"'
134
+ )
135
+ lines[2] = lines[2].replace(
136
+ /resolved "[^"]+"/, 'resolved "' + latest.dist.tarball + '"'
137
+ )
138
+ lines[3] = lines[3].replace(
139
+ /integrity .+/, 'integrity ' + latest.dist.integrity
140
+ )
141
+ }
142
+ }
143
+ })
144
+ var content = blocks.map(function (lines) {
145
+ return lines.join('\n')
146
+ }).join('')
147
+ return { content: content, versions: versions }
148
+ }
149
+
150
+ function updatePnpmLockfile (lock, latest) {
151
+ var versions = {}
152
+ var lines = lock.content.split('\n')
153
+ var i
154
+ var j
155
+ var lineParts
156
+
157
+ for (i = 0; i < lines.length; i++) {
158
+ if (lines[i].indexOf('caniuse-lite:') >= 0) {
159
+ lineParts = lines[i].split(/:\s?/, 2)
160
+ versions[lineParts[1]] = true
161
+ lines[i] = lineParts[0] + ': ' + latest.version
162
+ } else if (lines[i].indexOf('/caniuse-lite') >= 0) {
163
+ lineParts = lines[i].split(/([/:])/)
164
+ for (j = 0; j < lineParts.length; j++) {
165
+ if (lineParts[j].indexOf('caniuse-lite') >= 0) {
166
+ versions[lineParts[j + 2]] = true
167
+ lineParts[j + 2] = latest.version
168
+ break
143
169
  }
144
170
  }
145
- } else if (lock.mode === 'yarn') {
146
- for (i = 0; i < lines.length; i++) {
147
- if (lines[i].indexOf('caniuse-lite@') !== -1) {
148
- lines[i + 1] = lines[i + 1].replace(
149
- /version "[^"]+"/, 'version "' + latest.version + '"'
150
- )
151
- lines[i + 2] = lines[i + 2].replace(
152
- /resolved "[^"]+"/, 'resolved "' + latest.dist.tarball + '"'
171
+ lines[i] = lineParts.join('')
172
+ for (i = i + 1; i < lines.length; i++) {
173
+ if (lines[i].indexOf('integrity: ') !== -1) {
174
+ lines[i] = lines[i].replace(
175
+ /integrity: .+/, 'integrity: ' + latest.dist.integrity
153
176
  )
154
- lines[i + 3] = lines[i + 3].replace(
155
- /integrity .+/, 'integrity ' + latest.dist.integrity
156
- )
157
- i += 4
177
+ } else if (lines[i].indexOf(' /') !== -1) {
178
+ break
158
179
  }
159
180
  }
160
181
  }
161
- return lines.join('\n')
162
182
  }
183
+ return { content: lines.join('\n'), versions: versions }
163
184
  }
164
185
 
165
- function deletePackage (node) {
166
- if (node.dependencies) {
167
- delete node.dependencies['caniuse-lite']
168
- for (var i in node.dependencies) {
169
- node.dependencies[i] = deletePackage(node.dependencies[i])
170
- }
186
+ function updateLockfile (lock, latest) {
187
+ lock.content = fs.readFileSync(lock.file).toString()
188
+
189
+ if (lock.mode === 'npm') {
190
+ return updateNpmLockfile(lock, latest)
191
+ } else if (lock.mode === 'yarn') {
192
+ return updateYarnLockfile(lock, latest)
171
193
  }
172
- return node
194
+ return updatePnpmLockfile(lock, latest)
173
195
  }
174
196
 
175
197
  module.exports = function updateDB (print) {
176
198
  var lock = detectLockfile()
177
- lock.content = fs.readFileSync(lock.file).toString()
178
-
179
- var current = getCurrentVersion(lock)
180
199
  var latest = getLatestInfo(lock)
181
200
  var browsersListRetrievalError
182
201
  var oldBrowsersList
@@ -186,15 +205,32 @@ module.exports = function updateDB (print) {
186
205
  browsersListRetrievalError = e
187
206
  }
188
207
 
189
- if (typeof current === 'string') {
190
- print('Current version: ' + bold(red(current)) + '\n')
208
+ print(
209
+ 'Latest version: ' + bold(green(latest.version)) + '\n'
210
+ )
211
+
212
+ var lockfileData = updateLockfile(lock, latest)
213
+ var caniuseVersions = Object.keys(lockfileData.versions).sort()
214
+ if (caniuseVersions.length === 1 &&
215
+ caniuseVersions[0] === latest.version) {
216
+ print(
217
+ 'Installed version: ' + bold(green(latest.version)) + '\n' +
218
+ bold(green('caniuse-lite is up to date')) + '\n'
219
+ )
220
+ return
221
+ }
222
+
223
+ if (caniuseVersions.length === 0) {
224
+ caniuseVersions[0] = 'none'
191
225
  }
192
226
  print(
193
- 'New version: ' + bold(green(latest.version)) + '\n' +
227
+ 'Installed version' +
228
+ (caniuseVersions.length === 1 ? ': ' : 's: ') +
229
+ bold(red(caniuseVersions.join(', '))) +
230
+ '\n' +
194
231
  'Removing old caniuse-lite from lock file\n'
195
232
  )
196
-
197
- fs.writeFileSync(lock.file, updateLockfile(lock, latest))
233
+ fs.writeFileSync(lock.file, lockfileData.content)
198
234
 
199
235
  var install = lock.mode === 'yarn' ? 'yarn add -W' : lock.mode + ' install'
200
236
  print(
@@ -208,7 +244,7 @@ module.exports = function updateDB (print) {
208
244
  red(
209
245
  '\n' +
210
246
  e.stack + '\n\n' +
211
- 'Problem with `' + install + ' caniuse-lite` call. ' +
247
+ 'Problem with `' + install + ' caniuse-lite` call. ' +
212
248
  'Run it manually.\n'
213
249
  )
214
250
  )
@@ -238,7 +274,7 @@ module.exports = function updateDB (print) {
238
274
  red(
239
275
  '\n' +
240
276
  browsersListRetrievalError.stack + '\n\n' +
241
- 'Problem with browsers list retrieval.\n' +
277
+ 'Problem with browser list retrieval.\n' +
242
278
  'Target browser changes won’t be shown.\n'
243
279
  )
244
280
  )