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.
		
		
		
		
		
			
		
			
				
					
					
						
							153 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							153 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`
 | |
|     )
 | |
| }
 |