Module to get input from user that supports 1 to n prompt(s) and also prompt with options.
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.
- Prompt with configuration
- Single or multiple prompts
- Prompt with options
- Default value for prompt
- ...few others
- Typescript
- Node readline, process.stdin, and process.stdout
- Reductive promise chaining
- Jest with ts-jest
- readline mock
npm i @simplyappdevs/nodejs-prompt
- 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
Examples on how to use this module is available from https://github.com/simplyappdevs/nodejs-prompt-example
You will need to run your application with
--es-module-specifier-resolution=node
option.Ex:
"exec": "node --es-module-specifier-resolution=node ./dist/index.js"
for your NPM scriptnpm run exec
.
Set type to module
"type": "module"
{
"name": "nodejs-prompt-example",
"version": "1.0.0",
"description": "My Awesome App",
"main": "index.js",
"type": "module",
"scripts": {
}
}
Set module to one of ECMA script
"module": "esnext"
incompilerOptions
section
{
"compilerOptions": {
"module": "esnext",
}
}
Set module resolution to node
"moduleResolution": "node"
incompilerOptions
section
{
"compilerOptions": {
"moduleResolution": "node",
}
}
// 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}`);
});
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 |
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 |
Property | Type | Comment |
---|---|---|
enteredValue | string | Returns what the user entered |
Single prompt:
prompter.prompt()
returnsPromise<PromptResult>
Multi prompts:
prompter.prompts()
returnsPromise<PromptResult[]>
Brought to you by www.simplyappdevs.com (2021)