diff options
Diffstat (limited to 'ext/node/ops/require.rs')
-rw-r--r-- | ext/node/ops/require.rs | 138 |
1 files changed, 71 insertions, 67 deletions
diff --git a/ext/node/ops/require.rs b/ext/node/ops/require.rs index 82a043340..513b3f589 100644 --- a/ext/node/ops/require.rs +++ b/ext/node/ops/require.rs @@ -13,6 +13,7 @@ use std::cell::RefCell; use std::path::Path; use std::path::PathBuf; use std::rc::Rc; +use std::sync::Arc; use crate::resolution; use crate::NodeEnv; @@ -20,6 +21,7 @@ use crate::NodeFs; use crate::NodeModuleKind; use crate::NodePermissions; use crate::NodeResolutionMode; +use crate::NodeResolver; use crate::NpmResolver; use crate::PackageJson; @@ -31,7 +33,7 @@ where P: NodePermissions + 'static, { let resolver = { - let resolver = state.borrow::<Rc<dyn NpmResolver>>(); + let resolver = state.borrow::<Arc<dyn NpmResolver>>(); resolver.clone() }; let permissions = state.borrow_mut::<P>(); @@ -96,10 +98,11 @@ pub fn op_require_node_module_paths<Env>( where Env: NodeEnv + 'static, { + let fs = state.borrow::<Arc<dyn NodeFs>>().clone(); // Guarantee that "from" is absolute. let from = deno_core::resolve_path( &from, - &(Env::Fs::current_dir()).context("Unable to get CWD")?, + &(fs.current_dir()).context("Unable to get CWD")?, ) .unwrap() .to_file_path() @@ -191,7 +194,7 @@ fn op_require_resolve_deno_dir( request: String, parent_filename: String, ) -> Option<String> { - let resolver = state.borrow::<Rc<dyn NpmResolver>>(); + let resolver = state.borrow::<Arc<dyn NpmResolver>>(); resolver .resolve_package_folder_from_package( &request, @@ -204,7 +207,7 @@ fn op_require_resolve_deno_dir( #[op] fn op_require_is_deno_dir_package(state: &mut OpState, path: String) -> bool { - let resolver = state.borrow::<Rc<dyn NpmResolver>>(); + let resolver = state.borrow::<Arc<dyn NpmResolver>>(); resolver.in_npm_package_at_path(&PathBuf::from(path)) } @@ -264,7 +267,8 @@ where { let path = PathBuf::from(path); ensure_read_permission::<Env::P>(state, &path)?; - if let Ok(metadata) = Env::Fs::metadata(&path) { + let fs = state.borrow::<Arc<dyn NodeFs>>().clone(); + if let Ok(metadata) = fs.metadata(&path) { if metadata.is_file { return Ok(0); } else { @@ -285,7 +289,8 @@ where { let path = PathBuf::from(request); ensure_read_permission::<Env::P>(state, &path)?; - let mut canonicalized_path = Env::Fs::canonicalize(&path)?; + let fs = state.borrow::<Arc<dyn NodeFs>>().clone(); + let mut canonicalized_path = fs.canonicalize(&path)?; if cfg!(windows) { canonicalized_path = PathBuf::from( canonicalized_path @@ -353,7 +358,8 @@ where if let Some(parent_id) = maybe_parent_id { if parent_id == "<repl>" || parent_id == "internal/preload" { - if let Ok(cwd) = Env::Fs::current_dir() { + let fs = state.borrow::<Arc<dyn NodeFs>>().clone(); + if let Ok(cwd) = fs.current_dir() { ensure_read_permission::<Env::P>(state, &cwd)?; return Ok(Some(cwd.to_string_lossy().to_string())); } @@ -375,14 +381,14 @@ where return Ok(None); } - let resolver = state.borrow::<Rc<dyn NpmResolver>>().clone(); + let node_resolver = state.borrow::<Rc<NodeResolver>>().clone(); let permissions = state.borrow_mut::<Env::P>(); - let pkg = resolution::get_package_scope_config::<Env::Fs>( - &Url::from_file_path(parent_path.unwrap()).unwrap(), - &*resolver, - permissions, - ) - .ok(); + let pkg = node_resolver + .get_package_scope_config( + &Url::from_file_path(parent_path.unwrap()).unwrap(), + permissions, + ) + .ok(); if pkg.is_none() { return Ok(None); } @@ -408,18 +414,18 @@ where let referrer = deno_core::url::Url::from_file_path(&pkg.path).unwrap(); if let Some(exports) = &pkg.exports { - resolution::package_exports_resolve::<Env::Fs>( - &pkg.path, - expansion, - exports, - &referrer, - NodeModuleKind::Cjs, - resolution::REQUIRE_CONDITIONS, - NodeResolutionMode::Execution, - &*resolver, - permissions, - ) - .map(|r| Some(r.to_string_lossy().to_string())) + node_resolver + .package_exports_resolve( + &pkg.path, + expansion, + exports, + &referrer, + NodeModuleKind::Cjs, + resolution::REQUIRE_CONDITIONS, + NodeResolutionMode::Execution, + permissions, + ) + .map(|r| Some(r.to_string_lossy().to_string())) } else { Ok(None) } @@ -435,7 +441,8 @@ where { let file_path = PathBuf::from(file_path); ensure_read_permission::<Env::P>(state, &file_path)?; - Ok(Env::Fs::read_to_string(file_path)?) + let fs = state.borrow::<Arc<dyn NodeFs>>().clone(); + Ok(fs.read_to_string(&file_path)?) } #[op] @@ -462,10 +469,12 @@ fn op_require_resolve_exports<Env>( where Env: NodeEnv + 'static, { - let resolver = state.borrow::<Rc<dyn NpmResolver>>().clone(); + let fs = state.borrow::<Arc<dyn NodeFs>>().clone(); + let npm_resolver = state.borrow::<Arc<dyn NpmResolver>>().clone(); + let node_resolver = state.borrow::<Rc<NodeResolver>>().clone(); let permissions = state.borrow_mut::<Env::P>(); - let pkg_path = if resolver + let pkg_path = if npm_resolver .in_npm_package_at_path(&PathBuf::from(&modules_path)) && !uses_local_node_modules_dir { @@ -473,32 +482,31 @@ where } else { let orignal = modules_path.clone(); let mod_dir = path_resolve(vec![modules_path, name]); - if Env::Fs::is_dir(&mod_dir) { + if fs.is_dir(Path::new(&mod_dir)) { mod_dir } else { orignal } }; - let pkg = PackageJson::load::<Env::Fs>( - &*resolver, + let pkg = node_resolver.load_package_json( permissions, PathBuf::from(&pkg_path).join("package.json"), )?; if let Some(exports) = &pkg.exports { let referrer = Url::from_file_path(parent_path).unwrap(); - resolution::package_exports_resolve::<Env::Fs>( - &pkg.path, - format!(".{expansion}"), - exports, - &referrer, - NodeModuleKind::Cjs, - resolution::REQUIRE_CONDITIONS, - NodeResolutionMode::Execution, - &*resolver, - permissions, - ) - .map(|r| Some(r.to_string_lossy().to_string())) + node_resolver + .package_exports_resolve( + &pkg.path, + format!(".{expansion}"), + exports, + &referrer, + NodeModuleKind::Cjs, + resolution::REQUIRE_CONDITIONS, + NodeResolutionMode::Execution, + permissions, + ) + .map(|r| Some(r.to_string_lossy().to_string())) } else { Ok(None) } @@ -516,11 +524,10 @@ where state, PathBuf::from(&filename).parent().unwrap(), )?; - let resolver = state.borrow::<Rc<dyn NpmResolver>>().clone(); + let node_resolver = state.borrow::<Rc<NodeResolver>>().clone(); let permissions = state.borrow_mut::<Env::P>(); - resolution::get_closest_package_json::<Env::Fs>( + node_resolver.get_closest_package_json( &Url::from_file_path(filename).unwrap(), - &*resolver, permissions, ) } @@ -533,10 +540,12 @@ fn op_require_read_package_scope<Env>( where Env: NodeEnv + 'static, { - let resolver = state.borrow::<Rc<dyn NpmResolver>>().clone(); + let node_resolver = state.borrow::<Rc<NodeResolver>>().clone(); let permissions = state.borrow_mut::<Env::P>(); let package_json_path = PathBuf::from(package_json_path); - PackageJson::load::<Env::Fs>(&*resolver, permissions, package_json_path).ok() + node_resolver + .load_package_json(permissions, package_json_path) + .ok() } #[op] @@ -550,29 +559,24 @@ where { let parent_path = PathBuf::from(&parent_filename); ensure_read_permission::<Env::P>(state, &parent_path)?; - let resolver = state.borrow::<Rc<dyn NpmResolver>>().clone(); + let node_resolver = state.borrow::<Rc<NodeResolver>>().clone(); let permissions = state.borrow_mut::<Env::P>(); - let pkg = PackageJson::load::<Env::Fs>( - &*resolver, - permissions, - parent_path.join("package.json"), - )?; + let pkg = node_resolver + .load_package_json(permissions, parent_path.join("package.json"))?; if pkg.imports.is_some() { let referrer = deno_core::url::Url::from_file_path(&parent_filename).unwrap(); - let r = resolution::package_imports_resolve::<Env::Fs>( - &request, - &referrer, - NodeModuleKind::Cjs, - resolution::REQUIRE_CONDITIONS, - NodeResolutionMode::Execution, - &*resolver, - permissions, - ) - .map(|r| Some(Url::from_file_path(r).unwrap().to_string())); - state.put(resolver); - r + node_resolver + .package_imports_resolve( + &request, + &referrer, + NodeModuleKind::Cjs, + resolution::REQUIRE_CONDITIONS, + NodeResolutionMode::Execution, + permissions, + ) + .map(|r| Some(Url::from_file_path(r).unwrap().to_string())) } else { Ok(None) } |