-
Notifications
You must be signed in to change notification settings - Fork 30.1k
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
errors: improve invalid arg type #13834
Conversation
lib/internal/errors.js
Outdated
if (actual == null) { | ||
received = String(actual); | ||
} else if (typeof actual === 'object') { | ||
if (actual.constructor !== undefined) { |
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.
You may want to use single equals to also check for null
.
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.
Hm, as far as I can tell someone would have to explicitly set the constructor to null... that would be really weird but I'll change it accordingly.
Marking as semver-major due to changes in error messages. |
@mscdex this should not be semver major as the main intention of the internal errors was to change error messages when ever. |
Like the improvement. Agree we should still be making these changes semver-major until we get overall agreement that we can starting treating error messages changes differently. Also needs a rebase. |
There are mixed messages being conveyed #13730 (comment)... IMHO the CTC should discuss and decide. |
c180fec
to
63c5700
Compare
Rebased |
IMHO in the tests when you assert the message it should be a RegEx anchored with start-of-line and end in "Received": |
Another idea: export a function from errors: function invalidArg(opts) {
assert.strictEqual(Object.keys(opts).length, 2);
assert.strictEqual('expected' in opts, true);
const exp = opts.expected;
delete opts.expected;
const actKey = Object.keys(opts)[0];
const actVal = opts[actKey];
throw new TypeError('ERR_INVALID_ARG_TYPE', actKey, exp, actVal
// if we add a stackLimit arg
// ,invalidArg);
} |
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
@@ -34,13 +34,13 @@ for (let i = 0; i < 10; i++) { | |||
const invalidUserArgument = common.expectsError({ | |||
code: 'ERR_INVALID_ARG_TYPE', | |||
type: TypeError, | |||
message: 'The "preValue.user" property must be of type Number' | |||
message: /The "prevValue\.user" property must be of type number/ |
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.
Could you anchor these /^...
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.
Addressed
lib/util.js
Outdated
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', | ||
'superCtor.prototype', | ||
'function', | ||
superCtor.prototype); |
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.
IMHO for readability use undefined
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 personally prefer it this way to have a consistent way of doing this but I don't have strong feelings about it.
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.
👍 Generally I yield to the OP. So it's your call.
lib/util.js
Outdated
@@ -205,7 +205,8 @@ Object.defineProperty(inspect, 'defaultOptions', { | |||
}, | |||
set: function(options) { | |||
if (options === null || typeof options !== 'object') { | |||
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'object'); | |||
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'object', |
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.
Personal style nit: Is these cases chop down the args like in L1082
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.
Addressed
63c5700
to
0d4204c
Compare
I feel like this is a bit to much magic and the call itself won't be much shorter. So I'd say let's stick to how it is currently. I also added the |
👍
Just so it doesn't change "accidentally". Changes in test files get more review attention, so IMHO it's best to assert as much as possible, then later change carefully. |
0d4204c
to
dc4e540
Compare
Rebased |
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 a question. In a number of tests the check stops at 'Received' any reason we can't validate the additional information after 'Received' as well ?
It is in most cases possible to use the exact value. In the end I don't think that it's that important to test for the message strictly as it can change more often but I'm fine with changing it. |
I reworked the
ERR_INVALID_ARG_TYPE
error type in a way that provides more information to the user than before.All of these errors now return what was actually provided and failed.
The information about what was provided and what is expected is more specific (as in not only the type is checked but also the constructor).
I also fixed a few typos and wrong usages like using
typeof arg
as actual value instead ofarg
and one entry that actually checks a property, not an argument.There is one point that might be thought about: mixing multiple expected values can only print either
instance of
ortype of
. So['Array', 'string']
will result ininstance of Array or string
and notinstance of Array or type of string
. I could test each entry but I feel that is somewhat unnecessary?Checklist
make -j4 test
(UNIX), orvcbuild test
(Windows) passesAffected core subsystem(s)
errors