diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-04-21 21:02:46 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-21 21:02:46 -0400 |
commit | a615eb3b56545960ec9684991442dd34a8b2abfc (patch) | |
tree | 05e134487fd3e8aadfe513a70ee246c95633fa34 /ext/node/lib.rs | |
parent | 779d379c68d1489cc01f6a2bfbcf677e08ca6d40 (diff) |
refactor(node): move most of cli/node to ext/node (#18797)
This is just a straight refactor and I didn't do any cleanup in
ext/node. After this PR we can start to clean it up and make things
private that don't need to be public anymore.
Diffstat (limited to 'ext/node/lib.rs')
-rw-r--r-- | ext/node/lib.rs | 107 |
1 files changed, 102 insertions, 5 deletions
diff --git a/ext/node/lib.rs b/ext/node/lib.rs index a521e161c..38772d0fc 100644 --- a/ext/node/lib.rs +++ b/ext/node/lib.rs @@ -5,12 +5,20 @@ use deno_core::located_script_name; use deno_core::op; use deno_core::serde_json; use deno_core::JsRuntime; +use deno_core::ModuleSpecifier; +use deno_npm::resolution::PackageReqNotFoundError; +use deno_npm::NpmPackageId; +use deno_semver::npm::NpmPackageNv; +use deno_semver::npm::NpmPackageNvReference; +use deno_semver::npm::NpmPackageReq; +use deno_semver::npm::NpmPackageReqReference; use once_cell::sync::Lazy; use std::collections::HashSet; use std::io; use std::path::Path; use std::path::PathBuf; use std::rc::Rc; +use std::sync::Arc; pub mod analyze; mod crypto; @@ -21,14 +29,15 @@ mod package_json; mod path; mod polyfill; mod resolution; +mod resolver; mod v8; mod winerror; mod zlib; pub use package_json::PackageJson; pub use path::PathClean; -pub use polyfill::find_builtin_node_module; pub use polyfill::is_builtin_node_module; +pub use polyfill::resolve_builtin_node_module; pub use polyfill::NodeModulePolyfill; pub use polyfill::SUPPORTED_BUILTIN_NODE_MODULES; pub use resolution::get_closest_package_json; @@ -41,6 +50,8 @@ pub use resolution::path_to_declaration_path; pub use resolution::NodeModuleKind; pub use resolution::NodeResolutionMode; pub use resolution::DEFAULT_CONDITIONS; +pub use resolver::NodeResolution; +pub use resolver::NodeResolver; pub trait NodeEnv { type P: NodePermissions; @@ -51,6 +62,14 @@ pub trait NodePermissions { fn check_read(&mut self, path: &Path) -> Result<(), AnyError>; } +pub(crate) struct AllowAllNodePermissions; + +impl NodePermissions for AllowAllNodePermissions { + fn check_read(&mut self, _path: &Path) -> Result<(), AnyError> { + Ok(()) + } +} + #[derive(Default, Clone)] pub struct NodeFsMetadata { pub is_file: bool, @@ -114,20 +133,47 @@ impl NodeFs for RealFs { } } -pub trait RequireNpmResolver { +pub trait NpmResolver { + /// Resolves an npm package folder path from an npm package referrer. fn resolve_package_folder_from_package( &self, specifier: &str, - referrer: &Path, + referrer: &ModuleSpecifier, mode: NodeResolutionMode, ) -> Result<PathBuf, AnyError>; + /// Resolves the npm package folder path from the specified path. fn resolve_package_folder_from_path( &self, path: &Path, ) -> Result<PathBuf, AnyError>; - fn in_npm_package(&self, path: &Path) -> bool; + /// Resolves an npm package folder path from a Deno module. + fn resolve_package_folder_from_deno_module( + &self, + pkg_nv: &NpmPackageNv, + ) -> Result<PathBuf, AnyError>; + + fn resolve_pkg_id_from_pkg_req( + &self, + req: &NpmPackageReq, + ) -> Result<NpmPackageId, PackageReqNotFoundError>; + + fn resolve_nv_ref_from_pkg_req_ref( + &self, + req_ref: &NpmPackageReqReference, + ) -> Result<NpmPackageNvReference, PackageReqNotFoundError>; + + fn in_npm_package(&self, specifier: &ModuleSpecifier) -> bool; + + fn in_npm_package_at_path(&self, path: &Path) -> bool { + let specifier = + match ModuleSpecifier::from_file_path(path.to_path_buf().clean()) { + Ok(p) => p, + Err(_) => return false, + }; + self.in_npm_package(&specifier) + } fn ensure_read_permission( &self, @@ -136,6 +182,57 @@ pub trait RequireNpmResolver { ) -> Result<(), AnyError>; } +impl<T: NpmResolver + ?Sized> NpmResolver for Arc<T> { + fn resolve_package_folder_from_package( + &self, + specifier: &str, + referrer: &ModuleSpecifier, + mode: NodeResolutionMode, + ) -> Result<PathBuf, AnyError> { + (**self).resolve_package_folder_from_package(specifier, referrer, mode) + } + + fn resolve_package_folder_from_path( + &self, + path: &Path, + ) -> Result<PathBuf, AnyError> { + (**self).resolve_package_folder_from_path(path) + } + + fn resolve_package_folder_from_deno_module( + &self, + pkg_nv: &NpmPackageNv, + ) -> Result<PathBuf, AnyError> { + (**self).resolve_package_folder_from_deno_module(pkg_nv) + } + + fn resolve_pkg_id_from_pkg_req( + &self, + req: &NpmPackageReq, + ) -> Result<NpmPackageId, PackageReqNotFoundError> { + (**self).resolve_pkg_id_from_pkg_req(req) + } + + fn resolve_nv_ref_from_pkg_req_ref( + &self, + req_ref: &NpmPackageReqReference, + ) -> Result<NpmPackageNvReference, PackageReqNotFoundError> { + (**self).resolve_nv_ref_from_pkg_req_ref(req_ref) + } + + fn in_npm_package(&self, specifier: &ModuleSpecifier) -> bool { + (**self).in_npm_package(specifier) + } + + fn ensure_read_permission( + &self, + permissions: &mut dyn NodePermissions, + path: &Path, + ) -> Result<(), AnyError> { + (**self).ensure_read_permission(permissions, path) + } +} + pub static NODE_GLOBAL_THIS_NAME: Lazy<String> = Lazy::new(|| { let now = std::time::SystemTime::now(); let seconds = now @@ -490,7 +587,7 @@ deno_core::extension!(deno_node, "zlib.ts", ], options = { - maybe_npm_resolver: Option<Rc<dyn RequireNpmResolver>>, + maybe_npm_resolver: Option<Rc<dyn NpmResolver>>, }, state = |state, options| { if let Some(npm_resolver) = options.maybe_npm_resolver { |