a60aee6c637057d1cb185c90c9354f2e6f99b004983d57f8402c04fb5101bd1a3703919f54a8f461254902ce969660f082590764c6dcb8f7e7e502325b9695 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. /**
  2. * The `node:readline` module provides an interface for reading data from a [Readable](https://nodejs.org/docs/latest-v22.x/api/stream.html#readable-streams) stream
  3. * (such as [`process.stdin`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdin)) one line at a time.
  4. *
  5. * To use the promise-based APIs:
  6. *
  7. * ```js
  8. * import * as readline from 'node:readline/promises';
  9. * ```
  10. *
  11. * To use the callback and sync APIs:
  12. *
  13. * ```js
  14. * import * as readline from 'node:readline';
  15. * ```
  16. *
  17. * The following simple example illustrates the basic use of the `node:readline` module.
  18. *
  19. * ```js
  20. * import * as readline from 'node:readline/promises';
  21. * import { stdin as input, stdout as output } from 'node:process';
  22. *
  23. * const rl = readline.createInterface({ input, output });
  24. *
  25. * const answer = await rl.question('What do you think of Node.js? ');
  26. *
  27. * console.log(`Thank you for your valuable feedback: ${answer}`);
  28. *
  29. * rl.close();
  30. * ```
  31. *
  32. * Once this code is invoked, the Node.js application will not terminate until the `readline.Interface` is closed because the interface waits for data to be
  33. * received on the `input` stream.
  34. * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/readline.js)
  35. */
  36. declare module "readline" {
  37. import { Abortable, EventEmitter } from "node:events";
  38. import * as promises from "node:readline/promises";
  39. export { promises };
  40. export interface Key {
  41. sequence?: string | undefined;
  42. name?: string | undefined;
  43. ctrl?: boolean | undefined;
  44. meta?: boolean | undefined;
  45. shift?: boolean | undefined;
  46. }
  47. /**
  48. * Instances of the `readline.Interface` class are constructed using the `readline.createInterface()` method. Every instance is associated with a
  49. * single `input` [Readable](https://nodejs.org/docs/latest-v22.x/api/stream.html#readable-streams) stream and a single `output` [Writable](https://nodejs.org/docs/latest-v22.x/api/stream.html#writable-streams) stream.
  50. * The `output` stream is used to print prompts for user input that arrives on,
  51. * and is read from, the `input` stream.
  52. * @since v0.1.104
  53. */
  54. export class Interface extends EventEmitter implements Disposable {
  55. readonly terminal: boolean;
  56. /**
  57. * The current input data being processed by node.
  58. *
  59. * This can be used when collecting input from a TTY stream to retrieve the
  60. * current value that has been processed thus far, prior to the `line` event
  61. * being emitted. Once the `line` event has been emitted, this property will
  62. * be an empty string.
  63. *
  64. * Be aware that modifying the value during the instance runtime may have
  65. * unintended consequences if `rl.cursor` is not also controlled.
  66. *
  67. * **If not using a TTY stream for input, use the `'line'` event.**
  68. *
  69. * One possible use case would be as follows:
  70. *
  71. * ```js
  72. * const values = ['lorem ipsum', 'dolor sit amet'];
  73. * const rl = readline.createInterface(process.stdin);
  74. * const showResults = debounce(() => {
  75. * console.log(
  76. * '\n',
  77. * values.filter((val) => val.startsWith(rl.line)).join(' '),
  78. * );
  79. * }, 300);
  80. * process.stdin.on('keypress', (c, k) => {
  81. * showResults();
  82. * });
  83. * ```
  84. * @since v0.1.98
  85. */
  86. readonly line: string;
  87. /**
  88. * The cursor position relative to `rl.line`.
  89. *
  90. * This will track where the current cursor lands in the input string, when
  91. * reading input from a TTY stream. The position of cursor determines the
  92. * portion of the input string that will be modified as input is processed,
  93. * as well as the column where the terminal caret will be rendered.
  94. * @since v0.1.98
  95. */
  96. readonly cursor: number;
  97. /**
  98. * NOTE: According to the documentation:
  99. *
  100. * > Instances of the `readline.Interface` class are constructed using the
  101. * > `readline.createInterface()` method.
  102. *
  103. * @see https://nodejs.org/dist/latest-v22.x/docs/api/readline.html#class-interfaceconstructor
  104. */
  105. protected constructor(
  106. input: NodeJS.ReadableStream,
  107. output?: NodeJS.WritableStream,
  108. completer?: Completer | AsyncCompleter,
  109. terminal?: boolean,
  110. );
  111. /**
  112. * NOTE: According to the documentation:
  113. *
  114. * > Instances of the `readline.Interface` class are constructed using the
  115. * > `readline.createInterface()` method.
  116. *
  117. * @see https://nodejs.org/dist/latest-v22.x/docs/api/readline.html#class-interfaceconstructor
  118. */
  119. protected constructor(options: ReadLineOptions);
  120. /**
  121. * The `rl.getPrompt()` method returns the current prompt used by `rl.prompt()`.
  122. * @since v15.3.0, v14.17.0
  123. * @return the current prompt string
  124. */
  125. getPrompt(): string;
  126. /**
  127. * The `rl.setPrompt()` method sets the prompt that will be written to `output` whenever `rl.prompt()` is called.
  128. * @since v0.1.98
  129. */
  130. setPrompt(prompt: string): void;
  131. /**
  132. * The `rl.prompt()` method writes the `Interface` instances configured`prompt` to a new line in `output` in order to provide a user with a new
  133. * location at which to provide input.
  134. *
  135. * When called, `rl.prompt()` will resume the `input` stream if it has been
  136. * paused.
  137. *
  138. * If the `Interface` was created with `output` set to `null` or `undefined` the prompt is not written.
  139. * @since v0.1.98
  140. * @param preserveCursor If `true`, prevents the cursor placement from being reset to `0`.
  141. */
  142. prompt(preserveCursor?: boolean): void;
  143. /**
  144. * The `rl.question()` method displays the `query` by writing it to the `output`,
  145. * waits for user input to be provided on `input`, then invokes the `callback` function passing the provided input as the first argument.
  146. *
  147. * When called, `rl.question()` will resume the `input` stream if it has been
  148. * paused.
  149. *
  150. * If the `Interface` was created with `output` set to `null` or `undefined` the `query` is not written.
  151. *
  152. * The `callback` function passed to `rl.question()` does not follow the typical
  153. * pattern of accepting an `Error` object or `null` as the first argument.
  154. * The `callback` is called with the provided answer as the only argument.
  155. *
  156. * An error will be thrown if calling `rl.question()` after `rl.close()`.
  157. *
  158. * Example usage:
  159. *
  160. * ```js
  161. * rl.question('What is your favorite food? ', (answer) => {
  162. * console.log(`Oh, so your favorite food is ${answer}`);
  163. * });
  164. * ```
  165. *
  166. * Using an `AbortController` to cancel a question.
  167. *
  168. * ```js
  169. * const ac = new AbortController();
  170. * const signal = ac.signal;
  171. *
  172. * rl.question('What is your favorite food? ', { signal }, (answer) => {
  173. * console.log(`Oh, so your favorite food is ${answer}`);
  174. * });
  175. *
  176. * signal.addEventListener('abort', () => {
  177. * console.log('The food question timed out');
  178. * }, { once: true });
  179. *
  180. * setTimeout(() => ac.abort(), 10000);
  181. * ```
  182. * @since v0.3.3
  183. * @param query A statement or query to write to `output`, prepended to the prompt.
  184. * @param callback A callback function that is invoked with the user's input in response to the `query`.
  185. */
  186. question(query: string, callback: (answer: string) => void): void;
  187. question(query: string, options: Abortable, callback: (answer: string) => void): void;
  188. /**
  189. * The `rl.pause()` method pauses the `input` stream, allowing it to be resumed
  190. * later if necessary.
  191. *
  192. * Calling `rl.pause()` does not immediately pause other events (including `'line'`) from being emitted by the `Interface` instance.
  193. * @since v0.3.4
  194. */
  195. pause(): this;
  196. /**
  197. * The `rl.resume()` method resumes the `input` stream if it has been paused.
  198. * @since v0.3.4
  199. */
  200. resume(): this;
  201. /**
  202. * The `rl.close()` method closes the `Interface` instance and
  203. * relinquishes control over the `input` and `output` streams. When called,
  204. * the `'close'` event will be emitted.
  205. *
  206. * Calling `rl.close()` does not immediately stop other events (including `'line'`)
  207. * from being emitted by the `Interface` instance.
  208. * @since v0.1.98
  209. */
  210. close(): void;
  211. /**
  212. * Alias for `rl.close()`.
  213. * @since v22.15.0
  214. */
  215. [Symbol.dispose](): void;
  216. /**
  217. * The `rl.write()` method will write either `data` or a key sequence identified
  218. * by `key` to the `output`. The `key` argument is supported only if `output` is
  219. * a `TTY` text terminal. See `TTY keybindings` for a list of key
  220. * combinations.
  221. *
  222. * If `key` is specified, `data` is ignored.
  223. *
  224. * When called, `rl.write()` will resume the `input` stream if it has been
  225. * paused.
  226. *
  227. * If the `Interface` was created with `output` set to `null` or `undefined` the `data` and `key` are not written.
  228. *
  229. * ```js
  230. * rl.write('Delete this!');
  231. * // Simulate Ctrl+U to delete the line written previously
  232. * rl.write(null, { ctrl: true, name: 'u' });
  233. * ```
  234. *
  235. * The `rl.write()` method will write the data to the `readline` `Interface`'s `input` _as if it were provided by the user_.
  236. * @since v0.1.98
  237. */
  238. write(data: string | Buffer, key?: Key): void;
  239. write(data: undefined | null | string | Buffer, key: Key): void;
  240. /**
  241. * Returns the real position of the cursor in relation to the input
  242. * prompt + string. Long input (wrapping) strings, as well as multiple
  243. * line prompts are included in the calculations.
  244. * @since v13.5.0, v12.16.0
  245. */
  246. getCursorPos(): CursorPos;
  247. /**
  248. * events.EventEmitter
  249. * 1. close
  250. * 2. line
  251. * 3. pause
  252. * 4. resume
  253. * 5. SIGCONT
  254. * 6. SIGINT
  255. * 7. SIGTSTP
  256. * 8. history
  257. */
  258. addListener(event: string, listener: (...args: any[]) => void): this;
  259. addListener(event: "close", listener: () => void): this;
  260. addListener(event: "line", listener: (input: string) => void): this;
  261. addListener(event: "pause", listener: () => void): this;
  262. addListener(event: "resume", listener: () => void): this;
  263. addListener(event: "SIGCONT", listener: () => void): this;
  264. addListener(event: "SIGINT", listener: () => void): this;
  265. addListener(event: "SIGTSTP", listener: () => void): this;
  266. addListener(event: "history", listener: (history: string[]) => void): this;
  267. emit(event: string | symbol, ...args: any[]): boolean;
  268. emit(event: "close"): boolean;
  269. emit(event: "line", input: string): boolean;
  270. emit(event: "pause"): boolean;
  271. emit(event: "resume"): boolean;
  272. emit(event: "SIGCONT"): boolean;
  273. emit(event: "SIGINT"): boolean;
  274. emit(event: "SIGTSTP"): boolean;
  275. emit(event: "history", history: string[]): boolean;
  276. on(event: string, listener: (...args: any[]) => void): this;
  277. on(event: "close", listener: () => void): this;
  278. on(event: "line", listener: (input: string) => void): this;
  279. on(event: "pause", listener: () => void): this;
  280. on(event: "resume", listener: () => void): this;
  281. on(event: "SIGCONT", listener: () => void): this;
  282. on(event: "SIGINT", listener: () => void): this;
  283. on(event: "SIGTSTP", listener: () => void): this;
  284. on(event: "history", listener: (history: string[]) => void): this;
  285. once(event: string, listener: (...args: any[]) => void): this;
  286. once(event: "close", listener: () => void): this;
  287. once(event: "line", listener: (input: string) => void): this;
  288. once(event: "pause", listener: () => void): this;
  289. once(event: "resume", listener: () => void): this;
  290. once(event: "SIGCONT", listener: () => void): this;
  291. once(event: "SIGINT", listener: () => void): this;
  292. once(event: "SIGTSTP", listener: () => void): this;
  293. once(event: "history", listener: (history: string[]) => void): this;
  294. prependListener(event: string, listener: (...args: any[]) => void): this;
  295. prependListener(event: "close", listener: () => void): this;
  296. prependListener(event: "line", listener: (input: string) => void): this;
  297. prependListener(event: "pause", listener: () => void): this;
  298. prependListener(event: "resume", listener: () => void): this;
  299. prependListener(event: "SIGCONT", listener: () => void): this;
  300. prependListener(event: "SIGINT", listener: () => void): this;
  301. prependListener(event: "SIGTSTP", listener: () => void): this;
  302. prependListener(event: "history", listener: (history: string[]) => void): this;
  303. prependOnceListener(event: string, listener: (...args: any[]) => void): this;
  304. prependOnceListener(event: "close", listener: () => void): this;
  305. prependOnceListener(event: "line", listener: (input: string) => void): this;
  306. prependOnceListener(event: "pause", listener: () => void): this;
  307. prependOnceListener(event: "resume", listener: () => void): this;
  308. prependOnceListener(event: "SIGCONT", listener: () => void): this;
  309. prependOnceListener(event: "SIGINT", listener: () => void): this;
  310. prependOnceListener(event: "SIGTSTP", listener: () => void): this;
  311. prependOnceListener(event: "history", listener: (history: string[]) => void): this;
  312. [Symbol.asyncIterator](): NodeJS.AsyncIterator<string>;
  313. }
  314. export type ReadLine = Interface; // type forwarded for backwards compatibility
  315. export type Completer = (line: string) => CompleterResult;
  316. export type AsyncCompleter = (
  317. line: string,
  318. callback: (err?: null | Error, result?: CompleterResult) => void,
  319. ) => void;
  320. export type CompleterResult = [string[], string];
  321. export interface ReadLineOptions {
  322. /**
  323. * The [`Readable`](https://nodejs.org/docs/latest-v22.x/api/stream.html#readable-streams) stream to listen to
  324. */
  325. input: NodeJS.ReadableStream;
  326. /**
  327. * The [`Writable`](https://nodejs.org/docs/latest-v22.x/api/stream.html#writable-streams) stream to write readline data to.
  328. */
  329. output?: NodeJS.WritableStream | undefined;
  330. /**
  331. * An optional function used for Tab autocompletion.
  332. */
  333. completer?: Completer | AsyncCompleter | undefined;
  334. /**
  335. * `true` if the `input` and `output` streams should be treated like a TTY,
  336. * and have ANSI/VT100 escape codes written to it.
  337. * Default: checking `isTTY` on the `output` stream upon instantiation.
  338. */
  339. terminal?: boolean | undefined;
  340. /**
  341. * Initial list of history lines.
  342. * This option makes sense only if `terminal` is set to `true` by the user or by an internal `output` check,
  343. * otherwise the history caching mechanism is not initialized at all.
  344. * @default []
  345. */
  346. history?: string[] | undefined;
  347. /**
  348. * Maximum number of history lines retained.
  349. * To disable the history set this value to `0`.
  350. * This option makes sense only if `terminal` is set to `true` by the user or by an internal `output` check,
  351. * otherwise the history caching mechanism is not initialized at all.
  352. * @default 30
  353. */
  354. historySize?: number | undefined;
  355. /**
  356. * If `true`, when a new input line added to the history list duplicates an older one,
  357. * this removes the older line from the list.
  358. * @default false
  359. */
  360. removeHistoryDuplicates?: boolean | undefined;
  361. /**
  362. * The prompt string to use.
  363. * @default "> "
  364. */
  365. prompt?: string | undefined;
  366. /**
  367. * If the delay between `\r` and `\n` exceeds `crlfDelay` milliseconds,
  368. * both `\r` and `\n` will be treated as separate end-of-line input.
  369. * `crlfDelay` will be coerced to a number no less than `100`.
  370. * It can be set to `Infinity`, in which case
  371. * `\r` followed by `\n` will always be considered a single newline
  372. * (which may be reasonable for [reading files](https://nodejs.org/docs/latest-v22.x/api/readline.html#example-read-file-stream-line-by-line) with `\r\n` line delimiter).
  373. * @default 100
  374. */
  375. crlfDelay?: number | undefined;
  376. /**
  377. * The duration `readline` will wait for a character
  378. * (when reading an ambiguous key sequence in milliseconds
  379. * one that can both form a complete key sequence using the input read so far
  380. * and can take additional input to complete a longer key sequence).
  381. * @default 500
  382. */
  383. escapeCodeTimeout?: number | undefined;
  384. /**
  385. * The number of spaces a tab is equal to (minimum 1).
  386. * @default 8
  387. */
  388. tabSize?: number | undefined;
  389. /**
  390. * Allows closing the interface using an AbortSignal.
  391. * Aborting the signal will internally call `close` on the interface.
  392. */
  393. signal?: AbortSignal | undefined;
  394. }
  395. /**
  396. * The `readline.createInterface()` method creates a new `readline.Interface` instance.
  397. *
  398. * ```js
  399. * import readline from 'node:readline';
  400. * const rl = readline.createInterface({
  401. * input: process.stdin,
  402. * output: process.stdout,
  403. * });
  404. * ```
  405. *
  406. * Once the `readline.Interface` instance is created, the most common case is to
  407. * listen for the `'line'` event:
  408. *
  409. * ```js
  410. * rl.on('line', (line) => {
  411. * console.log(`Received: ${line}`);
  412. * });
  413. * ```
  414. *
  415. * If `terminal` is `true` for this instance then the `output` stream will get
  416. * the best compatibility if it defines an `output.columns` property and emits
  417. * a `'resize'` event on the `output` if or when the columns ever change
  418. * (`process.stdout` does this automatically when it is a TTY).
  419. *
  420. * When creating a `readline.Interface` using `stdin` as input, the program
  421. * will not terminate until it receives an [EOF character](https://en.wikipedia.org/wiki/End-of-file#EOF_character). To exit without
  422. * waiting for user input, call `process.stdin.unref()`.
  423. * @since v0.1.98
  424. */
  425. export function createInterface(
  426. input: NodeJS.ReadableStream,
  427. output?: NodeJS.WritableStream,
  428. completer?: Completer | AsyncCompleter,
  429. terminal?: boolean,
  430. ): Interface;
  431. export function createInterface(options: ReadLineOptions): Interface;
  432. /**
  433. * The `readline.emitKeypressEvents()` method causes the given `Readable` stream to begin emitting `'keypress'` events corresponding to received input.
  434. *
  435. * Optionally, `interface` specifies a `readline.Interface` instance for which
  436. * autocompletion is disabled when copy-pasted input is detected.
  437. *
  438. * If the `stream` is a `TTY`, then it must be in raw mode.
  439. *
  440. * This is automatically called by any readline instance on its `input` if the `input` is a terminal. Closing the `readline` instance does not stop
  441. * the `input` from emitting `'keypress'` events.
  442. *
  443. * ```js
  444. * readline.emitKeypressEvents(process.stdin);
  445. * if (process.stdin.isTTY)
  446. * process.stdin.setRawMode(true);
  447. * ```
  448. *
  449. * ## Example: Tiny CLI
  450. *
  451. * The following example illustrates the use of `readline.Interface` class to
  452. * implement a small command-line interface:
  453. *
  454. * ```js
  455. * import readline from 'node:readline';
  456. * const rl = readline.createInterface({
  457. * input: process.stdin,
  458. * output: process.stdout,
  459. * prompt: 'OHAI> ',
  460. * });
  461. *
  462. * rl.prompt();
  463. *
  464. * rl.on('line', (line) => {
  465. * switch (line.trim()) {
  466. * case 'hello':
  467. * console.log('world!');
  468. * break;
  469. * default:
  470. * console.log(`Say what? I might have heard '${line.trim()}'`);
  471. * break;
  472. * }
  473. * rl.prompt();
  474. * }).on('close', () => {
  475. * console.log('Have a great day!');
  476. * process.exit(0);
  477. * });
  478. * ```
  479. *
  480. * ## Example: Read file stream line-by-Line
  481. *
  482. * A common use case for `readline` is to consume an input file one line at a
  483. * time. The easiest way to do so is leveraging the `fs.ReadStream` API as
  484. * well as a `for await...of` loop:
  485. *
  486. * ```js
  487. * import fs from 'node:fs';
  488. * import readline from 'node:readline';
  489. *
  490. * async function processLineByLine() {
  491. * const fileStream = fs.createReadStream('input.txt');
  492. *
  493. * const rl = readline.createInterface({
  494. * input: fileStream,
  495. * crlfDelay: Infinity,
  496. * });
  497. * // Note: we use the crlfDelay option to recognize all instances of CR LF
  498. * // ('\r\n') in input.txt as a single line break.
  499. *
  500. * for await (const line of rl) {
  501. * // Each line in input.txt will be successively available here as `line`.
  502. * console.log(`Line from file: ${line}`);
  503. * }
  504. * }
  505. *
  506. * processLineByLine();
  507. * ```
  508. *
  509. * Alternatively, one could use the `'line'` event:
  510. *
  511. * ```js
  512. * import fs from 'node:fs';
  513. * import readline from 'node:readline';
  514. *
  515. * const rl = readline.createInterface({
  516. * input: fs.createReadStream('sample.txt'),
  517. * crlfDelay: Infinity,
  518. * });
  519. *
  520. * rl.on('line', (line) => {
  521. * console.log(`Line from file: ${line}`);
  522. * });
  523. * ```
  524. *
  525. * Currently, `for await...of` loop can be a bit slower. If `async` / `await` flow and speed are both essential, a mixed approach can be applied:
  526. *
  527. * ```js
  528. * import { once } from 'node:events';
  529. * import { createReadStream } from 'node:fs';
  530. * import { createInterface } from 'node:readline';
  531. *
  532. * (async function processLineByLine() {
  533. * try {
  534. * const rl = createInterface({
  535. * input: createReadStream('big-file.txt'),
  536. * crlfDelay: Infinity,
  537. * });
  538. *
  539. * rl.on('line', (line) => {
  540. * // Process the line.
  541. * });
  542. *
  543. * await once(rl, 'close');
  544. *
  545. * console.log('File processed.');
  546. * } catch (err) {
  547. * console.error(err);
  548. * }
  549. * })();
  550. * ```
  551. * @since v0.7.7
  552. */
  553. export function emitKeypressEvents(stream: NodeJS.ReadableStream, readlineInterface?: Interface): void;
  554. export type Direction = -1 | 0 | 1;
  555. export interface CursorPos {
  556. rows: number;
  557. cols: number;
  558. }
  559. /**
  560. * The `readline.clearLine()` method clears current line of given [TTY](https://nodejs.org/docs/latest-v22.x/api/tty.html) stream
  561. * in a specified direction identified by `dir`.
  562. * @since v0.7.7
  563. * @param callback Invoked once the operation completes.
  564. * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
  565. */
  566. export function clearLine(stream: NodeJS.WritableStream, dir: Direction, callback?: () => void): boolean;
  567. /**
  568. * The `readline.clearScreenDown()` method clears the given [TTY](https://nodejs.org/docs/latest-v22.x/api/tty.html) stream from
  569. * the current position of the cursor down.
  570. * @since v0.7.7
  571. * @param callback Invoked once the operation completes.
  572. * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
  573. */
  574. export function clearScreenDown(stream: NodeJS.WritableStream, callback?: () => void): boolean;
  575. /**
  576. * The `readline.cursorTo()` method moves cursor to the specified position in a
  577. * given [TTY](https://nodejs.org/docs/latest-v22.x/api/tty.html) `stream`.
  578. * @since v0.7.7
  579. * @param callback Invoked once the operation completes.
  580. * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
  581. */
  582. export function cursorTo(stream: NodeJS.WritableStream, x: number, y?: number, callback?: () => void): boolean;
  583. /**
  584. * The `readline.moveCursor()` method moves the cursor _relative_ to its current
  585. * position in a given [TTY](https://nodejs.org/docs/latest-v22.x/api/tty.html) `stream`.
  586. * @since v0.7.7
  587. * @param callback Invoked once the operation completes.
  588. * @return `false` if `stream` wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
  589. */
  590. export function moveCursor(stream: NodeJS.WritableStream, dx: number, dy: number, callback?: () => void): boolean;
  591. }
  592. declare module "node:readline" {
  593. export * from "readline";
  594. }