1 | 'use strict';
|
2 |
|
3 | const CSI = '\x1b[';
|
4 | const CPR_REGEXP = /\x1b\[(\d+);(\d+)R/;
|
5 |
|
6 | const sequences = {
|
7 | controlSequenceIntroducer: () => CSI,
|
8 | cursorUp: (n) => `${ CSI }${ n || 1 }A`,
|
9 | cursorDown: (n) => `${ CSI }${ n || 1 }B`,
|
10 | cursorForward: (n) => `${ CSI }${ n || 1 }C`,
|
11 | cursorBack: (n) => `${ CSI }${ n || 1 }D`,
|
12 | cursorNextLine: (n) => `${ CSI }${ n || 1 }E`,
|
13 | cursorPreviousLine: (n) => `${ CSI }${ n || 1 }F`,
|
14 | cursorHorizontalAbsolute: (n) => `${ CSI }${ n || 1 }G`,
|
15 | cursorPosition: (n, m) => `${ CSI }${ n || 1 };${ m || 1 }H`,
|
16 | eraseInDisplay: (n) => `${ CSI }${ n || 0 }J`,
|
17 | eraseLine: (n) => `${ CSI }${ n || 0 }K`,
|
18 | scrollUp: (n) => `${ CSI }${ n || 1 }S`,
|
19 | scrollDown: (n) => `${ CSI }${ n || 1 }T`,
|
20 | horizontalVerticalPosition: (n, m) => `${ CSI }${ n || 1 };${ m || 1 }f`,
|
21 | deviceStatusReport: () => `${ CSI }6n`,
|
22 | saveCursorPosition: () => `${ CSI }s`,
|
23 | restoreCursorPosition: () => `${ CSI }u`,
|
24 | showCursor: () => `${ CSI }?25h`,
|
25 | hideCursor: () => `${ CSI }?25l`,
|
26 | enableAlternativeBuffer: () => `${ CSI }?1049h`,
|
27 | disableAlternativeBuffer: () => `${ CSI }?1049l`,
|
28 | };
|
29 |
|
30 | function cursorPosition () {
|
31 | return new Promise((resolve) => {
|
32 | if (!process.stdout.isTTY) {
|
33 | return resolve({
|
34 | x: 1,
|
35 | y: 1,
|
36 | });
|
37 | }
|
38 |
|
39 | const handler = (data) => {
|
40 | data = data.toString();
|
41 | if (CPR_REGEXP.test(data)) {
|
42 | const [ , y, x ] = data.match(CPR_REGEXP);
|
43 |
|
44 | process.stdin.setRawMode(false);
|
45 | process.stdin.off('data', handler);
|
46 | process.stdin.unref();
|
47 |
|
48 | return resolve({
|
49 | x,
|
50 | y,
|
51 | });
|
52 | }
|
53 |
|
54 | return data;
|
55 | };
|
56 |
|
57 | process.stdin.setRawMode(true);
|
58 | process.stdin.on('data', handler);
|
59 | process.stdout.write(sequences.deviceStatusReport());
|
60 | return true;
|
61 | });
|
62 | }
|
63 |
|
64 | module.exports = {
|
65 | cursorPosition,
|
66 | sequences,
|
67 | };
|