Comments (2)
Based on Prompts library code, I have made a minimal example of how this issue can be reproduced using only Node.
input
function here is a very rough analog of prompts
function configured to recieve text input.
On the third invocation of input
function there are the same issues mentioned in my first post - no keypress events are triggered before pressing Enter. Node 20.6.1.
const { stdin, stdout } = require('process');
const readline = require('readline');
const fetch = require('node-fetch');
// makes input stream emit 'keypress' events
function createReadline(is, keypress) {
const rl = readline.createInterface({
input: is,
escapeCodeTimeout: 50
});
readline.emitKeypressEvents(is, rl);
if (is.isTTY) {
is.setRawMode(true);
}
is.on('keypress', keypress);
// return a callback that stops emitting 'keypress' events and frees resources
return () => {
is.removeListener('keypress', keypress);
if (is.isTTY) {
is.setRawMode(false);
}
rl.close();
};
}
// determine what is needed to do for a key object sent by 'keypress' event
function getActionName(key) {
function needFinish(key) {
return (key.ctrl && ['c', 'd'].includes(key.name)) ||
key.name == 'escape' ||
['enter', 'return'].includes(key.name);
}
function doNothing(key) {
return ['backspace', 'delete', 'abort', 'escape', 'tab', 'pagedown', 'pageup',
'home', 'end', 'up', 'down', 'right', 'left'].includes(key.name) || key.ctrl;
}
if (doNothing(key)) {
return 'noop';
}
if (needFinish(key)) {
return 'finish';
}
return 'add-letter';
}
// listen to keypresses until user presses Enter, and then return concatenated letters
function input(is, os, onEndInput = () => undefined) {
return new Promise((resolve) => {
os.write('Enter string letter by letter, then press Enter\n');
let result = '';
const closeReadline = createReadline(is, keypress);
function keypress(_, key) {
os.write(`Encountered ${key.name}\n`)
const actionName = getActionName(key);
if (actionName == 'finish') {
endInput();
} else if (actionName == 'add-letter') {
result += key.name;
}
};
async function endInput() {
await onEndInput();
closeReadline();
resolve(result);
};
});
}
async function asyncAction() {
await fetch('https://jsonplaceholder.typicode.com/posts');
}
async function main() {
await input(stdin, stdout, asyncAction);
await input(stdin, stdout);
await input(stdin, stdout);
}
main();
from prompts.
Related Issues (20)
- missing type: `onRender` HOT 1
- Support Unicode characters
- Shift + Enter should not trigger submit for text input
- Confirm dialog appends yes message when aborted HOT 2
- Consider including TypeScript declaration files HOT 1
- How to test prompts in CircleCI?
- Select crashing in VsCode + Git Bash: Cannot read properties of undefined (reading 'split') HOT 2
- Multi-option toggle. Worth it?
- Ensure types are exported HOT 3
- How to cancel these unnecessary logs HOT 5
- logic diagram
- Ast prompts
- Roadmap for a 3.0 HOT 5
- prompts captures Ctrl-W "cut word" shortcut as control character
- How to make autocomplete required or select searchable?
- Add mask option to Text Type
- Somewhat different published module than the one in the repo HOT 2
- Bun support HOT 10
- confirm element: pressing a function key throws an error
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from prompts.