Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 143 additions & 10 deletions doc/api/repl.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ The `node:repl` module provides a Read-Eval-Print-Loop (REPL) implementation
that is available both as a standalone program or includible in other
applications. It can be accessed using:

```js
```mjs
import repl from 'node:repl';
```

```cjs
const repl = require('node:repl');
```

Expand Down Expand Up @@ -106,7 +110,14 @@ The default evaluator provides access to any variables that exist in the global
scope. It is possible to expose a variable to the REPL explicitly by assigning
it to the `context` object associated with each `REPLServer`:

```js
```mjs
import repl from 'node:repl';
const msg = 'message';

repl.start('> ').context.m = msg;
```

```cjs
const repl = require('node:repl');
const msg = 'message';

Expand All @@ -124,7 +135,19 @@ $ node repl_test.js
Context properties are not read-only by default. To specify read-only globals,
context properties must be defined using `Object.defineProperty()`:

```js
```mjs
import repl from 'node:repl';
const msg = 'message';

const r = repl.start('> ');
Object.defineProperty(r.context, 'm', {
configurable: false,
enumerable: true,
value: msg,
});
```

```cjs
const repl = require('node:repl');
const msg = 'message';

Expand Down Expand Up @@ -283,7 +306,20 @@ applications.
The following illustrates a hypothetical example of a REPL that performs
translation of text from one language to another:

```js
```mjs
import repl from 'node:repl';
import { Translator } from 'translator';

const myTranslator = new Translator('en', 'fr');

function myEval(cmd, context, filename, callback) {
callback(null, myTranslator.translate(cmd));
}

repl.start({ prompt: '> ', eval: myEval });
```
Comment on lines +309 to +320
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this code block adds a mock dependency to a module that actually exists and is very dormant (translator). IMO we should try to avoid that and the alternative of using a module that doesn't exist.

While this is also true of the previously existing example, since it's being updated now with a totally new example I think it's a good time to adjust it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed! I also thought about that example since it throws an error when you try to execute it as is and new users can be frustrated by that, I'll come up with a good alternative and update as soon as I can! Thanks for the feedback! 🙌

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've updated the example, tell me what you think! 😊 And again, thank you for taking the time to provide feedback! 🙏


```cjs
const repl = require('node:repl');
const { Translator } = require('translator');

Expand Down Expand Up @@ -354,7 +390,21 @@ To fully customize the output of a [`repl.REPLServer`][] instance pass in a new
function for the `writer` option on construction. The following example, for
instance, simply converts any input text to upper case:

```js
```mjs
import repl from 'node:repl';

const r = repl.start({ prompt: '> ', eval: myEval, writer: myWriter });

function myEval(cmd, context, filename, callback) {
callback(null, cmd);
}

function myWriter(output) {
return output.toUpperCase();
}
```

```cjs
const repl = require('node:repl');

const r = repl.start({ prompt: '> ', eval: myEval, writer: myWriter });
Expand All @@ -380,7 +430,16 @@ added: v0.1.91
Instances of `repl.REPLServer` are created using the [`repl.start()`][] method
or directly using the JavaScript `new` keyword.

```js
```mjs
import repl from 'node:repl';

const options = { useColors: true };

const firstInstance = repl.start(options);
const secondInstance = new repl.REPLServer(options);
```

```cjs
const repl = require('node:repl');

const options = { useColors: true };
Expand Down Expand Up @@ -424,7 +483,20 @@ reference to the `context` object as the only argument.
This can be used primarily to re-initialize REPL context to some pre-defined
state:

```js
```mjs
import repl from 'node:repl';

function initializeContext(context) {
context.m = 'test';
}

const r = repl.start({ prompt: '> ' });
initializeContext(r.context);

r.on('reset', initializeContext);
```
Comment on lines +487 to +498
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this one is working as it's described? Maybe I'm misunderstanding what's supposed to happen here?
image

Copy link
Copy Markdown
Contributor Author

@mfdebian mfdebian Oct 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It resets the context, m equals to 'test', but if you were to do something like m = 'other thing' and then you call .clear it will reset the context, so when you print the value of m it would be reset back to 'test' 😊

full example:

$ ./node index.js
> m
'test'
> m = 1
1
> m
1
> .clear
Clearing context...
> m
'test'
> 


```cjs
const repl = require('node:repl');

function initializeContext(context) {
Expand Down Expand Up @@ -475,7 +547,25 @@ properties:

The following example shows two new commands added to the REPL instance:

```js
```mjs
import repl from 'node:repl';

const replServer = repl.start({ prompt: '> ' });
replServer.defineCommand('sayhello', {
help: 'Say hello',
action(name) {
this.clearBufferedCommand();
console.log(`Hello, ${name}!`);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this output doesn't quite make sense - where would ${name} ever come from?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's passed when you execute the .sayhello command, like so:

> .sayhello bnb
Hello, bnb!

this.displayPrompt();
},
});
replServer.defineCommand('saybye', function saybye() {
console.log('Goodbye!');
this.close();
});
```

```cjs
const repl = require('node:repl');

const replServer = repl.start({ prompt: '> ' });
Expand Down Expand Up @@ -637,7 +727,14 @@ The `repl.start()` method creates and starts a [`repl.REPLServer`][] instance.

If `options` is a string, then it specifies the input prompt:

```js
```mjs
import repl from 'node:repl';

// a Unix style prompt
repl.start('$ ');
```

```cjs
const repl = require('node:repl');

// a Unix style prompt
Expand Down Expand Up @@ -709,7 +806,43 @@ separate I/O interfaces.
The following example, for instance, provides separate REPLs on `stdin`, a Unix
socket, and a TCP socket:

```js
```mjs
import net from 'node:net';
import repl from 'node:repl';
import process from 'node:process';

let connections = 0;

repl.start({
prompt: 'Node.js via stdin> ',
input: process.stdin,
output: process.stdout,
});

net.createServer((socket) => {
connections += 1;
repl.start({
prompt: 'Node.js via Unix socket> ',
input: socket,
output: socket,
}).on('exit', () => {
socket.end();
});
}).listen('/tmp/node-repl-sock');

net.createServer((socket) => {
connections += 1;
repl.start({
prompt: 'Node.js via TCP socket> ',
input: socket,
output: socket,
}).on('exit', () => {
socket.end();
});
}).listen(5001);
```

```cjs
const net = require('node:net');
const repl = require('node:repl');
let connections = 0;
Expand Down