browserslist 4.16.0 → 4.16.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.
package/README.md CHANGED
@@ -263,7 +263,7 @@ You can specify the browser and Node.js versions by queries (case insensitive):
263
263
  * `Firefox > 20`: versions of Firefox newer than 20.
264
264
  `>=`, `<` and `<=` work too. It also works with Node.js.
265
265
  * `ie 6-8`: selects an inclusive range of versions.
266
- * `Firefox ESR`: the latest [Firefox ESR] version.
266
+ * `Firefox ESR`: the latest [Firefox Extended Support Release].
267
267
  * `PhantomJS 2.1` and `PhantomJS 1.9`: selects Safari versions similar
268
268
  to PhantomJS runtime.
269
269
  * `extends browserslist-config-mycompany`: take queries from
@@ -273,13 +273,13 @@ You can specify the browser and Node.js versions by queries (case insensitive):
273
273
  page. A list of all available features can be found at
274
274
  [`caniuse-lite/data/features`].
275
275
  * `browserslist config`: the browsers defined in Browserslist config. Useful
276
- in the tools to modify user’s config like
276
+ in Differential Serving to modify user’s config like
277
277
  `browserslist config and supports es6-module`.
278
278
  * `since 2015` or `last 2 years`: all versions released since year 2015
279
279
  (also `since 2015-03` and `since 2015-03-10`).
280
280
  * `unreleased versions` or `unreleased Chrome versions`:
281
281
  alpha and beta versions.
282
- * `not ie <= 8`: exclude browsers selected by previous queries.
282
+ * `not ie <= 8`: exclude IE 8 and lower from previous queries.
283
283
 
284
284
  You can add `not ` to any query.
285
285
 
@@ -289,6 +289,7 @@ You can add `not ` to any query.
289
289
  [custom usage data]: #custom-usage-data
290
290
  [still maintained]: https://github.com/nodejs/Release
291
291
  [Can I Use]: https://caniuse.com/
292
+ [Firefox Extended Support Release]: https://support.mozilla.org/en-US/kb/choosing-firefox-update-channel
292
293
 
293
294
 
294
295
  ### Debug
@@ -402,8 +403,7 @@ naming or prefixing the module with `@scope/browserslist-config`, such as
402
403
  `@scope/browserslist-config` or `@scope/browserslist-config-mycompany`.
403
404
 
404
405
  If you don’t accept Browserslist queries from users, you can disable the
405
- validation by using the or `BROWSERSLIST_DANGEROUS_EXTEND` environment variable
406
- or `dangerousExtend` option.
406
+ validation by using the or `BROWSERSLIST_DANGEROUS_EXTEND` environment variable.
407
407
 
