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.inspect
function 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 useInfinity
if 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
inspect
function 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.