browserslist 4.17.5 → 4.17.6
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 +18 -17
- package/error.d.ts +4 -4
- package/error.js +1 -1
- package/index.d.ts +7 -7
- package/index.js +69 -71
- package/node.js +57 -60
- package/package.json +3 -3
- package/update-db.js +53 -39
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,27 @@ 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 --update-db'
|
|
24
|
+
|
|
25
|
+
function isArg(arg) {
|
|
25
26
|
return args.some(function (str) {
|
|
26
27
|
return str === arg || str.indexOf(arg + '=') === 0
|
|
27
28
|
})
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
function error
|
|
31
|
+
function error(msg) {
|
|
31
32
|
process.stderr.write('browserslist: ' + msg + '\n')
|
|
32
33
|
process.exit(1)
|
|
33
34
|
}
|
|
@@ -42,7 +43,7 @@ if (isArg('--help') || isArg('-h')) {
|
|
|
42
43
|
})
|
|
43
44
|
} else {
|
|
44
45
|
var mode = 'browsers'
|
|
45
|
-
var opts = {
|
|
46
|
+
var opts = {}
|
|
46
47
|
var queries
|
|
47
48
|
var areas
|
|
48
49
|
|
|
@@ -138,7 +139,7 @@ if (isArg('--help') || isArg('-h')) {
|
|
|
138
139
|
data.coverage = coverage.reduce(function (object, j) {
|
|
139
140
|
object[j[0]] = j[1]
|
|
140
141
|
return object
|
|
141
|
-
}, {
|
|
142
|
+
}, {})
|
|
142
143
|
}
|
|
143
144
|
process.stdout.write(JSON.stringify(data, null, ' ') + '\n')
|
|
144
145
|
}
|
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,7 +203,7 @@ 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)
|
|
@@ -218,7 +215,7 @@ function filterByYear (since, context) {
|
|
|
218
215
|
}, [])
|
|
219
216
|
}
|
|
220
217
|
|
|
221
|
-
function cloneData
|
|
218
|
+
function cloneData(data) {
|
|
222
219
|
return {
|
|
223
220
|
name: data.name,
|
|
224
221
|
versions: data.versions,
|
|
@@ -227,14 +224,14 @@ function cloneData (data) {
|
|
|
227
224
|
}
|
|
228
225
|
}
|
|
229
226
|
|
|
230
|
-
function mapVersions
|
|
227
|
+
function mapVersions(data, map) {
|
|
231
228
|
data.versions = data.versions.map(function (i) {
|
|
232
229
|
return map[i] || i
|
|
233
230
|
})
|
|
234
231
|
data.released = data.versions.map(function (i) {
|
|
235
232
|
return map[i] || i
|
|
236
233
|
})
|
|
237
|
-
var fixedDate = {
|
|
234
|
+
var fixedDate = {}
|
|
238
235
|
for (var i in data.releaseDate) {
|
|
239
236
|
fixedDate[map[i] || i] = data.releaseDate[i]
|
|
240
237
|
}
|
|
@@ -242,7 +239,7 @@ function mapVersions (data, map) {
|
|
|
242
239
|
return data
|
|
243
240
|
}
|
|
244
241
|
|
|
245
|
-
function byName
|
|
242
|
+
function byName(name, context) {
|
|
246
243
|
name = name.toLowerCase()
|
|
247
244
|
name = browserslist.aliases[name] || name
|
|
248
245
|
if (context.mobileToDesktop && browserslist.desktopNames[name]) {
|
|
@@ -261,34 +258,38 @@ function byName (name, context) {
|
|
|
261
258
|
return browserslist.data[name]
|
|
262
259
|
}
|
|
263
260
|
|
|
264
|
-
function normalizeAndroidVersions
|
|
261
|
+
function normalizeAndroidVersions(androidVersions, chromeVersions) {
|
|
265
262
|
var firstEvergreen = ANDROID_EVERGREEN_FIRST
|
|
266
263
|
var last = chromeVersions[chromeVersions.length - 1]
|
|
267
264
|
return androidVersions
|
|
268
|
-
.filter(function (version) {
|
|
265
|
+
.filter(function (version) {
|
|
266
|
+
return /^(?:[2-4]\.|[34]$)/.test(version)
|
|
267
|
+
})
|
|
269
268
|
.concat(chromeVersions.slice(firstEvergreen - last - 1))
|
|
270
269
|
}
|
|
271
270
|
|
|
272
|
-
function normalizeAndroidData
|
|
271
|
+
function normalizeAndroidData(android, chrome) {
|
|
273
272
|
android.released = normalizeAndroidVersions(android.released, chrome.released)
|
|
274
273
|
android.versions = normalizeAndroidVersions(android.versions, chrome.versions)
|
|
275
274
|
return android
|
|
276
275
|
}
|
|
277
276
|
|
|
278
|
-
function checkName
|
|
277
|
+
function checkName(name, context) {
|
|
279
278
|
var data = byName(name, context)
|
|
280
279
|
if (!data) throw new BrowserslistError('Unknown browser ' + name)
|
|
281
280
|
return data
|
|
282
281
|
}
|
|
283
282
|
|
|
284
|
-
function unknownQuery
|
|
283
|
+
function unknownQuery(query) {
|
|
285
284
|
return new BrowserslistError(
|
|
286
|
-
'Unknown browser query `' +
|
|
287
|
-
|
|
285
|
+
'Unknown browser query `' +
|
|
286
|
+
query +
|
|
287
|
+
'`. ' +
|
|
288
|
+
'Maybe you are using old Browserslist or made typo in query.'
|
|
288
289
|
)
|
|
289
290
|
}
|
|
290
291
|
|
|
291
|
-
function filterAndroid
|
|
292
|
+
function filterAndroid(list, versions, context) {
|
|
292
293
|
if (context.mobileToDesktop) return list
|
|
293
294
|
var released = browserslist.data.android.released
|
|
294
295
|
var last = released[released.length - 1]
|
|
@@ -308,7 +309,7 @@ function filterAndroid (list, versions, context) {
|
|
|
308
309
|
* the select function in `queries`.
|
|
309
310
|
* @returns {string[]} A list of browsers
|
|
310
311
|
*/
|
|
311
|
-
function resolve
|
|
312
|
+
function resolve(queries, context) {
|
|
312
313
|
if (Array.isArray(queries)) {
|
|
313
314
|
queries = flatten(queries.map(parse))
|
|
314
315
|
} else {
|
|
@@ -323,7 +324,10 @@ function resolve (queries, context) {
|
|
|
323
324
|
if (index === 0) {
|
|
324
325
|
throw new BrowserslistError(
|
|
325
326
|
'Write any browsers query (for instance, `defaults`) ' +
|
|
326
|
-
|
|
327
|
+
'before `' +
|
|
328
|
+
selection +
|
|
329
|
+
'`'
|
|
330
|
+
)
|
|
327
331
|
}
|
|
328
332
|
selection = selection.slice(4)
|
|
329
333
|
}
|
|
@@ -356,7 +360,7 @@ function resolve (queries, context) {
|
|
|
356
360
|
case QUERY_OR:
|
|
357
361
|
default:
|
|
358
362
|
if (isExclude) {
|
|
359
|
-
var filter = {
|
|
363
|
+
var filter = {}
|
|
360
364
|
array.forEach(function (j) {
|
|
361
365
|
filter[j] = true
|
|
362
366
|
})
|
|
@@ -373,7 +377,7 @@ function resolve (queries, context) {
|
|
|
373
377
|
}, [])
|
|
374
378
|
}
|
|
375
379
|
|
|
376
|
-
var cache = {
|
|
380
|
+
var cache = {}
|
|
377
381
|
|
|
378
382
|
/**
|
|
379
383
|
* Return array of browsers by selection queries.
|
|
@@ -400,8 +404,8 @@ var cache = { }
|
|
|
400
404
|
* @example
|
|
401
405
|
* browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8']
|
|
402
406
|
*/
|
|
403
|
-
function browserslist
|
|
404
|
-
if (typeof opts === 'undefined') opts = {
|
|
407
|
+
function browserslist(queries, opts) {
|
|
408
|
+
if (typeof opts === 'undefined') opts = {}
|
|
405
409
|
|
|
406
410
|
if (typeof opts.path === 'undefined') {
|
|
407
411
|
opts.path = path.resolve ? path.resolve('.') : '.'
|
|
@@ -418,7 +422,8 @@ function browserslist (queries, opts) {
|
|
|
418
422
|
|
|
419
423
|
if (!(typeof queries === 'string' || Array.isArray(queries))) {
|
|
420
424
|
throw new BrowserslistError(
|
|
421
|
-
'Browser queries must be an array or string. Got ' + typeof queries + '.'
|
|
425
|
+
'Browser queries must be an array or string. Got ' + typeof queries + '.'
|
|
426
|
+
)
|
|
422
427
|
}
|
|
423
428
|
|
|
424
429
|
var context = {
|
|
@@ -432,7 +437,7 @@ function browserslist (queries, opts) {
|
|
|
432
437
|
env.oldDataWarning(browserslist.data)
|
|
433
438
|
var stats = env.getStat(opts, browserslist.data)
|
|
434
439
|
if (stats) {
|
|
435
|
-
context.customUsage = {
|
|
440
|
+
context.customUsage = {}
|
|
436
441
|
for (var browser in stats) {
|
|
437
442
|
fillUsage(context.customUsage, browser, stats[browser])
|
|
438
443
|
}
|
|
@@ -461,7 +466,7 @@ function browserslist (queries, opts) {
|
|
|
461
466
|
return result
|
|
462
467
|
}
|
|
463
468
|
|
|
464
|
-
function parse
|
|
469
|
+
function parse(queries) {
|
|
465
470
|
var qs = []
|
|
466
471
|
do {
|
|
467
472
|
queries = doMatch(queries, qs)
|
|
@@ -469,7 +474,7 @@ function parse (queries) {
|
|
|
469
474
|
return qs
|
|
470
475
|
}
|
|
471
476
|
|
|
472
|
-
function doMatch
|
|
477
|
+
function doMatch(string, qs) {
|
|
473
478
|
var or = /^(?:,\s*|\s+or\s+)(.*)/i
|
|
474
479
|
var and = /^\s+and\s+(.*)/i
|
|
475
480
|
|
|
@@ -488,7 +493,7 @@ function doMatch (string, qs) {
|
|
|
488
493
|
})
|
|
489
494
|
}
|
|
490
495
|
|
|
491
|
-
function find
|
|
496
|
+
function find(string, predicate) {
|
|
492
497
|
for (var n = 1, max = string.length; n <= max; n++) {
|
|
493
498
|
var parsed = string.substr(-n, n)
|
|
494
499
|
if (predicate(parsed, n, max)) {
|
|
@@ -498,7 +503,7 @@ function find (string, predicate) {
|
|
|
498
503
|
return ''
|
|
499
504
|
}
|
|
500
505
|
|
|
501
|
-
function flatten
|
|
506
|
+
function flatten(array) {
|
|
502
507
|
if (!Array.isArray(array)) return [array]
|
|
503
508
|
return array.reduce(function (a, b) {
|
|
504
509
|
return a.concat(flatten(b))
|
|
@@ -506,20 +511,15 @@ function flatten (array) {
|
|
|
506
511
|
}
|
|
507
512
|
|
|
508
513
|
// Will be filled by Can I Use data below
|
|
509
|
-
browserslist.cache = {
|
|
510
|
-
browserslist.data = {
|
|
514
|
+
browserslist.cache = {}
|
|
515
|
+
browserslist.data = {}
|
|
511
516
|
browserslist.usage = {
|
|
512
|
-
global: {
|
|
517
|
+
global: {},
|
|
513
518
|
custom: null
|
|
514
519
|
}
|
|
515
520
|
|
|
516
521
|
// Default browsers query
|
|
517
|
-
browserslist.defaults = [
|
|
518
|
-
'> 0.5%',
|
|
519
|
-
'last 2 versions',
|
|
520
|
-
'Firefox ESR',
|
|
521
|
-
'not dead'
|
|
522
|
-
]
|
|
522
|
+
browserslist.defaults = ['> 0.5%', 'last 2 versions', 'Firefox ESR', 'not dead']
|
|
523
523
|
|
|
524
524
|
// Browser names aliases
|
|
525
525
|
browserslist.aliases = {
|
|
@@ -548,7 +548,7 @@ browserslist.desktopNames = {
|
|
|
548
548
|
}
|
|
549
549
|
|
|
550
550
|
// Aliases to work with joined versions like `ios_saf 7.0-7.1`
|
|
551
|
-
browserslist.versionAliases = {
|
|
551
|
+
browserslist.versionAliases = {}
|
|
552
552
|
|
|
553
553
|
browserslist.clearCaches = env.clearCaches
|
|
554
554
|
browserslist.parseConfig = env.parseConfig
|
|
@@ -597,7 +597,7 @@ browserslist.coverage = function (browsers, stats) {
|
|
|
597
597
|
if ('dataByBrowser' in stats) {
|
|
598
598
|
stats = stats.dataByBrowser
|
|
599
599
|
}
|
|
600
|
-
data = {
|
|
600
|
+
data = {}
|
|
601
601
|
for (var name in stats) {
|
|
602
602
|
for (var version in stats[name]) {
|
|
603
603
|
data[name + ' ' + version] = stats[name][version]
|
|
@@ -614,7 +614,7 @@ browserslist.coverage = function (browsers, stats) {
|
|
|
614
614
|
}, 0)
|
|
615
615
|
}
|
|
616
616
|
|
|
617
|
-
function nodeQuery
|
|
617
|
+
function nodeQuery(context, version) {
|
|
618
618
|
var nodeReleases = jsReleases.filter(function (i) {
|
|
619
619
|
return i.name === 'nodejs'
|
|
620
620
|
})
|
|
@@ -631,22 +631,20 @@ function nodeQuery (context, version) {
|
|
|
631
631
|
return ['node ' + matched[matched.length - 1].version]
|
|
632
632
|
}
|
|
633
633
|
|
|
634
|
-
function sinceQuery
|
|
634
|
+
function sinceQuery(context, year, month, date) {
|
|
635
635
|
year = parseInt(year)
|
|
636
636
|
month = parseInt(month || '01') - 1
|
|
637
637
|
date = parseInt(date || '01')
|
|
638
638
|
return filterByYear(Date.UTC(year, month, date, 0, 0, 0), context)
|
|
639
639
|
}
|
|
640
640
|
|
|
641
|
-
function coverQuery
|
|
641
|
+
function coverQuery(context, coverage, statMode) {
|
|
642
642
|
coverage = parseFloat(coverage)
|
|
643
643
|
var usage = browserslist.usage.global
|
|
644
644
|
if (statMode) {
|
|
645
645
|
if (statMode.match(/^my\s+stats$/)) {
|
|
646
646
|
if (!context.customUsage) {
|
|
647
|
-
throw new BrowserslistError(
|
|
648
|
-
'Custom usage statistics was not provided'
|
|
649
|
-
)
|
|
647
|
+
throw new BrowserslistError('Custom usage statistics was not provided')
|
|
650
648
|
}
|
|
651
649
|
usage = context.customUsage
|
|
652
650
|
} else {
|
|
@@ -986,7 +984,7 @@ var QUERIES = [
|
|
|
986
984
|
var data = checkName(name, context)
|
|
987
985
|
from = parseFloat(normalizeVersion(data, from) || from)
|
|
988
986
|
to = parseFloat(normalizeVersion(data, to) || to)
|
|
989
|
-
function filter
|
|
987
|
+
function filter(v) {
|
|
990
988
|
var parsed = parseFloat(v)
|
|
991
989
|
return parsed >= from && parsed <= to
|
|
992
990
|
}
|
|
@@ -1180,11 +1178,11 @@ var QUERIES = [
|
|
|
1180
1178
|
}
|
|
1181
1179
|
}
|
|
1182
1180
|
}
|
|
1183
|
-
]
|
|
1181
|
+
]
|
|
1184
1182
|
|
|
1185
1183
|
// Get and convert Can I Use data
|
|
1186
1184
|
|
|
1187
|
-
(function () {
|
|
1185
|
+
;(function () {
|
|
1188
1186
|
for (var name in agents) {
|
|
1189
1187
|
var browser = agents[name]
|
|
1190
1188
|
browserslist.data[name] = {
|
|
@@ -1195,7 +1193,7 @@ var QUERIES = [
|
|
|
1195
1193
|
}
|
|
1196
1194
|
fillUsage(browserslist.usage.global, name, browser.usage_global)
|
|
1197
1195
|
|
|
1198
|
-
browserslist.versionAliases[name] = {
|
|
1196
|
+
browserslist.versionAliases[name] = {}
|
|
1199
1197
|
for (var i = 0; i < browser.versions.length; i++) {
|
|
1200
1198
|
var full = browser.versions[i]
|
|
1201
1199
|
if (!full) continue
|
|
@@ -1210,6 +1208,6 @@ var QUERIES = [
|
|
|
1210
1208
|
}
|
|
1211
1209
|
|
|
1212
1210
|
browserslist.versionAliases.op_mob['59'] = '58'
|
|
1213
|
-
}()
|
|
1211
|
+
})()
|
|
1214
1212
|
|
|
1215
1213
|
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.17.
|
|
3
|
+
"version": "4.17.6",
|
|
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,8 +15,8 @@
|
|
|
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.30001274",
|
|
19
|
+
"electron-to-chromium": "^1.3.886",
|
|
20
20
|
"escalade": "^3.1.1",
|
|
21
21
|
"node-releases": "^2.0.1",
|
|
22
22
|
"picocolors": "^1.0.0"
|
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
|
|
@@ -203,7 +217,7 @@ function updatePnpmLockfile (lock, latest) {
|
|
|
203
217
|
return { content: lines.join('\n'), versions: versions }
|
|
204
218
|
}
|
|
205
219
|
|
|
206
|
-
function updateLockfile
|
|
220
|
+
function updateLockfile(lock, latest) {
|
|
207
221
|
if (!lock.content) lock.content = fs.readFileSync(lock.file).toString()
|
|
208
222
|
|
|
209
223
|
if (lock.mode === 'npm') {
|
|
@@ -214,7 +228,7 @@ function updateLockfile (lock, latest) {
|
|
|
214
228
|
return updatePnpmLockfile(lock, latest)
|
|
215
229
|
}
|
|
216
230
|
|
|
217
|
-
function updatePackageManually
|
|
231
|
+
function updatePackageManually(print, lock, latest) {
|
|
218
232
|
var lockfileData = updateLockfile(lock, latest)
|
|
219
233
|
var caniuseVersions = Object.keys(lockfileData.versions).sort()
|
|
220
234
|
if (caniuseVersions.length === 1 && caniuseVersions[0] === latest.version) {
|
|
@@ -272,7 +286,7 @@ function updatePackageManually (print, lock, latest) {
|
|
|
272
286
|
childProcess.execSync(del + ' caniuse-lite')
|
|
273
287
|
}
|
|
274
288
|
|
|
275
|
-
module.exports = function updateDB
|
|
289
|
+
module.exports = function updateDB(print) {
|
|
276
290
|
var lock = detectLockfile()
|
|
277
291
|
var latest = getLatestInfo(lock)
|
|
278
292
|
|