@simplyappdevs/nodejs-prompt v1.4.0
NodeJS Prompt System
Module to get input from user that supports 1 to n prompt(s) and also prompt with options.
Why
There already bunch of similar modules on NPM ... but then why not :)? Kidding aside, we learn better by doing, so made this module to learn/hone working w/ Typescript, Unit Test, Test Coverage, and NPM.
Notable Features
- Prompt with configuration
- Single or multiple prompts
- Prompt with options
- Default value for prompt
- ...few others
Notable Stacks
- Typescript
- Node readline, process.stdin, and process.stdout
- Reductive promise chaining
- Jest with ts-jest
- readline mock
Install
- npm i @simplyappdevs/nodejs-prompt
Manual Build
- Clone repo: git clone https://github.com/simplyappdevs/nodejs-prompt
- CWD: cd nodejs-prompt
- Install deps: npm i
- Clear existing output: npm run clean
- Build module: npm run build
- Test: npm test
Example
Examples on how to use this module is available from https://github.com/simplyappdevs/nodejs-prompt-example
Reminder for ESM Application
npm exec command option
You will need to run your application with
--es-module-specifier-resolution=nodeoption.Ex:
"exec": "node --es-module-specifier-resolution=node ./dist/index.js"for your NPM scriptnpm run exec.
Configure package.json
Set type to module
"type": "module"
{
  "name": "nodejs-prompt-example",
  "version": "1.0.0",
  "description": "My Awesome App",
  "main": "index.js",
  "type": "module",
  "scripts": {
  }
}Configure tsconfig.json
Set module to one of ECMA script
"module": "esnext"incompilerOptionssection
{
  "compilerOptions": {
    "module": "esnext",
  }
}Set module resolution to node
"moduleResolution": "node"incompilerOptionssection
{
  "compilerOptions": {
    "moduleResolution": "node",
  }
}Usage
// import
import prompter, {PromptInput, PromptResult, PromptItem} from '@simplyappdevs/nodejs-prompt';
// prompt 1
const inp01: PromptInput = {
  id: 'inp01',
  allowEmptyValue: false,
  defaultValue: '',
  endIfEmpty: false,
  valueToEndPrompt: '',
  prompt: 'Enter first name'
};
const inp02: PromptInput = {
  ...inp01,
  prompt: 'Enter last name'
};
const inp03: PromptInput = {
  ...inp02,
  endIfEmpty: true,
  promptList: [
    {id: 1, key: 'M', text: 'Male'},
    {id: 2, key: 'F', text: 'Female'}
  ],
  prompt: 'Enter your gender'
};
const inp04: PromptInput = {
  ...inp02,
  endIfEmpty: false,
  allowEmptyValue: true,
  defaultValue: 'Secret',
  prompt: 'Enter your age'
};
// single prompt
prompter.prompt(inp01).then((res: PromptResult) => {
  console.log(`User entered: ${res.enteredValue}`);
}).catch((err)=>{
  console.log(`Error: ${err.message}`);
});
// single prompt with options
prompter.prompt(inp03).then((res: PromptResult) => {
  console.log(`User entered: ${res.enteredValue}`);
}).catch((err)=>{
  console.log(`Error: ${err.message}`);
});
// multi prompts
prompter.prompts([inp01, inp02, inp03, inp04]).then((res: PromptResult[]) => {
  console.log(`User entered: ${res[0].enteredValue}`);
  console.log(`User entered: ${res[1].enteredValue}`);
  console.log(`User entered: ${res[2].enteredValue}`);
  console.log(`User entered: ${res[3].enteredValue}`);
}).catch((err)=>{
  console.log(`Error: ${err.message}`);
});Objects
PromptInput
| Property | Type | Required | Comment | 
|---|---|---|---|
| id | string | Y | Unique id for this prompt (useful in multi-prompt) | 
| allowEmptyValue | boolean | Y | Accept empty string ''as a valid input | 
| defaultValue | string | Y | Value to use if user entered empty string '' | 
| endIfEmpty | boolean | Y | True will end prompt session if user enter empty string '' | 
| valueToEndPrompt | string | N | Future used? | 
| prompt | string | Y | Prompt text | 
| promptListTitle | string | N | Prompt list title | 
| promptList | PromptItem[] | N | List of prompt options | 
PromptItem
| Property | Type | Required | Comment | 
|---|---|---|---|
| id | number | Y | Unique id for this option | 
| key | string | Y | Value to select this option | 
| text | string | Y | Prompt option text | 
PromptResult (extends PromptInput)
| Property | Type | Comment | 
|---|---|---|
| enteredValue | string | Returns what the user entered | 
Methods
Single prompt:
prompter.prompt()returnsPromise<PromptResult>Multi prompts:
prompter.prompts()returnsPromise<PromptResult[]>
Information
Brought to you by www.simplyappdevs.com (2021)