@nuvin/ink 6.5.1-alpha.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 (138) hide show
  1. package/build/colorize.d.ts +3 -0
  2. package/build/colorize.js +48 -0
  3. package/build/colorize.js.map +1 -0
  4. package/build/components/AccessibilityContext.d.ts +3 -0
  5. package/build/components/AccessibilityContext.js +5 -0
  6. package/build/components/AccessibilityContext.js.map +1 -0
  7. package/build/components/App.d.ts +59 -0
  8. package/build/components/App.js +286 -0
  9. package/build/components/App.js.map +1 -0
  10. package/build/components/AppContext.d.ts +11 -0
  11. package/build/components/AppContext.js +11 -0
  12. package/build/components/AppContext.js.map +1 -0
  13. package/build/components/BackgroundContext.d.ts +4 -0
  14. package/build/components/BackgroundContext.js +3 -0
  15. package/build/components/BackgroundContext.js.map +1 -0
  16. package/build/components/Box.d.ts +117 -0
  17. package/build/components/Box.js +34 -0
  18. package/build/components/Box.js.map +1 -0
  19. package/build/components/ErrorOverview.d.ts +6 -0
  20. package/build/components/ErrorOverview.js +84 -0
  21. package/build/components/ErrorOverview.js.map +1 -0
  22. package/build/components/FocusContext.d.ts +16 -0
  23. package/build/components/FocusContext.js +17 -0
  24. package/build/components/FocusContext.js.map +1 -0
  25. package/build/components/Newline.d.ts +13 -0
  26. package/build/components/Newline.js +8 -0
  27. package/build/components/Newline.js.map +1 -0
  28. package/build/components/Spacer.d.ts +7 -0
  29. package/build/components/Spacer.js +11 -0
  30. package/build/components/Spacer.js.map +1 -0
  31. package/build/components/Static.d.ts +24 -0
  32. package/build/components/Static.js +28 -0
  33. package/build/components/Static.js.map +1 -0
  34. package/build/components/StderrContext.d.ts +15 -0
  35. package/build/components/StderrContext.js +13 -0
  36. package/build/components/StderrContext.js.map +1 -0
  37. package/build/components/StdinContext.d.ts +22 -0
  38. package/build/components/StdinContext.js +19 -0
  39. package/build/components/StdinContext.js.map +1 -0
  40. package/build/components/StdoutContext.d.ts +15 -0
  41. package/build/components/StdoutContext.js +13 -0
  42. package/build/components/StdoutContext.js.map +1 -0
  43. package/build/components/Text.d.ts +55 -0
  44. package/build/components/Text.js +50 -0
  45. package/build/components/Text.js.map +1 -0
  46. package/build/components/Transform.d.ts +16 -0
  47. package/build/components/Transform.js +15 -0
  48. package/build/components/Transform.js.map +1 -0
  49. package/build/devtools-window-polyfill.d.ts +1 -0
  50. package/build/devtools-window-polyfill.js +65 -0
  51. package/build/devtools-window-polyfill.js.map +1 -0
  52. package/build/devtools.d.ts +1 -0
  53. package/build/devtools.js +11 -0
  54. package/build/devtools.js.map +1 -0
  55. package/build/dom.d.ts +56 -0
  56. package/build/dom.js +123 -0
  57. package/build/dom.js.map +1 -0
  58. package/build/get-max-width.d.ts +3 -0
  59. package/build/get-max-width.js +10 -0
  60. package/build/get-max-width.js.map +1 -0
  61. package/build/hooks/use-app.d.ts +5 -0
  62. package/build/hooks/use-app.js +8 -0
  63. package/build/hooks/use-app.js.map +1 -0
  64. package/build/hooks/use-focus-manager.d.ts +28 -0
  65. package/build/hooks/use-focus-manager.js +17 -0
  66. package/build/hooks/use-focus-manager.js.map +1 -0
  67. package/build/hooks/use-focus.d.ts +29 -0
  68. package/build/hooks/use-focus.js +42 -0
  69. package/build/hooks/use-focus.js.map +1 -0
  70. package/build/hooks/use-input.d.ts +93 -0
  71. package/build/hooks/use-input.js +93 -0
  72. package/build/hooks/use-input.js.map +1 -0
  73. package/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  74. package/build/hooks/use-is-screen-reader-enabled.js +11 -0
  75. package/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  76. package/build/hooks/use-stderr.d.ts +5 -0
  77. package/build/hooks/use-stderr.js +8 -0
  78. package/build/hooks/use-stderr.js.map +1 -0
  79. package/build/hooks/use-stdin.d.ts +5 -0
  80. package/build/hooks/use-stdin.js +8 -0
  81. package/build/hooks/use-stdin.js.map +1 -0
  82. package/build/hooks/use-stdout.d.ts +5 -0
  83. package/build/hooks/use-stdout.js +8 -0
  84. package/build/hooks/use-stdout.js.map +1 -0
  85. package/build/index.d.ts +28 -0
  86. package/build/index.js +17 -0
  87. package/build/index.js.map +1 -0
  88. package/build/ink.d.ts +54 -0
  89. package/build/ink.js +309 -0
  90. package/build/ink.js.map +1 -0
  91. package/build/instances.d.ts +3 -0
  92. package/build/instances.js +8 -0
  93. package/build/instances.js.map +1 -0
  94. package/build/log-update.d.ts +14 -0
  95. package/build/log-update.js +116 -0
  96. package/build/log-update.js.map +1 -0
  97. package/build/measure-element.d.ts +16 -0
  98. package/build/measure-element.js +9 -0
  99. package/build/measure-element.js.map +1 -0
  100. package/build/measure-text.d.ts +6 -0
  101. package/build/measure-text.js +21 -0
  102. package/build/measure-text.js.map +1 -0
  103. package/build/output.d.ts +34 -0
  104. package/build/output.js +150 -0
  105. package/build/output.js.map +1 -0
  106. package/build/parse-keypress.d.ts +14 -0
  107. package/build/parse-keypress.js +225 -0
  108. package/build/parse-keypress.js.map +1 -0
  109. package/build/reconciler.d.ts +4 -0
  110. package/build/reconciler.js +254 -0
  111. package/build/reconciler.js.map +1 -0
  112. package/build/render-background.d.ts +4 -0
  113. package/build/render-background.js +25 -0
  114. package/build/render-background.js.map +1 -0
  115. package/build/render-border.d.ts +4 -0
  116. package/build/render-border.js +73 -0
  117. package/build/render-border.js.map +1 -0
  118. package/build/render-node-to-output.d.ts +14 -0
  119. package/build/render-node-to-output.js +147 -0
  120. package/build/render-node-to-output.js.map +1 -0
  121. package/build/render.d.ts +88 -0
  122. package/build/render.js +50 -0
  123. package/build/render.js.map +1 -0
  124. package/build/renderer.d.ts +8 -0
  125. package/build/renderer.js +55 -0
  126. package/build/renderer.js.map +1 -0
  127. package/build/squash-text-nodes.d.ts +3 -0
  128. package/build/squash-text-nodes.js +35 -0
  129. package/build/squash-text-nodes.js.map +1 -0
  130. package/build/styles.d.ts +240 -0
  131. package/build/styles.js +232 -0
  132. package/build/styles.js.map +1 -0
  133. package/build/wrap-text.d.ts +3 -0
  134. package/build/wrap-text.js +31 -0
  135. package/build/wrap-text.js.map +1 -0
  136. package/license +10 -0
  137. package/package.json +195 -0
  138. package/readme.md +2356 -0
