From 938d2042923edb02caa0c03dfaf6f86e1640628a 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 00:12:06 +0100 Subject: [PATCH 1/2] select prompts: simplify option value types --- packages/prompts/src/index.ts | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/packages/prompts/src/index.ts b/packages/prompts/src/index.ts index 937409d6..87fa5021 100644 --- a/packages/prompts/src/index.ts +++ b/packages/prompts/src/index.ts @@ -177,16 +177,13 @@ interface Option { export interface SelectOptions[], Value extends Primitive> { message: string; options: Options; - initialValue?: Options[number]['value']; + initialValue?: Value; } export const select = [], Value extends Primitive>( opts: SelectOptions ) => { - const opt = ( - option: Options[number], - state: 'inactive' | 'active' | 'selected' | 'cancelled' - ) => { + const opt = (option: Option, state: 'inactive' | 'active' | 'selected' | 'cancelled') => { const label = option.label ?? String(option.value); if (state === 'active') { return `${color.green(S_RADIO_ACTIVE)} ${label} ${ @@ -221,14 +218,14 @@ export const select = [], Value extends Primitive> } } }, - }).prompt() as Promise; + }).prompt() as Promise; }; export const selectKey = [], Value extends string>( opts: SelectOptions ) => { const opt = ( - option: Options[number], + option: Option, state: 'inactive' | 'active' | 'selected' | 'cancelled' = 'inactive' ) => { const label = option.label ?? String(option.value); @@ -269,21 +266,21 @@ export const selectKey = [], Value extends string> } } }, - }).prompt() as Promise; + }).prompt() as Promise; }; export interface MultiSelectOptions[], Value extends Primitive> { message: string; options: Options; - initialValues?: Options[number]['value'][]; + initialValues?: Value[]; required?: boolean; - cursorAt?: Options[number]['value']; + cursorAt?: Value; } export const multiselect = [], Value extends Primitive>( opts: MultiSelectOptions ) => { const opt = ( - option: Options[number], + option: Option, state: 'inactive' | 'active' | 'selected' | 'active-selected' | 'submitted' | 'cancelled' ) => { const label = option.label ?? String(option.value); @@ -387,21 +384,21 @@ export const multiselect = [], Value extends Primi } } }, - }).prompt() as Promise; + }).prompt() as Promise; }; export interface GroupMultiSelectOptions[], Value extends Primitive> { message: string; options: Record; - initialValues?: Options[number]['value'][]; + initialValues?: Value[]; required?: boolean; - cursorAt?: Options[number]['value']; + cursorAt?: Value; } export const groupMultiselect = [], Value extends Primitive>( opts: GroupMultiSelectOptions ) => { const opt = ( - option: Options[number], + option: Option, state: | 'inactive' | 'active' @@ -411,7 +408,7 @@ export const groupMultiselect = [], Value extends | 'group-active-selected' | 'submitted' | 'cancelled', - options: Options[number][] = [] as any + options: Option[] = [] ) => { const label = option.label ?? String(option.value); const isItem = typeof (option as any).group === 'string'; @@ -531,7 +528,7 @@ export const groupMultiselect = [], Value extends } } }, - }).prompt() as Promise; + }).prompt() as Promise; }; const strip = (str: string) => str.replace(ansiRegex(), ''); 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 2/2] 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 = (