From 2cb65a5af172077daead2410b9ec21e749e61e7a Mon Sep 17 00:00:00 2001 From: 0x5457 <0x5457@protonmail.com> Date: Sun, 17 May 2026 14:56:20 +0000 Subject: [PATCH] fix(deno_facade): allow non-MainModule resolution when referrer is "." --- .../test_cases/commonjs-require-esm/index.js | 7 ++++ .../commonjs-require-esm/message.mjs | 1 + .../commonjs-require-esm/package.json | 4 +++ crates/base/tests/integration_tests.rs | 19 +++++++++++ .../deno_facade/module_loader/standalone.rs | 32 +++++++++---------- 5 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 crates/base/test_cases/commonjs-require-esm/index.js create mode 100644 crates/base/test_cases/commonjs-require-esm/message.mjs create mode 100644 crates/base/test_cases/commonjs-require-esm/package.json diff --git a/crates/base/test_cases/commonjs-require-esm/index.js b/crates/base/test_cases/commonjs-require-esm/index.js new file mode 100644 index 000000000..4911de5dc --- /dev/null +++ b/crates/base/test_cases/commonjs-require-esm/index.js @@ -0,0 +1,7 @@ +const esm = require("./message.mjs"); + +if (esm.message !== "cjs require esm ok") { + throw new Error(`unexpected ESM value: ${esm.message}`); +} + +Deno.serve(() => new Response(esm.message)); diff --git a/crates/base/test_cases/commonjs-require-esm/message.mjs b/crates/base/test_cases/commonjs-require-esm/message.mjs new file mode 100644 index 000000000..0493c04ff --- /dev/null +++ b/crates/base/test_cases/commonjs-require-esm/message.mjs @@ -0,0 +1 @@ +export const message = "cjs require esm ok"; diff --git a/crates/base/test_cases/commonjs-require-esm/package.json b/crates/base/test_cases/commonjs-require-esm/package.json new file mode 100644 index 000000000..77b3fcd34 --- /dev/null +++ b/crates/base/test_cases/commonjs-require-esm/package.json @@ -0,0 +1,4 @@ +{ + "workspaces": [], + "type": "commonjs" +} diff --git a/crates/base/tests/integration_tests.rs b/crates/base/tests/integration_tests.rs index 4ab4188de..be801955f 100644 --- a/crates/base/tests/integration_tests.rs +++ b/crates/base/tests/integration_tests.rs @@ -3253,6 +3253,25 @@ async fn test_commonjs() { ); } +#[tokio::test] +#[serial] +async fn test_commonjs_require_esm() { + integration_test!( + "./test_cases/main", + NON_SECURE_PORT, + "commonjs-require-esm", + None, + None, + None, + (|resp| async { + let resp = resp.unwrap(); + assert_eq!(resp.status().as_u16(), 200); + assert_eq!(resp.text().await.unwrap().as_str(), "cjs require esm ok"); + }), + TerminationToken::new() + ); +} + #[tokio::test] #[serial] async fn test_commonjs_no_type_field_in_package_json() { diff --git a/crates/deno_facade/module_loader/standalone.rs b/crates/deno_facade/module_loader/standalone.rs index d6d757117..7a85d8b00 100644 --- a/crates/deno_facade/module_loader/standalone.rs +++ b/crates/deno_facade/module_loader/standalone.rs @@ -52,7 +52,6 @@ use deno::PermissionsContainer; use deno_config::workspace::MappedResolution; use deno_config::workspace::ResolverWorkspaceJsrPackage; use deno_config::workspace::WorkspaceResolver; -use deno_core::error::generic_error; use deno_core::error::type_error; use deno_core::error::AnyError; use deno_core::futures::FutureExt; @@ -148,28 +147,29 @@ pub struct EmbeddedModuleLoader { pub(crate) include_source_map: bool, } +fn resolve_standalone_referrer( + referrer: &str, + root_path: &Path, +) -> Result { + if referrer == "." { + return Ok(deno_core::resolve_path(".", root_path)?); + } + + ModuleSpecifier::parse(referrer).map_err(|err| { + type_error(format!("Referrer uses invalid specifier: {}", err)) + }) +} + impl ModuleLoader for EmbeddedModuleLoader { #[instrument(level = "debug", skip(self))] fn resolve( &self, specifier: &str, referrer: &str, - kind: ResolutionKind, + _kind: ResolutionKind, ) -> Result { - let referrer = if referrer == "." { - if kind != ResolutionKind::MainModule { - return Err(generic_error(format!( - "Expected to resolve main module, got {:?} instead.", - kind - ))); - } - - deno_core::resolve_path(".", &self.shared.root_path)? - } else { - ModuleSpecifier::parse(referrer).map_err(|err| { - type_error(format!("Referrer uses invalid specifier: {}", err)) - })? - }; + let referrer = + resolve_standalone_referrer(referrer, &self.shared.root_path)?; let referrer_kind = if self .shared .cjs_tracker