// call it on itself so we can test the export val for basic stuff module.exports = colorSupport({ alwaysReturn: true }, colorSupport) function hasNone (obj, options) { obj.level = 0 obj.hasBasic = false obj.has256 = false obj.has16m = false if (!options.alwaysReturn) { return false } return obj } function hasBasic (obj) { obj.hasBasic = true obj.has256 = false obj.has16m = false obj.level = 1 return obj } function has256 (obj) { obj.hasBasic = true obj.has256 = true obj.has16m = false obj.level = 2 return obj } function has16m (obj) { obj.hasBasic = true obj.has256 = true obj.has16m = true obj.level = 3 return obj } function colorSupport (options, obj) { options = options || {} obj = obj || {} // if just requesting a specific level, then return that. if (typeof options.level === 'number') { switch (options.level) { case 0: return hasNone(obj, options) case 1: return hasBasic(obj) case 2: return has256(obj) case 3: return has16m(obj) } } obj.level = 0 obj.hasBasic = false obj.has256 = false obj.has16m = false if (typeof process === 'undefined' || !process || !process.stdout || !process.env || !process.platform) { return hasNone(obj, options) } var env = options.env || process.env var stream = options.stream || process.stdout var term = options.term || env.TERM || '' var platform = options.platform || process.platform if (!options.ignoreTTY && !stream.isTTY) { return hasNone(obj, options) } if (!options.ignoreDumb && term === 'dumb' && !env.COLORTERM) { return hasNone(obj, options) } if (platform === 'win32') { return hasBasic(obj) } if (env.TMUX) { return has256(obj) } if (!options.ignoreCI && (env.CI || env.TEAMCITY_VERSION)) { if (env.TRAVIS) { return has256(obj) } else { return hasNone(obj, options) } } // TODO: add more term programs switch (env.TERM_PROGRAM) { case 'iTerm.app': var ver = env.TERM_PROGRAM_VERSION || '0.' if (/^[0-2]\./.test(ver)) { return has256(obj) } else { return has16m(obj) } case 'HyperTerm': case 'Hyper': return has16m(obj) case 'MacTerm': return has16m(obj) case 'Apple_Terminal': return has256(obj) } if (/^xterm-256/.test(term)) { return has256(obj) } if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(term)) { return hasBasic(obj) } if (env.COLORTERM) { return hasBasic(obj) } return hasNone(obj, options) }