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  }