From 150f21073c1c73834baf03851b0c5867ace0088d Mon Sep 17 00:00:00 2001 From: JOBIANS TECHIE <88005779+Jobians@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:00:23 +0100 Subject: [PATCH 1/7] Set default PostgreSQL user to 'postgres' to avoid Deno env access errors Currently, the pg package defaults the database user to process.env.USER (or USERNAME on Windows). This causes errors when running in Deno without --allow-env, as environment access is restricted. This PR changes the default user to 'postgres', so: - Node.js behavior is unchanged when a user is explicitly provided in config. - Deno users no longer hit NotCapable errors for environment access. - Avoids relying on process.env for default values. Example: Before: user: process.platform === 'win32' ? process.env.USERNAME : process.env.USER, After: user: 'postgres', // default user, avoids using process.env --- packages/pg/lib/defaults.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pg/lib/defaults.js b/packages/pg/lib/defaults.js index 015909dcd..2f977d8bb 100644 --- a/packages/pg/lib/defaults.js +++ b/packages/pg/lib/defaults.js @@ -5,7 +5,7 @@ module.exports = { host: 'localhost', // database user's name - user: process.platform === 'win32' ? process.env.USERNAME : process.env.USER, + user: 'postgres', // name of database to connect database: undefined, From 39ea164089d32e6c49c106bfdb617898b8c2ca9f Mon Sep 17 00:00:00 2001 From: JOBIANS TECHIE <88005779+Jobians@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:04:40 +0100 Subject: [PATCH 2/7] Prioritize config values over environment variables in ConnectionParameters Previously, ConnectionParameters would first check process.env for connection settings before using the provided config object. This could cause errors in environments like Deno where environment access is restricted. This change updates the val function to: 1. Use the value from config if it is defined. 2. Fall back to environment variables only if config does not provide a value. 3. Use default values if neither config nor environment variables are set. This ensures that explicitly provided configuration values are always respected, avoiding unnecessary errors in restricted environments. --- packages/pg/lib/connection-parameters.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/pg/lib/connection-parameters.js b/packages/pg/lib/connection-parameters.js index a7b941c10..3b2fe46e0 100644 --- a/packages/pg/lib/connection-parameters.js +++ b/packages/pg/lib/connection-parameters.js @@ -7,6 +7,10 @@ const defaults = require('./defaults') const parse = require('pg-connection-string').parse // parses a connection string const val = function (key, config, envVar) { + if (config[key] !== undefined) { + return config[key] + } + if (envVar === undefined) { envVar = process.env['PG' + key.toUpperCase()] } else if (envVar === false) { @@ -15,7 +19,7 @@ const val = function (key, config, envVar) { envVar = process.env[envVar] } - return config[key] || envVar || defaults[key] + return envVar || defaults[key] } const readSSLConfigFromEnvironment = function () { From 546e1fdd75a6052c54cc3227a1e6bb3c80d9017d Mon Sep 17 00:00:00 2001 From: JOBIANS TECHIE <88005779+Jobians@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:14:01 +0100 Subject: [PATCH 3/7] Wrap NODE_PG_FORCE_NATIVE check in try/catch for Deno compatibility Replace the `typeof process.env.NODE_PG_FORCE_NATIVE !== 'undefined'` check with a try/catch to safely handle environments like Deno without `--allow-env`. - Keeps Node.js behavior unchanged. - Prevents errors when accessing process.env in Deno. - Preserves lazy loading of the native module. --- packages/pg/lib/index.js | 54 ++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/packages/pg/lib/index.js b/packages/pg/lib/index.js index 5bd73385b..5e22be8ec 100644 --- a/packages/pg/lib/index.js +++ b/packages/pg/lib/index.js @@ -34,31 +34,37 @@ const PG = function (clientConstructor) { this.utils = utils } -if (typeof process.env.NODE_PG_FORCE_NATIVE !== 'undefined') { - module.exports = new PG(require('./native')) -} else { - module.exports = new PG(Client) +let clientConstructor = Client - // lazy require native module...the native module may not have installed - Object.defineProperty(module.exports, 'native', { - configurable: true, - enumerable: false, - get() { - let native = null - try { - native = new PG(require('./native')) - } catch (err) { - if (err.code !== 'MODULE_NOT_FOUND') { - throw err - } +try { + if (process.env.NODE_PG_FORCE_NATIVE) { + clientConstructor = require('./native') + } +} catch { + // ignore, e.g., Deno without --allow-env +} + +module.exports = new PG(clientConstructor) + +// lazy require native module...the native module may not have installed +Object.defineProperty(module.exports, 'native', { + configurable: true, + enumerable: false, + get() { + let native = null + try { + native = new PG(require('./native')) + } catch (err) { + if (err.code !== 'MODULE_NOT_FOUND') { + throw err } + } - // overwrite module.exports.native so that getter is never called again - Object.defineProperty(module.exports, 'native', { - value: native, - }) + // overwrite module.exports.native so that getter is never called again + Object.defineProperty(module.exports, 'native', { + value: native, + }) - return native - }, - }) -} + return native + }, +}) From 0ba62cd1af71a569063dc27d86e024a598196f8e Mon Sep 17 00:00:00 2001 From: JOBIANS TECHIE <88005779+Jobians@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:48:32 +0100 Subject: [PATCH 4/7] Make default database user Deno-safe Wrap the default database user assignment in a try/catch to prevent errors when environment access is restricted (e.g., in Deno). - Uses process.env.USER / USERNAME on Node if available - Falls back to 'postgres' when env access fails or is unavailable - Maintains code structure and comments - Ensures Node tests continue to pass while preventing Deno runtime errors --- packages/pg/lib/defaults.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/pg/lib/defaults.js b/packages/pg/lib/defaults.js index 2f977d8bb..bc33a0f1d 100644 --- a/packages/pg/lib/defaults.js +++ b/packages/pg/lib/defaults.js @@ -1,11 +1,18 @@ 'use strict' +let defaultUser = 'postgres' +try { + defaultUser = process.platform === 'win32' ? process.env.USERNAME : process.env.USER +} catch { + // ignore, e.g., Deno without --allow-env +} + module.exports = { // database host. defaults to localhost host: 'localhost', // database user's name - user: 'postgres', + user: defaultUser, // name of database to connect database: undefined, From b0c577808137dd873a53e6efc687c218078ed81b Mon Sep 17 00:00:00 2001 From: JOBIANS TECHIE <88005779+Jobians@users.noreply.github.com> Date: Fri, 19 Sep 2025 13:30:29 +0100 Subject: [PATCH 5/7] Fixing checks pass --- packages/pg/lib/defaults.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/pg/lib/defaults.js b/packages/pg/lib/defaults.js index bc33a0f1d..673696f79 100644 --- a/packages/pg/lib/defaults.js +++ b/packages/pg/lib/defaults.js @@ -1,8 +1,8 @@ 'use strict' -let defaultUser = 'postgres' +let user try { - defaultUser = process.platform === 'win32' ? process.env.USERNAME : process.env.USER + user = process.platform === 'win32' ? process.env.USERNAME : process.env.USER } catch { // ignore, e.g., Deno without --allow-env } @@ -12,7 +12,7 @@ module.exports = { host: 'localhost', // database user's name - user: defaultUser, + user, // name of database to connect database: undefined, From 43f2c2798aa9109be8f901a0284d64000de67fb7 Mon Sep 17 00:00:00 2001 From: JOBIANS TECHIE <88005779+Jobians@users.noreply.github.com> Date: Sat, 20 Sep 2025 09:29:17 +0100 Subject: [PATCH 6/7] Update packages/pg/lib/connection-parameters.js Co-authored-by: Charmander <~@charmander.me> --- packages/pg/lib/connection-parameters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pg/lib/connection-parameters.js b/packages/pg/lib/connection-parameters.js index 3b2fe46e0..c153932bb 100644 --- a/packages/pg/lib/connection-parameters.js +++ b/packages/pg/lib/connection-parameters.js @@ -7,7 +7,7 @@ const defaults = require('./defaults') const parse = require('pg-connection-string').parse // parses a connection string const val = function (key, config, envVar) { - if (config[key] !== undefined) { + if (config[key]) { return config[key] } From 8d7ace86dd098c9a0b7a9e2244a0691c705d9c5f Mon Sep 17 00:00:00 2001 From: JOBIANS TECHIE <88005779+Jobians@users.noreply.github.com> Date: Sat, 20 Sep 2025 14:11:50 +0100 Subject: [PATCH 7/7] fix(pg): only guard process.env access when forcing native client --- packages/pg/lib/index.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/pg/lib/index.js b/packages/pg/lib/index.js index 5e22be8ec..e8b746149 100644 --- a/packages/pg/lib/index.js +++ b/packages/pg/lib/index.js @@ -36,14 +36,17 @@ const PG = function (clientConstructor) { let clientConstructor = Client +let forceNative = false try { - if (process.env.NODE_PG_FORCE_NATIVE) { - clientConstructor = require('./native') - } + forceNative = !!process.env.NODE_PG_FORCE_NATIVE } catch { // ignore, e.g., Deno without --allow-env } +if (forceNative) { + clientConstructor = require('./native') +} + module.exports = new PG(clientConstructor) // lazy require native module...the native module may not have installed