Skip to content

Commit

Permalink
readline: allow passing prompt to constructor
Browse files Browse the repository at this point in the history
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: #7125
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
  • Loading branch information
evanlucas committed Jun 25, 2016
1 parent 1d75987 commit 3f5623d
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 9 deletions.
8 changes: 6 additions & 2 deletions doc/api/readline.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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) => {
Expand Down
6 changes: 5 additions & 1 deletion lib/readline.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,17 @@ function Interface(input, output, completer, terminal) {

EventEmitter.call(this);
var historySize;
let prompt = '> ';

if (arguments.length === 1) {
// an options object was given
output = input.output;
completer = input.completer;
terminal = input.terminal;
historySize = input.historySize;
if (input.prompt !== undefined) {
prompt = input.prompt;
}
input = input.input;
}

Expand Down Expand Up @@ -87,7 +91,7 @@ function Interface(input, output, completer, terminal) {
};
}

this.setPrompt('> ');
this.setPrompt(prompt);

this.terminal = !!terminal;

Expand Down
7 changes: 2 additions & 5 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -408,8 +407,6 @@ function REPLServer(prompt,
};
}

self.setPrompt(self._prompt);

self.on('close', function() {
self.emit('exit');
});
Expand Down
29 changes: 28 additions & 1 deletion test/parallel/test-readline-interface.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
// Flags: --expose_internals
'use strict';
require('../common');
const common = require('../common');
const assert = require('assert');
const readline = require('readline');
const internalReadline = require('internal/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);
Expand Down Expand Up @@ -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, '$ ');
}
});

0 comments on commit 3f5623d

Please sign in to comment.