diff options
author | snek <snek@deno.com> | 2024-09-19 21:10:34 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-19 21:10:34 -0700 |
commit | a01dce3a25e0bf671c6c21bd6ff57861be613087 (patch) | |
tree | becb8a7c90e5a21e83c81160eec9d91e1281bc92 /cli | |
parent | f1ba26661346a83b6e7fe5e7ffeed4553a9571ae (diff) |
fix: cjs resolution cases (#25739)
Fixes cjs modules being loaded as esm.
Diffstat (limited to 'cli')
-rw-r--r-- | cli/factory.rs | 8 | ||||
-rw-r--r-- | cli/node.rs | 39 | ||||
-rw-r--r-- | cli/standalone/mod.rs | 19 | ||||
-rw-r--r-- | cli/worker.rs | 3 |
4 files changed, 55 insertions, 14 deletions
diff --git a/cli/factory.rs b/cli/factory.rs index 6d14475b2..0f49546d0 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -572,8 +572,12 @@ impl CliFactory { let caches = self.caches()?; let node_analysis_cache = NodeAnalysisCache::new(caches.node_analysis_db()); - let cjs_esm_analyzer = - CliCjsCodeAnalyzer::new(node_analysis_cache, self.fs().clone()); + let node_resolver = self.cli_node_resolver().await?.clone(); + let cjs_esm_analyzer = CliCjsCodeAnalyzer::new( + node_analysis_cache, + self.fs().clone(), + node_resolver, + ); Ok(Arc::new(NodeCodeTranslator::new( cjs_esm_analyzer, 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<CliNodeResolver>, } 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<CliNodeResolver>, + ) -> 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<str> = 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) } diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs index 1b1635d59..bab266734 100644 --- a/cli/standalone/mod.rs +++ b/cli/standalone/mod.rs @@ -580,8 +580,17 @@ pub async fn run( let cjs_resolutions = Arc::new(CjsResolutionStore::default()); let cache_db = Caches::new(deno_dir_provider.clone()); let node_analysis_cache = NodeAnalysisCache::new(cache_db.node_analysis_db()); - let cjs_esm_code_analyzer = - CliCjsCodeAnalyzer::new(node_analysis_cache, fs.clone()); + let cli_node_resolver = Arc::new(CliNodeResolver::new( + cjs_resolutions.clone(), + fs.clone(), + node_resolver.clone(), + npm_resolver.clone(), + )); + let cjs_esm_code_analyzer = CliCjsCodeAnalyzer::new( + node_analysis_cache, + fs.clone(), + cli_node_resolver.clone(), + ); let node_code_translator = Arc::new(NodeCodeTranslator::new( cjs_esm_code_analyzer, deno_runtime::deno_node::DenoFsNodeResolverEnv::new(fs.clone()), @@ -637,12 +646,6 @@ pub async fn run( metadata.workspace_resolver.pkg_json_resolution, ) }; - let cli_node_resolver = Arc::new(CliNodeResolver::new( - cjs_resolutions.clone(), - fs.clone(), - node_resolver.clone(), - npm_resolver.clone(), - )); let module_loader_factory = StandaloneModuleLoaderFactory { shared: Arc::new(SharedModuleLoaderState { eszip: WorkspaceEszip { diff --git a/cli/worker.rs b/cli/worker.rs index 78753bf22..6176398d5 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -526,7 +526,8 @@ impl CliMainWorkerFactory { let is_main_cjs = matches!(node_resolution, NodeResolution::CommonJs(_)); (node_resolution.into_url(), is_main_cjs) } else { - (main_module, false) + let is_cjs = main_module.path().ends_with(".cjs"); + (main_module, is_cjs) }; let ModuleLoaderAndSourceMapGetter { module_loader } = |