From f448e45457e36bd0e88de63005280d5d5be8cd70 Mon Sep 17 00:00:00 2001 From: Kavya Premkumar Date: Mon, 7 Apr 2025 20:27:51 -0700 Subject: [PATCH 1/3] add pg:upgrade:run --- packages/cli/src/commands/pg/upgrade/index.ts | 14 +- packages/cli/src/commands/pg/upgrade/run.ts | 81 ++++++ .../commands/pg/upgrade/index.unit.test.ts | 12 +- .../unit/commands/pg/upgrade/run.unit.test.ts | 260 ++++++++++++++++++ 4 files changed, 354 insertions(+), 13 deletions(-) create mode 100644 packages/cli/src/commands/pg/upgrade/run.ts create mode 100644 packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts diff --git a/packages/cli/src/commands/pg/upgrade/index.ts b/packages/cli/src/commands/pg/upgrade/index.ts index 1933933594..af17f74096 100644 --- a/packages/cli/src/commands/pg/upgrade/index.ts +++ b/packages/cli/src/commands/pg/upgrade/index.ts @@ -13,9 +13,9 @@ import {nls} from '../../../nls' export default class Upgrade extends Command { static topic = 'pg'; static description = heredoc(` - We’re deprecating this command. To upgrade your database's Postgres version, use the new ${color.cmd('pg:upgrade:*')} subcommands. See https://devcenter.heroku.com/changelog-items/3179. + We're deprecating this command. To upgrade your database's Postgres version, use the new ${color.cmd('pg:upgrade:*')} subcommands. See https://devcenter.heroku.com/changelog-items/3179. - For an Essential-* plan, this command upgrades the database's Postgres version. For a Standard-tier and higher plan, this command unfollows the leader database before upgrading the Postgres version. + For an Essential-tier plan, this command upgrades the database's Postgres version. For a Standard-tier and higher plan, this command unfollows the leader database before upgrading the Postgres version. `) static flags = { @@ -46,25 +46,25 @@ export default class Upgrade extends Command { const origin = databaseNameFromUrl(replica.following, configVars) await confirmCommand(app, confirm, heredoc(` - We’re deprecating this command. To upgrade your database's Postgres version, use the new ${color.cmd('pg:upgrade:*')} subcommands. See https://devcenter.heroku.com/changelog-items/3179. + We're deprecating this command. To upgrade your database's Postgres version, use the new ${color.cmd('pg:upgrade:*')} subcommands. See https://devcenter.heroku.com/changelog-items/3179. Destructive action You're upgrading ${color.addon(db.name)} to ${versionPhrase}. The database will stop following ${origin} and become writable. - This cannot be undone. + You can't undo this action. `)) } else if (essentialNumPlan(db)) { await confirmCommand(app, confirm, heredoc(` - We’re deprecating this command. To upgrade your database's Postgres version, use the new ${color.cmd('pg:upgrade:*')} subcommands. See https://devcenter.heroku.com/changelog-items/3179. + We're deprecating this command. To upgrade your database's Postgres version, use the new ${color.cmd('pg:upgrade:*')} subcommands. See https://devcenter.heroku.com/changelog-items/3179. Destructive action You're upgrading ${color.addon(db.name)} to ${versionPhrase}. - This cannot be undone. + You can't undo this action. `)) } else { ux.warn(heredoc(` - We’re deprecating this command. To upgrade your database's Postgres version, use the new ${color.cmd('pg:upgrade:*')} subcommands. See https://devcenter.heroku.com/changelog-items/3179.`, + We're deprecating this command. To upgrade your database's Postgres version, use the new ${color.cmd('pg:upgrade:*')} subcommands. See https://devcenter.heroku.com/changelog-items/3179.`, )) ux.error(`You can only use ${color.cmd('heroku pg:upgrade')} on Essential-tier databases and follower databases on Standard-tier and higher plans.`) } diff --git a/packages/cli/src/commands/pg/upgrade/run.ts b/packages/cli/src/commands/pg/upgrade/run.ts new file mode 100644 index 0000000000..3d729f044c --- /dev/null +++ b/packages/cli/src/commands/pg/upgrade/run.ts @@ -0,0 +1,81 @@ +import color from '@heroku-cli/color' +import {Command, flags} from '@heroku-cli/command' +import {Args, ux} from '@oclif/core' +import heredoc from 'tsheredoc' +import {getAddon} from '../../../lib/pg/fetcher' +import pgHost from '../../../lib/pg/host' +import {legacyEssentialPlan, databaseNameFromUrl, essentialNumPlan, formatResponseWithCommands} from '../../../lib/pg/util' +import {PgDatabase, PgUpgradeError, PgUpgradeResponse} from '../../../lib/pg/types' +import * as Heroku from '@heroku-cli/schema' +import confirmCommand from '../../../lib/confirmCommand' +import {nls} from '../../../nls' + +export default class Upgrade extends Command { + static topic = 'pg'; + static description = heredoc(` + On Essential-tier databases, this command upgrades the database's Postgres version. + + On Standard-tier and higher leader databases, this command runs a previously scheduled Postgres version upgrade. You must run ${color.cmd('pg:upgrade:prepare')} before this command to schedule a version upgrade. + + On follower databases, this command unfollows the leader database before upgrading the follower's Postgres version. + `) + + static flags = { + confirm: flags.string({char: 'c'}), + version: flags.string({char: 'v', description: 'Postgres version to upgrade to'}), + app: flags.app({required: true}), + } + + static args = { + database: Args.string({description: `${nls('pg:database:arg:description')} ${nls('pg:database:arg:description:default:suffix')}`}), + } + + public async run(): Promise { + const {flags, args} = await this.parse(Upgrade) + const {app, version, confirm} = flags + const {database} = args + + const db = await getAddon(this.heroku, app, database) + if (legacyEssentialPlan(db)) + ux.error(`You can only use ${color.cmd('pg:upgrade:*')} commands on Essential-* and higher plans.`) + + const versionPhrase = version ? heredoc(`Postgres version ${version}`) : heredoc('the latest supported Postgres version') + const {body: replica} = await this.heroku.get(`/client/v11/databases/${db.id}`, {hostname: pgHost()}) + + if (essentialNumPlan(db)) { + await confirmCommand(app, confirm, heredoc(` + Destructive action + You're upgrading ${color.addon(db.name)} to ${versionPhrase}. + + You can't undo this action. + `)) + } else if (replica.following) { + const {body: configVars} = await this.heroku.get(`/apps/${app}/config-vars`) + const origin = databaseNameFromUrl(replica.following, configVars) + + await confirmCommand(app, confirm, heredoc(` + Destructive action + You're upgrading ${color.addon(db.name)} to ${versionPhrase}. The database will stop following ${origin} and become writable. + + You can't undo this action. + `)) + } else { + await confirmCommand(app, confirm, heredoc(` + Destructive action + You're upgrading the Postgres version on ${color.addon(db.name)}. This action also upgrades any followers on the database. + + You can't undo this action. + `)) + } + + try { + const data = {version} + ux.action.start(`Starting upgrade on ${color.addon(db.name)}`) + const response = await this.heroku.post(`/client/v11/databases/${db.id}/upgrade/run`, {hostname: pgHost(), body: data}) + ux.action.stop(heredoc(`done\n${formatResponseWithCommands(response.body.message)}`)) + } catch (error) { + const response = error as PgUpgradeError + ux.error(heredoc(`${formatResponseWithCommands(response.body.message)}\n\nError ID: ${response.body.id}`)) + } + } +} diff --git a/packages/cli/test/unit/commands/pg/upgrade/index.unit.test.ts b/packages/cli/test/unit/commands/pg/upgrade/index.unit.test.ts index 56f0a7364b..d32699c150 100644 --- a/packages/cli/test/unit/commands/pg/upgrade/index.unit.test.ts +++ b/packages/cli/test/unit/commands/pg/upgrade/index.unit.test.ts @@ -87,12 +87,12 @@ describe('pg:upgrade', function () { .reply(200, {message: 'Upgrading'}) const message = heredoc(` - We’re deprecating this command. To upgrade your database's Postgres version, use the new pg:upgrade:* subcommands. See https://devcenter.heroku.com/changelog-items/3179. + We're deprecating this command. To upgrade your database's Postgres version, use the new pg:upgrade:* subcommands. See https://devcenter.heroku.com/changelog-items/3179. Destructive action You're upgrading ${addon.name} to Postgres version 15. The database will stop following DATABASE and become writable. - This cannot be undone. + You can't undo this action. `) await runCommand(Cmd, [ @@ -126,12 +126,12 @@ describe('pg:upgrade', function () { .reply(200, {message: 'Upgrading'}) const message = heredoc(` - We’re deprecating this command. To upgrade your database's Postgres version, use the new pg:upgrade:* subcommands. See https://devcenter.heroku.com/changelog-items/3179. + We're deprecating this command. To upgrade your database's Postgres version, use the new pg:upgrade:* subcommands. See https://devcenter.heroku.com/changelog-items/3179. Destructive action You're upgrading ${addon.name} to the latest supported Postgres version. The database will stop following DATABASE and become writable. - This cannot be undone. + You can't undo this action. `) await runCommand(Cmd, [ @@ -167,12 +167,12 @@ describe('pg:upgrade', function () { .reply(200, {message: 'Upgrading'}) const message = heredoc(` - We’re deprecating this command. To upgrade your database's Postgres version, use the new pg:upgrade:* subcommands. See https://devcenter.heroku.com/changelog-items/3179. + We're deprecating this command. To upgrade your database's Postgres version, use the new pg:upgrade:* subcommands. See https://devcenter.heroku.com/changelog-items/3179. Destructive action You're upgrading ${essentialAddon.name} to the latest supported Postgres version. - This cannot be undone. + You can't undo this action. `) await runCommand(Cmd, [ diff --git a/packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts b/packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts new file mode 100644 index 0000000000..49f152dcd0 --- /dev/null +++ b/packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts @@ -0,0 +1,260 @@ +import {stderr} from 'stdout-stderr' +import Cmd from '../../../../../src/commands/pg/upgrade/run' +import runCommand from '../../../../helpers/runCommand' +import expectOutput from '../../../../helpers/utils/expectOutput' +import {expect} from 'chai' +import * as nock from 'nock' +import heredoc from 'tsheredoc' +import * as fixtures from '../../../../fixtures/addons/fixtures' +import color from '@heroku-cli/color' +import {ux} from '@oclif/core' +import * as sinon from 'sinon' +const stripAnsi = require('strip-ansi') + +describe('pg:upgrade', function () { + const hobbyAddon = fixtures.addons['www-db'] + const addon = fixtures.addons['dwh-db'] + let uxWarnStub: sinon.SinonStub + let uxPromptStub: sinon.SinonStub + + before(function () { + uxWarnStub = sinon.stub(ux, 'warn') + uxPromptStub = sinon.stub(ux, 'prompt').resolves('myapp') + }) + + beforeEach(async function () { + uxWarnStub.resetHistory() + uxPromptStub.resetHistory() + }) + + afterEach(async function () { + nock.cleanAll() + }) + + after(function () { + uxWarnStub.restore() + uxPromptStub.restore() + }) + + it('refuses to start test upgrade on legacy essential dbs', async function () { + const hobbyAddon = fixtures.addons['www-db'] + + nock('https://api.heroku.com') + .post('/actions/addon-attachments/resolve') + .reply(200, [{addon: hobbyAddon}]) + await runCommand(Cmd, [ + '--app', + 'myapp', + '--confirm', + 'myapp', + ]).catch(error => { + expectOutput(error.message, heredoc(` + You can only use ${color.cmd('pg:upgrade:*')} commands on Essential-* and higher plans. + `)) + }) + }) + + it('upgrades follower db with version flag', async function () { + nock('https://api.heroku.com') + .post('/actions/addon-attachments/resolve') + .reply(200, [{addon}]) + nock('https://api.heroku.com') + .get('/apps/myapp/config-vars') + .reply(200, {DATABASE_URL: 'postgres://db1'}) + nock('https://api.data.heroku.com') + .get(`/client/v11/databases/${addon.id}`) + .reply(200, {following: 'postgres://db1'}) + nock('https://api.data.heroku.com') + .post(`/client/v11/databases/${addon.id}/upgrade/run`) + .reply(200, {message: 'Started the upgrade. You can monitor the progress with `heroku pg:upgrade:wait`.'}) + + const message = heredoc(` + Destructive action + You're upgrading ${addon.name} to Postgres version 15. The database will stop following DATABASE and become writable. + + You can't undo this action. + `) + + await runCommand(Cmd, [ + '--app', + 'myapp', + '--version', + '15', + ]) + + expect(stripAnsi(uxPromptStub.args[0].toString())).contains('To proceed, type myapp') + expect(stripAnsi(uxWarnStub.args[0].toString())).to.eq(message) + + expectOutput(stderr.output, heredoc(` + Starting upgrade on ${addon.name}... + Starting upgrade on ${addon.name}... done + Started the upgrade. You can monitor the progress with heroku pg:upgrade:wait. + `)) + }) + + it('upgrades follower db without version flag', async function () { + nock('https://api.heroku.com') + .post('/actions/addon-attachments/resolve') + .reply(200, [{addon}]) + nock('https://api.heroku.com') + .get('/apps/myapp/config-vars') + .reply(200, {DATABASE_URL: 'postgres://db1'}) + nock('https://api.data.heroku.com') + .get(`/client/v11/databases/${addon.id}`) + .reply(200, {following: 'postgres://db1'}) + .post(`/client/v11/databases/${addon.id}/upgrade/run`) + .reply(200, {message: 'Started the upgrade. You can monitor the progress with `heroku pg:upgrade:wait`.'}) + + const message = heredoc(` + Destructive action + You're upgrading ${addon.name} to the latest supported Postgres version. The database will stop following DATABASE and become writable. + + You can't undo this action. + `) + + await runCommand(Cmd, [ + '--app', + 'myapp', + ]) + + expect(stripAnsi(uxPromptStub.args[0].toString())).contains('To proceed, type myapp') + expect(stripAnsi(uxWarnStub.args[0].toString())).to.eq(message) + + expectOutput(stderr.output, heredoc(` + Starting upgrade on ${addon.name}... + Starting upgrade on ${addon.name}... done + Started the upgrade. You can monitor the progress with heroku pg:upgrade:wait. + `)) + }) + + it('upgrades essential db', async function () { + const essentialAddon = { + name: 'postgres-1', plan: {name: 'heroku-postgresql:essential-0'}, id: 'b68d8f51-6577-4a46-a617-c5f36f1bb031', + } + + nock('https://api.heroku.com') + .post('/actions/addon-attachments/resolve') + .reply(200, [{addon: essentialAddon}]) + nock('https://api.heroku.com') + .get('/apps/myapp/config-vars') + .reply(200, {DATABASE_URL: 'postgres://db1'}) + nock('https://api.data.heroku.com') + .get(`/client/v11/databases/${essentialAddon.id}`) + .reply(200) + .post(`/client/v11/databases/${essentialAddon.id}/upgrade/run`) + .reply(200, {message: 'Started the upgrade. You can monitor the progress with `heroku pg:upgrade:wait.`'}) + + const message = heredoc(` + Destructive action + You're upgrading ${essentialAddon.name} to the latest supported Postgres version. + + You can't undo this action. + `) + + await runCommand(Cmd, [ + '--app', + 'myapp', + ]) + + expect(stripAnsi(uxPromptStub.args[0].toString())).contains('To proceed, type myapp') + expect(stripAnsi(uxWarnStub.args[0].toString())).to.eq(message) + + expectOutput(stderr.output, heredoc(` + Starting upgrade on ${essentialAddon.name}... + Starting upgrade on ${essentialAddon.name}... done + Started the upgrade. You can monitor the progress with heroku pg:upgrade:wait. + `)) + }) + + it('errors when there is no upgrade prepared on leader db', async function () { + nock('https://api.heroku.com') + .post('/actions/addon-attachments/resolve') + .reply(200, [{addon}]) + nock('https://api.heroku.com') + .get('/apps/myapp/config-vars') + .reply(200, {DATABASE_URL: 'postgres://db1'}) + nock('https://api.data.heroku.com') + .get(`/client/v11/databases/${addon.id}`) + .reply(200) + nock('https://api.data.heroku.com') + .post(`/client/v11/databases/${addon.id}/upgrade/run`) + .reply(400, {id: 'bad_request', message: "You haven't scheduled a version upgrade on your database. Run `heroku pg:upgrade:prepare` to schedule an upgrade."}) + + await runCommand(Cmd, [ + '--app', + 'myapp', + '--confirm', + 'myapp', + ]).catch(error => { + expectOutput(error.message, heredoc(` + You haven't scheduled a version upgrade on your database. Run ${color.cmd('heroku pg:upgrade:prepare')} to schedule an upgrade. + + Error ID: bad_request + `)) + }) + }) + + it('errors when leader db is not yet ready for upgrade', async function () { + nock('https://api.heroku.com') + .post('/actions/addon-attachments/resolve') + .reply(200, [{addon}]) + nock('https://api.heroku.com') + .get('/apps/myapp/config-vars') + .reply(200, {DATABASE_URL: 'postgres://db1'}) + nock('https://api.data.heroku.com') + .get(`/client/v11/databases/${addon.id}`) + .reply(200) + nock('https://api.data.heroku.com') + .post(`/client/v11/databases/${addon.id}/upgrade/run`) + .reply(400, {id: 'bad_request', message: "Your database is not ready for upgrade. Please try running your upgrade later. You can check the status of your upgrade with `heroku pg:upgrade:wait`."}) + + await runCommand(Cmd, [ + '--app', + 'myapp', + '--confirm', + 'myapp', + ]).catch(error => { + expectOutput(error.message, heredoc(` + Your database is not ready for upgrade. Please try running your upgrade later. You can check the status of your upgrade with ${color.cmd('heroku pg:upgrade:wait')}. + + Error ID: bad_request + `)) + }) + }) + + it('runs a scheduled upgrade on a leader db', async function () { + nock('https://api.heroku.com') + .post('/actions/addon-attachments/resolve') + .reply(200, [{addon}]) + nock('https://api.heroku.com') + .get('/apps/myapp/config-vars') + .reply(200, {DATABASE_URL: 'postgres://db1'}) + nock('https://api.data.heroku.com') + .get(`/client/v11/databases/${addon.id}`) + .reply(200) + nock('https://api.data.heroku.com') + .post(`/client/v11/databases/${addon.id}/upgrade/run`) + .reply(200, {message: 'Started the upgrade. You can monitor the progress with `heroku pg:upgrade:wait.`'}) + + const message = heredoc(` + Destructive action + You're upgrading the Postgres version on ${addon.name}. This action also upgrades any followers on the database. + + You can't undo this action. + `) + + await runCommand(Cmd, [ + '--app', + 'myapp', + ]) + + expect(stripAnsi(uxPromptStub.args[0].toString())).contains('To proceed, type myapp') + expect(stripAnsi(uxWarnStub.args[0].toString())).to.eq(message) + + expectOutput(stderr.output, heredoc(` + Starting upgrade on ${addon.name}... + Starting upgrade on ${addon.name}... done + Started the upgrade. You can monitor the progress with heroku pg:upgrade:wait. + `)) + }) +}) From fe887513cfc2beecc92191a6f63b8367c596f808 Mon Sep 17 00:00:00 2001 From: Kavya Premkumar Date: Tue, 8 Apr 2025 13:15:32 -0700 Subject: [PATCH 2/3] lint --- packages/cli/test/acceptance/commands-output.ts | 2 +- packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/cli/test/acceptance/commands-output.ts b/packages/cli/test/acceptance/commands-output.ts index e13601d2a4..ffd9427613 100644 --- a/packages/cli/test/acceptance/commands-output.ts +++ b/packages/cli/test/acceptance/commands-output.ts @@ -206,7 +206,7 @@ pg:settings:log-min-duration-statement The duration of each completed st pg:settings:log-statement log_statement controls which SQL statements are logged. pg:settings:track-functions track_functions controls tracking of function call counts and time used. Default is none. pg:unfollow stop a replica from following and make it a writeable database -pg:upgrade We’re deprecating this command. To upgrade your database's Postgres version, use the new pg:upgrade:* subcommands. See https://devcenter.heroku.com/changelog-items/3179. +pg:upgrade We're deprecating this command. To upgrade your database's Postgres version, use the new pg:upgrade:* subcommands. See https://devcenter.heroku.com/changelog-items/3179. pg:vacuum-stats show dead rows and whether an automatic vacuum is expected to be triggered pg:wait blocks until database is available pipelines list pipelines you have access to diff --git a/packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts b/packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts index 49f152dcd0..50a78255e1 100644 --- a/packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts +++ b/packages/cli/test/unit/commands/pg/upgrade/run.unit.test.ts @@ -206,7 +206,7 @@ describe('pg:upgrade', function () { .reply(200) nock('https://api.data.heroku.com') .post(`/client/v11/databases/${addon.id}/upgrade/run`) - .reply(400, {id: 'bad_request', message: "Your database is not ready for upgrade. Please try running your upgrade later. You can check the status of your upgrade with `heroku pg:upgrade:wait`."}) + .reply(400, {id: 'bad_request', message: 'Your database is not ready for upgrade. Please try running your upgrade later. You can check the status of your upgrade with `heroku pg:upgrade:wait`.'}) await runCommand(Cmd, [ '--app', @@ -247,7 +247,7 @@ describe('pg:upgrade', function () { '--app', 'myapp', ]) - + expect(stripAnsi(uxPromptStub.args[0].toString())).contains('To proceed, type myapp') expect(stripAnsi(uxWarnStub.args[0].toString())).to.eq(message) @@ -256,5 +256,5 @@ describe('pg:upgrade', function () { Starting upgrade on ${addon.name}... done Started the upgrade. You can monitor the progress with heroku pg:upgrade:wait. `)) - }) + }) }) From ef78317ac22efbb30dbb2c48955dfdb2a62ebf59 Mon Sep 17 00:00:00 2001 From: Kavya Premkumar Date: Tue, 8 Apr 2025 15:28:50 -0700 Subject: [PATCH 3/3] review comments --- packages/cli/src/commands/pg/upgrade/run.ts | 24 +++++++++++++++++++-- packages/cli/src/lib/pg/types.ts | 1 - 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/commands/pg/upgrade/run.ts b/packages/cli/src/commands/pg/upgrade/run.ts index 3d729f044c..d490604b51 100644 --- a/packages/cli/src/commands/pg/upgrade/run.ts +++ b/packages/cli/src/commands/pg/upgrade/run.ts @@ -20,10 +20,26 @@ export default class Upgrade extends Command { On follower databases, this command unfollows the leader database before upgrading the follower's Postgres version. `) + static examples = [ + heredoc` + # Upgrade an Essential-tier database to a specific version + $ heroku pg:upgrade:run postgresql-curved-12345 --version 14 --app myapp + `, + heredoc` + # Upgrade a Standard-tier follower database to the latest supported version + $ heroku pg:upgrade:run HEROKU_POSTGRESQL_BLUE_URL --app myapp + `, + heredoc` + # Run a previously scheduled upgrade on a Standard-tier leader database + $ heroku pg:upgrade:run DATABASE_URL --app myapp + `, + ] + static flags = { confirm: flags.string({char: 'c'}), version: flags.string({char: 'v', description: 'Postgres version to upgrade to'}), app: flags.app({required: true}), + remote: flags.remote({char: 'r'}), } static args = { @@ -74,8 +90,12 @@ export default class Upgrade extends Command { const response = await this.heroku.post(`/client/v11/databases/${db.id}/upgrade/run`, {hostname: pgHost(), body: data}) ux.action.stop(heredoc(`done\n${formatResponseWithCommands(response.body.message)}`)) } catch (error) { - const response = error as PgUpgradeError - ux.error(heredoc(`${formatResponseWithCommands(response.body.message)}\n\nError ID: ${response.body.id}`)) + if (error instanceof Error && 'body' in error) { + const response = error as PgUpgradeError + ux.error(heredoc(`${formatResponseWithCommands(response.body.message)}\n\nError ID: ${response.body.id}`)) + } else { + throw error + } } } } diff --git a/packages/cli/src/lib/pg/types.ts b/packages/cli/src/lib/pg/types.ts index 3a5bfcefb8..0e953ad8fd 100644 --- a/packages/cli/src/lib/pg/types.ts +++ b/packages/cli/src/lib/pg/types.ts @@ -172,7 +172,6 @@ export type PgUpgradeResponse = { } export type PgUpgradeError = { - status: number, body: { id: string, message: string,