summaryrefslogtreecommitdiff
path: root/cli/node.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/node.rs')
-rw-r--r--cli/node.rs58
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,
+ }))
+ }
+ }
}
}