| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 | #!/usr/bin/env node/** * yaml2json cli program */ var YAML = require('../lib/Yaml.js');var ArgumentParser = require('argparse').ArgumentParser;var cli = new ArgumentParser({    prog:           "yaml2json",     version:        require('../package.json').version,    addHelp:        true});cli.addArgument(    ['-p', '--pretty'],    {        help:   'Output pretty (indented) JSON.',        action: 'storeTrue'    });cli.addArgument(    ['-i', '--indentation'],    {        action: 'store',        type:   'int',         help:   'Number of space characters used to indent code (use with --pretty, default: 2).',    });cli.addArgument(    ['-s', '--save'],    {        help:   'Save output inside JSON file(s) with the same name.',        action: 'storeTrue'    });cli.addArgument(    ['-r', '--recursive'],    {        help:   'If the input is a directory, also find YAML files in sub-directories recursively.',        action: 'storeTrue'    });cli.addArgument(    ['-w', '--watch'],    {        help:   'Watch for changes.',        action: 'storeTrue'    });cli.addArgument(['input'], {    help:   'YAML file or directory containing YAML files or - to read YAML from stdin.'});try {    var options = cli.parseArgs();    var path = require('path');    var fs   = require('fs');    var glob = require('glob');        var rootPath = process.cwd();    var parsePath = function(input) {        if (input == '-') return '-';        var output;        if (!(input != null)) {            return rootPath;        }        output = path.normalize(input);        if (output.length === 0) {            return rootPath;        }        if (output.charAt(0) !== '/') {            output = path.normalize(rootPath + '/./' + output);        }        if (output.length > 1 && output.charAt(output.length - 1) === '/') {            return output.substr(0, output.length - 1);        }        return output;    };    // Find files    var findFiles = function(input) {        if (input != '-' && input != null) {            var isDirectory = fs.statSync(input).isDirectory();            var files = [];            if (!isDirectory) {                files.push(input);            }            else {                if (options.recursive) {                    files = files.concat(glob.sync(input+'/**/*.yml'));                    files = files.concat(glob.sync(input+'/**/*.yaml'));                }                else {                    files = files.concat(glob.sync(input+'/*.yml'));                    files = files.concat(glob.sync(input+'/*.yaml'));                }            }                    return files;        }        return null;    };    // Convert to JSON    var convertToJSON = function(input, pretty, save, spaces, str) {        var json;        if (spaces == null) spaces = 2;        if (str != null) {            if (pretty) {                json = JSON.stringify(YAML.parse(str), null, spaces);            }            else {                json = JSON.stringify(YAML.parse(str));            }        } else {            if (pretty) {                json = JSON.stringify(YAML.parseFile(input), null, spaces);            }            else {                json = JSON.stringify(YAML.parseFile(input));            }        }            if (!save || input == null) {            // Ouput result            process.stdout.write(json+"\n");        }        else {            var output;            if (input.substring(input.length-4) == '.yml') {                output = input.substr(0, input.length-4) + '.json';            }            else if (input.substring(input.length-5) == '.yaml') {                output = input.substr(0, input.length-5) + '.json';            }            else {                output = input + '.json';            }                    // Write file            var file = fs.openSync(output, 'w+');            fs.writeSync(file, json);            fs.closeSync(file);            process.stdout.write("saved "+output+"\n");        }    };    var input = parsePath(options.input);    var mtimes = [];    var runCommand = function() {        try {            var files = findFiles(input);            if (files != null) {                var len = files.length;                for (var i = 0; i < len; i++) {                    var file = files[i];                    var stat = fs.statSync(file);                    var time = stat.mtime.getTime();                    if (!stat.isDirectory()) {                        if (!mtimes[file] || mtimes[file] < time) {                            mtimes[file] = time;                            convertToJSON(file, options.pretty, options.save, options.indentation);                        }                    }                }            } else {                // Read from STDIN                var stdin = process.openStdin();                var data = "";                stdin.on('data', function(chunk) {                    data += chunk;                });                stdin.on('end', function() {                    convertToJSON(null, options.pretty, options.save, options.indentation, data);                });            }        } catch (e) {            process.stderr.write((e.message ? e.message : e)+"\n");        }    };    if (!options.watch) {        runCommand();    } else {        runCommand();        setInterval(runCommand, 1000);    } } catch (e) {    process.stderr.write((e.message ? e.message : e)+"\n");}
 |