browserslist 4.14.4 → 4.15.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,22 @@
1
1
  # Change Log
2
2
  This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
+ ## 4.15
5
+ * Add TypeScript types (by Dmitry Semigradsky).
6
+
7
+ ## 4.14.7
8
+ * Fixed Yarn Workspaces support to `--update-db` (by Fausto Núñez Alberro).
9
+ * Added browser changes to `--update-db` (by @AleksandrSl).
10
+ * Added color output to `--update-db`.
11
+ * Updated `package.funding` to have link to our Open Collective.
12
+
13
+ ## 4.14.6
14
+ * Fixed Yarn support in `--update-db` (by Ivan Storck).
15
+ * Fixed npm 7 support in `--update-db`.
16
+
17
+ ## 4.14.5
18
+ * Fixed `last 2 electron versions` query (by Sergey Melyukov).
19
+
4
20
  ## 4.14.4
5
21
  * Fixed `Unknown version 59 of op_mob` error.
6
22
 
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
 
@@ -92,6 +88,8 @@ Browserslist will take queries from tool option,
92
88
 
93
89
  * [`browserl.ist`](https://browserl.ist/) is an online tool to check
94
90
  what browsers will be selected by some query.
91
+ * [`browserslist-vscode`] adds `.browserslistrc` syntax highlighting
92
+ to Visual Studio Code.
95
93
  * [`browserslist-ga`] and [`browserslist-ga-export`] download your website
96
94
  browsers statistics to use it in `> 0.5% in my stats` query.
97
95
  * [`browserslist-useragent-regexp`] compiles Browserslist query to a RegExp
@@ -112,6 +110,7 @@ Browserslist will take queries from tool option,
112
110
  [`browserslist-browserstack`]: https://github.com/xeroxinteractive/browserslist-browserstack
113
111
  [`browserslist-ga-export`]: https://github.com/browserslist/browserslist-ga-export
114
112
  [`browserslist-useragent`]: https://github.com/pastelsky/browserslist-useragent
113
+ [`browserslist-vscode`]: https://marketplace.visualstudio.com/items?itemName=webben.browserslist
115
114
  [`browserslist-ga`]: https://github.com/browserslist/browserslist-ga
116
115
  [`caniuse-api`]: https://github.com/Nyalab/caniuse-api
117
116
 
@@ -155,7 +154,7 @@ You need to do it regularly for two reasons:
155
154
  `last 2 versions` or `>1%`. For example, if you created your project
156
155
  2 years ago and did not update your dependencies, `last 1 version`
157
156
  will return 2 year old browsers.
158
- 2. `caiuse-lite` deduplication: to synchronize version in different tools.
157
+ 2. `caniuse-lite` deduplication: to synchronize version in different tools.
159
158
 
160
159
  > What is deduplication?
161
160
 
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
@@ -668,7 +668,7 @@ var QUERIES = [
668
668
  {
669
669
  regexp: /^last\s+(\d+)\s+electron\s+versions?$/i,
670
670
  select: function (context, versions) {
671
- return Object.keys(e2c).reverse().slice(-versions).map(function (i) {
671
+ return Object.keys(e2c).slice(-versions).map(function (i) {
672
672
  return 'chrome ' + e2c[i]
673
673
  })
674
674
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browserslist",
3
- "version": "4.14.4",
3
+ "version": "4.15.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",
@@ -8,22 +8,26 @@
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.30001135",
19
- "electron-to-chromium": "^1.3.570",
20
- "escalade": "^3.1.0",
21
- "node-releases": "^1.1.61"
18
+ "caniuse-lite": "^1.0.30001164",
19
+ "colorette": "^1.2.1",
20
+ "electron-to-chromium": "^1.3.612",
21
+ "escalade": "^3.1.1",
22
+ "node-releases": "^1.1.67"
22
23
  },
23
24
  "engines": {
24
25
  "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
25
26
  },
26
- "bin": "./cli.js",
27
+ "bin": {
28
+ "browserslist": "cli.js"
29
+ },
30
+ "types": "./index.d.ts",
27
31
  "browser": {
28
32
  "./node.js": "./browser.js",
29
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 : ''
@@ -53,10 +59,62 @@ function getCurrentVersion (lock) {
53
59
  return null
54
60
  }
55
61
 
56
- function getLatestInfo () {
57
- return JSON.parse(
58
- childProcess.execSync('npm show caniuse-lite --json').toString()
62
+ function getLatestInfo (lock) {
63
+ if (lock.mode !== 'yarn') {
64
+ return JSON.parse(
65
+ childProcess.execSync('npm show caniuse-lite --json').toString()
66
+ )
67
+ } else {
68
+ return JSON.parse(
69
+ childProcess.execSync('yarn info caniuse-lite --json').toString()
70
+ ).data
71
+ }
72
+ }
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
+ })
59
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')
60
118
  }
61
119
 
62
120
  function updateLockfile (lock, latest) {
@@ -119,29 +177,81 @@ module.exports = function updateDB (print) {
119
177
  lock.content = fs.readFileSync(lock.file).toString()
120
178
 
121
179
  var current = getCurrentVersion(lock)
122
- var latest = getLatestInfo()
180
+ var latest = getLatestInfo(lock)
181
+ var browsersListRetrievalError
182
+ var oldBrowsersList
183
+ try {
184
+ oldBrowsersList = getBrowsersList()
185
+ } catch (e) {
186
+ browsersListRetrievalError = e
187
+ }
123
188
 
124
189
  if (typeof current === 'string') {
125
- print('Current version: ' + current + '\n')
190
+ print('Current version: ' + bold(red(current)) + '\n')
126
191
  }
127
192
  print(
128
- 'New version: ' + latest.version + '\n' +
129
- 'Removing old caniuse-lite from lock file…\n'
193
+ 'New version: ' + bold(green(latest.version)) + '\n' +
194
+ 'Removing old caniuse-lite from lock file\n'
130
195
  )
131
196
 
132
197
  fs.writeFileSync(lock.file, updateLockfile(lock, latest))
133
198
 
199
+ var install = lock.mode === 'yarn' ? 'yarn add -W' : lock.mode + ' install'
134
200
  print(
135
- 'Installing new caniuse-lite version…\n' +
136
- '$ ' + lock.mode + ' install\n'
201
+ 'Installing new caniuse-lite version\n' +
202
+ yellow('$ ' + install + ' caniuse-lite') + '\n'
137
203
  )
138
204
  try {
139
- childProcess.execSync(lock.mode + ' install')
205
+ childProcess.execSync(install + ' caniuse-lite')
140
206
  } catch (e) /* istanbul ignore next */ {
141
- print(e.stack)
142
- 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
+ )
143
215
  process.exit(1)
144
216
  }
145
217
 
218
+ var del = lock.mode === 'yarn' ? 'yarn remove -W' : lock.mode + ' uninstall'
219
+ print(
220
+ 'Cleaning package.json dependencies from caniuse-lite\n' +
221
+ yellow('$ ' + del + ' caniuse-lite') + '\n'
222
+ )
223
+ childProcess.execSync(del + ' caniuse-lite')
224
+
146
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
+ }
147
257
  }