@suds-cli/tea 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/commands.d.ts +27 -0
  2. package/dist/commands.d.ts.map +1 -0
  3. package/dist/commands.js +106 -0
  4. package/dist/commands.js.map +1 -0
  5. package/dist/index.d.ts +12 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +52 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/input.d.ts +8 -0
  10. package/dist/input.d.ts.map +1 -0
  11. package/dist/input.js +98 -0
  12. package/dist/input.js.map +1 -0
  13. package/dist/keys.d.ts +86 -0
  14. package/dist/keys.d.ts.map +1 -0
  15. package/dist/keys.js +317 -0
  16. package/dist/keys.js.map +1 -0
  17. package/dist/messages.d.ts +78 -0
  18. package/dist/messages.d.ts.map +1 -0
  19. package/dist/messages.js +104 -0
  20. package/dist/messages.js.map +1 -0
  21. package/dist/mouse.d.ts +46 -0
  22. package/dist/mouse.d.ts.map +1 -0
  23. package/dist/mouse.js +167 -0
  24. package/dist/mouse.js.map +1 -0
  25. package/dist/program.d.ts +39 -0
  26. package/dist/program.d.ts.map +1 -0
  27. package/dist/program.js +231 -0
  28. package/dist/program.js.map +1 -0
  29. package/dist/renderer.d.ts +19 -0
  30. package/dist/renderer.d.ts.map +1 -0
  31. package/dist/renderer.js +49 -0
  32. package/dist/renderer.js.map +1 -0
  33. package/dist/screen.d.ts +22 -0
  34. package/dist/screen.d.ts.map +1 -0
  35. package/dist/screen.js +35 -0
  36. package/dist/screen.js.map +1 -0
  37. package/dist/terminal.d.ts +32 -0
  38. package/dist/terminal.d.ts.map +1 -0
  39. package/dist/terminal.js +119 -0
  40. package/dist/terminal.js.map +1 -0
  41. package/dist/types.d.ts +36 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +3 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +33 -0
