'use strict'; const binding = process.binding('util'); const prefix = `(${process.release.name}:${process.pid}) `; exports.getHiddenValue = binding.getHiddenValue; // All the internal deprecations have to use this function only, as this will // prepend the prefix to the actual message. exports.deprecate = function(fn, msg) { return exports._deprecate(fn, `${prefix}${msg}`); }; // All the internal deprecations have to use this function only, as this will // prepend the prefix to the actual message. exports.printDeprecationMessage = function(msg, warned) { return exports._printDeprecationMessage(`${prefix}${msg}`, warned); }; exports.error = function(msg) { console.error(`${prefix}${msg}`); }; exports.trace = function(msg) { console.trace(`${prefix}${msg}`); }; exports._printDeprecationMessage = function(msg, warned) { if (process.noDeprecation) return true; if (warned) return warned; if (process.throwDeprecation) throw new Error(msg); else if (process.traceDeprecation) console.trace(msg.startsWith(prefix) ? msg.replace(prefix, '') : msg); else console.error(msg); return true; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports._deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (global.process === undefined) { return function() { return exports._deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { warned = exports._printDeprecationMessage(msg, warned); return fn.apply(this, arguments); } return deprecated; }; exports.decorateErrorStack = function decorateErrorStack(err) { if (!(exports.isError(err) && err.stack)) return; const arrow = exports.getHiddenValue(err, 'arrowMessage'); if (arrow) err.stack = arrow + err.stack; }; exports.isError = function isError(e) { return exports.objectToString(e) === '[object Error]' || e instanceof Error; }; exports.objectToString = function objectToString(o) { return Object.prototype.toString.call(o); };