| // 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) |
| } |