index.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { createPrompt, useState, useKeypress, isEnterKey, usePrefix, makeTheme, } from '@inquirer/core';
  2. function getBooleanValue(value, defaultValue) {
  3. let answer = defaultValue !== false;
  4. if (/^(y|yes)/i.test(value))
  5. answer = true;
  6. else if (/^(n|no)/i.test(value))
  7. answer = false;
  8. return answer;
  9. }
  10. function boolToString(value) {
  11. return value ? 'Yes' : 'No';
  12. }
  13. export default createPrompt((config, done) => {
  14. const { transformer = boolToString } = config;
  15. const [status, setStatus] = useState('idle');
  16. const [value, setValue] = useState('');
  17. const theme = makeTheme(config.theme);
  18. const prefix = usePrefix({ status, theme });
  19. useKeypress((key, rl) => {
  20. if (isEnterKey(key)) {
  21. const answer = getBooleanValue(value, config.default);
  22. setValue(transformer(answer));
  23. setStatus('done');
  24. done(answer);
  25. }
  26. else if (key.name === 'tab') {
  27. const answer = boolToString(!getBooleanValue(value, config.default));
  28. rl.clearLine(0); // Remove the tab character.
  29. rl.write(answer);
  30. setValue(answer);
  31. }
  32. else {
  33. setValue(rl.line);
  34. }
  35. });
  36. let formattedValue = value;
  37. let defaultValue = '';
  38. if (status === 'done') {
  39. formattedValue = theme.style.answer(value);
  40. }
  41. else {
  42. defaultValue = ` ${theme.style.defaultAnswer(config.default === false ? 'y/N' : 'Y/n')}`;
  43. }
  44. const message = theme.style.message(config.message, status);
  45. return `${prefix} ${message}${defaultValue} ${formattedValue}`;
  46. });