Skip to content

Commit 69681ea

Browse files
authored
fix: strip destructive ANSI codes from task logs (#420)
1 parent 0041d81 commit 69681ea

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

.changeset/evil-rats-turn.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@clack/prompts": patch
3+
---
4+
5+
Strip destructive ANSI codes from task log messages.

packages/prompts/src/task-log.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ interface BufferEntry {
3636
};
3737
}
3838

39+
const stripDestructiveANSI = (input: string): string => {
40+
return input.replace(/\x1b\[(?:\d+;)*\d*[ABCDEFGHfJKSTsu]|\x1b\[(s|u)/g, '');
41+
};
42+
3943
/**
4044
* Renders a log which clears on success and remains on failure
4145
*/
@@ -131,7 +135,7 @@ export const taskLog = (opts: TaskLogOptions) => {
131135
if ((mopts?.raw !== true || !lastMessageWasRaw) && buffer.value !== '') {
132136
buffer.value += '\n';
133137
}
134-
buffer.value += msg;
138+
buffer.value += stripDestructiveANSI(msg);
135139
lastMessageWasRaw = mopts?.raw === true;
136140
if (opts.limit !== undefined) {
137141
const lines = buffer.value.split('\n');

packages/prompts/test/__snapshots__/task-log.test.ts.snap

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,28 @@ exports[`taskLog (isCI = false) > message > can write multiple lines 1`] = `
627627
]
628628
`;
629629
630+
exports[`taskLog (isCI = false) > message > destructive ansi codes are stripped 1`] = `
631+
[
632+
"│
633+
",
634+
"◇ foo
635+
",
636+
"│
637+
",
638+
"│ line 1
639+
",
640+
"<erase.line><cursor.up count=1><erase.line><cursor.left count=1>",
641+
"│ line 1
642+
│ line 2 bad ansi!
643+
",
644+
"<erase.line><cursor.up count=1><erase.line><cursor.up count=1><erase.line><cursor.left count=1>",
645+
"│ line 1
646+
│ line 2 bad ansi!
647+
│ line 3
648+
",
649+
]
650+
`;
651+
630652
exports[`taskLog (isCI = false) > message > enforces limit if set 1`] = `
631653
[
632654
"│
@@ -1358,6 +1380,19 @@ exports[`taskLog (isCI = true) > message > can write multiple lines 1`] = `
13581380
]
13591381
`;
13601382
1383+
exports[`taskLog (isCI = true) > message > destructive ansi codes are stripped 1`] = `
1384+
[
1385+
"│
1386+
",
1387+
"◇ foo
1388+
",
1389+
"│
1390+
",
1391+
"<erase.line><cursor.up count=1><erase.line><cursor.left count=1>",
1392+
"<erase.line><cursor.up count=1><erase.line><cursor.up count=1><erase.line><cursor.left count=1>",
1393+
]
1394+
`;
1395+
13611396
exports[`taskLog (isCI = true) > message > enforces limit if set 1`] = `
13621397
[
13631398
"│

packages/prompts/test/task-log.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,20 @@ describe.each(['true', 'false'])('taskLog (isCI = %s)', (isCI) => {
132132

133133
expect(output.buffer).toMatchSnapshot();
134134
});
135+
136+
test('destructive ansi codes are stripped', async () => {
137+
const log = prompts.taskLog({
138+
input,
139+
output,
140+
title: 'foo',
141+
});
142+
143+
log.message('line 1');
144+
log.message('line 2\x1b[2K bad ansi!');
145+
log.message('line 3');
146+
147+
expect(output.buffer).toMatchSnapshot();
148+
});
135149
});
136150

137151
describe('error', () => {

0 commit comments

Comments
 (0)