Skip to content

Commit

Permalink
fix(ext/node): resolve exports even if parent module filename isn't p…
Browse files Browse the repository at this point in the history
…resent (#26553)

Fixes #26505

I'm not exactly sure how this case comes about (I tried to write tests
for it but couldn't manage to reproduce it), but what happens is the
parent filename ends up null, and we bail out of resolving the specifier
in package exports.

I've checked, and in node the parent filename is also null (so that's
not a bug on our part), but node continues to resolve even in that case.
So this PR should match node's behavior more closely than we currently
do.
  • Loading branch information
nathanwhit authored and bartlomieju committed Nov 5, 2024
1 parent d284d1c commit 68cee70
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 7 deletions.
8 changes: 6 additions & 2 deletions ext/node/ops/require.rs
Original file line number Diff line number Diff line change
Expand Up @@ -529,12 +529,16 @@ where
return Ok(None);
};

let referrer = Url::from_file_path(parent_path).unwrap();
let referrer = if parent_path.is_empty() {
None
} else {
Some(Url::from_file_path(parent_path).unwrap())
};
let r = node_resolver.package_exports_resolve(
&pkg.path,
&format!(".{expansion}"),
exports,
Some(&referrer),
referrer.as_ref(),
NodeModuleKind::Cjs,
REQUIRE_CONDITIONS,
NodeResolutionMode::Execution,
Expand Down
6 changes: 1 addition & 5 deletions ext/node/polyfills/01_require.js
Original file line number Diff line number Diff line change
Expand Up @@ -523,17 +523,13 @@ function resolveExports(
return;
}

if (!parentPath) {
return false;
}

return op_require_resolve_exports(
usesLocalNodeModulesDir,
modulesPath,
request,
name,
expansion,
parentPath,
parentPath ?? "",
) ?? false;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "@denotest/cjs-multiple-exports",
"version": "1.0.0",
"exports": {
".": "./src/index.js",
"./add": "./src/add.js"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = function add(a, b) {
return a + b;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
hello: "world"
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"tempDir": true,
"steps": [
{
"args": "install",
"output": "[WILDCARD]"
},
{
"args": "run -A main.cjs",
"output": "3\n"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
const path = require("node:path");
const Module = require("node:module");
function requireFromString(code, filename) {
const paths = Module._nodeModulePaths((0, path.dirname)(filename));
const m = new Module(filename, module.parent);
m.paths = paths;
m._compile(code, filename);
return m.exports;
}

const code = `
const add = require("@denotest/cjs-multiple-exports/add");
console.log(add(1, 2));
`;
requireFromString(code, "fake.js");
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"dependencies": {
"@denotest/cjs-multiple-exports": "1.0.0"
}
}

0 comments on commit 68cee70

Please sign in to comment.