You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
3.5 KiB
152 lines
3.5 KiB
#!/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` |
|
) |
|
}
|
|
|