@reliverse/prompts
Docs | npmjs.com | GitHub | Discord
@reliverse/prompts is a powerful library that enables seamless, type-safe, and resilient prompts for command-line applications. Crafted with simplicity and elegance, it provides developers with an intuitive and robust way to build interactive CLIs.
@reliverse/prompts is a full-featured alternative to @inquirer/prompts (Inquirer.js), enquirer, @clack/prompts, terkelg prompts, cronvel terminal-kit, unjs consola, and similar libraries.
Installation
Install with your preferred package manager:
Screenshot
Key Features
- Type Safety: Built with TypeScript, ensuring strong typing to prevent runtime errors.
- Schema Validation: Validates user inputs using schemas for enhanced reliability.
- Flexible Prompt Types: Supports a range of prompt types, including text, password, number, select, and multiselect.
- Crash Resilience: Designed to handle cancellations and errors gracefully, ensuring stability.
Prompt Types
Each type has its own validation and display logic. More types are planned for future releases.
- Text: Collects text input.
- Password: Hidden input for secure password entries.
- Number: Numeric input with optional validation.
- Confirm: Simple Yes/No prompt.
- Select: Dropdown selection for multiple choices.
- Multiselect: Allows users to select multiple items from a list.
Input Validation
All prompts support custom validation logic, providing immediate feedback to users.
Contributing
@reliverse/prompts is a work in progress. We welcome feedback and contributions to help make it the best library it can be. Thank you!
Here is how to install the library for development:
Playground
Run bun dev
to launch the examples/launcher.ts CLI, which helps you to dive into and explore any of the examples listed below. Experiment with @reliverse/prompts by running examples locally or reviewing the linked code:
- 1-main.ts: A comprehensive example of a CLI application featuring a well styled UI config. This example showcases all available prompt components, with code organized into separate functions and files for better readability and clarity.
- 2-mono.ts: A quiz game example inspired by Fireship’s video about CLIs. It demonstrates the dynamic capabilities of @reliverse/prompts by using a prompt() that includes all prompt components, so you don’t need to import each component separately.
- 3-simple.ts: A simple example highlighting the core functionalities of @reliverse/prompts. The entire implementation is contained within a single file for easy understanding.
- 4-args-a.ts: An example of how to run commands using arguments.
- 5-args-b.ts: Another example of how to run commands using arguments.
Extendable Configuration
Example Configuration:
Mono Component
The Mono Component is a special component that includes all other components. It’s a great way to get started quickly or to see how all the components work together.
This component requires providing prompt id. To have typesafety use something like the following:
Prompts Library Comparison
Note: This table contains approximate and placeholder values. More detailed assessments will be provided as libraries continue to evolve.
The mission of @reliverse/prompts is to achieve the 🟢 in all categories.
Icon Legend:
- 🟡: Not yet verified
- 🟢: Fully supported
- 🔵: Partially supported
- 🔴: Not supported
Feature | @reliverse/prompts | @inquirer/prompts | @enquirer/enquirer | @clack/prompts | @terkelg/prompts | @cronvel/terminal-kit | @unjs/citty | @unjs/consola | @chjj/blessed |
---|---|---|---|---|---|---|---|---|---|
- Full ES Modules Support | 🟢 Native ES module package | 🟢 | 🟡 | 🟡 | 🔴 CJS-only | 🔴 CJS-only | 🟢 | 🟢 | 🟡 |
- Works both in node, bun, and deno environments | 🔵 node+bun (deno support is coming soon) | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🔵 | 🔵 | 🟡 |
- Codebase typesafety with intellisense | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Runtime typesafety with schema validation | 🟢 TypeBox & Custom | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Usage Examples | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Customization | 🟢 Colors, typography, variants, borders, and more | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Custom Validation | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Error Handling | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Ease of Setup | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Crash Resilience | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- General DX | 🔵 Clean and understandable TypeScript code | 🟡 | 🟡 | 🟡 | 🔴 JS-only | 🔴 JS-only | 🟡 | 🟡 | 🟡 |
- DX: Classes | 🟢 Minimal number of classes as possible | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Documentation | 🔵 | 🟡 | 🟡 | 🟡 | 🔵 | 🟢 | 🟡 | 🟡 | 🟢 |
- Extendable APIs | 🟢 Works well with @reliverse/relinka | 🟢 Huge number of community prompts | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Designed With UX/DX in Mind | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- All components support Ctrl+C | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- As minimal number of dependencies as possible | 🔵 | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
Components | |||||||||
- Visual Components | 🟢 Animated Text (incl. 6 anims) & ASCII Art (incl. 290 fonts) | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Mono Component | 🟢 Mono (All-In-One) & Separate | 🟡 | 🟡 | 🟡 | 🔵 Mono-only | 🟡 | 🟡 | 🟡 | 🟡 |
- Start Component | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Text Component | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Password Component | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Number Component | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Confirm Component | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Select Component | 🔵 Native separator support | 🔵 Separator supported via new keyword | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Multiselect Component | 🔵 Native separator support | 🔵 Separator supported via new keyword | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Search/Autocomplete Component | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 |
- Task/Spinner & Progressbar Components | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 | 🟡 |
- Image Component | 🔴 Planned | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 | 🟡 |
- Range Component | 🔵 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 | 🟡 |
Arguments Support | |||||||||
- Fast and lightweight argument parser | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 |
- Smart value parsing with typecast | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 |
- Boolean shortcuts and unknown flag handling | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 |
- Nested sub-commands | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 |
- Lazy and Async commands | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 |
- Pluggable and composable API | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 |
- Auto generated usage and help | 🟢 | 🟡 | 🟡 | 🟡 | 🟡 | 🟡 | 🟢 | 🟡 | 🟡 |
Related Links: @reliverse/relinka, ESM/CJS, “Pure ESM package”, Clean code, “UX patterns for CLI tools”, DX (Developer Experience), TypeBox, “ANSI Escape Sequences”, @chjj/blessed, Wrapping, Visual Control
CLI Best Practices
@reliverse/prompts follows the following best practices (legend: 🟢 - fully supported, 🔵 - partially supported, 🔴 - not supported, 🟡 - not yet verified):
- 🟡 Respect POSIX args
- 🟡 Build empathic CLIs
- 🟡 Stateful data
- 🟡 Provide a colorful experience
- 🟡 Rich interactions
- 🟡 Hyperlinks everywhere
- 🟡 Zero configuration
- 🟡 Respect POSIX signals
- 🟡 Prefer a small dependency footprint
- 🟡 Use the shrinkwrap, Luke
- 🟡 Cleanup configuration files
- 🟡 Accept input as STDIN
- 🟡 Enable structured output
- 🟡 Cross-platform etiquette
- 🟡 Support configuration precedence
- 🟡 Containerize the CLI
- 🟡 Graceful degradation
- 🟡 Node.js versions compatibility
- 🟡 Shebang autodetect the Node.js runtime
- 🟡 Put no trust in locales
- 🟡 Trackable errors
- 🟡 Actionable errors
- 🟡 Provide debug mode
- 🟡 Proper use of exit codes
- 🟡 Effortless bug reports
- 🟡 Use a bin object
- 🟡 Use relative paths
- 🟡 Use the files field
- 🟡 Strict Opt-in Analytics
- 🟡 Include a —version Flag
- 🟡 Use Semantic Versioning
- 🟡 Provide Version Information in a ‘package.json’ file
- 🟡 Display Version in Error Messages and Help Text
- 🟡 Backward Compatibility
- 🟡 Publish Versioned Releases on npm
- 🟡 Update Your App’s Version Documents
- 🟡 Minimize Argument Injection
Wrap-Up
@reliverse/prompts is a versatile library designed to accelerate CLI development by providing customizable prompt components. Integrated into the Reliverse CLI, @reliverse/prompts enables you to create a unique design aligned with your CLI app’s aesthetics, similar to how @shadcn/ui supports customizable web UI components. Quickly get started by copying configurations from the Reliverse Docs and using components that fit your project, making it faster to bring your CLI app to life. You’re free to customize each component as desired, with default designs provided to ensure an attractive interface from the start.
Learn More
Special Thanks
This project wouldn’t exist without the amazing work of the huge number of contributors to the list of projects below. Many of the @reliverse/prompts prompts are based on the incredible work of:
@inquirer/prompts | terkelg/prompts | @clack/prompts | create-t3-app | create-astro | cronvel/terminal-kit | unjs/consola | nodejs/string_decoder | TooTallNate/keypress | derhuerst