#!/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` ) }