summaryrefslogtreecommitdiff
path: root/cli/resolver.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-04-12 08:36:11 -0400
committerGitHub <noreply@github.com>2023-04-12 08:36:11 -0400
commit0e3f62d4446ae7b9a64dacf7befcaecede118222 (patch)
treefc1cbbbb294e61bb61e8d8ed89fa50cc9e9efa34 /cli/resolver.rs
parent806671af3345f403d122911d8a3f09a2994bb8c0 (diff)
fix(npm): cache bust npm specifiers more aggressively (#18636)
Part 1: #18622 Part 2: This PR Closes #16901 --------- Co-authored-by: Luca Casonato <hello@lcas.dev>
Diffstat (limited to 'cli/resolver.rs')
-rw-r--r--cli/resolver.rs38
1 files changed, 23 insertions, 15 deletions
diff --git a/cli/resolver.rs b/cli/resolver.rs
index 56bae25c1..9aaa9d8b6 100644
--- a/cli/resolver.rs
+++ b/cli/resolver.rs
@@ -1,27 +1,26 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
use deno_core::anyhow::anyhow;
-use deno_core::anyhow::bail;
use deno_core::error::AnyError;
use deno_core::futures::future;
use deno_core::futures::future::LocalBoxFuture;
use deno_core::futures::FutureExt;
use deno_core::ModuleSpecifier;
use deno_core::TaskQueue;
+use deno_graph::source::NpmPackageReqResolution;
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::npm::NpmPackageNv;
use deno_semver::npm::NpmPackageReq;
use import_map::ImportMap;
use std::sync::Arc;
use crate::args::package_json::PackageJsonDeps;
use crate::args::JsxImportSourceConfig;
-use crate::npm::NpmRegistry;
+use crate::npm::CliNpmRegistryApi;
use crate::npm::NpmResolution;
use crate::npm::PackageJsonDepsInstaller;
use crate::util::sync::AtomicFlag;
@@ -34,7 +33,7 @@ pub struct CliGraphResolver {
maybe_default_jsx_import_source: Option<String>,
maybe_jsx_import_source_module: Option<String>,
no_npm: bool,
- npm_registry_api: NpmRegistry,
+ npm_registry_api: CliNpmRegistryApi,
npm_resolution: NpmResolution,
package_json_deps_installer: PackageJsonDepsInstaller,
found_package_json_dep_flag: Arc<AtomicFlag>,
@@ -45,7 +44,7 @@ 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 = NpmRegistry::new_uninitialized();
+ let npm_registry_api = CliNpmRegistryApi::new_uninitialized();
let npm_resolution =
NpmResolution::new(npm_registry_api.clone(), None, None);
Self {
@@ -67,7 +66,7 @@ impl CliGraphResolver {
maybe_jsx_import_source_config: Option<JsxImportSourceConfig>,
maybe_import_map: Option<Arc<ImportMap>>,
no_npm: bool,
- npm_registry_api: NpmRegistry,
+ npm_registry_api: CliNpmRegistryApi,
npm_resolution: NpmResolution,
package_json_deps_installer: PackageJsonDepsInstaller,
) -> Self {
@@ -204,7 +203,7 @@ impl NpmResolver for CliGraphResolver {
fn load_and_cache_npm_package_info(
&self,
package_name: &str,
- ) -> LocalBoxFuture<'static, Result<(), String>> {
+ ) -> LocalBoxFuture<'static, Result<(), AnyError>> {
if self.no_npm {
// return it succeeded and error at the import site below
return Box::pin(future::ready(Ok(())));
@@ -224,7 +223,7 @@ impl NpmResolver for CliGraphResolver {
.package_info(&package_name)
.await
.map(|_| ())
- .map_err(|err| format!("{err:#}"));
+ .map_err(|err| err.into());
drop(permit);
result
}
@@ -234,17 +233,26 @@ impl NpmResolver for CliGraphResolver {
fn resolve_npm(
&self,
package_req: &NpmPackageReq,
- ) -> Result<NpmPackageNv, AnyError> {
+ ) -> NpmPackageReqResolution {
if self.no_npm {
- bail!("npm specifiers were requested; but --no-npm is specified")
+ return NpmPackageReqResolution::Err(anyhow!(
+ "npm specifiers were requested; but --no-npm is specified"
+ ));
}
- match self
+
+ let result = self
.npm_resolution
- .resolve_package_req_as_pending(package_req)
- {
- Ok(nv) => Ok(nv),
+ .resolve_package_req_as_pending(package_req);
+ match result {
+ Ok(nv) => NpmPackageReqResolution::Ok(nv),
Err(err) => {
- bail!("{:#} Try retrieving the latest npm package information by running with --reload", err)
+ if self.npm_registry_api.mark_force_reload() {
+ log::debug!("Restarting npm specifier resolution to check for new registry information. Error: {:#}", err);
+ self.npm_registry_api.clear_memory_cache();
+ NpmPackageReqResolution::ReloadRegistryInfo(err.into())
+ } else {
+ NpmPackageReqResolution::Err(err.into())
+ }
}
}
}