--- /dev/null
+'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;