@effect/platform-node 0.33.5 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -9,21 +9,28 @@ const defaultShouldQuit = input => input.key.ctrl && (input.key.name === "c" ||
|
|
|
9
9
|
export const make = (shouldQuit = defaultShouldQuit) => Effect.gen(function* (_) {
|
|
10
10
|
const input = yield* _(Effect.sync(() => globalThis.process.stdin));
|
|
11
11
|
const output = yield* _(Effect.sync(() => globalThis.process.stdout));
|
|
12
|
-
// Acquire a
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
// Acquire a readline interface
|
|
13
|
+
const acquireReadlineInterface = Effect.sync(() => readline.createInterface({
|
|
14
|
+
input,
|
|
15
|
+
escapeCodeTimeout: 50
|
|
16
|
+
}));
|
|
17
|
+
// Uses the readline interface to force `stdin` to emit keypress events
|
|
18
|
+
const emitKeypressEvents = rl => {
|
|
19
19
|
readline.emitKeypressEvents(input, rl);
|
|
20
20
|
if (input.isTTY) {
|
|
21
21
|
input.setRawMode(true);
|
|
22
22
|
}
|
|
23
23
|
return rl;
|
|
24
|
+
};
|
|
25
|
+
// Close the `readline` interface
|
|
26
|
+
const releaseReadlineInterface = rl => Effect.sync(() => {
|
|
27
|
+
if (input.isTTY) {
|
|
28
|
+
input.setRawMode(false);
|
|
29
|
+
}
|
|
30
|
+
rl.close();
|
|
24
31
|
});
|
|
25
|
-
// Handle the `"keypress"` event emitted by `stdin` forced by
|
|
26
|
-
const handleKeypressEvent = Effect.async(resume => {
|
|
32
|
+
// Handle the `"keypress"` event emitted by `stdin` (forced by readline)
|
|
33
|
+
const handleKeypressEvent = input => Effect.async(resume => {
|
|
27
34
|
const handleKeypress = (input, key) => {
|
|
28
35
|
const userInput = {
|
|
29
36
|
input: Option.fromNullable(input),
|
|
@@ -45,14 +52,18 @@ export const make = (shouldQuit = defaultShouldQuit) => Effect.gen(function* (_)
|
|
|
45
52
|
input.removeListener("keypress", handleKeypress);
|
|
46
53
|
});
|
|
47
54
|
});
|
|
48
|
-
//
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
rl.
|
|
55
|
+
// Handle the `"line"` event emitted by the readline interface
|
|
56
|
+
const handleLineEvent = rl => Effect.async(resume => {
|
|
57
|
+
const handleLine = line => {
|
|
58
|
+
resume(Effect.succeed(line));
|
|
59
|
+
};
|
|
60
|
+
rl.on("line", handleLine);
|
|
61
|
+
return Effect.sync(() => {
|
|
62
|
+
rl.removeListener("line", handleLine);
|
|
63
|
+
});
|
|
54
64
|
});
|
|
55
|
-
const readInput = Effect.acquireUseRelease(acquireReadlineInterface, () => handleKeypressEvent, releaseReadlineInterface);
|
|
65
|
+
const readInput = Effect.acquireUseRelease(acquireReadlineInterface.pipe(Effect.map(emitKeypressEvents)), () => handleKeypressEvent(input), releaseReadlineInterface);
|
|
66
|
+
const readLine = Effect.acquireUseRelease(acquireReadlineInterface, rl => handleLineEvent(rl), releaseReadlineInterface);
|
|
56
67
|
const display = prompt => Effect.uninterruptible(Effect.async(resume => {
|
|
57
68
|
output.write(prompt, err => {
|
|
58
69
|
if (err) {
|
|
@@ -67,8 +78,9 @@ export const make = (shouldQuit = defaultShouldQuit) => Effect.gen(function* (_)
|
|
|
67
78
|
}));
|
|
68
79
|
return Terminal.Terminal.of({
|
|
69
80
|
// The columns property can be undefined if stdout was redirected
|
|
70
|
-
columns: output.columns || 0,
|
|
81
|
+
columns: Effect.sync(() => output.columns || 0),
|
|
71
82
|
readInput,
|
|
83
|
+
readLine,
|
|
72
84
|
display
|
|
73
85
|
});
|
|
74
86
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","names":["Error","Terminal","Effect","Layer","Option","readline","defaultShouldQuit","input","key","ctrl","name","make","shouldQuit","gen","_","sync","globalThis","process","stdin","output","stdout","acquireReadlineInterface","
|
|
1
|
+
{"version":3,"file":"terminal.js","names":["Error","Terminal","Effect","Layer","Option","readline","defaultShouldQuit","input","key","ctrl","name","make","shouldQuit","gen","_","sync","globalThis","process","stdin","output","stdout","acquireReadlineInterface","createInterface","escapeCodeTimeout","emitKeypressEvents","rl","isTTY","setRawMode","releaseReadlineInterface","close","handleKeypressEvent","async","resume","handleKeypress","userInput","fromNullable","meta","shift","fail","QuitException","succeed","once","removeListener","handleLineEvent","handleLine","line","on","readInput","acquireUseRelease","pipe","map","readLine","display","prompt","uninterruptible","write","err","BadArgument","module","method","message","String","unit","of","columns","layer","scoped"],"sources":["../../../src/internal/terminal.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/internal/terminal.js
CHANGED
|
@@ -40,21 +40,28 @@ const defaultShouldQuit = input => input.key.ctrl && (input.key.name === "c" ||
|
|
|
40
40
|
const make = (shouldQuit = defaultShouldQuit) => Effect.gen(function* (_) {
|
|
41
41
|
const input = yield* _(Effect.sync(() => globalThis.process.stdin));
|
|
42
42
|
const output = yield* _(Effect.sync(() => globalThis.process.stdout));
|
|
43
|
-
// Acquire a
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
43
|
+
// Acquire a readline interface
|
|
44
|
+
const acquireReadlineInterface = Effect.sync(() => readline.createInterface({
|
|
45
|
+
input,
|
|
46
|
+
escapeCodeTimeout: 50
|
|
47
|
+
}));
|
|
48
|
+
// Uses the readline interface to force `stdin` to emit keypress events
|
|
49
|
+
const emitKeypressEvents = rl => {
|
|
50
50
|
readline.emitKeypressEvents(input, rl);
|
|
51
51
|
if (input.isTTY) {
|
|
52
52
|
input.setRawMode(true);
|
|
53
53
|
}
|
|
54
54
|
return rl;
|
|
55
|
+
};
|
|
56
|
+
// Close the `readline` interface
|
|
57
|
+
const releaseReadlineInterface = rl => Effect.sync(() => {
|
|
58
|
+
if (input.isTTY) {
|
|
59
|
+
input.setRawMode(false);
|
|
60
|
+
}
|
|
61
|
+
rl.close();
|
|
55
62
|
});
|
|
56
|
-
// Handle the `"keypress"` event emitted by `stdin` forced by
|
|
57
|
-
const handleKeypressEvent = Effect.async(resume => {
|
|
63
|
+
// Handle the `"keypress"` event emitted by `stdin` (forced by readline)
|
|
64
|
+
const handleKeypressEvent = input => Effect.async(resume => {
|
|
58
65
|
const handleKeypress = (input, key) => {
|
|
59
66
|
const userInput = {
|
|
60
67
|
input: Option.fromNullable(input),
|
|
@@ -76,14 +83,18 @@ const make = (shouldQuit = defaultShouldQuit) => Effect.gen(function* (_) {
|
|
|
76
83
|
input.removeListener("keypress", handleKeypress);
|
|
77
84
|
});
|
|
78
85
|
});
|
|
79
|
-
//
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
rl.
|
|
86
|
+
// Handle the `"line"` event emitted by the readline interface
|
|
87
|
+
const handleLineEvent = rl => Effect.async(resume => {
|
|
88
|
+
const handleLine = line => {
|
|
89
|
+
resume(Effect.succeed(line));
|
|
90
|
+
};
|
|
91
|
+
rl.on("line", handleLine);
|
|
92
|
+
return Effect.sync(() => {
|
|
93
|
+
rl.removeListener("line", handleLine);
|
|
94
|
+
});
|
|
85
95
|
});
|
|
86
|
-
const readInput = Effect.acquireUseRelease(acquireReadlineInterface, () => handleKeypressEvent, releaseReadlineInterface);
|
|
96
|
+
const readInput = Effect.acquireUseRelease(acquireReadlineInterface.pipe(Effect.map(emitKeypressEvents)), () => handleKeypressEvent(input), releaseReadlineInterface);
|
|
97
|
+
const readLine = Effect.acquireUseRelease(acquireReadlineInterface, rl => handleLineEvent(rl), releaseReadlineInterface);
|
|
87
98
|
const display = prompt => Effect.uninterruptible(Effect.async(resume => {
|
|
88
99
|
output.write(prompt, err => {
|
|
89
100
|
if (err) {
|
|
@@ -98,8 +109,9 @@ const make = (shouldQuit = defaultShouldQuit) => Effect.gen(function* (_) {
|
|
|
98
109
|
}));
|
|
99
110
|
return Terminal.Terminal.of({
|
|
100
111
|
// The columns property can be undefined if stdout was redirected
|
|
101
|
-
columns: output.columns || 0,
|
|
112
|
+
columns: Effect.sync(() => output.columns || 0),
|
|
102
113
|
readInput,
|
|
114
|
+
readLine,
|
|
103
115
|
display
|
|
104
116
|
});
|
|
105
117
|
});
|
package/internal/terminal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","names":["Error","_interopRequireWildcard","require","Terminal","Effect","Layer","Option","readline","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","defaultShouldQuit","input","key","ctrl","name","make","shouldQuit","gen","_","sync","globalThis","process","stdin","output","stdout","acquireReadlineInterface","
|
|
1
|
+
{"version":3,"file":"terminal.js","names":["Error","_interopRequireWildcard","require","Terminal","Effect","Layer","Option","readline","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","defaultShouldQuit","input","key","ctrl","name","make","shouldQuit","gen","_","sync","globalThis","process","stdin","output","stdout","acquireReadlineInterface","createInterface","escapeCodeTimeout","emitKeypressEvents","rl","isTTY","setRawMode","releaseReadlineInterface","close","handleKeypressEvent","async","resume","handleKeypress","userInput","fromNullable","meta","shift","fail","QuitException","succeed","once","removeListener","handleLineEvent","handleLine","line","on","readInput","acquireUseRelease","pipe","map","readLine","display","prompt","uninterruptible","write","err","BadArgument","module","method","message","String","unit","of","columns","exports","layer","scoped"],"sources":["../src/internal/terminal.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/platform-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.0",
|
|
4
4
|
"description": "Unified interfaces for common platform-specific services",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"mime": "^3.0.0",
|
|
14
14
|
"multipasta": "^0.1.19",
|
|
15
|
-
"@effect/platform": "0.
|
|
15
|
+
"@effect/platform": "0.33.0"
|
|
16
16
|
},
|
|
17
17
|
"peerDependencies": {
|
|
18
|
-
"effect": "2.0.0-next.
|
|
18
|
+
"effect": "2.0.0-next.59"
|
|
19
19
|
},
|
|
20
20
|
"main": "./index.js",
|
|
21
21
|
"module": "./dist/esm/index.js",
|
package/src/internal/terminal.ts
CHANGED
|
@@ -16,40 +16,22 @@ export const make = (
|
|
|
16
16
|
const input = yield* _(Effect.sync(() => globalThis.process.stdin))
|
|
17
17
|
const output = yield* _(Effect.sync(() => globalThis.process.stdout))
|
|
18
18
|
|
|
19
|
-
// Acquire a
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
// Acquire a readline interface
|
|
20
|
+
const acquireReadlineInterface = Effect.sync(() =>
|
|
21
|
+
readline.createInterface({
|
|
22
|
+
input,
|
|
23
|
+
escapeCodeTimeout: 50
|
|
24
|
+
})
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
// Uses the readline interface to force `stdin` to emit keypress events
|
|
28
|
+
const emitKeypressEvents = (rl: readline.Interface): readline.Interface => {
|
|
23
29
|
readline.emitKeypressEvents(input, rl)
|
|
24
30
|
if (input.isTTY) {
|
|
25
31
|
input.setRawMode(true)
|
|
26
32
|
}
|
|
27
33
|
return rl
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Handle the `"keypress"` event emitted by `stdin` forced by `readline`
|
|
31
|
-
const handleKeypressEvent = Effect.async<never, Terminal.QuitException, Terminal.UserInput>((resume) => {
|
|
32
|
-
const handleKeypress = (input: string | undefined, key: readline.Key) => {
|
|
33
|
-
const userInput: Terminal.UserInput = {
|
|
34
|
-
input: Option.fromNullable(input),
|
|
35
|
-
key: {
|
|
36
|
-
name: key.name || "",
|
|
37
|
-
ctrl: key.ctrl || false,
|
|
38
|
-
meta: key.meta || false,
|
|
39
|
-
shift: key.shift || false
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
if (shouldQuit(userInput)) {
|
|
43
|
-
resume(Effect.fail(new Terminal.QuitException()))
|
|
44
|
-
} else {
|
|
45
|
-
resume(Effect.succeed(userInput))
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
input.once("keypress", handleKeypress)
|
|
49
|
-
return Effect.sync(() => {
|
|
50
|
-
input.removeListener("keypress", handleKeypress)
|
|
51
|
-
})
|
|
52
|
-
})
|
|
34
|
+
}
|
|
53
35
|
|
|
54
36
|
// Close the `readline` interface
|
|
55
37
|
const releaseReadlineInterface = (rl: readline.Interface) =>
|
|
@@ -60,9 +42,52 @@ export const make = (
|
|
|
60
42
|
rl.close()
|
|
61
43
|
})
|
|
62
44
|
|
|
45
|
+
// Handle the `"keypress"` event emitted by `stdin` (forced by readline)
|
|
46
|
+
const handleKeypressEvent = (input: typeof globalThis.process.stdin) =>
|
|
47
|
+
Effect.async<never, Terminal.QuitException, Terminal.UserInput>((resume) => {
|
|
48
|
+
const handleKeypress = (input: string | undefined, key: readline.Key) => {
|
|
49
|
+
const userInput: Terminal.UserInput = {
|
|
50
|
+
input: Option.fromNullable(input),
|
|
51
|
+
key: {
|
|
52
|
+
name: key.name || "",
|
|
53
|
+
ctrl: key.ctrl || false,
|
|
54
|
+
meta: key.meta || false,
|
|
55
|
+
shift: key.shift || false
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (shouldQuit(userInput)) {
|
|
59
|
+
resume(Effect.fail(new Terminal.QuitException()))
|
|
60
|
+
} else {
|
|
61
|
+
resume(Effect.succeed(userInput))
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
input.once("keypress", handleKeypress)
|
|
65
|
+
return Effect.sync(() => {
|
|
66
|
+
input.removeListener("keypress", handleKeypress)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// Handle the `"line"` event emitted by the readline interface
|
|
71
|
+
const handleLineEvent = (rl: readline.Interface) =>
|
|
72
|
+
Effect.async<never, Terminal.QuitException, string>((resume) => {
|
|
73
|
+
const handleLine = (line: string) => {
|
|
74
|
+
resume(Effect.succeed(line))
|
|
75
|
+
}
|
|
76
|
+
rl.on("line", handleLine)
|
|
77
|
+
return Effect.sync(() => {
|
|
78
|
+
rl.removeListener("line", handleLine)
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
|
|
63
82
|
const readInput = Effect.acquireUseRelease(
|
|
83
|
+
acquireReadlineInterface.pipe(Effect.map(emitKeypressEvents)),
|
|
84
|
+
() => handleKeypressEvent(input),
|
|
85
|
+
releaseReadlineInterface
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
const readLine = Effect.acquireUseRelease(
|
|
64
89
|
acquireReadlineInterface,
|
|
65
|
-
() =>
|
|
90
|
+
(rl) => handleLineEvent(rl),
|
|
66
91
|
releaseReadlineInterface
|
|
67
92
|
)
|
|
68
93
|
|
|
@@ -84,8 +109,9 @@ export const make = (
|
|
|
84
109
|
|
|
85
110
|
return Terminal.Terminal.of({
|
|
86
111
|
// The columns property can be undefined if stdout was redirected
|
|
87
|
-
columns: output.columns || 0,
|
|
112
|
+
columns: Effect.sync(() => output.columns || 0),
|
|
88
113
|
readInput,
|
|
114
|
+
readLine,
|
|
89
115
|
display
|
|
90
116
|
})
|
|
91
117
|
})
|