summaryrefslogtreecommitdiff
path: root/cli/args
diff options
context:
space:
mode:
Diffstat (limited to 'cli/args')
-rw-r--r--cli/args/config_file.rs39
-rw-r--r--cli/args/flags.rs61
-rw-r--r--cli/args/mod.rs40
3 files changed, 127 insertions, 13 deletions
diff --git a/cli/args/config_file.rs b/cli/args/config_file.rs
index 66b80b9d4..bbbc60e4d 100644
--- a/cli/args/config_file.rs
+++ b/cli/args/config_file.rs
@@ -673,6 +673,7 @@ pub struct ConfigFileJson {
pub lock: Option<Value>,
pub exclude: Option<Value>,
pub node_modules_dir: Option<bool>,
+ pub deno_modules_dir: Option<bool>,
}
#[derive(Clone, Debug)]
@@ -858,6 +859,26 @@ impl ConfigFile {
self.json.node_modules_dir
}
+ pub fn deno_modules_dir(&self) -> Option<bool> {
+ self.json.deno_modules_dir
+ }
+
+ pub fn deno_modules_dir_path(&self) -> Option<PathBuf> {
+ if self.json.deno_modules_dir == Some(true) {
+ Some(
+ self
+ .specifier
+ .to_file_path()
+ .unwrap()
+ .parent()
+ .unwrap()
+ .join("deno_modules"),
+ )
+ } else {
+ None
+ }
+ }
+
pub fn to_import_map_value(&self) -> Value {
let mut value = serde_json::Map::with_capacity(2);
if let Some(imports) = &self.json.imports {
@@ -874,13 +895,17 @@ impl ConfigFile {
}
pub fn to_files_config(&self) -> Result<Option<FilesConfig>, AnyError> {
- let exclude: Vec<String> = if let Some(exclude) = self.json.exclude.clone()
- {
- serde_json::from_value(exclude)
- .context("Failed to parse \"exclude\" configuration")?
- } else {
- Vec::new()
- };
+ let mut exclude: Vec<String> =
+ if let Some(exclude) = self.json.exclude.clone() {
+ serde_json::from_value(exclude)
+ .context("Failed to parse \"exclude\" configuration")?
+ } else {
+ Vec::new()
+ };
+
+ if self.deno_modules_dir() == Some(true) {
+ exclude.push("deno_modules".to_string());
+ }
let raw_files_config = SerializedFilesConfig {
exclude,
diff --git a/cli/args/flags.rs b/cli/args/flags.rs
index 5c87c5fbb..96dfbbaf5 100644
--- a/cli/args/flags.rs
+++ b/cli/args/flags.rs
@@ -372,6 +372,7 @@ pub struct Flags {
pub type_check_mode: TypeCheckMode,
pub config_flag: ConfigFlag,
pub node_modules_dir: Option<bool>,
+ pub deno_modules_dir: Option<bool>,
pub enable_testing_features: bool,
pub ext: Option<String>,
pub ignore: Vec<PathBuf>,
@@ -1445,6 +1446,7 @@ TypeScript compiler cache: Subdirectory containing TS compiler output.",
.arg(config_arg())
.arg(import_map_arg())
.arg(node_modules_dir_arg())
+ .arg(deno_modules_dir_arg())
.arg(
Arg::new("json")
.long("json")
@@ -1988,6 +1990,7 @@ Remote modules and multiple modules may also be specified:
.arg(import_map_arg())
.arg(lock_arg())
.arg(node_modules_dir_arg())
+ .arg(deno_modules_dir_arg())
.arg(reload_arg())
.arg(ca_file_arg()))
}
@@ -2002,6 +2005,7 @@ fn compile_args_without_check_args(app: Command) -> Command {
.arg(no_remote_arg())
.arg(no_npm_arg())
.arg(node_modules_dir_arg())
+ .arg(deno_modules_dir_arg())
.arg(config_arg())
.arg(no_config_arg())
.arg(reload_arg())
@@ -2560,6 +2564,16 @@ fn node_modules_dir_arg() -> Arg {
.help("Enables or disables the use of a local node_modules folder for npm packages")
}
+fn deno_modules_dir_arg() -> Arg {
+ Arg::new("deno-modules-dir")
+ .long("deno-modules-dir")
+ .num_args(0..=1)
+ .value_parser(value_parser!(bool))
+ .default_missing_value("true")
+ .require_equals(true)
+ .help("UNSTABLE: Enables or disables the use of a local deno_modules folder for remote modules")
+}
+
fn unsafely_ignore_certificate_errors_arg() -> Arg {
Arg::new("unsafely-ignore-certificate-errors")
.long("unsafely-ignore-certificate-errors")
@@ -2847,7 +2861,7 @@ fn info_parse(flags: &mut Flags, matches: &mut ArgMatches) {
import_map_arg_parse(flags, matches);
location_arg_parse(flags, matches);
ca_file_arg_parse(flags, matches);
- node_modules_dir_arg_parse(flags, matches);
+ node_and_deno_modules_dir_arg_parse(flags, matches);
lock_arg_parse(flags, matches);
no_lock_arg_parse(flags, matches);
no_remote_arg_parse(flags, matches);
@@ -3107,7 +3121,7 @@ fn vendor_parse(flags: &mut Flags, matches: &mut ArgMatches) {
config_args_parse(flags, matches);
import_map_arg_parse(flags, matches);
lock_arg_parse(flags, matches);
- node_modules_dir_arg_parse(flags, matches);
+ node_and_deno_modules_dir_arg_parse(flags, matches);
reload_arg_parse(flags, matches);
flags.subcommand = DenoSubcommand::Vendor(VendorFlags {
@@ -3133,7 +3147,7 @@ fn compile_args_without_check_parse(
import_map_arg_parse(flags, matches);
no_remote_arg_parse(flags, matches);
no_npm_arg_parse(flags, matches);
- node_modules_dir_arg_parse(flags, matches);
+ node_and_deno_modules_dir_arg_parse(flags, matches);
config_args_parse(flags, matches);
reload_arg_parse(flags, matches);
lock_args_parse(flags, matches);
@@ -3387,8 +3401,12 @@ fn no_npm_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
}
}
-fn node_modules_dir_arg_parse(flags: &mut Flags, matches: &mut ArgMatches) {
+fn node_and_deno_modules_dir_arg_parse(
+ flags: &mut Flags,
+ matches: &mut ArgMatches,
+) {
flags.node_modules_dir = matches.remove_one::<bool>("node-modules-dir");
+ flags.deno_modules_dir = matches.remove_one::<bool>("deno-modules-dir");
}
fn reload_arg_validate(urlstr: &str) -> Result<String, String> {
@@ -5724,6 +5742,41 @@ mod tests {
}
#[test]
+ fn deno_modules_dir() {
+ let r =
+ flags_from_vec(svec!["deno", "run", "--deno-modules-dir", "script.ts"]);
+ assert_eq!(
+ r.unwrap(),
+ Flags {
+ subcommand: DenoSubcommand::Run(RunFlags {
+ script: "script.ts".to_string(),
+ watch: Default::default(),
+ }),
+ deno_modules_dir: Some(true),
+ ..Flags::default()
+ }
+ );
+
+ let r = flags_from_vec(svec![
+ "deno",
+ "run",
+ "--deno-modules-dir=false",
+ "script.ts"
+ ]);
+ assert_eq!(
+ r.unwrap(),
+ Flags {
+ subcommand: DenoSubcommand::Run(RunFlags {
+ script: "script.ts".to_string(),
+ watch: Default::default(),
+ }),
+ deno_modules_dir: Some(false),
+ ..Flags::default()
+ }
+ );
+ }
+
+ #[test]
fn cached_only() {
let r = flags_from_vec(svec!["deno", "run", "--cached-only", "script.ts"]);
assert_eq!(
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index 68cd3faa7..9df26b063 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -539,6 +539,7 @@ pub struct CliOptions {
flags: Flags,
initial_cwd: PathBuf,
maybe_node_modules_folder: Option<PathBuf>,
+ maybe_deno_modules_folder: Option<PathBuf>,
maybe_config_file: Option<ConfigFile>,
maybe_package_json: Option<PackageJson>,
maybe_lockfile: Option<Arc<Mutex<Lockfile>>>,
@@ -567,13 +568,18 @@ impl CliOptions {
eprintln!("{}", colors::yellow(msg));
}
- let maybe_node_modules_folder = resolve_local_node_modules_folder(
+ let maybe_node_modules_folder = resolve_node_modules_folder(
&initial_cwd,
&flags,
maybe_config_file.as_ref(),
maybe_package_json.as_ref(),
)
.with_context(|| "Resolving node_modules folder.")?;
+ let maybe_deno_modules_folder = resolve_deno_modules_folder(
+ &initial_cwd,
+ &flags,
+ maybe_config_file.as_ref(),
+ );
Ok(Self {
flags,
@@ -582,6 +588,7 @@ impl CliOptions {
maybe_lockfile,
maybe_package_json,
maybe_node_modules_folder,
+ maybe_deno_modules_folder,
overrides: Default::default(),
})
}
@@ -865,6 +872,10 @@ impl CliOptions {
.map(|path| ModuleSpecifier::from_directory_path(path).unwrap())
}
+ pub fn deno_modules_dir_path(&self) -> Option<&PathBuf> {
+ self.maybe_deno_modules_folder.as_ref()
+ }
+
pub fn resolve_root_cert_store_provider(
&self,
) -> Arc<dyn RootCertStoreProvider> {
@@ -1159,7 +1170,7 @@ impl CliOptions {
}
/// Resolves the path to use for a local node_modules folder.
-fn resolve_local_node_modules_folder(
+fn resolve_node_modules_folder(
cwd: &Path,
flags: &Flags,
maybe_config_file: Option<&ConfigFile>,
@@ -1188,6 +1199,31 @@ fn resolve_local_node_modules_folder(
Ok(Some(canonicalize_path_maybe_not_exists(&path)?))
}
+fn resolve_deno_modules_folder(
+ cwd: &Path,
+ flags: &Flags,
+ maybe_config_file: Option<&ConfigFile>,
+) -> Option<PathBuf> {
+ let use_deno_modules_dir = flags
+ .deno_modules_dir
+ .or_else(|| maybe_config_file.and_then(|c| c.deno_modules_dir()))
+ .unwrap_or(false);
+ // Unlike the node_modules directory, there is no need to canonicalize
+ // this directory because it's just used as a cache and the resolved
+ // specifier is not based on the canonicalized path (unlike the modules
+ // in the node_modules folder).
+ if !use_deno_modules_dir {
+ None
+ } else if let Some(config_path) = maybe_config_file
+ .as_ref()
+ .and_then(|c| c.specifier.to_file_path().ok())
+ {
+ Some(config_path.parent().unwrap().join("deno_modules"))
+ } else {
+ Some(cwd.join("deno_modules"))
+ }
+}
+
fn resolve_import_map_specifier(
maybe_import_map_path: Option<&str>,
maybe_config_file: Option<&ConfigFile>,