Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

module: Improves Top-Level await error in cjs #35196

Closed
wants to merge 1 commit into from

Conversation

bdougie
Copy link
Contributor

@bdougie bdougie commented Sep 14, 2020

Top-Level await is supported in ESM and not in cjs. The default error
the message is confusing. I provided a clearer one and opened this PR with a lot of help from @MylesBorins.

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • tests and/or benchmarks are included
  • documentation is changed or added
  • commit message follows commit guidelines

Top-Level await is support in esm and not in cjs. The default error
message is confusing.
@nodejs-github-bot
Copy link
Collaborator

Review requested:

  • @nodejs/modules

@nodejs-github-bot nodejs-github-bot added the tools Issues and PRs related to the tools directory. label Sep 14, 2020
@@ -3,6 +3,7 @@ lib/internal/v8_prof_polyfill.js
lib/punycode.js
test/addons/??_*
test/fixtures
test/message/cjs_top_await_error.js
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is here because eslint doesn't play well with top-level await yet.

Copy link
Contributor

@MylesBorins MylesBorins left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@MylesBorins
Copy link
Contributor

Thanks @bdougie! CI is locked down right now for a security release, but we'll get the full suite kicked off once we can.

@devsnek
Copy link
Member

devsnek commented Sep 14, 2020

this almost seems like it would be better to do upstream.

@bdougie
Copy link
Contributor Author

bdougie commented Sep 14, 2020

this almost seems like it would be better to do upstream.

@devsnek, can you expand on what you mean by upstream? Is there a better place for the message?

@devsnek
Copy link
Member

devsnek commented Sep 14, 2020

I mean changing this in V8 itself, instead of modifying the message in node.

@mscdex
Copy link
Contributor

mscdex commented Sep 15, 2020

I agree changing this in V8 would be a better solution than having to maintain a error message string check like this.

@MylesBorins
Copy link
Contributor

MylesBorins commented Sep 15, 2020

We already have done this once, catching and editing the message in the repl.

Improving this error in V8 is absolutely something we can do but it will likely have to wait until V8 itself unflags Top-Level Await.

In the mean time this seems like a significant improvement to the status quo with very little overhead

prior art:

https://github.com/nodejs/node/blob/master/lib/repl.js#L582-L591

@MylesBorins
Copy link
Contributor

It also worth mentioning that the replaced error message is specifically referencing common.js, a unique goal from the script goal. V8 would not land a message specific to the node runtime

@@ -1203,6 +1203,11 @@ function wrapSafe(filename, content, cjsModuleInstance) {
} catch (err) {
if (process.mainModule === cjsModuleInstance)
enrichCJSError(err);
if (err.message.includes('await is only valid in async function')) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what happens if you plug in this code:

function x() {
  await 1;
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/Users/mylesborins/code/node/main/lol.js:2
  await 1;
  ^^^^^

SyntaxError: Top-Level await is only supported in ESM.
    at wrapSafe (internal/modules/cjs/loader.js:1005:16)
    at Module._compile (internal/modules/cjs/loader.js:1058:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1115:10)
    at Module.load (internal/modules/cjs/loader.js:954:32)
    at Function.Module._load (internal/modules/cjs/loader.js:795:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47

Yeah, this is not good. Do you think there is a way to distinguish this without having to parse the entire file?

@targos
Copy link
Member

targos commented Sep 15, 2020

Top-level await is not specific to the node runtime, is it?
I agree that this would be better as an upstream change and maybe also easier to implement (to distinguish an attempt to use TLA vs await in a regular function)

@devsnek
Copy link
Member

devsnek commented Sep 15, 2020

https://chromium-review.googlesource.com/c/v8/v8/+/2411687

@MylesBorins
Copy link
Contributor

MylesBorins commented Sep 15, 2020

thanks for opening that @devsnek I can work with @bdougie on backporting if it lands 🎉

@devsnek
Copy link
Member

devsnek commented Sep 23, 2020

landed above as 4263f8a5e8e04a766aeb7cde0081da3ac6c12a9e in v8

@bdougie bdougie mentioned this pull request Oct 14, 2020
4 tasks
@MylesBorins
Copy link
Contributor

Closing in lieu of #35650

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
tools Issues and PRs related to the tools directory.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants