summaryrefslogtreecommitdiff
path: root/lib/tty.js
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2018-01-16 13:20:13 +0100
committerRuben Bridgewater <ruben@bridgewater.de>2018-01-24 13:07:35 +0100
commitbb9cedb0f07c4f74cada172845f2aea197efa456 (patch)
tree9e9c47a1d27e30149336b6102fe67f662fff25c4 /lib/tty.js
parent19bff313be3fc2a6f4f91fcfc7369c74ace33984 (diff)
downloadandroid-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.js72
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;