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