--- /dev/null
+'use strict';
+
+const { define, width } = require('./utils');
+
+class State {
+ constructor(prompt) {
+ let options = prompt.options;
+ define(this, '_prompt', prompt);
+ this.type = prompt.type;
+ this.name = prompt.name;
+ this.message = '';
+ this.header = '';
+ this.footer = '';
+ this.error = '';
+ this.hint = '';
+ this.input = '';
+ this.cursor = 0;
+ this.index = 0;
+ this.lines = 0;
+ this.tick = 0;
+ this.prompt = '';
+ this.buffer = '';
+ this.width = width(options.stdout || process.stdout);
+ Object.assign(this, options);
+ this.name = this.name || this.message;
+ this.message = this.message || this.name;
+ this.symbols = prompt.symbols;
+ this.styles = prompt.styles;
+ this.required = new Set();
+ this.cancelled = false;
+ this.submitted = false;
+ }
+
+ clone() {
+ let state = { ...this };
+ state.status = this.status;
+ state.buffer = Buffer.from(state.buffer);
+ delete state.clone;
+ return state;
+ }
+
+ set color(val) {
+ this._color = val;
+ }
+ get color() {
+ let styles = this.prompt.styles;
+ if (this.cancelled) return styles.cancelled;
+ if (this.submitted) return styles.submitted;
+ let color = this._color || styles[this.status];
+ return typeof color === 'function' ? color : styles.pending;
+ }
+
+ set loading(value) {
+ this._loading = value;
+ }
+ get loading() {
+ if (typeof this._loading === 'boolean') return this._loading;
+ if (this.loadingChoices) return 'choices';
+ return false;
+ }
+
+ get status() {
+ if (this.cancelled) return 'cancelled';
+ if (this.submitted) return 'submitted';
+ return 'pending';
+ }
+}
+
+module.exports = State;