const { inspect } = require('util') const npmlog = require('npmlog') const log = require('./log-shim.js') const { explain } = require('./explain-eresolve.js') const _logHandler = Symbol('logHandler') const _eresolveWarn = Symbol('eresolveWarn') const _log = Symbol('log') const _npmlog = Symbol('npmlog') class Display { constructor () { // pause by default until config is loaded this.on() log.pause() } on () { process.on('log', this[_logHandler]) } off () { process.off('log', this[_logHandler]) // Unbalanced calls to enable/disable progress // will leave change listeners on the tracker // This pretty much only happens in tests but // this removes the event emitter listener warnings log.tracker.removeAllListeners() } load (config) { const { color, timing, loglevel, unicode, progress, silent, heading = 'npm', } = config // XXX: decouple timing from loglevel if (timing && loglevel === 'notice') { log.level = 'timing' } else { log.level = loglevel } log.heading = heading if (color) { log.enableColor() } else { log.disableColor() } if (unicode) { log.enableUnicode() } else { log.disableUnicode() } // if it's silent, don't show progress if (progress && !silent) { log.enableProgress() } else { log.disableProgress() } // Resume displaying logs now that we have config log.resume() } log (...args) { this[_logHandler](...args) } [_logHandler] = (level, ...args) => { try { this[_log](level, ...args) } catch (ex) { try { // if it crashed once, it might again! this[_npmlog]('verbose', `attempt to log ${inspect(args)} crashed`, ex) } catch (ex2) { // eslint-disable-next-line no-console console.error(`attempt to log ${inspect(args)} crashed`, ex, ex2) } } } [_log] (...args) { return this[_eresolveWarn](...args) || this[_npmlog](...args) } // Explicitly call these on npmlog and not log shim // This is the final place we should call npmlog before removing it. [_npmlog] (level, ...args) { npmlog[level](...args) } // Also (and this is a really inexcusable kludge), we patch the // log.warn() method so that when we see a peerDep override // explanation from Arborist, we can replace the object with a // highly abbreviated explanation of what's being overridden. [_eresolveWarn] (level, heading, message, expl) { if (level === 'warn' && heading === 'ERESOLVE' && expl && typeof expl === 'object' ) { this[_npmlog](level, heading, message) this[_npmlog](level, '', explain(expl, log.useColor(), 2)) // Return true to short circuit other log in chain return true } } } module.exports = Display
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
completion | Folder | 0755 |
|
|
config | Folder | 0755 |
|
|
ansi-trim.js | File | 173 B | 0644 |
|
audit-error.js | File | 978 B | 0644 |
|
cmd-list.js | File | 2.46 KB | 0644 |
|
completion.sh | File | 1.85 KB | 0755 |
|
did-you-mean.js | File | 1.46 KB | 0644 |
|
display.js | File | 2.84 KB | 0644 |
|
error-message.js | File | 12.64 KB | 0644 |
|
exit-handler.js | File | 6.77 KB | 0644 |
|
explain-dep.js | File | 3.73 KB | 0644 |
|
explain-eresolve.js | File | 2.56 KB | 0644 |
|
format-bytes.js | File | 629 B | 0644 |
|
format-search-stream.js | File | 3.93 KB | 0644 |
|
get-identity.js | File | 740 B | 0644 |
|
is-windows.js | File | 233 B | 0644 |
|
log-file.js | File | 7.64 KB | 0644 |
|
log-shim.js | File | 1.68 KB | 0644 |
|
npm-usage.js | File | 1.95 KB | 0644 |
|
open-url-prompt.js | File | 1.54 KB | 0644 |
|
open-url.js | File | 1.17 KB | 0644 |
|
otplease.js | File | 1.23 KB | 0644 |
|
ping.js | File | 252 B | 0644 |
|
pulse-till-done.js | File | 412 B | 0644 |
|
queryable.js | File | 9.58 KB | 0644 |
|
read-user-info.js | File | 1.99 KB | 0644 |
|
reify-finish.js | File | 876 B | 0644 |
|
reify-output.js | File | 4.96 KB | 0644 |
|
replace-info.js | File | 807 B | 0644 |
|
tar.js | File | 3.73 KB | 0644 |
|
timers.js | File | 3.18 KB | 0644 |
|
update-notifier.js | File | 4.45 KB | 0644 |
|
validate-lockfile.js | File | 1023 B | 0644 |
|
web-auth.js | File | 558 B | 0644 |
|