Skip to content

Commit b69e965

Browse files
committed
chore: update comments, add optional libs to bench
1 parent c643ecb commit b69e965

File tree

5 files changed

+106
-92
lines changed

5 files changed

+106
-92
lines changed

bench/index.js

Lines changed: 93 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,26 @@ import Bench from './lib/bench.js';
4141
import packages from './packages.js';
4242
import { colorLevels, LEVEL_256COLORS } from '../src/color-levels.js';
4343

44+
// Single source of truth: which libs to run
45+
// - Edit the DEFAULT_ENABLED array, OR
46+
// - override via env: BENCH_LIBS="chalk,ansis,picocolors" node bench.js
47+
const DEFAULT_ENABLED = [
48+
...Object.keys(packages),
49+
];
50+
51+
const ENABLED = (process.env.BENCH_LIBS || DEFAULT_ENABLED.join(',')).split(',').map(s => packages[s.trim()]).filter(Boolean);
52+
53+
// test only this libs
54+
// const ENABLED = [
55+
// packages['chalk'],
56+
// packages['ansis'],
57+
// packages['picocolors'],
58+
// ];
59+
4460
// create a new instance of Ansis for correct measure in benchmark
4561
const ansis = new Ansis();
4662
const colorLevel = ansis.level;
4763

48-
const useShortBench = true;
49-
5064
const log = console.log;
5165

5266
log();
@@ -67,25 +81,22 @@ const bench = new Bench({
6781
rmeColor: benchStyle.cyan,
6882
statUnitColor: benchStyle.dim,
6983
failColor: benchStyle.red.bold,
70-
});
84+
}, ENABLED);
7185

7286
log();
7387
log(hex('#F88').inverse.bold` -= Benchmark =- `);
7488

7589
// RGB colors
76-
bench('RGB colors').add('chalk', () => {
77-
for (let i = 0; i < 256; i++) chalk.rgb(i, 150, 200)('foo');
78-
}).add('ansis', () => {
79-
for (let i = 0; i < 256; i++) ansis.rgb(i, 150, 200)('foo');
80-
}).run();
81-
82-
// HEX colors
83-
// the hex(), rgb(), bgHex(), bgRgb() methods support only chalk and ansis
84-
bench('HEX colors').
85-
add('chalk', () => chalk.hex('#FBA')('foo')).
86-
add('ansis', () => ansis.hex('#FBA')('foo')).
90+
bench('RGB colors').
91+
add(packages['chalk'], () => { for (let i = 0; i < 256; i++) chalk.rgb(i, 150, 200)('foo'); }).
92+
add(packages['ansis'], () => { for (let i = 0; i < 256; i++) ansis.rgb(i, 150, 200)('foo'); }).
8793
run();
8894

95+
// HEX colors (only chalk & ansis support hex()/rgb()/bgHex()/bgRgb())
96+
bench('HEX colors').
97+
add(packages['chalk'], () => chalk.hex('#FBA')('foo')).
98+
add(packages['ansis'], () => ansis.hex('#FBA')('foo')).run();
99+
89100
const text3 = 'foo';
90101
const text60 = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit sed.';
91102

@@ -97,80 +108,79 @@ bench('Simple short text, 3 chars, using 1 style').
97108
add(packages['chalk'], () => chalk.red(text3)).
98109
add(packages['ansis'], () => ansis.red(text3)).
99110
add(packages['picocolors'], () => picocolors.red(text3)).
100-
// add(packages['colorette'], () => colorette.red(text3)).
101-
// add(packages['kleur'], () => kleur.red(text3)).
102-
// add(packages['ansi-colors'], () => ansiColors.red(text3)).
103-
// add(packages['kolorist'], () => kolorist.red(text3)).
104-
// add(packages['cli-color'], () => cliColor.red(text3)).
105-
// add(packages['colors-cli'], () => colorCli.red(text3)).
106-
// add(packages['@colors/colors'], () => colorsJs.red(text3)).
111+
add(packages['colorette'], () => colorette.red(text3)).
112+
add(packages['kleur'], () => kleur.red(text3)).
113+
add(packages['ansi-colors'], () => ansiColors.red(text3)).
114+
add(packages['kolorist'], () => kolorist.red(text3)).
115+
add(packages['cli-color'], () => cliColor.red(text3)).
116+
add(packages['colors-cli'], () => colorCli.red(text3)).
117+
add(packages['@colors/colors'], () => colorsJs.red(text3)).
107118
run();
108119

