forked from browserslist/browserslist
-
Notifications
You must be signed in to change notification settings - Fork 0
/
shareable-stats.test.js
142 lines (122 loc) 路 4.02 KB
/
shareable-stats.test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
let { test } = require('uvu')
let { equal, throws } = require('uvu/assert')
let { ensureDir, writeFile, remove } = require('fs-extra')
let { join } = require('path')
delete require.cache[require.resolve('..')]
let browserslist = require('..')
let STATS = join(__dirname, 'fixtures', 'browserslist-stats.json')
let CUSTOM_STATS = join(__dirname, 'fixtures', 'stats.json')
let mocked = []
async function mock(name, index, stats) {
let dir = join(__dirname, '..', 'node_modules', name)
mocked.push(dir)
await ensureDir(dir)
if (index) {
let content = 'module.exports = ' + JSON.stringify(index)
await writeFile(join(dir, 'index.js'), content)
}
if (stats) {
let statsContent = JSON.stringify(stats)
await writeFile(join(dir, 'browserslist-stats.json'), statsContent)
}
}
test.after.each(async () => {
await Promise.all(mocked.map(dir => remove(dir)))
mocked = []
delete process.env.BROWSERSLIST_STATS
})
test('takes stats from shareable config', async () => {
await mock('browserslist-config-test1', undefined, {
dataByBrowser: { chrome: { 55: 4, 56: 6 } }
})
equal(browserslist('> 5% in browserslist-config-test1 stats'), ['chrome 56'])
})
test('takes stats and queries from shareable config', async () => {
await mock(
'browserslist-config-test2',
['> 1% in browserslist-config-test2 stats'],
{ ie: { 8: 1, 11: 2 } }
)
equal(browserslist('extends browserslist-config-test2'), ['ie 11'])
})
test('ignores null usage value', async () => {
await mock(
'browserslist-config-null-test',
undefined,
{ chrome: { 90: 3, 999: null } }
)
equal(browserslist('< 5% in browserslist-config-null-test stats'), ['chrome 90'])
})
test('works with non-prefixed stats with dangerousExtend', async () => {
await mock('pkg', undefined, { chrome: { 78: 6 } })
equal(
browserslist(['> 5% in pkg stats'], { dangerousExtend: true }),
['chrome 78']
)
})
test('handles scoped stats with a dot in the name', async () => {
await mock('@example.com/browserslist-config', undefined, {
ie: { 8: 5, 11: 4 }
})
equal(
browserslist(['< 5% in @example.com/browserslist-config stats']),
['ie 11']
)
})
test('handles file in scoped stats', async () => {
await mock('@scope/browserslist-config/ie', undefined, {
ie: { 8: 2, 11: 5 }
})
equal(
browserslist(['>= 5% in @scope/browserslist-config/ie stats']),
['ie 11']
)
})
test('handles file-less scoped stats', async () => {
await mock('@scope/browserslist-config', undefined, { ie: { 8: 6, 11: 5 } })
equal(browserslist(['<= 5% in @scope/browserslist-config stats']), ['ie 11'])
})
test('handles scoped stats', async () => {
await mock('@scope/browserslist-config-test', undefined, {
ie: { 8: 2, 11: 6 }
})
equal(browserslist(['> 5% in @scope/browserslist-config-test stats']), ['ie 11'])
})
test('ignores passed stats', () => {
throws(
() => browserslist('> 5% in browserslist-config-test3 stats', { stats: STATS }),
/Cannot (find|resolve) module/
)
})
test('ignores environment variable stats', () => {
process.env.BROWSERSLIST_STATS = CUSTOM_STATS
throws(() => browserslist('> 5% in browserslist-config-test4 stats'), /Cannot (find|resolve) module/)
})
test('throws when stats does not have browserslist-config- prefix', () => {
throws(
() => { browserslist(['> 5% in thing-without-prefix stats'])},
/needs `browserslist-config-` prefix/
)
})
test('throws when stats has dot in path', () => {
throws(() => browserslist(['> 5% in browserslist-config-package/../something stats']), /`.` not allowed/)
})
test('throws when stats has node_modules in path', () => {
throws(
() => browserslist(['> 5% in browserslist-config-test/node_modules/a stats']),
/`node_modules` not allowed/
)
})
test('throw if stats undefined', async () => {
await mock(
'browserslist-config-undefined',
undefined,
// @ts-expect-error
{ dataByBrowser: 'not object' }
)
throws(() =>
browserslist(['> 5% in browserslist-config-undefined stats']),
/statistics was not provided/
)
})
test.run()