From 93fc44f4991caf7f3405726110eac05e0753cf1a Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Tue, 18 Feb 2025 12:25:15 +0000 Subject: [PATCH] rfc: multiline input --- packages/core/src/lib/key.ts | 1 + packages/input/src/index.ts | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/core/src/lib/key.ts b/packages/core/src/lib/key.ts index 430bf5550f..1243f34e4b 100644 --- a/packages/core/src/lib/key.ts +++ b/packages/core/src/lib/key.ts @@ -1,6 +1,7 @@ export type KeypressEvent = { name: string; ctrl: boolean; + shift: boolean; }; export const isUpKey = (key: KeypressEvent): boolean => diff --git a/packages/input/src/index.ts b/packages/input/src/index.ts index a39d1a1649..ab52920889 100644 --- a/packages/input/src/index.ts +++ b/packages/input/src/index.ts @@ -26,6 +26,7 @@ type InputConfig = { transformer?: (value: string, { isFinal }: { isFinal: boolean }) => string; validate?: (value: string) => boolean | string | Promise; theme?: PartialDeep>; + multiline?: boolean; }; export default createPrompt((config, done) => { @@ -44,8 +45,8 @@ export default createPrompt((config, done) => { return; } - if (isEnterKey(key)) { - const answer = value || defaultValue; + if (isEnterKey(key) && !key.shift) { + const answer = value.replaceAll('\r', '\n') || defaultValue; setStatus('loading'); const isValid = @@ -65,6 +66,9 @@ export default createPrompt((config, done) => { setError(isValid || 'You must provide a valid value'); setStatus('idle'); } + } else if (isEnterKey(key) && key.shift && config.multiline) { + setValue(value + '\r'); + rl.write('\r'); } else if (isBackspaceKey(key) && !value) { setDefaultValue(undefined); } else if (key.name === 'tab' && !value) { @@ -79,7 +83,7 @@ export default createPrompt((config, done) => { }); const message = theme.style.message(config.message, status); - let formattedValue = value; + let formattedValue = value.replaceAll('\r', '\n'); if (typeof config.transformer === 'function') { formattedValue = config.transformer(value, { isFinal: status === 'done' }); } else if (status === 'done') {