408
408
  ```sh
409
409
  BROWSERSLIST_DANGEROUS_EXTEND=1 npx webpack
@@ -561,9 +561,9 @@ Options:
561
561
  * `stats`: custom usage statistics data.
562
562
  * `config`: path to config if you want to set it manually.
563
563
  * `ignoreUnknownVersions`: do not throw on direct query (like `ie 12`).
564
- Default is `false.`
564
+ Default is `false`.
565
565
  * `dangerousExtend`: Disable security checks for `extend` query.
566
- Default is `false.`
566
+ Default is `false`.
567
567
  * `mobileToDesktop`: Use desktop browsers if Can I Use doesn’t have data
568
568
  about this mobile version. For instance, Browserslist will return
569
569
  `chrome 20` on `and_chr 20` query (Can I Use has only data only about
package/index.js CHANGED
@@ -614,6 +614,68 @@ browserslist.coverage = function (browsers, stats) {
614
614
  }, 0)
615
615
  }
616
616
 
617
+ function nodeQuery (context, version) {
618
+ var nodeReleases = jsReleases.filter(function (i) {
619
+ return i.name === 'nodejs'
620
+ })
621
+ var matched = nodeReleases.filter(function (i) {
622
+ return isVersionsMatch(i.version, version)
623
+ })
624
+ if (matched.length === 0) {
625
+ if (context.ignoreUnknownVersions) {
626
+ return []
627
+ } else {
628
+ throw new BrowserslistError('Unknown version ' + version + ' of Node.js')
629
+ }
630
+ }
631
+ return ['node ' + matched[matched.length - 1].version]
632
+ }
633
+
634
+ function sinceQuery (context, year, month, date) {
635
+ year = parseInt(year)
636
+ month = parseInt(month || '01') - 1
637
+ date = parseInt(date || '01')
638
+ return filterByYear(Date.UTC(year, month, date, 0, 0, 0), context)
639
+ }
640
+
641
+ function coverQuery (context, coverage, statMode) {
642
+ coverage = parseFloat(coverage)
643
+ var usage = browserslist.usage.global
644
+ if (statMode) {
645
+ if (statMode.match(/^my\s+stats$/)) {
646
+ if (!context.customUsage) {
647
+ throw new BrowserslistError(
648
+ 'Custom usage statistics was not provided'
649
+ )
650
+ }
651
+ usage = context.customUsage
652
+ } else {
653
+ var place
654
+ if (statMode.length === 2) {
655
+ place = statMode.toUpperCase()
656
+ } else {
657
+ place = statMode.toLowerCase()
658
+ }
659
+ env.loadCountry(browserslist.usage, place, browserslist.data)
660
+ usage = browserslist.usage[place]
661
+ }
662
+ }
663
+ var versions = Object.keys(usage).sort(function (a, b) {
664
+ return usage[b] - usage[a]
665
+ })
666
+ var coveraged = 0
667
+ var result = []
668
+ var version
669
+ for (var i = 0; i <= versions.length; i++) {
670
+ version = versions[i]
671
+ if (usage[version] === 0) break
672
+ coveraged += usage[version]
673
+ result.push(version)
674
+ if (coveraged >= coverage) break
675
+ }
676
+ return result
677
+ }
678
+
617
679
  var QUERIES = [
618
680
  {
619
681
  regexp: /^last\s+(\d+)\s+major\s+versions?$/i,
@@ -669,9 +731,11 @@ var QUERIES = [
669
731
  {
670
732
  regexp: /^last\s+(\d+)\s+electron\s+versions?$/i,
671
733
  select: function (context, versions) {
672
- return Object.keys(e2c).slice(-versions).map(function (i) {
673
- return 'chrome ' + e2c[i]
674
- })
734
+ return Object.keys(e2c)
735
+ .slice(-versions)
736
+ .map(function (i) {
737
+ return 'chrome ' + e2c[i]
738
+ })
675
739
  }
676
740
  },
677
741
  {
@@ -709,9 +773,11 @@ var QUERIES = [
709
773
  regexp: /^unreleased\s+(\w+)\s+versions?$/i,
710
774
  select: function (context, name) {
711
775
  var data = checkName(name, context)
712
- return data.versions.filter(function (v) {
713
- return data.released.indexOf(v) === -1
714
- }).map(nameMapper(data.name))
776
+ return data.versions
777
+ .filter(function (v) {
778
+ return data.released.indexOf(v) === -1
779
+ })
780
+ .map(nameMapper(data.name))
715
781
  }
716
782
  },
717
783
  {
@@ -721,13 +787,16 @@ var QUERIES = [
721
787
  }
722
788
  },
723
789
  {
724
- regexp: /^since (\d+)(?:-(\d+))?(?:-(\d+))?$/i,
725
- select: function (context, year, month, date) {
726
- year = parseInt(year)
727
- month = parseInt(month || '01') - 1
728
- date = parseInt(date || '01')
729
- return filterByYear(Date.UTC(year, month, date, 0, 0, 0), context)
730
- }
790
+ regexp: /^since (\d+)$/i,
791
+ select: sinceQuery
792
+ },
793
+ {
794
+ regexp: /^since (\d+)-(\d+)$/i,
795
+ select: sinceQuery
796
+ },
797
+ {
798
+ regexp: /^since (\d+)-(\d+)-(\d+)$/i,
799
+ select: sinceQuery
731
800
  },
732
801
  {
733
802
  regexp: /^(>=?|<=?)\s*(\d*\.?\d+)%$/,
@@ -849,45 +918,12 @@ var QUERIES = [
849
918
  }
850
919
  },
851
920
  {
852
- regexp: /^cover\s+(\d*\.?\d+)%(\s+in\s+(my\s+stats|(alt-)?\w\w))?$/,
853
- select: function (context, coverage, statMode) {
854
- coverage = parseFloat(coverage)
855
- var usage = browserslist.usage.global
856
- if (statMode) {
857
- if (statMode.match(/^\s+in\s+my\s+stats$/)) {
858
- if (!context.customUsage) {
859
- throw new BrowserslistError(
860
- 'Custom usage statistics was not provided'
861
- )
862
- }
863
- usage = context.customUsage
864
- } else {
865
- var match = statMode.match(/\s+in\s+((alt-)?\w\w)/)
866
- var place = match[1]
867
- if (place.length === 2) {
868
- place = place.toUpperCase()
869
- } else {
870
- place = place.toLowerCase()
871
- }
872
- env.loadCountry(browserslist.usage, place, browserslist.data)
873
- usage = browserslist.usage[place]
874
- }
875
- }
876
- var versions = Object.keys(usage).sort(function (a, b) {
877
- return usage[b] - usage[a]
878
- })
879
- var coveraged = 0
880
- var result = []
881
- var version
882
- for (var i = 0; i <= versions.length; i++) {
883
- version = versions[i]
884
- if (usage[version] === 0) break
885
- coveraged += usage[version]
886
- result.push(version)
887
- if (coveraged >= coverage) break
888
- }
889
- return result
890
- }
921
+ regexp: /^cover\s+(\d*\.?\d+)%$/,
922
+ select: coverQuery
923
+ },
924
+ {
925
+ regexp: /^cover\s+(\d*\.?\d+)%\s+in\s+(my\s+stats|(alt-)?\w\w)$/,
926
+ select: coverQuery
891
927
  },
892
928
  {
893
929
  regexp: /^supports\s+([\w-]+)$/,
@@ -916,31 +952,26 @@ var QUERIES = [
916
952
  }
917
953
  from = parseFloat(from)
918
954
  to = parseFloat(to)
919
- return Object.keys(e2c).filter(function (i) {
920
- var parsed = parseFloat(i)
921
- return parsed >= from && parsed <= to
922
- }).map(function (i) {
923
- return 'chrome ' + e2c[i]
924
- })
955
+ return Object.keys(e2c)
956
+ .filter(function (i) {
957
+ var parsed = parseFloat(i)
958
+ return parsed >= from && parsed <= to
959
+ })
960
+ .map(function (i) {
961
+ return 'chrome ' + e2c[i]
962
+ })
925
963
  }
926
964
  },
927
965
  {
928
966
  regexp: /^node\s+([\d.]+)\s*-\s*([\d.]+)$/i,
929
967
  select: function (context, from, to) {
930
- var nodeVersions = jsReleases.filter(function (i) {
931
- return i.name === 'nodejs'
932
- }).map(function (i) {
933
- return i.version
934
- })
935
- var semverRegExp = /^(0|[1-9]\d*)(\.(0|[1-9]\d*)){0,2}$/
936
- if (!semverRegExp.test(from)) {
937
- throw new BrowserslistError(
938
- 'Unknown version ' + from + ' of Node.js')
939
- }
940
- if (!semverRegExp.test(to)) {
941
- throw new BrowserslistError(
942
- 'Unknown version ' + to + ' of Node.js')
943
- }
968
+ var nodeVersions = jsReleases
969
+ .filter(function (i) {
970
+ return i.name === 'nodejs'
971
+ })
972
+ .map(function (i) {
973
+ return i.version
974
+ })
944
975
  return nodeVersions
945
976
  .filter(semverFilterLoose('>=', from))
946
977
  .filter(semverFilterLoose('<=', to))
@@ -976,11 +1007,13 @@ var QUERIES = [
976
1007
  {
977
1008
  regexp: /^node\s*(>=?|<=?)\s*([\d.]+)$/i,
978
1009
  select: function (context, sign, version) {
979
- var nodeVersions = jsReleases.filter(function (i) {
980
- return i.name === 'nodejs'
981
- }).map(function (i) {
982
- return i.version
983
- })
1010
+ var nodeVersions = jsReleases
1011
+ .filter(function (i) {
1012
+ return i.name === 'nodejs'
1013
+ })
1014
+ .map(function (i) {
1015
+ return i.version
1016
+ })
984
1017
  return nodeVersions
985
1018
  .filter(generateSemverFilter(sign, version))
986
1019
  .map(function (v) {
@@ -1022,30 +1055,23 @@ var QUERIES = [
1022
1055
  var chrome = e2c[versionToUse]
1023
1056
  if (!chrome) {
1024
1057
  throw new BrowserslistError(
1025
- 'Unknown version ' + version + ' of electron')
1058
+ 'Unknown version ' + version + ' of electron'
1059
+ )
1026
1060
  }
1027
1061
  return ['chrome ' + chrome]
1028
1062
  }
1029
1063
  },
1030
1064
  {
1031
- regexp: /^node\s+(\d+(\.\d+)?(\.\d+)?)$/i,
1032
- select: function (context, version) {
1033
- var nodeReleases = jsReleases.filter(function (i) {
1034
- return i.name === 'nodejs'
1035
- })
1036
- var matched = nodeReleases.filter(function (i) {
1037
- return isVersionsMatch(i.version, version)
1038
- })
1039
- if (matched.length === 0) {
1040
- if (context.ignoreUnknownVersions) {
1041
- return []
1042
- } else {
1043
- throw new BrowserslistError(
1044
- 'Unknown version ' + version + ' of Node.js')
1045
- }
1046
- }
1047
- return ['node ' + matched[matched.length - 1].version]
1048
- }
1065
+ regexp: /^node\s+(\d+)$/i,
1066
+ select: nodeQuery
1067
+ },
1068
+ {
1069
+ regexp: /^node\s+(\d+\.\d+)$/i,
1070
+ select: nodeQuery
1071
+ },
1072
+ {
1073
+ regexp: /^node\s+(\d+\.\d+\.\d+)$/i,
1074
+ select: nodeQuery
1049
1075
  },
1050
1076
  {
1051
1077
  regexp: /^current\s+node$/i,
@@ -1057,13 +1083,17 @@ var QUERIES = [
1057
1083
  regexp: /^maintained\s+node\s+versions$/i,
1058
1084
  select: function (context) {
1059
1085
  var now = Date.now()
1060
- var queries = Object.keys(jsEOL).filter(function (key) {
1061
- return now < Date.parse(jsEOL[key].end) &&
1062
- now > Date.parse(jsEOL[key].start) &&
1063
- isEolReleased(key)
1064
- }).map(function (key) {
1065
- return 'node ' + key.slice(1)
1066
- })
1086
+ var queries = Object.keys(jsEOL)
1087
+ .filter(function (key) {
1088
+ return (
1089
+ now < Date.parse(jsEOL[key].end) &&
1090
+ now > Date.parse(jsEOL[key].start) &&
1091
+ isEolReleased(key)
1092
+ )
1093
+ })
1094
+ .map(function (key) {
1095
+ return 'node ' + key.slice(1)
1096
+ })
1067
1097
  return resolve(queries, context)
1068
1098
  }
1069
1099
  },
@@ -1100,7 +1130,8 @@ var QUERIES = [
1100
1130
  return []
1101
1131
  } else {
1102
1132
  throw new BrowserslistError(
1103
- 'Unknown version ' + version + ' of ' + name)
1133
+ 'Unknown version ' + version + ' of ' + name
1134
+ )
1104
1135
  }
1105
1136
  }
1106
1137
  return [data.name + ' ' + version]
@@ -1142,7 +1173,8 @@ var QUERIES = [
1142
1173
  select: function (context, name) {
1143
1174
  if (byName(name, context)) {
1144
1175
  throw new BrowserslistError(
1145
- 'Specify versions in Browserslist query for browser ' + name)
1176
+ 'Specify versions in Browserslist query for browser ' + name
1177
+ )
1146
1178
  } else {
1147
1179
  throw unknownQuery(name)
1148
1180
  }
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 = Object.keys(data[i].versions)[0]
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.16.0",
3
+ "version": "4.16.4",
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.30001165",
19
- "colorette": "^1.2.1",
20
- "electron-to-chromium": "^1.3.621",
18
+ "caniuse-lite": "^1.0.30001208",
19
+ "colorette": "^1.2.2",
20
+ "electron-to-chromium": "^1.3.712",
21
21
  "escalade": "^3.1.1",
22
- "node-releases": "^1.1.67"
22
+ "node-releases": "^1.1.71"
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 it a right project to run npx browserslist --update-db?'
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
- return null
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 !== 'yarn') {
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 updateLockfile (lock, latest) {
121
- if (lock.mode === 'npm') {
122
- var fixed = deletePackage(JSON.parse(lock.content))
123
- return JSON.stringify(fixed, null, ' ')
124
- } else {
125
- var lines = lock.content.split('\n')
126
- var i
127
- /* istanbul ignore if */
128
- if (lock.mode === 'pnpm') {
129
- for (i = 0; i < lines.length; i++) {
130
- if (lines[i].indexOf('caniuse-lite:') >= 0) {
131
- lines[i] = lines[i].replace(/: .*$/, ': ' + latest.version)
132
- } else if (lines[i].indexOf('/caniuse-lite') >= 0) {
133
- lines[i] = lines[i].replace(/\/[^/:]+:/, '/' + latest.version + ':')
134
- for (i = i + 1; i < lines.length; i++) {
135
- if (lines[i].indexOf('integrity: ') !== -1) {
136
- lines[i] = lines[i].replace(
137
- /integrity: .+/, 'integrity: ' + latest.dist.integrity
138
- )
139
- } else if (lines[i].indexOf(' /') !== -1) {
140
- break
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] = latest.dist.integrity ? 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
- } else if (lock.mode === 'yarn') {
146
- for (i = 0; i < lines.length; i++) {
147
- if (lines[i].indexOf('caniuse-lite@') !== -1) {
148
- lines[i + 1] = lines[i + 1].replace(
149
- /version "[^"]+"/, 'version "' + latest.version + '"'
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
- lines[i + 3] = lines[i + 3].replace(
155
- /integrity .+/, 'integrity ' + latest.dist.integrity
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 deletePackage (node) {
166
- if (node.dependencies) {
167
- delete node.dependencies['caniuse-lite']
168
- for (var i in node.dependencies) {
169
- node.dependencies[i] = deletePackage(node.dependencies[i])
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 node
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
- if (typeof current === 'string') {
190
- print('Current version: ' + bold(red(current)) + '\n')
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
- 'New version: ' + bold(green(latest.version)) + '\n' +
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 + ' caniuse-lite` call. ' +
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 browsers list retrieval.\n' +
277
+ 'Problem with browser list retrieval.\n' +
242
278
  'Target browser changes won’t be shown.\n'
