fix(npm): support resolving npm specifiers not in graph with import.meta.resolve for resolved packages (#29732)

This commit is contained in:
David Sherret 2025-06-13 09:23:19 -04:00 committed by GitHub
parent 1f02d34877
commit 3d5ff3cf1c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 297 additions and 130 deletions

View file

@ -40,8 +40,6 @@ use crate::graph_container::ModuleGraphContainer;
use crate::graph_container::ModuleGraphUpdatePermit;
use crate::module_loader::ModuleLoadPreparer;
use crate::module_loader::PrepareModuleLoadOptions;
use crate::node::CliNodeResolver;
use crate::npm::CliNpmResolver;
use crate::resolver::CliResolver;
use crate::tools::bundle::externals::ExternalsMatcher;
@ -73,8 +71,8 @@ pub async fn bundle(
let resolver = factory.resolver().await?.clone();
let module_load_preparer = factory.module_load_preparer().await?.clone();
let root_permissions = factory.root_permissions_container()?;
let npm_resolver = factory.npm_resolver().await?.clone();
let node_resolver = factory.node_resolver().await?.clone();
let npm_resolver = factory.npm_resolver().await?;
let node_resolver = factory.node_resolver().await?;
let cli_options = factory.cli_options()?;
let module_loader = factory
.create_module_loader_factory()
@ -93,8 +91,6 @@ pub async fn bundle(
.await?
.clone(),
permissions: root_permissions.clone(),
npm_resolver: npm_resolver.clone(),
node_resolver: node_resolver.clone(),
module_loader: module_loader.clone(),
externals_matcher: if bundle_flags.external.is_empty() {
None
@ -358,8 +354,6 @@ struct DenoPluginHandler {
module_load_preparer: Arc<ModuleLoadPreparer>,
module_graph_container: Arc<MainModuleGraphContainer>,
permissions: PermissionsContainer,
npm_resolver: CliNpmResolver,
node_resolver: Arc<CliNodeResolver>,
module_loader: Rc<dyn ModuleLoader>,
externals_matcher: Option<ExternalsMatcher>,
}
@ -655,21 +649,12 @@ impl DenoPluginHandler {
),
deno_graph::Module::Wasm(_) => todo!(),
deno_graph::Module::Npm(module) => {
let package_folder = self
.npm_resolver
.as_managed()
.unwrap() // byonm won't create a Module::Npm
.resolve_pkg_folder_from_deno_module(module.nv_reference.nv())?;
let path = self
.node_resolver
.resolve_package_subpath_from_deno_module(
&package_folder,
module.nv_reference.sub_path(),
None,
ResolutionMode::Import,
NodeResolutionKind::Execution,
)?;
let url = path.clone().into_url()?;
let url = self.resolver.resolve_npm_nv_ref(
&module.nv_reference,
None,
ResolutionMode::Import,
NodeResolutionKind::Execution,
)?;
let (media_type, _charset) =
deno_media_type::resolve_media_type_and_charset_from_content_type(
&url, None,