browserslist 4.20.3 → 4.21.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/cli.js +3 -4
- package/index.d.ts +20 -0
- package/index.js +259 -306
- package/node.js +8 -3
- package/package.json +5 -6
- package/parse.js +78 -0
- package/update-db.js +0 -317
package/node.js
CHANGED
|
@@ -94,7 +94,12 @@ function pickEnv(config, opts) {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
function parsePackage(file) {
|
|
97
|
-
var config = JSON.parse(
|
|
97
|
+
var config = JSON.parse(
|
|
98
|
+
fs
|
|
99
|
+
.readFileSync(file)
|
|
100
|
+
.toString()
|
|
101
|
+
.replace(/^\uFEFF/m, '')
|
|
102
|
+
)
|
|
98
103
|
if (config.browserlist && !config.browserslist) {
|
|
99
104
|
throw new BrowserslistError(
|
|
100
105
|
'`browserlist` key instead of `browserslist` in ' + file
|
|
@@ -380,9 +385,9 @@ module.exports = {
|
|
|
380
385
|
if (latest !== 0 && latest < halfYearAgo) {
|
|
381
386
|
console.warn(
|
|
382
387
|
'Browserslist: caniuse-lite is outdated. Please run:\n' +
|
|
383
|
-
' npx browserslist@latest
|
|
388
|
+
' npx update-browserslist-db@latest\n' +
|
|
384
389
|
' Why you should do it regularly: ' +
|
|
385
|
-
'https://github.com/browserslist/
|
|
390
|
+
'https://github.com/browserslist/update-db#readme'
|
|
386
391
|
)
|
|
387
392
|
}
|
|
388
393
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "browserslist",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.21.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",
|
|
@@ -21,11 +21,10 @@
|
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"repository": "browserslist/browserslist",
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"caniuse-lite": "^1.0.
|
|
25
|
-
"electron-to-chromium": "^1.4.
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"picocolors": "^1.0.0"
|
|
24
|
+
"caniuse-lite": "^1.0.30001359",
|
|
25
|
+
"electron-to-chromium": "^1.4.172",
|
|
26
|
+
"node-releases": "^2.0.5",
|
|
27
|
+
"update-browserslist-db": "^1.0.4"
|
|
29
28
|
},
|
|
30
29
|
"engines": {
|
|
31
30
|
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
|
package/parse.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
var AND_REGEXP = /^\s+and\s+(.*)/i
|
|
2
|
+
var OR_REGEXP = /^(?:,\s*|\s+or\s+)(.*)/i
|
|
3
|
+
|
|
4
|
+
function flatten(array) {
|
|
5
|
+
if (!Array.isArray(array)) return [array]
|
|
6
|
+
return array.reduce(function (a, b) {
|
|
7
|
+
return a.concat(flatten(b))
|
|
8
|
+
}, [])
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function find(string, predicate) {
|
|
12
|
+
for (var n = 1, max = string.length; n <= max; n++) {
|
|
13
|
+
var parsed = string.substr(-n, n)
|
|
14
|
+
if (predicate(parsed, n, max)) {
|
|
15
|
+
return string.slice(0, -n)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return ''
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function matchQuery(all, query) {
|
|
22
|
+
var node = { query: query }
|
|
23
|
+
if (query.indexOf('not ') === 0) {
|
|
24
|
+
node.not = true
|
|
25
|
+
query = query.slice(4)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
for (var name in all) {
|
|
29
|
+
var type = all[name]
|
|
30
|
+
var match = query.match(type.regexp)
|
|
31
|
+
if (match) {
|
|
32
|
+
node.type = name
|
|
33
|
+
for (var i = 0; i < type.matches.length; i++) {
|
|
34
|
+
node[type.matches[i]] = match[i + 1]
|
|
35
|
+
}
|
|
36
|
+
return node
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
node.type = 'unknown'
|
|
41
|
+
return node
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function matchBlock(all, string, qs) {
|
|
45
|
+
var node
|
|
46
|
+
return find(string, function (parsed, n, max) {
|
|
47
|
+
if (AND_REGEXP.test(parsed)) {
|
|
48
|
+
node = matchQuery(all, parsed.match(AND_REGEXP)[1])
|
|
49
|
+
node.compose = 'and'
|
|
50
|
+
qs.unshift(node)
|
|
51
|
+
return true
|
|
52
|
+
} else if (OR_REGEXP.test(parsed)) {
|
|
53
|
+
node = matchQuery(all, parsed.match(OR_REGEXP)[1])
|
|
54
|
+
node.compose = 'or'
|
|
55
|
+
qs.unshift(node)
|
|
56
|
+
return true
|
|
57
|
+
} else if (n === max) {
|
|
58
|
+
node = matchQuery(all, parsed.trim())
|
|
59
|
+
node.compose = 'or'
|
|
60
|
+
qs.unshift(node)
|
|
61
|
+
return true
|
|
62
|
+
}
|
|
63
|
+
return false
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = function parse(all, queries) {
|
|
68
|
+
if (!Array.isArray(queries)) queries = [queries]
|
|
69
|
+
return flatten(
|
|
70
|
+
queries.map(function (block) {
|
|
71
|
+
var qs = []
|
|
72
|
+
do {
|
|
73
|
+
block = matchBlock(all, block, qs)
|
|
74
|
+
} while (block)
|
|
75
|
+
return qs
|
|
76
|
+
})
|
|
77
|
+
)
|
|
78
|
+
}
|
package/update-db.js
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
var childProcess = require('child_process')
|
|
2
|
-
var escalade = require('escalade/sync')
|
|
3
|
-
var pico = require('picocolors')
|
|
4
|
-
var path = require('path')
|
|
5
|
-
var fs = require('fs')
|
|
6
|
-
|
|
7
|
-
var BrowserslistError = require('./error')
|
|
8
|
-
|
|
9
|
-
function detectLockfile() {
|
|
10
|
-
var packageDir = escalade('.', function (dir, names) {
|
|
11
|
-
return names.indexOf('package.json') !== -1 ? dir : ''
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
if (!packageDir) {
|
|
15
|
-
throw new BrowserslistError(
|
|
16
|
-
'Cannot find package.json. ' +
|
|
17
|
-
'Is this the right directory to run `npx browserslist --update-db` in?'
|
|
18
|
-
)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
var lockfileNpm = path.join(packageDir, 'package-lock.json')
|
|
22
|
-
var lockfileShrinkwrap = path.join(packageDir, 'npm-shrinkwrap.json')
|
|
23
|
-
var lockfileYarn = path.join(packageDir, 'yarn.lock')
|
|
24
|
-
var lockfilePnpm = path.join(packageDir, 'pnpm-lock.yaml')
|
|
25
|
-
|
|
26
|
-
if (fs.existsSync(lockfilePnpm)) {
|
|
27
|
-
return { mode: 'pnpm', file: lockfilePnpm }
|
|
28
|
-
} else if (fs.existsSync(lockfileNpm)) {
|
|
29
|
-
return { mode: 'npm', file: lockfileNpm }
|
|
30
|
-
} else if (fs.existsSync(lockfileYarn)) {
|
|
31
|
-
var lock = { mode: 'yarn', file: lockfileYarn }
|
|
32
|
-
lock.content = fs.readFileSync(lock.file).toString()
|
|
33
|
-
lock.version = /# yarn lockfile v1/.test(lock.content) ? 1 : 2
|
|
34
|
-
return lock
|
|
35
|
-
} else if (fs.existsSync(lockfileShrinkwrap)) {
|
|
36
|
-
return { mode: 'npm', file: lockfileShrinkwrap }
|
|
37
|
-
}
|
|
38
|
-
throw new BrowserslistError(
|
|
39
|
-
'No lockfile found. Run "npm install", "yarn install" or "pnpm install"'
|
|
40
|
-
)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function getLatestInfo(lock) {
|
|
44
|
-
if (lock.mode === 'yarn') {
|
|
45
|
-
if (lock.version === 1) {
|
|
46
|
-
return JSON.parse(
|
|
47
|
-
childProcess.execSync('yarn info caniuse-lite --json').toString()
|
|
48
|
-
).data
|
|
49
|
-
} else {
|
|
50
|
-
return JSON.parse(
|
|
51
|
-
childProcess.execSync('yarn npm info caniuse-lite --json').toString()
|
|
52
|
-
)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return JSON.parse(
|
|
56
|
-
childProcess.execSync('npm show caniuse-lite --json').toString()
|
|
57
|
-
)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function getBrowsersList() {
|
|
61
|
-
return childProcess
|
|
62
|
-
.execSync('npx browserslist')
|
|
63
|
-
.toString()
|
|
64
|
-
.trim()
|
|
65
|
-
.split('\n')
|
|
66
|
-
.map(function (line) {
|
|
67
|
-
return line.trim().split(' ')
|
|
68
|
-
})
|
|
69
|
-
.reduce(function (result, entry) {
|
|
70
|
-
if (!result[entry[0]]) {
|
|
71
|
-
result[entry[0]] = []
|
|
72
|
-
}
|
|
73
|
-
result[entry[0]].push(entry[1])
|
|
74
|
-
return result
|
|
75
|
-
}, {})
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function diffBrowsersLists(old, current) {
|
|
79
|
-
var browsers = Object.keys(old).concat(
|
|
80
|
-
Object.keys(current).filter(function (browser) {
|
|
81
|
-
return old[browser] === undefined
|
|
82
|
-
})
|
|
83
|
-
)
|
|
84
|
-
return browsers
|
|
85
|
-
.map(function (browser) {
|
|
86
|
-
var oldVersions = old[browser] || []
|
|
87
|
-
var currentVersions = current[browser] || []
|
|
88
|
-
var intersection = oldVersions.filter(function (version) {
|
|
89
|
-
return currentVersions.indexOf(version) !== -1
|
|
90
|
-
})
|
|
91
|
-
var addedVersions = currentVersions.filter(function (version) {
|
|
92
|
-
return intersection.indexOf(version) === -1
|
|
93
|
-
})
|
|
94
|
-
var removedVersions = oldVersions.filter(function (version) {
|
|
95
|
-
return intersection.indexOf(version) === -1
|
|
96
|
-
})
|
|
97
|
-
return removedVersions
|
|
98
|
-
.map(function (version) {
|
|
99
|
-
return pico.red('- ' + browser + ' ' + version)
|
|
100
|
-
})
|
|
101
|
-
.concat(
|
|
102
|
-
addedVersions.map(function (version) {
|
|
103
|
-
return pico.green('+ ' + browser + ' ' + version)
|
|
104
|
-
})
|
|
105
|
-
)
|
|
106
|
-
})
|
|
107
|
-
.reduce(function (result, array) {
|
|
108
|
-
return result.concat(array)
|
|
109
|
-
}, [])
|
|
110
|
-
.join('\n')
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function updateNpmLockfile(lock, latest) {
|
|
114
|
-
var metadata = { latest: latest, versions: [] }
|
|
115
|
-
var content = deletePackage(JSON.parse(lock.content), metadata)
|
|
116
|
-
metadata.content = JSON.stringify(content, null, ' ')
|
|
117
|
-
return metadata
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function deletePackage(node, metadata) {
|
|
121
|
-
if (node.dependencies) {
|
|
122
|
-
if (node.dependencies['caniuse-lite']) {
|
|
123
|
-
var version = node.dependencies['caniuse-lite'].version
|
|
124
|
-
metadata.versions[version] = true
|
|
125
|
-
delete node.dependencies['caniuse-lite']
|
|
126
|
-
}
|
|
127
|
-
for (var i in node.dependencies) {
|
|
128
|
-
node.dependencies[i] = deletePackage(node.dependencies[i], metadata)
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return node
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
var yarnVersionRe = /version "(.*?)"/
|
|
135
|
-
|
|
136
|
-
function updateYarnLockfile(lock, latest) {
|
|
137
|
-
var blocks = lock.content.split(/(\n{2,})/).map(function (block) {
|
|
138
|
-
return block.split('\n')
|
|
139
|
-
})
|
|
140
|
-
var versions = {}
|
|
141
|
-
blocks.forEach(function (lines) {
|
|
142
|
-
if (lines[0].indexOf('caniuse-lite@') !== -1) {
|
|
143
|
-
var match = yarnVersionRe.exec(lines[1])
|
|
144
|
-
versions[match[1]] = true
|
|
145
|
-
if (match[1] !== latest.version) {
|
|
146
|
-
lines[1] = lines[1].replace(
|
|
147
|
-
/version "[^"]+"/,
|
|
148
|
-
'version "' + latest.version + '"'
|
|
149
|
-
)
|
|
150
|
-
lines[2] = lines[2].replace(
|
|
151
|
-
/resolved "[^"]+"/,
|
|
152
|
-
'resolved "' + latest.dist.tarball + '"'
|
|
153
|
-
)
|
|
154
|
-
if (lines.length === 4) {
|
|
155
|
-
lines[3] = latest.dist.integrity
|
|
156
|
-
? lines[3].replace(
|
|
157
|
-
/integrity .+/,
|
|
158
|
-
'integrity ' + latest.dist.integrity
|
|
159
|
-
)
|
|
160
|
-
: ''
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
})
|
|
165
|
-
var content = blocks
|
|
166
|
-
.map(function (lines) {
|
|
167
|
-
return lines.join('\n')
|
|
168
|
-
})
|
|
169
|
-
.join('')
|
|
170
|
-
return { content: content, versions: versions }
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
function updateLockfile(lock, latest) {
|
|
174
|
-
if (!lock.content) lock.content = fs.readFileSync(lock.file).toString()
|
|
175
|
-
|
|
176
|
-
if (lock.mode === 'yarn') {
|
|
177
|
-
return updateYarnLockfile(lock, latest)
|
|
178
|
-
} else {
|
|
179
|
-
return updateNpmLockfile(lock, latest)
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function updatePackageManually(print, lock, latest) {
|
|
184
|
-
var lockfileData = updateLockfile(lock, latest)
|
|
185
|
-
var caniuseVersions = Object.keys(lockfileData.versions).sort()
|
|
186
|
-
if (caniuseVersions.length === 1 && caniuseVersions[0] === latest.version) {
|
|
187
|
-
print(
|
|
188
|
-
'Installed version: ' +
|
|
189
|
-
pico.bold(pico.green(latest.version)) +
|
|
190
|
-
'\n' +
|
|
191
|
-
pico.bold(pico.green('caniuse-lite is up to date')) +
|
|
192
|
-
'\n'
|
|
193
|
-
)
|
|
194
|
-
return
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
if (caniuseVersions.length === 0) {
|
|
198
|
-
caniuseVersions[0] = 'none'
|
|
199
|
-
}
|
|
200
|
-
print(
|
|
201
|
-
'Installed version' +
|
|
202
|
-
(caniuseVersions.length === 1 ? ': ' : 's: ') +
|
|
203
|
-
pico.bold(pico.red(caniuseVersions.join(', '))) +
|
|
204
|
-
'\n' +
|
|
205
|
-
'Removing old caniuse-lite from lock file\n'
|
|
206
|
-
)
|
|
207
|
-
fs.writeFileSync(lock.file, lockfileData.content)
|
|
208
|
-
|
|
209
|
-
var install = lock.mode === 'yarn' ? 'yarn add -W' : lock.mode + ' install'
|
|
210
|
-
print(
|
|
211
|
-
'Installing new caniuse-lite version\n' +
|
|
212
|
-
pico.yellow('$ ' + install + ' caniuse-lite') +
|
|
213
|
-
'\n'
|
|
214
|
-
)
|
|
215
|
-
try {
|
|
216
|
-
childProcess.execSync(install + ' caniuse-lite')
|
|
217
|
-
} catch (e) /* c8 ignore start */ {
|
|
218
|
-
print(
|
|
219
|
-
pico.red(
|
|
220
|
-
'\n' +
|
|
221
|
-
e.stack +
|
|
222
|
-
'\n\n' +
|
|
223
|
-
'Problem with `' +
|
|
224
|
-
install +
|
|
225
|
-
' caniuse-lite` call. ' +
|
|
226
|
-
'Run it manually.\n'
|
|
227
|
-
)
|
|
228
|
-
)
|
|
229
|
-
process.exit(1)
|
|
230
|
-
} /* c8 ignore end */
|
|
231
|
-
|
|
232
|
-
var del = lock.mode === 'yarn' ? 'yarn remove -W' : lock.mode + ' uninstall'
|
|
233
|
-
print(
|
|
234
|
-
'Cleaning package.json dependencies from caniuse-lite\n' +
|
|
235
|
-
pico.yellow('$ ' + del + ' caniuse-lite') +
|
|
236
|
-
'\n'
|
|
237
|
-
)
|
|
238
|
-
childProcess.execSync(del + ' caniuse-lite')
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
function updateWith(print, cmd) {
|
|
242
|
-
print('Updating caniuse-lite version\n' + pico.yellow('$ ' + cmd) + '\n')
|
|
243
|
-
try {
|
|
244
|
-
childProcess.execSync(cmd)
|
|
245
|
-
} catch (e) /* c8 ignore start */ {
|
|
246
|
-
print(pico.red(e.stdout.toString()))
|
|
247
|
-
print(
|
|
248
|
-
pico.red(
|
|
249
|
-
'\n' +
|
|
250
|
-
e.stack +
|
|
251
|
-
'\n\n' +
|
|
252
|
-
'Problem with `' +
|
|
253
|
-
cmd +
|
|
254
|
-
'` call. ' +
|
|
255
|
-
'Run it manually.\n'
|
|
256
|
-
)
|
|
257
|
-
)
|
|
258
|
-
process.exit(1)
|
|
259
|
-
} /* c8 ignore end */
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
module.exports = function updateDB(print) {
|
|
263
|
-
var lock = detectLockfile()
|
|
264
|
-
var latest = getLatestInfo(lock)
|
|
265
|
-
|
|
266
|
-
var browsersListRetrievalError
|
|
267
|
-
var oldBrowsersList
|
|
268
|
-
try {
|
|
269
|
-
oldBrowsersList = getBrowsersList()
|
|
270
|
-
} catch (e) {
|
|
271
|
-
browsersListRetrievalError = e
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
print('Latest version: ' + pico.bold(pico.green(latest.version)) + '\n')
|
|
275
|
-
|
|
276
|
-
if (lock.mode === 'yarn' && lock.version !== 1) {
|
|
277
|
-
updateWith(print, 'yarn up -R caniuse-lite')
|
|
278
|
-
} else if (lock.mode === 'pnpm') {
|
|
279
|
-
updateWith(print, 'pnpm up caniuse-lite')
|
|
280
|
-
} else {
|
|
281
|
-
updatePackageManually(print, lock, latest)
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
print('caniuse-lite has been successfully updated\n')
|
|
285
|
-
|
|
286
|
-
var currentBrowsersList
|
|
287
|
-
if (!browsersListRetrievalError) {
|
|
288
|
-
try {
|
|
289
|
-
currentBrowsersList = getBrowsersList()
|
|
290
|
-
} catch (e) /* c8 ignore start */ {
|
|
291
|
-
browsersListRetrievalError = e
|
|
292
|
-
} /* c8 ignore end */
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
if (browsersListRetrievalError) {
|
|
296
|
-
print(
|
|
297
|
-
pico.red(
|
|
298
|
-
'\n' +
|
|
299
|
-
browsersListRetrievalError.stack +
|
|
300
|
-
'\n\n' +
|
|
301
|
-
'Problem with browser list retrieval.\n' +
|
|
302
|
-
'Target browser changes won’t be shown.\n'
|
|
303
|
-
)
|
|
304
|
-
)
|
|
305
|
-
} else {
|
|
306
|
-
var targetBrowserChanges = diffBrowsersLists(
|
|
307
|
-
oldBrowsersList,
|
|
308
|
-
currentBrowsersList
|
|
309
|
-
)
|
|
310
|
-
if (targetBrowserChanges) {
|
|
311
|
-
print('\nTarget browser changes:\n')
|
|
312
|
-
print(targetBrowserChanges + '\n')
|
|
313
|
-
} else {
|
|
314
|
-
print('\n' + pico.green('No target browser changes') + '\n')
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|