diff options
author | Ruben Bridgewater <ruben@bridgewater.de> | 2018-01-16 13:20:13 +0100 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2018-01-24 13:07:35 +0100 |
commit | bb9cedb0f07c4f74cada172845f2aea197efa456 (patch) | |
tree | 9e9c47a1d27e30149336b6102fe67f662fff25c4 /lib/tty.js | |
parent | 19bff313be3fc2a6f4f91fcfc7369c74ace33984 (diff) | |
download | android-node-v8-bb9cedb0f07c4f74cada172845f2aea197efa456.tar.gz android-node-v8-bb9cedb0f07c4f74cada172845f2aea197efa456.tar.bz2 android-node-v8-bb9cedb0f07c4f74cada172845f2aea197efa456.zip |
tty: add getColorDepth function
Right now it is very difficult to determine if a terminal supports
colors or not. This function adds this functionality by detecting
environment variables and checking process.
PR-URL: https://github.com/nodejs/node/pull/17615
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'lib/tty.js')
-rw-r--r-- | lib/tty.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/tty.js b/lib/tty.js index 2a62fcb859..dc3e2fcf82 100644 --- a/lib/tty.js +++ b/lib/tty.js @@ -28,6 +28,14 @@ const { inherits } = util; const errnoException = util._errnoException; const errors = require('internal/errors'); const readline = require('readline'); +const { release } = require('os'); + +const OSRelease = release().split('.'); + +const COLORS_2 = 1; +const COLORS_16 = 4; +const COLORS_256 = 8; +const COLORS_16m = 24; function isatty(fd) { return Number.isInteger(fd) && fd >= 0 && isTTY(fd); @@ -104,6 +112,70 @@ inherits(WriteStream, net.Socket); WriteStream.prototype.isTTY = true; +WriteStream.prototype.getColorDepth = function(env = process.env) { + if (env.NODE_DISABLE_COLORS || env.TERM === 'dumb' && !env.COLORTERM) { + return COLORS_2; + } + + if (process.platform === 'win32') { + // Windows 10 build 10586 is the first Windows release that supports 256 + // colors. Windows 10 build 14931 is the first release that supports + // 16m/TrueColor. + if (+OSRelease[0] >= 10) { + const build = +OSRelease[2]; + if (build >= 14931) + return COLORS_16m; + if (build >= 10586) + return COLORS_256; + } + + return COLORS_16; + } + + if (env.TMUX) { + return COLORS_256; + } + + if (env.CI) { + if ('TRAVIS' in env || 'CIRCLECI' in env || 'APPVEYOR' in env || + 'GITLAB_CI' in env || env.CI_NAME === 'codeship') { + return COLORS_256; + } + return COLORS_2; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? + COLORS_16 : COLORS_2; + } + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + if (!env.TERM_PROGRAM_VERSION || + /^[0-2]\./.test(env.TERM_PROGRAM_VERSION)) { + return COLORS_256; + } + return COLORS_16m; + case 'HyperTerm': + case 'Hyper': + case 'MacTerm': + return COLORS_16m; + case 'Apple_Terminal': + return COLORS_256; + } + + if (env.TERM) { + if (/^xterm-256/.test(env.TERM)) + return COLORS_256; + if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(env.TERM)) + return COLORS_16; + } + + if (env.COLORTERM) + return COLORS_16; + + return COLORS_2; +}; WriteStream.prototype._refreshSize = function() { var oldCols = this.columns; |