browserslist 4.28.3 → 4.28.4

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.
Files changed (4) hide show
  1. package/cli.js +1 -0
  2. package/index.js +29 -2
  3. package/node.js +6 -1
  4. package/package.json +1 -1
package/cli.js CHANGED
@@ -38,6 +38,7 @@ if (isArg('--help') || isArg('-h')) {
38
38
  } else if (isArg('--version') || isArg('-v')) {
39
39
  process.stdout.write('browserslist ' + pkg.version + '\n')
40
40
  } else if (isArg('--update-db')) {
41
+ /* c8 ignore next 8 */
41
42
  process.stdout.write(
42
43
  'The --update-db command is deprecated.\n' +
43
44
  'Please use npx update-browserslist-db@latest instead.\n'
package/index.js CHANGED
@@ -7,13 +7,14 @@ var path = require('path')
7
7
 
8
8
  var BrowserslistError = require('./error')
9
9
  var env = require('./node')
10
- var parseWithoutCache = require('./parse')
10
+ var parseWithoutCache = require('./parse') // Will load browser.js in webpack
11
11
 
12
12
  var YEAR = 365.259641 * 24 * 60 * 60 * 1000
13
13
  var ANDROID_EVERGREEN_FIRST = '37'
14
14
  var OP_MOB_BLINK_FIRST = 14
15
15
  var FIREFOX_ESR_VERSION = '140'
16
16
 
17
+ // Helpers
17
18
 
18
19
  function isVersionsMatch(versionA, versionB) {
19
20
  return (versionA + '.').indexOf(versionB + '.') === 0
@@ -149,11 +150,14 @@ function compareSemver(a, b) {
149
150
  )
150
151
  }
151
152
 
153
+ // this follows the npm-like semver behavior
152
154
  function semverFilterLoose(operator, range) {
153
155
  range = range.split('.').map(parseSimpleInt)
154
156
  if (typeof range[1] === 'undefined') {
155
157
  range[1] = 'x'
156
158
  }
159
+ // ignore any patch version because we only return minor versions
160
+ // range[2] = 'x'
157
161
  switch (operator) {
158
162
  case '<=':
159
163
  return function (version) {
@@ -169,6 +173,7 @@ function semverFilterLoose(operator, range) {
169
173
  }
170
174
  }
171
175
 
176
+ // this follows the npm-like semver behavior
172
177
  function compareSemverLoose(version, range) {
173
178
  if (version[0] !== range[0]) {
174
179
  return version[0] < range[0] ? -1 : +1
@@ -289,6 +294,8 @@ function unknownQuery(query) {
289
294
  )
290
295
  }
291
296
 
297
+ // Adjusts last X versions queries for some mobile browsers,
298
+ // where caniuse data jumps from a legacy version to the latest
292
299
  function filterJumps(list, name, nVersions, context) {
293
300
  var jump = 1
294
301
  switch (name) {
@@ -411,6 +418,7 @@ function browserslist(queries, opts) {
411
418
  mobileToDesktop: opts.mobileToDesktop,
412
419
  env: opts.env
413
420
  }
421
+ // Removing to avoid using context.path without marking query as needsPath
414
422
  if (needsPath) {
415
423
  context.path = opts.path
416
424
  }
@@ -431,6 +439,9 @@ function browserslist(queries, opts) {
431
439
  name1 = name1.split(' ')
432
440
  name2 = name2.split(' ')
433
441
  if (name1[0] === name2[0]) {
442
+ // assumptions on caniuse data
443
+ // 1) version ranges never overlaps
444
+ // 2) if version is not a range, it never contains `-`
434
445
  var version1 = name1[1].split('-')[0]
435
446
  var version2 = name2[1].split('-')[0]
436
447
  return compareSemver(version2.split('.'), version1.split('.'))
@@ -475,6 +486,7 @@ browserslist.parse = function (queries, opts) {
475
486
  return parseQueries(queries)
476
487
  }
477
488
 
489
+ // Will be filled by Can I Use data below
478
490
  browserslist.cache = {}
479
491
  browserslist.data = {}
480
492
  browserslist.usage = {
@@ -482,8 +494,10 @@ browserslist.usage = {
482
494
  custom: null
483
495
  }
484
496
 
497
+ // Default browsers query
485
498
  browserslist.defaults = ['> 0.5%', 'last 2 versions', 'Firefox ESR', 'not dead']
486
499
 
500
+ // Browser names aliases
487
501
  browserslist.aliases = {
488
502
  fx: 'firefox',
489
503
  ff: 'firefox',
@@ -499,13 +513,17 @@ browserslist.aliases = {
499
513
  qqandroid: 'and_qq'
500
514
  }
501
515
 
516
+ // Can I Use only provides a few versions for some browsers (e.g. and_chr).
517
+ // Fallback to a similar browser for unknown versions
518
+ // Note op_mob is not included as its chromium versions are not in sync with Opera desktop
502
519
  browserslist.desktopNames = {
503
520
  and_chr: 'chrome',
504
521
  and_ff: 'firefox',
505
522
  ie_mob: 'ie',
506
- android: 'chrome'
523
+ android: 'chrome' // has extra processing logic
507
524
  }
508
525
 
526
+ // Aliases to work with joined versions like `ios_saf 7.0-7.1`
509
527
  browserslist.versionAliases = {}
510
528
 
511
529
  browserslist.clearCaches = env.clearCaches
@@ -798,6 +816,13 @@ var QUERIES = {
798
816
  },
799
817
  baseline: {
800
818
  matches: ['year', 'availability', 'date', 'downstream', 'kaios'],
819
+ // Matches:
820
+ // baseline 2024
821
+ // baseline newly available
822
+ // baseline widely available
823
+ // baseline widely available on 2024-06-01
824
+ // ...with downstream
825
+ // ...including kaios
801
826
  regexp:
802
827
  /^baseline\s+(?:(\d+)|(newly|widely)\s+available(?:\s+on\s+(\d{4}-\d{2}-\d{2}))?)?(\s+with\s+downstream)?(\s+including\s+kaios)?$/i,
803
828
  select: function (context, node) {
@@ -996,6 +1021,7 @@ var QUERIES = {
996
1021
  var result = []
997
1022
  for (var name in features) {
998
1023
  var data = byName(name, context)
1024
+ // Only check desktop when latest released mobile has support
999
1025
  var iMax = data.released.length - 1
1000
1026
  while (iMax >= 0) {
1001
1027
  if (data.released[iMax] in features[name]) break
@@ -1277,6 +1303,7 @@ var QUERIES = {
1277
1303
  }
1278
1304
  }
1279
1305
 
1306
+ // Get and convert Can I Use data
1280
1307
 
1281
1308
  ;(function () {
1282
1309
  for (var name in agents) {
package/node.js CHANGED
@@ -27,7 +27,7 @@ function checkExtend(name) {
27
27
  'Browserslist config needs `browserslist-config-` prefix. ' + use
28
28
  )
29
29
  }
30
- if (name.replace(/^@[^/]+\
30
+ if (name.replace(/^@[^/]+\//, '').indexOf('.') !== -1) {
31
31
  throw new BrowserslistError(
32
32
  '`.` not allowed in Browserslist config name. ' + use
33
33
  )
@@ -44,6 +44,7 @@ function getPathType(filepath) {
44
44
  try {
45
45
  stats = fs.existsSync(filepath) && fs.statSync(filepath)
46
46
  } catch (err) {
47
+ /* c8 ignore start */
47
48
  if (
48
49
  err.code !== 'ENOENT' &&
49
50
  err.code !== 'EACCES' &&
@@ -51,6 +52,7 @@ function getPathType(filepath) {
51
52
  ) {
52
53
  throw err
53
54
  }
55
+ /* c8 ignore end */
54
56
  }
55
57
 
56
58
  if (stats && stats.isDirectory()) return PATHTYPE_DIR
@@ -237,6 +239,8 @@ function normalizeStats(data, stats) {
237
239
  function normalizeUsageData(usageData, data) {
238
240
  for (var browser in usageData) {
239
241
  var browserUsage = usageData[browser]
242
+ // https://github.com/browserslist/browserslist/issues/431#issuecomment-565230615
243
+ // caniuse-db returns { 0: "percentage" } for `and_*` regional stats
240
244
  if ('0' in browserUsage) {
241
245
  var versions = data[browser].versions
242
246
  browserUsage[versions[versions.length - 1]] = browserUsage[0]
@@ -275,6 +279,7 @@ module.exports = {
275
279
  checkExtend(name)
276
280
  }
277
281
  var stats = require(
282
+ // Use forward slashes for module paths, also on Windows.
278
283
  require.resolve(path.posix.join(name, 'browserslist-stats.json'), {
279
284
  paths: ['.']
280
285
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browserslist",
3
- "version": "4.28.3",
3
+ "version": "4.28.4",
4
4
  "description": "Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset",
5
5
  "keywords": [
6
6
  "browsers",