"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 [options]', '', ' where 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 });