@effect/platform-node 0.33.4 → 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.
- package/dist/esm/internal/runtime.js +7 -1
- package/dist/esm/internal/runtime.js.map +1 -1
- package/dist/esm/internal/terminal.js +29 -17
- package/dist/esm/internal/terminal.js.map +1 -1
- package/internal/runtime.js +7 -1
- package/internal/runtime.js.map +1 -1
- package/internal/terminal.js +29 -17
- package/internal/terminal.js.map +1 -1
- package/package.json +3 -3
- package/src/internal/runtime.ts +9 -1
- package/src/internal/terminal.ts +57 -31
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { defaultTeardown } from "@effect/platform/Runtime";
|
|
2
|
+
import * as Cause from "effect/Cause";
|
|
2
3
|
import * as Effect from "effect/Effect";
|
|
3
4
|
import { equals } from "effect/Equal";
|
|
4
5
|
import * as Fiber from "effect/Fiber";
|
|
5
6
|
/** @internal */
|
|
6
7
|
export const runMain = (effect, teardown = defaultTeardown) => {
|
|
7
|
-
const fiber = Effect.runFork(effect
|
|
8
|
+
const fiber = Effect.runFork(Effect.tapErrorCause(effect, cause => {
|
|
9
|
+
if (Cause.isInterruptedOnly(cause)) {
|
|
10
|
+
return Effect.unit;
|
|
11
|
+
}
|
|
12
|
+
return Effect.logError(cause);
|
|
13
|
+
}));
|
|
8
14
|
fiber.addObserver(exit => teardown(exit, code => {
|
|
9
15
|
Effect.runCallback(interruptAll(fiber.id()), () => {
|
|
10
16
|
process.exit(code);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","names":["defaultTeardown","Effect","equals","Fiber","runMain","effect","teardown","fiber","runFork","addObserver","exit","code","runCallback","interruptAll","id","process","onSigint","removeListener","interruptAsFork","once","rootWithoutSelf","fiberIdWith","selfId","map","roots","filter","flatMap","length","
|
|
1
|
+
{"version":3,"file":"runtime.js","names":["defaultTeardown","Cause","Effect","equals","Fiber","runMain","effect","teardown","fiber","runFork","tapErrorCause","cause","isInterruptedOnly","unit","logError","addObserver","exit","code","runCallback","interruptAll","id","process","onSigint","removeListener","interruptAsFork","once","rootWithoutSelf","fiberIdWith","selfId","map","roots","filter","flatMap","length","interruptAllAs","postInterruptRoots"],"sources":["../../../src/internal/runtime.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,eAAe,QAAsB,0BAA0B;AACxE,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,SAASC,MAAM,QAAQ,cAAc;AACrC,OAAO,KAAKC,KAAK,MAAM,cAAc;AAGrC;AACA,OAAO,MAAMC,OAAO,GAAYA,CAC9BC,MAAkC,EAClCC,QAAQ,GAAGP,eAAe,KACxB;EACF,MAAMQ,KAAK,GAAGN,MAAM,CAACO,OAAO,CAC1BP,MAAM,CAACQ,aAAa,CAACJ,MAAM,EAAGK,KAAK,IAAI;IACrC,IAAIV,KAAK,CAACW,iBAAiB,CAACD,KAAK,CAAC,EAAE;MAClC,OAAOT,MAAM,CAACW,IAAI;IACpB;IACA,OAAOX,MAAM,CAACY,QAAQ,CAACH,KAAK,CAAC;EAC/B,CAAC,CAAC,CACH;EAEDH,KAAK,CAACO,WAAW,CAAEC,IAAI,IACrBT,QAAQ,CAACS,IAAI,EAAGC,IAAI,IAAI;IACtBf,MAAM,CAACgB,WAAW,CAACC,YAAY,CAACX,KAAK,CAACY,EAAE,EAAE,CAAC,EAAE,MAAK;MAChDC,OAAO,CAACL,IAAI,CAACC,IAAI,CAAC;IACpB,CAAC,CAAC;EACJ,CAAC,CAAC,CACH;EAED,SAASK,QAAQA,CAAA;IACfD,OAAO,CAACE,cAAc,CAAC,QAAQ,EAAED,QAAQ,CAAC;IAC1CD,OAAO,CAACE,cAAc,CAAC,SAAS,EAAED,QAAQ,CAAC;IAC3CpB,MAAM,CAACO,OAAO,CAACD,KAAK,CAACgB,eAAe,CAAChB,KAAK,CAACY,EAAE,EAAE,CAAC,CAAC;EACnD;EAEAC,OAAO,CAACI,IAAI,CAAC,QAAQ,EAAEH,QAAQ,CAAC;EAChCD,OAAO,CAACI,IAAI,CAAC,SAAS,EAAEH,QAAQ,CAAC;AACnC,CAAC;AAED,MAAMI,eAAe,gBAAGxB,MAAM,CAACyB,WAAW,CAAEC,MAAM,IAChD1B,MAAM,CAAC2B,GAAG,CAACzB,KAAK,CAAC0B,KAAK,EAAGA,KAAK,IAAKA,KAAK,CAACC,MAAM,CAAEvB,KAAK,IAAK,CAACL,MAAM,CAACK,KAAK,CAACY,EAAE,EAAE,EAAEQ,MAAM,CAAC,CAAC,CAAC,CACzF;AAED,MAAMT,YAAY,GAAIC,EAAmB,IACvClB,MAAM,CAAC8B,OAAO,CAACN,eAAe,EAAGI,KAAK,IAAI;EACxC,IAAIA,KAAK,CAACG,MAAM,KAAK,CAAC,EAAE;IACtB,OAAO/B,MAAM,CAACW,IAAI;EACpB;EACA,OAAOX,MAAM,CAAC8B,OAAO,CACnB5B,KAAK,CAAC8B,cAAc,CAACJ,KAAK,EAAEV,EAAE,CAAC,EAC/B,MACElB,MAAM,CAAC8B,OAAO,CACZN,eAAe,EACdS,kBAAkB,IAAKA,kBAAkB,CAACF,MAAM,GAAG,CAAC,GAAGd,YAAY,CAACC,EAAE,CAAC,GAAGlB,MAAM,CAACW,IAAI,CACvF,CACJ;AACH,CAAC,CAAC"}
|
|
@@ -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/runtime.js
CHANGED
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.runMain = void 0;
|
|
7
7
|
var _Runtime = /*#__PURE__*/require("@effect/platform/Runtime");
|
|
8
|
+
var Cause = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Cause"));
|
|
8
9
|
var Effect = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Effect"));
|
|
9
10
|
var _Equal = /*#__PURE__*/require("effect/Equal");
|
|
10
11
|
var Fiber = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Fiber"));
|
|
@@ -35,7 +36,12 @@ function _interopRequireWildcard(e, r) {
|
|
|
35
36
|
}
|
|
36
37
|
/** @internal */
|
|
37
38
|
const runMain = (effect, teardown = _Runtime.defaultTeardown) => {
|
|
38
|
-
const fiber = Effect.runFork(effect
|
|
39
|
+
const fiber = Effect.runFork(Effect.tapErrorCause(effect, cause => {
|
|
40
|
+
if (Cause.isInterruptedOnly(cause)) {
|
|
41
|
+
return Effect.unit;
|
|
42
|
+
}
|
|
43
|
+
return Effect.logError(cause);
|
|
44
|
+
}));
|
|
39
45
|
fiber.addObserver(exit => teardown(exit, code => {
|
|
40
46
|
Effect.runCallback(interruptAll(fiber.id()), () => {
|
|
41
47
|
process.exit(code);
|
package/internal/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","names":["_Runtime","require","
|
|
1
|
+
{"version":3,"file":"runtime.js","names":["_Runtime","require","Cause","_interopRequireWildcard","Effect","_Equal","Fiber","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","runMain","effect","teardown","defaultTeardown","fiber","runFork","tapErrorCause","cause","isInterruptedOnly","unit","logError","addObserver","exit","code","runCallback","interruptAll","id","process","onSigint","removeListener","interruptAsFork","once","exports","rootWithoutSelf","fiberIdWith","selfId","map","roots","filter","equals","flatMap","length","interruptAllAs","postInterruptRoots"],"sources":["../src/internal/runtime.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,QAAA,gBAAAC,OAAA;AACA,IAAAC,KAAA,gBAAAC,uBAAA,eAAAF,OAAA;AACA,IAAAG,MAAA,gBAAAD,uBAAA,eAAAF,OAAA;AACA,IAAAI,MAAA,gBAAAJ,OAAA;AACA,IAAAK,KAAA,gBAAAH,uBAAA,eAAAF,OAAA;AAAqC,SAAAM,yBAAAC,CAAA;EAAA,yBAAAC,OAAA;EAAA,IAAAC,CAAA,OAAAD,OAAA;IAAAE,CAAA,OAAAF,OAAA;EAAA,QAAAF,wBAAA,YAAAA,CAAAC,CAAA;IAAA,OAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA;EAAA,GAAAF,CAAA;AAAA;AAAA,SAAAL,wBAAAK,CAAA,EAAAE,CAAA;EAAA,KAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA;EAAA,aAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA;IAAAK,OAAA,EAAAL;EAAA;EAAA,IAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA;EAAA,IAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA;EAAA,IAAAQ,CAAA;MAAAC,SAAA;IAAA;IAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA;EAAA,SAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA;IAAA,IAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA;IAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA;EAAA;EAAA,OAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAAA;AAGrC;AACO,MAAMY,OAAO,GAAYA,CAC9BC,MAAkC,EAClCC,QAAQ,GAAG9B,QAAA,CAAA+B,eAAe,KACxB;EACF,MAAMC,KAAK,GAAG5B,MAAM,CAAC6B,OAAO,CAC1B7B,MAAM,CAAC8B,aAAa,CAACL,MAAM,EAAGM,KAAK,IAAI;IACrC,IAAIjC,KAAK,CAACkC,iBAAiB,CAACD,KAAK,CAAC,EAAE;MAClC,OAAO/B,MAAM,CAACiC,IAAI;IACpB;IACA,OAAOjC,MAAM,CAACkC,QAAQ,CAACH,KAAK,CAAC;EAC/B,CAAC,CAAC,CACH;EAEDH,KAAK,CAACO,WAAW,CAAEC,IAAI,IACrBV,QAAQ,CAACU,IAAI,EAAGC,IAAI,IAAI;IACtBrC,MAAM,CAACsC,WAAW,CAACC,YAAY,CAACX,KAAK,CAACY,EAAE,EAAE,CAAC,EAAE,MAAK;MAChDC,OAAO,CAACL,IAAI,CAACC,IAAI,CAAC;IACpB,CAAC,CAAC;EACJ,CAAC,CAAC,CACH;EAED,SAASK,QAAQA,CAAA;IACfD,OAAO,CAACE,cAAc,CAAC,QAAQ,EAAED,QAAQ,CAAC;IAC1CD,OAAO,CAACE,cAAc,CAAC,SAAS,EAAED,QAAQ,CAAC;IAC3C1C,MAAM,CAAC6B,OAAO,CAACD,KAAK,CAACgB,eAAe,CAAChB,KAAK,CAACY,EAAE,EAAE,CAAC,CAAC;EACnD;EAEAC,OAAO,CAACI,IAAI,CAAC,QAAQ,EAAEH,QAAQ,CAAC;EAChCD,OAAO,CAACI,IAAI,CAAC,SAAS,EAAEH,QAAQ,CAAC;AACnC,CAAC;AAAAI,OAAA,CAAAtB,OAAA,GAAAA,OAAA;AAED,MAAMuB,eAAe,gBAAG/C,MAAM,CAACgD,WAAW,CAAEC,MAAM,IAChDjD,MAAM,CAACkD,GAAG,CAAChD,KAAK,CAACiD,KAAK,EAAGA,KAAK,IAAKA,KAAK,CAACC,MAAM,CAAExB,KAAK,IAAK,CAAC,IAAA3B,MAAA,CAAAoD,MAAM,EAACzB,KAAK,CAACY,EAAE,EAAE,EAAES,MAAM,CAAC,CAAC,CAAC,CACzF;AAED,MAAMV,YAAY,GAAIC,EAAmB,IACvCxC,MAAM,CAACsD,OAAO,CAACP,eAAe,EAAGI,KAAK,IAAI;EACxC,IAAIA,KAAK,CAACI,MAAM,KAAK,CAAC,EAAE;IACtB,OAAOvD,MAAM,CAACiC,IAAI;EACpB;EACA,OAAOjC,MAAM,CAACsD,OAAO,CACnBpD,KAAK,CAACsD,cAAc,CAACL,KAAK,EAAEX,EAAE,CAAC,EAC/B,MACExC,MAAM,CAACsD,OAAO,CACZP,eAAe,EACdU,kBAAkB,IAAKA,kBAAkB,CAACF,MAAM,GAAG,CAAC,GAAGhB,YAAY,CAACC,EAAE,CAAC,GAAGxC,MAAM,CAACiC,IAAI,CACvF,CACJ;AACH,CAAC,CAAC"}
|
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/runtime.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defaultTeardown, type RunMain } from "@effect/platform/Runtime"
|
|
2
|
+
import * as Cause from "effect/Cause"
|
|
2
3
|
import * as Effect from "effect/Effect"
|
|
3
4
|
import { equals } from "effect/Equal"
|
|
4
5
|
import * as Fiber from "effect/Fiber"
|
|
@@ -9,7 +10,14 @@ export const runMain: RunMain = <E, A>(
|
|
|
9
10
|
effect: Effect.Effect<never, E, A>,
|
|
10
11
|
teardown = defaultTeardown
|
|
11
12
|
) => {
|
|
12
|
-
const fiber = Effect.runFork(
|
|
13
|
+
const fiber = Effect.runFork(
|
|
14
|
+
Effect.tapErrorCause(effect, (cause) => {
|
|
15
|
+
if (Cause.isInterruptedOnly(cause)) {
|
|
16
|
+
return Effect.unit
|
|
17
|
+
}
|
|
18
|
+
return Effect.logError(cause)
|
|
19
|
+
})
|
|
20
|
+
)
|
|
13
21
|
|
|
14
22
|
fiber.addObserver((exit) =>
|
|
15
23
|
teardown(exit, (code) => {
|
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
|
})
|