diff options
Diffstat (limited to 'ext/node_resolver/analyze.rs')
-rw-r--r-- | ext/node_resolver/analyze.rs | 80 |
1 files changed, 51 insertions, 29 deletions
diff --git a/ext/node_resolver/analyze.rs b/ext/node_resolver/analyze.rs index 8231cdc8a..aea33e29a 100644 --- a/ext/node_resolver/analyze.rs +++ b/ext/node_resolver/analyze.rs @@ -200,7 +200,8 @@ impl<TCjsCodeAnalyzer: CjsCodeAnalyzer, TNodeResolverEnv: NodeResolverEnv> NodeResolutionMode::Execution, ); let reexport_specifier = match result { - Ok(specifier) => specifier, + Ok(Some(specifier)) => specifier, + Ok(None) => continue, Err(err) => { errors.push(err); continue; @@ -291,7 +292,7 @@ impl<TCjsCodeAnalyzer: CjsCodeAnalyzer, TNodeResolverEnv: NodeResolverEnv> referrer: &Url, conditions: &[&str], mode: NodeResolutionMode, - ) -> Result<Url, AnyError> { + ) -> Result<Option<Url>, AnyError> { if specifier.starts_with('/') { todo!(); } @@ -299,9 +300,12 @@ impl<TCjsCodeAnalyzer: CjsCodeAnalyzer, TNodeResolverEnv: NodeResolverEnv> let referrer_path = referrer.to_file_path().unwrap(); if specifier.starts_with("./") || specifier.starts_with("../") { if let Some(parent) = referrer_path.parent() { - return self - .file_extension_probe(parent.join(specifier), &referrer_path) - .map(|p| to_file_specifier(&p)); + return Some( + self + .file_extension_probe(parent.join(specifier), &referrer_path) + .map(|p| to_file_specifier(&p)), + ) + .transpose(); } else { todo!(); } @@ -311,28 +315,41 @@ impl<TCjsCodeAnalyzer: CjsCodeAnalyzer, TNodeResolverEnv: NodeResolverEnv> let (package_specifier, package_subpath) = parse_specifier(specifier).unwrap(); - let module_dir = self.npm_resolver.resolve_package_folder_from_package( - package_specifier.as_str(), - referrer, - )?; + let module_dir = match self + .npm_resolver + .resolve_package_folder_from_package(package_specifier.as_str(), referrer) + { + Err(err) + if matches!( + err.as_kind(), + crate::errors::PackageFolderResolveErrorKind::PackageNotFound(..) + ) => + { + return Ok(None); + } + other => other, + }?; let package_json_path = module_dir.join("package.json"); let maybe_package_json = load_pkg_json(self.env.pkg_json_fs(), &package_json_path)?; if let Some(package_json) = maybe_package_json { if let Some(exports) = &package_json.exports { - return self - .node_resolver - .package_exports_resolve( - &package_json_path, - &package_subpath, - exports, - Some(referrer), - NodeModuleKind::Esm, - conditions, - mode, - ) - .map_err(AnyError::from); + return Some( + self + .node_resolver + .package_exports_resolve( + &package_json_path, + &package_subpath, + exports, + Some(referrer), + NodeModuleKind::Esm, + conditions, + mode, + ) + .map_err(AnyError::from), + ) + .transpose(); } // old school @@ -345,19 +362,24 @@ impl<TCjsCodeAnalyzer: CjsCodeAnalyzer, TNodeResolverEnv: NodeResolverEnv> load_pkg_json(self.env.pkg_json_fs(), &package_json_path)?; if let Some(package_json) = maybe_package_json { if let Some(main) = package_json.main(NodeModuleKind::Cjs) { - return Ok(to_file_specifier(&d.join(main).clean())); + return Ok(Some(to_file_specifier(&d.join(main).clean()))); } } - return Ok(to_file_specifier(&d.join("index.js").clean())); + return Ok(Some(to_file_specifier(&d.join("index.js").clean()))); } - return self - .file_extension_probe(d, &referrer_path) - .map(|p| to_file_specifier(&p)); + return Some( + self + .file_extension_probe(d, &referrer_path) + .map(|p| to_file_specifier(&p)), + ) + .transpose(); } else if let Some(main) = package_json.main(NodeModuleKind::Cjs) { - return Ok(to_file_specifier(&module_dir.join(main).clean())); + return Ok(Some(to_file_specifier(&module_dir.join(main).clean()))); } else { - return Ok(to_file_specifier(&module_dir.join("index.js").clean())); + return Ok(Some(to_file_specifier( + &module_dir.join("index.js").clean(), + ))); } } @@ -373,7 +395,7 @@ impl<TCjsCodeAnalyzer: CjsCodeAnalyzer, TNodeResolverEnv: NodeResolverEnv> parent.join("node_modules").join(specifier) }; if let Ok(path) = self.file_extension_probe(path, &referrer_path) { - return Ok(to_file_specifier(&path)); + return Ok(Some(to_file_specifier(&path))); } last = parent; } |