diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index e91794ba0..1d3f5aa85 100644 --- a/packages/pg/lib/utils.js +++ b/packages/pg/lib/utils.js @@ -2,6 +2,9 @@ const defaults = require('./defaults') +const util = require('util') +const { isDate } = util.types || util // Node 8 doesn't have `util.types` + function escapeElement(elementRepresentation) { const escaped = elementRepresentation.replace(/\\/g, '\\\\').replace(/"/g, '\\"') @@ -60,7 +63,7 @@ const prepareValue = function (val, seen) { } return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params } - if (val instanceof Date) { + if (isDate(val)) { if (defaults.parseInputDatesAsUTC) { return dateToStringUTC(val) } else { diff --git a/packages/pg/test/integration/gh-issues/2862-tests.js b/packages/pg/test/integration/gh-issues/2862-tests.js new file mode 100644 index 000000000..5e36d21ef --- /dev/null +++ b/packages/pg/test/integration/gh-issues/2862-tests.js @@ -0,0 +1,23 @@ +'use strict' + +const helper = require('../test-helper') +const assert = require('assert') +const vm = require('vm') + +const suite = new helper.Suite() + +suite.testAsync('Handle date objects as Date', async () => { + const crossRealmDate = await vm.runInNewContext('new Date()') + assert(!(crossRealmDate instanceof Date)) + const date = new Date(crossRealmDate.getTime()) + const client = new helper.pg.Client() + await client.connect() + + await client.query('CREATE TEMP TABLE foo(bar timestamptz, bar2 timestamptz)') + await client.query('INSERT INTO foo(bar, bar2) VALUES($1, $2)', [date, crossRealmDate]) + const results = await client.query('SELECT * FROM foo') + const row = results.rows[0] + assert.deepStrictEqual(row.bar, date) + assert.deepStrictEqual(row.bar2, date) + await client.end() +})