process: move setup of process warnings into node.js
To clarify the side effects and conditions of the warning setup during bootstrap. PR-URL: https://github.com/nodejs/node/pull/25263 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Minwoo Jung <minwoo@nodesource.com>
This commit is contained in:
parent
d28980c464
commit
0878b6172e
@ -107,7 +107,15 @@ function startup() {
|
||||
process.exit = wrapped.exit;
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -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)}`;
|
||||
}
|
||||
|
||||
// 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));
|
||||
};
|
||||
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])
|
||||
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
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user