l0bsterssg

node.js static responsive blog post generator
Log | Files | Refs | README

js-yaml.js (2727B)


      1 #!/usr/bin/env node
      2 
      3 
      4 'use strict';
      5 
      6 /*eslint-disable no-console*/
      7 
      8 
      9 // stdlib
     10 var fs    = require('fs');
     11 
     12 
     13 // 3rd-party
     14 var argparse = require('argparse');
     15 
     16 
     17 // internal
     18 var yaml = require('..');
     19 
     20 
     21 ////////////////////////////////////////////////////////////////////////////////
     22 
     23 
     24 var cli = new argparse.ArgumentParser({
     25   prog:     'js-yaml',
     26   version:  require('../package.json').version,
     27   addHelp:  true
     28 });
     29 
     30 
     31 cli.addArgument([ '-c', '--compact' ], {
     32   help:   'Display errors in compact mode',
     33   action: 'storeTrue'
     34 });
     35 
     36 
     37 // deprecated (not needed after we removed output colors)
     38 // option suppressed, but not completely removed for compatibility
     39 cli.addArgument([ '-j', '--to-json' ], {
     40   help:   argparse.Const.SUPPRESS,
     41   dest:   'json',
     42   action: 'storeTrue'
     43 });
     44 
     45 
     46 cli.addArgument([ '-t', '--trace' ], {
     47   help:   'Show stack trace on error',
     48   action: 'storeTrue'
     49 });
     50 
     51 cli.addArgument([ 'file' ], {
     52   help:   'File to read, utf-8 encoded without BOM',
     53   nargs:  '?',
     54   defaultValue: '-'
     55 });
     56 
     57 
     58 ////////////////////////////////////////////////////////////////////////////////
     59 
     60 
     61 var options = cli.parseArgs();
     62 
     63 
     64 ////////////////////////////////////////////////////////////////////////////////
     65 
     66 function readFile(filename, encoding, callback) {
     67   if (options.file === '-') {
     68     // read from stdin
     69 
     70     var chunks = [];
     71 
     72     process.stdin.on('data', function (chunk) {
     73       chunks.push(chunk);
     74     });
     75 
     76     process.stdin.on('end', function () {
     77       return callback(null, Buffer.concat(chunks).toString(encoding));
     78     });
     79   } else {
     80     fs.readFile(filename, encoding, callback);
     81   }
     82 }
     83 
     84 readFile(options.file, 'utf8', function (error, input) {
     85   var output, isYaml;
     86 
     87   if (error) {
     88     if (error.code === 'ENOENT') {
     89       console.error('File not found: ' + options.file);
     90       process.exit(2);
     91     }
     92 
     93     console.error(
     94       options.trace && error.stack ||
     95       error.message ||
     96       String(error));
     97 
     98     process.exit(1);
     99   }
    100 
    101   try {
    102     output = JSON.parse(input);
    103     isYaml = false;
    104   } catch (err) {
    105     if (err instanceof SyntaxError) {
    106       try {
    107         output = [];
    108         yaml.loadAll(input, function (doc) { output.push(doc); }, {});
    109         isYaml = true;
    110 
    111         if (output.length === 0) output = null;
    112         else if (output.length === 1) output = output[0];
    113 
    114       } catch (e) {
    115         if (options.trace && err.stack) console.error(e.stack);
    116         else console.error(e.toString(options.compact));
    117 
    118         process.exit(1);
    119       }
    120     } else {
    121       console.error(
    122         options.trace && err.stack ||
    123         err.message ||
    124         String(err));
    125 
    126       process.exit(1);
    127     }
    128   }
    129 
    130   if (isYaml) console.log(JSON.stringify(output, null, '  '));
    131   else console.log(yaml.dump(output));
    132 });