cli.js 2.76 KB
#!/usr/bin/env node

var browserslist = require('./');
var pkg          = require('./package.json');
var args         = process.argv.slice(2);

function isArg(arg) {
    return args.some(function (str) {
        return str === arg || str.indexOf(arg + '=') === 0;
    });
}

function getArgValue(arg) {
    var found = args.filter(function (str) {
        return str.indexOf(arg + '=') === 0;
    })[0];
    var value = found && found.split('=')[1];
    return value && value.replace(/^['"]|['"]$/g, '');
}

function error(msg) {
    process.stderr.write(pkg.name + ': ' + msg + '\n');
    process.exit(1);
}

function query(queries, opts) {
    try {
        return browserslist(queries, opts);
    } catch (e) {
        if ( e.name === 'BrowserslistError' ) {
            return error(e.message);
        } else {
            throw e;
        }
    }
}

if ( args.length === 0 || isArg('--help') || isArg('-h') ) {
    process.stdout.write([
        pkg.description,
        '',
        'Usage:',
        '  ' + pkg.name + ' "QUERIES"',
        '  ' + pkg.name + ' --coverage "QUERIES"',
        '  ' + pkg.name + ' --coverage=US "QUERIES"',
        '  ' + pkg.name + ' --config=browserslist "path/to/browserlist/file"',
        '  ' + pkg.name + ' --env="environment name defined in config"',
        '  ' + pkg.name + ' --stats="path/to/browserlist/stats/file"'
    ].join('\n') + '\n');

} else if ( isArg('--version') || isArg('-v') ) {
    process.stdout.write(pkg.name + ' ' + pkg.version + '\n');

} else if ( isArg('--coverage') || isArg('-c') ) {
    var browsers = args.find(function (i) {
        return i[0] !== '-';
    });
    if ( !browsers ) error('Define a browsers query to get coverage');

    var country = getArgValue('--coverage') || getArgValue('-c');
    var result  = browserslist.coverage(query(browsers), country);
    var round   = Math.round(result * 100) / 100.0;

    var end = 'globally';
    if (country && country !== 'global') {
        end = 'in the ' + country.toUpperCase();
    }

    process.stdout.write(
        'These browsers account for ' + round + '% of all users ' + end + '\n');

} else if ( args.length === 1 && args[0][0] !== '-' ) {
    query(args[0]).forEach(function (browser) {
        process.stdout.write(browser + '\n');
    });

} else if (isArg('--config') || isArg('-b')) {
    var opts = {
        config: getArgValue('--config') || getArgValue('-b')
    };

    if (isArg('--env') || isArg('-e')) {
        opts.env = getArgValue('--env') || getArgValue('-e');
    }

    if (isArg('--stats') || isArg('-s')) {
        opts.stats = getArgValue('--stats') || getArgValue('-s');
    }

    query(null, opts).forEach(function (browser) {
        process.stdout.write(browser + '\n');
    });
} else {
    error('Unknown arguments. Use --help to pick right one.');
}