1 | let browserslist = require('browserslist')
|
2 |
|
3 | function capitalize(str) {
|
4 | return str.slice(0, 1).toUpperCase() + str.slice(1)
|
5 | }
|
6 |
|
7 | const 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 |
|
22 | function 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 |
|
31 | module.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 | }
|