57 lines
1.7 KiB
JavaScript
57 lines
1.7 KiB
JavaScript
import KEYS from 'nomad-ui/utils/keys';
|
|
|
|
const REVERSE_WRAPAROUND_MODE = '\x1b[?45h';
|
|
const BACKSPACE_ONE_CHARACTER = '\x08 \x08';
|
|
|
|
// eslint-disable-next-line no-control-regex
|
|
const UNPRINTABLE_CHARACTERS_REGEX = /[\x00-\x1F]/g;
|
|
|
|
export default class ExecCommandEditorXtermAdapter {
|
|
constructor(terminal, setCommandCallback, command) {
|
|
this.terminal = terminal;
|
|
this.setCommandCallback = setCommandCallback;
|
|
|
|
this.command = command;
|
|
|
|
this.dataListener = terminal.onData((data) => {
|
|
this.handleDataEvent(data);
|
|
});
|
|
|
|
// Allows tests to bypass synthetic keyboard event restrictions
|
|
terminal.simulateCommandDataEvent = this.handleDataEvent.bind(this);
|
|
|
|
terminal.write(REVERSE_WRAPAROUND_MODE);
|
|
}
|
|
|
|
handleDataEvent(data) {
|
|
if (
|
|
data === KEYS.LEFT_ARROW ||
|
|
data === KEYS.UP_ARROW ||
|
|
data === KEYS.RIGHT_ARROW ||
|
|
data === KEYS.DOWN_ARROW
|
|
) {
|
|
// Ignore arrow keys
|
|
} else if (data === KEYS.CONTROL_U) {
|
|
this.terminal.write(BACKSPACE_ONE_CHARACTER.repeat(this.command.length));
|
|
this.command = '';
|
|
} else if (data === KEYS.ENTER) {
|
|
this.terminal.writeln('');
|
|
this.setCommandCallback(this.command);
|
|
this.dataListener.dispose();
|
|
} else if (data === KEYS.DELETE) {
|
|
if (this.command.length > 0) {
|
|
this.terminal.write(BACKSPACE_ONE_CHARACTER);
|
|
this.command = this.command.slice(0, -1);
|
|
}
|
|
} else if (data.length > 0) {
|
|
const strippedData = data.replace(UNPRINTABLE_CHARACTERS_REGEX, '');
|
|
this.terminal.write(strippedData);
|
|
this.command = `${this.command}${strippedData}`;
|
|
}
|
|
}
|
|
|
|
destroy() {
|
|
this.dataListener.dispose();
|
|
}
|
|
}
|