module: print better message on esm syntax error
Include the offending line in the output and underline the bad token. Before this commit, it printed "SyntaxError: Unexpected reserved word" without indicating where the syntax error is. Now it prints the line and underlines the offending token, like it does for syntax errors in CJS scripts. Minor changes are made to the test runner in order to support `*.mjs` files in test/message. Fixes: https://github.com/nodejs/node/issues/17277 PR-URL: https://github.com/nodejs/node/pull/17281 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Evan Lucas <evanlucas@me.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
This commit is contained in:
parent
6c47033024
commit
597b3d1941
@ -3,6 +3,7 @@ lib/internal/v8_prof_polyfill.js
|
||||
lib/punycode.js
|
||||
test/addons/??_*
|
||||
test/fixtures
|
||||
test/message/esm_display_syntax_error.mjs
|
||||
tools/eslint
|
||||
tools/icu
|
||||
tools/remark-*
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
const NativeModule = require('native_module');
|
||||
const util = require('util');
|
||||
const { decorateErrorStack } = require('internal/util');
|
||||
const internalModule = require('internal/module');
|
||||
const { getURLFromFilePath } = require('internal/url');
|
||||
const vm = require('vm');
|
||||
@ -474,6 +475,7 @@ Module._load = function(request, parent, isMain) {
|
||||
await ESMLoader.import(getURLFromFilePath(request).pathname);
|
||||
})()
|
||||
.catch((e) => {
|
||||
decorateErrorStack(e);
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
});
|
||||
|
@ -103,10 +103,18 @@ void ModuleWrap::New(const FunctionCallbackInfo<Value>& args) {
|
||||
False(isolate), // is opaque (?)
|
||||
False(isolate), // is WASM
|
||||
True(isolate)); // is ES6 module
|
||||
TryCatch try_catch(isolate);
|
||||
ScriptCompiler::Source source(source_text, origin);
|
||||
if (!ScriptCompiler::CompileModule(isolate, &source).ToLocal(&module))
|
||||
if (!ScriptCompiler::CompileModule(isolate, &source).ToLocal(&module)) {
|
||||
CHECK(try_catch.HasCaught());
|
||||
CHECK(!try_catch.Message().IsEmpty());
|
||||
CHECK(!try_catch.Exception().IsEmpty());
|
||||
AppendExceptionLine(env, try_catch.Exception(), try_catch.Message(),
|
||||
ErrorHandlingMode::MODULE_ERROR);
|
||||
try_catch.ReThrow();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Local<Object> that = args.This();
|
||||
Local<Context> context = that->CreationContext();
|
||||
|
@ -269,7 +269,7 @@ constexpr size_t arraysize(const T(&)[N]) { return N; }
|
||||
|
||||
bool IsExceptionDecorated(Environment* env, v8::Local<v8::Value> er);
|
||||
|
||||
enum ErrorHandlingMode { FATAL_ERROR, CONTEXTIFY_ERROR };
|
||||
enum ErrorHandlingMode { CONTEXTIFY_ERROR, FATAL_ERROR, MODULE_ERROR };
|
||||
void AppendExceptionLine(Environment* env,
|
||||
v8::Local<v8::Value> er,
|
||||
v8::Local<v8::Message> message,
|
||||
|
2
test/fixtures/es-module-loaders/syntax-error.mjs
vendored
Normal file
2
test/fixtures/es-module-loaders/syntax-error.mjs
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
'use strict';
|
||||
await async () => 0;
|
3
test/message/esm_display_syntax_error.mjs
Normal file
3
test/message/esm_display_syntax_error.mjs
Normal file
@ -0,0 +1,3 @@
|
||||
// Flags: --experimental-modules
|
||||
'use strict';
|
||||
await async () => 0;
|
7
test/message/esm_display_syntax_error.out
Normal file
7
test/message/esm_display_syntax_error.out
Normal file
@ -0,0 +1,7 @@
|
||||
(node:*) ExperimentalWarning: The ESM module loader is experimental.
|
||||
file:///*/test/message/esm_display_syntax_error.mjs:3
|
||||
await async () => 0;
|
||||
^^^^^
|
||||
SyntaxError: Unexpected reserved word
|
||||
at loaders.set (internal/loader/ModuleRequest.js:*:*)
|
||||
at <anonymous>
|
3
test/message/esm_display_syntax_error_module.mjs
Normal file
3
test/message/esm_display_syntax_error_module.mjs
Normal file
@ -0,0 +1,3 @@
|
||||
// Flags: --experimental-modules
|
||||
import '../common';
|
||||
import '../fixtures/es-module-loaders/syntax-error';
|
7
test/message/esm_display_syntax_error_module.out
Normal file
7
test/message/esm_display_syntax_error_module.out
Normal file
@ -0,0 +1,7 @@
|
||||
(node:*) ExperimentalWarning: The ESM module loader is experimental.
|
||||
file:///*/test/fixtures/es-module-loaders/syntax-error.mjs:2
|
||||
await async () => 0;
|
||||
^^^^^
|
||||
SyntaxError: Unexpected reserved word
|
||||
at loaders.set (internal/loader/ModuleRequest.js:*:*)
|
||||
at <anonymous>
|
@ -114,7 +114,8 @@ class MessageTestConfiguration(test.TestConfiguration):
|
||||
|
||||
def Ls(self, path):
|
||||
if isdir(path):
|
||||
return [f[:-3] for f in os.listdir(path) if f.endswith('.js')]
|
||||
return [f for f in os.listdir(path)
|
||||
if f.endswith('.js') or f.endswith('.mjs')]
|
||||
else:
|
||||
return []
|
||||
|
||||
@ -123,9 +124,8 @@ class MessageTestConfiguration(test.TestConfiguration):
|
||||
result = []
|
||||
for test in all_tests:
|
||||
if self.Contains(path, test):
|
||||
file_prefix = join(self.root, reduce(join, test[1:], ""))
|
||||
file_path = file_prefix + ".js"
|
||||
output_path = file_prefix + ".out"
|
||||
file_path = join(self.root, reduce(join, test[1:], ''))
|
||||
output_path = file_path[:file_path.rfind('.')] + '.out'
|
||||
if not exists(output_path):
|
||||
raise Exception("Could not find %s" % output_path)
|
||||
result.append(MessageTestCase(test, file_path, output_path,
|
||||
|
Loading…
x
Reference in New Issue
Block a user