UNPKG

pintor

Version:

Zero-dependency library for providing color functions for terminal text

241 lines (240 loc) 4.82 kB
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, wrap = (text)=>String(text)) { const fn = (...args)=>{ const text = args.map(String).join(' '); if (!text) return text; const style = ansi_styles[styleName]; if (!style) return wrap(text); if (!shouldEnableColors(process.stdout)) return wrap(text); /\u001b\[[0-9]+m/.test(text); return wrap(`${style.open}${text}${style.close}`); }; for (const name of Object.keys(ansi_styles))Object.defineProperty(fn, name, { get: ()=>createStyleFunction(name, fn) }); 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 default src; export { stderr, stdout, supportsColor };