diff --git a/cli/js/repl.ts b/cli/js/repl.ts index 79273ed338..f38324d118 100644 --- a/cli/js/repl.ts +++ b/cli/js/repl.ts @@ -49,11 +49,18 @@ let lastThrownError: Value = undefined; // Returns true if code is consumed (no error/irrecoverable error). // Returns false if error is recoverable function evaluate(code: string): boolean { - const [result, errInfo] = core.evalContext(code); + // each evalContext is a separate function body, and we want strict mode to + // work, so we should ensure that the code starts with "use strict" + const [result, errInfo] = core.evalContext(`"use strict";\n\n${code}`); if (!errInfo) { - lastEvalResult = result; + // when a function is eval'ed with just "use strict" sometimes the result + // is "use strict" which should be discarded + lastEvalResult = + typeof result === "string" && result === "use strict" + ? undefined + : result; if (!isCloseCalled()) { - replLog(result); + replLog(lastEvalResult); } } else if (errInfo.isCompileError && isRecoverableError(errInfo.thrown)) { // Recoverable compiler error diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs index 606a405169..f892b9a87d 100644 --- a/cli/tests/integration_tests.rs +++ b/cli/tests/integration_tests.rs @@ -693,6 +693,24 @@ fn repl_test_eof() { assert!(err.is_empty()); } +#[test] +fn repl_test_strict() { + let (_, err) = util::run_and_collect_output( + true, + "repl", + Some(vec![ + "let a = {};", + "Object.preventExtensions(a);", + "a.c = 1;", + ]), + None, + false, + ); + assert!(err.contains( + "Uncaught TypeError: Cannot add property c, object is not extensible" + )); +} + const REPL_MSG: &str = "exit using ctrl+d or close()\n"; #[test] diff --git a/deno_typescript/compiler_main.js b/deno_typescript/compiler_main.js index 31f539a275..847f3435f6 100644 --- a/deno_typescript/compiler_main.js +++ b/deno_typescript/compiler_main.js @@ -5,6 +5,8 @@ // understood by the TypeScript language service, so it allows type safety // checking in VSCode. +"use strict"; + const ASSETS = "$asset$"; /** diff --git a/deno_typescript/system_loader.js b/deno_typescript/system_loader.js index 0004d055d6..fdf1fa8723 100644 --- a/deno_typescript/system_loader.js +++ b/deno_typescript/system_loader.js @@ -2,6 +2,8 @@ // This is a specialised implementation of a System module loader. +"use strict"; + // @ts-nocheck /* eslint-disable */ let System, __instantiateAsync, __instantiate;