Color styling of text for ANSI terminals using the SGR (Select Graphic Rendition) codes defined in the ECMA-48 standard.
This is improved and faster implementation for Node.js
.
Install
npm install ansis --save
Quick start
import ansis from 'ansis';
const ansis = require('ansis');
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:
Show ANSI demo
git clone https://github.com/webdiscus/ansis.git
cd ./ansis
npm i
npm run demo
Features
- supports
ES Modules
and CommonJS
- no dependencies
- powerful and lightweight library is faster than many others such as
chalk
kleur
ansi-colors
etc. - supports the standard de facto API of the
chalk
- supports the environment variables
NO_COLOR
FORCE_COLOR
and flags --no-color
--color
- supports ANSI 256 colors and Truecolor
- supports styles like:
bold
red
yellowBright
bgGreen
bgCyanBright
ect. - supports chained styles, e.g.:
ansis.red.bold.italic.underline('text');
- supports nested styles like
colorette
picocolors
, e.g.:
const c = ansis;
c.red(`red ${c.italic.green('italic green')} red`);
c.red(`${c.bold(`${c.italic(`${c.underline('underline')}italic`)}bold`)}red`);
- supports methods for custom colors
rgb()
hex()
bgRgb()
bgHex()
ansi256()
bgAnsi256()
:
ansis.rgb(255, 80, 200)('text');
ansis.hex('#FF88AA')('text');
ansis.bgHex('#F8A')('text');
ansis.ansi256(110)('text');
- supports shortcut, e.g.:
const theme = {
error: ansis.red.bold,
info: ansis.cyan.italic,
warning: ansis.black.bgYellowBright,
ruby: ansis.hex('#E0115F'),
bgAmber: ansis.bgHex('#FFBF00'),
};
theme.error('error');
theme.info('info');
theme.warning('warning');
theme.ruby('Ruby color');
theme.bgAmber('Amber background color');
- supports the use of
open
and close
properties for each style, e.g.:
const myStyle = ansis.bold.italic.black.bgHex('#ABCDEF');
console.log(`Hello ${ansis.green.open}ANSI${ansis.green.close} World!`);
console.log(`Hello ${myStyle.open}ANSI${myStyle.close} World!`);
- supports correct break of style at
end of line
, e.g.:
ansis.bgGreen(`\nAnsis\nNew Line\nNext New Line\n`);
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
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
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 method: .ansi256(code)
has aliases .ansi(code)
and .fg(code)
.
Background method: .bgAnsi256(code)
has aliases .bgAnsi(code)
and .bg(code)
.
ansis.ansi256(96).bold('bold Bright Cyan');
ansis.fg(96).bold('bold Bright Cyan');
ansis.bgAnsi256(105)('Bright Magenta');
ansis.bg(105)('Bright Magenta');
The ansi256()
and bgAnsi256()
methods are implemented for compatibility with the chalk
API.
Truecolor
ansis.hex('#E0115F').bold('bold Ruby');
ansis.hex('#96C')('Amethyst');
ansis.rgb(224, 17, 95).italic.underline('italic underline Ruby');
ansis.bgHex('#E0115F')('Ruby');
ansis.bgHex('#96C')('Amethyst');
ansis.bgRgb(224, 17, 95)('Ruby');
Compare most popular ANSI libraries
Library | Standard style / color naming | Chain styles | Nested styles | New Line | ANSI 256 colors | Truecolor RGB / HEX | NO_COLOR |
---|
colors.js | no, e.g.
brightRed | yes | yes | yes | - | - | only
FORCE_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 | yes | buggy | yes | .x<num> | - | only
--no-color
--color |
ansi-colors | yes (16 colors) | yes | yes | yes | - | - | only
FORCE_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) | .hex() .rgb() | yes |
Column description
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
Terminal iTerm2
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
:
License
ISC