109120
bench('Simple long text, 60 chars, using 1 style').
110121
add(packages['chalk'], () => chalk.red(text60)).
111122
add(packages['ansis'], () => ansis.red(text60)).
112123
add(packages['picocolors'], () => picocolors.red(text60)).
113-
// add(packages['colorette'], () => colorette.red(text60)).
114-
// add(packages['kleur'], () => kleur.red(text60)).
115-
// add(packages['ansi-colors'], () => ansiColors.red(text60)).
116-
// add(packages['kolorist'], () => kolorist.red(text60)).
117-
// add(packages['cli-color'], () => cliColor.red(text60)).
118-
// add(packages['colors-cli'], () => colorCli.red(text60)).
119-
// add(packages['@colors/colors'], () => colorsJs.red(text60)).
124+
add(packages['colorette'], () => colorette.red(text60)).
125+
add(packages['kleur'], () => kleur.red(text60)).
126+
add(packages['ansi-colors'], () => ansiColors.red(text60)).
127+
add(packages['kolorist'], () => kolorist.red(text60)).
128+
add(packages['cli-color'], () => cliColor.red(text60)).
129+
add(packages['colors-cli'], () => colorCli.red(text60)).
130+
add(packages['@colors/colors'], () => colorsJs.red(text60)).
120131
run();
121132

122-
123133
// Fastest way for 2 styles
124134
bench(`Use 2 styles`).
125135
add(packages['chalk'], () => chalk.red.bold('foo')).
126136
add(packages['ansis'], () => ansis.red.bold('foo')).
127137
add(packages['picocolors'], () => picocolors.red(picocolors.bold('foo'))).
128-
// add(packages['colorette'], () => colorette.red(colorette.bold('foo'))).
129-
// add(packages['kleur'], () => kleur.red().bold('foo')).
130-
// add(packages['ansi-colors'], () => ansiColors.red.bold('foo')).
131-
// add(packages['kolorist'], () => kolorist.red(kolorist.bold('foo'))).
132-
// add(packages['cli-color'], () => cliColor.red.bold('foo')).
133-
// add(packages['colors-cli'], () => colorCli.red.bold('foo')).
134-
// add(packages['@colors/colors'], () => colorsJs.red.bold('foo')).
138+
add(packages['colorette'], () => colorette.red(colorette.bold('foo'))).
139+
add(packages['kleur'], () => kleur.red().bold('foo')).
140+
add(packages['ansi-colors'], () => ansiColors.red.bold('foo')).
141+
add(packages['kolorist'], () => kolorist.red(kolorist.bold('foo'))).
142+
add(packages['cli-color'], () => cliColor.red.bold('foo')).
143+
add(packages['colors-cli'], () => colorCli.red.bold('foo')).
144+
add(packages['@colors/colors'], () => colorsJs.red.bold('foo')).
135145
run();
136146

