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 +12 -0
- package/README.md +12 -5
- package/index.js +7 -0
- package/node.js +1 -1
- package/package.json +4 -4
- package/update-db.js +118 -82
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 =
|
|
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.
|
|
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.
|
|
18
|
+
"caniuse-lite": "^1.0.30001181",
|
|
19
19
|
"colorette": "^1.2.1",
|
|
20
|
-
"electron-to-chromium": "^1.3.
|
|
20
|
+
"electron-to-chromium": "^1.3.649",
|
|
21
21
|
"escalade": "^3.1.1",
|
|
22
|
-
"node-releases": "^1.1.
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
146
|
-
for (i =
|
|
147
|
-
if (lines[i].indexOf('
|
|
148
|
-
lines[i
|
|
149
|
-
/
|
|
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
|
-
|
|
155
|
-
|
|
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
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
|
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
|
-
|
|
190
|
-
|
|
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
|
-
'
|
|
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 + '
|
|
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
|
|
277
|
+
'Problem with browser list retrieval.\n' +
|
|
242
278
|
'Target browser changes won’t be shown.\n'
|
|
243
279
|
)
|
|
244
280
|
)
|