| #!/usr/bin/env node |
| |
| const fs = require('fs') |
| const path = require('path') |
| const pkg = require('../package.json') |
| const JSON5 = require('./') |
| |
| const argv = parseArgs() |
| |
| if (argv.version) { |
| version() |
| } else if (argv.help) { |
| usage() |
| } else { |
| const inFilename = argv.defaults[0] |
| |
| let readStream |
| if (inFilename) { |
| readStream = fs.createReadStream(inFilename) |
| } else { |
| readStream = process.stdin |
| } |
| |
| 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.outFile) { |
| 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.outFile) { |
| writeStream = fs.createWriteStream(argv.outFile) |
| } else { |
| writeStream = process.stdout |
| } |
| |
| writeStream.write(json) |
| } |
| } catch (err) { |
| console.error(err.message) |
| process.exit(1) |
| } |
| }) |
| } |
| |
| function parseArgs () { |
| let convert |
| let space |
| let validate |
| let outFile |
| let version |
| let help |
| const defaults = [] |
| |
| const args = process.argv.slice(2) |
| for (let i = 0; i < args.length; i++) { |
| const arg = args[i] |
| switch (arg) { |
| case '--convert': |
| case '-c': |
| convert = true |
| break |
| |
| case '--space': |
| case '-s': |
| space = args[++i] |
| break |
| |
| case '--validate': |
| case '-v': |
| validate = true |
| break |
| |
| case '--out-file': |
| case '-o': |
| outFile = args[++i] |
| break |
| |
| case '--version': |
| case '-V': |
| version = true |
| break |
| |
| case '--help': |
| case '-h': |
| help = true |
| break |
| |
| default: |
| defaults.push(arg) |
| break |
| } |
| } |
| |
| return { |
| convert, |
| space, |
| validate, |
| outFile, |
| version, |
| help, |
| defaults, |
| } |
| } |
| |
| function version () { |
| console.log(pkg.version) |
| } |
| |
| function usage () { |
| console.log( |
| ` |
| Usage: json5 [options] <file> |
| |
| If <file> is not provided, then STDIN is used. |
| |
| 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` |
| ) |
| } |