/
main.test.js
282 lines (230 loc) 路 7.52 KB
/
main.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
delete require.cache[require.resolve('..')]
let { equal, throws, is, type, not } = require('uvu/assert')
let { spyOn, restoreAll } = require('nanospy')
let { test } = require('uvu')
let path = require('path')
let browserslist = require('..')
let IE = path.join(__dirname, 'fixtures', 'explorers')
let FILE = path.join(__dirname, 'fixtures', 'dir', 'test.css')
let LINK = path.join(__dirname, 'fixtures', 'symlink')
let CONFIG = path.join(__dirname, 'fixtures', 'env-config', 'test.css')
let STRING = path.join(__dirname, 'fixtures', 'string', 'package.json')
let PACKAGE = path.join(__dirname, 'fixtures', 'env-package', 'package.json')
let DEFAULTS = browserslist(browserslist.defaults)
test.after.each(() => {
restoreAll()
process.env.NODE_ENV = 'test'
delete process.env.BROWSERSLIST
delete process.env.BROWSERSLIST_CONFIG
delete process.env.BROWSERSLIST_ENV
})
test('accepts array', () => {
equal(browserslist(['ie 11', 'ie 10']), ['ie 11', 'ie 10'])
})
test('accepts string', () => {
equal(browserslist('ie 11, ie 10'), ['ie 11', 'ie 10'])
})
test('trims queries', () => {
equal(browserslist(['ie 11 ', ' ie 10']), ['ie 11', 'ie 10'])
equal(browserslist('ie 11 , ie 10'), ['ie 11', 'ie 10'])
})
test('does not accept non-string and non-array parameters', () => {
throws(() => browserslist({}), /an array or string. Got object/)
})
test('returns unique array', () => {
equal(browserslist('ie 10, ie 10'), ['ie 10'])
})
test('returns empty result', () => {
equal(browserslist([]), [])
equal(browserslist(''), [])
})
test('uses environment variable on empty request', () => {
process.env.BROWSERSLIST = 'ie 10'
equal(browserslist(null, { path: FILE }), ['ie 10'])
})
test('reads config on no variable', () => {
equal(browserslist(null, { path: FILE }), ['ie 11', 'ie 10'])
})
test('reads config by direct path', () => {
equal(browserslist(null, { config: IE }), ['ie 9', 'ie 8'])
})
test('reads package.json config by direct path', () => {
equal(browserslist(null, { config: PACKAGE, env: 'development' }), [
'chrome 55',
'firefox 50'
])
})
test('reads package.json config with one string', () => {
equal(browserslist(null, { config: STRING }), ['ie 9', 'ie 8'])
})
test('reads config by direct path in environment variable', () => {
process.env.BROWSERSLIST_CONFIG = IE
equal(browserslist(null, { path: FILE }), ['ie 9', 'ie 8'])
})
test('handles undefined stats and path correctly', () => {
let config = { stats: undefined, path: undefined }
equal(browserslist([], config), [])
})
test('throw a error on wrong path to config', () => {
throws(() => browserslist(null, { config: IE + '2' }), /Can't read/)
})
if (!/^win/.test(process.platform)) {
test('reads config by symlink', () => {
equal(browserslist(null, { config: LINK }), ['ie 9', 'ie 8'])
})
}
test('has default selection', () => {
is(browserslist.defaults.length > 0, true)
})
test('uses default selection on empty request and no config', () => {
equal(browserslist(), DEFAULTS)
})
test('uses current dir on undefined path', () => {
let loadConfig = spyOn(browserslist, 'loadConfig')
equal(browserslist(undefined, { path: undefined }), DEFAULTS)
equal(loadConfig.calls, [[{ path: process.cwd() }]])
})
test('uses default selection on disabled path', () => {
let loadConfig = spyOn(browserslist, 'loadConfig')
equal(browserslist(null, { path: false }), DEFAULTS)
equal(loadConfig.calls, [[{ path: false }]])
})
test('raises on unknow query', () => {
throws(() => browserslist('good'), 'Unknown browser query `good`')
throws(() => browserslist('IE === 9'), 'Unknown browser query `IE === 9`')
})
test('raises on missed version', () => {
throws(() => browserslist('IE'), 'Specify versions in Browserslist query for browser IE')
})
test('sorts browsers', () => {
equal(
browserslist(['ff 10', 'ie 11', 'ie 6', 'ie 10', 'ff 9']),
[
'firefox 10',
'firefox 9',
'ie 11',
'ie 10',
'ie 6'
]
)
})
test('sorts browsers with version ranges', () => {
equal(
browserslist(['ios_saf 7', 'ie 11', 'ie 6', 'ios_saf 10']),
[
'ie 11',
'ie 6',
'ios_saf 10.0-10.2',
'ios_saf 7.0-7.1'
]
)
})
test('throws custom error', () => {
let error
try {
browserslist('wrong')
} catch (e) {
if (e instanceof Error) error = e
}
equal(error.name, 'BrowserslistError')
type(error.stack, 'string')
})
test('excludes queries', () => {
equal(
browserslist(['ie >= 9', 'not ie 11', 'not ie 10', 'ie 10']),
['ie 10', 'ie 9']
)
})
test('excludes queries for 0 version', () => {
let browsers = browserslist(['> 1% in US', 'not last 2 and_chr versions'])
let android = browsers.filter(i => i.indexOf('and_chr ') !== -1)
is(android.length, 0)
})
test('excludes queries for all version', () => {
let browsers = browserslist(['> 0% in US', 'not last 1 op_mini versions'])
let operaMini = browsers.filter(i => i.indexOf('op_mini ') !== -1)
is(operaMini.length, 0)
})
test('has actual browsers list in docs', () => {
let names = browserslist(['last 1 version']).map(i => i.split(' ')[0])
equal(
names,
[
'and_chr',
'and_ff',
'and_qq',
'and_uc',
'android',
'baidu',
'bb',
'chrome',
'edge',
'firefox',
'ie',
'ie_mob',
'ios_saf',
'kaios',
'op_mini',
'op_mob',
'opera',
'safari',
'samsung'
]
)
})
test('throws error on first exclude query', () => {
throws(
() => browserslist(['not ie 11']),
'Write any browsers query (for instance, `defaults`) ' +
'before `not ie 11`'
)
})
test('cleans 0 version', () => {
not.match(browserslist(['> 0%', '> 0% in FI']), 'and_chr 0')
})
test('uses env options to browserlist config', () => {
equal(
browserslist(null, { path: CONFIG, env: 'production' }),
['ie 9', 'opera 41']
)
equal(browserslist(null, { path: CONFIG, env: 'staging' }), ['ie 9', 'opera 41'])
equal(browserslist(null, { path: CONFIG, env: 'development' }), ['chrome 55', 'firefox 50'])
equal(browserslist(null, { path: CONFIG, env: 'test' }), ['ie 11', 'ie 10'])
})
test('uses env options to package.json', () => {
equal(browserslist(null, { path: PACKAGE, env: 'production' }), ['ie 9', 'opera 41'])
equal(browserslist(null, { path: PACKAGE, env: 'development' }), ['chrome 55', 'firefox 50'])
equal(browserslist(null, { path: PACKAGE, env: 'test' }), DEFAULTS)
})
test('uses NODE_ENV to get environment', () => {
process.env.NODE_ENV = 'test'
equal(browserslist(null, { path: CONFIG }), ['ie 11', 'ie 10'])
})
test('uses BROWSERSLIST_ENV to get environment', () => {
process.env.BROWSERSLIST_ENV = 'development'
equal(browserslist(null, { path: CONFIG }), ['chrome 55', 'firefox 50'])
})
test('uses production environment by default', () => {
delete process.env.NODE_ENV
equal(browserslist(null, { path: CONFIG }), ['ie 9', 'opera 41'])
})
test('correctly works with not and one-version browsers', () => {
equal(browserslist('last 1 Baidu version, not <2% in AT'), ['baidu 7.12'])
})
test('throws error on missing env', () => {
throws(
() => browserslist(null, { path: PACKAGE, throwOnMissing: true, env: 'test' }),
"Missing config for Browserslist environment 'test'."
)
})
test('does not throw error on missing defaults env', () => {
equal(
browserslist(null, { path: PACKAGE, throwOnMissing: true, env: 'defaults' }), DEFAULTS
)
})
test('does not throw error on missing env', () => {
equal(
browserslist(null, { path: PACKAGE, throwOnMissing: false, env: 'test' }), DEFAULTS
)
})
test.run()