Browse Source

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 <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
v7.x
Evan Lucas 9 years ago
parent
commit
3f5623dd46
  1. 8
      doc/api/readline.md
  2. 6
      lib/readline.js
  3. 7
      lib/repl.js
  4. 29
      test/parallel/test-readline-interface.js

8
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 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` 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. 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` The `readline.createInterface()` method creates a new `readline.Interface`
instance. instance.
@ -467,9 +468,12 @@ implement a small command-line interface:
```js ```js
const readline = require('readline'); 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.prompt();
rl.on('line', (line) => { rl.on('line', (line) => {

6
lib/readline.js

@ -44,6 +44,7 @@ function Interface(input, output, completer, terminal) {
EventEmitter.call(this); EventEmitter.call(this);
var historySize; var historySize;
let prompt = '> ';
if (arguments.length === 1) { if (arguments.length === 1) {
// an options object was given // an options object was given
@ -51,6 +52,9 @@ function Interface(input, output, completer, terminal) {
completer = input.completer; completer = input.completer;
terminal = input.terminal; terminal = input.terminal;
historySize = input.historySize; historySize = input.historySize;
if (input.prompt !== undefined) {
prompt = input.prompt;
}
input = input.input; input = input.input;
} }
@ -87,7 +91,7 @@ function Interface(input, output, completer, terminal) {
}; };
} }
this.setPrompt('> '); this.setPrompt(prompt);
this.terminal = !!terminal; this.terminal = !!terminal;

7
lib/repl.js

@ -385,11 +385,10 @@ function REPLServer(prompt,
output: self.outputStream, output: self.outputStream,
completer: complete, completer: complete,
terminal: options.terminal, terminal: options.terminal,
historySize: options.historySize historySize: options.historySize,
prompt
}); });
self.setPrompt(prompt !== undefined ? prompt : '> ');
this.commands = Object.create(null); this.commands = Object.create(null);
defineDefaultCommands(this); defineDefaultCommands(this);
@ -408,8 +407,6 @@ function REPLServer(prompt,
}; };
} }
self.setPrompt(self._prompt);
self.on('close', function() { self.on('close', function() {
self.emit('exit'); self.emit('exit');
}); });

29
test/parallel/test-readline-interface.js

@ -1,11 +1,13 @@
// Flags: --expose_internals // Flags: --expose_internals
'use strict'; 'use strict';
require('../common'); const common = require('../common');
const assert = require('assert'); const assert = require('assert');
const readline = require('readline'); const readline = require('readline');
const internalReadline = require('internal/readline'); const internalReadline = require('internal/readline');
const EventEmitter = require('events').EventEmitter; const EventEmitter = require('events').EventEmitter;
const inherits = require('util').inherits; const inherits = require('util').inherits;
const Writable = require('stream').Writable;
const Readable = require('stream').Readable;
function FakeInput() { function FakeInput() {
EventEmitter.call(this); EventEmitter.call(this);
@ -396,4 +398,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, '$ ');
}
}); });

Loading…
Cancel
Save