@jrichman/ink 6.3.1

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 (141) 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 +122 -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 +2 -0
  54. package/build/devtools.js.map +1 -0
  55. package/build/dom.d.ts +62 -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 +43 -0
  89. package/build/ink.js +315 -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 +15 -0
  95. package/build/log-update.js +109 -0
  96. package/build/log-update.js.map +1 -0
  97. package/build/measure-element.d.ts +38 -0
  98. package/build/measure-element.js +118 -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 +36 -0
  104. package/build/output.js +191 -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 +296 -0
  120. package/build/render-node-to-output.js.map +1 -0
  121. package/build/render.d.ts +87 -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/scroll.d.ts +8 -0
  128. package/build/scroll.js +35 -0
  129. package/build/scroll.js.map +1 -0
  130. package/build/squash-text-nodes.d.ts +3 -0
  131. package/build/squash-text-nodes.js +35 -0
  132. package/build/squash-text-nodes.js.map +1 -0
  133. package/build/styles.d.ts +260 -0
  134. package/build/styles.js +257 -0
  135. package/build/styles.js.map +1 -0
  136. package/build/wrap-text.d.ts +3 -0
  137. package/build/wrap-text.js +31 -0
  138. package/build/wrap-text.js.map +1 -0
  139. package/license +9 -0
  140. package/package.json +194 -0
  141. package/readme.md +2331 -0
