From ca08fb657f0597de3537bb4b29bd0c70f4965126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20L=C3=B6fgren?= <516549+ulken@users.noreply.github.com> Date: Sun, 26 Feb 2023 01:27:28 +0100 Subject: [PATCH] select prompts: support complex value types --- .changeset/olive-birds-brush.md | 5 +++++ packages/prompts/src/index.ts | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 .changeset/olive-birds-brush.md diff --git a/.changeset/olive-birds-brush.md b/.changeset/olive-birds-brush.md new file mode 100644 index 00000000..946bb969 --- /dev/null +++ b/.changeset/olive-birds-brush.md @@ -0,0 +1,5 @@ +--- +"@clack/prompts": patch +--- + +Support complex value types for `select`, `multiselect` and `groupMultiselect`. diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 87fa5021..d10f34ce 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -169,18 +169,18 @@ export const confirm = (opts: ConfirmOptions) => { }; type Primitive = Readonly; -interface Option { - value: Value; - label?: string; - hint?: string; -} -export interface SelectOptions[], Value extends Primitive> { + +type Option = Value extends Primitive + ? { value: Value; label?: string; hint?: string } + : { value: Value; label: string; hint?: string }; + +export interface SelectOptions[], Value> { message: string; options: Options; initialValue?: Value; } -export const select = [], Value extends Primitive>( +export const select = [], Value>( opts: SelectOptions ) => { const opt = (option: Option, state: 'inactive' | 'active' | 'selected' | 'cancelled') => { @@ -269,14 +269,14 @@ export const selectKey = [], Value extends string> }).prompt() as Promise; }; -export interface MultiSelectOptions[], Value extends Primitive> { +export interface MultiSelectOptions[], Value> { message: string; options: Options; initialValues?: Value[]; required?: boolean; cursorAt?: Value; } -export const multiselect = [], Value extends Primitive>( +export const multiselect = [], Value>( opts: MultiSelectOptions ) => { const opt = ( @@ -387,14 +387,14 @@ export const multiselect = [], Value extends Primi }).prompt() as Promise; }; -export interface GroupMultiSelectOptions[], Value extends Primitive> { +export interface GroupMultiSelectOptions[], Value> { message: string; options: Record; initialValues?: Value[]; required?: boolean; cursorAt?: Value; } -export const groupMultiselect = [], Value extends Primitive>( +export const groupMultiselect = [], Value>( opts: GroupMultiSelectOptions ) => { const opt = (