123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- /**
- * yaml2json cli program
- */
-
- var YAML = require('../lib/Yaml.js');
- var ArgumentParser = require('argparse').ArgumentParser;
- var cli = new ArgumentParser({
- prog: "json2yaml",
- version: require('../package.json').version,
- addHelp: true
- });
- cli.addArgument(
- ['-d', '--depth'],
- {
- action: 'store',
- type: 'int',
- help: 'Set minimum level of depth before generating inline YAML (default: 2).'
- }
- );
- cli.addArgument(
- ['-i', '--indentation'],
- {
- action: 'store',
- type: 'int',
- help: 'Number of space characters used to indent code (default: 2).',
- }
- );
- cli.addArgument(
- ['-s', '--save'],
- {
- help: 'Save output inside YML file(s) with the same name.',
- action: 'storeTrue'
- }
- );
- cli.addArgument(
- ['-r', '--recursive'],
- {
- help: 'If the input is a directory, also find JSON files in sub-directories recursively.',
- action: 'storeTrue'
- }
- );
- cli.addArgument(
- ['-w', '--watch'],
- {
- help: 'Watch for changes.',
- action: 'storeTrue'
- }
- );
- cli.addArgument(['input'], {
- help: 'JSON file or directory containing JSON files or - to read JSON 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+'/**/*.json'));
- }
- else {
- files = files.concat(glob.sync(input+'/*.json'));
- }
- }
-
- return files;
- }
- return null;
- };
- // Convert to JSON
- var convertToYAML = function(input, inline, save, spaces, str) {
- var yaml;
- if (inline == null) inline = 2;
- if (spaces == null) spaces = 2;
-
- if (str == null) {
- str = ''+fs.readFileSync(input);
- }
- yaml = YAML.dump(JSON.parse(str), inline, spaces);
-
- if (!save || input == null) {
- // Ouput result
- process.stdout.write(yaml);
- }
- else {
- var output;
- if (input.substring(input.length-5) == '.json') {
- output = input.substr(0, input.length-5) + '.yaml';
- }
- else {
- output = input + '.yaml';
- }
-
- // Write file
- var file = fs.openSync(output, 'w+');
- fs.writeSync(file, yaml);
- 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;
- convertToYAML(file, options.depth, 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() {
- convertToYAML(null, options.depth, 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");
- }
|