Package Exports
- ansis
Readme

ANSI Styling
This is a Node.js library for coloring output in ANSI terminals.
The ansis use the SGR (Select Graphic Rendition) codes defined in the ECMA-48 standard.
Install
npm install ansis
Quick Start
import ansis from 'ansis'; // ESM
// OR
const ansis = require('ansis'); // CommonJS
console.log(ansis.green(`Hello ${ansis.inverse('ANSI')} World!`));
console.log(ansis.black.bgYellow(`Warning:`) + ansis.cyan(' /path/to/file.js ') + ansis.red(`not found!`) );
Output:
Features
- supports both
ESM
andCommonJS
- standard API compatible with many popular ANSI libraries
- chained syntax
- nested syntax
- ANSI 256 colors and Truecolor
- detects color support
- supports the environment variables
NO_COLOR
FORCE_COLOR
and flags--no-color
--color
- low level access to the
open
andclose
properties for each style - correct break of style at
end of line
- faster than many others, see benchmarks
- no dependencies
String.prototype
stays virgin
Chained syntax
ansis.underline.italic.bold.red('Styled text');
Nested syntax
const c = ansis;
c.red(`${c.bold(`${c.italic(`${c.underline('underline')}italic`)}bold`)}red`);
Styles
reset
inverse
hidden
visible
bold
dim
(aliasfaint
)
italic
underline
doubleUnderline
overline
strikethrough
(alias strike
)
frame
encircle
Foreground colors
black
red
green
blue
magenta
cyan
white
gray
(alias grey
)
blackBright
redBright
greenBright
yellowBright
blueBright
magentaBright
cyanBright
whiteBright
Background colors
bgBlack
bgRed
bgGreen
bgYellow
bgBlue
bgMagenta
bgCyan
bgWhite
bgGray
bgBlackBright
bgRedBright
bgGreenBright
bgYellowBright
bgBlueBright
bgMagentaBright
bgCyanBright
bgWhiteBright
ANSI 256 colors
Foreground: .ansi256(code)
has aliases .ansi(code)
and .fg(code)
Background: .bgAnsi256(code)
has aliases .bgAnsi(code)
and .bg(code)
The pre-defined set of 256 colors.
Code range | Description |
---|---|
0 - 7 | standard colors |
8 - 15 | bright colors |
16 - 231 | 6 × 6 × 6 cube (216 colors) |
232 - 255 | grayscale from black to white in 24 steps |
See ANSI color codes.
// foreground color
ansis.ansi256(96).bold('bold Bright Cyan');
ansis.fg(96).bold('bold Bright Cyan'); // `fg` is the short alias for `ansi256`
// background color
ansis.bgAnsi256(105)('Bright Magenta');
ansis.bg(105)('Bright Magenta'); // `bg` is the short alias for `bgAnsi256`
The
ansi256()
andbgAnsi256()
methods are implemented for compatibility with thechalk
API.
Truecolor
Foreground: hex
rgb
Background: bgHex
bgRgb
// foreground color
ansis.hex('#E0115F').bold('bold Ruby');
ansis.hex('#96C')('Amethyst');
ansis.rgb(224, 17, 95).italic.underline('italic underline Ruby');
// background color
ansis.bgHex('#E0115F')('Ruby');
ansis.bgHex('#96C')('Amethyst');
ansis.bgRgb(224, 17, 95)('Ruby');
Shortcuts
const theme = {
error: ansis.red.bold,
info: ansis.cyan.italic,
warning: ansis.black.bgYellowBright,
ruby: ansis.hex('#E0115F'),
};
theme.error('error');
theme.info('info');
theme.warning('warning');
theme.ruby('Ruby color');
Low level usage
You can use the open
and close
properties for each style.
const myStyle = ansis.bold.italic.black.bgHex('#ABCDEF');
console.log(`Hello ${myStyle.open}ANSI${myStyle.close} World!`);
Correct break of style at end of line
ansis.bgGreen(`\nAnsis\nNew Line\nNext New Line\n`);
Compare most popular ANSI libraries
Library | Standard style / color naming |
Chain styles |
Nested styles |
New Line |
ANSI 256 color methods |
Truecolor RGB / HEX methods |
Supports NO_COLOR |
---|---|---|---|---|---|---|---|
colors.js |
no, e.g.brightRed (16 colors) |
yes | yes | yes | - | - | onlyFORCE_COLOR --no-color --color |
colorette |
yes (16 colors) |
- | yes | - | - | - | yes |
picocolors |
yes (8 colors) |
- | yes | - | - | - | yes |
cli-color |
yes (16 colors) |
yes | yes | - | .xterm(num) |
- | yes |
color-cli |
no, e.g.red_bbt (16 colors) |
yes | buggy | yes | .x<num> |
- | only--no-color --color |
ansi-colors |
yes (16 colors) |
yes | yes | yes | - | - | onlyFORCE_COLOR |
kleur |
yes (8 colors) |
yes* | yes | - | - | - | yes |
chalk |
yes (16 colors) |
yes | yes | yes | .ansi256(num) |
.hex() .rgb() |
yes |
ansis |
yes (16 colors) |
yes | yes | yes | .ansi256(num) .ansi(num) . fg(num) |
.hex() .rgb() |
yes |
Column description
- Standard style and color naming:
red
redBright
bgRed
bgRedBright
etc., see above the Foreground / Background colors. - Chain styles:
ansis.red.bold.underline('text')
.kleur
use the chain of functions:kleur.red().bold().underline('text')
. - Nested styles: correct closing of nested escape sequences.
c.red(`red ${c.green(`green ${c.underline(`underline`)} green`)} red`)
- New Line: correct break of escape sequences at
end of line
.ansis.bgGreen(`\nAnsis\nNew Line\nNext New Line\n`);
- NO_COLOR: supports the environment variables
NO_COLOR
FORCE_COLOR
and flags--no-color
--color
Show ANSI demo
git clone https://github.com/webdiscus/ansis.git
cd ./ansis
npm i
npm run demo
Benchmark
Setup
git clone https://github.com/webdiscus/ansis.git
cd ./ansis/bench
npm i
Run benchmark
npm run bench
Tested on
MacBook Pro 16" M1 Max 64GB
macOS Monterey 12.1
Node.js v16.13.1
TerminaliTerm2
Colorette bench
The benchmark used in colorette
.
c.red(`${c.bold(`${c.cyan(`${c.yellow('yellow')}cyan`)}`)}red`);
colors-js 1,158,572 ops/sec
colorette 4,572,582 ops/sec
picocolors 3,841,124 ops/sec
cli-color 470,320 ops/sec
color-cli 109,811 ops/sec
ansi-colors 1,265,615 ops/sec
kleur/colors 2,281,415 ops/sec
kleur 2,228,639 ops/sec
chalk 2,287,146 ops/sec
+ ansis 2,669,734 ops/sec
Base styles
styles.forEach((style) => c[style]('foo'));
colors-js 471,395 ops/sec
colorette 1,103,314 ops/sec
picocolors 5,725,578 ops/sec
cli-color 221,282 ops/sec
color-cli 73,725 ops/sec
ansi-colors 716,280 ops/sec
kleur/colors 1,259,858 ops/sec
kleur 3,829,838 ops/sec
chalk 3,165,933 ops/sec
+ ansis 4,483,217 ops/sec
Chained styles
colors.forEach((color) => c[color].bold.underline.italic('foo'));
colors-js 138,219
colorette (not supported)
picocolors (not supported)
cli-color 144,837
color-cli 52,732
ansi-colors 158,921
kleur/colors (not supported)
kleur 514,035
chalk 1,234,573
+ ansis 5,515,868
Nested calls
colors.forEach((color) => c[color](c.bold(c.underline(c.italic('foo')))));
colors-js 166,425 ops/sec
colorette 695,350 ops/sec
picocolors 942,592 ops/sec
cli-color 65,561 ops/sec
color-cli 13,800 ops/sec
ansi-colors 260,316 ops/sec
kleur/colors 561,111 ops/sec
kleur 648,195 ops/sec
chalk 497,292 ops/sec
+ ansis 558,575 ops/sec
Nested styles
c.red(`a red ${c.white('white')} red ${c.red('red')} red ${c.cyan('cyan')} red ${c.black('black')} red ${c.red('red')} red ${c.green('green')} red ${c.red('red')} red ${c.yellow('yellow')} red ${c.blue('blue')} red ${c.red('red')} red ${c.magenta('magenta')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.green('green')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.magenta('magenta')} red ${c.red('red')} red ${c.red('red')} red ${c.cyan('cyan')} red ${c.red('red')} red ${c.red('red')} red ${c.yellow('yellow')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} red ${c.red('red')} message`);
colors-js 89,633 ops/sec
colorette 243,139 ops/sec
picocolors 243,975 ops/sec
cli-color 41,657 ops/sec
color-cli 14,264 ops/sec
ansi-colors 121,451 ops/sec
kleur/colors 234,132 ops/sec
kleur 221,446 ops/sec
chalk 189,960 ops/sec
+ ansis 211,868 ops/sec
Deep nested styles
c.green(
`green ${c.cyan(
`cyan ${c.red(
`red ${c.yellow(
`yellow ${c.blue(
`blue ${c.magenta(
`magenta ${c.underline(
`underline ${c.italic(`italic`)} underline`
)} magenta`
)} blue`
)} yellow`
)} red`
)} cyan`
)} green`
);
colors-js 451,592 ops/sec
colorette 1,131,757 ops/sec
picocolors 1,002,649 ops/sec
cli-color 213,441 ops/sec
color-cli 40,340 ops/sec
ansi-colors 362,733 ops/sec
kleur/colors 478,547 ops/sec
kleur 464,004 ops/sec
chalk 565,965 ops/sec
+ ansis 882,220 ops/sec
HEX colors
Only two libraries support truecolors methods: ansis
and chalk
c.hex('#FBA')('foo');
colors-js (not supported)
colorette (not supported)
picocolors (not supported)
cli-color (not supported)
color-cli (not supported)
ansi-colors (not supported)
kleur/colors (not supported)
kleur (not supported)
chalk 2,891,684 ops/sec
+ ansis 4,944,572 ops/sec
Testing
npm run test
will run the unit and integration tests.npm run test:coverage
will run the tests with coverage.
Also See
Most popular ANSI libraries for Node.js
: