diff --git a/.changeset/giant-dryers-serve.md b/.changeset/giant-dryers-serve.md new file mode 100644 index 00000000..2c63955a --- /dev/null +++ b/.changeset/giant-dryers-serve.md @@ -0,0 +1,6 @@ +--- +"@clack/prompts": patch +"@clack/core": patch +--- + +Removed all trailing space in prompt output and fixed various padding rendering bugs. diff --git a/packages/core/src/prompts/autocomplete.ts b/packages/core/src/prompts/autocomplete.ts index 05bc8cf9..6e308ff5 100644 --- a/packages/core/src/prompts/autocomplete.ts +++ b/packages/core/src/prompts/autocomplete.ts @@ -168,6 +168,7 @@ export default class AutocompletePrompt extends Prompt< if (this.focusedValue) { this.selectedValues = [this.focusedValue]; } + this.isNavigating = false; } } } diff --git a/packages/core/src/prompts/prompt.ts b/packages/core/src/prompts/prompt.ts index ca76b285..49615af6 100644 --- a/packages/core/src/prompts/prompt.ts +++ b/packages/core/src/prompts/prompt.ts @@ -256,12 +256,16 @@ export default class Prompt { private restoreCursor() { const lines = - wrap(this._prevFrame, process.stdout.columns, { hard: true }).split('\n').length - 1; + wrap(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split('\n') + .length - 1; this.output.write(cursor.move(-999, lines * -1)); } private render() { - const frame = wrap(this._render(this) ?? '', process.stdout.columns, { hard: true }); + const frame = wrap(this._render(this) ?? '', process.stdout.columns, { + hard: true, + trim: false, + }); if (frame === this._prevFrame) return; if (this.state === 'initial') { diff --git a/packages/prompts/src/autocomplete.ts b/packages/prompts/src/autocomplete.ts index 71173c0f..a2041b2d 100644 --- a/packages/prompts/src/autocomplete.ts +++ b/packages/prompts/src/autocomplete.ts @@ -101,20 +101,25 @@ export const autocomplete = (opts: AutocompleteOptions) => { case 'submit': { // Show selected value const selected = getSelectedOptions(this.selectedValues, options); - const label = selected.length > 0 ? selected.map(getLabel).join(', ') : ''; - return `${title}${color.gray(S_BAR)} ${color.dim(label)}`; + const label = + selected.length > 0 ? ` ${color.dim(selected.map(getLabel).join(', '))}` : ''; + return `${title}${color.gray(S_BAR)}${label}`; } case 'cancel': { - return `${title}${color.gray(S_BAR)} ${color.strikethrough(color.dim(userInput))}`; + const userInputText = userInput ? ` ${color.strikethrough(color.dim(userInput))}` : ''; + return `${title}${color.gray(S_BAR)}${userInputText}`; } default: { // Display cursor position - show plain text in navigation mode - const searchText = - this.isNavigating || showPlaceholder - ? color.dim(showPlaceholder ? placeholder : userInput) - : this.userInputWithCursor; + let searchText = ''; + if (this.isNavigating || showPlaceholder) { + const searchTextValue = showPlaceholder ? placeholder : userInput; + searchText = searchTextValue !== '' ? ` ${color.dim(searchTextValue)}` : ''; + } else { + searchText = ` ${this.userInputWithCursor}`; + } // Show match count if filtered const matches = @@ -164,8 +169,8 @@ export const autocomplete = (opts: AutocompleteOptions) => { // Return the formatted prompt return [ - title, - `${color.cyan(S_BAR)} ${color.dim('Search:')} ${searchText}${matches}`, + `${title}${color.cyan(S_BAR)}`, + `${color.cyan(S_BAR)} ${color.dim('Search:')}${searchText}${matches}`, ...noResults, ...validationError, ...displayOptions.map((option) => `${color.cyan(S_BAR)} ${option}`), diff --git a/packages/prompts/src/group-multi-select.ts b/packages/prompts/src/group-multi-select.ts index 8962c6df..7854744b 100644 --- a/packages/prompts/src/group-multi-select.ts +++ b/packages/prompts/src/group-multi-select.ts @@ -40,12 +40,15 @@ export const groupMultiselect = (opts: GroupMultiSelectOptions) => const next = isItem && (options[options.indexOf(option) + 1] ?? { group: true }); const isLast = isItem && (next as any).group === true; const prefix = isItem ? (selectableGroups ? `${isLast ? S_BAR_END : S_BAR} ` : ' ') : ''; - const spacingPrefix = - groupSpacing > 0 && !isItem ? `\n${color.cyan(S_BAR)} `.repeat(groupSpacing) : ''; + let spacingPrefix = ''; + if (groupSpacing > 0 && !isItem) { + const spacingPrefixText = `\n${color.cyan(S_BAR)}`; + spacingPrefix = `${spacingPrefixText.repeat(groupSpacing - 1)}${spacingPrefixText} `; + } if (state === 'active') { - return `${spacingPrefix}${color.dim(prefix)}${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : '' + return `${spacingPrefix}${color.dim(prefix)}${color.cyan(S_CHECKBOX_ACTIVE)} ${label}${ + option.hint ? ` ${color.dim(`(${option.hint})`)}` : '' }`; } if (state === 'group-active') { @@ -56,16 +59,16 @@ export const groupMultiselect = (opts: GroupMultiSelectOptions) => } if (state === 'selected') { const selectedCheckbox = isItem || selectableGroups ? color.green(S_CHECKBOX_SELECTED) : ''; - return `${spacingPrefix}${color.dim(prefix)}${selectedCheckbox} ${color.dim(label)} ${ - option.hint ? color.dim(`(${option.hint})`) : '' + return `${spacingPrefix}${color.dim(prefix)}${selectedCheckbox} ${color.dim(label)}${ + option.hint ? ` ${color.dim(`(${option.hint})`)}` : '' }`; } if (state === 'cancelled') { return `${color.strikethrough(color.dim(label))}`; } if (state === 'active-selected') { - return `${spacingPrefix}${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : '' + return `${spacingPrefix}${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${label}${ + option.hint ? ` ${color.dim(`(${option.hint})`)}` : '' }`; } if (state === 'submitted') { @@ -101,10 +104,12 @@ export const groupMultiselect = (opts: GroupMultiSelectOptions) => switch (this.state) { case 'submit': { - return `${title}${color.gray(S_BAR)} ${this.options + const selectedOptions = this.options .filter(({ value: optionValue }) => value.includes(optionValue)) - .map((option) => opt(option, 'submitted')) - .join(color.dim(', '))}`; + .map((option) => opt(option, 'submitted')); + const optionsText = + selectedOptions.length === 0 ? '' : ` ${selectedOptions.join(color.dim(', '))}`; + return `${title}${color.gray(S_BAR)}${optionsText}`; } case 'cancel': { const label = this.options @@ -146,7 +151,7 @@ export const groupMultiselect = (opts: GroupMultiSelectOptions) => .join(`\n${color.yellow(S_BAR)} `)}\n${footer}\n`; } default: { - return `${title}${color.cyan(S_BAR)} ${this.options + const optionsText = this.options .map((option, i, options) => { const selected = value.includes(option.value) || @@ -156,18 +161,26 @@ export const groupMultiselect = (opts: GroupMultiSelectOptions) => !active && typeof option.group === 'string' && this.options[this.cursor].value === option.group; + let optionText = ''; if (groupActive) { - return opt(option, selected ? 'group-active-selected' : 'group-active', options); - } - if (active && selected) { - return opt(option, 'active-selected', options); + optionText = opt( + option, + selected ? 'group-active-selected' : 'group-active', + options + ); + } else if (active && selected) { + optionText = opt(option, 'active-selected', options); + } else if (selected) { + optionText = opt(option, 'selected', options); + } else { + optionText = opt(option, active ? 'active' : 'inactive', options); } - if (selected) { - return opt(option, 'selected', options); - } - return opt(option, active ? 'active' : 'inactive', options); + const prefix = i !== 0 && !optionText.startsWith('\n') ? ' ' : ''; + return `${prefix}${optionText}`; }) - .join(`\n${color.cyan(S_BAR)} `)}\n${color.cyan(S_BAR_END)}\n`; + .join(`\n${color.cyan(S_BAR)}`); + const optionsPrefix = optionsText.startsWith('\n') ? '' : ' '; + return `${title}${color.cyan(S_BAR)}${optionsPrefix}${optionsText}\n${color.cyan(S_BAR_END)}\n`; } } }, diff --git a/packages/prompts/src/multi-select.ts b/packages/prompts/src/multi-select.ts index c717958d..1d928a7e 100644 --- a/packages/prompts/src/multi-select.ts +++ b/packages/prompts/src/multi-select.ts @@ -27,21 +27,21 @@ export const multiselect = (opts: MultiSelectOptions) => { ) => { const label = option.label ?? String(option.value); if (state === 'active') { - return `${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : '' + return `${color.cyan(S_CHECKBOX_ACTIVE)} ${label}${ + option.hint ? ` ${color.dim(`(${option.hint})`)}` : '' }`; } if (state === 'selected') { - return `${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)} ${ - option.hint ? color.dim(`(${option.hint})`) : '' + return `${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}${ + option.hint ? ` ${color.dim(`(${option.hint})`)}` : '' }`; } if (state === 'cancelled') { return `${color.strikethrough(color.dim(label))}`; } if (state === 'active-selected') { - return `${color.green(S_CHECKBOX_SELECTED)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : '' + return `${color.green(S_CHECKBOX_SELECTED)} ${label}${ + option.hint ? ` ${color.dim(`(${option.hint})`)}` : '' }`; } if (state === 'submitted') { @@ -98,8 +98,8 @@ export const multiselect = (opts: MultiSelectOptions) => { .filter(({ value: optionValue }) => value.includes(optionValue)) .map((option) => opt(option, 'cancelled')) .join(color.dim(', ')); - return `${title}${color.gray(S_BAR)} ${ - label.trim() ? `${label}\n${color.gray(S_BAR)}` : '' + return `${title}${color.gray(S_BAR)}${ + label.trim() ? ` ${label}\n${color.gray(S_BAR)}` : '' }`; } case 'error': { diff --git a/packages/prompts/src/password.ts b/packages/prompts/src/password.ts index 58632aa7..efdc4ef6 100644 --- a/packages/prompts/src/password.ts +++ b/packages/prompts/src/password.ts @@ -20,16 +20,22 @@ export const password = (opts: PasswordOptions) => { const masked = this.masked; switch (this.state) { - case 'error': - return `${title.trim()}\n${color.yellow(S_BAR)} ${masked}\n${color.yellow( + case 'error': { + const maskedText = masked ? ` ${masked}` : ''; + return `${title.trim()}\n${color.yellow(S_BAR)}${maskedText}\n${color.yellow( S_BAR_END )} ${color.yellow(this.error)}\n`; - case 'submit': - return `${title}${color.gray(S_BAR)} ${color.dim(masked)}`; - case 'cancel': - return `${title}${color.gray(S_BAR)} ${color.strikethrough(color.dim(masked))}${ + } + case 'submit': { + const maskedText = masked ? ` ${color.dim(masked)}` : ''; + return `${title}${color.gray(S_BAR)}${maskedText}`; + } + case 'cancel': { + const maskedText = masked ? ` ${color.strikethrough(color.dim(masked))}` : ''; + return `${title}${color.gray(S_BAR)}${maskedText}${ masked ? `\n${color.gray(S_BAR)}` : '' }`; + } default: return `${title}${color.cyan(S_BAR)} ${userInput}\n${color.cyan(S_BAR_END)}\n`; } diff --git a/packages/prompts/src/select.ts b/packages/prompts/src/select.ts index efb7c486..1dafaea3 100644 --- a/packages/prompts/src/select.ts +++ b/packages/prompts/src/select.ts @@ -64,8 +64,8 @@ export const select = (opts: SelectOptions) => { case 'selected': return `${color.dim(label)}`; case 'active': - return `${color.green(S_RADIO_ACTIVE)} ${label} ${ - option.hint ? color.dim(`(${option.hint})`) : '' + return `${color.green(S_RADIO_ACTIVE)} ${label}${ + option.hint ? ` ${color.dim(`(${option.hint})`)}` : '' }`; case 'cancelled': return `${color.strikethrough(color.dim(label))}`; diff --git a/packages/prompts/src/text.ts b/packages/prompts/src/text.ts index 2bfcd8eb..244f7c8d 100644 --- a/packages/prompts/src/text.ts +++ b/packages/prompts/src/text.ts @@ -28,17 +28,20 @@ export const text = (opts: TextOptions) => { const value = this.value ?? ''; switch (this.state) { - case 'error': + case 'error': { + const errorText = this.error ? ` ${color.yellow(this.error)}` : ''; return `${title.trim()}\n${color.yellow(S_BAR)} ${userInput}\n${color.yellow( S_BAR_END - )} ${color.yellow(this.error)}\n`; + )}${errorText}\n`; + } case 'submit': { - return `${title}${color.gray(S_BAR)} ${color.dim(value)}`; + const valueText = value ? ` ${color.dim(value)}` : ''; + return `${title}${color.gray(S_BAR)}${valueText}`; + } + case 'cancel': { + const valueText = value ? ` ${color.strikethrough(color.dim(value))}` : ''; + return `${title}${color.gray(S_BAR)}${valueText}${value.trim() ? `\n${color.gray(S_BAR)}` : ''}`; } - case 'cancel': - return `${title}${color.gray(S_BAR)} ${color.strikethrough( - color.dim(value) - )}${value.trim() ? `\n${color.gray(S_BAR)}` : ''}`; default: return `${title}${color.cyan(S_BAR)} ${userInput}\n${color.cyan(S_BAR_END)}\n`; } diff --git a/packages/prompts/test/__snapshots__/autocomplete.test.ts.snap b/packages/prompts/test/__snapshots__/autocomplete.test.ts.snap index b414a4eb..1e0daf65 100644 --- a/packages/prompts/test/__snapshots__/autocomplete.test.ts.snap +++ b/packages/prompts/test/__snapshots__/autocomplete.test.ts.snap @@ -5,7 +5,7 @@ exports[`autocomplete > can be aborted by a signal 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: _ β”‚ ● Apple β”‚ β—‹ Banana @@ -25,7 +25,7 @@ exports[`autocomplete > limits displayed options when maxItems is set 1`] = ` "", "β”‚ β—† Select an option - +β”‚ β”‚ Search: _ β”‚ ● Option 0 β”‚ β—‹ Option 1 @@ -51,7 +51,7 @@ exports[`autocomplete > renders initial UI with message and instructions 1`] = ` "", "β”‚ β—† Select a fruit - +β”‚ β”‚ Search: _ β”‚ ● Apple β”‚ β—‹ Banana @@ -76,7 +76,7 @@ exports[`autocomplete > renders placeholder if set 1`] = ` "", "β”‚ β—† Select a fruit - +β”‚ β”‚ Search: Type to search... β”‚ ● Apple β”‚ β—‹ Banana @@ -101,7 +101,7 @@ exports[`autocomplete > shows hint when option has hint and is focused 1`] = ` "", "β”‚ β—† Select a fruit - +β”‚ β”‚ Search: _ β”‚ ● Apple β”‚ β—‹ Banana @@ -114,7 +114,7 @@ exports[`autocomplete > shows hint when option has hint and is focused 1`] = ` "", "", "", - "β”‚ Search: + "β”‚ Search: β”‚ β—‹ Apple β”‚ ● Banana β”‚ β—‹ Cherry @@ -173,7 +173,7 @@ exports[`autocomplete > shows no matches message when search has no results 1`] "", "β”‚ β—† Select a fruit - +β”‚ β”‚ Search: _ β”‚ ● Apple β”‚ β—‹ Banana @@ -193,7 +193,7 @@ exports[`autocomplete > shows no matches message when search has no results 1`] "", "", "β—‡ Select a fruit -β”‚", +β”‚", " ", "", @@ -205,7 +205,7 @@ exports[`autocomplete > shows selected value in submit state 1`] = ` "", "β”‚ β—† Select a fruit - +β”‚ β”‚ Search: _ β”‚ ● Apple β”‚ β—‹ Banana @@ -217,7 +217,7 @@ exports[`autocomplete > shows selected value in submit state 1`] = ` "", "", "", - "β”‚ Search: + "β”‚ Search: β”‚ β—‹ Apple β”‚ ● Banana β”‚ β—‹ Cherry @@ -241,7 +241,7 @@ exports[`autocomplete > shows strikethrough in cancel state 1`] = ` "", "β”‚ β—† Select a fruit - +β”‚ β”‚ Search: _ β”‚ ● Apple β”‚ β—‹ Banana @@ -254,7 +254,7 @@ exports[`autocomplete > shows strikethrough in cancel state 1`] = ` "", "", "β–  Select a fruit -β”‚", +β”‚", " ", "", @@ -266,7 +266,7 @@ exports[`autocomplete > supports initialValue 1`] = ` "", "β”‚ β—† Select a fruit - +β”‚ β”‚ Search: _ β”‚ β—‹ Apple β”‚ β—‹ Banana diff --git a/packages/prompts/test/__snapshots__/group-multi-select.test.ts.snap b/packages/prompts/test/__snapshots__/group-multi-select.test.ts.snap index 942a30ce..8f0717bd 100644 --- a/packages/prompts/test/__snapshots__/group-multi-select.test.ts.snap +++ b/packages/prompts/test/__snapshots__/group-multi-select.test.ts.snap @@ -375,7 +375,7 @@ exports[`groupMultiselect (isCI = false) > renders error when nothing selected 1 β”‚ β”‚ β—» group1value0 β”‚ β”” β—» group1value1 β”” Please select at least one option. -Press  space  to select,  enter  to submit + Press  space  to select,  enter  to submit ", "", "", @@ -913,7 +913,7 @@ exports[`groupMultiselect (isCI = true) > renders error when nothing selected 1` β”‚ β”‚ β—» group1value0 β”‚ β”” β—» group1value1 β”” Please select at least one option. -Press  space  to select,  enter  to submit + Press  space  to select,  enter  to submit ", "", "", diff --git a/packages/prompts/test/__snapshots__/multi-select.test.ts.snap b/packages/prompts/test/__snapshots__/multi-select.test.ts.snap index 50c57dde..bdb20f98 100644 --- a/packages/prompts/test/__snapshots__/multi-select.test.ts.snap +++ b/packages/prompts/test/__snapshots__/multi-select.test.ts.snap @@ -367,7 +367,7 @@ exports[`multiselect (isCI = false) > renders validation errors 1`] = ` β”‚ β—» opt0 β”‚ β—» opt1 β”” Please select at least one option. -Press  space  to select,  enter  to submit + Press  space  to select,  enter  to submit ", "", "", @@ -977,7 +977,7 @@ exports[`multiselect (isCI = true) > renders validation errors 1`] = ` β”‚ β—» opt0 β”‚ β—» opt1 β”” Please select at least one option. -Press  space  to select,  enter  to submit + Press  space  to select,  enter  to submit ", "", "", diff --git a/packages/prompts/test/__snapshots__/password.test.ts.snap b/packages/prompts/test/__snapshots__/password.test.ts.snap index c6c508d6..1968a456 100644 --- a/packages/prompts/test/__snapshots__/password.test.ts.snap +++ b/packages/prompts/test/__snapshots__/password.test.ts.snap @@ -147,7 +147,7 @@ exports[`password (isCI = false) > renders message 1`] = ` "", "", "β—‡ foo -β”‚", +β”‚", " ", "", @@ -301,7 +301,7 @@ exports[`password (isCI = true) > renders message 1`] = ` "", "", "β—‡ foo -β”‚", +β”‚", " ", "", diff --git a/packages/prompts/test/__snapshots__/path.test.ts.snap b/packages/prompts/test/__snapshots__/path.test.ts.snap index 181952f8..f96e4641 100644 --- a/packages/prompts/test/__snapshots__/path.test.ts.snap +++ b/packages/prompts/test/__snapshots__/path.test.ts.snap @@ -5,7 +5,7 @@ exports[`text (isCI = false) > can cancel 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -27,7 +27,7 @@ exports[`text (isCI = false) > cannot submit unknown value 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -44,7 +44,7 @@ exports[`text (isCI = false) > cannot submit unknown value 1`] = ` "", "", "β–² foo - +β”‚ β”‚ Search: /tmp/_β–ˆ β”‚ No matches found β”‚ Please select a path @@ -54,7 +54,7 @@ exports[`text (isCI = false) > cannot submit unknown value 1`] = ` "", "", "β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -83,7 +83,7 @@ exports[`text (isCI = false) > initialValue sets the value 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/barβ–ˆ β”‚ ● /tmp/bar β”‚ ↑/↓ to select β€’ Enter: confirm β€’ Type: to search @@ -104,7 +104,7 @@ exports[`text (isCI = false) > renders cancelled value if one set 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -138,7 +138,7 @@ exports[`text (isCI = false) > renders message 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -160,7 +160,7 @@ exports[`text (isCI = false) > renders submitted value 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -194,7 +194,7 @@ exports[`text (isCI = false) > validation errors render and clear (using Error) "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -211,7 +211,7 @@ exports[`text (isCI = false) > validation errors render and clear (using Error) "", "", "β–² foo - +β”‚ β”‚ Search: /tmp/rβ–ˆ β”‚ should be /tmp/bar β”‚ ● /tmp/root.zip @@ -221,7 +221,7 @@ exports[`text (isCI = false) > validation errors render and clear (using Error) "", "", "β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ β—‹ /tmp/bar β”‚ ● /tmp/root.zip @@ -250,7 +250,7 @@ exports[`text (isCI = false) > validation errors render and clear 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -267,7 +267,7 @@ exports[`text (isCI = false) > validation errors render and clear 1`] = ` "", "", "β–² foo - +β”‚ β”‚ Search: /tmp/rβ–ˆ β”‚ should be /tmp/bar β”‚ ● /tmp/root.zip @@ -277,7 +277,7 @@ exports[`text (isCI = false) > validation errors render and clear 1`] = ` "", "", "β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ β—‹ /tmp/bar β”‚ ● /tmp/root.zip @@ -306,7 +306,7 @@ exports[`text (isCI = true) > can cancel 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -328,7 +328,7 @@ exports[`text (isCI = true) > cannot submit unknown value 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -345,7 +345,7 @@ exports[`text (isCI = true) > cannot submit unknown value 1`] = ` "", "", "β–² foo - +β”‚ β”‚ Search: /tmp/_β–ˆ β”‚ No matches found β”‚ Please select a path @@ -355,7 +355,7 @@ exports[`text (isCI = true) > cannot submit unknown value 1`] = ` "", "", "β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -384,7 +384,7 @@ exports[`text (isCI = true) > initialValue sets the value 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/barβ–ˆ β”‚ ● /tmp/bar β”‚ ↑/↓ to select β€’ Enter: confirm β€’ Type: to search @@ -405,7 +405,7 @@ exports[`text (isCI = true) > renders cancelled value if one set 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -439,7 +439,7 @@ exports[`text (isCI = true) > renders message 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -461,7 +461,7 @@ exports[`text (isCI = true) > renders submitted value 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -495,7 +495,7 @@ exports[`text (isCI = true) > validation errors render and clear (using Error) 1 "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -512,7 +512,7 @@ exports[`text (isCI = true) > validation errors render and clear (using Error) 1 "", "", "β–² foo - +β”‚ β”‚ Search: /tmp/rβ–ˆ β”‚ should be /tmp/bar β”‚ ● /tmp/root.zip @@ -522,7 +522,7 @@ exports[`text (isCI = true) > validation errors render and clear (using Error) 1 "", "", "β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ β—‹ /tmp/bar β”‚ ● /tmp/root.zip @@ -551,7 +551,7 @@ exports[`text (isCI = true) > validation errors render and clear 1`] = ` "", "β”‚ β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ ● /tmp/bar β”‚ β—‹ /tmp/root.zip @@ -568,7 +568,7 @@ exports[`text (isCI = true) > validation errors render and clear 1`] = ` "", "", "β–² foo - +β”‚ β”‚ Search: /tmp/rβ–ˆ β”‚ should be /tmp/bar β”‚ ● /tmp/root.zip @@ -578,7 +578,7 @@ exports[`text (isCI = true) > validation errors render and clear 1`] = ` "", "", "β—† foo - +β”‚ β”‚ Search: /tmp/β–ˆ β”‚ β—‹ /tmp/bar β”‚ ● /tmp/root.zip diff --git a/packages/prompts/test/__snapshots__/text.test.ts.snap b/packages/prompts/test/__snapshots__/text.test.ts.snap index ea52ce78..29abf5b4 100644 --- a/packages/prompts/test/__snapshots__/text.test.ts.snap +++ b/packages/prompts/test/__snapshots__/text.test.ts.snap @@ -26,7 +26,7 @@ exports[`text (isCI = false) > can cancel 1`] = ` "", "", "β–  foo -β”‚", +β”‚", " ", "", @@ -64,7 +64,7 @@ exports[`text (isCI = false) > empty string when no value and no default 1`] = ` "", "", "β—‡ foo -β”‚", +β”‚", " ", "", @@ -132,7 +132,7 @@ exports[`text (isCI = false) > renders message 1`] = ` "", "", "β—‡ foo -β”‚", +β”‚", " ", "", @@ -151,7 +151,7 @@ exports[`text (isCI = false) > renders placeholder if set 1`] = ` "", "", "β—‡ foo -β”‚", +β”‚", " ", "", @@ -289,7 +289,7 @@ exports[`text (isCI = true) > can cancel 1`] = ` "", "", "β–  foo -β”‚", +β”‚", " ", "", @@ -327,7 +327,7 @@ exports[`text (isCI = true) > empty string when no value and no default 1`] = ` "", "", "β—‡ foo -β”‚", +β”‚", " ", "", @@ -395,7 +395,7 @@ exports[`text (isCI = true) > renders message 1`] = ` "", "", "β—‡ foo -β”‚", +β”‚", " ", "", @@ -414,7 +414,7 @@ exports[`text (isCI = true) > renders placeholder if set 1`] = ` "", "", "β—‡ foo -β”‚", +β”‚", " ", "", diff --git a/packages/prompts/test/autocomplete.test.ts b/packages/prompts/test/autocomplete.test.ts index 7c913334..2e6f7b6c 100644 --- a/packages/prompts/test/autocomplete.test.ts +++ b/packages/prompts/test/autocomplete.test.ts @@ -115,7 +115,7 @@ describe('autocomplete', () => { }); // Cancel with Ctrl+C - input.emit('keypress', '\x03', { name: 'c' }); + input.emit('keypress', '\x03', { name: 'c', ctrl: true }); const value = await result; expect(typeof value === 'symbol').toBe(true);