summaryrefslogtreecommitdiff
path: root/cli/args/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/args/mod.rs')
-rw-r--r--cli/args/mod.rs153
1 files changed, 112 insertions, 41 deletions
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index 07906a86a..ec75d7a10 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -7,6 +7,7 @@ mod import_map;
mod lockfile;
mod package_json;
+use deno_ast::MediaType;
use deno_ast::SourceMapOption;
use deno_config::deno_json::NodeModulesDirMode;
use deno_config::workspace::CreateResolverOptions;
@@ -27,13 +28,13 @@ use deno_npm::npm_rc::ResolvedNpmRc;
use deno_npm::resolution::ValidSerializedNpmResolutionSnapshot;
use deno_npm::NpmSystemInfo;
use deno_path_util::normalize_path;
+use deno_runtime::ops::otel::OtelConfig;
use deno_semver::npm::NpmPackageReqReference;
use import_map::resolve_import_map_value_from_specifier;
pub use deno_config::deno_json::BenchConfig;
pub use deno_config::deno_json::ConfigFile;
pub use deno_config::deno_json::FmtOptionsConfig;
-pub use deno_config::deno_json::JsxImportSourceConfig;
pub use deno_config::deno_json::LintRulesConfig;
pub use deno_config::deno_json::ProseWrap;
pub use deno_config::deno_json::TsConfig;
@@ -46,6 +47,7 @@ pub use flags::*;
pub use lockfile::CliLockfile;
pub use lockfile::CliLockfileReadFromPathOptions;
pub use package_json::NpmInstallDepsProvider;
+pub use package_json::PackageJsonDepValueParseWithLocationError;
use deno_ast::ModuleSpecifier;
use deno_core::anyhow::bail;
@@ -200,6 +202,8 @@ pub fn ts_config_to_transpile_and_emit_options(
precompile_jsx_dynamic_props: None,
transform_jsx,
var_decl_imports: false,
+ // todo(dsherret): support verbatim_module_syntax here properly
+ verbatim_module_syntax: false,
},
deno_ast::EmitOptions {
inline_sources: options.inline_sources,
@@ -578,6 +582,7 @@ fn discover_npmrc(
let resolved = npmrc
.as_resolved(npm_registry_url())
.context("Failed to resolve .npmrc options")?;
+ log::debug!(".npmrc found at: '{}'", path.display());
Ok(Arc::new(resolved))
}
@@ -818,10 +823,8 @@ impl CliOptions {
};
let msg =
format!("DANGER: TLS certificate validation is disabled {}", domains);
- #[allow(clippy::print_stderr)]
{
- // use eprintln instead of log::warn so this always gets shown
- eprintln!("{}", colors::yellow(msg));
+ log::error!("{}", colors::yellow(msg));
}
}
@@ -865,12 +868,8 @@ impl CliOptions {
} else {
&[]
};
- let config_parse_options = deno_config::deno_json::ConfigParseOptions {
- include_task_comments: matches!(
- flags.subcommand,
- DenoSubcommand::Task(..)
- ),
- };
+ let config_parse_options =
+ deno_config::deno_json::ConfigParseOptions::default();
let discover_pkg_json = flags.config_flag != ConfigFlag::Disabled
&& !flags.no_npm
&& !has_flag_env_var("DENO_NO_PACKAGE_JSON");
@@ -963,6 +962,9 @@ impl CliOptions {
match self.sub_command() {
DenoSubcommand::Cache(_) => GraphKind::All,
DenoSubcommand::Check(_) => GraphKind::TypesOnly,
+ DenoSubcommand::Install(InstallFlags {
+ kind: InstallKind::Local(_),
+ }) => GraphKind::All,
_ => self.type_check_mode().as_graph_kind(),
}
}
@@ -1122,7 +1124,11 @@ impl CliOptions {
}
}
- pub fn env_file_name(&self) -> Option<&String> {
+ pub fn otel_config(&self) -> Option<OtelConfig> {
+ self.flags.otel_config()
+ }
+
+ pub fn env_file_name(&self) -> Option<&Vec<String>> {
self.flags.env_file.as_ref()
}
@@ -1130,21 +1136,34 @@ impl CliOptions {
self
.main_module_cell
.get_or_init(|| {
- let main_module = match &self.flags.subcommand {
+ Ok(match &self.flags.subcommand {
DenoSubcommand::Compile(compile_flags) => {
resolve_url_or_path(&compile_flags.source_file, self.initial_cwd())?
}
DenoSubcommand::Eval(_) => {
- resolve_url_or_path("./$deno$eval.ts", self.initial_cwd())?
+ resolve_url_or_path("./$deno$eval.mts", self.initial_cwd())?
}
DenoSubcommand::Repl(_) => {
- resolve_url_or_path("./$deno$repl.ts", self.initial_cwd())?
+ resolve_url_or_path("./$deno$repl.mts", self.initial_cwd())?
}
DenoSubcommand::Run(run_flags) => {
if run_flags.is_stdin() {
- resolve_url_or_path("./$deno$stdin.ts", self.initial_cwd())?
+ resolve_url_or_path("./$deno$stdin.mts", self.initial_cwd())?
} else {
- resolve_url_or_path(&run_flags.script, self.initial_cwd())?
+ let url =
+ resolve_url_or_path(&run_flags.script, self.initial_cwd())?;
+ if self.is_node_main()
+ && url.scheme() == "file"
+ && MediaType::from_specifier(&url) == MediaType::Unknown
+ {
+ try_resolve_node_binary_main_entrypoint(
+ &run_flags.script,
+ self.initial_cwd(),
+ )?
+ .unwrap_or(url)
+ } else {
+ url
+ }
}
}
DenoSubcommand::Serve(run_flags) => {
@@ -1153,9 +1172,7 @@ impl CliOptions {
_ => {
bail!("No main module.")
}
- };
-
- Ok(main_module)
+ })
})
.as_ref()
.map_err(|err| deno_core::anyhow::anyhow!("{}", err))
@@ -1204,7 +1221,7 @@ impl CliOptions {
// This is triggered via a secret environment variable which is used
// for functionality like child_process.fork. Users should NOT depend
// on this functionality.
- pub fn is_npm_main(&self) -> bool {
+ pub fn is_node_main(&self) -> bool {
NPM_PROCESS_STATE.is_some()
}
@@ -1450,6 +1467,12 @@ impl CliOptions {
}) = &self.flags.subcommand
{
*hmr
+ } else if let DenoSubcommand::Serve(ServeFlags {
+ watch: Some(WatchFlagsWithPaths { hmr, .. }),
+ ..
+ }) = &self.flags.subcommand
+ {
+ *hmr
} else {
false
}
@@ -1576,6 +1599,13 @@ impl CliOptions {
|| self.workspace().has_unstable("bare-node-builtins")
}
+ pub fn detect_cjs(&self) -> bool {
+ // only enabled when there's a package.json in order to not have a
+ // perf penalty for non-npm Deno projects of searching for the closest
+ // package.json beside each module
+ self.workspace().package_jsons().next().is_some() || self.is_node_main()
+ }
+
fn byonm_enabled(&self) -> bool {
// check if enabled via unstable
self.node_modules_dir().ok().flatten() == Some(NodeModulesDirMode::Manual)
@@ -1586,6 +1616,15 @@ impl CliOptions {
}
pub fn use_byonm(&self) -> bool {
+ if matches!(
+ self.sub_command(),
+ DenoSubcommand::Install(_)
+ | DenoSubcommand::Add(_)
+ | DenoSubcommand::Remove(_)
+ ) {
+ // For `deno install/add/remove` we want to force the managed resolver so it can set up `node_modules/` directory.
+ return false;
+ }
if self.node_modules_dir().ok().flatten().is_none()
&& self.maybe_node_modules_folder.is_some()
&& self
@@ -1620,21 +1659,16 @@ impl CliOptions {
});
if !from_config_file.is_empty() {
- // collect unstable granular flags
- let mut all_valid_unstable_flags: Vec<&str> =
- crate::UNSTABLE_GRANULAR_FLAGS
- .iter()
- .map(|granular_flag| granular_flag.name)
- .collect();
-
- let mut another_unstable_flags = Vec::from([
- "sloppy-imports",
- "byonm",
- "bare-node-builtins",
- "fmt-component",
- ]);
- // add more unstable flags to the same vector holding granular flags
- all_valid_unstable_flags.append(&mut another_unstable_flags);
+ let all_valid_unstable_flags: Vec<&str> = crate::UNSTABLE_GRANULAR_FLAGS
+ .iter()
+ .map(|granular_flag| granular_flag.name)
+ .chain([
+ "sloppy-imports",
+ "byonm",
+ "bare-node-builtins",
+ "fmt-component",
+ ])
+ .collect();
// check and warn if the unstable flag of config file isn't supported, by
// iterating through the vector holding the unstable flags
@@ -1667,6 +1701,10 @@ impl CliOptions {
if let DenoSubcommand::Run(RunFlags {
watch: Some(WatchFlagsWithPaths { paths, .. }),
..
+ })
+ | DenoSubcommand::Serve(ServeFlags {
+ watch: Some(WatchFlagsWithPaths { paths, .. }),
+ ..
}) = &self.flags.subcommand
{
full_paths.extend(paths.iter().map(|path| self.initial_cwd.join(path)));
@@ -1766,6 +1804,36 @@ fn resolve_node_modules_folder(
Ok(Some(canonicalize_path_maybe_not_exists(&path)?))
}
+fn try_resolve_node_binary_main_entrypoint(
+ specifier: &str,
+ initial_cwd: &Path,
+) -> Result<Option<Url>, AnyError> {
+ // node allows running files at paths without a `.js` extension
+ // or at directories with an index.js file
+ let path = deno_core::normalize_path(initial_cwd.join(specifier));
+ if path.is_dir() {
+ let index_file = path.join("index.js");
+ Ok(if index_file.is_file() {
+ Some(deno_path_util::url_from_file_path(&index_file)?)
+ } else {
+ None
+ })
+ } else {
+ let path = path.with_extension(
+ path
+ .extension()
+ .and_then(|s| s.to_str())
+ .map(|s| format!("{}.js", s))
+ .unwrap_or("js".to_string()),
+ );
+ if path.is_file() {
+ Ok(Some(deno_path_util::url_from_file_path(&path)?))
+ } else {
+ Ok(None)
+ }
+ }
+}
+
fn resolve_import_map_specifier(
maybe_import_map_path: Option<&str>,
maybe_config_file: Option<&ConfigFile>,
@@ -1867,19 +1935,22 @@ pub fn config_to_deno_graph_workspace_member(
})
}
-fn load_env_variables_from_env_file(filename: Option<&String>) {
- let Some(env_file_name) = filename else {
+fn load_env_variables_from_env_file(filename: Option<&Vec<String>>) {
+ let Some(env_file_names) = filename else {
return;
};
- match from_filename(env_file_name) {
- Ok(_) => (),
- Err(error) => {
- match error {
+
+ for env_file_name in env_file_names.iter().rev() {
+ match from_filename(env_file_name) {
+ Ok(_) => (),
+ Err(error) => {
+ match error {
dotenvy::Error::LineParse(line, index)=> log::info!("{} Parsing failed within the specified environment file: {} at index: {} of the value: {}",colors::yellow("Warning"), env_file_name, index, line),
dotenvy::Error::Io(_)=> log::info!("{} The `--env-file` flag was used, but the environment file specified '{}' was not found.",colors::yellow("Warning"),env_file_name),
dotenvy::Error::EnvVar(_)=> log::info!("{} One or more of the environment variables isn't present or not unicode within the specified environment file: {}",colors::yellow("Warning"),env_file_name),
_ => log::info!("{} Unknown failure occurred with the specified environment file: {}", colors::yellow("Warning"), env_file_name),
}
+ }
}
}
}