diff options
Diffstat (limited to 'cli/args/flags.rs')
| -rw-r--r-- | cli/args/flags.rs | 363 |
1 files changed, 230 insertions, 133 deletions
diff --git a/cli/args/flags.rs b/cli/args/flags.rs index bae6bb0d5..b5753c00b 100644 --- a/cli/args/flags.rs +++ b/cli/args/flags.rs @@ -6,8 +6,6 @@ use clap::ColorChoice; use clap::Command; use clap::ValueHint; use deno_core::error::AnyError; -use deno_core::serde::Deserialize; -use deno_core::serde::Serialize; use deno_core::url::Url; use deno_runtime::permissions::parse_sys_kind; use log::debug; @@ -46,30 +44,35 @@ static SHORT_VERSION: Lazy<String> = Lazy::new(|| { .to_string() }); -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] -pub struct BenchFlags { +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct FileFlags { pub ignore: Vec<PathBuf>, - pub include: Option<Vec<String>>, + pub include: Vec<PathBuf>, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub struct BenchFlags { + pub files: FileFlags, pub filter: Option<String>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct BundleFlags { pub source_file: String, pub out_file: Option<PathBuf>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct CacheFlags { pub files: Vec<String>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct CheckFlags { pub files: Vec<String>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct CompileFlags { pub source_file: String, pub output: Option<PathBuf>, @@ -77,12 +80,12 @@ pub struct CompileFlags { pub target: Option<String>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct CompletionsFlags { pub buf: Box<[u8]>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct CoverageFlags { pub files: Vec<PathBuf>, pub output: Option<PathBuf>, @@ -92,7 +95,7 @@ pub struct CoverageFlags { pub lcov: bool, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct DocFlags { pub private: bool, pub json: bool, @@ -100,19 +103,18 @@ pub struct DocFlags { pub filter: Option<String>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct EvalFlags { pub print: bool, pub code: String, pub ext: String, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct FmtFlags { pub check: bool, - pub files: Vec<PathBuf>, - pub ignore: Vec<PathBuf>, pub ext: String, + pub files: FileFlags, pub use_tabs: Option<bool>, pub line_width: Option<NonZeroU32>, pub indent_width: Option<NonZeroU8>, @@ -120,18 +122,18 @@ pub struct FmtFlags { pub prose_wrap: Option<String>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct InitFlags { pub dir: Option<String>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct InfoFlags { pub json: bool, pub file: Option<String>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct InstallFlags { pub module_url: String, pub args: Vec<String>, @@ -140,16 +142,15 @@ pub struct InstallFlags { pub force: bool, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct UninstallFlags { pub name: String, pub root: Option<PathBuf>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct LintFlags { - pub files: Vec<PathBuf>, - pub ignore: Vec<PathBuf>, + pub files: FileFlags, pub rules: bool, pub maybe_rules_tags: Option<Vec<String>>, pub maybe_rules_include: Option<Vec<String>>, @@ -158,14 +159,14 @@ pub struct LintFlags { pub compact: bool, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct ReplFlags { pub eval_files: Option<Vec<String>>, pub eval: Option<String>, pub is_default_command: bool, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct RunFlags { pub script: String, } @@ -176,27 +177,26 @@ impl RunFlags { } } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct TaskFlags { pub cwd: Option<String>, pub task: String, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq)] pub struct TestFlags { - pub ignore: Vec<PathBuf>, pub doc: bool, pub no_run: bool, pub fail_fast: Option<NonZeroUsize>, + pub files: FileFlags, pub allow_none: bool, - pub include: Vec<String>, pub filter: Option<String>, pub shuffle: Option<u64>, - pub concurrent_jobs: NonZeroUsize, + pub concurrent_jobs: Option<NonZeroUsize>, pub trace_ops: bool, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct UpgradeFlags { pub dry_run: bool, pub force: bool, @@ -205,14 +205,14 @@ pub struct UpgradeFlags { pub output: Option<PathBuf>, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct VendorFlags { pub specifiers: Vec<String>, pub output_path: Option<PathBuf>, pub force: bool, } -#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, Eq, PartialEq)] pub enum DenoSubcommand { Bench(BenchFlags), Bundle(BundleFlags), @@ -455,9 +455,9 @@ impl Flags { pub fn config_path_args(&self) -> Option<Vec<PathBuf>> { use DenoSubcommand::*; if let Fmt(FmtFlags { files, .. }) = &self.subcommand { - Some(files.clone()) + Some(files.include.clone()) } else if let Lint(LintFlags { files, .. }) = &self.subcommand { - Some(files.clone()) + Some(files.include.clone()) } else if let Run(RunFlags { script }) = &self.subcommand { if let Ok(module_specifier) = deno_core::resolve_url_or_path(script) { if module_specifier.scheme() == "file" @@ -2298,20 +2298,19 @@ fn bench_parse(flags: &mut Flags, matches: &clap::ArgMatches) { } let include = if matches.is_present("files") { - let files: Vec<String> = matches + let files = matches .values_of("files") .unwrap() - .map(String::from) + .map(PathBuf::from) .collect(); - Some(files) + files } else { - None + Vec::new() }; watch_arg_parse(flags, matches, false); flags.subcommand = DenoSubcommand::Bench(BenchFlags { - include, - ignore, + files: FileFlags { include, ignore }, filter, }); } @@ -2493,7 +2492,7 @@ fn fmt_parse(flags: &mut Flags, matches: &clap::ArgMatches) { config_args_parse(flags, matches); watch_arg_parse(flags, matches, false); - let files = match matches.values_of("files") { + let include = match matches.values_of("files") { Some(f) => f.map(PathBuf::from).collect(), None => vec![], }; @@ -2544,8 +2543,7 @@ fn fmt_parse(flags: &mut Flags, matches: &clap::ArgMatches) { flags.subcommand = DenoSubcommand::Fmt(FmtFlags { check: matches.is_present("check"), ext, - files, - ignore, + files: FileFlags { include, ignore }, use_tabs, line_width, indent_width, @@ -2647,12 +2645,15 @@ fn lint_parse(flags: &mut Flags, matches: &clap::ArgMatches) { let json = matches.is_present("json"); let compact = matches.is_present("compact"); flags.subcommand = DenoSubcommand::Lint(LintFlags { - files, + files: FileFlags { + include: files, + ignore, + }, rules, maybe_rules_tags, maybe_rules_include, maybe_rules_exclude, - ignore, + json, compact, }); @@ -2811,12 +2812,9 @@ fn test_parse(flags: &mut Flags, matches: &clap::ArgMatches) { let concurrent_jobs = if matches.is_present("parallel") { if let Ok(value) = env::var("DENO_JOBS") { - value - .parse::<NonZeroUsize>() - .unwrap_or(NonZeroUsize::new(1).unwrap()) + value.parse::<NonZeroUsize>().ok() } else { - std::thread::available_parallelism() - .unwrap_or(NonZeroUsize::new(1).unwrap()) + std::thread::available_parallelism().ok() } } else if matches.is_present("jobs") { // We can't change this to use the log crate because its not configured @@ -2828,20 +2826,19 @@ fn test_parse(flags: &mut Flags, matches: &clap::ArgMatches) { crate::colors::yellow("Warning: --jobs flag is deprecated. Use the --parallel flag with possibly the 'DENO_JOBS' environment variable."), ); if let Some(value) = matches.value_of("jobs") { - value.parse().unwrap() + Some(value.parse().unwrap()) } else { - std::thread::available_parallelism() - .unwrap_or(NonZeroUsize::new(1).unwrap()) + std::thread::available_parallelism().ok() } } else { - NonZeroUsize::new(1).unwrap() + None }; - let include: Vec<String> = if matches.is_present("files") { + let include = if matches.is_present("files") { matches .values_of("files") .unwrap() - .map(String::from) + .map(PathBuf::from) .collect::<Vec<_>>() } else { Vec::new() @@ -2853,8 +2850,7 @@ fn test_parse(flags: &mut Flags, matches: &clap::ArgMatches) { no_run, doc, fail_fast, - include, - ignore, + files: FileFlags { include, ignore }, filter, shuffle, allow_none, @@ -3267,6 +3263,7 @@ mod tests { fn global_flags() { #[rustfmt::skip] let r = flags_from_vec(svec!["deno", "--unstable", "--log-level", "debug", "--quiet", "run", "script.ts"]); + let flags = r.unwrap(); assert_eq!( flags, @@ -3562,13 +3559,15 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![], check: false, - files: vec![ - PathBuf::from("script_1.ts"), - PathBuf::from("script_2.ts") - ], ext: "ts".to_string(), + files: FileFlags { + include: vec![ + PathBuf::from("script_1.ts"), + PathBuf::from("script_2.ts") + ], + ignore: vec![], + }, use_tabs: None, line_width: None, indent_width: None, @@ -3584,10 +3583,12 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![], check: true, - files: vec![], ext: "ts".to_string(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, use_tabs: None, line_width: None, indent_width: None, @@ -3603,10 +3604,12 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![], check: false, - files: vec![], ext: "ts".to_string(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, use_tabs: None, line_width: None, indent_width: None, @@ -3622,10 +3625,12 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![], check: false, - files: vec![], ext: "ts".to_string(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, use_tabs: None, line_width: None, indent_width: None, @@ -3643,10 +3648,12 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![], check: false, - files: vec![], ext: "ts".to_string(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, use_tabs: None, line_width: None, indent_width: None, @@ -3671,10 +3678,12 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![PathBuf::from("bar.js")], check: true, - files: vec![PathBuf::from("foo.ts")], ext: "ts".to_string(), + files: FileFlags { + include: vec![PathBuf::from("foo.ts")], + ignore: vec![PathBuf::from("bar.js")], + }, use_tabs: None, line_width: None, indent_width: None, @@ -3691,10 +3700,12 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![], check: false, - files: vec![], ext: "ts".to_string(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, use_tabs: None, line_width: None, indent_width: None, @@ -3718,10 +3729,12 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![], check: false, - files: vec![PathBuf::from("foo.ts")], ext: "ts".to_string(), + files: FileFlags { + include: vec![PathBuf::from("foo.ts")], + ignore: vec![], + }, use_tabs: None, line_width: None, indent_width: None, @@ -3750,10 +3763,12 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Fmt(FmtFlags { - ignore: vec![], check: false, - files: vec![], ext: "ts".to_string(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, use_tabs: Some(true), line_width: Some(NonZeroU32::new(60).unwrap()), indent_width: Some(NonZeroU8::new(4).unwrap()), @@ -3772,17 +3787,19 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![ - PathBuf::from("script_1.ts"), - PathBuf::from("script_2.ts") - ], + files: FileFlags { + include: vec![ + PathBuf::from("script_1.ts"), + PathBuf::from("script_2.ts") + ], + ignore: vec![], + }, rules: false, maybe_rules_tags: None, maybe_rules_include: None, maybe_rules_exclude: None, json: false, compact: false, - ignore: vec![], }), ..Flags::default() } @@ -3799,17 +3816,19 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![ - PathBuf::from("script_1.ts"), - PathBuf::from("script_2.ts") - ], + files: FileFlags { + include: vec![ + PathBuf::from("script_1.ts"), + PathBuf::from("script_2.ts") + ], + ignore: vec![], + }, rules: false, maybe_rules_tags: None, maybe_rules_include: None, maybe_rules_exclude: None, json: false, compact: false, - ignore: vec![], }), watch: Some(vec![]), ..Flags::default() @@ -3828,17 +3847,19 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![ - PathBuf::from("script_1.ts"), - PathBuf::from("script_2.ts") - ], + files: FileFlags { + include: vec![ + PathBuf::from("script_1.ts"), + PathBuf::from("script_2.ts") + ], + ignore: vec![], + }, rules: false, maybe_rules_tags: None, maybe_rules_include: None, maybe_rules_exclude: None, json: false, compact: false, - ignore: vec![], }), watch: Some(vec![]), no_clear_screen: true, @@ -3852,17 +3873,19 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![], + files: FileFlags { + include: vec![], + ignore: vec![ + PathBuf::from("script_1.ts"), + PathBuf::from("script_2.ts") + ], + }, rules: false, maybe_rules_tags: None, maybe_rules_include: None, maybe_rules_exclude: None, json: false, compact: false, - ignore: vec![ - PathBuf::from("script_1.ts"), - PathBuf::from("script_2.ts") - ], }), ..Flags::default() } @@ -3873,14 +3896,16 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![], + files: FileFlags { + include: vec![], + ignore: vec![], + }, rules: true, maybe_rules_tags: None, maybe_rules_include: None, maybe_rules_exclude: None, json: false, compact: false, - ignore: vec![], }), ..Flags::default() } @@ -3897,14 +3922,16 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![], + files: FileFlags { + include: vec![], + ignore: vec![], + }, rules: false, maybe_rules_tags: Some(svec![""]), maybe_rules_include: Some(svec!["ban-untagged-todo", "no-undef"]), maybe_rules_exclude: Some(svec!["no-const-assign"]), json: false, compact: false, - ignore: vec![], }), ..Flags::default() } @@ -3915,14 +3942,16 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![PathBuf::from("script_1.ts")], + files: FileFlags { + include: vec![PathBuf::from("script_1.ts")], + ignore: vec![], + }, rules: false, maybe_rules_tags: None, maybe_rules_include: None, maybe_rules_exclude: None, json: true, compact: false, - ignore: vec![], }), ..Flags::default() } @@ -3940,14 +3969,16 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![PathBuf::from("script_1.ts")], + files: FileFlags { + include: vec![PathBuf::from("script_1.ts")], + ignore: vec![], + }, rules: false, maybe_rules_tags: None, maybe_rules_include: None, maybe_rules_exclude: None, json: true, compact: false, - ignore: vec![], }), config_flag: ConfigFlag::Path("Deno.jsonc".to_string()), ..Flags::default() @@ -3966,14 +3997,16 @@ mod tests { r.unwrap(), Flags { subcommand: DenoSubcommand::Lint(LintFlags { - files: vec![PathBuf::from("script_1.ts")], + files: FileFlags { + include: vec![PathBuf::from("script_1.ts")], + ignore: vec![], + }, rules: false, maybe_rules_tags: None, maybe_rules_include: None, maybe_rules_exclude: None, json: false, compact: true, - ignore: vec![], }), config_flag: ConfigFlag::Path("Deno.jsonc".to_string()), ..Flags::default() @@ -5510,10 +5543,12 @@ mod tests { fail_fast: None, filter: Some("- foo".to_string()), allow_none: true, - include: svec!["dir1/", "dir2/"], - ignore: vec![], + files: FileFlags { + include: vec![PathBuf::from("dir1/"), PathBuf::from("dir2/")], + ignore: vec![], + }, shuffle: None, - concurrent_jobs: NonZeroUsize::new(1).unwrap(), + concurrent_jobs: None, trace_ops: true, }), unstable: true, @@ -5582,9 +5617,11 @@ mod tests { filter: None, allow_none: false, shuffle: None, - include: vec![], - ignore: vec![], - concurrent_jobs: NonZeroUsize::new(4).unwrap(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, + concurrent_jobs: Some(NonZeroUsize::new(4).unwrap()), trace_ops: false, }), type_check_mode: TypeCheckMode::Local, @@ -5610,9 +5647,11 @@ mod tests { filter: None, allow_none: false, shuffle: None, - include: vec![], - ignore: vec![], - concurrent_jobs: NonZeroUsize::new(1).unwrap(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, + concurrent_jobs: None, trace_ops: false, }), type_check_mode: TypeCheckMode::Local, @@ -5642,9 +5681,11 @@ mod tests { filter: None, allow_none: false, shuffle: None, - include: vec![], - ignore: vec![], - concurrent_jobs: NonZeroUsize::new(1).unwrap(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, + concurrent_jobs: None, trace_ops: false, }), no_prompt: true, @@ -5668,9 +5709,11 @@ mod tests { filter: None, allow_none: false, shuffle: Some(1), - include: vec![], - ignore: vec![], - concurrent_jobs: NonZeroUsize::new(1).unwrap(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, + concurrent_jobs: None, trace_ops: false, }), no_prompt: true, @@ -5694,9 +5737,38 @@ mod tests { filter: None, allow_none: false, shuffle: None, - include: vec![], - ignore: vec![], - concurrent_jobs: NonZeroUsize::new(1).unwrap(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, + concurrent_jobs: None, + trace_ops: false, + }), + no_prompt: true, + type_check_mode: TypeCheckMode::Local, + watch: Some(vec![]), + ..Flags::default() + } + ); + } + #[test] + fn test_watch_explicit_cwd() { + let r = flags_from_vec(svec!["deno", "test", "--watch", "./"]); + assert_eq!( + r.unwrap(), + Flags { + subcommand: DenoSubcommand::Test(TestFlags { + no_run: false, + doc: false, + fail_fast: None, + filter: None, + allow_none: false, + shuffle: None, + files: FileFlags { + include: vec![PathBuf::from("./")], + ignore: vec![], + }, + concurrent_jobs: None, trace_ops: false, }), no_prompt: true, @@ -5721,9 +5793,11 @@ mod tests { filter: None, allow_none: false, shuffle: None, - include: vec![], - ignore: vec![], - concurrent_jobs: NonZeroUsize::new(1).unwrap(), + files: FileFlags { + include: vec![], + ignore: vec![], + }, + concurrent_jobs: None, trace_ops: false, }), watch: Some(vec![]), @@ -6372,8 +6446,10 @@ mod tests { Flags { subcommand: DenoSubcommand::Bench(BenchFlags { filter: Some("- foo".to_string()), - include: Some(svec!["dir1/", "dir2/"]), - ignore: vec![], + files: FileFlags { + include: vec![PathBuf::from("dir1/"), PathBuf::from("dir2/")], + ignore: vec![], + }, }), unstable: true, type_check_mode: TypeCheckMode::Local, @@ -6387,6 +6463,27 @@ mod tests { } #[test] + fn bench_watch() { + let r = flags_from_vec(svec!["deno", "bench", "--watch"]); + assert_eq!( + r.unwrap(), + Flags { + subcommand: DenoSubcommand::Bench(BenchFlags { + filter: None, + files: FileFlags { + include: vec![], + ignore: vec![], + }, + }), + no_prompt: true, + type_check_mode: TypeCheckMode::Local, + watch: Some(vec![]), + ..Flags::default() + } + ); + } + + #[test] fn run_with_check() { let r = flags_from_vec(svec!["deno", "run", "--check", "script.ts",]); assert_eq!( |
