123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- /**
- * 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");
- }
|