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.
132 lines
2.7 KiB
132 lines
2.7 KiB
#!/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)); |
|
});
|
|
|