This function inspects the contents of a given object and returns a string representation of it's value, including it's private class fields. This is intended to be used for debugging purposes.
const inspect = require('./relative/path/to/private-field-inspect');
class Subject
{
publicValue = 'not so secret';
#secretValue = 'my secret';
}
const subject = new Subject();
inspect(subject).then(console.debug);Output:
{ publicValue: 'not so secret', '#secretValue': 'my secret' }Alternativelly, import it only once like below to setup inspect as a global function.
require('./relative/path/to/private-field-inspect/global');You can pass an object with options as a second argument.
Optios:
output: Determines what should be returned.-
If
'inspect'(default): Uses util.inspect to generate a string representation of the object. In this case, additional options present in the options object are passed to theutil.inspectfunction so that you can customize the output. -
If
'json': Outputs a JSON representation of the object. -
If
'object': It returns a javascript object you can read programatically, rather than a string. You can access the private fields by their name, using braces.Example:
const openObject = await inspect(subject, {output: 'object'}); const secretValue = openObject['#secretValue'];
-
depth(default 2): Determines how deep in the object hierarchy the function should go. Don't useInfinityif your object might have circular references because the function does't handle it.
-
Reading private class fields was supposed to not be possible except using Node debugger. The way we work around it is by using Node's inspector API to dynamically open a debugger session and use it to read the object's private fields.
This approach causes the following side effects:
- A "Debugger listening on <url>" warning will be printed in the console even if you are not running node with
--inspect; - If you already happen to have a debugger session open when the
inspectfunction is called, the runtime might pause inside of it as if there were a breakpoint there (in this case, just ignore it and continue the execution); and - It doesn't work in the browser. (use Chrome DevTools to debug private class fields in the browser)
This is also why the function is asynchronous.
- A "Debugger listening on <url>" warning will be printed in the console even if you are not running node with
- Node 14.5+
- Doesn't work in the browser
As of now, VS Code's built-in debugger (currently 1.51.1) doesn't support private class fields yet, and Node (currently 15.4) doesn't show private class fields with
util.inspect, so if you want to debug your code that contains private class fields, you have to resort to something like this.
Update: As of 1.56.1, vscode-js-debug now supports inspecting private class fields, so this package is no longer necessary unless you use another debugger that don't support it or you don't have access to a debugger in your development environment.