From 3e7bd2f6813ca800437e7d69bc2c7cfd54afe942 Mon Sep 17 00:00:00 2001 From: Ryan Staples <42743016+Srayman@users.noreply.github.com> Date: Mon, 26 May 2025 18:37:13 -0400 Subject: [PATCH] Change instanceof(Date) to util.types.isDate(Date) (#2862) * change instanceof to isDate * use both methods to check for valid Date * add test for PR 2862 * use only isDate(date) in place of instanceof Date * Extend compatibility of `isDate` use back to Node 8 * Clean up test --------- Co-authored-by: Charmander <~@charmander.me> Reviewed-by: Charmander <~@charmander.me> --- packages/pg/lib/utils.js | 5 +++- .../test/integration/gh-issues/2862-tests.js | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 packages/pg/test/integration/gh-issues/2862-tests.js diff --git a/packages/pg/lib/utils.js b/packages/pg/lib/utils.js index e91794ba..1d3f5aa8 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 00000000..5e36d21e --- /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() +})