diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-11-04 12:41:51 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-04 16:41:51 +0000 |
commit | e4c947dd2b63726ecc9b4303e03921b6839adade (patch) | |
tree | 9619bdb6649d1f460fb02ab8e448c27c95dbfa74 /cli/lsp/analysis.rs | |
parent | 0b75a7169b2e123cac04e7ffcaf16a28eb356fd0 (diff) |
fix(node): use closest package.json to resolve package.json imports (#21075)
Diffstat (limited to 'cli/lsp/analysis.rs')
-rw-r--r-- | cli/lsp/analysis.rs | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs index f8ace060a..e62294012 100644 --- a/cli/lsp/analysis.rs +++ b/cli/lsp/analysis.rs @@ -8,6 +8,7 @@ use super::tsc; use crate::npm::CliNpmResolver; use crate::tools::lint::create_linter; +use crate::util::path::specifier_to_file_path; use deno_ast::SourceRange; use deno_ast::SourceRangedForSpanned; @@ -20,9 +21,10 @@ use deno_core::serde_json; use deno_core::serde_json::json; use deno_core::ModuleSpecifier; use deno_lint::rules::LintRule; +use deno_runtime::deno_node::NodeResolver; use deno_runtime::deno_node::NpmResolver; -use deno_runtime::deno_node::PackageJson; use deno_runtime::deno_node::PathClean; +use deno_runtime::permissions::PermissionsContainer; use deno_semver::package::PackageReq; use import_map::ImportMap; use once_cell::sync::Lazy; @@ -161,6 +163,7 @@ fn code_as_string(code: &Option<lsp::NumberOrString>) -> String { pub struct TsResponseImportMapper<'a> { documents: &'a Documents, maybe_import_map: Option<&'a ImportMap>, + node_resolver: Option<&'a NodeResolver>, npm_resolver: Option<&'a dyn CliNpmResolver>, } @@ -168,11 +171,13 @@ impl<'a> TsResponseImportMapper<'a> { pub fn new( documents: &'a Documents, maybe_import_map: Option<&'a ImportMap>, + node_resolver: Option<&'a NodeResolver>, npm_resolver: Option<&'a dyn CliNpmResolver>, ) -> Self { Self { documents, maybe_import_map, + node_resolver, npm_resolver, } } @@ -249,18 +254,14 @@ impl<'a> TsResponseImportMapper<'a> { &self, specifier: &ModuleSpecifier, ) -> Option<String> { - let specifier_path = specifier.to_file_path().ok()?; - let root_folder = self - .npm_resolver - .as_ref() - .and_then(|r| r.resolve_package_folder_from_path(specifier).ok()) + let node_resolver = self.node_resolver?; + let package_json = node_resolver + .get_closest_package_json(specifier, &PermissionsContainer::allow_all()) + .ok() .flatten()?; - let package_json_path = root_folder.join("package.json"); - let package_json_text = std::fs::read_to_string(&package_json_path).ok()?; - let package_json = - PackageJson::load_from_string(package_json_path, package_json_text) - .ok()?; + let root_folder = package_json.path.parent()?; + let specifier_path = specifier_to_file_path(specifier).ok()?; let mut search_paths = vec![specifier_path.clone()]; // TypeScript will provide a .js extension for quick fixes, so do // a search for the .d.ts file instead @@ -271,7 +272,7 @@ impl<'a> TsResponseImportMapper<'a> { for search_path in search_paths { if let Some(exports) = &package_json.exports { if let Some(result) = try_reverse_map_package_json_exports( - &root_folder, + root_folder, &search_path, exports, ) { |