UNPKG

4.29 kBPlain TextView Raw
1#!/usr/bin/env node
2
3/**
4 * yaml2json cli program
5 */
6
7var YAML = require('./yaml.js');
8
9var ArgumentParser = require('argparse').ArgumentParser;
10var cli = new ArgumentParser({
11 prog: "json2yaml",
12 version: require('../package.json').version,
13 addHelp: true
14});
15
16cli.addArgument(
17 ['-d', '--depth'],
18 {
19 action: 'store',
20 type: 'int',
21 help: 'Set minimum level of depth before generating inline YAML (default: 2).'
22 }
23);
24
25cli.addArgument(
26 ['-i', '--indentation'],
27 {
28 action: 'store',
29 type: 'int',
30 help: 'Number of space characters used to indent code (default: 2).',
31 }
32);
33
34cli.addArgument(
35 ['-s', '--save'],
36 {
37 help: 'Save output inside YML file(s) with the same name.',
38 action: 'storeTrue'
39 }
40);
41
42cli.addArgument(
43 ['-r', '--recursive'],
44 {
45 help: 'If the input is a directory, also find JSON files in sub-directories recursively.',
46 action: 'storeTrue'
47 }
48);
49
50cli.addArgument(
51 ['-w', '--watch'],
52 {
53 help: 'Watch for changes.',
54 action: 'storeTrue'
55 }
56);
57
58cli.addArgument(['input'], {
59 help: 'JSON file or directory containing JSON files.'
60});
61
62try {
63 var options = cli.parseArgs();
64 var path = require('path');
65 var fs = require('fs');
66 var glob = require('glob');
67
68 var rootPath = process.cwd();
69 var parsePath = function(input) {
70 var output;
71 if (!(input != null)) {
72 return rootPath;
73 }
74 output = path.normalize(input);
75 if (output.length === 0) {
76 return rootPath;
77 }
78 if (output.charAt(0) !== '/') {
79 output = path.normalize(rootPath + '/./' + output);
80 }
81 if (output.length > 1 && output.charAt(output.length - 1) === '/') {
82 return output.substr(0, output.length - 1);
83 }
84 return output;
85 };
86
87 // Find files
88 var findFiles = function(input) {
89 var isDirectory = fs.statSync(input).isDirectory();
90 var files = [];
91
92 if (!isDirectory) {
93 files.push(input);
94 }
95 else {
96 if (options.recursive) {
97 files = files.concat(glob.sync(input+'/**/*.json'));
98 }
99 else {
100 files = files.concat(glob.sync(input+'/*.json'));
101 }
102 }
103
104 return files;
105 };
106
107 // Convert to JSON
108 var convertToYAML = function(input, inline, save, spaces) {
109 var yaml;
110 if (inline == null) inline = 2;
111 if (spaces == null) spaces = 2;
112
113 yaml = YAML.stringify(JSON.parse(fs.readFileSync(input)), inline, spaces);
114
115 if (!save) {
116 // Ouput result
117 process.stdout.write(yaml);
118 }
119 else {
120 var output;
121 if (input.substring(input.length-5) == '.json') {
122 output = input.substr(0, input.length-5) + '.yaml';
123 }
124 else {
125 output = input + '.yaml';
126 }
127
128 // Write file
129 var file = fs.openSync(output, 'w+');
130 fs.writeSync(file, yaml);
131 fs.closeSync(file);
132 process.stdout.write("saved "+output+"\n");
133 }
134 };
135
136 var input = parsePath(options.input);
137 var mtimes = [];
138
139 var runCommand = function() {
140 try {
141 var files = findFiles(input);
142 var len = files.length;
143
144 for (var i = 0; i < len; i++) {
145 var file = files[i];
146 var stat = fs.statSync(file);
147 var time = stat.mtime.getTime();
148 if (!stat.isDirectory()) {
149 if (!mtimes[file] || mtimes[file] < time) {
150 mtimes[file] = time;
151 convertToYAML(file, options.depth, options.save, options.indentation);
152 }
153 }
154 }
155 } catch (e) {
156 process.stderr.write((e.message ? e.message : e)+"\n");
157 }
158 };
159
160 if (!options.watch) {
161 runCommand();
162 } else {
163 runCommand();
164 setInterval(runCommand, 1000);
165 }
166} catch (e) {
167 process.stderr.write((e.message ? e.message : e)+"\n");
168}