137147
// Fastest way for 3 styles
138148
bench('Use 3 styles').
139149
add(packages['chalk'], () => chalk.red.bold.bgWhite('foo')).
140150
add(packages['ansis'], () => ansis.red.bold.bgWhite('foo')).
141151
add(packages['picocolors'], () => picocolors.red(picocolors.bold(picocolors.bgWhite('foo')))).
142-
// add(packages['colorette'], () => colorette.red(colorette.bold(colorette.bgWhite('foo')))).
143-
// add(packages['kleur'], () => kleur.red().bold().bgWhite('foo')).
144-
// add(packages['ansi-colors'], () => ansiColors.red.bold.bgWhite('foo')).
145-
// add(packages['kolorist'], () => kolorist.red(kolorist.bold(kolorist.bgWhite('foo')))).
146-
// add(packages['cli-color'], () => cliColor.red.bold.bgWhite('foo')).
147-
// add(packages['colors-cli'], () => colorCli.red.bold.white_bt('foo')).
148-
// add(packages['@colors/colors'], () => colorsJs.red.bold.bgWhite('foo')).
152+
add(packages['colorette'], () => colorette.red(colorette.bold(colorette.bgWhite('foo')))).
153+
add(packages['kleur'], () => kleur.red().bold().bgWhite('foo')).
154+
add(packages['ansi-colors'], () => ansiColors.red.bold.bgWhite('foo')).
155+
add(packages['kolorist'], () => kolorist.red(kolorist.bold(kolorist.bgWhite('foo')))).
156+
add(packages['cli-color'], () => cliColor.red.bold.bgWhite('foo')).
157+
add(packages['colors-cli'], () => colorCli.red.bold.white_bt('foo')).
158+
add(packages['@colors/colors'], () => colorsJs.red.bold.bgWhite('foo')).
149159
run();
150160

151161
// Fastest way for 4 styles
152162
bench('Use 4 styles').
153163
add(packages['chalk'], () => chalk.red.bold.underline.bgWhite('foo')).
154164
add(packages['ansis'], () => ansis.red.bold.underline.bgWhite('foo')).
155165
add(packages['picocolors'], () => picocolors.red(picocolors.bold(picocolors.underline(picocolors.bgWhite('foo'))))).
156-
// add(packages['colorette'], () => colorette.red(colorette.bold(colorette.underline(colorette.bgWhite('foo'))))).
157-
// add(packages['kleur'], () => kleur.red().bold().underline().bgWhite('foo')).
158-
// add(packages['ansi-colors'], () => ansiColors.red.bold.underline.bgWhite('foo')).
159-
// add(packages['kolorist'], () => kolorist.red(kolorist.bold(kolorist.underline(kolorist.bgWhite('foo'))))).
160-
// add(packages['cli-color'], () => cliColor.red.bold.underline.bgWhite('foo')).
161-
// add(packages['colors-cli'], () => colorCli.red.bold.underline.white_bt('foo')).
162-
// add(packages['@colors/colors'], () => colorsJs.red.bold.underline.bgWhite('foo')).
166+
add(packages['colorette'], () => colorette.red(colorette.bold(colorette.underline(colorette.bgWhite('foo'))))).
167+
add(packages['kleur'], () => kleur.red().bold().underline().bgWhite('foo')).
168+
add(packages['ansi-colors'], () => ansiColors.red.bold.underline.bgWhite('foo')).
169+
add(packages['kolorist'], () => kolorist.red(kolorist.bold(kolorist.underline(kolorist.bgWhite('foo'))))).
170+
add(packages['cli-color'], () => cliColor.red.bold.underline.bgWhite('foo')).
171+
add(packages['colors-cli'], () => colorCli.red.bold.underline.white_bt('foo')).
172+
add(packages['@colors/colors'], () => colorsJs.red.bold.underline.bgWhite('foo')).
163173
run();
164174

