| "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 |
| }); |
| |