Skip to content

Commit 4dc1a87

Browse files
authored
Fix input parsing of control characters (#699)
1 parent 57a4b21 commit 4dc1a87

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

Diff for: src/parse-keypress.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ const parseKeypress = (s: Buffer | string = ''): ParsedKey => {
191191
} else if (s === ' ' || s === '\x1b ') {
192192
key.name = 'space';
193193
key.meta = s.length === 2;
194-
} else if (s <= '\x1a') {
194+
} else if (s.length === 1 && s <= '\x1a') {
195195
// ctrl+letter
196196
key.name = String.fromCharCode(s.charCodeAt(0) + 'a'.charCodeAt(0) - 1);
197197
key.ctrl = true;

Diff for: test/fixtures/use-input.tsx

+10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ function UserInput({test}: {readonly test: string | undefined}) {
1616
return;
1717
}
1818

19+
if (test === 'pastedCarriageReturn' && input === '\rtest') {
20+
exit();
21+
return;
22+
}
23+
24+
if (test === 'pastedTab' && input === '\ttest') {
25+
exit();
26+
return;
27+
}
28+
1929
if (test === 'escape' && key.escape) {
2030
exit();
2131
return;

Diff for: test/hooks.tsx

+14
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,20 @@ test.serial('useInput - handle uppercase character', async t => {
8282
t.true(ps.output.includes('exited'));
8383
});
8484

85+
test.serial('useInput - pasted carriage return', async t => {
86+
const ps = term('use-input', ['pastedCarriageReturn']);
87+
ps.write('\rtest');
88+
await ps.waitForExit();
89+
t.true(ps.output.includes('exited'));
90+
});
91+
92+
test.serial('useInput - pasted tab', async t => {
93+
const ps = term('use-input', ['pastedTab']);
94+
ps.write('\ttest');
95+
await ps.waitForExit();
96+
t.true(ps.output.includes('exited'));
97+
});
98+
8599
test.serial('useInput - handle escape', async t => {
86100
const ps = term('use-input', ['escape']);
87101
ps.write('\u001B');

0 commit comments

Comments
 (0)