heroku 9.0.0-dev.0 → 9.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -11
- package/lib/commands/access/add.d.ts +14 -0
- package/lib/commands/access/add.js +55 -0
- package/lib/commands/access/index.d.ts +11 -0
- package/lib/commands/access/index.js +86 -0
- package/lib/commands/access/remove.d.ts +12 -0
- package/lib/commands/access/remove.js +25 -0
- package/lib/commands/access/update.d.ts +14 -0
- package/lib/commands/access/update.js +39 -0
- package/lib/commands/addons/attach.d.ts +16 -0
- package/lib/commands/addons/attach.js +51 -0
- package/lib/commands/addons/create.d.ts +20 -0
- package/lib/commands/addons/create.js +96 -0
- package/lib/commands/addons/destroy.d.ts +19 -0
- package/lib/commands/addons/destroy.js +61 -0
- package/lib/commands/addons/detach.d.ts +13 -0
- package/lib/commands/addons/detach.js +31 -0
- package/lib/commands/addons/docs.d.ts +14 -0
- package/lib/commands/addons/docs.js +36 -0
- package/lib/commands/addons/index.d.ts +16 -0
- package/lib/commands/addons/index.js +246 -0
- package/lib/commands/addons/info.d.ts +14 -0
- package/lib/commands/addons/info.js +44 -0
- package/lib/commands/addons/open.d.ts +75 -0
- package/lib/commands/addons/open.js +87 -0
- package/lib/commands/addons/plans.d.ts +12 -0
- package/lib/commands/addons/plans.js +47 -0
- package/lib/commands/addons/rename.d.ts +10 -0
- package/lib/commands/addons/rename.js +20 -0
- package/lib/commands/addons/services.d.ts +9 -0
- package/lib/commands/addons/services.js +34 -0
- package/lib/commands/addons/upgrade.d.ts +28 -0
- package/lib/commands/addons/upgrade.js +145 -0
- package/lib/commands/addons/wait.d.ts +14 -0
- package/lib/commands/addons/wait.js +70 -0
- package/lib/commands/apps/create.d.ts +28 -0
- package/lib/commands/apps/create.js +201 -0
- package/lib/commands/apps/destroy.d.ts +15 -0
- package/lib/commands/apps/destroy.js +47 -0
- package/lib/commands/apps/errors.d.ts +13 -0
- package/lib/commands/apps/errors.js +120 -0
- package/lib/commands/apps/favorites/add.d.ts +2 -1
- package/lib/commands/apps/favorites/add.js +1 -0
- package/lib/commands/apps/favorites/remove.d.ts +2 -1
- package/lib/commands/apps/favorites/remove.js +1 -0
- package/lib/commands/apps/index.d.ts +16 -0
- package/lib/commands/apps/index.js +119 -0
- package/lib/commands/apps/info.d.ts +19 -0
- package/lib/commands/apps/info.js +162 -0
- package/lib/commands/apps/join.d.ts +11 -0
- package/lib/commands/apps/join.js +25 -0
- package/lib/commands/apps/leave.d.ts +12 -0
- package/lib/commands/apps/leave.js +25 -0
- package/lib/commands/apps/lock.d.ts +11 -0
- package/lib/commands/apps/lock.js +30 -0
- package/lib/commands/apps/open.d.ts +15 -0
- package/lib/commands/apps/open.js +30 -0
- package/lib/commands/apps/rename.d.ts +16 -0
- package/lib/commands/apps/rename.js +51 -0
- package/lib/commands/apps/stacks/index.d.ts +3 -2
- package/lib/commands/apps/stacks/index.js +2 -1
- package/lib/commands/apps/stacks/set.d.ts +4 -4
- package/lib/commands/apps/stacks/set.js +1 -1
- package/lib/commands/apps/transfer.d.ts +17 -0
- package/lib/commands/apps/transfer.js +91 -0
- package/lib/commands/apps/unlock.d.ts +11 -0
- package/lib/commands/apps/unlock.js +30 -0
- package/lib/commands/auth/token.js +2 -1
- package/lib/commands/authorizations/create.d.ts +3 -3
- package/lib/commands/authorizations/create.js +5 -1
- package/lib/commands/authorizations/info.d.ts +1 -1
- package/lib/commands/authorizations/info.js +5 -1
- package/lib/commands/authorizations/revoke.d.ts +1 -1
- package/lib/commands/authorizations/revoke.js +5 -1
- package/lib/commands/authorizations/rotate.d.ts +1 -1
- package/lib/commands/authorizations/rotate.js +5 -1
- package/lib/commands/authorizations/update.d.ts +4 -4
- package/lib/commands/authorizations/update.js +5 -1
- package/lib/commands/autocomplete/doctor.js +2 -2
- package/lib/commands/autocomplete/options.d.ts +2 -2
- package/lib/commands/autocomplete/options.js +2 -2
- package/lib/commands/autocomplete/script.d.ts +1 -1
- package/lib/commands/buildpacks/add.d.ts +4 -4
- package/lib/commands/buildpacks/clear.d.ts +2 -2
- package/lib/commands/buildpacks/index.d.ts +2 -2
- package/lib/commands/buildpacks/info.d.ts +1 -1
- package/lib/commands/buildpacks/remove.d.ts +4 -4
- package/lib/commands/buildpacks/search.d.ts +4 -4
- package/lib/commands/buildpacks/set.d.ts +4 -4
- package/lib/commands/buildpacks/versions.d.ts +1 -1
- package/lib/commands/certs/add.d.ts +16 -0
- package/lib/commands/certs/add.js +98 -0
- package/lib/commands/certs/auto/disable.d.ts +11 -0
- package/lib/commands/certs/auto/disable.js +34 -0
- package/lib/commands/certs/auto/enable.d.ts +11 -0
- package/lib/commands/certs/auto/enable.js +51 -0
- package/lib/commands/certs/auto/index.d.ts +12 -0
- package/lib/commands/certs/auto/index.js +94 -0
- package/lib/commands/certs/auto/refresh.d.ts +10 -0
- package/lib/commands/certs/auto/refresh.js +19 -0
- package/lib/commands/certs/generate.d.ts +26 -0
- package/lib/commands/certs/generate.js +111 -0
- package/lib/commands/certs/index.d.ts +10 -0
- package/lib/commands/certs/index.js +26 -0
- package/lib/commands/certs/info.d.ts +13 -0
- package/lib/commands/certs/info.js +43 -0
- package/lib/commands/certs/remove.d.ts +13 -0
- package/lib/commands/certs/remove.js +32 -0
- package/lib/commands/certs/update.d.ts +18 -0
- package/lib/commands/certs/update.js +54 -0
- package/lib/commands/ci/config/get.d.ts +4 -3
- package/lib/commands/ci/config/get.js +3 -2
- package/lib/commands/ci/config/index.d.ts +3 -2
- package/lib/commands/ci/config/index.js +3 -2
- package/lib/commands/ci/config/set.d.ts +3 -2
- package/lib/commands/ci/config/set.js +2 -1
- package/lib/commands/ci/config/unset.d.ts +3 -3
- package/lib/commands/ci/config/unset.js +3 -3
- package/lib/commands/ci/debug.d.ts +2 -2
- package/lib/commands/ci/index.d.ts +3 -2
- package/lib/commands/ci/index.js +1 -0
- package/lib/commands/ci/info.d.ts +5 -4
- package/lib/commands/ci/info.js +1 -0
- package/lib/commands/ci/last.d.ts +4 -3
- package/lib/commands/ci/last.js +1 -0
- package/lib/commands/ci/open.d.ts +3 -2
- package/lib/commands/ci/open.js +1 -0
- package/lib/commands/ci/rerun.d.ts +4 -3
- package/lib/commands/ci/rerun.js +1 -0
- package/lib/commands/ci/run.d.ts +2 -2
- package/lib/commands/clients/create.d.ts +2 -2
- package/lib/commands/clients/destroy.d.ts +1 -1
- package/lib/commands/clients/info.d.ts +1 -1
- package/lib/commands/clients/rotate.d.ts +1 -1
- package/lib/commands/clients/update.d.ts +3 -3
- package/lib/commands/config/edit.d.ts +3 -3
- package/lib/commands/config/get.d.ts +3 -3
- package/lib/commands/config/index.d.ts +2 -2
- package/lib/commands/config/set.d.ts +12 -0
- package/lib/commands/config/set.js +60 -0
- package/lib/commands/config/unset.d.ts +2 -2
- package/lib/commands/console.d.ts +4 -4
- package/lib/commands/container/index.d.ts +6 -0
- package/lib/commands/container/index.js +13 -0
- package/lib/commands/container/login.d.ts +9 -0
- package/lib/commands/container/login.js +57 -0
- package/lib/commands/container/logout.d.ts +9 -0
- package/lib/commands/container/logout.js +37 -0
- package/lib/commands/container/pull.d.ts +14 -0
- package/lib/commands/container/pull.js +43 -0
- package/lib/commands/container/push.d.ts +16 -0
- package/lib/commands/container/push.js +103 -0
- package/lib/commands/container/release.d.ts +14 -0
- package/lib/commands/container/release.js +91 -0
- package/lib/commands/container/rm.d.ts +13 -0
- package/lib/commands/container/rm.js +39 -0
- package/lib/commands/container/run.d.ts +15 -0
- package/lib/commands/container/run.js +66 -0
- package/lib/commands/dashboard.d.ts +7 -0
- package/lib/commands/dashboard.js +164 -0
- package/lib/commands/domains/add.d.ts +4 -4
- package/lib/commands/domains/clear.d.ts +2 -2
- package/lib/commands/domains/index.d.ts +14 -10
- package/lib/commands/domains/index.js +47 -3
- package/lib/commands/domains/info.d.ts +3 -3
- package/lib/commands/domains/remove.d.ts +3 -3
- package/lib/commands/domains/update.d.ts +4 -4
- package/lib/commands/domains/wait.d.ts +3 -3
- package/lib/commands/drains/add.d.ts +12 -0
- package/lib/commands/drains/add.js +23 -0
- package/lib/commands/drains/index.d.ts +11 -0
- package/lib/commands/drains/index.js +50 -0
- package/lib/commands/drains/remove.d.ts +13 -0
- package/lib/commands/drains/remove.js +22 -0
- package/lib/commands/features/disable.d.ts +12 -0
- package/lib/commands/features/disable.js +30 -0
- package/lib/commands/features/enable.d.ts +12 -0
- package/lib/commands/features/enable.js +29 -0
- package/lib/commands/features/index.d.ts +10 -0
- package/lib/commands/features/index.js +37 -0
- package/lib/commands/features/info.d.ts +13 -0
- package/lib/commands/features/info.js +33 -0
- package/lib/commands/git/clone.d.ts +3 -3
- package/lib/commands/git/credentials.d.ts +1 -1
- package/lib/commands/git/remote.d.ts +2 -2
- package/lib/commands/keys/add.d.ts +14 -0
- package/lib/commands/keys/add.js +101 -0
- package/lib/commands/keys/clear.d.ts +5 -0
- package/lib/commands/keys/clear.js +17 -0
- package/lib/commands/keys/index.d.ts +9 -0
- package/lib/commands/keys/index.js +36 -0
- package/lib/commands/keys/remove.d.ts +9 -0
- package/lib/commands/keys/remove.js +29 -0
- package/lib/commands/labs/enable.d.ts +13 -0
- package/lib/commands/labs/enable.js +47 -0
- package/lib/commands/labs/index.d.ts +11 -0
- package/lib/commands/labs/index.js +71 -0
- package/lib/commands/labs/info.d.ts +14 -0
- package/lib/commands/labs/info.js +49 -0
- package/lib/commands/local/index.d.ts +5 -5
- package/lib/commands/local/index.js +8 -3
- package/lib/commands/local/run.d.ts +2 -2
- package/lib/commands/local/run.js +8 -3
- package/lib/commands/logs.d.ts +6 -6
- package/lib/commands/maintenance/index.d.ts +10 -0
- package/lib/commands/maintenance/index.js +19 -0
- package/lib/commands/maintenance/off.d.ts +10 -0
- package/lib/commands/maintenance/off.js +20 -0
- package/lib/commands/maintenance/on.d.ts +10 -0
- package/lib/commands/maintenance/on.js +20 -0
- package/lib/commands/members/add.d.ts +13 -0
- package/lib/commands/members/add.js +33 -0
- package/lib/commands/members/index.d.ts +12 -0
- package/lib/commands/members/index.js +76 -0
- package/lib/commands/members/remove.d.ts +10 -0
- package/lib/commands/members/remove.js +58 -0
- package/lib/commands/members/set.d.ts +11 -0
- package/lib/commands/members/set.js +21 -0
- package/lib/commands/notifications/index.d.ts +13 -0
- package/lib/commands/notifications/index.js +62 -0
- package/lib/commands/orgs/index.d.ts +11 -0
- package/lib/commands/orgs/index.js +27 -0
- package/lib/commands/orgs/open.d.ts +10 -0
- package/lib/commands/orgs/open.js +24 -0
- package/lib/commands/pg/backups/cancel.d.ts +15 -0
- package/lib/commands/pg/backups/cancel.js +49 -0
- package/lib/commands/pg/backups/capture.d.ts +15 -0
- package/lib/commands/pg/backups/capture.js +65 -0
- package/lib/commands/pg/backups/delete.d.ts +15 -0
- package/lib/commands/pg/backups/delete.js +38 -0
- package/lib/commands/pg/backups/download.d.ts +14 -0
- package/lib/commands/pg/backups/download.js +58 -0
- package/lib/commands/pg/backups/index.d.ts +20 -0
- package/lib/commands/pg/backups/index.js +129 -0
- package/lib/commands/pg/backups/info.d.ts +17 -0
- package/lib/commands/pg/backups/info.js +92 -0
- package/lib/commands/pg/backups/restore.d.ts +19 -0
- package/lib/commands/pg/backups/restore.js +107 -0
- package/lib/commands/pg/backups/schedule.d.ts +21 -0
- package/lib/commands/pg/backups/schedule.js +82 -0
- package/lib/commands/pg/backups/schedules.d.ts +10 -0
- package/lib/commands/pg/backups/schedules.js +31 -0
- package/lib/commands/pg/backups/unschedule.d.ts +13 -0
- package/lib/commands/pg/backups/unschedule.js +44 -0
- package/lib/commands/pg/backups/url.d.ts +13 -0
- package/lib/commands/pg/backups/url.js +41 -0
- package/lib/commands/pg/bloat.d.ts +13 -0
- package/lib/commands/pg/bloat.js +87 -0
- package/lib/commands/pg/blocking.d.ts +13 -0
- package/lib/commands/pg/blocking.js +42 -0
- package/lib/commands/pg/connection-pooling/attach.d.ts +15 -0
- package/lib/commands/pg/connection-pooling/attach.js +41 -0
- package/lib/commands/pg/copy.d.ts +18 -0
- package/lib/commands/pg/copy.js +86 -0
- package/lib/commands/pg/credentials/create.d.ts +14 -0
- package/lib/commands/pg/credentials/create.js +40 -0
- package/lib/commands/pg/credentials/destroy.d.ts +16 -0
- package/lib/commands/pg/credentials/destroy.js +48 -0
- package/lib/commands/pg/credentials/repair-default.d.ts +15 -0
- package/lib/commands/pg/credentials/repair-default.js +39 -0
- package/lib/commands/pg/credentials/rotate.d.ts +16 -0
- package/lib/commands/pg/credentials/rotate.js +82 -0
- package/lib/commands/pg/credentials/url.d.ts +14 -0
- package/lib/commands/pg/credentials/url.js +64 -0
- package/lib/commands/pg/credentials.d.ts +16 -0
- package/lib/commands/pg/credentials.js +61 -0
- package/lib/commands/pg/diagnose.d.ts +18 -0
- package/lib/commands/pg/diagnose.js +109 -0
- package/lib/commands/pg/info.d.ts +14 -0
- package/lib/commands/pg/info.js +92 -0
- package/lib/commands/pg/kill.d.ts +15 -0
- package/lib/commands/pg/kill.js +32 -0
- package/lib/commands/pg/killall.d.ts +13 -0
- package/lib/commands/pg/killall.js +26 -0
- package/lib/commands/pg/links/create.d.ts +15 -0
- package/lib/commands/pg/links/create.js +58 -0
- package/lib/commands/pg/links/destroy.d.ts +16 -0
- package/lib/commands/pg/links/destroy.js +42 -0
- package/lib/commands/pg/links/index.d.ts +13 -0
- package/lib/commands/pg/links/index.js +59 -0
- package/lib/commands/pg/locks.d.ts +15 -0
- package/lib/commands/pg/locks.js +53 -0
- package/lib/commands/pg/maintenance/index.d.ts +13 -0
- package/lib/commands/pg/maintenance/index.js +29 -0
- package/lib/commands/pg/maintenance/run.d.ts +14 -0
- package/lib/commands/pg/maintenance/run.js +37 -0
- package/lib/commands/pg/maintenance/window.d.ts +15 -0
- package/lib/commands/pg/maintenance/window.js +41 -0
- package/lib/commands/pg/outliers.d.ts +19 -0
- package/lib/commands/pg/outliers.js +97 -0
- package/lib/commands/pg/promote.d.ts +14 -0
- package/lib/commands/pg/promote.js +169 -0
- package/lib/commands/pg/ps.d.ts +14 -0
- package/lib/commands/pg/ps.js +52 -0
- package/lib/commands/pg/psql.d.ts +16 -0
- package/lib/commands/pg/psql.js +49 -0
- package/lib/commands/pg/pull.d.ts +18 -0
- package/lib/commands/pg/pull.js +87 -0
- package/lib/commands/pg/push.d.ts +18 -0
- package/lib/commands/pg/push.js +84 -0
- package/lib/commands/pg/reset.d.ts +15 -0
- package/lib/commands/pg/reset.js +44 -0
- package/lib/commands/pg/settings/auto-explain/log-analyze.d.ts +13 -0
- package/lib/commands/pg/settings/auto-explain/log-analyze.js +32 -0
- package/lib/commands/pg/settings/auto-explain/log-buffers.d.ts +13 -0
- package/lib/commands/pg/settings/auto-explain/log-buffers.js +30 -0
- package/lib/commands/pg/settings/auto-explain/log-min-duration.d.ts +16 -0
- package/lib/commands/pg/settings/auto-explain/log-min-duration.js +33 -0
- package/lib/commands/pg/settings/auto-explain/log-nested-statements.d.ts +12 -0
- package/lib/commands/pg/settings/auto-explain/log-nested-statements.js +25 -0
- package/lib/commands/pg/settings/auto-explain/log-triggers.d.ts +13 -0
- package/lib/commands/pg/settings/auto-explain/log-triggers.js +30 -0
- package/lib/commands/pg/settings/auto-explain/log-verbose.d.ts +17 -0
- package/lib/commands/pg/settings/auto-explain/log-verbose.js +33 -0
- package/lib/commands/pg/settings/auto-explain.d.ts +18 -0
- package/lib/commands/pg/settings/auto-explain.js +38 -0
- package/lib/commands/pg/settings/index.d.ts +13 -0
- package/lib/commands/pg/settings/index.js +34 -0
- package/lib/commands/pg/settings/log-connections.d.ts +17 -0
- package/lib/commands/pg/settings/log-connections.js +34 -0
- package/lib/commands/pg/settings/log-lock-waits.d.ts +13 -0
- package/lib/commands/pg/settings/log-lock-waits.js +31 -0
- package/lib/commands/pg/settings/log-min-duration-statement.d.ts +15 -0
- package/lib/commands/pg/settings/log-min-duration-statement.js +33 -0
- package/lib/commands/pg/settings/log-statement.d.ts +12 -0
- package/lib/commands/pg/settings/log-statement.js +30 -0
- package/lib/commands/pg/settings/track-functions.d.ts +12 -0
- package/lib/commands/pg/settings/track-functions.js +29 -0
- package/lib/commands/pg/unfollow.d.ts +14 -0
- package/lib/commands/pg/unfollow.js +40 -0
- package/lib/commands/pg/upgrade.d.ts +15 -0
- package/lib/commands/pg/upgrade.js +58 -0
- package/lib/commands/pg/vacuum-stats.d.ts +13 -0
- package/lib/commands/pg/vacuum-stats.js +65 -0
- package/lib/commands/pg/wait.d.ts +15 -0
- package/lib/commands/pg/wait.js +79 -0
- package/lib/commands/pipelines/add.d.ts +4 -4
- package/lib/commands/pipelines/connect.d.ts +2 -2
- package/lib/commands/pipelines/connect.js +1 -1
- package/lib/commands/pipelines/create.d.ts +5 -5
- package/lib/commands/pipelines/destroy.d.ts +1 -1
- package/lib/commands/pipelines/diff.d.ts +2 -2
- package/lib/commands/pipelines/diff.js +1 -1
- package/lib/commands/pipelines/info.d.ts +1 -1
- package/lib/commands/pipelines/open.d.ts +1 -1
- package/lib/commands/pipelines/promote.d.ts +3 -3
- package/lib/commands/pipelines/remove.d.ts +2 -2
- package/lib/commands/pipelines/rename.d.ts +2 -2
- package/lib/commands/pipelines/setup.d.ts +3 -3
- package/lib/commands/pipelines/transfer.d.ts +3 -3
- package/lib/commands/pipelines/update.d.ts +3 -3
- package/lib/commands/ps/autoscale/disable.d.ts +2 -2
- package/lib/commands/ps/autoscale/enable.d.ts +5 -5
- package/lib/commands/ps/index.d.ts +15 -0
- package/lib/commands/ps/index.js +195 -0
- package/lib/commands/ps/restart.d.ts +17 -0
- package/lib/commands/ps/restart.js +38 -0
- package/lib/commands/ps/scale.d.ts +13 -0
- package/lib/commands/ps/scale.js +108 -0
- package/lib/commands/ps/stop.d.ts +17 -0
- package/lib/commands/ps/stop.js +33 -0
- package/lib/commands/ps/type.d.ts +12 -0
- package/lib/commands/ps/type.js +163 -0
- package/lib/commands/ps/wait.d.ts +4 -4
- package/lib/commands/rake.d.ts +4 -4
- package/lib/commands/redis/cli.d.ts +15 -0
- package/lib/commands/redis/cli.js +204 -0
- package/lib/commands/redis/credentials.d.ts +14 -0
- package/lib/commands/redis/credentials.js +32 -0
- package/lib/commands/redis/info.d.ts +15 -0
- package/lib/commands/redis/info.js +25 -0
- package/lib/commands/redis/keyspace-notifications.d.ts +14 -0
- package/lib/commands/redis/keyspace-notifications.js +47 -0
- package/lib/commands/redis/maintenance.d.ts +16 -0
- package/lib/commands/redis/maintenance.js +63 -0
- package/lib/commands/redis/maxmemory.d.ts +14 -0
- package/lib/commands/redis/maxmemory.js +40 -0
- package/lib/commands/redis/promote.d.ts +13 -0
- package/lib/commands/redis/promote.js +39 -0
- package/lib/commands/redis/stats-reset.d.ts +14 -0
- package/lib/commands/redis/stats-reset.js +36 -0
- package/lib/commands/redis/timeout.d.ts +14 -0
- package/lib/commands/redis/timeout.js +35 -0
- package/lib/commands/redis/upgrade.d.ts +15 -0
- package/lib/commands/redis/upgrade.js +37 -0
- package/lib/commands/redis/wait.d.ts +14 -0
- package/lib/commands/redis/wait.js +60 -0
- package/lib/commands/releases/index.d.ts +14 -0
- package/lib/commands/releases/index.js +124 -0
- package/lib/commands/releases/info.d.ts +15 -0
- package/lib/commands/releases/info.js +56 -0
- package/lib/commands/releases/output.d.ts +13 -0
- package/lib/commands/releases/output.js +37 -0
- package/lib/commands/releases/rollback.d.ts +14 -0
- package/lib/commands/releases/rollback.js +48 -0
- package/lib/commands/reviewapps/disable.d.ts +3 -3
- package/lib/commands/reviewapps/enable.d.ts +3 -3
- package/lib/commands/run/detached.d.ts +7 -8
- package/lib/commands/run/detached.js +16 -20
- package/lib/commands/run/index.d.ts +10 -11
- package/lib/commands/run/index.js +16 -17
- package/lib/commands/run/inside.d.ts +5 -7
- package/lib/commands/run/inside.js +10 -14
- package/lib/commands/sessions/destroy.d.ts +1 -1
- package/lib/commands/spaces/create.d.ts +22 -0
- package/lib/commands/spaces/create.js +73 -0
- package/lib/commands/spaces/destroy.d.ts +14 -0
- package/lib/commands/spaces/destroy.js +49 -0
- package/lib/commands/spaces/drains/get.d.ts +12 -0
- package/lib/commands/spaces/drains/get.js +27 -0
- package/lib/commands/spaces/drains/set.d.ts +14 -0
- package/lib/commands/spaces/drains/set.js +29 -0
- package/lib/commands/spaces/hosts.d.ts +14 -0
- package/lib/commands/spaces/hosts.js +37 -0
- package/lib/commands/spaces/index.d.ts +16 -0
- package/lib/commands/spaces/index.js +55 -0
- package/lib/commands/spaces/info.d.ts +14 -0
- package/lib/commands/spaces/info.js +47 -0
- package/lib/commands/spaces/peerings/accept.d.ts +15 -0
- package/lib/commands/spaces/peerings/accept.js +36 -0
- package/lib/commands/spaces/peerings/destroy.d.ts +15 -0
- package/lib/commands/spaces/peerings/destroy.js +45 -0
- package/lib/commands/spaces/peerings/index.d.ts +13 -0
- package/lib/commands/spaces/peerings/index.js +33 -0
- package/lib/commands/spaces/peerings/info.d.ts +15 -0
- package/lib/commands/spaces/peerings/info.js +59 -0
- package/lib/commands/spaces/ps.d.ts +15 -0
- package/lib/commands/spaces/ps.js +82 -0
- package/lib/commands/spaces/rename.d.ts +11 -0
- package/lib/commands/spaces/rename.js +26 -0
- package/lib/commands/spaces/topology.d.ts +32 -0
- package/lib/commands/spaces/topology.js +89 -0
- package/lib/commands/spaces/transfer.d.ts +11 -0
- package/lib/commands/spaces/transfer.js +35 -0
- package/lib/commands/spaces/trusted-ips/add.d.ts +16 -0
- package/lib/commands/spaces/trusted-ips/add.js +43 -0
- package/lib/commands/spaces/trusted-ips/index.d.ts +15 -0
- package/lib/commands/spaces/trusted-ips/index.js +52 -0
- package/lib/commands/spaces/trusted-ips/remove.d.ts +15 -0
- package/lib/commands/spaces/trusted-ips/remove.js +44 -0
- package/lib/commands/spaces/vpn/config.d.ts +14 -0
- package/lib/commands/spaces/vpn/config.js +54 -0
- package/lib/commands/spaces/vpn/connect.d.ts +15 -0
- package/lib/commands/spaces/vpn/connect.js +48 -0
- package/lib/commands/spaces/vpn/connections.d.ts +17 -0
- package/lib/commands/spaces/vpn/connections.js +57 -0
- package/lib/commands/spaces/vpn/destroy.d.ts +14 -0
- package/lib/commands/spaces/vpn/destroy.js +38 -0
- package/lib/commands/spaces/vpn/info.d.ts +16 -0
- package/lib/commands/spaces/vpn/info.js +82 -0
- package/lib/commands/spaces/vpn/update.d.ts +14 -0
- package/lib/commands/spaces/vpn/update.js +39 -0
- package/lib/commands/spaces/vpn/wait.d.ts +16 -0
- package/lib/commands/spaces/vpn/wait.js +70 -0
- package/lib/commands/spaces/wait.d.ts +17 -0
- package/lib/commands/spaces/wait.js +89 -0
- package/lib/commands/status.js +4 -4
- package/lib/commands/teams/index.d.ts +9 -0
- package/lib/commands/teams/index.js +29 -0
- package/lib/commands/webhooks/add.d.ts +8 -8
- package/lib/commands/webhooks/deliveries/index.d.ts +4 -4
- package/lib/commands/webhooks/deliveries/info.d.ts +4 -4
- package/lib/commands/webhooks/events/index.d.ts +3 -3
- package/lib/commands/webhooks/events/info.d.ts +4 -4
- package/lib/commands/webhooks/index.d.ts +3 -3
- package/lib/commands/webhooks/info.d.ts +4 -4
- package/lib/commands/webhooks/remove.d.ts +4 -4
- package/lib/commands/webhooks/update.d.ts +9 -9
- package/lib/global_telemetry.js +10 -4
- package/lib/hooks/postrun/performance_analytics.js +5 -4
- package/lib/hooks/prerun/analytics.js +3 -0
- package/lib/lib/addons/addons_wait.d.ts +78 -0
- package/lib/lib/addons/addons_wait.js +56 -0
- package/lib/lib/addons/create_addon.d.ts +7 -0
- package/lib/lib/addons/create_addon.js +59 -0
- package/lib/lib/addons/destroy_addon.d.ts +3 -0
- package/lib/lib/addons/destroy_addon.js +48 -0
- package/lib/lib/addons/resolve.d.ts +39 -0
- package/lib/lib/addons/resolve.js +180 -0
- package/lib/lib/addons/util.d.ts +9 -0
- package/lib/lib/addons/util.js +72 -0
- package/lib/lib/apps/app-transfer.d.ts +10 -0
- package/lib/lib/apps/app-transfer.js +35 -0
- package/lib/lib/apps/error_info.d.ts +7 -0
- package/lib/lib/apps/error_info.js +185 -0
- package/lib/lib/autocomplete/base.d.ts +1 -1
- package/lib/lib/autocomplete/completions.d.ts +5 -1
- package/lib/lib/autocomplete/completions.js +6 -1
- package/lib/lib/certs/certificate_details.d.ts +2 -0
- package/lib/lib/certs/certificate_details.js +37 -0
- package/lib/lib/certs/display_table.d.ts +2 -0
- package/lib/lib/certs/display_table.js +51 -0
- package/lib/lib/certs/domains.d.ts +3 -0
- package/lib/lib/certs/domains.js +45 -0
- package/lib/lib/certs/flags.d.ts +7 -0
- package/lib/lib/certs/flags.js +42 -0
- package/lib/lib/certs/format_date.d.ts +1 -0
- package/lib/lib/certs/format_date.js +11 -0
- package/lib/lib/certs/get_cert_and_key.d.ts +9 -0
- package/lib/lib/certs/get_cert_and_key.js +11 -0
- package/lib/lib/ci/git.d.ts +7 -1
- package/lib/lib/ci/git.js +44 -1
- package/lib/lib/ci/interfaces/kolkrabbi.d.ts +1 -1
- package/lib/lib/ci/source.js +3 -3
- package/lib/lib/ci/test-run.js +2 -2
- package/lib/lib/config/quote.js +1 -1
- package/lib/lib/confirmCommand.d.ts +1 -0
- package/lib/lib/confirmCommand.js +23 -0
- package/lib/lib/container/debug.d.ts +2 -0
- package/lib/lib/container/debug.js +5 -0
- package/lib/lib/container/docker_helper.d.ts +24 -0
- package/lib/lib/container/docker_helper.js +168 -0
- package/lib/lib/container/helpers.d.ts +8 -0
- package/lib/lib/container/helpers.js +29 -0
- package/lib/lib/container/streamer.d.ts +1 -0
- package/lib/lib/container/streamer.js +31 -0
- package/lib/lib/domains/domains.d.ts +6 -0
- package/lib/lib/domains/domains.js +104 -0
- package/lib/lib/git/git.d.ts +3 -0
- package/lib/lib/git/git.js +22 -3
- package/lib/lib/local/run-foreman.d.ts +1 -0
- package/lib/lib/local/run-foreman.js +229 -1
- package/lib/lib/members/util.d.ts +3 -0
- package/lib/lib/members/util.js +25 -0
- package/lib/lib/members/utils.d.ts +2 -0
- package/lib/lib/members/utils.js +14 -0
- package/lib/lib/notify.d.ts +1 -0
- package/lib/lib/notify.js +23 -0
- package/lib/lib/orgs/utils.d.ts +5 -0
- package/lib/lib/orgs/utils.js +24 -0
- package/lib/lib/pg/backups.d.ts +17 -0
- package/lib/lib/pg/backups.js +164 -0
- package/lib/lib/pg/bastion.d.ts +29 -0
- package/lib/lib/pg/bastion.js +121 -0
- package/lib/lib/pg/config.d.ts +2 -0
- package/lib/lib/pg/config.js +13 -0
- package/lib/lib/pg/download.d.ts +5 -0
- package/lib/lib/pg/download.js +34 -0
- package/lib/lib/pg/fetcher.d.ts +39 -0
- package/lib/lib/pg/fetcher.js +137 -0
- package/lib/lib/pg/host.d.ts +1 -0
- package/lib/lib/pg/host.js +7 -0
- package/lib/lib/pg/psql.d.ts +48 -0
- package/lib/lib/pg/psql.js +252 -0
- package/lib/lib/pg/push_pull.d.ts +13 -0
- package/lib/lib/pg/push_pull.js +118 -0
- package/lib/lib/pg/setter.d.ts +16 -0
- package/lib/lib/pg/setter.js +65 -0
- package/lib/lib/pg/types.d.ts +230 -0
- package/lib/lib/pg/types.js +2 -0
- package/lib/lib/pg/util.d.ts +36 -0
- package/lib/lib/pg/util.js +183 -0
- package/lib/lib/redis/api.d.ts +65 -0
- package/lib/lib/redis/api.js +122 -0
- package/lib/lib/releases/output.d.ts +1 -0
- package/lib/lib/releases/output.js +14 -0
- package/lib/lib/releases/releases.d.ts +6 -0
- package/lib/lib/releases/releases.js +32 -0
- package/lib/lib/releases/status_helper.d.ts +5 -0
- package/lib/lib/releases/status_helper.js +25 -0
- package/lib/lib/run/dyno.js +2 -2
- package/lib/lib/run/log-displayer.d.ts +1 -1
- package/lib/lib/spaces/format.d.ts +4 -0
- package/lib/lib/spaces/format.js +60 -0
- package/lib/lib/spaces/hosts.d.ts +9 -0
- package/lib/lib/spaces/hosts.js +34 -0
- package/lib/lib/spaces/outbound-rules.d.ts +4 -0
- package/lib/lib/spaces/outbound-rules.js +78 -0
- package/lib/lib/spaces/parsers.d.ts +8 -0
- package/lib/lib/spaces/parsers.js +17 -0
- package/lib/lib/spaces/peering.d.ts +4 -0
- package/lib/lib/spaces/peering.js +53 -0
- package/lib/lib/spaces/spaces.d.ts +4 -0
- package/lib/lib/spaces/spaces.js +37 -0
- package/lib/lib/spaces/vpn-connections.d.ts +2 -0
- package/lib/lib/spaces/vpn-connections.js +22 -0
- package/lib/lib/teamUtils.d.ts +3 -0
- package/lib/lib/teamUtils.js +18 -0
- package/lib/lib/time.d.ts +2 -0
- package/lib/lib/time.js +29 -0
- package/lib/lib/types/app_errors.d.ts +6 -0
- package/lib/lib/types/app_errors.js +2 -0
- package/lib/lib/types/domain.d.ts +61 -0
- package/lib/lib/types/domain.js +5 -0
- package/lib/lib/types/notifications.d.ts +20 -0
- package/lib/lib/types/notifications.js +2 -0
- package/lib/lib/utils/keyValueParser.d.ts +4 -0
- package/lib/lib/utils/keyValueParser.js +9 -0
- package/lib/lib/utils/multisort.d.ts +32 -0
- package/lib/lib/utils/multisort.js +66 -0
- package/lib/lib/utils/paginator.d.ts +2 -0
- package/lib/lib/utils/paginator.js +29 -0
- package/lib/lib/utils/uuid-validate.d.ts +1 -0
- package/lib/lib/utils/uuid-validate.js +7 -0
- package/lib/user-config.js +2 -2
- package/oclif.manifest.json +12684 -2674
- package/package.json +116 -65
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.interactive = exports.execFile = exports.exec = exports.fetchVersion = exports.Tunnel = exports.runWithTunnel = exports.consumeStream = exports.trapAndForwardSignalsToChildProcess = exports.waitForPSQLExit = exports.execPSQL = exports.psqlInteractiveOptions = exports.psqlFileOptions = exports.psqlQueryOptions = void 0;
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
const debug_1 = require("debug");
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
const node_events_1 = require("node:events");
|
|
9
|
+
const path = require("node:path");
|
|
10
|
+
const node_stream_1 = require("node:stream");
|
|
11
|
+
const promises_1 = require("node:stream/promises");
|
|
12
|
+
const bastion_1 = require("./bastion");
|
|
13
|
+
const pgDebug = (0, debug_1.default)('pg');
|
|
14
|
+
function psqlQueryOptions(query, dbEnv, cmdArgs = []) {
|
|
15
|
+
pgDebug('Running query: %s', query.trim());
|
|
16
|
+
const psqlArgs = ['-c', query, '--set', 'sslmode=require', ...cmdArgs];
|
|
17
|
+
const childProcessOptions = {
|
|
18
|
+
stdio: ['ignore', 'pipe', 'inherit'],
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
dbEnv,
|
|
22
|
+
psqlArgs,
|
|
23
|
+
childProcessOptions,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
exports.psqlQueryOptions = psqlQueryOptions;
|
|
27
|
+
function psqlFileOptions(file, dbEnv) {
|
|
28
|
+
pgDebug('Running sql file: %s', file.trim());
|
|
29
|
+
const childProcessOptions = {
|
|
30
|
+
stdio: ['ignore', 'pipe', 'inherit'],
|
|
31
|
+
};
|
|
32
|
+
const psqlArgs = ['-f', file, '--set', 'sslmode=require'];
|
|
33
|
+
return {
|
|
34
|
+
dbEnv,
|
|
35
|
+
psqlArgs,
|
|
36
|
+
childProcessOptions,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
exports.psqlFileOptions = psqlFileOptions;
|
|
40
|
+
function psqlInteractiveOptions(prompt, dbEnv) {
|
|
41
|
+
let psqlArgs = ['--set', `PROMPT1=${prompt}`, '--set', `PROMPT2=${prompt}`];
|
|
42
|
+
const psqlHistoryPath = process.env.HEROKU_PSQL_HISTORY;
|
|
43
|
+
if (psqlHistoryPath) {
|
|
44
|
+
if (fs.existsSync(psqlHistoryPath) && fs.statSync(psqlHistoryPath).isDirectory()) {
|
|
45
|
+
const appLogFile = `${psqlHistoryPath}/${prompt.split(':')[0]}`;
|
|
46
|
+
pgDebug('Logging psql history to %s', appLogFile);
|
|
47
|
+
psqlArgs = psqlArgs.concat(['--set', `HISTFILE=${appLogFile}`]);
|
|
48
|
+
}
|
|
49
|
+
else if (fs.existsSync(path.dirname(psqlHistoryPath))) {
|
|
50
|
+
pgDebug('Logging psql history to %s', psqlHistoryPath);
|
|
51
|
+
psqlArgs = psqlArgs.concat(['--set', `HISTFILE=${psqlHistoryPath}`]);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
core_1.ux.warn(`HEROKU_PSQL_HISTORY is set but is not a valid path (${psqlHistoryPath})`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
psqlArgs = psqlArgs.concat(['--set', 'sslmode=require']);
|
|
58
|
+
const childProcessOptions = {
|
|
59
|
+
stdio: 'inherit',
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
dbEnv,
|
|
63
|
+
psqlArgs,
|
|
64
|
+
childProcessOptions,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
exports.psqlInteractiveOptions = psqlInteractiveOptions;
|
|
68
|
+
function execPSQL({ dbEnv, psqlArgs, childProcessOptions }) {
|
|
69
|
+
const options = Object.assign({ env: dbEnv }, childProcessOptions);
|
|
70
|
+
pgDebug('opening psql process');
|
|
71
|
+
const psql = (0, child_process_1.spawn)('psql', psqlArgs, options);
|
|
72
|
+
psql.once('spawn', () => pgDebug('psql process spawned'));
|
|
73
|
+
return psql;
|
|
74
|
+
}
|
|
75
|
+
exports.execPSQL = execPSQL;
|
|
76
|
+
async function waitForPSQLExit(psql) {
|
|
77
|
+
let errorToThrow = null;
|
|
78
|
+
try {
|
|
79
|
+
const [exitCode] = await (0, node_events_1.once)(psql, 'close');
|
|
80
|
+
pgDebug(`psql exited with code ${exitCode}`);
|
|
81
|
+
if (exitCode > 0) {
|
|
82
|
+
errorToThrow = new Error(`psql exited with code ${exitCode}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
pgDebug('psql process error', error);
|
|
87
|
+
const { code } = error;
|
|
88
|
+
if (code === 'ENOENT') {
|
|
89
|
+
errorToThrow = new Error('The local psql command could not be located. For help installing psql, see https://devcenter.heroku.com/articles/heroku-postgresql#local-setup');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (errorToThrow) {
|
|
93
|
+
throw errorToThrow;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.waitForPSQLExit = waitForPSQLExit;
|
|
97
|
+
// According to node.js docs, sending a kill to a process won't cause an error
|
|
98
|
+
// but could have unintended consequences if the PID gets reassigned:
|
|
99
|
+
// https://nodejs.org/docs/latest-v14.x/api/child_process.html#child_process_subprocess_kill_signal
|
|
100
|
+
// To be on the safe side, check if the process was already killed before sending the signal
|
|
101
|
+
function kill(childProcess, signal) {
|
|
102
|
+
if (!childProcess.killed) {
|
|
103
|
+
pgDebug('killing psql child process');
|
|
104
|
+
childProcess.kill(signal);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// trap SIGINT so that ctrl+c can be used by psql without killing the
|
|
108
|
+
// parent node process.
|
|
109
|
+
// you can use ctrl+c in psql to kill running queries
|
|
110
|
+
// while keeping the psql process open.
|
|
111
|
+
// This code is to stop the parent node process (heroku CLI)
|
|
112
|
+
// from exiting. If the parent Heroku CLI node process exits, then psql will exit as it
|
|
113
|
+
// is a child process of the Heroku CLI node process.
|
|
114
|
+
const trapAndForwardSignalsToChildProcess = (childProcess) => {
|
|
115
|
+
const signalsToTrap = ['SIGINT'];
|
|
116
|
+
const signalTraps = signalsToTrap.map(signal => {
|
|
117
|
+
process.removeAllListeners(signal);
|
|
118
|
+
const listener = () => kill(childProcess, signal);
|
|
119
|
+
process.on(signal, listener);
|
|
120
|
+
return [signal, listener];
|
|
121
|
+
});
|
|
122
|
+
// restores the built-in node ctrl+c and other handlers
|
|
123
|
+
return () => {
|
|
124
|
+
signalTraps.forEach(([signal, listener]) => {
|
|
125
|
+
process.removeListener(signal, listener);
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
exports.trapAndForwardSignalsToChildProcess = trapAndForwardSignalsToChildProcess;
|
|
130
|
+
function consumeStream(inputStream) {
|
|
131
|
+
let result = '';
|
|
132
|
+
const throughStream = new node_stream_1.Stream.PassThrough();
|
|
133
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
134
|
+
const promise = new Promise(async (resolve, reject) => {
|
|
135
|
+
try {
|
|
136
|
+
await (0, promises_1.finished)(throughStream);
|
|
137
|
+
resolve(result);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
reject(error);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// eslint-disable-next-line no-return-assign
|
|
144
|
+
throughStream.on('data', chunk => result += chunk.toString());
|
|
145
|
+
inputStream.pipe(throughStream);
|
|
146
|
+
return promise;
|
|
147
|
+
}
|
|
148
|
+
exports.consumeStream = consumeStream;
|
|
149
|
+
async function runWithTunnel(db, tunnelConfig, options) {
|
|
150
|
+
const tunnel = await Tunnel.connect(db, tunnelConfig);
|
|
151
|
+
pgDebug('after create tunnel');
|
|
152
|
+
const psql = execPSQL(options);
|
|
153
|
+
// interactive opens with stdio: 'inherit'
|
|
154
|
+
// which gives the child process the same stdin,stdout,stderr of the node process (global `process`)
|
|
155
|
+
// https://nodejs.org/api/child_process.html#child_process_options_stdio
|
|
156
|
+
// psql.stdout will be null in this case
|
|
157
|
+
// return a string for consistency but ideally we should return the child process from this function
|
|
158
|
+
// and let the caller decide what to do with stdin/stdout/stderr
|
|
159
|
+
const stdoutPromise = psql.stdout ? consumeStream(psql.stdout) : Promise.resolve('');
|
|
160
|
+
const cleanupSignalTraps = (0, exports.trapAndForwardSignalsToChildProcess)(psql);
|
|
161
|
+
try {
|
|
162
|
+
pgDebug('waiting for psql or tunnel to exit');
|
|
163
|
+
// wait for either psql or tunnel to exit;
|
|
164
|
+
// the important bit is that we ensure both processes are
|
|
165
|
+
// always cleaned up in the `finally` block below
|
|
166
|
+
await Promise.race([
|
|
167
|
+
waitForPSQLExit(psql),
|
|
168
|
+
tunnel.waitForClose(),
|
|
169
|
+
]);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
pgDebug('wait for psql or tunnel error', error);
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
pgDebug('begin tunnel cleanup');
|
|
177
|
+
cleanupSignalTraps();
|
|
178
|
+
tunnel.close();
|
|
179
|
+
kill(psql, 'SIGKILL');
|
|
180
|
+
pgDebug('end tunnel cleanup');
|
|
181
|
+
}
|
|
182
|
+
return stdoutPromise;
|
|
183
|
+
}
|
|
184
|
+
exports.runWithTunnel = runWithTunnel;
|
|
185
|
+
// a small wrapper around tunnel-ssh
|
|
186
|
+
// so that other code doesn't have to worry about
|
|
187
|
+
// whether there is or is not a tunnel
|
|
188
|
+
class Tunnel {
|
|
189
|
+
constructor(bastionTunnel) {
|
|
190
|
+
this.bastionTunnel = bastionTunnel;
|
|
191
|
+
this.events = new node_events_1.EventEmitter();
|
|
192
|
+
}
|
|
193
|
+
async waitForClose() {
|
|
194
|
+
if (this.bastionTunnel) {
|
|
195
|
+
try {
|
|
196
|
+
pgDebug('wait for tunnel close');
|
|
197
|
+
await (0, node_events_1.once)(this.bastionTunnel, 'close');
|
|
198
|
+
pgDebug('tunnel closed');
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
pgDebug('tunnel close error', error);
|
|
202
|
+
throw new Error('Secure tunnel to your database failed');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
pgDebug('no bastion required; waiting for fake close event');
|
|
207
|
+
await (0, node_events_1.once)(this.events, 'close');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
close() {
|
|
211
|
+
if (this.bastionTunnel) {
|
|
212
|
+
pgDebug('close tunnel');
|
|
213
|
+
this.bastionTunnel.close();
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
pgDebug('no tunnel necessary; sending fake close event');
|
|
217
|
+
this.events.emit('close', 0);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
static async connect(db, tunnelConfig) {
|
|
221
|
+
const tunnel = await (0, bastion_1.sshTunnel)(db, tunnelConfig);
|
|
222
|
+
return new Tunnel(tunnel);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.Tunnel = Tunnel;
|
|
226
|
+
async function fetchVersion(db) {
|
|
227
|
+
var _a;
|
|
228
|
+
const output = await exec(db, 'SHOW server_version', ['-X', '-q']);
|
|
229
|
+
return (_a = output.match(/[0-9]{1,}\.[0-9]{1,}/)) === null || _a === void 0 ? void 0 : _a[0];
|
|
230
|
+
}
|
|
231
|
+
exports.fetchVersion = fetchVersion;
|
|
232
|
+
async function exec(db, query, cmdArgs = []) {
|
|
233
|
+
const configs = (0, bastion_1.getConfigs)(db);
|
|
234
|
+
const options = psqlQueryOptions(query, configs.dbEnv, cmdArgs);
|
|
235
|
+
return runWithTunnel(db, configs.dbTunnelConfig, options);
|
|
236
|
+
}
|
|
237
|
+
exports.exec = exec;
|
|
238
|
+
async function execFile(db, file) {
|
|
239
|
+
const configs = (0, bastion_1.getConfigs)(db);
|
|
240
|
+
const options = psqlFileOptions(file, configs.dbEnv);
|
|
241
|
+
return runWithTunnel(db, configs.dbTunnelConfig, options);
|
|
242
|
+
}
|
|
243
|
+
exports.execFile = execFile;
|
|
244
|
+
async function interactive(db) {
|
|
245
|
+
const name = db.attachment.name;
|
|
246
|
+
const prompt = `${db.attachment.app.name}::${name}%R%# `;
|
|
247
|
+
const configs = (0, bastion_1.getConfigs)(db);
|
|
248
|
+
configs.dbEnv.PGAPPNAME = 'psql interactive'; // default was 'psql non-interactive`
|
|
249
|
+
const options = psqlInteractiveOptions(prompt, configs.dbEnv);
|
|
250
|
+
return runWithTunnel(db, configs.dbTunnelConfig, options);
|
|
251
|
+
}
|
|
252
|
+
exports.interactive = interactive;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ConnectionDetails } from './util';
|
|
3
|
+
import { Server } from 'net';
|
|
4
|
+
import { ChildProcess } from 'node:child_process';
|
|
5
|
+
export declare const parseExclusions: (rawExcludeList: string | undefined) => string[];
|
|
6
|
+
export declare const prepare: (target: ConnectionDetails) => Promise<void>;
|
|
7
|
+
export declare type ConnectionDetailsWithOptionalTunnel = ConnectionDetails & {
|
|
8
|
+
_tunnel?: Server;
|
|
9
|
+
};
|
|
10
|
+
export declare const maybeTunnel: (herokuDb: ConnectionDetails) => Promise<ConnectionDetailsWithOptionalTunnel>;
|
|
11
|
+
export declare const connArgs: (uri: ConnectionDetails, skipDFlag?: boolean) => string[];
|
|
12
|
+
export declare const spawnPipe: (pgDump: ChildProcess, pgRestore: ChildProcess) => Promise<void>;
|
|
13
|
+
export declare const verifyExtensionsMatch: (source: ConnectionDetails, target: ConnectionDetails) => Promise<void>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyExtensionsMatch = exports.spawnPipe = exports.connArgs = exports.maybeTunnel = exports.prepare = exports.parseExclusions = void 0;
|
|
4
|
+
const psql_1 = require("./psql");
|
|
5
|
+
const core_1 = require("@oclif/core");
|
|
6
|
+
const color_1 = require("@heroku-cli/color");
|
|
7
|
+
const bastion_1 = require("./bastion");
|
|
8
|
+
const node_child_process_1 = require("node:child_process");
|
|
9
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
10
|
+
const debug_1 = require("debug");
|
|
11
|
+
const debug = (0, debug_1.default)('pg:push-pull');
|
|
12
|
+
const parseExclusions = (rawExcludeList) => {
|
|
13
|
+
return (rawExcludeList || '')
|
|
14
|
+
.split(';').map(excl => excl.trim())
|
|
15
|
+
.filter(texcl => texcl !== '');
|
|
16
|
+
};
|
|
17
|
+
exports.parseExclusions = parseExclusions;
|
|
18
|
+
const prepare = async (target) => {
|
|
19
|
+
if (target.host === 'localhost' || !target.host) {
|
|
20
|
+
exec(`createdb ${(0, exports.connArgs)(target, true).join(' ')}`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// N.B.: we don't have a proper postgres driver and we don't want to rely on overriding
|
|
24
|
+
// possible .psqlrc output configurations, so we generate a random marker that is returned
|
|
25
|
+
// from the query. We avoid including it verbatim in the query text in case the equivalent
|
|
26
|
+
// of --echo-all is set.
|
|
27
|
+
const num = Math.random();
|
|
28
|
+
const emptyMarker = `${num}${num}`;
|
|
29
|
+
const result = await (0, psql_1.exec)(target, `SELECT CASE count(*) WHEN 0 THEN '${num}' || '${num}' END FROM pg_stat_user_tables`);
|
|
30
|
+
if (!result.includes(emptyMarker))
|
|
31
|
+
core_1.ux.error(`Remote database is not empty. Please create a new database or use ${color_1.color.cmd('heroku pg:reset')}`);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.prepare = prepare;
|
|
35
|
+
const maybeTunnel = async (herokuDb) => {
|
|
36
|
+
var _a;
|
|
37
|
+
let withTunnel = Object.assign({}, herokuDb);
|
|
38
|
+
const configs = (0, bastion_1.getConfigs)(herokuDb);
|
|
39
|
+
const tunnel = await (0, bastion_1.sshTunnel)(herokuDb, configs.dbTunnelConfig);
|
|
40
|
+
if (tunnel) {
|
|
41
|
+
const tunnelHost = {
|
|
42
|
+
host: configs.dbTunnelConfig.localHost,
|
|
43
|
+
port: (_a = configs.dbTunnelConfig.localPort) === null || _a === void 0 ? void 0 : _a.toString(),
|
|
44
|
+
_tunnel: tunnel,
|
|
45
|
+
};
|
|
46
|
+
withTunnel = Object.assign(withTunnel, tunnelHost);
|
|
47
|
+
}
|
|
48
|
+
return withTunnel;
|
|
49
|
+
};
|
|
50
|
+
exports.maybeTunnel = maybeTunnel;
|
|
51
|
+
const connArgs = (uri, skipDFlag = false) => {
|
|
52
|
+
const args = [];
|
|
53
|
+
if (uri.user)
|
|
54
|
+
args.push('-U', uri.user);
|
|
55
|
+
if (uri.host)
|
|
56
|
+
args.push('-h', uri.host);
|
|
57
|
+
if (uri.port)
|
|
58
|
+
args.push('-p', uri.port);
|
|
59
|
+
if (!skipDFlag)
|
|
60
|
+
args.push('-d');
|
|
61
|
+
args.push(uri.database);
|
|
62
|
+
return args;
|
|
63
|
+
};
|
|
64
|
+
exports.connArgs = connArgs;
|
|
65
|
+
const exec = (cmd, opts = {}) => {
|
|
66
|
+
debug(cmd);
|
|
67
|
+
opts = Object.assign({}, opts, { stdio: 'inherit' });
|
|
68
|
+
try {
|
|
69
|
+
return (0, node_child_process_1.execSync)(cmd, opts);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const { status } = error;
|
|
73
|
+
if (status)
|
|
74
|
+
process.exit(status);
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const spawnPipe = async (pgDump, pgRestore) => {
|
|
79
|
+
return new Promise((resolve, reject) => {
|
|
80
|
+
const dumpStdout = pgDump.stdout;
|
|
81
|
+
const restoreStdin = pgRestore.stdin;
|
|
82
|
+
dumpStdout.pipe(restoreStdin);
|
|
83
|
+
pgDump.on('close', code => code ? reject(new Error(`pg_dump errored with ${code}`)) : restoreStdin.end());
|
|
84
|
+
pgRestore.on('close', code => code ? reject(new Error(`pg_restore errored with ${code}`)) : resolve());
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
exports.spawnPipe = spawnPipe;
|
|
88
|
+
const verifyExtensionsMatch = async function (source, target) {
|
|
89
|
+
// It's pretty common for local DBs to not have extensions available that
|
|
90
|
+
// are used by the remote app, so take the final precaution of warning if
|
|
91
|
+
// the extensions available in the local database don't match. We don't
|
|
92
|
+
// report it if the difference is solely in the version of an extension
|
|
93
|
+
// used, though.
|
|
94
|
+
const sql = 'SELECT extname FROM pg_extension ORDER BY extname;';
|
|
95
|
+
const [extensionTarget, extensionSource] = await Promise.all([
|
|
96
|
+
(0, psql_1.exec)(target, sql),
|
|
97
|
+
(0, psql_1.exec)(source, sql),
|
|
98
|
+
]);
|
|
99
|
+
const extensions = {
|
|
100
|
+
target: extensionTarget,
|
|
101
|
+
source: extensionSource,
|
|
102
|
+
};
|
|
103
|
+
// TODO: it shouldn't matter if the target has *more* extensions than the source
|
|
104
|
+
if (extensions.target !== extensions.source) {
|
|
105
|
+
core_1.ux.warn((0, tsheredoc_1.default) `
|
|
106
|
+
Extensions in newly created target database differ from existing source database.
|
|
107
|
+
Target extensions:
|
|
108
|
+
` + extensions.target + (0, tsheredoc_1.default) `
|
|
109
|
+
Source extensions:
|
|
110
|
+
` + extensions.source + (0, tsheredoc_1.default) `
|
|
111
|
+
HINT: You should review output to ensure that any errors
|
|
112
|
+
ignored are acceptable - entire tables may have been missed, where a dependency
|
|
113
|
+
could not be resolved. You may need to install a postgresql-contrib package
|
|
114
|
+
and retry.
|
|
115
|
+
`);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
exports.verifyExtensionsMatch = verifyExtensionsMatch;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
import { SettingKey, Setting } from './types';
|
|
3
|
+
export declare abstract class PGSettingsCommand extends Command {
|
|
4
|
+
protected abstract settingKey: SettingKey;
|
|
5
|
+
protected abstract convertValue(val: string): unknown;
|
|
6
|
+
protected abstract explain(setting: Setting<unknown>): string;
|
|
7
|
+
static topic: string;
|
|
8
|
+
static flags: {
|
|
9
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare type BooleanAsString = 'on' | 'ON' | 'true' | 'TRUE' | 'off' | 'OFF' | 'false' | 'FALSE';
|
|
15
|
+
export declare const booleanConverter: (value: BooleanAsString) => boolean;
|
|
16
|
+
export declare const numericConverter: (value: string) => number;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.numericConverter = exports.booleanConverter = exports.PGSettingsCommand = void 0;
|
|
4
|
+
const command_1 = require("@heroku-cli/command");
|
|
5
|
+
const core_1 = require("@oclif/core");
|
|
6
|
+
const resolve_1 = require("../addons/resolve");
|
|
7
|
+
const host_1 = require("./host");
|
|
8
|
+
const util_1 = require("./util");
|
|
9
|
+
class PGSettingsCommand extends command_1.Command {
|
|
10
|
+
async run() {
|
|
11
|
+
const { flags, args } = await this.parse();
|
|
12
|
+
const { app } = flags;
|
|
13
|
+
const { value, database } = args;
|
|
14
|
+
const db = await (0, resolve_1.addonResolver)(this.heroku, app, database || 'DATABASE_URL');
|
|
15
|
+
if ((0, util_1.essentialPlan)(db))
|
|
16
|
+
core_1.ux.error('You can’t perform this operation on Essential-tier databases.');
|
|
17
|
+
if (value) {
|
|
18
|
+
const { body: settings } = await this.heroku.patch(`/postgres/v0/databases/${db.id}/config`, {
|
|
19
|
+
hostname: (0, host_1.default)(),
|
|
20
|
+
body: { [this.settingKey]: this.convertValue(value) },
|
|
21
|
+
});
|
|
22
|
+
const setting = settings[this.settingKey];
|
|
23
|
+
core_1.ux.log(`${this.settingKey.replace(/_/g, '-')} has been set to ${setting.value} for ${db.name}.`);
|
|
24
|
+
core_1.ux.log(this.explain(setting));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
const { body: settings } = await this.heroku.get(`/postgres/v0/databases/${db.id}/config`, { hostname: (0, host_1.default)() });
|
|
28
|
+
const setting = settings[this.settingKey];
|
|
29
|
+
core_1.ux.log(`${this.settingKey.replace(/_/g, '-')} is set to ${setting.value} for ${db.name}.`);
|
|
30
|
+
core_1.ux.log(this.explain(setting));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.PGSettingsCommand = PGSettingsCommand;
|
|
35
|
+
PGSettingsCommand.topic = 'pg';
|
|
36
|
+
PGSettingsCommand.flags = {
|
|
37
|
+
app: command_1.flags.app({ required: true }),
|
|
38
|
+
remote: command_1.flags.remote(),
|
|
39
|
+
};
|
|
40
|
+
const booleanConverter = (value) => {
|
|
41
|
+
switch (value) {
|
|
42
|
+
case 'true':
|
|
43
|
+
case 'TRUE':
|
|
44
|
+
case 'ON':
|
|
45
|
+
case 'on':
|
|
46
|
+
return true;
|
|
47
|
+
case 'false':
|
|
48
|
+
case 'FALSE':
|
|
49
|
+
case 'OFF':
|
|
50
|
+
case 'off':
|
|
51
|
+
case null:
|
|
52
|
+
return false;
|
|
53
|
+
default:
|
|
54
|
+
throw new TypeError('Invalid value. Valid options are: a boolean value');
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
exports.booleanConverter = booleanConverter;
|
|
58
|
+
const numericConverter = (value) => {
|
|
59
|
+
const n = Number(value);
|
|
60
|
+
if (!Number.isFinite(n)) {
|
|
61
|
+
throw new TypeError('Invalid value. Valid options are: a numeric value');
|
|
62
|
+
}
|
|
63
|
+
return n;
|
|
64
|
+
};
|
|
65
|
+
exports.numericConverter = numericConverter;
|