diff options
author | Bartek Iwańczuk <biwanczuk@gmail.com> | 2023-03-09 20:09:14 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-10 01:09:14 +0100 |
commit | 78d430103a8f6931154ddbbe19d36f3b8630286d (patch) | |
tree | 45d633924d5161c34082a8a47a0889ce56a8b8ca /runtime/permissions/prompter.rs | |
parent | 0da193882ef94b97331babcebe1316535e2926f0 (diff) |
fix(prompt): better output with control chars (#18108)
Diffstat (limited to 'runtime/permissions/prompter.rs')
-rw-r--r-- | runtime/permissions/prompter.rs | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/runtime/permissions/prompter.rs b/runtime/permissions/prompter.rs index d148b485e..d94264b1a 100644 --- a/runtime/permissions/prompter.rs +++ b/runtime/permissions/prompter.rs @@ -5,6 +5,14 @@ use deno_core::error::AnyError; use deno_core::parking_lot::Mutex; use once_cell::sync::Lazy; +/// Helper function to strip ansi codes and ASCII control characters. +fn strip_ansi_codes_and_ascii_control(s: &str) -> std::borrow::Cow<str> { + console_static_text::strip_ansi_codes(s) + .chars() + .filter(|c| !c.is_ascii_control()) + .collect() +} + pub const PERMISSION_EMOJI: &str = "⚠️"; #[derive(Debug, Eq, PartialEq)] @@ -203,6 +211,10 @@ impl PermissionPrompter for TtyPrompter { let _stdout_guard = std::io::stdout().lock(); let _stderr_guard = std::io::stderr().lock(); + let message = strip_ansi_codes_and_ascii_control(message); + let name = strip_ansi_codes_and_ascii_control(name); + let api_name = api_name.map(strip_ansi_codes_and_ascii_control); + // print to stderr so that if stdout is piped this is still displayed. let opts: String = if is_unary { format!("[y/n/A] (y = yes, allow; n = no, deny; A = allow all {name} permissions)") @@ -211,9 +223,9 @@ impl PermissionPrompter for TtyPrompter { }; eprint!("┌ {PERMISSION_EMOJI} "); eprint!("{}", colors::bold("Deno requests ")); - eprint!("{}", colors::bold(message)); + eprint!("{}", colors::bold(message.clone())); eprintln!("{}", colors::bold(".")); - if let Some(api_name) = api_name { + if let Some(api_name) = api_name.clone() { eprintln!("├ Requested by `{api_name}` API"); } let msg = format!("Run again with --allow-{name} to bypass this prompt."); |