| import * as tty from "tty" |
| |
| const env = process.env || {} |
| const argv = process.argv || [] |
| |
| const isDisabled = "NO_COLOR" in env || argv.includes("--no-color") |
| const isForced = "FORCE_COLOR" in env || argv.includes("--color") |
| const isWindows = process.platform === "win32" |
| |
| const isCompatibleTerminal = |
| tty && tty.isatty && tty.isatty(1) && env.TERM && env.TERM !== "dumb" |
| |
| const isCI = |
| "CI" in env && |
| ("GITHUB_ACTIONS" in env || "GITLAB_CI" in env || "CIRCLECI" in env) |
| |
| export const isColorSupported = |
| !isDisabled && (isForced || isWindows || isCompatibleTerminal || isCI) |
| |
| const replaceClose = ( |
| index, |
| string, |
| close, |
| replace, |
| head = string.substring(0, index) + replace, |
| tail = string.substring(index + close.length), |
| next = tail.indexOf(close) |
| ) => head + (next < 0 ? tail : replaceClose(next, tail, close, replace)) |
| |
| const clearBleed = (index, string, open, close, replace) => |
| index < 0 |
| ? open + string + close |
| : open + replaceClose(index, string, close, replace) + close |
| |
| const filterEmpty = |
| (open, close, replace = open, at = open.length + 1) => |
| (string) => |
| string || !(string === "" || string === undefined) |
| ? clearBleed( |
| ("" + string).indexOf(close, at), |
| string, |
| open, |
| close, |
| replace |
| ) |
| : "" |
| |
| const init = (open, close, replace) => |
| filterEmpty(`\x1b[${open}m`, `\x1b[${close}m`, replace) |
| |
| const colors = { |
| reset: init(0, 0), |
| bold: init(1, 22, "\x1b[22m\x1b[1m"), |
| dim: init(2, 22, "\x1b[22m\x1b[2m"), |
| italic: init(3, 23), |
| underline: init(4, 24), |
| inverse: init(7, 27), |
| hidden: init(8, 28), |
| strikethrough: init(9, 29), |
| black: init(30, 39), |
| red: init(31, 39), |
| green: init(32, 39), |
| yellow: init(33, 39), |
| blue: init(34, 39), |
| magenta: init(35, 39), |
| cyan: init(36, 39), |
| white: init(37, 39), |
| gray: init(90, 39), |
| bgBlack: init(40, 49), |
| bgRed: init(41, 49), |
| bgGreen: init(42, 49), |
| bgYellow: init(43, 49), |
| bgBlue: init(44, 49), |
| bgMagenta: init(45, 49), |
| bgCyan: init(46, 49), |
| bgWhite: init(47, 49), |
| blackBright: init(90, 39), |
| redBright: init(91, 39), |
| greenBright: init(92, 39), |
| yellowBright: init(93, 39), |
| blueBright: init(94, 39), |
| magentaBright: init(95, 39), |
| cyanBright: init(96, 39), |
| whiteBright: init(97, 39), |
| bgBlackBright: init(100, 49), |
| bgRedBright: init(101, 49), |
| bgGreenBright: init(102, 49), |
| bgYellowBright: init(103, 49), |
| bgBlueBright: init(104, 49), |
| bgMagentaBright: init(105, 49), |
| bgCyanBright: init(106, 49), |
| bgWhiteBright: init(107, 49), |
| } |
| |
| const none = (any) => any |
| |
| export const createColors = ({ useColor = isColorSupported } = {}) => |
| useColor |
| ? colors |
| : Object.keys(colors).reduce( |
| (colors, key) => ({ ...colors, [key]: none }), |
| {} |
| ) |
| |
| export const { |
| reset, |
| bold, |
| dim, |
| italic, |
| underline, |
| inverse, |
| hidden, |
| strikethrough, |
| black, |
| red, |
| green, |
| yellow, |
| blue, |
| magenta, |
| cyan, |
| white, |
| gray, |
| bgBlack, |
| bgRed, |
| bgGreen, |
| bgYellow, |
| bgBlue, |
| bgMagenta, |
| bgCyan, |
| bgWhite, |
| blackBright, |
| redBright, |
| greenBright, |
| yellowBright, |
| blueBright, |
| magentaBright, |
| cyanBright, |
| whiteBright, |
| bgBlackBright, |
| bgRedBright, |
| bgGreenBright, |
| bgYellowBright, |
| bgBlueBright, |
| bgMagentaBright, |
| bgCyanBright, |
| bgWhiteBright, |
| } = createColors() |