1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-21 23:04:45 -05:00

feat: treat bare deno command with run arguments as deno run (#24887)

removes the necessity for the `run` subcommand to run scripts

fixes #24493
This commit is contained in:
Leo Kettmeir 2024-08-08 07:22:28 -07:00 committed by GitHub
parent 6e8612f319
commit e7be763690
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1207,7 +1207,7 @@ pub fn flags_from_vec(args: Vec<OsString>) -> clap::error::Result<Flags> {
"lint" => lint_parse(&mut flags, &mut m),
"lsp" => lsp_parse(&mut flags, &mut m),
"repl" => repl_parse(&mut flags, &mut m),
"run" => run_parse(&mut flags, &mut m, app)?,
"run" => run_parse(&mut flags, &mut m, app, true)?,
"serve" => serve_parse(&mut flags, &mut m, app)?,
"task" => task_parse(&mut flags, &mut m),
"test" => test_parse(&mut flags, &mut m),
@ -1219,14 +1219,27 @@ pub fn flags_from_vec(args: Vec<OsString>) -> clap::error::Result<Flags> {
_ => unreachable!(),
}
} else {
handle_repl_flags(
&mut flags,
ReplFlags {
eval_files: None,
eval: None,
is_default_command: true,
},
)
let has_non_globals = app
.get_arguments()
.filter(|arg| !arg.is_global_set())
.any(|arg| {
matches
.value_source(arg.get_id().as_str())
.is_some_and(|value| value != clap::parser::ValueSource::DefaultValue)
});
if has_non_globals || matches.contains_id("script_arg") {
run_parse(&mut flags, &mut matches, app, false)?;
} else {
handle_repl_flags(
&mut flags,
ReplFlags {
eval_files: None,
eval: None,
is_default_command: true,
},
)
}
}
Ok(flags)
@ -1261,7 +1274,7 @@ fn clap_root() -> Command {
crate::version::TYPESCRIPT
);
let mut cmd = Command::new("deno")
let mut cmd = run_args(Command::new("deno"), true)
.bin_name("deno")
.styles(
clap::builder::Styles::styled()
@ -1432,7 +1445,7 @@ glob {*_,*.,}bench.{js,mjs,ts,mts,jsx,tsx}:
deno bench src/",
)
.defer(|cmd| {
runtime_args(cmd, true, false)
runtime_args(cmd, true, false, false)
.arg(check_arg(true))
.arg(
Arg::new("json")
@ -1492,7 +1505,7 @@ If no output file is given, the output is written to standard output:
deno bundle jsr:@std/http/file-server",
)
.defer(|cmd| {
compile_args(cmd)
compile_args(cmd, false)
.hide(true)
.arg(check_arg(true))
.arg(
@ -1523,7 +1536,7 @@ Future runs of this module will trigger no downloads or compilation unless
--reload is specified.",
)
.defer(|cmd| {
compile_args(cmd)
compile_args(cmd, false)
.arg(check_arg(false))
.arg(
Arg::new("file")
@ -1550,7 +1563,7 @@ fn check_subcommand() -> Command {
Unless --reload is specified, this command will not re-download already cached dependencies.",
)
.defer(|cmd| compile_args_without_check_args(cmd).arg(
.defer(|cmd| compile_args_without_check_args(cmd, false).arg(
Arg::new("all")
.long("all")
.help("Type-check all code, including remote modules and npm packages")
@ -1601,7 +1614,7 @@ supported in canary.
",
)
.defer(|cmd| {
runtime_args(cmd, true, false)
runtime_args(cmd, true, false, false)
.arg(check_arg(true))
.arg(
Arg::new("include")
@ -1933,7 +1946,7 @@ To evaluate as TypeScript:
This command has implicit access to all permissions (--allow-all).",
)
.defer(|cmd| {
runtime_args(cmd, false, true)
runtime_args(cmd, false, true, false)
.arg(check_arg(false))
.arg(
// TODO(@satyarohith): remove this argument in 2.0.
@ -2256,7 +2269,7 @@ The installation root is determined, in order of precedence:
These must be added to the path manually if required.")
.defer(|cmd| {
let cmd = runtime_args(cmd, true, true).arg(check_arg(true)).arg(allow_scripts_arg());
let cmd = runtime_args(cmd, true, true, false).arg(check_arg(true)).arg(allow_scripts_arg());
install_args(cmd, true)
})
}
@ -2293,7 +2306,7 @@ The installation root is determined, in order of precedence:
These must be added to the path manually if required.")
.defer(|cmd| {
let cmd = runtime_args(cmd, true, true).arg(check_arg(true));
let cmd = runtime_args(cmd, true, true, false).arg(check_arg(true));
install_args(cmd, false)
})
}
@ -2492,7 +2505,7 @@ Ignore linting a file by adding an ignore comment at the top of the file:
fn repl_subcommand() -> Command {
Command::new("repl")
.about("Read Eval Print Loop")
.defer(|cmd| runtime_args(cmd, true, true)
.defer(|cmd| runtime_args(cmd, true, true, false)
.arg(check_arg(false))
.arg(
Arg::new("eval-file")
@ -2512,21 +2525,27 @@ fn repl_subcommand() -> Command {
.arg(env_file_arg())
}
fn run_subcommand() -> Command {
runtime_args(Command::new("run"), true, true)
.arg(check_arg(false))
.arg(watch_arg(true))
.arg(watch_exclude_arg())
.arg(hmr_arg(true))
.arg(no_clear_screen_arg())
.arg(executable_ext_arg())
.arg(
fn run_args(command: Command, top_level: bool) -> Command {
runtime_args(command, true, true, top_level)
.arg(check_arg(false).hide(top_level))
.arg(watch_arg(true).hide(top_level))
.arg(watch_exclude_arg().hide(top_level))
.arg(hmr_arg(true).hide(top_level))
.arg(no_clear_screen_arg().hide(top_level))
.arg(executable_ext_arg().hide(top_level))
.arg(if top_level {
script_arg().trailing_var_arg(true).hide(true)
} else {
script_arg()
.required_unless_present("v8-flags")
.trailing_var_arg(true),
)
.arg(env_file_arg())
.arg(no_code_cache_arg())
.trailing_var_arg(true)
})
.arg(env_file_arg().hide(top_level))
.arg(no_code_cache_arg().hide(top_level))
}
fn run_subcommand() -> Command {
run_args(Command::new("run"), false)
.about("Run a JavaScript or TypeScript program")
.long_about(
"Run a JavaScript or TypeScript program
@ -2563,7 +2582,7 @@ fn serve_host_validator(host: &str) -> Result<String, String> {
}
fn serve_subcommand() -> Command {
runtime_args(Command::new("serve"), true, true)
runtime_args(Command::new("serve"), true, true, false)
.arg(
Arg::new("port")
.long("port")
@ -2646,7 +2665,7 @@ Directory arguments are expanded to all contained files matching the glob
deno test src/",
)
.defer(|cmd| runtime_args(cmd, true, true)
.defer(|cmd| runtime_args(cmd, true, true, false)
.arg(check_arg(true))
.arg(
Arg::new("ignore")
@ -2951,24 +2970,24 @@ fn publish_subcommand() -> Command {
})
}
fn compile_args(app: Command) -> Command {
compile_args_without_check_args(app.arg(no_check_arg()))
fn compile_args(app: Command, hide: bool) -> Command {
compile_args_without_check_args(app.arg(no_check_arg().hide(hide)), hide)
}
fn compile_args_without_check_args(app: Command) -> Command {
fn compile_args_without_check_args(app: Command, hide: bool) -> Command {
app
.arg(import_map_arg())
.arg(no_remote_arg())
.arg(no_npm_arg())
.arg(node_modules_dir_arg())
.arg(vendor_arg())
.arg(config_arg())
.arg(no_config_arg())
.arg(reload_arg())
.arg(lock_arg())
.arg(import_map_arg().hide(hide))
.arg(no_remote_arg().hide(hide))
.arg(no_npm_arg().hide(hide))
.arg(node_modules_dir_arg().hide(hide))
.arg(vendor_arg().hide(hide))
.arg(config_arg().hide(hide))
.arg(no_config_arg().hide(hide))
.arg(reload_arg().hide(hide))
.arg(lock_arg().hide(hide))
.arg(lock_write_arg())
.arg(no_lock_arg())
.arg(ca_file_arg())
.arg(no_lock_arg().hide(hide))
.arg(ca_file_arg().hide(hide))
}
static ALLOW_READ_HELP: &str = concat!(
@ -3132,7 +3151,7 @@ static ALLOW_ALL_HELP: &str = concat!(
"/basics/permissions\n"
);
fn permission_args(app: Command) -> Command {
fn permission_args(app: Command, hide: bool) -> Command {
app
.arg(
Arg::new("allow-read")
@ -3144,7 +3163,8 @@ fn permission_args(app: Command) -> Command {
.value_name("PATH")
.help(ALLOW_READ_HELP)
.value_parser(value_parser!(String))
.value_hint(ValueHint::AnyPath),
.value_hint(ValueHint::AnyPath)
.hide(hide),
)
.arg(
Arg::new("deny-read")
@ -3155,7 +3175,8 @@ fn permission_args(app: Command) -> Command {
.value_name("PATH")
.help(DENY_READ_HELP)
.value_parser(value_parser!(String))
.value_hint(ValueHint::AnyPath),
.value_hint(ValueHint::AnyPath)
.hide(hide),
)
.arg(
Arg::new("allow-write")
@ -3167,7 +3188,8 @@ fn permission_args(app: Command) -> Command {
.value_name("PATH")
.help(ALLOW_WRITE_HELP)
.value_parser(value_parser!(String))
.value_hint(ValueHint::AnyPath),
.value_hint(ValueHint::AnyPath)
.hide(hide),
)
.arg(
Arg::new("deny-write")
@ -3178,7 +3200,8 @@ fn permission_args(app: Command) -> Command {
.value_name("PATH")
.help(DENY_WRITE_HELP)
.value_parser(value_parser!(String))
.value_hint(ValueHint::AnyPath),
.value_hint(ValueHint::AnyPath)
.hide(hide),
)
.arg(
Arg::new("allow-net")
@ -3189,7 +3212,8 @@ fn permission_args(app: Command) -> Command {
.require_equals(true)
.value_name("IP_OR_HOSTNAME")
.help(ALLOW_NET_HELP)
.value_parser(flags_net::validator),
.value_parser(flags_net::validator)
.hide(hide),
)
.arg(
Arg::new("deny-net")
@ -3199,9 +3223,10 @@ fn permission_args(app: Command) -> Command {
.require_equals(true)
.value_name("IP_OR_HOSTNAME")
.help(DENY_NET_HELP)
.value_parser(flags_net::validator),
.value_parser(flags_net::validator)
.hide(hide),
)
.arg(unsafely_ignore_certificate_errors_arg())
.arg(unsafely_ignore_certificate_errors_arg().hide(hide))
.arg(
Arg::new("allow-env")
.long("allow-env")
@ -3221,7 +3246,8 @@ fn permission_args(app: Command) -> Command {
} else {
key.to_string()
})
}),
})
.hide(hide),
)
.arg(
Arg::new("deny-env")
@ -3241,7 +3267,8 @@ fn permission_args(app: Command) -> Command {
} else {
key.to_string()
})
}),
})
.hide(hide),
)
.arg(
Arg::new("allow-sys")
@ -3252,7 +3279,8 @@ fn permission_args(app: Command) -> Command {
.require_equals(true)
.value_name("API_NAME")
.help(ALLOW_SYS_HELP)
.value_parser(|key: &str| parse_sys_kind(key).map(ToString::to_string)),
.value_parser(|key: &str| parse_sys_kind(key).map(ToString::to_string))
.hide(hide),
)
.arg(
Arg::new("deny-sys")
@ -3262,7 +3290,8 @@ fn permission_args(app: Command) -> Command {
.require_equals(true)
.value_name("API_NAME")
.help(DENY_SYS_HELP)
.value_parser(|key: &str| parse_sys_kind(key).map(ToString::to_string)),
.value_parser(|key: &str| parse_sys_kind(key).map(ToString::to_string))
.hide(hide),
)
.arg(
Arg::new("allow-run")
@ -3271,7 +3300,8 @@ fn permission_args(app: Command) -> Command {
.use_value_delimiter(true)
.require_equals(true)
.value_name("PROGRAM_NAME")
.help(ALLOW_RUN_HELP),
.help(ALLOW_RUN_HELP)
.hide(hide),
)
.arg(
Arg::new("deny-run")
@ -3280,7 +3310,8 @@ fn permission_args(app: Command) -> Command {
.use_value_delimiter(true)
.require_equals(true)
.value_name("PROGRAM_NAME")
.help(DENY_RUN_HELP),
.help(DENY_RUN_HELP)
.hide(hide),
)
.arg(
Arg::new("allow-ffi")
@ -3291,7 +3322,8 @@ fn permission_args(app: Command) -> Command {
.value_name("PATH")
.help(ALLOW_FFI_HELP)
.value_parser(value_parser!(String))
.value_hint(ValueHint::AnyPath),
.value_hint(ValueHint::AnyPath)
.hide(hide),
)
.arg(
Arg::new("deny-ffi")
@ -3302,32 +3334,37 @@ fn permission_args(app: Command) -> Command {
.value_name("PATH")
.help(DENY_FFI_HELP)
.value_parser(value_parser!(String))
.value_hint(ValueHint::AnyPath),
.value_hint(ValueHint::AnyPath)
.hide(hide),
)
.arg(
Arg::new("allow-hrtime")
.long("allow-hrtime")
.action(ArgAction::SetTrue)
.help(ALLOW_HRTIME_HELP),
.help(ALLOW_HRTIME_HELP)
.hide(hide),
)
.arg(
Arg::new("deny-hrtime")
.long("deny-hrtime")
.action(ArgAction::SetTrue)
.help(DENY_HRTIME_HELP),
.help(DENY_HRTIME_HELP)
.hide(hide),
)
.arg(
Arg::new("allow-all")
.short('A')
.long("allow-all")
.action(ArgAction::SetTrue)
.help(ALLOW_ALL_HELP),
.help(ALLOW_ALL_HELP)
.hide(hide),
)
.arg(
Arg::new("no-prompt")
.long("no-prompt")
.action(ArgAction::SetTrue)
.help("Always throw if required permission wasn't passed"),
.help("Always throw if required permission wasn't passed")
.hide(hide),
)
}
@ -3335,29 +3372,30 @@ fn runtime_args(
app: Command,
include_perms: bool,
include_inspector: bool,
hide: bool,
) -> Command {
let app = compile_args(app);
let app = compile_args(app, hide);
let app = if include_perms {
permission_args(app)
permission_args(app, hide)
} else {
app
};
let app = if include_inspector {
inspect_args(app)
inspect_args(app, hide)
} else {
app
};
app
.arg(frozen_lockfile_arg())
.arg(cached_only_arg())
.arg(location_arg())
.arg(v8_flags_arg())
.arg(seed_arg())
.arg(frozen_lockfile_arg().hide(hide))
.arg(cached_only_arg().hide(hide))
.arg(location_arg().hide(hide))
.arg(v8_flags_arg().hide(hide))
.arg(seed_arg().hide(hide))
.arg(enable_testing_features_arg())
.arg(strace_ops_arg())
}
fn inspect_args(app: Command) -> Command {
fn inspect_args(app: Command, hide: bool) -> Command {
app
.arg(
Arg::new("inspect")
@ -3366,7 +3404,8 @@ fn inspect_args(app: Command) -> Command {
.help("Activate inspector on host:port (default: 127.0.0.1:9229)")
.num_args(0..=1)
.require_equals(true)
.value_parser(value_parser!(SocketAddr)),
.value_parser(value_parser!(SocketAddr))
.hide(hide),
)
.arg(
Arg::new("inspect-brk")
@ -3377,7 +3416,8 @@ fn inspect_args(app: Command) -> Command {
)
.num_args(0..=1)
.require_equals(true)
.value_parser(value_parser!(SocketAddr)),
.value_parser(value_parser!(SocketAddr))
.hide(hide),
)
.arg(
Arg::new("inspect-wait")
@ -3388,7 +3428,8 @@ fn inspect_args(app: Command) -> Command {
)
.num_args(0..=1)
.require_equals(true)
.value_parser(value_parser!(SocketAddr)),
.value_parser(value_parser!(SocketAddr))
.hide(hide),
)
}
@ -4281,7 +4322,8 @@ fn repl_parse(flags: &mut Flags, matches: &mut ArgMatches) {
fn run_parse(
flags: &mut Flags,
matches: &mut ArgMatches,
app: Command,
mut app: Command,
is_run_subommand: bool,
) -> clap::error::Result<()> {
// todo(dsherret): remove this in Deno 2.0
// This is a hack to make https://github.com/netlify/build/pull/5767 work
@ -4336,12 +4378,17 @@ fn run_parse(
let mut script_arg =
matches.remove_many::<String>("script_arg").ok_or_else(|| {
let mut app = app;
let subcommand = &mut app.find_subcommand_mut("run").unwrap();
subcommand.error(
clap::error::ErrorKind::MissingRequiredArgument,
"[SCRIPT_ARG] may only be omitted with --v8-flags=--help",
)
if is_run_subommand {
app.find_subcommand_mut("run").unwrap().error(
clap::error::ErrorKind::MissingRequiredArgument,
"[SCRIPT_ARG] may only be omitted with --v8-flags=--help",
)
} else {
app.override_usage("deno [OPTIONS] [COMMAND] [SCRIPT_ARG]...").error(
clap::error::ErrorKind::MissingRequiredArgument,
"[SCRIPT_ARG] may only be omitted with --v8-flags=--help, else to use the repl with arguments, please use the `deno repl` subcommand",
)
}
})?;
let script = script_arg.next().unwrap();
@ -5160,7 +5207,6 @@ mod tests {
let r = flags_from_vec(svec![
"deno",
"run",
"--watch",
"--no-clear-screen",
"script.ts"
@ -5240,8 +5286,7 @@ mod tests {
#[test]
fn run_watch_with_external() {
let r =
flags_from_vec(svec!["deno", "run", "--watch=file1,file2", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--watch=file1,file2", "script.ts"]);
let flags = r.unwrap();
assert_eq!(
flags,
@ -5294,7 +5339,6 @@ mod tests {
fn run_watch_with_excluded_paths() {
let r = flags_from_vec(svec!(
"deno",
"run",
"--watch",
"--watch-exclude=foo",
"script.ts"
@ -5371,7 +5415,6 @@ mod tests {
let r = flags_from_vec(svec![
"deno",
"run",
"--watch=foo,bar",
"--watch-exclude=baz,qux",
"script.ts"
@ -5607,7 +5650,7 @@ mod tests {
#[test]
fn has_permission() {
let r = flags_from_vec(svec!["deno", "run", "--allow-read", "x.ts"]);
let r = flags_from_vec(svec!["deno", "--allow-read", "x.ts"]);
assert_eq!(r.unwrap().has_permission(), true);
let r = flags_from_vec(svec!["deno", "run", "--deny-read", "x.ts"]);
@ -5622,7 +5665,7 @@ mod tests {
let r = flags_from_vec(svec!["deno", "run", "x.ts", "--allow-read"]);
assert_eq!(r.unwrap().has_permission_in_argv(), true);
let r = flags_from_vec(svec!["deno", "run", "x.ts", "--deny-read"]);
let r = flags_from_vec(svec!["deno", "x.ts", "--deny-read"]);
assert_eq!(r.unwrap().has_permission_in_argv(), true);
let r = flags_from_vec(svec!["deno", "run", "x.ts"]);
@ -5724,7 +5767,7 @@ mod tests {
#[test]
fn deny_read() {
let r = flags_from_vec(svec!["deno", "run", "--deny-read", "gist.ts"]);
let r = flags_from_vec(svec!["deno", "--deny-read", "gist.ts"]);
assert_eq!(
r.unwrap(),
Flags {
@ -6972,8 +7015,7 @@ mod tests {
#[test]
fn deny_net_denylist() {
let r =
flags_from_vec(svec!["deno", "run", "--deny-net=127.0.0.1", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--deny-net=127.0.0.1", "script.ts"]);
assert_eq!(
r.unwrap(),
Flags {
@ -7079,8 +7121,7 @@ mod tests {
let r =
flags_from_vec(svec!["deno", "run", "--allow-env=HOME", "script.ts"]);
assert!(r.is_ok());
let r =
flags_from_vec(svec!["deno", "run", "--allow-env=H=ME", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--allow-env=H=ME", "script.ts"]);
assert!(r.is_err());
let r =
flags_from_vec(svec!["deno", "run", "--allow-env=H\0ME", "script.ts"]);
@ -7095,8 +7136,7 @@ mod tests {
let r =
flags_from_vec(svec!["deno", "run", "--deny-env=H=ME", "script.ts"]);
assert!(r.is_err());
let r =
flags_from_vec(svec!["deno", "run", "--deny-env=H\0ME", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--deny-env=H\0ME", "script.ts"]);
assert!(r.is_err());
}
@ -7160,8 +7200,7 @@ mod tests {
#[test]
fn deny_sys_denylist() {
let r =
flags_from_vec(svec!["deno", "run", "--deny-sys=hostname", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--deny-sys=hostname", "script.ts"]);
assert_eq!(
r.unwrap(),
Flags {
@ -7311,7 +7350,7 @@ mod tests {
flags_from_vec(svec!["deno", "run", "--reload=/absolute", "script.ts"]);
assert!(r.is_err(), "Should reject absolute urls");
let r = flags_from_vec(svec!["deno", "run", "--reload=/", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--reload=/", "script.ts"]);
assert!(r.is_err(), "Should reject absolute root url");
let r = flags_from_vec(svec!["deno", "run", "--reload=", "script.ts"]);
@ -7640,8 +7679,7 @@ mod tests {
#[test]
fn run_no_code_cache() {
let r =
flags_from_vec(svec!["deno", "run", "--no-code-cache", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--no-code-cache", "script.ts"]);
assert_eq!(
r.unwrap(),
Flags {
@ -7891,7 +7929,7 @@ mod tests {
#[test]
fn quiet() {
let r = flags_from_vec(svec!["deno", "run", "-q", "script.ts"]);
let r = flags_from_vec(svec!["deno", "-q", "script.ts"]);
assert_eq!(
r.unwrap(),
Flags {
@ -8009,7 +8047,7 @@ mod tests {
#[test]
fn no_check() {
let r = flags_from_vec(svec!["deno", "run", "--no-check", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--no-check", "script.ts"]);
assert_eq!(
r.unwrap(),
Flags {
@ -8175,8 +8213,7 @@ mod tests {
#[test]
fn local_npm() {
let r =
flags_from_vec(svec!["deno", "run", "--node-modules-dir", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--node-modules-dir", "script.ts"]);
assert_eq!(
r.unwrap(),
Flags {
@ -8409,7 +8446,7 @@ mod tests {
}
);
let r = flags_from_vec(svec!["deno", "run", "--no-lock", "script.ts"]);
let r = flags_from_vec(svec!["deno", "--no-lock", "script.ts"]);
assert_eq!(
r.unwrap(),
Flags {
@ -8492,8 +8529,12 @@ mod tests {
#[test]
fn test_no_colon_in_value_name() {
let app =
runtime_args(Command::new("test_inspect_completion_value"), true, true);
let app = runtime_args(
Command::new("test_inspect_completion_value"),
true,
true,
false,
);
let inspect_args = app
.get_arguments()
.filter(|arg| arg.get_id() == "inspect")
@ -9330,7 +9371,7 @@ mod tests {
#[test]
fn inspect_wait() {
let r = flags_from_vec(svec!["deno", "run", "--inspect-wait", "foo.js"]);
let r = flags_from_vec(svec!["deno", "--inspect-wait", "foo.js"]);
assert_eq!(
r.unwrap(),
Flags {
@ -9520,8 +9561,7 @@ mod tests {
);
let flags =
flags_from_vec(svec!["deno", "run", "https://example.com/foo.js"])
.unwrap();
flags_from_vec(svec!["deno", "https://example.com/foo.js"]).unwrap();
assert_eq!(flags.config_path_args(&cwd), None);
let flags =
@ -9929,7 +9969,7 @@ mod tests {
}
);
let r = flags_from_vec(svec!["deno", "run", "--check=foo", "script.ts",]);
let r = flags_from_vec(svec!["deno", "--check=foo", "script.ts",]);
assert_eq!(
r.unwrap(),
Flags {
@ -10232,4 +10272,60 @@ mod tests {
}
}
}
#[test]
fn bare_run() {
let r = flags_from_vec(svec!["deno", "--no-config", "script.ts"]);
assert_eq!(
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Run(RunFlags::new_default(
"script.ts".to_string(),
)),
config_flag: ConfigFlag::Disabled,
code_cache_enabled: true,
..Flags::default()
}
);
}
#[test]
fn bare_global() {
let r = flags_from_vec(svec!["deno", "--log-level=debug"]);
assert_eq!(
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Repl(ReplFlags {
eval_files: None,
eval: None,
is_default_command: true,
}),
log_level: Some(Level::Debug),
permissions: PermissionFlags {
allow_all: false,
allow_net: Some(vec![]),
allow_env: Some(vec![]),
allow_run: Some(vec![]),
allow_read: Some(vec![]),
allow_sys: Some(vec![]),
allow_write: Some(vec![]),
allow_ffi: Some(vec![]),
allow_hrtime: true,
..Default::default()
},
..Flags::default()
}
);
}
#[test]
fn bare_with_flag_no_file() {
let r = flags_from_vec(svec!["deno", "--no-config"]);
let err = r.unwrap_err();
assert!(err.to_string().contains("error: [SCRIPT_ARG] may only be omitted with --v8-flags=--help, else to use the repl with arguments, please use the `deno repl` subcommand"));
assert!(err
.to_string()
.contains("Usage: deno [OPTIONS] [COMMAND] [SCRIPT_ARG]..."));
}
}