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,94 @@
|
|
|
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 certificate_details_1 = require("../../../lib/certs/certificate_details");
|
|
7
|
+
const domains_1 = require("../../../lib/domains/domains");
|
|
8
|
+
const date_fns_1 = require("date-fns");
|
|
9
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
10
|
+
function humanize(value) {
|
|
11
|
+
if (!value) {
|
|
12
|
+
return color_1.default.yellow('Waiting');
|
|
13
|
+
}
|
|
14
|
+
if (value === 'ok') {
|
|
15
|
+
return color_1.default.green('OK');
|
|
16
|
+
}
|
|
17
|
+
if (value === 'failed') {
|
|
18
|
+
return color_1.default.red('Failed');
|
|
19
|
+
}
|
|
20
|
+
if (value === 'verified') {
|
|
21
|
+
return color_1.default.yellow('In Progress');
|
|
22
|
+
}
|
|
23
|
+
if (value === 'dns-verified') {
|
|
24
|
+
return color_1.default.yellow('DNS Verified');
|
|
25
|
+
}
|
|
26
|
+
return value.split('-')
|
|
27
|
+
.map(word => word.replace(/(^[a-z])/, text => text.toUpperCase()))
|
|
28
|
+
.join(' ');
|
|
29
|
+
}
|
|
30
|
+
class Index extends command_1.Command {
|
|
31
|
+
async run() {
|
|
32
|
+
const { flags } = await this.parse(Index);
|
|
33
|
+
const [{ body: app }, { body: sniEndpoints }] = await Promise.all([
|
|
34
|
+
this.heroku.get(`/apps/${flags.app}`),
|
|
35
|
+
this.heroku.get(`/apps/${flags.app}/sni-endpoints`),
|
|
36
|
+
]);
|
|
37
|
+
if (!app.acm) {
|
|
38
|
+
core_1.ux.styledHeader(`Automatic Certificate Management is ${color_1.default.yellow('disabled')} on ${flags.app}`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
core_1.ux.styledHeader(`Automatic Certificate Management is ${color_1.default.green('enabled')} on ${flags.app}`);
|
|
42
|
+
if (sniEndpoints.length === 1 && sniEndpoints[0].ssl_cert.acm) {
|
|
43
|
+
(0, certificate_details_1.displayCertificateDetails)(sniEndpoints[0]);
|
|
44
|
+
core_1.ux.log('');
|
|
45
|
+
}
|
|
46
|
+
if (flags.wait) {
|
|
47
|
+
await (0, domains_1.waitForCertIssuedOnDomains)(this.heroku, flags.app).catch(() => { });
|
|
48
|
+
}
|
|
49
|
+
let { body: domains } = await this.heroku.get(`/apps/${flags.app}/domains`);
|
|
50
|
+
domains = domains.filter(domain => domain.kind === 'custom');
|
|
51
|
+
let message;
|
|
52
|
+
if (domains.length === 0) {
|
|
53
|
+
message = `Add a custom domain to your app by running: ${color_1.default.cmd('heroku domains:add <yourdomain.com>')}`;
|
|
54
|
+
}
|
|
55
|
+
else if (domains.some(domain => domain.acm_status === 'failed')) {
|
|
56
|
+
message = (0, tsheredoc_1.default) `
|
|
57
|
+
Some domains failed validation after multiple attempts, retry by running: ${color_1.default.cmd('heroku certs:auto:refresh')}
|
|
58
|
+
See our documentation at https://devcenter.heroku.com/articles/automated-certificate-management#failure-reasons`;
|
|
59
|
+
}
|
|
60
|
+
else if (domains.some(domain => domain.acm_status === 'failing')) {
|
|
61
|
+
message = (0, tsheredoc_1.default) `
|
|
62
|
+
Some domains are failing validation, please verify that your DNS matches: ${color_1.default.cmd('heroku domains')}
|
|
63
|
+
See our documentation at https://devcenter.heroku.com/articles/automated-certificate-management#failure-reasons`;
|
|
64
|
+
}
|
|
65
|
+
if (domains.length > 0) {
|
|
66
|
+
core_1.ux.table(domains, Object.assign(Object.assign({ Domain: {
|
|
67
|
+
get: (domain) => domain.hostname,
|
|
68
|
+
}, Status: {
|
|
69
|
+
get: (domain) => humanize(domain.acm_status),
|
|
70
|
+
} }, (domains.some(d => d.acm_status_reason) ? {
|
|
71
|
+
Reason: {
|
|
72
|
+
get: (domain) => domain.acm_status_reason ? domain.acm_status_reason : '',
|
|
73
|
+
},
|
|
74
|
+
} : {})), { lastUpdated: {
|
|
75
|
+
header: 'Last Updated',
|
|
76
|
+
get: (domain) => (0, date_fns_1.formatDistanceToNow)(new Date(domain.updated_at)),
|
|
77
|
+
} }));
|
|
78
|
+
if (message) {
|
|
79
|
+
core_1.ux.log('');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (message) {
|
|
83
|
+
core_1.ux.styledHeader(message);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.default = Index;
|
|
88
|
+
Index.topic = 'certs';
|
|
89
|
+
Index.description = 'show ACM status for an app';
|
|
90
|
+
Index.flags = {
|
|
91
|
+
wait: command_1.flags.boolean({ description: 'watch ACM status and display the status when complete' }),
|
|
92
|
+
app: command_1.flags.app({ required: true }),
|
|
93
|
+
remote: command_1.flags.remote(),
|
|
94
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Refresh 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,19 @@
|
|
|
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
|
+
class Refresh extends command_1.Command {
|
|
6
|
+
async run() {
|
|
7
|
+
const { flags } = await this.parse(Refresh);
|
|
8
|
+
core_1.ux.action.start('Refreshing Automatic Certificate Management');
|
|
9
|
+
await this.heroku.patch(`/apps/${flags.app}/acm`, { body: { acm_refresh: true } });
|
|
10
|
+
core_1.ux.action.stop();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.default = Refresh;
|
|
14
|
+
Refresh.topic = 'certs';
|
|
15
|
+
Refresh.description = 'refresh ACM for an app';
|
|
16
|
+
Refresh.flags = {
|
|
17
|
+
app: command_1.flags.app({ required: true }),
|
|
18
|
+
remote: command_1.flags.remote(),
|
|
19
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Generate extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static help: string;
|
|
6
|
+
static flags: {
|
|
7
|
+
selfsigned: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
keysize: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
+
owner: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
|
+
country: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
11
|
+
area: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
12
|
+
city: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
13
|
+
subject: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
14
|
+
now: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
16
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
17
|
+
};
|
|
18
|
+
static args: {
|
|
19
|
+
domain: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
|
|
20
|
+
};
|
|
21
|
+
private parsed;
|
|
22
|
+
run(): Promise<void>;
|
|
23
|
+
protected requiresPrompt(flags: Awaited<typeof this.parsed>['flags']): boolean | undefined;
|
|
24
|
+
protected getSubject(args: Awaited<typeof this.parsed>['args'], flags: Awaited<typeof this.parsed>['flags']): string;
|
|
25
|
+
protected spawnOpenSSL(args: ReadonlyArray<string>): Promise<unknown>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
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 node_child_process_1 = require("node:child_process");
|
|
6
|
+
const inquirer = require("inquirer");
|
|
7
|
+
function getCommand(certs, domain) {
|
|
8
|
+
const shouldUpdate = certs
|
|
9
|
+
.map(cert => { var _a; return (_a = cert === null || cert === void 0 ? void 0 : cert.ssl_cert) === null || _a === void 0 ? void 0 : _a.cert_domains; })
|
|
10
|
+
.filter(certDomains => certDomains === null || certDomains === void 0 ? void 0 : certDomains.length)
|
|
11
|
+
.flat()
|
|
12
|
+
.includes(domain);
|
|
13
|
+
return shouldUpdate ? 'update' : 'add';
|
|
14
|
+
}
|
|
15
|
+
class Generate extends command_1.Command {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(...arguments);
|
|
18
|
+
this.parsed = this.parse(Generate);
|
|
19
|
+
}
|
|
20
|
+
async run() {
|
|
21
|
+
const { flags, args } = await this.parsed;
|
|
22
|
+
const { app, selfsigned } = flags;
|
|
23
|
+
if (this.requiresPrompt(flags)) {
|
|
24
|
+
const { owner, country, area, city } = await inquirer.prompt([
|
|
25
|
+
{ type: 'input', message: 'Owner of this certificate', name: 'owner' },
|
|
26
|
+
{ type: 'input', message: 'Country of owner (two-letter ISO code)', name: 'country' },
|
|
27
|
+
{ type: 'input', message: 'State/province/etc. of owner', name: 'area' },
|
|
28
|
+
{ type: 'input', message: 'City of owner', name: 'city' },
|
|
29
|
+
]);
|
|
30
|
+
Object.assign(flags, { owner, country, area, city });
|
|
31
|
+
}
|
|
32
|
+
const subject = this.getSubject(args, flags);
|
|
33
|
+
const domain = args.domain;
|
|
34
|
+
const keysize = flags.keysize || 2048;
|
|
35
|
+
const keyfile = `${domain}.key`;
|
|
36
|
+
const { body: certs } = await this.heroku.get(`/apps/${app}/sni-endpoints`);
|
|
37
|
+
const command = getCommand(certs, domain);
|
|
38
|
+
if (selfsigned) {
|
|
39
|
+
const crtfile = `${domain}.crt`;
|
|
40
|
+
await this.spawnOpenSSL(['req', '-new', '-newkey', `rsa:${keysize}`, '-nodes', '-keyout', keyfile, '-out', crtfile, '-subj', subject, '-x509']);
|
|
41
|
+
console.error('Your key and self-signed certificate have been generated.');
|
|
42
|
+
console.error('Next, run:');
|
|
43
|
+
console.error(`$ heroku certs:${command} ${crtfile} ${keyfile}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const csrfile = `${domain}.csr`;
|
|
47
|
+
await this.spawnOpenSSL(['req', '-new', '-newkey', `rsa:${keysize}`, '-nodes', '-keyout', keyfile, '-out', csrfile, '-subj', subject]);
|
|
48
|
+
console.error('Your key and certificate signing request have been generated.');
|
|
49
|
+
console.error(`Submit the CSR in '${csrfile}' to your preferred certificate authority.`);
|
|
50
|
+
console.error('When you\'ve received your certificate, run:');
|
|
51
|
+
console.error(`$ heroku certs:${command} CERTFILE ${keyfile}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
requiresPrompt(flags) {
|
|
55
|
+
if (flags.subject) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const args = [flags.owner, flags.country, flags.area, flags.city];
|
|
59
|
+
if (!flags.now && args.every((arg) => !arg)) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
getSubject(args, flags) {
|
|
64
|
+
const { domain } = args;
|
|
65
|
+
const { owner, country, area, city, subject } = flags;
|
|
66
|
+
if (subject) {
|
|
67
|
+
return subject;
|
|
68
|
+
}
|
|
69
|
+
let constructedSubject = '';
|
|
70
|
+
if (country) {
|
|
71
|
+
constructedSubject += `/C=${country}`;
|
|
72
|
+
}
|
|
73
|
+
if (area) {
|
|
74
|
+
constructedSubject += `/ST=${area}`;
|
|
75
|
+
}
|
|
76
|
+
if (city) {
|
|
77
|
+
constructedSubject += `/L=${city}`;
|
|
78
|
+
}
|
|
79
|
+
if (owner) {
|
|
80
|
+
constructedSubject += `/O=${owner}`;
|
|
81
|
+
}
|
|
82
|
+
constructedSubject += `/CN=${domain}`;
|
|
83
|
+
return constructedSubject;
|
|
84
|
+
}
|
|
85
|
+
async spawnOpenSSL(args) {
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
const process = (0, node_child_process_1.spawn)('openssl', args, { stdio: 'inherit' });
|
|
88
|
+
process.once('error', reject);
|
|
89
|
+
process.once('close', (code) => code ? reject(new Error(`Non zero openssl error ${code}`)) : resolve(code));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.default = Generate;
|
|
94
|
+
Generate.topic = 'certs';
|
|
95
|
+
Generate.description = 'generate a key and a CSR or self-signed certificate';
|
|
96
|
+
Generate.help = 'Generate a key and certificate signing request (or self-signed certificate)\nfor an app. Prompts for information to put in the certificate unless --now\nis used, or at least one of the --subject, --owner, --country, --area, or\n--city options is specified.';
|
|
97
|
+
Generate.flags = {
|
|
98
|
+
selfsigned: command_1.flags.boolean({ required: false, description: 'generate a self-signed certificate instead of a CSR' }),
|
|
99
|
+
keysize: command_1.flags.string({ optional: true, description: 'RSA key size in bits (default: 2048)' }),
|
|
100
|
+
owner: command_1.flags.string({ optional: true, description: 'name of organization certificate belongs to' }),
|
|
101
|
+
country: command_1.flags.string({ optional: true, description: 'country of owner, as a two-letter ISO country code' }),
|
|
102
|
+
area: command_1.flags.string({ optional: true, description: 'sub-country area (state, province, etc.) of owner' }),
|
|
103
|
+
city: command_1.flags.string({ optional: true, description: 'city of owner' }),
|
|
104
|
+
subject: command_1.flags.string({ optional: true, description: 'specify entire certificate subject' }),
|
|
105
|
+
now: command_1.flags.boolean({ required: false, description: 'do not prompt for any owner information' }),
|
|
106
|
+
app: command_1.flags.app({ required: true }),
|
|
107
|
+
remote: command_1.flags.remote(),
|
|
108
|
+
};
|
|
109
|
+
Generate.args = {
|
|
110
|
+
domain: core_1.Args.string({ required: true }),
|
|
111
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Index 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,26 @@
|
|
|
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 display_table_1 = require("../../lib/certs/display_table");
|
|
7
|
+
class Index extends command_1.Command {
|
|
8
|
+
async run() {
|
|
9
|
+
const { flags } = await this.parse(Index);
|
|
10
|
+
const { body: certs } = await this.heroku.get(`/apps/${flags.app}/sni-endpoints`);
|
|
11
|
+
if (certs.length === 0) {
|
|
12
|
+
core_1.ux.log(`${color_1.default.magenta(flags.app)} has no SSL certificates.\nUse ${color_1.default.cmd('heroku certs:add CRT KEY')} to add one.`);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
const sortedCerts = certs.sort((a, b) => a.name > b.name ? 1 : (b.name > a.name ? -1 : 0));
|
|
16
|
+
(0, display_table_1.default)(sortedCerts);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.default = Index;
|
|
21
|
+
Index.topic = 'certs';
|
|
22
|
+
Index.description = 'list SSL certificates for an app';
|
|
23
|
+
Index.flags = {
|
|
24
|
+
app: command_1.flags.app({ required: true }),
|
|
25
|
+
remote: command_1.flags.remote(),
|
|
26
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Info extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
endpoint: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
'show-domains': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
app: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 flags_1 = require("../../lib/certs/flags");
|
|
7
|
+
const certificate_details_1 = require("../../lib/certs/certificate_details");
|
|
8
|
+
class Info extends command_1.Command {
|
|
9
|
+
async run() {
|
|
10
|
+
const { flags } = await this.parse(Info);
|
|
11
|
+
const { app } = flags;
|
|
12
|
+
const endpoint = await (0, flags_1.default)(flags, this.heroku);
|
|
13
|
+
core_1.ux.action.start(`Fetching SSL certificate ${endpoint.name} info for ${color_1.default.app(app)}`);
|
|
14
|
+
// This is silly, we just fetched all SNI Endpoints and filtered to get the one we want just
|
|
15
|
+
// to use the name on the start action message, but then we re-fetch the exact same SNI Endpoint we
|
|
16
|
+
// already have.
|
|
17
|
+
const { body: cert } = await this.heroku.get(`/apps/${app}/sni-endpoints/${endpoint.name}`);
|
|
18
|
+
core_1.ux.action.stop();
|
|
19
|
+
if (flags['show-domains']) {
|
|
20
|
+
core_1.ux.action.start(`Fetching domains for ${endpoint.name}`);
|
|
21
|
+
const domains = await Promise.all(endpoint.domains.map(async (domain) => {
|
|
22
|
+
const { body: response } = await this.heroku.get(`/apps/${app}/domains/${domain}`);
|
|
23
|
+
return response.hostname;
|
|
24
|
+
}));
|
|
25
|
+
core_1.ux.action.stop();
|
|
26
|
+
cert.domains = domains;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
cert.domains = [];
|
|
30
|
+
}
|
|
31
|
+
(0, certificate_details_1.displayCertificateDetails)(cert);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.default = Info;
|
|
35
|
+
Info.topic = 'certs';
|
|
36
|
+
Info.description = 'show certificate information for an SSL certificate';
|
|
37
|
+
Info.flags = {
|
|
38
|
+
name: command_1.flags.string({ description: 'name to check info on' }),
|
|
39
|
+
endpoint: command_1.flags.string({ description: 'endpoint to check info on' }),
|
|
40
|
+
'show-domains': command_1.flags.boolean({ description: 'show associated domains' }),
|
|
41
|
+
app: command_1.flags.app({ required: true }),
|
|
42
|
+
remote: command_1.flags.remote(),
|
|
43
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Remove extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
confirm: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
endpoint: 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
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
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 flags_1 = require("../../lib/certs/flags");
|
|
7
|
+
const confirmCommand_1 = require("../../lib/confirmCommand");
|
|
8
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
9
|
+
class Remove extends command_1.Command {
|
|
10
|
+
async run() {
|
|
11
|
+
const { flags } = await this.parse(Remove);
|
|
12
|
+
const { app, confirm } = flags;
|
|
13
|
+
const sniEndpoint = await (0, flags_1.default)(flags, this.heroku);
|
|
14
|
+
await (0, confirmCommand_1.default)(app, confirm, (0, tsheredoc_1.default) `
|
|
15
|
+
WARNING: Destructive Action - you cannot rollback this change
|
|
16
|
+
This command will remove the endpoint ${sniEndpoint.name} from ${color_1.default.magenta(app)}.
|
|
17
|
+
`);
|
|
18
|
+
core_1.ux.action.start(`Removing SSL certificate ${sniEndpoint.name} from ${color_1.default.magenta(app)}`);
|
|
19
|
+
await this.heroku.request(`/apps/${app}/sni-endpoints/${sniEndpoint.name}`, { method: 'DELETE' });
|
|
20
|
+
core_1.ux.action.stop();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.default = Remove;
|
|
24
|
+
Remove.topic = 'certs';
|
|
25
|
+
Remove.description = 'remove an SSL certificate from an app';
|
|
26
|
+
Remove.flags = {
|
|
27
|
+
confirm: command_1.flags.string({ hidden: true }),
|
|
28
|
+
name: command_1.flags.string({ description: 'name to remove' }),
|
|
29
|
+
endpoint: command_1.flags.string({ description: 'endpoint to remove' }),
|
|
30
|
+
app: command_1.flags.app({ required: true }),
|
|
31
|
+
remote: command_1.flags.remote(),
|
|
32
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Command } from '@heroku-cli/command';
|
|
2
|
+
export default class Update extends Command {
|
|
3
|
+
static topic: string;
|
|
4
|
+
static description: string;
|
|
5
|
+
static flags: {
|
|
6
|
+
confirm: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
endpoint: 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
|
+
CRT: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
|
|
14
|
+
KEY: import("@oclif/core/lib/interfaces/parser").Arg<string, Record<string, unknown>>;
|
|
15
|
+
};
|
|
16
|
+
static examples: string[];
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
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 certificate_details_1 = require("../../lib/certs/certificate_details");
|
|
7
|
+
const get_cert_and_key_1 = require("../../lib/certs/get_cert_and_key");
|
|
8
|
+
const tsheredoc_1 = require("tsheredoc");
|
|
9
|
+
const flags_1 = require("../../lib/certs/flags");
|
|
10
|
+
const confirmCommand_1 = require("../../lib/confirmCommand");
|
|
11
|
+
class Update extends command_1.Command {
|
|
12
|
+
async run() {
|
|
13
|
+
const { flags, args } = await this.parse(Update);
|
|
14
|
+
const { app, confirm } = flags;
|
|
15
|
+
let sniEndpoint = await (0, flags_1.default)(flags, this.heroku);
|
|
16
|
+
const files = await (0, get_cert_and_key_1.getCertAndKey)(args);
|
|
17
|
+
await (0, confirmCommand_1.default)(app, confirm, (0, tsheredoc_1.default) `
|
|
18
|
+
Potentially Destructive Action
|
|
19
|
+
This command will change the certificate of endpoint ${sniEndpoint.name} from ${color_1.default.magenta(app)}.
|
|
20
|
+
`);
|
|
21
|
+
core_1.ux.action.start(`Updating SSL certificate ${sniEndpoint.name} for ${color_1.default.magenta(app)}`);
|
|
22
|
+
({ body: sniEndpoint } = await this.heroku.patch(`/apps/${app}/sni-endpoints/${sniEndpoint.name}`, {
|
|
23
|
+
body: {
|
|
24
|
+
certificate_chain: files.crt,
|
|
25
|
+
private_key: files.key,
|
|
26
|
+
},
|
|
27
|
+
}));
|
|
28
|
+
core_1.ux.action.stop();
|
|
29
|
+
(0, certificate_details_1.displayCertificateDetails)(sniEndpoint, 'Updated certificate details:');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.default = Update;
|
|
33
|
+
Update.topic = 'certs';
|
|
34
|
+
Update.description = (0, tsheredoc_1.default) `
|
|
35
|
+
update an SSL certificate on an app
|
|
36
|
+
Note: certificates with PEM encoding are also valid
|
|
37
|
+
`;
|
|
38
|
+
Update.flags = {
|
|
39
|
+
confirm: command_1.flags.string({ hidden: true }),
|
|
40
|
+
name: command_1.flags.string({ description: 'name to update' }),
|
|
41
|
+
endpoint: command_1.flags.string({ description: 'endpoint to update' }),
|
|
42
|
+
app: command_1.flags.app({ required: true }),
|
|
43
|
+
remote: command_1.flags.remote(),
|
|
44
|
+
};
|
|
45
|
+
Update.args = {
|
|
46
|
+
CRT: core_1.Args.string({ required: true }),
|
|
47
|
+
KEY: core_1.Args.string({ required: true }),
|
|
48
|
+
};
|
|
49
|
+
Update.examples = [(0, tsheredoc_1.default) `
|
|
50
|
+
$ heroku certs:update example.com.crt example.com.key
|
|
51
|
+
|
|
52
|
+
If you require intermediate certificates, refer to this article on merging certificates to get a complete chain:
|
|
53
|
+
https://help.salesforce.com/s/articleView?id=000333504&type=1
|
|
54
|
+
`];
|
|
@@ -6,6 +6,7 @@ export default class CiConfigGet extends Command {
|
|
|
6
6
|
static flags: {
|
|
7
7
|
help: import("@oclif/core/lib/interfaces").BooleanFlag<void>;
|
|
8
8
|
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
10
|
pipeline: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
11
|
shell: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
11
12
|
};
|
|
@@ -29,6 +29,7 @@ CiConfigGet.examples = [
|
|
|
29
29
|
CiConfigGet.flags = {
|
|
30
30
|
help: command_1.flags.help({ char: 'h' }),
|
|
31
31
|
app: command_1.flags.app({ required: false }),
|
|
32
|
+
remote: command_1.flags.remote(),
|
|
32
33
|
pipeline: command_1.flags.pipeline({ required: false }),
|
|
33
34
|
shell: command_1.flags.boolean({ char: 's', description: 'output config var in shell format' }),
|
|
34
35
|
};
|
|
@@ -5,6 +5,7 @@ export default class CiConfigSet extends Command {
|
|
|
5
5
|
static examples: string[];
|
|
6
6
|
static flags: {
|
|
7
7
|
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
9
|
pipeline: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
10
|
};
|
|
10
11
|
static strict: boolean;
|
|
@@ -7,6 +7,7 @@ export default class CiConfigUnset extends Command {
|
|
|
7
7
|
static flags: {
|
|
8
8
|
help: import("@oclif/core/lib/interfaces").BooleanFlag<void>;
|
|
9
9
|
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
11
|
pipeline: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
11
12
|
};
|
|
12
13
|
run(): Promise<void>;
|
|
@@ -4,6 +4,7 @@ export default class CiIndex extends Command {
|
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
6
|
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
8
|
watch: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
8
9
|
pipeline: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
10
|
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
package/lib/commands/ci/index.js
CHANGED
|
@@ -19,6 +19,7 @@ CiIndex.examples = [
|
|
|
19
19
|
];
|
|
20
20
|
CiIndex.flags = {
|
|
21
21
|
app: command_1.flags.string({ char: 'a', description: 'app name' }),
|
|
22
|
+
remote: command_1.flags.remote(),
|
|
22
23
|
watch: command_1.flags.boolean({ description: 'keep running and watch for new and update tests', required: false }),
|
|
23
24
|
pipeline: command_1.flags.pipeline({ required: false }),
|
|
24
25
|
json: command_1.flags.boolean({ description: 'output in json format', required: false }),
|
|
@@ -4,6 +4,7 @@ export default class CiInfo extends Command {
|
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
6
|
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
8
|
node: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
9
|
pipeline: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
10
|
};
|
package/lib/commands/ci/info.js
CHANGED
|
@@ -21,6 +21,7 @@ CiInfo.examples = [
|
|
|
21
21
|
];
|
|
22
22
|
CiInfo.flags = {
|
|
23
23
|
app: command_1.flags.string({ char: 'a', description: 'app name' }),
|
|
24
|
+
remote: command_1.flags.remote(),
|
|
24
25
|
node: command_1.flags.string({ description: 'the node number to show its setup and output', required: false }),
|
|
25
26
|
pipeline: command_1.flags.pipeline({ required: false }),
|
|
26
27
|
};
|
|
@@ -4,6 +4,7 @@ export default class CiLast extends Command {
|
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
6
|
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
8
|
node: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
9
|
pipeline: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
10
|
};
|
package/lib/commands/ci/last.js
CHANGED
|
@@ -26,6 +26,7 @@ CiLast.examples = [
|
|
|
26
26
|
];
|
|
27
27
|
CiLast.flags = {
|
|
28
28
|
app: command_1.flags.string({ char: 'a', description: 'app name' }),
|
|
29
|
+
remote: command_1.flags.remote(),
|
|
29
30
|
node: command_1.flags.string({ description: 'the node number to show its setup and output', required: false }),
|
|
30
31
|
pipeline: command_1.flags.pipeline({ required: false }),
|
|
31
32
|
};
|
|
@@ -6,6 +6,7 @@ export default class CiOpen extends Command {
|
|
|
6
6
|
static flags: {
|
|
7
7
|
help: import("@oclif/core/lib/interfaces").BooleanFlag<void>;
|
|
8
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>;
|
|
9
10
|
pipeline: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
11
|
};
|
|
11
12
|
run(): Promise<void>;
|
package/lib/commands/ci/open.js
CHANGED
|
@@ -4,6 +4,7 @@ export default class CiReRun extends Command {
|
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
6
|
app: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
8
|
pipeline: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
9
|
};
|
|
9
10
|
static args: {
|
package/lib/commands/ci/rerun.js
CHANGED