Skip to content

Commit 3929fc3

Browse files
committed
util: add fast path to stripVTControlCharacters
1 parent 9cc7fcc commit 3929fc3

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
'use strict';
2+
3+
const common = require('../common.js');
4+
5+
const { stripVTControlCharacters } = require('node:util');
6+
const assert = require('node:assert');
7+
8+
const bench = common.createBenchmark(main, {
9+
input: ['plain-short', 'plain-long', 'ansi-short', 'ansi-heavy'],
10+
n: [1e6],
11+
});
12+
13+
function main({ input, n }) {
14+
let str;
15+
switch (input) {
16+
case 'plain-short':
17+
str = 'Hello, World!';
18+
break;
19+
case 'plain-long':
20+
str = 'a'.repeat(1000);
21+
break;
22+
case 'ansi-short':
23+
str = '\u001B[31mHello\u001B[39m';
24+
break;
25+
case 'ansi-heavy':
26+
str = '\u001B[1m\u001B[31m\u001B[4m' + 'x'.repeat(100) +
27+
'\u001B[24m\u001B[39m\u001B[22m';
28+
break;
29+
}
30+
31+
bench.start();
32+
for (let i = 0; i < n; i++) {
33+
const result = stripVTControlCharacters(str);
34+
assert.ok(typeof result === 'string');
35+
}
36+
bench.end(n);
37+
}

lib/internal/util/inspect.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3036,6 +3036,10 @@ if (internalBinding('config').hasIntl) {
30363036
function stripVTControlCharacters(str) {
30373037
validateString(str, 'str');
30383038

3039+
if (!StringPrototypeIncludes(str, '\u001B') &&
3040+
!StringPrototypeIncludes(str, '\u009B'))
3041+
return str;
3042+
30393043
return RegExpPrototypeSymbolReplace(ansi, str, '');
30403044
}
30413045

test/parallel/test-util.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,13 @@ assert.throws(() => {
8787
message: 'The "str" argument must be of type string.' +
8888
common.invalidArgTypeHelper({})
8989
});
90+
91+
// stripVTControlCharacters: fast path returns input when no ANSI codes
92+
assert.strictEqual(util.stripVTControlCharacters('hello'), 'hello');
93+
assert.strictEqual(util.stripVTControlCharacters(''), '');
94+
95+
// stripVTControlCharacters: strips 7-bit ESC sequences
96+
assert.strictEqual(util.stripVTControlCharacters('\u001B[31mfoo\u001B[39m'), 'foo');
97+
98+
// stripVTControlCharacters: strips 8-bit CSI sequences
99+
assert.strictEqual(util.stripVTControlCharacters('\u009B31mfoo\u009B39m'), 'foo');

0 commit comments

Comments
 (0)