@inquirer/expand
Advanced tools
+3
-4
| { | ||
| "name": "@inquirer/expand", | ||
| "version": "5.0.8", | ||
| "version": "5.0.9", | ||
| "description": "Inquirer checkbox prompt", | ||
@@ -70,7 +70,6 @@ "keywords": [ | ||
| "dependencies": { | ||
| "@inquirer/core": "^11.1.5", | ||
| "@inquirer/core": "^11.1.6", | ||
| "@inquirer/type": "^4.0.3" | ||
| }, | ||
| "devDependencies": { | ||
| "@inquirer/testing": "^3.3.0", | ||
| "typescript": "^5.9.3" | ||
@@ -91,3 +90,3 @@ }, | ||
| "types": "./dist/index.d.ts", | ||
| "gitHead": "526eca2e64853510821ffd457561840ec0cbfb93" | ||
| "gitHead": "1ce03199b82b4a5fb6f7c97ce374c6da5087444f" | ||
| } |
| import { Separator, type Theme } from '@inquirer/core'; | ||
| import type { PartialDeep } from '@inquirer/type'; | ||
| type Key = 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'; | ||
| type Choice<Value> = { | ||
| key: Key; | ||
| value: Value; | ||
| } | { | ||
| key: Key; | ||
| name: string; | ||
| value: Value; | ||
| }; | ||
| declare const _default: <Value>(config: { | ||
| message: string; | ||
| choices: readonly { | ||
| key: Key; | ||
| name: string; | ||
| }[] | readonly (Separator | Choice<Value>)[]; | ||
| default?: (Key | "h") | undefined; | ||
| expanded?: boolean | undefined; | ||
| theme?: PartialDeep<Theme> | undefined; | ||
| }, context?: import("@inquirer/type").Context) => Promise<Value>; | ||
| export default _default; | ||
| export { Separator } from '@inquirer/core'; |
-108
| import { createPrompt, useMemo, useState, useKeypress, usePrefix, isEnterKey, makeTheme, Separator, } from '@inquirer/core'; | ||
| import { styleText } from 'node:util'; | ||
| function normalizeChoices(choices) { | ||
| return choices.map((choice) => { | ||
| if (Separator.isSeparator(choice)) { | ||
| return choice; | ||
| } | ||
| const name = 'name' in choice ? choice.name : String(choice.value); | ||
| const value = 'value' in choice ? choice.value : name; | ||
| return { | ||
| value: value, | ||
| name, | ||
| key: choice.key.toLowerCase(), | ||
| }; | ||
| }); | ||
| } | ||
| const helpChoice = { | ||
| key: 'h', | ||
| name: 'Help, list all options', | ||
| value: undefined, | ||
| }; | ||
| export default createPrompt((config, done) => { | ||
| const { default: defaultKey = 'h' } = config; | ||
| const choices = useMemo(() => normalizeChoices(config.choices), [config.choices]); | ||
| const [status, setStatus] = useState('idle'); | ||
| const [value, setValue] = useState(''); | ||
| const [expanded, setExpanded] = useState(config.expanded ?? false); | ||
| const [errorMsg, setError] = useState(); | ||
| const theme = makeTheme(config.theme); | ||
| const prefix = usePrefix({ theme, status }); | ||
| useKeypress((event, rl) => { | ||
| if (isEnterKey(event)) { | ||
| const answer = (value || defaultKey).toLowerCase(); | ||
| if (answer === 'h' && !expanded) { | ||
| setExpanded(true); | ||
| } | ||
| else { | ||
| const selectedChoice = choices.find((choice) => !Separator.isSeparator(choice) && choice.key === answer); | ||
| if (selectedChoice) { | ||
| setStatus('done'); | ||
| // Set the value as we might've selected the default one. | ||
| setValue(answer); | ||
| done(selectedChoice.value); | ||
| } | ||
| else if (value === '') { | ||
| setError('Please input a value'); | ||
| } | ||
| else { | ||
| setError(`"${styleText('red', value)}" isn't an available option`); | ||
| } | ||
| } | ||
| } | ||
| else { | ||
| setValue(rl.line); | ||
| setError(undefined); | ||
| } | ||
| }); | ||
| const message = theme.style.message(config.message, status); | ||
| if (status === 'done') { | ||
| // If the prompt is done, it's safe to assume there is a selected value. | ||
| const selectedChoice = choices.find((choice) => !Separator.isSeparator(choice) && choice.key === value.toLowerCase()); | ||
| return `${prefix} ${message} ${theme.style.answer(selectedChoice.name)}`; | ||
| } | ||
| const allChoices = expanded ? choices : [...choices, helpChoice]; | ||
| // Collapsed display style | ||
| let longChoices = ''; | ||
| let shortChoices = allChoices | ||
| .map((choice) => { | ||
| if (Separator.isSeparator(choice)) | ||
| return ''; | ||
| if (choice.key === defaultKey) { | ||
| return choice.key.toUpperCase(); | ||
| } | ||
| return choice.key; | ||
| }) | ||
| .join(''); | ||
| shortChoices = ` ${theme.style.defaultAnswer(shortChoices)}`; | ||
| // Expanded display style | ||
| if (expanded) { | ||
| shortChoices = ''; | ||
| longChoices = allChoices | ||
| .map((choice) => { | ||
| if (Separator.isSeparator(choice)) { | ||
| return ` ${choice.separator}`; | ||
| } | ||
| const line = ` ${choice.key}) ${choice.name}`; | ||
| if (choice.key === value.toLowerCase()) { | ||
| return theme.style.highlight(line); | ||
| } | ||
| return line; | ||
| }) | ||
| .join('\n'); | ||
| } | ||
| let helpTip = ''; | ||
| const currentOption = choices.find((choice) => !Separator.isSeparator(choice) && choice.key === value.toLowerCase()); | ||
| if (currentOption) { | ||
| helpTip = `${styleText('cyan', '>>')} ${currentOption.name}`; | ||
| } | ||
| let error = ''; | ||
| if (errorMsg) { | ||
| error = theme.style.error(errorMsg); | ||
| } | ||
| return [ | ||
| `${prefix} ${message}${shortChoices} ${value}`, | ||
| [longChoices, helpTip, error].filter(Boolean).join('\n'), | ||
| ]; | ||
| }); | ||
| export { Separator } from '@inquirer/core'; |
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
1
-50%6584
-42.9%3
-40%0
-100%1
Infinity%Updated