You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.js 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // call it on itself so we can test the export val for basic stuff
  2. module.exports = colorSupport({ alwaysReturn: true }, colorSupport)
  3. function hasNone (obj, options) {
  4. obj.level = 0
  5. obj.hasBasic = false
  6. obj.has256 = false
  7. obj.has16m = false
  8. if (!options.alwaysReturn) {
  9. return false
  10. }
  11. return obj
  12. }
  13. function hasBasic (obj) {
  14. obj.hasBasic = true
  15. obj.has256 = false
  16. obj.has16m = false
  17. obj.level = 1
  18. return obj
  19. }
  20. function has256 (obj) {
  21. obj.hasBasic = true
  22. obj.has256 = true
  23. obj.has16m = false
  24. obj.level = 2
  25. return obj
  26. }
  27. function has16m (obj) {
  28. obj.hasBasic = true
  29. obj.has256 = true
  30. obj.has16m = true
  31. obj.level = 3
  32. return obj
  33. }
  34. function colorSupport (options, obj) {
  35. options = options || {}
  36. obj = obj || {}
  37. // if just requesting a specific level, then return that.
  38. if (typeof options.level === 'number') {
  39. switch (options.level) {
  40. case 0:
  41. return hasNone(obj, options)
  42. case 1:
  43. return hasBasic(obj)
  44. case 2:
  45. return has256(obj)
  46. case 3:
  47. return has16m(obj)
  48. }
  49. }
  50. obj.level = 0
  51. obj.hasBasic = false
  52. obj.has256 = false
  53. obj.has16m = false
  54. if (typeof process === 'undefined' ||
  55. !process ||
  56. !process.stdout ||
  57. !process.env ||
  58. !process.platform) {
  59. return hasNone(obj, options)
  60. }
  61. var env = options.env || process.env
  62. var stream = options.stream || process.stdout
  63. var term = options.term || env.TERM || ''
  64. var platform = options.platform || process.platform
  65. if (!options.ignoreTTY && !stream.isTTY) {
  66. return hasNone(obj, options)
  67. }
  68. if (!options.ignoreDumb && term === 'dumb' && !env.COLORTERM) {
  69. return hasNone(obj, options)
  70. }
  71. if (platform === 'win32') {
  72. return hasBasic(obj)
  73. }
  74. if (env.TMUX) {
  75. return has256(obj)
  76. }
  77. if (!options.ignoreCI && (env.CI || env.TEAMCITY_VERSION)) {
  78. if (env.TRAVIS) {
  79. return has256(obj)
  80. } else {
  81. return hasNone(obj, options)
  82. }
  83. }
  84. // TODO: add more term programs
  85. switch (env.TERM_PROGRAM) {
  86. case 'iTerm.app':
  87. var ver = env.TERM_PROGRAM_VERSION || '0.'
  88. if (/^[0-2]\./.test(ver)) {
  89. return has256(obj)
  90. } else {
  91. return has16m(obj)
  92. }
  93. case 'HyperTerm':
  94. case 'Hyper':
  95. return has16m(obj)
  96. case 'MacTerm':
  97. return has16m(obj)
  98. case 'Apple_Terminal':
  99. return has256(obj)
  100. }
  101. if (/^xterm-256/.test(term)) {
  102. return has256(obj)
  103. }
  104. if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(term)) {
  105. return hasBasic(obj)
  106. }
  107. if (env.COLORTERM) {
  108. return hasBasic(obj)
  109. }
  110. return hasNone(obj, options)
  111. }