| #!/usr/bin/env node |
| |
| |
| 'use strict'; |
| |
| /*eslint-disable no-console*/ |
| |
| |
| // stdlib |
| var fs = require('fs'); |
| |
| |
| // 3rd-party |
| var argparse = require('argparse'); |
| |
| |
| // internal |
| var yaml = require('..'); |
| |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| |
| var cli = new argparse.ArgumentParser({ |
| prog: 'js-yaml', |
| version: require('../package.json').version, |
| addHelp: true |
| }); |
| |
| |
| cli.addArgument([ '-c', '--compact' ], { |
| help: 'Display errors in compact mode', |
| action: 'storeTrue' |
| }); |
| |
| |
| // deprecated (not needed after we removed output colors) |
| // option suppressed, but not completely removed for compatibility |
| cli.addArgument([ '-j', '--to-json' ], { |
| help: argparse.Const.SUPPRESS, |
| dest: 'json', |
| action: 'storeTrue' |
| }); |
| |
| |
| cli.addArgument([ '-t', '--trace' ], { |
| help: 'Show stack trace on error', |
| action: 'storeTrue' |
| }); |
| |
| cli.addArgument([ 'file' ], { |
| help: 'File to read, utf-8 encoded without BOM', |
| nargs: '?', |
| defaultValue: '-' |
| }); |
| |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| |
| var options = cli.parseArgs(); |
| |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| |
| function readFile(filename, encoding, callback) { |
| if (options.file === '-') { |
| // read from stdin |
| |
| var chunks = []; |
| |
| process.stdin.on('data', function (chunk) { |
| chunks.push(chunk); |
| }); |
| |
| process.stdin.on('end', function () { |
| return callback(null, Buffer.concat(chunks).toString(encoding)); |
| }); |
| } else { |
| fs.readFile(filename, encoding, callback); |
| } |
| } |
| |
| readFile(options.file, 'utf8', function (error, input) { |
| var output, isYaml; |
| |
| if (error) { |
| if (error.code === 'ENOENT') { |
| console.error('File not found: ' + options.file); |
| process.exit(2); |
| } |
| |
| console.error( |
| options.trace && error.stack || |
| error.message || |
| String(error)); |
| |
| process.exit(1); |
| } |
| |
| try { |
| output = JSON.parse(input); |
| isYaml = false; |
| } catch (err) { |
| if (err instanceof SyntaxError) { |
| try { |
| output = []; |
| yaml.loadAll(input, function (doc) { output.push(doc); }, {}); |
| isYaml = true; |
| |
| if (output.length === 0) output = null; |
| else if (output.length === 1) output = output[0]; |
| |
| } catch (e) { |
| if (options.trace && err.stack) console.error(e.stack); |
| else console.error(e.toString(options.compact)); |
| |
| process.exit(1); |
| } |
| } else { |
| console.error( |
| options.trace && err.stack || |
| err.message || |
| String(err)); |
| |
| process.exit(1); |
| } |
| } |
| |
| if (isYaml) console.log(JSON.stringify(output, null, ' ')); |
| else console.log(yaml.dump(output)); |
| }); |