diff options
Diffstat (limited to 'cli/module_loader.rs')
-rw-r--r-- | cli/module_loader.rs | 158 |
1 files changed, 99 insertions, 59 deletions
diff --git a/cli/module_loader.rs b/cli/module_loader.rs index 4a694e615..51b9ea598 100644 --- a/cli/module_loader.rs +++ b/cli/module_loader.rs @@ -50,10 +50,10 @@ use deno_runtime::deno_node::NodeResolution; use deno_runtime::deno_node::NodeResolutionMode; use deno_runtime::deno_node::NodeResolver; use deno_runtime::permissions::PermissionsContainer; -use deno_semver::npm::NpmPackageNvReference; use deno_semver::npm::NpmPackageReqReference; use std::borrow::Cow; use std::collections::HashSet; +use std::path::Path; use std::pin::Pin; use std::rc::Rc; use std::str; @@ -309,6 +309,7 @@ struct SharedCliModuleLoaderState { module_load_preparer: Arc<ModuleLoadPreparer>, prepared_module_loader: PreparedModuleLoader, resolver: Arc<CliGraphResolver>, + node_resolver: Arc<CliNodeResolver>, npm_module_loader: NpmModuleLoader, } @@ -317,6 +318,7 @@ pub struct CliModuleLoaderFactory { } impl CliModuleLoaderFactory { + #[allow(clippy::too_many_arguments)] pub fn new( options: &CliOptions, emitter: Arc<Emitter>, @@ -324,6 +326,7 @@ impl CliModuleLoaderFactory { module_load_preparer: Arc<ModuleLoadPreparer>, parsed_source_cache: Arc<ParsedSourceCache>, resolver: Arc<CliGraphResolver>, + node_resolver: Arc<CliNodeResolver>, npm_module_loader: NpmModuleLoader, ) -> Self { Self { @@ -343,6 +346,7 @@ impl CliModuleLoaderFactory { graph_container, module_load_preparer, resolver, + node_resolver, npm_module_loader, }), } @@ -471,11 +475,11 @@ impl ModuleLoader for CliModuleLoader { let referrer_result = deno_core::resolve_url_or_path(referrer, &cwd); if let Ok(referrer) = referrer_result.as_ref() { - if let Some(result) = self - .shared - .npm_module_loader - .resolve_if_in_npm_package(specifier, referrer, permissions) - { + if let Some(result) = self.shared.node_resolver.resolve_if_in_npm_package( + specifier, + referrer, + permissions, + ) { return result; } @@ -492,10 +496,28 @@ impl ModuleLoader for CliModuleLoader { let specifier = &resolved.specifier; return match graph.get(specifier) { - Some(Module::Npm(module)) => self - .shared - .npm_module_loader - .resolve_nv_ref(&module.nv_reference, permissions), + Some(Module::Npm(module)) => { + let package_folder = self + .shared + .node_resolver + .npm_resolver + .as_managed() + .unwrap() // byonm won't create a Module::Npm + .resolve_pkg_folder_from_deno_module( + module.nv_reference.nv(), + )?; + self + .shared + .node_resolver + .resolve_package_sub_path( + &package_folder, + module.nv_reference.sub_path(), + permissions, + ) + .with_context(|| { + format!("Could not resolve '{}'.", module.nv_reference) + }) + } Some(Module::Node(module)) => Ok(module.specifier.clone()), Some(Module::Esm(module)) => Ok(module.specifier.clone()), Some(Module::Json(module)) => Ok(module.specifier.clone()), @@ -538,10 +560,11 @@ impl ModuleLoader for CliModuleLoader { if let Ok(reference) = NpmPackageReqReference::from_specifier(&specifier) { - return self - .shared - .npm_module_loader - .resolve_req_reference(&reference, permissions); + return self.shared.node_resolver.resolve_req_reference( + &reference, + permissions, + &referrer, + ); } } } @@ -642,38 +665,36 @@ impl SourceMapGetter for CliSourceMapGetter { } } -pub struct NpmModuleLoader { +pub struct CliNodeResolver { cjs_resolutions: Arc<CjsResolutionStore>, - node_code_translator: Arc<CliNodeCodeTranslator>, - fs: Arc<dyn deno_fs::FileSystem>, node_resolver: Arc<NodeResolver>, npm_resolver: Arc<dyn CliNpmResolver>, } -impl NpmModuleLoader { +impl CliNodeResolver { pub fn new( cjs_resolutions: Arc<CjsResolutionStore>, - node_code_translator: Arc<CliNodeCodeTranslator>, - fs: Arc<dyn deno_fs::FileSystem>, node_resolver: Arc<NodeResolver>, npm_resolver: Arc<dyn CliNpmResolver>, ) -> Self { Self { cjs_resolutions, - node_code_translator, - fs, node_resolver, npm_resolver, } } + pub fn in_npm_package(&self, referrer: &ModuleSpecifier) -> bool { + self.npm_resolver.in_npm_package(referrer) + } + pub fn resolve_if_in_npm_package( &self, specifier: &str, referrer: &ModuleSpecifier, permissions: &PermissionsContainer, ) -> Option<Result<ModuleSpecifier, AnyError>> { - if self.node_resolver.in_npm_package(referrer) { + if self.in_npm_package(referrer) { // we're in an npm package, so use node resolution Some( self @@ -692,40 +713,74 @@ impl NpmModuleLoader { } } - pub fn resolve_nv_ref( + pub fn resolve_req_reference( &self, - nv_ref: &NpmPackageNvReference, + req_ref: &NpmPackageReqReference, permissions: &PermissionsContainer, + referrer: &ModuleSpecifier, ) -> Result<ModuleSpecifier, AnyError> { let package_folder = self .npm_resolver - .resolve_pkg_folder_from_deno_module(nv_ref.nv())?; + .resolve_pkg_folder_from_deno_module_req(req_ref.req(), referrer)?; self - .handle_node_resolve_result(self.node_resolver.resolve_npm_reference( + .resolve_package_sub_path( &package_folder, - nv_ref.sub_path(), - NodeResolutionMode::Execution, + req_ref.sub_path(), permissions, - )) - .with_context(|| format!("Could not resolve '{}'.", nv_ref)) + ) + .with_context(|| format!("Could not resolve '{}'.", req_ref)) } - pub fn resolve_req_reference( + fn resolve_package_sub_path( &self, - req_ref: &NpmPackageReqReference, + package_folder: &Path, + sub_path: Option<&str>, permissions: &PermissionsContainer, ) -> Result<ModuleSpecifier, AnyError> { - let package_folder = self - .npm_resolver - .resolve_pkg_folder_from_deno_module_req(req_ref.req())?; - self - .handle_node_resolve_result(self.node_resolver.resolve_npm_reference( - &package_folder, - req_ref.sub_path(), - NodeResolutionMode::Execution, - permissions, - )) - .with_context(|| format!("Could not resolve '{}'.", req_ref)) + self.handle_node_resolve_result(self.node_resolver.resolve_npm_reference( + package_folder, + sub_path, + NodeResolutionMode::Execution, + permissions, + )) + } + + fn handle_node_resolve_result( + &self, + result: Result<Option<NodeResolution>, AnyError>, + ) -> Result<ModuleSpecifier, AnyError> { + let response = match result? { + Some(response) => response, + None => return Err(generic_error("not found")), + }; + if let NodeResolution::CommonJs(specifier) = &response { + // remember that this was a common js resolution + self.cjs_resolutions.insert(specifier.clone()); + } + Ok(response.into_url()) + } +} + +pub struct NpmModuleLoader { + cjs_resolutions: Arc<CjsResolutionStore>, + node_code_translator: Arc<CliNodeCodeTranslator>, + fs: Arc<dyn deno_fs::FileSystem>, + node_resolver: Arc<CliNodeResolver>, +} + +impl NpmModuleLoader { + pub fn new( + cjs_resolutions: Arc<CjsResolutionStore>, + node_code_translator: Arc<CliNodeCodeTranslator>, + fs: Arc<dyn deno_fs::FileSystem>, + node_resolver: Arc<CliNodeResolver>, + ) -> Self { + Self { + cjs_resolutions, + node_code_translator, + fs, + node_resolver, + } } pub fn maybe_prepare_load( @@ -812,21 +867,6 @@ impl NpmModuleLoader { media_type: MediaType::from_specifier(specifier), }) } - - fn handle_node_resolve_result( - &self, - result: Result<Option<NodeResolution>, AnyError>, - ) -> Result<ModuleSpecifier, AnyError> { - let response = match result? { - Some(response) => response, - None => return Err(generic_error("not found")), - }; - if let NodeResolution::CommonJs(specifier) = &response { - // remember that this was a common js resolution - self.cjs_resolutions.insert(specifier.clone()); - } - Ok(response.into_url()) - } } /// Keeps track of what module specifiers were resolved as CJS. |