summaryrefslogtreecommitdiff
path: root/ext/node/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/lib.rs')
-rw-r--r--ext/node/lib.rs107
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 {