@nuvin/ink 7.6.0-alpha → 7.7.0-alpha

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.
@@ -0,0 +1,172 @@
1
+ import stringWidth from 'string-width';
2
+ /** Whether pending Ink output will overwrite the one-cell probe at column 1. */
3
+ export const canOverwriteFirstCell = (text) => {
4
+ let remaining = text;
5
+ while (remaining.startsWith('\u001B')) {
6
+ // Only rendition controls are safe here. Do not treat arbitrary CSI/OSC
7
+ // payloads as evidence that Ink will overwrite the reserved cell.
8
+ const prefix = /^(?:\u001B\[[\d;:]*m|\u001B\]8;[^\u001B\u0007\r\n]*(?:\u001B\\|\u0007))/.exec(remaining);
9
+ if (!prefix)
10
+ return false;
11
+ remaining = remaining.slice(prefix[0].length);
12
+ }
13
+ if (!/^[\p{L}\p{N}\p{P}\p{S}\p{Zs}]/u.test(remaining))
14
+ return false;
15
+ const first = new Intl.Segmenter(undefined, { granularity: 'grapheme' })
16
+ .segment(remaining)[Symbol.iterator]()
17
+ .next().value;
18
+ return first !== undefined && stringWidth(first.segment) > 0;
19
+ };
20
+ /** One bounded, per-instance negotiation. Ink owns pending frames and raw input. */
21
+ export class ExplicitWidthDetection {
22
+ phase = 'idle';
23
+ inputReady = false;
24
+ firstRow = 0;
25
+ timer;
26
+ deadline;
27
+ writing = false;
28
+ deferredResult;
29
+ replies = [];
30
+ settlementCallbacks = [];
31
+ resolveFinished;
32
+ finished = new Promise(resolve => {
33
+ this.resolveFinished = resolve;
34
+ });
35
+ options;
36
+ constructor(options) {
37
+ this.options = options;
38
+ }
39
+ get pending() {
40
+ return this.phase !== 'idle' && this.phase !== 'settled';
41
+ }
42
+ get settled() {
43
+ return this.phase === 'settled';
44
+ }
45
+ get publicationBlocked() {
46
+ return this.writing || this.phase === 'settling';
47
+ }
48
+ onSettled(callback) {
49
+ if (this.settled) {
50
+ callback();
51
+ return;
52
+ }
53
+ this.settlementCallbacks.push(callback);
54
+ }
55
+ start() {
56
+ if (this.phase !== 'idle')
57
+ return;
58
+ this.phase = 'waiting';
59
+ this.deadline = Date.now() + 200;
60
+ this.timer = setTimeout(() => this.cancel(), 200);
61
+ this.queryIfReady();
62
+ }
63
+ setInputReady(ready) {
64
+ if (!ready && this.inputReady)
65
+ this.cancel();
66
+ this.inputReady = ready;
67
+ this.queryIfReady();
68
+ }
69
+ accept(position) {
70
+ if (this.writing) {
71
+ // There are only two outstanding measurements. Keep synchronous
72
+ // stream callbacks bounded and process them after the full write.
73
+ if (this.replies.length < 2)
74
+ this.replies.push(position);
75
+ return;
76
+ }
77
+ if (this.phase !== 'first' && this.phase !== 'second')
78
+ return;
79
+ if (this.expired()) {
80
+ this.cancel();
81
+ return;
82
+ }
83
+ const { columns, rows } = this.options.getSize();
84
+ const { row, column } = position;
85
+ if (!Number.isInteger(row) ||
86
+ !Number.isInteger(column) ||
87
+ row < 1 ||
88
+ row > rows ||
89
+ column < 1 ||
90
+ column > columns) {
91
+ this.cancel();
92
+ return;
93
+ }
94
+ if (this.phase === 'second') {
95
+ this.finish(row === this.firstRow && column === 2);
96
+ return;
97
+ }
98
+ if (column !== 1 ||
99
+ columns < 2 ||
100
+ !this.options.reserve() ||
101
+ this.expired()) {
102
+ this.cancel();
103
+ return;
104
+ }
105
+ this.firstRow = row;
106
+ this.phase = 'second';
107
+ this.send('\u001B]66;w=1; \u001B\\\u001B[?6n\r');
108
+ }
109
+ cancel() {
110
+ this.finish(false);
111
+ }
112
+ expired() {
113
+ return this.deadline !== undefined && Date.now() >= this.deadline;
114
+ }
115
+ queryIfReady() {
116
+ if (this.phase !== 'waiting' || !this.inputReady)
117
+ return;
118
+ if (this.expired()) {
119
+ this.cancel();
120
+ return;
121
+ }
122
+ this.phase = 'first';
123
+ this.send('\u001B[?6n');
124
+ }
125
+ send(text) {
126
+ this.writing = true;
127
+ try {
128
+ this.options.write(text);
129
+ }
130
+ catch {
131
+ this.cancel();
132
+ }
133
+ finally {
134
+ this.writing = false;
135
+ }
136
+ if (this.deferredResult !== undefined) {
137
+ const result = this.deferredResult;
138
+ this.deferredResult = undefined;
139
+ this.publish(result);
140
+ }
141
+ while (this.replies.length > 0)
142
+ this.accept(this.replies.shift());
143
+ }
144
+ finish(supported) {
145
+ if (this.phase === 'settling' || this.settled)
146
+ return;
147
+ this.phase = 'settling';
148
+ clearTimeout(this.timer);
149
+ this.timer = undefined;
150
+ if (this.writing) {
151
+ this.deferredResult = supported;
152
+ return;
153
+ }
154
+ this.publish(supported);
155
+ }
156
+ publish(supported) {
157
+ try {
158
+ this.options.onResult(supported);
159
+ }
160
+ finally {
161
+ this.phase = 'settled';
162
+ try {
163
+ for (const callback of this.settlementCallbacks.splice(0))
164
+ callback();
165
+ }
166
+ finally {
167
+ this.resolveFinished();
168
+ }
169
+ }
170
+ }
171
+ }
172
+ //# sourceMappingURL=explicit-width-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explicit-width-detection.js","sourceRoot":"","sources":["../src/explicit-width-detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function createExplicitWidthEncoder(): (text: string) => string;
@@ -0,0 +1,114 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import stringWidth from 'string-width';
3
+ import { readTerminalControl } from './terminal-control.js';
4
+ const ascii = /^[\u0000-\u007F]*$/;
5
+ const terminalControl = /[\u0000-\u001F\u007F-\u009F]/;
6
+ const formatOnly = /^\p{Format}+$/u;
7
+ const noncharacter = /[\uFDD0-\uFDEF\uFFFE\uFFFF\u{1FFFE}\u{1FFFF}\u{2FFFE}\u{2FFFF}\u{3FFFE}\u{3FFFF}\u{4FFFE}\u{4FFFF}\u{5FFFE}\u{5FFFF}\u{6FFFE}\u{6FFFF}\u{7FFFE}\u{7FFFF}\u{8FFFE}\u{8FFFF}\u{9FFFE}\u{9FFFF}\u{AFFFE}\u{AFFFF}\u{BFFFE}\u{BFFFF}\u{CFFFE}\u{CFFFF}\u{DFFFE}\u{DFFFF}\u{EFFFE}\u{EFFFF}\u{FFFFE}\u{FFFFF}\u{10FFFE}\u{10FFFF}]/u;
8
+ const isWellFormed = (value) => value.isWellFormed();
9
+ const remember = (cache, key, value, maxEntries, maxBytes) => {
10
+ if (Buffer.byteLength(key, 'utf8') + Buffer.byteLength(value, 'utf8') >
11
+ maxBytes) {
12
+ return;
13
+ }
14
+ if (!cache.has(key) && cache.size >= maxEntries) {
15
+ const oldest = cache.keys().next();
16
+ if (!oldest.done) {
17
+ cache.delete(oldest.value);
18
+ }
19
+ }
20
+ cache.set(key, value);
21
+ };
22
+ export function createExplicitWidthEncoder() {
23
+ const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
24
+ const rowCache = new Map();
25
+ const graphemeCache = new Map();
26
+ const encodeGrapheme = (grapheme) => {
27
+ if (ascii.test(grapheme)) {
28
+ return grapheme;
29
+ }
30
+ const cached = graphemeCache.get(grapheme);
31
+ if (cached !== undefined) {
32
+ return cached;
33
+ }
34
+ let encoded = grapheme;
35
+ if (isWellFormed(grapheme) &&
36
+ !terminalControl.test(grapheme) &&
37
+ !formatOnly.test(grapheme) &&
38
+ !noncharacter.test(grapheme) &&
39
+ Buffer.byteLength(grapheme, 'utf8') <= 4096) {
40
+ const width = stringWidth(grapheme);
41
+ if (Number.isInteger(width) && width >= 1 && width <= 7) {
42
+ encoded = `\u001B]66;w=${width};${grapheme}\u001B\\`;
43
+ }
44
+ }
45
+ remember(graphemeCache, grapheme, encoded, 1024, 8192);
46
+ return encoded;
47
+ };
48
+ const encodePrintable = (text) => {
49
+ if (ascii.test(text)) {
50
+ return text;
51
+ }
52
+ const pieces = [];
53
+ for (const { segment } of segmenter.segment(text)) {
54
+ pieces.push(encodeGrapheme(segment));
55
+ }
56
+ return pieces.join('');
57
+ };
58
+ const scanRow = (row) => {
59
+ const pieces = [];
60
+ let index = 0;
61
+ let printableStart = 0;
62
+ const flushPrintable = (end) => {
63
+ if (end > printableStart) {
64
+ pieces.push(encodePrintable(row.slice(printableStart, end)));
65
+ }
66
+ };
67
+ while (index < row.length) {
68
+ const code = row.charCodeAt(index);
69
+ if (code <= 0x1f || code === 0x7f || (code >= 0x80 && code <= 0x9f)) {
70
+ const control = readTerminalControl(row, index);
71
+ if (control === undefined) {
72
+ return undefined;
73
+ }
74
+ flushPrintable(index);
75
+ pieces.push(control.raw);
76
+ index = control.end;
77
+ printableStart = index;
78
+ continue;
79
+ }
80
+ index++;
81
+ }
82
+ flushPrintable(row.length);
83
+ return pieces.join('');
84
+ };
85
+ const encodeRow = (row) => {
86
+ const cached = rowCache.get(row);
87
+ if (cached !== undefined) {
88
+ return cached;
89
+ }
90
+ const encoded = scanRow(row);
91
+ if (encoded === undefined) {
92
+ return undefined;
93
+ }
94
+ remember(rowCache, row, encoded, 256, 16_384);
95
+ return encoded;
96
+ };
97
+ return (text) => {
98
+ if (!text.includes('\n')) {
99
+ const encoded = encodeRow(text);
100
+ return encoded === undefined ? text : encoded;
101
+ }
102
+ const rows = text.split('\n');
103
+ const encodedRows = [];
104
+ for (const row of rows) {
105
+ const encoded = encodeRow(row);
106
+ if (encoded === undefined) {
107
+ return text;
108
+ }
109
+ encodedRows.push(encoded);
110
+ }
111
+ return encodedRows.join('\n');
112
+ };
113
+ }
114
+ //# sourceMappingURL=explicit-width.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explicit-width.js","sourceRoot":"","sources":["../src/explicit-width.ts"],"names":[],"mappings":"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"}
package/build/ink.d.ts CHANGED
@@ -45,6 +45,7 @@ export type Options = {
45
45
  */
46
46
  concurrent?: boolean;
47
47
  kittyKeyboard?: KittyKeyboardOptions;
48
+ explicitWidth?: 'auto' | 'disabled';
48
49
  /**
49
50
  Override automatic interactive mode detection.
50
51
 
@@ -93,6 +94,7 @@ export default class Ink {
93
94
  private alternateScreen;
94
95
  private isUnmounted;
95
96
  private isUnmounting;
97
+ private outputError;
96
98
  private lastOutput;
97
99
  private lastOutputToRender;
98
100
  private lastOutputHeight;
@@ -115,12 +117,29 @@ export default class Ink {
115
117
  private nextRenderCommit?;
116
118
  private readonly textSelection;
117
119
  private lastLayoutWidth?;
120
+ private lastLayoutRows?;
121
+ private pendingStaticOutput;
122
+ private pendingHistoryAdvance;
123
+ private transformOutput?;
124
+ private paintEligible;
125
+ private paintCapability;
126
+ private readonly widthDetection?;
127
+ private pendingFrame?;
128
+ private reservedFrame?;
129
+ private readonly deferredWidthRenders;
130
+ private readonly deferredWidthLifecycleActions;
131
+ private rawInputReady;
132
+ private resumePendingInput?;
133
+ private kittyAutoFlags?;
134
+ private kittyQuerySent;
118
135
  constructor(options: Options);
119
136
  resized: () => void;
120
137
  resolveExitPromise: (result?: unknown) => void;
121
138
  rejectExitPromise: (reason?: Error) => void;
122
139
  unsubscribeExit: () => void;
123
140
  handleAppExit: (errorOrResult?: unknown) => void;
141
+ handleStdoutError: (error: Error) => void;
142
+ surfaceOutputError(error: unknown): void;
124
143
  setCursorPosition: (position: CursorPosition | undefined) => void;
125
144
  restoreLastOutput: () => void;
126
145
  calculateLayout: () => void;
@@ -143,7 +162,30 @@ export default class Ink {
143
162
  private hasPendingConcurrentWork;
144
163
  private awaitNextRender;
145
164
  private renderInteractiveFrame;
165
+ private renderPendingFrame;
166
+ private renderSeekFrame;
167
+ private renderRawInteractiveFrame;
168
+ private encodeTerminalOutput;
169
+ private commitInteractiveFrame;
170
+ private resolvePaintContext;
171
+ private getSeekPaintContext;
172
+ private clearPhysicalFrame;
173
+ private leaveSeekViewport;
174
+ private consumeHistoryAdvance;
175
+ private failExternalOutput;
176
+ private writeExternalOutput;
177
+ private writePaintRequest;
178
+ private publishLogicalFrame;
179
+ private takeStaticOutput;
180
+ private deferStatic;
181
+ private scheduleLayoutRender;
182
+ private reserveExplicitWidthFrame;
183
+ private settleExplicitWidth;
184
+ private deferUntilExplicitWidthSettlement;
185
+ private finishExplicitWidthSettlement;
186
+ private isTerminalResponsePending;
187
+ private handleInputReady;
188
+ private handleTerminalResponse;
146
189
  private initKittyKeyboard;
147
- private confirmKittySupport;
148
190
  private enableKittyProtocol;
149
191
  }