@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.
- package/build/allocated-seek.d.ts +21 -0
- package/build/allocated-seek.js +273 -0
- package/build/allocated-seek.js.map +1 -0
- package/build/components/App.d.ts +5 -1
- package/build/components/App.js +48 -10
- package/build/components/App.js.map +1 -1
- package/build/explicit-width-detection.d.ts +45 -0
- package/build/explicit-width-detection.js +172 -0
- package/build/explicit-width-detection.js.map +1 -0
- package/build/explicit-width.d.ts +1 -0
- package/build/explicit-width.js +114 -0
- package/build/explicit-width.js.map +1 -0
- package/build/ink.d.ts +43 -1
- package/build/ink.js +651 -143
- package/build/ink.js.map +1 -1
- package/build/input-parser.d.ts +14 -1
- package/build/input-parser.js +74 -4
- package/build/input-parser.js.map +1 -1
- package/build/log-update.d.ts +16 -8
- package/build/log-update.js +313 -33
- package/build/log-update.js.map +1 -1
- package/build/output.js +66 -34
- package/build/output.js.map +1 -1
- package/build/render.d.ts +11 -0
- package/build/render.js.map +1 -1
- package/build/terminal-control.d.ts +6 -0
- package/build/terminal-control.js +124 -0
- package/build/terminal-control.js.map +1 -0
- package/build/terminal-paint.d.ts +38 -0
- package/build/terminal-paint.js +47 -0
- package/build/terminal-paint.js.map +1 -0
- package/package.json +2 -1
- package/readme.md +50 -0
|
@@ -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
|
}
|