diff --git a/Cargo.lock b/Cargo.lock index 5d899cd916..76b561c152 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1767,8 +1767,7 @@ dependencies = [ [[package]] name = "deno_graph" version = "0.87.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56d4eb4b7c81ae920b6d18c45a1866924f93110caee80bbbc362dc28143f2bb" +source = "git+https://github.com/denoland/deno_graph.git?rev=70ca7ebbb7fe9bb6cf35115ef9531aa58aadec55#70ca7ebbb7fe9bb6cf35115ef9531aa58aadec55" dependencies = [ "async-trait", "capacity_builder 0.5.0", diff --git a/Cargo.toml b/Cargo.toml index 6933acafba..0b91621304 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,10 @@ edition = "2021" license = "MIT" repository = "https://github.com/denoland/deno" +# TODO(nayeemrmn): Use proper version when https://github.com/denoland/deno_graph/pull/565 lands! +[patch.crates-io] +deno_graph = { git = "https://github.com/denoland/deno_graph.git", rev = "70ca7ebbb7fe9bb6cf35115ef9531aa58aadec55" } + [workspace.dependencies] deno_ast = { version = "=0.44.0", features = ["transpiling"] } deno_core = { version = "0.331.0" } diff --git a/cli/graph_util.rs b/cli/graph_util.rs index bb11a3a25c..963092d254 100644 --- a/cli/graph_util.rs +++ b/cli/graph_util.rs @@ -1,5 +1,6 @@ // Copyright 2018-2025 the Deno authors. MIT license. +use std::collections::BTreeMap; use std::error::Error; use std::path::PathBuf; use std::sync::Arc; @@ -854,14 +855,22 @@ impl ModuleGraphBuilder { &self, ) -> Result { - let jsx_import_source_config = self + let jsx_import_source_config_unscoped = self .cli_options .start_dir .to_maybe_jsx_import_source_config()?; + let mut jsx_import_source_config_by_scope = BTreeMap::default(); + for (dir_url, dir) in &self.cli_options.all_dirs { + let jsx_import_source_config_unscoped = + dir.to_maybe_jsx_import_source_config()?; + jsx_import_source_config_by_scope + .insert(dir_url.clone(), jsx_import_source_config_unscoped); + } Ok(CliGraphResolver { cjs_tracker: &self.cjs_tracker, resolver: &self.resolver, - jsx_import_source_config, + jsx_import_source_config_unscoped, + jsx_import_source_config_by_scope, }) } } @@ -1193,28 +1202,45 @@ fn format_deno_graph_error(err: &dyn Error) -> String { struct CliGraphResolver<'a> { cjs_tracker: &'a CliCjsTracker, resolver: &'a CliResolver, - jsx_import_source_config: Option, + jsx_import_source_config_unscoped: Option, + jsx_import_source_config_by_scope: + BTreeMap, Option>, } impl<'a> deno_graph::source::Resolver for CliGraphResolver<'a> { - fn default_jsx_import_source(&self) -> Option { + fn default_jsx_import_source( + &self, + referrer: &ModuleSpecifier, + ) -> Option { self - .jsx_import_source_config - .as_ref() + .jsx_import_source_config_by_scope + .iter() + .rfind(|(s, _)| referrer.as_str().starts_with(s.as_str())) + .map(|(_, c)| c.as_ref()) + .unwrap_or(self.jsx_import_source_config_unscoped.as_ref()) .and_then(|c| c.default_specifier.clone()) } - fn default_jsx_import_source_types(&self) -> Option { + fn default_jsx_import_source_types( + &self, + referrer: &ModuleSpecifier, + ) -> Option { self - .jsx_import_source_config - .as_ref() + .jsx_import_source_config_by_scope + .iter() + .rfind(|(s, _)| referrer.as_str().starts_with(s.as_str())) + .map(|(_, c)| c.as_ref()) + .unwrap_or(self.jsx_import_source_config_unscoped.as_ref()) .and_then(|c| c.default_types_specifier.clone()) } - fn jsx_import_source_module(&self) -> &str { + fn jsx_import_source_module(&self, referrer: &ModuleSpecifier) -> &str { self - .jsx_import_source_config - .as_ref() + .jsx_import_source_config_by_scope + .iter() + .rfind(|(s, _)| referrer.as_str().starts_with(s.as_str())) + .map(|(_, c)| c.as_ref()) + .unwrap_or(self.jsx_import_source_config_unscoped.as_ref()) .map(|c| c.module.as_str()) .unwrap_or(deno_graph::source::DEFAULT_JSX_IMPORT_SOURCE_MODULE) } diff --git a/cli/lsp/resolver.rs b/cli/lsp/resolver.rs index fd5ee654f5..cc768a4c0f 100644 --- a/cli/lsp/resolver.rs +++ b/cli/lsp/resolver.rs @@ -978,19 +978,25 @@ pub struct SingleReferrerGraphResolver<'a> { } impl<'a> deno_graph::source::Resolver for SingleReferrerGraphResolver<'a> { - fn default_jsx_import_source(&self) -> Option { + fn default_jsx_import_source( + &self, + _referrer: &ModuleSpecifier, + ) -> Option { self .jsx_import_source_config .and_then(|c| c.default_specifier.clone()) } - fn default_jsx_import_source_types(&self) -> Option { + fn default_jsx_import_source_types( + &self, + _referrer: &ModuleSpecifier, + ) -> Option { self .jsx_import_source_config .and_then(|c| c.default_types_specifier.clone()) } - fn jsx_import_source_module(&self) -> &str { + fn jsx_import_source_module(&self, _referrer: &ModuleSpecifier) -> &str { self .jsx_import_source_config .map(|c| c.module.as_str())