index.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. const core_1 = require("@inquirer/core");
  7. const ansi_escapes_1 = __importDefault(require("ansi-escapes"));
  8. exports.default = (0, core_1.createPrompt)((config, done) => {
  9. const { validate = () => true } = config;
  10. const theme = (0, core_1.makeTheme)(config.theme);
  11. const [status, setStatus] = (0, core_1.useState)('idle');
  12. const [errorMsg, setError] = (0, core_1.useState)();
  13. const [value, setValue] = (0, core_1.useState)('');
  14. const prefix = (0, core_1.usePrefix)({ status, theme });
  15. (0, core_1.useKeypress)(async (key, rl) => {
  16. // Ignore keypress while our prompt is doing other processing.
  17. if (status !== 'idle') {
  18. return;
  19. }
  20. if ((0, core_1.isEnterKey)(key)) {
  21. const answer = value;
  22. setStatus('loading');
  23. const isValid = await validate(answer);
  24. if (isValid === true) {
  25. setValue(answer);
  26. setStatus('done');
  27. done(answer);
  28. }
  29. else {
  30. // Reset the readline line value to the previous value. On line event, the value
  31. // get cleared, forcing the user to re-enter the value instead of fixing it.
  32. rl.write(value);
  33. setError(isValid || 'You must provide a valid value');
  34. setStatus('idle');
  35. }
  36. }
  37. else {
  38. setValue(rl.line);
  39. setError(undefined);
  40. }
  41. });
  42. const message = theme.style.message(config.message, status);
  43. let formattedValue = '';
  44. let helpTip;
  45. if (config.mask) {
  46. const maskChar = typeof config.mask === 'string' ? config.mask : '*';
  47. formattedValue = maskChar.repeat(value.length);
  48. }
  49. else if (status !== 'done') {
  50. helpTip = `${theme.style.help('[input is masked]')}${ansi_escapes_1.default.cursorHide}`;
  51. }
  52. if (status === 'done') {
  53. formattedValue = theme.style.answer(formattedValue);
  54. }
  55. let error = '';
  56. if (errorMsg) {
  57. error = theme.style.error(errorMsg);
  58. }
  59. return [[prefix, message, config.mask ? formattedValue : helpTip].join(' '), error];
  60. });