index.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const core_1 = require("@inquirer/core");
  4. const inputTheme = {
  5. validationFailureMode: 'keep',
  6. };
  7. exports.default = (0, core_1.createPrompt)((config, done) => {
  8. const { required, validate = () => true } = config;
  9. const theme = (0, core_1.makeTheme)(inputTheme, config.theme);
  10. const [status, setStatus] = (0, core_1.useState)('idle');
  11. const [defaultValue = '', setDefaultValue] = (0, core_1.useState)(config.default);
  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 || defaultValue;
  22. setStatus('loading');
  23. const isValid = required && !answer ? 'You must provide a value' : await validate(answer);
  24. if (isValid === true) {
  25. setValue(answer);
  26. setStatus('done');
  27. done(answer);
  28. }
  29. else {
  30. if (theme.validationFailureMode === 'clear') {
  31. setValue('');
  32. }
  33. else {
  34. // Reset the readline line value to the previous value. On line event, the value
  35. // get cleared, forcing the user to re-enter the value instead of fixing it.
  36. rl.write(value);
  37. }
  38. setError(isValid || 'You must provide a valid value');
  39. setStatus('idle');
  40. }
  41. }
  42. else if ((0, core_1.isBackspaceKey)(key) && !value) {
  43. setDefaultValue(undefined);
  44. }
  45. else if (key.name === 'tab' && !value) {
  46. setDefaultValue(undefined);
  47. rl.clearLine(0); // Remove the tab character.
  48. rl.write(defaultValue);
  49. setValue(defaultValue);
  50. }
  51. else {
  52. setValue(rl.line);
  53. setError(undefined);
  54. }
  55. });
  56. const message = theme.style.message(config.message, status);
  57. let formattedValue = value;
  58. if (typeof config.transformer === 'function') {
  59. formattedValue = config.transformer(value, { isFinal: status === 'done' });
  60. }
  61. else if (status === 'done') {
  62. formattedValue = theme.style.answer(value);
  63. }
  64. let defaultStr;
  65. if (defaultValue && status !== 'done' && !value) {
  66. defaultStr = theme.style.defaultAnswer(defaultValue);
  67. }
  68. let error = '';
  69. if (errorMsg) {
  70. error = theme.style.error(errorMsg);
  71. }
  72. return [
  73. [prefix, message, defaultStr, formattedValue]
  74. .filter((v) => v !== undefined)
  75. .join(' '),
  76. error,
  77. ];
  78. });