From a33315aaa70884c10968669c31adf3c6bb142e72 Mon Sep 17 00:00:00 2001 From: Casper Beyer Date: Tue, 22 Sep 2020 23:10:02 +0800 Subject: [PATCH] fix(cli/console): quote object symbol keys that are invalid identifiers (#7553) --- cli/rt/02_console.js | 15 ++++++++++++++- cli/tests/unit/console_test.ts | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/cli/rt/02_console.js b/cli/rt/02_console.js index 1dd69efef8..5de0bfa606 100644 --- a/cli/rt/02_console.js +++ b/cli/rt/02_console.js @@ -481,6 +481,19 @@ return quoteString(string); } + // Surround a symbol's description in quotes when it is required (e.g the description has non printable characters). + function maybeQuoteSymbol(symbol) { + if (symbol.description === undefined) { + return symbol.toString(); + } + + if (/^[a-zA-Z_][a-zA-Z_.0-9]*$/.test(symbol.description)) { + return symbol.toString(); + } + + return `Symbol(${quoteString(symbol.description)})`; + } + // Print strings when they are inside of arrays or objects with quotes function inspectValueWithQuotes( value, @@ -734,7 +747,7 @@ } for (const key of symbolKeys) { entries.push( - `${replaceEscapeSequences(key.toString())}: ${ + `${maybeQuoteSymbol(key)}: ${ inspectValueWithQuotes( value[key], ctx, diff --git a/cli/tests/unit/console_test.ts b/cli/tests/unit/console_test.ts index 97f4ce0d23..483ecfab66 100644 --- a/cli/tests/unit/console_test.ts +++ b/cli/tests/unit/console_test.ts @@ -110,6 +110,24 @@ unitTest( ), `{ "foo\\b": "bar\\n", "bar\\r": "baz\\t", "qux\\x00": "qux\\x00" }`, ); + assertEquals( + stringify( + { + [Symbol("foo\b")]: `Symbol("foo\n")`, + [Symbol("bar\n")]: `Symbol("bar\n")`, + [Symbol("bar\r")]: `Symbol("bar\r")`, + [Symbol("baz\t")]: `Symbol("baz\t")`, + [Symbol("qux\0")]: `Symbol("qux\0")`, + }, + ), + `{ + Symbol("foo\\b"): 'Symbol("foo\\n\")', + Symbol("bar\\n"): 'Symbol("bar\\n\")', + Symbol("bar\\r"): 'Symbol("bar\\r\")', + Symbol("baz\\t"): 'Symbol("baz\\t\")', + Symbol("qux\\x00"): 'Symbol(\"qux\\x00")' +}`, + ); assertEquals( stringify(new Set(["foo\n", "foo\r", "foo\0"])), `Set { "foo\\n", "foo\\r", "foo\\x00" }`,