diff --git a/cli/js/repl.ts b/cli/js/repl.ts index 138b30c3e9..c84be68b1a 100644 --- a/cli/js/repl.ts +++ b/cli/js/repl.ts @@ -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; - replLog(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 { replLog("exit using ctrl+d or close()"); while (true) { + if (isCloseCalled()) { + quitRepl(0); + } + let code = ""; // Top level read try { diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs index 476a08224d..45c3a011f8 100644 --- a/cli/tests/integration_tests.rs +++ b/cli/tests/integration_tests.rs @@ -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()); }