diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 5bf2dc523f6fd1..f0573aa57a7e90 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -100,7 +100,15 @@ function startup() { wrapped.hasUncaughtExceptionCaptureCallback; } - NativeModule.require('internal/process/warning').setup(); + const { + onWarning, + emitWarning + } = NativeModule.require('internal/process/warning'); + if (!process.noProcessWarnings && process.env.NODE_NO_WARNINGS !== '1') { + process.on('warning', onWarning); + } + process.emitWarning = emitWarning; + const { nextTick, runNextTicks diff --git a/lib/internal/process/warning.js b/lib/internal/process/warning.js index 4d606b938949cf..2052ecf7075f6c 100644 --- a/lib/internal/process/warning.js +++ b/lib/internal/process/warning.js @@ -3,8 +3,6 @@ const prefix = `(${process.release.name}:${process.pid}) `; const { ERR_INVALID_ARG_TYPE } = require('internal/errors').codes; -exports.setup = setupProcessWarnings; - // Lazily loaded let fs; let fd; @@ -51,83 +49,84 @@ function doEmitWarning(warning) { return () => process.emit('warning', warning); } -function setupProcessWarnings() { - if (!process.noProcessWarnings && process.env.NODE_NO_WARNINGS !== '1') { - process.on('warning', (warning) => { - if (!(warning instanceof Error)) return; - const isDeprecation = warning.name === 'DeprecationWarning'; - if (isDeprecation && process.noDeprecation) return; - const trace = process.traceProcessWarnings || - (isDeprecation && process.traceDeprecation); - var msg = prefix; - if (warning.code) - msg += `[${warning.code}] `; - if (trace && warning.stack) { - msg += `${warning.stack}`; - } else { - const toString = - typeof warning.toString === 'function' ? - warning.toString : Error.prototype.toString; - msg += `${toString.apply(warning)}`; - } - if (typeof warning.detail === 'string') { - msg += `\n${warning.detail}`; - } - const warningFile = lazyOption(); - if (warningFile) { - return writeToFile(msg); - } - writeOut(msg); - }); +function onWarning(warning) { + if (!(warning instanceof Error)) return; + const isDeprecation = warning.name === 'DeprecationWarning'; + if (isDeprecation && process.noDeprecation) return; + const trace = process.traceProcessWarnings || + (isDeprecation && process.traceDeprecation); + var msg = prefix; + if (warning.code) + msg += `[${warning.code}] `; + if (trace && warning.stack) { + msg += `${warning.stack}`; + } else { + const toString = + typeof warning.toString === 'function' ? + warning.toString : Error.prototype.toString; + msg += `${toString.apply(warning)}`; + } + if (typeof warning.detail === 'string') { + msg += `\n${warning.detail}`; + } + const warningFile = lazyOption(); + if (warningFile) { + return writeToFile(msg); } + writeOut(msg); +} - // process.emitWarning(error) - // process.emitWarning(str[, type[, code]][, ctor]) - // process.emitWarning(str[, options]) - process.emitWarning = (warning, type, code, ctor, now) => { - let detail; - if (type !== null && typeof type === 'object' && !Array.isArray(type)) { - ctor = type.ctor; - code = type.code; - if (typeof type.detail === 'string') - detail = type.detail; - type = type.type || 'Warning'; - } else if (typeof type === 'function') { - ctor = type; - code = undefined; - type = 'Warning'; - } - if (type !== undefined && typeof type !== 'string') { - throw new ERR_INVALID_ARG_TYPE('type', 'string', type); - } - if (typeof code === 'function') { - ctor = code; - code = undefined; - } else if (code !== undefined && typeof code !== 'string') { - throw new ERR_INVALID_ARG_TYPE('code', 'string', code); - } - if (typeof warning === 'string') { - // Improve error creation performance by skipping the error frames. - // They are added in the `captureStackTrace()` function below. - const tmpStackLimit = Error.stackTraceLimit; - Error.stackTraceLimit = 0; - // eslint-disable-next-line no-restricted-syntax - warning = new Error(warning); - Error.stackTraceLimit = tmpStackLimit; - warning.name = String(type || 'Warning'); - if (code !== undefined) warning.code = code; - if (detail !== undefined) warning.detail = detail; - Error.captureStackTrace(warning, ctor || process.emitWarning); - } else if (!(warning instanceof Error)) { - throw new ERR_INVALID_ARG_TYPE('warning', ['Error', 'string'], warning); - } - if (warning.name === 'DeprecationWarning') { - if (process.noDeprecation) - return; - if (process.throwDeprecation) - throw warning; - } - if (now) process.emit('warning', warning); - else process.nextTick(doEmitWarning(warning)); - }; +// process.emitWarning(error) +// process.emitWarning(str[, type[, code]][, ctor]) +// process.emitWarning(str[, options]) +function emitWarning(warning, type, code, ctor, now) { + let detail; + if (type !== null && typeof type === 'object' && !Array.isArray(type)) { + ctor = type.ctor; + code = type.code; + if (typeof type.detail === 'string') + detail = type.detail; + type = type.type || 'Warning'; + } else if (typeof type === 'function') { + ctor = type; + code = undefined; + type = 'Warning'; + } + if (type !== undefined && typeof type !== 'string') { + throw new ERR_INVALID_ARG_TYPE('type', 'string', type); + } + if (typeof code === 'function') { + ctor = code; + code = undefined; + } else if (code !== undefined && typeof code !== 'string') { + throw new ERR_INVALID_ARG_TYPE('code', 'string', code); + } + if (typeof warning === 'string') { + // Improve error creation performance by skipping the error frames. + // They are added in the `captureStackTrace()` function below. + const tmpStackLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + // eslint-disable-next-line no-restricted-syntax + warning = new Error(warning); + Error.stackTraceLimit = tmpStackLimit; + warning.name = String(type || 'Warning'); + if (code !== undefined) warning.code = code; + if (detail !== undefined) warning.detail = detail; + Error.captureStackTrace(warning, ctor || process.emitWarning); + } else if (!(warning instanceof Error)) { + throw new ERR_INVALID_ARG_TYPE('warning', ['Error', 'string'], warning); + } + if (warning.name === 'DeprecationWarning') { + if (process.noDeprecation) + return; + if (process.throwDeprecation) + throw warning; + } + if (now) process.emit('warning', warning); + else process.nextTick(doEmitWarning(warning)); } + +module.exports = { + onWarning, + emitWarning +};