@nuvin/ink 6.5.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 +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-to-file.d.ts +49 -0
  95. package/build/log-to-file.js +83 -0
  96. package/build/log-to-file.js.map +1 -0
  97. package/build/log-update.d.ts +14 -0
  98. package/build/log-update.js +116 -0
  99. package/build/log-update.js.map +1 -0
  100. package/build/measure-element.d.ts +16 -0
  101. package/build/measure-element.js +9 -0
  102. package/build/measure-element.js.map +1 -0
  103. package/build/measure-text.d.ts +6 -0
  104. package/build/measure-text.js +21 -0
  105. package/build/measure-text.js.map +1 -0
  106. package/build/output.d.ts +34 -0
  107. package/build/output.js +150 -0
  108. package/build/output.js.map +1 -0
  109. package/build/parse-keypress.d.ts +14 -0
  110. package/build/parse-keypress.js +225 -0
  111. package/build/parse-keypress.js.map +1 -0
  112. package/build/reconciler.d.ts +4 -0
  113. package/build/reconciler.js +254 -0
  114. package/build/reconciler.js.map +1 -0
  115. package/build/render-background.d.ts +4 -0
  116. package/build/render-background.js +25 -0
  117. package/build/render-background.js.map +1 -0
  118. package/build/render-border.d.ts +4 -0
  119. package/build/render-border.js +73 -0
  120. package/build/render-border.js.map +1 -0
  121. package/build/render-node-to-output.d.ts +14 -0
  122. package/build/render-node-to-output.js +147 -0
  123. package/build/render-node-to-output.js.map +1 -0
  124. package/build/render.d.ts +88 -0
  125. package/build/render.js +50 -0
  126. package/build/render.js.map +1 -0
  127. package/build/renderer.d.ts +8 -0
  128. package/build/renderer.js +55 -0
  129. package/build/renderer.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 +240 -0
  134. package/build/styles.js +232 -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 +10 -0
  140. package/package.json +195 -0
  141. package/readme.md +2356 -0
