summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo Kettmeir <crowlkats@toaxl.com>2024-02-12 14:35:23 +0100
committerGitHub <noreply@github.com>2024-02-12 14:35:23 +0100
commitbd1358efab8ba7339a8e70034315fa7da840292e (patch)
treef29f366cbff49cdf0bfab697dcde4fb94ff7a09d
parent80d5ffbe7c4109229571bf94182cf3f40397795e (diff)
fix(console): support NO_COLOR and colors option in all scenarios (#21910)
Noticed in #21607
-rw-r--r--ext/console/01_console.js30
-rw-r--r--test_util/src/builders.rs26
-rw-r--r--test_util/src/lib.rs4
-rw-r--r--tests/integration/run_tests.rs14
-rw-r--r--tests/testdata/run/inspect_color_overwrite.ts5
5 files changed, 55 insertions, 24 deletions
diff --git a/ext/console/01_console.js b/ext/console/01_console.js
index b851b4035..02c962cd1 100644
--- a/ext/console/01_console.js
+++ b/ext/console/01_console.js
@@ -2335,10 +2335,14 @@ const denoInspectDefaultOptions = {
};
function getDefaultInspectOptions() {
+ const color = !getNoColor();
+
return {
budget: {},
seen: [],
...denoInspectDefaultOptions,
+ colors: color,
+ stylize: color ? createStylizeWithColor(styles, colors) : stylizeNoColor,
};
}
@@ -2939,7 +2943,6 @@ function inspectArgs(args, inspectOptions = {}) {
if (ctx.maxArrayLength === null) ctx.maxArrayLength = Infinity;
if (ctx.maxStringLength === null) ctx.maxStringLength = Infinity;
- const noColor = getNoColor();
const first = args[0];
let a = 0;
let string = "";
@@ -2982,7 +2985,7 @@ function inspectArgs(args, inspectOptions = {}) {
formattedArg = formatValue(ctx, args[a++], 0);
} else if (char == "c") {
const value = args[a++];
- if (!noColor) {
+ if (ctx.colors) {
const css = parseCss(value);
formattedArg = cssToAnsi(css, prevCss);
if (formattedArg != "") {
@@ -3053,15 +3056,6 @@ const countMap = new SafeMap();
const timerMap = new SafeMap();
const isConsoleInstance = Symbol("isConsoleInstance");
-function getConsoleInspectOptions() {
- const color = !getNoColor();
- return {
- ...getDefaultInspectOptions(),
- colors: color,
- stylize: color ? createStylizeWithColor(styles, colors) : stylizeNoColor,
- };
-}
-
class Console {
#printFunc = null;
[isConsoleInstance] = false;
@@ -3090,7 +3084,7 @@ class Console {
log = (...args) => {
this.#printFunc(
inspectArgs(args, {
- ...getConsoleInspectOptions(),
+ ...getDefaultInspectOptions(),
indentLevel: this.indentLevel,
}) + "\n",
1,
@@ -3100,7 +3094,7 @@ class Console {
debug = (...args) => {
this.#printFunc(
inspectArgs(args, {
- ...getConsoleInspectOptions(),
+ ...getDefaultInspectOptions(),
indentLevel: this.indentLevel,
}) + "\n",
0,
@@ -3110,7 +3104,7 @@ class Console {
info = (...args) => {
this.#printFunc(
inspectArgs(args, {
- ...getConsoleInspectOptions(),
+ ...getDefaultInspectOptions(),
indentLevel: this.indentLevel,
}) + "\n",
1,
@@ -3119,7 +3113,7 @@ class Console {
dir = (obj = undefined, options = {}) => {
this.#printFunc(
- inspectArgs([obj], { ...getConsoleInspectOptions(), ...options }) +
+ inspectArgs([obj], { ...getDefaultInspectOptions(), ...options }) +
"\n",
1,
);
@@ -3130,7 +3124,7 @@ class Console {
warn = (...args) => {
this.#printFunc(
inspectArgs(args, {
- ...getConsoleInspectOptions(),
+ ...getDefaultInspectOptions(),
indentLevel: this.indentLevel,
}) + "\n",
2,
@@ -3140,7 +3134,7 @@ class Console {
error = (...args) => {
this.#printFunc(
inspectArgs(args, {
- ...getConsoleInspectOptions(),
+ ...getDefaultInspectOptions(),
indentLevel: this.indentLevel,
}) + "\n",
3,
@@ -3353,7 +3347,7 @@ class Console {
trace = (...args) => {
const message = inspectArgs(
args,
- { ...getConsoleInspectOptions(), indentLevel: 0 },
+ { ...getDefaultInspectOptions(), indentLevel: 0 },
);
const err = {
name: "Trace",
diff --git a/test_util/src/builders.rs b/test_util/src/builders.rs
index f0002b52f..862838dcb 100644
--- a/test_util/src/builders.rs
+++ b/test_util/src/builders.rs
@@ -316,6 +316,7 @@ pub struct TestCommandBuilder {
args_text: String,
args_vec: Vec<String>,
split_output: bool,
+ skip_strip_ansi: bool,
}
impl TestCommandBuilder {
@@ -327,6 +328,7 @@ impl TestCommandBuilder {
stderr: None,
stdin_text: None,
split_output: false,
+ skip_strip_ansi: false,
cwd: None,
envs: Default::default(),
envs_remove: Default::default(),
@@ -410,6 +412,11 @@ impl TestCommandBuilder {
self
}
+ pub fn skip_strip_ansi(mut self) -> Self {
+ self.skip_strip_ansi = true;
+ self
+ }
+
pub fn stdin<T: Into<Stdio>>(mut self, cfg: T) -> Self {
self.stdin = Some(StdioContainer::new(cfg.into()));
self
@@ -533,8 +540,14 @@ impl TestCommandBuilder {
output
}
- fn sanitize_output(text: String, args: &[OsString]) -> String {
- let mut text = strip_ansi_codes(&text).to_string();
+ fn sanitize_output(
+ mut text: String,
+ args: &[OsString],
+ skip_strip_ansi: bool,
+ ) -> String {
+ if !skip_strip_ansi {
+ text = strip_ansi_codes(&text).to_string();
+ }
// deno test's output capturing flushes with a zero-width space in order to
// synchronize the output pipes. Occasionally this zero width space
// might end up in the output so strip it from the output comparison here.
@@ -581,14 +594,15 @@ impl TestCommandBuilder {
// and dropping it closes them.
drop(command);
- let combined = combined_reader
- .map(|pipe| sanitize_output(read_pipe_to_string(pipe), &args));
+ let combined = combined_reader.map(|pipe| {
+ sanitize_output(read_pipe_to_string(pipe), &args, self.skip_strip_ansi)
+ });
let status = process.wait().unwrap();
let std_out_err = std_out_err_handle.map(|(stdout, stderr)| {
(
- sanitize_output(stdout.join().unwrap(), &args),
- sanitize_output(stderr.join().unwrap(), &args),
+ sanitize_output(stdout.join().unwrap(), &args, self.skip_strip_ansi),
+ sanitize_output(stderr.join().unwrap(), &args, self.skip_strip_ansi),
)
});
let exit_code = status.code();
diff --git a/test_util/src/lib.rs b/test_util/src/lib.rs
index eda386a82..7bb99a573 100644
--- a/test_util/src/lib.rs
+++ b/test_util/src/lib.rs
@@ -490,6 +490,7 @@ pub struct CheckOutputIntegrationTest<'a> {
pub http_server: bool,
pub envs: Vec<(String, String)>,
pub env_clear: bool,
+ pub skip_strip_ansi: bool,
pub temp_cwd: bool,
/// Copies the files at the specified directory in the "testdata" directory
/// to the temp folder and runs the test from there. This is useful when
@@ -531,6 +532,9 @@ impl<'a> CheckOutputIntegrationTest<'a> {
if self.env_clear {
command_builder = command_builder.env_clear();
}
+ if self.skip_strip_ansi {
+ command_builder = command_builder.skip_strip_ansi();
+ }
if let Some(cwd) = &self.cwd {
command_builder = command_builder.current_dir(cwd);
}
diff --git a/tests/integration/run_tests.rs b/tests/integration/run_tests.rs
index 298ce1715..eab7b10ba 100644
--- a/tests/integration/run_tests.rs
+++ b/tests/integration/run_tests.rs
@@ -5140,3 +5140,17 @@ console.log(add(3, 4));
let output = test_context.new_command().args("run main.ts").run();
output.assert_matches_text("[WILDCARD]5\n7\n");
}
+
+#[test]
+fn inspect_color_overwrite() {
+ let test_context = TestContextBuilder::new().build();
+ let output = test_context
+ .new_command()
+ .skip_strip_ansi()
+ .split_output()
+ .env("NO_COLOR", "1")
+ .args("run run/inspect_color_overwrite.ts")
+ .run();
+
+ assert_eq!(output.stdout(), "foo\u{1b}[31mbar\u{1b}[0m\n");
+}
diff --git a/tests/testdata/run/inspect_color_overwrite.ts b/tests/testdata/run/inspect_color_overwrite.ts
new file mode 100644
index 000000000..e1e991d87
--- /dev/null
+++ b/tests/testdata/run/inspect_color_overwrite.ts
@@ -0,0 +1,5 @@
+console.log(
+ Deno[Deno.internal].inspectArgs(["%cfoo%cbar", "", "color: red"], {
+ colors: true,
+ }),
+);