AK-21/Graphite-Industrial-Intelligence
0
1let browserslist = require('browserslist')2 3function capitalize(str) {4 return str.slice(0, 1).toUpperCase() + str.slice(1)5}6 7const 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 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 out29}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.059 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 = false85 for (let name in prefixes.add) {86 let data = prefixes.add[name]87 if (name[0] !== '@' && data.prefixes) {88 let grid = name.indexOf('grid-') === 089 if (grid) hadGrid = true90 props.push(prefix(name, data.prefixes, grid))91 }92 93 if (!Array.isArray(data.values)) {94 continue95 }96 for (let value of data.values) {97 let grid = value.name.includes('grid')98 if (grid) hadGrid = true99 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 out123}124 