Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

doc: add esm examples to node:repl #55432

Merged
merged 2 commits into from
Dec 14, 2024
Merged
Changes from all commits
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
166 changes: 150 additions & 16 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 @@ -280,20 +303,34 @@ When a new [`repl.REPLServer`][] is created, a custom evaluation function may be
provided. This can be used, for instance, to implement fully customized REPL
applications.

The following illustrates a hypothetical example of a REPL that performs
translation of text from one language to another:
The following illustrates an example of a REPL that squares a given number:

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

function byThePowerOfTwo(number) {
return number * number;
}

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

repl.start({ prompt: 'Enter a number: ', eval: myEval });
```

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

const myTranslator = new Translator('en', 'fr');
function byThePowerOfTwo(number) {
return number * number;
}

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

repl.start({ prompt: '> ', eval: myEval });
repl.start({ prompt: 'Enter a number: ', eval: myEval });
```

#### Recoverable errors
Expand Down Expand Up @@ -354,7 +391,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 +431,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 +484,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
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
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 +548,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
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
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 +728,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 +807,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
Loading