@@ -0,0 +1,118 @@
1
+ import Yoga from 'yoga-layout';
2
+ import { getScrollLeft, getScrollTop } from './scroll.js';
3
+ /**
4
+ Measure the dimensions of a particular `<Box>` element.
5
+ */
6
+ const measureElement = (node) => ({
7
+ width: node.yogaNode?.getComputedWidth() ?? 0,
8
+ height: node.yogaNode?.getComputedHeight() ?? 0,
9
+ });
10
+ /**
11
+ * Get an element's inner width.
12
+ */
13
+ export const getInnerWidth = (node) => {
14
+ const { yogaNode } = node;
15
+ if (!yogaNode) {
16
+ return 0;
17
+ }
18
+ const width = yogaNode.getComputedWidth() ?? 0;
19
+ const borderLeft = yogaNode.getComputedBorder(Yoga.EDGE_LEFT);
20
+ const borderRight = yogaNode.getComputedBorder(Yoga.EDGE_RIGHT);
21
+ return width - borderLeft - borderRight;
22
+ };
23
+ /*
24
+ * Get an element's inner height.
25
+ */
26
+ export const getInnerHeight = (node) => {
27
+ const { yogaNode } = node;
28
+ if (!yogaNode) {
29
+ return 0;
30
+ }
31
+ const height = yogaNode.getComputedHeight() ?? 0;
32
+ const borderTop = yogaNode.getComputedBorder(Yoga.EDGE_TOP);
33
+ const borderBottom = yogaNode.getComputedBorder(Yoga.EDGE_BOTTOM);
34
+ return height - borderTop - borderBottom;
35
+ };
36
+ /**
37
+ * Get an element's position and dimensions relative to the root.
38
+ */
39
+ export const getBoundingBox = (node) => {
40
+ const { yogaNode } = node;
41
+ if (!yogaNode) {
42
+ return { x: 0, y: 0, width: 0, height: 0 };
43
+ }
44
+ const width = yogaNode.getComputedWidth() ?? 0;
45
+ const height = yogaNode.getComputedHeight() ?? 0;
46
+ let x = yogaNode.getComputedLeft();
47
+ let y = yogaNode.getComputedTop();
48
+ let parent = node.parentNode;
49
+ while (parent?.yogaNode) {
50
+ x += parent.yogaNode.getComputedLeft();
51
+ y += parent.yogaNode.getComputedTop();
52
+ if (parent.nodeName === 'ink-box') {
53
+ const overflow = parent.style.overflow ?? 'visible';
54
+ const overflowX = parent.style.overflowX ?? overflow;
55
+ const overflowY = parent.style.overflowY ?? overflow;
56
+ if (overflowY === 'scroll') {
57
+ y -= getScrollTop(parent);
58
+ }
59
+ if (overflowX === 'scroll') {
60
+ x -= getScrollLeft(parent);
61
+ }
62
+ }
63
+ parent = parent.parentNode;
64
+ }
65
+ return { x, y, width, height };
66
+ };
67
+ /**
68
+ * The entire height of an elements content.
69
+ */
70
+ export const getScrollHeight = (node) => {
71
+ const { yogaNode } = node;
72
+ if (!yogaNode) {
73
+ return 0;
74
+ }
75
+ const top = yogaNode.getComputedBorder(Yoga.EDGE_TOP);
76
+ let maxBottom = top;
77
+ for (let i = 0; i < yogaNode.getChildCount(); i++) {
78
+ const child = yogaNode.getChild(i);
79
+ const childBottom = child.getComputedTop() +
80
+ child.getComputedHeight() +
81
+ child.getComputedMargin(Yoga.EDGE_BOTTOM);
82
+ if (childBottom > maxBottom) {
83
+ maxBottom = childBottom;
84
+ }
85
+ }
86
+ // We add bottom padding to the scroll height because we act as if the
87
+ // bottom padding is part of the scrollable child content so that you
88
+ // can scroll all the way to the bottom and see the full bottom padding
89
+ // amount of padding after the rendered content.
90
+ return maxBottom - top + yogaNode.getComputedPadding(Yoga.EDGE_BOTTOM);
91
+ };
92
+ /**
93
+ * The entire width of an elements content.
94
+ */
95
+ export const getScrollWidth = (node) => {
96
+ const { yogaNode } = node;
97
+ if (!yogaNode) {
98
+ return 0;
99
+ }
100
+ const left = yogaNode.getComputedBorder(Yoga.EDGE_LEFT);
101
+ let maxRight = yogaNode.getComputedPadding(Yoga.EDGE_LEFT);
102
+ for (let i = 0; i < yogaNode.getChildCount(); i++) {
103
+ const child = yogaNode.getChild(i);
104
+ const childRight = child.getComputedLeft() +
105
+ child.getComputedWidth() +
106
+ child.getComputedMargin(Yoga.EDGE_RIGHT);
107
+ if (childRight > maxRight) {
108
+ maxRight = childRight;
109
+ }
110
+ }
111
+ // We add right padding to the scroll height because we act as if the
112
+ // right padding is part of the scrollable child content so that you
113
+ // can scroll all the way to the right and see the full right padding
114
+ // amount of padding after the rendered content.
115
+ return maxRight - left + yogaNode.getComputedPadding(Yoga.EDGE_RIGHT);
116
+ };
117
+ export default measureElement;
118
+ //# sourceMappingURL=measure-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure-element.js","sourceRoot":"","sources":["../src/measure-element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ type Output = {
2
+ width: number;
3
+ height: number;
4
+ };
5
+ declare const measureText: (text: string) => Output;
6
+ export default measureText;
@@ -0,0 +1,21 @@
1
+ import widestLine from 'widest-line';
2
+ const cache = new Map();
3
+ const measureText = (text) => {
4
+ if (text.length === 0) {
5
+ return {
6
+ width: 0,
7
+ height: 0,
8
+ };
9
+ }
10
+ const cachedDimensions = cache.get(text);
11
+ if (cachedDimensions) {
12
+ return cachedDimensions;
13
+ }
14
+ const width = widestLine(text);
15
+ const height = text.split('\n').length;
16
+ const dimensions = { width, height };
17
+ cache.set(text, dimensions);
18
+ return dimensions;
19
+ };
20
+ export default measureText;
21
+ //# sourceMappingURL=measure-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure-text.js","sourceRoot":"","sources":["../src/measure-text.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;AAOxC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE;IAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;SACT,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAI,gBAAgB,EAAE,CAAC;QACtB,OAAO,gBAAgB,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,UAAU,GAAG,EAAC,KAAK,EAAE,MAAM,EAAC,CAAC;IACnC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE5B,OAAO,UAAU,CAAC;AACnB,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,36 @@
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
+ private applyWriteOperation;
34
+ private clipText;
35
+ }
36
+ export {};
@@ -0,0 +1,191 @@
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
+ const previousClip = clips.at(-1);
57
+ const nextClip = { ...operation.clip };
58
+ if (previousClip) {
59
+ nextClip.x1 =
60
+ previousClip.x1 === undefined
61
+ ? nextClip.x1
62
+ : nextClip.x1 === undefined
63
+ ? previousClip.x1
64
+ : Math.max(previousClip.x1, nextClip.x1);
65
+ nextClip.x2 =
66
+ previousClip.x2 === undefined
67
+ ? nextClip.x2
68
+ : nextClip.x2 === undefined
69
+ ? previousClip.x2
70
+ : Math.min(previousClip.x2, nextClip.x2);
71
+ nextClip.y1 =
72
+ previousClip.y1 === undefined
73
+ ? nextClip.y1
74
+ : nextClip.y1 === undefined
75
+ ? previousClip.y1
76
+ : Math.max(previousClip.y1, nextClip.y1);
77
+ nextClip.y2 =
78
+ previousClip.y2 === undefined
79
+ ? nextClip.y2
80
+ : nextClip.y2 === undefined
81
+ ? previousClip.y2
82
+ : Math.min(previousClip.y2, nextClip.y2);
83
+ }
84
+ clips.push(nextClip);
85
+ continue;
86
+ }
87
+ if (operation.type === 'unclip') {
88
+ clips.pop();
89
+ continue;
90
+ }
91
+ if (operation.type === 'write') {
92
+ this.applyWriteOperation(output, clips, operation);
93
+ }
94
+ }
95
+ const generatedOutput = output
96
+ .map(line => {
97
+ // See https://github.com/vadimdemedes/ink/pull/564#issuecomment-1637022742
98
+ const lineWithoutEmptyItems = line.filter(item => item !== undefined);
99
+ return styledCharsToString(lineWithoutEmptyItems).trimEnd();
100
+ })
101
+ .join('\n');
102
+ return {
103
+ output: generatedOutput,
104
+ height: output.length,
105
+ };
106
+ }
107
+ applyWriteOperation(output, clips, operation) {
108
+ const { text, transformers } = operation;
109
+ let { x, y } = operation;
110
+ let lines = text.split('\n');
111
+ const clip = clips.at(-1);
112
+ if (clip) {
113
+ const clipResult = this.clipText(lines, x, y, clip);
114
+ if (!clipResult) {
115
+ return;
116
+ }
117
+ lines = clipResult.lines;
118
+ x = clipResult.x;
119
+ y = clipResult.y;
120
+ }
121
+ let offsetY = 0;
122
+ for (let [index, line] of lines.entries()) {
123
+ const currentLine = output[y + offsetY];
124
+ // Line can be missing if `text` is taller than height of pre-initialized `this.output`
125
+ if (!currentLine) {
126
+ continue;
127
+ }
128
+ for (const transformer of transformers) {
129
+ line = transformer(line, index);
130
+ }
131
+ const characters = styledCharsFromTokens(tokenize(line));
132
+ let offsetX = x;
133
+ for (const character of characters) {
134
+ currentLine[offsetX] = character;
135
+ // Determine printed width using string-width to align with measurement
136
+ const characterWidth = Math.max(1, stringWidth(character.value));
137
+ // For multi-column characters, clear following cells to avoid stray spaces/artifacts
138
+ if (characterWidth > 1) {
139
+ for (let index = 1; index < characterWidth; index++) {
140
+ currentLine[offsetX + index] = {
141
+ type: 'char',
142
+ value: '',
143
+ fullWidth: false,
144
+ styles: character.styles,
145
+ };
146
+ }
147
+ }
148
+ offsetX += characterWidth;
149
+ }
150
+ offsetY++;
151
+ }
152
+ }
153
+ clipText(lines, x, y, clip) {
154
+ const clipHorizontally = typeof clip?.x1 === 'number' && typeof clip?.x2 === 'number';
155
+ const clipVertically = typeof clip?.y1 === 'number' && typeof clip?.y2 === 'number';
156
+ if (clipHorizontally) {
157
+ const width = widestLine(lines.join('\n'));
158
+ if (x + width < clip.x1 || x > clip.x2) {
159
+ return undefined;
160
+ }
161
+ }
162
+ if (clipVertically) {
163
+ const height = lines.length;
164
+ if (y + height < clip.y1 || y > clip.y2) {
165
+ return undefined;
166
+ }
167
+ }
168
+ if (clipHorizontally) {
169
+ lines = lines.map(line => {
170
+ const from = x < clip.x1 ? clip.x1 - x : 0;
171
+ const width = stringWidth(line);
172
+ const to = x + width > clip.x2 ? clip.x2 - x : width;
173
+ return sliceAnsi(line, from, to);
174
+ });
175
+ if (x < clip.x1) {
176
+ x = clip.x1;
177
+ }
178
+ }
179
+ if (clipVertically) {
180
+ const from = y < clip.y1 ? clip.y1 - y : 0;
181
+ const height = lines.length;
182
+ const to = y + height > clip.y2 ? clip.y2 - y : height;
183
+ lines = lines.slice(from, to);
184
+ if (y < clip.y1) {
185
+ y = clip.y1;
186
+ }
187
+ }
188
+ return { lines, x, y };
189
+ }
190
+ }
191
+ //# 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;