pintor
Version:
Zero-dependency library for providing color functions for terminal text
240 lines (239 loc) • 4.76 kB
JavaScript
const ansiEscapeCodes = {
reset: [
0,
0
],
bold: [
1,
22
],
dim: [
2,
22
],
italic: [
3,
23
],
underline: [
4,
24
],
overline: [
53,
55
],
inverse: [
7,
27
],
hidden: [
8,
28
],
strikethrough: [
9,
29
],
black: [
30,
39
],
red: [
31,
39
],
green: [
32,
39
],
yellow: [
33,
39
],
blue: [
34,
39
],
magenta: [
35,
39
],
cyan: [
36,
39
],
white: [
37,
39
],
gray: [
90,
39
],
grey: [
90,
39
],
brightBlack: [
90,
39
],
brightRed: [
91,
39
],
brightGreen: [
92,
39
],
brightYellow: [
93,
39
],
brightBlue: [
94,
39
],
brightMagenta: [
95,
39
],
brightCyan: [
96,
39
],
brightWhite: [
97,
39
],
bgBlack: [
40,
49
],
bgRed: [
41,
49
],
bgGreen: [
42,
49
],
bgYellow: [
43,
49
],
bgBlue: [
44,
49
],
bgMagenta: [
45,
49
],
bgCyan: [
46,
49
],
bgWhite: [
47,
49
],
bgGray: [
100,
49
],
bgGrey: [
100,
49
],
bgBrightBlack: [
100,
49
],
bgBrightRed: [
101,
49
],
bgBrightGreen: [
102,
49
],
bgBrightYellow: [
103,
49
],
bgBrightBlue: [
104,
49
],
bgBrightMagenta: [
105,
49
],
bgBrightCyan: [
106,
49
],
bgBrightWhite: [
107,
49
]
};
const ansiStyles = {};
const escapeCodes = Object.entries(ansiEscapeCodes);
for (const [styleName, [openCode, closeCode]] of escapeCodes){
const openSequence = `\u001b[${openCode}m`;
const closeSequence = `\u001b[${closeCode}m`;
ansiStyles[styleName] = {
open: openSequence,
close: closeSequence,
closeRe: new RegExp(closeSequence.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')
};
}
const ansi_styles = ansiStyles;
function shouldEnableColors(stream) {
if ('FORCE_COLOR' in process.env) return process.env.FORCE_COLOR?.length === 0 || 0 !== parseInt(process.env.FORCE_COLOR || '0', 10);
if ('NO_COLOR' in process.env) return false;
if (stream && !stream.isTTY) return false;
if ('dumb' === process.env.TERM) return false;
if ('CI' in process.env || 'TRAVIS' in process.env || 'CIRCLECI' in process.env || 'APPVEYOR' in process.env || 'GITLAB_CI' in process.env || 'GITHUB_ACTIONS' in process.env || 'BUILDKITE' in process.env || 'DRONE' in process.env || 'JENKINS_URL' in process.env) return false;
if ('win32' === process.platform) {
if ('WT_SESSION' in process.env) return true;
if ('ConEmuANSI' in process.env) return true;
if ('TERM_PROGRAM' in process.env && 'vscode' === process.env.TERM_PROGRAM) return true;
}
if ('COLORTERM' in process.env) return true;
const term = process.env.TERM || '';
return /^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux|konsole|alacritty|kitty|wezterm|foot|contour|terminator|terminology|terminix|tilix|hyper|iterm2|mintty|st|tmux/i.test(term);
}
function createStyleFunction(styleName) {
const fn = (...args)=>{
const text = args.map(String).join(' ');
if (!text) return text;
const style = ansi_styles[styleName];
if (!style) return text;
if (!shouldEnableColors(process.stdout)) return text;
/\u001b\[[0-9]+m/.test(text);
return `${style.open}${text}${style.close}`;
};
for (const name of Object.keys(ansi_styles))Object.defineProperty(fn, name, {
get: ()=>createStyleFunction(name)
});
return fn;
}
function createColorsObject() {
const colors = {
styles: ansi_styles
};
for (const styleName of Object.keys(ansi_styles))Object.defineProperty(colors, styleName, {
get: ()=>createStyleFunction(styleName)
});
return colors;
}
const src_colors = createColorsObject();
const supportsColor = shouldEnableColors;
const stdout = shouldEnableColors(process.stdout);
const stderr = shouldEnableColors(process.stderr);
const src = src_colors;
export { src as default, stderr, stdout, supportsColor };