Skip to content

Commit

Permalink
select prompts: support complex value types
Browse files Browse the repository at this point in the history
  • Loading branch information
ulken committed Feb 26, 2023
1 parent 938d204 commit ca08fb6
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
5 changes: 5 additions & 0 deletions .changeset/olive-birds-brush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@clack/prompts": patch
---

Support complex value types for `select`, `multiselect` and `groupMultiselect`.
22 changes: 11 additions & 11 deletions packages/prompts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,18 +169,18 @@ export const confirm = (opts: ConfirmOptions) => {
};

type Primitive = Readonly<string | boolean | number>;
interface Option<Value extends Primitive> {
value: Value;
label?: string;
hint?: string;
}
export interface SelectOptions<Options extends Option<Value>[], Value extends Primitive> {

type Option<Value> = Value extends Primitive
? { value: Value; label?: string; hint?: string }
: { value: Value; label: string; hint?: string };

export interface SelectOptions<Options extends Option<Value>[], Value> {
message: string;
options: Options;
initialValue?: Value;
}

export const select = <Options extends Option<Value>[], Value extends Primitive>(
export const select = <Options extends Option<Value>[], Value>(
opts: SelectOptions<Options, Value>
) => {
const opt = (option: Option<Value>, state: 'inactive' | 'active' | 'selected' | 'cancelled') => {
Expand Down Expand Up @@ -269,14 +269,14 @@ export const selectKey = <Options extends Option<Value>[], Value extends string>
}).prompt() as Promise<Value | symbol>;
};

export interface MultiSelectOptions<Options extends Option<Value>[], Value extends Primitive> {
export interface MultiSelectOptions<Options extends Option<Value>[], Value> {
message: string;
options: Options;
initialValues?: Value[];
required?: boolean;
cursorAt?: Value;
}
export const multiselect = <Options extends Option<Value>[], Value extends Primitive>(
export const multiselect = <Options extends Option<Value>[], Value>(
opts: MultiSelectOptions<Options, Value>
) => {
const opt = (
Expand Down Expand Up @@ -387,14 +387,14 @@ export const multiselect = <Options extends Option<Value>[], Value extends Primi
}).prompt() as Promise<Value[] | symbol>;
};

export interface GroupMultiSelectOptions<Options extends Option<Value>[], Value extends Primitive> {
export interface GroupMultiSelectOptions<Options extends Option<Value>[], Value> {
message: string;
options: Record<string, Options>;
initialValues?: Value[];
required?: boolean;
cursorAt?: Value;
}
export const groupMultiselect = <Options extends Option<Value>[], Value extends Primitive>(
export const groupMultiselect = <Options extends Option<Value>[], Value>(
opts: GroupMultiSelectOptions<Options, Value>
) => {
const opt = (
Expand Down

0 comments on commit ca08fb6

Please sign in to comment.