diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2022-08-24 14:54:20 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-24 14:54:20 +0200 |
commit | 5268fa0e0f34571f0fc615eb665747863aca311e (patch) | |
tree | 3c23531d8484e4821662bc822634eabb9862dd57 /cli/node/mod.rs | |
parent | f3bde1d53b4710fb526286e27af29a55f5da18c7 (diff) |
fix(unstable): various resolution bugs for npm: specifiers (#15546)
Co-authored-by: David Sherret <dsherret@gmail.com>
Diffstat (limited to 'cli/node/mod.rs')
-rw-r--r-- | cli/node/mod.rs | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/cli/node/mod.rs b/cli/node/mod.rs index e9bf04d60..21d642fa9 100644 --- a/cli/node/mod.rs +++ b/cli/node/mod.rs @@ -16,7 +16,6 @@ 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_package_scope_config; use deno_runtime::deno_node::legacy_main_resolve; use deno_runtime::deno_node::package_exports_resolve; use deno_runtime::deno_node::package_imports_resolve; @@ -136,6 +135,13 @@ pub fn node_resolve( ) -> Result<Option<ResolveResponse>, AnyError> { // 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 + // `module` from `ext/node/`. + if specifier == "module" { + return Ok(Some(ResolveResponse::Esm( + Url::parse("node:module").unwrap(), + ))); + } if let Some(resolved) = compat::try_resolve_builtin_module(specifier) { return Ok(Some(ResolveResponse::Esm(resolved))); } @@ -150,6 +156,15 @@ pub fn node_resolve( if protocol == "node" { let split_specifier = url.as_str().split(':'); let specifier = split_specifier.skip(1).collect::<String>(); + + // NOTE(bartlomieju): this will force `ProcState` to use Node.js polyfill for + // `module` from `ext/node/`. + if specifier == "module" { + return Ok(Some(ResolveResponse::Esm( + Url::parse("node:module").unwrap(), + ))); + } + if let Some(resolved) = compat::try_resolve_builtin_module(&specifier) { return Ok(Some(ResolveResponse::Esm(resolved))); } else { @@ -329,7 +344,7 @@ fn url_to_resolve_response( Ok(if url.as_str().starts_with("http") { ResolveResponse::Esm(url) } else if url.as_str().ends_with(".js") { - let package_config = get_package_scope_config(&url, npm_resolver)?; + let package_config = get_closest_package_json(&url, npm_resolver)?; if package_config.typ == "module" { ResolveResponse::Esm(url) } else { @@ -342,6 +357,37 @@ 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, |