browserslist 4.14.6 → 4.16.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,8 +1,23 @@
1
1
  # Change Log
2
2
  This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
+ ## 4.16.1
5
+ * Fixed Chrome 4 with `mobileToDesktop` (by Aron Woost).
6
+
7
+ ## 4.16
8
+ * Add `browserslist config` query.
9
+
10
+ ## 4.15
11
+ * Add TypeScript types (by Dmitry Semigradsky).
12
+
13
+ ## 4.14.7
14
+ * Fixed Yarn Workspaces support to `--update-db` (by Fausto Núñez Alberro).
15
+ * Added browser changes to `--update-db` (by @AleksandrSl).
16
+ * Added color output to `--update-db`.
17
+ * Updated `package.funding` to have link to our Open Collective.
18
+
4
19
  ## 4.14.6
5
- * Fixed Yarn support n `--update-db` (by Ivan Storck).
20
+ * Fixed Yarn support in `--update-db` (by Ivan Storck).
6
21
  * Fixed npm 7 support in `--update-db`.
7
22
 
8
23
  ## 4.14.5
package/README.md CHANGED
@@ -21,7 +21,6 @@ when you add the following to `package.json`:
21
21
  "browserslist": [
22
22
  "defaults",
23
23
  "not IE 11",
24
- "not IE_Mob 11",
25
24
  "maintained node versions"
26
25
  ]
27
26
  ```
@@ -33,7 +32,6 @@ Or in `.browserslistrc` config:
33
32
 
34
33
  defaults
35
34
  not IE 11
36
- not IE_Mob 11
37
35
  maintained node versions
38
36
  ```
39
37
 
@@ -45,8 +43,6 @@ Browserslist will take queries from tool option,
45
43
  `browserslist` config, `.browserslistrc` config,
46
44
  `browserslist` section in `package.json` or environment variables.
47
45
 
48
- [Browserslist Example] shows how every tool uses Browserslist.
49
-
50
46
  [cult-img]: https://cultofmartians.com/assets/badges/badge.svg
51
47
  [cult]: https://cultofmartians.com/done.html
52
48
 
@@ -69,6 +65,7 @@ Browserslist will take queries from tool option,
69
65
  ## Table of Contents
70
66
 
