summaryrefslogtreecommitdiff
path: root/cli/lsp/analysis.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-11-04 12:41:51 -0400
committerGitHub <noreply@github.com>2023-11-04 16:41:51 +0000
commite4c947dd2b63726ecc9b4303e03921b6839adade (patch)
tree9619bdb6649d1f460fb02ab8e448c27c95dbfa74 /cli/lsp/analysis.rs
parent0b75a7169b2e123cac04e7ffcaf16a28eb356fd0 (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.rs25
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,
) {