Skip to content

Commit 3bf147f

Browse files
authored
refactor: decouple node resolution from deno_core (#24724)
1 parent 0cf7f26 commit 3bf147f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+934
-513
lines changed

Cargo.lock

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ members = [
2121
"ext/napi",
2222
"ext/net",
2323
"ext/node",
24+
"ext/node_resolver",
2425
"ext/url",
2526
"ext/web",
2627
"ext/webgpu",
@@ -83,6 +84,7 @@ deno_webgpu = { version = "0.129.0", path = "./ext/webgpu" }
8384
deno_webidl = { version = "0.162.0", path = "./ext/webidl" }
8485
deno_websocket = { version = "0.167.0", path = "./ext/websocket" }
8586
deno_webstorage = { version = "0.157.0", path = "./ext/webstorage" }
87+
node_resolver = { version = "0.1.0", path = "./ext/node_resolver" }
8688

8789
aes = "=0.8.3"
8890
anyhow = "1.0.57"

cli/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ deno_task_shell = "=0.17.0"
8080
deno_terminal.workspace = true
8181
eszip = "=0.72.2"
8282
napi_sym.workspace = true
83+
node_resolver.workspace = true
8384

8485
async-trait.workspace = true
8586
base32.workspace = true

cli/args/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -820,9 +820,7 @@ impl CliOptions {
820820
WorkspaceDiscoverOptions {
821821
fs: Default::default(), // use real fs
822822
deno_json_cache: None,
823-
pkg_json_cache: Some(
824-
&deno_runtime::deno_node::PackageJsonThreadLocalCache,
825-
),
823+
pkg_json_cache: Some(&node_resolver::PackageJsonThreadLocalCache),
826824
workspace_cache: None,
827825
config_parse_options,
828826
additional_config_file_names,

cli/factory.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,14 @@ use deno_core::futures::FutureExt;
6262
use deno_core::FeatureChecker;
6363

6464
use deno_runtime::deno_fs;
65-
use deno_runtime::deno_node::analyze::NodeCodeTranslator;
65+
use deno_runtime::deno_node::DenoFsNodeResolverEnv;
6666
use deno_runtime::deno_node::NodeResolver;
6767
use deno_runtime::deno_tls::rustls::RootCertStore;
6868
use deno_runtime::deno_tls::RootCertStoreProvider;
6969
use deno_runtime::deno_web::BlobStore;
7070
use deno_runtime::inspector_server::InspectorServer;
7171
use log::warn;
72+
use node_resolver::analyze::NodeCodeTranslator;
7273
use once_cell::sync::OnceCell;
7374
use std::future::Future;
7475
use std::sync::Arc;
@@ -553,7 +554,7 @@ impl CliFactory {
553554
.get_or_try_init_async(
554555
async {
555556
Ok(Arc::new(NodeResolver::new(
556-
self.fs().clone(),
557+
DenoFsNodeResolverEnv::new(self.fs().clone()),
557558
self.npm_resolver().await?.clone().into_npm_resolver(),
558559
)))
559560
}
@@ -577,7 +578,7 @@ impl CliFactory {
577578

578579
Ok(Arc::new(NodeCodeTranslator::new(
579580
cjs_esm_analyzer,
580-
self.fs().clone(),
581+
DenoFsNodeResolverEnv::new(self.fs().clone()),
581582
self.node_resolver().await?.clone(),
582583
self.npm_resolver().await?.clone().into_npm_resolver(),
583584
)))

cli/lsp/analysis.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use deno_core::serde::Serialize;
2323
use deno_core::serde_json;
2424
use deno_core::serde_json::json;
2525
use deno_core::ModuleSpecifier;
26-
use deno_runtime::deno_node::NpmResolver;
2726
use deno_runtime::deno_node::PathClean;
2827
use deno_semver::jsr::JsrPackageNvReference;
2928
use deno_semver::jsr::JsrPackageReqReference;
@@ -34,6 +33,7 @@ use deno_semver::package::PackageReq;
3433
use deno_semver::package::PackageReqReference;
3534
use deno_semver::Version;
3635
use import_map::ImportMap;
36+
use node_resolver::NpmResolver;
3737
use once_cell::sync::Lazy;
3838
use regex::Regex;
3939
use std::cmp::Ordering;

cli/lsp/resolver.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,18 @@ use deno_graph::GraphImport;
3535
use deno_graph::ModuleSpecifier;
3636
use deno_npm::NpmSystemInfo;
3737
use deno_runtime::deno_fs;
38-
use deno_runtime::deno_node::errors::ClosestPkgJsonError;
39-
use deno_runtime::deno_node::NodeResolution;
40-
use deno_runtime::deno_node::NodeResolutionMode;
4138
use deno_runtime::deno_node::NodeResolver;
42-
use deno_runtime::deno_node::NpmResolver;
4339
use deno_runtime::deno_node::PackageJson;
4440
use deno_runtime::fs_util::specifier_to_file_path;
4541
use deno_semver::jsr::JsrPackageReqReference;
4642
use deno_semver::npm::NpmPackageReqReference;
4743
use deno_semver::package::PackageNv;
4844
use deno_semver::package::PackageReq;
4945
use indexmap::IndexMap;
46+
use node_resolver::errors::ClosestPkgJsonError;
47+
use node_resolver::NodeResolution;
48+
use node_resolver::NodeResolutionMode;
49+
use node_resolver::NpmResolver;
5050
use std::borrow::Cow;
5151
use std::collections::BTreeMap;
5252
use std::collections::BTreeSet;
@@ -496,7 +496,7 @@ fn create_node_resolver(
496496
let npm_resolver = npm_resolver?;
497497
let fs = Arc::new(deno_fs::RealFs);
498498
let node_resolver_inner = Arc::new(NodeResolver::new(
499-
fs.clone(),
499+
deno_runtime::deno_node::DenoFsNodeResolverEnv::new(fs.clone()),
500500
npm_resolver.clone().into_npm_resolver(),
501501
));
502502
Some(Arc::new(CliNodeResolver::new(

cli/module_loader.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ use deno_graph::Module;
6464
use deno_graph::ModuleGraph;
6565
use deno_graph::Resolution;
6666
use deno_runtime::code_cache;
67-
use deno_runtime::deno_node::NodeResolutionMode;
6867
use deno_runtime::deno_permissions::PermissionsContainer;
6968
use deno_semver::npm::NpmPackageReqReference;
69+
use node_resolver::NodeResolutionMode;
7070

7171
pub async fn load_top_level_deps(factory: &CliFactory) -> Result<(), AnyError> {
7272
let npm_resolver = factory.npm_resolver().await?;

cli/node.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,20 @@ use deno_ast::MediaType;
66
use deno_ast::ModuleSpecifier;
77
use deno_core::error::AnyError;
88
use deno_runtime::deno_fs;
9-
use deno_runtime::deno_node::analyze::CjsAnalysis as ExtNodeCjsAnalysis;
10-
use deno_runtime::deno_node::analyze::CjsAnalysisExports;
11-
use deno_runtime::deno_node::analyze::CjsCodeAnalyzer;
12-
use deno_runtime::deno_node::analyze::NodeCodeTranslator;
9+
use deno_runtime::deno_node::DenoFsNodeResolverEnv;
10+
use node_resolver::analyze::CjsAnalysis as ExtNodeCjsAnalysis;
11+
use node_resolver::analyze::CjsAnalysisExports;
12+
use node_resolver::analyze::CjsCodeAnalyzer;
13+
use node_resolver::analyze::NodeCodeTranslator;
1314
use serde::Deserialize;
1415
use serde::Serialize;
1516

1617
use crate::cache::CacheDBHash;
1718
use crate::cache::NodeAnalysisCache;
1819
use crate::util::fs::canonicalize_path_maybe_not_exists;
1920

20-
pub type CliNodeCodeTranslator = NodeCodeTranslator<CliCjsCodeAnalyzer>;
21+
pub type CliNodeCodeTranslator =
22+
NodeCodeTranslator<CliCjsCodeAnalyzer, DenoFsNodeResolverEnv>;
2123

2224
/// Resolves a specifier that is pointing into a node_modules folder.
2325
///

cli/npm/byonm.rs

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,18 @@ use deno_core::error::AnyError;
1111
use deno_core::serde_json;
1212
use deno_package_json::PackageJsonDepValue;
1313
use deno_runtime::deno_fs::FileSystem;
14-
use deno_runtime::deno_node::errors::PackageFolderResolveError;
15-
use deno_runtime::deno_node::errors::PackageFolderResolveIoError;
16-
use deno_runtime::deno_node::errors::PackageNotFoundError;
17-
use deno_runtime::deno_node::load_pkg_json;
14+
use deno_runtime::deno_node::DenoPkgJsonFsAdapter;
1815
use deno_runtime::deno_node::NodePermissions;
19-
use deno_runtime::deno_node::NpmResolver;
16+
use deno_runtime::deno_node::NodeRequireResolver;
17+
use deno_runtime::deno_node::NpmProcessStateProvider;
2018
use deno_runtime::deno_node::PackageJson;
2119
use deno_semver::package::PackageReq;
20+
use node_resolver::errors::PackageFolderResolveError;
21+
use node_resolver::errors::PackageFolderResolveIoError;
22+
use node_resolver::errors::PackageJsonLoadError;
23+
use node_resolver::errors::PackageNotFoundError;
24+
use node_resolver::load_pkg_json;
25+
use node_resolver::NpmResolver;
2226

2327
use crate::args::NpmProcessState;
2428
use crate::args::NpmProcessStateKind;
@@ -49,6 +53,15 @@ pub struct ByonmCliNpmResolver {
4953
root_node_modules_dir: Option<PathBuf>,
5054
}
5155

56+
impl ByonmCliNpmResolver {
57+
fn load_pkg_json(
58+
&self,
59+
path: &Path,
60+
) -> Result<Option<Arc<PackageJson>>, PackageJsonLoadError> {
61+
load_pkg_json(&DenoPkgJsonFsAdapter(self.fs.as_ref()), path)
62+
}
63+
}
64+
5265
impl ByonmCliNpmResolver {
5366
/// Finds the ancestor package.json that contains the specified dependency.
5467
pub fn find_ancestor_package_json_with_dep(
@@ -60,9 +73,7 @@ impl ByonmCliNpmResolver {
6073
let mut current_folder = referrer_path.parent()?;
6174
loop {
6275
let pkg_json_path = current_folder.join("package.json");
63-
if let Ok(Some(pkg_json)) =
64-
load_pkg_json(self.fs.as_ref(), &pkg_json_path)
65-
{
76+
if let Ok(Some(pkg_json)) = self.load_pkg_json(&pkg_json_path) {
6677
if let Some(deps) = &pkg_json.dependencies {
6778
if deps.contains_key(dep_name) {
6879
return Some(pkg_json);
@@ -119,9 +130,7 @@ impl ByonmCliNpmResolver {
119130
let mut current_path = file_path.as_path();
120131
while let Some(dir_path) = current_path.parent() {
121132
let package_json_path = dir_path.join("package.json");
122-
if let Some(pkg_json) =
123-
load_pkg_json(self.fs.as_ref(), &package_json_path)?
124-
{
133+
if let Some(pkg_json) = self.load_pkg_json(&package_json_path)? {
125134
if let Some(alias) =
126135
resolve_alias_from_pkg_json(req, pkg_json.as_ref())
127136
{
@@ -136,9 +145,7 @@ impl ByonmCliNpmResolver {
136145
if let Some(root_node_modules_dir) = &self.root_node_modules_dir {
137146
let root_pkg_json_path =
138147
root_node_modules_dir.parent().unwrap().join("package.json");
139-
if let Some(pkg_json) =
140-
load_pkg_json(self.fs.as_ref(), &root_pkg_json_path)?
141-
{
148+
if let Some(pkg_json) = self.load_pkg_json(&root_pkg_json_path)? {
142149
if let Some(alias) = resolve_alias_from_pkg_json(req, pkg_json.as_ref())
143150
{
144151
return Ok((pkg_json, alias));
@@ -158,17 +165,6 @@ impl ByonmCliNpmResolver {
158165
}
159166

160167
impl NpmResolver for ByonmCliNpmResolver {
161-
fn get_npm_process_state(&self) -> String {
162-
serde_json::to_string(&NpmProcessState {
163-
kind: NpmProcessStateKind::Byonm,
164-
local_node_modules_path: self
165-
.root_node_modules_dir
166-
.as_ref()
167-
.map(|p| p.to_string_lossy().to_string()),
168-
})
169-
.unwrap()
170-
}
171-
172168
fn resolve_package_folder_from_package(
173169
&self,
174170
name: &str,
@@ -226,7 +222,9 @@ impl NpmResolver for ByonmCliNpmResolver {
226222
.to_ascii_lowercase()
227223
.contains("/node_modules/")
228224
}
225+
}
229226

227+
impl NodeRequireResolver for ByonmCliNpmResolver {
230228
fn ensure_read_permission(
231229
&self,
232230
permissions: &mut dyn NodePermissions,
@@ -242,11 +240,34 @@ impl NpmResolver for ByonmCliNpmResolver {
242240
}
243241
}
244242

243+
impl NpmProcessStateProvider for ByonmCliNpmResolver {
244+
fn get_npm_process_state(&self) -> String {
245+
serde_json::to_string(&NpmProcessState {
246+
kind: NpmProcessStateKind::Byonm,
247+
local_node_modules_path: self
248+
.root_node_modules_dir
249+
.as_ref()
250+
.map(|p| p.to_string_lossy().to_string()),
251+
})
252+
.unwrap()
253+
}
254+
}
255+
245256
impl CliNpmResolver for ByonmCliNpmResolver {
246257
fn into_npm_resolver(self: Arc<Self>) -> Arc<dyn NpmResolver> {
247258
self
248259
}
249260

261+
fn into_require_resolver(self: Arc<Self>) -> Arc<dyn NodeRequireResolver> {
262+
self
263+
}
264+
265+
fn into_process_state_provider(
266+
self: Arc<Self>,
267+
) -> Arc<dyn NpmProcessStateProvider> {
268+
self
269+
}
270+
250271
fn clone_snapshotted(&self) -> Arc<dyn CliNpmResolver> {
251272
Arc::new(Self {
252273
fs: self.fs.clone(),

0 commit comments

Comments
 (0)