diff --git a/cli/rt/02_console.js b/cli/rt/02_console.js index b6f5bc74bee79..a5e6595b97684 100644 --- a/cli/rt/02_console.js +++ b/cli/rt/02_console.js @@ -462,7 +462,11 @@ .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/\t/g, "\\t") - .replace(/\v/g, "\\v"); + .replace(/\v/g, "\\v") + .replace( + /[\x00-\x1f\x7f-\x9f]/g, + (c) => "\\x" + c.charCodeAt(0).toString(16).padStart(2, "0"), + ); } // Print strings when they are inside of arrays or objects with quotes diff --git a/cli/tests/unit/console_test.ts b/cli/tests/unit/console_test.ts index 42885957adff8..8b5079a598fc4 100644 --- a/cli/tests/unit/console_test.ts +++ b/cli/tests/unit/console_test.ts @@ -94,16 +94,25 @@ unitTest(function consoleTestStringifyComplexObjects(): void { unitTest( function consoleTestStringifyComplexObjectsWithEscapedSequences(): void { assertEquals( - stringify(["foo\b", "foo\f", "foo\n", "foo\r", "foo\t", "foo\v"]), - `[ "foo\\b", "foo\\f", "foo\\n", "foo\\r", "foo\\t", "foo\\v" ]`, + stringify( + ["foo\b", "foo\f", "foo\n", "foo\r", "foo\t", "foo\v", "foo\0"], + ), + `[ + "foo\\b", "foo\\f", + "foo\\n", "foo\\r", + "foo\\t", "foo\\v", + "foo\\x00" +]`, ); assertEquals( - stringify({ "foo\b": "bar\n", "bar\r": "baz\t" }), - `{ foo\\b: "bar\\n", bar\\r: "baz\\t" }`, + stringify( + { "foo\b": "bar\n", "bar\r": "baz\t", "qux\0": "qux\0" }, + ), + `{ foo\\b: "bar\\n", bar\\r: "baz\\t", qux\\x00: "qux\\x00" }`, ); assertEquals( - stringify(new Set(["foo\n", "foo\r"])), - `Set { "foo\\n", "foo\\r" }`, + stringify(new Set(["foo\n", "foo\r", "foo\0"])), + `Set { "foo\\n", "foo\\r", "foo\\x00" }`, ); }, );