UNPKG

3.17 kBJavaScriptView Raw
1let browserslist = require('browserslist')
2
3function capitalize(str) {
4 return str.slice(0, 1).toUpperCase() + str.slice(1)
5}
6
7const NAMES = {
8 ie: 'IE',
9 ie_mob: 'IE Mobile',
10 ios_saf: 'iOS Safari',
11 op_mini: 'Opera Mini',
12 op_mob: 'Opera Mobile',
13 and_chr: 'Chrome for Android',
14 and_ff: 'Firefox for Android',
15 and_uc: 'UC for Android',
16 and_qq: 'QQ Browser',
17 kaios: 'KaiOS Browser',
18 baidu: 'Baidu Browser',
19 samsung: 'Samsung Internet'
20}
21
22function prefix(name, prefixes, note) {
23 let out = ` ${name}`
24 if (note) out += ' *'
25 out += ': '
26 out += prefixes.map(i => i.replace(/^-(.*)-$/g, '$1')).join(', ')
27 out += '\n'
28 return out
29}
30
31module.exports = function (prefixes) {
32 if (prefixes.browsers.selected.length === 0) {
33 return 'No browsers selected'
34 }
35
36 let versions = {}
37 for (let browser of prefixes.browsers.selected) {
38 let parts = browser.split(' ')
39 let name = parts[0]
40 let version = parts[1]
41
42 name = NAMES[name] || capitalize(name)
43 if (versions[name]) {
44 versions[name].push(version)
45 } else {
46 versions[name] = [version]
47 }
48 }
49
50 let out = 'Browsers:\n'
51 for (let browser in versions) {
52 let list = versions[browser]
53 list = list.sort((a, b) => parseFloat(b) - parseFloat(a))
54 out += ` ${browser}: ${list.join(', ')}\n`
55 }
56
57 let coverage = browserslist.coverage(prefixes.browsers.selected)
58 let round = Math.round(coverage * 100) / 100.0
59 out += `\nThese browsers account for ${round}% of all users globally\n`
60
61 let atrules = []
62 for (let name in prefixes.add) {
63 let data = prefixes.add[name]
64 if (name[0] === '@' && data.prefixes) {
65 atrules.push(prefix(name, data.prefixes))
66 }
67 }
68 if (atrules.length > 0) {
69 out += `\nAt-Rules:\n${atrules.sort().join('')}`
70 }
71
72 let selectors = []
73 for (let selector of prefixes.add.selectors) {
74 if (selector.prefixes) {
75 selectors.push(prefix(selector.name, selector.prefixes))
76 }
77 }
78 if (selectors.length > 0) {
79 out += `\nSelectors:\n${selectors.sort().join('')}`
80 }
81
82 let values = []
83 let props = []
84 let hadGrid = false
85 for (let name in prefixes.add) {
86 let data = prefixes.add[name]
87 if (name[0] !== '@' && data.prefixes) {
88 let grid = name.indexOf('grid-') === 0
89 if (grid) hadGrid = true
90 props.push(prefix(name, data.prefixes, grid))
91 }
92
93 if (!Array.isArray(data.values)) {
94 continue
95 }
96 for (let value of data.values) {
97 let grid = value.name.includes('grid')
98 if (grid) hadGrid = true
99 let string = prefix(value.name, value.prefixes, grid)
100 if (!values.includes(string)) {
101 values.push(string)
102 }
103 }
104 }
105
106 if (props.length > 0) {
107 out += `\nProperties:\n${props.sort().join('')}`
108 }
109 if (values.length > 0) {
110 out += `\nValues:\n${values.sort().join('')}`
111 }
112 if (hadGrid) {
113 out += '\n* - Prefixes will be added only on grid: true option.\n'
114 }
115
116 if (!atrules.length && !selectors.length && !props.length && !values.length) {
117 out +=
118 "\nAwesome! Your browsers don't require any vendor prefixes." +
119 '\nNow you can remove Autoprefixer from build steps.'
120 }
121
122 return out
123}