summaryrefslogtreecommitdiff
path: root/cli/cache/parsed_source.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/cache/parsed_source.rs')
-rw-r--r--cli/cache/parsed_source.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/cli/cache/parsed_source.rs b/cli/cache/parsed_source.rs
index e956361f4..df6e45c35 100644
--- a/cli/cache/parsed_source.rs
+++ b/cli/cache/parsed_source.rs
@@ -5,6 +5,7 @@ use std::sync::Arc;
use deno_ast::MediaType;
use deno_ast::ModuleSpecifier;
+use deno_ast::ParseDiagnostic;
use deno_ast::ParsedSource;
use deno_core::parking_lot::Mutex;
use deno_graph::CapturingModuleParser;
@@ -149,3 +150,42 @@ impl deno_graph::ParsedSourceStore for ParsedSourceCache {
}
}
}
+
+pub struct EsmOrCjsChecker {
+ parsed_source_cache: Arc<ParsedSourceCache>,
+}
+
+impl EsmOrCjsChecker {
+ pub fn new(parsed_source_cache: Arc<ParsedSourceCache>) -> Self {
+ Self {
+ parsed_source_cache,
+ }
+ }
+
+ pub fn is_esm(
+ &self,
+ specifier: &ModuleSpecifier,
+ source: Arc<str>,
+ media_type: MediaType,
+ ) -> Result<bool, ParseDiagnostic> {
+ // todo(dsherret): add a file cache here to avoid parsing with swc on each run
+ let source = match self.parsed_source_cache.get_parsed_source(specifier) {
+ Some(source) => source.clone(),
+ None => {
+ let source = deno_ast::parse_program(deno_ast::ParseParams {
+ specifier: specifier.clone(),
+ text: source,
+ media_type,
+ capture_tokens: true, // capture because it's used for cjs export analysis
+ scope_analysis: false,
+ maybe_syntax: None,
+ })?;
+ self
+ .parsed_source_cache
+ .set_parsed_source(specifier.clone(), source.clone());
+ source
+ }
+ };
+ Ok(source.is_module())
+ }
+}