UNPKG

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