@@ -0,0 +1,116 @@
1
+ import ansiEscapes from 'ansi-escapes';
2
+ import cliCursor from 'cli-cursor';
3
+ const createStandard = (stream, { showCursor = false } = {}) => {
4
+ let previousLineCount = 0;
5
+ let previousOutput = '';
6
+ let hasHiddenCursor = false;
7
+ const render = (str) => {
8
+ if (!showCursor && !hasHiddenCursor) {
9
+ cliCursor.hide();
10
+ hasHiddenCursor = true;
11
+ }
12
+ const output = str + '\n';
13
+ if (output === previousOutput) {
14
+ return;
15
+ }
16
+ previousOutput = output;
17
+ stream.write(ansiEscapes.eraseLines(previousLineCount) + output);
18
+ previousLineCount = output.split('\n').length;
19
+ };
20
+ render.clear = () => {
21
+ stream.write(ansiEscapes.eraseLines(previousLineCount));
22
+ previousOutput = '';
23
+ previousLineCount = 0;
24
+ };
25
+ render.done = () => {
26
+ previousOutput = '';
27
+ previousLineCount = 0;
28
+ if (!showCursor) {
29
+ cliCursor.show();
30
+ hasHiddenCursor = false;
31
+ }
32
+ };
33
+ render.sync = (str) => {
34
+ const output = str + '\n';
35
+ previousOutput = output;
36
+ previousLineCount = output.split('\n').length;
37
+ };
38
+ return render;
39
+ };
40
+ const createIncremental = (stream, { showCursor = false } = {}) => {
41
+ let previousLines = [];
42
+ let previousOutput = '';
43
+ let hasHiddenCursor = false;
44
+ const render = (str) => {
45
+ if (!showCursor && !hasHiddenCursor) {
46
+ cliCursor.hide();
47
+ hasHiddenCursor = true;
48
+ }
49
+ const output = str + '\n';
50
+ if (output === previousOutput) {
51
+ return;
52
+ }
53
+ const previousCount = previousLines.length;
54
+ const nextLines = output.split('\n');
55
+ const nextCount = nextLines.length;
56
+ const visibleCount = nextCount - 1;
57
+ if (output === '\n' || previousOutput.length === 0) {
58
+ stream.write(ansiEscapes.eraseLines(previousCount) + output);
59
+ previousOutput = output;
60
+ previousLines = nextLines;
61
+ return;
62
+ }
63
+ // We aggregate all chunks for incremental rendering into a buffer, and then write them to stdout at the end.
64
+ const buffer = [];
65
+ // Clear extra lines if the current content's line count is lower than the previous.
66
+ if (nextCount < previousCount) {
67
+ buffer.push(
68
+ // Erases the trailing lines and the final newline slot.
69
+ ansiEscapes.eraseLines(previousCount - nextCount + 1),
70
+ // Positions cursor to the top of the rendered output.
71
+ ansiEscapes.cursorUp(visibleCount));
72
+ }
73
+ else {
74
+ buffer.push(ansiEscapes.cursorUp(previousCount - 1));
75
+ }
76
+ for (let i = 0; i < visibleCount; i++) {
77
+ // We do not write lines if the contents are the same. This prevents flickering during renders.
78
+ if (nextLines[i] === previousLines[i]) {
79
+ buffer.push(ansiEscapes.cursorNextLine);
80
+ continue;
81
+ }
82
+ buffer.push(ansiEscapes.eraseLine + nextLines[i] + '\n');
83
+ }
84
+ stream.write(buffer.join(''));
85
+ previousOutput = output;
86
+ previousLines = nextLines;
87
+ };
88
+ render.clear = () => {
89
+ stream.write(ansiEscapes.eraseLines(previousLines.length));
90
+ previousOutput = '';
91
+ previousLines = [];
92
+ };
93
+ render.done = () => {
94
+ previousOutput = '';
95
+ previousLines = [];
96
+ if (!showCursor) {
97
+ cliCursor.show();
98
+ hasHiddenCursor = false;
99
+ }
100
+ };
101
+ render.sync = (str) => {
102
+ const output = str + '\n';
103
+ previousOutput = output;
104
+ previousLines = output.split('\n');
105
+ };
106
+ return render;
107
+ };
108
+ const create = (stream, { showCursor = false, incremental = false } = {}) => {
109
+ if (incremental) {
110
+ return createIncremental(stream, { showCursor });
111
+ }
112
+ return createStandard(stream, { showCursor });
113
+ };
114
+ const logUpdate = { create };
115
+ export default logUpdate;
116
+ //# sourceMappingURL=log-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-update.js","sourceRoot":"","sources":["../src/log-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type DOMElement } from './dom.js';
2
+ type Output = {
3
+ /**
4
+ Element width.
5
+ */
6
+ width: number;
7
+ /**
8
+ Element height.
9
+ */
10
+ height: number;
11
+ };
12
+ /**
13
+ Measure the dimensions of a particular `<Box>` element.
14
+ */
15
+ declare const measureElement: (node: DOMElement) => Output;
16
+ export default measureElement;
@@ -0,0 +1,9 @@
1
+ /**
2
+ Measure the dimensions of a particular `<Box>` element.
3
+ */
4
+ const measureElement = (node) => ({
5
+ width: node.yogaNode?.getComputedWidth() ?? 0,
6
+ height: node.yogaNode?.getComputedHeight() ?? 0,
7
+ });
8
+ export default measureElement;
9
+ //# sourceMappingURL=measure-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure-element.js","sourceRoot":"","sources":["../src/measure-element.ts"],"names":[],"mappings":"AAcA;;EAEE;AACF,MAAM,cAAc,GAAG,CAAC,IAAgB,EAAU,EAAE,CAAC,CAAC;IACrD,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC;IAC7C,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,CAAC;CAC/C,CAAC,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -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,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":"AAAA,iHAAiH;AACjH,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAEnC,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEhD,MAAM,OAAO,GACZ,4EAA4E,CAAC;AAE9E,MAAM,OAAO,GAA2B;IACvC,8BAA8B;IAC9B,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI;IACR,+BAA+B;IAC/B,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,mCAAmC;IACnC,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,YAAY;IACZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,wBAAwB;IACxB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,MAAM;IACZ,8BAA8B;IAC9B,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,MAAM;IACV,+BAA+B;IAC/B,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,UAAU;IACjB,WAAW;IACX,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,UAAU;IAClB,UAAU;IACV,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,KAAK;IACZ,8BAA8B;IAC9B,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,OAAO;IAEb,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,KAAK;IAEZ,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,OAAO;IAEX,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,KAAK;IACZ,WAAW;IACX,IAAI,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;AAE5E,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;IACnC,OAAO;QACN,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,IAAI;KACJ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;IAClC,OAAO;QACN,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;KACL,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC,CAAC;AAaF,MAAM,aAAa,GAAG,CAAC,IAAqB,EAAE,EAAa,EAAE;IAC5D,IAAI,KAAK,CAAC;IAEV,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACtC,CAAC,CAAC,CAAC,CAAuB,IAAI,GAAG,CAAC;YACnC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACP,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACF,CAAC;SAAM,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrD,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,CAAC,CAAC,EAAE,CAAC;QACf,CAAC,GAAG,EAAE,CAAC;IACR,CAAC;IAED,MAAM,GAAG,GAAc;QACtB,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,CAAC;QACX,GAAG,EAAE,CAAC;KACN,CAAC;IAEF,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;IAE7C,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAChB,kBAAkB;QAClB,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC;QACpB,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;IACrB,CAAC;SAAM,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACvB,0CAA0C;QAC1C,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;IACpB,CAAC;SAAM,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM;QACN,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzC,sBAAsB;QACtB,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC;QACvB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IACnC,CAAC;SAAM,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;QAC7C,mLAAmL;QACnL,SAAS;QACT,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;QACpB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IACnC,CAAC;SAAM,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;QAC7C,aAAa;QACb,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;QACpB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC3B,CAAC;SAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;QACnB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IAC3B,CAAC;SAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QAC1C,cAAc;QACd,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,CAAC;SAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACnD,SAAS;QACT,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;IACrB,CAAC;SAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACnD,mBAAmB;QACnB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACd,CAAC;SAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACnD,eAAe;QACf,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,qBAAqB;QACrB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAClD,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,uBAAuB;QACvB,sDAAsD;QACtD,6DAA6D;QAC7D,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;aACnD,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,EAAE,CAAC,CAAC;QAEX,MAAM,QAAQ,GAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAY,GAAG,CAAC,CAAC;QAE7D,yBAAyB;QACzB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAEhB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAE,CAAC;QAC1B,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;QAC1C,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -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;