165175
// Chained syntax
166176
bench('Chained syntax').
167177
add(packages['chalk'], () => chalk.red.bold.underline.bgWhite('foo')).
168178
add(packages['ansis'], () => ansis.red.bold.underline.bgWhite('foo')).
169179
add(packages['kleur'], () => kleur.red().bold().underline().bgWhite('foo')).
170-
// add(packages['ansi-colors'], () => ansiColors.red.bold.underline.bgWhite('foo')).
171-
// add(packages['cli-color'], () => cliColor.red.bold.underline.bgWhite('foo')).
172-
// add(packages['colors-cli'], () => colorCli.red.bold.underline.white_bt('foo')).
173-
// add(packages['@colors/colors'], () => colorsJs.red.bold.underline.bgWhite('foo')).
180+
add(packages['ansi-colors'], () => ansiColors.red.bold.underline.bgWhite('foo')).
181+
add(packages['cli-color'], () => cliColor.red.bold.underline.bgWhite('foo')).
182+
add(packages['colors-cli'], () => colorCli.red.bold.underline.white_bt('foo')).
183+
add(packages['@colors/colors'], () => colorsJs.red.bold.underline.bgWhite('foo')).
174184
// colorette - (not supported)
175185
// picocolors - (not supported)
176186
// kolorist - (not supported)
@@ -181,13 +191,13 @@ bench('Nested calls').
181191
add(packages['chalk'], () => chalk.red(chalk.bold(chalk.underline(chalk.bgWhite('foo'))))).
182192
add(packages['ansis'], () => ansis.red(ansis.bold(ansis.underline(ansis.bgWhite('foo'))))).
183193
add(packages['picocolors'], () => picocolors.red(picocolors.bold(picocolors.underline(picocolors.bgWhite('foo'))))).
184-
// add(packages['colorette'], () => colorette.red(colorette.bold(colorette.underline(colorette.bgWhite('foo'))))).
185-
// add(packages['kleur'], () => kleur.red(kleur.bold(kleur.underline(kleur.bgWhite('foo'))))).
186-
// add(packages['ansi-colors'], () => ansiColors.red(ansiColors.bold(ansiColors.underline(ansiColors.bgWhite('foo'))))).
187-
// add(packages['kolorist'], () => kolorist.red(kolorist.bold(kolorist.underline(kolorist.bgWhite('foo'))))).
188-
// add(packages['cli-color'], () => cliColor.red(cliColor.bold(cliColor.underline(cliColor.bgWhite('foo'))))).
189-
// add(packages['colors-cli'], () => colorCli.red(colorCli.bold(colorCli.underline(colorCli.white_bt('foo'))))).
190-
// add(packages['@colors/colors'], () => colorsJs.red(colorsJs.bold(colorsJs.underline(colorsJs.bgWhite('foo'))))).
194+
add(packages['colorette'], () => colorette.red(colorette.bold(colorette.underline(colorette.bgWhite('foo'))))).
195+
add(packages['kleur'], () => kleur.red(kleur.bold(kleur.underline(kleur.bgWhite('foo'))))).
196+
add(packages['ansi-colors'], () => ansiColors.red(ansiColors.bold(ansiColors.underline(ansiColors.bgWhite('foo'))))).
197+
add(packages['kolorist'], () => kolorist.red(kolorist.bold(kolorist.underline(kolorist.bgWhite('foo'))))).
198+
add(packages['cli-color'], () => cliColor.red(cliColor.bold(cliColor.underline(cliColor.bgWhite('foo'))))).
199+
add(packages['colors-cli'], () => colorCli.red(colorCli.bold(colorCli.underline(colorCli.white_bt('foo'))))).
200+
add(packages['@colors/colors'], () => colorsJs.red(colorsJs.bold(colorsJs.underline(colorsJs.bgWhite('foo'))))).
191201
run();
192202

