blob: 6b6f3b2819424352b79df563d36070815be1db52 [file] [log] [blame]
// 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)
}