browserslist
1 #!/usr/bin/env node 2 3 var fs = require('fs') 4 5 var browserslist = require('./') 6 var updateDb = require('./update-db') 7 var pkg = require('./package.json') 8 9 var args = process.argv.slice(2) 10 11 var USAGE = 12 'Usage:\n' + 13 ' npx browserslist\n' + 14 ' npx browserslist "QUERIES"\n' + 15 ' npx browserslist --json "QUERIES"\n' + 16 ' npx browserslist --config="path/to/browserlist/file"\n' + 17 ' npx browserslist --coverage "QUERIES"\n' + 18 ' npx browserslist --coverage=US "QUERIES"\n' + 19 ' npx browserslist --coverage=US,RU,global "QUERIES"\n' + 20 ' npx browserslist --env="environment name defined in config"\n' + 21 ' npx browserslist --stats="path/to/browserlist/stats/file"\n' + 22 ' npx browserslist --mobile-to-desktop\n' + 23 ' npx browserslist --ignore-unknown-versions' + 24 ' npx browserslist --update-db' 25 26 function isArg(arg) { 27 return args.some(function (str) { 28 return str === arg || str.indexOf(arg + '=') === 0 29 }) 30 } 31 32 function error(msg) { 33 process.stderr.write('browserslist: ' + msg + '\n') 34 process.exit(1) 35 } 36 37 if (isArg('--help') || isArg('-h')) { 38 process.stdout.write(pkg.description + '.\n\n' + USAGE + '\n') 39 } else if (isArg('--version') || isArg('-v')) { 40 process.stdout.write('browserslist ' + pkg.version + '\n') 41 } else if (isArg('--update-db')) { 42 updateDb(function (str) { 43 process.stdout.write(str) 44 }) 45 } else { 46 var mode = 'browsers' 47 var opts = {} 48 var queries 49 var areas 50 51 for (var i = 0; i < args.length; i++) { 52 if (args[i][0] !== '-') { 53 queries = args[i].replace(/^["']|["']$/g, '') 54 continue 55 } 56 57 var arg = args[i].split('=') 58 var name = arg[0] 59 var value = arg[1] 60 61 if (value) value = value.replace(/^["']|["']$/g, '') 62 63 if (name === '--config' || name === '-b') { 64 opts.config = value 65 } else if (name === '--env' || name === '-e') { 66 opts.env = value 67 } else if (name === '--stats' || name === '-s') { 68 opts.stats = value 69 } else if (name === '--coverage' || name === '-c') { 70 if (mode !== 'json') mode = 'coverage' 71 if (value) { 72 areas = value.split(',') 73 } else { 74 areas = ['global'] 75 } 76 } else if (name === '--json') { 77 mode = 'json' 78 } else if (name === '--mobile-to-desktop') { 79 opts.mobileToDesktop = true 80 } else if (name === '--ignore-unknown-versions') { 81 opts.ignoreUnknownVersions = true 82 } else { 83 error('Unknown arguments ' + args[i] + '.\n\n' + USAGE) 84 } 85 } 86 87 var browsers 88 try { 89 browsers = browserslist(queries, opts) 90 } catch (e) { 91 if (e.name === 'BrowserslistError') { 92 error(e.message) 93 } else { 94 throw e 95 } 96 } 97 98 var coverage 99 if (mode === 'browsers') { 100 browsers.forEach(function (browser) { 101 process.stdout.write(browser + '\n') 102 }) 103 } else if (areas) { 104 coverage = areas.map(function (area) { 105 var stats 106 if (area !== 'global') { 107 stats = area 108 } else if (opts.stats) { 109 stats = JSON.parse(fs.readFileSync(opts.stats)) 110 } 111 var result = browserslist.coverage(browsers, stats) 112 var round = Math.round(result * 100) / 100.0 113 114 return [area, round] 115 }) 116 117 if (mode === 'coverage') { 118 var prefix = 'These browsers account for ' 119 process.stdout.write(prefix) 120 coverage.forEach(function (data, index) { 121 var area = data[0] 122 var round = data[1] 123 var end = 'globally' 124 if (area && area !== 'global') { 125 end = 'in the ' + area.toUpperCase() 126 } else if (opts.stats) { 127 end = 'in custom statistics' 128 } 129 130 if (index !== 0) { 131 process.stdout.write(prefix.replace(/./g, ' ')) 132 } 133 134 process.stdout.write(round + '% of all users ' + end + '\n') 135 }) 136 } 137 } 138 139 if (mode === 'json') { 140 var data = { browsers: browsers } 141 if (coverage) { 142 data.coverage = coverage.reduce(function (object, j) { 143 object[j[0]] = j[1] 144 return object 145 }, {}) 146 } 147 process.stdout.write(JSON.stringify(data, null, ' ') + '\n') 148 } 149 }