71
67
  * [Tools](#tools)
68
+ * [Text Editors](#text-editors)
72
69
  * [Best Practices](#best-practices)
73
70
  * [Browsers Data Updating](#browsers-data-updating)
74
71
  * [Queries](#queries)
@@ -116,6 +113,13 @@ Browserslist will take queries from tool option,
116
113
  [`caniuse-api`]: https://github.com/Nyalab/caniuse-api
117
114
 
118
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
+
119
123
  ## Best Practices
120
124
 
121
125
  * There is a `defaults` query, which gives a reasonable configuration
@@ -155,7 +159,7 @@ You need to do it regularly for two reasons:
155
159
  `last 2 versions` or `>1%`. For example, if you created your project
156
160
  2 years ago and did not update your dependencies, `last 1 version`
157
161
  will return 2 year old browsers.
158
- 2. `caiuse-lite` deduplication: to synchronize version in different tools.
162
+ 2. `caniuse-lite` deduplication: to synchronize version in different tools.
159
163
 
160
164
  > What is deduplication?
161
165
 
@@ -268,6 +272,9 @@ You can specify the browser and Node.js versions by queries (case insensitive):
268
272
  `es6-module` here is the `feat` parameter at the URL of the [Can I Use]
269
273
  page. A list of all available features can be found at
270
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`.
271
278
  * `since 2015` or `last 2 years`: all versions released since year 2015
272
279
  (also `since 2015-03` and `since 2015-03-10`).
273
280
  * `unreleased versions` or `unreleased Chrome versions`:
@@ -395,8 +402,7 @@ naming or prefixing the module with `@scope/browserslist-config`, such as
395
402
  `@scope/browserslist-config` or `@scope/browserslist-config-mycompany`.
396
403
 
397
404
  If you don’t accept Browserslist queries from users, you can disable the
398
- validation by using the or `BROWSERSLIST_DANGEROUS_EXTEND` environment variable
399
- or `dangerousExtend` option.
405
+ validation by using the or `BROWSERSLIST_DANGEROUS_EXTEND` environment variable.
400
406
 
401
407
  ```sh
402
408
  BROWSERSLIST_DANGEROUS_EXTEND=1 npx webpack
package/error.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ declare class BrowserslistError extends Error {
2
+ constructor(message: any);
3
+ name: 'BrowserslistError';
4
+ browserslist: true;
5
+ }
6
+
7
+ export = BrowserslistError;
package/index.d.ts ADDED
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Return array of browsers by selection queries.
3
+ *
4
+ * ```js
5
+ * browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8']
6
+ * ```
7
+ *
8
+ * @param queries Browser queries.
9
+ * @returns Array with browser names in Can I Use.
10
+ */
11
+ declare function browserslist (
12
+ queries?: string | readonly string[] | null,
13
+ opts?: browserslist.Options
14
+ ): string[]
15
+
16
+ declare namespace browserslist {
17
+ interface Options {
18
+ /**
19
+ * Path to processed file. It will be used to find config files.
20
+ */
21
+ path?: string | false
22
+ /**
23
+ * Processing environment. It will be used to take right queries
24
+ * from config file.
25
+ */
26
+ env?: string
27
+ /**
28
+ * Custom browser usage statistics for "> 1% in my stats" query.
29
+ */
30
+ stats?: Stats | string
31
+ /**
32
+ * Path to config file with queries.
33
+ */
34
+ config?: string
35
+ /**
36
+ * Do not throw on unknown version in direct query.
37
+ */
38
+ ignoreUnknownVersions?: boolean
39
+ /**
40
+ * Disable security checks for extend query.
41
+ */
42
+ dangerousExtend?: boolean
43
+ /**
44
+ * Alias mobile browsers to the desktop version when Can I Use
45
+ * doesn’t have data about the specified version.
46
+ */
47
+ mobileToDesktop?: boolean
48
+ }
49
+
50
+ type Config = {
51
+ defaults: string[]
52
+ [section: string]: string[] | undefined
53
+ }
54
+
55
+ interface Stats {
56
+ [browser: string]: {
57
+ [version: string]: number
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Browser names aliases.
63
+ */
64
+ let aliases: {
65
+ [alias: string]: string | undefined
66
+ }
67
+
68
+ /**
69
+ * Aliases to work with joined versions like `ios_saf 7.0-7.1`.
70
+ */
71
+ let versionAliases: {
72
+ [browser: string]:
73
+ | {
74
+ [version: string]: string | undefined
75
+ }
76
+ | undefined
77
+ }
78
+
79
+ /**
80
+ * Can I Use only provides a few versions for some browsers (e.g. `and_chr`).
81
+ *
82
+ * Fallback to a similar browser for unknown versions.
83
+ */
84
+ let desktopNames: {
85
+ [browser: string]: string | undefined
86
+ }
87
+
88
+ let data: {
89
+ [browser: string]:
90
+ | {
91
+ name: string
92
+ versions: string[]
93
+ released: string[]
94
+ releaseDate: {
95
+ [version: string]: number | undefined | null
96
+ }
97
+ }
98
+ | undefined
99
+ }
100
+
101
+ interface Usage {
102
+ [version: string]: number
103
+ }
104
+
105
+ let usage: {
106
+ global?: Usage
107
+ custom?: Usage | null
108
+ [country: string]: Usage | undefined | null
109
+ }
110
+
111
+ let cache: {
112
+ [feature: string]: {
113
+ [name: string]: 'y' | 'n'
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Default browsers query
119
+ */
120
+ let defaults: readonly string[]
121
+
122
+ /**
123
+ * Which statistics should be used. Country code or custom statistics.
124
+ * Pass `"my stats"` to load statistics from `Browserslist` files.
125
+ */
126
+ type StatsOptions = string | 'my stats' | Stats | { dataByBrowser: Stats }
127
+
128
+ /**
129
+ * Return browsers market coverage.
130
+ *
131
+ * ```js
132
+ * browserslist.coverage(browserslist('> 1% in US'), 'US') //=> 83.1
133
+ * ```
134
+ *
135
+ * @param browsers Browsers names in Can I Use.
136
+ * @param stats Which statistics should be used.
137
+ * @returns Total market coverage for all selected browsers.
138
+ */
139
+ function coverage (browsers: readonly string[], stats?: StatsOptions): number
140
+
141
+ function clearCaches (): void
142
+
143
+ function parseConfig (string: string): Config
144
+
145
+ function readConfig (file: string): Config
146
+
147
+ function findConfig (...pathSegments: string[]): Config | undefined
148
+
149
+ interface LoadConfigOptions {
150
+ config?: string
151
+ path?: string
152
+ env?: string
153
+ }
154
+
155
+ function loadConfig (options: LoadConfigOptions): string[] | undefined
156
+ }
157
+
158
+ declare global {
159
+ namespace NodeJS {
160
+ interface ProcessEnv {
161
+ BROWSERSLIST?: string
162
+ BROWSERSLIST_CONFIG?: string
163
+ BROWSERSLIST_DANGEROUS_EXTEND?: string
164
+ BROWSERSLIST_DISABLE_CACHE?: string
165
+ BROWSERSLIST_ENV?: string
166
+ BROWSERSLIST_IGNORE_OLD_DATA?: string
167
+ BROWSERSLIST_STATS?: string
168
+ }
169
+ }
170
+ }
171
+
172
+ export = browserslist
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.14.6",
3
+ "version": "4.16.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",
@@ -8,17 +8,18 @@
8
8
  "target"
9
9
  ],
10
10
  "funding": {
11
- "type": "tidelift",
12
- "url": "https://tidelift.com/funding/github/npm/browserslist"
11
+ "type": "opencollective",
12
+ "url": "https://opencollective.com/browserslist"
13
13
  },
14
14
  "author": "Andrey Sitnik <andrey@sitnik.ru>",
15
15
  "license": "MIT",
16
16
  "repository": "browserslist/browserslist",
17
17
  "dependencies": {
18
- "caniuse-lite": "^1.0.30001154",
19
- "electron-to-chromium": "^1.3.585",
18
+ "caniuse-lite": "^1.0.30001173",
19
+ "colorette": "^1.2.1",
20
+ "electron-to-chromium": "^1.3.634",
20
21
  "escalade": "^3.1.1",
21
- "node-releases": "^1.1.65"
22
+ "node-releases": "^1.1.69"
22
23
  },
23
24
  "engines": {
24
25
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
@@ -26,6 +27,7 @@
26
27
  "bin": {
27
28
  "browserslist": "cli.js"
28
29
  },
30
+ "types": "./index.d.ts",
29
31
  "browser": {
30
32
  "./node.js": "./browser.js",
31
33
  "path": false
package/update-db.js CHANGED
@@ -1,10 +1,16 @@
1
1
  var childProcess = require('child_process')
2
+ var colorette = require('colorette')
2
3
  var escalade = require('escalade/sync')
3
4
  var path = require('path')
4
5
  var fs = require('fs')
5
6
 
6
7
  var BrowserslistError = require('./error')
7
8
 
9
+ var red = colorette.red
10
+ var bold = colorette.bold
11
+ var green = colorette.green
12
+ var yellow = colorette.yellow
13
+
8
14
  function detectLockfile () {
9
15
  var packageDir = escalade('.', function (dir, names) {
10
16
  return names.indexOf('package.json') !== -1 ? dir : ''
@@ -65,6 +71,52 @@ function getLatestInfo (lock) {
65
71
  }
66
72
  }
67
73
 
74
+ function getBrowsersList () {
75
+ return childProcess.execSync('npx browserslist').toString()
76
+ .trim()
77
+ .split('\n')
78
+ .map(function (line) {
79
+ return line.trim().split(' ')
80
+ })
81
+ .reduce(function (result, entry) {
82
+ if (!result[entry[0]]) {
83
+ result[entry[0]] = []
84
+ }
85
+ result[entry[0]].push(entry[1])
86
+ return result
87
+ }, {})
88
+ }
89
+
90
+ function diffBrowsersLists (old, current) {
91
+ var browsers = Object.keys(old).concat(
92
+ Object.keys(current).filter(function (browser) {
93
+ return old[browser] === undefined
94
+ })
95
+ )
96
+ return browsers.map(function (browser) {
97
+ var oldVersions = old[browser] || []
98
+ var currentVersions = current[browser] || []
99
+ var intersection = oldVersions.filter(function (version) {
100
+ return currentVersions.indexOf(version) !== -1
101
+ })
102
+ var addedVersions = currentVersions.filter(function (version) {
103
+ return intersection.indexOf(version) === -1
104
+ })
105
+ var removedVersions = oldVersions.filter(function (version) {
106
+ return intersection.indexOf(version) === -1
107
+ })
108
+ return removedVersions.map(function (version) {
109
+ return red('- ' + browser + ' ' + version)
110
+ }).concat(addedVersions.map(function (version) {
111
+ return green('+ ' + browser + ' ' + version)
112
+ }))
113
+ })
114
+ .reduce(function (result, array) {
115
+ return result.concat(array)
116
+ }, [])
117
+ .join('\n')
118
+ }
119
+
68
120
  function updateLockfile (lock, latest) {
69
121
  if (lock.mode === 'npm') {
70
122
  var fixed = deletePackage(JSON.parse(lock.content))
@@ -126,36 +178,80 @@ module.exports = function updateDB (print) {
126
178
 
127
179
  var current = getCurrentVersion(lock)
128
180
  var latest = getLatestInfo(lock)
181
+ var browsersListRetrievalError
182
+ var oldBrowsersList
183
+ try {
184
+ oldBrowsersList = getBrowsersList()
185
+ } catch (e) {
186
+ browsersListRetrievalError = e
187
+ }
129
188
 
130
189
  if (typeof current === 'string') {
131
- print('Current version: ' + current + '\n')
190
+ print('Current version: ' + bold(red(current)) + '\n')
132
191
  }
133
192
  print(
134
- 'New version: ' + latest.version + '\n' +
193
+ 'New version: ' + bold(green(latest.version)) + '\n' +
135
194
  'Removing old caniuse-lite from lock file\n'
136
195
  )
137
196
 
138
197
  fs.writeFileSync(lock.file, updateLockfile(lock, latest))
139
198
 
140
- var install = lock.mode === 'yarn' ? 'yarn add' : lock.mode + ' install'
199
+ var install = lock.mode === 'yarn' ? 'yarn add -W' : lock.mode + ' install'
141
200
  print(
142
201
  'Installing new caniuse-lite version\n' +
143
- '$ ' + install + ' caniuse-lite\n'
202
+ yellow('$ ' + install + ' caniuse-lite') + '\n'
144
203
  )
145
204
  try {
146
205
  childProcess.execSync(install + ' caniuse-lite')
147
206
  } catch (e) /* istanbul ignore next */ {
148
- print(e.stack)
149
- print('\nProblem with `' + lock.mode + ' install` call. Run it manually.\n')
207
+ print(
208
+ red(
209
+ '\n' +
210
+ e.stack + '\n\n' +
211
+ 'Problem with `' + install + ' caniuse-lite` call. ' +
212
+ 'Run it manually.\n'
213
+ )
214
+ )
150
215
  process.exit(1)
151
216
  }
152
217
 
153
- var del = lock.mode === 'yarn' ? 'yarn remove' : lock.mode + ' uninstall'
218
+ var del = lock.mode === 'yarn' ? 'yarn remove -W' : lock.mode + ' uninstall'
154
219
  print(
155
220
  'Cleaning package.json dependencies from caniuse-lite\n' +
156
- '$ ' + del + ' caniuse-lite\n'
221
+ yellow('$ ' + del + ' caniuse-lite') + '\n'
157
222
  )
158
223
  childProcess.execSync(del + ' caniuse-lite')
159
224
 
160
225
  print('caniuse-lite has been successfully updated\n')
226
+
227
+ var currentBrowsersList
228
+ if (!browsersListRetrievalError) {
229
+ try {
230
+ currentBrowsersList = getBrowsersList()
231
+ } catch (e) /* istanbul ignore next */ {
232
+ browsersListRetrievalError = e
233
+ }
234
+ }
235
+
236
+ if (browsersListRetrievalError) {
237
+ print(
238
+ red(
239
+ '\n' +
240
+ browsersListRetrievalError.stack + '\n\n' +
241
+ 'Problem with browsers list retrieval.\n' +
242
+ 'Target browser changes won’t be shown.\n'
243
+ )
244
+ )
245
+ } else {
246
+ var targetBrowserChanges = diffBrowsersLists(
247
+ oldBrowsersList,
248
+ currentBrowsersList
249
+ )
250
+ if (targetBrowserChanges) {
251
+ print('\nTarget browser changes:\n')
252
+ print(targetBrowserChanges + '\n')
253
+ } else {
254
+ print('\n' + green('No target browser changes') + '\n')
255
+ }
256
+ }
161
257
  }