From 13582ff3f2478f2e2cafa3042fc6aa96ae5049c5 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Tue, 29 Jan 2019 11:32:40 -0500 Subject: [PATCH] libdeno: improve exception handling --- libdeno/BUILD.gn | 2 + libdeno/binding.cc | 179 +++------------------- libdeno/exceptions.cc | 168 ++++++++++++++++++++ libdeno/exceptions.h | 15 ++ libdeno/internal.h | 6 + libdeno/libdeno_test.cc | 6 +- tests/async_error.ts.out | 2 +- tests/error_004_missing_module.ts.out | 2 +- tests/error_006_import_ext_failure.ts.out | 2 +- tests/error_007_any.ts.out | 2 +- tests/error_008_checkjs.js.out | 2 +- tests/error_009_missing_js_module.js.out | 2 +- tests/error_syntax.js.out | 2 +- 13 files changed, 220 insertions(+), 170 deletions(-) create mode 100644 libdeno/exceptions.cc create mode 100644 libdeno/exceptions.h diff --git a/libdeno/BUILD.gn b/libdeno/BUILD.gn index 695f22a7c5..4620dba387 100644 --- a/libdeno/BUILD.gn +++ b/libdeno/BUILD.gn @@ -47,6 +47,8 @@ v8_source_set("libdeno") { "api.cc", "binding.cc", "deno.h", + "exceptions.cc", + "exceptions.h", "file_util.cc", "file_util.h", "internal.h", diff --git a/libdeno/binding.cc b/libdeno/binding.cc index 495ed28ebe..effb2a979e 100644 --- a/libdeno/binding.cc +++ b/libdeno/binding.cc @@ -9,6 +9,7 @@ #include "third_party/v8/src/base/logging.h" #include "deno.h" +#include "exceptions.h" #include "internal.h" #define GLOBAL_IMPORT_BUF_SIZE 1024 @@ -43,10 +44,6 @@ v8::StartupData SerializeInternalFields(v8::Local holder, int index, return {payload, size}; } -DenoIsolate* FromIsolate(v8::Isolate* isolate) { - return static_cast(isolate->GetData(0)); -} - void AddDataRef(DenoIsolate* d, int32_t req_id, v8::Local data_v) { d->async_data_map_.emplace(std::piecewise_construct, std::make_tuple(req_id), std::make_tuple(d->isolate_, data_v)); @@ -66,155 +63,6 @@ const char* ToCString(const v8::String::Utf8Value& value) { return *value ? *value : ""; } -std::string EncodeExceptionAsJSON(v8::Local context, - v8::Local exception) { - auto* isolate = context->GetIsolate(); - v8::HandleScope handle_scope(isolate); - v8::Context::Scope context_scope(context); - - auto message = v8::Exception::CreateMessage(isolate, exception); - auto stack_trace = message->GetStackTrace(); - - // Encode the exception into a JS object, which we will then turn into JSON. - auto json_obj = v8::Object::New(isolate); - - auto exception_str = exception->ToString(context).ToLocalChecked(); - // Alternate and very similar string. Not sure which is appropriate. - // auto exception_str = message->Get(); - CHECK(json_obj->Set(context, v8_str("message"), exception_str).FromJust()); - - auto maybe_source_line = message->GetSourceLine(context); - if (!maybe_source_line.IsEmpty()) { - CHECK(json_obj - ->Set(context, v8_str("sourceLine"), - maybe_source_line.ToLocalChecked()) - .FromJust()); - } - - CHECK(json_obj - ->Set(context, v8_str("scriptResourceName"), - message->GetScriptResourceName()) - .FromJust()); - - auto maybe_line_number = message->GetLineNumber(context); - if (maybe_line_number.IsJust()) { - CHECK(json_obj - ->Set(context, v8_str("lineNumber"), - v8::Integer::New(isolate, maybe_line_number.FromJust())) - .FromJust()); - } - - CHECK(json_obj - ->Set(context, v8_str("startPosition"), - v8::Integer::New(isolate, message->GetStartPosition())) - .FromJust()); - - CHECK(json_obj - ->Set(context, v8_str("endPosition"), - v8::Integer::New(isolate, message->GetEndPosition())) - .FromJust()); - - CHECK(json_obj - ->Set(context, v8_str("errorLevel"), - v8::Integer::New(isolate, message->ErrorLevel())) - .FromJust()); - - auto maybe_start_column = message->GetStartColumn(context); - if (maybe_start_column.IsJust()) { - auto start_column = - v8::Integer::New(isolate, maybe_start_column.FromJust()); - CHECK( - json_obj->Set(context, v8_str("startColumn"), start_column).FromJust()); - } - - auto maybe_end_column = message->GetEndColumn(context); - if (maybe_end_column.IsJust()) { - auto end_column = v8::Integer::New(isolate, maybe_end_column.FromJust()); - CHECK(json_obj->Set(context, v8_str("endColumn"), end_column).FromJust()); - } - - CHECK(json_obj - ->Set(context, v8_str("isSharedCrossOrigin"), - v8::Boolean::New(isolate, message->IsSharedCrossOrigin())) - .FromJust()); - - CHECK(json_obj - ->Set(context, v8_str("isOpaque"), - v8::Boolean::New(isolate, message->IsOpaque())) - .FromJust()); - - v8::Local frames; - if (!stack_trace.IsEmpty()) { - uint32_t count = static_cast(stack_trace->GetFrameCount()); - frames = v8::Array::New(isolate, count); - - for (uint32_t i = 0; i < count; ++i) { - auto frame = stack_trace->GetFrame(isolate, i); - auto frame_obj = v8::Object::New(isolate); - CHECK(frames->Set(context, i, frame_obj).FromJust()); - auto line = v8::Integer::New(isolate, frame->GetLineNumber()); - auto column = v8::Integer::New(isolate, frame->GetColumn()); - CHECK(frame_obj->Set(context, v8_str("line"), line).FromJust()); - CHECK(frame_obj->Set(context, v8_str("column"), column).FromJust()); - CHECK(frame_obj - ->Set(context, v8_str("functionName"), frame->GetFunctionName()) - .FromJust()); - // scriptName can be empty in special conditions e.g. eval - auto scriptName = frame->GetScriptNameOrSourceURL(); - if (scriptName.IsEmpty()) { - scriptName = v8_str(""); - } - CHECK( - frame_obj->Set(context, v8_str("scriptName"), scriptName).FromJust()); - CHECK(frame_obj - ->Set(context, v8_str("isEval"), - v8::Boolean::New(isolate, frame->IsEval())) - .FromJust()); - CHECK(frame_obj - ->Set(context, v8_str("isConstructor"), - v8::Boolean::New(isolate, frame->IsConstructor())) - .FromJust()); - CHECK(frame_obj - ->Set(context, v8_str("isWasm"), - v8::Boolean::New(isolate, frame->IsWasm())) - .FromJust()); - } - } else { - // No stack trace. We only have one stack frame of info.. - frames = v8::Array::New(isolate, 1); - - auto frame_obj = v8::Object::New(isolate); - CHECK(frames->Set(context, 0, frame_obj).FromJust()); - - auto line = - v8::Integer::New(isolate, message->GetLineNumber(context).FromJust()); - auto column = - v8::Integer::New(isolate, message->GetStartColumn(context).FromJust()); - - CHECK(frame_obj->Set(context, v8_str("line"), line).FromJust()); - CHECK(frame_obj->Set(context, v8_str("column"), column).FromJust()); - CHECK(frame_obj - ->Set(context, v8_str("scriptName"), - message->GetScriptResourceName()) - .FromJust()); - } - - CHECK(json_obj->Set(context, v8_str("frames"), frames).FromJust()); - - auto json_string = v8::JSON::Stringify(context, json_obj).ToLocalChecked(); - v8::String::Utf8Value json_string_(isolate, json_string); - return std::string(ToCString(json_string_)); -} - -void HandleException(v8::Local context, - v8::Local exception) { - v8::Isolate* isolate = context->GetIsolate(); - DenoIsolate* d = FromIsolate(isolate); - std::string json_str = EncodeExceptionAsJSON(context, exception); - CHECK(d != nullptr); - d->last_exception_ = json_str; -} - void PromiseRejectCallback(v8::PromiseRejectMessage promise_reject_message) { auto* isolate = v8::Isolate::GetCurrent(); DenoIsolate* d = static_cast(isolate->GetData(0)); @@ -256,7 +104,7 @@ void Print(const v8::FunctionCallbackInfo& args) { CHECK_GE(args.Length(), 1); CHECK_LE(args.Length(), 3); auto* isolate = args.GetIsolate(); - DenoIsolate* d = FromIsolate(isolate); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); auto context = d->context_.Get(d->isolate_); v8::HandleScope handle_scope(isolate); v8::String::Utf8Value str(isolate, args[0]); @@ -329,7 +177,7 @@ static deno_buf GetContents(v8::Isolate* isolate, // Sets the recv_ callback. void Recv(const v8::FunctionCallbackInfo& args) { v8::Isolate* isolate = args.GetIsolate(); - DenoIsolate* d = FromIsolate(isolate); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); DCHECK_EQ(d->isolate_, isolate); v8::HandleScope handle_scope(isolate); @@ -348,7 +196,7 @@ void Recv(const v8::FunctionCallbackInfo& args) { void Send(const v8::FunctionCallbackInfo& args) { v8::Isolate* isolate = args.GetIsolate(); - DenoIsolate* d = FromIsolate(isolate); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); DCHECK_EQ(d->isolate_, isolate); v8::Locker locker(d->isolate_); @@ -401,7 +249,7 @@ v8::Local DenoIsolate::GetBuiltinModules() { void BuiltinModules(v8::Local property, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); - DenoIsolate* d = FromIsolate(isolate); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); DCHECK_EQ(d->isolate_, isolate); v8::Locker locker(d->isolate_); info.GetReturnValue().Set(d->GetBuiltinModules()); @@ -410,7 +258,7 @@ void BuiltinModules(v8::Local property, void Shared(v8::Local property, const v8::PropertyCallbackInfo& info) { v8::Isolate* isolate = info.GetIsolate(); - DenoIsolate* d = FromIsolate(isolate); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); DCHECK_EQ(d->isolate_, isolate); v8::Locker locker(d->isolate_); v8::EscapableHandleScope handle_scope(isolate); @@ -480,7 +328,7 @@ v8::MaybeLocal CompileModule(v8::Local context, if (!maybe_module.IsEmpty()) { auto module = maybe_module.ToLocalChecked(); CHECK_EQ(v8::Module::kUninstantiated, module->GetStatus()); - DenoIsolate* d = FromIsolate(isolate); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); d->RegisterModule(js_filename, module); } @@ -491,7 +339,7 @@ v8::MaybeLocal ResolveCallback(v8::Local context, v8::Local specifier, v8::Local referrer) { auto* isolate = context->GetIsolate(); - DenoIsolate* d = FromIsolate(isolate); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); v8::Isolate::Scope isolate_scope(isolate); v8::EscapableHandleScope handle_scope(isolate); @@ -702,6 +550,16 @@ void InitializeContext(v8::Isolate* isolate, v8::Local context) { .FromJust()); } +void MessageCallback(v8::Local message, + v8::Local data) { + auto* isolate = message->GetIsolate(); + DenoIsolate* d = static_cast(isolate->GetData(0)); + + v8::HandleScope handle_scope(isolate); + auto context = d->context_.Get(isolate); + HandleExceptionMessage(context, message); +} + void DenoIsolate::AddIsolate(v8::Isolate* isolate) { isolate_ = isolate; // Leaving this code here because it will probably be useful later on, but @@ -713,6 +571,7 @@ void DenoIsolate::AddIsolate(v8::Isolate* isolate) { true, 10, v8::StackTrace::kDetailed); isolate_->SetPromiseRejectCallback(deno::PromiseRejectCallback); isolate_->SetData(0, this); + isolate_->AddMessageListener(MessageCallback); } } // namespace deno diff --git a/libdeno/exceptions.cc b/libdeno/exceptions.cc new file mode 100644 index 0000000000..5b1e67b930 --- /dev/null +++ b/libdeno/exceptions.cc @@ -0,0 +1,168 @@ + +namespace deno { + +std::string EncodeMessageAsJSON(v8::Local context, + v8::Local message) { + auto* isolate = context->GetIsolate(); + v8::HandleScope handle_scope(isolate); + v8::Context::Scope context_scope(context); + + auto stack_trace = message->GetStackTrace(); + + // Encode the exception into a JS object, which we will then turn into JSON. + auto json_obj = v8::Object::New(isolate); + auto exception_str = message->Get(); + CHECK(json_obj->Set(context, v8_str("message"), exception_str).FromJust()); + + auto maybe_source_line = message->GetSourceLine(context); + if (!maybe_source_line.IsEmpty()) { + CHECK(json_obj + ->Set(context, v8_str("sourceLine"), + maybe_source_line.ToLocalChecked()) + .FromJust()); + } + + CHECK(json_obj + ->Set(context, v8_str("scriptResourceName"), + message->GetScriptResourceName()) + .FromJust()); + + auto maybe_line_number = message->GetLineNumber(context); + if (maybe_line_number.IsJust()) { + CHECK(json_obj + ->Set(context, v8_str("lineNumber"), + v8::Integer::New(isolate, maybe_line_number.FromJust())) + .FromJust()); + } + + CHECK(json_obj + ->Set(context, v8_str("startPosition"), + v8::Integer::New(isolate, message->GetStartPosition())) + .FromJust()); + + CHECK(json_obj + ->Set(context, v8_str("endPosition"), + v8::Integer::New(isolate, message->GetEndPosition())) + .FromJust()); + + CHECK(json_obj + ->Set(context, v8_str("errorLevel"), + v8::Integer::New(isolate, message->ErrorLevel())) + .FromJust()); + + auto maybe_start_column = message->GetStartColumn(context); + if (maybe_start_column.IsJust()) { + auto start_column = + v8::Integer::New(isolate, maybe_start_column.FromJust()); + CHECK( + json_obj->Set(context, v8_str("startColumn"), start_column).FromJust()); + } + + auto maybe_end_column = message->GetEndColumn(context); + if (maybe_end_column.IsJust()) { + auto end_column = v8::Integer::New(isolate, maybe_end_column.FromJust()); + CHECK(json_obj->Set(context, v8_str("endColumn"), end_column).FromJust()); + } + + CHECK(json_obj + ->Set(context, v8_str("isSharedCrossOrigin"), + v8::Boolean::New(isolate, message->IsSharedCrossOrigin())) + .FromJust()); + + CHECK(json_obj + ->Set(context, v8_str("isOpaque"), + v8::Boolean::New(isolate, message->IsOpaque())) + .FromJust()); + + v8::Local frames; + if (!stack_trace.IsEmpty()) { + uint32_t count = static_cast(stack_trace->GetFrameCount()); + frames = v8::Array::New(isolate, count); + + for (uint32_t i = 0; i < count; ++i) { + auto frame = stack_trace->GetFrame(isolate, i); + auto frame_obj = v8::Object::New(isolate); + CHECK(frames->Set(context, i, frame_obj).FromJust()); + auto line = v8::Integer::New(isolate, frame->GetLineNumber()); + auto column = v8::Integer::New(isolate, frame->GetColumn()); + CHECK(frame_obj->Set(context, v8_str("line"), line).FromJust()); + CHECK(frame_obj->Set(context, v8_str("column"), column).FromJust()); + CHECK(frame_obj + ->Set(context, v8_str("functionName"), frame->GetFunctionName()) + .FromJust()); + // scriptName can be empty in special conditions e.g. eval + auto scriptName = frame->GetScriptNameOrSourceURL(); + if (scriptName.IsEmpty()) { + scriptName = v8_str(""); + } + CHECK( + frame_obj->Set(context, v8_str("scriptName"), scriptName).FromJust()); + CHECK(frame_obj + ->Set(context, v8_str("isEval"), + v8::Boolean::New(isolate, frame->IsEval())) + .FromJust()); + CHECK(frame_obj + ->Set(context, v8_str("isConstructor"), + v8::Boolean::New(isolate, frame->IsConstructor())) + .FromJust()); + CHECK(frame_obj + ->Set(context, v8_str("isWasm"), + v8::Boolean::New(isolate, frame->IsWasm())) + .FromJust()); + } + } else { + // No stack trace. We only have one stack frame of info.. + frames = v8::Array::New(isolate, 1); + + auto frame_obj = v8::Object::New(isolate); + CHECK(frames->Set(context, 0, frame_obj).FromJust()); + + auto line = + v8::Integer::New(isolate, message->GetLineNumber(context).FromJust()); + auto column = + v8::Integer::New(isolate, message->GetStartColumn(context).FromJust()); + + CHECK(frame_obj->Set(context, v8_str("line"), line).FromJust()); + CHECK(frame_obj->Set(context, v8_str("column"), column).FromJust()); + CHECK(frame_obj + ->Set(context, v8_str("scriptName"), + message->GetScriptResourceName()) + .FromJust()); + } + + CHECK(json_obj->Set(context, v8_str("frames"), frames).FromJust()); + + auto json_string = v8::JSON::Stringify(context, json_obj).ToLocalChecked(); + v8::String::Utf8Value json_string_(isolate, json_string); + return std::string(ToCString(json_string_)); +} + +std::string EncodeExceptionAsJSON(v8::Local context, + v8::Local exception) { + auto* isolate = context->GetIsolate(); + v8::HandleScope handle_scope(isolate); + v8::Context::Scope context_scope(context); + + auto message = v8::Exception::CreateMessage(isolate, exception); + return EncodeMessageAsJSON(context, message); +} + +void HandleException(v8::Local context, + v8::Local exception) { + v8::Isolate* isolate = context->GetIsolate(); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); + std::string json_str = EncodeExceptionAsJSON(context, exception); + CHECK(d != nullptr); + d->last_exception_ = json_str; +} + +void HandleExceptionMessage(v8::Local context, + v8::Local message) { + v8::Isolate* isolate = context->GetIsolate(); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); + std::string json_str = EncodeMessageAsJSON(context, message); + CHECK(d != nullptr); + d->last_exception_ = json_str; +} + +} // namespace deno diff --git a/libdeno/exceptions.h b/libdeno/exceptions.h new file mode 100644 index 0000000000..fce70e3f31 --- /dev/null +++ b/libdeno/exceptions.h @@ -0,0 +1,15 @@ +#ifndef EXCEPTIONS_H_ +#define EXCEPTIONS_H_ + +#include "third_party/v8/include/v8.h" + +namespace deno { + +void HandleException(v8::Local context, + v8::Local exception); + +void HandleExceptionMessage(v8::Local context, + v8::Local message); +} // namespace deno + +#endif // EXCEPTIONS_H_ diff --git a/libdeno/internal.h b/libdeno/internal.h index 39e578e663..d1b9f1d96f 100644 --- a/libdeno/internal.h +++ b/libdeno/internal.h @@ -40,6 +40,10 @@ class DenoIsolate { delete array_buffer_allocator_; } + static inline DenoIsolate* FromIsolate(v8::Isolate* isolate) { + return static_cast(isolate->GetData(0)); + } + void AddIsolate(v8::Isolate* isolate); void RegisterModule(const char* filename, v8::Local module); void ResolveOk(const char* filename, const char* source); @@ -115,12 +119,14 @@ void Shared(v8::Local property, const v8::PropertyCallbackInfo& info); void BuiltinModules(v8::Local property, const v8::PropertyCallbackInfo& info); +void MessageCallback(v8::Local message, v8::Local data); static intptr_t external_references[] = { reinterpret_cast(Print), reinterpret_cast(Recv), reinterpret_cast(Send), reinterpret_cast(Shared), reinterpret_cast(BuiltinModules), + reinterpret_cast(MessageCallback), 0}; static const deno_buf empty_buf = {nullptr, 0, nullptr, 0}; diff --git a/libdeno/libdeno_test.cc b/libdeno/libdeno_test.cc index 18cafb2e8f..6036746638 100644 --- a/libdeno/libdeno_test.cc +++ b/libdeno/libdeno_test.cc @@ -173,7 +173,7 @@ TEST(LibDenoTest, GlobalErrorHandling) { Deno* d = deno_new(deno_config{0, snapshot, empty, nullptr, nullptr}); EXPECT_FALSE(deno_execute(d, nullptr, "a.js", "GlobalErrorHandling()")); std::string expected = - "{\"message\":\"ReferenceError: notdefined is not defined\"," + "{\"message\":\"Uncaught ReferenceError: notdefined is not defined\"," "\"sourceLine\":\" " "notdefined()\",\"scriptResourceName\":\"helloworld.js\"," "\"lineNumber\":3,\"startPosition\":3,\"endPosition\":4,\"errorLevel\":8," @@ -229,7 +229,7 @@ TEST(LibDenoTest, LastException) { EXPECT_EQ(deno_last_exception(d), nullptr); EXPECT_FALSE(deno_execute(d, nullptr, "a.js", "\n\nthrow Error('boo');\n\n")); EXPECT_STREQ(deno_last_exception(d), - "{\"message\":\"Error: boo\",\"sourceLine\":\"throw " + "{\"message\":\"Uncaught Error: boo\",\"sourceLine\":\"throw " "Error('boo');\",\"scriptResourceName\":\"a.js\",\"lineNumber\":" "3,\"startPosition\":8,\"endPosition\":9,\"errorLevel\":8," "\"startColumn\":6,\"endColumn\":7,\"isSharedCrossOrigin\":" @@ -245,7 +245,7 @@ TEST(LibDenoTest, EncodeErrorBug) { EXPECT_FALSE(deno_execute(d, nullptr, "a.js", "eval('a')")); EXPECT_STREQ( deno_last_exception(d), - "{\"message\":\"ReferenceError: a is not " + "{\"message\":\"Uncaught ReferenceError: a is not " "defined\",\"sourceLine\":\"a\",\"lineNumber\":1,\"startPosition\":0," "\"endPosition\":1,\"errorLevel\":8,\"startColumn\":0,\"endColumn\":1," "\"isSharedCrossOrigin\":false,\"isOpaque\":false,\"frames\":[{\"line\":" diff --git a/tests/async_error.ts.out b/tests/async_error.ts.out index a33abb4df9..4a2b78f6ce 100644 --- a/tests/async_error.ts.out +++ b/tests/async_error.ts.out @@ -4,6 +4,6 @@ world [WILDCARD]tests/async_error.ts:4:10 throw Error("error"); -Error: error +Uncaught Error: error at foo ([WILDCARD]tests/async_error.ts:4:9) at [WILDCARD]tests/async_error.ts:7:1 diff --git a/tests/error_004_missing_module.ts.out b/tests/error_004_missing_module.ts.out index cafc3c5adf..f2f4cd7955 100644 --- a/tests/error_004_missing_module.ts.out +++ b/tests/error_004_missing_module.ts.out @@ -1,6 +1,6 @@ Compiling [WILDCARD]tests/error_004_missing_module.ts [WILDCARD] -NotFound: Cannot resolve module "bad-module.ts" from "[WILDCARD]/tests/error_004_missing_module.ts" +Uncaught NotFound: Cannot resolve module "bad-module.ts" from "[WILDCARD]/tests/error_004_missing_module.ts" at DenoError ([WILDCARD]/js/errors.ts:[WILDCARD]) at maybeError ([WILDCARD]/js/errors.ts:[WILDCARD]) at maybeThrowError ([WILDCARD]/js/errors.ts:[WILDCARD]) diff --git a/tests/error_006_import_ext_failure.ts.out b/tests/error_006_import_ext_failure.ts.out index 01cc23274b..62c2998d68 100644 --- a/tests/error_006_import_ext_failure.ts.out +++ b/tests/error_006_import_ext_failure.ts.out @@ -1,6 +1,6 @@ Compiling [WILDCARD]tests/error_006_import_ext_failure.ts [WILDCARD] -NotFound: Cannot resolve module "./non-existent" from "[WILDCARD]/tests/error_006_import_ext_failure.ts" +Uncaught NotFound: Cannot resolve module "./non-existent" from "[WILDCARD]/tests/error_006_import_ext_failure.ts" at DenoError ([WILDCARD]/js/errors.ts:[WILDCARD]) at maybeError ([WILDCARD]/js/errors.ts:[WILDCARD]) at maybeThrowError ([WILDCARD]/js/errors.ts:[WILDCARD]) diff --git a/tests/error_007_any.ts.out b/tests/error_007_any.ts.out index 068b4b4748..f577d60707 100644 --- a/tests/error_007_any.ts.out +++ b/tests/error_007_any.ts.out @@ -1 +1 @@ -[WILDCARD][object Object] +[WILDCARD]Uncaught # diff --git a/tests/error_008_checkjs.js.out b/tests/error_008_checkjs.js.out index eb56aad172..6d899f9d6b 100644 --- a/tests/error_008_checkjs.js.out +++ b/tests/error_008_checkjs.js.out @@ -1,5 +1,5 @@ [WILDCARD]tests/error_008_checkjs.js:2:0 consol.log("hello world!"); -ReferenceError: consol is not defined +Uncaught ReferenceError: consol is not defined at [WILDCARD]tests/error_008_checkjs.js:2:1 diff --git a/tests/error_009_missing_js_module.js.out b/tests/error_009_missing_js_module.js.out index 1bcd9099ed..e0d8cce2ed 100644 --- a/tests/error_009_missing_js_module.js.out +++ b/tests/error_009_missing_js_module.js.out @@ -1 +1 @@ -NotFound: Cannot resolve module "./bad-module.js" from "[WILDCARD]/tests/error_009_missing_js_module.js" +Uncaught NotFound: Cannot resolve module "./bad-module.js" from "[WILDCARD]/tests/error_009_missing_js_module.js" diff --git a/tests/error_syntax.js.out b/tests/error_syntax.js.out index c7d2297021..a106b95d8d 100644 --- a/tests/error_syntax.js.out +++ b/tests/error_syntax.js.out @@ -1,4 +1,4 @@ [WILDCARD]tests/error_syntax.js:3:5 (the following is a syntax error ^^ ! ) -SyntaxError: Unexpected identifier +Uncaught SyntaxError: Unexpected identifier