From a01dce3a25e0bf671c6c21bd6ff57861be613087 Mon Sep 17 00:00:00 2001 From: snek Date: Thu, 19 Sep 2024 21:10:34 -0700 Subject: fix: cjs resolution cases (#25739) Fixes cjs modules being loaded as esm. --- cli/node.rs | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) (limited to 'cli/node.rs') diff --git a/cli/node.rs b/cli/node.rs index 766da1c01..a3cee8dde 100644 --- a/cli/node.rs +++ b/cli/node.rs @@ -16,6 +16,7 @@ use serde::Serialize; use crate::cache::CacheDBHash; use crate::cache::NodeAnalysisCache; +use crate::resolver::CliNodeResolver; use crate::util::fs::canonicalize_path_maybe_not_exists; pub type CliNodeCodeTranslator = @@ -54,11 +55,20 @@ pub enum CliCjsAnalysis { pub struct CliCjsCodeAnalyzer { cache: NodeAnalysisCache, fs: deno_fs::FileSystemRc, + node_resolver: Arc, } impl CliCjsCodeAnalyzer { - pub fn new(cache: NodeAnalysisCache, fs: deno_fs::FileSystemRc) -> Self { - Self { cache, fs } + pub fn new( + cache: NodeAnalysisCache, + fs: deno_fs::FileSystemRc, + node_resolver: Arc, + ) -> Self { + Self { + cache, + fs, + node_resolver, + } } async fn inner_cjs_analysis( @@ -73,7 +83,7 @@ impl CliCjsCodeAnalyzer { return Ok(analysis); } - let media_type = MediaType::from_specifier(specifier); + let mut media_type = MediaType::from_specifier(specifier); if media_type == MediaType::Json { return Ok(CliCjsAnalysis::Cjs { exports: vec![], @@ -81,6 +91,22 @@ impl CliCjsCodeAnalyzer { }); } + if media_type == MediaType::JavaScript { + if let Some(package_json) = + self.node_resolver.get_closest_package_json(specifier)? + { + match package_json.typ.as_str() { + "commonjs" => { + media_type = MediaType::Cjs; + } + "module" => { + media_type = MediaType::Mjs; + } + _ => {} + } + } + } + let analysis = deno_core::unsync::spawn_blocking({ let specifier = specifier.clone(); let source: Arc = source.into(); @@ -99,6 +125,13 @@ impl CliCjsCodeAnalyzer { exports: analysis.exports, reexports: analysis.reexports, }) + } else if media_type == MediaType::Cjs { + // FIXME: `deno_ast` should internally handle MediaType::Cjs implying that + // the result must never be Esm + Ok(CliCjsAnalysis::Cjs { + exports: vec![], + reexports: vec![], + }) } else { Ok(CliCjsAnalysis::Esm) } -- cgit v1.2.3