UNPKG

18.1 kBTypeScriptView Raw
1declare module 'repl' {
2 import { Interface, Completer, AsyncCompleter } from 'readline';
3 import { Context } from 'vm';
4 import { InspectOptions } from 'util';
5
6 interface ReplOptions {
7 /**
8 * The input prompt to display.
9 * @default "> "
10 */
11 prompt?: string;
12 /**
13 * The `Readable` stream from which REPL input will be read.
14 * @default process.stdin
15 */
16 input?: NodeJS.ReadableStream;
17 /**
18 * The `Writable` stream to which REPL output will be written.
19 * @default process.stdout
20 */
21 output?: NodeJS.WritableStream;
22 /**
23 * If `true`, specifies that the output should be treated as a TTY terminal, and have
24 * ANSI/VT100 escape codes written to it.
25 * Default: checking the value of the `isTTY` property on the output stream upon
26 * instantiation.
27 */
28 terminal?: boolean;
29 /**
30 * The function to be used when evaluating each given line of input.
31 * Default: an async wrapper for the JavaScript `eval()` function. An `eval` function can
32 * error with `repl.Recoverable` to indicate the input was incomplete and prompt for
33 * additional lines.
34 *
35 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_default_evaluation
36 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_custom_evaluation_functions
37 */
38 eval?: REPLEval;
39 /**
40 * Defines if the repl prints output previews or not.
41 * @default `true` Always `false` in case `terminal` is falsy.
42 */
43 preview?: boolean;
44 /**
45 * If `true`, specifies that the default `writer` function should include ANSI color
46 * styling to REPL output. If a custom `writer` function is provided then this has no
47 * effect.
48 * Default: the REPL instance's `terminal` value.
49 */
50 useColors?: boolean;
51 /**
52 * If `true`, specifies that the default evaluation function will use the JavaScript
53 * `global` as the context as opposed to creating a new separate context for the REPL
54 * instance. The node CLI REPL sets this value to `true`.
55 * Default: `false`.
56 */
57 useGlobal?: boolean;
58 /**
59 * If `true`, specifies that the default writer will not output the return value of a
60 * command if it evaluates to `undefined`.
61 * Default: `false`.
62 */
63 ignoreUndefined?: boolean;
64 /**
65 * The function to invoke to format the output of each command before writing to `output`.
66 * Default: a wrapper for `util.inspect`.
67 *
68 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_customizing_repl_output
69 */
70 writer?: REPLWriter;
71 /**
72 * An optional function used for custom Tab auto completion.
73 *
74 * @see https://nodejs.org/dist/latest-v11.x/docs/api/readline.html#readline_use_of_the_completer_function
75 */
76 completer?: Completer | AsyncCompleter;
77 /**
78 * A flag that specifies whether the default evaluator executes all JavaScript commands in
79 * strict mode or default (sloppy) mode.
80 * Accepted values are:
81 * - `repl.REPL_MODE_SLOPPY` - evaluates expressions in sloppy mode.
82 * - `repl.REPL_MODE_STRICT` - evaluates expressions in strict mode. This is equivalent to
83 * prefacing every repl statement with `'use strict'`.
84 */
85 replMode?: typeof REPL_MODE_SLOPPY | typeof REPL_MODE_STRICT;
86 /**
87 * Stop evaluating the current piece of code when `SIGINT` is received, i.e. `Ctrl+C` is
88 * pressed. This cannot be used together with a custom `eval` function.
89 * Default: `false`.
90 */
91 breakEvalOnSigint?: boolean;
92 }
93
94 type REPLEval = (this: REPLServer, evalCmd: string, context: Context, file: string, cb: (err: Error | null, result: any) => void) => void;
95 type REPLWriter = (this: REPLServer, obj: any) => string;
96
97 /**
98 * This is the default "writer" value, if none is passed in the REPL options,
99 * and it can be overridden by custom print functions.
100 */
101 const writer: REPLWriter & { options: InspectOptions };
102
103 type REPLCommandAction = (this: REPLServer, text: string) => void;
104
105 interface REPLCommand {
106 /**
107 * Help text to be displayed when `.help` is entered.
108 */
109 help?: string;
110 /**
111 * The function to execute, optionally accepting a single string argument.
112 */
113 action: REPLCommandAction;
114 }
115
116 /**
117 * Provides a customizable Read-Eval-Print-Loop (REPL).
118 *
119 * Instances of `repl.REPLServer` will accept individual lines of user input, evaluate those
120 * according to a user-defined evaluation function, then output the result. Input and output
121 * may be from `stdin` and `stdout`, respectively, or may be connected to any Node.js `stream`.
122 *
123 * Instances of `repl.REPLServer` support automatic completion of inputs, simplistic Emacs-style
124 * line editing, multi-line inputs, ANSI-styled output, saving and restoring current REPL session
125 * state, error recovery, and customizable evaluation functions.
126 *
127 * Instances of `repl.REPLServer` are created using the `repl.start()` method and _should not_
128 * be created directly using the JavaScript `new` keyword.
129 *
130 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_repl
131 */
132 class REPLServer extends Interface {
133 /**
134 * The `vm.Context` provided to the `eval` function to be used for JavaScript
135 * evaluation.
136 */
137 readonly context: Context;
138 /**
139 * @deprecated since v14.3.0 - Use `input` instead.
140 */
141 readonly inputStream: NodeJS.ReadableStream;
142 /**
143 * @deprecated since v14.3.0 - Use `output` instead.
144 */
145 readonly outputStream: NodeJS.WritableStream;
146 /**
147 * The `Readable` stream from which REPL input will be read.
148 */
149 readonly input: NodeJS.ReadableStream;
150 /**
151 * The `Writable` stream to which REPL output will be written.
152 */
153 readonly output: NodeJS.WritableStream;
154 /**
155 * The commands registered via `replServer.defineCommand()`.
156 */
157 readonly commands: NodeJS.ReadOnlyDict<REPLCommand>;
158 /**
159 * A value indicating whether the REPL is currently in "editor mode".
160 *
161 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_commands_and_special_keys
162 */
163 readonly editorMode: boolean;
164 /**
165 * A value indicating whether the `_` variable has been assigned.
166 *
167 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable
168 */
169 readonly underscoreAssigned: boolean;
170 /**
171 * The last evaluation result from the REPL (assigned to the `_` variable inside of the REPL).
172 *
173 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable
174 */
175 readonly last: any;
176 /**
177 * A value indicating whether the `_error` variable has been assigned.
178 *
179 * @since v9.8.0
180 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable
181 */
182 readonly underscoreErrAssigned: boolean;
183 /**
184 * The last error raised inside the REPL (assigned to the `_error` variable inside of the REPL).
185 *
186 * @since v9.8.0
187 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_assignment_of_the_underscore_variable
188 */
189 readonly lastError: any;
190 /**
191 * Specified in the REPL options, this is the function to be used when evaluating each
192 * given line of input. If not specified in the REPL options, this is an async wrapper
193 * for the JavaScript `eval()` function.
194 */
195 readonly eval: REPLEval;
196 /**
197 * Specified in the REPL options, this is a value indicating whether the default
198 * `writer` function should include ANSI color styling to REPL output.
199 */
200 readonly useColors: boolean;
201 /**
202 * Specified in the REPL options, this is a value indicating whether the default `eval`
203 * function will use the JavaScript `global` as the context as opposed to creating a new
204 * separate context for the REPL instance.
205 */
206 readonly useGlobal: boolean;
207 /**
208 * Specified in the REPL options, this is a value indicating whether the default `writer`
209 * function should output the result of a command if it evaluates to `undefined`.
210 */
211 readonly ignoreUndefined: boolean;
212 /**
213 * Specified in the REPL options, this is the function to invoke to format the output of
214 * each command before writing to `outputStream`. If not specified in the REPL options,
215 * this will be a wrapper for `util.inspect`.
216 */
217 readonly writer: REPLWriter;
218 /**
219 * Specified in the REPL options, this is the function to use for custom Tab auto-completion.
220 */
221 readonly completer: Completer | AsyncCompleter;
222 /**
223 * Specified in the REPL options, this is a flag that specifies whether the default `eval`
224 * function should execute all JavaScript commands in strict mode or default (sloppy) mode.
225 * Possible values are:
226 * - `repl.REPL_MODE_SLOPPY` - evaluates expressions in sloppy mode.
227 * - `repl.REPL_MODE_STRICT` - evaluates expressions in strict mode. This is equivalent to
228 * prefacing every repl statement with `'use strict'`.
229 */
230 readonly replMode: typeof REPL_MODE_SLOPPY | typeof REPL_MODE_STRICT;
231
232 /**
233 * NOTE: According to the documentation:
234 *
235 * > Instances of `repl.REPLServer` are created using the `repl.start()` method and
236 * > _should not_ be created directly using the JavaScript `new` keyword.
237 *
238 * `REPLServer` cannot be subclassed due to implementation specifics in NodeJS.
239 *
240 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_class_replserver
241 */
242 private constructor();
243
244 /**
245 * Used to add new `.`-prefixed commands to the REPL instance. Such commands are invoked
246 * by typing a `.` followed by the `keyword`.
247 *
248 * @param keyword The command keyword (_without_ a leading `.` character).
249 * @param cmd The function to invoke when the command is processed.
250 *
251 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_replserver_definecommand_keyword_cmd
252 */
253 defineCommand(keyword: string, cmd: REPLCommandAction | REPLCommand): void;
254 /**
255 * Readies the REPL instance for input from the user, printing the configured `prompt` to a
256 * new line in the `output` and resuming the `input` to accept new input.
257 *
258 * When multi-line input is being entered, an ellipsis is printed rather than the 'prompt'.
259 *
260 * This method is primarily intended to be called from within the action function for
261 * commands registered using the `replServer.defineCommand()` method.
262 *
263 * @param preserveCursor When `true`, the cursor placement will not be reset to `0`.
264 */
265 displayPrompt(preserveCursor?: boolean): void;
266 /**
267 * Clears any command that has been buffered but not yet executed.
268 *
269 * This method is primarily intended to be called from within the action function for
270 * commands registered using the `replServer.defineCommand()` method.
271 *
272 * @since v9.0.0
273 */
274 clearBufferedCommand(): void;
275
276 /**
277 * Initializes a history log file for the REPL instance. When executing the
278 * Node.js binary and using the command line REPL, a history file is initialized
279 * by default. However, this is not the case when creating a REPL
280 * programmatically. Use this method to initialize a history log file when working
281 * with REPL instances programmatically.
282 * @param path The path to the history file
283 */
284 setupHistory(path: string, cb: (err: Error | null, repl: this) => void): void;
285
286 /**
287 * events.EventEmitter
288 * 1. close - inherited from `readline.Interface`
289 * 2. line - inherited from `readline.Interface`
290 * 3. pause - inherited from `readline.Interface`
291 * 4. resume - inherited from `readline.Interface`
292 * 5. SIGCONT - inherited from `readline.Interface`
293 * 6. SIGINT - inherited from `readline.Interface`
294 * 7. SIGTSTP - inherited from `readline.Interface`
295 * 8. exit
296 * 9. reset
297 */
298
299 addListener(event: string, listener: (...args: any[]) => void): this;
300 addListener(event: "close", listener: () => void): this;
301 addListener(event: "line", listener: (input: string) => void): this;
302 addListener(event: "pause", listener: () => void): this;
303 addListener(event: "resume", listener: () => void): this;
304 addListener(event: "SIGCONT", listener: () => void): this;
305 addListener(event: "SIGINT", listener: () => void): this;
306 addListener(event: "SIGTSTP", listener: () => void): this;
307 addListener(event: "exit", listener: () => void): this;
308 addListener(event: "reset", listener: (context: Context) => void): this;
309
310 emit(event: string | symbol, ...args: any[]): boolean;
311 emit(event: "close"): boolean;
312 emit(event: "line", input: string): boolean;
313 emit(event: "pause"): boolean;
314 emit(event: "resume"): boolean;
315 emit(event: "SIGCONT"): boolean;
316 emit(event: "SIGINT"): boolean;
317 emit(event: "SIGTSTP"): boolean;
318 emit(event: "exit"): boolean;
319 emit(event: "reset", context: Context): boolean;
320
321 on(event: string, listener: (...args: any[]) => void): this;
322 on(event: "close", listener: () => void): this;
323 on(event: "line", listener: (input: string) => void): this;
324 on(event: "pause", listener: () => void): this;
325 on(event: "resume", listener: () => void): this;
326 on(event: "SIGCONT", listener: () => void): this;
327 on(event: "SIGINT", listener: () => void): this;
328 on(event: "SIGTSTP", listener: () => void): this;
329 on(event: "exit", listener: () => void): this;
330 on(event: "reset", listener: (context: Context) => void): this;
331
332 once(event: string, listener: (...args: any[]) => void): this;
333 once(event: "close", listener: () => void): this;
334 once(event: "line", listener: (input: string) => void): this;
335 once(event: "pause", listener: () => void): this;
336 once(event: "resume", listener: () => void): this;
337 once(event: "SIGCONT", listener: () => void): this;
338 once(event: "SIGINT", listener: () => void): this;
339 once(event: "SIGTSTP", listener: () => void): this;
340 once(event: "exit", listener: () => void): this;
341 once(event: "reset", listener: (context: Context) => void): this;
342
343 prependListener(event: string, listener: (...args: any[]) => void): this;
344 prependListener(event: "close", listener: () => void): this;
345 prependListener(event: "line", listener: (input: string) => void): this;
346 prependListener(event: "pause", listener: () => void): this;
347 prependListener(event: "resume", listener: () => void): this;
348 prependListener(event: "SIGCONT", listener: () => void): this;
349 prependListener(event: "SIGINT", listener: () => void): this;
350 prependListener(event: "SIGTSTP", listener: () => void): this;
351 prependListener(event: "exit", listener: () => void): this;
352 prependListener(event: "reset", listener: (context: Context) => void): this;
353
354 prependOnceListener(event: string, listener: (...args: any[]) => void): this;
355 prependOnceListener(event: "close", listener: () => void): this;
356 prependOnceListener(event: "line", listener: (input: string) => void): this;
357 prependOnceListener(event: "pause", listener: () => void): this;
358 prependOnceListener(event: "resume", listener: () => void): this;
359 prependOnceListener(event: "SIGCONT", listener: () => void): this;
360 prependOnceListener(event: "SIGINT", listener: () => void): this;
361 prependOnceListener(event: "SIGTSTP", listener: () => void): this;
362 prependOnceListener(event: "exit", listener: () => void): this;
363 prependOnceListener(event: "reset", listener: (context: Context) => void): this;
364 }
365
366 /**
367 * A flag passed in the REPL options. Evaluates expressions in sloppy mode.
368 */
369 const REPL_MODE_SLOPPY: unique symbol;
370
371 /**
372 * A flag passed in the REPL options. Evaluates expressions in strict mode.
373 * This is equivalent to prefacing every repl statement with `'use strict'`.
374 */
375 const REPL_MODE_STRICT: unique symbol;
376
377 /**
378 * Creates and starts a `repl.REPLServer` instance.
379 *
380 * @param options The options for the `REPLServer`. If `options` is a string, then it specifies
381 * the input prompt.
382 */
383 function start(options?: string | ReplOptions): REPLServer;
384
385 /**
386 * Indicates a recoverable error that a `REPLServer` can use to support multi-line input.
387 *
388 * @see https://nodejs.org/dist/latest-v10.x/docs/api/repl.html#repl_recoverable_errors
389 */
390 class Recoverable extends SyntaxError {
391 err: Error;
392
393 constructor(err: Error);
394 }
395}