Skip to content

Commit 2e317a1

Browse files
committed
Fix input parsing of control characters
Strings that start with control characters (e.g. "\rfoo") were previously parsed incorrectly and treated as if it was a ctrl+letter combination. Fixes #649.
1 parent 57a4b21 commit 2e317a1

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

src/parse-keypress.ts

Lines changed: 1 addition & 1 deletion
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;

test/fixtures/use-input.tsx

Lines changed: 10 additions & 0 deletions
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;

test/hooks.tsx

Lines changed: 14 additions & 0 deletions
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)