browserslist 4.17.5 → 4.19.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/index.js CHANGED
@@ -13,45 +13,42 @@ var ANDROID_EVERGREEN_FIRST = 37
13
13
  var QUERY_OR = 1
14
14
  var QUERY_AND = 2
15
15
 
16
- function isVersionsMatch (versionA, versionB) {
16
+ function isVersionsMatch(versionA, versionB) {
17
17
  return (versionA + '.').indexOf(versionB + '.') === 0
18
18
  }
19
19
 
20
- function isEolReleased (name) {
20
+ function isEolReleased(name) {
21
21
  var version = name.slice(1)
22
22
  return jsReleases.some(function (i) {
23
23
  return isVersionsMatch(i.version, version)
24
24
  })
25
25
  }
26
26
 
27
- function normalize (versions) {
27
+ function normalize(versions) {
28
28
  return versions.filter(function (version) {
29
29
  return typeof version === 'string'
30
30
  })
31
31
  }
32
32
 
33
- function normalizeElectron (version) {
33
+ function normalizeElectron(version) {
34
34
  var versionToUse = version
35
35
  if (version.split('.').length === 3) {
36
- versionToUse = version
37
- .split('.')
38
- .slice(0, -1)
39
- .join('.')
36
+ versionToUse = version.split('.').slice(0, -1).join('.')
40
37
  }
41
38
  return versionToUse
42
39
  }
43
40
 
44
- function nameMapper (name) {
45
- return function mapName (version) {
41
+ function nameMapper(name) {
42
+ return function mapName(version) {
46
43
  return name + ' ' + version
47
44
  }
48
45
  }
49
46
 
50
- function getMajor (version) {
47
+ function getMajor(version) {
51
48
  return parseInt(version.split('.')[0])
52
49
  }
53
50
 
54
- function getMajorVersions (released, number) {
51
+ function getMajorVersions(released, number) {
55
52
  if (released.length === 0) return []
56
53
  var majorVersions = uniq(released.map(getMajor))
57
54
  var minimum = majorVersions[majorVersions.length - number]
@@ -66,7 +63,7 @@ function getMajorVersions (released, number) {
66
63
  return selected
67
64
  }
68
65
 
69
- function uniq (array) {
66
+ function uniq(array) {
70
67
  var filtered = []
71
68
  for (var i = 0; i < array.length; i++) {
72
69
  if (filtered.indexOf(array[i]) === -1) filtered.push(array[i])
@@ -76,13 +73,13 @@ function uniq (array) {
76
73
 
77
74
  // Helpers
78
75
 
79
- function fillUsage (result, name, data) {
76
+ function fillUsage(result, name, data) {
80
77
  for (var i in data) {
81
78
  result[name + ' ' + i] = data[i]
82
79
  }
83
80
  }
84
81
 
85
- function generateFilter (sign, version) {
82
+ function generateFilter(sign, version) {
86
83
  version = parseFloat(version)
87
84
  if (sign === '>') {
88
85
  return function (v) {
@@ -103,7 +100,7 @@ function generateFilter (sign, version) {
103
100
  }
104
101
  }
105
102
 
106
- function generateSemverFilter (sign, version) {
103
+ function generateSemverFilter(sign, version) {
107
104
  version = version.split('.').map(parseSimpleInt)
108
105
  version[1] = version[1] || 0
109
106
  version[2] = version[2] || 0
@@ -130,17 +127,17 @@ function generateSemverFilter (sign, version) {
130
127
  }
131
128
  }
132
129
 
133
- function parseSimpleInt (x) {
130
+ function parseSimpleInt(x) {
134
131
  return parseInt(x)
135
132
  }
136
133
 
137
- function compare (a, b) {
134
+ function compare(a, b) {
138
135
  if (a < b) return -1
139
136
  if (a > b) return +1
140
137
  return 0
141
138
  }
142
139
 
143
- function compareSemver (a, b) {
140
+ function compareSemver(a, b) {
144
141
  return (
145
142
  compare(parseInt(a[0]), parseInt(b[0])) ||
146
143
  compare(parseInt(a[1] || '0'), parseInt(b[1] || '0')) ||
@@ -149,7 +146,7 @@ function compareSemver (a, b) {
149
146
  }
150
147
 
151
148
  // this follows the npm-like semver behavior
152
- function semverFilterLoose (operator, range) {
149
+ function semverFilterLoose(operator, range) {
153
150
  range = range.split('.').map(parseSimpleInt)
154
151
  if (typeof range[1] === 'undefined') {
155
152
  range[1] = 'x'
@@ -162,8 +159,8 @@ function semverFilterLoose (operator, range) {
162
159
  version = version.split('.').map(parseSimpleInt)
163
160
  return compareSemverLoose(version, range) <= 0
164
161
  }
165
- default:
166
162
  case '>=':
163
+ default:
167
164
  return function (version) {
168
165
  version = version.split('.').map(parseSimpleInt)
169
166
  return compareSemverLoose(version, range) >= 0
@@ -172,7 +169,7 @@ function semverFilterLoose (operator, range) {
172
169
  }
173
170
 
174
171
  // this follows the npm-like semver behavior
175
- function compareSemverLoose (version, range) {
172
+ function compareSemverLoose(version, range) {
176
173
  if (version[0] !== range[0]) {
177
174
  return version[0] < range[0] ? -1 : +1
178
175
  }
@@ -185,7 +182,7 @@ function compareSemverLoose (version, range) {
185
182
  return 0
186
183
  }
187
184
 
188
- function resolveVersion (data, version) {
185
+ function resolveVersion(data, version) {
189
186
  if (data.versions.indexOf(version) !== -1) {
190
187
  return version
191
188
  } else if (browserslist.versionAliases[data.name][version]) {
@@ -195,7 +192,7 @@ function resolveVersion (data, version) {
195
192
  }
196
193
  }
197
194
 
198
- function normalizeVersion (data, version) {
195
+ function normalizeVersion(data, version) {
199
196
  var resolved = resolveVersion(data, version)
200
197
  if (resolved) {
201
198
  return resolved
@@ -206,19 +203,20 @@ function normalizeVersion (data, version) {
206
203
  }
207
204
  }
208
205
 
209
- function filterByYear (since, context) {
206
+ function filterByYear(since, context) {
210
207
  since = since / 1000
211
208
  return Object.keys(agents).reduce(function (selected, name) {
212
209
  var data = byName(name, context)
213
210
  if (!data) return selected
214
211
  var versions = Object.keys(data.releaseDate).filter(function (v) {
215
- return data.releaseDate[v] >= since
212
+ var date = data.releaseDate[v]
213
+ return date !== null && date >= since
216
214
  })
217
215
  return selected.concat(versions.map(nameMapper(data.name)))
218
216
  }, [])
219
217
  }
220
218
 
221
- function cloneData (data) {
219
+ function cloneData(data) {
222
220
  return {
223
221
  name: data.name,
224
222
  versions: data.versions,
@@ -227,14 +225,14 @@ function cloneData (data) {
227
225
  }
228
226
  }
229
227
 
230
- function mapVersions (data, map) {
228
+ function mapVersions(data, map) {
231
229
  data.versions = data.versions.map(function (i) {
232
230
  return map[i] || i
233
231
  })
234
232
  data.released = data.versions.map(function (i) {
235
233
  return map[i] || i
236
234
  })
237
- var fixedDate = { }
235
+ var fixedDate = {}
238
236
  for (var i in data.releaseDate) {
239
237
  fixedDate[map[i] || i] = data.releaseDate[i]
240
238
  }
@@ -242,7 +240,7 @@ function mapVersions (data, map) {
242
240
  return data
243
241
  }
244
242
 
245
- function byName (name, context) {
243
+ function byName(name, context) {
246
244
  name = name.toLowerCase()
247
245
  name = browserslist.aliases[name] || name
248
246
  if (context.mobileToDesktop && browserslist.desktopNames[name]) {
@@ -261,34 +259,38 @@ function byName (name, context) {
261
259
  return browserslist.data[name]
262
260
  }
263
261
 
264
- function normalizeAndroidVersions (androidVersions, chromeVersions) {
262
+ function normalizeAndroidVersions(androidVersions, chromeVersions) {
265
263
  var firstEvergreen = ANDROID_EVERGREEN_FIRST
266
264
  var last = chromeVersions[chromeVersions.length - 1]
267
265
  return androidVersions
268
- .filter(function (version) { return /^(?:[2-4]\.|[34]$)/.test(version) })
266
+ .filter(function (version) {
267
+ return /^(?:[2-4]\.|[34]$)/.test(version)
268
+ })
269
269
  .concat(chromeVersions.slice(firstEvergreen - last - 1))
270
270
  }
271
271
 
272
- function normalizeAndroidData (android, chrome) {
272
+ function normalizeAndroidData(android, chrome) {
273
273
  android.released = normalizeAndroidVersions(android.released, chrome.released)
274
274
  android.versions = normalizeAndroidVersions(android.versions, chrome.versions)
275
275
  return android
276
276
  }
277
277
 
278
- function checkName (name, context) {
278
+ function checkName(name, context) {
279
279
  var data = byName(name, context)
280
280
  if (!data) throw new BrowserslistError('Unknown browser ' + name)
281
281
  return data
282
282
  }
283
283
 
284
- function unknownQuery (query) {
284
+ function unknownQuery(query) {
285
285
  return new BrowserslistError(
286
- 'Unknown browser query `' + query + '`. ' +
287
- 'Maybe you are using old Browserslist or made typo in query.'
286
+ 'Unknown browser query `' +
287
+ query +
288
+ '`. ' +
289
+ 'Maybe you are using old Browserslist or made typo in query.'
288
290
  )
289
291
  }
290
292
 
291
- function filterAndroid (list, versions, context) {
293
+ function filterAndroid(list, versions, context) {
292
294
  if (context.mobileToDesktop) return list
293
295
  var released = browserslist.data.android.released
294
296
  var last = released[released.length - 1]
@@ -308,7 +310,7 @@ function filterAndroid (list, versions, context) {
308
310
  * the select function in `queries`.
309
311
  * @returns {string[]} A list of browsers
310
312
  */
311
- function resolve (queries, context) {
313
+ function resolve(queries, context) {
312
314
  if (Array.isArray(queries)) {
313
315
  queries = flatten(queries.map(parse))
314
316
  } else {
@@ -323,7 +325,10 @@ function resolve (queries, context) {
323
325
  if (index === 0) {
324
326
  throw new BrowserslistError(
325
327
  'Write any browsers query (for instance, `defaults`) ' +
326
- 'before `' + selection + '`')
328
+ 'before `' +
329
+ selection +
330
+ '`'
331
+ )
327
332
  }
328
333
  selection = selection.slice(4)
329
334
  }
@@ -356,7 +361,7 @@ function resolve (queries, context) {
356
361
  case QUERY_OR:
357
362
  default:
358
363
  if (isExclude) {
359
- var filter = { }
364
+ var filter = {}
360
365
  array.forEach(function (j) {
361
366
  filter[j] = true
362
367
  })
@@ -373,7 +378,7 @@ function resolve (queries, context) {
373
378
  }, [])
374
379
  }
375
380
 
376
- var cache = { }
381
+ var cache = {}
377
382
 
378
383
  /**
379
384
  * Return array of browsers by selection queries.
@@ -392,6 +397,7 @@ var cache = { }
392
397
  * version in direct query.
393
398
  * @param {boolean} [opts.dangerousExtend] Disable security checks
394
399
  * for extend query.
400
+ * @param {boolean} [opts.throwOnMissing] Throw error on missing env.
395
401
  * @param {boolean} [opts.mobileToDesktop] Alias mobile browsers to the desktop
396
402
  * version when Can I Use doesn't have
397
403
  * data about the specified version.
@@ -400,8 +406,8 @@ var cache = { }
400
406
  * @example
401
407
  * browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8']
402
408
  */
403
- function browserslist (queries, opts) {
404
- if (typeof opts === 'undefined') opts = { }
409
+ function browserslist(queries, opts) {
410
+ if (typeof opts === 'undefined') opts = {}
405
411
 
406
412
  if (typeof opts.path === 'undefined') {
407
413
  opts.path = path.resolve ? path.resolve('.') : '.'
@@ -418,7 +424,8 @@ function browserslist (queries, opts) {
418
424
 
419
425
  if (!(typeof queries === 'string' || Array.isArray(queries))) {
420
426
  throw new BrowserslistError(
421
- 'Browser queries must be an array or string. Got ' + typeof queries + '.')
427
+ 'Browser queries must be an array or string. Got ' + typeof queries + '.'
428
+ )
422
429
  }
423
430
 
424
431
  var context = {
@@ -432,7 +439,7 @@ function browserslist (queries, opts) {
432
439
  env.oldDataWarning(browserslist.data)
433
440
  var stats = env.getStat(opts, browserslist.data)
434
441
  if (stats) {
435
- context.customUsage = { }
442
+ context.customUsage = {}
436
443
  for (var browser in stats) {
437
444
  fillUsage(context.customUsage, browser, stats[browser])
438
445
  }
@@ -461,7 +468,7 @@ function browserslist (queries, opts) {
461
468
  return result
462
469
  }
463
470
 
464
- function parse (queries) {
471
+ function parse(queries) {
465
472
  var qs = []
466
473
  do {
467
474
  queries = doMatch(queries, qs)
@@ -469,7 +476,7 @@ function parse (queries) {
469
476
  return qs
470
477
  }
471
478
 
472
- function doMatch (string, qs) {
479
+ function doMatch(string, qs) {
473
480
  var or = /^(?:,\s*|\s+or\s+)(.*)/i
474
481
  var and = /^\s+and\s+(.*)/i
475
482
 
@@ -488,7 +495,7 @@ function doMatch (string, qs) {
488
495
  })
489
496
  }
490
497
 
491
- function find (string, predicate) {
498
+ function find(string, predicate) {
492
499
  for (var n = 1, max = string.length; n <= max; n++) {
493
500
  var parsed = string.substr(-n, n)
494
501
  if (predicate(parsed, n, max)) {
@@ -498,7 +505,7 @@ function find (string, predicate) {
498
505
  return ''
499
506
  }
500
507
 
501
- function flatten (array) {
508
+ function flatten(array) {
502
509
  if (!Array.isArray(array)) return [array]
503
510
  return array.reduce(function (a, b) {
504
511
  return a.concat(flatten(b))
@@ -506,20 +513,15 @@ function flatten (array) {
506
513
  }
507
514
 
508
515
  // Will be filled by Can I Use data below
509
- browserslist.cache = { }
510
- browserslist.data = { }
516
+ browserslist.cache = {}
517
+ browserslist.data = {}
511
518
  browserslist.usage = {
512
- global: { },
519
+ global: {},
513
520
  custom: null
514
521
  }
515
522
 
516
523
  // Default browsers query
517
- browserslist.defaults = [
518
- '> 0.5%',
519
- 'last 2 versions',
520
- 'Firefox ESR',
521
- 'not dead'
522
- ]
524
+ browserslist.defaults = ['> 0.5%', 'last 2 versions', 'Firefox ESR', 'not dead']
523
525
 
524
526
  // Browser names aliases
525
527
  browserslist.aliases = {
@@ -548,7 +550,7 @@ browserslist.desktopNames = {
548
550
  }
549
551
 
550
552
  // Aliases to work with joined versions like `ios_saf 7.0-7.1`
551
- browserslist.versionAliases = { }
553
+ browserslist.versionAliases = {}
552
554
 
553
555
  browserslist.clearCaches = env.clearCaches
554
556
  browserslist.parseConfig = env.parseConfig
@@ -597,7 +599,7 @@ browserslist.coverage = function (browsers, stats) {
597
599
  if ('dataByBrowser' in stats) {
598
600
  stats = stats.dataByBrowser
599
601
  }
600
- data = { }
602
+ data = {}
601
603
  for (var name in stats) {
602
604
  for (var version in stats[name]) {
603
605
  data[name + ' ' + version] = stats[name][version]
@@ -614,7 +616,7 @@ browserslist.coverage = function (browsers, stats) {
614
616
  }, 0)
615
617
  }
616
618
 
617
- function nodeQuery (context, version) {
619
+ function nodeQuery(context, version) {
618
620
  var nodeReleases = jsReleases.filter(function (i) {
619
621
  return i.name === 'nodejs'
620
622
  })
@@ -631,22 +633,20 @@ function nodeQuery (context, version) {
631
633
  return ['node ' + matched[matched.length - 1].version]
632
634
  }
633
635
 
634
- function sinceQuery (context, year, month, date) {
636
+ function sinceQuery(context, year, month, date) {
635
637
  year = parseInt(year)
636
638
  month = parseInt(month || '01') - 1
637
639
  date = parseInt(date || '01')
638
640
  return filterByYear(Date.UTC(year, month, date, 0, 0, 0), context)
639
641
  }
640
642
 
641
- function coverQuery (context, coverage, statMode) {
643
+ function coverQuery(context, coverage, statMode) {
642
644
  coverage = parseFloat(coverage)
643
645
  var usage = browserslist.usage.global
644
646
  if (statMode) {
645
- if (statMode.match(/^my\s+stats$/)) {
647
+ if (statMode.match(/^my\s+stats$/i)) {
646
648
  if (!context.customUsage) {
647
- throw new BrowserslistError(
648
- 'Custom usage statistics was not provided'
649
- )
649
+ throw new BrowserslistError('Custom usage statistics was not provided')
650
650
  }
651
651
  usage = context.customUsage
652
652
  } else {
@@ -666,7 +666,7 @@ function coverQuery (context, coverage, statMode) {
666
666
  var coveraged = 0
667
667
  var result = []
668
668
  var version
669
- for (var i = 0; i <= versions.length; i++) {
669
+ for (var i = 0; i < versions.length; i++) {
670
670
  version = versions[i]
671
671
  if (usage[version] === 0) break
672
672
  coveraged += usage[version]
@@ -832,19 +832,24 @@ var QUERIES = [
832
832
  }
833
833
  var usage = context.customUsage
834
834
  return Object.keys(usage).reduce(function (result, version) {
835
+ var percentage = usage[version]
836
+ if (percentage == null) {
837
+ return result
838
+ }
839
+
835
840
  if (sign === '>') {
836
- if (usage[version] > popularity) {
841
+ if (percentage > popularity) {
837
842
  result.push(version)
838
843
  }
839
844
  } else if (sign === '<') {
840
- if (usage[version] < popularity) {
845
+ if (percentage < popularity) {
841
846
  result.push(version)
842
847
  }
843
848
  } else if (sign === '<=') {
844
- if (usage[version] <= popularity) {
849
+ if (percentage <= popularity) {
845
850
  result.push(version)
846
851
  }
847
- } else if (usage[version] >= popularity) {
852
+ } else if (percentage >= popularity) {
848
853
  result.push(version)
849
854
  }
850
855
  return result
@@ -867,19 +872,24 @@ var QUERIES = [
867
872
  }
868
873
  var usage = context.customUsage
869
874
  return Object.keys(usage).reduce(function (result, version) {
875
+ var percentage = usage[version]
876
+ if (percentage == null) {
877
+ return result
878
+ }
879
+
870
880
  if (sign === '>') {
871
- if (usage[version] > popularity) {
881
+ if (percentage > popularity) {
872
882
  result.push(version)
873
883
  }
874
884
  } else if (sign === '<') {
875
- if (usage[version] < popularity) {
885
+ if (percentage < popularity) {
876
886
  result.push(version)
877
887
  }
878
888
  } else if (sign === '<=') {
879
- if (usage[version] <= popularity) {
889
+ if (percentage <= popularity) {
880
890
  result.push(version)
881
891
  }
882
- } else if (usage[version] >= popularity) {
892
+ } else if (percentage >= popularity) {
883
893
  result.push(version)
884
894
  }
885
895
  return result
@@ -898,19 +908,24 @@ var QUERIES = [
898
908
  env.loadCountry(browserslist.usage, place, browserslist.data)
899
909
  var usage = browserslist.usage[place]
900
910
  return Object.keys(usage).reduce(function (result, version) {
911
+ var percentage = usage[version]
912
+ if (percentage == null) {
913
+ return result
914
+ }
915
+
901
916
  if (sign === '>') {
902
- if (usage[version] > popularity) {
917
+ if (percentage > popularity) {
903
918
  result.push(version)
904
919
  }
905
920
  } else if (sign === '<') {
906
- if (usage[version] < popularity) {
921
+ if (percentage < popularity) {
907
922
  result.push(version)
908
923
  }
909
924
  } else if (sign === '<=') {
910
- if (usage[version] <= popularity) {
925
+ if (percentage <= popularity) {
911
926
  result.push(version)
912
927
  }
913
- } else if (usage[version] >= popularity) {
928
+ } else if (percentage >= popularity) {
914
929
  result.push(version)
915
930
  }
916
931
  return result
@@ -918,11 +933,11 @@ var QUERIES = [
918
933
  }
919
934
  },
920
935
  {
921
- regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%$/,
936
+ regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%$/i,
922
937
  select: coverQuery
923
938
  },
924
939
  {
925
- regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%\s+in\s+(my\s+stats|(alt-)?\w\w)$/,
940
+ regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%\s+in\s+(my\s+stats|(alt-)?\w\w)$/i,
926
941
  select: coverQuery
927
942
  },
928
943
  {
@@ -986,7 +1001,7 @@ var QUERIES = [
986
1001
  var data = checkName(name, context)
987
1002
  from = parseFloat(normalizeVersion(data, from) || from)
988
1003
  to = parseFloat(normalizeVersion(data, to) || to)
989
- function filter (v) {
1004
+ function filter(v) {
990
1005
  var parsed = parseFloat(v)
991
1006
  return parsed >= from && parsed <= to
992
1007
  }
@@ -1180,11 +1195,11 @@ var QUERIES = [
1180
1195
  }
1181
1196
  }
1182
1197
  }
1183
- ];
1198
+ ]
1184
1199
 
1185
1200
  // Get and convert Can I Use data
1186
1201
 
1187
- (function () {
1202
+ ;(function () {
1188
1203
  for (var name in agents) {
1189
1204
  var browser = agents[name]
1190
1205
  browserslist.data[name] = {
@@ -1195,7 +1210,7 @@ var QUERIES = [
1195
1210
  }
1196
1211
  fillUsage(browserslist.usage.global, name, browser.usage_global)
1197
1212
 
1198
- browserslist.versionAliases[name] = { }
1213
+ browserslist.versionAliases[name] = {}
1199
1214
  for (var i = 0; i < browser.versions.length; i++) {
1200
1215
  var full = browser.versions[i]
1201
1216
  if (!full) continue
@@ -1210,6 +1225,6 @@ var QUERIES = [
1210
1225
  }
1211
1226
 
1212
1227
  browserslist.versionAliases.op_mob['59'] = '58'
1213
- }())
1228
+ })()
1214
1229
 
1215
1230
  module.exports = browserslist