diff --git a/ext/console/01_console.js b/ext/console/01_console.js index b851b40352..02c962cd1b 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 f0002b52f2..862838dcb3 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, 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>(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 eda386a826..7bb99a5737 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 298ce17153..eab7b10bac 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 0000000000..e1e991d878 --- /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, + }), +);