index.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import * as tty from "tty"
  2. const env = process.env
  3. const isDisabled = "NO_COLOR" in env
  4. const isForced = "FORCE_COLOR" in env
  5. const isWindows = process.platform === "win32"
  6. const isCompatibleTerminal =
  7. tty && tty.isatty(1) && env.TERM && env.TERM !== "dumb"
  8. const isCI =
  9. "CI" in env &&
  10. ("GITHUB_ACTIONS" in env || "GITLAB_CI" in env || "CIRCLECI" in env)
  11. let enabled =
  12. !isDisabled && (isForced || isWindows || isCompatibleTerminal || isCI)
  13. const raw = (open, close, searchRegex, replaceValue) => (s) =>
  14. enabled
  15. ? open +
  16. (~(s += "").indexOf(close, 4) // skip opening \x1b[
  17. ? s.replace(searchRegex, replaceValue)
  18. : s) +
  19. close
  20. : s
  21. const init = (open, close) => {
  22. return raw(
  23. `\x1b[${open}m`,
  24. `\x1b[${close}m`,
  25. new RegExp(`\\x1b\\[${close}m`, "g"),
  26. `\x1b[${open}m`
  27. )
  28. }
  29. export const options = Object.defineProperty({}, "enabled", {
  30. get: () => enabled,
  31. set: (value) => (enabled = value),
  32. })
  33. export const reset = init(0, 0)
  34. export const bold = raw("\x1b[1m", "\x1b[22m", /\x1b\[22m/g, "\x1b[22m\x1b[1m")
  35. export const dim = raw("\x1b[2m", "\x1b[22m", /\x1b\[22m/g, "\x1b[22m\x1b[2m")
  36. export const italic = init(3, 23)
  37. export const underline = init(4, 24)
  38. export const inverse = init(7, 27)
  39. export const hidden = init(8, 28)
  40. export const strikethrough = init(9, 29)
  41. export const black = init(30, 39)
  42. export const red = init(31, 39)
  43. export const green = init(32, 39)
  44. export const yellow = init(33, 39)
  45. export const blue = init(34, 39)
  46. export const magenta = init(35, 39)
  47. export const cyan = init(36, 39)
  48. export const white = init(37, 39)
  49. export const gray = init(90, 39)
  50. export const bgBlack = init(40, 49)
  51. export const bgRed = init(41, 49)
  52. export const bgGreen = init(42, 49)
  53. export const bgYellow = init(43, 49)
  54. export const bgBlue = init(44, 49)
  55. export const bgMagenta = init(45, 49)
  56. export const bgCyan = init(46, 49)
  57. export const bgWhite = init(47, 49)
  58. export const blackBright = init(90, 39)
  59. export const redBright = init(91, 39)
  60. export const greenBright = init(92, 39)
  61. export const yellowBright = init(93, 39)
  62. export const blueBright = init(94, 39)
  63. export const magentaBright = init(95, 39)
  64. export const cyanBright = init(96, 39)
  65. export const whiteBright = init(97, 39)
  66. export const bgBlackBright = init(100, 49)
  67. export const bgRedBright = init(101, 49)
  68. export const bgGreenBright = init(102, 49)
  69. export const bgYellowBright = init(103, 49)
  70. export const bgBlueBright = init(104, 49)
  71. export const bgMagentaBright = init(105, 49)
  72. export const bgCyanBright = init(106, 49)
  73. export const bgWhiteBright = init(107, 49)