From 6b1fc63dcb0cfab31347d2c92ff1c5be8397f6c8 Mon Sep 17 00:00:00 2001 From: Evan Lucas Date: Thu, 2 Jun 2016 20:31:23 -0500 Subject: [PATCH] readline: allow passing prompt to constructor Previously, one would have to call setPrompt after calling rl.createInterface. Now, the prompt string can be set by passing the prompt property. PR-URL: https://github.com/nodejs/node/pull/7125 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Jeremiah Senkpiel Conflicts: test/parallel/test-readline-interface.js --- doc/api/readline.md | 8 +++-- lib/readline.js | 6 +++- lib/repl.js | 7 ++--- test/parallel/test-readline-interface.js | 37 ++++++++++++++++++++---- 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/doc/api/readline.md b/doc/api/readline.md index 448b109e4d..3855409083 100644 --- a/doc/api/readline.md +++ b/doc/api/readline.md @@ -357,6 +357,7 @@ added: v0.1.98 the history set this value to `0`. Defaults to `30`. This option makes sense only if `terminal` is set to `true` by the user or by an internal `output` check, otherwise the history caching mechanism is not initialized at all. + * `prompt` - the prompt string to use. Default: `'> '` The `readline.createInterface()` method creates a new `readline.Interface` instance. @@ -467,9 +468,12 @@ implement a small command-line interface: ```js const readline = require('readline'); -const rl = readline.createInterface(process.stdin, process.stdout); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + prompt: 'OHAI> ' +}); -rl.setPrompt('OHAI> '); rl.prompt(); rl.on('line', (line) => { diff --git a/lib/readline.js b/lib/readline.js index 46982bca5f..96d7e11489 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -45,6 +45,7 @@ function Interface(input, output, completer, terminal) { EventEmitter.call(this); var historySize; + let prompt = '> '; if (arguments.length === 1) { // an options object was given @@ -52,6 +53,9 @@ function Interface(input, output, completer, terminal) { completer = input.completer; terminal = input.terminal; historySize = input.historySize; + if (input.prompt !== undefined) { + prompt = input.prompt; + } input = input.input; } @@ -88,7 +92,7 @@ function Interface(input, output, completer, terminal) { }; } - this.setPrompt('> '); + this.setPrompt(prompt); this.terminal = !!terminal; diff --git a/lib/repl.js b/lib/repl.js index db5754ec04..01a595984d 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -385,11 +385,10 @@ function REPLServer(prompt, output: self.outputStream, completer: complete, terminal: options.terminal, - historySize: options.historySize + historySize: options.historySize, + prompt }); - self.setPrompt(prompt !== undefined ? prompt : '> '); - this.commands = Object.create(null); defineDefaultCommands(this); @@ -408,8 +407,6 @@ function REPLServer(prompt, }; } - self.setPrompt(self._prompt); - self.on('close', function() { self.emit('exit'); }); diff --git a/test/parallel/test-readline-interface.js b/test/parallel/test-readline-interface.js index b7f906d7c2..fcda628ace 100644 --- a/test/parallel/test-readline-interface.js +++ b/test/parallel/test-readline-interface.js @@ -1,9 +1,11 @@ 'use strict'; -require('../common'); -var assert = require('assert'); -var readline = require('readline'); -var EventEmitter = require('events').EventEmitter; -var inherits = require('util').inherits; +const common = require('../common'); +const assert = require('assert'); +const readline = require('readline'); +const EventEmitter = require('events').EventEmitter; +const inherits = require('util').inherits; +const Writable = require('stream').Writable; +const Readable = require('stream').Readable; function FakeInput() { EventEmitter.call(this); @@ -400,4 +402,29 @@ function isWarned(emitter) { }); }); + { + const expected = terminal + ? ['\u001b[1G', '\u001b[0J', '$ ', '\u001b[3G'] + : ['$ ']; + + let counter = 0; + const output = new Writable({ + write: common.mustCall((chunk, enc, cb) => { + assert.strictEqual(chunk.toString(), expected[counter++]); + cb(); + rl.close(); + }, expected.length) + }); + + const rl = readline.createInterface({ + input: new Readable({ read: () => {} }), + output: output, + prompt: '$ ', + terminal: terminal + }); + + rl.prompt(); + + assert.strictEqual(rl._prompt, '$ '); + } });