npm-kludge-search
Version:
Kludgy fast npm searcher
111 lines (86 loc) • 2.25 kB
JavaScript
;
var getDb = require('./getDb'),
path = require('path'),
nopt = require('nopt'),
commands = {
"help": require('./help'),
"script": require('./script'),
"version": require('./version'),
"name": require('./name'),
"complete": require('./complete'),
"default": require('./search')
},
known = {
"db": path,
"name": String,
"version": Boolean,
"reporter": ["slow", "fast", "json", "write", "null"],
"complete": String,
"script": Boolean,
"help": Boolean
};
function getReporter(r, output) {
var opts = this,
makeReporter;
r = opts.reporter || r || 'write';
makeReporter = require('./reporters/' + r);
opts.rep = r;
opts.reporter = makeReporter(output);
return opts.reporter;
}
function defaultDb() {
/*jslint nomen:true */
return path.resolve(__dirname, "..", "npmdb.pft");
}
function getOptions(argv) {
var opts = nopt(known, {}, argv, 2);
// defaults
opts.db = opts.db || defaultDb();
opts.getReporter = getReporter;
return opts;
}
function getCommand(opts) {
var cmd;
Object.keys(opts).forEach(function (key) {
if (commands[key]) {
cmd = commands[key];
}
});
if (!cmd) {
cmd = commands.default;
}
return cmd;
}
function withDb(getDb, opts, cb, done) {
getDb(opts.db, function (err, db) {
if (err) {
return done(err);
}
cb(db, opts, done);
});
}
function runCommand(cmd, opts, done) {
if (!cmd.useDb) {
cmd(opts, done);
} else {
withDb(getDb, opts, cmd, done);
}
}
function main(args, done) {
// deal with EPIPE
process.stdout.on('error', done);
var opts = getOptions(args),
cmd = getCommand(opts);
opts.getReporter(cmd.reporter, process.stdout);
runCommand(cmd, opts, done);
}
module.exports = main;
// exported as completion API
main.complete = require('./completeApi');
main.defaultDb = defaultDb;
// exported for unit tests
main.getCommand = getCommand;
main.getOptions = getOptions;
main.getReporter = getReporter;
main.runCommand = runCommand;
main.withDb = withDb;