json5
  1  #!/usr/bin/env node
  2  
  3  const fs = require('fs')
  4  const path = require('path')
  5  const minimist = require('minimist')
  6  const pkg = require('../package.json')
  7  const JSON5 = require('./')
  8  
  9  const argv = minimist(process.argv.slice(2), {
 10      alias: {
 11          'convert': 'c',
 12          'space': 's',
 13          'validate': 'v',
 14          'out-file': 'o',
 15          'version': 'V',
 16          'help': 'h',
 17      },
 18      boolean: [
 19          'convert',
 20          'validate',
 21          'version',
 22          'help',
 23      ],
 24      string: [
 25          'space',
 26          'out-file',
 27      ],
 28  })
 29  
 30  if (argv.version) {
 31      version()
 32  } else if (argv.help) {
 33      usage()
 34  } else {
 35      const inFilename = argv._[0]
 36  
 37      let readStream
 38      if (inFilename) {
 39          readStream = fs.createReadStream(inFilename)
 40      } else {
 41          readStream = process.stdin
 42      }
 43  
 44      let json5 = ''
 45      readStream.on('data', data => {
 46          json5 += data
 47      })
 48  
 49      readStream.on('end', () => {
 50          let space
 51          if (argv.space === 't' || argv.space === 'tab') {
 52              space = '\t'
 53          } else {
 54              space = Number(argv.space)
 55          }
 56  
 57          let value
 58          try {
 59              value = JSON5.parse(json5)
 60              if (!argv.validate) {
 61                  const json = JSON.stringify(value, null, space)
 62  
 63                  let writeStream
 64  
 65                  // --convert is for backward compatibility with v0.5.1. If
 66                  // specified with <file> and not --out-file, then a file with
 67                  // the same name but with a .json extension will be written.
 68                  if (argv.convert && inFilename && !argv.o) {
 69                      const parsedFilename = path.parse(inFilename)
 70                      const outFilename = path.format(
 71                          Object.assign(
 72                              parsedFilename,
 73                              {base: path.basename(parsedFilename.base, parsedFilename.ext) + '.json'}
 74                          )
 75                      )
 76  
 77                      writeStream = fs.createWriteStream(outFilename)
 78                  } else if (argv.o) {
 79                      writeStream = fs.createWriteStream(argv.o)
 80                  } else {
 81                      writeStream = process.stdout
 82                  }
 83  
 84                  writeStream.write(json)
 85              }
 86          } catch (err) {
 87              console.error(err.message)
 88              process.exit(1)
 89          }
 90      })
 91  }
 92  
 93  function version () {
 94      console.log(pkg.version)
 95  }
 96  
 97  function usage () {
 98      console.log(
 99          `
100    Usage: json5 [options] <file>
101  
102    If <file> is not provided, then STDIN is used.
103  
104    Options:
105  
106      -s, --space              The number of spaces to indent or 't' for tabs
107      -o, --out-file [file]    Output to the specified file, otherwise STDOUT
108      -v, --validate           Validate JSON5 but do not output JSON
109      -V, --version            Output the version number
110      -h, --help               Output usage information`
111      )
112  }