193203
// Deep nested styles
@@ -207,13 +217,13 @@ bench('Deep nested styles').
207217
add(packages['chalk'], () => deepNestedBench(chalk)).
208218
add(packages['ansis'], () => deepNestedBench(ansis)).
209219
add(packages['picocolors'], () => deepNestedBench(picocolors)).
210-
// add(packages['colorette'], () => deepNestedBench(colorette)).
211-
// add(packages['kleur'], () => deepNestedBench(kleur)).
212-
// add(packages['ansi-colors'], () => deepNestedBench(ansiColors)).
213-
// add(packages['kolorist'], () => deepNestedBench(kolorist)).
214-
// add(packages['cli-color'], () => deepNestedBench(cliColor)).
215-
// add(packages['colors-cli'], () => deepNestedBench(colorCli)).
216-
// add(packages['@colors/colors'], () => deepNestedBench(colorsJs)).
220+
add(packages['colorette'], () => deepNestedBench(colorette)).
221+
add(packages['kleur'], () => deepNestedBench(kleur)).
222+
add(packages['ansi-colors'], () => deepNestedBench(ansiColors)).
223+
add(packages['kolorist'], () => deepNestedBench(kolorist)).
224+
add(packages['cli-color'], () => deepNestedBench(cliColor)).
225+
add(packages['colors-cli'], () => deepNestedBench(colorCli)).
226+
add(packages['@colors/colors'], () => deepNestedBench(colorsJs)).
217227
run();
218228

219229
// Colorette bench
@@ -224,13 +234,13 @@ bench('Colorette bench').
224234
add(packages['chalk'], () => coloretteBanch(chalk)).
225235
add(packages['ansis'], () => coloretteBanch(ansis)).
226236
add(packages['picocolors'], () => coloretteBanch(picocolors)).
227-
// add(packages['colorette'], () => coloretteBanch(colorette)).
228-
// add(packages['kleur'], () => coloretteBanch(kleur)).
229-
// add(packages['ansi-colors'], () => coloretteBanch(ansiColors)).
230-
// add(packages['kolorist'], () => coloretteBanch(kolorist)).
231-
// add(packages['cli-color'], () => coloretteBanch(cliColor)).
232-
// add(packages['colors-cli'], () => coloretteBanch(colorCli)).
233-
// add(packages['@colors/colors'], () => coloretteBanch(colorsJs)).
237+
add(packages['colorette'], () => coloretteBanch(colorette)).
238+
add(packages['kleur'], () => coloretteBanch(kleur)).
239+
add(packages['ansi-colors'], () => coloretteBanch(ansiColors)).
240+
add(packages['kolorist'], () => coloretteBanch(kolorist)).
241+
add(packages['cli-color'], () => coloretteBanch(cliColor)).
242+
add(packages['colors-cli'], () => coloretteBanch(colorCli)).
243+
add(packages['@colors/colors'], () => coloretteBanch(colorsJs)).
234244
run();
235245

236246
// Picocolors complex bench, slightly modified
@@ -253,21 +263,19 @@ bench('Picocolors complex bench').
253263
add(packages['ansis'], () => picoComplex(ansis)).
254264
add(packages['ansis'], () => ansisComplex(ansis)).
255265
add(packages['picocolors'], () => picoComplex(picocolors)).
256-
// add(packages['colorette'], () => picoComplex(colorette)).
257-
// add(packages['kleur'], () => picoComplex(kleur)).
258-
// add(packages['kolorist'], () => picoComplex(kolorist)).
259-
// add(packages['ansi-colors'], () => ansisComplex(ansiColors)).
260-
// add(packages['cli-color'], () => ansisComplex(cliColor)).
261-
// add(packages['colors-cli'], () => ansisComplex(colorCli)).
262-
// add(packages['@colors/colors'], () => ansisComplex(colorsJs)).
266+
add(packages['colorette'], () => picoComplex(colorette)).
267+
add(packages['kleur'], () => picoComplex(kleur)).
268+
add(packages['kolorist'], () => picoComplex(kolorist)).
269+
add(packages['ansi-colors'], () => ansisComplex(ansiColors)).
270+
add(packages['cli-color'], () => ansisComplex(cliColor)).
271+
add(packages['colors-cli'], () => ansisComplex(colorCli)).
272+
add(packages['@colors/colors'], () => ansisComplex(colorsJs)).
263273
run();
264274

