'use strict' const ansiTrim = require('./utils/ansi-trim') const chain = require('slide').chain const color = require('ansicolors') const defaultRegistry = require('./config/defaults').defaults.registry const log = require('npmlog') const npm = require('./npm') const output = require('./utils/output') const path = require('path') const semver = require('semver') const styles = require('ansistyles') const table = require('text-table') // steps const checkFilesPermission = require('./doctor/check-files-permission') const checkPing = require('./doctor/check-ping') const getGitPath = require('./doctor/get-git-path') const getLatestNodejsVersion = require('./doctor/get-latest-nodejs-version') const getLatestNpmVersion = require('./doctor/get-latest-npm-version') const verifyCachedFiles = require('./doctor/verify-cached-files') const globalNodeModules = path.join(npm.config.globalPrefix, 'lib', 'node_modules') const localNodeModules = path.join(npm.config.localPrefix, 'node_modules') module.exports = doctor doctor.usage = 'npm doctor' function doctor (args, silent, cb) { args = args || {} if (typeof cb !== 'function') { cb = silent silent = false } const actionsToRun = [ [checkPing], [getLatestNpmVersion], [getLatestNodejsVersion, args['node-url']], [getGitPath], [checkFilesPermission, npm.cache, 4, 6], [checkFilesPermission, globalNodeModules, 4, 4], [checkFilesPermission, localNodeModules, 6, 6], [verifyCachedFiles, path.join(npm.cache, '_cacache')] ] log.info('doctor', 'Running checkup') chain(actionsToRun, function (stderr, stdout) { if (stderr && stderr.message !== 'not found: git') return cb(stderr) const list = makePretty(stdout) let outHead = ['Check', 'Value', 'Recommendation'] let outBody = list if (npm.color) { outHead = outHead.map(function (item) { return styles.underline(item) }) outBody = outBody.map(function (item) { if (item[2]) { item[0] = color.red(item[0]) item[2] = color.magenta(item[2]) } return item }) } const outTable = [outHead].concat(outBody) const tableOpts = { stringLength: function (s) { return ansiTrim(s).length } } if (!silent) output(table(outTable, tableOpts)) cb(null, list) }) } function makePretty (p) { const ping = p[1] const npmLTS = p[2] const nodeLTS = p[3].replace('v', '') const whichGit = p[4] || 'not installed' const readbleCaches = p[5] ? 'ok' : 'notOk' const executableGlobalModules = p[6] ? 'ok' : 'notOk' const executableLocalModules = p[7] ? 'ok' : 'notOk' const cacheStatus = p[8] ? `verified ${p[8].verifiedContent} tarballs` : 'notOk' const npmV = npm.version const nodeV = process.version.replace('v', '') const registry = npm.config.get('registry') || '' const list = [ ['npm ping', ping], ['npm -v', 'v' + npmV], ['node -v', 'v' + nodeV], ['npm config get registry', registry], ['which git', whichGit], ['Perms check on cached files', readbleCaches], ['Perms check on global node_modules', executableGlobalModules], ['Perms check on local node_modules', executableLocalModules], ['Verify cache contents', cacheStatus] ] if (p[0] !== 200) list[0][2] = 'Check your internet connection' if (!semver.satisfies(npmV, '>=' + npmLTS)) list[1][2] = 'Use npm v' + npmLTS if (!semver.satisfies(nodeV, '>=' + nodeLTS)) list[2][2] = 'Use node v' + nodeLTS if (registry !== defaultRegistry) list[3][2] = 'Try `npm config set registry ' + defaultRegistry + '`' if (whichGit === 'not installed') list[4][2] = 'Install git and ensure it\'s in your PATH.' if (readbleCaches !== 'ok') list[5][2] = 'Check the permissions of your files in ' + npm.config.get('cache') if (executableGlobalModules !== 'ok') list[6][2] = globalNodeModules + ' must be readable and writable by the current user.' if (executableLocalModules !== 'ok') list[7][2] = localNodeModules + ' must be readable and writable by the current user.' return list }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
auth | Folder | 0755 |
|
|
config | Folder | 0755 |
|
|
doctor | Folder | 0755 |
|
|
install | Folder | 0755 |
|
|
search | Folder | 0755 |
|
|
utils | Folder | 0755 |
|
|
access.js | File | 5.54 KB | 0644 |
|
adduser.js | File | 1.31 KB | 0644 |
|
audit.js | File | 10.56 KB | 0644 |
|
bin.js | File | 515 B | 0644 |
|
bugs.js | File | 864 B | 0644 |
|
build.js | File | 4.44 KB | 0644 |
|
cache.js | File | 4.66 KB | 0644 |
|
ci.js | File | 1.31 KB | 0644 |
|
completion.js | File | 7.11 KB | 0644 |
|
config.js | File | 7.43 KB | 0644 |
|
dedupe.js | File | 4.88 KB | 0644 |
|
deprecate.js | File | 2.11 KB | 0644 |
|
dist-tag.js | File | 4.11 KB | 0644 |
|
docs.js | File | 1.04 KB | 0644 |
|
doctor.js | File | 3.98 KB | 0644 |
|
edit.js | File | 1.37 KB | 0644 |
|
explore.js | File | 1.67 KB | 0644 |
|
fetch-package-metadata.js | File | 3.97 KB | 0644 |
|
fetch-package-metadata.md | File | 1.77 KB | 0644 |
|
fund.js | File | 4.91 KB | 0644 |
|
get.js | File | 235 B | 0644 |
|
help-search.js | File | 5.64 KB | 0644 |
|
help.js | File | 6.35 KB | 0644 |
|
hook.js | File | 4.62 KB | 0644 |
|
init.js | File | 2.74 KB | 0644 |
|
install-ci-test.js | File | 486 B | 0644 |
|
install-test.js | File | 507 B | 0644 |
|
install.js | File | 36.47 KB | 0644 |
|
link.js | File | 5.6 KB | 0644 |
|
logout.js | File | 1.26 KB | 0644 |
|
ls.js | File | 16.09 KB | 0644 |
|
npm.js | File | 14.37 KB | 0644 |
|
org.js | File | 4.18 KB | 0644 |
|
outdated.js | File | 12.28 KB | 0644 |
|
owner.js | File | 6.6 KB | 0644 |
|
pack.js | File | 11.79 KB | 0644 |
|
ping.js | File | 1.11 KB | 0644 |
|
prefix.js | File | 330 B | 0644 |
|
profile.js | File | 11.13 KB | 0644 |
|
prune.js | File | 2.23 KB | 0644 |
|
publish.js | File | 5.14 KB | 0644 |
|
rebuild.js | File | 2.09 KB | 0644 |
|
repo.js | File | 1.44 KB | 0644 |
|
restart.js | File | 64 B | 0644 |
|
root.js | File | 320 B | 0644 |
|
run-script.js | File | 5.41 KB | 0644 |
|
search.js | File | 3.36 KB | 0644 |
|
set.js | File | 276 B | 0644 |
|
shrinkwrap.js | File | 9.82 KB | 0644 |
|
star.js | File | 2.11 KB | 0644 |
|
stars.js | File | 1.03 KB | 0644 |
|
start.js | File | 62 B | 0644 |
|
stop.js | File | 61 B | 0644 |
|
substack.js | File | 509 B | 0644 |
|
team.js | File | 4.61 KB | 0644 |
|
test.js | File | 374 B | 0644 |
|
token.js | File | 6.66 KB | 0644 |
|
unbuild.js | File | 4.27 KB | 0644 |
|
uninstall.js | File | 2.21 KB | 0644 |
|
unpublish.js | File | 3.51 KB | 0644 |
|
update.js | File | 2.16 KB | 0644 |
|
version.js | File | 9.79 KB | 0644 |
|
view.js | File | 15.11 KB | 0644 |
|
visnup.js | File | 4.01 KB | 0644 |
|
whoami.js | File | 1.77 KB | 0644 |
|
xmas.js | File | 1.62 KB | 0644 |
|