243
279
  )
244
280
  )
package/CHANGELOG.md DELETED
@@ -1,505 +0,0 @@
1
- # Change Log
2
- This project adheres to [Semantic Versioning](http://semver.org/).
3
-
4
- ## 4.16
5
- * Add `browserslist config` query.
6
-
7
- ## 4.15
8
- * Add TypeScript types (by Dmitry Semigradsky).
9
-
10
- ## 4.14.7
11
- * Fixed Yarn Workspaces support to `--update-db` (by Fausto Núñez Alberro).
12
- * Added browser changes to `--update-db` (by @AleksandrSl).
13
- * Added color output to `--update-db`.
14
- * Updated `package.funding` to have link to our Open Collective.
15
-
16
- ## 4.14.6
17
- * Fixed Yarn support in `--update-db` (by Ivan Storck).
18
- * Fixed npm 7 support in `--update-db`.
19
-
20
- ## 4.14.5
21
- * Fixed `last 2 electron versions` query (by Sergey Melyukov).
22
-
23
- ## 4.14.4
24
- * Fixed `Unknown version 59 of op_mob` error.
25
-
26
- ## 4.14.3
27
- * Update Firefox ESR.
28
-
29
- ## 4.14.2
30
- * Fixed `--update-db` on Windows (by James Ross).
31
- * Improved `--update-db` output.
32
-
33
- ## 4.14.1
34
- * Added `--update-db` explanation (by Justin Zelinsky).
35
-
36
- ## 4.14
37
- * Add `BROWSERSLIST_DANGEROUS_EXTEND` support (by Timo Mayer).
38
-
39
- ## 4.13
40
- * Added `supports` query to select browsers (by Jesús Leganés-Combarro).
41
-
42
- ## 4.12.2
43
- * Update Firefox ESR.
44
-
45
- ## 4.12.1
46
- * Update `package.json` scanning tool for `--update-db` (by Luke Edwards).
47
- * Improve docs (by Mukundan Senthil).
48
- * Drop Node.js 13.0-13.6 support because of ES modules bug in that versions.
49
-
50
- ## 4.12
51
- * Add environments to shared configs (by Yevgeny Petukhov).
52
- * Fix docs (by Dmitry Statsenko and Thomas Pozzo di Borgo).
53
-
54
- ## 4.11.1
55
- * Fix Node.js 6 support.
56
-
57
- ## 4.11
58
- * Add `npx browserslist --mobile-to-desktop` (by James Ross).
59
-
60
- ## 4.10
61
- * Add `npx browserslist --update-db` (by Ivan Solovev).
62
-
63
- ## 4.9.1
64
- * Normalize incorrect Can I Use regional data (by Huáng Jùnliàng).
65
-
66
- ## 4.9
67
- * Add `node X-Y` query support (by Yuping Zuo).
68
-
69
- ## 4.8.7
70
- * Fix `last N major versions` (by Valeriy Trubachev).
71
-
72
- ## 4.8.6
73
- * Fix `Unknown version 10 of op_mob` error in `mobileToDesktop` option.
74
-
75
- ## 4.8.5
76
- * Fix `last N browsers` again after new `caniuse-db` API changes.
77
-
78
- ## 4.8.4
79
- * Fix released versions detection for queries like `last N browsers`.
80
- * Add IE 11 Mobile to `dead` browsers.
81
-
82
- ## 4.8.3
83
- * Fix warning message (by Anton Ivanov).
84
-
85
- ## 4.8.2
86
- * Fix `Cannot convert undefined or null to object` (by Antoine Clausse).
87
- * Fix `mobileToDesktop` in `defaults` (by Huáng Jùnliàng).
88
-
89
- ## 4.8.1
90
- * Fix Chrome and `mobileToDesktop` (by Huáng Jùnliàng).
91
-
92
- ## 4.8
93
- * Add `> 5% in browserslist-config-my stats` query (by Andrew Leedham).
94
- * Improve docs (by Danny van Kooten).
95
-
96
- ## 4.7.3
97
- * Add funding link for `npm fund`.
98
-
99
- ## 4.7.2
100
- * Add cache for query parsing.
101
- * Improve config caching (by Kārlis Gaņģis).
102
- * Update Firefox ESR.
103
-
104
- ## 4.7.1
105
- * Improve caching.
106
-
107
- ## 4.7
108
- * Add PhantomJS queries.
109
- * Improve docs (by Dorian Koehring).
110
-
111
- ## 4.6.6
112
- * Remove Safari from `dead` query.
113
-
114
- ## 4.6.5
115
- * Add Samsung 4 browser to `dead` query.
116
- * Remove dirty fix for `android all` error.
117
-
118
- ## 4.6.4
119
- * Add Firefox 68 to `Firefox ESR` query.
120
-
121
- ## 4.6.3
122
- * Dirty fix for `android all` error.
123
-
124
- ## 4.6.2
125
- * Fix `last x version` and similar queries for Android (by Tony Ross).
126
-
127
- ## 4.6.1
128
- * Fix patch version support for Electron (by Kilian Valkhof).
129
-
130
- ## 4.6
131
- * Add `mobileToDesktop` option (by Nicolò Ribaudo).
132
-
133
- ## 4.5.6
134
- * Make `Node > 5` and `node > 5` queries case insensitive.
135
-
136
- ## 4.5.5
137
- * Fix CLI help (by Marcel Gerber).
138
- * Add KaiOS browser to docs.
139
-
140
- ## 4.5.4
141
- * Update docs (by Andrew Leedham and Dan Onoshko).
142
-
143
- ## 4.5.3
144
- * Fix splitting string to queries.
145
-
146
- ## 4.5.2
147
- * Show default browsers in CLI on project without config.
148
-
149
- ## 4.5.1
150
- * Improve text for the warning about outdated `caniuse-lite`.
151
-
152
- ## 4.5
153
- * Add `>=`, `>`, and `<=` support for Node.js version (by Mathspy Terabithian).
154
-
155
- ## 4.4.2
156
- * Allow to have string in `package.json` (by @dmarkhas).
157
-
158
- ## 4.4.1
159
- * Allow to use `.` in scope name of shareable config (by Gustav Nikolaj).
160
-
161
- ## 4.4
162
- * Added `and` and `or` keywords to combine queries (by Jon Ege Ronnenberg).
163
-
164
- ## 4.3.7
165
- * Fix fraction years support in `last 1.5 years` (by Clément P).
166
- * Fix version-less browser support.
167
-
168
- ## 4.3.6
169
- * Fix version-less browser support in custom statistics (by Alex Walter).
170
-
171
- ## 4.3.5
172
- * Fix `not` query for wrong Can I Use data.
173
-
174
- ## 4.3.4
175
- * Allow to update `node-releases` without new Browserslist releases.
176
-
177
- ## 4.3.3
178
- * Fix Node.js 11 support.
179
-
180
- ## 4.3.2
181
- * Fix `Unknown version 11 of Node.js` error (by Dan Onoshko).
182
-
183
- ## 4.3.1
184
- * Fix conflict between `caniuse-lite` and custom browsers statistics.
185
-
186
- ## 4.3
187
- * Allow to use `extends browserslist-config-a/file` (by @Schweinepriester).
188
-
189
- ## 4.2.1
190
- * Use new `node-releases` support (by Sergey Rubanov).
191
-
192
- ## 4.2
193
- * Add `--json` argument for CLI.
194
- * Allow to pass multiple areas in CLI by `--coverage=US,alt-AS,global`.
195
-
196
- ## 4.1.2
197
- * Better `unknow query` error message.
198
- * Use latest `node-releases`.
199
-
200
- ## 4.1.1
201
- * Update Firefox ESR versions.
202
-
203
- ## 4.1
204
- * Add `current node` query.
205
- * Add contributors widget to docs (by Sergey Surkov).
206
-
207
- ## 4.0.2
208
- * Fix new `node-releases` support (by Sergey Rubanov).
209
- * Fix error text (by Josh Smith).
210
-
211
- ## 4.0.1
212
- * Reduce npm package size.
213
- * Fix docs.
214
-
215
- ## 4.0.0 “Erinaceus amurensis”
216
- * Add `node X` and `maintained node versions` queries (by Pavel Vostrikov).
217
- * Remove Node.js 4 support.
218
- * Show warning if `caniuse-lite` is old (by Anton Tuzhik).
219
- * Add comma support in config file.
220
-
221
- ## 3.2.8
222
- * Add IE 9-5.5 to dead browsers.
223
- * Remove development configs from npm package.
224
-
225
- ## 3.2.7
226
- * Add Firefox 60 as Firefox ESR.
227
-
228
- ## 3.2.6
229
- * Add Opera Mini 12 to dead browsers.
230
- * Update docs (by Jamie Kyle).
231
-
232
- ## 3.2.5
233
- * Fix excluding Opera Mini and other browsers with `all` version.
234
-
235
- ## 3.2.4
236
- * Resolve shareable config from current working directory.
237
-
238
- ## 3.2.3
239
- * Fix `package.json` config validation for single string case.
240
- * Fix CLI error reporting.
241
-
242
- ## 3.2.2
243
- * Add `package.json` config validation.
244
- * Move project to `browserlist` GitHub organization.
245
-
246
- ## 3.2.1
247
- * Fix error text (by Steve Schrab).
248
-
249
- ## 3.2
250
- * Add `cover 99%` query (by Vasily Fedoseyev).
251
- * Add `cover 99% in US` query (by Vasily Fedoseyev).
252
- * Add `cover 99% in my stats` query (by Vasily Fedoseyev).
253
- * Add `"my stats"` support to `browserlist.coverage()` (by Vasily Fedoseyev).
254
-
255
- ## 3.1.2
256
- * Add more clear error on missed browser version.
257
-
258
- ## 3.1.1
259
- * Fix JSDoc (by Sylvain Pollet-Villard).
260
-
261
- ## 3.1
262
- * Add `ignoreUnknownVersions` option.
263
- * Fix docs (by Pascal Duez).
264
-
265
- ## 3.0 “Atelerix sclateri”
266
- * Remove country statistics from client-side build of Browserslist.
267
- * Change `> 1%` to `> 0.5%` in default query.
268
- * Add `not dead` to default query.
269
- * Change default environment to `production` (by Marco Fugaro).
270
- * Add `dead` query support with IE 10 and BlackBerry browser.
271
- * Add multiple environments in one section support (by Evilebot Tnawi).
272
- * Add custom statistics support to `browserlist.coverage()`.
273
- * Fix `path` option check.
274
-
275
- ## 2.11.3
276
- * Fix for `path: undefined` option.
277
-
278
- ## 2.11.2
279
- * Remove Node.js specific code from webpack build.
280
-
281
- ## 2.11.1
282
- * Fix using Browserslist in browser with `path` but without `fs`.
283
-
284
- ## 2.11
285
- * Add `last 2 years` query support (by James Harris).
286
-
287
- ## 2.10.2
288
- * Fix Browserify support.
289
-
290
- ## 2.10.1
291
- * Fix using Browserslist without `process` (by Andrew Patton).
292
-
293
- ## 2.10
294
- * Add `< 1%` and `<= 1%` queries support (by August Kaiser).
295
-
296
- ## 2.9.1
297
- * Fix unknown query on trailing spaces in query.
298
-
299
- ## 2.9
300
- * Add `last Electron versions` and `last Electron major versions` queries
301
- (by Louis Mouhat).
302
-
303
- ## 2.8
304
- * Add `since 2016-03` and `since 2016-03-20` queries support (by Andrew Blick).
305
-
306
- ## 2.7
307
- * Add `since 2016` queries support (by Igor Deryabin).
308
-
309
- ## 2.6.1
310
- * Fix `Path must be a string` error.
311
-
312
- ## 2.6
313
- * By default load config from current directory in CLI tool.
314
-
315
- ## 2.5.1
316
- * Allow `@scope/browserlist-config` config name (by Jamie Connolly).
317
-
318
- ## 2.5
319
- * Add `extends` query (by YellowKirby).
320
-
321
- ## 2.4.1
322
- * Throw error if `package.json` contain `browserlist` instead of `browserslist`.
323
-
324
- ## 2.4
325
- * Add `last n major versions` query (by John Sanders).
326
-
327
- ## 2.3.3
328
- * Fix browsers support.
329
-
330
- ## 2.3.2
331
- * Fix `> 0` query for browsers with one version (by Nikolay Solovyov).
332
-
333
- ## 2.3.1
334
- * Reduce library size.
335
-
336
- ## 2.3
337
- * Add `unreleased versions` and `unreleased Chrome versions` queries.
338
-
339
- ## 2.2.2
340
- * Fix `Path must be a string` error (by Pieter Beulque).
341
-
342
- ## 2.2.1
343
- * Fix security issue with regions dynamic `require`.
344
-
345
- ## 2.2
346
- * Add region usage statistics support (by Clément P).
347
-
348
- ## 2.1.5
349
- * Remove Firefox 45 from Firefox ESR.
350
-
351
- ## 2.1.4
352
- * Use both ESR versions when they actual.
353
-
354
- ## 2.1.3
355
- * Add warning on first exclude query.
356
-
357
- ## 2.1.2
358
- * Fix non-Node.js environments support.
359
-
360
- ## 2.1.1
361
- * Fix CLI arguments parsing.
362
-
363
- ## 2.1
364
- * Add `>= 5%`, `>= 5% in US` and `>= 5% in my stats` queries.
365
-
366
- ## 2.0 “Atelerix frontalis”
367
- * `last n versions` returns versions for all browsers, not only main browsers.
368
- * Cache file system operations (by Aarni Koskela).
369
- * Use `caniuse-lite` 1 MB instead of `caniuse-db` 7 MB (by Ben Briggs).
370
- * Add `.browserslistrc` config support.
371
- * Add QQ Browser for Android support.
372
- * Add tests for CLI (by Zhulduz Zhankenova).
373
-
374
- ## 1.7.7
375
- * Update Firefox ESR.
376
-
377
- ## 1.7.6
378
- * Fix Android Chrome selection.
379
-
380
- ## 1.7.5
381
- * Fix combining `not` query with country based statistics.
382
- * Fix `--env` argument in CLI (by Tuure Savuoja).
383
-
384
- ## 1.7.4
385
- * Speed up browser sorting (by Aarni Koskela).
386
-
387
- ## 1.7.3
388
- * Fix config finding when directory was passed to `path` (by Aarni Koskela).
389
-
390
- ## 1.7.2
391
- * Fix config finding algorithm (by Aarni Koskela).
392
-
393
- ## 1.7.1
394
- * Fix unreleased browsers version detection.
395
-
396
- ## 1.7
397
- * Add `--config` and `--env` arguments to CLI (by Jarek Rencz).
398
-
399
- ## 1.6
400
- * Convert Electron version to Chrome (by Kilian Valkhof).
401
- * Fix `0` version mistake in Can I Use data.
402
-
403
- ## 1.5.2
404
- * Fix browser versions ordering (by Marco Massarotto).
405
-
406
- ## 1.5.1
407
- * Fix error on `package.json` and `browserslist` in same directory.
408
-
409
- ## 1.5
410
- * Add `package.json` support (by Stepan Kuzmin).
411
- * Add environments support (by Maksim Semenov and openlibser).
412
- * Add `browserslist-stats.json` file support (by Oleh Aloshkin).
413
- * Add `config` option to CLI (by Evilebot Tnawi).
414
- * Add JSDoc.
415
- * Fix tests on Windows (by Anna Stoliar).
416
- * Don’t set custom usage statistics globally.
417
-
418
- ## 1.4
419
- * Add `defaults` keyword.
420
-
421
- ## 1.3.6
422
- * Add `UCAndroid` alias to `and_uc` (by Evilebot Tnawi).
423
-
424
- ## 1.3.5
425
- * Fix Opera Mini support. Use `op_mini all`.
426
-
427
- ## 1.3.4
428
- * Add space-less `>1%` and `>.5%` syntax support (by Andreas Lind).
429
-
430
- ## 1.3.3
431
- * Clean `0` versions in some country-based requests.
432
-
433
- ## 1.3.2
434
- * Update Firefox ESR.
435
-
436
- ## 1.3.1
437
- * Add Safari TP support.
438
-
439
- ## 1.3
440
- * Add coverage for specific country (by Joshua Wise).
441
-
442
- ## 1.2
443
- * Add `browserslist.coverage()` method.
444
- * Add `--coverage` and `-c` argument to CLI.
445
- * Add `-v` argument support to CLI.
446
- * Better error handling in CLI.
447
-
448
- ## 1.1.3
449
- * Fix jspm support (by Sean Anderson).
450
-
451
- ## 1.1.2
452
- * Fix jspm support (by Sean Anderson).
453
-
454
- ## 1.1.1
455
- * Fix space-less `>10%` and `>10% in my stats` queries.
456
- * Normalize error messages.
457
- * Remove development files from npm package.
458
-
459
- ## 1.1
460
- * Added query against custom browser usage data (by Daniel Rey).
461
-
462
- ## 1.0.1
463
- * Update Firefox ESR (by Rouven Weßling).
464
-
465
- ## 1.0 “Atelerix algirus”
466
- * Remove Opera 12.1 from default query.
467
- * Add `not` keyword and exclude browsers by query.
468
- * Add Microsoft Edge support (by Andrey Polischuk).
469
- * Add CLI for debug and non-JS usage (by Luke Horvat).
470
- * Use own class in Browserslist errors.
471
-
472
- ## 0.5
473
- * Add version ranges `IE 6-9` (by Ben Briggs).
474
-
475
- ## 0.4
476
- * Add `config` option and `BROWSERSLIST_CONFIG` environment variable support.
477
- * Add symlink config support.
478
-
479
- ## 0.3.3
480
- * Fix DynJS compatibility (by Nick Howes).
481
-
482
- ## 0.3.2
483
- * Fix joined versions on versions query (by Vincent De Oliveira).
484
-
485
- ## 0.3.1
486
- * Fix global variable leak (by Peter Müller).
487
-
488
- ## 0.3
489
- * Takes queries from `BROWSERSLIST` environment variable.
490
-
491
- ## 0.2
492
- * Return Can I Use joined versions as `ios_saf 7.0-7.1`.
493
-
494
- ## 0.1.3
495
- * Better work with Can I Use joined versions like `ios_saf 7.0-7.1`.
496
- * Browserslist now understands `ios_saf 7.0` or `ios_saf 7`.
497
-
498
- ## 0.1.2
499
- * Do not create global `browserslist` var (by Maxime Thirouin).
500
-
501
- ## 0.1.1
502
- * Sort browsers by name and version.
503
-
504
- ## 0.1 “Atelerix albiventris”
505
- * Initial release.