summaryrefslogtreecommitdiff
path: root/cli/args/mod.rs
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-08-29 15:57:43 -0700
committerGitHub <noreply@github.com>2024-08-29 15:57:43 -0700
commit86d5b919d8ef55070e95230c9268f69cf58c25c8 (patch)
tree7d005a7116ecb44fc95e64489eac66f786d2ef11 /cli/args/mod.rs
parent0fb8df6c0ce582c947a8e165c7fb31cd4ec0c3ca (diff)
feat(config): Node modules option for 2.0 (#25299)
Diffstat (limited to 'cli/args/mod.rs')
-rw-r--r--cli/args/mod.rs77
1 files changed, 59 insertions, 18 deletions
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index bd5309c01..a0888ca58 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -8,6 +8,7 @@ mod lockfile;
mod package_json;
use deno_ast::SourceMapOption;
+use deno_config::deno_json::NodeModulesMode;
use deno_config::workspace::CreateResolverOptions;
use deno_config::workspace::PackageJsonDepResolution;
use deno_config::workspace::VendorEnablement;
@@ -819,6 +820,7 @@ impl CliOptions {
let maybe_node_modules_folder = resolve_node_modules_folder(
&initial_cwd,
&flags,
+ &start_dir.workspace,
root_folder.deno_json.as_deref(),
root_folder.pkg_json.as_deref(),
&deno_dir_provider,
@@ -917,6 +919,10 @@ impl CliOptions {
};
for diagnostic in start_dir.workspace.diagnostics() {
+ // TODO(2.0): remove
+ if matches!(diagnostic.kind, deno_config::workspace::WorkspaceDiagnosticKind::DeprecatedNodeModulesDirOption(_)) && !*DENO_FUTURE {
+ continue;
+ }
log::warn!("{} {}", colors::yellow("Warning"), diagnostic);
}
@@ -1255,11 +1261,29 @@ impl CliOptions {
}
}
- pub fn node_modules_dir_enablement(&self) -> Option<bool> {
- self
- .flags
- .node_modules_dir
- .or_else(|| self.workspace().node_modules_dir())
+ pub fn node_modules_mode(&self) -> Result<Option<NodeModulesMode>, AnyError> {
+ if *DENO_FUTURE {
+ if let Some(flag) = self.flags.node_modules_mode {
+ return Ok(Some(flag));
+ }
+ self.workspace().node_modules_mode().map_err(Into::into)
+ } else {
+ Ok(
+ self
+ .flags
+ .node_modules_dir
+ .or_else(|| self.workspace().node_modules_dir())
+ .map(|enabled| {
+ if enabled && self.byonm_enabled() {
+ NodeModulesMode::LocalManual
+ } else if enabled {
+ NodeModulesMode::LocalAuto
+ } else {
+ NodeModulesMode::GlobalAuto
+ }
+ }),
+ )
+ }
}
pub fn vendor_dir_path(&self) -> Option<&PathBuf> {
@@ -1611,9 +1635,19 @@ impl CliOptions {
|| self.workspace().has_unstable("bare-node-builtins")
}
+ fn byonm_enabled(&self) -> bool {
+ // check if enabled via unstable
+ self.flags.unstable_config.byonm
+ || NPM_PROCESS_STATE
+ .as_ref()
+ .map(|s| matches!(s.kind, NpmProcessStateKind::Byonm))
+ .unwrap_or(false)
+ || self.workspace().has_unstable("byonm")
+ }
+
pub fn use_byonm(&self) -> bool {
if self.enable_future_features()
- && self.node_modules_dir_enablement().is_none()
+ && self.node_modules_mode().ok().flatten().is_none()
&& self.maybe_node_modules_folder.is_some()
&& self
.workspace()
@@ -1624,13 +1658,7 @@ impl CliOptions {
return true;
}
- // check if enabled via unstable
- self.flags.unstable_config.byonm
- || NPM_PROCESS_STATE
- .as_ref()
- .map(|s| matches!(s.kind, NpmProcessStateKind::Byonm))
- .unwrap_or(false)
- || self.workspace().has_unstable("byonm")
+ self.byonm_enabled()
}
pub fn unstable_sloppy_imports(&self) -> bool {
@@ -1762,15 +1790,28 @@ impl CliOptions {
fn resolve_node_modules_folder(
cwd: &Path,
flags: &Flags,
+ workspace: &Workspace,
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
- .or_else(|| maybe_config_file.and_then(|c| c.json.node_modules_dir))
- .or(flags.vendor)
- .or_else(|| maybe_config_file.and_then(|c| c.json.vendor));
+ let use_node_modules_dir = if *DENO_FUTURE {
+ if let Some(mode) = flags.node_modules_mode {
+ Some(mode.uses_node_modules_dir())
+ } else {
+ workspace
+ .node_modules_mode()?
+ .map(|m| m.uses_node_modules_dir())
+ .or(flags.vendor)
+ .or_else(|| maybe_config_file.and_then(|c| c.json.vendor))
+ }
+ } else {
+ flags
+ .node_modules_dir
+ .or_else(|| maybe_config_file.and_then(|c| c.json.node_modules_dir))
+ .or(flags.vendor)
+ .or_else(|| maybe_config_file.and_then(|c| c.json.vendor))
+ };
let path = if use_node_modules_dir == Some(false) {
return Ok(None);
} else if let Some(state) = &*NPM_PROCESS_STATE {