summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/args/mod.rs21
-rw-r--r--cli/factory.rs7
2 files changed, 21 insertions, 7 deletions
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index 696d0e560..c347ab6fd 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -75,6 +75,7 @@ use std::sync::Arc;
use thiserror::Error;
use crate::cache;
+use crate::cache::DenoDirProvider;
use crate::file_fetcher::FileFetcher;
use crate::util::fs::canonicalize_path_maybe_not_exists;
use crate::version;
@@ -780,6 +781,7 @@ pub struct CliOptions {
pub start_dir: Arc<WorkspaceDirectory>,
pub disable_deprecated_api_warning: bool,
pub verbose_deprecated_api_warning: bool,
+ pub deno_dir_provider: Arc<DenoDirProvider>,
}
impl CliOptions {
@@ -810,11 +812,14 @@ impl CliOptions {
let maybe_lockfile = maybe_lockfile.filter(|_| !force_global_cache);
let root_folder = start_dir.workspace.root_folder_configs();
+ let deno_dir_provider =
+ Arc::new(DenoDirProvider::new(flags.cache_path.clone()));
let maybe_node_modules_folder = resolve_node_modules_folder(
&initial_cwd,
&flags,
root_folder.deno_json.as_deref(),
root_folder.pkg_json.as_deref(),
+ &deno_dir_provider,
)
.with_context(|| "Resolving node_modules folder.")?;
@@ -837,6 +842,7 @@ impl CliOptions {
start_dir,
disable_deprecated_api_warning,
verbose_deprecated_api_warning,
+ deno_dir_provider,
})
}
@@ -1243,6 +1249,7 @@ impl CliOptions {
overrides: self.overrides.clone(),
disable_deprecated_api_warning: self.disable_deprecated_api_warning,
verbose_deprecated_api_warning: self.verbose_deprecated_api_warning,
+ deno_dir_provider: self.deno_dir_provider.clone(),
}
}
@@ -1768,6 +1775,7 @@ fn resolve_node_modules_folder(
flags: &Flags,
maybe_config_file: Option<&ConfigFile>,
maybe_package_json: Option<&PackageJson>,
+ deno_dir_provider: &Arc<DenoDirProvider>,
) -> Result<Option<PathBuf>, AnyError> {
let use_node_modules_dir = flags
.node_modules_dir
@@ -1779,7 +1787,18 @@ fn resolve_node_modules_folder(
} else if let Some(state) = &*NPM_PROCESS_STATE {
return Ok(state.local_node_modules_path.as_ref().map(PathBuf::from));
} else if let Some(package_json_path) = maybe_package_json.map(|c| &c.path) {
- // always auto-discover the local_node_modules_folder when a package.json exists
+ if let Ok(deno_dir) = deno_dir_provider.get_or_create() {
+ // `deno_dir.root` can be symlink in macOS
+ if let Ok(root) = canonicalize_path_maybe_not_exists(&deno_dir.root) {
+ if package_json_path.starts_with(root) {
+ // if the package.json is in deno_dir, then do not use node_modules
+ // next to it as local node_modules dir
+ return Ok(None);
+ }
+ }
+ }
+ // auto-discover the local_node_modules_folder when a package.json exists
+ // and it's not in deno_dir
package_json_path.parent().unwrap().join("node_modules")
} else if use_node_modules_dir.is_none() {
return Ok(None);
diff --git a/cli/factory.rs b/cli/factory.rs
index 942aefd25..25f6afa74 100644
--- a/cli/factory.rs
+++ b/cli/factory.rs
@@ -158,7 +158,6 @@ impl<T> Deferred<T> {
#[derive(Default)]
struct CliFactoryServices {
cli_options: Deferred<Arc<CliOptions>>,
- deno_dir_provider: Deferred<Arc<DenoDirProvider>>,
caches: Deferred<Arc<Caches>>,
file_fetcher: Deferred<Arc<FileFetcher>>,
global_http_cache: Deferred<Arc<GlobalHttpCache>>,
@@ -236,11 +235,7 @@ impl CliFactory {
}
pub fn deno_dir_provider(&self) -> Result<&Arc<DenoDirProvider>, AnyError> {
- self.services.deno_dir_provider.get_or_try_init(|| {
- Ok(Arc::new(DenoDirProvider::new(
- self.cli_options()?.maybe_custom_root().clone(),
- )))
- })
+ Ok(&self.cli_options()?.deno_dir_provider)
}
pub fn deno_dir(&self) -> Result<&DenoDir, AnyError> {