--- /dev/null
+"use strict";
+
+/**
+ * Module exports.
+ */
+
+module.exports = exports;
+
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs');
+var path = require('path');
+var nopt = require('nopt');
+var log = require('npmlog');
+log.disableProgress();
+var napi = require('./util/napi.js');
+
+var EE = require('events').EventEmitter;
+var inherits = require('util').inherits;
+var commands = [
+ 'clean',
+ 'install',
+ 'reinstall',
+ 'build',
+ 'rebuild',
+ 'package',
+ 'testpackage',
+ 'publish',
+ 'unpublish',
+ 'info',
+ 'testbinary',
+ 'reveal',
+ 'configure'
+ ];
+var aliases = {};
+
+// differentiate node-pre-gyp's logs from npm's
+log.heading = 'node-pre-gyp';
+
+exports.find = require('./pre-binding').find;
+
+function Run() {
+ var self = this;
+
+ this.commands = {};
+
+ commands.forEach(function (command) {
+ self.commands[command] = function (argv, callback) {
+ log.verbose('command', command, argv);
+ return require('./' + command)(self, argv, callback);
+ };
+ });
+}
+inherits(Run, EE);
+exports.Run = Run;
+var proto = Run.prototype;
+
+/**
+ * Export the contents of the package.json.
+ */
+
+proto.package = require('../package.json');
+
+/**
+ * nopt configuration definitions
+ */
+
+proto.configDefs = {
+ help: Boolean, // everywhere
+ arch: String, // 'configure'
+ debug: Boolean, // 'build'
+ directory: String, // bin
+ proxy: String, // 'install'
+ loglevel: String, // everywhere
+};
+
+/**
+ * nopt shorthands
+ */
+
+proto.shorthands = {
+ release: '--no-debug',
+ C: '--directory',
+ debug: '--debug',
+ j: '--jobs',
+ silent: '--loglevel=silent',
+ silly: '--loglevel=silly',
+ verbose: '--loglevel=verbose',
+};
+
+/**
+ * expose the command aliases for the bin file to use.
+ */
+
+proto.aliases = aliases;
+
+/**
+ * Parses the given argv array and sets the 'opts',
+ * 'argv' and 'command' properties.
+ */
+
+proto.parseArgv = function parseOpts (argv) {
+ this.opts = nopt(this.configDefs, this.shorthands, argv);
+ this.argv = this.opts.argv.remain.slice();
+ var commands = this.todo = [];
+
+ // create a copy of the argv array with aliases mapped
+ argv = this.argv.map(function (arg) {
+ // is this an alias?
+ if (arg in this.aliases) {
+ arg = this.aliases[arg];
+ }
+ return arg;
+ }, this);
+
+ // process the mapped args into "command" objects ("name" and "args" props)
+ argv.slice().forEach(function (arg) {
+ if (arg in this.commands) {
+ var args = argv.splice(0, argv.indexOf(arg));
+ argv.shift();
+ if (commands.length > 0) {
+ commands[commands.length - 1].args = args;
+ }
+ commands.push({ name: arg, args: [] });
+ }
+ }, this);
+ if (commands.length > 0) {
+ commands[commands.length - 1].args = argv.splice(0);
+ }
+
+ // expand commands entries for multiple napi builds
+ var dir = this.opts.directory;
+ if (dir == null) dir = process.cwd();
+ var package_json = JSON.parse(fs.readFileSync(path.join(dir,'package.json')));
+
+ this.todo = napi.expand_commands (package_json, this.opts, commands);
+
+ // support for inheriting config env variables from npm
+ var npm_config_prefix = 'npm_config_';
+ Object.keys(process.env).forEach(function (name) {
+ if (name.indexOf(npm_config_prefix) !== 0) return;
+ var val = process.env[name];
+ if (name === npm_config_prefix + 'loglevel') {
+ log.level = val;
+ } else {
+ // add the user-defined options to the config
+ name = name.substring(npm_config_prefix.length);
+ // avoid npm argv clobber already present args
+ // which avoids problem of 'npm test' calling
+ // script that runs unique npm install commands
+ if (name === 'argv') {
+ if (this.opts.argv &&
+ this.opts.argv.remain &&
+ this.opts.argv.remain.length) {
+ // do nothing
+ } else {
+ this.opts[name] = val;
+ }
+ } else {
+ this.opts[name] = val;
+ }
+ }
+ }, this);
+
+ if (this.opts.loglevel) {
+ log.level = this.opts.loglevel;
+ }
+ log.resume();
+};
+
+/**
+ * Returns the usage instructions for node-pre-gyp.
+ */
+
+proto.usage = function usage () {
+ var str = [
+ '',
+ ' Usage: node-pre-gyp <command> [options]',
+ '',
+ ' where <command> is one of:',
+ commands.map(function (c) {
+ return ' - ' + c + ' - ' + require('./' + c).usage;
+ }).join('\n'),
+ '',
+ 'node-pre-gyp@' + this.version + ' ' + path.resolve(__dirname, '..'),
+ 'node@' + process.versions.node
+ ].join('\n');
+ return str;
+};
+
+/**
+ * Version number getter.
+ */
+
+Object.defineProperty(proto, 'version', {
+ get: function () {
+ return this.package.version;
+ },
+ enumerable: true
+});
+