@pilotlab/lux-debug
Version:
A luxurious user experience framework, developed by your friends at Pilot.
57 lines (40 loc) • 1.84 kB
text/typescript
let readline = require('readline'); // built-in node package
import LogConsole from './logConsole';
export class LogCursor {
constructor(console:LogConsole) {
this._console = console;
}
private _console:LogConsole;
private _readline:any;
setLine(value:number):LogCursor { return this.setPosition(undefined, value); }
setColumn(value:number):LogCursor { return this.setPosition(value, undefined); }
setPosition(x:number, y:number):LogCursor { readline.cursorTo(this._console.stream, x, y); return this; }
move(x:number, y:number):LogCursor { readline.moveCursor(this._console.stream, x, y); return this; }
up(value:number = 1):LogCursor { return this.move(0, -Math.abs(value)); }
down(value:number = 1):LogCursor { return this.move(0, Math.abs(value)); }
left(value:number = 1):LogCursor { return this.move(-Math.abs(value), 0); }
right(value:number = 1):LogCursor { return this.move(Math.abs(value), 0); }
hide() {
this._readline = readline.createInterface({
input: process.stdin,
output: process.stdout
});
if (this._readline) this._readline.pause(); // This locks down keyboard input.
this._console.stream.write(this._encode('[?25l')); // From Charm
return this;
}
show() {
if (this._readline) {
/// Don't call this._readline.resume() as it interrupts testing.
/// Instead, just close the interface.
this._readline.close();
}
this._console.stream.write(this._encode('[?25h')); // From Charm
return this;
}
/// From Charm
private _encode(value:string):Buffer {
return new Buffer([0x1b].concat(value.split('').map((value:string) => value.charCodeAt(0))));
};
} // End class
export default LogCursor;