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

feat: better help output (#24958)

This commit is contained in:
Leo Kettmeir 2024-08-12 08:55:33 -07:00 committed by GitHub
parent 9bdab6fb6b
commit e5f0058b74
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 839 additions and 860 deletions

74
Cargo.lock generated
View file

@ -14,9 +14,9 @@ dependencies = [
[[package]] [[package]]
name = "addr2line" name = "addr2line"
version = "0.21.0" version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
dependencies = [ dependencies = [
"gimli", "gimli",
] ]
@ -361,9 +361,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
[[package]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.71" version = "0.3.73"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
dependencies = [ dependencies = [
"addr2line", "addr2line",
"cc", "cc",
@ -620,9 +620,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.92" version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
@ -682,39 +682,40 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.4.17" version = "4.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80932e03c33999b9235edb8655bc9df3204adc9887c2f95b50cb1deb9fd54253" checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
] ]
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.4.17" version = "4.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6c0db58c659eef1c73e444d298c27322a1b52f6927d2ad470c0c0f96fa7b8fa" checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
"clap_lex", "clap_lex",
"strsim", "strsim 0.11.1",
"terminal_size",
] ]
[[package]] [[package]]
name = "clap_complete" name = "clap_complete"
version = "4.4.7" version = "4.5.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfb0d4825b75ff281318c393e8e1b80c4da9fb75a6b1d98547d389d6fe1f48d2" checksum = "a8670053e87c316345e384ca1f3eba3006fc6355ed8b8a1140d104e109e3df34"
dependencies = [ dependencies = [
"clap", "clap",
] ]
[[package]] [[package]]
name = "clap_complete_fig" name = "clap_complete_fig"
version = "4.4.2" version = "4.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87e571d70e22ec91d34e1c5317c8308035a2280d925167646bf094fc5de1737c" checksum = "d494102c8ff3951810c72baf96910b980fb065ca5d3101243e6a8dc19747c86b"
dependencies = [ dependencies = [
"clap", "clap",
"clap_complete", "clap_complete",
@ -722,9 +723,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_lex" name = "clap_lex"
version = "0.6.0" version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
[[package]] [[package]]
name = "cli_tests" name = "cli_tests"
@ -1068,7 +1069,7 @@ dependencies = [
"ident_case", "ident_case",
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim 0.10.0",
"syn 1.0.109", "syn 1.0.109",
] ]
@ -1214,6 +1215,7 @@ dependencies = [
"sha2", "sha2",
"shell-escape", "shell-escape",
"spki", "spki",
"strsim 0.11.1",
"tar", "tar",
"tempfile", "tempfile",
"test_server", "test_server",
@ -3184,9 +3186,9 @@ dependencies = [
[[package]] [[package]]
name = "gimli" name = "gimli"
version = "0.28.1" version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
[[package]] [[package]]
name = "gl_generator" name = "gl_generator"
@ -3878,9 +3880,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]] [[package]]
name = "jobserver" name = "jobserver"
version = "0.1.29" version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f08474e32172238f2827bd160c67871cdb2801430f65c3979184dc362e3ca118" checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@ -4666,9 +4668,9 @@ dependencies = [
[[package]] [[package]]
name = "object" name = "object"
version = "0.32.2" version = "0.36.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@ -5841,9 +5843,9 @@ dependencies = [
[[package]] [[package]]
name = "rustc-demangle" name = "rustc-demangle"
version = "0.1.23" version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]] [[package]]
name = "rustc-hash" name = "rustc-hash"
@ -6547,6 +6549,12 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "strsim"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]] [[package]]
name = "strum" name = "strum"
version = "0.25.0" version = "0.25.0"
@ -7140,6 +7148,16 @@ dependencies = [
"winapi-util", "winapi-util",
] ]
[[package]]
name = "terminal_size"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
dependencies = [
"rustix",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "test_ffi" name = "test_ffi"
version = "0.1.0" version = "0.1.0"
@ -7305,9 +7323,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.37.0" version = "1.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes", "bytes",

View file

@ -177,7 +177,7 @@ tar = "=0.4.40"
tempfile = "3.4.0" tempfile = "3.4.0"
termcolor = "1.1.3" termcolor = "1.1.3"
thiserror = "1.0.61" thiserror = "1.0.61"
tokio = { version = "1.36.0", features = ["full"] } tokio = { version = "=1.36.0", features = ["full"] }
tokio-metrics = { version = "0.3.0", features = ["rt"] } tokio-metrics = { version = "0.3.0", features = ["rt"] }
tokio-rustls = { version = "0.26.0", default-features = false, features = ["ring", "tls12"] } tokio-rustls = { version = "0.26.0", default-features = false, features = ["ring", "tls12"] }
tokio-socks = "0.5.1" tokio-socks = "0.5.1"

View file

@ -90,9 +90,9 @@ bincode = "=1.3.3"
bytes.workspace = true bytes.workspace = true
cache_control.workspace = true cache_control.workspace = true
chrono = { workspace = true, features = ["now"] } chrono = { workspace = true, features = ["now"] }
clap = { version = "=4.4.17", features = ["env", "string"] } clap = { version = "=4.5.13", features = ["env", "string", "wrap_help"] }
clap_complete = "=4.4.7" clap_complete = "=4.5.12"
clap_complete_fig = "=4.4.2" clap_complete_fig = "=4.5.2"
color-print = "0.3.5" color-print = "0.3.5"
console_static_text.workspace = true console_static_text.workspace = true
dashmap = "5.5.3" dashmap = "5.5.3"
@ -145,6 +145,7 @@ serde_repr.workspace = true
sha2.workspace = true sha2.workspace = true
shell-escape = "=0.1.5" shell-escape = "=0.1.5"
spki = { version = "0.7", features = ["pem"] } spki = { version = "0.7", features = ["pem"] }
strsim = "0.11.1"
tar.workspace = true tar.workspace = true
tempfile.workspace = true tempfile.workspace = true
text-size = "=1.1.0" text-size = "=1.1.0"

File diff suppressed because it is too large Load diff

View file

@ -166,6 +166,9 @@ async fn run_subcommand(flags: Arc<Flags>) -> Result<i32, AnyError> {
DenoSubcommand::Install(install_flags) => spawn_subcommand(async { DenoSubcommand::Install(install_flags) => spawn_subcommand(async {
tools::installer::install_command(flags, install_flags).await tools::installer::install_command(flags, install_flags).await
}), }),
DenoSubcommand::JSONReference(json_reference) => spawn_subcommand(async move {
display::write_to_stdout_ignore_sigpipe(&deno_core::serde_json::to_vec_pretty(&json_reference.json).unwrap())
}),
DenoSubcommand::Jupyter(jupyter_flags) => spawn_subcommand(async { DenoSubcommand::Jupyter(jupyter_flags) => spawn_subcommand(async {
tools::jupyter::kernel(flags, jupyter_flags).await tools::jupyter::kernel(flags, jupyter_flags).await
}), }),
@ -192,29 +195,47 @@ async fn run_subcommand(flags: Arc<Flags>) -> Result<i32, AnyError> {
tools::run::run_from_stdin(flags.clone()).await tools::run::run_from_stdin(flags.clone()).await
} else { } else {
let result = tools::run::run_script(WorkerExecutionMode::Run, flags.clone(), run_flags.watch).await; let result = tools::run::run_script(WorkerExecutionMode::Run, flags.clone(), run_flags.watch).await;
match result { match result {
Ok(v) => Ok(v), Ok(v) => Ok(v),
Err(script_err) => { Err(script_err) => {
if script_err.to_string().starts_with(MODULE_NOT_FOUND) { if script_err.to_string().starts_with(MODULE_NOT_FOUND) {
let mut new_flags = flags.deref().clone(); if run_flags.bare {
let task_flags = TaskFlags { let mut cmd = args::clap_root();
cwd: None, cmd.build();
task: Some(run_flags.script.clone()), let command_names = cmd.get_subcommands().map(|command| command.get_name()).collect::<Vec<_>>();
}; let suggestions = args::did_you_mean(&run_flags.script, command_names);
new_flags.subcommand = DenoSubcommand::Task(task_flags.clone()); if !suggestions.is_empty() {
let result = tools::task::execute_script(Arc::new(new_flags), task_flags.clone(), true).await; let mut error = clap::error::Error::<clap::error::DefaultFormatter>::new(clap::error::ErrorKind::InvalidSubcommand).with_cmd(&cmd);
match result { error.insert(
Ok(v) => Ok(v), clap::error::ContextKind::SuggestedSubcommand,
Err(_) => { clap::error::ContextValue::Strings(suggestions),
// Return script error for backwards compatibility. );
Err(error.into())
} else {
Err(script_err) Err(script_err)
}
} else {
let mut new_flags = flags.deref().clone();
let task_flags = TaskFlags {
cwd: None,
task: Some(run_flags.script.clone()),
};
new_flags.subcommand = DenoSubcommand::Task(task_flags.clone());
let result = tools::task::execute_script(Arc::new(new_flags), task_flags.clone(), true).await;
match result {
Ok(v) => Ok(v),
Err(_) => {
// Return script error for backwards compatibility.
Err(script_err)
}
}
} }
} else {
Err(script_err)
} }
} else {
Err(script_err)
} }
}, }
}
} }
}), }),
DenoSubcommand::Serve(serve_flags) => spawn_subcommand(async move { DenoSubcommand::Serve(serve_flags) => spawn_subcommand(async move {
@ -270,6 +291,9 @@ async fn run_subcommand(flags: Arc<Flags>) -> Result<i32, AnyError> {
DenoSubcommand::Publish(publish_flags) => spawn_subcommand(async { DenoSubcommand::Publish(publish_flags) => spawn_subcommand(async {
tools::registry::publish(flags, publish_flags).await tools::registry::publish(flags, publish_flags).await
}), }),
DenoSubcommand::Help(help_flags) => spawn_subcommand(async move {
display::write_to_stdout_ignore_sigpipe(help_flags.help.ansi().to_string().as_bytes())
}),
}; };
handle.await? handle.await?

View file

@ -12,30 +12,29 @@ fn help_output() {
let stdout = output.combined_output(); let stdout = output.combined_output();
let subcommand_descriptions = vec![ let subcommand_descriptions = vec![
"Run a JavaScript or TypeScript program", "Run a JavaScript or TypeScript program, or a task",
"Run a server",
"Run a task defined in the configuration file",
"Start an interactive Read-Eval-Print Loop (REPL) for Deno",
"Evaluate a script from the command line",
"Add dependencies",
"Install script as an executable",
"Uninstall a script previously installed with deno install",
"Run benchmarks", "Run benchmarks",
"Bundle module and dependencies into single file",
"Cache the dependencies", "Cache the dependencies",
"Type-check the dependencies", "Type-check the dependencies",
"Compile the script into a self contained executable", "Compile the script into a self contained executable",
"Generate shell completions",
"Print coverage reports", "Print coverage reports",
"Show documentation for a module", "Genereate and show documentation for a module or built-ins",
"Eval script",
"Format source files", "Format source files",
"Initialize a new project",
"Show info about cache or info related to source file", "Show info about cache or info related to source file",
"Install script as an executable", "Deno kernel for Jupyter notebooks",
"Uninstall a script previously installed with deno install",
"Start the language server",
"Lint source files", "Lint source files",
"Read Eval Print Loop", "Initialize a new project",
"Run a task defined in the configuration file",
"Run tests", "Run tests",
"Print runtime TypeScript declarations", "Publish the current working directory's package or workspace",
#[cfg(feature = "upgrade")] #[cfg(feature = "upgrade")]
"Upgrade deno executable to given version", "Upgrade deno executable to given version",
"Print this message or the help of the given subcommand(s)",
]; ];
for description in subcommand_descriptions { for description in subcommand_descriptions {