package/dist/mouse.js ADDED
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MouseMsg = exports.MouseButton = exports.MouseAction = void 0;
4
+ exports.parseMouse = parseMouse;
5
+ /** @public Mouse action type. */
6
+ var MouseAction;
7
+ (function (MouseAction) {
8
+ MouseAction["Press"] = "press";
9
+ MouseAction["Release"] = "release";
10
+ MouseAction["Motion"] = "motion";
11
+ })(MouseAction || (exports.MouseAction = MouseAction = {}));
12
+ /** @public Mouse button identifiers, including wheels. */
13
+ var MouseButton;
14
+ (function (MouseButton) {
15
+ MouseButton["None"] = "none";
16
+ MouseButton["Left"] = "left";
17
+ MouseButton["Middle"] = "middle";
18
+ MouseButton["Right"] = "right";
19
+ MouseButton["WheelUp"] = "wheel-up";
20
+ MouseButton["WheelDown"] = "wheel-down";
21
+ MouseButton["WheelLeft"] = "wheel-left";
22
+ MouseButton["WheelRight"] = "wheel-right";
23
+ MouseButton["Backward"] = "backward";
24
+ MouseButton["Forward"] = "forward";
25
+ MouseButton["Button10"] = "button-10";
26
+ MouseButton["Button11"] = "button-11";
27
+ })(MouseButton || (exports.MouseButton = MouseButton = {}));
28
+ /** @public Message representing a parsed mouse event. */
29
+ class MouseMsg {
30
+ event;
31
+ _tag = "mouse";
32
+ constructor(event) {
33
+ this.event = event;
34
+ }
35
+ toString() {
36
+ const parts = [
37
+ this.event.ctrl ? "ctrl" : "",
38
+ this.event.alt ? "alt" : "",
39
+ this.event.shift ? "shift" : "",
40
+ ].filter(Boolean);
41
+ const mods = parts.length > 0 ? `${parts.join("+")}+` : "";
42
+ return `${mods}${this.event.button} ${this.event.action} @${this.event.x},${this.event.y}`;
43
+ }
44
+ }
45
+ exports.MouseMsg = MouseMsg;
46
+ const mouseSGRRegex = /(\d+);(\d+);(\d+)([Mm])/;
47
+ const mouseEventX10Len = 6;
48
+ const x10MouseByteOffset = 32;
49
+ function parseMouse(buffer, allowMoreData) {
50
+ if (buffer.length < 3 || buffer[0] !== 0x1b || buffer[1] !== 0x5b) {
51
+ return undefined;
52
+ }
53
+ if (buffer[2] === 0x4d) {
54
+ if (buffer.length < mouseEventX10Len) {
55
+ return allowMoreData ? { needMore: true } : undefined;
56
+ }
57
+ const event = parseX10MouseEvent(buffer.subarray(0, mouseEventX10Len));
58
+ return { msg: new MouseMsg(event), length: mouseEventX10Len };
59
+ }
60
+ if (buffer[2] === 0x3c) {
61
+ const slice = buffer.toString("utf8");
62
+ const match = mouseSGRRegex.exec(slice.slice(3));
63
+ if (!match) {
64
+ return allowMoreData ? { needMore: true } : undefined;
65
+ }
66
+ const event = parseSGRMouseEvent(slice);
67
+ const matchedLength = match[0]?.length ?? 0;
68
+ return { msg: new MouseMsg(event), length: matchedLength + 3 };
69
+ }
70
+ return undefined;
71
+ }
72
+ function parseSGRMouseEvent(seq) {
73
+ const match = mouseSGRRegex.exec(seq.slice(3));
74
+ if (!match) {
75
+ return defaultMouseEvent();
76
+ }
77
+ const buttonCode = Number.parseInt(match[1] ?? "0", 10);
78
+ const px = Number.parseInt(match[2] ?? "0", 10);
79
+ const py = Number.parseInt(match[3] ?? "0", 10);
80
+ const release = match[4] === "m";
81
+ const event = parseMouseButton(buttonCode, true);
82
+ if (event.action !== MouseAction.Motion && !eventIsWheel(event) && release) {
83
+ event.action = MouseAction.Release;
84
+ }
85
+ event.x = px - 1;
86
+ event.y = py - 1;
87
+ return event;
88
+ }
89
+ function parseX10MouseEvent(buf) {
90
+ const buttonByte = buf[3] ?? 0;
91
+ const c1 = buf[4] ?? 0;
92
+ const c2 = buf[5] ?? 0;
93
+ const event = parseMouseButton(buttonByte, false);
94
+ event.x = c1 - x10MouseByteOffset - 1;
95
+ event.y = c2 - x10MouseByteOffset - 1;
96
+ return event;
97
+ }
98
+ function parseMouseButton(code, isSGR) {
99
+ let e = code;
100
+ if (!isSGR) {
101
+ e -= x10MouseByteOffset;
102
+ }
103
+ const bitShift = 0b0000_0100;
104
+ const bitAlt = 0b0000_1000;
105
+ const bitCtrl = 0b0001_0000;
106
+ const bitMotion = 0b0010_0000;
107
+ const bitWheel = 0b0100_0000;
108
+ const bitAdd = 0b1000_0000;
109
+ const bitsMask = 0b0000_0011;
110
+ const event = defaultMouseEvent();
111
+ if ((e & bitAdd) !== 0) {
112
+ const extraButtons = {
113
+ 0: MouseButton.Backward,
114
+ 1: MouseButton.Forward,
115
+ 2: MouseButton.Button10,
116
+ 3: MouseButton.Button11,
117
+ };
118
+ event.button = extraButtons[e & bitsMask] ?? MouseButton.None;
119
+ }
120
+ else if ((e & bitWheel) !== 0) {
121
+ const wheelButtons = {
122
+ 0: MouseButton.WheelUp,
123
+ 1: MouseButton.WheelDown,
124
+ 2: MouseButton.WheelLeft,
125
+ 3: MouseButton.WheelRight,
126
+ };
127
+ event.button = wheelButtons[e & bitsMask] ?? MouseButton.None;
128
+ }
129
+ else {
130
+ const baseButtons = {
131
+ 0: MouseButton.Left,
132
+ 1: MouseButton.Middle,
133
+ 2: MouseButton.Right,
134
+ 3: MouseButton.None,
135
+ };
136
+ event.button = baseButtons[e & bitsMask] ?? MouseButton.None;
137
+ if ((e & bitsMask) === bitsMask) {
138
+ event.action = MouseAction.Release;
139
+ event.button = MouseButton.None;
140
+ }
141
+ }
142
+ if ((e & bitMotion) !== 0 && !eventIsWheel(event)) {
143
+ event.action = MouseAction.Motion;
144
+ }
145
+ event.alt = (e & bitAlt) !== 0;
146
+ event.ctrl = (e & bitCtrl) !== 0;
147
+ event.shift = (e & bitShift) !== 0;
148
+ return event;
149
+ }
150
+ function eventIsWheel(event) {
151
+ return (event.button === MouseButton.WheelUp ||
152
+ event.button === MouseButton.WheelDown ||
153
+ event.button === MouseButton.WheelLeft ||
154
+ event.button === MouseButton.WheelRight);
155
+ }
156
+ function defaultMouseEvent() {
157
+ return {
158
+ x: 0,
159
+ y: 0,
160
+ shift: false,
161
+ alt: false,
162
+ ctrl: false,
163
+ action: MouseAction.Press,
164
+ button: MouseButton.None,
165
+ };
166
+ }
167
+ //# sourceMappingURL=mouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse.js","sourceRoot":"","sources":["../src/mouse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { Model, Msg, ProgramResult } from "./types.js";
2
+ /** @public Configure program runtime options. */
3
+ export interface ProgramOptions {
4
+ altScreen?: boolean;
5
+ mouseMode?: "cell" | "all" | false;
6
+ input?: NodeJS.ReadableStream;
7
+ output?: NodeJS.WritableStream;
8
+ fps?: number;
9
+ reportFocus?: boolean;
10
+ bracketedPaste?: boolean;
11
+ }
12
+ /** @public Bubble Tea-style program runner. */
13
+ export declare class Program<M extends Model<Msg, M>> {
14
+ private model;
15
+ private readonly terminal;
16
+ private readonly renderer;
17
+ private readonly opts;
18
+ private stopInput?;
19
+ private running;
20
+ private queue;
21
+ private draining;
22
+ private result;
23
+ constructor(model: M, options?: ProgramOptions);
24
+ run(): Promise<ProgramResult<M>>;
25
+ send(msg: Msg): void;
26
+ quit(): void;
27
+ kill(): void;
28
+ private drainQueue;
29
+ private handleInternal;
30
+ private runCmd;
31
+ private setupTerminal;
32
+ private startInputLoop;
33
+ private setupSignals;
34
+ private disposeSignals;
35
+ private onSigInt;
36
+ private onSigTerm;
37
+ private shutdown;
38
+ }
39
+ //# sourceMappingURL=program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAO,KAAK,EAAY,GAAG,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3E,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,+CAA+C;AAC/C,qBAAa,OAAO,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAiC;gBAEnC,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,cAAmB;IAU5C,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAqBtC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAUpB,IAAI,IAAI,IAAI;IAIZ,IAAI,IAAI,IAAI;YAKE,UAAU;IA2BxB,OAAO,CAAC,cAAc;YAiDR,MAAM;IAiBpB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,cAAc,CAA6B;IAEnD,OAAO,CAAC,QAAQ,CAEd;IAEF,OAAO,CAAC,SAAS,CAEf;IAEF,OAAO,CAAC,QAAQ;CAYjB"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Program = void 0;
7
+ const node_process_1 = __importDefault(require("node:process"));
8
+ const input_js_1 = require("./input.js");
9
+ const messages_js_1 = require("./messages.js");
10
+ const renderer_js_1 = require("./renderer.js");
11
+ const terminal_js_1 = require("./terminal.js");
12
+ const messages_js_2 = require("./messages.js");
13
+ /** @public Bubble Tea-style program runner. */
14
+ class Program {
15
+ model;
16
+ terminal;
17
+ renderer;
18
+ opts;
19
+ stopInput;
20
+ running = false;
21
+ queue = [];
22
+ draining = false;
23
+ result = null;
24
+ constructor(model, options = {}) {
25
+ this.model = model;
26
+ this.opts = options;
27
+ this.terminal = new terminal_js_1.TerminalController(options.input, options.output);
28
+ this.renderer = new renderer_js_1.StandardRenderer({
29
+ output: options.output,
30
+ fps: options.fps,
31
+ });
32
+ }
33
+ async run() {
34
+ this.running = true;
35
+ this.setupTerminal();
36
+ this.setupSignals();
37
+ this.renderer.start();
38
+ try {
39
+ await this.runCmd(this.model.init());
40
+ this.renderer.write(this.model.view());
41
+ this.startInputLoop();
42
+ await this.drainQueue();
43
+ this.result = { model: this.model };
44
+ }
45
+ catch (err) {
46
+ this.result = { model: this.model, error: err };
47
+ }
48
+ finally {
49
+ this.shutdown();
50
+ }
51
+ return this.result ?? { model: this.model };
52
+ }
53
+ send(msg) {
54
+ if (!msg) {
55
+ return;
56
+ }
57
+ this.queue.push(msg);
58
+ if (!this.draining) {
59
+ void this.drainQueue();
60
+ }
61
+ }
62
+ quit() {
63
+ this.send(new messages_js_1.QuitMsg());
64
+ }
65
+ kill() {
66
+ this.running = false;
67
+ this.shutdown();
68
+ }
69
+ async drainQueue() {
70
+ if (this.draining) {
71
+ return;
72
+ }
73
+ this.draining = true;
74
+ while (this.running && this.queue.length > 0) {
75
+ const msg = this.queue.shift();
76
+ if (msg === undefined) {
77
+ continue;
78
+ }
79
+ const consumed = this.handleInternal(msg);
80
+ if (consumed) {
81
+ continue;
82
+ }
83
+ const [nextModel, cmd] = this.model.update(msg);
84
+ this.model = nextModel;
85
+ await this.runCmd(cmd);
86
+ this.renderer.write(this.model.view());
87
+ }
88
+ this.draining = false;
89
+ }
90
+ handleInternal(msg) {
91
+ if (msg instanceof messages_js_1.QuitMsg || msg instanceof messages_js_1.InterruptMsg) {
92
+ this.running = false;
93
+ return true;
94
+ }
95
+ if (msg instanceof messages_js_1.ClearScreenMsg) {
96
+ this.terminal.clearScreen();
97
+ return false;
98
+ }
99
+ if (msg instanceof messages_js_1.EnterAltScreenMsg) {
100
+ this.terminal.enterAltScreen();
101
+ this.renderer.repaint();
102
+ return false;
103
+ }
104
+ if (msg instanceof messages_js_1.ExitAltScreenMsg) {
105
+ this.terminal.exitAltScreen();
106
+ this.renderer.repaint();
107
+ return false;
108
+ }
109
+ if (msg instanceof messages_js_1.EnableMouseCellMotionMsg) {
110
+ this.terminal.enableMouseCellMotion();
111
+ return false;
112
+ }
113
+ if (msg instanceof messages_js_1.EnableMouseAllMotionMsg) {
114
+ this.terminal.enableMouseAllMotion();
115
+ return false;
116
+ }
117
+ if (msg instanceof messages_js_1.DisableMouseMsg) {
118
+ this.terminal.disableMouse();
119
+ return false;
120
+ }
121
+ if (msg instanceof messages_js_1.ShowCursorMsg) {
122
+ this.terminal.showCursor();
123
+ return false;
124
+ }
125
+ if (msg instanceof messages_js_1.HideCursorMsg) {
126
+ this.terminal.hideCursor();
127
+ return false;
128
+ }
129
+ if (msg instanceof messages_js_1.SetWindowTitleMsg) {
130
+ this.terminal.setWindowTitle(msg.title);
131
+ return false;
132
+ }
133
+ if (msg instanceof messages_js_1.ResumeMsg) {
134
+ return false;
135
+ }
136
+ return false;
137
+ }
138
+ async runCmd(cmd) {
139
+ if (!cmd) {
140
+ return;
141
+ }
142
+ const result = await Promise.resolve(cmd());
143
+ if (result === null || result === undefined) {
144
+ return;
145
+ }
146
+ if (Array.isArray(result)) {
147
+ for (const msg of result) {
148
+ this.send(msg);
149
+ }
150
+ }
151
+ else {
152
+ this.send(result);
153
+ }
154
+ }
155
+ setupTerminal() {
156
+ this.terminal.enableRawMode();
157
+ this.terminal.hideCursor();
158
+ if (this.opts.altScreen) {
159
+ this.terminal.enterAltScreen();
160
+ this.terminal.clearScreen();
161
+ }
162
+ if (this.opts.mouseMode === "cell") {
163
+ this.terminal.enableMouseCellMotion();
164
+ }
165
+ else if (this.opts.mouseMode === "all") {
166
+ this.terminal.enableMouseAllMotion();
167
+ }
168
+ if (this.opts.bracketedPaste !== false) {
169
+ this.terminal.enableBracketedPaste();
170
+ }
171
+ if (this.opts.reportFocus) {
172
+ this.terminal.enableReportFocus();
173
+ }
174
+ }
175
+ startInputLoop() {
176
+ this.stopInput = (0, input_js_1.startInput)({
177
+ input: this.opts.input,
178
+ onMessage: (msg) => this.send(msg),
179
+ });
180
+ }
181
+ setupSignals() {
182
+ const output = this.opts.output ?? node_process_1.default.stdout;
183
+ const handleResize = () => {
184
+ const { columns, rows } = getSize(output);
185
+ const w = columns ?? 0;
186
+ const h = rows ?? 0;
187
+ this.send(new messages_js_2.WindowSizeMsg(w, h));
188
+ };
189
+ node_process_1.default.on("SIGINT", this.onSigInt);
190
+ node_process_1.default.on("SIGTERM", this.onSigTerm);
191
+ if ("on" in output &&
192
+ typeof output.on === "function") {
193
+ output.on("resize", handleResize);
194
+ }
195
+ // Initial size
196
+ handleResize();
197
+ this.disposeSignals = () => {
198
+ node_process_1.default.off("SIGINT", this.onSigInt);
199
+ node_process_1.default.off("SIGTERM", this.onSigTerm);
200
+ if ("off" in output &&
201
+ typeof output.off === "function") {
202
+ output.off("resize", handleResize);
203
+ }
204
+ };
205
+ }
206
+ disposeSignals = null;
207
+ onSigInt = () => {
208
+ this.send(new messages_js_1.InterruptMsg());
209
+ };
210
+ onSigTerm = () => {
211
+ this.send(new messages_js_1.QuitMsg());
212
+ };
213
+ shutdown() {
214
+ if (this.disposeSignals) {
215
+ this.disposeSignals();
216
+ this.disposeSignals = null;
217
+ }
218
+ if (this.stopInput) {
219
+ this.stopInput();
220
+ this.stopInput = undefined;
221
+ }
222
+ this.renderer.stop();
223
+ this.terminal.cleanup();
224
+ }
225
+ }
226
+ exports.Program = Program;
227
+ function getSize(stream) {
228
+ const s = stream;
229
+ return { columns: s.columns, rows: s.rows };
230
+ }
231
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** @public Options for the standard renderer. */
2
+ export interface RendererOptions {
3
+ output?: NodeJS.WritableStream;
4
+ fps?: number;
5
+ }
6
+ export declare class StandardRenderer {
7
+ private nextFrame;
8
+ private lastFrame;
9
+ private ticker;
10
+ private readonly output;
11
+ private readonly frameInterval;
12
+ constructor(options?: RendererOptions);
13
+ start(): void;
14
+ stop(): void;
15
+ write(view: string): void;
16
+ repaint(): void;
17
+ private flush;
18
+ }
19
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAGA,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,OAAO,GAAE,eAAoB;IAMzC,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;IAQZ,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,KAAK;CAWd"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StandardRenderer = void 0;
4
+ const CURSOR_HOME = "\u001b[H";
5
+ const CLEAR_TO_END = "\u001b[0J";
6
+ class StandardRenderer {
7
+ nextFrame = null;
8
+ lastFrame = "";
9
+ ticker = null;
10
+ output;
11
+ frameInterval;
12
+ constructor(options = {}) {
13
+ this.output = options.output ?? process.stdout;
14
+ const fps = Math.min(Math.max(options.fps ?? 60, 1), 120);
15
+ this.frameInterval = Math.round(1000 / fps);
16
+ }
17
+ start() {
18
+ if (this.ticker) {
19
+ return;
20
+ }
21
+ this.ticker = setInterval(() => this.flush(), this.frameInterval);
22
+ }
23
+ stop() {
24
+ this.flush();
25
+ if (this.ticker) {
26
+ clearInterval(this.ticker);
27
+ this.ticker = null;
28
+ }
29
+ }
30
+ write(view) {
31
+ this.nextFrame = view ?? "";
32
+ }
33
+ repaint() {
34
+ this.lastFrame = "";
35
+ }
36
+ flush() {
37
+ if (this.nextFrame === null) {
38
+ return;
39
+ }
40
+ const frame = this.nextFrame;
41
+ if (frame === this.lastFrame) {
42
+ return;
43
+ }
44
+ this.lastFrame = frame;
45
+ this.output.write(`${CURSOR_HOME}${frame}${CLEAR_TO_END}`);
46
+ }
47
+ }
48
+ exports.StandardRenderer = StandardRenderer;
49
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":";;;AAAA,MAAM,WAAW,GAAG,UAAU,CAAC;AAC/B,MAAM,YAAY,GAAG,WAAW,CAAC;AAQjC,MAAa,gBAAgB;IACnB,SAAS,GAAkB,IAAI,CAAC;IAChC,SAAS,GAAG,EAAE,CAAC;IACf,MAAM,GAA0B,IAAI,CAAC;IAC5B,MAAM,CAAwB;IAC9B,aAAa,CAAS;IAEvC,YAAY,UAA2B,EAAE;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACpE,CAAC;IAED,IAAI;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAEO,KAAK;QACX,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,KAAK,GAAG,YAAY,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF;AA/CD,4CA+CC"}
@@ -0,0 +1,22 @@
1
+ import type { Cmd, Msg } from "./types.js";
2
+ /** @public Clear the terminal screen. */
3
+ export declare const clearScreen: () => Cmd<Msg>;
4
+ /** @public Enter the alternate screen buffer. */
5
+ export declare const enterAltScreen: () => Cmd<Msg>;
6
+ /** @public Exit the alternate screen buffer. */
7
+ export declare const exitAltScreen: () => Cmd<Msg>;
8
+ /** @public Enable cell-motion mouse reporting. */
9
+ export declare const enableMouseCellMotion: () => Cmd<Msg>;
10
+ /** @public Enable all-motion mouse reporting. */
11
+ export declare const enableMouseAllMotion: () => Cmd<Msg>;
12
+ /** @public Disable mouse reporting. */
13
+ export declare const disableMouse: () => Cmd<Msg>;
14
+ /** @public Show the cursor. */
15
+ export declare const showCursor: () => Cmd<Msg>;
16
+ /** @public Hide the cursor. */
17
+ export declare const hideCursor: () => Cmd<Msg>;
18
+ /** @public Set the terminal window title. */
19
+ export declare const setWindowTitle: (title: string) => Cmd<Msg>;
20
+ /** @public Emit the current window size. */
21
+ export declare const windowSize: () => Cmd<Msg>;
22
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE3C,yCAAyC;AACzC,eAAO,MAAM,WAAW,QAAO,GAAG,CAAC,GAAG,CAA+B,CAAC;AACtE,iDAAiD;AACjD,eAAO,MAAM,cAAc,QAAO,GAAG,CAAC,GAAG,CAAkC,CAAC;AAC5E,gDAAgD;AAChD,eAAO,MAAM,aAAa,QAAO,GAAG,CAAC,GAAG,CAAiC,CAAC;AAC1E,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,QAAO,GAAG,CAAC,GAAG,CAChB,CAAC;AACjC,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,QAAO,GAAG,CAAC,GAAG,CAChB,CAAC;AAChC,uCAAuC;AACvC,eAAO,MAAM,YAAY,QAAO,GAAG,CAAC,GAAG,CAAgC,CAAC;AACxE,+BAA+B;AAC/B,eAAO,MAAM,UAAU,QAAO,GAAG,CAAC,GAAG,CAA8B,CAAC;AACpE,+BAA+B;AAC/B,eAAO,MAAM,UAAU,QAAO,GAAG,CAAC,GAAG,CAA8B,CAAC;AACpE,6CAA6C;AAC7C,eAAO,MAAM,cAAc,GACxB,OAAO,MAAM,KAAG,GAAG,CAAC,GAAG,CAEM,CAAC;AACjC,4CAA4C;AAC5C,eAAO,MAAM,UAAU,QAAO,GAAG,CAAC,GAAG,CACqC,CAAC"}
package/dist/screen.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.windowSize = exports.setWindowTitle = exports.hideCursor = exports.showCursor = exports.disableMouse = exports.enableMouseAllMotion = exports.enableMouseCellMotion = exports.exitAltScreen = exports.enterAltScreen = exports.clearScreen = void 0;
4
+ const messages_js_1 = require("./messages.js");
5
+ /** @public Clear the terminal screen. */
6
+ const clearScreen = () => () => new messages_js_1.ClearScreenMsg();
7
+ exports.clearScreen = clearScreen;
8
+ /** @public Enter the alternate screen buffer. */
9
+ const enterAltScreen = () => () => new messages_js_1.EnterAltScreenMsg();
10
+ exports.enterAltScreen = enterAltScreen;
11
+ /** @public Exit the alternate screen buffer. */
12
+ const exitAltScreen = () => () => new messages_js_1.ExitAltScreenMsg();
13
+ exports.exitAltScreen = exitAltScreen;
14
+ /** @public Enable cell-motion mouse reporting. */
15
+ const enableMouseCellMotion = () => () => new messages_js_1.EnableMouseCellMotionMsg();
16
+ exports.enableMouseCellMotion = enableMouseCellMotion;
17
+ /** @public Enable all-motion mouse reporting. */
18
+ const enableMouseAllMotion = () => () => new messages_js_1.EnableMouseAllMotionMsg();
19
+ exports.enableMouseAllMotion = enableMouseAllMotion;
20
+ /** @public Disable mouse reporting. */
21
+ const disableMouse = () => () => new messages_js_1.DisableMouseMsg();
22
+ exports.disableMouse = disableMouse;
23
+ /** @public Show the cursor. */
24
+ const showCursor = () => () => new messages_js_1.ShowCursorMsg();
25
+ exports.showCursor = showCursor;
26
+ /** @public Hide the cursor. */
27
+ const hideCursor = () => () => new messages_js_1.HideCursorMsg();
28
+ exports.hideCursor = hideCursor;
29
+ /** @public Set the terminal window title. */
30
+ const setWindowTitle = (title) => () => new messages_js_1.SetWindowTitleMsg(title);
31
+ exports.setWindowTitle = setWindowTitle;
32
+ /** @public Emit the current window size. */
33
+ const windowSize = () => () => new messages_js_1.WindowSizeMsg(process.stdout.columns ?? 0, process.stdout.rows ?? 0);
34
+ exports.windowSize = windowSize;
35
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":";;;AAAA,+CAWuB;AAGvB,yCAAyC;AAClC,MAAM,WAAW,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,4BAAc,EAAE,CAAC;AAAzD,QAAA,WAAW,eAA8C;AACtE,iDAAiD;AAC1C,MAAM,cAAc,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,+BAAiB,EAAE,CAAC;AAA/D,QAAA,cAAc,kBAAiD;AAC5E,gDAAgD;AACzC,MAAM,aAAa,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,8BAAgB,EAAE,CAAC;AAA7D,QAAA,aAAa,iBAAgD;AAC1E,kDAAkD;AAC3C,MAAM,qBAAqB,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CACxD,IAAI,sCAAwB,EAAE,CAAC;AADpB,QAAA,qBAAqB,yBACD;AACjC,iDAAiD;AAC1C,MAAM,oBAAoB,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CACvD,IAAI,qCAAuB,EAAE,CAAC;AADnB,QAAA,oBAAoB,wBACD;AAChC,uCAAuC;AAChC,MAAM,YAAY,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,6BAAe,EAAE,CAAC;AAA3D,QAAA,YAAY,gBAA+C;AACxE,+BAA+B;AACxB,MAAM,UAAU,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,2BAAa,EAAE,CAAC;AAAvD,QAAA,UAAU,cAA6C;AACpE,+BAA+B;AACxB,MAAM,UAAU,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,2BAAa,EAAE,CAAC;AAAvD,QAAA,UAAU,cAA6C;AACpE,6CAA6C;AACtC,MAAM,cAAc,GACzB,CAAC,KAAa,EAAY,EAAE,CAC5B,GAAG,EAAE,CACH,IAAI,+BAAiB,CAAC,KAAK,CAAC,CAAC;AAHpB,QAAA,cAAc,kBAGM;AACjC,4CAA4C;AACrC,MAAM,UAAU,GAAG,GAAa,EAAE,CAAC,GAAG,EAAE,CAC7C,IAAI,2BAAa,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AAD9D,QAAA,UAAU,cACoD"}
@@ -0,0 +1,32 @@
1
+ /** @public Options for the terminal controller. */
2
+ export interface TerminalOptions {
3
+ input?: NodeJS.ReadableStream;
4
+ output?: NodeJS.WritableStream;
5
+ }
6
+ export declare class TerminalController {
7
+ private readonly input;
8
+ private readonly output;
9
+ private rawMode;
10
+ private altScreen;
11
+ private bracketedPaste;
12
+ private focusReporting;
13
+ constructor(input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream);
14
+ enableRawMode(): void;
15
+ disableRawMode(): void;
16
+ enterAltScreen(): void;
17
+ exitAltScreen(): void;
18
+ clearScreen(): void;
19
+ showCursor(): void;
20
+ hideCursor(): void;
21
+ enableMouseCellMotion(): void;
22
+ enableMouseAllMotion(): void;
23
+ disableMouse(): void;
24
+ enableBracketedPaste(): void;
25
+ disableBracketedPaste(): void;
26
+ enableReportFocus(): void;
27
+ disableReportFocus(): void;
28
+ setWindowTitle(title: string): void;
29
+ cleanup(): void;
30
+ write(data: string): void;
31
+ }
32
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAChC;AAmBD,qBAAa,kBAAkB;IAO3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;gBAGZ,KAAK,GAAE,MAAM,CAAC,cAA8B,EAC5C,MAAM,GAAE,MAAM,CAAC,cAA+B;IAGjE,aAAa,IAAI,IAAI;IAarB,cAAc,IAAI,IAAI;IAQtB,cAAc,IAAI,IAAI;IAKtB,aAAa,IAAI,IAAI;IAKrB,WAAW,IAAI,IAAI;IAInB,UAAU,IAAI,IAAI;IAIlB,UAAU,IAAI,IAAI;IAIlB,qBAAqB,IAAI,IAAI;IAK7B,oBAAoB,IAAI,IAAI;IAK5B,YAAY,IAAI,IAAI;IAMpB,oBAAoB,IAAI,IAAI;IAK5B,qBAAqB,IAAI,IAAI;IAK7B,iBAAiB,IAAI,IAAI;IAKzB,kBAAkB,IAAI,IAAI;IAK1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAInC,OAAO,IAAI,IAAI;IAef,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAM1B"}