diff options
Diffstat (limited to 'extensions/console/02_console.js')
-rw-r--r-- | extensions/console/02_console.js | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/extensions/console/02_console.js b/extensions/console/02_console.js index 6f2ed0c0e..b4b29e1ea 100644 --- a/extensions/console/02_console.js +++ b/extensions/console/02_console.js @@ -87,6 +87,10 @@ MathFloor, Number, NumberPrototypeToString, + Proxy, + ReflectGet, + ReflectGetOwnPropertyDescriptor, + ReflectGetPrototypeOf, WeakMap, WeakSet, } = window.__bootstrap.primordials; @@ -1953,6 +1957,58 @@ }); } + /** Creates a proxy that represents a subset of the properties + * of the original object optionally without evaluating the properties + * in order to get the values. */ + function createFilteredInspectProxy({ object, keys, evaluate }) { + return new Proxy({}, { + get(_target, key) { + if (key === SymbolToStringTag) { + return object.constructor?.name; + } else if (ArrayPrototypeIncludes(keys, key)) { + return ReflectGet(object, key); + } else { + return undefined; + } + }, + getOwnPropertyDescriptor(_target, key) { + if (!ArrayPrototypeIncludes(keys, key)) { + return undefined; + } else if (evaluate) { + return getEvaluatedDescriptor(object, key); + } else { + return getDescendantPropertyDescriptor(object, key) ?? + getEvaluatedDescriptor(object, key); + } + }, + has(_target, key) { + return ArrayPrototypeIncludes(keys, key); + }, + ownKeys() { + return keys; + }, + }); + + function getDescendantPropertyDescriptor(object, key) { + let propertyDescriptor = ReflectGetOwnPropertyDescriptor(object, key); + if (!propertyDescriptor) { + const prototype = ReflectGetPrototypeOf(object); + if (prototype) { + propertyDescriptor = getDescendantPropertyDescriptor(prototype, key); + } + } + return propertyDescriptor; + } + + function getEvaluatedDescriptor(object, key) { + return { + configurable: true, + enumerable: true, + value: object[key], + }; + } + } + // A helper function that will bind our own console implementation // with default implementation of Console from V8. This will cause // console messages to be piped to inspector console. @@ -1997,5 +2053,6 @@ customInspect, inspect, wrapConsole, + createFilteredInspectProxy, }; })(this); |