| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502 | ;(function () {  // windows: running 'npm blah' in this folder will invoke WSH, not node.  /* globals WScript */  if (typeof WScript !== 'undefined') {    WScript.echo(      'npm does not work when run\n' +      'with the Windows Scripting Host\n\n' +      '"cd" to a different directory,\n' +      'or type "npm.cmd <args>",\n' +      'or type "node npm <args>".'    )    WScript.quit(1)    return  }  var unsupported = require('../lib/utils/unsupported.js')  unsupported.checkForBrokenNode()  var gfs = require('graceful-fs')  // Patch the global fs module here at the app level  var fs = gfs.gracefulify(require('fs'))  var EventEmitter = require('events').EventEmitter  var npm = module.exports = new EventEmitter()  var npmconf = require('./config/core.js')  var log = require('npmlog')  var inspect = require('util').inspect  // capture global logging  process.on('log', function (level) {    try {      return log[level].apply(log, [].slice.call(arguments, 1))    } catch (ex) {      log.verbose('attempt to log ' + inspect(arguments) + ' crashed: ' + ex.message)    }  })  var path = require('path')  var abbrev = require('abbrev')  var which = require('which')  var glob = require('glob')  var rimraf = require('rimraf')  var parseJSON = require('./utils/parse-json.js')  var aliases = require('./config/cmd-list').aliases  var cmdList = require('./config/cmd-list').cmdList  var plumbing = require('./config/cmd-list').plumbing  var output = require('./utils/output.js')  var startMetrics = require('./utils/metrics.js').start  var perf = require('./utils/perf.js')  perf.emit('time', 'npm')  perf.on('timing', function (name, finished) {    log.timing(name, 'Completed in', finished + 'ms')  })  npm.config = {    loaded: false,    get: function () {      throw new Error('npm.load() required')    },    set: function () {      throw new Error('npm.load() required')    }  }  npm.commands = {}  // TUNING  npm.limit = {    fetch: 10,    action: 50  }  // ***  npm.lockfileVersion = 1  npm.rollbacks = []  try {    // startup, ok to do this synchronously    var j = parseJSON(fs.readFileSync(      path.join(__dirname, '../package.json')) + '')    npm.name = j.name    npm.version = j.version  } catch (ex) {    try {      log.info('error reading version', ex)    } catch (er) {}    npm.version = ex  }  var commandCache = {}  var aliasNames = Object.keys(aliases)  var littleGuys = [ 'isntall', 'verison' ]  var fullList = cmdList.concat(aliasNames).filter(function (c) {    return plumbing.indexOf(c) === -1  })  var abbrevs = abbrev(fullList)  // we have our reasons  fullList = npm.fullList = fullList.filter(function (c) {    return littleGuys.indexOf(c) === -1  })  var registryRefer  Object.keys(abbrevs).concat(plumbing).forEach(function addCommand (c) {    Object.defineProperty(npm.commands, c, { get: function () {      if (!loaded) {        throw new Error(          'Call npm.load(config, cb) before using this command.\n' +            'See the README.md or bin/npm-cli.js for example usage.'        )      }      var a = npm.deref(c)      if (c === 'la' || c === 'll') {        npm.config.set('long', true)      }      npm.command = c      if (commandCache[a]) return commandCache[a]      var cmd = require(path.join(__dirname, a + '.js'))      commandCache[a] = function () {        var args = Array.prototype.slice.call(arguments, 0)        if (typeof args[args.length - 1] !== 'function') {          args.push(defaultCb)        }        if (args.length === 1) args.unshift([])        // Options are prefixed by a hyphen-minus (-, \u2d).        // Other dash-type chars look similar but are invalid.        Array(args[0]).forEach(function (arg) {          if (/^[\u2010-\u2015\u2212\uFE58\uFE63\uFF0D]/.test(arg)) {            log.error('arg', 'Argument starts with non-ascii dash, this is probably invalid:', arg)          }        })        if (!registryRefer) {          registryRefer = [a].concat(args[0]).map(function (arg) {            // exclude anything that might be a URL, path, or private module            // Those things will always have a slash in them somewhere            if (arg && arg.match && arg.match(/\/|\\/)) {              return '[REDACTED]'            } else {              return arg            }          }).filter(function (arg) {            return arg && arg.match          }).join(' ')          npm.referer = registryRefer        }        cmd.apply(npm, args)      }      Object.keys(cmd).forEach(function (k) {        commandCache[a][k] = cmd[k]      })      return commandCache[a]    },    enumerable: fullList.indexOf(c) !== -1,    configurable: true })    // make css-case commands callable via camelCase as well    if (c.match(/-([a-z])/)) {      addCommand(c.replace(/-([a-z])/g, function (a, b) {        return b.toUpperCase()      }))    }  })  function defaultCb (er, data) {    log.disableProgress()    if (er) console.error(er.stack || er.message)    else output(data)  }  npm.deref = function (c) {    if (!c) return ''    if (c.match(/[A-Z]/)) {      c = c.replace(/([A-Z])/g, function (m) {        return '-' + m.toLowerCase()      })    }    if (plumbing.indexOf(c) !== -1) return c    var a = abbrevs[c]    while (aliases[a]) {      a = aliases[a]    }    return a  }  var loaded = false  var loading = false  var loadErr = null  var loadListeners = []  function loadCb (er) {    loadListeners.forEach(function (cb) {      process.nextTick(cb.bind(npm, er, npm))    })    loadListeners.length = 0  }  npm.load = function (cli, cb_) {    if (!cb_ && typeof cli === 'function') {      cb_ = cli      cli = {}    }    if (!cb_) cb_ = function () {}    if (!cli) cli = {}    loadListeners.push(cb_)    if (loaded || loadErr) return cb(loadErr)    if (loading) return    loading = true    var onload = true    function cb (er) {      if (loadErr) return      loadErr = er      if (er) return cb_(er)      if (npm.config.get('force')) {        log.warn('using --force', 'I sure hope you know what you are doing.')      }      npm.config.loaded = true      loaded = true      loadCb(loadErr = er)      onload = onload && npm.config.get('onload-script')      if (onload) {        try {          require(onload)        } catch (err) {          log.warn('onload-script', 'failed to require onload script', onload)          log.warn('onload-script', err)        }        onload = false      }    }    log.pause()    load(npm, cli, cb)  }  function load (npm, cli, cb) {    which(process.argv[0], function (er, node) {      if (!er && node.toUpperCase() !== process.execPath.toUpperCase()) {        log.verbose('node symlink', node)        process.execPath = node        process.installPrefix = path.resolve(node, '..', '..')      }      // look up configs      var builtin = path.resolve(__dirname, '..', 'npmrc')      npmconf.load(cli, builtin, function (er, config) {        if (er === config) er = null        npm.config = config        if (er) return cb(er)        // if the 'project' config is not a filename, and we're        // not in global mode, then that means that it collided        // with either the default or effective userland config        if (!config.get('global') &&            config.sources.project &&            config.sources.project.type !== 'ini') {          log.verbose(            'config',            'Skipping project config: %s. (matches userconfig)',            config.localPrefix + '/.npmrc'          )        }        // Include npm-version and node-version in user-agent        var ua = config.get('user-agent') || ''        ua = ua.replace(/\{node-version\}/gi, process.version)        ua = ua.replace(/\{npm-version\}/gi, npm.version)        ua = ua.replace(/\{platform\}/gi, process.platform)        ua = ua.replace(/\{arch\}/gi, process.arch)        // continuous integration platforms        const ciName = process.env.GERRIT_PROJECT ? 'gerrit'          : process.env.GITLAB_CI ? 'gitlab'            : process.env.APPVEYOR ? 'appveyor'              : process.env.CIRCLECI ? 'circle-ci'                : process.env.SEMAPHORE ? 'semaphore'                  : process.env.DRONE ? 'drone'                    : process.env.GITHUB_ACTION ? 'github-actions'                      : process.env.TDDIUM ? 'tddium'                        : process.env.JENKINS_URL ? 'jenkins'                          : process.env['bamboo.buildKey'] ? 'bamboo'                            : process.env.GO_PIPELINE_NAME ? 'gocd'                            // codeship and a few others                              : process.env.CI_NAME ? process.env.CI_NAME                              // test travis after the others, since several CI systems mimic it                                : process.env.TRAVIS ? 'travis-ci'                                // aws CodeBuild/CodePipeline                                  : process.env.CODEBUILD_SRC_DIR ? 'aws-codebuild'                                    : process.env.CI === 'true' || process.env.CI === '1' ? 'custom'                                    // Google Cloud Build - it sets almost nothing                                      : process.env.BUILDER_OUTPUT ? 'builder'                                        : false        const ci = ciName ? `ci/${ciName}` : ''        ua = ua.replace(/\{ci\}/gi, ci)        config.set('user-agent', ua.trim())        if (config.get('metrics-registry') == null) {          config.set('metrics-registry', config.get('registry'))        }        var color = config.get('color')        if (npm.config.get('timing') && npm.config.get('loglevel') === 'notice') {          log.level = 'timing'        } else {          log.level = config.get('loglevel')        }        log.heading = config.get('heading') || 'npm'        log.stream = config.get('logstream')        switch (color) {          case 'always':            npm.color = true            break          case false:            npm.color = false            break          default:            npm.color = process.stdout.isTTY && process.env['TERM'] !== 'dumb'            break        }        if (npm.color) {          log.enableColor()        } else {          log.disableColor()        }        if (config.get('unicode')) {          log.enableUnicode()        } else {          log.disableUnicode()        }        if (config.get('progress') && process.stderr.isTTY && process.env['TERM'] !== 'dumb') {          log.enableProgress()        } else {          log.disableProgress()        }        glob(path.resolve(npm.cache, '_logs', '*-debug.log'), function (er, files) {          if (er) return cb(er)          while (files.length >= npm.config.get('logs-max')) {            rimraf.sync(files[0])            files.splice(0, 1)          }        })        log.resume()        var umask = npm.config.get('umask')        npm.modes = {          exec: parseInt('0777', 8) & (~umask),          file: parseInt('0666', 8) & (~umask),          umask: umask        }        var gp = Object.getOwnPropertyDescriptor(config, 'globalPrefix')        Object.defineProperty(npm, 'globalPrefix', gp)        var lp = Object.getOwnPropertyDescriptor(config, 'localPrefix')        Object.defineProperty(npm, 'localPrefix', lp)        config.set('scope', scopeifyScope(config.get('scope')))        npm.projectScope = config.get('scope') ||         scopeifyScope(getProjectScope(npm.prefix))        startMetrics()        return cb(null, npm)      })    })  }  Object.defineProperty(npm, 'prefix',    {      get: function () {        return npm.config.get('global') ? npm.globalPrefix : npm.localPrefix      },      set: function (r) {        var k = npm.config.get('global') ? 'globalPrefix' : 'localPrefix'        npm[k] = r        return r      },      enumerable: true    })  Object.defineProperty(npm, 'bin',    {      get: function () {        if (npm.config.get('global')) return npm.globalBin        return path.resolve(npm.root, '.bin')      },      enumerable: true    })  Object.defineProperty(npm, 'globalBin',    {      get: function () {        var b = npm.globalPrefix        if (process.platform !== 'win32') b = path.resolve(b, 'bin')        return b      }    })  Object.defineProperty(npm, 'dir',    {      get: function () {        if (npm.config.get('global')) return npm.globalDir        return path.resolve(npm.prefix, 'node_modules')      },      enumerable: true    })  Object.defineProperty(npm, 'globalDir',    {      get: function () {        return (process.platform !== 'win32')          ? path.resolve(npm.globalPrefix, 'lib', 'node_modules')          : path.resolve(npm.globalPrefix, 'node_modules')      },      enumerable: true    })  Object.defineProperty(npm, 'root',    { get: function () { return npm.dir } })  Object.defineProperty(npm, 'cache',    { get: function () { return npm.config.get('cache') },      set: function (r) { return npm.config.set('cache', r) },      enumerable: true    })  var tmpFolder  var rand = require('crypto').randomBytes(4).toString('hex')  Object.defineProperty(npm, 'tmp',    {      get: function () {        if (!tmpFolder) tmpFolder = 'npm-' + process.pid + '-' + rand        return path.resolve(npm.config.get('tmp'), tmpFolder)      },      enumerable: true    })  // the better to repl you with  Object.getOwnPropertyNames(npm.commands).forEach(function (n) {    if (npm.hasOwnProperty(n) || n === 'config') return    Object.defineProperty(npm, n, { get: function () {      return function () {        var args = Array.prototype.slice.call(arguments, 0)        var cb = defaultCb        if (args.length === 1 && Array.isArray(args[0])) {          args = args[0]        }        if (typeof args[args.length - 1] === 'function') {          cb = args.pop()        }        npm.commands[n](args, cb)      }    },    enumerable: false,    configurable: true })  })  if (require.main === module) {    require('../bin/npm-cli.js')  }  function scopeifyScope (scope) {    return (!scope || scope[0] === '@') ? scope : ('@' + scope)  }  function getProjectScope (prefix) {    try {      var pkg = JSON.parse(fs.readFileSync(path.join(prefix, 'package.json')))      if (typeof pkg.name !== 'string') return ''      var sep = pkg.name.indexOf('/')      if (sep === -1) return ''      return pkg.name.slice(0, sep)    } catch (ex) {      return ''    }  }})()
 |