-
Notifications
You must be signed in to change notification settings - Fork 29.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
console: add dirxml method #17152
console: add dirxml method #17152
Conversation
lib/console.js
Outdated
@@ -162,6 +162,25 @@ Console.prototype.dir = function dir(object, options) { | |||
}; | |||
|
|||
|
|||
Console.prototype.dirxml = function dirxml(...data) { | |||
const optionProps = ['showHidden', 'depth', 'colors'], | |||
maybeOptions = Object.getOwnPropertyNames(data.slice(-1)), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These should be separate const
statements.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Noted!
lib/console.js
Outdated
Console.prototype.dirxml = function dirxml(...data) { | ||
const optionProps = ['showHidden', 'depth', 'colors'], | ||
maybeOptions = Object.getOwnPropertyNames(data.slice(-1)), | ||
isOption = maybeOptions.some((p) => optionProps.indexOf(p) !== -1); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the last argument supposed to be an options object? The spec doesn't seem to call for that, and it makes for a slightly awkward UX, IMO. What if we want to display an object that has one of those magic props?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't get why this is here. The spec doesn't allow to specify options for dirxml
. The fact that there has to be this ugly code to detect it should indicate that it should not exist in the first place.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's kind of hard said like that.
Anyway, I thought about the possibility of having the last object having precisely one of those options, but I thought that it would be better to allow passing options if need be, just like console.dir()
and that the risk would be quite minimal.
Plus, it feels a bit weird to have dir
accept options but take only one object, and dirxml
not accepting options but taking a varying number of object, but maybe that's just me.
And it does remove the possibility for custom inspect, and so xml redering.
I'll remove it for now anyway, since it seems to be a bad idea, it's indeed akward.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
dir
explicitly lists options
as something that it accepts in the spec: https://console.spec.whatwg.org/#dir
When working on features which have a spec, decisions should always be informed by the behaviour defined there.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, since the console
spec is an early draft that's classified as a Living Standard, there's always the opportunity for you to go back and try to suggest improvement at the source. But Node.js shouldn't be the origin for that divergence since it just creates confusion for developers.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
BTW, the console.dir
spec was in fact amended to account for the possibility of having an options object because of Node.js (see whatwg/console#79). However, I agree with @apapirovski that
Node.js shouldn't be the origin for that divergence since it just creates confusion for developers.
-- not if we can help it anyway, which we couldn't with console.dir
w/o breaking backwards compatibility.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep, definitely agree and good to have a bit of background on that! Thanks @TimothyGu.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the background indeed!
However, I don't know if dir
is widely used, but I don't know either if it would be worth it to go and ask if the standard could be adapted.
Any opinion on this?
Still dropping this while the standard is as its current state anyway, it does make sense, thank you all!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The problem in this particular case is that dirxml
accepts a rest parameter which always has to be final, it's similar in that to log
and most other console
functions.
There would need to either be a method to set general settings for all dirxml
calls or some options object that is exposed on the console, or some sort of a Symbol
(similar to like @@toStringTag
) that gets declared on the object that decides the formatting preferences.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Indeed that's a problem, that's what had me attempt (poorly) to parse the last object in the list. I don't mind attempting again if the standard does evolve though. If it evolves and if it's worth it. I don't know if it's the case though.
First of all, thank you, @Tiriel! I was a bit surprised to see this implemented, the MDN page still says:
If that was still the case, I would generally be -1 on implementing this. Even if it has been included in a WhatWG living standard, we are not required to implement it. I have barely ever seen someone use If we are implementing this for the sake of conformity with the WhatWG standard, I am okay with this. Apart from that, I am not a fan of the function itself, especially in a non-interactive environment such as the Node.js console. Secondly, the name is misleading in an environment which does not have a concept of XML / HTML. The standard is vague, but the main aspect of the function is this:
We would basically use the fallback in all cases, which is no different than other |
@tniessen Thanks for the input! I am actually trying to implement it for conformity with the living standard indeed, as was (very lightly) discussed #17128 I totally agree with you on the use of the fallback though. I tried adding the possibility to pass a custom inspect function, to return proper xml when needed, but was dismissed for quite good reasons ( #17146 ). It would then in effect be really similar to The problem is, we've seen at least two times (need to find again the issues numbers, but at least #16755 ) people searching for the console methods exposed by V8. After discussing a bit with some people, I thought it would be better to have at least a minimal implementation of our own of these methods, or at least the ones present in the Living Standard. As said in other comments though, if the standard can be made to change (I quite don't understand why they allow passing options in Hope this makes sense! |
e362fe5
to
a69828a
Compare
Hi everyone! I just reworked the function to simply call As said, this implementation is for the sake of conformity until something better can be found, and to avoid having people trying to call the V8 exposed methods with no results. Documentation and test updated accordingly. Hope it's ok for everyone! |
e5d5898
to
4349856
Compare
doc/api/console.md
Outdated
|
||
This method calls `console.dir()` with default options for each argument it | ||
receives. See [`console.dir()`][] for more details about said defaults. | ||
Please note that this method doesn't produce any xml formatting and uses the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: Please use does not
instead of the abbreviated doesn't
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: xml
→ XML
. When in doubt, check the specification.
doc/api/console.md
Outdated
This method calls `console.dir()` with default options for each argument it | ||
receives. See [`console.dir()`][] for more details about said defaults. | ||
Please note that this method doesn't produce any xml formatting and uses the | ||
default `console.dir()` formatting resolution instead. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not a native English speaker myself, but resolution
sounds strange here IMO (at least I never used it in this context). It is not really necessary anyway as the first sentence already has the same information.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, I'll just let the precision on the absence of XML formatting then, just to be sure it's clear for everyone. But I thought resolution was indicated, you have me doubting now 😄
lib/console.js
Outdated
@@ -162,6 +162,13 @@ Console.prototype.dir = function dir(object, options) { | |||
}; | |||
|
|||
|
|||
Console.prototype.dirxml = function dirxml(...data) { | |||
for (const item of data) { | |||
Console.prototype.dir.call(this, item); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As far as I know, console
functions must not be called without a proper context, so this.dir(item)
should work.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll just check this and make sure it works! Thanks!
test/parallel/test-console.js
Outdated
"{ foo: 'bar', inspect: [Function: inspect] }\n"); | ||
assert.strictEqual(strings.shift().includes('foo: { bar: { baz:'), true); | ||
assert.strictEqual(strings.shift().includes('quux'), true); | ||
assert.strictEqual(strings.shift().includes('quux: true'), true); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please do not use assert.strictEqual(..., true)
. Just use assert(...)
(or assert.ok(...)
) to test for logic values. You can find the documentation here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Didn't know, sorry. Thanks!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No problem, thanks for going through our (sometimes a little long) process!
Again, thanks for working on this! 😃 I still can't say I like this function or seeing it implemented / used in non-browser environments, but if we consider the WhatWG standard important enough to go by it[1], I would like to point out that I personally think the standard suggests to print the items the same way I am not saying one behavior is better than the other or that I would personally prefer either, I am just wondering whether it would be a good idea to stick to conventions here. (The standard is really vague.) [1] As long as it contains a big red box saying "TODO: This will need a good algorithm" I would not necessarily do that. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM with nits addressed.
I have a commit ready to be pushed that adresses the nits in doc, but I am on another computer and need to build node first for testing/linting. Anyway, the commit I want to push also changes the method from parsing args and using |
4349856
to
335896d
Compare
Here we are! @tniessen @TimothyGu @cjihrig PTAL! And thank you all! |
doc/api/console.md
Outdated
* `...data` {any} | ||
|
||
This method calls `console.dir()` with default options for each argument it | ||
receives. See [`console.dir()`][] for more details about said defaults. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will require some changes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Damn, sorry about that. Fixing right now and squashing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed!
335896d
to
68d62dd
Compare
doc/api/console.md
Outdated
added: v8.0.0 | ||
changes: | ||
- version: REPLACEME | ||
pr-url: https://github.com/nodejs/node/pull/17128 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: This should be https://github.com/nodejs/node/pull/17152
as far as I can tell.
lib/console.js
Outdated
@@ -162,6 +162,11 @@ Console.prototype.dir = function dir(object, options) { | |||
}; | |||
|
|||
|
|||
Console.prototype.dirxml = function dirxml(...data) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: This can be simplified to Console.prototype.dirxml = Console.prototype.log
as far as I can tell.
This method was previously exposed by V8 (since Node v8.0.0) and not implemented in Node directly. Tests coming soon. Refs: nodejs#17128
…eceived. Minimal implementation following the Living Standard specs, following reviews. Fixes: nodejs#17128
Nits in documentation, rework dirxml to use console.log, tests. Fixes: nodejs#17128
68d62dd
to
a8ea202
Compare
Nits adressed! Thanks @tniessen Branch can be merge, but I'll keep a tab to see if some basic XML formatting can be implemented someday in the inspection functions. I'm quite not satisfied with this method being just another alias for log, although it allows a basic implementation for now. |
I feel like the naming might be throwing you off. |
What @apapirovski described is true. The function was designed for browsers, that's why the WhatWG living standard focuses on DOM / XML here, but there really is no concept of that within node. Not even browsers format non-DOM nodes as XML: |
@apapirovski @tniessen I admit at first I have been quite confused and thought it should parse XML, but that's not what I'm talking about now. The Standard isn't very clear, but it seems to indicate that
The term "converted" at least seems to indicate that to me. I know Node doesn't implement DOM, so it would be some "display only" thing. And I know browsers don't do that either, but as said, the standard isn't very clear and there are know differences between the standard and the browsers implementations (see the discussion about Anyway as said, it can be merged in this state, it does fulfill the "otherwise" condition above, it's just something I want to investigate on my own afterwards ^^ Thanks again for all the inputs! |
I am not an expert here, but as far as I know, DOM is basically an interpretation of HTML/XML documents, and not every XML document / tree produces a DOM tree (even though every DOM tree can be represented as an XML document). So even if you formatted the data as XML, that still would not make it a "DOM tree representation". I don't think browsers will attempt to display data as DOM trees unless they are DOM nodes. Why would anyone want to have a DOM representation of data which is not DOM? Anyway, feel free to research this yourself! :) |
I'm not sure it makes sense to add this to console, especially if it doesn't output in XML. Although I greatly appreciate the time you took to work on this @Tiriel I think I'm -1. |
in chrome and firefox, as far as i can tell, dirxml is just a direct alias to log. perhaps we should just do the same here. |
@devsnek Well, I don't know how exactly they implement it, but that's the way it is reduced in this PR, and I think that should be the strict minimum implemented, if only to expose it on our own and respect the standard. I'd like it to present a version of DOM treeish printing, even if it can't be interactive like in the browsers for obvious reasons, but I'll settle for the |
Node core has no concept of DOM... We can't print a DOM tree when we don't know what a DOM node is and isn't. Browsers have specific APIs around the DOM that are not in Node and that are instead re-created by packages like jsdom.
Node apps do not deal with DOM unless they implement jsdom or similar. They're usually dealing either with Virtual DOM (React & similar), or they're dealing with strings that represent HTML/XML.
Node is not used for front-end apps. It's used for front-end tooling, which again has no concept of the DOM unless it implements jsdom or similar.
See above. We can't display something we don't have any concept of. To elaborate, most of the core JS implementation in Node.js comes from V8 with certain other APIs implemented by Node instead (setTimeout, TextDecoder, etc.). The DOM (and, more specifically, its implementation) is a wholly separate thing that, within Chrome, is connected to V8 via bindings and that Node.js does not currently have access to nor any hope of having access to. |
@apapirovski Even if that's the case - and I know it is, you're perfectly right - that's still a problem I'll deal with when searching possible solutions. But that's not the purpose of this PR anymore since I've noted that at least one person -1. |
I'm trying to save you time by explaining why there are not "possible solutions" to the problem you think that there is. This either lands as a simple alias or it won't land at all, there's no better implementation that Node needs or — more importantly — can possibly have. I'm simply trying to avoid a situation where you spend time writing an XML parser or Object to tree formatter, only to have that PR be rejected. |
@apapirovski I do appreciate that, thanks sincerely. But everyone needs a hobby ;) And while I'm at it, I hope I offended no one, it was not my intent. I'm not a native english speaker, I make mistakes, but I do try my best to express myself correctly. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the record, I think this should land as is. There's no possibility of getting something better and this can potentially allow code re-use in some bizarre code bases that rely on this and don't use the DOM...
It's what I have been saying all along, this function does not make sense in Node.js core, and the only reason to implement it is conformity with the WhatWG living standard. Personally, I don't deem conformity with a half-baked living standard important, but I also won't block this because apparently, others do. I think it won't get any better than this implementation and it does not make things worse than they currently are, except that implementing and documenting it means that people will eventually start using it, and that's when the trouble starts. At the moment, we are kind of at advantage as the standard is vague enough to allow @evanlucas Please make your -1 explicit if you feel like this should not land. I'd suggest to keep this open for a couple more days either way so we get a chance to get more feedback from the team. I think @jasnell worked on the console for some time, maybe he has some insights. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm fine with this strictly as an alias for console.log
.
I would like to land this within the next couple of days. Are you okay with that, @evanlucas? |
Yea I don’t want to block this if others want this in. Thanks! |
Landed in c84710d. |
This method was previously exposed by V8 (since node 8.0.0) but not implemented in node. PR-URL: #17152 Refs: #17128 Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This method was previously exposed by V8 (since node 8.0.0) but not implemented in node. PR-URL: #17152 Refs: #17128 Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This method was previously exposed by V8 (since node 8.0.0) but not implemented in node. PR-URL: #17152 Refs: #17128 Reviewed-By: Timothy Gu <timothygu99@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Shouldn't this be semver-minor? |
@gibfahn Depends on your perspective. Previously, the function was exposed (due to the inspector implementation) but was a no-op. Are we adding functionality or fixing something that's broken? I could go either way, but think |
I know I'm not TSC, but as the OP, if I may just say a word... |
This is an absolute
firstsecond draft.This method was previously exposed by V8 (since Node v8.0.0) and not
implemented in Node directly.
Tests coming soon.
Refs: #17128
Please feel free to comment and give any advice!
Checklist
make -j4 test
(UNIX), orvcbuild test
(Windows) passesAffected core subsystem(s)
console