From ed450c4f22c49e635a4e543ee345d0a04b8c6398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Jakub=20Nani=C5=A1ta?= Date: Tue, 23 Jan 2024 16:51:15 -0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=AA=9A=20OApp=20config=20bootstrap:=20new?= =?UTF-8?q?=20prompts=20[4/N]=20(#236)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/lemon-monkeys-grab.md | 5 ++ packages/io-devtools/src/stdio/prompts.ts | 57 +++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 .changeset/lemon-monkeys-grab.md diff --git a/.changeset/lemon-monkeys-grab.md b/.changeset/lemon-monkeys-grab.md new file mode 100644 index 000000000..610c9b1ac --- /dev/null +++ b/.changeset/lemon-monkeys-grab.md @@ -0,0 +1,5 @@ +--- +"@layerzerolabs/io-devtools": patch +--- + +Add promptToSelectOne and promptToSelectMultiple utilities diff --git a/packages/io-devtools/src/stdio/prompts.ts b/packages/io-devtools/src/stdio/prompts.ts index bab716ced..854b99f2b 100644 --- a/packages/io-devtools/src/stdio/prompts.ts +++ b/packages/io-devtools/src/stdio/prompts.ts @@ -42,3 +42,60 @@ export const promptToContinue = async ( return value } + +export interface PromptOption { + title: string + description?: string + disabled?: boolean + selected?: boolean + value?: TValue +} + +interface SelectProps { + options: PromptOption[] + /** + * A message displayed to the user if they focus on a disabled value + */ + disabledHint?: string +} + +export const promptToSelectOne = async (message: string, { options }: SelectProps): Promise => { + const { value } = await prompts({ + type: 'select', + name: 'value', + message, + choices: options, + onState: handlePromptState, + }) + + return value +} + +interface MultiSelectProps extends SelectProps { + /** + * Minimum number of options to select + */ + min?: number + /** + * Maximum number of options to select + */ + max?: number +} + +export const promptToSelectMultiple = async ( + message: string, + { options, disabledHint, min, max }: MultiSelectProps +): Promise => { + const { value } = await prompts({ + type: 'autocompleteMultiselect', + name: 'value', + message, + choices: options, + onState: handlePromptState, + warn: disabledHint, + min, + max, + }) + + return value +}