Skip to content

Commit 8c84a4a

Browse files
zwhitfield3sbosio
andauthored
Cherry pick changes from Release v9.1.3 (W-19689442) (#227) and update to ESM (#234)
* Updating exports required for Core CLI v10.x * 9.1.3 Co-authored-by: Santiago Bosio <[email protected]>
1 parent 5096678 commit 8c84a4a

File tree

7 files changed

+32
-30
lines changed

7 files changed

+32
-30
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"dependencies": {
4545
"@heroku-cli/color": "^2.0.4",
4646
"@heroku-cli/command": "^12.0.0",
47-
"@heroku/http-call": "^5.4.0",
47+
"@heroku/http-call": "^5.5.0",
4848
"@oclif/core": "^4.3.0",
4949
"@oclif/table": "0.4.14",
5050
"debug": "^4.4.0",

src/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {AmbiguousError} from './errors/ambiguous.js'
44
import {NotFound} from './errors/not-found.js'
55
import {AddOnWithRelatedData, ExtendedAddonAttachment, Link} from './types/pg/data-api.js'
66
import {ConnectionDetails, ConnectionDetailsWithAttachment, TunnelConfig} from './types/pg/tunnel.js'
7+
import {getPsqlConfigs, sshTunnel} from './utils/pg/bastion.js'
8+
import {getConfigVarNameFromAttachment} from './utils/pg/config-vars.js'
79
import DatabaseResolver from './utils/pg/databases.js'
810
import getHost from './utils/pg/host.js'
911
import PsqlService from './utils/pg/psql.js'
@@ -33,6 +35,7 @@ export const utils = {
3335
},
3436
pg: {
3537
DatabaseResolver,
38+
PsqlService,
3639
fetcher: {
3740
database(
3841
heroku: APIClient,
@@ -54,6 +57,9 @@ export const utils = {
5457
const psqlService = new PsqlService(connectionDetails)
5558
return psqlService.execQuery(query, psqlCmdArgs)
5659
},
60+
getConfigVarNameFromAttachment,
61+
getPsqlConfigs,
62+
sshTunnel,
5763
},
5864
},
5965
}

src/utils/pg/bastion.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
BastionConfig,
1111
BastionConfigResponse,
1212
ConnectionDetails,
13-
ConnectionDetailsWithAttachment,
1413
TunnelConfig,
1514
} from '../../types/pg/tunnel.js'
1615
import host from './host.js'
@@ -93,7 +92,7 @@ export const getBastionConfig = function (config: Record<string, string>, baseNa
9392
* @param connectionDetails - The database connection details with attachment information
9493
* @returns Object containing database environment variables and tunnel configuration
9594
*/
96-
export function getPsqlConfigs(connectionDetails: ConnectionDetailsWithAttachment) {
95+
export function getPsqlConfigs(connectionDetails: ConnectionDetails) {
9796
const dbEnv: NodeJS.ProcessEnv = baseEnv(connectionDetails)
9897
const dbTunnelConfig = tunnelConfig(connectionDetails)
9998

@@ -154,7 +153,7 @@ function baseEnv(connectionDetails: ConnectionDetails): NodeJS.ProcessEnv {
154153
* @param connectionDetails - The database connection details with attachment information
155154
* @returns The tunnel configuration object
156155
*/
157-
function tunnelConfig(connectionDetails: ConnectionDetailsWithAttachment): TunnelConfig {
156+
function tunnelConfig(connectionDetails: ConnectionDetails): TunnelConfig {
158157
const localHost = '127.0.0.1'
159158
const localPort = Math.floor((Math.random() * (65_535 - 49_152)) + 49_152)
160159
return {
@@ -179,7 +178,7 @@ function tunnelConfig(connectionDetails: ConnectionDetailsWithAttachment): Tunne
179178
* @throws Error if unable to establish the tunnel
180179
*/
181180
export async function sshTunnel(
182-
connectionDetails: ConnectionDetailsWithAttachment,
181+
connectionDetails: ConnectionDetails,
183182
dbTunnelConfig: TunnelConfig,
184183
timeout = 10_000,
185184
createSSHTunnel = createSSHTunnelAdapter,

src/utils/pg/databases.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ export default class DatabaseResolver {
118118
* @param connStringOrDbName - PostgreSQL connection string or local database name
119119
* @returns Connection details object with parsed connection information
120120
*/
121-
public parsePostgresConnectionString(connStringOrDbName: string): ConnectionDetails {
121+
// eslint-disable-next-line perfectionist/sort-classes
122+
public static parsePostgresConnectionString(connStringOrDbName: string): ConnectionDetails {
122123
const dbPath = /:\/\//.test(connStringOrDbName) ? connStringOrDbName : `postgres:///${connStringOrDbName}`
123124
const url = new URL(dbPath)
124125
const {hostname, password, pathname, port, username} = url
@@ -159,7 +160,8 @@ export default class DatabaseResolver {
159160
* @param config - The record of app config vars with their values
160161
* @returns Connection details with attachment information
161162
*/
162-
private getConnectionDetails(
163+
// eslint-disable-next-line perfectionist/sort-classes
164+
public getConnectionDetails(
163165
attachment: ExtendedAddonAttachment,
164166
config: Record<string, string> = {},
165167
): ConnectionDetailsWithAttachment {
@@ -168,7 +170,7 @@ export default class DatabaseResolver {
168170
// build the default payload for non-bastion dbs
169171
pgDebug(`Using "${connStringVar}" to connect to your database…`)
170172

171-
const conn = this.parsePostgresConnectionString(config[connStringVar])
173+
const conn = DatabaseResolver.parsePostgresConnectionString(config[connStringVar])
172174

173175
const payload: ConnectionDetailsWithAttachment = {
174176
attachment,

src/utils/pg/psql.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {Server} from 'node:net'
1010
import {Stream} from 'node:stream'
1111
import {finished} from 'node:stream/promises'
1212

13-
import {ConnectionDetailsWithAttachment, TunnelConfig} from '../../types/pg/tunnel.js'
13+
import {ConnectionDetails, TunnelConfig} from '../../types/pg/tunnel.js'
1414
import {getPsqlConfigs, sshTunnel} from './bastion.js'
1515

1616
const pgDebug = debug('pg')
@@ -39,7 +39,7 @@ export class Tunnel {
3939
* @returns Promise that resolves to a new Tunnel instance
4040
*/
4141
static async connect(
42-
connectionDetails: ConnectionDetailsWithAttachment,
42+
connectionDetails: ConnectionDetails,
4343
tunnelConfig: TunnelConfig,
4444
tunnelFn: typeof sshTunnel,
4545
) {
@@ -93,7 +93,7 @@ type SpawnPsqlOptions = {
9393

9494
export default class PsqlService {
9595
constructor(
96-
private readonly connectionDetails: ConnectionDetailsWithAttachment,
96+
private readonly connectionDetails: ConnectionDetails,
9797
private readonly getPsqlConfigsFn = getPsqlConfigs,
9898
private readonly spawnFn = spawn,
9999
private readonly tunnelFn = sshTunnel,
@@ -188,7 +188,8 @@ export default class PsqlService {
188188
* @param options - The options for spawning the psql process
189189
* @returns Promise that resolves to the query result as a string
190190
*/
191-
private async runWithTunnel(
191+
// eslint-disable-next-line perfectionist/sort-classes
192+
public async runWithTunnel(
192193
tunnelConfig: TunnelConfig,
193194
options: Parameters<typeof this.spawnPsql>[0],
194195
): Promise<string> {

test/unit/utils/pg/databases.test.ts

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -461,15 +461,9 @@ describe('DatabaseResolver', function () {
461461
})
462462

463463
describe('parsePostgresConnectionString', function () {
464-
let databaseResolver: DatabaseResolver
465464
let env: typeof process.env
466-
let config: Config
467-
let heroku: APIClient
468465

469466
beforeEach(async function () {
470-
config = await Config.load()
471-
heroku = new APIClient(config)
472-
databaseResolver = new DatabaseResolver(heroku)
473467
env = process.env
474468
})
475469

@@ -480,7 +474,7 @@ describe('DatabaseResolver', function () {
480474
describe('when parsing full PostgreSQL connection strings', function () {
481475
it('parses a complete PostgreSQL connection string with all components', function () {
482476
const connString = 'postgres://user1:[email protected]:5432/database1'
483-
const result = databaseResolver.parsePostgresConnectionString(connString)
477+
const result = DatabaseResolver.parsePostgresConnectionString(connString)
484478

485479
expect(result).to.deep.equal({
486480
database: 'database1',
@@ -495,7 +489,7 @@ describe('DatabaseResolver', function () {
495489

496490
it('parses connection string with no port specified', function () {
497491
const connString = 'postgres://user1:[email protected]/database1'
498-
const result = databaseResolver.parsePostgresConnectionString(connString)
492+
const result = DatabaseResolver.parsePostgresConnectionString(connString)
499493

500494
expect(result).to.deep.equal({
501495
database: 'database1',
@@ -510,7 +504,7 @@ describe('DatabaseResolver', function () {
510504

511505
it('parses connection string with custom port', function () {
512506
const connString = 'postgres://user1:[email protected]:5433/database1'
513-
const result = databaseResolver.parsePostgresConnectionString(connString)
507+
const result = DatabaseResolver.parsePostgresConnectionString(connString)
514508

515509
expect(result).to.deep.equal({
516510
database: 'database1',
@@ -527,7 +521,7 @@ describe('DatabaseResolver', function () {
527521
describe('when parsing database names (without connection string format)', function () {
528522
it('converts database name to full connection string format', function () {
529523
const dbName = 'my_database'
530-
const result = databaseResolver.parsePostgresConnectionString(dbName)
524+
const result = DatabaseResolver.parsePostgresConnectionString(dbName)
531525

532526
expect(result).to.deep.equal({
533527
database: 'my_database',
@@ -547,7 +541,7 @@ describe('DatabaseResolver', function () {
547541
PGPORT: '5433',
548542
}
549543
const connString = 'postgres://user1:[email protected]/database1'
550-
const result = databaseResolver.parsePostgresConnectionString(connString)
544+
const result = DatabaseResolver.parsePostgresConnectionString(connString)
551545

552546
expect(result.port).to.equal('5433')
553547
})
@@ -557,7 +551,7 @@ describe('DatabaseResolver', function () {
557551
PGPORT: '5433',
558552
}
559553
const dbName = 'my_database'
560-
const result = databaseResolver.parsePostgresConnectionString(dbName)
554+
const result = DatabaseResolver.parsePostgresConnectionString(dbName)
561555

562556
expect(result.port).to.equal('5433')
563557
})
@@ -567,7 +561,7 @@ describe('DatabaseResolver', function () {
567561
PGPORT: '5433',
568562
}
569563
const connString = 'postgres://user1:[email protected]:5434/database1'
570-
const result = databaseResolver.parsePostgresConnectionString(connString)
564+
const result = DatabaseResolver.parsePostgresConnectionString(connString)
571565

572566
expect(result.port).to.equal('5434')
573567
})
@@ -577,7 +571,7 @@ describe('DatabaseResolver', function () {
577571
PGPORT: '5433',
578572
}
579573
const dbName = 'my_database'
580-
const result = databaseResolver.parsePostgresConnectionString(dbName)
574+
const result = DatabaseResolver.parsePostgresConnectionString(dbName)
581575

582576
expect(result.port).to.equal('5433')
583577
})
@@ -587,23 +581,23 @@ describe('DatabaseResolver', function () {
587581
it('uses default port 5432 when no port is specified in connection string', function () {
588582
process.env = {}
589583
const connString = 'postgres://user1:[email protected]/database1'
590-
const result = databaseResolver.parsePostgresConnectionString(connString)
584+
const result = DatabaseResolver.parsePostgresConnectionString(connString)
591585

592586
expect(result.port).to.equal('5432')
593587
})
594588

595589
it('doesn\'t set a port when parsing database name without connection string', function () {
596590
process.env = {}
597591
const dbName = 'my_database'
598-
const result = databaseResolver.parsePostgresConnectionString(dbName)
592+
const result = DatabaseResolver.parsePostgresConnectionString(dbName)
599593

600594
expect(result.port).to.equal('')
601595
})
602596

603597
it('doesn\'t set a port when connection string has no port and no hostname', function () {
604598
process.env = {}
605599
const dbName = 'my_database'
606-
const result = databaseResolver.parsePostgresConnectionString(dbName)
600+
const result = DatabaseResolver.parsePostgresConnectionString(dbName)
607601

608602
expect(result.port).to.equal('')
609603
})

0 commit comments

Comments
 (0)