diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2024-07-01 22:08:32 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-01 22:08:32 +0100 |
commit | 38a6be2e8e68c662dd25abff62e6f440bd27fd77 (patch) | |
tree | f91b57b19f01241623d02a3656d939bb07ecf09c /cli/lsp/resolver.rs | |
parent | cd4a0072dc3a9c8783e0a864af9bd428552c2407 (diff) |
fix(lsp): respect lockfile redirects entries for resolution (#24365)
Diffstat (limited to 'cli/lsp/resolver.rs')
-rw-r--r-- | cli/lsp/resolver.rs | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/cli/lsp/resolver.rs b/cli/lsp/resolver.rs index 2568dc3a2..1ec93bab3 100644 --- a/cli/lsp/resolver.rs +++ b/cli/lsp/resolver.rs @@ -26,10 +26,12 @@ use dashmap::DashMap; use deno_ast::MediaType; use deno_cache_dir::HttpCache; use deno_core::error::AnyError; +use deno_core::parking_lot::Mutex; use deno_core::url::Url; use deno_graph::source::Resolver; use deno_graph::GraphImport; use deno_graph::ModuleSpecifier; +use deno_lockfile::Lockfile; use deno_npm::NpmSystemInfo; use deno_runtime::deno_fs; use deno_runtime::deno_node::NodeResolution; @@ -108,6 +110,7 @@ impl LspScopeResolver { ))); let redirect_resolver = Some(Arc::new(RedirectResolver::new( cache.for_specifier(config_data.map(|d| &d.scope)), + config_data.and_then(|d| d.lockfile.as_deref()), ))); let npm_graph_resolver = graph_resolver.create_graph_npm_resolver(); let graph_imports = config_data @@ -220,6 +223,10 @@ impl LspResolver { std::iter::once(&self.unscoped).chain(self.by_scope.values()) { resolver.jsr_resolver.as_ref().inspect(|r| r.did_cache()); + resolver + .redirect_resolver + .as_ref() + .inspect(|r| r.did_cache()); } } @@ -543,13 +550,36 @@ impl std::fmt::Debug for RedirectResolver { } impl RedirectResolver { - fn new(cache: Arc<dyn HttpCache>) -> Self { + fn new( + cache: Arc<dyn HttpCache>, + lockfile: Option<&Mutex<Lockfile>>, + ) -> Self { + let entries = DashMap::new(); + if let Some(lockfile) = lockfile { + for (source, destination) in &lockfile.lock().content.redirects { + let Ok(source) = ModuleSpecifier::parse(source) else { + continue; + }; + let Ok(destination) = ModuleSpecifier::parse(destination) else { + continue; + }; + entries.insert( + source, + Some(Arc::new(RedirectEntry { + headers: Default::default(), + target: destination.clone(), + destination: Some(destination.clone()), + })), + ); + entries.insert(destination, None); + } + } Self { get_headers: Box::new(move |specifier| { let cache_key = cache.cache_item_key(specifier).ok()?; cache.read_headers(&cache_key).ok().flatten() }), - entries: Default::default(), + entries, } } @@ -629,6 +659,10 @@ impl RedirectResolver { } result } + + fn did_cache(&self) { + self.entries.retain(|_, entry| entry.is_some()); + } } #[cfg(test)] |