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.rs44
1 files changed, 35 insertions, 9 deletions
diff --git a/ext/node/lib.rs b/ext/node/lib.rs
index f96259797..6f3173470 100644
--- a/ext/node/lib.rs
+++ b/ext/node/lib.rs
@@ -12,11 +12,13 @@ use std::path::PathBuf;
use std::rc::Rc;
pub use package_json::PackageJson;
+pub use resolution::get_closest_package_json;
pub use resolution::get_package_scope_config;
pub use resolution::legacy_main_resolve;
pub use resolution::package_exports_resolve;
pub use resolution::package_imports_resolve;
pub use resolution::package_resolve;
+pub use resolution::NodeModuleKind;
pub use resolution::DEFAULT_CONDITIONS;
pub trait NodePermissions {
@@ -77,6 +79,7 @@ pub fn init<P: NodePermissions + 'static>(
op_require_read_file::decl::<P>(),
op_require_as_file_path::decl(),
op_require_resolve_exports::decl(),
+ op_require_read_closest_package_json::decl::<P>(),
op_require_read_package_scope::decl(),
op_require_package_imports_resolve::decl::<P>(),
])
@@ -485,17 +488,18 @@ fn op_require_try_self(
return Ok(None);
}
- let base = deno_core::url::Url::from_file_path(PathBuf::from("/")).unwrap();
+ let referrer = deno_core::url::Url::from_file_path(&pkg.path).unwrap();
if let Some(exports) = &pkg.exports {
resolution::package_exports_resolve(
- deno_core::url::Url::from_file_path(&pkg.path).unwrap(),
+ &pkg.path,
expansion,
exports,
- &base,
+ &referrer,
+ NodeModuleKind::Cjs,
resolution::REQUIRE_CONDITIONS,
&*resolver,
)
- .map(|r| Some(r.as_str().to_string()))
+ .map(|r| Some(r.to_string_lossy().to_string()))
} else {
Ok(None)
}
@@ -550,22 +554,43 @@ fn op_require_resolve_exports(
)?;
if let Some(exports) = &pkg.exports {
- let base = Url::from_file_path(parent_path).unwrap();
+ let referrer = Url::from_file_path(parent_path).unwrap();
resolution::package_exports_resolve(
- deno_core::url::Url::from_directory_path(pkg_path).unwrap(),
+ &pkg.path,
format!(".{}", expansion),
exports,
- &base,
+ &referrer,
+ NodeModuleKind::Cjs,
resolution::REQUIRE_CONDITIONS,
&*resolver,
)
- .map(|r| Some(r.to_file_path().unwrap().to_string_lossy().to_string()))
+ .map(|r| Some(r.to_string_lossy().to_string()))
} else {
Ok(None)
}
}
#[op]
+fn op_require_read_closest_package_json<P>(
+ state: &mut OpState,
+ filename: String,
+) -> Result<PackageJson, AnyError>
+where
+ P: NodePermissions + 'static,
+{
+ check_unstable(state);
+ ensure_read_permission::<P>(
+ state,
+ PathBuf::from(&filename).parent().unwrap(),
+ )?;
+ let resolver = state.borrow::<Rc<dyn DenoDirNpmResolver>>().clone();
+ resolution::get_closest_package_json(
+ &Url::from_file_path(filename).unwrap(),
+ &*resolver,
+ )
+}
+
+#[op]
fn op_require_read_package_scope(
state: &mut OpState,
filename: String,
@@ -600,10 +625,11 @@ where
let r = resolution::package_imports_resolve(
&request,
&referrer,
+ NodeModuleKind::Cjs,
resolution::REQUIRE_CONDITIONS,
&*resolver,
)
- .map(|r| Some(r.as_str().to_string()));
+ .map(|r| Some(Url::from_file_path(r).unwrap().to_string()));
state.put(resolver);
r
} else {