mirror of
https://github.com/denoland/deno.git
synced 2024-11-22 15:06:54 -05:00
fix: REPL does not exit properly when close() is called (#5451)
This commit is contained in:
parent
1be7ec47ac
commit
cdc9323ccc
2 changed files with 17 additions and 2 deletions
|
@ -32,6 +32,13 @@ function isRecoverableError(e: Error): boolean {
|
|||
return recoverableErrorMessages.includes(e.message);
|
||||
}
|
||||
|
||||
// Returns `true` if `close()` is called in REPL.
|
||||
// We should quit the REPL when this function returns `true`.
|
||||
function isCloseCalled(): boolean {
|
||||
// @ts-ignore
|
||||
return globalThis.closed;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
type Value = any;
|
||||
|
||||
|
@ -45,7 +52,9 @@ function evaluate(code: string): boolean {
|
|||
const [result, errInfo] = core.evalContext(code);
|
||||
if (!errInfo) {
|
||||
lastEvalResult = result;
|
||||
if (!isCloseCalled()) {
|
||||
replLog(result);
|
||||
}
|
||||
} else if (errInfo.isCompileError && isRecoverableError(errInfo.thrown)) {
|
||||
// Recoverable compiler error
|
||||
return false; // don't consume code.
|
||||
|
@ -110,6 +119,10 @@ export async function replLoop(): Promise<void> {
|
|||
replLog("exit using ctrl+d or close()");
|
||||
|
||||
while (true) {
|
||||
if (isCloseCalled()) {
|
||||
quitRepl(0);
|
||||
}
|
||||
|
||||
let code = "";
|
||||
// Top level read
|
||||
try {
|
||||
|
|
|
@ -696,13 +696,15 @@ const REPL_MSG: &str = "exit using ctrl+d or close()\n";
|
|||
|
||||
#[test]
|
||||
fn repl_test_close_command() {
|
||||
let (_out, err) = util::run_and_collect_output(
|
||||
let (out, err) = util::run_and_collect_output(
|
||||
true,
|
||||
"repl",
|
||||
Some(vec!["close()", "'ignored'"]),
|
||||
None,
|
||||
false,
|
||||
);
|
||||
|
||||
assert!(!out.contains("ignored"));
|
||||
assert!(err.is_empty());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue