Woohah, tremendous improvements to the inspect helper
In order to print server side objects in the browser, you need to convert them to a string, since you cannot send a Javascript primitives over HTTP.
Many individuals opt for JSON.stringify(someObj)
to convert an object to its string representation and then print it in the browser. In fact, many template engines provides helpers for JSON.stringify
. For example: nunjucks
Problems with JSON.stringify
The stringify
method cannot represent all of the Javascript data types. It includes Maps
, Sets
, BigInt
and so on.
More importantly, the output of JSON.stringify
is not a true representation of an object and can trick you many times. For example:
You have the following class
class User {
constructor() {
this.options = {
timezone: 'UTC',
theme: 'dark'
}
this.attributes = {
username: 'virk',
email: 'virk@adonisjs.com'
}
}
toJSON() {
return this.attributes
}
}
If you print an instance of this class using console.log
, you will get the desired outcome
console.log(new User())
// User {
// options: {
// ...
// },
// attributes: {
// ...
// }
// }
However, with JSON.stringify
, you get the following output.
console.log(JSON.stringify(new User()))
// '{"username":"virk","email":"virk@adonisjs.com"}'
Where are the attributes
and options
properties?
Well, the JSON.stringify
method recursively calls .toJSON
method on the objects you pass. So, when the user
instance it passed to JSON.stringify
method, it returns the output of user.toJSON
.
This is not a problem with JSON.stringify
, since this method is not meant to inspect native data types. It is meant to serialize/deserialize them.
The console.log
method of Node.js doesn't use JSON.stringify
, it uses util.inspect. The util.inspect
method is great for dump the output in a terminal, but not in a browser.
Edge inspect
helper
With this release, the edge inspect helper works similar to console.log/util.inpsect
, but the output is tailored for browser with support for pretty printing.
Usage
Write the following code inside any template file.
{{ inspect(state) }}
Output