| 'use strict'; | 
|   | 
| const StringPrompt = require('./string'); | 
|   | 
| class NumberPrompt extends StringPrompt { | 
|   constructor(options = {}) { | 
|     super({ style: 'number', ...options }); | 
|     this.min = this.isValue(options.min) ? this.toNumber(options.min) : -Infinity; | 
|     this.max = this.isValue(options.max) ? this.toNumber(options.max) : Infinity; | 
|     this.delay = options.delay != null ? options.delay : 1000; | 
|     this.float = options.float !== false; | 
|     this.round = options.round === true || options.float === false; | 
|     this.major = options.major || 10; | 
|     this.minor = options.minor || 1; | 
|     this.initial = options.initial != null ? options.initial : ''; | 
|     this.input = String(this.initial); | 
|     this.cursor = this.input.length; | 
|     this.cursorShow(); | 
|   } | 
|   | 
|   append(ch) { | 
|     if (!/[-+.]/.test(ch) || (ch === '.' && this.input.includes('.'))) { | 
|       return this.alert('invalid number'); | 
|     } | 
|     return super.append(ch); | 
|   } | 
|   | 
|   number(ch) { | 
|     return super.append(ch); | 
|   } | 
|   | 
|   next() { | 
|     if (this.input && this.input !== this.initial) return this.alert(); | 
|     if (!this.isValue(this.initial)) return this.alert(); | 
|     this.input = this.initial; | 
|     this.cursor = String(this.initial).length; | 
|     return this.render(); | 
|   } | 
|   | 
|   up(number) { | 
|     let step = number || this.minor; | 
|     let num = this.toNumber(this.input); | 
|     if (num > this.max + step) return this.alert(); | 
|     this.input = `${num + step}`; | 
|     return this.render(); | 
|   } | 
|   | 
|   down(number) { | 
|     let step = number || this.minor; | 
|     let num = this.toNumber(this.input); | 
|     if (num < this.min - step) return this.alert(); | 
|     this.input = `${num - step}`; | 
|     return this.render(); | 
|   } | 
|   | 
|   shiftDown() { | 
|     return this.down(this.major); | 
|   } | 
|   | 
|   shiftUp() { | 
|     return this.up(this.major); | 
|   } | 
|   | 
|   format(input = this.input) { | 
|     if (typeof this.options.format === 'function') { | 
|       return this.options.format.call(this, input); | 
|     } | 
|     return this.styles.info(input); | 
|   } | 
|   | 
|   toNumber(value = '') { | 
|     return this.float ? +value : Math.round(+value); | 
|   } | 
|   | 
|   isValue(value) { | 
|     return /^[-+]?[0-9]+((\.)|(\.[0-9]+))?$/.test(value); | 
|   } | 
|   | 
|   submit() { | 
|     let value = [this.input, this.initial].find(v => this.isValue(v)); | 
|     this.value = this.toNumber(value || 0); | 
|     return super.submit(); | 
|   } | 
| } | 
|   | 
| module.exports = NumberPrompt; |