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
			| 
											3 years ago
										 | #!/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`
 | ||
|  |     ) | ||
|  | } |