Skip to content

Commit

Permalink
util: add null prototype support for date
Browse files Browse the repository at this point in the history
PR-URL: #25144
Reviewed-By: Ruben Bridgewater <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
antsmartian authored and addaleax committed Jan 14, 2019
1 parent 201a8d9 commit 2e6e4cf
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 8 deletions.
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/']
[/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

0 comments on commit 2e6e4cf

Please sign in to comment.