diff --git a/lib/internal/repl.js b/lib/internal/repl.js index b2c74e179c59d0..c1beb85cefd795 100644 --- a/lib/internal/repl.js +++ b/lib/internal/repl.js @@ -34,7 +34,10 @@ function createRepl(env, opts, cb) { if (parseInt(env.NODE_NO_READLINE)) { opts.terminal = false; } - if (parseInt(env.NODE_DISABLE_COLORS)) { + // the "dumb" special terminal, as defined by terminfo, doesn't support + // ANSI colour control codes. + // see http://invisible-island.net/ncurses/terminfo.ti.html#toc-_Specials + if (parseInt(env.NODE_DISABLE_COLORS) || env.TERM === 'dumb') { opts.useColors = false; } diff --git a/test/parallel/test-repl-envvars.js b/test/parallel/test-repl-envvars.js new file mode 100644 index 00000000000000..6073144085843d --- /dev/null +++ b/test/parallel/test-repl-envvars.js @@ -0,0 +1,55 @@ +'use strict'; + +// Flags: --expose-internals + +const common = require('../common'); +const stream = require('stream'); +const REPL = require('internal/repl'); +const assert = require('assert'); +const inspect = require('util').inspect; + +const tests = [{ + env: {}, + expected: { terminal: true, useColors: true } +}, +{ + env: { NODE_DISABLE_COLORS: '1' }, + expected: { terminal: true, useColors: false } +}, +{ + env: { NODE_NO_READLINE: '1' }, + expected: { terminal: false, useColors: false } +}, +{ + env: { TERM: 'dumb' }, + expected: { terminal: true, useColors: false } +}, +{ + env: { NODE_NO_READLINE: '1', NODE_DISABLE_COLORS: '1' }, + expected: { terminal: false, useColors: false } +}, +{ + env: { NODE_NO_READLINE: '0' }, + expected: { terminal: true, useColors: true } +}]; + +function run(test) { + const env = test.env; + const expected = test.expected; + const opts = { + terminal: true, + input: new stream.Readable({ read() {} }), + output: new stream.Writable({ write() {} }) + }; + + REPL.createInternalRepl(env, opts, function(err, repl) { + if (err) throw err; + assert.equal(expected.terminal, repl.terminal, + 'Expected ' + inspect(expected) + ' with ' + inspect(env)); + assert.equal(expected.useColors, repl.useColors, + 'Expected ' + inspect(expected) + ' with ' + inspect(env)); + repl.close(); + }); +} + +tests.forEach(run);