summaryrefslogtreecommitdiff
path: root/cli/resolver.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/resolver.rs')
-rw-r--r--cli/resolver.rs117
1 files changed, 28 insertions, 89 deletions
diff --git a/cli/resolver.rs b/cli/resolver.rs
index 1cbd3356e..cc1059aed 100644
--- a/cli/resolver.rs
+++ b/cli/resolver.rs
@@ -12,7 +12,6 @@ use deno_graph::source::NpmResolver;
use deno_graph::source::Resolver;
use deno_graph::source::UnknownBuiltInNodeModuleError;
use deno_graph::source::DEFAULT_JSX_IMPORT_SOURCE_MODULE;
-use deno_npm::registry::NpmRegistryApi;
use deno_runtime::deno_node::is_builtin_node_module;
use deno_semver::package::PackageReq;
use import_map::ImportMap;
@@ -22,9 +21,7 @@ use std::sync::Arc;
use crate::args::package_json::PackageJsonDeps;
use crate::args::JsxImportSourceConfig;
use crate::args::PackageJsonDepsProvider;
-use crate::npm::CliNpmRegistryApi;
-use crate::npm::NpmResolution;
-use crate::npm::PackageJsonDepsInstaller;
+use crate::npm::CliNpmResolver;
use crate::util::sync::AtomicFlag;
/// Result of checking if a specifier is mapped via
@@ -104,53 +101,20 @@ pub struct CliGraphResolver {
maybe_default_jsx_import_source: Option<String>,
maybe_jsx_import_source_module: Option<String>,
maybe_vendor_specifier: Option<ModuleSpecifier>,
- no_npm: bool,
- npm_registry_api: Arc<CliNpmRegistryApi>,
- npm_resolution: Arc<NpmResolution>,
- package_json_deps_installer: Arc<PackageJsonDepsInstaller>,
+ npm_resolver: Option<Arc<dyn CliNpmResolver>>,
found_package_json_dep_flag: Arc<AtomicFlag>,
}
-impl Default for CliGraphResolver {
- fn default() -> Self {
- // This is not ideal, but necessary for the LSP. In the future, we should
- // refactor the LSP and force this to be initialized.
- let npm_registry_api = Arc::new(CliNpmRegistryApi::new_uninitialized());
- let npm_resolution = Arc::new(NpmResolution::from_serialized(
- npm_registry_api.clone(),
- None,
- None,
- ));
- Self {
- mapped_specifier_resolver: MappedSpecifierResolver {
- maybe_import_map: Default::default(),
- package_json_deps_provider: Default::default(),
- },
- maybe_default_jsx_import_source: None,
- maybe_jsx_import_source_module: None,
- maybe_vendor_specifier: None,
- no_npm: false,
- npm_registry_api,
- npm_resolution,
- package_json_deps_installer: Default::default(),
- found_package_json_dep_flag: Default::default(),
- }
- }
-}
-
pub struct CliGraphResolverOptions<'a> {
pub maybe_jsx_import_source_config: Option<JsxImportSourceConfig>,
pub maybe_import_map: Option<Arc<ImportMap>>,
pub maybe_vendor_dir: Option<&'a PathBuf>,
- pub no_npm: bool,
}
impl CliGraphResolver {
pub fn new(
- npm_registry_api: Arc<CliNpmRegistryApi>,
- npm_resolution: Arc<NpmResolution>,
+ npm_resolver: Option<Arc<dyn CliNpmResolver>>,
package_json_deps_provider: Arc<PackageJsonDepsProvider>,
- package_json_deps_installer: Arc<PackageJsonDepsInstaller>,
options: CliGraphResolverOptions,
) -> Self {
Self {
@@ -168,10 +132,7 @@ impl CliGraphResolver {
maybe_vendor_specifier: options
.maybe_vendor_dir
.and_then(|v| ModuleSpecifier::from_directory_path(v).ok()),
- no_npm: options.no_npm,
- npm_registry_api,
- npm_resolution,
- package_json_deps_installer,
+ npm_resolver,
found_package_json_dep_flag: Default::default(),
}
}
@@ -184,22 +145,8 @@ impl CliGraphResolver {
self
}
- pub async fn force_top_level_package_json_install(
- &self,
- ) -> Result<(), AnyError> {
- self
- .package_json_deps_installer
- .ensure_top_level_install()
- .await
- }
-
- pub async fn top_level_package_json_install_if_necessary(
- &self,
- ) -> Result<(), AnyError> {
- if self.found_package_json_dep_flag.is_raised() {
- self.force_top_level_package_json_install().await?;
- }
- Ok(())
+ pub fn found_package_json_dep(&self) -> bool {
+ self.found_package_json_dep_flag.is_raised()
}
}
@@ -295,41 +242,33 @@ impl NpmResolver for CliGraphResolver {
&self,
package_name: &str,
) -> LocalBoxFuture<'static, Result<(), AnyError>> {
- if self.no_npm {
- // return it succeeded and error at the import site below
- return Box::pin(future::ready(Ok(())));
- }
- // this will internally cache the package information
- let package_name = package_name.to_string();
- let api = self.npm_registry_api.clone();
- async move {
- api
- .package_info(&package_name)
- .await
- .map(|_| ())
- .map_err(|err| err.into())
+ match &self.npm_resolver {
+ Some(npm_resolver) if npm_resolver.as_managed().is_some() => {
+ let package_name = package_name.to_string();
+ let npm_resolver = npm_resolver.clone();
+ async move {
+ if let Some(managed) = npm_resolver.as_managed() {
+ managed.cache_package_info(&package_name).await?;
+ }
+ Ok(())
+ }
+ .boxed()
+ }
+ _ => {
+ // return it succeeded and error at the import site below
+ Box::pin(future::ready(Ok(())))
+ }
}
- .boxed()
}
fn resolve_npm(&self, package_req: &PackageReq) -> NpmPackageReqResolution {
- if self.no_npm {
- return NpmPackageReqResolution::Err(anyhow!(
- "npm specifiers were requested; but --no-npm is specified"
- ));
- }
-
- let result = self.npm_resolution.resolve_pkg_req_as_pending(package_req);
- match result {
- Ok(nv) => NpmPackageReqResolution::Ok(nv),
- Err(err) => {
- if self.npm_registry_api.mark_force_reload() {
- log::debug!("Restarting npm specifier resolution to check for new registry information. Error: {:#}", err);
- NpmPackageReqResolution::ReloadRegistryInfo(err.into())
- } else {
- NpmPackageReqResolution::Err(err.into())
- }
+ match &self.npm_resolver {
+ Some(npm_resolver) => {
+ npm_resolver.resolve_npm_for_deno_graph(package_req)
}
+ None => NpmPackageReqResolution::Err(anyhow!(
+ "npm specifiers were requested; but --no-npm is specified"
+ )),
}
}
}