diff --git a/lib/internal/readline/interface.js b/lib/internal/readline/interface.js index 89936642356..fe89598c523 100644 --- a/lib/internal/readline/interface.js +++ b/lib/internal/readline/interface.js @@ -78,8 +78,15 @@ const { StringDecoder } = require('string_decoder'); const kHistorySize = 30; const kMaxUndoRedoStackSize = 2048; const kMincrlfDelay = 100; -// \r\n, \n, or \r followed by something other than \n -const lineEnding = /\r?\n|\r(?!\n)/g; +/** + * The end of a line is signaled by either one of the following: + * - \r\n + * - \n + * - \r followed by something other than \n + * - \u2028 (Unicode 'LINE SEPARATOR') + * - \u2029 (Unicode 'PARAGRAPH SEPARATOR') + */ +const lineEnding = /\r?\n|\r(?!\n)|\u2028|\u2029/g; const kLineObjectStream = Symbol('line object stream'); const kQuestionCancel = Symbol('kQuestionCancel'); diff --git a/test/parallel/test-readline-line-separators.js b/test/parallel/test-readline-line-separators.js new file mode 100644 index 00000000000..7591f50c7fa --- /dev/null +++ b/test/parallel/test-readline-line-separators.js @@ -0,0 +1,18 @@ +'use strict'; +const common = require('../common'); +const assert = require('node:assert'); +const readline = require('node:readline'); +const { Readable } = require('node:stream'); + +const str = '012\n345\r67\r\n89\u{2028}ABC\u{2029}DEF'; + +const rli = new readline.Interface({ + input: Readable.from(str), +}); + +const linesRead = []; +rli.on('line', (line) => linesRead.push(line)); + +rli.on('close', common.mustCall(() => { + assert.deepStrictEqual(linesRead, ['012', '345', '67', '89', 'ABC', 'DEF']); +}));