browserslist 4.17.4 → 4.18.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/browser.js +15 -11
- package/cli.js +21 -17
- package/error.d.ts +4 -4
- package/error.js +1 -1
- package/index.d.ts +7 -7
- package/index.js +74 -75
- package/node.js +57 -60
- package/package.json +4 -4
- package/update-db.js +101 -64
package/browser.js
CHANGED
|
@@ -1,36 +1,40 @@
|
|
|
1
1
|
var BrowserslistError = require('./error')
|
|
2
2
|
|
|
3
|
-
function noop
|
|
3
|
+
function noop() {}
|
|
4
4
|
|
|
5
5
|
module.exports = {
|
|
6
|
-
loadQueries: function loadQueries
|
|
6
|
+
loadQueries: function loadQueries() {
|
|
7
7
|
throw new BrowserslistError(
|
|
8
|
-
'Sharable configs are not supported in client-side build of Browserslist'
|
|
8
|
+
'Sharable configs are not supported in client-side build of Browserslist'
|
|
9
|
+
)
|
|
9
10
|
},
|
|
10
11
|
|
|
11
|
-
getStat: function getStat
|
|
12
|
+
getStat: function getStat(opts) {
|
|
12
13
|
return opts.stats
|
|
13
14
|
},
|
|
14
15
|
|
|
15
|
-
loadConfig: function loadConfig
|
|
16
|
+
loadConfig: function loadConfig(opts) {
|
|
16
17
|
if (opts.config) {
|
|
17
18
|
throw new BrowserslistError(
|
|
18
|
-
'Browserslist config are not supported in client-side build'
|
|
19
|
+
'Browserslist config are not supported in client-side build'
|
|
20
|
+
)
|
|
19
21
|
}
|
|
20
22
|
},
|
|
21
23
|
|
|
22
|
-
loadCountry: function loadCountry
|
|
24
|
+
loadCountry: function loadCountry() {
|
|
23
25
|
throw new BrowserslistError(
|
|
24
26
|
'Country statistics are not supported ' +
|
|
25
|
-
|
|
27
|
+
'in client-side build of Browserslist'
|
|
28
|
+
)
|
|
26
29
|
},
|
|
27
30
|
|
|
28
|
-
loadFeature: function loadFeature
|
|
31
|
+
loadFeature: function loadFeature() {
|
|
29
32
|
throw new BrowserslistError(
|
|
30
|
-
'Supports queries are not available in client-side build of Browserslist'
|
|
33
|
+
'Supports queries are not available in client-side build of Browserslist'
|
|
34
|
+
)
|
|
31
35
|
},
|
|
32
36
|
|
|
33
|
-
currentNode: function currentNode
|
|
37
|
+
currentNode: function currentNode(resolve, context) {
|
|
34
38
|
return resolve(['maintained node versions'], context)[0]
|
|
35
39
|
},
|
|
36
40
|
|
package/cli.js
CHANGED
|
@@ -8,26 +8,28 @@ var pkg = require('./package.json')
|
|
|
8
8
|
|
|
9
9
|
var args = process.argv.slice(2)
|
|
10
10
|
|
|
11
|
-
var USAGE =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
11
|
+
var USAGE =
|
|
12
|
+
'Usage:\n' +
|
|
13
|
+
' npx browserslist\n' +
|
|
14
|
+
' npx browserslist "QUERIES"\n' +
|
|
15
|
+
' npx browserslist --json "QUERIES"\n' +
|
|
16
|
+
' npx browserslist --config="path/to/browserlist/file"\n' +
|
|
17
|
+
' npx browserslist --coverage "QUERIES"\n' +
|
|
18
|
+
' npx browserslist --coverage=US "QUERIES"\n' +
|
|
19
|
+
' npx browserslist --coverage=US,RU,global "QUERIES"\n' +
|
|
20
|
+
' npx browserslist --env="environment name defined in config"\n' +
|
|
21
|
+
' npx browserslist --stats="path/to/browserlist/stats/file"\n' +
|
|
22
|
+
' npx browserslist --mobile-to-desktop\n' +
|
|
23
|
+
' npx browserslist --ignore-unknown-versions' +
|
|
24
|
+
' npx browserslist --update-db'
|
|
25
|
+
|
|
26
|
+
function isArg(arg) {
|
|
25
27
|
return args.some(function (str) {
|
|
26
28
|
return str === arg || str.indexOf(arg + '=') === 0
|
|
27
29
|
})
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
function error
|
|
32
|
+
function error(msg) {
|
|
31
33
|
process.stderr.write('browserslist: ' + msg + '\n')
|
|
32
34
|
process.exit(1)
|
|
33
35
|
}
|
|
@@ -42,7 +44,7 @@ if (isArg('--help') || isArg('-h')) {
|
|
|
42
44
|
})
|
|
43
45
|
} else {
|
|
44
46
|
var mode = 'browsers'
|
|
45
|
-
var opts = {
|
|
47
|
+
var opts = {}
|
|
46
48
|
var queries
|
|
47
49
|
var areas
|
|
48
50
|
|
|
@@ -75,6 +77,8 @@ if (isArg('--help') || isArg('-h')) {
|
|
|
75
77
|
mode = 'json'
|
|
76
78
|
} else if (name === '--mobile-to-desktop') {
|
|
77
79
|
opts.mobileToDesktop = true
|
|
80
|
+
} else if (name === '--ignore-unknown-versions') {
|
|
81
|
+
opts.ignoreUnknownVersions = true
|
|
78
82
|
} else {
|
|
79
83
|
error('Unknown arguments ' + args[i] + '.\n\n' + USAGE)
|
|
80
84
|
}
|
|
@@ -138,7 +142,7 @@ if (isArg('--help') || isArg('-h')) {
|
|
|
138
142
|
data.coverage = coverage.reduce(function (object, j) {
|
|
139
143
|
object[j[0]] = j[1]
|
|
140
144
|
return object
|
|
141
|
-
}, {
|
|
145
|
+
}, {})
|
|
142
146
|
}
|
|
143
147
|
process.stdout.write(JSON.stringify(data, null, ' ') + '\n')
|
|
144
148
|
}
|
package/error.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
declare class BrowserslistError extends Error {
|
|
2
|
-
constructor(message: any)
|
|
3
|
-
name: 'BrowserslistError'
|
|
4
|
-
browserslist: true
|
|
2
|
+
constructor(message: any)
|
|
3
|
+
name: 'BrowserslistError'
|
|
4
|
+
browserslist: true
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
export = BrowserslistError
|
|
7
|
+
export = BrowserslistError
|
package/error.js
CHANGED
package/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* @param queries Browser queries.
|
|
9
9
|
* @returns Array with browser names in Can I Use.
|
|
10
10
|
*/
|
|
11
|
-
declare function browserslist
|
|
11
|
+
declare function browserslist(
|
|
12
12
|
queries?: string | readonly string[] | null,
|
|
13
13
|
opts?: browserslist.Options
|
|
14
14
|
): string[]
|
|
@@ -136,15 +136,15 @@ declare namespace browserslist {
|
|
|
136
136
|
* @param stats Which statistics should be used.
|
|
137
137
|
* @returns Total market coverage for all selected browsers.
|
|
138
138
|
*/
|
|
139
|
-
function coverage
|
|
139
|
+
function coverage(browsers: readonly string[], stats?: StatsOptions): number
|
|
140
140
|
|
|
141
|
-
function clearCaches
|
|
141
|
+
function clearCaches(): void
|
|
142
142
|
|
|
143
|
-
function parseConfig
|
|
143
|
+
function parseConfig(string: string): Config
|
|
144
144
|
|
|
145
|
-
function readConfig
|
|
145
|
+
function readConfig(file: string): Config
|
|
146
146
|
|
|
147
|
-
function findConfig
|
|
147
|
+
function findConfig(...pathSegments: string[]): Config | undefined
|
|
148
148
|
|
|
149
149
|
interface LoadConfigOptions {
|
|
150
150
|
config?: string
|
|
@@ -152,7 +152,7 @@ declare namespace browserslist {
|
|
|
152
152
|
env?: string
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
function loadConfig
|
|
155
|
+
function loadConfig(options: LoadConfigOptions): string[] | undefined
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
declare global {
|
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
|
|
16
|
+
function isVersionsMatch(versionA, versionB) {
|
|
17
17
|
return (versionA + '.').indexOf(versionB + '.') === 0
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
function isEolReleased
|
|
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
|
|
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
|
|
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
|
|
45
|
-
return function mapName
|
|
41
|
+
function nameMapper(name) {
|
|
42
|
+
return function mapName(version) {
|
|
46
43
|
return name + ' ' + version
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
|
|
50
|
-
function getMajor
|
|
47
|
+
function getMajor(version) {
|
|
51
48
|
return parseInt(version.split('.')[0])
|
|
52
49
|
}
|
|
53
50
|
|
|
54
|
-
function getMajorVersions
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
130
|
+
function parseSimpleInt(x) {
|
|
134
131
|
return parseInt(x)
|
|
135
132
|
}
|
|
136
133
|
|
|
137
|
-
function compare
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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) {
|
|
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
|
|
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
|
|
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
|
|
284
|
+
function unknownQuery(query) {
|
|
285
285
|
return new BrowserslistError(
|
|
286
|
-
'Unknown browser query `' +
|
|
287
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
@@ -400,8 +405,8 @@ var cache = { }
|
|
|
400
405
|
* @example
|
|
401
406
|
* browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8']
|
|
402
407
|
*/
|
|
403
|
-
function browserslist
|
|
404
|
-
if (typeof opts === 'undefined') opts = {
|
|
408
|
+
function browserslist(queries, opts) {
|
|
409
|
+
if (typeof opts === 'undefined') opts = {}
|
|
405
410
|
|
|
406
411
|
if (typeof opts.path === 'undefined') {
|
|
407
412
|
opts.path = path.resolve ? path.resolve('.') : '.'
|
|
@@ -418,7 +423,8 @@ function browserslist (queries, opts) {
|
|
|
418
423
|
|
|
419
424
|
if (!(typeof queries === 'string' || Array.isArray(queries))) {
|
|
420
425
|
throw new BrowserslistError(
|
|
421
|
-
'Browser queries must be an array or string. Got ' + typeof queries + '.'
|
|
426
|
+
'Browser queries must be an array or string. Got ' + typeof queries + '.'
|
|
427
|
+
)
|
|
422
428
|
}
|
|
423
429
|
|
|
424
430
|
var context = {
|
|
@@ -432,7 +438,7 @@ function browserslist (queries, opts) {
|
|
|
432
438
|
env.oldDataWarning(browserslist.data)
|
|
433
439
|
var stats = env.getStat(opts, browserslist.data)
|
|
434
440
|
if (stats) {
|
|
435
|
-
context.customUsage = {
|
|
441
|
+
context.customUsage = {}
|
|
436
442
|
for (var browser in stats) {
|
|
437
443
|
fillUsage(context.customUsage, browser, stats[browser])
|
|
438
444
|
}
|
|
@@ -461,7 +467,7 @@ function browserslist (queries, opts) {
|
|
|
461
467
|
return result
|
|
462
468
|
}
|
|
463
469
|
|
|
464
|
-
function parse
|
|
470
|
+
function parse(queries) {
|
|
465
471
|
var qs = []
|
|
466
472
|
do {
|
|
467
473
|
queries = doMatch(queries, qs)
|
|
@@ -469,7 +475,7 @@ function parse (queries) {
|
|
|
469
475
|
return qs
|
|
470
476
|
}
|
|
471
477
|
|
|
472
|
-
function doMatch
|
|
478
|
+
function doMatch(string, qs) {
|
|
473
479
|
var or = /^(?:,\s*|\s+or\s+)(.*)/i
|
|
474
480
|
var and = /^\s+and\s+(.*)/i
|
|
475
481
|
|
|
@@ -488,7 +494,7 @@ function doMatch (string, qs) {
|
|
|
488
494
|
})
|
|
489
495
|
}
|
|
490
496
|
|
|
491
|
-
function find
|
|
497
|
+
function find(string, predicate) {
|
|
492
498
|
for (var n = 1, max = string.length; n <= max; n++) {
|
|
493
499
|
var parsed = string.substr(-n, n)
|
|
494
500
|
if (predicate(parsed, n, max)) {
|
|
@@ -498,7 +504,7 @@ function find (string, predicate) {
|
|
|
498
504
|
return ''
|
|
499
505
|
}
|
|
500
506
|
|
|
501
|
-
function flatten
|
|
507
|
+
function flatten(array) {
|
|
502
508
|
if (!Array.isArray(array)) return [array]
|
|
503
509
|
return array.reduce(function (a, b) {
|
|
504
510
|
return a.concat(flatten(b))
|
|
@@ -506,20 +512,15 @@ function flatten (array) {
|
|
|
506
512
|
}
|
|
507
513
|
|
|
508
514
|
// Will be filled by Can I Use data below
|
|
509
|
-
browserslist.cache = {
|
|
510
|
-
browserslist.data = {
|
|
515
|
+
browserslist.cache = {}
|
|
516
|
+
browserslist.data = {}
|
|
511
517
|
browserslist.usage = {
|
|
512
|
-
global: {
|
|
518
|
+
global: {},
|
|
513
519
|
custom: null
|
|
514
520
|
}
|
|
515
521
|
|
|
516
522
|
// Default browsers query
|
|
517
|
-
browserslist.defaults = [
|
|
518
|
-
'> 0.5%',
|
|
519
|
-
'last 2 versions',
|
|
520
|
-
'Firefox ESR',
|
|
521
|
-
'not dead'
|
|
522
|
-
]
|
|
523
|
+
browserslist.defaults = ['> 0.5%', 'last 2 versions', 'Firefox ESR', 'not dead']
|
|
523
524
|
|
|
524
525
|
// Browser names aliases
|
|
525
526
|
browserslist.aliases = {
|
|
@@ -548,7 +549,7 @@ browserslist.desktopNames = {
|
|
|
548
549
|
}
|
|
549
550
|
|
|
550
551
|
// Aliases to work with joined versions like `ios_saf 7.0-7.1`
|
|
551
|
-
browserslist.versionAliases = {
|
|
552
|
+
browserslist.versionAliases = {}
|
|
552
553
|
|
|
553
554
|
browserslist.clearCaches = env.clearCaches
|
|
554
555
|
browserslist.parseConfig = env.parseConfig
|
|
@@ -597,7 +598,7 @@ browserslist.coverage = function (browsers, stats) {
|
|
|
597
598
|
if ('dataByBrowser' in stats) {
|
|
598
599
|
stats = stats.dataByBrowser
|
|
599
600
|
}
|
|
600
|
-
data = {
|
|
601
|
+
data = {}
|
|
601
602
|
for (var name in stats) {
|
|
602
603
|
for (var version in stats[name]) {
|
|
603
604
|
data[name + ' ' + version] = stats[name][version]
|
|
@@ -614,7 +615,7 @@ browserslist.coverage = function (browsers, stats) {
|
|
|
614
615
|
}, 0)
|
|
615
616
|
}
|
|
616
617
|
|
|
617
|
-
function nodeQuery
|
|
618
|
+
function nodeQuery(context, version) {
|
|
618
619
|
var nodeReleases = jsReleases.filter(function (i) {
|
|
619
620
|
return i.name === 'nodejs'
|
|
620
621
|
})
|
|
@@ -631,22 +632,20 @@ function nodeQuery (context, version) {
|
|
|
631
632
|
return ['node ' + matched[matched.length - 1].version]
|
|
632
633
|
}
|
|
633
634
|
|
|
634
|
-
function sinceQuery
|
|
635
|
+
function sinceQuery(context, year, month, date) {
|
|
635
636
|
year = parseInt(year)
|
|
636
637
|
month = parseInt(month || '01') - 1
|
|
637
638
|
date = parseInt(date || '01')
|
|
638
639
|
return filterByYear(Date.UTC(year, month, date, 0, 0, 0), context)
|
|
639
640
|
}
|
|
640
641
|
|
|
641
|
-
function coverQuery
|
|
642
|
+
function coverQuery(context, coverage, statMode) {
|
|
642
643
|
coverage = parseFloat(coverage)
|
|
643
644
|
var usage = browserslist.usage.global
|
|
644
645
|
if (statMode) {
|
|
645
|
-
if (statMode.match(/^my\s+stats$/)) {
|
|
646
|
+
if (statMode.match(/^my\s+stats$/i)) {
|
|
646
647
|
if (!context.customUsage) {
|
|
647
|
-
throw new BrowserslistError(
|
|
648
|
-
'Custom usage statistics was not provided'
|
|
649
|
-
)
|
|
648
|
+
throw new BrowserslistError('Custom usage statistics was not provided')
|
|
650
649
|
}
|
|
651
650
|
usage = context.customUsage
|
|
652
651
|
} else {
|
|
@@ -918,11 +917,11 @@ var QUERIES = [
|
|
|
918
917
|
}
|
|
919
918
|
},
|
|
920
919
|
{
|
|
921
|
-
regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)
|
|
920
|
+
regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%$/i,
|
|
922
921
|
select: coverQuery
|
|
923
922
|
},
|
|
924
923
|
{
|
|
925
|
-
regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%\s+in\s+(my\s+stats|(alt-)?\w\w)
|
|
924
|
+
regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%\s+in\s+(my\s+stats|(alt-)?\w\w)$/i,
|
|
926
925
|
select: coverQuery
|
|
927
926
|
},
|
|
928
927
|
{
|
|
@@ -986,7 +985,7 @@ var QUERIES = [
|
|
|
986
985
|
var data = checkName(name, context)
|
|
987
986
|
from = parseFloat(normalizeVersion(data, from) || from)
|
|
988
987
|
to = parseFloat(normalizeVersion(data, to) || to)
|
|
989
|
-
function filter
|
|
988
|
+
function filter(v) {
|
|
990
989
|
var parsed = parseFloat(v)
|
|
991
990
|
return parsed >= from && parsed <= to
|
|
992
991
|
}
|
|
@@ -1180,11 +1179,11 @@ var QUERIES = [
|
|
|
1180
1179
|
}
|
|
1181
1180
|
}
|
|
1182
1181
|
}
|
|
1183
|
-
]
|
|
1182
|
+
]
|
|
1184
1183
|
|
|
1185
1184
|
// Get and convert Can I Use data
|
|
1186
1185
|
|
|
1187
|
-
(function () {
|
|
1186
|
+
;(function () {
|
|
1188
1187
|
for (var name in agents) {
|
|
1189
1188
|
var browser = agents[name]
|
|
1190
1189
|
browserslist.data[name] = {
|
|
@@ -1195,7 +1194,7 @@ var QUERIES = [
|
|
|
1195
1194
|
}
|
|
1196
1195
|
fillUsage(browserslist.usage.global, name, browser.usage_global)
|
|
1197
1196
|
|
|
1198
|
-
browserslist.versionAliases[name] = {
|
|
1197
|
+
browserslist.versionAliases[name] = {}
|
|
1199
1198
|
for (var i = 0; i < browser.versions.length; i++) {
|
|
1200
1199
|
var full = browser.versions[i]
|
|
1201
1200
|
if (!full) continue
|
|
@@ -1210,6 +1209,6 @@ var QUERIES = [
|
|
|
1210
1209
|
}
|
|
1211
1210
|
|
|
1212
1211
|
browserslist.versionAliases.op_mob['59'] = '58'
|
|
1213
|
-
}()
|
|
1212
|
+
})()
|
|
1214
1213
|
|
|
1215
1214
|
module.exports = browserslist
|
package/node.js
CHANGED
|
@@ -9,29 +9,33 @@ var IS_SECTION = /^\s*\[(.+)]\s*$/
|
|
|
9
9
|
var CONFIG_PATTERN = /^browserslist-config-/
|
|
10
10
|
var SCOPED_CONFIG__PATTERN = /@[^/]+\/browserslist-config(-|$|\/)/
|
|
11
11
|
var TIME_TO_UPDATE_CANIUSE = 6 * 30 * 24 * 60 * 60 * 1000
|
|
12
|
-
var FORMAT =
|
|
13
|
-
|
|
12
|
+
var FORMAT =
|
|
13
|
+
'Browserslist config should be a string or an array ' +
|
|
14
|
+
'of strings with browser queries'
|
|
14
15
|
|
|
15
16
|
var dataTimeChecked = false
|
|
16
|
-
var filenessCache = {
|
|
17
|
-
var configCache = {
|
|
18
|
-
function checkExtend
|
|
17
|
+
var filenessCache = {}
|
|
18
|
+
var configCache = {}
|
|
19
|
+
function checkExtend(name) {
|
|
19
20
|
var use = ' Use `dangerousExtend` option to disable.'
|
|
20
21
|
if (!CONFIG_PATTERN.test(name) && !SCOPED_CONFIG__PATTERN.test(name)) {
|
|
21
22
|
throw new BrowserslistError(
|
|
22
|
-
'Browserslist config needs `browserslist-config-` prefix. ' + use
|
|
23
|
+
'Browserslist config needs `browserslist-config-` prefix. ' + use
|
|
24
|
+
)
|
|
23
25
|
}
|
|
24
26
|
if (name.replace(/^@[^/]+\//, '').indexOf('.') !== -1) {
|
|
25
27
|
throw new BrowserslistError(
|
|
26
|
-
'`.` not allowed in Browserslist config name. ' + use
|
|
28
|
+
'`.` not allowed in Browserslist config name. ' + use
|
|
29
|
+
)
|
|
27
30
|
}
|
|
28
31
|
if (name.indexOf('node_modules') !== -1) {
|
|
29
32
|
throw new BrowserslistError(
|
|
30
|
-
'`node_modules` not allowed in Browserslist config.' + use
|
|
33
|
+
'`node_modules` not allowed in Browserslist config.' + use
|
|
34
|
+
)
|
|
31
35
|
}
|
|
32
36
|
}
|
|
33
37
|
|
|
34
|
-
function isFile
|
|
38
|
+
function isFile(file) {
|
|
35
39
|
if (file in filenessCache) {
|
|
36
40
|
return filenessCache[file]
|
|
37
41
|
}
|
|
@@ -42,7 +46,7 @@ function isFile (file) {
|
|
|
42
46
|
return result
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
function eachParent
|
|
49
|
+
function eachParent(file, callback) {
|
|
46
50
|
var dir = isFile(file) ? path.dirname(file) : file
|
|
47
51
|
var loc = path.resolve(dir)
|
|
48
52
|
do {
|
|
@@ -52,7 +56,7 @@ function eachParent (file, callback) {
|
|
|
52
56
|
return undefined
|
|
53
57
|
}
|
|
54
58
|
|
|
55
|
-
function check
|
|
59
|
+
function check(section) {
|
|
56
60
|
if (Array.isArray(section)) {
|
|
57
61
|
for (var i = 0; i < section.length; i++) {
|
|
58
62
|
if (typeof section[i] !== 'string') {
|
|
@@ -64,7 +68,7 @@ function check (section) {
|
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
70
|
|
|
67
|
-
function pickEnv
|
|
71
|
+
function pickEnv(config, opts) {
|
|
68
72
|
if (typeof config !== 'object') return config
|
|
69
73
|
|
|
70
74
|
var name
|
|
@@ -81,7 +85,7 @@ function pickEnv (config, opts) {
|
|
|
81
85
|
return config[name] || config.defaults
|
|
82
86
|
}
|
|
83
87
|
|
|
84
|
-
function parsePackage
|
|
88
|
+
function parsePackage(file) {
|
|
85
89
|
var config = JSON.parse(fs.readFileSync(file))
|
|
86
90
|
if (config.browserlist && !config.browserslist) {
|
|
87
91
|
throw new BrowserslistError(
|
|
@@ -99,10 +103,10 @@ function parsePackage (file) {
|
|
|
99
103
|
return list
|
|
100
104
|
}
|
|
101
105
|
|
|
102
|
-
function latestReleaseTime
|
|
106
|
+
function latestReleaseTime(agents) {
|
|
103
107
|
var latest = 0
|
|
104
108
|
for (var name in agents) {
|
|
105
|
-
var dates = agents[name].releaseDate || {
|
|
109
|
+
var dates = agents[name].releaseDate || {}
|
|
106
110
|
for (var key in dates) {
|
|
107
111
|
if (latest < dates[key]) {
|
|
108
112
|
latest = dates[key]
|
|
@@ -112,7 +116,7 @@ function latestReleaseTime (agents) {
|
|
|
112
116
|
return latest * 1000
|
|
113
117
|
}
|
|
114
118
|
|
|
115
|
-
function normalizeStats
|
|
119
|
+
function normalizeStats(data, stats) {
|
|
116
120
|
if (!data) {
|
|
117
121
|
data = {}
|
|
118
122
|
}
|
|
@@ -122,16 +126,12 @@ function normalizeStats (data, stats) {
|
|
|
122
126
|
|
|
123
127
|
if (typeof stats !== 'object') return undefined
|
|
124
128
|
|
|
125
|
-
var normalized = {
|
|
129
|
+
var normalized = {}
|
|
126
130
|
for (var i in stats) {
|
|
127
131
|
var versions = Object.keys(stats[i])
|
|
128
|
-
if (
|
|
129
|
-
versions.length === 1 &&
|
|
130
|
-
data[i] &&
|
|
131
|
-
data[i].versions.length === 1
|
|
132
|
-
) {
|
|
132
|
+
if (versions.length === 1 && data[i] && data[i].versions.length === 1) {
|
|
133
133
|
var normal = data[i].versions[0]
|
|
134
|
-
normalized[i] = {
|
|
134
|
+
normalized[i] = {}
|
|
135
135
|
normalized[i][normal] = stats[i][versions[0]]
|
|
136
136
|
} else {
|
|
137
137
|
normalized[i] = stats[i]
|
|
@@ -141,7 +141,7 @@ function normalizeStats (data, stats) {
|
|
|
141
141
|
return normalized
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
function normalizeUsageData
|
|
144
|
+
function normalizeUsageData(usageData, data) {
|
|
145
145
|
for (var browser in usageData) {
|
|
146
146
|
var browserUsage = usageData[browser]
|
|
147
147
|
// eslint-disable-next-line max-len
|
|
@@ -156,12 +156,11 @@ function normalizeUsageData (usageData, data) {
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
module.exports = {
|
|
159
|
-
loadQueries: function loadQueries
|
|
159
|
+
loadQueries: function loadQueries(ctx, name) {
|
|
160
160
|
if (!ctx.dangerousExtend && !process.env.BROWSERSLIST_DANGEROUS_EXTEND) {
|
|
161
161
|
checkExtend(name)
|
|
162
162
|
}
|
|
163
|
-
|
|
164
|
-
var queries = require(require.resolve(name, { paths: ['.'] }))
|
|
163
|
+
var queries = require(require.resolve(name, { paths: ['.', ctx.path] }))
|
|
165
164
|
if (queries) {
|
|
166
165
|
if (Array.isArray(queries)) {
|
|
167
166
|
return queries
|
|
@@ -171,26 +170,25 @@ module.exports = {
|
|
|
171
170
|
}
|
|
172
171
|
}
|
|
173
172
|
throw new BrowserslistError(
|
|
174
|
-
'`' +
|
|
175
|
-
|
|
173
|
+
'`' +
|
|
174
|
+
name +
|
|
175
|
+
'` config exports not an array of queries' +
|
|
176
|
+
' or an object of envs'
|
|
176
177
|
)
|
|
177
178
|
},
|
|
178
179
|
|
|
179
|
-
loadStat: function loadStat
|
|
180
|
+
loadStat: function loadStat(ctx, name, data) {
|
|
180
181
|
if (!ctx.dangerousExtend && !process.env.BROWSERSLIST_DANGEROUS_EXTEND) {
|
|
181
182
|
checkExtend(name)
|
|
182
183
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
{ paths: ['.'] }
|
|
188
|
-
)
|
|
189
|
-
)
|
|
184
|
+
var stats = require(require.resolve(
|
|
185
|
+
path.join(name, 'browserslist-stats.json'),
|
|
186
|
+
{ paths: ['.'] }
|
|
187
|
+
))
|
|
190
188
|
return normalizeStats(data, stats)
|
|
191
189
|
},
|
|
192
190
|
|
|
193
|
-
getStat: function getStat
|
|
191
|
+
getStat: function getStat(opts, data) {
|
|
194
192
|
var stats
|
|
195
193
|
if (opts.stats) {
|
|
196
194
|
stats = opts.stats
|
|
@@ -206,13 +204,13 @@ module.exports = {
|
|
|
206
204
|
try {
|
|
207
205
|
stats = JSON.parse(fs.readFileSync(stats))
|
|
208
206
|
} catch (e) {
|
|
209
|
-
throw new BrowserslistError(
|
|
207
|
+
throw new BrowserslistError("Can't read " + stats)
|
|
210
208
|
}
|
|
211
209
|
}
|
|
212
210
|
return normalizeStats(data, stats)
|
|
213
211
|
},
|
|
214
212
|
|
|
215
|
-
loadConfig: function loadConfig
|
|
213
|
+
loadConfig: function loadConfig(opts) {
|
|
216
214
|
if (process.env.BROWSERSLIST) {
|
|
217
215
|
return process.env.BROWSERSLIST
|
|
218
216
|
} else if (opts.config || process.env.BROWSERSLIST_CONFIG) {
|
|
@@ -229,14 +227,13 @@ module.exports = {
|
|
|
229
227
|
}
|
|
230
228
|
},
|
|
231
229
|
|
|
232
|
-
loadCountry: function loadCountry
|
|
230
|
+
loadCountry: function loadCountry(usage, country, data) {
|
|
233
231
|
var code = country.replace(/[^\w-]/g, '')
|
|
234
232
|
if (!usage[code]) {
|
|
235
|
-
// eslint-disable-next-line security/detect-non-literal-require
|
|
236
233
|
var compressed = require('caniuse-lite/data/regions/' + code + '.js')
|
|
237
234
|
var usageData = region(compressed)
|
|
238
235
|
normalizeUsageData(usageData, data)
|
|
239
|
-
usage[country] = {
|
|
236
|
+
usage[country] = {}
|
|
240
237
|
for (var i in usageData) {
|
|
241
238
|
for (var j in usageData[i]) {
|
|
242
239
|
usage[country][i + ' ' + j] = usageData[i][j]
|
|
@@ -245,14 +242,13 @@ module.exports = {
|
|
|
245
242
|
}
|
|
246
243
|
},
|
|
247
244
|
|
|
248
|
-
loadFeature: function loadFeature
|
|
245
|
+
loadFeature: function loadFeature(features, name) {
|
|
249
246
|
name = name.replace(/[^\w-]/g, '')
|
|
250
247
|
if (features[name]) return
|
|
251
248
|
|
|
252
|
-
// eslint-disable-next-line security/detect-non-literal-require
|
|
253
249
|
var compressed = require('caniuse-lite/data/features/' + name + '.js')
|
|
254
250
|
var stats = feature(compressed).stats
|
|
255
|
-
features[name] = {
|
|
251
|
+
features[name] = {}
|
|
256
252
|
for (var i in stats) {
|
|
257
253
|
for (var j in stats[i]) {
|
|
258
254
|
features[name][i + ' ' + j] = stats[i][j]
|
|
@@ -260,11 +256,12 @@ module.exports = {
|
|
|
260
256
|
}
|
|
261
257
|
},
|
|
262
258
|
|
|
263
|
-
parseConfig: function parseConfig
|
|
259
|
+
parseConfig: function parseConfig(string) {
|
|
264
260
|
var result = { defaults: [] }
|
|
265
261
|
var sections = ['defaults']
|
|
266
262
|
|
|
267
|
-
string
|
|
263
|
+
string
|
|
264
|
+
.toString()
|
|
268
265
|
.replace(/#[^\n]*/g, '')
|
|
269
266
|
.split(/\n|,/)
|
|
270
267
|
.map(function (line) {
|
|
@@ -294,14 +291,14 @@ module.exports = {
|
|
|
294
291
|
return result
|
|
295
292
|
},
|
|
296
293
|
|
|
297
|
-
readConfig: function readConfig
|
|
294
|
+
readConfig: function readConfig(file) {
|
|
298
295
|
if (!isFile(file)) {
|
|
299
|
-
throw new BrowserslistError(
|
|
296
|
+
throw new BrowserslistError("Can't read " + file + ' config')
|
|
300
297
|
}
|
|
301
298
|
return module.exports.parseConfig(fs.readFileSync(file))
|
|
302
299
|
},
|
|
303
300
|
|
|
304
|
-
findConfig: function findConfig
|
|
301
|
+
findConfig: function findConfig(from) {
|
|
305
302
|
from = path.resolve(from)
|
|
306
303
|
|
|
307
304
|
var passed = []
|
|
@@ -356,15 +353,15 @@ module.exports = {
|
|
|
356
353
|
return resolved
|
|
357
354
|
},
|
|
358
355
|
|
|
359
|
-
clearCaches: function clearCaches
|
|
356
|
+
clearCaches: function clearCaches() {
|
|
360
357
|
dataTimeChecked = false
|
|
361
|
-
filenessCache = {
|
|
362
|
-
configCache = {
|
|
358
|
+
filenessCache = {}
|
|
359
|
+
configCache = {}
|
|
363
360
|
|
|
364
|
-
this.cache = {
|
|
361
|
+
this.cache = {}
|
|
365
362
|
},
|
|
366
363
|
|
|
367
|
-
oldDataWarning: function oldDataWarning
|
|
364
|
+
oldDataWarning: function oldDataWarning(agentsObj) {
|
|
368
365
|
if (dataTimeChecked) return
|
|
369
366
|
dataTimeChecked = true
|
|
370
367
|
if (process.env.BROWSERSLIST_IGNORE_OLD_DATA) return
|
|
@@ -375,14 +372,14 @@ module.exports = {
|
|
|
375
372
|
if (latest !== 0 && latest < halfYearAgo) {
|
|
376
373
|
console.warn(
|
|
377
374
|
'Browserslist: caniuse-lite is outdated. Please run:\n' +
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
375
|
+
' npx browserslist@latest --update-db\n' +
|
|
376
|
+
' Why you should do it regularly: ' +
|
|
377
|
+
'https://github.com/browserslist/browserslist#browsers-data-updating'
|
|
381
378
|
)
|
|
382
379
|
}
|
|
383
380
|
},
|
|
384
381
|
|
|
385
|
-
currentNode: function currentNode
|
|
382
|
+
currentNode: function currentNode() {
|
|
386
383
|
return 'node ' + process.versions.node
|
|
387
384
|
}
|
|
388
385
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "browserslist",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.18.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",
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"repository": "browserslist/browserslist",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"caniuse-lite": "^1.0.
|
|
19
|
-
"electron-to-chromium": "^1.3.
|
|
18
|
+
"caniuse-lite": "^1.0.30001280",
|
|
19
|
+
"electron-to-chromium": "^1.3.896",
|
|
20
20
|
"escalade": "^3.1.1",
|
|
21
|
-
"node-releases": "^2.0.
|
|
21
|
+
"node-releases": "^2.0.1",
|
|
22
22
|
"picocolors": "^1.0.0"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
package/update-db.js
CHANGED
|
@@ -6,7 +6,7 @@ var fs = require('fs')
|
|
|
6
6
|
|
|
7
7
|
var BrowserslistError = require('./error')
|
|
8
8
|
|
|
9
|
-
function detectLockfile
|
|
9
|
+
function detectLockfile() {
|
|
10
10
|
var packageDir = escalade('.', function (dir, names) {
|
|
11
11
|
return names.indexOf('package.json') !== -1 ? dir : ''
|
|
12
12
|
})
|
|
@@ -14,7 +14,7 @@ function detectLockfile () {
|
|
|
14
14
|
if (!packageDir) {
|
|
15
15
|
throw new BrowserslistError(
|
|
16
16
|
'Cannot find package.json. ' +
|
|
17
|
-
|
|
17
|
+
'Is this the right directory to run `npx browserslist --update-db` in?'
|
|
18
18
|
)
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -40,7 +40,7 @@ function detectLockfile () {
|
|
|
40
40
|
)
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
function getLatestInfo
|
|
43
|
+
function getLatestInfo(lock) {
|
|
44
44
|
if (lock.mode === 'yarn') {
|
|
45
45
|
if (lock.version === 1) {
|
|
46
46
|
return JSON.parse(
|
|
@@ -57,8 +57,10 @@ function getLatestInfo (lock) {
|
|
|
57
57
|
)
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
function getBrowsersList
|
|
61
|
-
return childProcess
|
|
60
|
+
function getBrowsersList() {
|
|
61
|
+
return childProcess
|
|
62
|
+
.execSync('npx browserslist')
|
|
63
|
+
.toString()
|
|
62
64
|
.trim()
|
|
63
65
|
.split('\n')
|
|
64
66
|
.map(function (line) {
|
|
@@ -73,44 +75,49 @@ function getBrowsersList () {
|
|
|
73
75
|
}, {})
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
function diffBrowsersLists
|
|
78
|
+
function diffBrowsersLists(old, current) {
|
|
77
79
|
var browsers = Object.keys(old).concat(
|
|
78
80
|
Object.keys(current).filter(function (browser) {
|
|
79
81
|
return old[browser] === undefined
|
|
80
82
|
})
|
|
81
83
|
)
|
|
82
|
-
return browsers
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
+
)
|
|
93
106
|
})
|
|
94
|
-
return removedVersions.map(function (version) {
|
|
95
|
-
return pico.red('- ' + browser + ' ' + version)
|
|
96
|
-
}).concat(addedVersions.map(function (version) {
|
|
97
|
-
return pico.green('+ ' + browser + ' ' + version)
|
|
98
|
-
}))
|
|
99
|
-
})
|
|
100
107
|
.reduce(function (result, array) {
|
|
101
108
|
return result.concat(array)
|
|
102
109
|
}, [])
|
|
103
110
|
.join('\n')
|
|
104
111
|
}
|
|
105
112
|
|
|
106
|
-
function updateNpmLockfile
|
|
113
|
+
function updateNpmLockfile(lock, latest) {
|
|
107
114
|
var metadata = { latest: latest, versions: [] }
|
|
108
115
|
var content = deletePackage(JSON.parse(lock.content), metadata)
|
|
109
116
|
metadata.content = JSON.stringify(content, null, ' ')
|
|
110
117
|
return metadata
|
|
111
118
|
}
|
|
112
119
|
|
|
113
|
-
function deletePackage
|
|
120
|
+
function deletePackage(node, metadata) {
|
|
114
121
|
if (node.dependencies) {
|
|
115
122
|
if (node.dependencies['caniuse-lite']) {
|
|
116
123
|
var version = node.dependencies['caniuse-lite'].version
|
|
@@ -124,9 +131,9 @@ function deletePackage (node, metadata) {
|
|
|
124
131
|
return node
|
|
125
132
|
}
|
|
126
133
|
|
|
127
|
-
var yarnVersionRe =
|
|
134
|
+
var yarnVersionRe = /version "(.*?)"/
|
|
128
135
|
|
|
129
|
-
function updateYarnLockfile
|
|
136
|
+
function updateYarnLockfile(lock, latest) {
|
|
130
137
|
var blocks = lock.content.split(/(\n{2,})/).map(function (block) {
|
|
131
138
|
return block.split('\n')
|
|
132
139
|
})
|
|
@@ -137,24 +144,31 @@ function updateYarnLockfile (lock, latest) {
|
|
|
137
144
|
versions[match[1]] = true
|
|
138
145
|
if (match[1] !== latest.version) {
|
|
139
146
|
lines[1] = lines[1].replace(
|
|
140
|
-
/version "[^"]+"/,
|
|
147
|
+
/version "[^"]+"/,
|
|
148
|
+
'version "' + latest.version + '"'
|
|
141
149
|
)
|
|
142
150
|
lines[2] = lines[2].replace(
|
|
143
|
-
/resolved "[^"]+"/,
|
|
151
|
+
/resolved "[^"]+"/,
|
|
152
|
+
'resolved "' + latest.dist.tarball + '"'
|
|
144
153
|
)
|
|
145
|
-
lines[3] = latest.dist.integrity
|
|
146
|
-
|
|
147
|
-
|
|
154
|
+
lines[3] = latest.dist.integrity
|
|
155
|
+
? lines[3].replace(
|
|
156
|
+
/integrity .+/,
|
|
157
|
+
'integrity ' + latest.dist.integrity
|
|
158
|
+
)
|
|
159
|
+
: ''
|
|
148
160
|
}
|
|
149
161
|
}
|
|
150
162
|
})
|
|
151
|
-
var content = blocks
|
|
152
|
-
|
|
153
|
-
|
|
163
|
+
var content = blocks
|
|
164
|
+
.map(function (lines) {
|
|
165
|
+
return lines.join('\n')
|
|
166
|
+
})
|
|
167
|
+
.join('')
|
|
154
168
|
return { content: content, versions: versions }
|
|
155
169
|
}
|
|
156
170
|
|
|
157
|
-
function updatePnpmLockfile
|
|
171
|
+
function updatePnpmLockfile(lock, latest) {
|
|
158
172
|
var versions = {}
|
|
159
173
|
var lines = lock.content.split('\n')
|
|
160
174
|
var i
|
|
@@ -164,7 +178,19 @@ function updatePnpmLockfile (lock, latest) {
|
|
|
164
178
|
for (i = 0; i < lines.length; i++) {
|
|
165
179
|
if (lines[i].indexOf('caniuse-lite:') >= 0) {
|
|
166
180
|
lineParts = lines[i].split(/:\s?/, 2)
|
|
167
|
-
|
|
181
|
+
if (lineParts[1].indexOf('/') >= 0) {
|
|
182
|
+
var sublineParts = lineParts[1].split(/([/:])/)
|
|
183
|
+
for (j = 0; j < sublineParts.length; j++) {
|
|
184
|
+
if (sublineParts[j].indexOf('caniuse-lite') >= 0) {
|
|
185
|
+
versions[sublineParts[j + 2]] = true
|
|
186
|
+
sublineParts[j + 2] = latest.version
|
|
187
|
+
break
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
lineParts[1] = sublineParts.join('')
|
|
191
|
+
} else {
|
|
192
|
+
versions[lineParts[1]] = true
|
|
193
|
+
}
|
|
168
194
|
lines[i] = lineParts[0] + ': ' + latest.version
|
|
169
195
|
} else if (lines[i].indexOf('/caniuse-lite') >= 0) {
|
|
170
196
|
lineParts = lines[i].split(/([/:])/)
|
|
@@ -179,7 +205,8 @@ function updatePnpmLockfile (lock, latest) {
|
|
|
179
205
|
for (i = i + 1; i < lines.length; i++) {
|
|
180
206
|
if (lines[i].indexOf('integrity: ') !== -1) {
|
|
181
207
|
lines[i] = lines[i].replace(
|
|
182
|
-
/integrity: .+/,
|
|
208
|
+
/integrity: .+/,
|
|
209
|
+
'integrity: ' + latest.dist.integrity
|
|
183
210
|
)
|
|
184
211
|
} else if (lines[i].indexOf(' /') !== -1) {
|
|
185
212
|
break
|
|
@@ -190,7 +217,7 @@ function updatePnpmLockfile (lock, latest) {
|
|
|
190
217
|
return { content: lines.join('\n'), versions: versions }
|
|
191
218
|
}
|
|
192
219
|
|
|
193
|
-
function updateLockfile
|
|
220
|
+
function updateLockfile(lock, latest) {
|
|
194
221
|
if (!lock.content) lock.content = fs.readFileSync(lock.file).toString()
|
|
195
222
|
|
|
196
223
|
if (lock.mode === 'npm') {
|
|
@@ -201,14 +228,16 @@ function updateLockfile (lock, latest) {
|
|
|
201
228
|
return updatePnpmLockfile(lock, latest)
|
|
202
229
|
}
|
|
203
230
|
|
|
204
|
-
function updatePackageManually
|
|
231
|
+
function updatePackageManually(print, lock, latest) {
|
|
205
232
|
var lockfileData = updateLockfile(lock, latest)
|
|
206
233
|
var caniuseVersions = Object.keys(lockfileData.versions).sort()
|
|
207
|
-
if (caniuseVersions.length === 1 &&
|
|
208
|
-
caniuseVersions[0] === latest.version) {
|
|
234
|
+
if (caniuseVersions.length === 1 && caniuseVersions[0] === latest.version) {
|
|
209
235
|
print(
|
|
210
|
-
'Installed version: ' +
|
|
211
|
-
|
|
236
|
+
'Installed version: ' +
|
|
237
|
+
pico.bold(pico.green(latest.version)) +
|
|
238
|
+
'\n' +
|
|
239
|
+
pico.bold(pico.green('caniuse-lite is up to date')) +
|
|
240
|
+
'\n'
|
|
212
241
|
)
|
|
213
242
|
return
|
|
214
243
|
}
|
|
@@ -218,17 +247,18 @@ function updatePackageManually (print, lock, latest) {
|
|
|
218
247
|
}
|
|
219
248
|
print(
|
|
220
249
|
'Installed version' +
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
250
|
+
(caniuseVersions.length === 1 ? ': ' : 's: ') +
|
|
251
|
+
pico.bold(pico.red(caniuseVersions.join(', '))) +
|
|
252
|
+
'\n' +
|
|
253
|
+
'Removing old caniuse-lite from lock file\n'
|
|
225
254
|
)
|
|
226
255
|
fs.writeFileSync(lock.file, lockfileData.content)
|
|
227
256
|
|
|
228
257
|
var install = lock.mode === 'yarn' ? 'yarn add -W' : lock.mode + ' install'
|
|
229
258
|
print(
|
|
230
259
|
'Installing new caniuse-lite version\n' +
|
|
231
|
-
|
|
260
|
+
pico.yellow('$ ' + install + ' caniuse-lite') +
|
|
261
|
+
'\n'
|
|
232
262
|
)
|
|
233
263
|
try {
|
|
234
264
|
childProcess.execSync(install + ' caniuse-lite')
|
|
@@ -236,9 +266,12 @@ function updatePackageManually (print, lock, latest) {
|
|
|
236
266
|
print(
|
|
237
267
|
pico.red(
|
|
238
268
|
'\n' +
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
269
|
+
e.stack +
|
|
270
|
+
'\n\n' +
|
|
271
|
+
'Problem with `' +
|
|
272
|
+
install +
|
|
273
|
+
' caniuse-lite` call. ' +
|
|
274
|
+
'Run it manually.\n'
|
|
242
275
|
)
|
|
243
276
|
)
|
|
244
277
|
process.exit(1)
|
|
@@ -247,12 +280,13 @@ function updatePackageManually (print, lock, latest) {
|
|
|
247
280
|
var del = lock.mode === 'yarn' ? 'yarn remove -W' : lock.mode + ' uninstall'
|
|
248
281
|
print(
|
|
249
282
|
'Cleaning package.json dependencies from caniuse-lite\n' +
|
|
250
|
-
|
|
283
|
+
pico.yellow('$ ' + del + ' caniuse-lite') +
|
|
284
|
+
'\n'
|
|
251
285
|
)
|
|
252
286
|
childProcess.execSync(del + ' caniuse-lite')
|
|
253
287
|
}
|
|
254
288
|
|
|
255
|
-
module.exports = function updateDB
|
|
289
|
+
module.exports = function updateDB(print) {
|
|
256
290
|
var lock = detectLockfile()
|
|
257
291
|
var latest = getLatestInfo(lock)
|
|
258
292
|
|
|
@@ -264,15 +298,14 @@ module.exports = function updateDB (print) {
|
|
|
264
298
|
browsersListRetrievalError = e
|
|
265
299
|
}
|
|
266
300
|
|
|
267
|
-
print(
|
|
268
|
-
'Latest version: ' + pico.bold(pico.green(latest.version)) + '\n'
|
|
269
|
-
)
|
|
301
|
+
print('Latest version: ' + pico.bold(pico.green(latest.version)) + '\n')
|
|
270
302
|
|
|
271
303
|
if (lock.mode === 'yarn' && lock.version !== 1) {
|
|
272
304
|
var update = 'yarn up -R'
|
|
273
305
|
print(
|
|
274
306
|
'Updating caniuse-lite version\n' +
|
|
275
|
-
|
|
307
|
+
pico.yellow('$ ' + update + ' caniuse-lite') +
|
|
308
|
+
'\n'
|
|
276
309
|
)
|
|
277
310
|
try {
|
|
278
311
|
childProcess.execSync(update + ' caniuse-lite')
|
|
@@ -280,9 +313,12 @@ module.exports = function updateDB (print) {
|
|
|
280
313
|
print(
|
|
281
314
|
pico.red(
|
|
282
315
|
'\n' +
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
316
|
+
e.stack +
|
|
317
|
+
'\n\n' +
|
|
318
|
+
'Problem with `' +
|
|
319
|
+
update +
|
|
320
|
+
' caniuse-lite` call. ' +
|
|
321
|
+
'Run it manually.\n'
|
|
286
322
|
)
|
|
287
323
|
)
|
|
288
324
|
process.exit(1)
|
|
@@ -306,9 +342,10 @@ module.exports = function updateDB (print) {
|
|
|
306
342
|
print(
|
|
307
343
|
pico.red(
|
|
308
344
|
'\n' +
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
345
|
+
browsersListRetrievalError.stack +
|
|
346
|
+
'\n\n' +
|
|
347
|
+
'Problem with browser list retrieval.\n' +
|
|
348
|
+
'Target browser changes won’t be shown.\n'
|
|
312
349
|
)
|
|
313
350
|
)
|
|
314
351
|
} else {
|