diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 2a162f14b24206..24c34da3b80c28 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -674,15 +674,31 @@ const fatalExceptionStackEnhancers = { }, afterInspector(error) { const originalStack = error.stack; + let useColors = true; + // Some consoles do not convert ANSI escape sequences to colors, + // rather display them directly to the stdout. On those consoles, + // libuv emulates colors by intercepting stdout stream and calling + // corresponding Windows API functions for setting console colors. + // However, fatal error are handled differently and we cannot easily + // highlight them. On Windows, detecting whether a console supports + // ANSI escape sequences is not reliable. + if (process.platform === 'win32') { + const info = internalBinding('os').getOSInformation(); + const ver = info[2].split('.').map((a) => +a); + if (ver[0] !== 10 || ver[2] < 14393) { + useColors = false; + } + } const { inspect, inspectDefaultOptions: { colors: defaultColors } } = lazyInternalUtilInspect(); - const colors = (internalBinding('util').guessHandleType(2) === 'TTY' && + const colors = useColors && + ((internalBinding('util').guessHandleType(2) === 'TTY' && require('internal/tty').hasColors()) || - defaultColors; + defaultColors); try { return inspect(error, { colors }); } catch {