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