diff options
Diffstat (limited to 'cli/node.rs')
-rw-r--r-- | cli/node.rs | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/cli/node.rs b/cli/node.rs index cbe0aaaf1..5f0ecc653 100644 --- a/cli/node.rs +++ b/cli/node.rs @@ -1,15 +1,15 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. -use std::borrow::Cow; - -use deno_ast::CjsAnalysis; use deno_ast::MediaType; use deno_ast::ModuleSpecifier; use deno_core::error::AnyError; use deno_runtime::deno_fs; use deno_runtime::deno_node::analyze::CjsAnalysis as ExtNodeCjsAnalysis; +use deno_runtime::deno_node::analyze::CjsAnalysisExports; use deno_runtime::deno_node::analyze::CjsCodeAnalyzer; use deno_runtime::deno_node::analyze::NodeCodeTranslator; +use serde::Deserialize; +use serde::Serialize; use crate::cache::NodeAnalysisCache; use crate::util::fs::canonicalize_path_maybe_not_exists; @@ -35,6 +35,17 @@ pub fn resolve_specifier_into_node_modules( .unwrap_or_else(|| specifier.clone()) } +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub enum CliCjsAnalysis { + /// The module was found to be an ES module. + Esm, + /// The module was CJS. + Cjs { + exports: Vec<String>, + reexports: Vec<String>, + }, +} + pub struct CliCjsCodeAnalyzer { cache: NodeAnalysisCache, fs: deno_fs::FileSystemRc, @@ -49,7 +60,7 @@ impl CliCjsCodeAnalyzer { &self, specifier: &ModuleSpecifier, source: &str, - ) -> Result<CjsAnalysis, AnyError> { + ) -> Result<CliCjsAnalysis, AnyError> { let source_hash = NodeAnalysisCache::compute_source_hash(source); if let Some(analysis) = self .cache @@ -60,13 +71,13 @@ impl CliCjsCodeAnalyzer { let media_type = MediaType::from_specifier(specifier); if media_type == MediaType::Json { - return Ok(CjsAnalysis { + return Ok(CliCjsAnalysis::Cjs { exports: vec![], reexports: vec![], }); } - let parsed_source = deno_ast::parse_script(deno_ast::ParseParams { + let parsed_source = deno_ast::parse_program(deno_ast::ParseParams { specifier: specifier.clone(), text_info: deno_ast::SourceTextInfo::new(source.into()), media_type, @@ -74,7 +85,15 @@ impl CliCjsCodeAnalyzer { scope_analysis: false, maybe_syntax: None, })?; - let analysis = parsed_source.analyze_cjs(); + let analysis = if parsed_source.is_script() { + let analysis = parsed_source.analyze_cjs(); + CliCjsAnalysis::Cjs { + exports: analysis.exports, + reexports: analysis.reexports, + } + } else { + CliCjsAnalysis::Esm + }; self .cache .set_cjs_analysis(specifier.as_str(), &source_hash, &analysis); @@ -87,20 +106,23 @@ impl CjsCodeAnalyzer for CliCjsCodeAnalyzer { fn analyze_cjs( &self, specifier: &ModuleSpecifier, - source: Option<&str>, + source: Option<String>, ) -> Result<ExtNodeCjsAnalysis, AnyError> { let source = match source { - Some(source) => Cow::Borrowed(source), - None => Cow::Owned( - self - .fs - .read_text_file_sync(&specifier.to_file_path().unwrap())?, - ), + Some(source) => source, + None => self + .fs + .read_text_file_sync(&specifier.to_file_path().unwrap())?, }; let analysis = self.inner_cjs_analysis(specifier, &source)?; - Ok(ExtNodeCjsAnalysis { - exports: analysis.exports, - reexports: analysis.reexports, - }) + match analysis { + CliCjsAnalysis::Esm => Ok(ExtNodeCjsAnalysis::Esm(source)), + CliCjsAnalysis::Cjs { exports, reexports } => { + Ok(ExtNodeCjsAnalysis::Cjs(CjsAnalysisExports { + exports, + reexports, + })) + } + } } } |