Skip to content
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

util: add null prototype support for date #25144

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions lib/internal/util/inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ function uncurryThis(func) {
const propertyIsEnumerable = uncurryThis(Object.prototype.propertyIsEnumerable);
const regExpToString = uncurryThis(RegExp.prototype.toString);
const dateToISOString = uncurryThis(Date.prototype.toISOString);
const dateToString = uncurryThis(Date.prototype.toString);
const errorToString = uncurryThis(Error.prototype.toString);

const bigIntValueOf = uncurryThis(BigInt.prototype.valueOf);
Expand Down Expand Up @@ -646,12 +647,15 @@ function formatRaw(ctx, value, recurseTimes, typedArray) {
return ctx.stylize(base, 'regexp');
} else if (isDate(value)) {
// Make dates with properties first say the date
base = Number.isNaN(dateGetTime(value)) ?
dateToString(value) :
dateToISOString(value);
const prefix = getPrefix(constructor, tag, 'Date');
if (prefix !== 'Date ')
base = `${prefix}${base}`;
if (keys.length === 0) {
if (Number.isNaN(dateGetTime(value)))
return ctx.stylize(String(value), 'date');
return ctx.stylize(dateToISOString(value), 'date');
return ctx.stylize(base, 'date');
}
base = dateToISOString(value);
} else if (isError(value)) {
// Make error with message first say the error.
base = formatError(value);
Expand Down
6 changes: 3 additions & 3 deletions test/parallel/test-assert-deep.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,16 +117,16 @@ assert.throws(
{
code: 'ERR_ASSERTION',
message: `${defaultMsgStartFull}\n\n` +
'+ 2016-01-01T00:00:00.000Z\n- 2016-01-01T00:00:00.000Z {\n' +
"- '0': '1'\n- }"
'+ 2016-01-01T00:00:00.000Z\n- MyDate 2016-01-01T00:00:00.000Z' +
" {\n- '0': '1'\n- }"
}
);
assert.throws(
() => assert.deepStrictEqual(date2, date),
{
code: 'ERR_ASSERTION',
message: `${defaultMsgStartFull}\n\n` +
'+ 2016-01-01T00:00:00.000Z {\n' +
'+ MyDate 2016-01-01T00:00:00.000Z {\n' +
"+ '0': '1'\n+ }\n- 2016-01-01T00:00:00.000Z"
}
);
Expand Down
48 changes: 47 additions & 1 deletion test/parallel/test-util-inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -1663,7 +1663,9 @@ assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'");
'byteOffset: undefined,\n buffer: undefined }'],
[new SharedArrayBuffer(2), '[SharedArrayBuffer: null prototype] ' +
'{ [Uint8Contents]: <00 00>, byteLength: undefined }'],
[/foobar/, '[RegExp: null prototype] /foobar/']
antsmartian marked this conversation as resolved.
Show resolved Hide resolved
[/foobar/, '[RegExp: null prototype] /foobar/'],
[new Date('Sun, 14 Feb 2010 11:48:40 GMT'),
'[Date: null prototype] 2010-02-14T11:48:40.000Z']
].forEach(([value, expected]) => {
assert.strictEqual(
util.inspect(Object.setPrototypeOf(value, null)),
Expand Down Expand Up @@ -1707,6 +1709,50 @@ assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'");
assert(/\[Symbol\(foo\)]: 'yeah'/.test(res), res);
});

// Date null prototype checks
{
class CustomDate extends Date {
}

const date = new CustomDate('Sun, 14 Feb 2010 11:48:40 GMT');
assert.strictEqual(util.inspect(date), 'CustomDate 2010-02-14T11:48:40.000Z');

// add properties
date.foo = 'bar';
assert.strictEqual(util.inspect(date),
'{ CustomDate 2010-02-14T11:48:40.000Z foo: \'bar\' }');

// check for null prototype
Object.setPrototypeOf(date, null);
assert.strictEqual(util.inspect(date),
'{ [Date: null prototype] 2010-02-14T11:48:40.000Z' +
' foo: \'bar\' }');

const anotherDate = new CustomDate('Sun, 14 Feb 2010 11:48:40 GMT');
Object.setPrototypeOf(anotherDate, null);
assert.strictEqual(util.inspect(anotherDate),
'[Date: null prototype] 2010-02-14T11:48:40.000Z');
}

// Check for invalid dates and null prototype
{
class CustomDate extends Date {
}

const date = new CustomDate('invalid_date');
assert.strictEqual(util.inspect(date), 'CustomDate Invalid Date');

// add properties
date.foo = 'bar';
assert.strictEqual(util.inspect(date),
'{ CustomDate Invalid Date foo: \'bar\' }');

// check for null prototype
Object.setPrototypeOf(date, null);
assert.strictEqual(util.inspect(date),
'{ [Date: null prototype] Invalid Date foo: \'bar\' }');
}

assert.strictEqual(inspect(1n), '1n');
assert.strictEqual(inspect(Object(-1n)), '[BigInt: -1n]');
assert.strictEqual(inspect(Object(13n)), '[BigInt: 13n]');
Expand Down