summaryrefslogtreecommitdiff
path: root/cli/node
diff options
context:
space:
mode:
Diffstat (limited to 'cli/node')
-rw-r--r--cli/node/mod.rs98
1 files changed, 37 insertions, 61 deletions
diff --git a/cli/node/mod.rs b/cli/node/mod.rs
index 71046b4b7..66b0f32f1 100644
--- a/cli/node/mod.rs
+++ b/cli/node/mod.rs
@@ -17,11 +17,13 @@ use deno_core::serde_json::Value;
use deno_core::url::Url;
use deno_core::JsRuntime;
use deno_graph::source::ResolveResponse;
+use deno_runtime::deno_node::get_closest_package_json;
use deno_runtime::deno_node::legacy_main_resolve;
use deno_runtime::deno_node::package_exports_resolve;
use deno_runtime::deno_node::package_imports_resolve;
use deno_runtime::deno_node::package_resolve;
use deno_runtime::deno_node::DenoDirNpmResolver;
+use deno_runtime::deno_node::NodeModuleKind;
use deno_runtime::deno_node::PackageJson;
use deno_runtime::deno_node::DEFAULT_CONDITIONS;
use once_cell::sync::Lazy;
@@ -342,6 +344,8 @@ pub fn node_resolve(
referrer: &ModuleSpecifier,
npm_resolver: &dyn DenoDirNpmResolver,
) -> Result<Option<ResolveResponse>, AnyError> {
+ // Note: if we are here, then the referrer is an esm module
+
// TODO(bartlomieju): skipped "policy" part as we don't plan to support it
// NOTE(bartlomieju): this will force `ProcState` to use Node.js polyfill for
@@ -385,7 +389,7 @@ pub fn node_resolve(
return Err(errors::err_unsupported_esm_url_scheme(&url));
}
- // todo(THIS PR): I think this is handled upstream so can be removed?
+ // todo(dsherret): this seems wrong
if referrer.scheme() == "data" {
let url = referrer.join(specifier).map_err(AnyError::from)?;
return Ok(Some(ResolveResponse::Specifier(url)));
@@ -412,7 +416,7 @@ pub fn node_resolve_npm_reference(
let package_folder = npm_resolver
.resolve_package_from_deno_module(&reference.req)?
.folder_path;
- let maybe_url = package_config_resolve(
+ let resolved_path = package_config_resolve(
&reference
.sub_path
.as_ref()
@@ -420,16 +424,13 @@ pub fn node_resolve_npm_reference(
.unwrap_or_else(|| ".".to_string()),
&package_folder,
npm_resolver,
+ NodeModuleKind::Esm,
)
- .map(Some)
.with_context(|| {
format!("Error resolving package config for '{}'.", reference)
})?;
- let url = match maybe_url {
- Some(url) => url,
- None => return Ok(None),
- };
+ let url = ModuleSpecifier::from_file_path(resolved_path).unwrap();
let resolve_response = url_to_resolve_response(url, npm_resolver)?;
// TODO(bartlomieju): skipped checking errors for commonJS resolution and
// "preserveSymlinksMain"/"preserveSymlinks" options.
@@ -521,33 +522,30 @@ fn package_config_resolve(
package_subpath: &str,
package_dir: &Path,
npm_resolver: &dyn DenoDirNpmResolver,
-) -> Result<ModuleSpecifier, AnyError> {
+ referrer_kind: NodeModuleKind,
+) -> Result<PathBuf, AnyError> {
let package_json_path = package_dir.join("package.json");
- // todo(dsherret): remove base from this code
- let base =
+ let referrer =
ModuleSpecifier::from_directory_path(package_json_path.parent().unwrap())
.unwrap();
let package_config =
PackageJson::load(npm_resolver, package_json_path.clone())?;
- let package_json_url =
- ModuleSpecifier::from_file_path(&package_json_path).unwrap();
if let Some(exports) = &package_config.exports {
return package_exports_resolve(
- package_json_url,
+ &package_json_path,
package_subpath.to_string(),
exports,
- &base,
+ &referrer,
+ referrer_kind,
DEFAULT_CONDITIONS,
npm_resolver,
);
}
if package_subpath == "." {
- return legacy_main_resolve(&package_json_url, &package_config, &base);
+ return legacy_main_resolve(&package_config, referrer_kind);
}
- package_json_url
- .join(package_subpath)
- .map_err(AnyError::from)
+ Ok(package_dir.join(package_subpath))
}
fn url_to_resolve_response(
@@ -570,37 +568,6 @@ fn url_to_resolve_response(
})
}
-fn get_closest_package_json(
- url: &ModuleSpecifier,
- npm_resolver: &dyn DenoDirNpmResolver,
-) -> Result<PackageJson, AnyError> {
- let package_json_path = get_closest_package_json_path(url, npm_resolver)?;
- PackageJson::load(npm_resolver, package_json_path)
-}
-
-fn get_closest_package_json_path(
- url: &ModuleSpecifier,
- npm_resolver: &dyn DenoDirNpmResolver,
-) -> Result<PathBuf, AnyError> {
- let file_path = url.to_file_path().unwrap();
- let mut current_dir = file_path.parent().unwrap();
- let package_json_path = current_dir.join("package.json");
- if package_json_path.exists() {
- return Ok(package_json_path);
- }
- let root_folder = npm_resolver
- .resolve_package_folder_from_path(&url.to_file_path().unwrap())?;
- while current_dir.starts_with(&root_folder) {
- current_dir = current_dir.parent().unwrap();
- let package_json_path = current_dir.join("./package.json");
- if package_json_path.exists() {
- return Ok(package_json_path);
- }
- }
-
- bail!("did not find package.json in {}", root_folder.display())
-}
-
fn finalize_resolution(
resolved: ModuleSpecifier,
base: &ModuleSpecifier,
@@ -667,25 +634,34 @@ fn module_resolve(
conditions: &[&str],
npm_resolver: &dyn DenoDirNpmResolver,
) -> Result<Option<ModuleSpecifier>, AnyError> {
+ // note: if we're here, the referrer is an esm module
let url = if should_be_treated_as_relative_or_absolute_path(specifier) {
let resolved_specifier = referrer.join(specifier)?;
Some(resolved_specifier)
} else if specifier.starts_with('#') {
- Some(package_imports_resolve(
- specifier,
- referrer,
- conditions,
- npm_resolver,
- )?)
+ Some(
+ package_imports_resolve(
+ specifier,
+ referrer,
+ NodeModuleKind::Esm,
+ conditions,
+ npm_resolver,
+ )
+ .map(|p| ModuleSpecifier::from_file_path(p).unwrap())?,
+ )
} else if let Ok(resolved) = Url::parse(specifier) {
Some(resolved)
} else {
- Some(package_resolve(
- specifier,
- referrer,
- conditions,
- npm_resolver,
- )?)
+ Some(
+ package_resolve(
+ specifier,
+ referrer,
+ NodeModuleKind::Esm,
+ conditions,
+ npm_resolver,
+ )
+ .map(|p| ModuleSpecifier::from_file_path(p).unwrap())?,
+ )
};
Ok(match url {
Some(url) => Some(finalize_resolution(url, referrer)?),