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/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(fs.readFileSync(file))
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 --update-db\n' +
388
+ ' npx update-browserslist-db@latest\n' +
384
389
  ' Why you should do it regularly: ' +
385
- 'https://github.com/browserslist/browserslist#browsers-data-updating'
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.20.3",
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.30001332",
25
- "electron-to-chromium": "^1.4.118",
26
- "escalade": "^3.1.1",
27
- "node-releases": "^2.0.3",
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
- }