heroku 9.0.0-alpha.1 → 9.0.0-alpha.3
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 +110 -63
- package/lib/lib/apps/confirm-app.d.ts +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
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 backups_1 = require("../../../lib/pg/backups");
|
|
8
|
+
const lodash_1 = require("lodash");
|
|
9
|
+
function status(backup) {
|
|
10
|
+
if (backup.succeeded) {
|
|
11
|
+
if (backup.warnings > 0)
|
|
12
|
+
return `Finished with ${backup.warnings} warnings`;
|
|
13
|
+
return 'Completed';
|
|
14
|
+
}
|
|
15
|
+
if (backup.canceled_at)
|
|
16
|
+
return 'Canceled';
|
|
17
|
+
if (backup.finished_at)
|
|
18
|
+
return 'Failed';
|
|
19
|
+
if (backup.started_at)
|
|
20
|
+
return 'Running';
|
|
21
|
+
return 'Pending';
|
|
22
|
+
}
|
|
23
|
+
function compression(compressed, total) {
|
|
24
|
+
let pct = 0;
|
|
25
|
+
if (compressed > 0) {
|
|
26
|
+
pct = Math.round((total - compressed) / total * 100);
|
|
27
|
+
pct = Math.max(0, pct);
|
|
28
|
+
}
|
|
29
|
+
return ` (${pct}% compression)`;
|
|
30
|
+
}
|
|
31
|
+
class Info extends command_1.Command {
|
|
32
|
+
constructor() {
|
|
33
|
+
super(...arguments);
|
|
34
|
+
this.getBackup = async (id, app) => {
|
|
35
|
+
let backupID;
|
|
36
|
+
if (id) {
|
|
37
|
+
const { num } = (0, backups_1.default)(app, this.heroku);
|
|
38
|
+
backupID = await num(id);
|
|
39
|
+
if (!backupID)
|
|
40
|
+
throw new Error(`Invalid ID: ${id}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
let { body: transfers } = await this.heroku.get(`/client/v11/apps/${app}/transfers`, { hostname: (0, host_1.default)() });
|
|
44
|
+
transfers = (0, lodash_1.sortBy)(transfers, 'created_at');
|
|
45
|
+
const backups = transfers.filter(t => t.from_type === 'pg_dump' && t.to_type === 'gof3r');
|
|
46
|
+
const lastBackup = backups.pop();
|
|
47
|
+
if (!lastBackup)
|
|
48
|
+
throw new Error(`No backups. Capture one with ${color_1.default.cyan.bold('heroku pg:backups:capture')}`);
|
|
49
|
+
backupID = lastBackup.num;
|
|
50
|
+
}
|
|
51
|
+
const { body: backup } = await this.heroku.get(`/client/v11/apps/${app}/transfers/${backupID}?verbose=true`, { hostname: (0, host_1.default)() });
|
|
52
|
+
return backup;
|
|
53
|
+
};
|
|
54
|
+
this.displayBackup = (backup, app) => {
|
|
55
|
+
const { filesize, name } = (0, backups_1.default)(app, this.heroku);
|
|
56
|
+
core_1.ux.styledHeader(`Backup ${color_1.default.cyan(name(backup))}`);
|
|
57
|
+
core_1.ux.styledObject({
|
|
58
|
+
Database: color_1.default.green(backup.from_name),
|
|
59
|
+
'Started at': backup.started_at,
|
|
60
|
+
'Finished at': backup.finished_at,
|
|
61
|
+
Status: status(backup),
|
|
62
|
+
Type: backup.schedule ? 'Scheduled' : 'Manual', 'Original DB Size': filesize(backup.source_bytes),
|
|
63
|
+
'Backup Size': `${filesize(backup.processed_bytes)}${backup.finished_at ? compression(backup.processed_bytes, backup.source_bytes) : ''}`,
|
|
64
|
+
}, ['Database', 'Started at', 'Finished at', 'Status', 'Type', 'Original DB Size', 'Backup Size']);
|
|
65
|
+
core_1.ux.log();
|
|
66
|
+
};
|
|
67
|
+
this.displayLogs = (backup) => {
|
|
68
|
+
core_1.ux.styledHeader('Backup Logs');
|
|
69
|
+
for (const log of backup.logs)
|
|
70
|
+
core_1.ux.log(`${log.created_at} ${log.message}`);
|
|
71
|
+
core_1.ux.log();
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async run() {
|
|
75
|
+
const { flags, args } = await this.parse(Info);
|
|
76
|
+
const { app } = flags;
|
|
77
|
+
const { backup_id } = args;
|
|
78
|
+
const backup = await this.getBackup(backup_id, app);
|
|
79
|
+
this.displayBackup(backup, app);
|
|
80
|
+
this.displayLogs(backup);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.default = Info;
|
|
84
|
+
Info.topic = 'pg';
|
|
85
|
+
Info.description = 'get information about a specific backup';
|
|
86
|
+
Info.flags = {
|
|
87
|
+
app: command_1.flags.app({ required: true }),
|
|
88
|
+
remote: command_1.flags.remote(),
|
|
89
|
+
};
|
|
90
|
+
Info.args = {
|
|
91
|
+
backup_id: core_1.Args.string(),
|
|
92
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Restore extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
'wait-interval': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
extensions: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
confirm: 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
|
+
backup: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
15
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
protected getSortedExtensions(extensions: string | null | undefined): string[] | undefined;
|
|
19
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
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 confirmCommand_1 = require("../../../lib/confirmCommand");
|
|
8
|
+
const backups_1 = require("../../../lib/pg/backups");
|
|
9
|
+
const fetcher_1 = require("../../../lib/pg/fetcher");
|
|
10
|
+
const host_1 = require("../../../lib/pg/host");
|
|
11
|
+
function dropboxURL(url) {
|
|
12
|
+
if (url.match(/^https?:\/\/www\.dropbox\.com/) && !url.endsWith('dl=1')) {
|
|
13
|
+
if (url.endsWith('dl=0'))
|
|
14
|
+
url = url.replace('dl=0', 'dl=1');
|
|
15
|
+
else if (url.includes('?'))
|
|
16
|
+
url += '&dl=1';
|
|
17
|
+
else
|
|
18
|
+
url += '?dl=1';
|
|
19
|
+
}
|
|
20
|
+
return url;
|
|
21
|
+
}
|
|
22
|
+
class Restore extends command_1.Command {
|
|
23
|
+
async run() {
|
|
24
|
+
const { flags, args } = await this.parse(Restore);
|
|
25
|
+
const { app, 'wait-interval': waitInterval, extensions, confirm, verbose } = flags;
|
|
26
|
+
const interval = Math.max(3, waitInterval);
|
|
27
|
+
const { addon: db } = await (0, fetcher_1.getAttachment)(this.heroku, app, args.database);
|
|
28
|
+
const { name, wait } = (0, backups_1.default)(app, this.heroku);
|
|
29
|
+
let backupURL;
|
|
30
|
+
let backupName = args.backup;
|
|
31
|
+
if (backupName && backupName.match(/^https?:\/\//)) {
|
|
32
|
+
backupURL = dropboxURL(backupName);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
let backupApp;
|
|
36
|
+
if (backupName && backupName.match(/::/)) {
|
|
37
|
+
[backupApp, backupName] = backupName.split('::');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
backupApp = app;
|
|
41
|
+
}
|
|
42
|
+
const { body: transfers } = await this.heroku.get(`/client/v11/apps/${backupApp}/transfers`, { hostname: (0, host_1.default)() });
|
|
43
|
+
const backups = transfers.filter(t => t.from_type === 'pg_dump' && t.to_type === 'gof3r');
|
|
44
|
+
let backup;
|
|
45
|
+
if (backupName) {
|
|
46
|
+
backup = backups.find(b => name(b) === backupName);
|
|
47
|
+
if (!backup)
|
|
48
|
+
throw new Error(`Backup ${color_1.default.cyan(backupName)} not found for ${color_1.default.app(backupApp)}`);
|
|
49
|
+
if (!backup.succeeded)
|
|
50
|
+
throw new Error(`Backup ${color_1.default.cyan(backupName)} for ${color_1.default.app(backupApp)} did not complete successfully`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
backup = backups.filter(b => b.succeeded).sort((a, b) => {
|
|
54
|
+
if (a.finished_at < b.finished_at) {
|
|
55
|
+
return -1;
|
|
56
|
+
}
|
|
57
|
+
if (a.finished_at > b.finished_at) {
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
return 0;
|
|
61
|
+
}).pop();
|
|
62
|
+
if (!backup) {
|
|
63
|
+
throw new Error(`No backups for ${color_1.default.app(backupApp)}. Capture one with ${color_1.default.cyan.bold('heroku pg:backups:capture')}`);
|
|
64
|
+
}
|
|
65
|
+
backupName = name(backup);
|
|
66
|
+
}
|
|
67
|
+
backupURL = backup.to_url;
|
|
68
|
+
}
|
|
69
|
+
await (0, confirmCommand_1.default)(app, confirm);
|
|
70
|
+
core_1.ux.action.start(`Starting restore of ${color_1.default.cyan(backupName)} to ${color_1.default.yellow(db.name)}`);
|
|
71
|
+
core_1.ux.log((0, tsheredoc_1.default)(`
|
|
72
|
+
|
|
73
|
+
Use Ctrl-C at any time to stop monitoring progress; the backup will continue restoring.
|
|
74
|
+
Use ${color_1.default.cyan.bold('heroku pg:backups')} to check progress.
|
|
75
|
+
Stop a running restore with ${color_1.default.cyan.bold('heroku pg:backups:cancel')}.
|
|
76
|
+
`));
|
|
77
|
+
const { body: restore } = await this.heroku.post(`/client/v11/databases/${db.id}/restores`, {
|
|
78
|
+
body: { backup_url: backupURL, extensions: this.getSortedExtensions(extensions) }, hostname: (0, host_1.default)(),
|
|
79
|
+
});
|
|
80
|
+
core_1.ux.action.stop();
|
|
81
|
+
await wait('Restoring', restore.uuid, interval, verbose, db.app.id);
|
|
82
|
+
}
|
|
83
|
+
getSortedExtensions(extensions) {
|
|
84
|
+
return extensions === null || extensions === void 0 ? void 0 : extensions.split(',').map(ext => ext.trim().toLowerCase()).sort();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.default = Restore;
|
|
88
|
+
Restore.topic = 'pg';
|
|
89
|
+
Restore.description = 'restore a backup (default latest) to a database';
|
|
90
|
+
Restore.flags = {
|
|
91
|
+
'wait-interval': command_1.flags.integer({ default: 3 }),
|
|
92
|
+
extensions: command_1.flags.string({
|
|
93
|
+
char: 'e',
|
|
94
|
+
description: (0, tsheredoc_1.default)(`
|
|
95
|
+
comma-separated list of extensions to pre-install in the public schema
|
|
96
|
+
defaults to saving the latest database to DATABASE_URL
|
|
97
|
+
`),
|
|
98
|
+
}),
|
|
99
|
+
verbose: command_1.flags.boolean({ char: 'v' }),
|
|
100
|
+
confirm: command_1.flags.string({ char: 'c' }),
|
|
101
|
+
app: command_1.flags.app({ required: true }),
|
|
102
|
+
remote: command_1.flags.remote(),
|
|
103
|
+
};
|
|
104
|
+
Restore.args = {
|
|
105
|
+
backup: core_1.Args.string(),
|
|
106
|
+
database: core_1.Args.string(),
|
|
107
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
declare type BackupSchedule = {
|
|
3
|
+
hour: string;
|
|
4
|
+
timezone: string;
|
|
5
|
+
schedule_name?: string;
|
|
6
|
+
};
|
|
7
|
+
export default class Schedule extends Command {
|
|
8
|
+
static topic: string;
|
|
9
|
+
static description: string;
|
|
10
|
+
static flags: {
|
|
11
|
+
at: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
12
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
13
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
static args: {
|
|
16
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
17
|
+
};
|
|
18
|
+
parseDate: (at: string) => BackupSchedule;
|
|
19
|
+
run(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
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 fetcher_1 = require("../../../lib/pg/fetcher");
|
|
8
|
+
const TZ = {
|
|
9
|
+
PST: 'America/Los_Angeles',
|
|
10
|
+
PDT: 'America/Los_Angeles',
|
|
11
|
+
MST: 'America/Boise',
|
|
12
|
+
MDT: 'America/Boise',
|
|
13
|
+
CST: 'America/Chicago',
|
|
14
|
+
CDT: 'America/Chicago',
|
|
15
|
+
EST: 'America/New_York',
|
|
16
|
+
EDT: 'America/New_York',
|
|
17
|
+
Z: 'UTC',
|
|
18
|
+
GMT: 'Europe/London',
|
|
19
|
+
BST: 'Europe/London',
|
|
20
|
+
CET: 'Europe/Paris',
|
|
21
|
+
CEST: 'Europe/Paris',
|
|
22
|
+
};
|
|
23
|
+
class Schedule extends command_1.Command {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(...arguments);
|
|
26
|
+
this.parseDate = function (at) {
|
|
27
|
+
const m = at.match(/^([0-2]?[0-9]):00 ?(\S*)$/);
|
|
28
|
+
if (!m)
|
|
29
|
+
throw new Error("Invalid schedule format: expected --at '[HOUR]:00 [TIMEZONE]'");
|
|
30
|
+
const [, hour, timezone] = m;
|
|
31
|
+
let scheduledTZ = TZ[timezone.toUpperCase()];
|
|
32
|
+
if (!scheduledTZ) {
|
|
33
|
+
scheduledTZ = 'UTC';
|
|
34
|
+
if (timezone) {
|
|
35
|
+
core_1.ux.warn(`Unknown timezone ${color_1.default.yellow(timezone)}. Defaulting to UTC.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { hour, timezone: scheduledTZ };
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async run() {
|
|
42
|
+
var _a;
|
|
43
|
+
const { flags, args } = await this.parse(Schedule);
|
|
44
|
+
const { app } = flags;
|
|
45
|
+
const { database } = args;
|
|
46
|
+
const schedule = this.parseDate(flags.at);
|
|
47
|
+
const attachment = await (0, fetcher_1.getAttachment)(this.heroku, app, database);
|
|
48
|
+
const db = attachment.addon;
|
|
49
|
+
const at = color_1.default.cyan(`${schedule.hour}:00 ${schedule.timezone}`);
|
|
50
|
+
const pgResponse = await this.heroku.get(`/client/v11/databases/${db.id}`, { hostname: (0, host_1.default)() })
|
|
51
|
+
.catch(error => {
|
|
52
|
+
if (error.statusCode !== 404)
|
|
53
|
+
throw error;
|
|
54
|
+
core_1.ux.error(`${color_1.default.yellow(db.name)} is not yet provisioned.\nRun ${color_1.default.cyan.bold('heroku addons:wait')} to wait until the db is provisioned.`, { exit: 1 });
|
|
55
|
+
});
|
|
56
|
+
const { body: dbInfo } = pgResponse || { body: null };
|
|
57
|
+
if (dbInfo) {
|
|
58
|
+
const dbProtected = /On/.test(((_a = dbInfo.info.find(attribute => attribute.name === 'Continuous Protection')) === null || _a === void 0 ? void 0 : _a.values[0]) || '');
|
|
59
|
+
if (dbProtected) {
|
|
60
|
+
core_1.ux.warn('Continuous protection is already enabled for this database. Logical backups of large databases are likely to fail.');
|
|
61
|
+
core_1.ux.warn('See https://devcenter.heroku.com/articles/heroku-postgres-data-safety-and-continuous-protection#physical-backups-on-heroku-postgres.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
core_1.ux.action.start(`Scheduling automatic daily backups of ${color_1.default.yellow(db.name)} at ${at}`);
|
|
65
|
+
schedule.schedule_name = attachment.name + '_URL';
|
|
66
|
+
await this.heroku.post(`/client/v11/databases/${db.id}/transfer-schedules`, {
|
|
67
|
+
body: schedule, hostname: (0, host_1.default)(),
|
|
68
|
+
});
|
|
69
|
+
core_1.ux.action.stop();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.default = Schedule;
|
|
73
|
+
Schedule.topic = 'pg';
|
|
74
|
+
Schedule.description = 'schedule daily backups for given database';
|
|
75
|
+
Schedule.flags = {
|
|
76
|
+
at: command_1.flags.string({ required: true, description: "at a specific (24h) hour in the given timezone. Defaults to UTC. --at '[HOUR]:00 [TIMEZONE]'" }),
|
|
77
|
+
app: command_1.flags.app({ required: true }),
|
|
78
|
+
remote: command_1.flags.remote(),
|
|
79
|
+
};
|
|
80
|
+
Schedule.args = {
|
|
81
|
+
database: core_1.Args.string(),
|
|
82
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Schedules extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 fetcher_1 = require("../../../lib/pg/fetcher");
|
|
8
|
+
class Schedules extends command_1.Command {
|
|
9
|
+
async run() {
|
|
10
|
+
const { flags } = await this.parse(Schedules);
|
|
11
|
+
const { app } = flags;
|
|
12
|
+
const db = await (0, fetcher_1.arbitraryAppDB)(this.heroku, app);
|
|
13
|
+
const { body: schedules } = await this.heroku.get(`/client/v11/databases/${db.id}/transfer-schedules`, { hostname: (0, host_1.default)() });
|
|
14
|
+
if (schedules.length === 0) {
|
|
15
|
+
core_1.ux.warn(`No backup schedules found on ${color_1.default.app(app)}\nUse ${color_1.default.cyan.bold('heroku pg:backups:schedule')} to set one up`);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
core_1.ux.styledHeader('Backup Schedules');
|
|
19
|
+
for (const s of schedules) {
|
|
20
|
+
core_1.ux.log(`${color_1.default.green(s.name)}: daily at ${s.hour}:00 ${s.timezone}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.default = Schedules;
|
|
26
|
+
Schedules.topic = 'pg';
|
|
27
|
+
Schedules.description = 'list backup schedule';
|
|
28
|
+
Schedules.flags = {
|
|
29
|
+
app: command_1.flags.app({ required: true }),
|
|
30
|
+
remote: command_1.flags.remote(),
|
|
31
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Unschedule extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
static args: {
|
|
10
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
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 host_1 = require("../../../lib/pg/host");
|
|
8
|
+
class Unschedule extends command_1.Command {
|
|
9
|
+
async run() {
|
|
10
|
+
const { flags, args } = await this.parse(Unschedule);
|
|
11
|
+
const { app } = flags;
|
|
12
|
+
const { database } = args;
|
|
13
|
+
let db = database;
|
|
14
|
+
if (!db) {
|
|
15
|
+
const appDB = await (0, fetcher_1.arbitraryAppDB)(this.heroku, app);
|
|
16
|
+
const { body: schedules } = await this.heroku.get(`/client/v11/databases/${appDB.id}/transfer-schedules`, { hostname: (0, host_1.default)() });
|
|
17
|
+
if (schedules.length === 0)
|
|
18
|
+
throw new Error(`No schedules on ${color_1.default.app(app)}`);
|
|
19
|
+
if (schedules.length > 1) {
|
|
20
|
+
throw new Error(`Specify schedule on ${color_1.default.app(app)}. Existing schedules: ${schedules.map(s => color_1.default.green(s.name))
|
|
21
|
+
.join(', ')}`);
|
|
22
|
+
}
|
|
23
|
+
db = schedules[0].name;
|
|
24
|
+
}
|
|
25
|
+
core_1.ux.action.start(`Unscheduling ${color_1.default.green(db)} daily backups`);
|
|
26
|
+
const addon = await (0, fetcher_1.getAddon)(this.heroku, app, db);
|
|
27
|
+
const { body: schedules } = await this.heroku.get(`/client/v11/databases/${addon.id}/transfer-schedules`, { hostname: (0, host_1.default)() });
|
|
28
|
+
const schedule = schedules.find(s => s.name.match(new RegExp(`${db}`, 'i')));
|
|
29
|
+
if (!schedule)
|
|
30
|
+
throw new Error(`No daily backups found for ${color_1.default.yellow(addon.name)}`);
|
|
31
|
+
await this.heroku.delete(`/client/v11/databases/${addon.id}/transfer-schedules/${schedule.uuid}`, { hostname: (0, host_1.default)() });
|
|
32
|
+
core_1.ux.action.stop();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.default = Unschedule;
|
|
36
|
+
Unschedule.topic = 'pg';
|
|
37
|
+
Unschedule.description = 'stop daily backups';
|
|
38
|
+
Unschedule.flags = {
|
|
39
|
+
app: command_1.flags.app({ required: true }),
|
|
40
|
+
remote: command_1.flags.remote(),
|
|
41
|
+
};
|
|
42
|
+
Unschedule.args = {
|
|
43
|
+
database: core_1.Args.string(),
|
|
44
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Url extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
static args: {
|
|
10
|
+
backup_id: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -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 backups_1 = require("../../../lib/pg/backups");
|
|
8
|
+
const lodash_1 = require("lodash");
|
|
9
|
+
class Url extends command_1.Command {
|
|
10
|
+
async run() {
|
|
11
|
+
const { flags, args } = await this.parse(Url);
|
|
12
|
+
const { backup_id } = args;
|
|
13
|
+
const { app } = flags;
|
|
14
|
+
let num;
|
|
15
|
+
if (backup_id) {
|
|
16
|
+
num = await (0, backups_1.default)(app, this.heroku).num(backup_id);
|
|
17
|
+
if (!num)
|
|
18
|
+
throw new Error(`Invalid Backup: ${backup_id}`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const { body: transfers } = await this.heroku.get(`/client/v11/apps/${app}/transfers`, { hostname: (0, host_1.default)() });
|
|
22
|
+
const lastBackup = (0, lodash_1.sortBy)(transfers.filter(t => t.succeeded && t.to_type === 'gof3r'), 'created_at')
|
|
23
|
+
.pop();
|
|
24
|
+
if (!lastBackup)
|
|
25
|
+
throw new Error(`No backups on ${color_1.default.app(app)}. Capture one with ${color_1.default.cyan.bold('heroku pg:backups:capture')}`);
|
|
26
|
+
num = lastBackup.num;
|
|
27
|
+
}
|
|
28
|
+
const { body: info } = await this.heroku.post(`/client/v11/apps/${app}/transfers/${num}/actions/public-url`, { hostname: (0, host_1.default)() });
|
|
29
|
+
core_1.ux.log(info.url);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.default = Url;
|
|
33
|
+
Url.topic = 'pg';
|
|
34
|
+
Url.description = 'get secret but publicly accessible URL of a backup';
|
|
35
|
+
Url.flags = {
|
|
36
|
+
app: command_1.flags.app({ required: true }),
|
|
37
|
+
remote: command_1.flags.remote(),
|
|
38
|
+
};
|
|
39
|
+
Url.args = {
|
|
40
|
+
backup_id: core_1.Args.string(),
|
|
41
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Bloat extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
static args: {
|
|
10
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
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 query = `
|
|
8
|
+
WITH constants AS (
|
|
9
|
+
SELECT current_setting('block_size')::numeric AS bs, 23 AS hdr, 4 AS ma
|
|
10
|
+
), bloat_info AS (
|
|
11
|
+
SELECT
|
|
12
|
+
ma,bs,schemaname,tablename,
|
|
13
|
+
(datawidth+(hdr+ma-(case when hdr%ma=0 THEN ma ELSE hdr%ma END)))::numeric AS datahdr,
|
|
14
|
+
(maxfracsum*(nullhdr+ma-(case when nullhdr%ma=0 THEN ma ELSE nullhdr%ma END))) AS nullhdr2
|
|
15
|
+
FROM (
|
|
16
|
+
SELECT
|
|
17
|
+
schemaname, tablename, hdr, ma, bs,
|
|
18
|
+
SUM((1-null_frac)*avg_width) AS datawidth,
|
|
19
|
+
MAX(null_frac) AS maxfracsum,
|
|
20
|
+
hdr+(
|
|
21
|
+
SELECT 1+count(*)/8
|
|
22
|
+
FROM pg_stats s2
|
|
23
|
+
WHERE null_frac<>0 AND s2.schemaname = s.schemaname AND s2.tablename = s.tablename
|
|
24
|
+
) AS nullhdr
|
|
25
|
+
FROM pg_stats s, constants
|
|
26
|
+
GROUP BY 1,2,3,4,5
|
|
27
|
+
) AS foo
|
|
28
|
+
), table_bloat AS (
|
|
29
|
+
SELECT
|
|
30
|
+
schemaname, tablename, cc.relpages, bs,
|
|
31
|
+
CEIL((cc.reltuples*((datahdr+ma-
|
|
32
|
+
(CASE WHEN datahdr%ma=0 THEN ma ELSE datahdr%ma END))+nullhdr2+4))/(bs-20::float)) AS otta
|
|
33
|
+
FROM bloat_info
|
|
34
|
+
JOIN pg_class cc ON cc.relname = bloat_info.tablename
|
|
35
|
+
JOIN pg_namespace nn ON cc.relnamespace = nn.oid AND nn.nspname = bloat_info.schemaname AND nn.nspname <> 'information_schema'
|
|
36
|
+
), index_bloat AS (
|
|
37
|
+
SELECT
|
|
38
|
+
schemaname, tablename, bs,
|
|
39
|
+
COALESCE(c2.relname,'?') AS iname, COALESCE(c2.reltuples,0) AS ituples, COALESCE(c2.relpages,0) AS ipages,
|
|
40
|
+
COALESCE(CEIL((c2.reltuples*(datahdr-12))/(bs-20::float)),0) AS iotta -- very rough approximation, assumes all cols
|
|
41
|
+
FROM bloat_info
|
|
42
|
+
JOIN pg_class cc ON cc.relname = bloat_info.tablename
|
|
43
|
+
JOIN pg_namespace nn ON cc.relnamespace = nn.oid AND nn.nspname = bloat_info.schemaname AND nn.nspname <> 'information_schema'
|
|
44
|
+
JOIN pg_index i ON indrelid = cc.oid
|
|
45
|
+
JOIN pg_class c2 ON c2.oid = i.indexrelid
|
|
46
|
+
)
|
|
47
|
+
SELECT
|
|
48
|
+
type, schemaname, object_name, bloat, pg_size_pretty(raw_waste) as waste
|
|
49
|
+
FROM
|
|
50
|
+
(SELECT
|
|
51
|
+
'table' as type,
|
|
52
|
+
schemaname,
|
|
53
|
+
tablename as object_name,
|
|
54
|
+
ROUND(CASE WHEN otta=0 THEN 0.0 ELSE table_bloat.relpages/otta::numeric END,1) AS bloat,
|
|
55
|
+
CASE WHEN relpages < otta THEN '0' ELSE (bs*(table_bloat.relpages-otta)::bigint)::bigint END AS raw_waste
|
|
56
|
+
FROM
|
|
57
|
+
table_bloat
|
|
58
|
+
UNION
|
|
59
|
+
SELECT
|
|
60
|
+
'index' as type,
|
|
61
|
+
schemaname,
|
|
62
|
+
tablename || '::' || iname as object_name,
|
|
63
|
+
ROUND(CASE WHEN iotta=0 OR ipages=0 THEN 0.0 ELSE ipages/iotta::numeric END,1) AS bloat,
|
|
64
|
+
CASE WHEN ipages < iotta THEN '0' ELSE (bs*(ipages-iotta))::bigint END AS raw_waste
|
|
65
|
+
FROM
|
|
66
|
+
index_bloat) bloat_summary
|
|
67
|
+
ORDER BY raw_waste DESC, bloat DESC
|
|
68
|
+
`;
|
|
69
|
+
class Bloat extends command_1.Command {
|
|
70
|
+
async run() {
|
|
71
|
+
const { flags, args } = await this.parse(Bloat);
|
|
72
|
+
const { app } = flags;
|
|
73
|
+
const db = await (0, fetcher_1.database)(this.heroku, app, args.database);
|
|
74
|
+
const output = await (0, psql_1.exec)(db, query);
|
|
75
|
+
process.stdout.write(output);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.default = Bloat;
|
|
79
|
+
Bloat.topic = 'pg';
|
|
80
|
+
Bloat.description = 'show table and index bloat in your database ordered by most wasteful';
|
|
81
|
+
Bloat.flags = {
|
|
82
|
+
app: command_1.flags.app({ required: true }),
|
|
83
|
+
remote: command_1.flags.remote(),
|
|
84
|
+
};
|
|
85
|
+
Bloat.args = {
|
|
86
|
+
database: core_1.Args.string(),
|
|
87
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Blocking extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
static args: {
|
|
10
|
+
database: import("@oclif/core/lib/interfaces/parser").Arg<string | undefined, Record<string, unknown>>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
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 Blocking extends command_1.Command {
|
|
9
|
+
async run() {
|
|
10
|
+
const { flags, args } = await this.parse(Blocking);
|
|
11
|
+
const { app } = flags;
|
|
12
|
+
const query = (0, tsheredoc_1.default) `
|
|
13
|
+
SELECT bl.pid AS blocked_pid,
|
|
14
|
+
ka.query AS blocking_statement,
|
|
15
|
+
now() - ka.query_start AS blocking_duration,
|
|
16
|
+
kl.pid AS blocking_pid,
|
|
17
|
+
a.query AS blocked_statement,
|
|
18
|
+
now() - a.query_start AS blocked_duration
|
|
19
|
+
FROM pg_catalog.pg_locks bl
|
|
20
|
+
JOIN pg_catalog.pg_stat_activity a
|
|
21
|
+
ON bl.pid = a.pid
|
|
22
|
+
JOIN pg_catalog.pg_locks kl
|
|
23
|
+
JOIN pg_catalog.pg_stat_activity ka
|
|
24
|
+
ON kl.pid = ka.pid
|
|
25
|
+
ON bl.transactionid = kl.transactionid AND bl.pid != kl.pid
|
|
26
|
+
WHERE NOT bl.granted
|
|
27
|
+
`;
|
|
28
|
+
const db = await (0, fetcher_1.database)(this.heroku, app, args.database);
|
|
29
|
+
const output = await (0, psql_1.exec)(db, query);
|
|
30
|
+
core_1.ux.log(output);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.default = Blocking;
|
|
34
|
+
Blocking.topic = 'pg';
|
|
35
|
+
Blocking.description = 'display queries holding locks other queries are waiting to be released';
|
|
36
|
+
Blocking.flags = {
|
|
37
|
+
app: command_1.flags.app({ required: true }),
|
|
38
|
+
remote: command_1.flags.remote(),
|
|
39
|
+
};
|
|
40
|
+
Blocking.args = {
|
|
41
|
+
database: core_1.Args.string(),
|
|
42
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Attach extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static flags: {
|
|
7
|
+
as: 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
|
+
run(): Promise<void>;
|
|
15
|
+
}
|