diff options
author | Florian Dold <florian.dold@gmail.com> | 2019-04-03 15:43:32 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2019-04-03 15:45:57 +0200 |
commit | 71e285b94c7edaa43aa8115965cf5a36b8e0f80a (patch) | |
tree | 7d4aa9d0d5aff686b106cd5da72ba77960c4af43 /deps/node/deps/npm/lib/utils | |
parent | 7dadf9356b4f3f4137ce982ea5bb960283116e9a (diff) | |
download | akono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.tar.gz akono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.tar.bz2 akono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.zip |
Node.js v11.13.0
Diffstat (limited to 'deps/node/deps/npm/lib/utils')
48 files changed, 1968 insertions, 0 deletions
diff --git a/deps/node/deps/npm/lib/utils/ansi-trim.js b/deps/node/deps/npm/lib/utils/ansi-trim.js new file mode 100644 index 00000000..7f9a6c30 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/ansi-trim.js @@ -0,0 +1,7 @@ +function ansiTrim (str) { + var r = new RegExp('\x1b(?:\\[(?:\\d+[ABCDEFGJKSTm]|\\d+;\\d+[Hfm]|' + + '\\d+;\\d+;\\d+m|6n|s|u|\\?25[lh])|\\w)', 'g') + return str.replace(r, '') +} + +module.exports = ansiTrim diff --git a/deps/node/deps/npm/lib/utils/child-path.js b/deps/node/deps/npm/lib/utils/child-path.js new file mode 100644 index 00000000..4594f432 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/child-path.js @@ -0,0 +1,10 @@ +'use strict' +var path = require('path') +var validate = require('aproba') +var moduleName = require('../utils/module-name.js') + +module.exports = childPath +function childPath (parentPath, child) { + validate('SO', arguments) + return path.join(parentPath, 'node_modules', moduleName(child)) +} diff --git a/deps/node/deps/npm/lib/utils/completion.sh b/deps/node/deps/npm/lib/utils/completion.sh new file mode 100755 index 00000000..c549b31c --- /dev/null +++ b/deps/node/deps/npm/lib/utils/completion.sh @@ -0,0 +1,61 @@ +#!/bin/bash +###-begin-npm-completion-### +# +# npm command completion script +# +# Installation: npm completion >> ~/.bashrc (or ~/.zshrc) +# Or, maybe: npm completion > /usr/local/etc/bash_completion.d/npm +# + +if type complete &>/dev/null; then + _npm_completion () { + local words cword + if type _get_comp_words_by_ref &>/dev/null; then + _get_comp_words_by_ref -n = -n @ -n : -w words -i cword + else + cword="$COMP_CWORD" + words=("${COMP_WORDS[@]}") + fi + + local si="$IFS" + IFS=$'\n' COMPREPLY=($(COMP_CWORD="$cword" \ + COMP_LINE="$COMP_LINE" \ + COMP_POINT="$COMP_POINT" \ + npm completion -- "${words[@]}" \ + 2>/dev/null)) || return $? + IFS="$si" + if type __ltrim_colon_completions &>/dev/null; then + __ltrim_colon_completions "${words[cword]}" + fi + } + complete -o default -F _npm_completion npm +elif type compdef &>/dev/null; then + _npm_completion() { + local si=$IFS + compadd -- $(COMP_CWORD=$((CURRENT-1)) \ + COMP_LINE=$BUFFER \ + COMP_POINT=0 \ + npm completion -- "${words[@]}" \ + 2>/dev/null) + IFS=$si + } + compdef _npm_completion npm +elif type compctl &>/dev/null; then + _npm_completion () { + local cword line point words si + read -Ac words + read -cn cword + let cword-=1 + read -l line + read -ln point + si="$IFS" + IFS=$'\n' reply=($(COMP_CWORD="$cword" \ + COMP_LINE="$line" \ + COMP_POINT="$point" \ + npm completion -- "${words[@]}" \ + 2>/dev/null)) || return $? + IFS="$si" + } + compctl -K _npm_completion npm +fi +###-end-npm-completion-### diff --git a/deps/node/deps/npm/lib/utils/completion/file-completion.js b/deps/node/deps/npm/lib/utils/completion/file-completion.js new file mode 100644 index 00000000..e16b636a --- /dev/null +++ b/deps/node/deps/npm/lib/utils/completion/file-completion.js @@ -0,0 +1,24 @@ +module.exports = fileCompletion + +var mkdir = require('mkdirp') +var glob = require('glob') + +function fileCompletion (root, req, depth, cb) { + if (typeof cb !== 'function') { + cb = depth + depth = Infinity + } + mkdir(root, function (er) { + if (er) return cb(er) + + // can be either exactly the req, or a descendent + var pattern = root + '/{' + req + ',' + req + '/**/*}' + var opts = { mark: true, dot: true, maxDepth: depth } + glob(pattern, opts, function (er, files) { + if (er) return cb(er) + return cb(null, (files || []).map(function (f) { + return f.substr(root.length + 1).replace(/^\/|\/$/g, '') + })) + }) + }) +} diff --git a/deps/node/deps/npm/lib/utils/completion/installed-deep.js b/deps/node/deps/npm/lib/utils/completion/installed-deep.js new file mode 100644 index 00000000..dc9bfbee --- /dev/null +++ b/deps/node/deps/npm/lib/utils/completion/installed-deep.js @@ -0,0 +1,52 @@ +module.exports = installedDeep + +var npm = require('../../npm.js') +var readInstalled = require('read-installed') + +function installedDeep (opts, cb) { + var local + var global + var depth = npm.config.get('depth') + var opt = { depth: depth, dev: true } + + if (npm.config.get('global')) { + local = [] + next() + } else { + readInstalled(npm.prefix, opt, function (er, data) { + local = getNames(data || {}) + next() + }) + } + + readInstalled(npm.config.get('prefix'), opt, function (er, data) { + global = getNames(data || {}) + next() + }) + + function getNames_ (d, n) { + if (d.realName && n) { + if (n[d.realName]) return n + n[d.realName] = true + } + if (!n) n = {} + Object.keys(d.dependencies || {}).forEach(function (dep) { + getNames_(d.dependencies[dep], n) + }) + return n + } + function getNames (d) { + return Object.keys(getNames_(d)) + } + + function next () { + if (!local || !global) return + if (!npm.config.get('global')) { + global = global.map(function (g) { + return [g, '-g'] + }) + } + var names = local.concat(global) + return cb(null, names) + } +} diff --git a/deps/node/deps/npm/lib/utils/completion/installed-shallow.js b/deps/node/deps/npm/lib/utils/completion/installed-shallow.js new file mode 100644 index 00000000..bf692fed --- /dev/null +++ b/deps/node/deps/npm/lib/utils/completion/installed-shallow.js @@ -0,0 +1,87 @@ + +module.exports = installedShallow + +var npm = require('../../npm.js') +var fs = require('graceful-fs') +var path = require('path') +var readJson = require('read-package-json') +var asyncMap = require('slide').asyncMap + +function installedShallow (opts, filter, cb) { + if (typeof cb !== 'function') { + cb = filter + filter = null + } + var conf = opts.conf + var args = conf.argv.remain + if (args.length > 3) return cb() + var local + var global + var localDir = npm.dir + var globalDir = npm.globalDir + if (npm.config.get('global')) { + local = [] + next() + } else { + fs.readdir(localDir, function (er, pkgs) { + local = (pkgs || []).filter(function (p) { + return p.charAt(0) !== '.' + }) + next() + }) + } + + fs.readdir(globalDir, function (er, pkgs) { + global = (pkgs || []).filter(function (p) { + return p.charAt(0) !== '.' + }) + next() + }) + function next () { + if (!local || !global) return + filterInstalled(local, global, filter, cb) + } +} + +function filterInstalled (local, global, filter, cb) { + var fl + var fg + + if (!filter) { + fl = local + fg = global + return next() + } + + asyncMap(local, function (p, cb) { + readJson(path.join(npm.dir, p, 'package.json'), function (er, d) { + if (!d || !filter(d)) return cb(null, []) + return cb(null, d.name) + }) + }, function (er, local) { + fl = local || [] + next() + }) + + var globalDir = npm.globalDir + asyncMap(global, function (p, cb) { + readJson(path.join(globalDir, p, 'package.json'), function (er, d) { + if (!d || !filter(d)) return cb(null, []) + return cb(null, d.name) + }) + }, function (er, global) { + fg = global || [] + next() + }) + + function next () { + if (!fg || !fl) return + if (!npm.config.get('global')) { + fg = fg.map(function (g) { + return [g, '-g'] + }) + } + console.error('filtered', fl, fg) + return cb(null, fl.concat(fg)) + } +} diff --git a/deps/node/deps/npm/lib/utils/correct-mkdir.js b/deps/node/deps/npm/lib/utils/correct-mkdir.js new file mode 100644 index 00000000..68c4a4ad --- /dev/null +++ b/deps/node/deps/npm/lib/utils/correct-mkdir.js @@ -0,0 +1,123 @@ +var chownr = require('chownr') +var dezalgo = require('dezalgo') +var fs = require('graceful-fs') +var inflight = require('inflight') +var log = require('npmlog') +var mkdirp = require('mkdirp') + +// memoize the directories created by this step +var stats = {} +var effectiveOwner +module.exports = function correctMkdir (path, cb) { + cb = dezalgo(cb) + cb = inflight('correctMkdir:' + path, cb) + if (!cb) { + return log.verbose('correctMkdir', path, 'correctMkdir already in flight; waiting') + } else { + log.verbose('correctMkdir', path, 'correctMkdir not in flight; initializing') + } + + if (stats[path]) return cb(null, stats[path]) + + fs.stat(path, function (er, st) { + if (er) return makeDirectory(path, cb) + + if (!st.isDirectory()) { + log.error('correctMkdir', 'invalid dir %s', path) + return cb(er) + } + + var ownerStats = calculateOwner() + // there's always a chance the permissions could have been frobbed, so fix + if (st.uid !== ownerStats.uid) { + stats[path] = ownerStats + setPermissions(path, ownerStats, cb) + } else { + stats[path] = st + cb(null, stats[path]) + } + }) +} + +function calculateOwner () { + if (!effectiveOwner) { + effectiveOwner = { uid: 0, gid: 0 } + + // Pretty much only on windows + if (!process.getuid) { + return effectiveOwner + } + + effectiveOwner.uid = +process.getuid() + effectiveOwner.gid = +process.getgid() + + if (effectiveOwner.uid === 0) { + if (process.env.SUDO_UID) effectiveOwner.uid = +process.env.SUDO_UID + if (process.env.SUDO_GID) effectiveOwner.gid = +process.env.SUDO_GID + } + } + + return effectiveOwner +} + +function makeDirectory (path, cb) { + cb = inflight('makeDirectory:' + path, cb) + if (!cb) { + return log.verbose('makeDirectory', path, 'creation already in flight; waiting') + } else { + log.verbose('makeDirectory', path, 'creation not in flight; initializing') + } + + var owner = calculateOwner() + + if (!process.getuid) { + return mkdirp(path, function (er) { + log.verbose('makeCacheDir', 'UID & GID are irrelevant on', process.platform) + + stats[path] = owner + return cb(er, stats[path]) + }) + } + + if (owner.uid !== 0 || !process.env.HOME) { + log.silly( + 'makeDirectory', path, + 'uid:', owner.uid, + 'gid:', owner.gid + ) + stats[path] = owner + mkdirp(path, afterMkdir) + } else { + fs.stat(process.env.HOME, function (er, st) { + if (er) { + log.error('makeDirectory', 'homeless?') + return cb(er) + } + + log.silly( + 'makeDirectory', path, + 'uid:', st.uid, + 'gid:', st.gid + ) + stats[path] = st + mkdirp(path, afterMkdir) + }) + } + + function afterMkdir (er, made) { + if (er || !stats[path] || isNaN(stats[path].uid) || isNaN(stats[path].gid)) { + return cb(er, stats[path]) + } + + if (!made) return cb(er, stats[path]) + + setPermissions(made, stats[path], cb) + } +} + +function setPermissions (path, st, cb) { + chownr(path, st.uid, st.gid, function (er) { + if (er && er.code === 'ENOENT') return cb(null, st) + return cb(er, st) + }) +} diff --git a/deps/node/deps/npm/lib/utils/deep-sort-object.js b/deps/node/deps/npm/lib/utils/deep-sort-object.js new file mode 100644 index 00000000..7499efc4 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/deep-sort-object.js @@ -0,0 +1,14 @@ +'use strict' +var sortedObject = require('sorted-object') + +module.exports = function deepSortObject (obj) { + if (obj == null || typeof obj !== 'object') return obj + if (obj instanceof Array) { + return obj.map(deepSortObject) + } + obj = sortedObject(obj) + Object.keys(obj).forEach(function (key) { + obj[key] = deepSortObject(obj[key]) + }) + return obj +} diff --git a/deps/node/deps/npm/lib/utils/depr-check.js b/deps/node/deps/npm/lib/utils/depr-check.js new file mode 100644 index 00000000..97023ddd --- /dev/null +++ b/deps/node/deps/npm/lib/utils/depr-check.js @@ -0,0 +1,23 @@ +'use strict' + +const log = require('npmlog') + +const deprecated = {} +const deprWarned = {} + +module.exports = deprCheck +function deprCheck (data) { + if (deprecated[data._id]) { + data.deprecated = deprecated[data._id] + } + + if (data.deprecated) { + deprecated[data._id] = data.deprecated + if (!deprWarned[data._id]) { + deprWarned[data._id] = true + log.warn('deprecated', '%s: %s', data._id, data.deprecated) + } + } + + return data +} diff --git a/deps/node/deps/npm/lib/utils/did-you-mean.js b/deps/node/deps/npm/lib/utils/did-you-mean.js new file mode 100644 index 00000000..479f0475 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/did-you-mean.js @@ -0,0 +1,17 @@ +var meant = require('meant') + +function didYouMean (scmd, commands) { + var bestSimilarity = meant(scmd, commands).map(function (str) { + return ' ' + str + }) + + if (bestSimilarity.length === 0) return '' + if (bestSimilarity.length === 1) { + return '\nDid you mean this?\n' + bestSimilarity[0] + } else { + return ['\nDid you mean one of these?'] + .concat(bestSimilarity.slice(0, 3)).join('\n') + } +} + +module.exports = didYouMean diff --git a/deps/node/deps/npm/lib/utils/error-handler.js b/deps/node/deps/npm/lib/utils/error-handler.js new file mode 100644 index 00000000..ba9d9f8e --- /dev/null +++ b/deps/node/deps/npm/lib/utils/error-handler.js @@ -0,0 +1,252 @@ + +module.exports = errorHandler +module.exports.exit = exit + +var cbCalled = false +var log = require('npmlog') +var npm = require('../npm.js') +var itWorked = false +var path = require('path') +var wroteLogFile = false +var exitCode = 0 +var rollbacks = npm.rollbacks +var chain = require('slide').chain +var writeFileAtomic = require('write-file-atomic') +var errorMessage = require('./error-message.js') +var stopMetrics = require('./metrics.js').stop +var mkdirp = require('mkdirp') +var fs = require('graceful-fs') + +var logFileName +function getLogFile () { + if (!logFileName) { + logFileName = path.resolve(npm.config.get('cache'), '_logs', (new Date()).toISOString().replace(/[.:]/g, '_') + '-debug.log') + } + return logFileName +} + +var timings = { + version: npm.version, + command: process.argv.slice(2), + logfile: null +} +process.on('timing', function (name, value) { + if (timings[name]) { timings[name] += value } else { timings[name] = value } +}) + +process.on('exit', function (code) { + process.emit('timeEnd', 'npm') + log.disableProgress() + if (npm.config.loaded && npm.config.get('timing')) { + try { + timings.logfile = getLogFile() + fs.appendFileSync(path.join(npm.config.get('cache'), '_timing.json'), JSON.stringify(timings) + '\n') + } catch (_) { + // ignore + } + } + + // kill any outstanding stats reporter if it hasn't finished yet + stopMetrics() + + if (code) itWorked = false + if (itWorked) { + log.info('ok') + } else { + if (!cbCalled) { + log.error('', 'cb() never called!') + console.error('') + log.error('', 'This is an error with npm itself. Please report this error at:') + log.error('', ' <https://npm.community>') + writeLogFile() + } + + if (code) { + log.verbose('code', code) + } + } + if (npm.config.loaded && npm.config.get('timing') && !wroteLogFile) writeLogFile() + if (wroteLogFile) { + // just a line break + if (log.levels[log.level] <= log.levels.error) console.error('') + + log.error( + '', + [ + 'A complete log of this run can be found in:', + ' ' + getLogFile() + ].join('\n') + ) + wroteLogFile = false + } + + var doExit = npm.config.loaded && npm.config.get('_exit') + if (doExit) { + // actually exit. + if (exitCode === 0 && !itWorked) { + exitCode = 1 + } + if (exitCode !== 0) process.exit(exitCode) + } else { + itWorked = false // ready for next exit + } +}) + +function exit (code, noLog) { + exitCode = exitCode || process.exitCode || code + + var doExit = npm.config.loaded ? npm.config.get('_exit') : true + log.verbose('exit', [code, doExit]) + if (log.level === 'silent') noLog = true + + if (rollbacks.length) { + chain(rollbacks.map(function (f) { + return function (cb) { + npm.commands.unbuild([f], true, cb) + } + }), function (er) { + if (er) { + log.error('error rolling back', er) + if (!code) { + errorHandler(er) + } else { + if (!noLog) writeLogFile() + reallyExit(er) + } + } else { + if (!noLog && code) writeLogFile() + reallyExit() + } + }) + rollbacks.length = 0 + } else if (code && !noLog) { + writeLogFile() + } else { + reallyExit() + } + + function reallyExit (er) { + if (er && !code) code = typeof er.errno === 'number' ? er.errno : 1 + + itWorked = !code + + // Exit directly -- nothing in the CLI should still be running in the + // background at this point, and this makes sure anything left dangling + // for whatever reason gets thrown away, instead of leaving the CLI open + // + // Commands that expect long-running actions should just delay `cb()` + process.stdout.write('', () => { + process.exit(code) + }) + } +} + +function errorHandler (er) { + log.disableProgress() + if (!npm.config || !npm.config.loaded) { + // logging won't work unless we pretend that it's ready + er = er || new Error('Exit prior to config file resolving.') + console.error(er.stack || er.message) + } + + if (cbCalled) { + er = er || new Error('Callback called more than once.') + } + + cbCalled = true + if (!er) return exit(0) + if (typeof er === 'string') { + log.error('', er) + return exit(1, true) + } else if (!(er instanceof Error)) { + log.error('weird error', er) + return exit(1, true) + } + + var m = er.code || er.message.match(/^(?:Error: )?(E[A-Z]+)/) + if (m && !er.code) { + er.code = m + } + + ;[ + 'type', + 'stack', + 'statusCode', + 'pkgid' + ].forEach(function (k) { + var v = er[k] + if (!v) return + log.verbose(k, v) + }) + + log.verbose('cwd', process.cwd()) + + var os = require('os') + log.verbose('', os.type() + ' ' + os.release()) + log.verbose('argv', process.argv.map(JSON.stringify).join(' ')) + log.verbose('node', process.version) + log.verbose('npm ', 'v' + npm.version) + + ;[ + 'file', + 'path', + 'code', + 'errno', + 'syscall' + ].forEach(function (k) { + var v = er[k] + if (v) log.error(k, v) + }) + + var msg = errorMessage(er) + msg.summary.concat(msg.detail).forEach(function (errline) { + log.error.apply(log, errline) + }) + if (npm.config && npm.config.get('json')) { + var error = { + error: { + code: er.code, + summary: messageText(msg.summary), + detail: messageText(msg.detail) + } + } + console.log(JSON.stringify(error, null, 2)) + } + + exit(typeof er.errno === 'number' ? er.errno : 1) +} + +function messageText (msg) { + return msg.map(function (line) { + return line.slice(1).join(' ') + }).join('\n') +} + +function writeLogFile () { + if (wroteLogFile) return + + var os = require('os') + + try { + mkdirp.sync(path.resolve(npm.config.get('cache'), '_logs')) + var logOutput = '' + log.record.forEach(function (m) { + var pref = [m.id, m.level] + if (m.prefix) pref.push(m.prefix) + pref = pref.join(' ') + + m.message.trim().split(/\r?\n/).map(function (line) { + return (pref + ' ' + line).trim() + }).forEach(function (line) { + logOutput += line + os.EOL + }) + }) + writeFileAtomic.sync(getLogFile(), logOutput) + + // truncate once it's been written. + log.record.length = 0 + wroteLogFile = true + } catch (ex) { + + } +} diff --git a/deps/node/deps/npm/lib/utils/error-message.js b/deps/node/deps/npm/lib/utils/error-message.js new file mode 100644 index 00000000..55c54634 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/error-message.js @@ -0,0 +1,367 @@ +'use strict' +var npm = require('../npm.js') +var util = require('util') +var nameValidator = require('validate-npm-package-name') + +module.exports = errorMessage + +function errorMessage (er) { + var short = [] + var detail = [] + switch (er.code) { + case 'ENOAUDIT': + short.push(['audit', er.message]) + break + case 'EAUDITNOPJSON': + short.push(['audit', er.message]) + break + case 'EAUDITNOLOCK': + short.push(['audit', er.message]) + detail.push(['audit', 'Try creating one first with: npm i --package-lock-only']) + break + + case 'ECONNREFUSED': + short.push(['', er]) + detail.push([ + '', + [ + '\nIf you are behind a proxy, please make sure that the', + "'proxy' config is set properly. See: 'npm help config'" + ].join('\n') + ]) + break + + case 'EACCES': + case 'EPERM': + short.push(['', er]) + detail.push([ + '', + [ + '\nThe operation was rejected by your operating system.', + (process.platform === 'win32' + ? 'It\'s possible that the file was already in use (by a text editor or antivirus),\nor that you lack permissions to access it.' + : 'It is likely you do not have the permissions to access this file as the current user'), + '\nIf you believe this might be a permissions issue, please double-check the', + 'permissions of the file and its containing directories, or try running', + 'the command again as root/Administrator (though this is not recommended).' + ].join('\n')]) + break + + case 'ELIFECYCLE': + short.push(['', er.message]) + detail.push([ + '', + [ + '', + 'Failed at the ' + er.pkgid + ' ' + er.stage + ' script.', + 'This is probably not a problem with npm. There is likely additional logging output above.' + ].join('\n')] + ) + break + + case 'ENOGIT': + short.push(['', er.message]) + detail.push([ + '', + [ + '', + 'Failed using git.', + 'Please check if you have git installed and in your PATH.' + ].join('\n') + ]) + break + + case 'EJSONPARSE': + const path = require('path') + // Check whether we ran into a conflict in our own package.json + if (er.file === path.join(npm.prefix, 'package.json')) { + const isDiff = require('../install/read-shrinkwrap.js')._isDiff + const txt = require('fs').readFileSync(er.file, 'utf8') + if (isDiff(txt)) { + detail.push([ + '', + [ + 'Merge conflict detected in your package.json.', + '', + 'Please resolve the package.json conflict and retry the command:', + '', + `$ ${process.argv.join(' ')}` + ].join('\n') + ]) + break + } + } + short.push(['JSON.parse', er.message]) + detail.push([ + 'JSON.parse', + [ + 'Failed to parse package.json data.', + 'package.json must be actual JSON, not just JavaScript.' + ].join('\n') + ]) + break + + case 'EOTP': + case 'E401': + // E401 is for places where we accidentally neglect OTP stuff + if (er.code === 'EOTP' || /one-time pass/.test(er.message)) { + short.push(['', 'This operation requires a one-time password from your authenticator.']) + detail.push([ + '', + [ + 'You can provide a one-time password by passing --otp=<code> to the command you ran.', + 'If you already provided a one-time password then it is likely that you either typoed', + 'it, or it timed out. Please try again.' + ].join('\n') + ]) + } else { + // npm ERR! code E401 + // npm ERR! Unable to authenticate, need: Basic + const auth = (er.headers && er.headers['www-authenticate'] && er.headers['www-authenticate'].map((au) => au.split(/,\s*/))[0]) || [] + if (auth.indexOf('Bearer') !== -1) { + short.push(['', 'Unable to authenticate, your authentication token seems to be invalid.']) + detail.push([ + '', + [ + 'To correct this please trying logging in again with:', + ' npm login' + ].join('\n') + ]) + } else if (auth.indexOf('Basic') !== -1) { + short.push(['', 'Incorrect or missing password.']) + detail.push([ + '', + [ + 'If you were trying to login, change your password, create an', + 'authentication token or enable two-factor authentication then', + 'that means you likely typed your password in incorrectly.', + 'Please try again, or recover your password at:', + ' https://www.npmjs.com/forgot', + '', + 'If you were doing some other operation then your saved credentials are', + 'probably out of date. To correct this please try logging in again with:', + ' npm login' + ].join('\n') + ]) + } else { + short.push(['', er.message || er]) + } + } + break + + case 'E404': + // There's no need to have 404 in the message as well. + var msg = er.message.replace(/^404\s+/, '') + short.push(['404', msg]) + if (er.pkgid && er.pkgid !== '-') { + detail.push(['404', '']) + detail.push(['404', '', "'" + er.pkgid + "' is not in the npm registry."]) + + var valResult = nameValidator(er.pkgid) + + if (valResult.validForNewPackages) { + detail.push(['404', 'You should bug the author to publish it (or use the name yourself!)']) + } else { + detail.push(['404', 'Your package name is not valid, because', '']) + + var errorsArray = (valResult.errors || []).concat(valResult.warnings || []) + errorsArray.forEach(function (item, idx) { + detail.push(['404', ' ' + (idx + 1) + '. ' + item]) + }) + } + + if (er.parent) { + detail.push(['404', "It was specified as a dependency of '" + er.parent + "'"]) + } + detail.push(['404', '\nNote that you can also install from a']) + detail.push(['404', 'tarball, folder, http url, or git url.']) + } + break + + case 'EPUBLISHCONFLICT': + short.push(['publish fail', 'Cannot publish over existing version.']) + detail.push(['publish fail', "Update the 'version' field in package.json and try again."]) + detail.push(['publish fail', '']) + detail.push(['publish fail', 'To automatically increment version numbers, see:']) + detail.push(['publish fail', ' npm help version']) + break + + case 'EISGIT': + short.push(['git', er.message]) + short.push(['git', ' ' + er.path]) + detail.push([ + 'git', + [ + 'Refusing to remove it. Update manually,', + 'or move it out of the way first.' + ].join('\n') + ]) + break + + case 'ECYCLE': + short.push([ + 'cycle', + [ + er.message, + 'While installing: ' + er.pkgid + ].join('\n') + ]) + detail.push([ + 'cycle', + [ + 'Found a pathological dependency case that npm cannot solve.', + 'Please report this to the package author.' + ].join('\n') + ]) + break + + case 'EBADPLATFORM': + var validOs = er.os.join ? er.os.join(',') : er.os + var validArch = er.cpu.join ? er.cpu.join(',') : er.cpu + var expected = {os: validOs, arch: validArch} + var actual = {os: process.platform, arch: process.arch} + short.push([ + 'notsup', + [ + util.format('Unsupported platform for %s: wanted %j (current: %j)', er.pkgid, expected, actual) + ].join('\n') + ]) + detail.push([ + 'notsup', + [ + 'Valid OS: ' + validOs, + 'Valid Arch: ' + validArch, + 'Actual OS: ' + process.platform, + 'Actual Arch: ' + process.arch + ].join('\n') + ]) + break + + case 'EEXIST': + short.push(['', er.message]) + short.push(['', 'File exists: ' + er.path]) + detail.push(['', 'Move it away, and try again.']) + break + + case 'ENEEDAUTH': + short.push(['need auth', er.message]) + detail.push(['need auth', 'You need to authorize this machine using `npm adduser`']) + break + + case 'ECONNRESET': + case 'ENOTFOUND': + case 'ETIMEDOUT': + case 'EAI_FAIL': + short.push(['network', er.message]) + detail.push([ + 'network', + [ + 'This is a problem related to network connectivity.', + 'In most cases you are behind a proxy or have bad network settings.', + '\nIf you are behind a proxy, please make sure that the', + "'proxy' config is set properly. See: 'npm help config'" + ].join('\n') + ]) + break + + case 'ENOPACKAGEJSON': + short.push(['package.json', er.message]) + detail.push([ + 'package.json', + [ + "npm can't find a package.json file in your current directory." + ].join('\n') + ]) + break + + case 'ETARGET': + short.push(['notarget', er.message]) + msg = [ + 'In most cases you or one of your dependencies are requesting', + "a package version that doesn't exist." + ] + if (er.parent) { + msg.push("\nIt was specified as a dependency of '" + er.parent + "'\n") + } + detail.push(['notarget', msg.join('\n')]) + break + + case 'ENOTSUP': + if (er.required) { + short.push(['notsup', er.message]) + short.push(['notsup', 'Not compatible with your version of node/npm: ' + er.pkgid]) + detail.push([ + 'notsup', + [ + 'Not compatible with your version of node/npm: ' + er.pkgid, + 'Required: ' + JSON.stringify(er.required), + 'Actual: ' + JSON.stringify({ + npm: npm.version, + node: npm.config.get('node-version') + }) + ].join('\n') + ]) + break + } // else passthrough + /* eslint no-fallthrough:0 */ + + case 'ENOSPC': + short.push(['nospc', er.message]) + detail.push([ + 'nospc', + [ + 'There appears to be insufficient space on your system to finish.', + 'Clear up some disk space and try again.' + ].join('\n') + ]) + break + + case 'EROFS': + short.push(['rofs', er.message]) + detail.push([ + 'rofs', + [ + 'Often virtualized file systems, or other file systems', + "that don't support symlinks, give this error." + ].join('\n') + ]) + break + + case 'ENOENT': + short.push(['enoent', er.message]) + detail.push([ + 'enoent', + [ + 'This is related to npm not being able to find a file.', + er.file ? "\nCheck if the file '" + er.file + "' is present." : '' + ].join('\n') + ]) + break + + case 'EMISSINGARG': + case 'EUNKNOWNTYPE': + case 'EINVALIDTYPE': + case 'ETOOMANYARGS': + short.push(['typeerror', er.stack]) + detail.push([ + 'typeerror', + [ + 'This is an error with npm itself. Please report this error at:', + ' <https://npm.community>' + ].join('\n') + ]) + break + + default: + short.push(['', er.message || er]) + break + } + if (er.optional) { + short.unshift(['optional', er.optional + ' (' + er.location + '):']) + short.concat(detail).forEach(function (msg) { + if (!msg[0]) msg[0] = 'optional' + if (msg[1]) msg[1] = msg[1].toString().replace(/(^|\n)/g, '$1SKIPPING OPTIONAL DEPENDENCY: ') + }) + } + return {summary: short, detail: detail} +} diff --git a/deps/node/deps/npm/lib/utils/escape-arg.js b/deps/node/deps/npm/lib/utils/escape-arg.js new file mode 100644 index 00000000..d12ee5ed --- /dev/null +++ b/deps/node/deps/npm/lib/utils/escape-arg.js @@ -0,0 +1,27 @@ +'use strict' +var path = require('path') +var isWindowsShell = require('./is-windows-shell.js') + +/* +Escape the name of an executable suitable for passing to the system shell. + +Windows is easy, wrap in double quotes and you're done, as there's no +facility to create files with quotes in their names. + +Unix-likes are a little more complicated, wrap in single quotes and escape +any single quotes in the filename. +*/ + +module.exports = escapify + +function escapify (str) { + if (isWindowsShell) { + return '"' + path.normalize(str) + '"' + } else { + if (/[^-_.~/\w]/.test(str)) { + return "'" + str.replace(/'/g, "'\"'\"'") + "'" + } else { + return str + } + } +} diff --git a/deps/node/deps/npm/lib/utils/escape-exec-path.js b/deps/node/deps/npm/lib/utils/escape-exec-path.js new file mode 100644 index 00000000..bf94886e --- /dev/null +++ b/deps/node/deps/npm/lib/utils/escape-exec-path.js @@ -0,0 +1,30 @@ +'use strict' +var path = require('path') +var isWindowsShell = require('./is-windows-shell.js') + +/* +Escape the name of an executable suitable for passing to the system shell. + +Windows is easy, wrap in double quotes and you're done, as there's no +facility to create files with quotes in their names. + +Unix-likes are a little more complicated, wrap in single quotes and escape +any single quotes in the filename. +*/ + +module.exports = escapify + +function windowsQuotes (str) { + if (!/ /.test(str)) return str + return '"' + str + '"' +} + +function escapify (str) { + if (isWindowsShell) { + return path.normalize(str).split(/\\/).map(windowsQuotes).join('\\') + } else if (/[^-_.~/\w]/.test(str)) { + return "'" + str.replace(/'/g, "'\"'\"'") + "'" + } else { + return str + } +} diff --git a/deps/node/deps/npm/lib/utils/gently-rm.js b/deps/node/deps/npm/lib/utils/gently-rm.js new file mode 100644 index 00000000..16d0aa9b --- /dev/null +++ b/deps/node/deps/npm/lib/utils/gently-rm.js @@ -0,0 +1,21 @@ +// only remove the thing if it's a symlink into a specific folder. This is +// a very common use-case of npm's, but not so common elsewhere. + +exports = module.exports = gentlyRm + +var gentleFS = require('gentle-fs') +var gentleFSOpts = require('../config/gentle-fs.js') + +function gentlyRm (target, gently, base, cb) { + if (!cb) { + cb = base + base = undefined + } + + if (!cb) { + cb = gently + gently = false + } + + return gentleFS.rm(target, gentleFSOpts(gently, base), cb) +} diff --git a/deps/node/deps/npm/lib/utils/git.js b/deps/node/deps/npm/lib/utils/git.js new file mode 100644 index 00000000..6770853d --- /dev/null +++ b/deps/node/deps/npm/lib/utils/git.js @@ -0,0 +1,50 @@ +'use strict' + +const BB = require('bluebird') + +const exec = require('child_process').execFile +const spawn = require('./spawn') +const npm = require('../npm.js') +const which = require('which') +const git = npm.config.get('git') +const assert = require('assert') +const log = require('npmlog') +const noProgressTillDone = require('./no-progress-while-running.js').tillDone + +exports.spawn = spawnGit +exports.exec = BB.promisify(execGit) +exports.chainableExec = chainableExec +exports.whichAndExec = whichAndExec + +function prefixGitArgs () { + return process.platform === 'win32' ? ['-c', 'core.longpaths=true'] : [] +} + +function execGit (args, options, cb) { + log.info('git', args) + const fullArgs = prefixGitArgs().concat(args || []) + return exec(git, fullArgs, options, noProgressTillDone(cb)) +} + +function spawnGit (args, options) { + log.info('git', args) + return spawn(git, prefixGitArgs().concat(args || []), options) +} + +function chainableExec () { + var args = Array.prototype.slice.call(arguments) + return [execGit].concat(args) +} + +function whichAndExec (args, options, cb) { + assert.equal(typeof cb, 'function', 'no callback provided') + // check for git + which(git, function (err) { + if (err) { + err.code = 'ENOGIT' + return cb(err) + } + + execGit(args, options, cb) + }) +} diff --git a/deps/node/deps/npm/lib/utils/gunzip-maybe.js b/deps/node/deps/npm/lib/utils/gunzip-maybe.js new file mode 100644 index 00000000..adf7e440 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/gunzip-maybe.js @@ -0,0 +1,22 @@ +var duplex = require('mississippi').duplex +var through = require('mississippi').through +var zlib = require('zlib') + +function hasGzipHeader (c) { + return c[0] === 0x1F && c[1] === 0x8B && c[2] === 0x08 +} + +module.exports = gunzip +function gunzip () { + var stream = duplex() + var peeker = through(function (chunk, enc, cb) { + var newStream = hasGzipHeader(chunk) + ? zlib.createGunzip() + : through() + stream.setReadable(newStream) + stream.setWritable(newStream) + stream.write(chunk) + }) + stream.setWritable(peeker) + return stream +} diff --git a/deps/node/deps/npm/lib/utils/is-registry.js b/deps/node/deps/npm/lib/utils/is-registry.js new file mode 100644 index 00000000..e5f08e16 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/is-registry.js @@ -0,0 +1,11 @@ +'use strict' +module.exports = isRegistry + +function isRegistry (req) { + if (req == null) return false + // modern metadata + if ('registry' in req) return req.registry + // legacy metadata + if (req.type === 'range' || req.type === 'version' || req.type === 'tag') return true + return false +} diff --git a/deps/node/deps/npm/lib/utils/is-windows-bash.js b/deps/node/deps/npm/lib/utils/is-windows-bash.js new file mode 100644 index 00000000..0a6c1796 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/is-windows-bash.js @@ -0,0 +1,4 @@ +'use strict' +var isWindows = require('./is-windows.js') +module.exports = isWindows && + (/^MINGW(32|64)$/.test(process.env.MSYSTEM) || process.env.TERM === 'cygwin') diff --git a/deps/node/deps/npm/lib/utils/is-windows-shell.js b/deps/node/deps/npm/lib/utils/is-windows-shell.js new file mode 100644 index 00000000..803bbaa4 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/is-windows-shell.js @@ -0,0 +1,4 @@ +'use strict' +var isWindows = require('./is-windows.js') +var isWindowsBash = require('./is-windows-bash.js') +module.exports = isWindows && !isWindowsBash diff --git a/deps/node/deps/npm/lib/utils/is-windows.js b/deps/node/deps/npm/lib/utils/is-windows.js new file mode 100644 index 00000000..8a991d54 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/is-windows.js @@ -0,0 +1,2 @@ +'use strict' +module.exports = process.platform === 'win32' diff --git a/deps/node/deps/npm/lib/utils/lifecycle-cmd.js b/deps/node/deps/npm/lib/utils/lifecycle-cmd.js new file mode 100644 index 00000000..bb802f45 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/lifecycle-cmd.js @@ -0,0 +1,18 @@ +exports = module.exports = cmd + +var npm = require('../npm.js') +var usage = require('./usage.js') + +function cmd (stage) { + function CMD (args, cb) { + npm.commands['run-script']([stage].concat(args), cb) + } + CMD.usage = usage(stage, 'npm ' + stage + ' [-- <args>]') + var installedShallow = require('./completion/installed-shallow.js') + CMD.completion = function (opts, cb) { + installedShallow(opts, function (d) { + return d.scripts && d.scripts[stage] + }, cb) + } + return CMD +} diff --git a/deps/node/deps/npm/lib/utils/lifecycle.js b/deps/node/deps/npm/lib/utils/lifecycle.js new file mode 100644 index 00000000..2d3265e0 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/lifecycle.js @@ -0,0 +1,14 @@ +exports = module.exports = runLifecycle + +const lifecycleOpts = require('../config/lifecycle') +const lifecycle = require('npm-lifecycle') + +function runLifecycle (pkg, stage, wd, moreOpts, cb) { + if (typeof moreOpts === 'function') { + cb = moreOpts + moreOpts = null + } + + const opts = lifecycleOpts(moreOpts) + lifecycle(pkg, stage, wd, opts).then(cb, cb) +} diff --git a/deps/node/deps/npm/lib/utils/link.js b/deps/node/deps/npm/lib/utils/link.js new file mode 100644 index 00000000..c2642481 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/link.js @@ -0,0 +1,8 @@ +module.exports = link + +var gentleFS = require('gentle-fs') +var gentleFSOpts = require('../config/gentle-fs.js') + +function link (from, to, gently, abs, cb) { + return gentleFS.link(from, to, gentleFSOpts(gently, undefined, abs), cb) +} diff --git a/deps/node/deps/npm/lib/utils/locker.js b/deps/node/deps/npm/lib/utils/locker.js new file mode 100644 index 00000000..9cd8b2c4 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/locker.js @@ -0,0 +1,73 @@ +var crypto = require('crypto') +var resolve = require('path').resolve + +var lockfile = require('lockfile') +var log = require('npmlog') + +var npm = require('../npm.js') +var correctMkdir = require('../utils/correct-mkdir.js') + +var installLocks = {} + +function lockFileName (base, name) { + var c = name.replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-+|-+$/g, '') + var p = resolve(base, name) + var h = crypto.createHash('sha1').update(p).digest('hex') + var l = resolve(npm.cache, '_locks') + + return resolve(l, c.substr(0, 24) + '-' + h.substr(0, 16) + '.lock') +} + +function lock (base, name, cb) { + var lockDir = resolve(npm.cache, '_locks') + correctMkdir(lockDir, function (er) { + if (er) return cb(er) + + var opts = { + stale: npm.config.get('cache-lock-stale'), + retries: npm.config.get('cache-lock-retries'), + wait: npm.config.get('cache-lock-wait') + } + var lf = lockFileName(base, name) + lockfile.lock(lf, opts, function (er) { + if (er) log.warn('locking', lf, 'failed', er) + + if (!er) { + log.verbose('lock', 'using', lf, 'for', resolve(base, name)) + installLocks[lf] = true + } + + cb(er) + }) + }) +} + +function unlock (base, name, cb) { + var lf = lockFileName(base, name) + var locked = installLocks[lf] + if (locked === false) { + return process.nextTick(cb) + } else if (locked === true) { + lockfile.unlock(lf, function (er) { + if (er) { + log.warn('unlocking', lf, 'failed', er) + } else { + installLocks[lf] = false + log.verbose('unlock', 'done using', lf, 'for', resolve(base, name)) + } + + cb(er) + }) + } else { + var notLocked = new Error( + 'Attempt to unlock ' + resolve(base, name) + ", which hasn't been locked" + ) + notLocked.code = 'ENOTLOCKED' + throw notLocked + } +} + +module.exports = { + lock: lock, + unlock: unlock +} diff --git a/deps/node/deps/npm/lib/utils/metrics-launch.js b/deps/node/deps/npm/lib/utils/metrics-launch.js new file mode 100644 index 00000000..7e2a8d1c --- /dev/null +++ b/deps/node/deps/npm/lib/utils/metrics-launch.js @@ -0,0 +1,40 @@ +'use strict' +/* eslint-disable camelcase */ +module.exports = launchSendMetrics +var fs = require('graceful-fs') +var child_process = require('child_process') + +if (require.main === module) main() + +function launchSendMetrics () { + var path = require('path') + var npm = require('../npm.js') + try { + if (!npm.config.get('send-metrics')) return + var cliMetrics = path.join(npm.config.get('cache'), 'anonymous-cli-metrics.json') + var targetRegistry = npm.config.get('metrics-registry') + fs.statSync(cliMetrics) + return runInBackground(__filename, [cliMetrics, targetRegistry]) + } catch (ex) { + // if the metrics file doesn't exist, don't run + } +} + +function runInBackground (js, args, opts) { + if (!args) args = [] + args.unshift(js) + if (!opts) opts = {} + opts.stdio = 'ignore' + opts.detached = true + var child = child_process.spawn(process.execPath, args, opts) + child.unref() + return child +} + +function main () { + var sendMetrics = require('./metrics.js').send + var metricsFile = process.argv[2] + var metricsRegistry = process.argv[3] + + sendMetrics(metricsFile, metricsRegistry) +} diff --git a/deps/node/deps/npm/lib/utils/metrics.js b/deps/node/deps/npm/lib/utils/metrics.js new file mode 100644 index 00000000..0f99c841 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/metrics.js @@ -0,0 +1,77 @@ +'use strict' +exports.start = startMetrics +exports.stop = stopMetrics +exports.save = saveMetrics +exports.send = sendMetrics + +const fs = require('fs') +const path = require('path') +const npm = require('../npm.js') +const regFetch = require('libnpm/fetch') +const uuid = require('uuid') + +let inMetrics = false + +function startMetrics () { + if (inMetrics) return + // loaded on demand to avoid any recursive deps when `./metrics-launch` requires us. + var metricsLaunch = require('./metrics-launch.js') + npm.metricsProcess = metricsLaunch() +} + +function stopMetrics () { + if (inMetrics) return + if (npm.metricsProcess) npm.metricsProcess.kill('SIGKILL') +} + +function saveMetrics (itWorked) { + if (inMetrics) return + // If the metrics reporter hasn't managed to PUT yet then kill it so that it doesn't + // step on our updating the anonymous-cli-metrics json + stopMetrics() + var metricsFile = path.join(npm.config.get('cache'), 'anonymous-cli-metrics.json') + var metrics + try { + metrics = JSON.parse(fs.readFileSync(metricsFile)) + metrics.metrics.to = new Date().toISOString() + if (itWorked) { + ++metrics.metrics.successfulInstalls + } else { + ++metrics.metrics.failedInstalls + } + } catch (ex) { + metrics = { + metricId: uuid.v4(), + metrics: { + from: new Date().toISOString(), + to: new Date().toISOString(), + successfulInstalls: itWorked ? 1 : 0, + failedInstalls: itWorked ? 0 : 1 + } + } + } + try { + fs.writeFileSync(metricsFile, JSON.stringify(metrics)) + } catch (ex) { + // we couldn't write the error metrics file, um, well, oh well. + } +} + +function sendMetrics (metricsFile, metricsRegistry) { + inMetrics = true + var cliMetrics = JSON.parse(fs.readFileSync(metricsFile)) + regFetch( + `/-/npm/anon-metrics/v1/${encodeURIComponent(cliMetrics.metricId)}`, + // NOTE: skip npmConfig() to prevent auth + { + registry: metricsRegistry, + method: 'PUT', + body: cliMetrics.metrics, + retry: false + } + ).then(() => { + fs.unlinkSync(metricsFile) + }, err => { + fs.writeFileSync(path.join(path.dirname(metricsFile), 'last-send-metrics-error.txt'), err.stack) + }) +} diff --git a/deps/node/deps/npm/lib/utils/module-name.js b/deps/node/deps/npm/lib/utils/module-name.js new file mode 100644 index 00000000..89957b18 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/module-name.js @@ -0,0 +1,31 @@ +'use strict' +var path = require('path') + +module.exports = moduleName +module.exports.test = {} + +module.exports.test.pathToPackageName = pathToPackageName +function pathToPackageName (dir) { + if (dir == null) return '' + if (dir === '') return '' + var name = path.relative(path.resolve(dir, '..'), dir) + var scoped = path.relative(path.resolve(dir, '../..'), dir) + if (scoped[0] === '@') return scoped.replace(/\\/g, '/') + return name.trim() +} + +module.exports.test.isNotEmpty = isNotEmpty +function isNotEmpty (str) { + return str != null && str !== '' +} + +var unknown = 0 +function moduleName (tree) { + var pkg = tree.package || tree + if (isNotEmpty(pkg.name) && typeof pkg.name === 'string') return pkg.name.trim() + var pkgName = pathToPackageName(tree.path) + if (pkgName !== '') return pkgName + if (tree._invalidName != null) return tree._invalidName + tree._invalidName = '!invalid#' + (++unknown) + return tree._invalidName +} diff --git a/deps/node/deps/npm/lib/utils/move.js b/deps/node/deps/npm/lib/utils/move.js new file mode 100644 index 00000000..d564962c --- /dev/null +++ b/deps/node/deps/npm/lib/utils/move.js @@ -0,0 +1,12 @@ +'use strict' +module.exports = wrappedMove + +const fs = require('graceful-fs') +const move = require('move-concurrently') +const Bluebird = require('bluebird') + +const options = {fs: fs, Promise: Bluebird, maxConcurrency: 4} + +function wrappedMove (from, to) { + return move(from, to, options) +} diff --git a/deps/node/deps/npm/lib/utils/no-progress-while-running.js b/deps/node/deps/npm/lib/utils/no-progress-while-running.js new file mode 100644 index 00000000..961fa8b5 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/no-progress-while-running.js @@ -0,0 +1,23 @@ +'use strict' +var log = require('npmlog') +var progressEnabled +var running = 0 + +var startRunning = exports.startRunning = function () { + if (progressEnabled == null) progressEnabled = log.progressEnabled + if (progressEnabled) log.disableProgress() + ++running +} + +var stopRunning = exports.stopRunning = function () { + --running + if (progressEnabled && running === 0) log.enableProgress() +} + +exports.tillDone = function noProgressTillDone (cb) { + startRunning() + return function () { + stopRunning() + cb.apply(this, arguments) + } +} diff --git a/deps/node/deps/npm/lib/utils/open-url.js b/deps/node/deps/npm/lib/utils/open-url.js new file mode 100644 index 00000000..7a48d2e8 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/open-url.js @@ -0,0 +1,16 @@ +'use strict' +const npm = require('../npm.js') +const output = require('./output.js') +const opener = require('opener') + +// attempt to open URL in web-browser, print address otherwise: +module.exports = function open (url, errMsg, cb, browser = npm.config.get('browser')) { + opener(url, { command: npm.config.get('browser') }, (er) => { + if (er && er.code === 'ENOENT') { + output(`${errMsg}:\n\n${url}`) + return cb() + } else { + return cb(er) + } + }) +} diff --git a/deps/node/deps/npm/lib/utils/otplease.js b/deps/node/deps/npm/lib/utils/otplease.js new file mode 100644 index 00000000..d0477a89 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/otplease.js @@ -0,0 +1,27 @@ +'use strict' + +const BB = require('bluebird') + +const optCheck = require('figgy-pudding')({ + prompt: {default: 'This operation requires a one-time password.\nEnter OTP:'}, + otp: {} +}) +const readUserInfo = require('./read-user-info.js') + +module.exports = otplease +function otplease (opts, fn) { + opts = opts.concat ? opts : optCheck(opts) + return BB.try(() => { + return fn(opts) + }).catch(err => { + if (err.code !== 'EOTP' && !(err.code === 'E401' && /one-time pass/.test(err.body))) { + throw err + } else if (!process.stdin.isTTY || !process.stdout.isTTY) { + throw err + } else { + return readUserInfo.otp( + optCheck(opts).prompt + ).then(otp => fn(opts.concat({otp}))) + } + }) +} diff --git a/deps/node/deps/npm/lib/utils/output.js b/deps/node/deps/npm/lib/utils/output.js new file mode 100644 index 00000000..3dd66cbd --- /dev/null +++ b/deps/node/deps/npm/lib/utils/output.js @@ -0,0 +1,8 @@ +'use strict' +var log = require('npmlog') +// output to stdout in a progress bar compatible way +module.exports = function () { + log.clearProgress() + console.log.apply(console, arguments) + log.showProgress() +} diff --git a/deps/node/deps/npm/lib/utils/package-id.js b/deps/node/deps/npm/lib/utils/package-id.js new file mode 100644 index 00000000..2c5e3314 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/package-id.js @@ -0,0 +1,15 @@ +'use strict' +var moduleName = require('./module-name.js') + +module.exports = function (tree) { + var pkg = tree.package || tree + // FIXME: Excluding the '@' here is cleaning up after the mess that + // read-package-json makes. =( + if (pkg._id && pkg._id !== '@') return pkg._id + var name = moduleName(tree) + if (pkg.version) { + return name + '@' + pkg.version + } else { + return name + } +} diff --git a/deps/node/deps/npm/lib/utils/parse-json.js b/deps/node/deps/npm/lib/utils/parse-json.js new file mode 100644 index 00000000..c2ebac35 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/parse-json.js @@ -0,0 +1,25 @@ +'use strict' +var parseJsonWithErrors = require('json-parse-better-errors') +var parseJSON = module.exports = function (content) { + return parseJsonWithErrors(stripBOM(content)) +} + +parseJSON.noExceptions = function (content) { + try { + return parseJSON(content) + } catch (ex) { + + } +} + +// from read-package-json +function stripBOM (content) { + content = content.toString() + // Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + // because the buffer-to-string conversion in `fs.readFileSync()` + // translates it to FEFF, the UTF-16 BOM. + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1) + } + return content +} diff --git a/deps/node/deps/npm/lib/utils/perf.js b/deps/node/deps/npm/lib/utils/perf.js new file mode 100644 index 00000000..d3148607 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/perf.js @@ -0,0 +1,26 @@ +'use strict' +var log = require('npmlog') +var EventEmitter = require('events').EventEmitter +var perf = new EventEmitter() +module.exports = perf + +var timings = {} + +process.on('time', time) +process.on('timeEnd', timeEnd) + +perf.on('time', time) +perf.on('timeEnd', timeEnd) + +function time (name) { + timings[name] = Date.now() +} + +function timeEnd (name) { + if (name in timings) { + perf.emit('timing', name, Date.now() - timings[name]) + delete timings[name] + } else { + log.silly('timing', "Tried to end timer that doesn't exist:", name) + } +} diff --git a/deps/node/deps/npm/lib/utils/pick-manifest-from-registry-metadata.js b/deps/node/deps/npm/lib/utils/pick-manifest-from-registry-metadata.js new file mode 100644 index 00000000..589cef20 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/pick-manifest-from-registry-metadata.js @@ -0,0 +1,26 @@ +'use strict' +module.exports = pickManifestFromRegistryMetadata + +var log = require('npmlog') +var semver = require('semver') + +function pickManifestFromRegistryMetadata (spec, tag, versions, metadata) { + log.silly('pickManifestFromRegistryMetadata', 'spec', spec, 'tag', tag, 'versions', versions) + + // if the tagged version satisfies, then use that. + var tagged = metadata['dist-tags'][tag] + if (tagged && + metadata.versions[tagged] && + semver.satisfies(tagged, spec, true)) { + return {resolvedTo: tag, manifest: metadata.versions[tagged]} + } + // find the max satisfying version. + var ms = semver.maxSatisfying(versions, spec, true) + if (ms) { + return {resolvedTo: ms, manifest: metadata.versions[ms]} + } else if (spec === '*' && versions.length && tagged && metadata.versions[tagged]) { + return {resolvedTo: tag, manifest: metadata.versions[tagged]} + } else { + + } +} diff --git a/deps/node/deps/npm/lib/utils/pulse-till-done.js b/deps/node/deps/npm/lib/utils/pulse-till-done.js new file mode 100644 index 00000000..b292c2fa --- /dev/null +++ b/deps/node/deps/npm/lib/utils/pulse-till-done.js @@ -0,0 +1,38 @@ +'use strict' +const validate = require('aproba') +const log = require('npmlog') +const Bluebird = require('bluebird') + +let pulsers = 0 +let pulse + +function pulseStart (prefix) { + if (++pulsers > 1) return + pulse = setInterval(function () { + log.gauge.pulse(prefix) + }, 150) +} +function pulseStop () { + if (--pulsers > 0) return + clearInterval(pulse) +} + +module.exports = function (prefix, cb) { + validate('SF', [prefix, cb]) + if (!prefix) prefix = 'network' + pulseStart(prefix) + return function () { + pulseStop() + cb.apply(null, arguments) + } +} +module.exports.withPromise = pulseWhile + +function pulseWhile (prefix, promise) { + if (!promise) { + promise = prefix + prefix = '' + } + pulseStart(prefix) + return Bluebird.resolve(promise).finally(() => pulseStop()) +} diff --git a/deps/node/deps/npm/lib/utils/read-local-package.js b/deps/node/deps/npm/lib/utils/read-local-package.js new file mode 100644 index 00000000..27ca7b4e --- /dev/null +++ b/deps/node/deps/npm/lib/utils/read-local-package.js @@ -0,0 +1,12 @@ +exports = module.exports = readLocalPkg + +var npm = require('../npm.js') +var readJson = require('read-package-json') + +function readLocalPkg (cb) { + if (npm.config.get('global')) return cb() + var path = require('path') + readJson(path.resolve(npm.prefix, 'package.json'), function (er, d) { + return cb(er, d && d.name) + }) +} diff --git a/deps/node/deps/npm/lib/utils/read-user-info.js b/deps/node/deps/npm/lib/utils/read-user-info.js new file mode 100644 index 00000000..1e8c86a5 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/read-user-info.js @@ -0,0 +1,73 @@ +'use strict' +const Bluebird = require('bluebird') +const readAsync = Bluebird.promisify(require('read')) +const userValidate = require('npm-user-validate') +const log = require('npmlog') + +exports.otp = readOTP +exports.password = readPassword +exports.username = readUsername +exports.email = readEmail + +function read (opts) { + return Bluebird.try(() => { + log.clearProgress() + return readAsync(opts) + }).finally(() => { + log.showProgress() + }) +} + +function readOTP (msg, otp, isRetry) { + if (!msg) { + msg = [ + 'This command requires a one-time password (OTP) from your authenticator app.', + 'Enter one below. You can also pass one on the command line by appending --otp=123456.', + 'For more information, see:', + 'https://docs.npmjs.com/getting-started/using-two-factor-authentication', + 'Enter OTP: ' + ].join('\n') + } + if (isRetry && otp && /^[\d ]+$|^[A-Fa-f0-9]{64,64}$/.test(otp)) return otp.replace(/\s+/g, '') + + return read({prompt: msg, default: otp || ''}) + .then((otp) => readOTP(msg, otp, true)) +} + +function readPassword (msg, password, isRetry) { + if (!msg) msg = 'npm password: ' + if (isRetry && password) return password + + return read({prompt: msg, silent: true, default: password || ''}) + .then((password) => readPassword(msg, password, true)) +} + +function readUsername (msg, username, opts, isRetry) { + if (!msg) msg = 'npm username: ' + if (isRetry && username) { + const error = userValidate.username(username) + if (error) { + opts.log && opts.log.warn(error.message) + } else { + return Promise.resolve(username.trim()) + } + } + + return read({prompt: msg, default: username || ''}) + .then((username) => readUsername(msg, username, opts, true)) +} + +function readEmail (msg, email, opts, isRetry) { + if (!msg) msg = 'email (this IS public): ' + if (isRetry && email) { + const error = userValidate.email(email) + if (error) { + opts.log && opts.log.warn(error.message) + } else { + return email.trim() + } + } + + return read({prompt: msg, default: email || ''}) + .then((username) => readEmail(msg, username, opts, true)) +} diff --git a/deps/node/deps/npm/lib/utils/save-stack.js b/deps/node/deps/npm/lib/utils/save-stack.js new file mode 100644 index 00000000..42c4aab5 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/save-stack.js @@ -0,0 +1,16 @@ +'use strict' +var inherits = require('inherits') + +module.exports = SaveStack + +function SaveStack (fn) { + Error.call(this) + Error.captureStackTrace(this, fn || SaveStack) +} +inherits(SaveStack, Error) + +SaveStack.prototype.completeWith = function (er) { + this['__' + 'proto' + '__'] = er + this.stack = this.stack + '\n\n' + er.stack + return this +} diff --git a/deps/node/deps/npm/lib/utils/spawn.js b/deps/node/deps/npm/lib/utils/spawn.js new file mode 100644 index 00000000..b164a6ac --- /dev/null +++ b/deps/node/deps/npm/lib/utils/spawn.js @@ -0,0 +1,50 @@ +module.exports = spawn + +var _spawn = require('child_process').spawn +var EventEmitter = require('events').EventEmitter +var npwr = require('./no-progress-while-running.js') + +function willCmdOutput (stdio) { + if (stdio === 'inherit') return true + if (!Array.isArray(stdio)) return false + for (var fh = 1; fh <= 2; ++fh) { + if (stdio[fh] === 'inherit') return true + if (stdio[fh] === 1 || stdio[fh] === 2) return true + } + return false +} + +function spawn (cmd, args, options) { + var cmdWillOutput = willCmdOutput(options && options.stdio) + + if (cmdWillOutput) npwr.startRunning() + var raw = _spawn(cmd, args, options) + var cooked = new EventEmitter() + + raw.on('error', function (er) { + if (cmdWillOutput) npwr.stopRunning() + er.file = cmd + cooked.emit('error', er) + }).on('close', function (code, signal) { + if (cmdWillOutput) npwr.stopRunning() + // Create ENOENT error because Node.js v0.8 will not emit + // an `error` event if the command could not be found. + if (code === 127) { + var er = new Error('spawn ENOENT') + er.code = 'ENOENT' + er.errno = 'ENOENT' + er.syscall = 'spawn' + er.file = cmd + cooked.emit('error', er) + } else { + cooked.emit('close', code, signal) + } + }) + + cooked.stdin = raw.stdin + cooked.stdout = raw.stdout + cooked.stderr = raw.stderr + cooked.kill = function (sig) { return raw.kill(sig) } + + return cooked +} diff --git a/deps/node/deps/npm/lib/utils/temp-filename.js b/deps/node/deps/npm/lib/utils/temp-filename.js new file mode 100644 index 00000000..6b8245e8 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/temp-filename.js @@ -0,0 +1,7 @@ +'use strict' +var uniqueFilename = require('unique-filename') +var npm = require('../npm.js') + +module.exports = function (prefix) { + return uniqueFilename(npm.tmp, prefix) +} diff --git a/deps/node/deps/npm/lib/utils/umask.js b/deps/node/deps/npm/lib/utils/umask.js new file mode 100644 index 00000000..2dde1bef --- /dev/null +++ b/deps/node/deps/npm/lib/utils/umask.js @@ -0,0 +1,17 @@ +var umask = require('umask') +var npmlog = require('npmlog') +var _fromString = umask.fromString + +module.exports = umask + +// fromString with logging callback +umask.fromString = function (val) { + _fromString(val, function (err, result) { + if (err) { + npmlog.warn('invalid umask', err.message) + } + val = result + }) + + return val +} diff --git a/deps/node/deps/npm/lib/utils/unix-format-path.js b/deps/node/deps/npm/lib/utils/unix-format-path.js new file mode 100644 index 00000000..a82cd713 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/unix-format-path.js @@ -0,0 +1,5 @@ +'use strict' + +module.exports = function (path) { + return path.replace(/\\/g, '/') +} diff --git a/deps/node/deps/npm/lib/utils/unsupported.js b/deps/node/deps/npm/lib/utils/unsupported.js new file mode 100644 index 00000000..bfed5cdb --- /dev/null +++ b/deps/node/deps/npm/lib/utils/unsupported.js @@ -0,0 +1,53 @@ +'use strict' +var semver = require('semver') +var supportedNode = [ + {ver: '6', min: '6.0.0'}, + {ver: '8', min: '8.0.0'}, + {ver: '9', min: '9.0.0'}, + {ver: '10', min: '10.0.0'}, + {ver: '11', min: '11.0.0'}, + {ver: '12', min: '12.0.0'} +] +var knownBroken = '<4.7.0' + +var checkVersion = exports.checkVersion = function (version) { + var versionNoPrerelease = version.replace(/-.*$/, '') + return { + version: versionNoPrerelease, + broken: semver.satisfies(versionNoPrerelease, knownBroken), + unsupported: !semver.satisfies(versionNoPrerelease, supportedNode.map(function (n) { return '^' + n.min }).join('||')) + } +} + +exports.checkForBrokenNode = function () { + var nodejs = checkVersion(process.version) + if (nodejs.broken) { + console.error('ERROR: npm is known not to run on Node.js ' + process.version) + supportedNode.forEach(function (rel) { + if (semver.satisfies(nodejs.version, rel.ver)) { + console.error('Node.js ' + rel.ver + " is supported but the specific version you're running has") + console.error('a bug known to break npm. Please update to at least ' + rel.min + ' to use this') + console.error('version of npm. You can find the latest release of Node.js at https://nodejs.org/') + process.exit(1) + } + }) + var supportedMajors = supportedNode.map(function (n) { return n.ver }).join(', ') + console.error("You'll need to upgrade to a newer version in order to use this") + console.error('version of npm. Supported versions are ' + supportedMajors + '. You can find the') + console.error('latest version at https://nodejs.org/') + process.exit(1) + } +} + +exports.checkForUnsupportedNode = function () { + var nodejs = checkVersion(process.version) + if (nodejs.unsupported) { + var log = require('npmlog') + var supportedMajors = supportedNode.map(function (n) { return n.ver }).join(', ') + log.warn('npm', 'npm does not support Node.js ' + process.version) + log.warn('npm', 'You should probably upgrade to a newer version of node as we') + log.warn('npm', "can't make any promises that npm will work with this version.") + log.warn('npm', 'Supported releases of Node.js are the latest release of ' + supportedMajors + '.') + log.warn('npm', 'You can find the latest version at https://nodejs.org/') + } +} diff --git a/deps/node/deps/npm/lib/utils/usage.js b/deps/node/deps/npm/lib/utils/usage.js new file mode 100644 index 00000000..ba069e64 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/usage.js @@ -0,0 +1,27 @@ +'use strict' +var aliases = require('../config/cmd-list').aliases + +module.exports = function usage (cmd, txt, opt) { + var post = Object.keys(aliases).reduce(function (p, c) { + var val = aliases[c] + if (val !== cmd) return p + return p.concat(c) + }, []) + + if (opt || post.length > 0) txt += '\n\n' + + if (post.length === 1) { + txt += 'alias: ' + txt += post.join(', ') + } else if (post.length > 1) { + txt += 'aliases: ' + txt += post.join(', ') + } + + if (opt) { + if (post.length > 0) txt += '\n' + txt += 'common options: ' + opt + } + + return txt +} diff --git a/deps/node/deps/npm/lib/utils/warn-deprecated.js b/deps/node/deps/npm/lib/utils/warn-deprecated.js new file mode 100644 index 00000000..fe5c5ec8 --- /dev/null +++ b/deps/node/deps/npm/lib/utils/warn-deprecated.js @@ -0,0 +1,23 @@ +module.exports = warnDeprecated + +var log = require('npmlog') + +var deprecations = {} + +function warnDeprecated (type) { + return function warn (messages, instance) { + if (!instance) { + if (!deprecations[type]) { + deprecations[type] = {} + messages.forEach(function (m) { log.warn(type, m) }) + } + } else { + if (!deprecations[type]) deprecations[type] = {} + + if (!deprecations[type][instance]) { + deprecations[type][instance] = true + messages.forEach(function (m) { log.warn(type, m) }) + } + } + } +} |