greybel-js
Version:
Transpiler/Interpreter for GreyScript. (GreyHack)
66 lines (65 loc) • 2.21 kB
JavaScript
import { createPrompt, isBackspaceKey, isEnterKey, useKeypress, useState } from '@inquirer/core';
import chalk from 'chalk';
export const customInput = createPrompt((config, done) => {
const [status, setStatus] = useState('pending');
const [defaultValue, setDefaultValue] = useState(config.default);
const [errorMsg, setError] = useState(undefined);
const [value, setValue] = useState('');
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');
setValue(answer);
setStatus('done');
done(answer);
}
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 defaultStr = '';
if (defaultValue && status !== 'done' && !value) {
defaultStr = chalk.dim(` (${defaultValue})`);
}
let error = '';
if (errorMsg) {
error = chalk.red(`> ${errorMsg}`);
}
return [`${message}${defaultStr} ${formattedValue}`, error];
});
export const customPassword = (config, context) => {
if (config.transformer) {
throw new Error('Inquirer password prompt do not support custom transformer function. Use the input prompt instead.');
}
return customInput({
...config,
default: undefined,
transformer(input, { isFinal }) {
if (config.mask) {
return String(config.mask).repeat(input.length);
}
if (!isFinal) {
return chalk.dim('[input is masked]');
}
return '';
}
}, context);
};