| 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 | and_chr: 'Chrome for Android',
|
|---|
| 9 | and_ff: 'Firefox for Android',
|
|---|
| 10 | and_qq: 'QQ Browser',
|
|---|
| 11 | and_uc: 'UC for Android',
|
|---|
| 12 | baidu: 'Baidu Browser',
|
|---|
| 13 | ie: 'IE',
|
|---|
| 14 | ie_mob: 'IE Mobile',
|
|---|
| 15 | ios_saf: 'iOS Safari',
|
|---|
| 16 | kaios: 'KaiOS Browser',
|
|---|
| 17 | op_mini: 'Opera Mini',
|
|---|
| 18 | op_mob: 'Opera Mobile',
|
|---|
| 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 | }
|
|---|