UNPKG

@teqed/interact-ibmi

Version:

Menus for interacting with IBMi AS400 using node-odbc.

60 lines (59 loc) 2.15 kB
/* eslint-disable unicorn/no-useless-undefined */ import { createPrompt, useState, useKeypress, // usePrefix, isEnterKey, isBackspaceKey, } from '@inquirer/core'; import chalk from 'chalk'; export default createPrompt((config, done) => { const [status, setStatus] = useState(`pending`); const [defaultValue, setDefaultValue] = useState(config.default); const [errorMessage, setError] = useState(undefined); const [value, setValue] = useState(``); // const isLoading = status === `loading`; // const prefix = usePrefix(isLoading); useKeypress(async (key, rl) => { // Ignore keypress while our prompt is doing other processing. if (status !== `pending`) { return; } if (isEnterKey(key)) { const answer = (value || defaultValue) ?? ``; setStatus(`loading`); const isValid = await config.validate(answer); if (isValid === true) { setValue(answer); setStatus(`done`); done(answer); } else { setValue(``); setError(isValid || `You must provide a valid value`); setStatus(`pending`); } } else if (isBackspaceKey(key) && !value) { setDefaultValue(undefined); } else { setValue(rl.line); setError(undefined); } }); const message = chalk.bold(config.message); let formattedValue = value; if (typeof config.transformer === `function`) { formattedValue = config.transformer(value, { isFinal: status === `done` }); } if (status === `done`) { formattedValue = chalk.cyan(formattedValue); } let defaultString = ``; if (defaultValue && status !== `done` && !value) { defaultString = chalk.dim(` (${defaultValue})`); } let error = ``; if (errorMessage) { error = chalk.red(`> ${errorMessage}`); } // return [`${prefix} ${message}${defaultString} ${formattedValue}`, error]; return [`${message}${defaultString} ${formattedValue}`, error]; });