heroku 9.0.0-alpha.1 → 9.0.0-alpha.2
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 +19 -0
- package/lib/commands/addons/create.js +84 -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 +2 -2
- package/lib/commands/apps/create.js +13 -6
- package/lib/commands/apps/destroy.d.ts +2 -1
- package/lib/commands/apps/destroy.js +4 -3
- package/lib/commands/apps/errors.d.ts +1 -0
- package/lib/commands/apps/errors.js +1 -0
- package/lib/commands/apps/favorites/add.d.ts +1 -0
- package/lib/commands/apps/favorites/add.js +1 -0
- package/lib/commands/apps/favorites/remove.d.ts +1 -0
- package/lib/commands/apps/favorites/remove.js +1 -0
- package/lib/commands/apps/index.d.ts +1 -1
- package/lib/commands/apps/index.js +1 -1
- package/lib/commands/apps/info.d.ts +2 -1
- package/lib/commands/apps/info.js +3 -4
- 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 +2 -1
- package/lib/commands/apps/open.js +2 -1
- package/lib/commands/apps/rename.d.ts +2 -1
- package/lib/commands/apps/rename.js +2 -1
- package/lib/commands/apps/stacks/index.d.ts +2 -1
- package/lib/commands/apps/stacks/index.js +2 -1
- package/lib/commands/apps/stacks/set.d.ts +1 -1
- 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.js +5 -1
- package/lib/commands/authorizations/info.js +5 -1
- package/lib/commands/authorizations/revoke.js +5 -1
- package/lib/commands/authorizations/rotate.js +5 -1
- package/lib/commands/authorizations/update.js +5 -1
- package/lib/commands/autocomplete/doctor.js +2 -2
- package/lib/commands/autocomplete/options.js +2 -2
- 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 +1 -0
- package/lib/commands/ci/config/get.js +1 -0
- package/lib/commands/ci/config/set.d.ts +1 -0
- package/lib/commands/ci/config/set.js +1 -0
- package/lib/commands/ci/config/unset.d.ts +1 -0
- package/lib/commands/ci/config/unset.js +1 -0
- package/lib/commands/ci/index.d.ts +1 -0
- package/lib/commands/ci/index.js +1 -0
- package/lib/commands/ci/info.d.ts +1 -0
- package/lib/commands/ci/info.js +1 -0
- package/lib/commands/ci/last.d.ts +1 -0
- package/lib/commands/ci/last.js +1 -0
- package/lib/commands/ci/open.d.ts +1 -0
- package/lib/commands/ci/open.js +1 -0
- package/lib/commands/ci/rerun.d.ts +1 -0
- package/lib/commands/ci/rerun.js +1 -0
- package/lib/commands/config/set.d.ts +2 -1
- package/lib/commands/config/set.js +2 -1
- 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 +40 -0
- package/lib/commands/container/push.d.ts +16 -0
- package/lib/commands/container/push.js +101 -0
- package/lib/commands/container/release.d.ts +14 -0
- package/lib/commands/container/release.js +89 -0
- package/lib/commands/container/rm.d.ts +13 -0
- package/lib/commands/container/rm.js +36 -0
- package/lib/commands/container/run.d.ts +15 -0
- package/lib/commands/container/run.js +63 -0
- package/lib/commands/dashboard.d.ts +7 -0
- package/lib/commands/dashboard.js +164 -0
- package/lib/commands/domains/index.d.ts +2 -2
- package/lib/commands/drains/add.d.ts +1 -0
- package/lib/commands/drains/add.js +1 -0
- package/lib/commands/drains/index.d.ts +1 -0
- package/lib/commands/drains/index.js +1 -0
- package/lib/commands/drains/remove.d.ts +1 -0
- package/lib/commands/drains/remove.js +1 -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/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 +1 -1
- package/lib/commands/local/index.js +8 -3
- package/lib/commands/local/run.d.ts +1 -1
- package/lib/commands/local/run.js +8 -3
- 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/connect.js +1 -1
- package/lib/commands/pipelines/diff.js +1 -1
- 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/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/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/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/outbound-rules/add.d.ts +15 -0
- package/lib/commands/spaces/outbound-rules/add.js +81 -0
- package/lib/commands/spaces/outbound-rules/index.d.ts +15 -0
- package/lib/commands/spaces/outbound-rules/index.js +49 -0
- package/lib/commands/spaces/outbound-rules/remove.d.ts +17 -0
- package/lib/commands/spaces/outbound-rules/remove.js +53 -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 +45 -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 +35 -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 +36 -0
- package/lib/commands/spaces/vpn/wait.d.ts +13 -0
- package/lib/commands/spaces/vpn/wait.js +53 -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/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 +38 -0
- package/lib/lib/addons/resolve.js +179 -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/autocomplete/completions.d.ts +4 -0
- 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/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/{apps/confirm-app.js → confirmCommand.js} +2 -2
- 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/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/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/multisort.d.ts +32 -0
- package/lib/lib/utils/multisort.js +66 -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 +12776 -3097
- package/package.json +108 -61
- package/lib/lib/apps/confirm-app.d.ts +0 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const color_1 = require("@heroku-cli/color");
|
|
4
|
+
const command_1 = require("@heroku-cli/command");
|
|
5
|
+
const core_1 = require("@oclif/core");
|
|
6
|
+
const fetcher_1 = require("../../../lib/pg/fetcher");
|
|
7
|
+
const util_1 = require("../../../lib/pg/util");
|
|
8
|
+
const host_1 = require("../../../lib/pg/host");
|
|
9
|
+
class Run extends command_1.Command {
|
|
10
|
+
async run() {
|
|
11
|
+
const { flags, args } = await this.parse(Run);
|
|
12
|
+
const { app, force } = flags;
|
|
13
|
+
const { database } = args;
|
|
14
|
+
const db = await (0, fetcher_1.getAddon)(this.heroku, app, database);
|
|
15
|
+
if ((0, util_1.essentialPlan)(db))
|
|
16
|
+
core_1.ux.error("pg:maintenance isn't available for Essential-tier databases.");
|
|
17
|
+
core_1.ux.action.start(`Starting maintenance for ${color_1.default.yellow(db.name)}`);
|
|
18
|
+
if (!force) {
|
|
19
|
+
const { body: appInfo } = await this.heroku.get(`/apps/${app}`);
|
|
20
|
+
if (!appInfo.maintenance)
|
|
21
|
+
core_1.ux.error('Application must be in maintenance mode or run with --force');
|
|
22
|
+
}
|
|
23
|
+
const { body: response } = await this.heroku.post(`/client/v11/databases/${db.id}/maintenance`, { hostname: (0, host_1.default)() });
|
|
24
|
+
core_1.ux.action.stop(response.message || 'done');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = Run;
|
|
28
|
+
Run.topic = 'pg';
|
|
29
|
+
Run.description = 'start maintenance';
|
|
30
|
+
Run.flags = {
|
|
31
|
+
force: command_1.flags.boolean({ char: 'f' }),
|
|
32
|
+
app: command_1.flags.app({ required: true }),
|
|
33
|
+
remote: command_1.flags.remote(),
|
|
34
|
+
};
|
|
35
|
+
Run.args = {
|
|
36
|
+
database: core_1.Args.string(),
|
|
37
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Window extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static example: string;
|
|
6
|
+
static flags: {
|
|
7
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
static args: {
|
|
11
|
+
window: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
|
|
12
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const color_1 = require("@heroku-cli/color");
|
|
4
|
+
const command_1 = require("@heroku-cli/command");
|
|
5
|
+
const core_1 = require("@oclif/core");
|
|
6
|
+
const host_1 = require("../../../lib/pg/host");
|
|
7
|
+
const util_1 = require("../../../lib/pg/util");
|
|
8
|
+
const fetcher_1 = require("../../../lib/pg/fetcher");
|
|
9
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
10
|
+
class Window extends command_1.Command {
|
|
11
|
+
async run() {
|
|
12
|
+
const { args, flags } = await this.parse(Window);
|
|
13
|
+
const { database, window } = args;
|
|
14
|
+
const { app } = flags;
|
|
15
|
+
const db = await (0, fetcher_1.getAddon)(this.heroku, app, database);
|
|
16
|
+
if ((0, util_1.essentialPlan)(db))
|
|
17
|
+
core_1.ux.error("pg:maintenance isn't available for Essential-tier databases.");
|
|
18
|
+
if (!window.match(/^[A-Za-z]{2,10} \d\d?:[03]0$/))
|
|
19
|
+
core_1.ux.error('Window must be "Day HH:MM" where MM is 00 or 30');
|
|
20
|
+
core_1.ux.action.start(`Setting maintenance window for ${color_1.default.yellow(db.name)} to ${color_1.default.cyan(window)}`);
|
|
21
|
+
const { body: response } = await this.heroku.put(`/client/v11/databases/${db.id}/maintenance_window`, {
|
|
22
|
+
body: { description: window }, hostname: (0, host_1.default)(),
|
|
23
|
+
});
|
|
24
|
+
core_1.ux.action.stop(response.message || 'done');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = Window;
|
|
28
|
+
Window.topic = 'pg';
|
|
29
|
+
Window.description = (0, tsheredoc_1.default)(`
|
|
30
|
+
Set weekly maintenance window.
|
|
31
|
+
All times are in UTC.
|
|
32
|
+
`);
|
|
33
|
+
Window.example = '$ heroku pg:maintenance:window "Sunday 06:00" postgres-slippery-100';
|
|
34
|
+
Window.flags = {
|
|
35
|
+
app: command_1.flags.app({ required: true }),
|
|
36
|
+
remote: command_1.flags.remote(),
|
|
37
|
+
};
|
|
38
|
+
Window.args = {
|
|
39
|
+
window: core_1.Args.string({ required: true }),
|
|
40
|
+
database: core_1.Args.string(),
|
|
41
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
import { getConnectionDetails } from '../../lib/pg/util';
|
|
3
|
+
export default class Outliers extends Command {
|
|
4
|
+
static topic: string;
|
|
5
|
+
static description: string;
|
|
6
|
+
static flags: {
|
|
7
|
+
reset: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
truncate: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
num: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
11
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
12
|
+
};
|
|
13
|
+
static args: {
|
|
14
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
protected ensurePGStatStatement(db: ReturnType<typeof getConnectionDetails>): Promise<void>;
|
|
18
|
+
protected outliersQuery(version: string | undefined, limit: number, truncate: boolean): string;
|
|
19
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const command_1 = require("@heroku-cli/command");
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
const fetcher_1 = require("../../lib/pg/fetcher");
|
|
6
|
+
const psql_1 = require("../../lib/pg/psql");
|
|
7
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
8
|
+
class Outliers extends command_1.Command {
|
|
9
|
+
async run() {
|
|
10
|
+
const { flags, args } = await this.parse(Outliers);
|
|
11
|
+
const { app, reset, truncate, num } = flags;
|
|
12
|
+
const db = await (0, fetcher_1.database)(this.heroku, app, args.database);
|
|
13
|
+
const version = await (0, psql_1.fetchVersion)(db);
|
|
14
|
+
await this.ensurePGStatStatement(db);
|
|
15
|
+
if (reset) {
|
|
16
|
+
await (0, psql_1.exec)(db, 'SELECT pg_stat_statements_reset();');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let limit = 10;
|
|
20
|
+
if (num) {
|
|
21
|
+
if (/^(\d+)$/.exec(num)) {
|
|
22
|
+
limit = Number.parseInt(num, 10);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
core_1.ux.error(`Cannot parse num param value "${num}" to a number`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const query = this.outliersQuery(version, limit, truncate);
|
|
29
|
+
const output = await (0, psql_1.exec)(db, query);
|
|
30
|
+
core_1.ux.log(output);
|
|
31
|
+
}
|
|
32
|
+
async ensurePGStatStatement(db) {
|
|
33
|
+
const query = (0, tsheredoc_1.default) `
|
|
34
|
+
SELECT exists(
|
|
35
|
+
SELECT 1
|
|
36
|
+
FROM pg_extension e
|
|
37
|
+
LEFT JOIN pg_namespace n ON n.oid = e.extnamespace
|
|
38
|
+
WHERE e.extname = 'pg_stat_statements' AND n.nspname IN ('public', 'heroku_ext')
|
|
39
|
+
) AS available;
|
|
40
|
+
`;
|
|
41
|
+
const output = await (0, psql_1.exec)(db, query);
|
|
42
|
+
if (!output.includes('t')) {
|
|
43
|
+
core_1.ux.error((0, tsheredoc_1.default) `
|
|
44
|
+
pg_stat_statements extension need to be installed first.
|
|
45
|
+
You can install it by running: CREATE EXTENSION pg_stat_statements WITH SCHEMA heroku_ext;
|
|
46
|
+
`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
outliersQuery(version, limit, truncate) {
|
|
50
|
+
const truncatedQueryString = truncate ? (0, tsheredoc_1.default) `
|
|
51
|
+
CASE WHEN length(query) <= 40 THEN query ELSE substr(query, 0, 39) || '…' END
|
|
52
|
+
` : 'query';
|
|
53
|
+
if (version && Number.parseInt(version, 10) >= 13) {
|
|
54
|
+
return (0, tsheredoc_1.default) `
|
|
55
|
+
SELECT
|
|
56
|
+
interval '1 millisecond' * total_exec_time AS total_exec_time,
|
|
57
|
+
to_char((total_exec_time/sum(total_exec_time) OVER()) * 100, 'FM90D0') || '%' AS prop_exec_time,
|
|
58
|
+
to_char(calls, 'FM999G999G999G990') AS ncalls,
|
|
59
|
+
interval '1 millisecond' * (blk_read_time + blk_write_time) AS sync_io_time,
|
|
60
|
+
${truncatedQueryString} AS query
|
|
61
|
+
FROM pg_stat_statements
|
|
62
|
+
WHERE userid = (
|
|
63
|
+
SELECT usesysid FROM pg_user WHERE usename = current_user LIMIT 1
|
|
64
|
+
)
|
|
65
|
+
ORDER BY total_exec_time DESC
|
|
66
|
+
LIMIT ${limit};
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
return (0, tsheredoc_1.default) `
|
|
70
|
+
SELECT
|
|
71
|
+
interval '1 millisecond' * total_time AS total_exec_time,
|
|
72
|
+
to_char((total_time/sum(total_time) OVER()) * 100, 'FM90D0') || '%' AS prop_exec_time,
|
|
73
|
+
to_char(calls, 'FM999G999G999G990') AS ncalls,
|
|
74
|
+
interval '1 millisecond' * (blk_read_time + blk_write_time) AS sync_io_time,
|
|
75
|
+
${truncatedQueryString} AS query
|
|
76
|
+
FROM pg_stat_statements
|
|
77
|
+
WHERE userid = (
|
|
78
|
+
SELECT usesysid FROM pg_user WHERE usename = current_user LIMIT 1
|
|
79
|
+
)
|
|
80
|
+
ORDER BY total_time DESC
|
|
81
|
+
LIMIT ${limit};
|
|
82
|
+
`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.default = Outliers;
|
|
86
|
+
Outliers.topic = 'pg';
|
|
87
|
+
Outliers.description = 'show 10 queries that have longest execution time in aggregate';
|
|
88
|
+
Outliers.flags = {
|
|
89
|
+
reset: command_1.flags.boolean({ description: 'resets statistics gathered by pg_stat_statements' }),
|
|
90
|
+
truncate: command_1.flags.boolean({ char: 't', description: 'truncate queries to 40 characters' }),
|
|
91
|
+
num: command_1.flags.string({ char: 'n', description: 'the number of queries to display (default: 10)' }),
|
|
92
|
+
app: command_1.flags.app({ required: true }),
|
|
93
|
+
remote: command_1.flags.remote(),
|
|
94
|
+
};
|
|
95
|
+
Outliers.args = {
|
|
96
|
+
database: core_1.Args.string(),
|
|
97
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Promote extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
force: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
static args: {
|
|
11
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable complexity */
|
|
4
|
+
const color_1 = require("@heroku-cli/color");
|
|
5
|
+
const command_1 = require("@heroku-cli/command");
|
|
6
|
+
const core_1 = require("@oclif/core");
|
|
7
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
8
|
+
const fetcher_1 = require("../../lib/pg/fetcher");
|
|
9
|
+
const host_1 = require("../../lib/pg/host");
|
|
10
|
+
class Promote extends command_1.Command {
|
|
11
|
+
async run() {
|
|
12
|
+
var _a, _b, _c;
|
|
13
|
+
const { flags, args } = await this.parse(Promote);
|
|
14
|
+
const { force, app } = flags;
|
|
15
|
+
const { database } = args;
|
|
16
|
+
const attachment = await (0, fetcher_1.getAttachment)(this.heroku, app, database);
|
|
17
|
+
core_1.ux.action.start(`Ensuring an alternate alias for existing ${color_1.default.green('DATABASE_URL')}`);
|
|
18
|
+
const { body: attachments } = await this.heroku.get(`/apps/${app}/addon-attachments`);
|
|
19
|
+
const current = attachments.find(a => a.name === 'DATABASE');
|
|
20
|
+
if (!current)
|
|
21
|
+
return;
|
|
22
|
+
// eslint-disable-next-line eqeqeq
|
|
23
|
+
if (((_a = current.addon) === null || _a === void 0 ? void 0 : _a.name) === attachment.addon.name && current.namespace == attachment.namespace) {
|
|
24
|
+
if (attachment.namespace) {
|
|
25
|
+
core_1.ux.error(`${color_1.default.cyan(attachment.name)} is already promoted on ${color_1.default.app(app)}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
core_1.ux.error(`${color_1.default.addon(attachment.addon.name)} is already promoted on ${color_1.default.app(app)}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const existing = attachments.filter(a => { var _a, _b; return ((_a = a.addon) === null || _a === void 0 ? void 0 : _a.id) === ((_b = current.addon) === null || _b === void 0 ? void 0 : _b.id) && a.namespace === current.namespace; })
|
|
32
|
+
.find(a => a.name !== 'DATABASE');
|
|
33
|
+
if (existing) {
|
|
34
|
+
core_1.ux.action.stop(color_1.default.green(existing.name + '_URL'));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// The current add-on occupying the DATABASE attachment has no
|
|
38
|
+
// other attachments. In order to promote this database without
|
|
39
|
+
// error, we can create a secondary attachment, just-in-time.
|
|
40
|
+
const { body: backup } = await this.heroku.post('/addon-attachments', {
|
|
41
|
+
body: {
|
|
42
|
+
app: { name: app },
|
|
43
|
+
addon: { name: (_b = current.addon) === null || _b === void 0 ? void 0 : _b.name },
|
|
44
|
+
namespace: current.namespace,
|
|
45
|
+
confirm: app,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
core_1.ux.action.stop(color_1.default.green(backup.name + '_URL'));
|
|
49
|
+
}
|
|
50
|
+
if (!force) {
|
|
51
|
+
const { body: status } = await this.heroku.get(`/client/v11/databases/${attachment.addon.id}/wait_status`, {
|
|
52
|
+
hostname: (0, host_1.default)(),
|
|
53
|
+
});
|
|
54
|
+
if (status['waiting?']) {
|
|
55
|
+
core_1.ux.error((0, tsheredoc_1.default)(`
|
|
56
|
+
Database cannot be promoted while in state: ${status.message}
|
|
57
|
+
|
|
58
|
+
Promoting this database can lead to application errors and outage. Please run ${color_1.default.cmd('heroku pg:wait')} to wait for database to become available.
|
|
59
|
+
|
|
60
|
+
To ignore this error, you can pass the --force flag to promote the database and risk application issues.
|
|
61
|
+
`));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
let promotionMessage;
|
|
65
|
+
if (attachment.namespace) {
|
|
66
|
+
promotionMessage = `Promoting ${color_1.default.cyan(attachment.name)} to ${color_1.default.green('DATABASE_URL')} on ${color_1.default.app(app)}`;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
promotionMessage = `Promoting ${color_1.default.addon(attachment.addon.name)} to ${color_1.default.green('DATABASE_URL')} on ${color_1.default.app(app)}`;
|
|
70
|
+
}
|
|
71
|
+
core_1.ux.action.start(promotionMessage);
|
|
72
|
+
await this.heroku.post('/addon-attachments', {
|
|
73
|
+
body: {
|
|
74
|
+
name: 'DATABASE',
|
|
75
|
+
app: { name: app },
|
|
76
|
+
addon: { name: attachment.addon.name },
|
|
77
|
+
namespace: attachment.namespace || null,
|
|
78
|
+
confirm: app,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
core_1.ux.action.stop();
|
|
82
|
+
const currentPooler = attachments.find(a => { var _a, _b; return a.namespace === 'connection-pooling:default' && ((_a = a.addon) === null || _a === void 0 ? void 0 : _a.id) === ((_b = current.addon) === null || _b === void 0 ? void 0 : _b.id) && a.name === 'DATABASE_CONNECTION_POOL'; });
|
|
83
|
+
if (currentPooler) {
|
|
84
|
+
core_1.ux.action.start('Reattaching pooler to new leader');
|
|
85
|
+
await this.heroku.post('/addon-attachments', {
|
|
86
|
+
body: {
|
|
87
|
+
name: currentPooler.name,
|
|
88
|
+
app: { name: app },
|
|
89
|
+
addon: { name: attachment.addon.name },
|
|
90
|
+
namespace: 'connection-pooling:default',
|
|
91
|
+
confirm: app,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
core_1.ux.action.stop();
|
|
95
|
+
}
|
|
96
|
+
const { body: promotedDatabaseDetails } = await this.heroku.get(`/client/v11/databases/${attachment.addon.id}`, {
|
|
97
|
+
hostname: (0, host_1.default)(),
|
|
98
|
+
});
|
|
99
|
+
if (promotedDatabaseDetails.following) {
|
|
100
|
+
const unfollowLeaderCmd = `heroku pg:unfollow ${attachment.addon.name}`;
|
|
101
|
+
core_1.ux.warn((0, tsheredoc_1.default)(`
|
|
102
|
+
Your database has been promoted but it is currently a follower database in read-only mode.
|
|
103
|
+
|
|
104
|
+
Promoting a database with ${color_1.default.cmd('heroku pg:promote')} doesn't automatically unfollow its leader.
|
|
105
|
+
|
|
106
|
+
Use ${color_1.default.cmd(unfollowLeaderCmd)} to stop this follower from replicating from its leader (${color_1.default.yellow(promotedDatabaseDetails.leader)}) and convert it into a writable database.
|
|
107
|
+
`));
|
|
108
|
+
}
|
|
109
|
+
const { body: formation } = await this.heroku.get(`/apps/${app}/formation`);
|
|
110
|
+
const releasePhase = formation.find(process => process.type === 'release');
|
|
111
|
+
if (releasePhase) {
|
|
112
|
+
core_1.ux.action.start('Checking release phase');
|
|
113
|
+
const { body: releases } = await this.heroku.get(`/apps/${app}/releases`, {
|
|
114
|
+
partial: true,
|
|
115
|
+
headers: {
|
|
116
|
+
Range: 'version ..; max=5, order=desc',
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
const attach = releases.find(release => { var _a; return (_a = release.description) === null || _a === void 0 ? void 0 : _a.includes('Attach DATABASE'); });
|
|
120
|
+
const detach = releases.find(release => { var _a; return (_a = release.description) === null || _a === void 0 ? void 0 : _a.includes('Detach DATABASE'); });
|
|
121
|
+
if (!attach || !detach) {
|
|
122
|
+
core_1.ux.error('Unable to check release phase. Check your Attach DATABASE release for failures.');
|
|
123
|
+
}
|
|
124
|
+
const endTime = Date.now() + 900000; // 15 minutes from now
|
|
125
|
+
const [attachId, detachId] = [attach === null || attach === void 0 ? void 0 : attach.id, detach === null || detach === void 0 ? void 0 : detach.id];
|
|
126
|
+
while (true) {
|
|
127
|
+
const attach = await (0, fetcher_1.getRelease)(this.heroku, app, attachId);
|
|
128
|
+
if (attach && attach.status === 'succeeded') {
|
|
129
|
+
let msg = 'pg:promote succeeded.';
|
|
130
|
+
const detach = await (0, fetcher_1.getRelease)(this.heroku, app, detachId);
|
|
131
|
+
if (detach && detach.status === 'failed') {
|
|
132
|
+
msg += ` It is safe to ignore the failed ${detach.description} release.`;
|
|
133
|
+
}
|
|
134
|
+
core_1.ux.action.stop(msg);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (attach && attach.status === 'failed') {
|
|
138
|
+
let msg = `pg:promote failed because ${attach.description} release was unsuccessful. Your application is currently running `;
|
|
139
|
+
const detach = await (0, fetcher_1.getRelease)(this.heroku, app, detachId);
|
|
140
|
+
if (detach && detach.status === 'succeeded') {
|
|
141
|
+
msg += 'without an attached DATABASE_URL.';
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
msg += `with ${(_c = current.addon) === null || _c === void 0 ? void 0 : _c.name} attached as DATABASE_URL.`;
|
|
145
|
+
}
|
|
146
|
+
msg += ' Check your release phase logs for failure causes.';
|
|
147
|
+
core_1.ux.action.stop(msg);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (Date.now() > endTime) {
|
|
151
|
+
core_1.ux.action.stop('timeout. Check your Attach DATABASE release for failures.');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.default = Promote;
|
|
160
|
+
Promote.topic = 'pg';
|
|
161
|
+
Promote.description = 'sets DATABASE as your DATABASE_URL';
|
|
162
|
+
Promote.flags = {
|
|
163
|
+
force: command_1.flags.boolean({ char: 'f' }),
|
|
164
|
+
app: command_1.flags.app({ required: true }),
|
|
165
|
+
remote: command_1.flags.remote(),
|
|
166
|
+
};
|
|
167
|
+
Promote.args = {
|
|
168
|
+
database: core_1.Args.string({ required: true }),
|
|
169
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Ps extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
7
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
static args: {
|
|
11
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const command_1 = require("@heroku-cli/command");
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
6
|
+
const fetcher_1 = require("../../lib/pg/fetcher");
|
|
7
|
+
const psql_1 = require("../../lib/pg/psql");
|
|
8
|
+
class Ps extends command_1.Command {
|
|
9
|
+
async run() {
|
|
10
|
+
const { flags, args } = await this.parse(Ps);
|
|
11
|
+
const { database: databaseName } = args;
|
|
12
|
+
const { verbose, app } = flags;
|
|
13
|
+
const db = await (0, fetcher_1.database)(this.heroku, app, databaseName);
|
|
14
|
+
const num = Math.random();
|
|
15
|
+
const waitingMarker = `${num}${num}`;
|
|
16
|
+
const waitingQuery = (0, tsheredoc_1.default)(`
|
|
17
|
+
SELECT '${num}' || '${num}'
|
|
18
|
+
WHERE EXISTS
|
|
19
|
+
(SELECT 1
|
|
20
|
+
FROM information_schema.columns
|
|
21
|
+
WHERE table_schema = 'pg_catalog'
|
|
22
|
+
AND TABLE_NAME = 'pg_stat_activity'
|
|
23
|
+
AND COLUMN_NAME = 'waiting')
|
|
24
|
+
`);
|
|
25
|
+
const waitingOutput = await (0, psql_1.exec)(db, waitingQuery);
|
|
26
|
+
const waiting = waitingOutput.includes(waitingMarker) ? 'waiting' : 'wait_event IS NOT NULL AS waiting';
|
|
27
|
+
const query = (0, tsheredoc_1.default)(`SELECT pid,
|
|
28
|
+
state,
|
|
29
|
+
application_name AS SOURCE,
|
|
30
|
+
usename AS username,
|
|
31
|
+
age(now(), xact_start) AS running_for,
|
|
32
|
+
xact_start AS transaction_start, ${waiting}, query
|
|
33
|
+
FROM pg_stat_activity
|
|
34
|
+
WHERE query <> '<insufficient privilege>' ${verbose ? '' : "AND state <> 'idle'"}
|
|
35
|
+
AND pid <> pg_backend_pid()
|
|
36
|
+
ORDER BY query_start DESC
|
|
37
|
+
`);
|
|
38
|
+
const output = await (0, psql_1.exec)(db, query);
|
|
39
|
+
process.stdout.write(output);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.default = Ps;
|
|
43
|
+
Ps.topic = 'pg';
|
|
44
|
+
Ps.description = 'view active queries with execution time';
|
|
45
|
+
Ps.flags = {
|
|
46
|
+
verbose: command_1.flags.boolean({ char: 'v' }),
|
|
47
|
+
app: command_1.flags.app({ required: true }),
|
|
48
|
+
remote: command_1.flags.remote(),
|
|
49
|
+
};
|
|
50
|
+
Ps.args = {
|
|
51
|
+
database: core_1.Args.string(),
|
|
52
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Psql extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static flags: {
|
|
5
|
+
command: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
6
|
+
file: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
credential: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
static args: {
|
|
12
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
13
|
+
};
|
|
14
|
+
static aliases: string[];
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const color_1 = require("@heroku-cli/color");
|
|
4
|
+
const command_1 = require("@heroku-cli/command");
|
|
5
|
+
const core_1 = require("@oclif/core");
|
|
6
|
+
const fetcher_1 = require("../../lib/pg/fetcher");
|
|
7
|
+
const psql_1 = require("../../lib/pg/psql");
|
|
8
|
+
class Psql extends command_1.Command {
|
|
9
|
+
async run() {
|
|
10
|
+
const { flags, args } = await this.parse(Psql);
|
|
11
|
+
const { app, command, credential, file } = flags;
|
|
12
|
+
const namespace = credential ? `credential:${credential}` : undefined;
|
|
13
|
+
let db;
|
|
14
|
+
try {
|
|
15
|
+
db = await (0, fetcher_1.database)(this.heroku, app, args.database, namespace);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
if (namespace && error instanceof Error && error.message === "Couldn't find that addon.") {
|
|
19
|
+
throw new Error("Credential doesn't match, make sure credential is attached");
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
console.error(`--> Connecting to ${color_1.default.yellow(db.attachment.addon.name)}`);
|
|
24
|
+
if (command) {
|
|
25
|
+
const output = await (0, psql_1.exec)(db, command);
|
|
26
|
+
process.stdout.write(output);
|
|
27
|
+
}
|
|
28
|
+
else if (file) {
|
|
29
|
+
const output = await (0, psql_1.execFile)(db, file);
|
|
30
|
+
process.stdout.write(output);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
await (0, psql_1.interactive)(db);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.default = Psql;
|
|
38
|
+
Psql.description = 'open a psql shell to the database';
|
|
39
|
+
Psql.flags = {
|
|
40
|
+
command: command_1.flags.string({ char: 'c', description: 'SQL command to run' }),
|
|
41
|
+
file: command_1.flags.string({ char: 'f', description: 'SQL file to run' }),
|
|
42
|
+
credential: command_1.flags.string({ description: 'credential to use' }),
|
|
43
|
+
app: command_1.flags.app({ required: true }),
|
|
44
|
+
remote: command_1.flags.remote(),
|
|
45
|
+
};
|
|
46
|
+
Psql.args = {
|
|
47
|
+
database: core_1.Args.string(),
|
|
48
|
+
};
|
|
49
|
+
Psql.aliases = ['psql'];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
import { ConnectionDetails } from '../../lib/pg/util';
|
|
3
|
+
export default class Pull extends Command {
|
|
4
|
+
static topic: string;
|
|
5
|
+
static description: string;
|
|
6
|
+
static examples: string[];
|
|
7
|
+
static flags: {
|
|
8
|
+
'exclude-table-data': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
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
|
+
static args: {
|
|
13
|
+
source: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
|
|
14
|
+
target: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
protected pull(sourceIn: ConnectionDetails, targetIn: ConnectionDetails, exclusions: string[]): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const color_1 = require("@heroku-cli/color");
|
|
4
|
+
const command_1 = require("@heroku-cli/command");
|
|
5
|
+
const core_1 = require("@oclif/core");
|
|
6
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
7
|
+
const fetcher_1 = require("../../lib/pg/fetcher");
|
|
8
|
+
const util_1 = require("../../lib/pg/util");
|
|
9
|
+
const push_pull_1 = require("../../lib/pg/push_pull");
|
|
10
|
+
const node_child_process_1 = require("node:child_process");
|
|
11
|
+
const env = process.env;
|
|
12
|
+
class Pull extends command_1.Command {
|
|
13
|
+
async run() {
|
|
14
|
+
const { flags, args } = await this.parse(Pull);
|
|
15
|
+
const { app, 'exclude-table-data': excludeTableData } = flags;
|
|
16
|
+
const exclusions = (0, push_pull_1.parseExclusions)(excludeTableData);
|
|
17
|
+
const source = await (0, fetcher_1.database)(this.heroku, app, args.source);
|
|
18
|
+
const target = (0, util_1.parsePostgresConnectionString)(args.target);
|
|
19
|
+
core_1.ux.log(`Pulling ${color_1.default.cyan(source.attachment.addon.name)} to ${color_1.default.addon(args.target)}`);
|
|
20
|
+
await this.pull(source, target, exclusions);
|
|
21
|
+
core_1.ux.log('Pulling complete.');
|
|
22
|
+
}
|
|
23
|
+
async pull(sourceIn, targetIn, exclusions) {
|
|
24
|
+
await (0, push_pull_1.prepare)(targetIn);
|
|
25
|
+
const source = await (0, push_pull_1.maybeTunnel)(sourceIn);
|
|
26
|
+
const target = await (0, push_pull_1.maybeTunnel)(targetIn);
|
|
27
|
+
const exclude = exclusions.map(function (e) {
|
|
28
|
+
return '--exclude-table-data=' + e;
|
|
29
|
+
}).join(' ');
|
|
30
|
+
const dumpFlags = ['--verbose', '-F', 'c', '-Z', '0', '-N', '_heroku', ...(0, push_pull_1.connArgs)(source, true)];
|
|
31
|
+
if (exclude !== '')
|
|
32
|
+
dumpFlags.push(exclude);
|
|
33
|
+
const dumpOptions = {
|
|
34
|
+
env: Object.assign({ PGSSLMODE: 'prefer' }, env),
|
|
35
|
+
stdio: ['pipe', 'pipe', 2],
|
|
36
|
+
shell: true,
|
|
37
|
+
};
|
|
38
|
+
if (source.password)
|
|
39
|
+
dumpOptions.env.PGPASSWORD = source.password;
|
|
40
|
+
const restoreFlags = ['--verbose', '-F', 'c', '--no-acl', '--no-owner', ...(0, push_pull_1.connArgs)(target)];
|
|
41
|
+
const restoreOptions = {
|
|
42
|
+
env: Object.assign({}, env),
|
|
43
|
+
stdio: ['pipe', 'pipe', 2],
|
|
44
|
+
shell: true,
|
|
45
|
+
};
|
|
46
|
+
if (target.password)
|
|
47
|
+
restoreOptions.env.PGPASSWORD = target.password;
|
|
48
|
+
const pgDump = (0, node_child_process_1.spawn)('pg_dump', dumpFlags, dumpOptions);
|
|
49
|
+
const pgRestore = (0, node_child_process_1.spawn)('pg_restore', restoreFlags, restoreOptions);
|
|
50
|
+
await (0, push_pull_1.spawnPipe)(pgDump, pgRestore);
|
|
51
|
+
if (source._tunnel)
|
|
52
|
+
source._tunnel.close();
|
|
53
|
+
if (target._tunnel)
|
|
54
|
+
target._tunnel.close();
|
|
55
|
+
await (0, push_pull_1.verifyExtensionsMatch)(sourceIn, targetIn);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.default = Pull;
|
|
59
|
+
Pull.topic = 'pg';
|
|
60
|
+
Pull.description = (0, tsheredoc_1.default) `
|
|
61
|
+
pull Heroku database into local or remote database
|
|
62
|
+
Pull from SOURCE into TARGET.
|
|
63
|
+
|
|
64
|
+
TARGET must be one of:
|
|
65
|
+
* a database name (i.e. on a local PostgreSQL server) => TARGET must not exist and will be created
|
|
66
|
+
* a fully qualified URL to a local PostgreSQL server => TARGET must not exist and will be created
|
|
67
|
+
* a fully qualified URL to a remote PostgreSQL server => TARGET must exist and be empty
|
|
68
|
+
|
|
69
|
+
To delete a local database run ${color_1.default.cmd('dropdb TARGET')}.
|
|
70
|
+
To create an empty remote database, run ${color_1.default.cmd('createdb')} with connection command-line options (run ${color_1.default.cmd('createdb --help')} for details).
|
|
71
|
+
`;
|
|
72
|
+
Pull.examples = [(0, tsheredoc_1.default) `
|
|
73
|
+
# pull Heroku DB named postgresql-swimmingly-100 into local DB mylocaldb that must not exist
|
|
74
|
+
$ heroku pg:pull postgresql-swimmingly-100 mylocaldb --app sushi
|
|
75
|
+
`, (0, tsheredoc_1.default) `
|
|
76
|
+
# pull Heroku DB named postgresql-swimmingly-100 into empty remote DB at postgres://myhost/mydb
|
|
77
|
+
$ heroku pg:pull postgresql-swimmingly-100 postgres://myhost/mydb --app sushi
|
|
78
|
+
`];
|
|
79
|
+
Pull.flags = {
|
|
80
|
+
'exclude-table-data': command_1.flags.string({ description: 'tables for which data should be excluded (use \';\' to split multiple names)', hasValue: true }),
|
|
81
|
+
app: command_1.flags.app({ required: true }),
|
|
82
|
+
remote: command_1.flags.remote(),
|
|
83
|
+
};
|
|
84
|
+
Pull.args = {
|
|
85
|
+
source: core_1.Args.string({ required: true }),
|
|
86
|
+
target: core_1.Args.string({ required: true }),
|
|
87
|
+
};
|