@@ -0,0 +1,34 @@
1
+ import { type OutputTransformer } from './render-node-to-output.js';
2
+ /**
3
+ "Virtual" output class
4
+
5
+ Handles the positioning and saving of the output of each node in the tree. Also responsible for applying transformations to each character of the output.
6
+
7
+ Used to generate the final output of all nodes before writing it to actual output stream (e.g. stdout)
8
+ */
9
+ type Options = {
10
+ width: number;
11
+ height: number;
12
+ };
13
+ type Clip = {
14
+ x1: number | undefined;
15
+ x2: number | undefined;
16
+ y1: number | undefined;
17
+ y2: number | undefined;
18
+ };
19
+ export default class Output {
20
+ width: number;
21
+ height: number;
22
+ private readonly operations;
23
+ constructor(options: Options);
24
+ write(x: number, y: number, text: string, options: {
25
+ transformers: OutputTransformer[];
26
+ }): void;
27
+ clip(clip: Clip): void;
28
+ unclip(): void;
29
+ get(): {
30
+ output: string;
31
+ height: number;
32
+ };
33
+ }
34
+ export {};
@@ -0,0 +1,150 @@
1
+ import sliceAnsi from 'slice-ansi';
2
+ import stringWidth from 'string-width';
3
+ import widestLine from 'widest-line';
4
+ import { styledCharsFromTokens, styledCharsToString, tokenize, } from '@alcalzone/ansi-tokenize';
5
+ export default class Output {
6
+ width;
7
+ height;
8
+ operations = [];
9
+ constructor(options) {
10
+ const { width, height } = options;
11
+ this.width = width;
12
+ this.height = height;
13
+ }
14
+ write(x, y, text, options) {
15
+ const { transformers } = options;
16
+ if (!text) {
17
+ return;
18
+ }
19
+ this.operations.push({
20
+ type: 'write',
21
+ x,
22
+ y,
23
+ text,
24
+ transformers,
25
+ });
26
+ }
27
+ clip(clip) {
28
+ this.operations.push({
29
+ type: 'clip',
30
+ clip,
31
+ });
32
+ }
33
+ unclip() {
34
+ this.operations.push({
35
+ type: 'unclip',
36
+ });
37
+ }
38
+ get() {
39
+ // Initialize output array with a specific set of rows, so that margin/padding at the bottom is preserved
40
+ const output = [];
41
+ for (let y = 0; y < this.height; y++) {
42
+ const row = [];
43
+ for (let x = 0; x < this.width; x++) {
44
+ row.push({
45
+ type: 'char',
46
+ value: ' ',
47
+ fullWidth: false,
48
+ styles: [],
49
+ });
50
+ }
51
+ output.push(row);
52
+ }
53
+ const clips = [];
54
+ for (const operation of this.operations) {
55
+ if (operation.type === 'clip') {
56
+ clips.push(operation.clip);
57
+ }
58
+ if (operation.type === 'unclip') {
59
+ clips.pop();
60
+ }
61
+ if (operation.type === 'write') {
62
+ const { text, transformers } = operation;
63
+ let { x, y } = operation;
64
+ let lines = text.split('\n');
65
+ const clip = clips.at(-1);
66
+ if (clip) {
67
+ const clipHorizontally = typeof clip?.x1 === 'number' && typeof clip?.x2 === 'number';
68
+ const clipVertically = typeof clip?.y1 === 'number' && typeof clip?.y2 === 'number';
69
+ // If text is positioned outside of clipping area altogether,
70
+ // skip to the next operation to avoid unnecessary calculations
71
+ if (clipHorizontally) {
72
+ const width = widestLine(text);
73
+ if (x + width < clip.x1 || x > clip.x2) {
74
+ continue;
75
+ }
76
+ }
77
+ if (clipVertically) {
78
+ const height = lines.length;
79
+ if (y + height < clip.y1 || y > clip.y2) {
80
+ continue;
81
+ }
82
+ }
83
+ if (clipHorizontally) {
84
+ lines = lines.map(line => {
85
+ const from = x < clip.x1 ? clip.x1 - x : 0;
86
+ const width = stringWidth(line);
87
+ const to = x + width > clip.x2 ? clip.x2 - x : width;
88
+ return sliceAnsi(line, from, to);
89
+ });
90
+ if (x < clip.x1) {
91
+ x = clip.x1;
92
+ }
93
+ }
94
+ if (clipVertically) {
95
+ const from = y < clip.y1 ? clip.y1 - y : 0;
96
+ const height = lines.length;
97
+ const to = y + height > clip.y2 ? clip.y2 - y : height;
98
+ lines = lines.slice(from, to);
99
+ if (y < clip.y1) {
100
+ y = clip.y1;
101
+ }
102
+ }
103
+ }
104
+ let offsetY = 0;
105
+ for (let [index, line] of lines.entries()) {
106
+ const currentLine = output[y + offsetY];
107
+ // Line can be missing if `text` is taller than height of pre-initialized `this.output`
108
+ if (!currentLine) {
109
+ continue;
110
+ }
111
+ for (const transformer of transformers) {
112
+ line = transformer(line, index);
113
+ }
114
+ const characters = styledCharsFromTokens(tokenize(line));
115
+ let offsetX = x;
116
+ for (const character of characters) {
117
+ currentLine[offsetX] = character;
118
+ // Determine printed width using string-width to align with measurement
119
+ const characterWidth = Math.max(1, stringWidth(character.value));
120
+ // For multi-column characters, clear following cells to avoid stray spaces/artifacts
121
+ if (characterWidth > 1) {
122
+ for (let index = 1; index < characterWidth; index++) {
123
+ currentLine[offsetX + index] = {
124
+ type: 'char',
125
+ value: '',
126
+ fullWidth: false,
127
+ styles: character.styles,
128
+ };
129
+ }
130
+ }
131
+ offsetX += characterWidth;
132
+ }
133
+ offsetY++;
134
+ }
135
+ }
136
+ }
137
+ const generatedOutput = output
138
+ .map(line => {
139
+ // See https://github.com/vadimdemedes/ink/pull/564#issuecomment-1637022742
140
+ const lineWithoutEmptyItems = line.filter(item => item !== undefined);
141
+ return styledCharsToString(lineWithoutEmptyItems).trimEnd();
142
+ })
143
+ .join('\n');
144
+ return {
145
+ output: generatedOutput,
146
+ height: output.length,
147
+ };
148
+ }
149
+ }
150
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Buffer } from 'node:buffer';
2
+ export declare const nonAlphanumericKeys: string[];
3
+ type ParsedKey = {
4
+ name: string;
5
+ ctrl: boolean;
6
+ meta: boolean;
7
+ shift: boolean;
8
+ option: boolean;
9
+ sequence: string;
10
+ raw: string | undefined;
11
+ code?: string;
12
+ };
13
+ declare const parseKeypress: (s?: Buffer | string) => ParsedKey;
14
+ export default parseKeypress;
@@ -0,0 +1,225 @@
1
+ // Copied from https://github.com/enquirer/enquirer/blob/36785f3399a41cd61e9d28d1eb9c2fcd73d69b4c/lib/keypress.js
2
+ import { Buffer } from 'node:buffer';
3
+ const metaKeyCodeRe = /^(?:\x1b)([a-zA-Z0-9])$/;
4
+ const fnKeyRe = /^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/;
5
+ const keyName = {
6
+ /* xterm/gnome ESC O letter */
7
+ OP: 'f1',
8
+ OQ: 'f2',
9
+ OR: 'f3',
10
+ OS: 'f4',
11
+ /* xterm/rxvt ESC [ number ~ */
12
+ '[11~': 'f1',
13
+ '[12~': 'f2',
14
+ '[13~': 'f3',
15
+ '[14~': 'f4',
16
+ /* from Cygwin and used in libuv */
17
+ '[[A': 'f1',
18
+ '[[B': 'f2',
19
+ '[[C': 'f3',
20
+ '[[D': 'f4',
21
+ '[[E': 'f5',
22
+ /* common */
23
+ '[15~': 'f5',
24
+ '[17~': 'f6',
25
+ '[18~': 'f7',
26
+ '[19~': 'f8',
27
+ '[20~': 'f9',
28
+ '[21~': 'f10',
29
+ '[23~': 'f11',
30
+ '[24~': 'f12',
31
+ /* xterm ESC [ letter */
32
+ '[A': 'up',
33
+ '[B': 'down',
34
+ '[C': 'right',
35
+ '[D': 'left',
36
+ '[E': 'clear',
37
+ '[F': 'end',
38
+ '[H': 'home',
39
+ /* xterm/gnome ESC O letter */
40
+ OA: 'up',
41
+ OB: 'down',
42
+ OC: 'right',
43
+ OD: 'left',
44
+ OE: 'clear',
45
+ OF: 'end',
46
+ OH: 'home',
47
+ /* xterm/rxvt ESC [ number ~ */
48
+ '[1~': 'home',
49
+ '[2~': 'insert',
50
+ '[3~': 'delete',
51
+ '[4~': 'end',
52
+ '[5~': 'pageup',
53
+ '[6~': 'pagedown',
54
+ /* putty */
55
+ '[[5~': 'pageup',
56
+ '[[6~': 'pagedown',
57
+ /* rxvt */
58
+ '[7~': 'home',
59
+ '[8~': 'end',
60
+ /* rxvt keys with modifiers */
61
+ '[a': 'up',
62
+ '[b': 'down',
63
+ '[c': 'right',
64
+ '[d': 'left',
65
+ '[e': 'clear',
66
+ '[2$': 'insert',
67
+ '[3$': 'delete',
68
+ '[5$': 'pageup',
69
+ '[6$': 'pagedown',
70
+ '[7$': 'home',
71
+ '[8$': 'end',
72
+ Oa: 'up',
73
+ Ob: 'down',
74
+ Oc: 'right',
75
+ Od: 'left',
76
+ Oe: 'clear',
77
+ '[2^': 'insert',
78
+ '[3^': 'delete',
79
+ '[5^': 'pageup',
80
+ '[6^': 'pagedown',
81
+ '[7^': 'home',
82
+ '[8^': 'end',
83
+ /* misc. */
84
+ '[Z': 'tab',
85
+ };
86
+ export const nonAlphanumericKeys = [...Object.values(keyName), 'backspace'];
87
+ const isShiftKey = (code) => {
88
+ return [
89
+ '[a',
90
+ '[b',
91
+ '[c',
92
+ '[d',
93
+ '[e',
94
+ '[2$',
95
+ '[3$',
96
+ '[5$',
97
+ '[6$',
98
+ '[7$',
99
+ '[8$',
100
+ '[Z',
101
+ ].includes(code);
102
+ };
103
+ const isCtrlKey = (code) => {
104
+ return [
105
+ 'Oa',
106
+ 'Ob',
107
+ 'Oc',
108
+ 'Od',
109
+ 'Oe',
110
+ '[2^',
111
+ '[3^',
112
+ '[5^',
113
+ '[6^',
114
+ '[7^',
115
+ '[8^',
116
+ ].includes(code);
117
+ };
118
+ const parseKeypress = (s = '') => {
119
+ let parts;
120
+ if (Buffer.isBuffer(s)) {
121
+ if (s[0] > 127 && s[1] === undefined) {
122
+ s[0] -= 128;
123
+ s = '\x1b' + String(s);
124
+ }
125
+ else {
126
+ s = String(s);
127
+ }
128
+ }
129
+ else if (s !== undefined && typeof s !== 'string') {
130
+ s = String(s);
131
+ }
132
+ else if (!s) {
133
+ s = '';
134
+ }
135
+ const key = {
136
+ name: '',
137
+ ctrl: false,
138
+ meta: false,
139
+ shift: false,
140
+ option: false,
141
+ sequence: s,
142
+ raw: s,
143
+ };
144
+ key.sequence = key.sequence || s || key.name;
145
+ if (s === '\r') {
146
+ // carriage return
147
+ key.raw = undefined;
148
+ key.name = 'return';
149
+ }
150
+ else if (s === '\n') {
151
+ // enter, should have been called linefeed
152
+ key.name = 'enter';
153
+ }
154
+ else if (s === '\t') {
155
+ // tab
156
+ key.name = 'tab';
157
+ }
158
+ else if (s === '\b' || s === '\x1b\b') {
159
+ // backspace or ctrl+h
160
+ key.name = 'backspace';
161
+ key.meta = s.charAt(0) === '\x1b';
162
+ }
163
+ else if (s === '\x7f' || s === '\x1b\x7f') {
164
+ // TODO(vadimdemedes): `enquirer` detects delete key as backspace, but I had to split them up to avoid breaking changes in Ink. Merge them back together in the next major version.
165
+ // delete
166
+ key.name = 'delete';
167
+ key.meta = s.charAt(0) === '\x1b';
168
+ }
169
+ else if (s === '\x1b' || s === '\x1b\x1b') {
170
+ // escape key
171
+ key.name = 'escape';
172
+ key.meta = s.length === 2;
173
+ }
174
+ else if (s === ' ' || s === '\x1b ') {
175
+ key.name = 'space';
176
+ key.meta = s.length === 2;
177
+ }
178
+ else if (s.length === 1 && s <= '\x1a') {
179
+ // ctrl+letter
180
+ key.name = String.fromCharCode(s.charCodeAt(0) + 'a'.charCodeAt(0) - 1);
181
+ key.ctrl = true;
182
+ }
183
+ else if (s.length === 1 && s >= '0' && s <= '9') {
184
+ // number
185
+ key.name = 'number';
186
+ }
187
+ else if (s.length === 1 && s >= 'a' && s <= 'z') {
188
+ // lowercase letter
189
+ key.name = s;
190
+ }
191
+ else if (s.length === 1 && s >= 'A' && s <= 'Z') {
192
+ // shift+letter
193
+ key.name = s.toLowerCase();
194
+ key.shift = true;
195
+ }
196
+ else if ((parts = metaKeyCodeRe.exec(s))) {
197
+ // meta+character key
198
+ key.meta = true;
199
+ key.shift = /^[A-Z]$/.test(parts[1]);
200
+ }
201
+ else if ((parts = fnKeyRe.exec(s))) {
202
+ const segs = [...s];
203
+ if (segs[0] === '\u001b' && segs[1] === '\u001b') {
204
+ key.option = true;
205
+ }
206
+ // ansi escape sequence
207
+ // reassemble the key code leaving out leading \x1b's,
208
+ // the modifier key bitflag and any meaningless "1;" sequence
209
+ const code = [parts[1], parts[2], parts[4], parts[6]]
210
+ .filter(Boolean)
211
+ .join('');
212
+ const modifier = (parts[3] || parts[5] || 1) - 1;
213
+ // Parse the key modifier
214
+ key.ctrl = !!(modifier & 4);
215
+ key.meta = !!(modifier & 10);
216
+ key.shift = !!(modifier & 1);
217
+ key.code = code;
218
+ key.name = keyName[code];
219
+ key.shift = isShiftKey(code) || key.shift;
220
+ key.ctrl = isCtrlKey(code) || key.ctrl;
221
+ }
222
+ return key;
223
+ };
224
+ export default parseKeypress;
225
+ //# sourceMappingURL=parse-keypress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-keypress.js","sourceRoot":"","sources":["../src/parse-keypress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import createReconciler from 'react-reconciler';
2
+ import { type TextNode, type DOMElement } from './dom.js';
3
+ declare const _default: createReconciler.Reconciler<DOMElement, DOMElement, TextNode, DOMElement, unknown, unknown>;
4
+ export default _default;