diff options
| author | David Sherret <dsherret@users.noreply.github.com> | 2023-09-29 09:26:25 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-29 09:26:25 -0400 |
| commit | 5edd102f3f912a53c7bcad3b0fa4feb672ada323 (patch) | |
| tree | 2402b64e527bd859f3a2c71d3e96a89992002aa2 /cli/lsp | |
| parent | d43e48c4e96b02289d505cd2558ba85d7d6cb57b (diff) | |
refactor(cli): make `CliNpmResolver` a trait (#20732)
This makes `CliNpmResolver` a trait. The terminology used is:
- **managed** - Deno manages the node_modules folder and does an
auto-install (ex. `ManagedCliNpmResolver`)
- **byonm** - "Bring your own node_modules" (ex. `ByonmCliNpmResolver`,
which is in this PR, but unimplemented at the moment)
Part of #18967
Diffstat (limited to 'cli/lsp')
| -rw-r--r-- | cli/lsp/analysis.rs | 64 | ||||
| -rw-r--r-- | cli/lsp/diagnostics.rs | 1 | ||||
| -rw-r--r-- | cli/lsp/language_server.rs | 22 | ||||
| -rw-r--r-- | cli/lsp/tsc.rs | 1 |
4 files changed, 47 insertions, 41 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs index 1b11deca8..1f12fb76b 100644 --- a/cli/lsp/analysis.rs +++ b/cli/lsp/analysis.rs @@ -163,7 +163,7 @@ pub struct TsResponseImportMapper<'a> { documents: &'a Documents, maybe_import_map: Option<&'a ImportMap>, npm_resolution: &'a NpmResolution, - npm_resolver: &'a CliNpmResolver, + npm_resolver: &'a dyn CliNpmResolver, } impl<'a> TsResponseImportMapper<'a> { @@ -171,7 +171,7 @@ impl<'a> TsResponseImportMapper<'a> { documents: &'a Documents, maybe_import_map: Option<&'a ImportMap>, npm_resolution: &'a NpmResolution, - npm_resolver: &'a CliNpmResolver, + npm_resolver: &'a dyn CliNpmResolver, ) -> Self { Self { documents, @@ -198,39 +198,41 @@ impl<'a> TsResponseImportMapper<'a> { } } - if self.npm_resolver.in_npm_package(specifier) { - if let Ok(Some(pkg_id)) = - self.npm_resolver.resolve_pkg_id_from_specifier(specifier) - { - let pkg_reqs = - self.npm_resolution.resolve_pkg_reqs_from_pkg_id(&pkg_id); - // check if any pkg reqs match what is found in an import map - if !pkg_reqs.is_empty() { - let sub_path = self.resolve_package_path(specifier); - if let Some(import_map) = self.maybe_import_map { - for pkg_req in &pkg_reqs { - let paths = vec![ - concat_npm_specifier("npm:", pkg_req, sub_path.as_deref()), - concat_npm_specifier("npm:/", pkg_req, sub_path.as_deref()), - ]; - for path in paths { - if let Some(mapped_path) = ModuleSpecifier::parse(&path) - .ok() - .and_then(|s| import_map.lookup(&s, referrer)) - { - return Some(mapped_path); + if let Some(npm_resolver) = self.npm_resolver.as_managed() { + if npm_resolver.in_npm_package(specifier) { + if let Ok(Some(pkg_id)) = + npm_resolver.resolve_pkg_id_from_specifier(specifier) + { + let pkg_reqs = + self.npm_resolution.resolve_pkg_reqs_from_pkg_id(&pkg_id); + // check if any pkg reqs match what is found in an import map + if !pkg_reqs.is_empty() { + let sub_path = self.resolve_package_path(specifier); + if let Some(import_map) = self.maybe_import_map { + for pkg_req in &pkg_reqs { + let paths = vec![ + concat_npm_specifier("npm:", pkg_req, sub_path.as_deref()), + concat_npm_specifier("npm:/", pkg_req, sub_path.as_deref()), + ]; + for path in paths { + if let Some(mapped_path) = ModuleSpecifier::parse(&path) + .ok() + .and_then(|s| import_map.lookup(&s, referrer)) + { + return Some(mapped_path); + } } } } - } - // if not found in the import map, return the first pkg req - if let Some(pkg_req) = pkg_reqs.first() { - return Some(concat_npm_specifier( - "npm:", - pkg_req, - sub_path.as_deref(), - )); + // if not found in the import map, return the first pkg req + if let Some(pkg_req) = pkg_reqs.first() { + return Some(concat_npm_specifier( + "npm:", + pkg_req, + sub_path.as_deref(), + )); + } } } } diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index 183901fb0..9ec273d7f 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -38,7 +38,6 @@ use deno_graph::ResolutionError; use deno_graph::SpecifierError; use deno_lint::rules::LintRule; use deno_runtime::deno_node; -use deno_runtime::deno_node::NpmResolver; use deno_runtime::tokio_util::create_basic_runtime; use deno_semver::npm::NpmPackageReqReference; use deno_semver::package::PackageReq; diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 38d07fb52..9b3500361 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -105,6 +105,7 @@ use crate::lsp::urls::LspUrlKind; use crate::npm::create_npm_fs_resolver; use crate::npm::CliNpmRegistryApi; use crate::npm::CliNpmResolver; +use crate::npm::ManagedCliNpmResolver; use crate::npm::NpmCache; use crate::npm::NpmCacheDir; use crate::npm::NpmResolution; @@ -137,7 +138,7 @@ struct LspNpmServices { /// Npm resolution that is stored in memory. resolution: Arc<NpmResolution>, /// Resolver for npm packages. - resolver: Arc<CliNpmResolver>, + resolver: Arc<dyn CliNpmResolver>, } #[derive(Debug, PartialEq, Eq)] @@ -161,7 +162,7 @@ pub struct LanguageServer(Arc<tokio::sync::RwLock<Inner>>); #[derive(Debug)] pub struct StateNpmSnapshot { pub node_resolver: Arc<NodeResolver>, - pub npm_resolver: Arc<CliNpmResolver>, + pub npm_resolver: Arc<dyn CliNpmResolver>, } /// Snapshot of the state used by TSC. @@ -506,7 +507,7 @@ fn create_npm_resolver_and_resolution( npm_cache: Arc<NpmCache>, node_modules_dir_path: Option<PathBuf>, maybe_snapshot: Option<ValidSerializedNpmResolutionSnapshot>, -) -> (Arc<CliNpmResolver>, Arc<NpmResolution>) { +) -> (Arc<dyn CliNpmResolver>, Arc<NpmResolution>) { let resolution = Arc::new(NpmResolution::from_serialized( api, maybe_snapshot, @@ -525,7 +526,7 @@ fn create_npm_resolver_and_resolution( NpmSystemInfo::default(), ); ( - Arc::new(CliNpmResolver::new( + Arc::new(ManagedCliNpmResolver::new( fs, resolution.clone(), fs_resolver, @@ -802,7 +803,7 @@ impl Inner { self.config.maybe_lockfile().cloned(), )); let node_fs = Arc::new(deno_fs::RealFs); - let npm_resolver = Arc::new(CliNpmResolver::new( + let npm_resolver = Arc::new(ManagedCliNpmResolver::new( node_fs.clone(), npm_resolution.clone(), create_npm_fs_resolver( @@ -1440,8 +1441,13 @@ impl Inner { let package_reqs = self.documents.npm_package_reqs(); let npm_resolver = self.npm.resolver.clone(); // spawn to avoid the LSP's Send requirements - let handle = - spawn(async move { npm_resolver.set_package_reqs(&package_reqs).await }); + let handle = spawn(async move { + if let Some(npm_resolver) = npm_resolver.as_managed() { + npm_resolver.set_package_reqs(&package_reqs).await + } else { + Ok(()) + } + }); if let Err(err) = handle.await.unwrap() { lsp_warn!("Could not set npm package requirements. {:#}", err); } @@ -2156,7 +2162,7 @@ impl Inner { &self.documents, self.maybe_import_map.as_deref(), &self.npm.resolution, - &self.npm.resolver, + self.npm.resolver.as_ref(), ) } diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs index cf809408b..7999cb1df 100644 --- a/cli/lsp/tsc.rs +++ b/cli/lsp/tsc.rs @@ -49,7 +49,6 @@ use deno_core::JsRuntime; use deno_core::ModuleSpecifier; use deno_core::OpState; use deno_core::RuntimeOptions; -use deno_runtime::deno_node::NpmResolver; use deno_runtime::tokio_util::create_basic_runtime; use lazy_regex::lazy_regex; use log::error; |
