Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | 15x 15x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 14x 8x 8x 11x 11x 8x 8x 7x 5x 3x 4x | import { identity, T } from 'ramda' type QuesstionTypes = 'input' | 'confirm' | 'number' | 'list' | 'rawlist' | 'expand' | 'checkbox' | 'password' | 'editor' type Validator = (input: string) => boolean | string type Choice = string | number | boolean | DetailedChoice type Choices = ((answers: Answers) => Choice[]) | Choice[] type Filter = <T>(value: T) => T type When = (answers: Answers) => boolean interface DetailedChoice { name: string value: string | number | boolean checked?: boolean disabled?: boolean } export interface QuestionOptions { type?: QuesstionTypes name: string message?: string | Function default?: any choices?: Choices validate?: Validator filter?: Filter transformer?: Function when?: When pageSize?: number prefix?: string suffix?: string } export class Question { public type: QuesstionTypes = 'input' public name: string = '' public message: string | Function = '' public default: any public choices: Choices = [] public validate: Validator = T public filter: Filter = identity public transformer: Function = identity public when: When = T public pageSize: number = 0 public prefix: string = '' public suffix: string = '' constructor(options: QuestionOptions) { if (options.type) this.type = options.type Eif (options.name) this.name = options.name else throw new TypeError('name should not be empty') Iif (options.message) this.message = options.message Iif (options.default) this.default = options.default if (options.choices) this.choices = options.choices Iif (options.validate) this.validate = options.validate Iif (options.filter) this.filter = options.filter Iif (options.transformer) this.transformer = options.transformer Iif (options.when) this.when = options.when Iif (options.pageSize) this.pageSize = options.pageSize Iif (options.prefix) this.prefix = options.prefix Iif (options.suffix) this.suffix = options.suffix } private includesByChoices(value, answers: Answers): boolean { let choices = this.choices if (typeof choices === 'function') choices = choices(answers) return choices .filter(choice => typeof choice !== 'object' || !choice.disabled) .some(choice => { Iif (typeof choice === 'object') return choice.value === value return choice === value }) } public answered(answers: Answers): boolean { const { name, type } = this if (!Object.keys(answers).includes(name)) return false const answer = answers[name] if (type === 'input' || type === 'password') return typeof answer === 'string' if (type === 'number') return typeof answer === 'number' if (type === 'confirm') return typeof answer === 'boolean' if (type === 'list' || type === 'rawlist' || type === 'expand') return this.includesByChoices(answer, answers) Eif (type === 'checkbox' && Array.isArray(answer)) return answer.every(value => this.includesByChoices(value, answers)) return false } } export type Questions = Question[] export interface Answers { [name: string]: string | number | boolean | (string | number)[] } export type Prompter = (question: Question[]) => Promise<Answers> |