CoolFace
Apppublic

Pinsave/counterstrike

sourceHugging Faceupdated 3mo agoView on Hugging Face
1likes
readline.d.ts595 linesDownload Raw Back to node
1/**2 * The `node:readline` module provides an interface for reading data from a [Readable](https://nodejs.org/docs/latest-v24.x/api/stream.html#readable-streams) stream3 * (such as [`process.stdin`](https://nodejs.org/docs/latest-v24.x/api/process.html#processstdin)) one line at a time.4 *5 * To use the promise-based APIs:6 *7 * ```js8 * import * as readline from 'node:readline/promises';9 * ```10 *11 * To use the callback and sync APIs:12 *13 * ```js14 * import * as readline from 'node:readline';15 * ```16 *17 * The following simple example illustrates the basic use of the `node:readline` module.18 *19 * ```js20 * 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 be33 * received on the `input` stream.34 * @see [source](https://github.com/nodejs/node/blob/v24.x/lib/readline.js)35 */36declare 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 a49     * single `input` [Readable](https://nodejs.org/docs/latest-v24.x/api/stream.html#readable-streams) stream and a single `output` [Writable](https://nodejs.org/docs/latest-v24.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.10453     */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 the60         * current value that has been processed thus far, prior to the `line` event61         * being emitted. Once the `line` event has been emitted, this property will62         * be an empty string.63         *64         * Be aware that modifying the value during the instance runtime may have65         * 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         * ```js72         * 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.9885         */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, when91         * reading input from a TTY stream. The position of cursor determines the92         * 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.9895         */96        readonly cursor: number;97        /**98         * NOTE: According to the documentation:99         *100         * > Instances of the `readline.Interface` class are constructed using the101         * > `readline.createInterface()` method.102         *103         * @see https://nodejs.org/dist/latest-v24.x/docs/api/readline.html#class-interfaceconstructor104         */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 the115         * > `readline.createInterface()` method.116         *117         * @see https://nodejs.org/dist/latest-v24.x/docs/api/readline.html#class-interfaceconstructor118         */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.0123         * @return the current prompt string124         */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.98129         */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 new133         * location at which to provide input.134         *135         * When called, `rl.prompt()` will resume the `input` stream if it has been136         * paused.137         *138         * If the `Interface` was created with `output` set to `null` or `undefined` the prompt is not written.139         * @since v0.1.98140         * @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 been148         * 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 typical153         * 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         * ```js161         * 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         * ```js169         * 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.3183         * @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 resumed190         * 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.4194         */195        pause(): this;196        /**197         * The `rl.resume()` method resumes the `input` stream if it has been paused.198         * @since v0.3.4199         */200        resume(): this;201        /**202         * The `rl.close()` method closes the `Interface` instance and203         * 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.98209         */210        close(): void;211        /**212         * Alias for `rl.close()`.213         * @since v22.15.0214         */215        [Symbol.dispose](): void;216        /**217         * The `rl.write()` method will write either `data` or a key sequence identified218         * by `key` to the `output`. The `key` argument is supported only if `output` is219         * a `TTY` text terminal. See `TTY keybindings` for a list of key220         * combinations.221         *222         * If `key` is specified, `data` is ignored.223         *224         * When called, `rl.write()` will resume the `input` stream if it has been225         * paused.226         *227         * If the `Interface` was created with `output` set to `null` or `undefined` the `data` and `key` are not written.228         *229         * ```js230         * rl.write('Delete this!');231         * // Simulate Ctrl+U to delete the line written previously232         * 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.98237         */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 input242         * prompt + string. Long input (wrapping) strings, as well as multiple243         * line prompts are included in the calculations.244         * @since v13.5.0, v12.16.0245         */246        getCursorPos(): CursorPos;247        /**248         * events.EventEmitter249         * 1. close250         * 2. line251         * 3. pause252         * 4. resume253         * 5. SIGCONT254         * 6. SIGINT255         * 7. SIGTSTP256         * 8. history257         */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 compatibility315    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-v24.x/api/stream.html#readable-streams) stream to listen to324         */325        input: NodeJS.ReadableStream;326        /**327         * The [`Writable`](https://nodejs.org/docs/latest-v24.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 30353         */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 false359         */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 case371         * `\r` followed by `\n` will always be considered a single newline372         * (which may be reasonable for [reading files](https://nodejs.org/docs/latest-v24.x/api/readline.html#example-read-file-stream-line-by-line) with `\r\n` line delimiter).373         * @default 100374         */375        crlfDelay?: number | undefined;376        /**377         * The duration `readline` will wait for a character378         * (when reading an ambiguous key sequence in milliseconds379         * one that can both form a complete key sequence using the input read so far380         * and can take additional input to complete a longer key sequence).381         * @default 500382         */383        escapeCodeTimeout?: number | undefined;384        /**385         * The number of spaces a tab is equal to (minimum 1).386         * @default 8387         */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     * ```js399     * 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 to407     * listen for the `'line'` event:408     *409     * ```js410     * 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 get416     * the best compatibility if it defines an `output.columns` property and emits417     * a `'resize'` event on the `output` if or when the columns ever change418     * (`process.stdout` does this automatically when it is a TTY).419     *420     * When creating a `readline.Interface` using `stdin` as input, the program421     * will not terminate until it receives an [EOF character](https://en.wikipedia.org/wiki/End-of-file#EOF_character). To exit without422     * waiting for user input, call `process.stdin.unref()`.423     * @since v0.1.98424     */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 which436     * 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 stop441     * the `input` from emitting `'keypress'` events.442     *443     * ```js444     * readline.emitKeypressEvents(process.stdin);445     * if (process.stdin.isTTY)446     *   process.stdin.setRawMode(true);447     * ```448     *449     * ## Example: Tiny CLI450     *451     * The following example illustrates the use of `readline.Interface` class to452     * implement a small command-line interface:453     *454     * ```js455     * 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-Line481     *482     * A common use case for `readline` is to consume an input file one line at a483     * time. The easiest way to do so is leveraging the `fs.ReadStream` API as484     * well as a `for await...of` loop:485     *486     * ```js487     * 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 LF498     *   // ('\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     * ```js512     * 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     * ```js528     * 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.7552     */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-v24.x/api/tty.html) stream561     * in a specified direction identified by `dir`.562     * @since v0.7.7563     * @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-v24.x/api/tty.html) stream from569     * the current position of the cursor down.570     * @since v0.7.7571     * @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 a577     * given [TTY](https://nodejs.org/docs/latest-v24.x/api/tty.html) `stream`.578     * @since v0.7.7579     * @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 current585     * position in a given [TTY](https://nodejs.org/docs/latest-v24.x/api/tty.html) `stream`.586     * @since v0.7.7587     * @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}592declare module "node:readline" {593    export * from "readline";594}595