#!/usr/bin/env node const fs = require('fs') const path = require('path') const minimist = require('minimist') const pkg = require('../package.json') const JSON5 = require('./') 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', ], }) if (argv.version) { version() } else if (argv.help) { usage() } else { const inFilename = argv._[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.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) } }) } 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` ) }