summaryrefslogtreecommitdiff
path: root/ext/node/polyfills/01_require.js
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-07-17 14:00:44 -0400
committerGitHub <noreply@github.com>2023-07-17 14:00:44 -0400
commit7a9f7f34195d74fe60eb48381bc2a32db741ceb7 (patch)
treec10516eda55afebb75f98bbfecd1cc555891e3ce /ext/node/polyfills/01_require.js
parent37241e9b1e2d16cd160d529e69c6a782fff8a8b4 (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.js32
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);