summaryrefslogtreecommitdiff
path: root/cli/node/mod.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-03-30 03:20:31 +0200
committerGitHub <noreply@github.com>2023-03-30 03:20:31 +0200
commit913e2875c1c31d5ffbc9c0c9ed0e8c63f6143024 (patch)
tree439fa7eef067893fde75dfe386d801a090e6c057 /cli/node/mod.rs
parent89bbbd102c6050763105be39a49494a5ffdce35b (diff)
refactor(ext/node): add NodeEnv::Fs associated type (#18484)
This commit adds associated type to "NodeEnv" trait, called "Fs". The "Fs" type has a trait bound on "NodeFs", which specifies APIs required for all ops and resolution APIs to function. A "RealFs" implementation of "NodeFs" is exported from the "deno_node" crate, that provides a default implementation for the trait. All code in "deno_node" extension was changed to use the "NodeFs" trait to handle file system operations, instead of relying on APIs from the standard library.
Diffstat (limited to 'cli/node/mod.rs')
-rw-r--r--cli/node/mod.rs54
1 files changed, 33 insertions, 21 deletions
diff --git a/cli/node/mod.rs b/cli/node/mod.rs
index 3df217722..0906deed0 100644
--- a/cli/node/mod.rs
+++ b/cli/node/mod.rs
@@ -31,6 +31,7 @@ use deno_runtime::deno_node::NodePermissions;
use deno_runtime::deno_node::NodeResolutionMode;
use deno_runtime::deno_node::PackageJson;
use deno_runtime::deno_node::PathClean;
+use deno_runtime::deno_node::RealFs;
use deno_runtime::deno_node::RequireNpmResolver;
use deno_runtime::deno_node::DEFAULT_CONDITIONS;
use deno_runtime::permissions::PermissionsContainer;
@@ -227,10 +228,11 @@ pub fn node_resolve(
let path = url.to_file_path().unwrap();
// todo(16370): the module kind is not correct here. I think we need
// typescript to tell us if the referrer is esm or cjs
- let path = match path_to_declaration_path(path, NodeModuleKind::Esm) {
- Some(path) => path,
- None => return Ok(None),
- };
+ let path =
+ match path_to_declaration_path::<RealFs>(path, NodeModuleKind::Esm) {
+ Some(path) => path,
+ None => return Ok(None),
+ };
ModuleSpecifier::from_file_path(path).unwrap()
}
};
@@ -273,7 +275,8 @@ pub fn node_resolve_npm_reference(
let resolved_path = match mode {
NodeResolutionMode::Execution => resolved_path,
NodeResolutionMode::Types => {
- match path_to_declaration_path(resolved_path, node_module_kind) {
+ match path_to_declaration_path::<RealFs>(resolved_path, node_module_kind)
+ {
Some(path) => path,
None => return Ok(None),
}
@@ -312,7 +315,7 @@ pub fn node_resolve_binary_commands(
let package_folder =
npm_resolver.resolve_package_folder_from_deno_module(pkg_nv)?;
let package_json_path = package_folder.join("package.json");
- let package_json = PackageJson::load(
+ let package_json = PackageJson::load::<RealFs>(
npm_resolver,
&mut PermissionsContainer::allow_all(),
package_json_path,
@@ -335,7 +338,7 @@ pub fn node_resolve_binary_export(
let package_folder =
npm_resolver.resolve_package_folder_from_deno_module(pkg_nv)?;
let package_json_path = package_folder.join("package.json");
- let package_json = PackageJson::load(
+ let package_json = PackageJson::load::<RealFs>(
npm_resolver,
&mut PermissionsContainer::allow_all(),
package_json_path,
@@ -424,10 +427,13 @@ fn package_config_resolve(
) -> Result<Option<PathBuf>, AnyError> {
let package_json_path = package_dir.join("package.json");
let referrer = ModuleSpecifier::from_directory_path(package_dir).unwrap();
- let package_config =
- PackageJson::load(npm_resolver, permissions, package_json_path.clone())?;
+ let package_config = PackageJson::load::<RealFs>(
+ npm_resolver,
+ permissions,
+ package_json_path.clone(),
+ )?;
if let Some(exports) = &package_config.exports {
- let result = package_exports_resolve(
+ let result = package_exports_resolve::<RealFs>(
&package_json_path,
package_subpath.to_string(),
exports,
@@ -443,7 +449,7 @@ fn package_config_resolve(
Err(exports_err) => {
if mode.is_types() && package_subpath == "." {
if let Ok(Some(path)) =
- legacy_main_resolve(&package_config, referrer_kind, mode)
+ legacy_main_resolve::<RealFs>(&package_config, referrer_kind, mode)
{
return Ok(Some(path));
} else {
@@ -455,7 +461,7 @@ fn package_config_resolve(
}
}
if package_subpath == "." {
- return legacy_main_resolve(&package_config, referrer_kind, mode);
+ return legacy_main_resolve::<RealFs>(&package_config, referrer_kind, mode);
}
Ok(Some(package_dir.join(package_subpath)))
@@ -469,7 +475,7 @@ pub fn url_to_node_resolution(
if url_str.starts_with("http") {
Ok(NodeResolution::Esm(url))
} else if url_str.ends_with(".js") || url_str.ends_with(".d.ts") {
- let package_config = get_closest_package_json(
+ let package_config = get_closest_package_json::<RealFs>(
&url,
npm_resolver,
&mut PermissionsContainer::allow_all(),
@@ -556,7 +562,7 @@ fn module_resolve(
// todo(dsherret): the node module kind is not correct and we
// should use the value provided by typescript instead
let declaration_path =
- path_to_declaration_path(file_path, NodeModuleKind::Esm);
+ path_to_declaration_path::<RealFs>(file_path, NodeModuleKind::Esm);
declaration_path.map(|declaration_path| {
ModuleSpecifier::from_file_path(declaration_path).unwrap()
})
@@ -565,7 +571,7 @@ fn module_resolve(
}
} else if specifier.starts_with('#') {
Some(
- package_imports_resolve(
+ package_imports_resolve::<RealFs>(
specifier,
referrer,
NodeModuleKind::Esm,
@@ -579,7 +585,7 @@ fn module_resolve(
} else if let Ok(resolved) = Url::parse(specifier) {
Some(resolved)
} else {
- package_resolve(
+ package_resolve::<RealFs>(
specifier,
referrer,
NodeModuleKind::Esm,
@@ -821,11 +827,14 @@ fn resolve(
let package_json_path = module_dir.join("package.json");
if package_json_path.exists() {
- let package_json =
- PackageJson::load(npm_resolver, permissions, package_json_path.clone())?;
+ let package_json = PackageJson::load::<RealFs>(
+ npm_resolver,
+ permissions,
+ package_json_path.clone(),
+ )?;
if let Some(exports) = &package_json.exports {
- return package_exports_resolve(
+ return package_exports_resolve::<deno_node::RealFs>(
&package_json_path,
package_subpath,
exports,
@@ -846,8 +855,11 @@ fn resolve(
// subdir might have a package.json that specifies the entrypoint
let package_json_path = d.join("package.json");
if package_json_path.exists() {
- let package_json =
- PackageJson::load(npm_resolver, permissions, package_json_path)?;
+ let package_json = PackageJson::load::<RealFs>(
+ npm_resolver,
+ permissions,
+ package_json_path,
+ )?;
if let Some(main) = package_json.main(NodeModuleKind::Cjs) {
return Ok(d.join(main).clean());
}