A collection of common interactive command line user interfaces.
Give it a try in your own terminal!
npx @inquirer/demo@latest
npm | yarn |
---|---|
npm install @inquirer/prompts |
yarn add @inquirer/prompts |
Note
Inquirer recently underwent a rewrite from the ground up to reduce the package size and improve performance. The previous version of the package is still maintained (though not actively developed), and offered hundreds of community contributed prompts that might not have been migrated to the latest API. If this is what you're looking for, the previous package is over here.
import { input } from '@inquirer/prompts';
const answer = await input({ message: 'Enter your name' });
import { input } from '@inquirer/prompts';
See documentation for usage example and options documentation.
import { select } from '@inquirer/prompts';
See documentation for usage example and options documentation.
import { checkbox } from '@inquirer/prompts';
See documentation for usage example and options documentation.
import { confirm } from '@inquirer/prompts';
See documentation for usage example and options documentation.
import { search } from '@inquirer/prompts';
See documentation for usage example and options documentation.
import { password } from '@inquirer/prompts';
See documentation for usage example and options documentation.
import { expand } from '@inquirer/prompts';
See documentation for usage example and options documentation.
Launches an instance of the users preferred editor on a temporary file. Once the user exits their editor, the content of the temporary file is read as the answer. The editor used is determined by reading the $VISUAL or $EDITOR environment variables. If neither of those are present, the OS default is used (notepad on Windows, vim on Mac or Linux.)
import { editor } from '@inquirer/prompts';
See documentation for usage example and options documentation.
Very similar to the input
prompt, but with built-in number validation configuration option.
import { number } from '@inquirer/prompts';
See documentation for usage example and options documentation.
import { rawlist } from '@inquirer/prompts';
See documentation for usage example and options documentation.
The API documentation is over here, and our testing utilities here.
All inquirer prompts are a function taking 2 arguments. The first argument is the prompt configuration (unique to each prompt). The second is providing contextual or runtime configuration.
The context options are:
Property | Type | Required | Description |
---|---|---|---|
input | NodeJS.ReadableStream |
no | The stdin stream (defaults to process.stdin ) |
output | NodeJS.WritableStream |
no | The stdout stream (defaults to process.stdout ) |
clearPromptOnDone | boolean |
no | If true, we'll clear the screen after the prompt is answered |
Example:
import { confirm } from '@inquirer/prompts';
const allowEmail = await confirm(
{ message: 'Do you allow us to send you email?' },
{
output: new Stream.Writable({
write(chunk, _encoding, next) {
// Do something
next();
},
}),
clearPromptOnDone: true,
},
);
All prompt functions are returning a cancelable promise. This special promise type has a cancel
method that'll cancel and cleanup the prompt.
On calling cancel
, the answer promise will become rejected.
import { confirm } from '@inquirer/prompts';
const answer = confirm(...); // note: for this you cannot use `await`
answer.cancel();
When asking many questions, you might not want to keep one variable per answer everywhere. In which case, you can put the answer inside an object.
import { input, confirm } from '@inquirer/prompts';
const answers = {
firstName: await input({ message: "What's your first name?" }),
allowEmail: await confirm({ message: 'Do you allow us to send you email?' }),
};
console.log(answers.firstName);
Maybe some questions depend on some other question's answer.
import { input, confirm } from '@inquirer/prompts';
const allowEmail = await confirm({ message: 'Do you allow us to send you email?' });
let email;
if (allowEmail) {
email = await input({ message: 'What is your email address' });
}
import { setTimeout } from 'node:timers/promises';
import { input } from '@inquirer/prompts';
const ac = new AbortController();
const prompt = input({
message: 'Enter a value (timing out in 5 seconds)',
});
prompt
.finally(() => {
ac.abort();
})
// Silencing the cancellation error.
.catch(() => {});
const defaultValue = setTimeout(5000, 'timeout', { signal: ac.signal }).then(() => {
prompt.cancel();
return 'Timed out!';
});
const answer = await Promise.race([defaultValue, prompt]);
By default scripts ran from tools like husky
/lint-staged
might not run inside an interactive shell. In non-interactive shell, Inquirer cannot run, and users cannot send keypress events to the process.
For it to work, you must make sure you start a tty
(or "interactive" input stream.)
If those scripts are set within your package.json
, you can define the stream like so:
"precommit": "my-script < /dev/tty"
Or if in a shell script file, you'll do it like so: (on Windows that's likely your only option)
#!/bin/sh
exec < /dev/tty
node my-script.js
Maybe some question configuration require to await a value.
import { confirm } from '@inquirer/prompts';
const answer = await confirm({ message: await getMessage() });
If you created a cool prompt, send us a PR adding it to the list below!
Interactive List Prompt
Select a choice either with arrow keys + Enter or by pressing a key associated with a choice.
? Choose an option:
> Run command (D)
Quit (Q)
Action Select Prompt
Choose an item from a list and choose an action to take by pressing a key.
? Choose a file Open <O> Edit <E> Delete <X>
❯ image.png
audio.mp3
code.py
Table Multiple Prompt
Select multiple answer from a table display.
Choose between choices? (Press <space> to select, <Up and Down> to move rows,
<Left and Right> to move columns)
┌──────────┬───────┬───────┐
│ 1-2 of 2 │ Yes? │ No? |
├──────────┼───────┼───────┤
│ Choice 1 │ [ ◯ ] │ ◯ |
├──────────┼───────┼───────┤
│ Choice 2 │ ◯ │ ◯ |
└──────────┴───────┴───────┘
Toggle Prompt
Confirm with a toggle. Select a choice with arrow keys + Enter.
? Do you want to continue? no / yes
Sortable Checkbox Prompt
The same as built-in checkbox prompt, but also allowing to reorder choices using ctrl+up/down.
? Which PRs and in what order would you like to merge? (Press <space> to select, <a> to toggle all, <i> to invert selection, <ctrl+up> to move item up, <ctrl+down> to move item down, and <enter> to proceed)
❯ ◯ PR 1
◯ PR 2
◯ PR 3
An inquirer select that supports multiple selections and filtering/searching.
? Choose your OS, IDE, PL, etc. (Press <tab> to select/deselect, <backspace> to remove selected
option, <enter> to select option)
>> vue
>[ ] vue
[ ] vuejs
[ ] fuelphp
[ ] venv
[ ] vercel
(Use arrow keys to reveal more options)
File Selector Prompt
A file selector, you can navigate freely between directories, choose what type of files you want to allow and it is fully customizable.
? Select a file:
/main/path/
├── folder1/
├── folder2/
├── folder3/
├── file1.txt
├── file2.pdf
└── file3.jpg (not allowed)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Use ↑↓ to navigate through the list
Press <esc> to navigate to the parent directory
Press <enter> to select a file or navigate to a directory
Copyright (c) 2023 Simon Boudrias (twitter: @vaxilart)
Licensed under the MIT license.