From 66b6cc1f28d987974bd962285d6ceb1bf4b447d6 Mon Sep 17 00:00:00 2001 From: Aviv Keller <38299977+RedYetiDev@users.noreply.github.com> Date: Thu, 22 Aug 2024 16:47:57 -0400 Subject: [PATCH 1/4] repl: catch `\v` and `\r` in new-line detection --- lib/internal/repl/utils.js | 6 ++--- test/parallel/test-repl-preview-newlines.js | 29 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 test/parallel/test-repl-preview-newlines.js diff --git a/lib/internal/repl/utils.js b/lib/internal/repl/utils.js index ce0caf6d2a3eb7..27e1011ec9daf6 100644 --- a/lib/internal/repl/utils.js +++ b/lib/internal/repl/utils.js @@ -436,9 +436,9 @@ function setupPreview(repl, contextSymbol, bufferSymbol, active) { // Line breaks are very rare and probably only occur in case of error // messages with line breaks. - const lineBreakPos = StringPrototypeIndexOf(inspected, '\n'); - if (lineBreakPos !== -1) { - inspected = `${StringPrototypeSlice(inspected, 0, lineBreakPos)}`; + const lineBreakMatch = RegExpPrototypeExec(/[\r\n\v]/, inspected); + if (lineBreakMatch !== null) { + inspected = `${StringPrototypeSlice(inspected, 0, lineBreakMatch.index)}`; } const result = repl.useColors ? diff --git a/test/parallel/test-repl-preview-newlines.js b/test/parallel/test-repl-preview-newlines.js new file mode 100644 index 00000000000000..67505895c155d3 --- /dev/null +++ b/test/parallel/test-repl-preview-newlines.js @@ -0,0 +1,29 @@ +'use strict'; + +require('../common'); +const ArrayStream = require('../common/arraystream'); +const assert = require('assert'); +const repl = require('repl'); + +const inputStream = new ArrayStream(); +const outputStream = new ArrayStream(); +repl.start({ + input: inputStream, + output: outputStream, + useGlobal: false, + terminal: true, + useColors: true +}); + +let output = ''; +outputStream.write = (chunk) => output += chunk; + +const testChars = ['\\n', '\\v', '\\r']; + +for (const test of testChars) { + inputStream.emit('data', `"${test}"()`); + // Make sure the output is on a single line + assert.strictEqual(output, `"${test}"()\n\x1B[90mTypeError: "\x1B[39m\x1B[9G\x1B[1A`); + inputStream.run(['']); + output = ''; +} From 19c6ac2705f2368309c6def964ac85917dfdd1a2 Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Sat, 31 Aug 2024 16:01:03 -0400 Subject: [PATCH 2/4] disable if no inspector --- test/parallel/test-repl-preview-newlines.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/parallel/test-repl-preview-newlines.js b/test/parallel/test-repl-preview-newlines.js index 67505895c155d3..b607faa2fd6c46 100644 --- a/test/parallel/test-repl-preview-newlines.js +++ b/test/parallel/test-repl-preview-newlines.js @@ -1,10 +1,12 @@ 'use strict'; -require('../common'); +const common = require('../common'); const ArrayStream = require('../common/arraystream'); const assert = require('assert'); const repl = require('repl'); +common.skipIfInspectorDisabled(); + const inputStream = new ArrayStream(); const outputStream = new ArrayStream(); repl.start({ From 84cf4668ee906bdc91d5ed717898722773eabfa4 Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Mon, 23 Sep 2024 16:38:53 -0400 Subject: [PATCH 3/4] fixup! Co-authored-by: Antoine du Hamel --- test/parallel/test-repl-preview-newlines.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/parallel/test-repl-preview-newlines.js b/test/parallel/test-repl-preview-newlines.js index b607faa2fd6c46..a0055b46fe2c2c 100644 --- a/test/parallel/test-repl-preview-newlines.js +++ b/test/parallel/test-repl-preview-newlines.js @@ -20,12 +20,10 @@ repl.start({ let output = ''; outputStream.write = (chunk) => output += chunk; -const testChars = ['\\n', '\\v', '\\r']; - -for (const test of testChars) { - inputStream.emit('data', `"${test}"()`); +for (const testChar of '\n\v\r') { + inputStream.emit('data', `${JSON.stringify(testChar)}()`); // Make sure the output is on a single line - assert.strictEqual(output, `"${test}"()\n\x1B[90mTypeError: "\x1B[39m\x1B[9G\x1B[1A`); + assert.strictEqual(output, `${JSON.stringify(testChar)}()\n\x1B[90mTypeError: "\x1B[39m\x1B[9G\x1B[1A`); inputStream.run(['']); output = ''; } From 500c5ee54bf7aaa25d9b0f53a60872339135651d Mon Sep 17 00:00:00 2001 From: RedYetiDev <38299977+RedYetiDev@users.noreply.github.com> Date: Mon, 23 Sep 2024 19:33:45 -0400 Subject: [PATCH 4/4] fixup! fixup! --- test/parallel/test-repl-preview-newlines.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/parallel/test-repl-preview-newlines.js b/test/parallel/test-repl-preview-newlines.js index a0055b46fe2c2c..02d294032acd13 100644 --- a/test/parallel/test-repl-preview-newlines.js +++ b/test/parallel/test-repl-preview-newlines.js @@ -20,10 +20,10 @@ repl.start({ let output = ''; outputStream.write = (chunk) => output += chunk; -for (const testChar of '\n\v\r') { - inputStream.emit('data', `${JSON.stringify(testChar)}()`); +for (const char of ['\\n', '\\v', '\\r']) { + inputStream.emit('data', `"${char}"()`); // Make sure the output is on a single line - assert.strictEqual(output, `${JSON.stringify(testChar)}()\n\x1B[90mTypeError: "\x1B[39m\x1B[9G\x1B[1A`); + assert.strictEqual(output, `"${char}"()\n\x1B[90mTypeError: "\x1B[39m\x1B[9G\x1B[1A`); inputStream.run(['']); output = ''; }