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/analysis.rs | |
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/analysis.rs')
-rw-r--r-- | cli/lsp/analysis.rs | 64 |
1 files changed, 33 insertions, 31 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(), + )); + } } } } |