| #!/usr/bin/env node | |
|  | |
| 
 | |
| 'use strict'; | |
| 
 | |
| /*eslint-disable no-console*/ | |
| 
 | |
| 
 | |
| var fs       = require('fs'); | |
| var argparse = require('argparse'); | |
| var yaml     = require('..'); | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////// | |
|  | |
| 
 | |
| var cli = new argparse.ArgumentParser({ | |
|   prog:     'js-yaml', | |
|   add_help:  true | |
| }); | |
| 
 | |
| cli.add_argument('-v', '--version', { | |
|   action: 'version', | |
|   version: require('../package.json').version | |
| }); | |
| 
 | |
| cli.add_argument('-c', '--compact', { | |
|   help:   'Display errors in compact mode', | |
|   action: 'store_true' | |
| }); | |
| 
 | |
| // deprecated (not needed after we removed output colors) | |
| // option suppressed, but not completely removed for compatibility | |
| cli.add_argument('-j', '--to-json', { | |
|   help:   argparse.SUPPRESS, | |
|   dest:   'json', | |
|   action: 'store_true' | |
| }); | |
| 
 | |
| cli.add_argument('-t', '--trace', { | |
|   help:   'Show stack trace on error', | |
|   action: 'store_true' | |
| }); | |
| 
 | |
| cli.add_argument('file', { | |
|   help:   'File to read, utf-8 encoded without BOM', | |
|   nargs:  '?', | |
|   default: '-' | |
| }); | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////// | |
|  | |
| 
 | |
| var options = cli.parse_args(); | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////// | |
|  | |
| 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)); | |
| });
 |