diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2019-03-19 12:15:01 -0400 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2019-03-20 12:38:59 -0400 |
commit | 8f334ae56887cc5291be20da8b9288fe7054410e (patch) | |
tree | 1261516ff20ef90bace9d74b9ceea73af79cda3b /js | |
parent | 4c831f1eb5e5eae4d56c82c941260f5b18940369 (diff) |
Improve pretty printing of objects
If an object has more than 5 elements, it is printed in abbeviated form
displaying only the keys. This is useful in the REPL when inspecting
large objects like the Deno namespace:
> Deno
{ args, noColor, pid, env, exit, isTTY, execPath, chdir, cwd, File,
open, stdin, stdout, stderr, read, write, seek, close, copy,
toAsyncIterator, SeekMode, Buffer, readAll, mkdirSync, mkdir,
makeTempDirSync, makeTempDir, chmodSync, chmod, removeSync, remove,
renameSync, rename, readFileSync, readFile, readDirSync, readDir,
copyFileSync, copyFile, readlinkSync, readlink, statSync, lstatSync,
stat, lstat, symlinkSync, symlink, writeFileSync, writeFile, ErrorKind,
DenoError, libdeno, permissions, revokePermission, truncateSync,
truncate, connect, dial, listen, metrics, resources, run, Process,
inspect, build, platform, version, Console, stringifyArgs,
DomIterableMixin }
Diffstat (limited to 'js')
-rw-r--r-- | js/console.ts | 24 | ||||
-rw-r--r-- | js/console_test.ts | 4 |
2 files changed, 19 insertions, 9 deletions
diff --git a/js/console.ts b/js/console.ts index 20eafbacf..bde912dd6 100644 --- a/js/console.ts +++ b/js/console.ts @@ -19,6 +19,10 @@ type ConsoleOptions = Partial<{ // Default depth of logging nested objects const DEFAULT_MAX_DEPTH = 4; +// Number of elements an object must have before it's displayed in appreviated +// form. +const OBJ_ABBREVIATE_SIZE = 5; + // Char codes const CHAR_PERCENT = 37; /* % */ const CHAR_LOWERCASE_S = 115; /* s */ @@ -272,7 +276,6 @@ function createRawObjectString( } ctx.add(value); - const entries: string[] = []; let baseString = ""; const className = getClassInstanceName(value); @@ -280,12 +283,19 @@ function createRawObjectString( if (className && className !== "Object" && className !== "anonymous") { shouldShowClassName = true; } - - for (const key of Object.keys(value)) { - entries.push( - `${key}: ${stringifyWithQuotes(value[key], ctx, level + 1, maxLevel)}` - ); - } + const keys = Object.keys(value); + const entries: string[] = keys.map(key => { + if (keys.length > OBJ_ABBREVIATE_SIZE) { + return key; + } else { + return `${key}: ${stringifyWithQuotes( + value[key], + ctx, + level + 1, + maxLevel + )}`; + } + }); ctx.delete(value); diff --git a/js/console_test.ts b/js/console_test.ts index ddc48de05..994f0ecfd 100644 --- a/js/console_test.ts +++ b/js/console_test.ts @@ -72,7 +72,7 @@ test(function consoleTestStringifyCircular() { }; nestedObj.o = circularObj; - const nestedObjExpected = `{ num: 1, bool: true, str: "a", method: [Function: method], asyncMethod: [AsyncFunction: asyncMethod], generatorMethod: [GeneratorFunction: generatorMethod], un: undefined, nu: null, arrowFunc: [Function: arrowFunc], extendedClass: Extended { a: 1, b: 2 }, nFunc: [Function], extendedCstr: [Function: Extended], o: { num: 2, bool: false, str: "b", method: [Function: method], un: undefined, nu: null, nested: [Circular], emptyObj: {}, arr: [ 1, "s", false, null, [Circular] ], baseClass: Base { a: 1 } } }`; + const nestedObjExpected = `{ num, bool, str, method, asyncMethod, generatorMethod, un, nu, arrowFunc, extendedClass, nFunc, extendedCstr, o }`; assertEquals(stringify(1), "1"); assertEquals(stringify(1n), "1n"); @@ -114,7 +114,7 @@ test(function consoleTestStringifyCircular() { assertEquals(stringify(JSON), "{}"); assertEquals( stringify(console), - "Console { printFunc: [Function], log: [Function], debug: [Function], info: [Function], dir: [Function], warn: [Function], error: [Function], assert: [Function], count: [Function], countReset: [Function], table: [Function], time: [Function], timeLog: [Function], timeEnd: [Function], group: [Function], groupCollapsed: [Function], groupEnd: [Function], clear: [Function], indentLevel: 0, collapsedAt: null }" + "Console { printFunc, log, debug, info, dir, warn, error, assert, count, countReset, table, time, timeLog, timeEnd, group, groupCollapsed, groupEnd, clear, indentLevel, collapsedAt }" ); // test inspect is working the same assertEquals(inspect(nestedObj), nestedObjExpected); |