UNPKG

3.97 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,world "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 if (!queries && !opts.config) {
76 if (browserslist.findConfig(process.cwd())) {
77 opts.path = process.cwd()
78 } else {
79 error(
80 'Browserslist config was not found. ' +
81 'Define queries or config path.' +
82 '\n\n' + USAGE
83 )
84 }
85 }
86 browsers = browserslist(queries, opts)
87 } catch (e) {
88 if (e.name === 'BrowserslistError') {
89 error(e.message)
90 } else {
91 throw e
92 }
93 }
94
95 var coverage
96 if (mode === 'browsers') {
97 browsers.forEach(function (browser) {
98 process.stdout.write(browser + '\n')
99 })
100 } else if (areas) {
101 coverage = areas.map(function (area) {
102 var stats
103 if (area !== 'global') {
104 stats = area
105 } else if (opts.stats) {
106 stats = JSON.parse(fs.readFileSync(opts.stats))
107 }
108 var result = browserslist.coverage(browsers, stats)
109 var round = Math.round(result * 100) / 100.0
110
111 return [area, round]
112 })
113
114 if (mode === 'coverage') {
115 var prefix = 'These browsers account for '
116 process.stdout.write(prefix)
117 coverage.forEach(function (data, index) {
118 var area = data[0]
119 var round = data[1]
120 var end = 'globally'
121 if (area && area !== 'global') {
122 end = 'in the ' + area.toUpperCase()
123 } else if (opts.stats) {
124 end = 'in custom statistics'
125 }
126
127 if (index !== 0) {
128 process.stdout.write(prefix.replace(/./g, ' '))
129 }
130
131 process.stdout.write(round + '% of all users ' + end + '\n')
132 })
133 }
134 }
135
136 if (mode === 'json') {
137 var data = { browsers: browsers }
138 if (coverage) {
139 data.coverage = coverage.reduce(function (object, j) {
140 object[j[0]] = j[1]
141 return object
142 }, { })
143 }
144 process.stdout.write(JSON.stringify(data, null, ' ') + '\n')
145 }
146}