Skip to content

Commit f0474cc

Browse files
authored
fix(shell-bson-parser): pass non-string arguments of ISODate through to Date MONGOSH-1859 (#461)
1 parent 287d178 commit f0474cc

File tree

2 files changed

+64
-41
lines changed

2 files changed

+64
-41
lines changed

packages/shell-bson-parser/src/index.spec.ts

Lines changed: 62 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -365,13 +365,29 @@ describe('@mongodb-js/shell-bson-parser', function () {
365365
});
366366
});
367367

368-
for (const dateFn of ['new Date', 'new ISODate', 'ISODate']) {
368+
function* isoDateTests(): Iterable<{ dateFn: string; args: any[] }> {
369+
for (const dateFn of ['new Date', 'new ISODate', 'ISODate']) {
370+
for (const args of [
371+
[],
372+
[0],
373+
[1234567890000],
374+
[null],
375+
['1996-02-24T23:01:59.001Z'],
376+
])
377+
yield { dateFn, args };
378+
}
379+
}
380+
381+
for (const { dateFn, args } of isoDateTests()) {
369382
context(
370-
`Date allow using member methods with "${dateFn}"`,
383+
`Date allow using member methods with "${dateFn}" and args ${JSON.stringify(
384+
args
385+
)}`,
371386
function () {
372387
it('should allow member expressions', function () {
373-
const isoString = '1996-02-24T23:01:59.001Z';
374-
const newDate = `${dateFn}('${isoString}')`;
388+
const newDate = `${dateFn}(${args
389+
.map((val) => JSON.stringify(val))
390+
.join(',')})`;
375391
const input = `{
376392
getDate: (${newDate}).getDate(),
377393
getDay: (${newDate}).getDay(),
@@ -411,42 +427,48 @@ describe('@mongodb-js/shell-bson-parser', function () {
411427
toISOString: (${newDate}).toISOString(),
412428
}`;
413429
expect(parse(input, options)).to.deep.equal({
414-
getDate: new Date(isoString).getDate(),
415-
getDay: new Date(isoString).getDay(),
416-
getFullYear: new Date(isoString).getFullYear(),
417-
getHours: new Date(isoString).getHours(),
418-
getMilliseconds: new Date(isoString).getMilliseconds(),
419-
getMinutes: new Date(isoString).getMinutes(),
420-
getMonth: new Date(isoString).getMonth(),
421-
getSeconds: new Date(isoString).getSeconds(),
422-
getTime: new Date(isoString).getTime(),
423-
getTimezoneOffset: new Date(isoString).getTimezoneOffset(),
424-
getUTCDate: new Date(isoString).getUTCDate(),
425-
getUTCDay: new Date(isoString).getUTCDay(),
426-
getUTCFullYear: new Date(isoString).getUTCFullYear(),
427-
getUTCHours: new Date(isoString).getUTCHours(),
428-
getUTCMilliseconds: new Date(isoString).getUTCMilliseconds(),
429-
getUTCMinutes: new Date(isoString).getUTCMinutes(),
430-
getUTCMonth: new Date(isoString).getUTCMonth(),
431-
getUTCSeconds: new Date(isoString).getUTCSeconds(),
432-
getYear: (new Date(isoString) as any).getYear(), // getYear is deprecated
433-
setDate: new Date(isoString).setDate(24),
434-
setFullYear: new Date(isoString).setFullYear(2010),
435-
setHours: new Date(isoString).setHours(23),
436-
setMilliseconds: new Date(isoString).setMilliseconds(1),
437-
setMinutes: new Date(isoString).setMinutes(1),
438-
setMonth: new Date(isoString).setMonth(1),
439-
setSeconds: new Date(isoString).setSeconds(59),
440-
setTime: new Date(isoString).setTime(10),
441-
setUTCDate: new Date(isoString).setUTCDate(24),
442-
setUTCFullYear: new Date(isoString).setUTCFullYear(2010),
443-
setUTCHours: new Date(isoString).setUTCHours(23),
444-
setUTCMilliseconds: new Date(isoString).setUTCMilliseconds(1),
445-
setUTCMinutes: new Date(isoString).setUTCMinutes(1),
446-
setUTCMonth: new Date(isoString).setUTCMonth(1),
447-
setUTCSeconds: new Date(isoString).setUTCSeconds(59),
448-
setYear: (new Date(isoString) as any).setYear(96), // setYear is deprecated
449-
toISOString: new Date(isoString).toISOString(),
430+
getDate: new (Date as any)(...args).getDate(),
431+
getDay: new (Date as any)(...args).getDay(),
432+
getFullYear: new (Date as any)(...args).getFullYear(),
433+
getHours: new (Date as any)(...args).getHours(),
434+
getMilliseconds: new (Date as any)(...args).getMilliseconds(),
435+
getMinutes: new (Date as any)(...args).getMinutes(),
436+
getMonth: new (Date as any)(...args).getMonth(),
437+
getSeconds: new (Date as any)(...args).getSeconds(),
438+
getTime: new (Date as any)(...args).getTime(),
439+
getTimezoneOffset: new (Date as any)(
440+
...args
441+
).getTimezoneOffset(),
442+
getUTCDate: new (Date as any)(...args).getUTCDate(),
443+
getUTCDay: new (Date as any)(...args).getUTCDay(),
444+
getUTCFullYear: new (Date as any)(...args).getUTCFullYear(),
445+
getUTCHours: new (Date as any)(...args).getUTCHours(),
446+
getUTCMilliseconds: new (Date as any)(
447+
...args
448+
).getUTCMilliseconds(),
449+
getUTCMinutes: new (Date as any)(...args).getUTCMinutes(),
450+
getUTCMonth: new (Date as any)(...args).getUTCMonth(),
451+
getUTCSeconds: new (Date as any)(...args).getUTCSeconds(),
452+
getYear: new (Date as any)(...args).getYear(), // getYear is deprecated
453+
setDate: new (Date as any)(...args).setDate(24),
454+
setFullYear: new (Date as any)(...args).setFullYear(2010),
455+
setHours: new (Date as any)(...args).setHours(23),
456+
setMilliseconds: new (Date as any)(...args).setMilliseconds(1),
457+
setMinutes: new (Date as any)(...args).setMinutes(1),
458+
setMonth: new (Date as any)(...args).setMonth(1),
459+
setSeconds: new (Date as any)(...args).setSeconds(59),
460+
setTime: new (Date as any)(...args).setTime(10),
461+
setUTCDate: new (Date as any)(...args).setUTCDate(24),
462+
setUTCFullYear: new (Date as any)(...args).setUTCFullYear(2010),
463+
setUTCHours: new (Date as any)(...args).setUTCHours(23),
464+
setUTCMilliseconds: new (Date as any)(
465+
...args
466+
).setUTCMilliseconds(1),
467+
setUTCMinutes: new (Date as any)(...args).setUTCMinutes(1),
468+
setUTCMonth: new (Date as any)(...args).setUTCMonth(1),
469+
setUTCSeconds: new (Date as any)(...args).setUTCSeconds(59),
470+
setYear: new (Date as any)(...args).setYear(96), // setYear is deprecated
471+
toISOString: new (Date as any)(...args).toISOString(),
450472
});
451473
});
452474

packages/shell-bson-parser/src/scope.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ const SCOPE_ANY: { [x: string]: Function } = lookupMap({
107107
return new bson.Timestamp(low);
108108
},
109109
ISODate: function (input?: string): Date {
110-
if (!input) input = new Date().toISOString();
110+
if (input === undefined) return new Date();
111+
if (typeof input !== 'string') return new Date(input);
111112
const isoDateRegex =
112113
/^(?<Y>\d{4})-?(?<M>\d{2})-?(?<D>\d{2})([T ](?<h>\d{2})(:?(?<m>\d{2})(:?((?<s>\d{2})(\.(?<ms>\d+))?))?)?(?<tz>Z|([+-])(\d{2}):?(\d{2})?)?)?$/;
113114
const match = input.match(isoDateRegex);

0 commit comments

Comments
 (0)