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