Skip to content

Commit 7acf227

Browse files
committed
add clearPromptOnDone
1 parent 9fd94e2 commit 7acf227

File tree

9 files changed

+45
-24
lines changed

9 files changed

+45
-24
lines changed

packages/prompts/src/autocomplete.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import { AutocompletePrompt } from '@clack/core';
22
import color from 'picocolors';
3+
import { cursor } from "sisteransi";
34
import {
4-
type CommonOptions,
5+
type CommonPromptOptions,
56
S_BAR,
67
S_BAR_END,
78
S_CHECKBOX_INACTIVE,
89
S_CHECKBOX_SELECTED,
910
S_RADIO_ACTIVE,
1011
S_RADIO_INACTIVE,
1112
symbol,
13+
clearPrompt,
1214
} from './common.js';
1315
import { limitOptions } from './limit-options.js';
1416
import type { Option } from './select.js';
@@ -41,7 +43,7 @@ function getSelectedOptions<T>(values: T[], options: Option<T>[]): Option<T>[] {
4143
return results;
4244
}
4345

44-
interface AutocompleteSharedOptions<Value> extends CommonOptions {
46+
interface AutocompleteSharedOptions<Value> extends CommonPromptOptions {
4547
/**
4648
* The message to display to the user.
4749
*/
@@ -103,7 +105,7 @@ export const autocomplete = <Value>(opts: AutocompleteOptions<Value>) => {
103105
const selected = getSelectedOptions(this.selectedValues, options);
104106
const label =
105107
selected.length > 0 ? ` ${color.dim(selected.map(getLabel).join(', '))}` : '';
106-
return `${title}${color.gray(S_BAR)}${label}`;
108+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)}${label}`;
107109
}
108110

109111
case 'cancel': {
@@ -266,7 +268,7 @@ export const autocompleteMultiselect = <Value>(opts: AutocompleteMultiSelectOpti
266268
// Render prompt state
267269
switch (this.state) {
268270
case 'submit': {
269-
return `${title}${color.gray(S_BAR)} ${color.dim(`${this.selectedValues.length} items selected`)}`;
271+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)} ${color.dim(`${this.selectedValues.length} items selected`)}`;
270272
}
271273
case 'cancel': {
272274
return `${title}${color.gray(S_BAR)} ${color.strikethrough(color.dim(userInput))}`;

packages/prompts/src/common.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,11 @@ export interface CommonOptions {
5858
output?: Writable;
5959
signal?: AbortSignal;
6060
}
61+
62+
export interface CommonPromptOptions extends CommonOptions {
63+
clearPromptOnDone: boolean;
64+
}
65+
66+
export const clearPrompt = (opts: CommonPromptOptions) => {
67+
return opts.clearPromptOnDone && typeof opts.clearPromptOnDone === 'boolean';
68+
}

packages/prompts/src/confirm.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import { ConfirmPrompt } from '@clack/core';
22
import color from 'picocolors';
3+
import { cursor } from "sisteransi";
34
import {
4-
type CommonOptions,
5+
type CommonPromptOptions,
56
S_BAR,
67
S_BAR_END,
78
S_RADIO_ACTIVE,
89
S_RADIO_INACTIVE,
910
symbol,
11+
clearPrompt,
1012
} from './common.js';
1113

12-
export interface ConfirmOptions extends CommonOptions {
14+
export interface ConfirmOptions extends CommonPromptOptions {
1315
message: string;
1416
active?: string;
1517
inactive?: string;
@@ -31,7 +33,7 @@ export const confirm = (opts: ConfirmOptions) => {
3133

3234
switch (this.state) {
3335
case 'submit':
34-
return `${title}${color.gray(S_BAR)} ${color.dim(value)}`;
36+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)} ${color.dim(value)}`;
3537
case 'cancel':
3638
return `${title}${color.gray(S_BAR)} ${color.strikethrough(
3739
color.dim(value)

packages/prompts/src/group-multi-select.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import { GroupMultiSelectPrompt } from '@clack/core';
22
import color from 'picocolors';
3+
import { cursor } from "sisteransi";
34
import {
4-
type CommonOptions,
5+
type CommonPromptOptions,
56
S_BAR,
67
S_BAR_END,
78
S_CHECKBOX_ACTIVE,
89
S_CHECKBOX_INACTIVE,
910
S_CHECKBOX_SELECTED,
1011
symbol,
12+
clearPrompt,
1113
} from './common.js';
1214
import type { Option } from './select.js';
1315

14-
export interface GroupMultiSelectOptions<Value> extends CommonOptions {
16+
export interface GroupMultiSelectOptions<Value> extends CommonPromptOptions {
1517
message: string;
1618
options: Record<string, Option<Value>[]>;
1719
initialValues?: Value[];
@@ -109,7 +111,7 @@ export const groupMultiselect = <Value>(opts: GroupMultiSelectOptions<Value>) =>
109111
.map((option) => opt(option, 'submitted'));
110112
const optionsText =
111113
selectedOptions.length === 0 ? '' : ` ${selectedOptions.join(color.dim(', '))}`;
112-
return `${title}${color.gray(S_BAR)}${optionsText}`;
114+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)}${optionsText}`;
113115
}
114116
case 'cancel': {
115117
const label = this.options

packages/prompts/src/multi-select.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import { MultiSelectPrompt } from '@clack/core';
22
import color from 'picocolors';
3+
import { cursor } from "sisteransi";
34
import {
4-
type CommonOptions,
5+
type CommonPromptOptions,
56
S_BAR,
67
S_BAR_END,
78
S_CHECKBOX_ACTIVE,
89
S_CHECKBOX_INACTIVE,
910
S_CHECKBOX_SELECTED,
1011
symbol,
12+
clearPrompt,
1113
} from './common.js';
1214
import { limitOptions } from './limit-options.js';
1315
import type { Option } from './select.js';
1416

15-
export interface MultiSelectOptions<Value> extends CommonOptions {
17+
export interface MultiSelectOptions<Value> extends CommonPromptOptions {
1618
message: string;
1719
options: Option<Value>[];
1820
initialValues?: Value[];
@@ -86,7 +88,7 @@ export const multiselect = <Value>(opts: MultiSelectOptions<Value>) => {
8688

8789
switch (this.state) {
8890
case 'submit': {
89-
return `${title}${color.gray(S_BAR)} ${
91+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)} ${
9092
this.options
9193
.filter(({ value: optionValue }) => value.includes(optionValue))
9294
.map((option) => opt(option, 'submitted'))

packages/prompts/src/password.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { PasswordPrompt } from '@clack/core';
22
import color from 'picocolors';
3-
import { type CommonOptions, S_BAR, S_BAR_END, S_PASSWORD_MASK, symbol } from './common.js';
3+
import { cursor } from "sisteransi";
4+
import { type CommonPromptOptions, S_BAR, S_BAR_END, S_PASSWORD_MASK, symbol, clearPrompt } from './common.js';
45

5-
export interface PasswordOptions extends CommonOptions {
6+
export interface PasswordOptions extends CommonPromptOptions {
67
message: string;
78
mask?: string;
89
validate?: (value: string | undefined) => string | Error | undefined;
@@ -32,7 +33,7 @@ export const password = (opts: PasswordOptions) => {
3233
}
3334
case 'submit': {
3435
const maskedText = masked ? ` ${color.dim(masked)}` : '';
35-
return `${title}${color.gray(S_BAR)}${maskedText}`;
36+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)}${maskedText}`;
3637
}
3738
case 'cancel': {
3839
const maskedText = masked ? ` ${color.strikethrough(color.dim(masked))}` : '';

packages/prompts/src/select-key.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { SelectKeyPrompt } from '@clack/core';
22
import color from 'picocolors';
3-
import { S_BAR, S_BAR_END, symbol } from './common.js';
3+
import { cursor } from 'sisteransi';
4+
import { S_BAR, S_BAR_END, symbol, clearPrompt } from './common.js';
45
import type { Option, SelectOptions } from './select.js';
56

67
export const selectKey = <Value extends string>(opts: SelectOptions<Value>) => {
@@ -36,7 +37,7 @@ export const selectKey = <Value extends string>(opts: SelectOptions<Value>) => {
3637

3738
switch (this.state) {
3839
case 'submit':
39-
return `${title}${color.gray(S_BAR)} ${opt(
40+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)} ${opt(
4041
this.options.find((opt) => opt.value === this.value) ?? opts.options[0],
4142
'selected'
4243
)}`;

packages/prompts/src/select.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { SelectPrompt } from '@clack/core';
22
import color from 'picocolors';
3+
import { cursor } from 'sisteransi';
34
import {
4-
type CommonOptions,
5+
type CommonPromptOptions,
56
S_BAR,
67
S_BAR_END,
78
S_RADIO_ACTIVE,
89
S_RADIO_INACTIVE,
910
symbol,
11+
clearPrompt
1012
} from './common.js';
1113
import { limitOptions } from './limit-options.js';
1214

@@ -50,7 +52,7 @@ export type Option<Value> = Value extends Primitive
5052
hint?: string;
5153
};
5254

53-
export interface SelectOptions<Value> extends CommonOptions {
55+
export interface SelectOptions<Value> extends CommonPromptOptions {
5456
message: string;
5557
options: Option<Value>[];
5658
initialValue?: Value;
@@ -85,7 +87,7 @@ export const select = <Value>(opts: SelectOptions<Value>) => {
8587

8688
switch (this.state) {
8789
case 'submit':
88-
return `${title}${color.gray(S_BAR)} ${opt(this.options[this.cursor], 'selected')}`;
90+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)} ${opt(this.options[this.cursor], 'selected')}`;
8991
case 'cancel':
9092
return `${title}${color.gray(S_BAR)} ${opt(
9193
this.options[this.cursor],

packages/prompts/src/text.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { TextPrompt } from '@clack/core';
22
import color from 'picocolors';
3-
import { type CommonOptions, S_BAR, S_BAR_END, symbol } from './common.js';
3+
import { cursor } from "sisteransi";
4+
import { type CommonPromptOptions, S_BAR, S_BAR_END, symbol, clearPrompt } from './common.js';
45

5-
export interface TextOptions extends CommonOptions {
6+
export interface TextOptions extends CommonPromptOptions {
67
message: string;
78
placeholder?: string;
89
defaultValue?: string;
@@ -36,7 +37,7 @@ export const text = (opts: TextOptions) => {
3637
}
3738
case 'submit': {
3839
const valueText = value ? ` ${color.dim(value)}` : '';
39-
return `${title}${color.gray(S_BAR)}${valueText}`;
40+
return clearPrompt(opts) ? cursor.up() : `${title}${color.gray(S_BAR)}${valueText}`;
4041
}
4142
case 'cancel': {
4243
const valueText = value ? ` ${color.strikethrough(color.dim(value))}` : '';

0 commit comments

Comments
 (0)