| 'use strict'; |
| const os = require('os'); |
| const hasFlag = require('has-flag'); |
| |
| const env = process.env; |
| |
| const support = level => { |
| if (level === 0) { |
| return false; |
| } |
| |
| return { |
| level, |
| hasBasic: true, |
| has256: level >= 2, |
| has16m: level >= 3 |
| }; |
| }; |
| |
| let supportLevel = (() => { |
| if (hasFlag('no-color') || |
| hasFlag('no-colors') || |
| hasFlag('color=false')) { |
| return 0; |
| } |
| |
| if (hasFlag('color=16m') || |
| hasFlag('color=full') || |
| hasFlag('color=truecolor')) { |
| return 3; |
| } |
| |
| if (hasFlag('color=256')) { |
| return 2; |
| } |
| |
| if (hasFlag('color') || |
| hasFlag('colors') || |
| hasFlag('color=true') || |
| hasFlag('color=always')) { |
| return 1; |
| } |
| |
| if (process.stdout && !process.stdout.isTTY) { |
| return 0; |
| } |
| |
| if (process.platform === 'win32') { |
| // Node.js 7.5.0 is the first version of Node.js to include a patch to |
| // libuv that enables 256 color output on Windows. Anything earlier and it |
| // won't work. However, here we target Node.js 8 at minimum as it is an LTS |
| // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows |
| // release that supports 256 colors. |
| const osRelease = os.release().split('.'); |
| if ( |
| Number(process.versions.node.split('.')[0]) >= 8 && |
| Number(osRelease[0]) >= 10 && |
| Number(osRelease[2]) >= 10586 |
| ) { |
| return 2; |
| } |
| |
| return 1; |
| } |
| |
| if ('CI' in env) { |
| if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| if ('TEAMCITY_VERSION' in env) { |
| return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; |
| } |
| |
| if ('TERM_PROGRAM' in env) { |
| const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); |
| |
| switch (env.TERM_PROGRAM) { |
| case 'iTerm.app': |
| return version >= 3 ? 3 : 2; |
| case 'Hyper': |
| return 3; |
| case 'Apple_Terminal': |
| return 2; |
| // No default |
| } |
| } |
| |
| if (/-256(color)?$/i.test(env.TERM)) { |
| return 2; |
| } |
| |
| if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { |
| return 1; |
| } |
| |
| if ('COLORTERM' in env) { |
| return 1; |
| } |
| |
| if (env.TERM === 'dumb') { |
| return 0; |
| } |
| |
| return 0; |
| })(); |
| |
| if ('FORCE_COLOR' in env) { |
| supportLevel = parseInt(env.FORCE_COLOR, 10) === 0 ? 0 : (supportLevel || 1); |
| } |
| |
| module.exports = process && support(supportLevel); |