pirates icon indicating copy to clipboard operation
pirates copied to clipboard

node.js 12.2.0 breaks patching of `.mjs` files

Open coreyfarrell opened this issue 4 years ago • 4 comments

node -r @babel/register ./script.mjs worked in node.js 12.1.0 or below (as long as --experimental-modules was not passed to node). Since 12.2.0 this no longer works due to nodejs/node#27417. The problem is pirates now wraps a function which throws ERR_REQUIRE_ESM. It looks like the esm module calls require.extensions['.mjs']() if it exists and checks for the node.js core exception to know if it should wrap or replace the existing function. Maybe pirates could do something similar?

From @nicolo-ribaudo on https://babeljs.slack.com/:

We should overwrite that overwrite that hook as such:

  • If the file shouldn't be compiled by Babel, call the original hook (which will throw)
  • If the file is compiled by Babel and it's source type is still module, call the original hook
  • Otherwise, handle it like if it was a .js file

My idea is if the hooks do not transpile from ESM to CJS the original require.extensions['.js'] would throw a SyntaxError exception at which point the original require.extensions['.mjs'] could be called to throw ERR_REQUIRE_ESM?

CC @bcoe @jdalton

coreyfarrell avatar Sep 26 '19 18:09 coreyfarrell

We should probably loop @MylesBorins into this conversation as well, curious what his thoughts are.

bcoe avatar Sep 27 '19 04:09 bcoe

See also https://github.com/nodejs/modules/issues/389 for node.js 12.11.0. Looks like they plan to put that change behind the --experimental-modules flag but this is a delay rather than a reversal.

coreyfarrell avatar Sep 27 '19 15:09 coreyfarrell

The solution here is to use --experimental-loader instead.

vjpr avatar Sep 26 '21 00:09 vjpr

The solution here is to use --experimental-loader instead.

Could you elaborate, provide an example? Would illuminate your meaning/proposal.

AllTradesz avatar Nov 28 '21 15:11 AllTradesz