fix(paste) incorrect handling of \\\n in pastes (#6532)

This commit is contained in:
Jacob Richman
2025-08-19 13:41:08 -07:00
committed by GitHub
parent ed1fc4ddb3
commit 2143731f6e
5 changed files with 120 additions and 60 deletions

View File

@@ -1211,6 +1211,43 @@ describe('InputPrompt', () => {
});
});
describe('multiline paste', () => {
it.each([
{
description: 'with \n newlines',
pastedText: 'This \n is \n a \n multiline \n paste.',
},
{
description: 'with extra slashes before \n newlines',
pastedText: 'This \\\n is \\\n a \\\n multiline \\\n paste.',
},
{
description: 'with \r\n newlines',
pastedText: 'This\r\nis\r\na\r\nmultiline\r\npaste.',
},
])('should handle multiline paste $description', async ({ pastedText }) => {
const { stdin, unmount } = renderWithProviders(
<InputPrompt {...props} />,
);
await wait();
// Simulate a bracketed paste event from the terminal
stdin.write(`\x1b[200~${pastedText}\x1b[201~`);
await wait();
// Verify that the buffer's handleInput was called once with the full text
expect(props.buffer.handleInput).toHaveBeenCalledTimes(1);
expect(props.buffer.handleInput).toHaveBeenCalledWith(
expect.objectContaining({
paste: true,
sequence: pastedText,
}),
);
unmount();
});
});
describe('enhanced input UX - double ESC clear functionality', () => {
it('should clear buffer on second ESC press', async () => {
const onEscapePromptChange = vi.fn();