lib/condenser/processors/node_modules/json5/lib/cli.js in condenser-0.0.4 vs lib/condenser/processors/node_modules/json5/lib/cli.js in condenser-0.0.5
- old
+ new
@@ -1,41 +1,112 @@
#!/usr/bin/env node
-// cli.js
-// JSON5 command-line interface.
-//
-// This is pretty minimal for now; just supports compiling files via `-c`.
-// TODO More useful functionality, like output path, watch, etc.?
+const fs = require('fs')
+const path = require('path')
+const minimist = require('minimist')
+const pkg = require('../package.json')
+const JSON5 = require('./')
-var FS = require('fs');
-var JSON5 = require('./json5');
-var Path = require('path');
+const argv = minimist(process.argv.slice(2), {
+ alias: {
+ 'convert': 'c',
+ 'space': 's',
+ 'validate': 'v',
+ 'out-file': 'o',
+ 'version': 'V',
+ 'help': 'h',
+ },
+ boolean: [
+ 'convert',
+ 'validate',
+ 'version',
+ 'help',
+ ],
+ string: [
+ 'space',
+ 'out-file',
+ ],
+})
-var USAGE = [
- 'Usage: json5 -c path/to/file.json5 ...',
- 'Compiles JSON5 files into sibling JSON files with the same basenames.',
-].join('\n');
+if (argv.version) {
+ version()
+} else if (argv.help) {
+ usage()
+} else {
+ const inFilename = argv._[0]
-// if valid, args look like [node, json5, -c, file1, file2, ...]
-var args = process.argv;
+ let readStream
+ if (inFilename) {
+ readStream = fs.createReadStream(inFilename)
+ } else {
+ readStream = process.stdin
+ }
-if (args.length < 4 || args[2] !== '-c') {
- console.error(USAGE);
- process.exit(1);
+ let json5 = ''
+ readStream.on('data', data => {
+ json5 += data
+ })
+
+ readStream.on('end', () => {
+ let space
+ if (argv.space === 't' || argv.space === 'tab') {
+ space = '\t'
+ } else {
+ space = Number(argv.space)
+ }
+
+ let value
+ try {
+ value = JSON5.parse(json5)
+ if (!argv.validate) {
+ const json = JSON.stringify(value, null, space)
+
+ let writeStream
+
+ // --convert is for backward compatibility with v0.5.1. If
+ // specified with <file> and not --out-file, then a file with
+ // the same name but with a .json extension will be written.
+ if (argv.convert && inFilename && !argv.o) {
+ const parsedFilename = path.parse(inFilename)
+ const outFilename = path.format(
+ Object.assign(
+ parsedFilename,
+ {base: path.basename(parsedFilename.base, parsedFilename.ext) + '.json'}
+ )
+ )
+
+ writeStream = fs.createWriteStream(outFilename)
+ } else if (argv.o) {
+ writeStream = fs.createWriteStream(argv.o)
+ } else {
+ writeStream = process.stdout
+ }
+
+ writeStream.write(json)
+ }
+ } catch (err) {
+ console.error(err.message)
+ process.exit(1)
+ }
+ })
}
-var cwd = process.cwd();
-var files = args.slice(3);
+function version () {
+ console.log(pkg.version)
+}
-// iterate over each file and convert JSON5 files to JSON:
-files.forEach(function (file) {
- var path = Path.resolve(cwd, file);
- var basename = Path.basename(path, '.json5');
- var dirname = Path.dirname(path);
+function usage () {
+ console.log(
+ `
+ Usage: json5 [options] <file>
- var json5 = FS.readFileSync(path, 'utf8');
- var obj = JSON5.parse(json5);
- var json = JSON.stringify(obj, null, 4); // 4 spaces; TODO configurable?
+ If <file> is not provided, then STDIN is used.
- path = Path.join(dirname, basename + '.json');
- FS.writeFileSync(path, json, 'utf8');
-});
+ Options:
+
+ -s, --space The number of spaces to indent or 't' for tabs
+ -o, --out-file [file] Output to the specified file, otherwise STDOUT
+ -v, --validate Validate JSON5 but do not output JSON
+ -V, --version Output the version number
+ -h, --help Output usage information`
+ )
+}