95 lines
2.4 KiB
JavaScript
95 lines
2.4 KiB
JavaScript
|
|
|||
|
var fs = require('fs');
|
|||
|
|
|||
|
// Collectable Mixin
|
|||
|
//
|
|||
|
// Provides utility methods to read from stdin and remaining arguments.
|
|||
|
var collectable = module.exports;
|
|||
|
|
|||
|
// XXX: tomdocify, generate in readme
|
|||
|
|
|||
|
collectable.stdin = function stdin(force, done) {
|
|||
|
if(!done) done = force, force = false;
|
|||
|
var argv = this.nopt.argv;
|
|||
|
var self = this;
|
|||
|
done = done || function(err) { err && self.emit('error', err); };
|
|||
|
|
|||
|
this._readFromStdin = true;
|
|||
|
|
|||
|
// not parsed, register done to be read when parse is called
|
|||
|
if(!argv) {
|
|||
|
this.once('stdin', done);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// only read from stdin when no reamining args and not forced
|
|||
|
if(!argv.remain.length || force) {
|
|||
|
this.readStdin(done);
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
// Read files from remaining args, concat the result and call back the `done`
|
|||
|
// function with the concatanated result and the list of files.
|
|||
|
collectable.files = function files(done) {
|
|||
|
var argv = this.nopt.argv;
|
|||
|
var self = this;
|
|||
|
done = done || function(err) { err && self.emit('error', err); };
|
|||
|
|
|||
|
// not parsed, register done to be read when parse is called
|
|||
|
if(!argv) {
|
|||
|
this.once('files', done);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// only read files when we actually have files to read from
|
|||
|
if(argv.remain.length) {
|
|||
|
this.readFiles(argv.remain, done);
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
collectable.readStdin = function readStdin(done) {
|
|||
|
var data = '';
|
|||
|
var self = this;
|
|||
|
process.stdin.setEncoding('utf8');
|
|||
|
process.stdin.on('error', done);
|
|||
|
process.stdin.on('data', function(chunk){
|
|||
|
data += chunk;
|
|||
|
self.emit('stdin:data', chunk);
|
|||
|
}).on('end', function(){
|
|||
|
self.emit('stdin', null, data);
|
|||
|
done(null, data);
|
|||
|
}).resume();
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
// Asynchronous walk of the remaining args, reading the content and returns
|
|||
|
// the concatanated result.
|
|||
|
collectable.readFiles = function readFiles(filepaths, done) {
|
|||
|
var data = '';
|
|||
|
var self = this;
|
|||
|
var files = filepaths.slice(0);
|
|||
|
(function read(file) {
|
|||
|
if(!file) {
|
|||
|
self.emit('files', null, data, filepaths);
|
|||
|
return done(null, data, filepaths);
|
|||
|
}
|
|||
|
fs.readFile(file, 'utf8', function(err, body) {
|
|||
|
if(err) return done(err);
|
|||
|
data += body;
|
|||
|
self.emit('files:data', body);
|
|||
|
read(files.shift());
|
|||
|
});
|
|||
|
})(files.shift());
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
// Collect data either from stdin or the list of remaining args
|
|||
|
collectable.collect = function collect(done) {
|
|||
|
return this.stdin(done).files(done);
|
|||
|
};
|
|||
|
|