implement AnswerBucket
This commit is contained in:
parent
638282d91c
commit
4a81f148b4
19
README.md
19
README.md
@ -24,18 +24,33 @@ We recommend the use of TypeScript for best in class intellesense
|
|||||||
import { SmartInteract } from 'smartinteract'
|
import { SmartInteract } from 'smartinteract'
|
||||||
|
|
||||||
let myInteract = new SmartInteract([{ // note: its an array. You can specify multiple questions
|
let myInteract = new SmartInteract([{ // note: its an array. You can specify multiple questions
|
||||||
|
name: 'question1',
|
||||||
type: 'input',
|
type: 'input',
|
||||||
message: 'Who are you?',
|
message: 'Who are you?',
|
||||||
default: 'Somebody',
|
default: 'Somebody',
|
||||||
choices: { ... }, // optional, only needed if type is 'choice'
|
|
||||||
validate: (inputString) => { return true } // implement your own validation
|
validate: (inputString) => { return true } // implement your own validation
|
||||||
}])
|
}])
|
||||||
SmartInteract.addQuestions([ ... ]) // add more questions
|
SmartInteract.addQuestions([ ... ]) // add more questions
|
||||||
SmartInteract.runQueue()
|
SmartInteract.runQueue()
|
||||||
.then(answersArray => {
|
.then(answerBucket => { // the bucket has all the answers of the completed queue
|
||||||
|
let answerQuestion1 = answerBucket.getAnswerFor('question1')
|
||||||
// do something with the answers
|
// do something with the answers
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// alternatively use .askQuestion() for more direct control
|
||||||
|
SmartInteract.askQuestion{ // note: its an array. You can specify multiple questions
|
||||||
|
name: 'question2',
|
||||||
|
type: 'confirm',
|
||||||
|
message: 'Do you speak English?',
|
||||||
|
default: true,
|
||||||
|
validate: (inputString) => { return true } // implement your own validation
|
||||||
|
}().then(answerObject => {
|
||||||
|
// answerObject looks like { name: 'question2', value: true }
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Environment
|
||||||
|
In some environments like CI there is no user input to be expected.
|
||||||
|
smartinteract will always directyl create an answer from the default value
|
||||||
|
|
||||||
[![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks)
|
[![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks)
|
||||||
|
33
dist/smartinteract.classes.smartinteract.d.ts
vendored
33
dist/smartinteract.classes.smartinteract.d.ts
vendored
@ -1,5 +1,6 @@
|
|||||||
/// <reference types="q" />
|
/// <reference types="q" />
|
||||||
import * as q from 'q';
|
import * as q from 'q';
|
||||||
|
import { Objectmap } from 'lik';
|
||||||
export declare type questionType = 'input' | 'confirm' | 'list' | 'rawlist' | 'expand' | 'checkbox' | 'password' | 'editor';
|
export declare type questionType = 'input' | 'confirm' | 'list' | 'rawlist' | 'expand' | 'checkbox' | 'password' | 'editor';
|
||||||
export interface IChoiceObject {
|
export interface IChoiceObject {
|
||||||
name: string;
|
name: string;
|
||||||
@ -10,10 +11,12 @@ export interface IQuestionObject {
|
|||||||
type: questionType;
|
type: questionType;
|
||||||
message: string;
|
message: string;
|
||||||
default: any;
|
default: any;
|
||||||
choices: string[] | IChoiceObject[];
|
choices?: string[] | IChoiceObject[];
|
||||||
validate: IValidateFunction;
|
validate?: IValidateFunction;
|
||||||
}
|
}
|
||||||
export interface IAnswerObject {
|
export interface IAnswerObject {
|
||||||
|
name: string;
|
||||||
|
value: any;
|
||||||
}
|
}
|
||||||
export interface IValidateFunction {
|
export interface IValidateFunction {
|
||||||
(anyObject: any): boolean;
|
(anyObject: any): boolean;
|
||||||
@ -34,7 +37,7 @@ export declare class SmartInteract {
|
|||||||
* allows you to ask a single question and returns the answer in a promise
|
* allows you to ask a single question and returns the answer in a promise
|
||||||
* skips the queue
|
* skips the queue
|
||||||
*/
|
*/
|
||||||
askQuestion(optionsArg: IQuestionObject): q.Promise<IAnswerObject[]>;
|
askQuestion(optionsArg: IQuestionObject): q.Promise<IAnswerObject>;
|
||||||
/**
|
/**
|
||||||
* add questions to queue
|
* add questions to queue
|
||||||
*/
|
*/
|
||||||
@ -42,5 +45,27 @@ export declare class SmartInteract {
|
|||||||
/**
|
/**
|
||||||
* run the question queue
|
* run the question queue
|
||||||
*/
|
*/
|
||||||
runQueue(): q.Promise<IAnswerObject[]>;
|
runQueue(): q.Promise<AnswerBucket>;
|
||||||
|
/**
|
||||||
|
* checks if the current env is valid for userinput
|
||||||
|
*/
|
||||||
|
private isValidEnv();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* class AnswerBucket holds answers
|
||||||
|
*/
|
||||||
|
export declare class AnswerBucket {
|
||||||
|
answerMap: Objectmap<IAnswerObject>;
|
||||||
|
/**
|
||||||
|
* add an answer to the bucket
|
||||||
|
*/
|
||||||
|
addAnswer(answerArg: IAnswerObject): void;
|
||||||
|
/**
|
||||||
|
* gets an answer for a specific name
|
||||||
|
*/
|
||||||
|
getAnswerFor(nameArg: string): any;
|
||||||
|
/**
|
||||||
|
* gets all answers as array
|
||||||
|
*/
|
||||||
|
getAllAnswers(): IAnswerObject[];
|
||||||
}
|
}
|
||||||
|
82
dist/smartinteract.classes.smartinteract.js
vendored
82
dist/smartinteract.classes.smartinteract.js
vendored
@ -24,17 +24,28 @@ class SmartInteract {
|
|||||||
*/
|
*/
|
||||||
askQuestion(optionsArg) {
|
askQuestion(optionsArg) {
|
||||||
let done = q.defer();
|
let done = q.defer();
|
||||||
plugins.inquirer.prompt([{
|
if (this.isValidEnv()) {
|
||||||
|
plugins.inquirer.prompt([{
|
||||||
|
name: optionsArg.name,
|
||||||
|
type: optionsArg.type,
|
||||||
|
message: optionsArg.message,
|
||||||
|
default: optionsArg.default,
|
||||||
|
choices: optionsArg.choices,
|
||||||
|
validate: optionsArg.validate
|
||||||
|
}]).then((answers) => {
|
||||||
|
done.resolve({
|
||||||
|
name: optionsArg.name,
|
||||||
|
value: answers[optionsArg.name]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let answer = {
|
||||||
name: optionsArg.name,
|
name: optionsArg.name,
|
||||||
type: optionsArg.type,
|
value: optionsArg.default
|
||||||
message: optionsArg.message,
|
};
|
||||||
default: optionsArg.default,
|
done.resolve(answer);
|
||||||
choices: optionsArg.choices,
|
}
|
||||||
validate: optionsArg.validate
|
|
||||||
}]).then((answers) => {
|
|
||||||
console.log(answers);
|
|
||||||
done.resolve(answers);
|
|
||||||
});
|
|
||||||
return done.promise;
|
return done.promise;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -48,22 +59,63 @@ class SmartInteract {
|
|||||||
*/
|
*/
|
||||||
runQueue() {
|
runQueue() {
|
||||||
let done = q.defer();
|
let done = q.defer();
|
||||||
let answerMap = new lik_1.Objectmap();
|
let answerBucket = new AnswerBucket();
|
||||||
let handleQuestion = () => {
|
let handleQuestion = () => {
|
||||||
let oneQuestion = this.questionMap.getOneAndRemove();
|
let oneQuestion = this.questionMap.getOneAndRemove();
|
||||||
this.askQuestion(oneQuestion).then(x => {
|
this.askQuestion(oneQuestion).then((answerArg) => {
|
||||||
answerMap.addArray(x);
|
answerBucket.addAnswer(answerArg);
|
||||||
if (!this.questionMap.isEmpty()) {
|
if (!this.questionMap.isEmpty()) {
|
||||||
handleQuestion(); // recursion: as questions until empty
|
handleQuestion(); // recursion: as questions until empty
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
done.resolve(answerMap.getArray()); // when empty, then resolve promise
|
done.resolve(answerBucket); // when empty, then resolve promise
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
handleQuestion();
|
handleQuestion();
|
||||||
return done.promise;
|
return done.promise;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* checks if the current env is valid for userinput
|
||||||
|
*/
|
||||||
|
isValidEnv() {
|
||||||
|
if (!process.env.CI) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
exports.SmartInteract = SmartInteract;
|
exports.SmartInteract = SmartInteract;
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRpbnRlcmFjdC5jbGFzc2VzLnNtYXJ0aW50ZXJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGludGVyYWN0LmNsYXNzZXMuc21hcnRpbnRlcmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsbURBQWtEO0FBQ2xELHVCQUFzQjtBQUN0Qiw2QkFBK0I7QUEwQi9COztHQUVHO0FBQ0g7SUFPSTs7T0FFRztJQUNILFlBQVksZ0JBQW9DO1FBUmhEOztXQUVHO1FBQ0ssZ0JBQVcsR0FBRyxJQUFJLGVBQVMsRUFBbUIsQ0FBQTtRQU1sRCxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLFVBQTJCO1FBQ25DLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQW1CLENBQUE7UUFDckMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO2dCQUNyQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0JBQ3JCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztnQkFDM0IsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO2dCQUMzQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87Z0JBQzNCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTthQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUF3QjtZQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDekIsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsZ0JBQW1DO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNKLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQW1CLENBQUE7UUFDckMsSUFBSSxTQUFTLEdBQUcsSUFBSSxlQUFTLEVBQWlCLENBQUE7UUFDOUMsSUFBSSxjQUFjLEdBQUc7WUFDakIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtZQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUM5QixjQUFjLEVBQUUsQ0FBQSxDQUFDLHNDQUFzQztnQkFDM0QsQ0FBQztnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDSixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBLENBQUMsbUNBQW1DO2dCQUMxRSxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDLENBQUE7UUFDRCxjQUFjLEVBQUUsQ0FBQTtRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0NBQ0o7QUE5REQsc0NBOERDIn0=
|
/**
|
||||||
|
* class AnswerBucket holds answers
|
||||||
|
*/
|
||||||
|
class AnswerBucket {
|
||||||
|
constructor() {
|
||||||
|
this.answerMap = new lik_1.Objectmap();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* add an answer to the bucket
|
||||||
|
*/
|
||||||
|
addAnswer(answerArg) {
|
||||||
|
this.answerMap.add(answerArg);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* gets an answer for a specific name
|
||||||
|
*/
|
||||||
|
getAnswerFor(nameArg) {
|
||||||
|
let answer = this.answerMap.find(answerArg => {
|
||||||
|
return answerArg.name === nameArg;
|
||||||
|
});
|
||||||
|
return answer.value;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* gets all answers as array
|
||||||
|
*/
|
||||||
|
getAllAnswers() {
|
||||||
|
return this.answerMap.getArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.AnswerBucket = AnswerBucket;
|
||||||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRpbnRlcmFjdC5jbGFzc2VzLnNtYXJ0aW50ZXJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGludGVyYWN0LmNsYXNzZXMuc21hcnRpbnRlcmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsbURBQWtEO0FBQ2xELHVCQUFzQjtBQUN0Qiw2QkFBK0I7QUEyQi9COztHQUVHO0FBQ0g7SUFPSTs7T0FFRztJQUNILFlBQVksZ0JBQW9DO1FBUmhEOztXQUVHO1FBQ0ssZ0JBQVcsR0FBRyxJQUFJLGVBQVMsRUFBbUIsQ0FBQTtRQU1sRCxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLFVBQTJCO1FBQ25DLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQWlCLENBQUE7UUFDbkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNyQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7b0JBQ3JCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtvQkFDckIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO29CQUMzQixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87b0JBQzNCLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztvQkFDM0IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO2lCQUNoQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUF3QjtnQkFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDVCxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7b0JBQ3JCLEtBQUssRUFBRSxPQUFPLENBQUMsVUFB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
|
25
test/test.js
25
test/test.js
@ -9,6 +9,29 @@ describe('smartinteract', function () {
|
|||||||
should(testInteract).be.instanceOf(smartinteract.SmartInteract);
|
should(testInteract).be.instanceOf(smartinteract.SmartInteract);
|
||||||
});
|
});
|
||||||
it('should add question to SmartInteract instance', function () {
|
it('should add question to SmartInteract instance', function () {
|
||||||
|
testInteract.addQuestions([{
|
||||||
|
name: 'testQuestion1',
|
||||||
|
type: 'input',
|
||||||
|
message: 'what is your favourite color? Answer is blue',
|
||||||
|
default: 'blue'
|
||||||
|
}]);
|
||||||
|
testInteract.addQuestions([{
|
||||||
|
name: 'testQuestion2',
|
||||||
|
type: 'input',
|
||||||
|
message: 'what is your second favourite color? Answer is red',
|
||||||
|
default: 'red'
|
||||||
|
}]);
|
||||||
|
});
|
||||||
|
it('should use default value when not in CI', function (done) {
|
||||||
|
this.timeout(30000);
|
||||||
|
testInteract.runQueue().then(answerBucket => {
|
||||||
|
should(answerBucket.getAnswerFor('testQuestion1')).equal('blue');
|
||||||
|
should(answerBucket.getAnswerFor('testQuestion2')).equal('red');
|
||||||
|
done();
|
||||||
|
}).catch(err => {
|
||||||
|
console.log(err);
|
||||||
|
throw err;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsK0NBQThDO0FBRTlDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7SUFDdEIsSUFBSSxZQUFZLENBQUE7SUFDaEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3JDLFlBQVksR0FBRyxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNoRCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDbkUsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsK0NBQStDLEVBQUU7SUFFcEQsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQixpQ0FBZ0M7QUFFaEMsK0NBQThDO0FBRTlDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7SUFDdEIsSUFBSSxZQUF5QyxDQUFBO0lBQzdDLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtRQUNyQyxZQUFZLEdBQUcsSUFBSSxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDaEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ25FLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1FBQ2hELFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLElBQUksRUFBRSxPQUFPO2dCQUNiLE9BQU8sRUFBRSw4Q0FBOEM7Z0JBQ3ZELE9BQU8sRUFBRSxNQUFNO2FBQ2xCLENBQUMsQ0FBQyxDQUFBO1FBQ0gsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEVBQUUsZUFBZTtnQkFDckIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsT0FBTyxFQUFFLG9EQUFvRDtnQkFDN0QsT0FBTyxFQUFFLEtBQUs7YUFDakIsQ0FBQyxDQUFDLENBQUE7SUFDUCxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxVQUFTLElBQUk7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuQixZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDckMsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDaEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDL0QsSUFBSSxFQUFFLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEIsTUFBTSxHQUFHLENBQUE7UUFDYixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDLENBQUEifQ==
|
27
test/test.ts
27
test/test.ts
@ -4,13 +4,34 @@ import * as should from 'should'
|
|||||||
import * as smartinteract from '../dist/index'
|
import * as smartinteract from '../dist/index'
|
||||||
|
|
||||||
describe('smartinteract', function(){
|
describe('smartinteract', function(){
|
||||||
let testInteract
|
let testInteract: smartinteract.SmartInteract
|
||||||
it('should create a valid new instance', function(){
|
it('should create a valid new instance', function(){
|
||||||
testInteract = new smartinteract.SmartInteract()
|
testInteract = new smartinteract.SmartInteract()
|
||||||
should(testInteract).be.instanceOf(smartinteract.SmartInteract)
|
should(testInteract).be.instanceOf(smartinteract.SmartInteract)
|
||||||
})
|
})
|
||||||
it('should add question to SmartInteract instance', function() {
|
it('should add question to SmartInteract instance', function() {
|
||||||
|
testInteract.addQuestions([{
|
||||||
|
name: 'testQuestion1',
|
||||||
|
type: 'input',
|
||||||
|
message: 'what is your favourite color? Answer is blue',
|
||||||
|
default: 'blue'
|
||||||
|
}])
|
||||||
|
testInteract.addQuestions([{
|
||||||
|
name: 'testQuestion2',
|
||||||
|
type: 'input',
|
||||||
|
message: 'what is your second favourite color? Answer is red',
|
||||||
|
default: 'red'
|
||||||
|
}])
|
||||||
|
})
|
||||||
|
it('should use default value when not in CI', function(done){
|
||||||
|
this.timeout(30000)
|
||||||
|
testInteract.runQueue().then(answerBucket => {
|
||||||
|
should(answerBucket.getAnswerFor('testQuestion1')).equal('blue')
|
||||||
|
should(answerBucket.getAnswerFor('testQuestion2')).equal('red')
|
||||||
|
done()
|
||||||
|
}).catch(err => {
|
||||||
|
console.log(err)
|
||||||
|
throw err
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -14,12 +14,13 @@ export interface IQuestionObject {
|
|||||||
type: questionType
|
type: questionType
|
||||||
message: string
|
message: string
|
||||||
default: any
|
default: any
|
||||||
choices: string[] | IChoiceObject[]
|
choices?: string[] | IChoiceObject[]
|
||||||
validate: IValidateFunction
|
validate?: IValidateFunction
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IAnswerObject {
|
export interface IAnswerObject {
|
||||||
|
name: string,
|
||||||
|
value: any
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IValidateFunction {
|
export interface IValidateFunction {
|
||||||
@ -30,7 +31,7 @@ export interface IValidateFunction {
|
|||||||
* class SmartInteract - allows to specify an user interaction during runtime
|
* class SmartInteract - allows to specify an user interaction during runtime
|
||||||
*/
|
*/
|
||||||
export class SmartInteract {
|
export class SmartInteract {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* holds the qestion queue, that is emptied once you call
|
* holds the qestion queue, that is emptied once you call
|
||||||
*/
|
*/
|
||||||
@ -48,19 +49,30 @@ export class SmartInteract {
|
|||||||
* allows you to ask a single question and returns the answer in a promise
|
* allows you to ask a single question and returns the answer in a promise
|
||||||
* skips the queue
|
* skips the queue
|
||||||
*/
|
*/
|
||||||
askQuestion(optionsArg: IQuestionObject): q.Promise<IAnswerObject[]> {
|
askQuestion(optionsArg: IQuestionObject): q.Promise<IAnswerObject> {
|
||||||
let done = q.defer<IAnswerObject[]>()
|
let done = q.defer<IAnswerObject>()
|
||||||
plugins.inquirer.prompt([{
|
if (this.isValidEnv()) {
|
||||||
name: optionsArg.name,
|
plugins.inquirer.prompt([{
|
||||||
type: optionsArg.type,
|
name: optionsArg.name,
|
||||||
message: optionsArg.message,
|
type: optionsArg.type,
|
||||||
default: optionsArg.default,
|
message: optionsArg.message,
|
||||||
choices: optionsArg.choices,
|
default: optionsArg.default,
|
||||||
validate: optionsArg.validate
|
choices: optionsArg.choices,
|
||||||
}]).then((answers: IAnswerObject[]) => {
|
validate: optionsArg.validate
|
||||||
console.log(answers)
|
}]).then((answers: IAnswerObject[]) => {
|
||||||
done.resolve(answers)
|
done.resolve({
|
||||||
})
|
name: optionsArg.name,
|
||||||
|
value: answers[optionsArg.name]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
let answer: IAnswerObject = {
|
||||||
|
name: optionsArg.name,
|
||||||
|
value: optionsArg.default
|
||||||
|
}
|
||||||
|
done.resolve(answer)
|
||||||
|
}
|
||||||
|
|
||||||
return done.promise
|
return done.promise
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,20 +87,62 @@ export class SmartInteract {
|
|||||||
* run the question queue
|
* run the question queue
|
||||||
*/
|
*/
|
||||||
runQueue() {
|
runQueue() {
|
||||||
let done = q.defer<IAnswerObject[]>()
|
let done = q.defer<AnswerBucket>()
|
||||||
let answerMap = new Objectmap<IAnswerObject>()
|
let answerBucket = new AnswerBucket()
|
||||||
let handleQuestion = () => {
|
let handleQuestion = () => {
|
||||||
let oneQuestion = this.questionMap.getOneAndRemove()
|
let oneQuestion = this.questionMap.getOneAndRemove()
|
||||||
this.askQuestion(oneQuestion).then(x => {
|
this.askQuestion(oneQuestion).then((answerArg: IAnswerObject) => {
|
||||||
answerMap.addArray(x)
|
answerBucket.addAnswer(answerArg)
|
||||||
if (!this.questionMap.isEmpty()) {
|
if (!this.questionMap.isEmpty()) {
|
||||||
handleQuestion() // recursion: as questions until empty
|
handleQuestion() // recursion: as questions until empty
|
||||||
} else {
|
} else {
|
||||||
done.resolve(answerMap.getArray()) // when empty, then resolve promise
|
done.resolve(answerBucket) // when empty, then resolve promise
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
handleQuestion()
|
handleQuestion()
|
||||||
return done.promise
|
return done.promise
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* checks if the current env is valid for userinput
|
||||||
|
*/
|
||||||
|
private isValidEnv(): boolean {
|
||||||
|
if (!process.env.CI) {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class AnswerBucket holds answers
|
||||||
|
*/
|
||||||
|
export class AnswerBucket {
|
||||||
|
answerMap = new Objectmap<IAnswerObject>()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add an answer to the bucket
|
||||||
|
*/
|
||||||
|
addAnswer(answerArg: IAnswerObject) {
|
||||||
|
this.answerMap.add(answerArg)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets an answer for a specific name
|
||||||
|
*/
|
||||||
|
getAnswerFor(nameArg: string) {
|
||||||
|
let answer = this.answerMap.find(answerArg => {
|
||||||
|
return answerArg.name === nameArg
|
||||||
|
})
|
||||||
|
return answer.value
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets all answers as array
|
||||||
|
*/
|
||||||
|
getAllAnswers() {
|
||||||
|
return this.answerMap.getArray()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user