diff --git a/lib/types.ts b/lib/types.ts index 2694f091..789a18b4 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -386,7 +386,8 @@ function toPrimitive_TIME_MILLIS(value: string | number) { if (typeof value === `string`) { v = parseInt(value, 10); } - if (v < 0 || v > 0xffffffffffffffff || typeof v !== 'number') { + // Year 2255 bug. Should eventually switch to bigint + if (v < 0 || v > (Number.MAX_SAFE_INTEGER - 1) || typeof v !== 'number') { throw 'invalid value for TIME_MILLIS: ' + value; } @@ -461,18 +462,22 @@ function toPrimitive_TIMESTAMP_MICROS(value: Date | string | number | bigint) { } /* convert from integer */ - { + try { + // Will throw if NaN const v = BigInt(value); - if (v < 0n /*|| isNaN(v)*/) { - throw 'invalid value for TIMESTAMP_MICROS: ' + value; + if (v < 0n) { + throw 'Cannot be less than zero'; } return v; + } catch (e) { + throw 'invalid value for TIMESTAMP_MICROS: ' + value; } } function fromPrimitive_TIMESTAMP_MICROS(value: number | bigint) { - return typeof value === 'bigint' ? new Date(Number(value / 1000n)): new Date(value / 1000); + if (typeof value === 'bigint') return new Date(Number(value / 1000n)); + return new Date(value / 1000); } function toPrimitive_INTERVAL(value: INTERVAL) {