summaryrefslogtreecommitdiff
path: root/runtime/permissions/prompter.rs
diff options
context:
space:
mode:
authorBartek Iwańczuk <biwanczuk@gmail.com>2023-03-09 20:09:14 -0400
committerGitHub <noreply@github.com>2023-03-10 01:09:14 +0100
commit78d430103a8f6931154ddbbe19d36f3b8630286d (patch)
tree45d633924d5161c34082a8a47a0889ce56a8b8ca /runtime/permissions/prompter.rs
parent0da193882ef94b97331babcebe1316535e2926f0 (diff)
fix(prompt): better output with control chars (#18108)
Diffstat (limited to 'runtime/permissions/prompter.rs')
-rw-r--r--runtime/permissions/prompter.rs16
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.");