UNPKG

1.85 kBJavaScriptView Raw
1'use strict';
2
3const CSI = '\x1b[';
4const CPR_REGEXP = /\x1b\[(\d+);(\d+)R/;
5
6const 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
30function 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
64module.exports = {
65 cursorPosition,
66 sequences,
67};