diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-07-17 14:00:44 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-17 14:00:44 -0400 |
commit | 7a9f7f34195d74fe60eb48381bc2a32db741ceb7 (patch) | |
tree | c10516eda55afebb75f98bbfecd1cc555891e3ce /ext/node/polyfills/01_require.js | |
parent | 37241e9b1e2d16cd160d529e69c6a782fff8a8b4 (diff) |
fix(node): improve require esm error messages (#19853)
Part of #19842.
Closes #19583
Closes #16913
Diffstat (limited to 'ext/node/polyfills/01_require.js')
-rw-r--r-- | ext/node/polyfills/01_require.js | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/ext/node/polyfills/01_require.js b/ext/node/polyfills/01_require.js index b27565a40..0fe75107d 100644 --- a/ext/node/polyfills/01_require.js +++ b/ext/node/polyfills/01_require.js @@ -879,7 +879,9 @@ Module.prototype.load = function (filename) { StringPrototypeEndsWith(filename, ".mjs") && !Module._extensions[".mjs"] ) { // TODO: use proper error class - throw new Error("require ESM", filename); + throw new Error( + requireEsmErrorText(filename, moduleParentCache.get(this)?.filename), + ); } Module._extensions[extension](this, filename); @@ -990,23 +992,29 @@ Module._extensions[".js"] = function (module, filename) { const content = ops.op_require_read_file(filename); if (StringPrototypeEndsWith(filename, ".js")) { - const pkg = ops.op_require_read_package_scope(filename); - if (pkg && pkg.exists && pkg.typ == "module") { - let message = `Trying to import ESM module: ${filename}`; - - if (module.parent) { - message += ` from ${module.parent.filename}`; - } - - message += ` using require()`; - - throw new Error(message); + const pkg = ops.op_require_read_closest_package_json(filename); + if (pkg && pkg.exists && pkg.typ === "module") { + throw new Error( + requireEsmErrorText(filename, moduleParentCache.get(module)?.filename), + ); } } module._compile(content, filename); }; +function requireEsmErrorText(filename, parent) { + let message = `[ERR_REQUIRE_ESM]: require() of ES Module ${filename}`; + + if (parent) { + message += ` from ${parent}`; + } + + message += + ` not supported. Instead change the require to a dynamic import() which is available in all CommonJS modules.`; + return message; +} + function stripBOM(content) { if (StringPrototypeCharCodeAt(content, 0) === 0xfeff) { content = StringPrototypeSlice(content, 1); |