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`
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								}
							 |