265275
// Check support of correct break style at new line
266-
267-
// Break style at new line
268276
const breakStyleAtNewLineFixture = `\nAnsis\nNEW LINE\nNEXT NEW LINE\n`;
269277
bench('New Line').
270-
add('colors.js', () => colorsJs.bgGreen(breakStyleAtNewLineFixture)).
278+
add(packages['@colors/colors'], () => colorsJs.bgGreen(breakStyleAtNewLineFixture)).
271279
add(packages['ansi-colors'], () => ansiColors.bgGreen(breakStyleAtNewLineFixture)).
272280
add(packages['chalk'], () => chalk.bgGreen(breakStyleAtNewLineFixture)).
273281
// 2x slower as chalk because chalk use own implementation, but ansis save 400 bytes and uses regexp, this speed is not critical

bench/lib/bench.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,18 @@ class Bench {
7676
name = 'Bench';
7777
benchNames = [];
7878
maxNameWidth = 0;
79+
enabledBenchmarks = null;
7980

8081
/**
8182
* @param {BenchOptions} options
8283
* @returns {function(suiteName: string): Bench}
8384
*/
84-
constructor(options = {}) {
85+
constructor(options = {}, enabledBenchmarks) {
8586
this.options = Object.assign(defaultOptions, options);
8687
showResult = showResult.bind(this);
8788

89+
this.enabledBenchmarks = new Set([...enabledBenchmarks]);
90+
8891
return (suiteName) => {
8992
if (suiteName) this.name = suiteName;
9093
this.suite = new Benchmark.Suite(suiteName);
@@ -101,6 +104,10 @@ class Bench {
101104
* @returns {Bench}
102105
*/
103106
add(name, fn) {
107+
if (!this.enabledBenchmarks.has(name)) {
108+
return this;
109+
}
110+
104111
this.benchNames.push(name);
105112
this.suite.add(name, {
106113
onStart: () => {},

bench/package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
"types": "lib/bench.d.ts",
66
"scripts": {
77
"bench": "node ./index.js",
8-
"bench:truecolor": "node truecolor.bench.js",
9-
"bench:vi": "vitest bench vitest.bench.js"
8+
"bench:truecolor": "node truecolor.bench.js"
109
},
1110
"dependencies": {
1211
"@colors/colors": "1.6.0",
@@ -20,7 +19,6 @@
2019
"colors-cli": "1.0.33",
2120
"kleur": "4.1.5",
2221
"kolorist": "1.8.0",
23-
"picocolors": "1.1.1",
24-
"vitest": "^3.2.0"
22+
"picocolors": "1.1.1"
2523
}
2624
}

rollup.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const babelOptions = {
2828
// https://github.com/terser/terser#compress-options
2929
const terserOptions = (ecma) => ({
3030
ecma,
31+
toplevel: true,
3132
compress: {
3233
ecma,
3334
passes: 3,
@@ -37,7 +38,6 @@ const terserOptions = (ecma) => ({
3738
//unsafe: true,
3839
//unsafe_comps: true,
3940
},
40-
toplevel: true,
4141
});
4242

4343
/**

src/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ let createStyle = ({ p: props}, { open, close }) => {
4343
if (open && open === close) return open;
4444
// null == arg || '' === arg
4545
if ((arg ?? EMPTY_STRING) === EMPTY_STRING) return EMPTY_STRING;
46+
// fall-through to stringify the args: `false`, `0` or `NaN`
4647
}
4748

4849
let output = arg.raw
@@ -81,7 +82,7 @@ let createStyle = ({ p: props}, { open, close }) => {
8182
}
8283

8384
return openStack
84-
// Detect new line
85+
// Wrap each line with the current open/close codes so multi-line output remains correctly styled
8586
+ (output.includes(LF) ? output.replace(/(\r?\n)/g, closeStack + '$1' + openStack) : output)
8687
+ closeStack;
8788
};

0 commit comments

Comments
 (0)